|
|
|
@@ -44,6 +44,9 @@ public class CouponSendSchedule { |
|
|
|
@Autowired |
|
|
|
private WxCUserBasicInfoMapper wxCUserBasicInfoMapper; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private WxCUserMapper wxCUserMapper; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private WxCouponSendMapper wxCouponSendMapper; |
|
|
|
|
|
|
|
@@ -59,7 +62,7 @@ public class CouponSendSchedule { |
|
|
|
|
|
|
|
//@Scheduled(cron = "0 0 6 1 * ?") // 每月1号发放会员的权益券 |
|
|
|
@Scheduled(cron = "0 0 6 * * ?") // 测试每天6点发券 |
|
|
|
//@Scheduled(cron = "*/10 * * * * ?") // 测试10秒中一次 |
|
|
|
//@Scheduled(cron = "*/30 * * * * ?") // 测试30秒中一次 |
|
|
|
public void couponSendSchedule() { |
|
|
|
|
|
|
|
List<WxMall> mallList = wxMallMapper.findList(new WxMall()); |
|
|
|
@@ -89,12 +92,12 @@ public class CouponSendSchedule { |
|
|
|
.sorted(Comparator.comparing(WxLevelConfig::getPoints)) |
|
|
|
.collect(Collectors.toList()); |
|
|
|
|
|
|
|
for (int i = 0; i < levelConfigList.size(); i++) { |
|
|
|
WxLevelConfig l = levelConfigList.get(i); |
|
|
|
for (int levelIndex = 0; levelIndex < levelConfigList.size(); levelIndex++) { |
|
|
|
WxLevelConfig l = levelConfigList.get(levelIndex); |
|
|
|
if (l.getCapability() == null) |
|
|
|
continue; |
|
|
|
Integer levelStartScore = l.getPoints(); |
|
|
|
Integer levelEndScore = levelConfigList.size() < i+1? levelConfigList.get(i+1).getPoints() : null; |
|
|
|
Integer levelEndScore = levelIndex+1 < levelConfigList.size() ? levelConfigList.get(levelIndex+1).getPoints() : null; |
|
|
|
|
|
|
|
JSONObject jo = null; |
|
|
|
Long result = null; |
|
|
|
@@ -107,28 +110,37 @@ public class CouponSendSchedule { |
|
|
|
} |
|
|
|
Long sendCount = result; |
|
|
|
if (sendCount > 0) { |
|
|
|
WxCouponSend wxCouponSend = new WxCouponSend(); |
|
|
|
wxCouponSend.setTenantId(l.getTenantId()); |
|
|
|
wxCouponSend.setSendType(EnumCouponSendSendType.TIMED.getCode()); |
|
|
|
wxCouponSend.setStatus(EnumCouponSendStatus.VALID.getCode()); |
|
|
|
List<WxCouponSendVo> couponSendList = wxCouponSendMapper.findListVo(wxCouponSend); |
|
|
|
couponSendList.stream().forEach(cs->{ |
|
|
|
if (cs.getRemainInventory() < sendCount){ |
|
|
|
logger.error("定时发券:库存不足 levelId="+ l.getId() +" couponId="+ cs.getCouponId()); |
|
|
|
return; //下一个券 |
|
|
|
|
|
|
|
WxCUserBasicInfoDto wxCUserBasicInfoDto = new WxCUserBasicInfoDto(); |
|
|
|
wxCUserBasicInfoDto.setTenantId(l.getTenantId()); |
|
|
|
wxCUserBasicInfoDto.setLevelStartScore(levelStartScore); |
|
|
|
wxCUserBasicInfoDto.setLevelEndScore(levelEndScore); |
|
|
|
List<WxCUserBasicInfo> wxCUserBasicInfoList = wxCUserBasicInfoMapper.findListByScore(wxCUserBasicInfoDto); |
|
|
|
|
|
|
|
logger.info("定时发券:给LEVEL["+ l.getLevel() + |
|
|
|
"]积分["+levelStartScore+"-"+levelEndScore+"]发券"+sendCount+"张"); |
|
|
|
|
|
|
|
wxCUserBasicInfoList.stream().forEach(cu->{ |
|
|
|
|
|
|
|
WxCouponSend wxCouponSend = new WxCouponSend(); |
|
|
|
wxCouponSend.setTenantId(l.getTenantId()); |
|
|
|
wxCouponSend.setSendType(EnumCouponSendSendType.TIMED.getCode()); |
|
|
|
wxCouponSend.setStatus(EnumCouponSendStatus.VALID.getCode()); |
|
|
|
List<WxCouponSendVo> couponSendList = wxCouponSendMapper.findListVo(wxCouponSend); |
|
|
|
int remain = couponSendList.stream().map(cs->{ |
|
|
|
int count = cs.getRemainInventory(); |
|
|
|
logger.info("定时发券:给["+ cu.getNickName() + |
|
|
|
"]券[" + cs.getTitle() + "]还剩" + |
|
|
|
count +"张"); |
|
|
|
return count; |
|
|
|
}).reduce(Integer::sum).get(); |
|
|
|
|
|
|
|
if (remain < sendCount){ |
|
|
|
logger.error("定时发券:库存不足["+ cu.getNickName() +"]应发"+sendCount+"张,总共剩"+ remain + "张"); |
|
|
|
return; |
|
|
|
} |
|
|
|
WxCUserBasicInfoDto wxCUserBasicInfoDto = new WxCUserBasicInfoDto(); |
|
|
|
wxCUserBasicInfoDto.setTenantId(l.getTenantId()); |
|
|
|
wxCUserBasicInfoDto.setLevelStartScore(levelStartScore); |
|
|
|
wxCUserBasicInfoDto.setLevelEndScore(levelEndScore); |
|
|
|
List<WxCUserBasicInfo> wxCUserBasicInfoList = wxCUserBasicInfoMapper.findListByScore(wxCUserBasicInfoDto); |
|
|
|
|
|
|
|
wxCUserBasicInfoList.stream().forEach(cu->{ |
|
|
|
if (cs.getRemainInventory() < sendCount){ |
|
|
|
logger.error("定时发券:库存不足 levelId="+ l.getId() +" couponId="+ cs.getCouponId()+"userId="+cu.getId()); |
|
|
|
return; //下一个券 |
|
|
|
} |
|
|
|
|
|
|
|
int sentCount = couponSendList.stream().map(cs->{ |
|
|
|
Map params = new HashMap<String, Object>(); |
|
|
|
params.put("tenantId", cs.getTenantId()); |
|
|
|
params.put("cUserId", cu.getId()); |
|
|
|
@@ -136,31 +148,45 @@ public class CouponSendSchedule { |
|
|
|
params.put("startTime", startTime); |
|
|
|
params.put("endTime", endTime); |
|
|
|
params.put("channelType", EnumCouponSendSendType.TIMED.getCode()); |
|
|
|
int count = wxCouponActionLogMapper.getCountByUserAndCouponAndDate(params); |
|
|
|
logger.info("定时发券:已经给["+ cu.getNickName() + |
|
|
|
"]券[" + cs.getTitle() + "] " + |
|
|
|
count +"张"); |
|
|
|
return count; |
|
|
|
}).reduce(Integer::sum).get(); |
|
|
|
|
|
|
|
int sentCount = wxCouponActionLogMapper.getCountByUserAndCouponAndDate(params); |
|
|
|
|
|
|
|
logger.info("定时发券:给["+ cu.getNickName() + |
|
|
|
"]已发送券[" + cs.getTitle() + "] " + |
|
|
|
sentCount +"张,还需发"+ (sendCount-sentCount) +"张"); |
|
|
|
logger.info("定时发券:给["+ cu.getNickName() + |
|
|
|
"]总共已发送券" + sentCount + "张,还需发"+ (sendCount-sentCount) +"张"); |
|
|
|
|
|
|
|
for (int count = 0; count < sendCount - sentCount; count++) { |
|
|
|
boolean sent = false; |
|
|
|
for(int couponIndex = 0; couponIndex< couponSendList.size(); couponIndex++) { |
|
|
|
WxCouponSendVo cs = couponSendList.get(couponIndex); |
|
|
|
if (cs.getRemainInventory() <= 0) |
|
|
|
continue; |
|
|
|
|
|
|
|
for (int count = 0; count<sendCount-sentCount; count++) { |
|
|
|
// 发放免费券 |
|
|
|
try { |
|
|
|
WxCouponOrder couponOrder = wxOrderService.sendFreeCouponToUser(cu.getId(), cs.getCouponId()); |
|
|
|
wxCouponActionLogService.addOne(l.getTenantId(), cs.getCouponId(), couponOrder.getId(), cs.getSendType(), cs.getId()); |
|
|
|
} catch (Exception e) { |
|
|
|
logger.error("定时发券:发券失败 levelId=" + l.getId() + " couponId=" + cs.getCouponId() + " userId=" + cu.getId() + e.getMessage()); |
|
|
|
return; |
|
|
|
continue; |
|
|
|
} |
|
|
|
|
|
|
|
logger.info("定时发券:商场[" + mall.getName() + |
|
|
|
"]会员等级[" + l.getLevel() + |
|
|
|
"]发送券[" + cs.getTitle() + |
|
|
|
"]给:" + cu.getNickName() + |
|
|
|
" 电话-" + cu.getPhone() + |
|
|
|
" id-" + cu.getId()); |
|
|
|
"]会员等级[" + l.getLevel() + |
|
|
|
"]发送券[" + cs.getTitle() + |
|
|
|
"]给:" + cu.getNickName() + |
|
|
|
" 电话-" + cu.getPhone() + |
|
|
|
" id-" + cu.getId()); |
|
|
|
sent = true; |
|
|
|
break; |
|
|
|
} |
|
|
|
}); |
|
|
|
if (!sent) |
|
|
|
break; |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|