diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/OptimizePlanController.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/OptimizePlanController.java index cf9c514ae..d09efbeca 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/OptimizePlanController.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/OptimizePlanController.java @@ -1,9 +1,12 @@ package com.cf.imes.module.executor.controller.admin.plan; +import com.alibaba.fastjson.JSONArray; import com.cf.imes.framework.common.pojo.CommonResult; import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.module.executor.controller.admin.plan.bo.OrderSource; import com.cf.imes.module.executor.controller.admin.plan.bo.PlanProcessSchemeList; +import com.cf.imes.module.executor.controller.admin.plan.component.OptimizationResultsReqVO; +import com.cf.imes.module.executor.controller.admin.plan.component.OrderBoardDosageResultsReqVO; import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.*; import com.cf.imes.module.executor.controller.admin.plan.vo.*; import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderModelDO; @@ -204,5 +207,23 @@ public class OptimizePlanController { } + @PostMapping("/optimize") + @Operation(summary = "保存组件优化结果") + public CommonResult saveComponentOptimizeResult(@Valid @RequestBody OptimizationResultsReqVO reqVO) { + optimizePlanService.saveComponentOptimizationResults(reqVO); + return success(true); + } + @PostMapping("/order/board/dosage") + @Operation(summary = "保存订单计算用板量") + public CommonResult saveOrderBoardDosageResult(@Valid @RequestBody OrderBoardDosageResultsReqVO reqVO) { + optimizePlanService.saveOrderBoardDosage(reqVO); + return success(true); + } + + @GetMapping("/order/board/dosage/{orderId}") + @Operation(summary = "查询订单计算用板量优化结果") + public CommonResult getOrderBoardDosageResult(@PathVariable("orderId") Long orderId) { + return success(optimizePlanService.getOrderBoardDosage(orderId)); + } } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/component/BoardLayoutResultSummary.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/component/BoardLayoutResultSummary.java new file mode 100644 index 000000000..40047a182 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/component/BoardLayoutResultSummary.java @@ -0,0 +1,89 @@ +package com.cf.imes.module.executor.controller.admin.plan.component; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + * + * + * @author Gqr + * @since 2026/5/25 15:00 + */ +@Data +public class BoardLayoutResultSummary { + + /** + * 名称 + */ + private String name; + + /** + * 长度 + */ + private BigDecimal length; + + /** + * 宽度 + */ + private BigDecimal width; + + /** + * 厚度 + */ + private BigDecimal thickness; + + /** + * 大板数量 + */ + private Integer boardCount; + + /** + * 开始开料板数量 + */ + private Integer startCutBoardCount; + + /** + * 结束开料板数量 + */ + private Integer endCutBoardCount; + + /** + * 小板排版间隙 + */ + private BigDecimal gap; + + /** + * 最大可执行修边量 mm + * (排版按此值预留内缩空间,下游修边实际值不得超过此值) + */ + private BigDecimal trimAmount; + + /** + * 所有标准大板的平均利用率 (0~1),不含余料板 + */ + private BigDecimal avgUtilization; + + /** + * 排除末张标准大板后的平均利用率 (0~1) + */ + private BigDecimal avgUtilizationExcludeLast; + + /** + * 末张标准大板的利用率 (0~1) + */ + private BigDecimal lastBoardUtilization; + + /** + * 材料ID列表 + */ + private List materialIds; + + /** + * 已优化排版ID列表 + */ + private List placedBlockIds; + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/component/FlowSessionSavedContent.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/component/FlowSessionSavedContent.java new file mode 100644 index 000000000..90dbf17ee --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/component/FlowSessionSavedContent.java @@ -0,0 +1,29 @@ +package com.cf.imes.module.executor.controller.admin.plan.component; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.util.List; + +/** + * + * + * @author Gqr + * @since 2026/5/25 15:00 + */ +@Data +public class FlowSessionSavedContent { + + /** + * 工序状态 + */ + @NotNull(message = "工序状态不能为空") + private Integer processStatus; + + /** + * 排版结果汇总 + */ + @NotEmpty(message = "排版结果汇总不能为空") + private List layoutResultSummary; +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/component/OptimizationResultsReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/component/OptimizationResultsReqVO.java new file mode 100644 index 000000000..62eae4185 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/component/OptimizationResultsReqVO.java @@ -0,0 +1,23 @@ +package com.cf.imes.module.executor.controller.admin.plan.component; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * + * + * @author Gqr + * @since 2026/5/25 14:55 + */ +@Schema(description = "优化生产 - 组件优化生产结果保存 ReqVO") +@Data +public class OptimizationResultsReqVO { + @Schema(description = "排单ID", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "排单ID不能为空") + private Long planId; + + @Schema(description = "组件优化结果") + @NotNull(message = "优化结果不能为空") + private FlowSessionSavedContent flowSessionSavedContent; +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/component/OrderBoardDosageResultsReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/component/OrderBoardDosageResultsReqVO.java new file mode 100644 index 000000000..dec68da9c --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/component/OrderBoardDosageResultsReqVO.java @@ -0,0 +1,22 @@ +package com.cf.imes.module.executor.controller.admin.plan.component; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * + * + * @author Gqr + * @since 2026/5/25 14:55 + */ +@Schema(description = "优化生产 - 订单计算用板量结果保存 ReqVO") +@Data +public class OrderBoardDosageResultsReqVO { + @Schema(description = "订单ID", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "订单ID不能为空") + private Long orderId; + + @Schema(description = "组件优化结果") + private FlowSessionSavedContent flowSessionSavedContent; +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlanRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlanRespVO.java index 4a0386263..acc2ec196 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlanRespVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlanRespVO.java @@ -81,12 +81,12 @@ public class PlanRespVO { private LocalDateTime produceTime; - @Schema(description = "大板总数") - private Long goodsCount; + @Schema(description = "已排大板总数") + private Long scheduledBoardNum; @Schema(description = "已开料的大板片数") - private Long cutGoodsCount; + private Long cuttedBoardNum; @Schema(description = "总小板片数") @@ -98,7 +98,8 @@ public class PlanRespVO { @Schema(description = "已优化小板片数") - private Long optimizePlateCount; - + private Long optimizedPlateNum; + @Schema(description = "已开小板片数") + private Long cuttedPlateNum; } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/order/OrderDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/order/OrderDO.java index 3a521b09b..0cac39fce 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/order/OrderDO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/order/OrderDO.java @@ -167,4 +167,10 @@ public class OrderDO extends BaseDO { */ @TableField(exist = false) private List child; + + /** + * 计算用板量优化结果 + */ + @TableField(typeHandler = CompressStringTypeHandler.class) + private String boardDosageResult; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/plan/PlanDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/plan/PlanDO.java index 18e3cf903..432d66f29 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/plan/PlanDO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/plan/PlanDO.java @@ -111,4 +111,29 @@ public class PlanDO extends BaseDO { * 板材商品id */ private String goodsId; + + /** + * 已优化板件数 + */ + private Integer optimizedPlateNum; + + /** + * 板件数 + */ + private Integer plateNum; + + /** + * 已排大板数 + */ + private Integer scheduledBoardNum; + + /** + * 已开料大板数 + */ + private Integer cuttedBoardNum; + + /** + * 已开板件数量 + */ + private Integer cuttedPlateNum; } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/plate/PlateDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/plate/PlateDO.java index e4b84c111..14388ef59 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/plate/PlateDO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/plate/PlateDO.java @@ -212,11 +212,6 @@ public class PlateDO extends BaseDO { */ private Long planId; - /** - * cad图纸数据 - */ - private String cadData; - /** * cad自定义板编号 */ diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateMapper.java index df9bc82d0..6cb6ec837 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateMapper.java @@ -402,4 +402,39 @@ public interface PlateMapper extends BaseMapperX { * @return */ List selectPlateGoodsByIds(@Param("orderIds") List orderIds, @Param("plateIds") List plateIds, @Param("deleted") boolean deleted); + + /** + * 更新计划板件优化状态 + * + * @param planId + * @param orderIds + * @return + */ + int updatePlanPlateOptimizeStatus(@Param("planId") Long planId, @Param("orderIds") List orderIds, @Param("plateNos") List plateNoList); + + /** + * 更新计划板件开料状态 + * + * @param planId + * @param orderIds + * @return + */ + int updatePlanPlateCutStatus(@Param("planId") Long planId, @Param("orderIds") List orderIds, @Param("plateNos") List plateNoList); + + /** + * 根据板件id列表查询板件信息 + * + * @param orderIds + * @param orderIds + * @return + */ + int resetPlanPlateOptimizeStatus(@Param("planId") Long planId, @Param("orderIds") List orderIds); + + /** + * 查询排单下已全部开料的订单id列表 + * + * @param planId + * @return + */ + List selectPlanAllCuttedOrderIdList(@Param("planId") Long planId); } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/enums/plan/FlowProcessStatus.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/enums/plan/FlowProcessStatus.java new file mode 100644 index 000000000..b202d4f92 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/enums/plan/FlowProcessStatus.java @@ -0,0 +1,34 @@ +package com.cf.imes.module.executor.enums.plan; + +import lombok.Getter; + +/** + * + * + * @author Gqr + * @since 2026/5/25 15:01 + */ +@Getter +public enum FlowProcessStatus { + + /** + * 未开始 - 未生产/未开料 + */ + NOT_STARTED(1), + + /** + * 进行中 - 生产中/开始开料中 + */ + IN_PROGRESS(2), + + /** + * 已完成 - 生产完成/结束开料 + */ + COMPLETED(3); + + private final Integer status; + + FlowProcessStatus(Integer status) { + this.status = status; + } +} \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanService.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanService.java index 1a27971d7..3a6ffae83 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanService.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanService.java @@ -1,8 +1,11 @@ package com.cf.imes.module.executor.service.optimizeplan; +import com.alibaba.fastjson.JSONArray; import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.module.executor.controller.admin.plan.bo.OrderSource; import com.cf.imes.module.executor.controller.admin.plan.bo.PlanProcessSchemeList; +import com.cf.imes.module.executor.controller.admin.plan.component.OptimizationResultsReqVO; +import com.cf.imes.module.executor.controller.admin.plan.component.OrderBoardDosageResultsReqVO; import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.*; import com.cf.imes.module.executor.controller.admin.plan.vo.*; import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderModelDO; @@ -50,4 +53,26 @@ public interface OptimizePlanService { void updateProcessSchemeConfig(PlanSchemeConfigReqVO reqVO); PageResult getGoodsPlateDataFilter(FilterDataPageReqVO pageReqVO); + + /** + * 保存组件优化结果 + * + * @param reqVO + */ + void saveComponentOptimizationResults(OptimizationResultsReqVO reqVO); + + /** + * 保存订单计算用板量结果 + * + * @param reqVO + */ + void saveOrderBoardDosage(OrderBoardDosageResultsReqVO reqVO); + + /** + * 获取订单计算用板量结果 + * + * @param orderId + * @return + */ + JSONArray getOrderBoardDosage(Long orderId); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java index d293c8080..ee0b7752c 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java @@ -22,10 +22,13 @@ import co.elastic.clients.json.JsonData; import co.elastic.clients.json.JsonpMappingException; import com.alibaba.cloud.commons.lang.StringUtils; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; +import com.cf.imes.framework.common.enums.DeletedCodeEnum; import com.cf.imes.framework.common.enums.OrderPlateCutStatusEnum; import com.cf.imes.framework.common.enums.OrderStatusEnum; import com.cf.imes.framework.common.enums.PlanStatusEnum; @@ -37,15 +40,16 @@ import com.cf.imes.framework.common.util.json.JsonUtils; import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.es.core.service.ESDocumentService; import com.cf.imes.framework.mybatis.core.query.QueryWrapperX; -import com.cf.imes.framework.security.core.LoginUser; -import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; -import com.cf.imes.module.executor.controller.admin.orderParts.vo.OrderPartsRemark; import com.cf.imes.module.executor.controller.admin.plan.bo.OrderIds; import com.cf.imes.module.executor.controller.admin.plan.bo.OrderSource; import com.cf.imes.module.executor.controller.admin.plan.bo.PlanProcessSchemeList; -import com.cf.imes.module.executor.controller.admin.plan.bo.ProcessGroupList; +import com.cf.imes.module.executor.controller.admin.plan.component.BoardLayoutResultSummary; +import com.cf.imes.module.executor.controller.admin.plan.component.FlowSessionSavedContent; +import com.cf.imes.module.executor.controller.admin.plan.component.OptimizationResultsReqVO; +import com.cf.imes.module.executor.controller.admin.plan.component.OrderBoardDosageResultsReqVO; import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.*; import com.cf.imes.module.executor.controller.admin.plan.vo.*; +import com.cf.imes.module.executor.dal.dataobject.goods.GoodsDO; import com.cf.imes.module.executor.dal.dataobject.goods.OptimizeBoardModelDO; import com.cf.imes.module.executor.dal.dataobject.goods.PlanActualGoodsModelDO; import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; @@ -67,6 +71,7 @@ import com.cf.imes.module.executor.dal.mysql.plate.PlateGoodMapper; import com.cf.imes.module.executor.dal.mysql.plate.PlateMapper; import com.cf.imes.module.executor.dal.mysql.remainplaten.RemainPlateMapper; import com.cf.imes.module.executor.enums.ErrorCodeConstants; +import com.cf.imes.module.executor.enums.plan.FlowProcessStatus; import com.cf.imes.module.executor.util.elasticsearch.EsUtils; import com.cf.imes.module.system.api.dataSource.DataSourceApi; import com.cf.imes.module.system.api.machine.MachineApi; @@ -1775,50 +1780,226 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { } - - - - private void validatePlanStatus(PlanDO planDO,List isLocks){ - - if(planDO.getStatus().equals(PlanStatusEnum.OPENING.getStatus()) || planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus())){ - throw new ServiceException(PLAN_PLATE_IS_CUT); - } - - LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); - assert loginUser != null; - - Boolean data = permissionApi.hasAnyPermissions(loginUser.getId(), "placeorder:list").getCheckedData(); - - if(Boolean.TRUE.equals(planDO.getIsScheduled()) && isLocks.contains(true) && Boolean.FALSE.equals(data)){ - throw new ServiceException(PLAN_PROCESS_SCHEME_IS_LOCK); - } - - } - /** - * 拆分list,每个1000条 + * 重置优化状态 * - * @param dataList - * @param - * @return + * @param planId + * @param orderIds */ - private List> batchProcess(List dataList) { - List> resultList = new ArrayList<>(); - if (CollUtil.isEmpty(dataList)) { - return resultList; - } + private void resetPlanPlateOptimizeStatus(Long planId, List orderIds) { + int updatedCount; + do { + // 执行批量更新,每次最多更新1000条 + updatedCount = plateMapper.resetPlanPlateOptimizeStatus(planId, orderIds); - int total = dataList.size(); - for (int i = 0; i < total; i += 1000) { - int end = Math.min(i + 1000, total); - List subList = dataList.subList(i, end); - - if (!subList.isEmpty()) { - resultList.add(subList); + // 如果本次有更新,则继续下一轮 + if (updatedCount > 0) { + try { + // 100毫秒延迟 + Thread.sleep(100); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new RuntimeException("轮询更新被中断", e); + } } - } - return resultList; + } while (updatedCount > 0); // 当返回0时表示没有更多记录需要更新 + + // 重置排单的已优化数量 + planMapper.update(new LambdaUpdateWrapper() + .eq(PlanDO::getId, planId) + .eq(PlanDO::getDeleted, DeletedCodeEnum.NOT_DELETED.getStatus()) + .set(PlanDO::getOptimizedPlateNum, 0) + ); } + @Override + public void saveComponentOptimizationResults(OptimizationResultsReqVO reqVO) { + Long planId = reqVO.getPlanId(); + // todo 判空 + Integer processStatus = reqVO.getFlowSessionSavedContent().getProcessStatus(); + List layoutResultSummary = reqVO.getFlowSessionSavedContent().getLayoutResultSummary(); + PlanDO planDO = planMapper.selectById(planId); + AssertUtils.notEmpty(planDO, ORDER_PLAN_DATA_ERROR); + + // 校验订单信息和获取 orderId + String orderNos = Optional.ofNullable(planDO.getOrderNos()).orElseThrow(() -> new ServiceException(ORDER_PLAN_ORDERS_EMPTY)); + List orderIds = new ArrayList<>(JSON.parseArray(orderNos).toJavaList(Long.class).stream().distinct().toList()); + + // 完成优化排版 + if (FlowProcessStatus.NOT_STARTED.getStatus().equals(processStatus)) { + if(planDO.getStatus().equals(PlanStatusEnum.OPENING.getStatus()) || planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus())){ + throw new ServiceException(PLAN_PLATE_IS_CUT); + } + // 重置优化状态 + resetPlanPlateOptimizeStatus(planId, orderIds); + if (CollUtil.isNotEmpty(layoutResultSummary)) { + List optimizatePlateNoList = layoutResultSummary.stream().flatMap(summary -> summary.getPlacedBlockIds().stream()).toList(); + // 已排大板数量 + int boardCount = layoutResultSummary.stream().mapToInt(BoardLayoutResultSummary::getBoardCount).sum(); + + // 更新参与优化的板材的优化状态 + int updatedCount; + int optimizedCount = 0; + do { + // 执行批量更新,每次最多更新1000条 + updatedCount = plateMapper.updatePlanPlateOptimizeStatus(planId, orderIds, optimizatePlateNoList); + optimizedCount += updatedCount; + + // 如果本次有更新,则继续下一轮 + if (updatedCount > 0) { + try { + // 100毫秒延迟 + Thread.sleep(100); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new RuntimeException("轮询更新被中断", e); + } + } + } while (updatedCount > 0); // 当返回0时表示没有更多记录需要更新 + + if (optimizedCount > 0) { + planMapper.update(new LambdaUpdateWrapper() + .eq(PlanDO::getId, planId) + .eq(PlanDO::getDeleted, DeletedCodeEnum.NOT_DELETED.getStatus()) + .set(PlanDO::getOptimizedPlateNum, optimizedCount) + .set(PlanDO::getScheduledBoardNum, boardCount) + ); + } + } + + } + + // 开始开料 + if (FlowProcessStatus.IN_PROGRESS.getStatus().equals(processStatus)) { + if (planDO.getStatus().equals(PlanStatusEnum.OPENING.getStatus()) || planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus())) { + throw new ServiceException(PLAN_PLATE_IS_CUT); + } + + List orderDOS = orderMapper.selectByIds(orderIds); + AssertUtils.notEmpty(orderDOS, ORDER_PLAN_ORDERS_EMPTY); + + orderDOS.forEach(f -> f.setStatus(OrderStatusEnum.IN_PRODUCTION.getStatus())); + orderMapper.updateBatch(orderDOS); + + // 更新排单状态 + planMapper.update(new LambdaUpdateWrapper() + .eq(PlanDO::getId, planId) + .eq(PlanDO::getDeleted, DeletedCodeEnum.NOT_DELETED.getStatus()) + .set(PlanDO::getStatus, PlanStatusEnum.OPENING.getStatus()) + .set(PlanDO::getProduceTime, null) + ); + + } + + + // 结束开料 + if (FlowProcessStatus.COMPLETED.getStatus().equals(processStatus)) { + if (planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus())) { + throw new ServiceException(PLAN_OPTIMIZE_DATA_ALL_OPENED); + } + List optimizatePlateNoList = layoutResultSummary.stream().flatMap(summary -> summary.getPlacedBlockIds().stream()).toList(); + // 累计开料大板数量 + int endCutBoardCount = layoutResultSummary.stream().mapToInt(BoardLayoutResultSummary::getEndCutBoardCount).sum(); + + // 更新开料状态 + int updatedCount; + int cuttedCount = 0; + do { + // 执行批量更新,每次最多更新1000条 + updatedCount = plateMapper.updatePlanPlateCutStatus(planId, orderIds, optimizatePlateNoList); + cuttedCount += updatedCount; + + // 如果本次有更新,则继续下一轮 + if (updatedCount > 0) { + try { + // 100毫秒延迟 + Thread.sleep(100); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new RuntimeException("轮询更新被中断", e); + } + } + } while (updatedCount > 0); // 当返回0时表示没有更多记录需要更新 + + // 查询已全部开料的订单号 + List allCuttedOrderIdList = plateMapper.selectPlanAllCuttedOrderIdList(planId); + + // 更新已全部开料和全部打包的订单为生产完成 + if (CollUtil.isNotEmpty(allCuttedOrderIdList)) { + // 查询订单的打包状态是否为已打包 + List orderDOS = orderMapper.selectOrderPackList(orderIds, getUserOrganId()); + if (CollUtil.isNotEmpty(orderDOS)) { + orderDOS.forEach(f -> { + f.setStatus(OrderStatusEnum.FINISH_PRODUCTION.getStatus()); + f.setFinishTime(LocalDateTime.now()); + }); + + orderMapper.updateBatch(orderDOS); + } + } + + // 更新排单状态 + planMapper.update(new LambdaUpdateWrapper() + .eq(PlanDO::getId, planId) + .eq(PlanDO::getDeleted, DeletedCodeEnum.NOT_DELETED.getStatus()) + .set(PlanDO::getStatus, PlanStatusEnum.OPENED.getStatus()) + .set(PlanDO::getProduceTime, LocalDateTime.now()) + .set(PlanDO::getCuttedBoardNum, endCutBoardCount) + .set(PlanDO::getCuttedPlateNum, cuttedCount) + ); + } + } + + @Override + public void saveOrderBoardDosage(OrderBoardDosageResultsReqVO reqVO) { + Long orderId = reqVO.getOrderId(); + OrderDO orderDO = orderMapper.selectById(orderId); + + AssertUtils.notEmpty(orderDO,ORDER_NOT_EXISTS); + + // 从优化结果中取order_goods_id来获取大板材质 + FlowSessionSavedContent flowSessionSavedContent = reqVO.getFlowSessionSavedContent(); + List layoutResultSummary = flowSessionSavedContent.getLayoutResultSummary(); + if (CollUtil.isEmpty(layoutResultSummary)) { + throw new RuntimeException(); + } + + JSONArray orderBoardDosageJsonArr = new JSONArray(); + for (BoardLayoutResultSummary summary : layoutResultSummary) { + List materialIds = summary.getMaterialIds(); + if(CollUtil.isEmpty(materialIds)) { + continue; + } + Long orderGoodsId = materialIds.get(0); + GoodsDO goodsDO = goodsMapper.selectById(orderGoodsId); + + // 提取大板计算数据 + JSONObject orderBoardDosageJSON = new JSONObject(); + orderBoardDosageJSON.put("avgUtilization", summary.getAvgUtilization()); // 平均利用率 + orderBoardDosageJSON.put("avgUtilizationExcludeLast", summary.getAvgUtilizationExcludeLast()); // 排除末张标准大板后的平均利用率 + orderBoardDosageJSON.put("trimAmount", summary.getTrimAmount()); // 最大可执行修边量 + orderBoardDosageJSON.put("boardCount", summary.getBoardCount()); // 排版大板数量 + orderBoardDosageJSON.put("gap", summary.getGap()); // 小板排版间隙 + orderBoardDosageJSON.put(FIELD_GOODS_ID, goodsDO.getGoodsId()); // 商品编号 + orderBoardDosageJSON.put("name", summary.getName()); // 大板名称 + orderBoardDosageJSON.put("length", summary.getLength()); // 长 + orderBoardDosageJSON.put("width", summary.getWidth()); // 宽 + orderBoardDosageJSON.put("thickness", summary.getThickness()); // 厚度 + orderBoardDosageJsonArr.add(orderBoardDosageJSON); + } + + OrderDO update = new OrderDO(); + update.setId(orderId); + update.setBoardDosageResult(orderBoardDosageJsonArr.toJSONString()); + orderMapper.updateById(update); + } + + @Override + public JSONArray getOrderBoardDosage(Long orderId) { + OrderDO orderDO = orderMapper.selectById(orderId); + + AssertUtils.notEmpty(orderDO, ORDER_NOT_EXISTS); + return JSON.parseArray(orderDO.getBoardDosageResult()); + } } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanServiceImpl.java index 417064bef..ab10f64ea 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanServiceImpl.java @@ -14,12 +14,10 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; import com.cf.imes.framework.common.enums.*; import com.cf.imes.framework.common.exception.ServiceException; -import com.cf.imes.framework.common.pojo.PageParam; import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.common.util.Assert.AssertUtils; import com.cf.imes.framework.common.util.date.LocalDateTimeUtils; import com.cf.imes.framework.common.util.object.BeanUtils; -import com.cf.imes.framework.es.core.service.ESDocumentService; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.framework.mybatis.core.query.QueryWrapperX; import com.cf.imes.framework.security.core.LoginUser; @@ -28,7 +26,6 @@ import com.cf.imes.module.executor.controller.admin.goods.vo.GoodsRespVO; import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPlanPlateNumAndAreaRespVO; import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderRespVO; import com.cf.imes.module.executor.controller.admin.plan.bo.OrderRoomBodyList; -import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.PlatePlaceInfo; import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.RemainBoardInfo; import com.cf.imes.module.executor.controller.admin.plan.vo.*; import com.cf.imes.module.executor.controller.admin.plate.vo.OrderPlateIds; @@ -53,8 +50,6 @@ import com.cf.imes.module.executor.enums.ErrorCodeConstants; import com.cf.imes.module.executor.enums.OrderPlanQueryTypeEnum; import com.cf.imes.module.executor.enums.OrderStatusEnum; import com.cf.imes.module.executor.util.elasticsearch.EsUtils; -import com.cf.imes.module.system.api.systemconfig.SystemConfigApi; -import com.cf.imes.module.system.api.systemconfig.dto.SystemConfigRespDTO; import lombok.extern.slf4j.Slf4j; import org.springframework.aop.framework.AopContext; import org.springframework.stereotype.Service; @@ -66,18 +61,14 @@ import jakarta.annotation.Resource; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.*; -import java.util.concurrent.atomic.AtomicLong; import java.util.stream.Collectors; import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.DATA_DATA_ERROR; -import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.ES_DATA_ERROR; import static com.cf.imes.framework.common.util.json.JsonUtils.parseArray; -import static com.cf.imes.framework.common.util.json.JsonUtils.toJsonString; import static com.cf.imes.framework.common.util.string.SearchUtil.insertSeparator; import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.*; import static com.cf.imes.module.executor.enums.EsIndexEnum.*; -import static com.cf.imes.module.system.enums.ErrorCodeConstants.*; /** * 订单开料排单 Service 实现类 @@ -107,9 +98,6 @@ public class PlanServiceImpl implements PlanService { @Resource private PlateMapper plateMapper; - @Resource - private SystemConfigApi systemConfigApi; - @Resource private OrderBodyMapper orderBodyMapper; @@ -122,9 +110,6 @@ public class PlanServiceImpl implements PlanService { @Resource private ElasticsearchClient elasticsearchClient; - @Resource - private ESDocumentService esDocumentService; - @Resource private EsUtils esUtils; @@ -234,7 +219,7 @@ public class PlanServiceImpl implements PlanService { // 删除小板 List deleteOrderPlateIds = Optional.ofNullable(updateReqVO.getDeleteOrderPlateIds()).orElse(new ArrayList<>()); - if(CollUtil.isNotEmpty(deleteOrderPlateIds)){ + if (CollUtil.isNotEmpty(deleteOrderPlateIds)) { PlanServiceImpl p = (PlanServiceImpl) AopContext.currentProxy(); p.deletePlanPlate(deleteOrderPlateIds); @@ -248,10 +233,10 @@ public class PlanServiceImpl implements PlanService { PlanActualGoodsModelDO planActualGoodsModelDO = updateReqVO.getPlanActualGoodsModelDO(); - if(CollUtil.isNotEmpty(insertOrderPlateIds)){ + if (CollUtil.isNotEmpty(insertOrderPlateIds)) { PlanServiceImpl p = (PlanServiceImpl) AopContext.currentProxy(); - p.insertPlanPlate(insertOrderPlateIds,planActualGoodsModelDO); + p.insertPlanPlate(insertOrderPlateIds, planActualGoodsModelDO); } @@ -264,12 +249,12 @@ public class PlanServiceImpl implements PlanService { // 校验存在 List planDOS = planMapper.selectBatchIds(planIds); - AssertUtils.notEmpty(planDOS,PLAN_NOT_EXISTS); + AssertUtils.notEmpty(planDOS, PLAN_NOT_EXISTS); // 获取排单下的订单号集合 - planDOS.forEach(f->{ - if ( f.getStatus().equals(PlanStatusEnum.OPENING.getStatus()) || f.getStatus().equals(PlanStatusEnum.OPENED.getStatus()) ) { - throw new ServiceException(PLAN_NOT_ALLOW_DELETE,f.getId()); + planDOS.forEach(f -> { + if (f.getStatus().equals(PlanStatusEnum.OPENING.getStatus()) || f.getStatus().equals(PlanStatusEnum.OPENED.getStatus())) { + throw new ServiceException(PLAN_NOT_ALLOW_DELETE, f.getId()); } }); @@ -287,7 +272,7 @@ public class PlanServiceImpl implements PlanService { if (!plateDOS.isEmpty()) { List plateIdList = plateDOS.stream().map(PlateDO::getId).toList(); - plateMapper.deleteBatchIds(plateIdList); + plateMapper.deleteByIds(plateIdList); orderItemMapper.delete(new LambdaQueryWrapperX() .eq(OrderItemDO::getOrganId, getUserOrganId()) @@ -295,21 +280,6 @@ public class PlanServiceImpl implements PlanService { .in(OrderItemDO::getPlateId, plateIdList)); } - - // 排单对应的优化数据删除 - esUtils.deleteEsDocument(FIELD_PLANID, planIds, ORDER_OPTIMIZE_PLATE_MODEL.getIndex()); - - - // 删除排单对应的加工方案的优化数据 - esUtils.deleteEsDocument(FIELD_PLANID, planIds, PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL.getIndex()); - - - // 删除排单对应的加工方案组的配置信息 - esUtils.deleteEsDocument(FIELD_PLANID, planIds, PLAN_PROCESS_SCHEME_CONFIG.getIndex()); - - // 去除订单板材造型对应的排单ID -// removePlateModelPlanId(orderIds,planIds,new ArrayList<>()); - } /** @@ -423,11 +393,6 @@ public class PlanServiceImpl implements PlanService { // 查询排单对应的大板板材信息以及 统计小板数量和面积 List plateInfoVOS = planItemMapper.selectOrderPlanPlateList(planIds, getUserOrganId()); - - // 根据排单ID查询ES中的优化数据 - List optimizeBoardModelDOS = esUtils.getEsDocument(FIELD_PLANID, planIds, 500, ORDER_OPTIMIZE_PLATE_MODEL.getIndex(), OptimizeBoardModelDO.class); - - // 获取排单对应的订单的信息 List planOrderRespVOS = orderMapper.selectPlanOrderList(planIds, getUserOrganId()); @@ -438,16 +403,8 @@ public class PlanServiceImpl implements PlanService { planRespVOPageResult.forEach(e -> { // 大板信息列表 e.setPlateInfoList(getPlateInfoList(e.getId(), plateInfoVOS)); - // 小板的总数量 - e.setPlateNum(getPlateNum(e.getId(), plateInfoVOS)); - // 大板总数量 - e.setGoodsCount(getOptimizeGoodsCount(e.getId(), optimizeBoardModelDOS)); - // 大板开料数 - e.setCutGoodsCount(getCutGoodsCount(e.getId(), optimizeBoardModelDOS)); - // 小板优化数量 - e.setOptimizePlateCount(getOptimizePlateCount(e.getId(), optimizeBoardModelDOS)); // 未优化小板数量 - e.setUnOptimizePlateCount(e.getPlateNum() - e.getOptimizePlateCount()); + e.setUnOptimizePlateCount(e.getPlateNum() - e.getOptimizedPlateNum()); // 订单信息 e.setOrderList(getOrderList(e.getId(), planOrderRespVOS)); }); @@ -468,15 +425,8 @@ public class PlanServiceImpl implements PlanService { return new ArrayList<>(); } - - List processIds = planDOList.stream().map(PlanDO::getProcessId).distinct().toList(); - List planIds = planDOList.stream().map(PlanDO::getId).toList(); - - List configDOS = systemConfigApi.getProcessByIds(processIds).getCheckedData(); - - // 查询排单对应的大板板材信息 List plateInfoVOS = goodsMapper.selectOrderGoodsPlateList(planIds, getUserOrganId()); @@ -493,10 +443,6 @@ public class PlanServiceImpl implements PlanService { }); } - // 根据排单ID查询ES中的优化数据 - List optimizeBoardModelDOS = esUtils.getEsDocument(FIELD_PLANID, planIds, planIds.size(), ORDER_OPTIMIZE_PLATE_MODEL.getIndex(), OptimizeBoardModelDO.class); - - // 获取排单对应的订单的信息 List planOrderRespVOS = orderMapper.selectPlanOrderList(planIds, getUserOrganId()); @@ -509,14 +455,8 @@ public class PlanServiceImpl implements PlanService { e.setPlateInfoList(getPlateInfoList(e.getId(), plateInfoVOS)); // 小板总数量 e.setPlateNum(getPlateNum(e.getId(), plateInfoVOS)); - // 大板总数量 - e.setGoodsCount(getOptimizeGoodsCount(e.getId(), optimizeBoardModelDOS)); - // 大板开料数 - e.setCutGoodsCount(getCutGoodsCount(e.getId(), optimizeBoardModelDOS)); - // 小板优化数量 - e.setOptimizePlateCount(getOptimizePlateCount(e.getId(), optimizeBoardModelDOS)); // 未优化小板数量 - e.setUnOptimizePlateCount(e.getPlateNum() - e.getOptimizePlateCount()); + e.setUnOptimizePlateCount(e.getPlateNum() - e.getOptimizedPlateNum()); // 订单信息 e.setOrderList(getOrderList(e.getId(), planOrderRespVOS)); }); @@ -1019,15 +959,13 @@ public class PlanServiceImpl implements PlanService { } - - - private List validatePlanExists(List planIds ) { + private List validatePlanExists(List planIds) { List planDOS = new ArrayList<>(); for (Long planId : planIds) { PlanDO planDO = planMapper.selectById(planId); - if(ObjectUtils.isEmpty(planDO)){ - throw new ServiceException(PLAN_NOT_DATA_EXISTS,planId); + if (ObjectUtils.isEmpty(planDO)) { + throw new ServiceException(PLAN_NOT_DATA_EXISTS, planId); } planDOS.add(planDO); } @@ -1138,25 +1076,7 @@ public class PlanServiceImpl implements PlanService { List deletePlanIds = deleteOrderPlateIds.stream().map(OrderPlateIds::getPlanId).distinct().toList(); - List planDOS = validatePlanExists(deletePlanIds); - - List processIds = new ArrayList<>(); - planDOS.forEach(f->{ - if (f.getStatus().equals(PlanStatusEnum.OPENED.getStatus())) { - throw new ServiceException(PLAN_PLATE_IS_ALL_CUT,f.getId()); - } - processIds.add(Optional.ofNullable(f.getProcessId()).orElseThrow(() -> new ServiceException(PLAN_PROCESS_CONFIG_IS_NULL,f.getId()))); - }); - - Integer processSize = systemConfigApi.getProcessSizeByIds(processIds).getCheckedData(); - - for (PlanDO planDO : planDOS) { - if (planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus())) { - throw new ServiceException(PLAN_PLATE_IS_ALL_CUT,planDO.getId()); - } - } - - + validatePlanExists(deletePlanIds); List plateStatus = Arrays.asList(OrderPlateCutStatusEnum.OPENING.getStatus(),OrderPlateCutStatusEnum.OPENED.getStatus()); @@ -1169,7 +1089,7 @@ public class PlanServiceImpl implements PlanService { AssertUtils.notEmpty(deleteOrderIds, DELETE_PLAN_PLATE_DATA_ERROR); // 查询需要删除的小板对应的信息 - List plateDOS = plateMapper.selectBatchIds(deletePlateIds); + List plateDOS = plateMapper.selectByIds(deletePlateIds); AssertUtils.notEmpty(plateDOS, DELETE_PLAN_PLATE_DATA_ERROR); @@ -1180,63 +1100,12 @@ public class PlanServiceImpl implements PlanService { // 移除排单板件 & 重新计算订单和材质下的数量和面积 removePlanOrderAndGoodsPlate(plateDOS, deleteOrderIds); - // 删除优化生产中未开料的小板的优化数据 - List optimizeBoardModelDOS = esUtils.getEsDocument(FIELD_PLANID, deletePlanIds, processSize, ORDER_OPTIMIZE_PLATE_MODEL.getIndex(), OptimizeBoardModelDO.class); - - if(CollUtil.isNotEmpty(optimizeBoardModelDOS)){ - - - List plateNo = plateDOS.stream().map(PlateDO::getPlateNo).toList(); - - optimizeBoardModelDOS.forEach(f->{ - - String blockPlaceInfo = Optional.ofNullable(f.getBlockPlaceInfo()).orElseThrow(() -> new ServiceException(ORDER_PLAN_OPTIMIZE_ERROR)); - - String remainBoardInfo = Optional.ofNullable(f.getRemainBoardInfo()).orElseThrow(() -> new ServiceException(ORDER_PLAN_OPTIMIZE_ERROR)); - - List asJsonObject = new ArrayList<>(parseArray(blockPlaceInfo,PlatePlaceInfo.class)); - - List platePlaceInfos = asJsonObject.stream() - .filter(fi -> !plateNo.contains(fi.getBo())) - .toList(); - - f.setBlockPlaceInfo(toJsonString(platePlaceInfos)); - f.setPlaceBlockNumber((long) platePlaceInfos.size()); - - - List remainBoardInfos = new ArrayList<>(parseArray(remainBoardInfo, RemainBoardInfo.class)); - - remainBoardInfos.forEach(r->{ - r.getPlaceBoardList().forEach(p->{ - p.setBlocks(p.getBlocks().stream() - .filter(bl->!plateNo.contains(bl.getBlockId())) - .toList()); - }); - }); - - f.setRemainBoardInfo(toJsonString(remainBoardInfos)); - - - }); - - try { - - esDocumentService.bulkUpdate(ORDER_OPTIMIZE_PLATE_MODEL.getIndex(), optimizeBoardModelDOS); - - }catch (Exception e){ - log.error(e.getMessage(), e); - throw new ServiceException(ES_DATA_ERROR); - } - - - } - // 删除已无排单板件的排单 List deleteEmptyPlanIdList = planMapper.countDeletePlanPlate(deletePlanIds, deleteOrderIds, organId) .stream().filter(m -> m.getCount() == 0).map(OrderPlanPlateStatisticsRespVO::getPlanId).distinct().collect(Collectors.toList()); if (CollUtil.isNotEmpty(deleteEmptyPlanIdList)) { - planMapper.deleteBatchIds(deleteEmptyPlanIdList); + planMapper.deleteByIds(deleteEmptyPlanIdList); } // 更新排单下的订单列表 @@ -1257,29 +1126,20 @@ public class PlanServiceImpl implements PlanService { .set(PlanDO::getOrderNos, orderNos)); } } - - // 修改排单加工方案的优化状态 - updateProcessSchemeStatus(deletePlanIds); - - // 删除排单对应的优化生产数据 - if (CollUtil.isNotEmpty(deleteEmptyPlanIdList)) { - esUtils.deleteEsDocument(FIELD_PLANID, deleteEmptyPlanIdList, ORDER_OPTIMIZE_PLATE_MODEL.getIndex()); - } } @Transactional(rollbackFor = Exception.class) - public void insertPlanPlate(List insertOrderPlateIds,PlanActualGoodsModelDO planActualGoodsModelDO){ + public void insertPlanPlate(List insertOrderPlateIds, PlanActualGoodsModelDO planActualGoodsModelDO) { // 后面还需要看看是否需要进行混单的判断 List insertPlanIds = insertOrderPlateIds.stream().map(OrderPlateIds::getPlanId).distinct().toList(); - PlanDO planDO = validatePlan(insertPlanIds.get(0)); Set orderIds = insertOrderPlateIds.stream().map(OrderPlateIds::getOrderId).collect(Collectors.toSet()); - if(planActualGoodsModelDO != null){ + if (planActualGoodsModelDO != null) { List mixedTypes = insertOrderPlateIds.stream().map(OrderPlateIds::getMixedType).distinct().toList(); @@ -1287,13 +1147,10 @@ public class PlanServiceImpl implements PlanService { planDO.setType(PlanTypeEnum.MIXEDORDERPLAN.getType()); planDO.setFilter(mixedType); - - esUtils.saveEsDocument(PLAN_ACTUAL_GOODS_MODEL.getIndex(), Collections.singletonList(planActualGoodsModelDO)); - } // 已开料排单修改为开料中 - if(planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus())){ + if (planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus())) { planDO.setStatus(PlanStatusEnum.OPENING.getStatus()); planDO.setProduceTime(null); @@ -1305,54 +1162,19 @@ public class PlanServiceImpl implements PlanService { planDO.setOrderNos(orderIds.stream().distinct().toList().toString()); planMapper.update(new LambdaUpdateWrapper() - .eq(PlanDO::getOrganId,getUserOrganId()) - .eq(PlanDO::getId,planDO.getId()) + .eq(PlanDO::getOrganId, getUserOrganId()) + .eq(PlanDO::getId, planDO.getId()) - .set(PlanDO::getProduceTime,planDO.getProduceTime()) - .set(PlanDO::getStatus,planDO.getStatus()) - .set(PlanDO::getType,planDO.getType()) - .set(PlanDO::getOrderNos,planDO.getOrderNos()) - .set(PlanDO::getFilter,planDO.getFilter()) + .set(PlanDO::getProduceTime, planDO.getProduceTime()) + .set(PlanDO::getStatus, planDO.getStatus()) + .set(PlanDO::getType, planDO.getType()) + .set(PlanDO::getOrderNos, planDO.getOrderNos()) + .set(PlanDO::getFilter, planDO.getFilter()) ); // 新增排单板件 & 重新计算订单和材质下的数量和面积 insertPlanOrderAndGoodsPlate(planDO.getId(), insertOrderPlateIds, orderIds); - // 有新添加的小板,修改优化信息的字段信息 - try { - - List fieldValues = insertPlanIds.stream().map(FieldValue::of).toList(); - - UpdateByQueryRequest.Builder builder = new UpdateByQueryRequest.Builder(); - - builder.index(ORDER_OPTIMIZE_PLATE_MODEL.getIndex()) - .query(qb -> qb.bool(bq -> bq.filter(f->{ - f.terms(t->t.field(FIELD_PLANID).terms(e->e.value(fieldValues))); - return f; - }) - )) - .script(s -> s.inline(i -> i - .source("ctx._source.isNewInsertPlate = params.new_value") - .params(ES_FIELD_NEWVALUE, JsonData.of(Boolean.TRUE)) - )); - - UpdateByQueryRequest request = builder.build(); - - elasticsearchClient.updateByQuery(request); - - }catch (Exception e){ - log.error(e.getMessage(), e); - throw new ServiceException(ES_DATA_ERROR); - - } - - - // 修改排单加工方案的优化状态 - updateProcessSchemeStatus(insertPlanIds); - - // 订单板材造型信息增加排单ID -// insertPlateModelPlanId(orderIds,insertPlateIds,insertPlanIds.get(0)); - } /** @@ -1834,11 +1656,16 @@ public class PlanServiceImpl implements PlanService { Set orderIdSet = new HashSet<>(); - planActualGoodsLists.forEach(f -> { + long sort = System.currentTimeMillis(); + + for (PlanActualGoodsList f : planActualGoodsLists) { // 查找和大板分类ID相同的小板的数据 List plateList = plateItemList.stream().filter(p -> f.getIds().contains(p.getId())).toList(); + // 累计排单板件数量 + Integer planPlateNum = plateList.size(); + Set planOrderIdSet = new HashSet<>(); Map> goodsPlateIdMap = new HashMap<>(); for (SavePlanPlateList.PlateItemList savePlanPlate : plateList) { @@ -1850,7 +1677,7 @@ public class PlanServiceImpl implements PlanService { // 累计商品id下的订单号 List goodsPlateIdList = goodsPlateIdMap.get(savePlanPlate.getId()); - if(CollUtil.isEmpty(goodsPlateIdList)) { + if (CollUtil.isEmpty(goodsPlateIdList)) { goodsPlateIdList = new ArrayList<>(); goodsPlateIdList.add(savePlanPlate.getPlateId()); goodsPlateIdMap.put(savePlanPlate.getId(), goodsPlateIdList); @@ -1859,9 +1686,6 @@ public class PlanServiceImpl implements PlanService { } } - AtomicLong sort = new AtomicLong(System.currentTimeMillis()); - sort.addAndGet(1); - Long planId = (Long) identifierGenerator.nextId(null); // 大板商品id @@ -1870,7 +1694,7 @@ public class PlanServiceImpl implements PlanService { // 创建排单 planDOS.add(PlanDO.builder() .id(planId) - .sort(sort.get()) + .sort(++sort) .type(PlanTypeEnum.MIXEDORDERPLAN.getType()) .processId(processId) .processName(processName) @@ -1880,12 +1704,13 @@ public class PlanServiceImpl implements PlanService { .operator(loginUser.getNickname()) .planTime(LocalDateTime.now()) .goodsId(goodsId) + .plateNum(planPlateNum) .build()); // 更新板件排单id & 统计更新order_goods的数量和面积 computePlatePlanAndComputeOrderGoodsInfo(planId, goodsPlateIdMap); - }); + } // 统计更新orders的小板数量和面积 computeOrderInfo(orderIdSet); } @@ -1901,16 +1726,20 @@ public class PlanServiceImpl implements PlanService { LoginUser loginUser, Integer planType){ - AtomicLong sort = new AtomicLong(System.currentTimeMillis()); + long sort = System.currentTimeMillis(); Set orderIdSet = new HashSet<>(); // 进行数据处理:value 里为 大板的分类ID - grouped.forEach((key, value) -> { + for (Map.Entry> entry : grouped.entrySet()) { + List value = entry.getValue(); // 查找和大板分类ID相同的小板的数据 List plateList = plateItemList.stream().filter(p -> value.contains(p.getId())).toList(); + // 累计排单板件数 + Integer planPlateNum = plateList.size(); + Set planOrderIdSet = new HashSet<>(); Map> goodsPlateIdMap = new HashMap<>(); for (SavePlanPlateList.PlateItemList savePlanPlate : plateList) { @@ -1931,14 +1760,12 @@ public class PlanServiceImpl implements PlanService { } } - sort.addAndGet(1); - Long planId = (Long) identifierGenerator.nextId(null); // 创建排单 planDOS.add(PlanDO.builder() .id(planId) - .sort(sort.get()) + .sort(++sort) .type(planType) .processId(processId) .processName(processName) @@ -1947,11 +1774,12 @@ public class PlanServiceImpl implements PlanService { .status(PlanStatusEnum.NOCUTTING.getStatus()) .operator(loginUser.getNickname()) .planTime(LocalDateTime.now()) + .plateNum(planPlateNum) .build()); // 更新板件排单id & 统计更新order_goods的数量和面积 computePlatePlanAndComputeOrderGoodsInfo(planId, goodsPlateIdMap); - }); + } // 统计更新orders的小板数量和面积 computeOrderInfo(orderIdSet); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml index 7019ec86b..67bca7499 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml @@ -1477,6 +1477,68 @@ + + UPDATE order_plate op + SET op.is_optimized = true + WHERE op.deleted = false + AND op.is_optimized = false + AND op.order_id in + + #{orderId} + + AND op.plan_id = #{planId} + AND op.plate_no in + + #{plateNo} + + ORDER BY op.id + LIMIT 1000; + + + + UPDATE order_plate op + SET op.is_cutted = 2 + WHERE op.deleted = false + AND op.is_cutted = 0 + AND op.order_id in + + #{orderId} + + AND op.plan_id = #{planId} + AND op.plate_no in + + #{plateNo} + + ORDER BY op.id + LIMIT 1000; + + + + UPDATE order_plate op + SET op.is_optimized = false + WHERE op.deleted = false + AND op.is_optimized = true + AND op.order_id in + + #{orderId} + + AND op.plan_id = #{planId} + ORDER BY op.id + LIMIT 1000; + + + +