订单支持多次退款

This commit is contained in:
2024-10-23 10:22:40 +08:00
parent c2e481cd15
commit 47735d6f4b
5 changed files with 86 additions and 12 deletions

View File

@@ -28,7 +28,7 @@ public class TbFreeDineServiceImpl implements TbFreeDineService {
}
if (StrUtil.isNotBlank(freeDineConfig.getUseType())) {
freeDineConfig.setUseTypeList(JSONObject.parseArray(freeDineConfig.getUseType()).toJavaList(String.class));
freeDineConfig.setUseTypeList(JSONObject.parseArray(freeDineConfig.getUseType()).toJavaList(String.class ));
}
return freeDineConfig;
}

View File

@@ -89,7 +89,6 @@ public class TbShopTableServiceImpl implements TbShopTableService {
private final TbProducSkutMapper producSkutMapper;
private final RabbitTemplate rabbitTemplate;
private final TbShopInfoRepository shopInfoRepository;
private final TbShopOpenIdMapper shopOpenIdMapper;
private final WxMsgUtils wxMsgUtils;
private final TbShopPayTypeRepository payTypeRepository;
private final MpShopTableMapper mpShopTableMapper;
@@ -97,8 +96,6 @@ public class TbShopTableServiceImpl implements TbShopTableService {
private final MpShopTableService mpShopTableService;
private final MpShopUnitMapper mpShopUnitMapper;
private final MpProductStockDetailMapper mpProductStockDetailMapper;
@Value("${thirdPay.payType}")
private String thirdPayType;
/**
@@ -1999,18 +1996,36 @@ public class TbShopTableServiceImpl implements TbShopTableService {
.eq(TbOrderDetail::getStatus, "closed")
.eq(TbOrderDetail::getOrderId, returnOrderDTO.getOrderId())
.in(TbOrderDetail::getId, detailIds));
if (detailIds.size() != returnOrderDTO.getOrderDetails().size()) {
if (detailList.size() != returnOrderDTO.getOrderDetails().size()) {
throw new BadRequestException("订单明细数量不一致");
}
BigDecimal returnAmount = BigDecimal.ZERO;
BigDecimal packAMount = BigDecimal.ZERO;
BigDecimal saleAmount = BigDecimal.ZERO;
List<TbOrderDetail> returnDetail = new ArrayList<>();
ArrayList<TbOrderDetail> remainOrderDetailList = new ArrayList<>();
for (TbOrderDetail orderDetail : detailList) {
Integer returnNum = returnNumMap.get(orderDetail.getId().toString());
int remainNum = orderDetail.getNum() - returnNum;
if (remainNum < 0) {
throw new BadRequestException("{}最多可退数量为: {}", orderDetail.getProductName(), orderDetail.getNum());
}
// 将未退款的剩余订单详情重新生成记录
BigDecimal packFee = orderDetail.getPackAmount().divide(BigDecimal.valueOf(orderDetail.getNum()), RoundingMode.HALF_UP);
if (remainNum > 0) {
// 单个打包费
BigDecimal remainPackFee = packFee.multiply(BigDecimal.valueOf(remainNum));
TbOrderDetail remainOrderDetail = BeanUtil.copyProperties(orderDetail, TbOrderDetail.class);
remainOrderDetail.setNum(remainNum);
remainOrderDetail.setPriceAmount(BigDecimal.valueOf(remainNum).multiply(orderDetail.getPrice())
.add(remainPackFee));
remainOrderDetail.setPackAmount(remainPackFee);
remainOrderDetail.setReturnNum("0");
remainOrderDetail.setId(null);
remainOrderDetailList.add(remainOrderDetail);
}
returnAmount = returnAmount.add(orderDetail.getPriceAmount()
.divide(new BigDecimal(orderDetail.getNum()), 2, RoundingMode.DOWN)
.multiply(BigDecimal.valueOf(returnNum)));
@@ -2019,10 +2034,20 @@ public class TbShopTableServiceImpl implements TbShopTableService {
.divide(new BigDecimal(orderDetail.getNum()), 2, RoundingMode.DOWN)
.multiply(BigDecimal.valueOf(returnNum)));
BigDecimal returnPackFee = packFee.multiply(BigDecimal.valueOf(returnNum));
orderDetail.setNum(returnNum);
orderDetail.setPriceAmount(BigDecimal.valueOf(returnNum).multiply(orderDetail.getPrice())
.add(returnPackFee));
orderDetail.setPackAmount(returnPackFee);
orderDetail.setRefundNumber(returnNum);
orderDetail.setStatus("refunding");
}
// 保存剩余未退款的订单详情
if (!remainOrderDetailList.isEmpty()) {
mpOrderDetailService.saveBatch(remainOrderDetailList);
}
String orderNo = generateOrderNumber(isOnline ? "OLRO" : "RO");
TbOrderInfo returnOrder = BeanUtil.copyProperties(oldOrderInfo, TbOrderInfo.class);
returnOrder.setId(null);
@@ -2039,7 +2064,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
orderInfoMapper.insert(returnOrder);
updateStockAndRecord(detailList);
mpOrderDetailService.updateBatchById(detailList);
return returnOrder;
}
@@ -2084,9 +2109,11 @@ public class TbShopTableServiceImpl implements TbShopTableService {
public Object returnOrder(ReturnOrderDTO returnOrderDTO) {
TbOrderInfo orderInfo = orderInfoMapper.selectOne(new LambdaQueryWrapper<TbOrderInfo>()
.eq(TbOrderInfo::getId, returnOrderDTO.getOrderId())
.eq(TbOrderInfo::getStatus, "closed"));
.in(TbOrderInfo::getStatus, OrderStatusEnums.REFUND.getValue(), OrderStatusEnums.CLOSED.getValue())
// .eq(TbOrderInfo::getStatus, "closed")
);
if (orderInfo == null) {
throw new BadRequestException("订单非完单状态");
throw new BadRequestException("订单不处于可退款状态");
}
TbShopInfo shopInfo = mpShopInfoMapper.selectById(orderInfo.getShopId());
@@ -2112,8 +2139,12 @@ public class TbShopTableServiceImpl implements TbShopTableService {
} else if ("deposit".equals(payType)) {
orderInfoService.depositReturn(Integer.valueOf(orderInfo.getUserId()), Integer.valueOf(orderInfo.getShopId()), returnOrderInfo.getRefundAmount());
orderInfo.setStatus("refund");
mpOrderDetailService.updateStatusByOrderIdAndIds(OrderStatusEnums.REFUNDING, OrderStatusEnums.REFUND,
returnOrderDTO.getOrderId(), returnOrderDTO.getOrderDetails().stream().map(ReturnOrderDTO.OrderDetail::getId).collect(Collectors.toList()));
} else if ("cash".equals(payType)) {
orderInfo.setStatus("refund");
mpOrderDetailService.updateStatusByOrderIdAndIds(OrderStatusEnums.REFUNDING, OrderStatusEnums.REFUND,
returnOrderDTO.getOrderId(), returnOrderDTO.getOrderDetails().stream().map(ReturnOrderDTO.OrderDetail::getId).collect(Collectors.toList()));
}
orderInfoMapper.updateById(orderInfo);
// 打印退款小票