24282 1 年之前
父节点
当前提交
667e3f2e69
共有 23 个文件被更改,包括 551 次插入88 次删除
  1. 71 0
      sd-business/src/main/java/com/sd/business/controller/work/WorkOrderDetailController.java
  2. 0 5
      sd-business/src/main/java/com/sd/business/entity/bom/bo/BomSpecBo.java
  3. 0 5
      sd-business/src/main/java/com/sd/business/entity/bom/dto/BomSelectDto.java
  4. 0 35
      sd-business/src/main/java/com/sd/business/entity/bom/po/Bom.java
  5. 4 10
      sd-business/src/main/java/com/sd/business/entity/order/po/OrderSku.java
  6. 17 0
      sd-business/src/main/java/com/sd/business/entity/work/dto/WorkOrderDetailDto.java
  7. 17 0
      sd-business/src/main/java/com/sd/business/entity/work/dto/WorkOrderDetailSelectDto.java
  8. 3 3
      sd-business/src/main/java/com/sd/business/entity/work/po/WorkOrder.java
  9. 53 0
      sd-business/src/main/java/com/sd/business/entity/work/po/WorkOrderDetail.java
  10. 17 0
      sd-business/src/main/java/com/sd/business/entity/work/vo/WorkOrderDetailVo.java
  11. 16 0
      sd-business/src/main/java/com/sd/business/mapper/work/WorkOrderDetailMapper.java
  12. 0 1
      sd-business/src/main/java/com/sd/business/service/bom/impl/BomServiceImpl.java
  13. 0 1
      sd-business/src/main/java/com/sd/business/service/bom/impl/BomSpecServiceImpl.java
  14. 0 1
      sd-business/src/main/java/com/sd/business/service/inventory/impl/InventoryBackupServiceImpl.java
  15. 0 1
      sd-business/src/main/java/com/sd/business/service/inventory/impl/InventoryServiceImpl.java
  16. 46 0
      sd-business/src/main/java/com/sd/business/service/work/WorkOrderDetailService.java
  17. 2 5
      sd-business/src/main/java/com/sd/business/service/work/WorkOrderService.java
  18. 68 0
      sd-business/src/main/java/com/sd/business/service/work/impl/WorkOrderDetailServiceImpl.java
  19. 223 21
      sd-business/src/main/java/com/sd/business/service/work/impl/WorkOrderServiceImpl.java
  20. 2 0
      sd-business/src/main/java/com/sd/business/util/CodeEnum.java
  21. 5 0
      sd-business/src/main/resources/mapper/work/WorkOrderDetailMapper.xml
  22. 6 0
      sd-framework/pom.xml
  23. 1 0
      sd-wln/src/main/java/com/sd/wln/service/impl/WlnOrderServiceImpl.java

+ 71 - 0
sd-business/src/main/java/com/sd/business/controller/work/WorkOrderDetailController.java

@@ -0,0 +1,71 @@
+package com.sd.business.controller.work;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import com.sd.business.entity.work.dto.WorkOrderDetailDto;
+import com.sd.business.entity.work.dto.WorkOrderDetailSelectDto;
+import com.sd.business.entity.work.vo.WorkOrderDetailVo;
+import com.sd.business.service.work.WorkOrderDetailService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+/**
+ * <p>
+ * 生产工单明细 前端控制器
+ * </p>
+ *
+ * @author
+ * @since 2024-01-02
+ */
+@RestController
+@RequestMapping("/workOrderDetail")
+public class WorkOrderDetailController {
+
+    @Autowired
+    private WorkOrderDetailService workOrderDetailService;
+
+    /**
+     * 生产工单明细分页
+     */
+    @PostMapping("/page")
+    public Page<WorkOrderDetailVo> page(@RequestBody WorkOrderDetailSelectDto dto) {
+        return workOrderDetailService.getPage(dto);
+    }
+
+    /**
+     * 生产工单明细明细
+     */
+    @PostMapping("/detail")
+    public WorkOrderDetailVo detail(@RequestBody BaseSelectDto dto) {
+        return workOrderDetailService.detail(dto.getId());
+    }
+
+    /**
+     * 生产工单明细新增
+     */
+    @PostMapping("/add")
+    public void add(@RequestBody WorkOrderDetailDto dto) {
+        workOrderDetailService.add(dto);
+    }
+
+    /**
+     * 生产工单明细编辑
+     */
+    @PostMapping("/edit")
+    public void edit(@RequestBody WorkOrderDetailDto dto) {
+        workOrderDetailService.edit(dto);
+    }
+
+    /**
+     * 生产工单明细删除
+     */
+    @PostMapping("/delete")
+    public void delete(@RequestBody BaseSelectDto dto) {
+        workOrderDetailService.delete(dto.getId());
+    }
+
+}

