Browse Source

01-03 金币强制退款红包抵扣

milestone-20251215-红包修改
lijianlin 7 days ago
parent
commit
46b2107c5e
  1. 1
      src/main/java/com/example/demo/domain/entity/UserGoldRecord.java
  2. 15
      src/main/java/com/example/demo/exception/RedCheckException.java
  3. 17
      src/main/java/com/example/demo/serviceImpl/Temporary/RedServiceImpl.java
  4. 102
      src/main/java/com/example/demo/serviceImpl/coin/AuditServiceImpl.java
  5. 1
      src/main/resources/mapper/AuditMapper.xml

1
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; // 支付时间

15
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;
}
}

17
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();
}

102
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);
}

1
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

Loading…
Cancel
Save