Browse Source

监听工单状态更新

24282 1 year ago
parent
commit
cc61064873

+ 145 - 0
sd-business/src/main/java/com/sd/business/listener/AddWorkOrderListener.java

@@ -0,0 +1,145 @@
+package com.sd.business.listener;
+
+import com.alibaba.fastjson2.JSON;
+import com.rabbitmq.client.Channel;
+import com.sd.business.entity.order.enums.OrderStatusEnum;
+import com.sd.business.entity.order.po.OrderInfo;
+import com.sd.business.entity.production.po.ProductionWorkOrder;
+import com.sd.business.service.inventory.InventoryFinishedService;
+import com.sd.business.service.order.OrderService;
+import com.sd.business.service.production.ProductionWorkOrderService;
+import com.sd.mq.config.WorkOrderConfig;
+import com.sd.mq.entity.EditWorkOrderMessage;
+import com.sd.mq.enums.WorkOrderStatusEnum;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.rabbit.annotation.Exchange;
+import org.springframework.amqp.rabbit.annotation.Queue;
+import org.springframework.amqp.rabbit.annotation.QueueBinding;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.Objects;
+
+/**
+ * 图稿库监听
+ */
+@Slf4j
+@Component
+public class AddWorkOrderListener {
+
+    @Autowired
+    private ProductionWorkOrderService productionWorkOrderService;
+
+    @Autowired
+    private InventoryFinishedService inventoryFinishedService;
+
+    @Autowired
+    private OrderService orderService;
+
+    @RabbitListener(bindings = {
+            @QueueBinding(value = @Queue(WorkOrderConfig.ADD_WORK_ORDER_QUEUE_NAME), exchange = @Exchange(WorkOrderConfig.DIRECT_EXCHANGE_NAME))
+    })
+    public void msgSend(EditWorkOrderMessage workOrderMessage, Channel channel, Message message) throws IOException {
+
+        log.info("接收更新工单:{}", JSON.toJSONString(workOrderMessage));
+
+        long deliveryTag = message.getMessageProperties().getDeliveryTag();
+
+        try {
+            Long workOrderId = workOrderMessage.getWorkOrderId();
+            ProductionWorkOrder productionWorkOrder = productionWorkOrderService.getById(workOrderId);
+            if (productionWorkOrder == null) {
+                channel.basicAck(deliveryTag, true);
+                return;
+            }
+
+            Integer status = workOrderMessage.getStatus();
+            WorkOrderStatusEnum workOrderStatusEnum = WorkOrderStatusEnum.getByKey(status);
+            switch (workOrderStatusEnum) {
+                case SCANNED:
+                    if (Objects.equals(productionWorkOrder.getStatus(), WorkOrderStatusEnum.TO_BE_PRODUCED.getKey())) {
+                        productionWorkOrder.setStatus(status);
+                        productionWorkOrderService.updateById(productionWorkOrder);
+                    }
+                    break;
+
+                case IN_PRODUCTION:
+                    if (Objects.equals(productionWorkOrder.getStatus(), WorkOrderStatusEnum.TO_BE_PRODUCED.getKey())
+                            || Objects.equals(productionWorkOrder.getStatus(), WorkOrderStatusEnum.SCANNED.getKey())) {
+                        productionWorkOrder.setStatus(status);
+                        productionWorkOrderService.updateById(productionWorkOrder);
+                    }
+                    break;
+
+                case PRODUCTION_COMPLETION:
+                    if (Objects.equals(productionWorkOrder.getStatus(), WorkOrderStatusEnum.TO_BE_PRODUCED.getKey())
+                            || Objects.equals(productionWorkOrder.getStatus(), WorkOrderStatusEnum.SCANNED.getKey())
+                            || Objects.equals(productionWorkOrder.getStatus(), WorkOrderStatusEnum.IN_PRODUCTION.getKey())) {
+
+                        productionWorkOrder.setCompleteTime(workOrderMessage.getSendTime());
+                        productionWorkOrder.setStatus(status);
+
+                        productionWorkOrderService.updateById(productionWorkOrder);
+
+                        // 查询订单所有工单是否完成,若完成,修改订单状态为已完成
+                        completeOrder(productionWorkOrder.getOrderId());
+                    }
+                    break;
+
+                case PRODUCTION_ANOMALY:
+                    if (Objects.equals(productionWorkOrder.getStatus(), WorkOrderStatusEnum.TO_BE_PRODUCED.getKey())
+                            || Objects.equals(productionWorkOrder.getStatus(), WorkOrderStatusEnum.SCANNED.getKey())
+                            || Objects.equals(productionWorkOrder.getStatus(), WorkOrderStatusEnum.IN_PRODUCTION.getKey())) {
+                        productionWorkOrder.setStatus(status);
+                        productionWorkOrderService.updateById(productionWorkOrder);
+                    }
+                    break;
+            }
+
+
+            channel.basicAck(deliveryTag, true);
+
+        } catch (Exception e) {
+            log.error("接收更新工单异常", e);
+            channel.basicReject(deliveryTag, true);
+        }
+
+    }
+
+
+    private void completeOrder(Long orderId) {
+
+        // 存在待投产、已扫描、生产中、生产异常的工单,则订单位完成
+        long count = productionWorkOrderService.count(q -> q
+                .in(ProductionWorkOrder::getStatus,
+                        WorkOrderStatusEnum.TO_BE_PRODUCED.getKey(),
+                        WorkOrderStatusEnum.SCANNED.getKey(),
+                        WorkOrderStatusEnum.IN_PRODUCTION.getKey(),
+                        WorkOrderStatusEnum.PRODUCTION_ANOMALY.getKey())
+                .last("limit 1")
+        );
+
+        if (count != 0) {
+            return;
+        }
+
+        // 订单已完成或已发货跳过
+        OrderInfo orderInfo = orderService.getById(orderId);
+        if (Objects.equals(orderInfo.getStatus(), OrderStatusEnum.COMPLETION_PRODUCTION.getKey())
+                || Objects.equals(orderInfo.getStatus(), OrderStatusEnum.HAVE_BEEN_SHIPPED.getKey())) {
+            return;
+        }
+
+        // 生产入库
+        inventoryFinishedService.productionWarehousing(Collections.singletonList(orderId));
+
+        // 更新订单状态已完成
+        orderInfo.setStatus(OrderStatusEnum.COMPLETION_PRODUCTION.getKey());
+        orderService.updateById(orderInfo);
+    }
+
+}

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

