24282 1 vuosi sitten
vanhempi
commit
31515aca08
29 muutettua tiedostoa jossa 1166 lisäystä ja 5 poistoa
  1. 12 0
      pom.xml
  2. 5 0
      sd-business/pom.xml
  3. 37 0
      sd-business/src/main/java/com/sd/business/entity/order/dto/OrderInfoDto.java
  4. 50 0
      sd-business/src/main/java/com/sd/business/entity/order/dto/OrderInfoSelectDto.java
  5. 21 0
      sd-business/src/main/java/com/sd/business/entity/order/dto/OrderSkuDto.java
  6. 1 0
      sd-business/src/main/java/com/sd/business/entity/order/po/OrderSkuBom.java
  7. 22 0
      sd-business/src/main/java/com/sd/business/entity/order/vo/OrderInfoVo.java
  8. 10 0
      sd-business/src/main/java/com/sd/business/entity/order/vo/OrderPackageBomVo.java
  9. 15 0
      sd-business/src/main/java/com/sd/business/entity/order/vo/OrderSkuBomVo.java
  10. 27 0
      sd-business/src/main/java/com/sd/business/entity/order/vo/OrderSkuVo.java
  11. 6 0
      sd-business/src/main/java/com/sd/business/service/inventory/InventoryFinishedService.java
  12. 52 0
      sd-business/src/main/java/com/sd/business/service/inventory/impl/InventoryFinishedServiceImpl.java
  13. 281 5
      sd-business/src/main/java/com/sd/business/service/order/impl/OrderInfoServiceImpl.java
  14. 14 0
      sd-business/src/main/java/com/sd/business/service/production/ProductionWorkOrderService.java
  15. 151 0
      sd-business/src/main/java/com/sd/business/service/production/impl/ProductionWorkOrderServiceImpl.java
  16. 5 0
      sd-framework/pom.xml
  17. 46 0
      sd-mq/pom.xml
  18. 70 0
      sd-mq/src/main/java/com/sd/mq/config/ArtworkConfig.java
  19. 91 0
      sd-mq/src/main/java/com/sd/mq/config/WorkOrderConfig.java
  20. 40 0
      sd-mq/src/main/java/com/sd/mq/entity/ArtworkMessage.java
  21. 16 0
      sd-mq/src/main/java/com/sd/mq/entity/BaseMessage.java
  22. 26 0
      sd-mq/src/main/java/com/sd/mq/entity/CombinedWorkOrderMessage.java
  23. 27 0
      sd-mq/src/main/java/com/sd/mq/entity/EditWorkOrderMessage.java
  24. 20 0
      sd-mq/src/main/java/com/sd/mq/entity/TempArtworkMessage.java
  25. 45 0
      sd-mq/src/main/java/com/sd/mq/entity/WorkOrderDetail.java
  26. 17 0
      sd-mq/src/main/java/com/sd/mq/entity/WorkOrderMessage.java
  27. 36 0
      sd-mq/src/main/java/com/sd/mq/enums/WorkOrderStatusEnum.java
  28. 22 0
      sd-mq/src/main/java/com/sd/mq/util/RabbitMqUtil.java
  29. 1 0
      sd-wln/src/main/java/com/sd/wln/service/impl/WlnOrderServiceImpl.java

+ 12 - 0
pom.xml

@@ -44,6 +44,12 @@
             </dependency>
 
             <dependency>
+                <groupId>com.fjhx</groupId>
+                <artifactId>hx-flow</artifactId>
+                <version>${base.version}</version>
+            </dependency>
+
+            <dependency>
                 <groupId>com.sd</groupId>
                 <artifactId>sd-framework</artifactId>
                 <version>${sd.version}</version>
@@ -67,6 +73,12 @@
                 <version>${sd.version}</version>
             </dependency>
 
+            <dependency>
+                <groupId>com.sd</groupId>
+                <artifactId>sd-mq</artifactId>
+                <version>${sd.version}</version>
+            </dependency>
+
         </dependencies>
     </dependencyManagement>
 

+ 5 - 0
sd-business/pom.xml

@@ -24,6 +24,11 @@
             <artifactId>sd-framework</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.sd</groupId>
+            <artifactId>sd-mq</artifactId>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 37 - 0
sd-business/src/main/java/com/sd/business/entity/order/dto/OrderInfoDto.java

@@ -1,9 +1,14 @@
 package com.sd.business.entity.order.dto;
 
+import com.fjhx.file.entity.ObsFile;
 import com.sd.business.entity.order.po.OrderInfo;
 import lombok.Getter;
 import lombok.Setter;
 
+import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
+import java.util.List;
+
 /**
  * 订单新增编辑入参实体
  *
@@ -14,4 +19,36 @@ import lombok.Setter;
 @Setter
 public class OrderInfoDto extends OrderInfo {
 
+    /**
+     * 操作类型
+     */
+    private Integer updateType;
+
+    /**
+     * 订单商品
+     */
+    @Valid
+    @NotEmpty(message = "产品列表不能为空")
+    private List<OrderSkuDto> orderSkuList;
+
+    /**
+     * 附件列表
+     */
+    private List<ObsFile> fileList;
+
+    /**
+     * 订单包装bom
+     */
+    private List<OrderPackageBomDto> orderPackageBomList;
+
+    /**
+     * 外箱不干胶文件
+     */
+    private ObsFile outerBoxSelfAdhesiveStickerFile;
+
+    /**
+     * 包裹图片
+     */
+    private List<ObsFile> packagePictureList;
+
 }

+ 50 - 0
sd-business/src/main/java/com/sd/business/entity/order/dto/OrderInfoSelectDto.java

