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

Commit 21faf334 authored by 张国柄's avatar 张国柄

券发放+全体用户|全体会员操作逻辑;

parent 561562b8
......@@ -3,6 +3,8 @@ package com.liquidnet.service.candy.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Data;
import lombok.EqualsAndHashCode;
......@@ -45,6 +47,15 @@ public class CandyCommonCoupon implements Serializable {
*/
private Integer ranged;
/**
* 操作人
*/
private String operator;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
private String comment;
......
......@@ -132,7 +132,11 @@ create table candy_common_coupon
mcoupon_id varchar(64) not null comment '~candy_mgt_coupon.mcoupon_id',
coupon_id varchar(64) not null comment '~candy_coupon.coupon_id',
state tinyint comment '公有券状态[1-可用|2-无效|3-已过期]',
ranged tinyint comment '公有券范围[10-全体用户|20-全体会员]',
ranged tinyint comment '公有券范围(~candy_mgt_coupon.event_type)',
operator varchar(64) not null comment '操作人',
created_at datetime(3) not null,
updated_at datetime(3),
comment varchar(255)
) engine = InnoDB comment '公有券信息';
-- >>------------------------------------------------------------------------------------
......
package com.liquidnet.service.platform.service.impl.candy;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.service.candy.entity.CandyCommonCoupon;
import com.liquidnet.service.candy.mapper.CandyCommonCouponMapper;
import org.springframework.stereotype.Service;
@Service
public class PlatformCandyCommonCouponService extends ServiceImpl<CandyCommonCouponMapper, CandyCommonCoupon> {
}
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.adam.constant.AdamRedisConst;
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.dto.*;
import com.liquidnet.service.candy.entity.*;
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;
......@@ -41,9 +31,7 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C
@Autowired
private PlatformCandyUserCouponService platformCandyUserCouponService;
@Autowired
private PlatformAdamUserMemberService platformAdamUserMemberService;
@Autowired
private DMRdmService dmRdmService;
private PlatformCandyCommonCouponService platformCandyCommonCouponService;
@Autowired
private RedisUtil redisUtil;
......@@ -57,138 +45,71 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C
String couponInfoDtoKey = CandyRedisConst.BASIC_COUPON_INFO.concat(couponInfoDto.getCouponId());
redisUtil.set(couponInfoDtoKey, couponInfoDto);
LocalDateTime now = LocalDateTime.now();
Integer eventAmt = mgtCoupon.getEventAmt();
switch (coupon.getBindType()) {// 领取方式[0-用户输入兑换|1-发放至用户]
case 0:
List<CandyCouponCode> initCouponCodeList = new ArrayList<>();
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", "券发放失败");
}
this.processingCouponCode(mgtCoupon, coupon);
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);
}
this.processingCommonCoupon(mgtCoupon, coupon, couponRuleDtoList);
// 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 (int i = 0; i < eventAmt; i++) {
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);
});
}
this.processForUserCoupon(mgtCoupon, coupon, couponRuleDtoList);
break;
case 10:// TODO: 2021/8/24 具体发放方式待定
case 10:
this.processingCommonCoupon(mgtCoupon, coupon, couponRuleDtoList);
break;
default:
log.warn("发放券任务:无法处理,无效的发放类型[mcouponId:{},eventType:{}]", mgtCoupon.getMcouponId(), mgtCoupon.getEventType());
......@@ -201,6 +122,141 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C
}
}
/**
* <p>
* 券码生成处理
* </p>
*
* @param mgtCoupon CandyMgtCoupon
* @param coupon CandyCoupon
*/
private void processingCouponCode(CandyMgtCoupon mgtCoupon, CandyCoupon coupon) {
List<CandyCouponCode> initCouponCodeList = new ArrayList<>();
LocalDateTime now = LocalDateTime.now();
Integer eventAmt = mgtCoupon.getEventAmt();
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 (!initCouponCodeList.isEmpty()) {
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", String.format("券发放失败[mcouponId=%s]", mgtCoupon.getMcouponId()));
}
}
}
/**
* <p>
* 公有券发放处理
* </p>
*
* @param mgtCoupon CandyMgtCoupon
* @param coupon CandyCoupon
* @param couponRuleDtoList List<CandyCouponRuleDto>
*/
private void processingCommonCoupon(CandyMgtCoupon mgtCoupon, CandyCoupon coupon, List<CandyCouponRuleDto> couponRuleDtoList) {
List<CandyCommonCoupon> initCommonCouponList = new ArrayList<>();
LocalDateTime now = LocalDateTime.now();
Integer eventAmt = mgtCoupon.getEventAmt();
for (int i = 0; i < eventAmt; i++) {
CandyCommonCoupon commonCoupon = new CandyCommonCoupon();
commonCoupon.setCcouponId(IDGenerator.nextMilliId());
commonCoupon.setMcouponId(mgtCoupon.getMcouponId());
commonCoupon.setCouponId(coupon.getCouponId());
commonCoupon.setState(1);
commonCoupon.setRanged(mgtCoupon.getEventType());
commonCoupon.setOperator("system");
commonCoupon.setCreatedAt(now);
initCommonCouponList.add(commonCoupon);
}
if (!initCommonCouponList.isEmpty()) {
if (platformCandyCommonCouponService.saveBatch(initCommonCouponList, initCommonCouponList.size())) {
initCommonCouponList.forEach(r -> {
String ccKey = CandyRedisConst.BASIC_COMMON_COUPON;
List<CandyCommonCouponBasicDto> vos = (List<CandyCommonCouponBasicDto>) redisUtil.get(ccKey);
if (CollectionUtils.isEmpty(vos)) {
vos = new ArrayList<>();
}
vos.add(CandyCommonCouponBasicDto.getNew().copy(r, coupon, couponRuleDtoList));
redisUtil.set(ccKey, vos);
});
} else {
throw new LiquidnetServiceException("-1", String.format("券发放失败[mcouponId=%s]", mgtCoupon.getMcouponId()));
}
}
}
/**
* <p>
* 私有券发放处理
* </p>
*
* @param mgtCoupon CandyMgtCoupon
* @param coupon CandyCoupon
* @param couponRuleDtoList List<CandyCouponRuleDto>
*/
private void processForUserCoupon(CandyMgtCoupon mgtCoupon, CandyCoupon coupon, List<CandyCouponRuleDto> couponRuleDtoList) {
List<CandyUserCoupon> initUserCouponList = new ArrayList<>();
LocalDateTime now = LocalDateTime.now();
Integer eventAmt = mgtCoupon.getEventAmt();
String eventLimit = mgtCoupon.getEventLimit();
String[] eventLimitArr = eventLimit.split(",");
for (int i = 0; i < eventAmt; i++) {
for (String r : eventLimitArr) {
String uid = (String) redisUtil.get(AdamRedisConst.IDENTITY_MOBILE.concat(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()) {
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", String.format("券发放失败[mcouponId=%s]", mgtCoupon.getMcouponId()));
}
}
}
/**
* <p>
* 发放代金券
......
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