+ 0 - 5
sd-business/src/main/java/com/sd/business/entity/bom/bo/BomSpecBo.java

@@ -45,11 +45,6 @@ public class BomSpecBo {
     private String bomSpecies;
 
     /**
-     * 单位
-     */
-    private String unit;
-
-    /**
      * 分类id
      */
     private Long classifyId;

+ 0 - 5
sd-business/src/main/java/com/sd/business/entity/bom/dto/BomSelectDto.java

@@ -42,11 +42,6 @@ public class BomSelectDto extends BaseSelectDto {
     private String species;
 
     /**
-     * 压纹工艺 字典:bom_embossingProcess
-     */
-    private String embossingProcess;
-
-    /**
      * 颜色
      */
     private String colour;

+ 0 - 35
sd-business/src/main/java/com/sd/business/entity/bom/po/Bom.java

@@ -34,46 +34,11 @@ public class Bom extends BasePo {
     private String name;
 
     /**
-     * 项目小类 字典:bom_itemSubclass
-     */
-    private String itemSubclass;
-
-    /**
      * 种类 字典:bom_species
      */
     private String species;
 
     /**
-     * 材质
-     */
-    private String material;
-
-    /**
-     * 型号
-     */
-    private String modelNumber;
-
-    /**
-     * 单位
-     */
-    private String unit;
-
-    /**
-     * 角度 字典:bom_angle
-     */
-    private String angle;
-
-    /**
-     * 配方
-     */
-    private String formula;
-
-    /**
-     * 压纹工艺 字典:bom_embossingProcess
-     */
-    private String embossingProcess;
-
-    /**
      * 详细描述
      */
     private String detailText;

+ 4 - 10
sd-business/src/main/java/com/sd/business/entity/order/po/OrderSku.java

@@ -6,7 +6,6 @@ import lombok.Getter;
 import lombok.Setter;
 
 import java.math.BigDecimal;
-import java.util.Date;
 
 /**
  * <p>
@@ -132,18 +131,13 @@ public class OrderSku extends BasePo {
     private String featureCode;
 
     /**
-     * 工单id
+     * 排单数量
      */
-    private Long workOrderId;
+    private BigDecimal schedulingNum;
 
     /**
-     * 排单时间
+     * 是否完成排单
      */
-    private Date schedulingTime;
-
-    /**
-     * 生产批次号
-     */
-    private Integer productionBatchNumber;
+    private Integer completeScheduling;
 
 }

+ 17 - 0
sd-business/src/main/java/com/sd/business/entity/work/dto/WorkOrderDetailDto.java

@@ -0,0 +1,17 @@
+package com.sd.business.entity.work.dto;
+
+import com.sd.business.entity.work.po.WorkOrderDetail;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 生产工单明细新增编辑入参实体
+ *
+ * @author
+ * @since 2024-01-02
+ */
+@Getter
+@Setter
+public class WorkOrderDetailDto extends WorkOrderDetail {
+
+}

+ 17 - 0
sd-business/src/main/java/com/sd/business/entity/work/dto/WorkOrderDetailSelectDto.java

@@ -0,0 +1,17 @@
+package com.sd.business.entity.work.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 生产工单明细列表查询入参实体
+ *
+ * @author
+ * @since 2024-01-02
+ */
+@Getter
+@Setter
+public class WorkOrderDetailSelectDto extends BaseSelectDto {
+
+}

+ 3 - 3
sd-business/src/main/java/com/sd/business/entity/work/po/WorkOrder.java

@@ -38,7 +38,7 @@ public class WorkOrder extends BasePo {
     /**
      * 固定尺寸排版最多排版个数
      */
-    private Integer fixationMaxNum;
+    private BigDecimal fixationMaxNum;
 
     /**
      * 固定尺寸排版规格参数
@@ -56,9 +56,9 @@ public class WorkOrder extends BasePo {
     private Long printingPaperBomSpecId;
 
     /**
-     * 地垫数量
+     * 排单数量
      */
-    private Integer orderSkuNum;
+    private BigDecimal schedulingNum;
 
     /**
      * 利用率

+ 53 - 0
sd-business/src/main/java/com/sd/business/entity/work/po/WorkOrderDetail.java

@@ -0,0 +1,53 @@
+package com.sd.business.entity.work.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BasePo;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * <p>
+ * 生产工单明细
+ * </p>
+ *
+ * @author
+ * @since 2024-01-02
+ */
+@Getter
+@Setter
+@TableName("work_order_detail")
+public class WorkOrderDetail extends BasePo {
+
+    /**
+     * 生产批次号
+     */
+    private Integer productionBatchNumber;
+
+    /**
+     * 工单id
+     */
+    private Long workOrderId;
+
+    /**
+     * 订单id
+     */
+    private Long orderInfoId;
+
+    /**
+     * 订单明细id
+     */
+    private Long orderSkuId;
+
+    /**
+     * x轴坐标
+     */
+    private BigDecimal x;
+
+    /**
+     * y轴坐标
+     */
+    private BigDecimal y;
+
+}

+ 17 - 0
sd-business/src/main/java/com/sd/business/entity/work/vo/WorkOrderDetailVo.java

@@ -0,0 +1,17 @@
+package com.sd.business.entity.work.vo;
+
+import com.sd.business.entity.work.po.WorkOrderDetail;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 生产工单明细列表查询返回值实体
+ *
+ * @author
+ * @since 2024-01-02
+ */
+@Getter
+@Setter
+public class WorkOrderDetailVo extends WorkOrderDetail {
+
+}

+ 16 - 0
sd-business/src/main/java/com/sd/business/mapper/work/WorkOrderDetailMapper.java

@@ -0,0 +1,16 @@
+package com.sd.business.mapper.work;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sd.business.entity.work.po.WorkOrderDetail;
+
+/**
+ * <p>
+ * 生产工单明细 Mapper 接口
+ * </p>
+ *
+ * @author
+ * @since 2024-01-02
+ */
+public interface WorkOrderDetailMapper extends BaseMapper<WorkOrderDetail> {
+
+}

+ 0 - 1
sd-business/src/main/java/com/sd/business/service/bom/impl/BomServiceImpl.java

@@ -74,7 +74,6 @@ public class BomServiceImpl extends ServiceImpl<BomMapper, Bom> implements BomSe
                 .like(Bom::getName, dto.getName())
                 .like(Bom::getCode, dto.getCode())
                 .eq(Bom::getSpecies, dto.getSpecies())
-                .eq(Bom::getEmbossingProcess, dto.getEmbossingProcess())
                 .in(Bom::getId, queryBomIdList)
                 .in(Bom::getBomClassifyId, queryBomClassifyIdSet)
                 .page(dto);

+ 0 - 1
sd-business/src/main/java/com/sd/business/service/bom/impl/BomSpecServiceImpl.java

@@ -45,7 +45,6 @@ public class BomSpecServiceImpl extends ServiceImpl<BomSpecMapper, BomSpec> impl
                 .selectAs(BomSpec::getInternalSellingPrice, BomSpecBo::getInternalSellingPrice)
                 .selectAs(BomSpec::getExternalSellingPrice, BomSpecBo::getExternalSellingPrice)
                 .selectAs(Bom::getSpecies, BomSpecBo::getBomSpecies)
-                .selectAs(Bom::getUnit, BomSpecBo::getUnit)
                 .selectAs(BomClassify::getId, BomSpecBo::getClassifyId)
                 .selectAs(BomClassify::getParentId, BomSpecBo::getClassifyParentId)
                 .selectAs(BomClassify::getName, BomSpecBo::getClassifyName)

+ 0 - 1
sd-business/src/main/java/com/sd/business/service/inventory/impl/InventoryBackupServiceImpl.java

@@ -92,7 +92,6 @@ public class InventoryBackupServiceImpl extends ServiceImpl<InventoryBackupMappe
                 .like(BomSpec::getWidth, dto.getBomSpecWidth())
                 .eq(Bom::getBomClassifyId, dto.getBomClassifyId())
                 .eq(Bom::getSpecies, dto.getBomSpecies())
-                .eq(Bom::getEmbossingProcess, dto.getBomEmbossingProcess())
                 .page(dto);
     }
 

+ 0 - 1
sd-business/src/main/java/com/sd/business/service/inventory/impl/InventoryServiceImpl.java

@@ -92,7 +92,6 @@ public class InventoryServiceImpl extends ServiceImpl<InventoryMapper, Inventory
                 .like(BomSpec::getWidth, dto.getBomSpecWidth())
                 .eq(Bom::getBomClassifyId, dto.getBomClassifyId())
                 .eq(Bom::getSpecies, dto.getBomSpecies())
-                .eq(Bom::getEmbossingProcess, dto.getBomEmbossingProcess())
                 .orderByDesc(Inventory::getId)
                 .page(dto);
     }

+ 46 - 0
sd-business/src/main/java/com/sd/business/service/work/WorkOrderDetailService.java

@@ -0,0 +1,46 @@
+package com.sd.business.service.work;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.service.BaseService;
+import com.sd.business.entity.work.dto.WorkOrderDetailDto;
+import com.sd.business.entity.work.dto.WorkOrderDetailSelectDto;
+import com.sd.business.entity.work.po.WorkOrderDetail;
+import com.sd.business.entity.work.vo.WorkOrderDetailVo;
+
+
+/**
+ * <p>
+ * 生产工单明细 服务类
+ * </p>
+ *
+ * @author
+ * @since 2024-01-02
+ */
+public interface WorkOrderDetailService extends BaseService<WorkOrderDetail> {
+
+    /**
+     * 生产工单明细分页
+     */
+    Page<WorkOrderDetailVo> getPage(WorkOrderDetailSelectDto dto);
+
+    /**
+     * 生产工单明细明细
+     */
+    WorkOrderDetailVo detail(Long id);
+
+    /**
+     * 生产工单明细新增
+     */
+    void add(WorkOrderDetailDto dto);
+
+    /**
+     * 生产工单明细编辑
+     */
+    void edit(WorkOrderDetailDto dto);
+
+    /**
+     * 生产工单明细删除
+     */
+    void delete(Long id);
+
+}

+ 2 - 5
sd-business/src/main/java/com/sd/business/service/work/WorkOrderService.java

@@ -2,13 +2,10 @@ package com.sd.business.service.work;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.core.service.BaseService;
-import com.sd.business.entity.order.po.OrderSku;
 import com.sd.business.entity.work.dto.WorkOrderSelectDto;
 import com.sd.business.entity.work.po.WorkOrder;
 import com.sd.business.entity.work.vo.WorkOrderVo;
 
-import java.util.List;
-
 
 /**
  * <p>
@@ -31,9 +28,9 @@ public interface WorkOrderService extends BaseService<WorkOrder> {
     WorkOrderVo detail(Long id);
 
     /**
-     * 排
+     * 排
      */
-    void scheduling(List<OrderSku> list);
+    void scheduling();
 
 
 }