@@ -14,4 +14,54 @@ import lombok.Setter;
 @Setter
 public class OrderInfoSelectDto extends BaseSelectDto {
 
+    /**
+     * 事业部id
+     */
+    private Long departmentId;
+
+    /**
+     * 事业部名称
+     */
+    private String departmentName;
+
+    /**
+     * 订单号
+     */
+    private String code;
+
+    /**
+     * 万里牛订单号
+     */
+    private String wlnCode;
+
+    /**
+     * 进度 {@link com.sd.business.entity.order.enums.OrderStatusEnum}
+     */
+    private Integer status;
+
+    /**
+     * 结算状态 1未结算 2已对账 3已结算
+     */
+    private Integer settlementStatus;
+
+    /**
+     * 是否关联对账单
+     */
+    private Integer linkedStatementOfAccount;
+
+    /**
+     * 异常订单,1是 0否
+     */
+    private Integer exception;
+
+    /**
+     * 异常类型
+     */
+    private Integer exceptionType;
+
+    /**
+     * 流程状态 0未发起 1进行中 2已通过 3已驳回 4已作废
+     */
+    private Integer flowStatus;
+
 }

+ 21 - 0
sd-business/src/main/java/com/sd/business/entity/order/dto/OrderSkuDto.java

@@ -1,9 +1,14 @@
 package com.sd.business.entity.order.dto;
 
+import com.fjhx.file.entity.ObsFile;
 import com.sd.business.entity.order.po.OrderSku;
+import com.sd.business.entity.order.po.OrderSkuBom;
 import lombok.Getter;
 import lombok.Setter;
 
+import javax.validation.Valid;
+import java.util.List;
+
 /**
  * 订单sku新增编辑入参实体
  *
@@ -14,4 +19,20 @@ import lombok.Setter;
 @Setter
 public class OrderSkuDto extends OrderSku {
 
+    /**
+     * 订单号
+     */
+    private String orderCode;
+
+    /**
+     * 不干胶文件
+     */
+    private ObsFile selfAdhesiveStickerFile;
+
+    /**
+     * 订单包材
+     */
+    @Valid
+    private List<OrderSkuBom> orderSkuBomList;
+
 }

+ 1 - 0
sd-business/src/main/java/com/sd/business/entity/order/po/OrderSkuBom.java

@@ -45,4 +45,5 @@ public class OrderSkuBom extends BasePo {
      */
     private BigDecimal quantity;
 
+
 }

+ 22 - 0
sd-business/src/main/java/com/sd/business/entity/order/vo/OrderInfoVo.java

@@ -4,6 +4,8 @@ import com.sd.business.entity.order.po.OrderInfo;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.util.List;
+
 /**
  * 订单列表查询返回值实体
  *
@@ -14,4 +16,24 @@ import lombok.Setter;
 @Setter
 public class OrderInfoVo extends OrderInfo {
 
+    /**
+     * 异常明细
+     */
+    private String exceptionTypeDetail;
+
+    /**
+     * 事业部
+     */
+    private String departmentName;
+
+    /**
+     * 订单商品
+     */
+    private List<OrderSkuVo> orderSkuList;
+
+    /**
+     * 订单包装bom列表
+     */
+    private List<OrderPackageBomVo> orderPackageBomList;
+
 }

+ 10 - 0
sd-business/src/main/java/com/sd/business/entity/order/vo/OrderPackageBomVo.java

@@ -14,4 +14,14 @@ import lombok.Setter;
 @Setter
 public class OrderPackageBomVo extends OrderPackageBom {
 
+    /**
+     * bom规格编码
+     */
+    private String bomSpecCode;
+
+    /**
+     * bom规格名称
+     */
+    private String bomSpecName;
+
 }

+ 15 - 0
sd-business/src/main/java/com/sd/business/entity/order/vo/OrderSkuBomVo.java

@@ -14,4 +14,19 @@ import lombok.Setter;
 @Setter
 public class OrderSkuBomVo extends OrderSkuBom {
 
+    /**
+     * bom规格编码
+     */
+    private String bomSpecCode;
+
+    /**
+     * bom规格名称
+     */
+    private String bomSpecName;
+
+    /**
+     * bom分类id
+     */
+    private Long bomClassifyId;
+
 }

+ 27 - 0
sd-business/src/main/java/com/sd/business/entity/order/vo/OrderSkuVo.java

@@ -4,6 +4,8 @@ import com.sd.business.entity.order.po.OrderSku;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.util.List;
+
 /**
  * 订单sku列表查询返回值实体
  *
@@ -14,4 +16,29 @@ import lombok.Setter;
 @Setter
 public class OrderSkuVo extends OrderSku {
 
+    /**
+     * sku品号
+     */
+    private String skuSpecCode;
+
+    /**
+     * sku品名
+     */
+    private String skuSpecName;
+
+    /**
+     * bom品号
+     */
+    private String bomSpecCode;
+
+    /**
+     * bom品名
+     */
+    private String bomSpecName;
+
+    /**
+     * 包材配件
+     */
+    private List<OrderSkuBomVo> orderSkuBomList;
+
 }

+ 6 - 0
sd-business/src/main/java/com/sd/business/service/inventory/InventoryFinishedService.java

@@ -6,6 +6,7 @@ import com.sd.business.entity.inventory.dto.InventoryFinishedDto;
 import com.sd.business.entity.inventory.dto.InventoryFinishedSelectDto;
 import com.sd.business.entity.inventory.po.InventoryFinished;
 import com.sd.business.entity.inventory.vo.InventoryFinishedVo;
+import com.sd.business.entity.order.po.OrderSku;
 
 import java.util.List;
 
@@ -62,4 +63,9 @@ public interface InventoryFinishedService extends BaseService<InventoryFinished>
      */
     void removeOrder(Long orderId);
 
+    /**
+     * 锁定无源成品库存
+     */
+    boolean lockNoSourceStorage(List<? extends OrderSku> orderSkuList);
+
 }

+ 52 - 0
sd-business/src/main/java/com/sd/business/service/inventory/impl/InventoryFinishedServiceImpl.java

@@ -1,5 +1,6 @@
 package com.sd.business.service.inventory.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.constant.StatusConstant;
@@ -17,6 +18,7 @@ import com.sd.framework.util.Assert;
 import com.sd.framework.util.sql.Sql;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.util.List;