@@ -13,6 +13,7 @@ import org.springframework.context.annotation.Configuration;
 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 DIRECT_EXCHANGE_NAME = "work.order.direct.exchange";
 
     /**
@@ -39,6 +40,18 @@ public class WorkOrderConfig {
     }
 
     /**
+     * 创建一个队列
+     */
+    @Bean
+    public Queue editWorkOrderQueue() {
+        // durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效
+        // exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable
+        // autoDelete:是否自动删除,有消息者订阅本队列,然后所有消费者都解除订阅此队列,会自动删除。
+        // arguments:队列携带的参数,比如设置队列的死信队列,消息的过期时间等等。
+        return new Queue(EDIT_WORK_ORDER_QUEUE_NAME, true, false, false);
+    }
+
+    /**
      * 绑定交换机和队列
      */
     @Bean
@@ -46,4 +59,12 @@ public class WorkOrderConfig {
         return BindingBuilder.bind(addWorkOrderQueue()).to(workOrderDirectExchange()).withQueueName();
     }
 
+    /**
+     * 绑定交换机和队列
+     */
+    @Bean
+    public Binding editWorkOrderBinding() {
+        return BindingBuilder.bind(editWorkOrderQueue()).to(workOrderDirectExchange()).withQueueName();
+    }
+
 }

+ 27 - 0
sd-mq/src/main/java/com/sd/mq/entity/EditWorkOrderMessage.java

@@ -0,0 +1,27 @@
+package com.sd.mq.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+@Getter
+@Setter
+public class EditWorkOrderMessage extends BaseMessage {
+
+    /**
+     * 工单id
+     */
+    private Long workOrderId;
+
+    /**
+     * 工单状态
+     */
+    private Integer status;
+
+    /**
+     * 推送时间
+     */
+    private Date sendTime;
+
+}

+ 14 - 0
sd-mq/src/main/java/com/sd/mq/enums/WorkOrderStatusEnum.java

@@ -3,6 +3,9 @@ package com.sd.mq.enums;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 
+import java.util.HashMap;
+import java.util.Map;
+
 @Getter
 @AllArgsConstructor
 public enum WorkOrderStatusEnum {
@@ -17,5 +20,16 @@ public enum WorkOrderStatusEnum {
 
     private final Integer key;
     private final String value;
+    private static final Map<Integer, WorkOrderStatusEnum> map = new HashMap<>();
+
+    static {
+        for (WorkOrderStatusEnum workOrderStatusEnum : WorkOrderStatusEnum.values()) {
+            map.put(workOrderStatusEnum.getKey(), workOrderStatusEnum);
+        }
+    }
+
+    public static WorkOrderStatusEnum getByKey(Integer key) {
+        return map.get(key);
+    }
 
 }

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

@@ -121,11 +121,11 @@ public class WlnStatementOfAccountImpl implements WlnStatementOfAccount {
             OrderInfo editOrderInfo = new OrderInfo();
             editOrderInfo.setId(order.getId());
             editOrderInfo.setStatementOfAccountId(statementOfAccount.getId());
+            editOrderInfo.setShippingTime(map.get(order.getWlnCode()));
 
             // 生产中的任务变为生产完成,生产成品入库,生成生产任务
             if (order.getStatus().equals(OrderStatusEnum.IN_PRODUCTION.getKey())) {
                 editOrderInfo.setStatus(OrderStatusEnum.COMPLETION_PRODUCTION.getKey());
-                editOrderInfo.setShippingTime(map.get(order.getWlnCode()));
                 orderIdList.add(order.getId());
             }