记得上下班打卡 | git大法好,push需谨慎

Commit 7e0af894 authored by 张国柄's avatar 张国柄

+调整发放券任务;

parent cfe4ead8
......@@ -35,16 +35,6 @@ public class CandyMgtCouponTaskController {
private PlatformCandyMgtCouponService platformCandyMgtCouponService;
@Autowired
private PlatformCandyCouponService platformCandyCouponService;
@Autowired
private PlatformCandyCouponRuleService platformCandyCouponRuleService;
@Autowired
private PlatformCandyCouponCodeService platformCandyCouponCodeService;
@Autowired
private PlatformCandyUserCouponService platformCandyUserCouponService;
@Autowired
private DMRdmService dmRdmService;
@Autowired
private RedisUtil redisUtil;
@PostMapping("issue/coupons")
public void issueCoupons() {
......@@ -52,98 +42,49 @@ public class CandyMgtCouponTaskController {
.eq(CandyMgtCoupon::getState, 0)
.orderByAsc(CandyMgtCoupon::getEventAt);
List<CandyMgtCoupon> list = platformCandyMgtCouponService.list(queryWrapper);
int taskSize = CollectionUtils.isEmpty(list) ? 0 : list.size();
log.info("issue coupons taskSize:{}", taskSize);
int taskSize = CollectionUtils.isEmpty(list) ? -1 : list.size();
log.info("发放券任务总数:{} >>> BEGIN BEGIN BEGIN", taskSize);
LambdaQueryWrapper<CandyCoupon> couponQueryWrapper = Wrappers.lambdaQuery(CandyCoupon.class).eq(CandyCoupon::getState, 1);
LambdaQueryWrapper<CandyCouponRule> couponRuleQueryWrapper = Wrappers.lambdaQuery(CandyCouponRule.class).eq(CandyCouponRule::getState, 1);
for (int i = 0; i < taskSize; i++) {
LocalDateTime now = LocalDateTime.now();
CandyMgtCoupon mgtCoupon = list.get(i);
CandyCoupon coupon = platformCandyCouponService.getOne(couponQueryWrapper.eq(CandyCoupon::getCouponId, mgtCoupon.getCouponId()));
mgtCoupon.setState(9);
List<CandyCouponRuleDto> couponRuleDtoList = platformCandyCouponRuleService.listForCouponRuleDto(coupon.getCouponId());
try {
if (platformCandyMgtCouponService.updateById(mgtCoupon)) {
CandyCoupon coupon = platformCandyCouponService.getOne(couponQueryWrapper.eq(CandyCoupon::getCouponId, mgtCoupon.getCouponId()));
log.info("发放券任务总数:{},任务{}开始处理[mcouponId:{},couType:{},bindType:{},eventAmt:{},eventType:{}]", taskSize, i,
mgtCoupon.getMcouponId(), coupon.getCouType(), coupon.getBindType(), mgtCoupon.getEventAmt(), mgtCoupon.getEventType());
List<CandyCouponCode> initCouponCodeList = new ArrayList<>();
List<CandyUserCoupon> initUserCouponList = new ArrayList<>();
Integer eventAmt = mgtCoupon.getEventAmt();
for (int j = 0; j < eventAmt; j++) {
switch (coupon.getCouType()) {
case 1:
String uid = dmRdmService.getUidByMobile("17701223310");
if (StringUtils.isNotEmpty(uid)) {
CandyUserCoupon userCoupon = new CandyUserCoupon();
userCoupon.setUcouponId(IDGenerator.get32UUID());
userCoupon.setMcouponId(mgtCoupon.getMcouponId());
userCoupon.setUid(uid);
userCoupon.setCouponId(coupon.getCouponId());
userCoupon.setState(1);
userCoupon.setBindAt(now);
initUserCouponList.add(userCoupon);
}
case 1:// 代金券
platformCandyCouponService.issueCashCouponHandler(mgtCoupon, coupon);
break;
case 2:
case 2:// 满减券
platformCandyCouponService.issueOverMinusCouponHandler(mgtCoupon, coupon);
break;
case 3:// 兑换券
CandyCouponCode couponCode = new CandyCouponCode();
couponCode.setCcode(RandomStringUtils.randomAlphanumeric(16));
couponCode.setCouponId(coupon.getCouponId());
couponCode.setState(0);
couponCode.setCreatedAt(now);
initCouponCodeList.add(couponCode);
platformCandyCouponService.issueExchangeCouponHandler(mgtCoupon, coupon);
break;
case 4:
case 4:// 折扣券
platformCandyCouponService.issueDiscountCouponHandler(mgtCoupon, coupon);
break;
default:
log.warn("Invalid operation[mcouponId:{},couType:{}]", mgtCoupon.getMcouponId(), coupon.getCouType());
log.warn("发放券任务总数:{},任务{}无法处理,无效的券类型[mcouponId:{},couType:{}]", taskSize, i, mgtCoupon.getMcouponId(), coupon.getCouType());
break;
}
}
mgtCoupon.setState(1);
boolean update = platformCandyMgtCouponService.updateById(mgtCoupon);
if (!initUserCouponList.isEmpty() && platformCandyUserCouponService.saveBatch(initUserCouponList)) {
CandyCouponInfoDto couponInfoDto = new CandyCouponInfoDto();
BeanUtils.copyProperties(coupon, couponInfoDto);
couponInfoDto.setUseRules(couponRuleDtoList);
String key = CandyRedisConst.BASIC_COUPON_INFO.concat(couponInfoDto.getCouponId());
redisUtil.set(key, couponInfoDto);
initUserCouponList.forEach(r -> {
String uckey = CandyRedisConst.BASIC_USER_COUPON.concat(r.getUid());
List<CandyUserCouponBasicDto> vos = (List<CandyUserCouponBasicDto>) redisUtil.get(uckey);
if (CollectionUtils.isEmpty(vos)) {
vos = new ArrayList<>();
}
vos.add(CandyUserCouponBasicDto.getNew().copy(r, coupon, couponRuleDtoList));
redisUtil.set(uckey, vos);
});
log.info("发放券任务总数:{},任务{}处理{}[mcouponId:{},couType:{},bindType:{},eventAmt:{},eventType:{}]", taskSize, i, (update ? "成功" : "失败"),
mgtCoupon.getMcouponId(), coupon.getCouType(), coupon.getBindType(), mgtCoupon.getEventAmt(), mgtCoupon.getEventType());
}
if (!initCouponCodeList.isEmpty() && platformCandyCouponCodeService.saveBatch(initCouponCodeList)) {
CandyCouponInfoDto couponInfoDto = new CandyCouponInfoDto();
BeanUtils.copyProperties(coupon, couponInfoDto);
couponInfoDto.setUseRules(couponRuleDtoList);
String key = CandyRedisConst.BASIC_COUPON_INFO.concat(couponInfoDto.getCouponId());
redisUtil.set(key, couponInfoDto);
initCouponCodeList.forEach(r -> {
redisUtil.set(CandyRedisConst.BASIC_COUPON_CODE.concat(r.getCcode()), CandyCouponCodeDto.getNew().copy(r));
});
} catch (Exception e) {
log.error("发放券任务总数:{},任务{}处理异常[mcouponId:{}]", taskSize, i, mgtCoupon.getMcouponId(), e);
}
mgtCoupon.setState(1);
LambdaUpdateWrapper<CandyMgtCoupon> mgtCouponUpdateWrapper = Wrappers.lambdaUpdate(CandyMgtCoupon.class).eq(CandyMgtCoupon::getMcouponId, mgtCoupon.getMcouponId());
boolean update = platformCandyMgtCouponService.update(mgtCoupon, mgtCouponUpdateWrapper);
log.info("issue coupons mcouponId:{} ~ {}", mgtCoupon.getMcouponId(), update);
}
log.info("发放券任务总数:{} >>> END END END", taskSize);
}
}
package com.liquidnet.service.platform.service.impl.adam;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.service.adam.entity.AdamUserMember;
import com.liquidnet.service.adam.mapper.AdamUserMemberMapper;
import org.springframework.stereotype.Service;
@Service
public class PlatformAdamUserMemberService extends ServiceImpl<AdamUserMemberMapper, AdamUserMember> {
}
package com.liquidnet.service.platform.service.impl.candy;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.common.exception.LiquidnetServiceException;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.service.adam.entity.AdamUserMember;
import com.liquidnet.service.candy.constant.CandyRedisConst;
import com.liquidnet.service.candy.dto.CandyCouponCodeDto;
import com.liquidnet.service.candy.dto.CandyCouponInfoDto;
import com.liquidnet.service.candy.dto.CandyCouponRuleDto;
import com.liquidnet.service.candy.dto.CandyUserCouponBasicDto;
import com.liquidnet.service.candy.entity.CandyCoupon;
import com.liquidnet.service.candy.entity.CandyCouponCode;
import com.liquidnet.service.candy.entity.CandyMgtCoupon;
import com.liquidnet.service.candy.entity.CandyUserCoupon;
import com.liquidnet.service.candy.mapper.CandyCouponMapper;
import com.liquidnet.service.platform.service.impl.adam.PlatformAdamUserMemberService;
import com.liquidnet.service.platform.service.impl.adam.dm.DMRdmService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@Service
public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, CandyCoupon> {
@Autowired
private PlatformCandyCouponRuleService platformCandyCouponRuleService;
@Autowired
private PlatformCandyCouponCodeService platformCandyCouponCodeService;
@Autowired
private PlatformCandyUserCouponService platformCandyUserCouponService;
@Autowired
private PlatformAdamUserMemberService platformAdamUserMemberService;
@Autowired
private DMRdmService dmRdmService;
@Autowired
private RedisUtil redisUtil;
private void issueCouponProcessing(final CandyMgtCoupon mgtCoupon, final CandyCoupon coupon) {
List<CandyCouponRuleDto> couponRuleDtoList = platformCandyCouponRuleService.listForCouponRuleDto(coupon.getCouponId());
CandyCouponInfoDto couponInfoDto = new CandyCouponInfoDto();
BeanUtils.copyProperties(coupon, couponInfoDto);
couponInfoDto.setUseRules(couponRuleDtoList);
String couponInfoDtoKey = CandyRedisConst.BASIC_COUPON_INFO.concat(couponInfoDto.getCouponId());
redisUtil.set(couponInfoDtoKey, couponInfoDto);
LocalDateTime now = LocalDateTime.now();
switch (coupon.getBindType()) {// 领取方式[0-用户输入兑换|1-发放至用户]
case 0:
List<CandyCouponCode> initCouponCodeList = new ArrayList<>();
Integer eventAmt = mgtCoupon.getEventAmt();
boolean batchFlag = eventAmt > 1000;
for (int i = 0; i < eventAmt; i++) {
CandyCouponCode couponCode = new CandyCouponCode();
couponCode.setCcode(RandomStringUtils.randomAlphanumeric(16));
couponCode.setCouponId(coupon.getCouponId());
couponCode.setState(0);
couponCode.setCreatedAt(now);
initCouponCodeList.add(couponCode);
if (batchFlag && initCouponCodeList.size() >= 1000) {
if (platformCandyCouponCodeService.saveBatch(initCouponCodeList)) {
initCouponCodeList.forEach(r -> {
redisUtil.set(CandyRedisConst.BASIC_COUPON_CODE.concat(r.getCcode()), CandyCouponCodeDto.getNew().copy(r));
});
initCouponCodeList.clear();
} else {
throw new LiquidnetServiceException("-1", "券发放失败");
}
}
}
if (initCouponCodeList.size() > 0 && platformCandyCouponCodeService.saveBatch(initCouponCodeList)) {
initCouponCodeList.forEach(r -> {
redisUtil.set(CandyRedisConst.BASIC_COUPON_CODE.concat(r.getCcode()), CandyCouponCodeDto.getNew().copy(r));
});
initCouponCodeList.clear();
} else {
throw new LiquidnetServiceException("-1", "券发放失败");
}
break;
case 1:
List<CandyUserCoupon> initUserCouponList = new ArrayList<>();
switch (mgtCoupon.getEventType()) {// 发放类型[1-会员|2-手机号|10-全体用户]
case 1:
LocalDateTime nowEndTime = now.withHour(23).withMinute(59).withSecond(59);
LambdaQueryWrapper<AdamUserMember> queryWrapper = Wrappers.lambdaQuery(AdamUserMember.class).eq(AdamUserMember::getState, 1)
.gt(AdamUserMember::getExpiryAt, nowEndTime);
int userMemberCount = platformAdamUserMemberService.count(queryWrapper), num = 0, pSize = 1000;
log.info("发放券任务:userMemberCount:{}", userMemberCount);
while (userMemberCount > 0) {
initUserCouponList.clear();
String lastLimitSql = "LIMIT " + (num * pSize) + "," + pSize;
queryWrapper.orderByAsc(AdamUserMember::getMid).last(lastLimitSql);
queryWrapper.select(AdamUserMember::getUid);
List<AdamUserMember> userMemberList = platformAdamUserMemberService.list(queryWrapper);
int userMemberListSize = CollectionUtils.isEmpty(userMemberList) ? -1 : userMemberList.size();
for (int i = 0; i < userMemberListSize; i++) {
AdamUserMember userMember = userMemberList.get(i);
CandyUserCoupon userCoupon = new CandyUserCoupon();
userCoupon.setUcouponId(IDGenerator.get32UUID());
userCoupon.setMcouponId(mgtCoupon.getMcouponId());
userCoupon.setUid(userMember.getUid());
userCoupon.setCouponId(coupon.getCouponId());
userCoupon.setState(1);
userCoupon.setBindAt(now);
initUserCouponList.add(userCoupon);
}
if (!initUserCouponList.isEmpty()) {
if (platformCandyUserCouponService.saveBatch(initUserCouponList)) {
initUserCouponList.forEach(r -> {
String uckey = CandyRedisConst.BASIC_USER_COUPON.concat(r.getUid());
List<CandyUserCouponBasicDto> vos = (List<CandyUserCouponBasicDto>) redisUtil.get(uckey);
if (CollectionUtils.isEmpty(vos)) {
vos = new ArrayList<>();
}
vos.add(CandyUserCouponBasicDto.getNew().copy(r, coupon, couponRuleDtoList));
redisUtil.set(uckey, vos);
});
} else {
throw new LiquidnetServiceException("-1", "券发放失败");
}
}
num++;
userMemberCount -= pSize;
log.info("发放券任务:userMemberCount:{}," + lastLimitSql, userMemberCount);
}
break;
case 2:
String eventLimit = mgtCoupon.getEventLimit();
String[] eventLimitArr = eventLimit.split(",");
log.info("发放券任务:eventLimitArrLength:{}", eventLimitArr.length);
for (String r : eventLimitArr) {
String uid = dmRdmService.getUidByMobile(r);
if (StringUtils.isNotEmpty(uid)) {
CandyUserCoupon userCoupon = new CandyUserCoupon();
userCoupon.setUcouponId(IDGenerator.get32UUID());
userCoupon.setMcouponId(mgtCoupon.getMcouponId());
userCoupon.setUid(uid);
userCoupon.setCouponId(coupon.getCouponId());
userCoupon.setState(1);
userCoupon.setBindAt(now);
initUserCouponList.add(userCoupon);
}
}
if (!initUserCouponList.isEmpty() && platformCandyUserCouponService.saveBatch(initUserCouponList)) {
initUserCouponList.forEach(r -> {
String uckey = CandyRedisConst.BASIC_USER_COUPON.concat(r.getUid());
List<CandyUserCouponBasicDto> vos = (List<CandyUserCouponBasicDto>) redisUtil.get(uckey);
if (CollectionUtils.isEmpty(vos)) {
vos = new ArrayList<>();
}
vos.add(CandyUserCouponBasicDto.getNew().copy(r, coupon, couponRuleDtoList));
redisUtil.set(uckey, vos);
});
}
break;
case 10:// TODO: 2021/8/24 具体发放方式待定
break;
default:
log.warn("发放券任务:无法处理,无效的发放类型[mcouponId:{},eventType:{}]", mgtCoupon.getMcouponId(), mgtCoupon.getEventType());
break;
}
break;
default:
log.warn("发放券任务:无法处理,无效的领取方式[mcouponId:{},bindType:{}]", mgtCoupon.getMcouponId(), coupon.getBindType());
break;
}
}
/**
* <p>
* 发放代金券
* </p>
*
* @param mgtCoupon CandyMgtCoupon
* @param coupon CandyCoupon
*/
public void issueCashCouponHandler(final CandyMgtCoupon mgtCoupon, final CandyCoupon coupon) {
this.issueCouponProcessing(mgtCoupon, coupon);
}
/**
* <p>
* 发放满减券
* </p>
*
* @param mgtCoupon CandyMgtCoupon
* @param coupon CandyCoupon
*/
public void issueOverMinusCouponHandler(CandyMgtCoupon mgtCoupon, CandyCoupon coupon) {
this.issueCouponProcessing(mgtCoupon, coupon);
}
/**
* <p>
* 发放兑换券
* </p>
*
* @param mgtCoupon CandyMgtCoupon
* @param coupon CandyCoupon
*/
public void issueExchangeCouponHandler(final CandyMgtCoupon mgtCoupon, final CandyCoupon coupon) {
this.issueCouponProcessing(mgtCoupon, coupon);
}
/**
* <p>
* 发放折扣券
* </p>
*
* @param mgtCoupon CandyMgtCoupon
* @param coupon CandyCoupon
*/
public void issueDiscountCouponHandler(final CandyMgtCoupon mgtCoupon, final CandyCoupon coupon) {
this.issueCouponProcessing(mgtCoupon, coupon);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment