24282 1 рік тому
батько
коміт
3a3b06b356

+ 10 - 1
sd-business/src/main/java/com/sd/business/controller/order/OrderInfoController.java

@@ -65,7 +65,16 @@ public class OrderInfoController {
      */
     @PostMapping("/delete")
     public void delete(@RequestBody BaseSelectDto dto) {
-        orderInfoService.delete(dto.getId());
+        orderInfoService.deleteValidated(dto.getId());
     }
 
+    /**
+     * 订单确认
+     */
+    @PostMapping("/confirmation")
+    public void confirmation(@RequestBody OrderInfoDto dto) {
+        orderInfoService.confirmation(dto);
+    }
+
+
 }

+ 10 - 0
sd-business/src/main/java/com/sd/business/service/order/OrderInfoService.java

@@ -48,4 +48,14 @@ public interface OrderInfoService extends BaseService<OrderInfo> {
      */
     void deleteAndStore(Long id);
 
+    /**
+     * 验证订单后删除
+     */
+    void deleteValidated(Long id);
+
+    /**
+     * 订单确认
+     */
+    void confirmation(OrderInfoDto dto);
+
 }

+ 190 - 10
sd-business/src/main/java/com/sd/business/service/order/impl/OrderInfoServiceImpl.java

@@ -56,6 +56,9 @@ import com.sd.business.service.production.ProductionWorkOrderService;
 import com.sd.framework.util.Assert;
 import com.sd.framework.util.sql.Sql;
 import com.sd.framework.util.sql.Where;
+import com.sd.mq.config.ArtworkConfig;
+import com.sd.mq.entity.TempArtworkMessage;
+import com.sd.mq.util.RabbitMqUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -122,6 +125,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
         Where<OrderInfoVo> sql = Sql.create(OrderInfoVo.class)
                 .selectAll(OrderInfo.class)
                 .selectAs(Department::getName, OrderInfoVo::getDepartmentName)
+
                 .from(OrderInfo.class)
                 .leftJoin(Department.class, OrderInfo::getDepartmentId)
 
@@ -238,6 +242,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
         return vo;
     }
 
+    @DSTransactional
     @Override
     public void add(OrderInfoDto dto) {
         List<OrderSkuDto> orderSkuList = dto.getOrderSkuList();
@@ -286,7 +291,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
                     .add(dto.getPackagingMaterialCost())
                     .add(dto.getManagementFee()));
         }
-        this.save(dto);
+        save(dto);
 
         // 新增订单产品包材配件
         List<OrderSku> tempOrderSkuList = orderSkuList.stream()
@@ -325,10 +330,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
             // 辅料成本暂时没有默认为零
             orderSkuProductionCost.setAuxiliaryMaterialCost(BigDecimal.ZERO);
             // 产品包材成本
-            List<OrderSkuBom> bomList = orderSkuBomMap.get(item.getId());
-            if (bomList == null) {
-                bomList = new ArrayList<>();
-            }
+            List<OrderSkuBom> bomList = orderSkuBomMap.getOrDefault(item.getId(), new ArrayList<>());
             BigDecimal productPackagingMaterialCost = bomList.stream()
                     .map(orderSkuBom -> orderSkuBom.getQuantity()
                             .multiply(orderSkuBom.getUnitPrice())
@@ -355,7 +357,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
             dto.setStatus(OrderStatusEnum.IN_PRODUCTION.getKey());
             // 生成工单
             productionWorkOrderService.addByOrderId(dto.getId());
-            this.update(q -> q.set(OrderInfo::getStatus, OrderStatusEnum.IN_PRODUCTION.getKey()).eq(BaseIdPo::getId, dto.getId()));
+            update(q -> q.set(OrderInfo::getStatus, OrderStatusEnum.IN_PRODUCTION.getKey()).eq(BaseIdPo::getId, dto.getId()));
         }
 
         // 保存订单包装信息
@@ -377,6 +379,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
         ObsFileUtil.saveFile(dto.getFileList(), dto.getId());
     }
 
