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