+ 68 - 0
sd-business/src/main/java/com/sd/business/service/work/impl/WorkOrderDetailServiceImpl.java

@@ -0,0 +1,68 @@
+package com.sd.business.service.work.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sd.business.entity.work.dto.WorkOrderDetailDto;
+import com.sd.business.entity.work.dto.WorkOrderDetailSelectDto;
+import com.sd.business.entity.work.po.WorkOrderDetail;
+import com.sd.business.entity.work.vo.WorkOrderDetailVo;
+import com.sd.business.mapper.work.WorkOrderDetailMapper;
+import com.sd.business.service.work.WorkOrderDetailService;
+import com.sd.framework.util.Assert;
+import com.sd.framework.util.sql.Sql;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * <p>
+ * 生产工单明细 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2024-01-02
+ */
+@Service
+public class WorkOrderDetailServiceImpl extends ServiceImpl<WorkOrderDetailMapper, WorkOrderDetail> implements WorkOrderDetailService {
+
+    @Override
+    public Page<WorkOrderDetailVo> getPage(WorkOrderDetailSelectDto dto) {
+
+        Page<WorkOrderDetailVo> page = Sql.create(WorkOrderDetailVo.class)
+                .selectAll(WorkOrderDetail.class)
+                .from(WorkOrderDetail.class)
+                .orderByDesc(WorkOrderDetail::getId)
+                .page(dto);
+
+        return page;
+    }
+
+    @Override
+    public WorkOrderDetailVo detail(Long id) {
+
+        WorkOrderDetailVo vo = Sql.create(WorkOrderDetailVo.class)
+                .selectAll(WorkOrderDetail.class)
+                .from(WorkOrderDetail.class)
+                .eq(WorkOrderDetail::getId, id)
+                .one();
+
+        Assert.notNull(vo, "未知数据");
+
+        return vo;
+    }
+
+    @Override
+    public void add(WorkOrderDetailDto dto) {
+        save(dto);
+    }
+
+    @Override
+    public void edit(WorkOrderDetailDto dto) {
+        updateById(dto);
+    }
+
+    @Override
+    public void delete(Long id) {
+        removeById(id);
+    }
+
+}

