diff --git a/src/main/java/com/example/demo/domain/entity/UserGoldRecord.java b/src/main/java/com/example/demo/domain/entity/UserGoldRecord.java index 4d24119..6c55949 100644 --- a/src/main/java/com/example/demo/domain/entity/UserGoldRecord.java +++ b/src/main/java/com/example/demo/domain/entity/UserGoldRecord.java @@ -40,6 +40,7 @@ public class UserGoldRecord implements Serializable { private Integer auditId; // 审核人id private Integer auditStatus; // 审核状态(0待审核、1通过、2驳回、3外部传入【默认通过】) private String rejectReason; // 驳回理由 + private BigDecimal redDiff; // 退款金币充值,填补缺少红包所需要的金币数 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date payTime; // 支付时间 diff --git a/src/main/java/com/example/demo/exception/RedCheckException.java b/src/main/java/com/example/demo/exception/RedCheckException.java new file mode 100644 index 0000000..384b5c0 --- /dev/null +++ b/src/main/java/com/example/demo/exception/RedCheckException.java @@ -0,0 +1,15 @@ +package com.example.demo.exception; + +public class RedCheckException extends RuntimeException { + + private final int num; + + public RedCheckException(String message, int num) { + super(message); + this.num = num; + } + + public int getNum() { + return num; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/demo/serviceImpl/Temporary/RedServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/Temporary/RedServiceImpl.java index 7c68626..ff0db01 100644 --- a/src/main/java/com/example/demo/serviceImpl/Temporary/RedServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/Temporary/RedServiceImpl.java @@ -11,6 +11,7 @@ import com.example.demo.domain.vo.RedList; import com.example.demo.domain.vo.coin.ConsumeUser; import com.example.demo.domain.vo.coin.GoldUser; import com.example.demo.domain.vo.coin.Result; +import com.example.demo.exception.RedCheckException; import com.example.demo.exception.SystemException; import com.example.demo.mapper.Temporary.RedMapper; import com.example.demo.mapper.coin.ConsumeMapper; @@ -235,12 +236,6 @@ public class RedServiceImpl implements RedService { String body = "{\"order_id\":\"" + linkId + "\",\"amount\":" + price.divideToIntegralValue(BigDecimal.valueOf(100)).intValue() + "}"; - /* // 从当前请求中获取 Authorization(关键!) - ServletRequestAttributes attrs = - (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); - HttpServletRequest currentRequest = attrs.getRequest(); - String authHeader = currentRequest.getHeader("Authorization"); -*/ // 构建 HttpRequest HttpRequest request = HttpRequest.newBuilder() // .uri(URI.create(BASE_URLDev + PATH_REFUND)) @@ -273,8 +268,11 @@ public class RedServiceImpl implements RedService { return "success"; } - // 失败 - throw new RuntimeException("红包校验失败,orderId=" + linkId +"还需金币数"+num); + // 失败 同时抛出须补充的金币数 + throw new RedCheckException( + "红包校验失败,orderId=" + linkId, + num + ); } catch (IOException | InterruptedException e) { log.error("调用红包接口失败,orderId:{}", linkId, e); @@ -305,7 +303,7 @@ public class RedServiceImpl implements RedService { if (consumeUser.getJwcode() < 10000000 || consumeUser.getJwcode() > 99999999) { return Result.error("精网号位数小于8位或大于8位"); } - if (consumeUser.getAdminName() == null) { + if (consumeUser.getAdminId() == null) { return Result.error("管理员不能为空"); } GoldUser goldUser = userMapper.selectUser(consumeUser.getJwcode().toString()); @@ -394,7 +392,6 @@ public class RedServiceImpl implements RedService { user.setSumConsumeFree(BigDecimal.valueOf(consumeUser.getFreeGold().intValue())); user.setSumConsumeTask(BigDecimal.valueOf(consumeUser.getTaskGold().intValue())); userMapper.updateGold(user); - redMapper.update(userGoldRecord.getJwcode(),consumeUser.getFlag(),userGoldRecord.getPrice()); return Result.success(); } diff --git a/src/main/java/com/example/demo/serviceImpl/coin/AuditServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/coin/AuditServiceImpl.java index 360cd14..4fe9bdc 100644 --- a/src/main/java/com/example/demo/serviceImpl/coin/AuditServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/coin/AuditServiceImpl.java @@ -3,10 +3,9 @@ package com.example.demo.serviceImpl.coin; import com.example.demo.Util.GoldTistV2; import com.example.demo.domain.entity.User; import com.example.demo.domain.entity.UserGoldRecord; -import com.example.demo.domain.vo.coin.Gold; -import com.example.demo.domain.vo.coin.GoldUser; -import com.example.demo.domain.vo.coin.RechargeAudit; -import com.example.demo.domain.vo.coin.RefundAudit; +import com.example.demo.domain.vo.coin.*; +import com.example.demo.exception.RedCheckException; +import com.example.demo.mapper.Temporary.RedMapper; import com.example.demo.mapper.coin.AuditMapper; import com.example.demo.mapper.coin.MarketMapper; import com.example.demo.mapper.coin.UserMapper; @@ -45,6 +44,8 @@ public class AuditServiceImpl implements AuditService { @Autowired private UserMapper userMapper; @Autowired + private RedMapper redMapper; + @Autowired private AdminService adminService; @Autowired private GeneralService generalService; @@ -60,7 +61,8 @@ public class AuditServiceImpl implements AuditService { public boolean auditOrder(String token, String orderCode, Integer auditId, Integer action,String rejectReason,BigDecimal price,String linkId) { UserGoldRecord order=auditMapper.selectOrderByOrderCode(orderCode); Date date =new Date(); - if (order == null || order.getAuditStatus() != 0) { + //状态为0待审核或4第一次红包退款失败的订单才能审核 + if (order == null || (order.getAuditStatus() != 0 && order.getAuditStatus() !=4)) { throw new IllegalArgumentException("订单不存在或已被审核"); } //更新订单的审核状态和审核人 @@ -147,15 +149,23 @@ public class AuditServiceImpl implements AuditService { order.getRemark(),0, auditName, "金币充值"); }else if (order.getType()==2) { //退款 - //退红包校验 - try { - redService.checkRed(price,linkId); - } catch (Exception e) { - log.error("红包退票失败"); - updateOrder.setAuditStatus(4); - auditMapper.updateOrder(updateOrder); - throw new RuntimeException(e); - } + //对非强制退款订单进行退红包校验 + if (order.getAuditStatus()!=4){ + try { + redService.checkRed(price, linkId); + } catch (RedCheckException e) { + // 业务失败(flag=false) + int num = e.getNum(); + log.error("红包退票失败,还需扣除金币数: {}", num); + updateOrder.setAuditStatus(4); + updateOrder.setRedDiff(BigDecimal.valueOf(num)); + auditMapper.updateOrder(updateOrder); + throw e; // 或者包装后再抛 + } catch (Exception e) { + // 网络异常 / 系统异常 + log.error("红包接口调用异常", e); + throw new RuntimeException(e); + }} //2.获取对应的订单(退款订单号去掉开头"TK"即为对应原始订单) String oldOrderCode = order.getOrderCode().replaceFirst("TK_", ""); UserGoldRecord oldOrder = auditMapper.selectAllOrderByOrderCode(oldOrderCode); @@ -167,8 +177,11 @@ public class AuditServiceImpl implements AuditService { update.setCurrentFreeDecember(BigDecimal.valueOf(order.getFreeDecember())); //当前十二月免费金币 update.setCurrentTaskGold(BigDecimal.valueOf(order.getTaskGold())); //当前任务金币 auditMapper.updateUserGold(update); + + //商品消费退款 //erp增加退款数据 - if(oldOrder.getType()==1){ //消费 + if(oldOrder.getType()==1){ + int type = 2; GoldTistV2.addCoinNew(order.getJwcode().toString(), 55, //退款免费-商品 (double) (order.getFreeDecember()+order.getFreeJune()) /100, order.getRemark(),0, auditName, "退款商品"+order.getGoodsName()); @@ -178,21 +191,72 @@ public class AuditServiceImpl implements AuditService { GoldTistV2.addCoinNew(order.getJwcode().toString(), 57, //退款任务-商品 (double) (order.getTaskGold() ) /100, order.getRemark(),0, auditName, "退款商品"+order.getGoodsName()); - } else if (oldOrder.getType()==0){//充值金币 + // 执行审核更新 + redMapper.update(order.getJwcode(),type,order.getPrice()); + }//金币充值退款 + else if (oldOrder.getType()==0){ + int type = 1; if(order.getTaskGold()==0){ //无任务金币统一走免费+永久 GoldTistV2.addCoinNew(order.getJwcode().toString(), 58, //退款免费+永久金币-充值 (double) (order.getFreeDecember()+order.getFreeJune()+order.getPermanentGold() ) /100, order.getRemark(),(double) order.getPermanentGold() / 100, auditName, "退款金币充值");} - if (order.getTaskGold()!=0) + if (order.getTaskGold()!=0){ GoldTistV2.addCoinNew(order.getJwcode().toString(), 59, //退款任务+永久金币-充值 (double) (order.getTaskGold()+order.getPermanentGold() ) /100, - order.getRemark(),(double) order.getPermanentGold() / 100, auditName, "退款金币充值"); + order.getRemark(),(double) order.getPermanentGold() / 100, auditName, "退款金币充值");} + //额外扣金币抵扣红包 + if (order.getAuditStatus()==4){ + GoldUser user = userMapper.selectUser(order.getJwcode().toString()); + // 检查用户余额是否足够抵扣红包差额 + if (order.getRedDiff().compareTo(user.getNowSumGold()) > 0) { + log.error("用户余额不足,无法抵扣红包 - 红包差额: {}, 用户余额: {}", + order.getRedDiff(), user.getNowSumGold()); + throw new IllegalArgumentException("用户余额不足,无法抵扣红包"); + } + ConsumeUser consumeUser = new ConsumeUser(); + // 1. 先扣除免费金币 + if (order.getRedDiff().compareTo(user.getNowFreeGold()) <= 0) { + // 红包差额小于等于总免费金币,只扣免费金币 + consumeUser.setJwcode(order.getJwcode()); + consumeUser.setFreeGold(order.getRedDiff()); + consumeUser.setPermanentGold(BigDecimal.ZERO); + consumeUser.setTaskGold(BigDecimal.ZERO); + } else { + // 2. 免费金币不足,扣除免费+永久金币 + BigDecimal remainingAfterFree = order.getRedDiff().subtract(user.getNowFreeGold()); + if (remainingAfterFree.compareTo(user.getNowPermanentGold()) <= 0) { + consumeUser.setJwcode(order.getJwcode()); + consumeUser.setFreeGold(user.getNowFreeGold()); + consumeUser.setPermanentGold(user.getNowPermanentGold().subtract(remainingAfterFree)); + consumeUser.setTaskGold(BigDecimal.ZERO); + } else { + // 3. 免费+永久金币仍不足,扣除全部免费+永久+部分任务金币 + BigDecimal remainingAfterPermanent = remainingAfterFree.subtract(user.getNowPermanentGold()); + if (remainingAfterPermanent.compareTo(user.getNowTaskGold()) <= 0) { + consumeUser.setJwcode(order.getJwcode()); + consumeUser.setFreeGold(user.getNowFreeGold()); + consumeUser.setPermanentGold(user.getNowPermanentGold()); + consumeUser.setTaskGold(user.getNowTaskGold().subtract(remainingAfterPermanent)); + } else { + throw new IllegalArgumentException("用户金币不足,无法抵扣红包"); + } + } + } + consumeUser.setSumGold(order.getRedDiff()); + consumeUser.setAdminId(order.getAdminId()); + consumeUser.setRemark(order.getRemark()); + consumeUser.setPrice(order.getPrice()); + + } // 执行审核更新 + redMapper.update(order.getJwcode(),type,order.getPrice()); } } + updateOrder.setAuditStatus(1); updateOrder.setAuditTime(new Date()); - // 执行审核更新 + + auditMapper.updateOrder(updateOrder); } diff --git a/src/main/resources/mapper/AuditMapper.xml b/src/main/resources/mapper/AuditMapper.xml index 33519b6..50a49c0 100644 --- a/src/main/resources/mapper/AuditMapper.xml +++ b/src/main/resources/mapper/AuditMapper.xml @@ -5,6 +5,7 @@ update user_gold_record set audit_id = #{auditId}, audit_status = #{auditStatus}, + red_diff = #{redDiff}, reject_reason = #{rejectReason}, audit_time = #{auditTime} where order_code = #{orderCode} and audit_status = 0