@@ -173,6 +175,56 @@ public class InventoryFinishedServiceImpl extends ServiceImpl<InventoryFinishedM
         inventoryFinishedOrderService.removeByOrderId(orderId);
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean lockNoSourceStorage(List<? extends OrderSku> orderSkuList) {
+        if (ObjectUtil.isEmpty(orderSkuList)) {
+            return true;
+        }
+
+        Map<Long, BigDecimal> map = orderSkuList.stream()
+                .collect(Collectors.toMap(OrderSku::getSkuSpecId, OrderSku::getQuantity, BigDecimal::add));
+
+        synchronized (this) {
+
+            List<InventoryFinished> list = list(q -> q.in(InventoryFinished::getSkuSpecId, map.keySet()));
+
+            if (map.size() != list.size()) {
+                return false;
+            }
+
+            // 查询无源成品数据
+            List<InventoryFinishedOrder> inventoryFinishedOrderList = inventoryFinishedOrderService.list(q -> q
+                    .in(InventoryFinishedOrder::getSkuSpecId, map.keySet())
+                    .eq(InventoryFinishedOrder::getStatus, 1)
+                    .isNull(InventoryFinishedOrder::getOrderInfoId));
+            Map<Long, BigDecimal> inventoryFinishedMap = inventoryFinishedOrderList.stream()
+                    .collect(Collectors.toMap(
+                            InventoryFinishedOrder::getSkuSpecId,
+                            InventoryFinishedOrder::getExistingQuantity,
+                            BigDecimal::add));
+
+            if (map.size() != inventoryFinishedMap.size()) {
+                return false;
+            }
+
+            for (InventoryFinished inventoryFinished : list) {
+                BigDecimal lockQuantity = map.get(inventoryFinished.getSkuSpecId());
+                // 查询成品sku现存数量,减去锁定库存,得出当前可用数量
+                BigDecimal existingQuantity = inventoryFinishedMap.getOrDefault(inventoryFinished.getSkuSpecId(), BigDecimal.ZERO);
+                if (existingQuantity.subtract(inventoryFinished.getLockQuantity()).compareTo(lockQuantity) >= 0) {
+                    inventoryFinished.setLockQuantity(inventoryFinished.getLockQuantity().add(lockQuantity));
+                } else {
+                    return false;
+                }
+            }
+
+            updateBatchById(list);
+        }
+
+        return true;
+    }
+
     /**
      * 成品库存出库
      *

+ 281 - 5
sd-business/src/main/java/com/sd/business/service/order/impl/OrderInfoServiceImpl.java

@@ -1,5 +1,6 @@
 package com.sd.business.service.order.impl;
 
+import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
@@ -7,17 +8,27 @@ import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.file.utils.ObsFileUtil;
+import com.fjhx.flow.enums.FlowStatusEnum;
 import com.ruoyi.common.constant.StatusConstant;
 import com.ruoyi.common.core.domain.BaseIdPo;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.system.service.ISysRoleService;
+import com.ruoyi.system.service.ISysUserService;
 import com.sd.business.entity.bom.bo.BomSpecBo;
+import com.sd.business.entity.bom.po.Bom;
+import com.sd.business.entity.bom.po.BomSpec;
+import com.sd.business.entity.department.po.Department;
 import com.sd.business.entity.in.dto.InOutStorageDto;
 import com.sd.business.entity.in.emums.InDetailTypeEnum;
 import com.sd.business.entity.in.emums.InOutTypeEnum;
 import com.sd.business.entity.in.po.InOutStorageBom;
 import com.sd.business.entity.order.dto.OrderInfoDto;
 import com.sd.business.entity.order.dto.OrderInfoSelectDto;
+import com.sd.business.entity.order.dto.OrderPackageBomDto;
+import com.sd.business.entity.order.dto.OrderSkuDto;
+import com.sd.business.entity.order.enums.OrderClassifyEnum;
+import com.sd.business.entity.order.enums.OrderExceptionTypeEnum;
 import com.sd.business.entity.order.enums.OrderStatusEnum;
 import com.sd.business.entity.order.po.OrderInfo;
 import com.sd.business.entity.order.po.OrderPackageBom;
@@ -25,7 +36,11 @@ import com.sd.business.entity.order.po.OrderSku;
 import com.sd.business.entity.order.po.OrderSkuBom;
 import com.sd.business.entity.order.po.OrderSkuProductionCost;
 import com.sd.business.entity.order.vo.OrderInfoVo;
+import com.sd.business.entity.order.vo.OrderPackageBomVo;
+import com.sd.business.entity.order.vo.OrderSkuBomVo;
+import com.sd.business.entity.order.vo.OrderSkuVo;
 import com.sd.business.entity.production.po.ProductionWorkOrder;
+import com.sd.business.entity.sku.po.SkuSpec;
 import com.sd.business.entity.warehouse.constant.WarehouseConstant;
 import com.sd.business.mapper.order.OrderInfoMapper;
 import com.sd.business.service.bom.BomSpecService;
@@ -40,12 +55,19 @@ import com.sd.business.service.order.OrderSkuService;
 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 org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -88,14 +110,73 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
     @Autowired
     private InventoryFinishedService inventoryFinishedService;
 
+    @Autowired
+    private ISysUserService sysUserService;
+
+    @Autowired
+    private ISysRoleService roleService;
+
     @Override
     public Page<OrderInfoVo> getPage(OrderInfoSelectDto dto) {
 
-        Page<OrderInfoVo> page = Sql.create(OrderInfoVo.class)
+        Where<OrderInfoVo> sql = Sql.create(OrderInfoVo.class)
                 .selectAll(OrderInfo.class)
+                .selectAs(Department::getName, OrderInfoVo::getDepartmentName)
                 .from(OrderInfo.class)
+                .leftJoin(Department.class, OrderInfo::getDepartmentId)
+
+                .orderByDesc("if(t1.status = 60, 1, 0)")
                 .orderByDesc(OrderInfo::getId)
-                .page(dto);
+                .eq(OrderInfo::getStatus, dto.getStatus())
+                .eq(OrderInfo::getSettlementStatus, dto.getSettlementStatus())
+                .eq(OrderInfo::getFlowStatus, dto.getFlowStatus())
+                .like(OrderInfo::getCode, dto.getCode())
+                .like(OrderInfo::getWlnCode, dto.getWlnCode())
+                .ge(OrderInfo::getWlnCreateTime, dto.getBeginTime())
+                .le(OrderInfo::getWlnCreateTime, dto.getEndTime())
+                .findInSet(OrderInfo::getExceptionType, dto.getExceptionType())
+                .eq(Department::getId, dto.getDepartmentId())
+                .like(Department::getName, dto.getDepartmentName());
+
+        List<Long> detpIdList = sysUserService.getDetpIdListByUserId(SecurityUtils.getUserId());
+        if (!detpIdList.isEmpty()) {
+            sql.in(OrderInfo::getDepartmentId, detpIdList);
+            sql.eq(OrderInfo::getCreateUser, SecurityUtils.getUserId());
+        }
+
+        if (StatusConstant.YES.equals(dto.getLinkedStatementOfAccount())) {
+            sql.isNotNull(OrderInfo::getStatementOfAccountId);
+            sql.in(OrderInfo::getStatus, OrderStatusEnum.COMPLETION_PRODUCTION.getKey(), OrderStatusEnum.HAVE_BEEN_SHIPPED.getKey());
+        } else if (StatusConstant.NO.equals(dto.getLinkedStatementOfAccount())) {
+            sql.isNull(OrderInfo::getStatementOfAccountId);
+            sql.in(OrderInfo::getStatus, OrderStatusEnum.COMPLETION_PRODUCTION.getKey(), OrderStatusEnum.HAVE_BEEN_SHIPPED.getKey());
+        }
+
+        if (StatusConstant.YES.equals(dto.getException())) {
+            sql.ne(OrderInfo::getExceptionType, StatusConstant.NO);
+        } else if (StatusConstant.NO.equals(dto.getException())) {
+            sql.eq(OrderInfo::getExceptionType, StatusConstant.NO);
+        }
+
+        Page<OrderInfoVo> page = sql.page(dto);
+        List<OrderInfoVo> records = page.getRecords();
+
+        if (records.isEmpty()) {
+            return page;
+        }
+
+        for (OrderInfoVo record : records) {
+            // 设置异常提示
+            String exceptionType = record.getExceptionType();
+            if (exceptionType.equals("0")) {
+                continue;
+            }
+            String exceptionTypeDetail = Arrays.stream(exceptionType.split(","))
+                    .map(Convert::toInt)
+                    .map(OrderExceptionTypeEnum::getEnumValue)
+                    .collect(Collectors.joining(","));
+            record.setExceptionTypeDetail(exceptionTypeDetail);
+        }
 
         return page;
     }
@@ -105,18 +186,195 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
 
         OrderInfoVo vo = Sql.create(OrderInfoVo.class)
                 .selectAll(OrderInfo.class)
+                .selectAs(Department::getName, OrderInfoVo::getDepartmentName)
                 .from(OrderInfo.class)
+                .leftJoin(Department.class, OrderInfo::getDepartmentId)
                 .eq(OrderInfo::getId, id)
                 .one();
 
-        Assert.notNull(vo, "未知数据");
+        Assert.notNull(vo, "未知订单");
+
+        // 订单sku列表
+        List<OrderSkuVo> orderSkuList = Sql.create(OrderSkuVo.class)
+                .selectAll(OrderSku.class)
+                .selectAs(SkuSpec::getCode, OrderSkuVo::getSkuSpecCode)
+                .selectAs(SkuSpec::getName, OrderSkuVo::getSkuSpecName)
+                .selectAs(BomSpec::getCode, OrderSkuVo::getBomSpecCode)
+                .selectAs(BomSpec::getName, OrderSkuVo::getBomSpecName)
+                .from(OrderSku.class)
+                .leftJoin(SkuSpec.class, OrderSku::getSkuSpecId)
+                .leftJoin(BomSpec.class, OrderSku::getBomSpecId)
+                .eq(OrderSku::getOrderId, id)
+                .list();
+
+        // 包材配件/单品
+        List<OrderSkuBomVo> orderSkuBomList = Sql.create(OrderSkuBomVo.class)
+                .selectAll(OrderSkuBom.class)
+                .selectAs(BomSpec::getCode, OrderSkuBomVo::getBomSpecCode)
+                .selectAs(BomSpec::getName, OrderSkuBomVo::getBomSpecName)
+                .selectAs(Bom::getBomClassifyId, OrderSkuBomVo::getBomClassifyId)
+                .from(OrderSkuBom.class)
+                .leftJoin(BomSpec.class, OrderSkuBom::getBomSpecId)
+                .leftJoin(Bom.class, BomSpec::getBomId)
+                .eq(OrderSkuBom::getOrderId, id)
+                .list();
+
+        // 包装明细
+        List<OrderPackageBomVo> orderPackageBomList = Sql.create(OrderPackageBomVo.class)
+                .selectAll(OrderPackageBom.class)
+                .selectAs(BomSpec::getCode, OrderPackageBomVo::getBomSpecCode)
+                .selectAs(BomSpec::getName, OrderPackageBomVo::getBomSpecName)
+                .from(OrderPackageBom.class)
+                .leftJoin(BomSpec.class, OrderPackageBom::getBomSpecId)
+                .eq(OrderPackageBom::getOrderId, id)
+                .list();
+
+        // 赋值
+        Map<Long, List<OrderSkuBomVo>> map = orderSkuBomList.stream().collect(Collectors.groupingBy(OrderSkuBomVo::getOrderSkuId));
+        orderSkuList.forEach(item -> item.setOrderSkuBomList(map.getOrDefault(item.getId(), Collections.emptyList())));
+        vo.setOrderSkuList(orderSkuList);
+        vo.setOrderPackageBomList(orderPackageBomList);
 
         return vo;
     }
 
     @Override
     public void add(OrderInfoDto dto) {
-        save(dto);
+        List<OrderSkuDto> orderSkuList = dto.getOrderSkuList();
+        if (ObjectUtil.equal(dto.getStatus(), OrderStatusEnum.STOCK_PREPARATION.getKey())
+                && ObjectUtil.notEqual(dto.getType(), 2)) {
+            // 先判断成品是否能锁定
+            if (inventoryFinishedService.lockNoSourceStorage(orderSkuList)) {
+                dto.setStockType(StatusConstant.YES);
+            } else {
+                lockStorage(orderSkuList);
+                dto.setStockType(StatusConstant.NO);
+            }
+            dto.setLockStorage(StatusConstant.YES);
+        } else {
+            dto.setLockStorage(StatusConstant.NO);
+        }
+
+        // 新增订单
+        dto.setSource(1);
+        dto.setCode("PI" + new Date().getTime());
+        dto.setSettlementStatus(1);
+        dto.setTaxRate(new BigDecimal("10.00"));
+        dto.setTag("0");
+        dto.setExceptionType(OrderExceptionTypeEnum.NORMAL.getKey().toString());
+        if (Objects.equals(dto.getType(), 2)) {
+            dto.setClassify(OrderClassifyEnum.OUTSOURCE_ORDER.getKey());
+        } else if (Objects.equals(dto.getType(), 1)) {
+            // 拥有采购角色的账号创建的自主订单为采购订单
+            Long userId = SecurityUtils.getUserId();
+            Set<String> roleKeys = roleService.selectRolePermissionByUserId(userId);
+            if (!Collections.disjoint(roleKeys, Arrays.asList("sypurchasing", "purchasingOfficer", "bzpurchasing"))) {
+                dto.setClassify(OrderClassifyEnum.PURCHASE_ORDER.getKey());
+            }
+        }
+        // 委外订单修改金额
+        if (ObjectUtil.equals(dto.getType(), 2)) {
+            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()));
+        }
+        this.save(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.saveBatch(tempOrderSkuList);
+
+        // 新增订单产品包装信息
+        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.saveBatch(orderSkuBomList);
+
+        // 新增订单产品生产成本
+        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.get(item.getId());
+            if (bomList == null) {
+                bomList = 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.saveBatch(orderSkuProductionCostList);
+
+        // 是委外订单并且没有包材时,修改订单状态为生产中,并生成生产任务和工单
+        if (ObjectUtil.notEqual(dto.getStatus(), OrderStatusEnum.DRAFT.getKey())
+                && ObjectUtil.equal(dto.getFlowStatus(), FlowStatusEnum.PASS.getKey())
+                && ObjectUtil.equals(dto.getType(), 2)
+                && ObjectUtil.isEmpty(orderSkuBomList)) {
+            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()));
+        }
+
+        // 保存订单包装信息
+        if (ObjectUtil.isNotEmpty(dto.getOrderPackageBomList())) {
+            List<OrderPackageBomDto> tempOrderPackageBomList = dto.getOrderPackageBomList();
+            List<OrderPackageBom> orderPackageBomList = tempOrderPackageBomList.stream()
+                    .peek(item -> item.setOrderId(dto.getId()))
+                    .map(item -> (OrderPackageBom) item)
+                    .collect(Collectors.toList());
+            orderPackageBomService.saveBatch(orderPackageBomList);
+        }
+
+        // 保存产品不干胶图稿
+        for (OrderSkuDto item : orderSkuList) {
+            ObsFileUtil.saveFile(item.getSelfAdhesiveStickerFile(), item.getId());
+        }
+
+        // 保存附件
+        ObsFileUtil.saveFile(dto.getFileList(), dto.getId());
     }
 
     @Override
@@ -126,7 +384,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
 
     @Override
     public void delete(Long id) {
-        this.removeById(id);
+        removeById(id);
         orderSkuService.remove(q -> q.eq(OrderSku::getOrderId, id));
         orderSkuBomService.remove(q -> q.eq(OrderSkuBom::getOrderId, id));
         orderPackageBomService.remove(q -> q.eq(OrderPackageBom::getOrderId, id));
@@ -282,4 +540,22 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
         inOutStorageService.add(packagingMaterialInOutStorageDto);
     }
 
+    /**
+     * 锁定库存
+     */
+    private void lockStorage(List<? extends OrderSku> orderSkuList) {
+        List<Long> bomSpecIdList = orderSkuList.stream().map(OrderSku::getBomSpecId).collect(Collectors.toList());
+        Map<Long, BomSpecBo> bomSpecBoMap = bomSpecService.getBomSpecBo(bomSpecIdList);
+
+        boolean result = inventoryService.lockStorage(orderSkuList.stream()
+                .filter(item -> bomSpecBoMap.get(item.getBomSpecId()).getClassifyParentId().equals(1L))
+                .collect(Collectors.toList())
+        );
+
+        if (!result) {
+            throw new ServiceException("主材库存不足,无法确认订单");
+        }
+
+    }
+
 }

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

@@ -7,6 +7,8 @@ import com.sd.business.entity.production.dto.ProductionWorkOrderSelectDto;
 import com.sd.business.entity.production.po.ProductionWorkOrder;
 import com.sd.business.entity.production.vo.ProductionWorkOrderVo;
 
+import java.util.List;
+
 
 /**
  * <p>
@@ -43,4 +45,16 @@ public interface ProductionWorkOrderService extends BaseService<ProductionWorkOr
      */
     void delete(Long id);
 
+    /**
+     * 通过订单id生成工单
+     */
+    void addByOrderId(Long orderId);
+
+    /**
+     * 发送工单到mq
+     *
+     * @param list 工单列表
+     */
+    void sendMq(List<ProductionWorkOrder> list);
+
 }

+ 151 - 0
sd-business/src/main/java/com/sd/business/service/production/impl/ProductionWorkOrderServiceImpl.java

@@ -1,16 +1,41 @@
 package com.sd.business.service.production.impl;
 
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.exception.ServiceException;
+import com.sd.business.entity.artwork.po.ArtworkLibrary;
+import com.sd.business.entity.order.po.OrderInfo;
+import com.sd.business.entity.order.po.OrderSku;
 import com.sd.business.entity.production.dto.ProductionWorkOrderDto;
 import com.sd.business.entity.production.dto.ProductionWorkOrderSelectDto;
 import com.sd.business.entity.production.po.ProductionWorkOrder;
 import com.sd.business.entity.production.vo.ProductionWorkOrderVo;
+import com.sd.business.entity.sku.po.SkuSpec;
 import com.sd.business.mapper.production.ProductionWorkOrderMapper;
+import com.sd.business.service.artwork.ArtworkLibraryService;
+import com.sd.business.service.order.OrderInfoService;
+import com.sd.business.service.order.OrderSkuService;
 import com.sd.business.service.production.ProductionWorkOrderService;
+import com.sd.business.service.sku.SkuSpecService;
 import com.sd.framework.util.Assert;
 import com.sd.framework.util.sql.Sql;
+import com.sd.mq.config.WorkOrderConfig;
+import com.sd.mq.entity.WorkOrderDetail;
+import com.sd.mq.entity.WorkOrderMessage;
+import com.sd.mq.util.RabbitMqUtil;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 
 /**
@@ -24,6 +49,18 @@ import org.springframework.stereotype.Service;
 @Service
 public class ProductionWorkOrderServiceImpl extends ServiceImpl<ProductionWorkOrderMapper, ProductionWorkOrder> implements ProductionWorkOrderService {
 
+    @Autowired
+    private OrderInfoService orderInfoService;
+
+    @Autowired
+    private OrderSkuService orderSkuService;
+
+    @Autowired
+    private SkuSpecService skuSpecService;
+
+    @Autowired
+    private ArtworkLibraryService artworkLibraryService;
+
     @Override
     public Page<ProductionWorkOrderVo> getPage(ProductionWorkOrderSelectDto dto) {
 
@@ -65,4 +102,118 @@ public class ProductionWorkOrderServiceImpl extends ServiceImpl<ProductionWorkOr
         removeById(id);
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void addByOrderId(Long orderId) {
+        OrderInfo orderInfo = orderInfoService.getById(orderId);
+        if (orderInfo == null) {
+            throw new ServiceException("未知订单");
+        }
+
+        List<ProductionWorkOrder> productionWorkOrderList = new ArrayList<>();
+
+        List<OrderSku> orderSkuList = orderSkuService.list(q -> q.eq(OrderSku::getOrderId, orderId));
+
+        String code = ObjectUtil.defaultIfNull(orderInfo.getWlnCode(), orderInfo.getCode());
+
+        int num = 1;
+
+        for (OrderSku orderSku : orderSkuList) {
+            BigDecimal quantity = orderSku.getQuantity();
+            for (int i = 0; i < quantity.intValue(); i++) {
+                ProductionWorkOrder productionWorkOrder = new ProductionWorkOrder();
+                productionWorkOrder.setType(1);
+                productionWorkOrder.setCode(code + String.format("-%05d", num));
+                productionWorkOrder.setOrderId(orderId);
+                productionWorkOrder.setOrderSkuId(orderSku.getId());
+                productionWorkOrder.setSkuSpecId(orderSku.getSkuSpecId());
+                productionWorkOrder.setBomSpecId(orderSku.getBomSpecId());
+                productionWorkOrder.setPrintType(orderSku.getPrintType());
+                productionWorkOrder.setStatus(0);
+                productionWorkOrderList.add(productionWorkOrder);
+                num++;
+            }
+        }
+
+        skuSpecService.attributeAssign(productionWorkOrderList, ProductionWorkOrder::getSkuSpecId, (item, skuSpec) -> {
+            item.setMachinedPanel(skuSpec.getMachinedPanel());
+        });
+
+        saveBatch(productionWorkOrderList);
+
+        sendMq(productionWorkOrderList);
+    }
+
+    @Override
+    public void sendMq(List<ProductionWorkOrder> list) {
+        if (list.isEmpty()) {
+            return;
+        }
+
+        // 订单详情
+        List<Long> orderSkuIdList = list.stream().map(ProductionWorkOrder::getOrderSkuId).collect(Collectors.toList());
+        Map<Long, OrderSku> orderSkuMap = orderSkuService.byIdsToMap(orderSkuIdList);
+
+        // 图稿库
+        List<Long> artworkLibraryIdList = orderSkuMap.values().stream()
+                .map(OrderSku::getArtworkLibraryId)
+                .filter(Objects::nonNull)
+                .filter(item -> item != 0)
+                .distinct()
+                .collect(Collectors.toList());
+        Map<Long, ArtworkLibrary> artworkLibraryMap;
+        if (artworkLibraryIdList.isEmpty()) {
+            artworkLibraryMap = Collections.emptyMap();
+        } else {
+            artworkLibraryMap = artworkLibraryService.byIdsToMap(artworkLibraryIdList);
+        }
+
+        // sku规格
+        List<Long> skuSpecIdList = list.stream().map(ProductionWorkOrder::getSkuSpecId).collect(Collectors.toList());
+        Map<Long, SkuSpec> skuSpecMap = skuSpecService.byIdsToMap(skuSpecIdList);
+
+        List<WorkOrderDetail> workOrderDetailList = list.stream().map(item -> {
+            WorkOrderDetail workOrderDetail = new WorkOrderDetail();
+
+            workOrderDetail.setWorkOrderId(item.getId());
+
+            Long orderSkuId = item.getOrderSkuId();
+            OrderSku orderSku = orderSkuMap.get(orderSkuId);
+            Long artworkLibraryId = orderSku.getArtworkLibraryId();
+
+            if (artworkLibraryId != null && artworkLibraryId != 0) {
+                ArtworkLibrary artworkLibrary = artworkLibraryMap.get(artworkLibraryId);
+                if (artworkLibrary != null) {
+                    workOrderDetail.setImgPath("artwork\\" + artworkLibrary.getArtworkName() + "\\" + artworkLibrary.getImgName());
+                    workOrderDetail.setFilePath("artwork\\" + artworkLibrary.getArtworkName() + "\\" + artworkLibrary.getFileName());
+                }
+            }
+
+            if (StrUtil.isAllBlank(workOrderDetail.getImgPath(), workOrderDetail.getFilePath())) {
+                workOrderDetail.setImgPath("tempArtwork\\" + orderSku.getBlueprint().replace("https://os.winfaster.cn/sd/", "")
+                        .replace("test/", "")
+                        .replace("prod/", "")
+                        .replace("dev/", ""));
+                workOrderDetail.setFilePath("tempArtwork\\" + orderSku.getProductionDocument().replace("https://os.winfaster.cn/sd/", "")
+                        .replace("test/", "")
+                        .replace("prod/", "")
+                        .replace("dev/", ""));
+            }
+
+            SkuSpec skuSpec = skuSpecMap.get(item.getSkuSpecId());
+
+            workOrderDetail.setLength(skuSpec.getLength());
+            workOrderDetail.setWide(skuSpec.getWidth());
+            workOrderDetail.setHight(skuSpec.getHeight());
+
+            return workOrderDetail;
+        }).collect(Collectors.toList());
+
+        WorkOrderMessage workOrderMessage = new WorkOrderMessage();
+        workOrderMessage.setWorkOrderDetailList(workOrderDetailList);
+
+        RabbitMqUtil.send(WorkOrderConfig.DIRECT_EXCHANGE_NAME, WorkOrderConfig.ADD_WORK_ORDER_QUEUE_NAME, workOrderMessage);
+
+    }
+
 }

+ 5 - 0
sd-framework/pom.xml

@@ -24,6 +24,11 @@
             <artifactId>hx-base</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.fjhx</groupId>
+            <artifactId>hx-flow</artifactId>
+        </dependency>
+
         <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
         <dependency>
             <groupId>org.apache.httpcomponents</groupId>

+ 46 - 0
sd-mq/pom.xml

@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.sd</groupId>
+        <artifactId>shdy_project</artifactId>
+        <version>2.0</version>
+    </parent>
+
+    <artifactId>sd-mq</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.fastjson2</groupId>
+            <artifactId>fastjson2</artifactId>
+            <version>2.0.23</version>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.18</version>
+        </dependency>
+
+    </dependencies>
+
+</project>

+ 70 - 0
sd-mq/src/main/java/com/sd/mq/config/ArtworkConfig.java

@@ -0,0 +1,70 @@
+package com.sd.mq.config;
+
+import org.springframework.amqp.core.Binding;
+import org.springframework.amqp.core.BindingBuilder;
+import org.springframework.amqp.core.DirectExchange;
+import org.springframework.amqp.core.Queue;
+import org.springframework.amqp.rabbit.annotation.EnableRabbit;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@EnableRabbit
+@Configuration
+public class ArtworkConfig {
+
+    public static final String ARTWORK_QUEUE_NAME = "artwork.queue";
+    public static final String TEMP_ARTWORK_QUEUE_NAME = "temp.artwork.queue";
+    public static final String DIRECT_EXCHANGE_NAME = "artwork.direct.exchange";
+
+    /**
+     * 创建一个Direct类型的交换机
+     */
+    @Bean
+    public DirectExchange artworkDirectExchange() {
+        // durable:是否持久化,默认是false,持久化交换机。
+        // autoDelete:是否自动删除,交换机先有队列或者其他交换机绑定的时候,然后当该交换机没有队列或其他交换机绑定的时候,会自动删除。
+        // arguments:交换机设置的参数,比如设置交换机的备用交换机(Alternate Exchange),当消息不能被路由到该交换机绑定的队列上时,会自动路由到备用交换机
+        return new DirectExchange(DIRECT_EXCHANGE_NAME, true, false);
+    }
+
+    /**
+     * 创建一个队列
+     */
+    @Bean
+    public Queue artworkQueue() {
+        // durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效
+        // exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable
+        // autoDelete:是否自动删除,有消息者订阅本队列,然后所有消费者都解除订阅此队列,会自动删除。
+        // arguments:队列携带的参数,比如设置队列的死信队列,消息的过期时间等等。
+        return new Queue(ARTWORK_QUEUE_NAME, true, false, false);
+    }
+
+    /**
+     * 创建一个队列
+     */
+    @Bean
+    public Queue tempArtworkQueue() {
+        // durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效
+        // exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable
+        // autoDelete:是否自动删除,有消息者订阅本队列,然后所有消费者都解除订阅此队列,会自动删除。
+        // arguments:队列携带的参数,比如设置队列的死信队列,消息的过期时间等等。
+        return new Queue(TEMP_ARTWORK_QUEUE_NAME, true, false, false);
+    }
+
+    /**
+     * 绑定交换机和队列
+     */
+    @Bean
+    public Binding artworkBinding() {
+        return BindingBuilder.bind(artworkQueue()).to(artworkDirectExchange()).withQueueName();
+    }
+
+    /**
+     * 绑定交换机和队列
+     */
+    @Bean
+    public Binding tempArtworkBinding() {
+        return BindingBuilder.bind(tempArtworkQueue()).to(artworkDirectExchange()).withQueueName();
+    }
+
+}

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

