diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/enums/OrderStatusEnums.java b/eladmin-system/src/main/java/cn/ysk/cashier/enums/OrderStatusEnums.java new file mode 100644 index 00000000..3210e758 --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/enums/OrderStatusEnums.java @@ -0,0 +1,15 @@ +package cn.ysk.cashier.enums; + +import lombok.Getter; + +@Getter +public enum OrderStatusEnums { + REFUNDING("refunding"), + REFUND("refund"), + CLOSED("closed"); + private final String value; + + OrderStatusEnums(String value) { + this.value = value; + } +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/service/MpOrderDetailService.java b/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/service/MpOrderDetailService.java index 2a8eada3..c87d10c5 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/service/MpOrderDetailService.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/service/MpOrderDetailService.java @@ -1,8 +1,12 @@ package cn.ysk.cashier.mybatis.service; +import cn.ysk.cashier.dto.shoptable.ReturnOrderDTO; +import cn.ysk.cashier.enums.OrderStatusEnums; import cn.ysk.cashier.pojo.order.TbOrderDetail; import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + /** * (TbShopPermission)表服务接口 * @@ -11,5 +15,14 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface MpOrderDetailService extends IService { + /** + * 根据orderId和id修改detail状态 + * @param oldOrderStatusEnums 原始订单状态 + * @param orderStatusEnums 状态 + * @param orderId 订单id + * @param orderDetails detailIds + * @return 影响数量 + */ + boolean updateStatusByOrderIdAndIds(OrderStatusEnums oldOrderStatusEnums, OrderStatusEnums orderStatusEnums, Integer orderId, List orderDetails); } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/service/impl/MpOrderDetailServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/service/impl/MpOrderDetailServiceImpl.java index cf63ae1d..5faf6c07 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/service/impl/MpOrderDetailServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/service/impl/MpOrderDetailServiceImpl.java @@ -1,11 +1,16 @@ package cn.ysk.cashier.mybatis.service.impl; +import cn.ysk.cashier.dto.shoptable.ReturnOrderDTO; +import cn.ysk.cashier.enums.OrderStatusEnums; import cn.ysk.cashier.mybatis.mapper.TbOrderDetailMapper; import cn.ysk.cashier.mybatis.service.MpOrderDetailService; import cn.ysk.cashier.pojo.order.TbOrderDetail; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; +import java.util.List; + /** * (TbShopPermission)表服务实现类 * @@ -14,6 +19,16 @@ import org.springframework.stereotype.Service; */ @Service public class MpOrderDetailServiceImpl extends ServiceImpl implements MpOrderDetailService { - + @Override + public boolean updateStatusByOrderIdAndIds(OrderStatusEnums oldOrderStatusEnums, OrderStatusEnums orderStatusEnums, Integer orderId, List orderDetails) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper() + .eq(TbOrderDetail::getOrderId, orderId) + .in(TbOrderDetail::getId, orderDetails) + .set(TbOrderDetail::getStatus, orderStatusEnums.getValue()); + if (oldOrderStatusEnums != null) { + wrapper.eq(TbOrderDetail::getStatus, oldOrderStatusEnums.getValue()); + } + return update(wrapper); + } } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/app/TbFreeDineServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/app/TbFreeDineServiceImpl.java index c61f9626..7287a9c0 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/app/TbFreeDineServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/app/TbFreeDineServiceImpl.java @@ -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; } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbShopTableServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbShopTableServiceImpl.java index bb604c06..12d24d00 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbShopTableServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbShopTableServiceImpl.java @@ -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 returnDetail = new ArrayList<>(); - + ArrayList 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() .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); // 打印退款小票