24282 1 жил өмнө
parent
commit
ab873b1e36

+ 10 - 0
sd-business/src/main/java/com/sd/business/controller/production/ProductionWorkOrderController.java

@@ -11,6 +11,8 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 
 /**
  * <p>
@@ -43,4 +45,12 @@ public class ProductionWorkOrderController {
         productionWorkOrderService.complete(dto);
     }
 
+    /**
+     * 合并工单
+     */
+    @PostMapping("/combined")
+    public void combined(@RequestBody List<Long> idList) {
+        productionWorkOrderService.combined(idList);
+    }
+
 }

+ 7 - 0
sd-business/src/main/java/com/sd/business/service/production/ProductionWorkOrderService.java

@@ -58,4 +58,11 @@ public interface ProductionWorkOrderService extends BaseService<ProductionWorkOr
      */
     void completeOrder(Long orderId);
 
+    /**
+     * 合并工单
+     *
+     * @param idList 工单id列表
+     */
+    void combined(List<Long> idList);
+
 }

+ 110 - 28
sd-business/src/main/java/com/sd/business/service/production/impl/ProductionWorkOrderServiceImpl.java

@@ -24,7 +24,9 @@ import com.sd.business.service.order.OrderService;
 import com.sd.business.service.order.OrderSkuService;
 import com.sd.business.service.production.ProductionWorkOrderService;
 import com.sd.business.service.sku.SkuSpecService;
+import com.sd.business.util.CodeEnum;
 import com.sd.mq.config.WorkOrderConfig;
+import com.sd.mq.entity.CombinedWorkOrderMessage;
 import com.sd.mq.entity.WorkOrderDetail;
 import com.sd.mq.entity.WorkOrderMessage;
 import com.sd.mq.enums.WorkOrderStatusEnum;
@@ -63,27 +65,17 @@ public class ProductionWorkOrderServiceImpl extends ServiceImpl<ProductionWorkOr
     @Autowired
     private InventoryFinishedService inventoryFinishedService;
 
-    @Override
-    public Page<ProductionWorkOrderVo> getPage(ProductionWorkOrderSelectDto dto) {
-        IWrapper<ProductionWorkOrder> wrapper = getWrapper();
-        wrapper.orderByDesc("pwo", ProductionWorkOrder::getId);
-        wrapper.eq("oi", OrderInfo::getStatus, OrderStatusEnum.IN_PRODUCTION.getKey());
-
-        wrapper.like("oi", OrderInfo::getCode, dto.getOrderCode());
-        wrapper.like("oi", OrderInfo::getWlnCode, dto.getOrderWlnCode());
-
-        wrapper.like("pwo", ProductionWorkOrder::getCode, dto.getProductionWorkOrderCode());
-
-        wrapper.like("ss", SkuSpec::getCode, dto.getSkuSpecCode());
-        wrapper.like("ss", SkuSpec::getName, dto.getSkuSpecName());
-
-        wrapper.like("bs", BomSpec::getCode, dto.getBomSpecCode());
-        wrapper.like("bs", BomSpec::getName, dto.getBomSpecName());
-
-        wrapper.ge("oi", OrderInfo::getDeliveryTime, dto.getBeginTime());
-        wrapper.le("oi", OrderInfo::getDeliveryTime, dto.getEndTime());
-
-        return this.baseMapper.getPage(dto.getPage(), wrapper);
+    private static ProductionWorkOrder getProductionWorkOrder(ProductionWorkOrder temp) {
+        String code = CodeEnum.BATH_PRODUCTION_WORK_ORDER_CODE.getCode();
+        ProductionWorkOrder productionWorkOrder = new ProductionWorkOrder();
+        productionWorkOrder.setCode(code);
+        productionWorkOrder.setSkuSpecId(temp.getSkuSpecId());
+        productionWorkOrder.setBomSpecId(temp.getBomSpecId());
+        productionWorkOrder.setPrintType(temp.getPrintType());
+        productionWorkOrder.setMachinedPanel(temp.getMachinedPanel());
+        productionWorkOrder.setStatus(0);
+        productionWorkOrder.setType(2);
+        return productionWorkOrder;
     }
 
     @Override
@@ -215,15 +207,29 @@ public class ProductionWorkOrderServiceImpl extends ServiceImpl<ProductionWorkOr
 
     }
 
