Commit 08b5603a authored by zhangfeng's avatar zhangfeng

bugfix-172: 兑换记录ID命名规则修改

parent c01573f7
......@@ -21,6 +21,7 @@ import cn.iocoder.yudao.module.reward.enums.RewardPickMethedEnum;
import cn.iocoder.yudao.module.reward.enums.RewardRedeemStatusEnum;
import cn.iocoder.yudao.module.reward.enums.RewardStatusEnum;
import cn.iocoder.yudao.module.reward.service.reward.RewardService;
import cn.iocoder.yudao.module.reward.util.RewardGenCodeUtils;
import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi;
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
......@@ -69,6 +70,8 @@ public class RedeemRewardApiImpl implements RedeemRewardApi {
private SnowflakeGenerator snowflakeGenerator;
@Resource
private SmsCodeApi smsCodeApi;
@Resource
private RewardGenCodeUtils rewardGenCodeUtils;
@Override
public Boolean redeemReward(RedeemRewardReqVO redeemRewardReqVO) {
......@@ -112,9 +115,9 @@ public class RedeemRewardApiImpl implements RedeemRewardApi {
@Transactional(rollbackFor = Exception.class)
public void executeRedeem(RedeemRewardReqVO redeemRewardReqVO, Integer pointsRequire, Long rewardId) {
// 添加兑换记录
Long redeemId = addRedeemRecord(redeemRewardReqVO, pointsRequire);
RewardRedeemDO redeemRecord = addRedeemRecord(redeemRewardReqVO, pointsRequire);
// 更新会员积分
updateMemberScore(redeemRewardReqVO, pointsRequire, redeemId);
updateMemberScore(redeemRewardReqVO, pointsRequire, redeemRecord.getId(), redeemRecord.getRedemptionNumber());
// 更新礼品
redeemReward(rewardId, redeemRewardReqVO.getRewardCount());
}
......@@ -150,7 +153,7 @@ public class RedeemRewardApiImpl implements RedeemRewardApi {
if (StringUtils.isBlank(redeemRewardReqVO.getRecipientPhoneNum())) {
redeemRewardReqVO.setRecipientPhoneNum(memberUser.getMobile());
}
} else if (redeemRewardReqVO.getEntrance() != PlatformTypeEnum.BACKEND.getValue()){
} else if (redeemRewardReqVO.getEntrance() != PlatformTypeEnum.BACKEND.getValue()) {
if (StringUtils.isAnyBlank(redeemRewardReqVO.getRecipientName(), redeemRewardReqVO.getRecipientPhoneNum(), redeemRewardReqVO.getRecipientAddress())) {
throw exception(REWARD_REDEEM_RECIPIENT_ERROR);
}
......@@ -170,9 +173,10 @@ public class RedeemRewardApiImpl implements RedeemRewardApi {
rewardMapper.updateById(upReward);
}
private void updateMemberScore(RedeemRewardReqVO redeemRewardReqVO, Integer pointsRequire, Long redeemId) {
private void updateMemberScore(RedeemRewardReqVO redeemRewardReqVO, Integer pointsRequire, Long redeemId, String redemptionNumber) {
Map<String, Object> extParam = new HashMap<>();
extParam.put("redeemId", redeemId);
extParam.put("redemptionNumber", redemptionNumber);
memberUserScoreApi.operateScore(MemberUserScoreOperateReqDTO.builder()
.memberId(redeemRewardReqVO.getMemberId())
.sourceType(ScoreSourceTypeEnum.EXCHANGE_REWARD)
......@@ -183,13 +187,14 @@ public class RedeemRewardApiImpl implements RedeemRewardApi {
.build());
}
private Long addRedeemRecord(RedeemRewardReqVO redeemRewardReqVO, Integer pointsRequire) {
private RewardRedeemDO addRedeemRecord(RedeemRewardReqVO redeemRewardReqVO, Integer pointsRequire) {
RewardRedeemDO rewardRedeemDO = BeanUtil.copyProperties(redeemRewardReqVO, RewardRedeemDO.class);
rewardRedeemDO.setId(snowflakeGenerator.next());
rewardRedeemDO.setRedemptionNumber(rewardGenCodeUtils.generateRedemptionNumber());
rewardRedeemDO.setStatus(RewardRedeemStatusEnum.REDEEMING.getValue());
rewardRedeemDO.setScoreCount(redeemRewardReqVO.getRewardCount() * pointsRequire);
rewardRedeemMapper.insert(rewardRedeemDO);
return rewardRedeemDO.getId();
return rewardRedeemDO;
}
@Override
......
package cn.iocoder.yudao.module.reward.controller.admin.job;
import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
import cn.iocoder.yudao.module.reward.util.RewardGenCodeUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 兑换记录编号刷新任务
* @author zhaobiyan
*/
@Component
@Slf4j
public class RedemptionNumberFlushTask implements JobHandler {
@Resource
private RewardGenCodeUtils rewardGenCodeUtils;
@Override
public String execute(String param) throws Exception {
rewardGenCodeUtils.redemptionNumberFlush();
return "success";
}
}
\ No newline at end of file
......@@ -14,6 +14,8 @@ public class AppRewardRedeemDetailRespVO {
@ApiModelProperty(value = "id")
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@ApiModelProperty(value = "兑换记录编号")
private String redemptionNumber;
@ApiModelProperty(value = "会员id")
private Long memberId;
@ApiModelProperty(value = "礼品id")
......
......@@ -23,6 +23,8 @@ public class AppRewardRedeemListRespVO {
@ApiModelProperty(value = "id")
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@ApiModelProperty(value = "兑换记录编号")
private String redemptionNumber;
@ApiModelProperty(value = "礼品ID")
private Long rewardCode;
@ApiModelProperty(value = "礼品名称(中文)")
......
......@@ -21,6 +21,10 @@ public class RewardRedeemDO extends BaseDO {
*/
@TableId
private Long id;
/**
* 兑换记录编号
*/
private String redemptionNumber;
/**
* 会员id
*/
......
......@@ -23,4 +23,6 @@ public interface RewardRedeemMapper extends AbstractMapper<RewardRedeemDO> {
RewardRedeemPageRespVO detail(@Param("id") Long id);
List<RewardRedeemPageRespVO> exportList(@Param("req") RewardRedeemPageReqVO request);
String getCurrentMaxRedemptionNumber();
}
......@@ -288,6 +288,7 @@ public class RewardRedeemServiceImpl extends AbstractService<RewardRedeemMapper,
}
Map<String, Object> extParam = new HashMap<>();
extParam.put("redeemId", req.getId());
extParam.put("redemptionNumber", rewardRedeemDO.getRedemptionNumber());
memberUserScoreApi.operateScore(MemberUserScoreOperateReqDTO.builder()
.memberId(rewardRedeemDO.getMemberId())
.sourceType(ScoreSourceTypeEnum.EXCHANGE_REWARD_CANCEL)
......@@ -323,6 +324,7 @@ public class RewardRedeemServiceImpl extends AbstractService<RewardRedeemMapper,
RewardDO rewardDO = rewardService.getById(rewardRedeemDO.getRewardId());
return AppRewardRedeemListRespVO.builder()
.id(rewardRedeemDO.getId())
.redemptionNumber(rewardRedeemDO.getRedemptionNumber())
.createTime(rewardRedeemDO.getCreateTime())
.rewardCode(rewardRedeemDO.getRewardId())
.rewardTitleEn(rewardDO.getTitleEn())
......
package cn.iocoder.yudao.module.reward.util;
import cn.iocoder.yudao.framework.redis.helper.RedisHelper;
import cn.iocoder.yudao.module.reward.dal.dataobject.redeem.RewardRedeemDO;
import cn.iocoder.yudao.module.reward.dal.dataobject.reward.RewardDO;
import cn.iocoder.yudao.module.reward.dal.mysql.redeem.RewardRedeemMapper;
import cn.iocoder.yudao.module.reward.dal.mysql.reward.RewardMapper;
import com.alibaba.excel.util.DateUtils;
import org.redisson.api.RLock;
......@@ -27,6 +29,8 @@ public class RewardGenCodeUtils {
private RedisHelper redisHelper;
@Resource
private RedissonClient redissonClient;
@Resource
private RewardRedeemMapper rewardRedeemMapper;
/**
* 生成礼品ID
......@@ -48,8 +52,50 @@ public class RewardGenCodeUtils {
throw exception(GET_LOCK_FAILED);
}
String currentMaxRewardCode = rewardMapper.getCurrentMaxRewardCode();
if (currentMaxRewardCode == null){
codeNum = 1L;
} else {
codeNum = Long.parseLong(currentMaxRewardCode.substring(3)) + 1;
redisHelper.set(key, String.valueOf(codeNum),10, TimeUnit.MINUTES);
}
redisHelper.set(key, String.valueOf(codeNum),10, TimeUnit.SECONDS);
} catch (InterruptedException e) {
throw exception(GET_LOCK_FAILED);
} finally {
lock.unlock();
}
}
// 获得5位序列号,不足位前面补0
code.append(String.format("%05d", codeNum));
return code.toString();
}
/**
* 生成兑换记录编号
*/
public String generateRedemptionNumber() {
String key = "redemptionNumber:max:number";
// EC+年月+5位序列号,例如EC240900005
StringBuilder code = new StringBuilder();
code.append("EC");
String currentYearMonth = DateUtils.format(new Date(), "yyMM");
code.append(currentYearMonth);
Long codeNum;
if (redisHelper.hasKey(key)) {
codeNum = redisHelper.incrBy(key, 1);
} else {
RLock lock = redissonClient.getLock("next:redemptionNumber:code:lock");
try {
boolean lockSuccess = lock.tryLock(2, 2, TimeUnit.SECONDS);
if (!lockSuccess) {
throw exception(GET_LOCK_FAILED);
}
String currentMaxRedemptionNumber = rewardRedeemMapper.getCurrentMaxRedemptionNumber();
if (currentMaxRedemptionNumber == null){
codeNum = 1L;
} else {
codeNum = Long.parseLong(currentMaxRedemptionNumber.substring(6)) + 1;
}
redisHelper.set(key, String.valueOf(codeNum),10, TimeUnit.SECONDS);
} catch (InterruptedException e) {
throw exception(GET_LOCK_FAILED);
} finally {
......@@ -74,4 +120,19 @@ public class RewardGenCodeUtils {
start += 1;
}
}
public void redemptionNumberFlush() {
long start = 1L;
redisHelper.delete("redemptionNumber:max:number");
List<RewardRedeemDO> rewardRedeemDOList = rewardRedeemMapper.selectList();
for (RewardRedeemDO rewardRedeemDO : rewardRedeemDOList) {
StringBuilder code = new StringBuilder();
code.append("EC");
String currentYearMonth = DateUtils.format(new Date(), "yyMM");
code.append(currentYearMonth);
code.append(String.format("%05d", start));
rewardRedeemDO.setRedemptionNumber(code.toString());
rewardRedeemMapper.updateById(rewardRedeemDO);
start += 1;
}
}
}
......@@ -12,6 +12,11 @@ public class RewardRedeemBaseVO {
@ApiModelProperty(value = "id")
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/**
* 兑换记录编号
*/
@ApiModelProperty(value = "兑换记录编号")
private String redemptionNumber;
/**
* 会员id
*/
......
......@@ -73,9 +73,13 @@
<include refid="pageCondition"/>
order by er.create_time desc
</select>
<select id="getCurrentMaxRedemptionNumber" resultType="java.lang.String">
select redemption_number from ecw_reward_redeem order by redemption_number desc limit 1
</select>
<sql id="columns">
err.id ,
err.redemption_number as redemptionNumber,
err.member_id as memberId,
err.reward_id as rewardId,
err.status,
......
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