@@ -0,0 +1,91 @@
+package com.sd.mq.config;
+
+import org.springframework.amqp.core.Binding;
+import org.springframework.amqp.core.BindingBuilder;
+import org.springframework.amqp.core.DirectExchange;
+import org.springframework.amqp.core.Queue;
+import org.springframework.amqp.rabbit.annotation.EnableRabbit;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@EnableRabbit
+@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 COMBINED_WORK_ORDER_QUEUE_NAME = "combined.work.order.artwork.queue";
+    public static final String DIRECT_EXCHANGE_NAME = "work.order.direct.exchange";
+
+    /**
+     * 创建一个Direct类型的交换机
+     */
+    @Bean
+    public DirectExchange workOrderDirectExchange() {
+        // durable:是否持久化,默认是false,持久化交换机。
+        // autoDelete:是否自动删除,交换机先有队列或者其他交换机绑定的时候,然后当该交换机没有队列或其他交换机绑定的时候,会自动删除。
+        // arguments:交换机设置的参数,比如设置交换机的备用交换机(Alternate Exchange),当消息不能被路由到该交换机绑定的队列上时,会自动路由到备用交换机
+        return new DirectExchange(DIRECT_EXCHANGE_NAME, true, false);
+    }
+
+    /**
+     * 创建一个队列
+     */
+    @Bean
+    public Queue addWorkOrderQueue() {
+        // durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效
+        // exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable
+        // autoDelete:是否自动删除,有消息者订阅本队列,然后所有消费者都解除订阅此队列,会自动删除。
+        // arguments:队列携带的参数,比如设置队列的死信队列,消息的过期时间等等。
+        return new Queue(ADD_WORK_ORDER_QUEUE_NAME, true, false, false);
+    }
+
+    /**
+     * 创建一个队列
+     */
+    @Bean
+    public Queue editWorkOrderQueue() {
+        // durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效
+        // exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable
+        // autoDelete:是否自动删除,有消息者订阅本队列,然后所有消费者都解除订阅此队列,会自动删除。
+        // arguments:队列携带的参数,比如设置队列的死信队列,消息的过期时间等等。
+        return new Queue(EDIT_WORK_ORDER_QUEUE_NAME, true, false, false);
+    }
+
+    /**
+     * 创建一个队列
+     */
+    @Bean
+    public Queue combinedWorkOrderQueue() {
+        // durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效
+        // exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable
+        // autoDelete:是否自动删除,有消息者订阅本队列,然后所有消费者都解除订阅此队列,会自动删除。
+        // arguments:队列携带的参数,比如设置队列的死信队列,消息的过期时间等等。
+        return new Queue(COMBINED_WORK_ORDER_QUEUE_NAME, true, false, false);
+    }
+
+    /**
+     * 绑定交换机和队列
+     */
+    @Bean
+    public Binding addWorkOrderBinding() {
+        return BindingBuilder.bind(addWorkOrderQueue()).to(workOrderDirectExchange()).withQueueName();
+    }
+
+    /**
+     * 绑定交换机和队列
+     */
+    @Bean
+    public Binding editWorkOrderBinding() {
+        return BindingBuilder.bind(editWorkOrderQueue()).to(workOrderDirectExchange()).withQueueName();
+    }
+
+    /**
+     * 绑定交换机和队列
+     */
+    @Bean
+    public Binding combinedWorkOrderBinding() {
+        return BindingBuilder.bind(combinedWorkOrderQueue()).to(workOrderDirectExchange()).withQueueName();
+    }
+
+}