-    @Transactional(rollbackFor = Exception.class)
     @Override
-    public void complete(BaseSelectDto dto) {
-        ProductionWorkOrder productionWorkOrder = getById(dto.getId());
-        productionWorkOrder.setCompleteTime(new Date());
-        productionWorkOrder.setStatus(WorkOrderStatusEnum.PRODUCTION_COMPLETION.getKey());
-        updateById(productionWorkOrder);
+    public Page<ProductionWorkOrderVo> getPage(ProductionWorkOrderSelectDto dto) {
+        IWrapper<ProductionWorkOrder> wrapper = getWrapper();
+        wrapper.orderByDesc("pwo", ProductionWorkOrder::getId);
+        wrapper.eq("oi", OrderInfo::getStatus, OrderStatusEnum.IN_PRODUCTION.getKey());
 
-        completeOrder(productionWorkOrder.getOrderId());
+        wrapper.like("oi", OrderInfo::getCode, dto.getOrderCode());
+        wrapper.like("oi", OrderInfo::getWlnCode, dto.getOrderWlnCode());
+
+        wrapper.like("pwo", ProductionWorkOrder::getCode, dto.getProductionWorkOrderCode());
+
+        wrapper.like("ss", SkuSpec::getCode, dto.getSkuSpecCode());
+        wrapper.like("ss", SkuSpec::getName, dto.getSkuSpecName());
+
+        wrapper.like("bs", BomSpec::getCode, dto.getBomSpecCode());
+        wrapper.like("bs", BomSpec::getName, dto.getBomSpecName());
+
+        wrapper.ge("oi", OrderInfo::getDeliveryTime, dto.getBeginTime());
+        wrapper.le("oi", OrderInfo::getDeliveryTime, dto.getEndTime());
+
+        wrapper.isNull("pwo.master_id");
+
+        return this.baseMapper.getPage(dto.getPage(), wrapper);
     }
 
     /**
@@ -261,4 +267,80 @@ public class ProductionWorkOrderServiceImpl extends ServiceImpl<ProductionWorkOr
         orderService.updateById(orderInfo);
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void complete(BaseSelectDto dto) {
+
+        ProductionWorkOrder productionWorkOrder = getById(dto.getId());
+        productionWorkOrder.setCompleteTime(new Date());
+        productionWorkOrder.setStatus(WorkOrderStatusEnum.PRODUCTION_COMPLETION.getKey());
+        updateById(productionWorkOrder);
+
+        // 单片
+        if (productionWorkOrder.getType() == 1) {
+            completeOrder(productionWorkOrder.getOrderId());
+        }
+
+        // 批量
+        else {
+            List<ProductionWorkOrder> list = list(q -> q.eq(ProductionWorkOrder::getMasterId, dto.getId()));
+            for (ProductionWorkOrder item : list) {
+                item.setCompleteTime(new Date());
+                item.setStatus(WorkOrderStatusEnum.PRODUCTION_COMPLETION.getKey());
+            }
+            updateBatchById(list);
+
+            List<Long> orderIdList = list.stream().map(ProductionWorkOrder::getOrderId).distinct().collect(Collectors.toList());
+            for (Long orderId : orderIdList) {
+                completeOrder(orderId);
+            }
+        }
+
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public synchronized void combined(List<Long> idList) {
+        if (idList.isEmpty()) {
+            return;
+        }
+
+        List<ProductionWorkOrder> productionWorkOrderList = listByIds(idList);
+
+        if (idList.size() != productionWorkOrderList.size()) {
+            throw new ServiceException("存在未知工单");
+        }
+
+        ProductionWorkOrder temp = productionWorkOrderList.get(0);
+        for (ProductionWorkOrder productionWorkOrder : productionWorkOrderList) {
+            if (Objects.equals(temp.getType(), 2)) {
+                throw new ServiceException("批量工单无法合并");
+            }
+            if (productionWorkOrder.getMasterId() != null) {
+                throw new ServiceException("存在已合并的工单");
+            }
+            if (!Objects.equals(temp.getSkuSpecId(), productionWorkOrder.getSkuSpecId())) {
+                throw new ServiceException("存在不同sku");
+            }
+            if (!Objects.equals(temp.getBomSpecId(), productionWorkOrder.getBomSpecId())) {
+                throw new ServiceException("存在不同bom");
+            }
+            if (!Objects.equals(productionWorkOrder.getStatus(), WorkOrderStatusEnum.TO_BE_PRODUCED.getKey())) {
+                throw new ServiceException("存在工单不在待投产状态");
+            }
+        }
+
+        // 创建批量工单
+        ProductionWorkOrder productionWorkOrder = getProductionWorkOrder(temp);
+        save(productionWorkOrder);
+
+        // 单片工单关联批量工单
+        productionWorkOrderList.forEach(item -> item.setMasterId(productionWorkOrder.getId()));
+
+        // 发送mq
+        RabbitMqUtil.send(WorkOrderConfig.DIRECT_EXCHANGE_NAME, WorkOrderConfig.COMBINED_WORK_ORDER_QUEUE_NAME,
+                new CombinedWorkOrderMessage(productionWorkOrder.getId(), idList));
+
+    }
+
 }

+ 5 - 1
sd-business/src/main/java/com/sd/business/util/CodeEnum.java

@@ -14,6 +14,7 @@ import com.sd.business.service.inventory.InventoryFinishedOrderDetailService;
 import com.sd.business.service.lend.LendService;
 import com.sd.business.service.order.OrderExchangeService;
 import com.sd.business.service.order.OrderService;
+import com.sd.business.service.production.ProductionWorkOrderService;
 import com.sd.business.service.purchase.PurchasePendingStorageService;
 import com.sd.business.service.purchase.PurchaseReturnService;
 import com.sd.business.service.purchase.PurchaseService;
@@ -52,7 +53,10 @@ public enum CodeEnum {
     FINISHED_OUT("PWS", "-yyMMdd-", "code", 6, InventoryFinishedOrderDetailService.class),
     // 采购入库编号
     PURCHASE_STORAGE_CODE("CG", "yyMMdd", "code", 4, PurchasePendingStorageService.class),
-    CHECK_CODE("PD", "-yyMMdd-", "code", 6, CheckService.class);
+    CHECK_CODE("PD", "-yyMMdd-", "code", 6, CheckService.class),
+
+    // 批量工单编号
+    BATH_PRODUCTION_WORK_ORDER_CODE("BPWO", "-yyMMdd-", "code", 6, ProductionWorkOrderService.class);
 
     // 编码前缀
     private final String prefix;

+ 2 - 1
sd-business/src/main/resources/mapper/production/ProductionWorkOrderMapper.xml

@@ -9,6 +9,7 @@
                pwo.status,
                pwo.print_type,
                pwo.complete_time,
+               pwo.type,
                oi.code          orderCode,
                oi.wln_code      orderWlnCode,
                oi.delivery_time deliveryTime,
@@ -17,9 +18,9 @@
                bs.code          bomSpecCode,
                bs.name bomSpecName
         from production_work_order pwo
-                 inner join order_info oi on pwo.order_id = oi.id
                  inner join sku_spec ss on pwo.sku_spec_id = ss.id
                  inner join bom_spec bs on pwo.bom_spec_id = bs.id
+                 left join order_info oi on pwo.order_id = oi.id
             ${ew.customSqlSegment}
     </select>
 

+ 21 - 0
sd-mq/src/main/java/com/sd/mq/config/WorkOrderConfig.java

@@ -14,6 +14,7 @@ public class WorkOrderConfig {
 
     public static final String ADD_WORK_ORDER_QUEUE_NAME = "add.work.order.artwork.queue";
     public static final String EDIT_WORK_ORDER_QUEUE_NAME = "edit.work.order.artwork.queue";
+    public static final String COMBINED_WORK_ORDER_QUEUE_NAME = "combined.work.order.artwork.queue";
     public static final String DIRECT_EXCHANGE_NAME = "work.order.direct.exchange";
 
     /**
@@ -52,6 +53,18 @@ public class WorkOrderConfig {
     }
 
     /**
+     * 创建一个队列
+     */
+    @Bean
+    public Queue combinedWorkOrderQueue() {
+        // durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效
+        // exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable
+        // autoDelete:是否自动删除,有消息者订阅本队列,然后所有消费者都解除订阅此队列,会自动删除。
+        // arguments:队列携带的参数,比如设置队列的死信队列,消息的过期时间等等。
+        return new Queue(COMBINED_WORK_ORDER_QUEUE_NAME, true, false, false);
+    }
+
+    /**
      * 绑定交换机和队列
      */
     @Bean
@@ -67,4 +80,12 @@ public class WorkOrderConfig {
         return BindingBuilder.bind(editWorkOrderQueue()).to(workOrderDirectExchange()).withQueueName();
     }
 
+    /**
+     * 绑定交换机和队列
+     */
+    @Bean
+    public Binding combinedWorkOrderBinding() {
+        return BindingBuilder.bind(combinedWorkOrderQueue()).to(workOrderDirectExchange()).withQueueName();
+    }
+
 }

