Browse Source

售后对账单调整

fgd 1 year ago
parent
commit
4e3029846b

+ 44 - 5
sd-business/src/main/java/com/sd/business/service/order/impl/OrderServiceImpl.java

@@ -2,6 +2,7 @@ package com.sd.business.service.order.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.convert.Convert;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson2.JSON;
@@ -910,6 +911,14 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderInfo> implem
             return;
         }
 
+        // 无理由订单完成时间超过当天不能删除
+        if (Objects.equals(orderInfo.getClassify(), OrderClassifyEnum.NO_REASON_ORDER.getKey())
+                && Objects.equals(orderInfo.getStatus(), OrderStatusEnum.COMPLETION_PRODUCTION.getKey())) {
+            if (DateUtil.beginOfDay(new Date()).compareTo(orderInfo.getShippingTime()) > 0) {
+                throw new ServiceException("无理由订单删除只支持当天!");
+            }
+        }
+
         // 获取订单商品主材和包材
         List<OrderSku> orderSkuList = orderSkuService.list(q -> q.eq(OrderSku::getOrderId, id));
         List<OrderSkuBom> orderSkuBomList = orderSkuBomService.list(q -> q.eq(OrderSkuBom::getOrderId, id));
@@ -918,6 +927,33 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderInfo> implem
         // 成品退料
         if (Objects.equals(orderInfo.getStockType(), StatusConstant.YES)) {
             inventoryFinishedService.noSourceInWarehousing(orderSkuList);
+            // 快递包材退料
+            Map<Long, InOutStorageBom> inStorageBomMap = orderPackageBomList.stream()
+                    .map(item -> {
+                        InOutStorageBom inStorageBom = new InOutStorageBom();
+                        inStorageBom.setBomSpecId(item.getBomSpecId());
+                        inStorageBom.setQuantity(item.getQuantity());
+                        return inStorageBom;
+                    }).collect(Collectors.toMap(
+                            InOutStorageBom::getBomSpecId,
+                            Function.identity(),
+                            (v1, v2) -> {
+                                v1.setQuantity(v1.getQuantity().add(v2.getQuantity()));
+                                return v1;
+                            }
+                    ));
+            InOutStorageDto packageBomInStorageDto = new InOutStorageDto();
+            packageBomInStorageDto.setType(InOutTypeEnum.IN.getKey());
+            packageBomInStorageDto.setDetailType(InDetailTypeEnum.RETURN_GOODS.getKey());
+            packageBomInStorageDto.setWarehouseId(WarehouseConstant.PACKAGING_MATERIAL);
+            packageBomInStorageDto.setDepartmentId(DepartmentConstant.SD_SPORTS);
+            packageBomInStorageDto.setApplicant(SecurityUtils.getLoginUser().getUser().getNickName());
+            packageBomInStorageDto.setRemark("删除订单:" + orderInfo.getCode()
+                    + (StrUtil.isBlank(orderInfo.getWlnCode()) ? StringPool.EMPTY : "(" + orderInfo.getWlnCode() + ")")
+                    + " 包材退料入库");
+            packageBomInStorageDto.setInOutStorageBomList(new ArrayList<>(inStorageBomMap.values()));
+            inOutStorageService.add(packageBomInStorageDto);
+
             delete(id);
             OrderOperatingLog orderOperatingLog = new OrderOperatingLog();
             orderOperatingLog.setType(30);
@@ -950,11 +986,14 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderInfo> implem
             inOutStorageBomList.add(inOutStorageBom);
         }
 
-        for (OrderPackageBom orderPackageBom : orderPackageBomList) {
-            InOutStorageBom inOutStorageBom = new InOutStorageBom();
-            inOutStorageBom.setBomSpecId(orderPackageBom.getBomSpecId());
-            inOutStorageBom.setQuantity(orderPackageBom.getQuantity());
-            inOutStorageBomList.add(inOutStorageBom);
+        // 无理由订单不会出库快递包材,不需要退料
+        if (!Objects.equals(orderInfo.getClassify(), OrderClassifyEnum.NO_REASON_ORDER.getKey())) {
+            for (OrderPackageBom orderPackageBom : orderPackageBomList) {
+                InOutStorageBom inOutStorageBom = new InOutStorageBom();
+                inOutStorageBom.setBomSpecId(orderPackageBom.getBomSpecId());
+                inOutStorageBom.setQuantity(orderPackageBom.getQuantity());
+                inOutStorageBomList.add(inOutStorageBom);
+            }
         }
 
         // 合并数量

+ 41 - 35
sd-business/src/main/java/com/sd/business/service/statement/impl/StatementOfAccountServiceImpl.java

@@ -750,9 +750,6 @@ public class StatementOfAccountServiceImpl extends ServiceImpl<StatementOfAccoun
                 })
                 .collect(Collectors.toList());
 
-        Map<Long, BigDecimal> map = bomSpecList.stream().collect(
-                Collectors.toMap(DocumentByOrderVo.BomSpec::getOrderSkuId, DocumentByOrderVo.BomSpec::getQuantity));
-
         // 包材
         List<DocumentByOrderVo.BomSpec> packBomSpecList = orderSkuBomList.stream()
                 .map(item -> {
@@ -763,7 +760,6 @@ public class StatementOfAccountServiceImpl extends ServiceImpl<StatementOfAccoun
                     bomSpec.setUnitPrice(item.getUnitPrice());
                     return bomSpec;
                 })
-                .peek(item -> item.setQuantity(ObjectUtil.equals(map.get(item.getOrderSkuId()), BigDecimal.ZERO) ? item.getQuantity() : map.get(item.getOrderSkuId()).multiply(item.getQuantity())))
                 .collect(Collectors.toList());
 
         // 赋值
@@ -811,6 +807,10 @@ public class StatementOfAccountServiceImpl extends ServiceImpl<StatementOfAccoun
                 OrderExchangeDetail::getOrderSkuId,
                 OrderExchangeDetail::getQuantity,
                 BigDecimal::add));
+        Map<Long, BigDecimal> exchangeReturnAmountMap = exchangeDetailList.stream().collect(Collectors.toMap(
+                OrderExchangeDetail::getOrderSkuId,
+                OrderExchangeDetail::getReturnAmount,
+                BigDecimal::add));
 
         // 获取订单
         List<OrderInfo> orderList = orderService.list(q -> q.in(BaseIdPo::getId, orderIdList));
@@ -819,14 +819,7 @@ public class StatementOfAccountServiceImpl extends ServiceImpl<StatementOfAccoun
 
         List<OrderSkuBom> orderSkuBomList = orderSkuBomService.list(q -> q.in(OrderSkuBom::getOrderSkuId, exchangeDetailMap.keySet()));
         // 筛选出可二次利用的包材