+ 40 - 0
sd-mq/src/main/java/com/sd/mq/entity/ArtworkMessage.java

@@ -0,0 +1,40 @@
+package com.sd.mq.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class ArtworkMessage extends BaseMessage {
+
+    /**
+     * 保存路径
+     */
+    private String path;
+
+    /**
+     * 图片名称
+     */
+    private String imgName;
+
+    /**
+     * 图片url地址
+     */
+    private String imgUrl;
+
+    /**
+     * 文件名称
+     */
+    private String fileName;
+
+    /**
+     * 文件地址
+     */
+    private String fileUrl;
+
+    /**
+     * 类型: 1新增 2删除
+     */
+    private int type;
+
+}

+ 16 - 0
sd-mq/src/main/java/com/sd/mq/entity/BaseMessage.java

@@ -0,0 +1,16 @@
+package com.sd.mq.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+@Getter
+@Setter
+public class BaseMessage implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Long messageId;
+
+}

+ 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;
+
+}

+ 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;
+
+}

+ 20 - 0
sd-mq/src/main/java/com/sd/mq/entity/TempArtworkMessage.java

@@ -0,0 +1,20 @@
+package com.sd.mq.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class TempArtworkMessage extends BaseMessage {
+
+    /**
+     * 图片url地址
+     */
+    private String imgUrl;
+
+    /**
+     * 文件地址
+     */
+    private String fileUrl;
+
+}