+ 223 - 21
sd-business/src/main/java/com/sd/business/service/work/impl/WorkOrderServiceImpl.java

@@ -1,26 +1,39 @@
 package com.sd.business.service.work.impl;
 
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.HashBasedTable;
+import com.ruoyi.common.constant.StatusConstant;
 import com.ruoyi.common.core.domain.BaseIdPo;
 import com.ruoyi.common.exception.ServiceException;
+import com.sd.business.entity.bom.po.BomSpec;
 import com.sd.business.entity.order.po.OrderSku;
 import com.sd.business.entity.sku.po.SkuSpec;
 import com.sd.business.entity.work.dto.WorkOrderSelectDto;
 import com.sd.business.entity.work.enums.WorkOrderFixationSpecEnum;
 import com.sd.business.entity.work.po.WorkOrder;
+import com.sd.business.entity.work.po.WorkOrderDetail;
 import com.sd.business.entity.work.vo.WorkOrderVo;
 import com.sd.business.mapper.work.WorkOrderMapper;
+import com.sd.business.service.bom.BomSpecService;
+import com.sd.business.service.order.OrderSkuService;
 import com.sd.business.service.sku.SkuSpecService;
+import com.sd.business.service.work.WorkOrderDetailService;
 import com.sd.business.service.work.WorkOrderService;
