Browse Source

01-10 红包退款优化

milestone-20251215-红包修改
lijianlin 1 day ago
parent
commit
3383aa8308
  1. 2
      src/main/java/com/example/demo/domain/vo/coin/GoldDetail.java
  2. 1
      src/main/java/com/example/demo/domain/vo/coin/RefundUser.java
  3. 62
      src/main/java/com/example/demo/serviceImpl/coin/AuditServiceImpl.java
  4. 2
      src/main/java/com/example/demo/serviceImpl/coin/RefundServiceImpl.java
  5. 4
      src/main/resources/mapper/AuditMapper.xml
  6. 2
      src/main/resources/mapper/GoldDetailMapper.xml

2
src/main/java/com/example/demo/domain/vo/coin/GoldDetail.java

@ -64,5 +64,7 @@ public class GoldDetail {
private Integer isRefund; private Integer isRefund;
@ExcelIgnore @ExcelIgnore
private String goodsName; private String goodsName;
private BigDecimal price;
private String linkId;
} }

1
src/main/java/com/example/demo/domain/vo/coin/RefundUser.java

@ -46,6 +46,7 @@ public class RefundUser implements Serializable {
private Integer adminId; //提交人Id private Integer adminId; //提交人Id
private String adminName; //提交人姓名 private String adminName; //提交人姓名
private BigDecimal price; //原价 private BigDecimal price; //原价
private String linkId; //LinkId
@ExcelIgnore @ExcelIgnore
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")

62
src/main/java/com/example/demo/serviceImpl/coin/AuditServiceImpl.java

@ -61,10 +61,12 @@ public class AuditServiceImpl implements AuditService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Override @Override
public boolean auditOrder(String token, String orderCode, Integer auditId, Integer action,String rejectReason,BigDecimal price,String linkId) throws Exception { public boolean auditOrder(String token, String orderCode, Integer auditId, Integer action,String rejectReason,BigDecimal price,String linkId) throws Exception {
if (linkId== null){ if (linkId== null){
linkId=orderCode; linkId=orderCode;
} }
UserGoldRecord order=auditMapper.selectOrderByOrderCode(orderCode); UserGoldRecord order=auditMapper.selectOrderByOrderCode(orderCode);
if (price== null){ if (price== null){
price= BigDecimal.valueOf(order.getPermanentGold()); price= BigDecimal.valueOf(order.getPermanentGold());
} }
@ -73,6 +75,7 @@ public class AuditServiceImpl implements AuditService {
if (order == null || (order.getAuditStatus() != 0 && order.getAuditStatus() !=4)) { if (order == null || (order.getAuditStatus() != 0 && order.getAuditStatus() !=4)) {
throw new IllegalArgumentException("订单不存在或已被审核"); throw new IllegalArgumentException("订单不存在或已被审核");
} }
GoldUser userNow = userMapper.selectUser(order.getJwcode().toString());
//更新订单的审核状态和审核人 //更新订单的审核状态和审核人
UserGoldRecord updateOrder = new UserGoldRecord(); UserGoldRecord updateOrder = new UserGoldRecord();
updateOrder.setOrderCode(orderCode); updateOrder.setOrderCode(orderCode);
@ -204,32 +207,23 @@ public class AuditServiceImpl implements AuditService {
(double) (order.getTaskGold() ) /100,SimpleIdGenerator.generateId(), (double) (order.getTaskGold() ) /100,SimpleIdGenerator.generateId(),
order.getRemark(),0, auditName, "退款商品"+order.getGoodsName()); order.getRemark(),0, auditName, "退款商品"+order.getGoodsName());
// 执行审核更新 // 执行审核更新
redMapper.update(order.getJwcode(),type,order.getPrice());
redMapper.update(order.getJwcode(),type,order.getPrice().divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP));
}//金币充值退款 }//金币充值退款
else if (oldOrder.getType()==0){ else if (oldOrder.getType()==0){
if(order.getTaskGold()==0){ //无任务金币统一走免费+永久
GoldTistV2.addCoinNew(order.getJwcode().toString(), 58, //退款免费+永久金币-充值
(double) (order.getFreeDecember()+order.getFreeJune()+order.getPermanentGold() ) /100,SimpleIdGenerator.generateId(),
order.getRemark(),(double) order.getPermanentGold() / 100, auditName, "退款金币充值");}
if (order.getTaskGold()!=0){
GoldTistV2.addCoinNew(order.getJwcode().toString(), 59, //退款任务+永久金币-充值
(double) (order.getTaskGold()+order.getPermanentGold() ) /100,SimpleIdGenerator.generateId(),
order.getRemark(),(double) order.getPermanentGold() / 100, auditName, "退款金币充值");}
//额外扣金币抵扣红包 //额外扣金币抵扣红包
if (order.getAuditStatus()==4){ if (order.getAuditStatus()==4){
int type = 1; //红包充值累计 int type = 1; //红包充值累计
GoldUser user = userMapper.selectUser(order.getJwcode().toString());
// 检查用户余额是否足够抵扣红包差额 // 检查用户余额是否足够抵扣红包差额
if (order.getRedDiff().compareTo(user.getNowSumGold()) > 0) {
if (order.getPrice().add(order.getRedDiff()).compareTo(userNow.getNowSumGold()) > 0) {
log.error("用户余额不足,无法抵扣红包 - 红包差额: {}, 用户余额: {}", log.error("用户余额不足,无法抵扣红包 - 红包差额: {}, 用户余额: {}",
order.getRedDiff(), user.getNowSumGold());
order.getRedDiff(), userNow.getNowSumGold());
throw new IllegalArgumentException("用户余额不足,无法抵扣红包"); throw new IllegalArgumentException("用户余额不足,无法抵扣红包");
} }
ConsumeUser consumeUser = new ConsumeUser(); ConsumeUser consumeUser = new ConsumeUser();
// 1. 先扣除任务金币 // 1. 先扣除任务金币
if (order.getRedDiff().compareTo(user.getNowTaskGold()) <= 0) {
if (order.getRedDiff().compareTo(userNow.getNowTaskGold().add(BigDecimal.valueOf(order.getTaskGold()))) <= 0) {
// 红包差额小于等于任务金币只扣任务金币 // 红包差额小于等于任务金币只扣任务金币
consumeUser.setJwcode(order.getJwcode()); consumeUser.setJwcode(order.getJwcode());
consumeUser.setTaskGold(order.getRedDiff()); consumeUser.setTaskGold(order.getRedDiff());
@ -237,20 +231,20 @@ public class AuditServiceImpl implements AuditService {
consumeUser.setPermanentGold(BigDecimal.ZERO); consumeUser.setPermanentGold(BigDecimal.ZERO);
} else { } else {
// 2. 任务金币不足扣除任务+免费金币 // 2. 任务金币不足扣除任务+免费金币
BigDecimal remainingAfterTask = order.getRedDiff().subtract(user.getNowTaskGold());
if (remainingAfterTask.compareTo(user.getNowFreeGold()) <= 0) {
BigDecimal remainingAfterTask = order.getRedDiff().subtract(userNow.getNowTaskGold().add(BigDecimal.valueOf(order.getTaskGold())));
if (remainingAfterTask.compareTo(userNow.getNowFreeGold().add(BigDecimal.valueOf(order.getFreeJune()+order.getFreeDecember()))) <= 0) {
consumeUser.setJwcode(order.getJwcode()); consumeUser.setJwcode(order.getJwcode());
consumeUser.setTaskGold(user.getNowTaskGold());
consumeUser.setFreeGold(user.getNowFreeGold().subtract(remainingAfterTask));
consumeUser.setTaskGold(userNow.getNowTaskGold().add(BigDecimal.valueOf(order.getTaskGold())));
consumeUser.setFreeGold(remainingAfterTask);
consumeUser.setPermanentGold(BigDecimal.ZERO); consumeUser.setPermanentGold(BigDecimal.ZERO);
} else { } else {
// 3. 任务+免费金币仍不足扣除全部任务+免费+部分永久金币 // 3. 任务+免费金币仍不足扣除全部任务+免费+部分永久金币
BigDecimal remainingAfterFree = remainingAfterTask.subtract(user.getNowFreeGold());
if (remainingAfterFree.compareTo(user.getNowPermanentGold()) <= 0) {
BigDecimal remainingAfterFree = remainingAfterTask.subtract(userNow.getNowFreeGold().add(BigDecimal.valueOf(order.getFreeJune()+order.getFreeDecember())));
if (remainingAfterFree.compareTo(userNow.getNowPermanentGold().add(BigDecimal.valueOf(order.getPermanentGold()))) <= 0) {
consumeUser.setJwcode(order.getJwcode()); consumeUser.setJwcode(order.getJwcode());
consumeUser.setTaskGold(user.getNowTaskGold());
consumeUser.setFreeGold(user.getNowFreeGold());
consumeUser.setPermanentGold(user.getNowPermanentGold().subtract(remainingAfterFree));
consumeUser.setTaskGold(userNow.getNowTaskGold().add(BigDecimal.valueOf(order.getTaskGold())));
consumeUser.setFreeGold(userNow.getNowFreeGold().add(BigDecimal.valueOf(order.getFreeJune()+order.getFreeDecember())));
consumeUser.setPermanentGold(remainingAfterFree);
} else { } else {
throw new IllegalArgumentException("用户金币不足,无法抵扣红包"); throw new IllegalArgumentException("用户金币不足,无法抵扣红包");
} }
@ -262,22 +256,32 @@ public class AuditServiceImpl implements AuditService {
consumeUser.setPrice(order.getPrice()); consumeUser.setPrice(order.getPrice());
// 执行金币抵扣红包 // 执行金币抵扣红包
redService.updateRed(consumeUser); redService.updateRed(consumeUser);
//link扣除已有红包
redService.consumeRed(linkId);
// 执行审核更新 // 执行审核更新
redMapper.update(order.getJwcode(),type,order.getPrice()); redMapper.update(order.getJwcode(),type,order.getPrice());
} }
//link扣除已有红包 //link扣除已有红包
if (!AuditContext.getRedCheckResult().equals("old")){
else if (!AuditContext.getRedCheckResult().equals("old")){
redService.consumeRed(linkId); redService.consumeRed(linkId);
} }
else { else {
Exception e = new Exception("旧订单退款"); Exception e = new Exception("旧订单退款");
String title = "旧订单退款"; String title = "旧订单退款";
String detail= (order.getJwcode()).toString()+"金币订单号"+orderCode;
String detail= ("精网号:"+order.getJwcode())+"\n金币订单号:"+orderCode+"\n永久金币:"+Math.abs(order.getPermanentGold())/100+
"\n免费金币:"+Math.abs((order.getFreeJune()+order.getFreeDecember()))/100+"\n任务金币:"+Math.abs(order.getTaskGold())/100+
"\n退款类型:"+order.getRefundType()+"\n商品名:"+order.getGoodsName()+"\n备注:"+order.getRemark();
GlobalExceptionHandler.sendFeishuAlert(e, title, detail); GlobalExceptionHandler.sendFeishuAlert(e, title, detail);
} }
if(order.getTaskGold()==0){ //无任务金币统一走免费+永久
GoldTistV2.addCoinNew(order.getJwcode().toString(), 58, //退款免费+永久金币-充值
(double) (order.getFreeDecember()+order.getFreeJune()+order.getPermanentGold() ) /100,SimpleIdGenerator.generateId(),
order.getRemark(),(double) order.getPermanentGold() / 100, auditName, "退款金币充值");}
if (order.getTaskGold()!=0){
GoldTistV2.addCoinNew(order.getJwcode().toString(), 59, //退款任务+永久金币-充值
(double) (order.getTaskGold()+order.getPermanentGold() ) /100,SimpleIdGenerator.generateId(),
order.getRemark(),(double) order.getPermanentGold() / 100, auditName, "退款金币充值");}
} }
} }

2
src/main/java/com/example/demo/serviceImpl/coin/RefundServiceImpl.java

@ -179,7 +179,9 @@ public class RefundServiceImpl implements RefundService {
userGoldRecord.setPayPlatform("金币系统"); userGoldRecord.setPayPlatform("金币系统");
userGoldRecord.setRemark(refundUser.getRemark()); userGoldRecord.setRemark(refundUser.getRemark());
if (refundUser.getLinkId() != null&&refundUser.getPrice()!=null){
userGoldRecord.setPrice(refundUser.getPrice()); userGoldRecord.setPrice(refundUser.getPrice());
userGoldRecord.setLinkId((refundUser.getLinkId()));}
userGoldRecord.setAdminId(refundUser.getAdminId()); userGoldRecord.setAdminId(refundUser.getAdminId());
userGoldRecord.setType((byte) 2); userGoldRecord.setType((byte) 2);
userGoldRecord.setAuditStatus(0); userGoldRecord.setAuditStatus(0);

4
src/main/resources/mapper/AuditMapper.xml

@ -8,7 +8,7 @@
red_diff = #{redDiff}, red_diff = #{redDiff},
reject_reason = #{rejectReason}, reject_reason = #{rejectReason},
audit_time = #{auditTime} audit_time = #{auditTime}
where order_code = #{orderCode} and audit_status = 0
where order_code = #{orderCode} and audit_status in (1,4)
order by create_time DESC order by create_time DESC
limit 1 limit 1
</update> </update>
@ -219,7 +219,7 @@
<select id="selectOrderByOrderCode" resultType="com.example.demo.domain.entity.UserGoldRecord"> <select id="selectOrderByOrderCode" resultType="com.example.demo.domain.entity.UserGoldRecord">
select * from user_gold_record select * from user_gold_record
where order_code = #{orderCode} and audit_status = 0
where order_code = #{orderCode} and audit_status in (0,4)
and flag=1 and flag=1
ORDER BY create_time DESC ORDER BY create_time DESC
limit 1 limit 1

2
src/main/resources/mapper/GoldDetailMapper.xml

@ -30,7 +30,7 @@
`ugr`.type, `ugr`.type,
`ugr`.is_refund, `ugr`.is_refund,
`ugr`.order_code, `ugr`.order_code,
`ugr`.goods_name,
`ugr`.goods_name,`ugr`.price,`ugr`.link_id,
Round((`ugr`.free_june + `ugr`.free_december) / 100.0, 2) AS freeGold, Round((`ugr`.free_june + `ugr`.free_december) / 100.0, 2) AS freeGold,
ROUND(`ugr`.sum_gold / 100.0, 2) AS SumGold, ROUND(`ugr`.sum_gold / 100.0, 2) AS SumGold,
ROUND(`ugr`.permanent_gold / 100.0, 2) AS PermanentGold, ROUND(`ugr`.permanent_gold / 100.0, 2) AS PermanentGold,

Loading…
Cancel
Save