24282 1 rok temu
rodzic
commit
14d34396ef

+ 91 - 20
sd-business/src/main/java/com/sd/business/service/order/impl/OrderInfoServiceImpl.java

@@ -6,7 +6,6 @@ import cn.hutool.core.util.StrUtil;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.file.utils.ObsFileUtil;
@@ -53,6 +52,7 @@ import com.sd.business.entity.sku.po.SkuSpec;
 import com.sd.business.entity.sku.po.SkuSpecLink;
 import com.sd.business.entity.warehouse.constant.WarehouseConstant;
 import com.sd.business.entity.work.constant.MaterialsConstant;
+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.mapper.order.OrderInfoMapper;
@@ -73,6 +73,13 @@ import com.sd.business.service.work.WorkOrderDetailService;
 import com.sd.business.service.work.WorkOrderService;
 import com.sd.business.service.work.impl.WorkOrderServiceImpl;
 import com.sd.business.util.CodeEnum;
+import com.sd.business.util.fixation.CoordinateBo;
+import com.sd.business.util.fixation.FixationFactory;
+import com.sd.business.util.fixation.FixationStrategy;
+import com.sd.business.util.packing.GA;
+import com.sd.business.util.packing.entity.PlaceItem;
+import com.sd.business.util.packing.entity.Solution;
+import com.sd.business.util.packing.model.Item;
 import com.sd.framework.util.Assert;
 import com.sd.framework.util.excel.util.ExcelUtil;
 import com.sd.framework.util.sql.Sql;
@@ -866,34 +873,98 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
         if (list.isEmpty()) {
             return;
         }
-
         workOrderDetailService.remove(q -> q.eq(WorkOrderDetail::getOrderInfoId, id));
 
