Ver código fonte

售后质检新增网包损坏统计

fgd 1 ano atrás
pai
commit
47443ec84e

+ 4 - 0
sd-business/src/main/java/com/sd/business/entity/order/po/OrderExchangeDetail.java

@@ -60,5 +60,9 @@ public class OrderExchangeDetail extends BasePo {
      */
     private BigDecimal checkPassesQuantity;
 
+    /**
+     * 网包损坏数量
+     */
+    private BigDecimal meshBagDamageQuantity;
 
 }

+ 103 - 11
sd-business/src/main/java/com/sd/business/service/order/impl/OrderExchangeServiceImpl.java

@@ -30,6 +30,7 @@ import com.sd.business.entity.order.dto.OrderExchangeSelectDto;
 import com.sd.business.entity.order.po.*;
 import com.sd.business.entity.order.vo.OrderExchangeDetailVo;
 import com.sd.business.entity.order.vo.OrderExchangeVo;
+import com.sd.business.entity.order.vo.OrderSkuBomVo;
 import com.sd.business.entity.statement.po.StatementOfAccount;
 import com.sd.business.entity.warehouse.constant.WarehouseConstant;
 import com.sd.business.mapper.order.OrderExchangeMapper;
@@ -337,7 +338,46 @@ public class OrderExchangeServiceImpl extends ServiceImpl<OrderExchangeMapper, O
         List<InOutStorageBom> tempInOutStorageBomList = new ArrayList<>();
         List<Long> orderSkuIds = detailList.stream().map(OrderExchangeDetail::getOrderSkuId).collect(Collectors.toList());
         Map<Long, OrderSku> orderSkuMap = orderSkuService.mapKEntity(BaseIdPo::getId, q -> q.in(BaseIdPo::getId, orderSkuIds));