-        List<OrderSkuBom> tempOrderSkuBomList = this.getReusableOrderSkuBomList(orderSkuBomList);
-        Map<Long, BigDecimal> packagingMaterialCostMap = tempOrderSkuBomList.stream()
-                .peek(item -> item.setUnitPrice(item.getUnitPrice().negate()))
-                .collect(Collectors.toMap(
-                        OrderSkuBom::getOrderSkuId,
-                        v -> v.getUnitPrice().multiply(v.getQuantity()),
-                        BigDecimal::add
-                ));
+        List<OrderSkuBom> tempOrderSkuBomList = this.getReusableOrderSkuBomList(orderSkuBomList, exchangeDetailList);
 
         // 将订单sku数量更新为退货数量,退货只退裸垫单价和可二次利用的包材费
         for (OrderSku orderSku : orderSkuList) {
@@ -838,7 +831,10 @@ public class StatementOfAccountServiceImpl extends ServiceImpl<StatementOfAccoun
             orderSku.setUnitPrice(orderSku.getUnitPrice().negate());
             orderSku.setDeliveryMaterialsFee(BigDecimal.ZERO);
             orderSku.setManagementFee(BigDecimal.ZERO);
-            orderSku.setPackagingMaterialCost(packagingMaterialCostMap.getOrDefault(orderSku.getId(), BigDecimal.ZERO));
+            orderSku.setPackagingMaterialCost(exchangeReturnAmountMap.get(orderSku.getId())
+                    .divide(orderSku.getQuantity(), 4, RoundingMode.HALF_UP)
+                    .add(orderSku.getUnitPrice())
+                    .negate());
         }
 
         List<DocumentByOrderVo> result = orderList.stream().map(item -> {
@@ -993,23 +989,22 @@ public class StatementOfAccountServiceImpl extends ServiceImpl<StatementOfAccoun
         // 按品名升序排序
         result.sort(comparing(DocumentByBomVo::getBomSpecName));
 
-        Map<Long, BigDecimal> orderSkuMap = orderSkuList.stream().collect(Collectors.toMap(BaseIdPo::getId, OrderSku::getQuantity));
-
         // 包材bom
         List<OrderSkuBom> orderSkuBomList = orderSkuBomService.list(q -> q.in(OrderSkuBom::getOrderSkuId, exchangeDetailMap.keySet()));
         // 筛选出可二次利用的包材
-        List<OrderSkuBom> tempOrderSkuBomList = this.getReusableOrderSkuBomList(orderSkuBomList);
+        List<OrderSkuBom> tempOrderSkuBomList = this.getReusableOrderSkuBomList(orderSkuBomList, exchangeDetailList);
 
         List<DocumentByBomVo> bomVoList = tempOrderSkuBomList.stream()
                 .map(item ->
                         DocumentByBomVo.builder()
                                 .bomSpecId(item.getBomSpecId())
-                                .quantity(item.getQuantity().multiply(orderSkuMap.get(item.getOrderSkuId())))
+                                .quantity(item.getQuantity())
                                 .unitPrice(item.getUnitPrice().negate())
-                                .subtotal(item.getUnitPrice().multiply(item.getQuantity().multiply(orderSkuMap.get(item.getOrderSkuId()))).negate())
-                                .total(item.getUnitPrice().multiply(item.getQuantity().multiply(orderSkuMap.get(item.getOrderSkuId()))).negate())
+                                .subtotal(item.getUnitPrice().multiply(item.getQuantity().negate()))
+                                .total(item.getUnitPrice().multiply(item.getQuantity().negate()))
                                 .build()
-                ).collect(Collectors.toList());
+                )
+                .collect(Collectors.toList());
 
         // 赋值包材bom品名品号
         bomSpecService.attributeAssign(bomVoList, DocumentByBomVo::getBomSpecId, (item, bomSpec) -> {
@@ -1061,18 +1056,16 @@ public class StatementOfAccountServiceImpl extends ServiceImpl<StatementOfAccoun
                 OrderExchangeDetail::getOrderSkuId,
                 OrderExchangeDetail::getQuantity,
                 BigDecimal::add));
+        Map<Long, BigDecimal> exchangeReturnAmountMap = exchangeDetailList.stream().collect(Collectors.toMap(
+                OrderExchangeDetail::getOrderSkuId,
+                OrderExchangeDetail::getReturnAmount,
+                BigDecimal::add));
         if (exchangeDetailList.isEmpty()) {
             return Collections.emptyList();
         }
 
         // 获取订单sku
         List<OrderSku> orderSkuList = orderSkuService.list(q -> q.in(BaseIdPo::getId, exchangeDetailMap.keySet()));
-        List<Long> orderSkuIds = orderSkuList.stream().map(BaseIdPo::getId).collect(Collectors.toList());
-        // 获取可二次利用的包材金额
-        List<OrderSkuBom> orderSkuBomList = orderSkuBomService.list(q -> q.in(OrderSkuBom::getOrderSkuId, orderSkuIds));
-        List<OrderSkuBom> tempOrderSkuBomList = this.getReusableOrderSkuBomList(orderSkuBomList);
-        Map<Long, BigDecimal> packagingMaterialCostMap = tempOrderSkuBomList.stream()
-                .collect(Collectors.toMap(OrderSkuBom::getOrderSkuId, v -> v.getUnitPrice().multiply(v.getQuantity()), BigDecimal::add));
 
         // 生成结果集
         List<DocumentBySkuVo> documentBySkuVoList = orderSkuList.stream()
@@ -1080,17 +1073,14 @@ public class StatementOfAccountServiceImpl extends ServiceImpl<StatementOfAccoun
                         .skuSpecId(item.getSkuSpecId())
                         .orderId(item.getOrderId())
                         .quantity(exchangeDetailMap.get(item.getId()))
-                        .unitPrice(item.getUnitPrice()
-                                .add(packagingMaterialCostMap.getOrDefault(item.getId(), BigDecimal.ZERO))
+                        .unitPrice(exchangeReturnAmountMap.get(item.getId())
+                                .divide(exchangeDetailMap.get(item.getId()), 2, RoundingMode.HALF_UP)
                                 .negate()
                         )
                         .checkFee(BigDecimal.valueOf(2).multiply(exchangeDetailMap.get(item.getId())))
+                        .subtotal(exchangeReturnAmountMap.get(item.getId()).negate()
+                                .add(BigDecimal.valueOf(2).multiply(exchangeDetailMap.get(item.getId()))))
                         .build())
-                .peek(item ->
-                        item.setSubtotal(item.getQuantity()
-                                .multiply(item.getUnitPrice())
-                                .add(item.getCheckFee())
-                                .setScale(2, RoundingMode.HALF_UP)))
                 .peek(item -> item.setTotal(item.getSubtotal()))
                 .collect(Collectors.toList());
 
@@ -1108,6 +1098,7 @@ public class StatementOfAccountServiceImpl extends ServiceImpl<StatementOfAccoun
                         Function.identity(),
                         (v1, v2) -> {
                             v1.setQuantity(v1.getQuantity().add(v2.getQuantity()));
+                            v1.setCheckFee(v1.getCheckFee().add(v2.getCheckFee()));
                             v1.setSubtotal(v1.getSubtotal().add(v2.getSubtotal()));
                             v1.setTotal(v1.getTotal().add(v2.getTotal()));
                             return v1;
@@ -1122,7 +1113,14 @@ public class StatementOfAccountServiceImpl extends ServiceImpl<StatementOfAccoun
      * @param orderSkuBomList
      * @return
      */
-    private List<OrderSkuBom> getReusableOrderSkuBomList(List<OrderSkuBom> orderSkuBomList) {
+    private List<OrderSkuBom> getReusableOrderSkuBomList(List<OrderSkuBom> orderSkuBomList, List<OrderExchangeDetail> exchangeDetailList) {
+        Map<Long, OrderExchangeDetail> exchangeDetailMap = exchangeDetailList.stream()
+                .collect(Collectors.toMap(
+                        OrderExchangeDetail::getOrderSkuId,
+                        Function.identity(),
+                        (v1, v2) -> v2)
+                );
+
         List<Long> bomSpecIdList = orderSkuBomList.stream()
                 .map(OrderSkuBom::getBomSpecId)
                 .distinct()
@@ -1136,7 +1134,15 @@ public class StatementOfAccountServiceImpl extends ServiceImpl<StatementOfAccoun
                         return false;
                     }
                     return true;
-                }).collect(Collectors.toList());
+                })
+                .peek(item -> {
+                    OrderExchangeDetail orderExchangeDetail = exchangeDetailMap.get(item.getOrderSkuId());
+                    item.setQuantity(item.getQuantity()
+                        .multiply(orderExchangeDetail.getQuantity())
+                        .subtract(orderExchangeDetail.getMeshBagDamageQuantity()));
+                })
+                .filter(item -> item.getQuantity().compareTo(BigDecimal.ZERO) > 0)
+                .collect(Collectors.toList());
     }
 
 }