-        Map<Long, List<WorkOrderDetail>> map = list.stream().collect(Collectors.groupingBy(WorkOrderDetail::getWorkOrderId));
+        Set<Long> workOrderIdSet = list.stream().map(WorkOrderDetail::getWorkOrderId).collect(Collectors.toSet());
+        List<WorkOrder> workOrderList = workOrderService.list(q -> q.in(BaseIdPo::getId, workOrderIdSet));
+
+        List<WorkOrderDetail> workOrderDetailList = workOrderDetailService.list(q -> q.in(WorkOrderDetail::getWorkOrderId, workOrderIdSet));
+        Map<Long, List<WorkOrderDetail>> map = workOrderDetailList.stream().collect(Collectors.groupingBy(WorkOrderDetail::getWorkOrderId));
+
+        for (WorkOrder workOrder : workOrderList) {
+            List<WorkOrderDetail> tempWorkOrderDetailList = map.get(workOrder.getId());
+            if (ObjectUtil.isEmpty(tempWorkOrderDetailList)) {
+                workOrder.setSchedulingNum(BigDecimal.ZERO);
+                workOrder.setUsedArea(BigDecimal.ZERO);
+                workOrder.setUseRatio(BigDecimal.ZERO);
+                workOrder.setMaxLength(BigDecimal.ZERO);
+                workOrderService.updateById(workOrder);
+                continue;
+            }
+
+            // 固定尺寸排版
+            if (Objects.equals(workOrder.getType(), 1)) {
+                WorkOrderDetail workOrderDetail = tempWorkOrderDetailList.get(0);
 
-        // 获取工单
-        List<WorkOrder> workOrderList = workOrderService.list(q -> q.in(BaseIdPo::getId, map.keySet()));
-        Map<Long, WorkOrder> workOrderMap = workOrderList.stream().collect(Collectors.toMap(BaseIdPo::getId, Function.identity()));
+                WorkOrderFixationSpecEnum workOrderFixationSpecEnum = WorkOrderFixationSpecEnum
+                        .getEnum(workOrderDetail.getLength(), workOrderDetail.getLength());
 
-        map.forEach((workOrderId, workOrderDetailList) -> {
-            WorkOrder workOrder = workOrderMap.get(workOrderId);
-            BigDecimal masterLength = ObjectUtil.defaultIfNull(workOrder.getMasterLength(), new BigDecimal(MaterialsConstant.MASTER_LENGTH));
+                FixationStrategy fixationStrategy = FixationFactory.get(workOrderFixationSpecEnum);
 
-            BigDecimal deleteUsedArea = workOrderDetailList.stream().map(item -> item.getBleedingLength().multiply(item.getBleedingWidth())).reduce(BigDecimal.ZERO, BigDecimal::add);
+                for (WorkOrderDetail orderDetail : tempWorkOrderDetailList) {
+                    CoordinateBo coordinateBo = fixationStrategy.next();
+                    orderDetail.setLength(coordinateBo.getLength());
+                    orderDetail.setWidth(coordinateBo.getWidth());
+                    orderDetail.setBleedingLength(coordinateBo.getBleedingLength());
+                    orderDetail.setBleedingWidth(coordinateBo.getBleedingWidth());
+                    orderDetail.setRotate(coordinateBo.getHasRotate() ? StatusConstant.YES : StatusConstant.NO);
+                    orderDetail.setX(coordinateBo.getX());
+                    orderDetail.setY(coordinateBo.getY());
+                }
 
-            Map<String, Object> maxLengthMap = workOrderDetailService.getMap(Wrappers.<WorkOrderDetail>query()
-                    .select("ifnull(max(y+length),0) maxLength")
-                    .eq("work_order_id", workOrderId));
+                workOrder.setSchedulingNum(fixationStrategy.getSchedulingNum());
+                workOrder.setUsedArea(fixationStrategy.getUsedArea());
+                workOrder.setUseRatio(fixationStrategy.getUseRatio());
+                workOrder.setMaxLength(fixationStrategy.getMaxLength());
+            }
 
-            workOrder.setSchedulingNum(workOrder.getSchedulingNum().subtract(new BigDecimal(workOrderDetailList.size())));
-            workOrder.setUsedArea(workOrder.getUsedArea().subtract(deleteUsedArea));
-            workOrder.setUseRatio(workOrder.getUsedArea().multiply(new BigDecimal(100))
-                    .divide(masterLength.multiply(new BigDecimal(MaterialsConstant.MASTER_WIDTH)), 2, RoundingMode.HALF_UP));
-            workOrder.setMaxLength((BigDecimal) maxLengthMap.get("maxLength"));
-        });
+            // 非固定尺寸排版
+            else {
+
+                Item[] items = tempWorkOrderDetailList.stream().map(item -> {
+                    boolean rotate = Objects.equals(item.getRotate(), StatusConstant.YES);
+                    BigDecimal bleedingLength = rotate ? item.getBleedingWidth() : item.getBleedingLength();
+                    BigDecimal bleedingWidth = rotate ? item.getBleedingLength() : item.getBleedingWidth();
+
+                    return new Item(item.getId(), bleedingLength.doubleValue(), bleedingWidth.doubleValue());
+                }).toArray(Item[]::new);
+
+                Solution solve = GA.solve(MaterialsConstant.MASTER_LENGTH, MaterialsConstant.MASTER_WIDTH, items);
+                List<PlaceItem> placeItemList = solve.getPlaceItemList();
+
+                workOrder.setSchedulingNum(new BigDecimal(placeItemList.size()));
+                workOrder.setUsedArea(BigDecimal.valueOf(solve.getTotal()));
+                workOrder.setUseRatio(BigDecimal.valueOf(solve.getUseRatio() * 100));
+                workOrder.setMaxLength(BigDecimal.valueOf(solve.getMaxLength()));
+
+                Map<Long, PlaceItem> collect = placeItemList.stream().collect(Collectors.toMap(PlaceItem::getId, Function.identity()));
+
+                tempWorkOrderDetailList = tempWorkOrderDetailList.stream()
+                        .filter(item -> {
+                            PlaceItem placeItem = collect.get(item.getId());
+                            if (placeItem == null) {
+                                workOrderDetailService.removeById(item.getId());
+                                return false;
+                            }
+                            return true;
+                        })
+                        .peek(item -> {
+                            PlaceItem placeItem = collect.get(item.getId());
+                            item.setX(BigDecimal.valueOf(placeItem.getX()));
+                            item.setY(BigDecimal.valueOf(placeItem.getY()));
+                            item.setLength(BigDecimal.valueOf(placeItem.getLength() - MaterialsConstant.RESERVE));
+                            item.setWidth(BigDecimal.valueOf(placeItem.getWidth() - MaterialsConstant.RESERVE));
+                            item.setBleedingLength(BigDecimal.valueOf(placeItem.getLength()));
+                            item.setBleedingWidth(BigDecimal.valueOf(placeItem.getWidth()));
+                            item.setRotate(placeItem.isRotate() ? StatusConstant.YES : StatusConstant.NO);
+                        })
+                        .collect(Collectors.toList());
+            }
 
-        workOrderService.updateBatchById(workOrderList);
+            workOrderService.updateById(workOrder);
+            workOrderDetailService.updateBatchById(tempWorkOrderDetailList);
 
+        }
     }
 
 }