+        // 包材
+        List<OrderSkuBom> orderSkuBomList = orderSkuBomService.list(q -> q.in(OrderSkuBom::getOrderSkuId, orderSkuIds));
+        Map<Long, List<OrderSkuBom>> orderSkuBomMap = orderSkuBomList.stream().collect(Collectors.groupingBy(OrderSkuBom::getOrderSkuId));
+        // 筛选出可二次利用的包材
+        List<Long> bomSpecIdList = orderSkuBomList.stream()
+                .map(OrderSkuBom::getBomSpecId)
+                .distinct()
+                .collect(Collectors.toList());
+        Map<Long, BomSpecBo> bomSpecBoMap = skuSpecService.getBomSpecBoByIdList(bomSpecIdList);
+        // 需要退料入库的包材数据
+        Map<Long, BigDecimal> exchangeQuantity = detailList.stream().collect(Collectors.toMap(OrderExchangeDetail::getOrderSkuId, OrderExchangeDetail::getQuantity, BigDecimal::add));
+        Map<Long, Map<Long, OrderSkuBomVo>> reusableOrderSkuBomMap = orderSkuBomList.stream()
+                .map(item -> BeanUtil.toBean(item, OrderSkuBomVo.class))
+                .filter(item -> {
+                    BomSpecBo bomSpecBo = bomSpecBoMap.get(item.getBomSpecId());
+                    if (bomSpecBo != null && Objects.equals(bomSpecBo.getClassifyId(), BomClassifyConstant.MESH_BAG)) {
+                        item.setQuantity(item.getQuantity().multiply(exchangeQuantity.getOrDefault(item.getOrderSkuId(), BigDecimal.ZERO)));
+                        item.setBomClassifyId(BomClassifyConstant.MESH_BAG);
+                        return true;
+                    }
+                    return false;
+                })
+                .collect(Collectors.groupingBy(
+                        OrderSkuBomVo::getOrderSkuId,
+                        Collectors.toMap(OrderSkuBomVo::getBomClassifyId, Function.identity(), (v1, v2) -> v2)
+                ));
+        // sku对应网包损坏数量
+        Map<Long, BigDecimal> meshBagDamageQuantityMap = new HashMap<>();
         for (OrderExchangeDetail detail : detailList) {
+            Map<Long, OrderSkuBomVo> exchangeOrderSkuBomMap = reusableOrderSkuBomMap.getOrDefault(detail.getOrderSkuId(), Collections.emptyMap());
+            OrderSkuBomVo orderSkuBomVo = exchangeOrderSkuBomMap.get(BomClassifyConstant.MESH_BAG);
+            if (orderSkuBomVo != null) {
+                if (orderSkuBomVo.getQuantity().compareTo(detail.getMeshBagDamageQuantity()) < 0) {
+                    throw new ServiceException("网包损坏数量大于订单网包数量!");
+                }
+                BigDecimal price = orderSkuBomVo.getUnitPrice().multiply(detail.getMeshBagDamageQuantity());
+                // 退货金额减去损坏的网包金额
+                detail.setReturnAmount(detail.getReturnAmount().subtract(price));
+            }
+            meshBagDamageQuantityMap.put(detail.getOrderSkuId(), detail.getMeshBagDamageQuantity());
             int compareTo = detail.getQuantity().compareTo(detail.getCheckPassesQuantity());
             if (compareTo == 0) {
                 // 质检数量和退货数量一致时,全部入库成品仓
@@ -368,20 +408,38 @@ public class OrderExchangeServiceImpl extends ServiceImpl<OrderExchangeMapper, O
             // 成品质检通过后出库包材,重新包装
             Map<Long, OrderSku> finishedOrderSkuMap = tempOrderSkuList.stream().collect(Collectors.toMap(BaseIdPo::getId, Function.identity()));
             List<Long> orderSkuId = tempOrderSkuList.stream().map(BaseIdPo::getId).collect(Collectors.toList());
-            List<OrderSkuBom> orderSkuBomList = orderSkuBomService.list(q -> q.in(OrderSkuBom::getOrderSkuId, orderSkuId));
-            // 筛选掉可二次利用的包材
-            List<Long> bomSpecIdList = orderSkuBomList.stream()
-                    .map(OrderSkuBom::getBomSpecId)
-                    .distinct()
-                    .collect(Collectors.toList());
-            Map<Long, BomSpecBo> bomSpecBoMap = skuSpecService.getBomSpecBoByIdList(bomSpecIdList);
-            List<OrderSkuBom> tempOrderSkuBomList = orderSkuBomList.stream()
+            List<OrderSkuBom> tempOrderSkuBomList = orderSkuId.stream()
+                    .map(item -> orderSkuBomMap.getOrDefault(item, Collections.emptyList()))
+                    .flatMap(Collection::stream)
                     .filter(item -> {
+                        item.setQuantity(item.getQuantity().multiply(finishedOrderSkuMap.get(item.getOrderSkuId()).getQuantity()));
                         BomSpecBo bomSpecBo = bomSpecBoMap.get(item.getBomSpecId());
-                        if (bomSpecBo == null
-                                || Objects.equals(bomSpecBo.getClassifyId(), BomClassifyConstant.MESH_BAG)) {
+                        if (bomSpecBo == null) {
                             return false;
                         }
+                        if (Objects.equals(bomSpecBo.getClassifyId(), BomClassifyConstant.MESH_BAG)) {
+                            BigDecimal meshBagDamageQuantity = meshBagDamageQuantityMap.getOrDefault(item.getOrderSkuId(), BigDecimal.ZERO);
+                            // 没有损坏网包,不出库
+                            if (meshBagDamageQuantity.compareTo(BigDecimal.ZERO) == 0) {
+                                return false;
+                            }
+
+                            // 当前需入库的包材数量
+                            Map<Long, OrderSkuBomVo> map = reusableOrderSkuBomMap.getOrDefault(item.getOrderSkuId(), Collections.emptyMap());
+                            OrderSkuBomVo bom = map.get(bomSpecBo.getClassifyId());
+
+                            // 减去损坏数量,得出实际可入库数量
+                            BigDecimal realityQuantity = bom.getQuantity().subtract(meshBagDamageQuantity);
+
+                            // 如果实际可入库数量比成品入库所需的数量大,则不需要出库
+                            if (realityQuantity.compareTo(item.getQuantity()) >= 0) {
+                                bom.setQuantity(realityQuantity.subtract(item.getQuantity()));
+                                return false;
+                            }
+                            // 保存成品入库需要出库的数量,并更新可入库包材数量
+                            bom.setQuantity(BigDecimal.ZERO);
+                            item.setQuantity(item.getQuantity().subtract(realityQuantity));
+                        }
                         return true;
                     })
                     .collect(Collectors.toList());
@@ -389,7 +447,7 @@ public class OrderExchangeServiceImpl extends ServiceImpl<OrderExchangeMapper, O
                 List<InOutStorageBom> outStorageBomList = tempOrderSkuBomList.stream().map(item -> {
                     InOutStorageBom inOutStorageBom = new InOutStorageBom();
                     inOutStorageBom.setBomSpecId(item.getBomSpecId());
-                    inOutStorageBom.setQuantity(item.getQuantity().multiply(finishedOrderSkuMap.get(item.getOrderSkuId()).getQuantity()));
+                    inOutStorageBom.setQuantity(item.getQuantity());
                     return inOutStorageBom;
                 }).collect(Collectors.toList());
                 InOutStorageDto inOutStorageDto = new InOutStorageDto();
@@ -426,6 +484,40 @@ public class OrderExchangeServiceImpl extends ServiceImpl<OrderExchangeMapper, O
             inOutStorageDto.setInOutStorageBomList(inOutStorageBomList);
             inOutStorageService.add(inOutStorageDto);
         }
+
+        // 入库可二次利用的包材
+        List<InOutStorageBom> tempInStorageBomList = reusableOrderSkuBomMap.values().stream()
+                .map(Map::values)
+                .flatMap(Collection::stream)
+                .filter(item -> item.getQuantity().compareTo(BigDecimal.ZERO) > 0)
+                .map(item -> {
+                    InOutStorageBom inOutStorageBom = new InOutStorageBom();
+                    inOutStorageBom.setBomSpecId(item.getBomSpecId());
+                    inOutStorageBom.setQuantity(item.getQuantity());
+                    return inOutStorageBom;
+                }).collect(Collectors.toList());
+        if (!tempInStorageBomList.isEmpty()) {
+            // 合并相同bom规格出库数量
+            List<InOutStorageBom> inOutStorageBomList = new ArrayList<>(tempInStorageBomList.stream()
+                    .collect(Collectors.toMap(
+                            InOutStorageBom::getBomSpecId,
+                            Function.identity(),
+                            (v1, v2) -> {
+                                v1.setQuantity(v1.getQuantity().add(v2.getQuantity()));
+                                return v1;
+                            })).values());
+
+            InOutStorageDto inOutStorageDto = new InOutStorageDto();
+            inOutStorageDto.setType(InOutTypeEnum.IN.getKey());
+            inOutStorageDto.setDetailType(InDetailTypeEnum.RETURN_GOODS.getKey());
+            inOutStorageDto.setWarehouseId(WarehouseConstant.PACKAGING_MATERIAL);
+            inOutStorageDto.setDepartmentId(DepartmentConstant.SD_SPORTS);
+            inOutStorageDto.setApplicant(SecurityUtils.getLoginUser().getUser().getNickName());
+            inOutStorageDto.setRemark("订单:" + orderInfo.getCode() + "订单售后退料入库");
+            inOutStorageDto.setInOutStorageBomList(inOutStorageBomList);
+            inOutStorageService.add(inOutStorageDto);
+        }
+
         // 获取对账单
         StatementOfAccount statementOfAccount = this.getStatementOfAccount(orderInfo.getDepartmentId());
         orderExchange.setStatementOfAccountId(statementOfAccount.getId());

+ 1 - 0
sd-wln/src/main/java/com/sd/wln/service/impl/WLnSalesReturnStockInServiceImpl.java

@@ -194,6 +194,7 @@ public class WLnSalesReturnStockInServiceImpl implements WlnSalesReturnStockInSe
                 orderExchangeDetail.setExchangeStatus(StatusConstant.NO);
                 orderExchangeDetail.setOrderSkuId(orderSku.getId());
                 orderExchangeDetail.setCheckPassesQuantity(BigDecimal.ZERO);
+                orderExchangeDetail.setMeshBagDamageQuantity(BigDecimal.ZERO);
                 orderExchangeDetail.setReturnAmount((orderSku.getUnitPrice()
                         .add(packagingMaterialCost)).multiply(orderExchangeDetail.getQuantity()));
                 orderExchangeDetailList.add(orderExchangeDetail);