+import com.sd.business.util.CodeEnum;
 import com.sd.framework.util.Assert;
+import com.sd.framework.util.TransactionUtil;
 import com.sd.framework.util.sql.Sql;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.locks.ReentrantLock;
 import java.util.stream.Collectors;
 
 
@@ -35,8 +48,16 @@ import java.util.stream.Collectors;
 @Service
 public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder> implements WorkOrderService {
 
+    private static final ReentrantLock schedulingLock = new ReentrantLock();
+
     @Autowired
     private SkuSpecService skuSpecService;
+    @Autowired
+    private BomSpecService bomSpecService;
+    @Autowired
+    private OrderSkuService orderSkuService;
+    @Autowired
+    private WorkOrderDetailService workOrderDetailService;
 
     @Override
     public Page<WorkOrderVo> getPage(WorkOrderSelectDto dto) {
@@ -65,45 +86,108 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
     }
 
     @Override
-    public void scheduling(List<OrderSku> list) {
+    public void scheduling() {
+
+        // 查找未排版完成的订单sku
+        List<OrderSku> list = orderSkuService.list(q -> q.eq(OrderSku::getCompleteScheduling, StatusConstant.NO));
 
         if (list.isEmpty()) {
             return;
         }
 
-        // 固定排版订单
-        List<OrderSku> fixationList = new ArrayList<>();
+        // 根据主材和打印纸区分订单sku
+        HashBasedTable<Long, Long, List<OrderSku>> map = HashBasedTable.create();
+        for (OrderSku orderSku : list) {
 
-        // 不固定排版订单
-        List<OrderSku> notFixationList = new ArrayList<>();
+            List<OrderSku> itemList = map.get(orderSku.getBomSpecId(), orderSku.getPrintingPaperBomSpecId());
 
-        List<Long> skuSpecIdList = list.stream().map(OrderSku::getSkuSpecId).collect(Collectors.toList());
-        Map<Long, SkuSpec> skuSpecMap = skuSpecService.mapKEntity(BaseIdPo::getId, q -> q.in(BaseIdPo::getId, skuSpecIdList));
+            if (itemList == null) {
+                itemList = new ArrayList<>();
+                map.put(orderSku.getBomSpecId(), orderSku.getPrintingPaperBomSpecId(), itemList);
+            }
 
-        for (OrderSku orderSku : list) {
-            Long skuSpecId = orderSku.getSkuSpecId();
-            SkuSpec skuSpec = skuSpecMap.get(skuSpecId);
-            boolean fixation = WorkOrderFixationSpecEnum.isFixation(skuSpec.getLength(), skuSpec.getWidth());
+            itemList.add(orderSku);
 
-            if (fixation) {
-                fixationList.add(orderSku);
-            } else {
-                notFixationList.add(orderSku);
+        }
+
+        for (Long bomSpecId : map.rowKeySet()) {
+            for (Long printingPaperBomSpecId : map.columnKeySet()) {
+                List<OrderSku> orderSkuList = map.get(bomSpecId, printingPaperBomSpecId);
+                scheduling(bomSpecId, printingPaperBomSpecId, orderSkuList);
             }
+        }
+
+
+    }
+
+    /**
+     * 排版
+     *
+     * @param bomSpecId              主材规格id
+     * @param printingPaperBomSpecId 打印纸规格id
+     * @param list                   排版列表
+     */
+    private void scheduling(Long bomSpecId, Long printingPaperBomSpecId, List<OrderSku> list) {
+
+
+        boolean b = schedulingLock.tryLock();
 
+        if (!b) {
+            throw new ServiceException("正在排版中,请稍后刷新数据");
         }
 
-        // 固定排版
-        fixationScheduling(skuSpecMap, fixationList);
+        try {
+
+            if (ObjectUtil.isNotEmpty(list)) {
+                return;
+            }
+
+            // 固定排版订单
+            List<OrderSku> fixationList = new ArrayList<>();
+
+            // 不固定排版订单
+            List<OrderSku> notFixationList = new ArrayList<>();
+
+            List<Long> skuSpecIdList = list.stream().map(OrderSku::getSkuSpecId).collect(Collectors.toList());
+            Map<Long, SkuSpec> skuSpecMap = skuSpecService.mapKEntity(BaseIdPo::getId, q -> q.in(BaseIdPo::getId, skuSpecIdList));
+
+            for (OrderSku orderSku : list) {
+                Long skuSpecId = orderSku.getSkuSpecId();
+                SkuSpec skuSpec = skuSpecMap.get(skuSpecId);
+                boolean fixation = WorkOrderFixationSpecEnum.isFixation(skuSpec.getLength(), skuSpec.getWidth());
+
+                if (fixation) {
+                    fixationList.add(orderSku);
+                } else {
+                    notFixationList.add(orderSku);
+                }
+
+            }
+
+            // 固定排版
+            fixationScheduling(bomSpecId, printingPaperBomSpecId, skuSpecMap, fixationList);
+
+            // 非固定排版
+            notFixationScheduling(bomSpecId, printingPaperBomSpecId, skuSpecMap, notFixationList);
+
+        } catch (Exception e) {
+            log.error("排版业务发生异常", e);
+            throw new ServiceException("排版业务发生异常");
+        } finally {
+            schedulingLock.unlock();
+        }
 
     }
 
     /**
      * 固定排版
      */
-    private void fixationScheduling(Map<Long, SkuSpec> skuSpecMap, List<OrderSku> list) {
+    private void fixationScheduling(Long bomSpecId,
+                                    Long printingPaperBomSpecId,
+                                    Map<Long, SkuSpec> skuSpecMap,
+                                    List<OrderSku> list) {
 
-        if (list.isEmpty()) {
+        if (ObjectUtil.isNotEmpty(list)) {
             return;
         }
 
@@ -114,20 +198,138 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
                     if (skuSpec == null) {
                         throw new ServiceException("未知Sku规格");
                     }
+                    if (skuSpec.getLength() == null) {
+                        throw new ServiceException("品号为【" + skuSpec.getCode() + "】的sku未定义长度");
+                    }
+                    if (skuSpec.getWidth() == null) {
+                        throw new ServiceException("品号为【" + skuSpec.getCode() + "】的sku未定义宽度");
+                    }
                     return WorkOrderFixationSpecEnum.getEnum(skuSpec.getLength(), skuSpec.getWidth());
                 }
         ));
 
-        map.forEach(this::doFixationScheduling);
+        map.forEach(((k, v) -> doFixationScheduling(bomSpecId, printingPaperBomSpecId, k, v)));
 
     }
 
     /**
+     * 非固定排版
+     */
+    private void notFixationScheduling(Long bomSpecId,
+                                       Long printingPaperBomSpecId,
+                                       Map<Long, SkuSpec> skuSpecMap,
+                                       List<OrderSku> list) {
+
+        if (ObjectUtil.isNotEmpty(list)) {
+            return;
+        }
+
+        BomSpec bomSpec = bomSpecService.getById(bomSpecId);
+        if (bomSpec == null) {
+            throw new ServiceException("未知主材规格,id:" + bomSpecId);
+        }
+
+        if (bomSpec.getLength() == null) {
+            throw new ServiceException("品号为【" + bomSpec.getCode() + "】的sku未定义长度");
+        }
+        if (bomSpec.getWidth() == null) {
+            throw new ServiceException("品号为【" + bomSpec.getCode() + "】的sku未定义宽度");
+        }
+
+    }
+
+
+    /**
      * 固定排版
      */
-    private void doFixationScheduling(WorkOrderFixationSpecEnum workOrderFixationSpecEnum, List<OrderSku> list) {
+    private void doFixationScheduling(Long bomSpecId,
+                                      Long printingPaperBomSpecId,
+                                      WorkOrderFixationSpecEnum workOrderFixationSpecEnum,
+                                      List<OrderSku> list) {
+
+        // 本次所需排版数量
+        int schedulingNum = workOrderFixationSpecEnum.getMaxNum();
+
+        // 未排单数量
+        int notSchedulingNum = list.stream().map(item -> item.getQuantity().subtract(item.getSchedulingNum()))
+                .reduce(BigDecimal.ZERO, BigDecimal::add).intValue();
+
+        // 如果未排版数量小于本次所需排版数量,则不排单
+        if (notSchedulingNum < schedulingNum) {
+            return;
+        }
+
+        // 生成工单
+        WorkOrder workOrder = new WorkOrder();
+        workOrder.setId(IdWorker.getId());
+        workOrder.setCode(CodeEnum.WORK_ORDER_CODE.getCode());
+        workOrder.setProductionBatchNumber(1);
+        workOrder.setType(1);
+        workOrder.setFixationMaxNum(new BigDecimal(schedulingNum));
+        workOrder.setFixationSpec(workOrderFixationSpecEnum.getLength() + "*" + workOrderFixationSpecEnum.getWidth());
+        workOrder.setMasterBomSpecId(bomSpecId);
+        workOrder.setPrintingPaperBomSpecId(printingPaperBomSpecId);
+        workOrder.setSchedulingNum(new BigDecimal(schedulingNum));
+        workOrder.setSyncProduction(StatusConstant.NO);
+        workOrder.setIntegrity(StatusConstant.NO);
+
+        // 生产工单明细
+        List<WorkOrderDetail> workOrderDetailList = new ArrayList<>();
+
+        for (OrderSku orderSku : list) {
+
+            // 此单未排版数量
+            int itemSchedulingNum = orderSku.getQuantity().subtract(orderSku.getSchedulingNum()).intValue();
+
+            // 未排排数量小于本次所需排版数量
+            if (schedulingNum >= itemSchedulingNum) {
+
+                // 赋值排版数量等于sku数量
+                orderSku.setSchedulingNum(orderSku.getQuantity());
+                orderSku.setCompleteScheduling(StatusConstant.YES);
+
+                for (int i = 0; i < itemSchedulingNum; i++) {
+                    addWorkOrderDetail(workOrder, workOrderDetailList, orderSku);
+                }
+
+                // 重新计算需要排版数量
+                schedulingNum -= itemSchedulingNum;
+            } else {
+                orderSku.setSchedulingNum(new BigDecimal(itemSchedulingNum - schedulingNum));
+                orderSku.setCompleteScheduling(StatusConstant.NO);
+
+                for (int i = 0; i < schedulingNum; i++) {
+                    addWorkOrderDetail(workOrder, workOrderDetailList, orderSku);
+                }
+
+                break;
+            }
+
+        }
+
+        // 保存数据
+        TransactionUtil.execute(() -> {
+            orderSkuService.updateBatchById(list);
+            save(workOrder);
+            workOrderDetailService.saveBatch(workOrderDetailList);
+        });
+
+        // 再次执行判断是否还可以排版
+        doFixationScheduling(bomSpecId, printingPaperBomSpecId, workOrderFixationSpecEnum, list);
+
+    }
+
+
+    private void addWorkOrderDetail(WorkOrder workOrder, List<WorkOrderDetail> workOrderDetailList, OrderSku orderSku) {
+        WorkOrderDetail workOrderDetail = new WorkOrderDetail();
+        workOrderDetail.setProductionBatchNumber(1);
+        workOrderDetail.setWorkOrderId(workOrder.getId());
+        workOrderDetail.setOrderInfoId(orderSku.getOrderId());
+        workOrderDetail.setOrderSkuId(orderSku.getId());
 
+        // todo 赋值 x,y轴
 
+        workOrderDetailList.add(workOrderDetail);
     }
 
 }

+ 2 - 0
sd-business/src/main/java/com/sd/business/util/CodeEnum.java

@@ -30,6 +30,8 @@ public enum CodeEnum {
     OUT_CODE("OS", "-yyMMdd-", "code", 6, InOutStorageService.class),
     // 送货单号
     SH_CODE("SH", "-yyMMddHH-", "delivery_code", 3, OrderInfoService.class),
+    // 工单号
+    WORK_ORDER_CODE("JH", "-yyMMddHH-", "code", 3, OrderInfoService.class),
     ;
 
     // 编码前缀

+ 5 - 0
sd-business/src/main/resources/mapper/work/WorkOrderDetailMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.sd.business.mapper.work.WorkOrderDetailMapper">
+
+</mapper>

+ 6 - 0
sd-framework/pom.xml

@@ -42,6 +42,12 @@
             <version>3.3.2</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>33.0.0-jre</version>
+        </dependency>
+
     </dependencies>
 
 </project>

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

@@ -520,6 +520,7 @@ public class WlnOrderServiceImpl implements WlnOrderService {
             orderSku.setSkuSpecId(skuSpec.getId());
             orderSku.setBomSpecId(skuSpec.getBomSpecId());
             orderSku.setPrintingPaperBomSpecId(skuSpec.getPrintingPaperBomSpecId());
+            orderSku.setCompleteScheduling(StatusConstant.NO);
 
             Long artworkLibraryId = skuSpec.getArtworkLibraryId();