+ 26 - 0
sd-mq/src/main/java/com/sd/mq/entity/CombinedWorkOrderMessage.java

@@ -0,0 +1,26 @@
+package com.sd.mq.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.util.List;
+
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class CombinedWorkOrderMessage extends BaseMessage {
+
+    /**
+     * 批量工单id
+     */
+    private Long masterId;
+
+    /**
+     * 单片工单id列表
+     */
+    private List<Long> idList;
+
+}

+ 15 - 7
sd-starter/src/test/java/H1_RemoveSkuLinked.java

@@ -25,6 +25,9 @@ import java.util.stream.Collectors;
 public class H1_RemoveSkuLinked {
 
     private static final Long A9_DEPARTMENT_ID = 1689164611148677121L;
+    private static final Long BZ_DEPARTMENT_ID = 1689164627162529793L;
+
+
     @Autowired
     private SkuService skuService;
     @Autowired
@@ -37,15 +40,20 @@ public class H1_RemoveSkuLinked {
     public void test() {
         LogicHolder.setLogicHolder(true);
 
-        // 集团sku
-        List<Sku> list = skuService.list(q -> q.eq(Sku::getType, 1));
-        List<Long> skuIdList = list.stream().map(BaseIdPo::getId).collect(Collectors.toList());
+        // 集团 sku
+        List<Long> skuIdList = skuService.list(q -> q.eq(Sku::getType, 1))
+                .stream().map(BaseIdPo::getId).collect(Collectors.toList());
         skuSpecLinkService.remove(q -> q.in(SkuSpecLink::getSkuId, skuIdList).ne(SkuSpecLink::getDepartmentId, 100L));
 
-        // 非集团sku
-        List<Sku> list2 = skuService.list(q -> q.eq(Sku::getType, 0));
-        List<Long> skuIdList2 = list2.stream().map(BaseIdPo::getId).collect(Collectors.toList());
-        skuSpecLinkService.remove(q -> q.in(SkuSpecLink::getSkuId, skuIdList2).ne(SkuSpecLink::getDepartmentId, A9_DEPARTMENT_ID));
+        // 佰卓 sku
+        List<Long> bzSkuIdList = skuService.list(q -> q.likeRight(Sku::getCode, "FY"))
+                .stream().map(BaseIdPo::getId).collect(Collectors.toList());
+        skuSpecLinkService.remove(q -> q.in(SkuSpecLink::getSkuId, bzSkuIdList).ne(SkuSpecLink::getDepartmentId, BZ_DEPARTMENT_ID));
+
+        // a9 sku
+        List<Long> a9skuIdList = skuService.list(q -> q.likeRight(Sku::getCode, "ST"))
+                .stream().map(BaseIdPo::getId).collect(Collectors.toList());
+        skuSpecLinkService.remove(q -> q.in(SkuSpecLink::getSkuId, a9skuIdList).ne(SkuSpecLink::getDepartmentId, A9_DEPARTMENT_ID));
 
         LogicHolder.setLogicHolder(false);
     }

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

@@ -792,7 +792,7 @@ public class WlnOrderServiceImpl implements WlnOrderService {
             }
 
         } else {
-            startTime = orderInfo.getWlnModifyTimestamp();
+            startTime = orderInfo.getWlnModifyTimestamp() + 1;
             if (endTime - startTime > 1000 * 60 * 60 * 24 * 7) {
                 startTime = endTime - 1000 * 60 * 60 * 24 * 7;
             }