+ 45 - 0
sd-mq/src/main/java/com/sd/mq/entity/WorkOrderDetail.java

@@ -0,0 +1,45 @@
+package com.sd.mq.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Getter
+@Setter
+public class WorkOrderDetail implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 工单id
+     */
+    private Long workOrderId;
+
+    /**
+     * 图片路径
+     */
+    private String imgPath;
+
+    /**
+     * 图稿路径
+     */
+    private String filePath;
+
+    /**
+     * 长(cm)
+     */
+    private BigDecimal length;
+
+    /**
+     * 宽(cm)
+     */
+    private BigDecimal wide;
+
+    /**
+     * 高(cm)
+     */
+    private BigDecimal hight;
+
+}

+ 17 - 0
sd-mq/src/main/java/com/sd/mq/entity/WorkOrderMessage.java

@@ -0,0 +1,17 @@
+package com.sd.mq.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Getter
+@Setter
+public class WorkOrderMessage extends BaseMessage {
+
+    /**
+     * 工单明细
+     */
+    private List<WorkOrderDetail> workOrderDetailList;
+
+}

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

@@ -0,0 +1,36 @@
+package com.sd.mq.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Getter
+@AllArgsConstructor
+public enum WorkOrderStatusEnum {
+
+    TO_BE_PRODUCED(0, "待投产"),
+    SCANNED(1, "已扫描"),
+    IN_PRODUCTION(2, "生产中"),
+    PRODUCTION_COMPLETION(3, "生产完成"),
+    PRODUCTION_ANOMALY(4, "生产异常"),
+    RESCHEDULE(5, "重新排单"),
+    ;
+
+    private static final Map<Integer, WorkOrderStatusEnum> map = new HashMap<>();
+
+    static {
+        for (WorkOrderStatusEnum workOrderStatusEnum : WorkOrderStatusEnum.values()) {
+            map.put(workOrderStatusEnum.getKey(), workOrderStatusEnum);
+        }
+    }
+
+    private final Integer key;
+    private final String value;
+
+    public static WorkOrderStatusEnum getByKey(Integer key) {
+        return map.get(key);
+    }
+
+}

+ 22 - 0
sd-mq/src/main/java/com/sd/mq/util/RabbitMqUtil.java

@@ -0,0 +1,22 @@
+package com.sd.mq.util;
+
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.sd.mq.entity.BaseMessage;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+
+public class RabbitMqUtil {
+
+    private static final RabbitTemplate rabbitTemplate = SpringUtil.getBean(RabbitTemplate.class);
+
+    /**
+     * 发送消息
+     */
+    public static void send(String exchange, String routingKey, BaseMessage message) {
+        if (message.getMessageId() == null) {
+            message.setMessageId(IdUtil.getSnowflake().nextId());
+        }
+        rabbitTemplate.convertAndSend(exchange, routingKey, message);
+    }
+
+}

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

@@ -175,6 +175,7 @@ public class WlnOrderServiceImpl implements WlnOrderService {
         orderInfo.setTaxRate(new BigDecimal("10.00"));
         orderInfo.setTag("0");
         orderInfo.setSettlementStatus(1);
+        orderInfo.setType(1);
 
         orderInfo.setWlnStorageCode(wlnOrder.getString("storage_code"));
         orderInfo.setWlnUid(wlnOrder.getString("uid"));