+ 7 - 0
sd-business/src/main/java/com/sd/business/service/work/impl/WorkOrderServiceImpl.java

@@ -162,6 +162,7 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
                 .selectAs(OrderInfo::getWlnCode, WorkOrderDetailVo::getOrderWlnCode)
                 .selectAs(SkuSpec::getCode, WorkOrderDetailVo::getSkuSpecCode)
                 .selectAs(SkuSpec::getName, WorkOrderDetailVo::getSkuSpecName)
+
                 .from(WorkOrderDetail.class)
                 .leftJoin(OrderInfo.class, WorkOrderDetail::getOrderInfoId)
                 .leftJoin(OrderSku.class, WorkOrderDetail::getOrderSkuId)
@@ -244,6 +245,9 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
                 Assert.notNull(orderSku, "未知订单skuId:" + item);
                 orderSku.setSchedulingNum(orderSku.getSchedulingNum().subtract(BigDecimal.ONE));
                 orderSku.setCompleteScheduling(StatusConstant.NO);
+                if (orderSku.getSchedulingNum().compareTo(BigDecimal.ZERO) < 0) {
+                    throw new ServiceException("订单已排版数量小于0");
+                }
             }
             for (Long item : addOrderSkuIdList) {
                 OrderSku orderSku = map.get(item);
@@ -251,6 +255,9 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
                 orderSku.setSchedulingNum(orderSku.getSchedulingNum().add(BigDecimal.ONE));
                 orderSku.setCompleteScheduling(orderSku.getSchedulingNum().compareTo(orderSku.getQuantity()) == 0
                         ? StatusConstant.YES : StatusConstant.NO);
+                if (orderSku.getSchedulingNum().compareTo(orderSku.getQuantity()) > 0) {
+                    throw new ServiceException("排版数量超过订单数量");
+                }
             }
 
             updateById(dto);

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

@@ -229,7 +229,6 @@ public class GA {
                 bestGenome = copyGenome(genome);
             }
         }
-        System.out.println("初始解为:" + bestGenome.getSolution().getUseRatio());
     }
 
     /**
@@ -246,7 +245,6 @@ public class GA {
         if (compareDouble(tempBest.getFitness(), bestGenome.getFitness()) == 1) {
             bestGenome = copyGenome(tempBest);
             // 最佳迭代次数
-            System.out.println("当前代数: " + t + " : " + bestGenome.getSolution().getUseRatio());
         }
         for (int i = 0; i < cloneNumOfBestIndividual; i++) {
             newPopulation.add(copyGenome(tempBest));