+    @DSTransactional
     @Override
     public void edit(OrderInfoDto dto) {
         // 订单为委外订单时,订单分类为委外订单
@@ -422,10 +425,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
             // 辅料成本暂时没有默认为零
             orderSkuProductionCost.setAuxiliaryMaterialCost(BigDecimal.ZERO);
             // 产品包材成本
-            List<OrderSkuBom> bomList = orderSkuBomMap.get(item.getId());
-            if (bomList == null) {
-                bomList = new ArrayList<>();
-            }
+            List<OrderSkuBom> bomList = orderSkuBomMap.getOrDefault(item.getId(), new ArrayList<>());
             BigDecimal productPackagingMaterialCost = bomList.stream()
                     .map(orderSkuBom -> orderSkuBom.getQuantity()
                             .multiply(orderSkuBom.getUnitPrice())
@@ -474,6 +474,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
         ObsFileUtil.editFile(dto.getFileList(), dto.getId());
     }
 
+    @DSTransactional
     @Override
     public void delete(Long id) {
         removeById(id);
@@ -551,6 +552,172 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
         delete(id);
     }
 
+    @DSTransactional
+    @Override
+    public void deleteValidated(Long id) {
+        OrderInfo orderInfo = getById(id);
+
+        if (orderInfo == null) {
+            throw new ServiceException("未找到订单");
+        }
+
+        if (Objects.equals(orderInfo.getDelFlag(), StatusConstant.NOT_DELETED)
+                && orderInfo.getStatus() > OrderStatusEnum.STOCK_PREPARATION.getKey()) {
+            throw new ServiceException("订单正在生产中,无法直接删除,需要走审批流程");
+        }
+
+        unLockStorage(orderInfo);
+
+        // 删除订单回滚成品仓库存
+        inventoryFinishedService.removeOrder(id);
+
+        // 删除订单以及订单关联数据
+        delete(id);
+    }
+
+    @DSTransactional
+    @Override
+    public void confirmation(OrderInfoDto dto) {
+        OrderInfo order = getById(dto.getId());
+
+        if (ObjectUtil.notEqual(order.getStatus(), OrderStatusEnum.DRAFT.getKey())
+                && ObjectUtil.notEqual(order.getStatus(), OrderStatusEnum.UNDER_REVIEW.getKey())) {
+            throw new ServiceException("订单不在草稿或待确认状态");
+        }
+
+        // 自主订单需要锁定库存
+        List<OrderSkuDto> orderSkuList = dto.getOrderSkuList();
+        if (Objects.equals(dto.getType(), 1)) {
+            // 先判断成品是否能锁定
+            if (inventoryFinishedService.lockNoSourceStorage(orderSkuList)) {
+                dto.setStockType(StatusConstant.YES);
+            } else {
+                lockStorage(orderSkuList);
+                dto.setStockType(StatusConstant.NO);
+            }
+            dto.setLockStorage(StatusConstant.YES);
+        }
+
+        // 更新订单
+        dto.setStatus(OrderStatusEnum.STOCK_PREPARATION.getKey());
+        // 订单为委外订单时,订单分类为委外订单,订单费用修改
+        if (Objects.equals(dto.getType(), 2)) {
+            dto.setClassify(OrderClassifyEnum.OUTSOURCE_ORDER.getKey());
+            if (!Objects.equals(dto.getSource(), 1)) {
+                dto.setLssueFee(BigDecimal.ZERO);
+            }
+            dto.setProductTotalAmount(BigDecimal.ZERO);
+            dto.setDeliveryMaterialsFee(BigDecimal.ZERO);
+            dto.setManagementFee(BigDecimal.ZERO);
+            dto.setPackingLabor(dto.getPackingLabor().multiply(new BigDecimal(2)));
+            dto.setTotalAmount(dto.getProductTotalAmount()
+                    .add(dto.getCustomProcessingFee())
+                    .add(dto.getLssueFee())
+                    .add(dto.getDeliveryMaterialsFee())
+                    .add(dto.getPackingLabor())
+                    .add(dto.getPackagingMaterialCost())
+                    .add(dto.getManagementFee()));
+            // 清空订单快递包材
+            dto.setOrderPackageBomList(null);
+        } else if (Objects.equals(dto.getType(), 1)) {
+            // 拥有采购角色的账号创建的自主订单为采购订单
+            Long userId = dto.getCreateUser();
+            Set<String> roleKeys = roleService.selectRolePermissionByUserId(userId);
+            if (!Collections.disjoint(roleKeys, Arrays.asList("sypurchasing", "purchasingOfficer", "bzpurchasing"))) {
+                dto.setClassify(OrderClassifyEnum.PURCHASE_ORDER.getKey());
+            }
+        }
+        updateById(dto);
+
+        // 更新订单产品
+        List<OrderSku> tempOrderSkuList = orderSkuList.stream()
+                .peek(item -> item.setOrderId(dto.getId()))
+                .peek(item -> item.setStockPreparationStatus(StatusConstant.NO))
+                .peek(item -> {
+                    // 委外订单修改金额
+                    if (ObjectUtil.equals(dto.getType(), 2)) {
+                        item.setUnitPrice(BigDecimal.ZERO);
+                        item.setLssueFee(BigDecimal.ZERO);
+                        item.setDeliveryMaterialsFee(BigDecimal.ZERO);
+                        item.setManagementFee(BigDecimal.ZERO);
+                        item.setPackingLabor(item.getPackingLabor().multiply(new BigDecimal(2)));
+                    }
+                })
+                .map(item -> (OrderSku) item)
+                .collect(Collectors.toList());
+        orderSkuService.editLinked(tempOrderSkuList, OrderSku::getOrderId, dto.getId());
+
+        // 更新包材
+        List<OrderSkuBom> orderSkuBomList = orderSkuList.stream()
+                .flatMap(orderSku -> orderSku.getOrderSkuBomList().stream()
+                        .peek(orderSkuBom -> orderSkuBom.setOrderId(dto.getId()))
+                        .peek(orderSkuBom -> orderSkuBom.setOrderSkuId(orderSku.getId())))
+                .collect(Collectors.toList());
+        orderSkuBomService.editLinked(orderSkuBomList, OrderSkuBom::getOrderId, dto.getId());
+
+        // 新增订单产品生产成本
+        Map<Long, List<OrderSkuBom>> orderSkuBomMap = orderSkuBomList.stream().collect(Collectors.groupingBy(OrderSkuBom::getOrderSkuId));
+        List<OrderSkuProductionCost> orderSkuProductionCostList = tempOrderSkuList.stream().map(item -> {
+            OrderSkuProductionCost orderSkuProductionCost = new OrderSkuProductionCost();
+            orderSkuProductionCost.setOrderId(item.getOrderId());
+            orderSkuProductionCost.setOrderSkuId(item.getId());
+            // 材料成本
+            orderSkuProductionCost.setMaterialCost(item.getUnitPrice().multiply(item.getQuantity()));
+            // 辅料成本暂时没有默认为零
+            orderSkuProductionCost.setAuxiliaryMaterialCost(BigDecimal.ZERO);
+            // 产品包材成本
+            List<OrderSkuBom> bomList = orderSkuBomMap.getOrDefault(item.getId(), new ArrayList<>());
+            BigDecimal productPackagingMaterialCost = bomList.stream()
+                    .map(orderSkuBom -> orderSkuBom.getQuantity()
+                            .multiply(orderSkuBom.getUnitPrice())
+                            .multiply(item.getQuantity()))
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            orderSkuProductionCost.setProductPackagingMaterialCost(productPackagingMaterialCost);
+            // 物流包材成本
+            orderSkuProductionCost.setLogisticsPackagingMaterialCost(item.getDeliveryMaterialsFee()
+                    .multiply(item.getQuantity()));
+            orderSkuProductionCost.setTotalAmount(
+                    orderSkuProductionCost.getMaterialCost()
+                            .add(orderSkuProductionCost.getAuxiliaryMaterialCost())
+                            .add(orderSkuProductionCost.getProductPackagingMaterialCost())
+                            .add(orderSkuProductionCost.getLogisticsPackagingMaterialCost()));
+            return orderSkuProductionCost;
+        }).collect(Collectors.toList());
+        orderSkuProductionCostService.editLinked(orderSkuProductionCostList, OrderSkuProductionCost::getOrderId, dto.getId());
+
+        // 是委外订单并且没有包材时,修改订单状态为生产中,并生成生产任务和工单
+        if (ObjectUtil.equals(dto.getStatus(), OrderStatusEnum.STOCK_PREPARATION.getKey())
+                && ObjectUtil.equals(dto.getType(), 2)
+                && ObjectUtil.isEmpty(orderSkuBomList)) {
+            dto.setStatus(OrderStatusEnum.IN_PRODUCTION.getKey());
+            // 生成工单
+            productionWorkOrderService.addByOrderId(dto.getId());
+            update(q -> q.set(OrderInfo::getStatus, OrderStatusEnum.IN_PRODUCTION.getKey()).eq(BaseIdPo::getId, dto.getId()));
+        }
+
+        // 更新订单产品包装信息
+        List<OrderPackageBomDto> tempOrderPackageBomList = dto.getOrderPackageBomList();
+        if (tempOrderPackageBomList == null) {
+            tempOrderPackageBomList = new ArrayList<>();
+        }
+        List<OrderPackageBom> orderPackageBomList = tempOrderPackageBomList.stream()
+                .peek(item -> item.setOrderId(dto.getId()))
+                .map(item -> (OrderPackageBom) item)
+                .collect(Collectors.toList());
+        orderPackageBomService.editLinked(orderPackageBomList, OrderPackageBom::getOrderId, dto.getId());
+
+        // 更新产品不干胶图稿
+        for (OrderSkuDto item : orderSkuList) {
+            ObsFileUtil.editFile(item.getSelfAdhesiveStickerFile(), item.getId());
+        }
+
+        // 更新附件
+        ObsFileUtil.editFile(dto.getFileList(), dto.getId());
+
+        // 发送mq下载临时图稿
+        sendMq(dto);
+    }
+
     /**
      * 解锁库存
      */
@@ -650,4 +817,17 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
 
     }
 
+    private void sendMq(OrderInfoDto dto) {
+        List<OrderSkuDto> orderSkuList = dto.getOrderSkuList();
+        for (OrderSkuDto orderSkuDto : orderSkuList) {
+            if (orderSkuDto.getArtworkLibraryId() == null || orderSkuDto.getArtworkLibraryId() == 0L) {
+                continue;
+            }
+            TempArtworkMessage tempArtworkMessage = new TempArtworkMessage();
+            tempArtworkMessage.setImgUrl(orderSkuDto.getBlueprint());
+            tempArtworkMessage.setFileUrl(orderSkuDto.getProductionDocument());
+            RabbitMqUtil.send(ArtworkConfig.DIRECT_EXCHANGE_NAME, ArtworkConfig.TEMP_ARTWORK_QUEUE_NAME, tempArtworkMessage);
+        }
+    }
+
 }