From d95d02f9bd65e8bdabab214aa86a15b30ff4200f Mon Sep 17 00:00:00 2001 From: liuzhaotian Date: Thu, 9 Jan 2025 10:06:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=AA=E6=8E=92=E5=8D=95=EF=BC=8C=E6=8E=92?= =?UTF-8?q?=E5=8D=95=EF=BC=8C=E4=BC=98=E5=8C=96=E7=94=9F=E4=BA=A7=EF=BC=8C?= =?UTF-8?q?=E6=96=B0=E9=9C=80=E6=B1=82=E6=8E=A5=E5=8F=A3=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enums/GoodsFilterConditionsEnum.java | 57 + .../common/enums/OrderPlateCutStatusEnum.java | 35 + .../common/enums/PlanStatusEnum.java | 7 +- .../executor/enums/ErrorCodeConstants.java | 2 + .../executor/api/plan/OrderPlanApiImpl.java | 98 +- .../admin/plan/OptimizePlanController.java | 110 +- .../controller/admin/plan/PlanController.java | 58 +- .../admin/plan/bo/OrderGoodsFilterList.java | 36 + .../controller/admin/plan/bo/OrderSource.java | 8 +- .../admin/plan/bo/PlanProcessSchemeList.java | 23 + .../plan/saveOptimize/ActualGoodsList.java | 104 ++ .../saveOptimize/CuttingStatusRespVO.java | 18 +- .../saveOptimize/FilterDataPageReqVO.java | 32 + .../saveOptimize/NoPlanFilterPlateReqVO.java | 47 + .../saveOptimize/PlanProcessSchemeReqVO.java | 29 + .../saveOptimize/PrintOrderPartsRespVO.java | 19 + .../plan/saveOptimize/RemainBoardInfo.java | 161 ++ .../plan/saveOptimize/RemainBoardList.java | 61 + .../SavePlanPlateResultReqVO.java | 8 +- .../SaveProcessSchemeModelDO.java | 58 + .../saveOptimize/SaveProcessSchemeReqVO.java | 25 + .../plan/vo/AdvancedScreeningConfig.java | 47 + .../admin/plan/vo/BranchingPlanSaveReqVO.java | 48 + .../controller/admin/plan/vo/GoodsReqVO.java | 18 +- .../admin/plan/vo/OrderGoodsResp.java | 2 + .../admin/plan/vo/OrderPageReqVOCopy.java | 15 +- .../admin/plan/vo/OrderRespVOCopy.java | 8 +- .../admin/plan/vo/PlanOrderRespVO.java | 4 +- .../admin/plan/vo/PlanPageReqVO.java | 12 +- .../controller/admin/plan/vo/PlanRespVO.java | 20 +- .../admin/plan/vo/PlanSaveReqVO.java | 89 +- ...tialRespVO.java => PlateDetailRespVO.java} | 4 +- .../admin/plan/vo/PlateResList.java | 22 +- .../admin/plan/vo/SavePlanPlateList.java | 80 + .../admin/plan/vo/SavePlanPlateResult.java | 26 - .../controller/admin/plan/vo/SortVO.java | 6 +- .../admin/plate/PlateController.java | 26 +- .../plate/vo/GoodsPlateFilterPageReqVO.java | 86 + .../admin/plate/vo/KaiLiaoSize.java | 12 - .../admin/plate/vo/NoPlanPlatePageReqVO.java | 109 ++ .../controller/admin/plate/vo/OffSet.java | 13 - .../admin/plate/vo/OrderPlateIds.java | 30 + .../plate/vo/PlateModelDetailRespVO.java | 30 + .../admin/plate/vo/ProcessPlateReqVO.java | 31 - .../dal/dataobject/goods/CutedBoardInfo.java | 6 + .../goods/OptimizeBoardModelDO.java | 32 +- .../executor/dal/dataobject/plan/PlanDO.java | 19 + .../dal/dataobject/planitem/PlanItemDO.java | 16 +- .../dal/dataobject/plate/PlateDO.java | 4 + .../executor/dal/mysql/goods/GoodsMapper.java | 60 +- .../executor/dal/mysql/order/OrderMapper.java | 21 +- .../mysql/orderGroup/OrderGroupMapper.java | 15 + .../executor/dal/mysql/plan/PlanMapper.java | 25 +- .../dal/mysql/planitem/PlanItemMapper.java | 40 +- .../dal/mysql/plate/PlateGoodMapper.java | 36 +- .../executor/dal/mysql/plate/PlateMapper.java | 64 +- .../optimizeplan/OptimizePlanService.java | 34 +- .../optimizeplan/OptimizePlanServiceImpl.java | 1418 +++++++++++----- .../service/order/OrderServiceImpl.java | 25 +- .../order/OrderStatisticsServiceImpl.java | 4 +- .../executor/service/plan/PlanService.java | 23 +- .../service/plan/PlanServiceImpl.java | 1451 +++++++++++------ .../executor/service/plate/PlateService.java | 7 + .../service/plate/PlateServiceImpl.java | 216 ++- .../module/executor/util/OrganIdUtils.java | 18 - .../executor/util/elasticsearch/EsUtils.java | 297 ++++ .../resources/mapper/goods/GoodsMapper.xml | 85 +- .../resources/mapper/order/OrderMapper.xml | 220 ++- .../mapper/orderGroup/OrderGroupMapper.xml | 74 + .../mapper/orderParts/OrderPartsMapper.xml | 14 +- .../main/resources/mapper/plan/PlanMapper.xml | 3 +- .../mapper/planitem/PlanItemMapper.xml | 378 ++++- .../resources/mapper/plate/PlateMapper.xml | 214 +-- .../api/systemconfig/SystemConfigApi.java | 18 + .../systemconfig/dto/ProcessSchemeDTO.java | 76 + .../system/enums/ErrorCodeConstants.java | 12 +- .../api/systemconfig/SystemConfigApiImpl.java | 125 ++ .../admin/machine/vo/MachineReqVO.java | 17 + .../admin/setting/SettingController.java | 10 +- .../systemconfig/vo/ProcessSchemeConfig.java | 46 + .../service/machine/MachineServiceImpl.java | 21 +- .../MultiColorOrderPlanServiceHandler.java | 13 +- .../impl/ProcessSchemeServiceHandler.java | 26 +- 83 files changed, 5237 insertions(+), 1680 deletions(-) create mode 100644 cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/enums/GoodsFilterConditionsEnum.java create mode 100644 cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/enums/OrderPlateCutStatusEnum.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/bo/OrderGoodsFilterList.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/bo/PlanProcessSchemeList.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/ActualGoodsList.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/FilterDataPageReqVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/NoPlanFilterPlateReqVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/PlanProcessSchemeReqVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/RemainBoardInfo.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/SaveProcessSchemeModelDO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/SaveProcessSchemeReqVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/AdvancedScreeningConfig.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/BranchingPlanSaveReqVO.java rename cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/{PlateDetialRespVO.java => PlateDetailRespVO.java} (97%) create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/SavePlanPlateList.java delete mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/SavePlanPlateResult.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/GoodsPlateFilterPageReqVO.java delete mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/KaiLiaoSize.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/NoPlanPlatePageReqVO.java delete mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/OffSet.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/OrderPlateIds.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/PlateModelDetailRespVO.java delete mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/ProcessPlateReqVO.java delete mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/OrganIdUtils.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/elasticsearch/EsUtils.java create mode 100644 cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/api/systemconfig/dto/ProcessSchemeDTO.java create mode 100644 cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/machine/vo/MachineReqVO.java create mode 100644 cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/systemconfig/vo/ProcessSchemeConfig.java diff --git a/cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/enums/GoodsFilterConditionsEnum.java b/cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/enums/GoodsFilterConditionsEnum.java new file mode 100644 index 000000000..162617ad8 --- /dev/null +++ b/cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/enums/GoodsFilterConditionsEnum.java @@ -0,0 +1,57 @@ +package com.cf.imes.framework.common.enums; + + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author 未排单过滤字段枚举类 + */ + +@AllArgsConstructor +@Getter +public enum GoodsFilterConditionsEnum { + + THICKNESS( "厚度","thickness"), + MATERIAL( "材质","material"), + TEXTURE( "纹理","texture"), + BRAND( "品牌","brand"), + WIDTH("宽度","width"), + HEIGHT( "长度","height"), + COLOR("颜色","color"); + + private final String name; + private final String filterField; + + + public String getKey() { + return filterField; + } + + + public String getValue() { + return name; + } + + + public boolean equals(String status) { + return this.name.equals(status) ; + } + + public boolean equals(GoodsFilterConditionsEnum enableStatusEnum) { + return enableStatusEnum != null && enableStatusEnum.name .equals(this.getName()) ; + } + + + // 根据 key 获取对应的 value + public static String getValueByKey(String filterField) { + for (GoodsFilterConditionsEnum enumValue : GoodsFilterConditionsEnum.values()) { + if (enumValue.getKey().equals(filterField)) { + return enumValue.getValue(); + } + } + return null; // 如果没有找到对应的 key,可以返回 null 或者抛出异常 + } + + +} diff --git a/cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/enums/OrderPlateCutStatusEnum.java b/cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/enums/OrderPlateCutStatusEnum.java new file mode 100644 index 000000000..5ac1bfee2 --- /dev/null +++ b/cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/enums/OrderPlateCutStatusEnum.java @@ -0,0 +1,35 @@ +package com.cf.imes.framework.common.enums; + + +import lombok.AllArgsConstructor; +import lombok.Getter; + + +/** + * @author 生产单板材开料状态表 + */ + +@AllArgsConstructor +@Getter +public enum OrderPlateCutStatusEnum { + + NOCUTTING(0,"未开料"), + OPENING(1,"开料中"), + OPENED(2,"已开料"); + + + private Integer status; + private String description; + + + public boolean equals(Integer status) { + return this.status .equals(status) ; + } + + + public boolean equals(OrderPlateCutStatusEnum enableStatusEnum) { + return enableStatusEnum != null && enableStatusEnum.status .equals(this.getStatus()) ; + } + + +} diff --git a/cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/enums/PlanStatusEnum.java b/cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/enums/PlanStatusEnum.java index c9c2625ae..652e32f15 100644 --- a/cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/enums/PlanStatusEnum.java +++ b/cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/enums/PlanStatusEnum.java @@ -9,11 +9,10 @@ import lombok.Getter; public enum PlanStatusEnum { - NOCUTTING(0, "未开料"), - + NOCUTTING(0, "未开料/新单"), OPENING(1, "开料中"), - - OPENED(2, "已开料"); + OPENED(2, "已开料"), + PUTINTOPRODUCTION(3,"已投产"); private Integer status; private String scheduling; diff --git a/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/ErrorCodeConstants.java b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/ErrorCodeConstants.java index 17ed7e017..f6ac19ffa 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/ErrorCodeConstants.java +++ b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/ErrorCodeConstants.java @@ -16,6 +16,8 @@ public class ErrorCodeConstants { public static final ErrorCode LIST_CHANGES_ARE_PROHIBITED = new ErrorCode(1_001_107_003, "当前排单有板材已开料,禁止更改"); public static final ErrorCode PLATE_ERROR = new ErrorCode(1_001_107_005, "当前新增的板材非同一类型的板材,禁止更改"); + public static final ErrorCode PLAN_PLATE_IS_ALL_CUT = new ErrorCode(1_001_107_006, "排单号:{} 的板材已全部开料,禁止删除!"); + public static final ErrorCode PLAN_NOT_DATA_EXISTS = new ErrorCode(1_001_107_007, "排单号:{} 不存在,无法进行操作,请检查排单数据"); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/api/plan/OrderPlanApiImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/api/plan/OrderPlanApiImpl.java index 8898dae9f..885619c97 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/api/plan/OrderPlanApiImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/api/plan/OrderPlanApiImpl.java @@ -43,7 +43,6 @@ import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.stream.Collectors; import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR; import static com.cf.imes.framework.common.util.json.JsonUtils.toJsonString; @@ -161,7 +160,6 @@ public class OrderPlanApiImpl implements OrderPlanApi{ List optimizeBoardModelDOS = buildBoardByPlanId(planId, ORDER_REMAIN_PLATE_MODEL, 10); - List goodsIds = optimizeBoardModelDOS.stream().map(OptimizeBoardModelDO::getGoodsId).toList(); JsonNode jsonNode = JsonUtils.parseTree(JsonUtils.toJsonString(optimizeBoardModelDOS)); @@ -173,11 +171,6 @@ public class OrderPlanApiImpl implements OrderPlanApi{ String filed2 = "place_block_number".equals(filed) ? ",{placeBlockNumber:"+jsonNode.get("placeBlockNumber").asLong()+"}]" : ""; -// String sql = " select from order_goods where organ_id = #{organId} and deleted = false"; -// -// sql = sql.replace("#{organId}", getUserOrganId() + ""); - - List goodsDO = goodsMapper.selectPlanGoodsDataSource(conversion(filed),planId,getUserOrganId()); @@ -208,16 +201,6 @@ public class OrderPlanApiImpl implements OrderPlanApi{ @Override public String getPlan(Long planId,String filed) { - -// String sql = " select from order_plan where id =#{planId} and organ_id = #{organId} and deleted = false"; -// -// sql = sql.replace("#{organId}", getUserOrganId() + "").replace("#{planId}", planId + ""); -// -// String toInsert = filed.replaceAll("\\[|\\]", ""); - -// List planDOS = planMapper.seleTestSQL(conversion(sql, filed)); - - List planDOS = planMapper.selectPlanDataSource(conversion(filed),planId,getUserOrganId()); return toJsonString(planDOS); @@ -257,12 +240,6 @@ public class OrderPlanApiImpl implements OrderPlanApi{ @Override public String apiGetPlanRemainPlate(Long planId, String field) { - -// String sql = " select from order_remain_plate where organ_id = #{organId} and plan_id = #{planId} and deleted = false"; -// -// sql = sql.replace("#{organId}", getUserOrganId() + "").replace("#{planId}", planId + ""); - - List remainPlateDOS = remainPlateMapper.selectPlanRemainDataSource(conversion(field),planId,getUserOrganId()); @@ -275,19 +252,6 @@ public class OrderPlanApiImpl implements OrderPlanApi{ @Override public String apiGetPlanPlate(Long planId, String field) { - -// List optimizeBoardModelDOS = buildBoardByPlanId(planId, ORDER_REMAIN_PLATE_MODEL, 99); -// -// -// List goodsIds = optimizeBoardModelDOS.stream().map(OptimizeBoardModelDO::getGoodsId).toList(); -// -// -// List orderIds = BeanUtils.toBean(optimizeBoardModelDOS.stream().map(OptimizeBoardModelDO::getOrderId).toList(), Long.class); -// -// -// List goodsIdList = goodsMapper.selectListByGoodsIdList(goodsIds,orderIds, getUserOrganId()) -// .stream().map(GoodsDO::getId).toList(); - List goodsDOS = goodsMapper.selectPlanGoods(planId, getUserOrganId()); List goodsIds = goodsDOS.stream().map(GoodsDO::getId).distinct().toList(); @@ -322,7 +286,6 @@ public class OrderPlanApiImpl implements OrderPlanApi{ List esData = new ArrayList<>(); - // todo 目前只考虑非混单的情况,混单的情况待解决 List plateIds = getPlateIds(planId); @@ -339,9 +302,8 @@ public class OrderPlanApiImpl implements OrderPlanApi{ BigDecimal splitLength = BigDecimal.valueOf(jsonNode.get("splitLength").asDouble()); BigDecimal splitWidth = BigDecimal.valueOf(jsonNode.get("splitWidth").asDouble()); - filedData.add( "splitArea".equals(field)? "splitArea:"+ splitLength.multiply(splitWidth) : field+":"+jsonNode.get(field).asText() ); + filedData.add( "splitArea".equals(field)? "splitArea:"+ splitLength.multiply(splitWidth) : field+":"+jsonNode.get(field).asText()); -// filedData.add(field+":"+jsonNode.get(field).asText()); } @@ -360,13 +322,6 @@ public class OrderPlanApiImpl implements OrderPlanApi{ @Override public String apiGetPlanBodyOrRoom(Long planId, String field) { -// List plateIds = getPlateIds(planId); -// -// -// List orderItemDOS = orderItemMapper.selectPlateIdList(plateIds, getUserOrganId()); -// -// List bodyIds = orderItemDOS.stream().map(OrderItemDO::getBodyId).distinct().toList(); - List bodyIds = goodsMapper.selectPlanBodyIds(planId, getUserOrganId()); @@ -384,15 +339,6 @@ public class OrderPlanApiImpl implements OrderPlanApi{ public String apiGetPlanGroup(Long planId, String field) { -// List plateIds = getPlateIds(planId); -// -//// List plateIds = Arrays.asList(1825367895442456579L, 1825367895308238851L, 1824334800400416772L); -// -// List orderItemDOS = orderItemMapper.selectPlateIdList(plateIds, getUserOrganId()); -// -// List groupIds = orderItemDOS.stream().map(OrderItemDO::getGroupId).distinct().toList(); - - List groupIds = goodsMapper.selectPlanGroupListDataSource(planId, getUserOrganId()); if(groupIds.isEmpty()){ @@ -419,16 +365,6 @@ public class OrderPlanApiImpl implements OrderPlanApi{ @Override public String apiGetPlanParts(Long planId, String field) { - -// List optimizeBoardModelDOS = buildBoardByPlanId(planId, ORDER_REMAIN_PLATE_MODEL, 10); -// -// -// String orderNos = optimizeBoardModelDOS.stream().map(OptimizeBoardModelDO::getOrderId).toList().toString(); -// -// -// List orderIds = JSON.parseArray(orderNos).toJavaList(Long.class); - - List orderIds = goodsMapper.selectPlanGoods(planId, getUserOrganId()).stream().map(GoodsDO::getOrderId).distinct().toList(); @@ -455,21 +391,13 @@ public class OrderPlanApiImpl implements OrderPlanApi{ @Override public String apiGetEsParts(Long planId, List fields) { - -// List optimizeBoardModelDOS = buildBoardByPlanId(planId, ORDER_REMAIN_PLATE_MODEL, 10); -// -// -// String orderNos = optimizeBoardModelDOS.stream().map(OptimizeBoardModelDO::getOrderId).toList().toString(); -// -// -// List orderIds = JSON.parseArray(orderNos).toJavaList(Long.class); - - List orderIds = goodsMapper.selectPlanGoods(planId, getUserOrganId()).stream().map(GoodsDO::getOrderId).distinct().toList(); + int partNum = orderPartsMapper.selectPartList(orderIds, getUserOrganId()).size(); + List esData = new ArrayList<>(); - List orderPartsRemarks = buildOrderPartsByOrderId(orderIds, ORDER_PARTS_REMARK_MODEL, 999); + List orderPartsRemarks = buildOrderPartsByOrderId(orderIds, ORDER_PARTS_REMARK_MODEL, partNum); for (OrderPartsRemark orderPartsRemark : orderPartsRemarks) { @@ -510,18 +438,6 @@ public class OrderPlanApiImpl implements OrderPlanApi{ // 根据排单ID获取对应的板材ID private List getPlateIds(Long planId) { - -// List optimizeBoardModelDOS = buildBoardByPlanId(planId, ORDER_REMAIN_PLATE_MODEL, 10); -// -// List goodsIds = optimizeBoardModelDOS.stream().map(OptimizeBoardModelDO::getGoodsId).toList(); -// -// -// List orderIds = BeanUtils.toBean(optimizeBoardModelDOS.stream().map(OptimizeBoardModelDO::getOrderId).toList(), Long.class); -// -// List ids = goodsMapper.selectListByGoodsIdList(goodsIds, orderIds, getUserOrganId()).stream().map(GoodsDO::getId).toList(); -// -// plateMapper.selectGoodsPlateList(ids, getUserOrganId()).stream().map(PlateDO::getId).toList(); - return goodsMapper.selectPlanPlateList(planId, getUserOrganId()); } @@ -538,7 +454,7 @@ public class OrderPlanApiImpl implements OrderPlanApi{ SearchResponse search = elasticsearchClient.search(builder.build(), OrderPartsRemark.class); List> hits = search.hits().hits(); if (CollUtil.isNotEmpty(hits)) { - return hits.stream().map(Hit::source).collect(Collectors.toList()); + return hits.stream().map(Hit::source).toList(); } return new ArrayList<>(); } catch (IOException e) { @@ -560,7 +476,7 @@ public class OrderPlanApiImpl implements OrderPlanApi{ SearchResponse search = elasticsearchClient.search(builder.build(), OptimizeBoardModelDO.class); List> hits = search.hits().hits(); if (CollUtil.isNotEmpty(hits)) { - return hits.stream().map(Hit::source).collect(Collectors.toList()); + return hits.stream().map(Hit::source).toList(); } return new ArrayList<>(); } catch (IOException e) { @@ -582,7 +498,7 @@ public class OrderPlanApiImpl implements OrderPlanApi{ SearchResponse search = elasticsearchClient.search(builder.build(), OrderModelDO.class); List> hits = search.hits().hits(); if (CollUtil.isNotEmpty(hits)) { - return hits.stream().map(Hit::source).collect(Collectors.toList()); + return hits.stream().map(Hit::source).toList(); } return new ArrayList<>(); } catch (IOException e) { 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 8346a230e..55115e9e5 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,17 +1,15 @@ package com.cf.imes.module.executor.controller.admin.plan; 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.saveOptimize.CuttingStatusRespVO; -import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.SavePlanPlateResultReqVO; -import com.cf.imes.module.executor.controller.admin.plan.vo.AddRemainReqVO; -import com.cf.imes.module.executor.controller.admin.plan.vo.GetSourceDataReq; -import com.cf.imes.module.executor.controller.admin.plan.vo.PlateOptimize; +import com.cf.imes.module.executor.controller.admin.plan.bo.PlanProcessSchemeList; +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; import com.cf.imes.module.executor.service.optimizeplan.OptimizePlanService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.security.access.prepost.PreAuthorize; @@ -56,23 +54,29 @@ public class OptimizePlanController { @GetMapping("commit") - @Operation(summary = "开料") - @Parameters({ - @Parameter(name = "planId", description = "排单ID", required = true, example = "1024"), - @Parameter(name = "goodsNo", description = "开料的大板编号", required = true, example = "1") - }) + @Operation(summary = "开始开料") + @Parameter(name = "planId", description = "排单ID", required = true) + @Parameter(name = "goodsNo", description = "开料的大板编号", required = true) @PreAuthorize("@ss.hasPermission('placeorder:optimize')") public CommonResult commit(@RequestParam("planId") @NotNull(message = "排单ID不能为空") Long planId, + @RequestParam("goodsId") @NotNull(message = "实际开料的大板ID不能为空") String goodsId, + @RequestParam("planConfigId") @NotNull(message = "方案组的配置项ID") Long planConfigId, @RequestParam("goodsNo") @NotEmpty(message = "排单异常,请重新优化或重新进入排单") List goodsNo) { - return CommonResult.success(optimizePlanService.commit(planId,goodsNo)); + return CommonResult.success(optimizePlanService.commit(planId,goodsId,planConfigId,goodsNo)); } @GetMapping("/endCutting") @Operation(summary = "结束开料") + @Parameter(name = "planId", description = "排单ID", required = true) + @Parameter(name = "planConfigId", description = "方案组的配置项ID", required = true) + @Parameter(name = "goodsNo", description = "开料的大板编号", required = true) @PreAuthorize("@ss.hasPermission('placeorder:optimize')") - public CommonResult endCutting(@RequestParam @Valid @NotNull(message = "排单id不能空") Long planId) { - return success(optimizePlanService.endCutting(planId)); + public CommonResult endCutting(@RequestParam("planId") @NotNull(message = "排单ID不能为空") Long planId, + @RequestParam("goodsId") @NotNull(message = "实际开料的大板ID不能为空") String goodsId, + @RequestParam("planConfigId") @NotNull(message = "方案组的配置项ID不能为空") Long planConfigId, + @RequestParam("goodsNo") @NotEmpty(message = "排单异常,请重新优化或重新进入排单") List goodsNo) { + return success(optimizePlanService.endCutting(planId,goodsId,goodsNo,planConfigId)); } @@ -90,12 +94,10 @@ public class OptimizePlanController { @Operation(summary = "获取生产单源数据") @PreAuthorize("@ss.hasPermission('placeorder:optimize')") public CommonResult getOrderSource(@Schema(description = "生产单id") @RequestParam(required = false) Long orderId, - @Schema(description = "大板IDS-大板分类的IDS") @RequestParam(required = false) List ids, @Schema(description = "排单id") @RequestParam(required = false) Long planId, - @Schema(description = "机台Id") - @NotNull(message = "当前排单对应的机台为空,请检查机台信息或重新选择机台") @RequestParam("machineId") Long machineId + @Schema(description = "机台Id") @RequestParam(required = false) Long machineId ) { - return CommonResult.success(optimizePlanService.getOrderSource(orderId, planId, machineId,ids)); + return CommonResult.success(optimizePlanService.getOrderSource(orderId, planId, machineId)); } @@ -110,7 +112,7 @@ public class OptimizePlanController { @PostMapping("/saveOptimizationResults") - @Operation(summary = "保存优化后的数据") + @Operation(summary = "保存优化生产后的数据") @PreAuthorize("@ss.hasPermission('placeorder:optimize')") public CommonResult saveOptimizationResults(@Valid @RequestBody SavePlanPlateResultReqVO req ) { @@ -121,6 +123,47 @@ public class OptimizePlanController { } + @PostMapping("/saveProcessSchemeResults") + @Operation(summary = "保存方案组的优化信息") + @PreAuthorize("@ss.hasPermission('placeorder:optimize')") + public CommonResult saveProcessSchemeResults(@RequestBody SaveProcessSchemeReqVO saveProcessSchemeReqVO) { + + optimizePlanService.saveProcessSchemeResults(saveProcessSchemeReqVO); + + return CommonResult.success(true); + + } + + + + @GetMapping("/getProcessSchemeConfig") + @Operation(summary = "查询加工方案组对应的配置信息") + @Parameter(name = "planId", description = "排单ID", required = true) + @PreAuthorize("@ss.hasPermission('manage:pack:query')") + public CommonResult getProcessSchemeConfig(@Schema(description = "方案组ID") @NotNull(message = "方案组的ID不能为空") Long processId, + @Schema(description = "排单id") @RequestParam(required = false) Long planId) { + + return success(optimizePlanService.getProcessSchemeConfig(processId,planId)); + + } + + + + + + @PutMapping("/updateProcessScheme") + @Operation(summary = "修改排单对应的方案组的是否锁单") + @PreAuthorize("@ss.hasPermission('placeorder:update')") + public CommonResult updateProcessScheme(@RequestBody PlanProcessSchemeReqVO reqVO) { + optimizePlanService.updateProcessScheme(reqVO); + return success(true); + } + + + + + + @GetMapping("/getPlateModel") @Operation(summary = "查询当前生产单的板材造型信息") @Parameter(name = "orderId", description = "生产单Id", required = true) @@ -131,6 +174,35 @@ public class OptimizePlanController { } + @GetMapping("/getPlanPlateData") + @Operation(summary = "未排单获取板材的所有数据") + @PreAuthorize("@ss.hasPermission('manage:pack:query')") + public CommonResult getNoPlanPlateData (@Valid NoPlanFilterPlateReqVO reqVO) { + + return success(optimizePlanService.getNoPlanPlateData(reqVO)); + + } + + + + @GetMapping("/getOrderDataFilter") + @Operation(summary = "未排单高级筛选-订单分组") + @PreAuthorize("@ss.hasPermission('manage:pack:query')") + public CommonResult> getOrderPlateDataFilter (@Valid FilterDataPageReqVO pageReqVO) { + + return success(optimizePlanService.getOrderPlateDataFilter(pageReqVO)); + + } + + + @GetMapping("/getGoodsDataFilter") + @Operation(summary = "未排单高级筛选-板材分组") + @PreAuthorize("@ss.hasPermission('manage:pack:query')") + public CommonResult> getGoodsPlateDataFilter (@Valid FilterDataPageReqVO pageReqVO) { + + return success(optimizePlanService.getGoodsPlateDataFilter(pageReqVO)); + + } } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/PlanController.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/PlanController.java index 73502902e..407c3a32b 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/PlanController.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/PlanController.java @@ -10,8 +10,6 @@ import com.cf.imes.framework.excel.core.util.ExcelUtils; import com.cf.imes.framework.operatelog.core.annotations.OperateLog; 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.NotPlanGoodsReqVO; -import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.NotPlanGoodsRespVO; import com.cf.imes.module.executor.controller.admin.plan.vo.*; import com.cf.imes.module.executor.service.plan.PlanService; import io.swagger.v3.oas.annotations.Operation; @@ -29,7 +27,6 @@ import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import java.io.IOException; import java.util.List; -import java.util.Map; import static com.cf.imes.framework.common.pojo.CommonResult.success; import static com.cf.imes.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; @@ -46,8 +43,9 @@ public class PlanController { @PostMapping("/create") @Operation(summary = "创建排单") @PreAuthorize("@ss.hasPermission('placeorder:create')") - public CommonResult> createPlan(@Validated(CreateGroup.class) @RequestBody PlanSaveReqVO createReqVO) { - return success(planService.createPlan(createReqVO)); + public CommonResult createPlan(@Validated(CreateGroup.class) @RequestBody PlanSaveReqVO createReqVO) { + planService.createPlan(createReqVO); + return success(Boolean.TRUE); } @PutMapping("/update") @@ -98,13 +96,26 @@ public class PlanController { return success(BeanUtils.toBean(pageResult, PlanRespVO.class)); } + + @GetMapping("getPlanList") + @Operation(summary = "查询排单(未分页)") + @PreAuthorize("@ss.hasPermission('placeorder:orderlist')") + public CommonResult> getPlanList() { + + return success(planService.getPlanList()); + } + + + @PostMapping("/setSort") @Operation(summary = "设置排单优先级") @PreAuthorize("@ss.hasPermission('placeorder:priority')") - public CommonResult setSort(@Valid @NotEmpty(message = "参数不能空") @RequestBody List list) { - return success(planService.setSort(list)); + public CommonResult setSort(@Valid @NotEmpty(message = "参数不能空") @RequestBody List sortVos) { + return success(planService.setSort(sortVos)); } + + @GetMapping("getNotPlanOrderListPage") @Operation(summary = "获取未排单的生产单分页列表") @PreAuthorize("@ss.hasPermission('placeorder:query')") @@ -113,14 +124,6 @@ public class PlanController { } - // 目前因为这个接口没有使用,所以这个接口里代码没有进行更改 - @GetMapping("getNotPlanOrderPlateList") - @Operation(summary = "获取未排单的板材分页列表") - @PreAuthorize("@ss.hasPermission('placeorder:query')") - public CommonResult> getOrderPlateList(@Valid OrderPageReqVOCopy pageReqVO) { - return success(planService.getOrderPlateList(pageReqVO)); - } - @GetMapping("getNotPlanGoodsListPage") @Operation(summary = "获取未排单的大板板材分页列表") @@ -131,29 +134,6 @@ public class PlanController { - @PostMapping("getNotOptimizeGoodsList") - @Operation(summary = "优化界面未排单的大板板材分页列表") - @PreAuthorize("@ss.hasPermission('executor:plan:query')") - public CommonResult> getNotOptimizeGoodsList(@Valid @RequestBody NotPlanGoodsReqVO reqVO) { - return success(planService.getNotOptimizeGoodsList(reqVO)); - } - - -// @GetMapping("getNotPlanGoodsListPageByOrderId") -// @Operation(summary = "根据生产单id获取未排单的商品分页列表") -// @PreAuthorize("@ss.hasPermission('executor:plan:query')") - public CommonResult> getNotPlanGoodsListPageByOrderId(@Valid NotPlanGoodsListPageVO pageVO) { - return success(planService.getNotPlanGoodsListPageByOrderId(pageVO)); - } - - - @PostMapping("addPlate") - @Operation(summary = "添加板材") - @PreAuthorize("@ss.hasPermission('executor:plan:update')") - public CommonResult addPlate(@Valid @RequestBody AddPlateReq req) { - return success(planService.addPlate(req)); - } - @GetMapping("/export-excel") @Operation(summary = "导出排单 Excel") @@ -195,7 +175,7 @@ public class PlanController { @Operation(summary = "获取未排单的生产单的柜体和房间名称") @Parameter(name = "orderIds", description = "生产单ID", required = true) @PreAuthorize("@ss.hasPermission('placeorder:orderlist')") - public CommonResult> getOrderRoomBody(@Valid @RequestParam List orderIds) { + public CommonResult> getOrderRoomBody(@Valid @RequestParam @Size(max = 20,message = "最多可同时查询20个生产单信息") List orderIds) { return success(planService.getOrderRoomBody(orderIds)); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/bo/OrderGoodsFilterList.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/bo/OrderGoodsFilterList.java new file mode 100644 index 000000000..2e0791d77 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/bo/OrderGoodsFilterList.java @@ -0,0 +1,36 @@ +package com.cf.imes.module.executor.controller.admin.plan.bo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + + +@Data +@Builder +public class OrderGoodsFilterList { + + + @Schema(description = "商品名称") + private List goodsName; + + @Schema(description = "商品材质") + private List material; + + @Schema(description = "商品颜色") + private List color; + + @Schema(description = "厚") + private List thickness; + + @Schema(description = "商品纹理") + private List texture; + + @Schema(description = "商品品牌") + private List brand; + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/bo/OrderSource.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/bo/OrderSource.java index 8cf82d1e5..f003ab7af 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/bo/OrderSource.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/bo/OrderSource.java @@ -5,7 +5,7 @@ import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.OptimizeRe import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.PrintOrderPackReqVO; import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.PrintOrderPartsRespVO; import com.cf.imes.module.executor.controller.admin.plan.vo.GoodsReqVO; -import com.cf.imes.module.executor.controller.admin.plan.vo.PlateDetialRespVO; +import com.cf.imes.module.executor.controller.admin.plan.vo.PlateDetailRespVO; import com.cf.imes.module.executor.dal.dataobject.goods.OptimizeBoardModelDO; import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderModelDO; @@ -42,15 +42,15 @@ public class OrderSource { private PlanDO plan; - @Schema(description = "生产单列表") private List orderList; - @Schema(description = "板材-大板列表") + + @Schema(description = "大板板材列表-原板材的信息数据") private List goodsList; @Schema(description = "小板列表") - private List plateList; + private List plateList; @Schema(description = "小板造型列表") private List plateModels; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/bo/PlanProcessSchemeList.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/bo/PlanProcessSchemeList.java new file mode 100644 index 000000000..81575a5dc --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/bo/PlanProcessSchemeList.java @@ -0,0 +1,23 @@ +package com.cf.imes.module.executor.controller.admin.plan.bo; + + +import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.SaveProcessSchemeModelDO; +import com.cf.imes.module.system.api.systemconfig.dto.ProcessSchemeDTO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Data +public class PlanProcessSchemeList { + + + + @Schema(description = "排单对应的方案组的优化信息", requiredMode = Schema.RequiredMode.REQUIRED) + private List saveProcessSchemeReqVOS; + + + @Schema(description = "加工方案中的配置的信息", requiredMode = Schema.RequiredMode.REQUIRED) + private List processSchemeList; + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/ActualGoodsList.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/ActualGoodsList.java new file mode 100644 index 000000000..ec3e0a80a --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/ActualGoodsList.java @@ -0,0 +1,104 @@ +package com.cf.imes.module.executor.controller.admin.plan.saveOptimize; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + + + + +@Data +public class ActualGoodsList { + + + @Schema(description = "余料板ID") + private Long remainId; + + + @Schema(description = "商品 ID-大板的实际ID") + private String goodsId; + + + @Schema(description = "商品名称") + private String goodsName; + + + @Schema(description = "材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板") + private String material; + + + @Schema(description = "颜色") + private String color; + + + @Schema(description = "背面颜色") + private String colorBlack; + + + @Schema(description = "纹路") + private Boolean texture; + + + @Schema(description = "宽度") + private BigDecimal width; + + + @Schema(description = "高度") + private BigDecimal height; + + + @Schema(description = "厚度") + private BigDecimal thickness; + + + @Schema(description = "价格") + private BigDecimal price; + + + @Schema(description = "品牌") + private String brand; + + + @Schema(description = "规格") + private String spec; + + + @Schema(description = "备注") + private String remark; + + + + private BigDecimal length; + + + private Boolean isRealCuttingBoard; + + + private Integer count; + + + + private String cutKnifeName; + + + + private String placeBoardJSON; + + + + private Integer usedCount; + + + private BigDecimal avgUsageRateAll; + + + private BigDecimal avgUsageRateExcludeLastBoard; + + + private BigDecimal usageRateLastBoard; + + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/CuttingStatusRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/CuttingStatusRespVO.java index 40e89c210..8cffe2935 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/CuttingStatusRespVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/CuttingStatusRespVO.java @@ -16,7 +16,21 @@ public class CuttingStatusRespVO { private Long planId; - @Schema(description = "取消开料的大板编号") - private List goodsNo; + @Schema(description = "实际开料的大板ID") + @NotNull(message = "实际开料的大板ID不能为空") + private List goodsId; + + + @Schema(description = "方案组的配置项ID") + @NotNull(message = "方案组的配置项ID不能为空") + private Long planConfigId; + + + @Schema(description = "开料状态") + @NotNull(message = "开料状态不能为空") + private Integer cutedType; + +// @Schema(description = "取消开料的大板编号") +// private List goodsNo; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/FilterDataPageReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/FilterDataPageReqVO.java new file mode 100644 index 000000000..293c29b21 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/FilterDataPageReqVO.java @@ -0,0 +1,32 @@ +package com.cf.imes.module.executor.controller.admin.plan.saveOptimize; + + +import com.cf.imes.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.Size; +import java.util.List; + + +/** + * @author Administrator + */ +@Data +public class FilterDataPageReqVO extends PageParam { + + + @Schema(description = "筛选条件") + private String config; + + + @Schema(description = "生产单号") + @Size(max = 20,message = "最多可同时查询 20 个") + private List orderIds; + + @Schema(description = "大板的实际ID") + @Size(max = 20,message = "最多可同时查询 20 个") + private List goodsIds; + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/NoPlanFilterPlateReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/NoPlanFilterPlateReqVO.java new file mode 100644 index 000000000..23825af87 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/NoPlanFilterPlateReqVO.java @@ -0,0 +1,47 @@ +package com.cf.imes.module.executor.controller.admin.plan.saveOptimize; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * @author 未排单板材筛选 + */ +@Valid +@Data +public class NoPlanFilterPlateReqVO { + + +// @Schema(description = "机台ID",requiredMode = Schema.RequiredMode.REQUIRED) +// private Long machineId; + + + @Schema(description = "生产单ID",requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "生产单ID不能为空") + private List orderIds; + + + @Schema(description = "实际优化的大板ID-这个是混单和非混单都用",requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "大板ID不能为空") + private List goodsIdList; + + +// @Schema(description = "实际优化的大板ID-这个只用于混单传入实际优化的大板ID") +// private String goodsId; +// +// +// @Schema(description = "板材过滤条件-传没有勾选的") +// @Size(max = 7,message = "板材过滤条件数量不正确") +// private List filter; +// +// +// @Schema(description = "是否混单", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") +// @NotNull(message = "混单的判断条件不能为空") +// private Boolean isMix; + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/PlanProcessSchemeReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/PlanProcessSchemeReqVO.java new file mode 100644 index 000000000..3b1a9f990 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/PlanProcessSchemeReqVO.java @@ -0,0 +1,29 @@ +package com.cf.imes.module.executor.controller.admin.plan.saveOptimize; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; + + +@Data +public class PlanProcessSchemeReqVO { + + + + @Schema(description = "排单ID", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "排单ID不能为空") + private Long planId; + + + @Schema(description = "加工方案组的配置项ID", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "加工方案组的配置项ID不能为空") + private Long planConfigId; + + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "状态不能为空") + private Boolean isLock; + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/PrintOrderPartsRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/PrintOrderPartsRespVO.java index 0abcb3516..ec96a4e68 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/PrintOrderPartsRespVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/PrintOrderPartsRespVO.java @@ -68,4 +68,23 @@ public class PrintOrderPartsRespVO { private String type; + @Schema(description = "配件颜色", requiredMode = Schema.RequiredMode.REQUIRED) + private String partsColor; + + @Schema(description = "配件宽度", requiredMode = Schema.RequiredMode.REQUIRED) + private Double partsWidth; + + @Schema(description = "配件长度", requiredMode = Schema.RequiredMode.REQUIRED) + private Double partsLength; + + @Schema(description = "配件厚度", requiredMode = Schema.RequiredMode.REQUIRED) + private Double partsThickness; + + @Schema(description = "配件主类:1封边2五金3组件", requiredMode = Schema.RequiredMode.REQUIRED) + private String category; + + @Schema(description = "子配件ID列表,复合部件时记录子配件ID,半角逗号分隔", requiredMode = Schema.RequiredMode.REQUIRED) + private String subparts; + + } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/RemainBoardInfo.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/RemainBoardInfo.java new file mode 100644 index 000000000..2c599aede --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/RemainBoardInfo.java @@ -0,0 +1,161 @@ +package com.cf.imes.module.executor.controller.admin.plan.saveOptimize; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Objects; + + +@Data +public class RemainBoardInfo { + + + @Schema(description = "余料板ID") + private Long remainId; + + @Schema(description = "商品 ID-大板的实际ID") + private String goodsId; + + @Schema(description = "商品名称") + private String goodsName; + + @Schema(description = "余料板材质") + private String material; + + @Schema(description = "余料板颜色") + private String color; + + + @Schema(description = "余料板颜色") + private String colorBlack; + + + @Schema(description = "纹路 纹路(0正纹1可翻转2反纹)") + private Boolean texture; + + + @Schema(description = "余料板宽") + private Double width; + + + + @Schema(description = "余料板长") + private Double length; + + + + @Schema(description = "余料板厚度") + private Double thickness; + + + + @Schema(description = "价格") + private BigDecimal price; + + + @Schema(description = "品牌") + private String brand; + + + @Schema(description = "规格") + private String spec; + + + @Schema(description = "备注") + private String remark; + + + private Integer cutedType; + + private String height; + + + private Boolean isRealCuttingBoard; + + + @Schema(description = "余料板数量") + private Integer count; + + + private String cutKnifeName; + + + private String placeBoardJSON; + + + private Integer usedCount; + + + private BigDecimal avgUsageRateAll; + + + private BigDecimal avgUsageRateExcludeLastBoard; + + + private BigDecimal usageRateLastBoard; + + + private List placeBoardList; + + + @Data + public static class PlaceBoardList { + + private Integer boardId; + + private Double width; + + private Double length; + + private Boolean isRemainBoard; + + private String remainNo; + + private Integer remainId; + + private Boolean isScrap; + + private List points; + + private List blocks; + + private List objects; + + private BigDecimal area; + + private Boolean isTwoFaceProcess; + + } + + + @Data + public static class Blocks { + + private String blockId; + + private String blockNo; + + private Integer boardId; + + private BigDecimal placeX; + + private BigDecimal placeY; + + private BigDecimal width; + + private BigDecimal length; + + private Integer placeStyle; + + private BigDecimal area; + + } + + + + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/RemainBoardList.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/RemainBoardList.java index 28e5d499f..feb25e94c 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/RemainBoardList.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/RemainBoardList.java @@ -4,6 +4,8 @@ package com.cf.imes.module.executor.controller.admin.plan.saveOptimize; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import java.math.BigDecimal; + @Data @Schema(description = "优化生产使用的余料板的信息") public class RemainBoardList { @@ -66,4 +68,63 @@ public class RemainBoardList { + + + + @Schema(description = "余料板ID") + private Long remainId; + + + @Schema(description = "商品 ID-大板的实际ID") + private String goodsId; + + + @Schema(description = "商品名称") + private String goodsName; + + + + + @Schema(description = "价格") + private BigDecimal price; + + + + @Schema(description = "规格") + private String spec; + + + + + + private Boolean isRealCuttingBoard; + + + + private String cutKnifeName; + + + + private String placeBoardJSON; + + + + private Integer usedCount; + + + private BigDecimal avgUsageRateAll; + + + private BigDecimal avgUsageRateExcludeLastBoard; + + + private BigDecimal usageRateLastBoard; + + + + + + + + } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/SavePlanPlateResultReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/SavePlanPlateResultReqVO.java index 80ca56353..b79119faf 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/SavePlanPlateResultReqVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/SavePlanPlateResultReqVO.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; import java.util.List; @Data @@ -17,10 +18,9 @@ public class SavePlanPlateResultReqVO { private List optimizeBoardModelDOS; - - @Schema(description = "优化后的余料板数据", requiredMode = Schema.RequiredMode.REQUIRED) - private List optimizeRemainPlates; - + @Schema(description = "方案组的配置项ID", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "方案组的配置项ID不能为空") + private Long planConfigId; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/SaveProcessSchemeModelDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/SaveProcessSchemeModelDO.java new file mode 100644 index 000000000..9458ec347 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/SaveProcessSchemeModelDO.java @@ -0,0 +1,58 @@ +package com.cf.imes.module.executor.controller.admin.plan.saveOptimize; + + +import com.cf.imes.framework.es.core.dal.ESDocument; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author 保存加工方案组信息 + */ + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class SaveProcessSchemeModelDO extends ESDocument { + + + @Schema(description = "排单ID", requiredMode = Schema.RequiredMode.REQUIRED) + private Long planId; + + + @Schema(description = "是否已经优化", requiredMode = Schema.RequiredMode.REQUIRED) + private Boolean isOptimized; + + + @Schema(description = "加工方案组的配置项ID", requiredMode = Schema.RequiredMode.REQUIRED) + private Long planConfigId; + + + @Schema(description = "配置项的名称", requiredMode = Schema.RequiredMode.REQUIRED) + private String planName; + + + @Schema(description = "大板数量", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer goodsNum; + + + @Schema(description = "小板数量", requiredMode = Schema.RequiredMode.REQUIRED) + private Long plateNum; + + + @Schema(description = "机台类型", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer machineType; + + + @Schema(description = "优化信息", requiredMode = Schema.RequiredMode.REQUIRED) + private String setting; + + + @Schema(description = "排单对应的优化生产的优化数据", requiredMode = Schema.RequiredMode.REQUIRED) + private String planOptimize; + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/SaveProcessSchemeReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/SaveProcessSchemeReqVO.java new file mode 100644 index 000000000..bd677e387 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/SaveProcessSchemeReqVO.java @@ -0,0 +1,25 @@ +package com.cf.imes.module.executor.controller.admin.plan.saveOptimize; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + + +@Data +public class SaveProcessSchemeReqVO { + + + @Schema(description = "方案组ID", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "方案组的ID不能为空") + private Long processId; + + + @Schema(description = "方案组保存的优化信息", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "方案组保存的优化信息不能为空") + private List modelDOList; + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/AdvancedScreeningConfig.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/AdvancedScreeningConfig.java new file mode 100644 index 000000000..9dcb29423 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/AdvancedScreeningConfig.java @@ -0,0 +1,47 @@ +package com.cf.imes.module.executor.controller.admin.plan.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +/** + * @author Administrator + */ + +@Data +@ToString(callSuper = true) +public class AdvancedScreeningConfig { + + + @Schema(description = "MySQL筛选的条件-板材的筛选数据") + private String plateDataFilter; + + + @Schema(description = "连接两个条件的逻辑运算符") + private String logicalOperator; + + + @Schema(description = "ES筛选的条件-造型的筛选数据") + private String modelDataFilter; + + +// @Valid +// @Data +// public static class FilterCriteria { +// +// // 条件字段名 +// private String fieldKey; +// +// // 逻辑运算符 +// private String operator; +// +// // 值 +// private String fieldValue; +// +// // 连接下一个判断的逻辑运算符 +// private String nextOperator; +// +// } + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/BranchingPlanSaveReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/BranchingPlanSaveReqVO.java new file mode 100644 index 000000000..4e3b673b7 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/BranchingPlanSaveReqVO.java @@ -0,0 +1,48 @@ +package com.cf.imes.module.executor.controller.admin.plan.vo; + + +import com.cf.imes.framework.es.core.valid.CreateGroup; +import com.cf.imes.framework.es.core.valid.UpdateGroup; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import java.util.List; + +@Schema(description = "智能分线创建排单") +@Data +public class BranchingPlanSaveReqVO { + + + @Schema(description = "机台 ID", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "机台 ID不能为空") + private Long machineId; + + + + @Schema(description = "生产单id与商品id 列表,修改排单时,只传入新增的那一部分",requiredMode = Schema.RequiredMode.REQUIRED) + @Valid + private List itemList; + + + @Data + public static class Item { + + @Schema(description = "生产单的商品id") + @NotNull(message = "生产单数据错误,请检查生产单数据或重新导入,排单创建失败",groups = {UpdateGroup.class, CreateGroup.class}) + private Long id; + + @Schema(description = "生产单id") + @NotNull(message = "生产单数据错误,请检查生产单数据或重新导入,排单创建失败",groups = {UpdateGroup.class, CreateGroup.class}) + private Long orderId; + + @Schema(description = "板材库大板id") + @NotNull(message = "生产单数据错误,请检查生产单数据或重新导入,排单创建失败",groups = {UpdateGroup.class, CreateGroup.class}) + private String goodsId; + + @Schema(description = "余料板ID") + private Long remainPlateId; + + } +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/GoodsReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/GoodsReqVO.java index 1346cda20..3884b30ca 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/GoodsReqVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/GoodsReqVO.java @@ -3,26 +3,26 @@ package com.cf.imes.module.executor.controller.admin.plan.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import lombok.Setter; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.List; import static com.cf.imes.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @Schema(description = "管理后台 - 生产单商品表") @Data +@Setter public class GoodsReqVO { - @Schema(description = "主键-大板分类ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4109") private Long id; - @Schema(description = "余料板ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4109") private Long remainId; - @Schema(description = "生产单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12114") private Long orderId; @@ -53,7 +53,7 @@ public class GoodsReqVO { @Schema(description = "厚度", requiredMode = Schema.RequiredMode.REQUIRED) private BigDecimal thickness; - @Schema(description = "价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "7305") + @Schema(description = "价格", requiredMode = Schema.RequiredMode.REQUIRED) private BigDecimal price; @Schema(description = "品牌", requiredMode = Schema.RequiredMode.REQUIRED) @@ -62,9 +62,17 @@ public class GoodsReqVO { @Schema(description = "规格", requiredMode = Schema.RequiredMode.REQUIRED) private String spec; - @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "你猜") + @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED) private String remark; + @Schema(description = "大板对应的小板数量") + private Long plateNum; + + @Schema(description = "大板对应的小板平方数") + private BigDecimal plateArea; + + @Schema(description = "生产单商品列表") + private List goodsReqVOS; @Schema(description = "创建人", requiredMode = Schema.RequiredMode.REQUIRED) diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/OrderGoodsResp.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/OrderGoodsResp.java index 0f0f85b4a..b0f6770c2 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/OrderGoodsResp.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/OrderGoodsResp.java @@ -48,6 +48,8 @@ public class OrderGoodsResp { @Schema(description = "生产单信息") private List orderList; + @Schema(description = "随机数据-唯一标识") + private String sort; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/OrderPageReqVOCopy.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/OrderPageReqVOCopy.java index 826fcd965..278b36d0d 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/OrderPageReqVOCopy.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/OrderPageReqVOCopy.java @@ -8,6 +8,7 @@ import org.hibernate.validator.constraints.Length; import org.springframework.format.annotation.DateTimeFormat; import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; import java.math.BigDecimal; import java.time.LocalDate; import java.util.List; @@ -83,17 +84,21 @@ public class OrderPageReqVOCopy extends PageParam { private BigDecimal widthMaxRang; - // todo 目前商品ID的数据筛选只解决了非混单的情况(非混单,数据类型为Long即可,混单情况需要改变),混单数据筛选待解决 - @Schema(description = "商品ID-板材库对应的大板ID") - private String goodsId; + @Schema(description = "商品ID-板材库对应的大板ID-由板材查询生产单时传") + @Size(max = 20,message = "最多可同时查询20个板材") + private List goodsId; + + @Schema(description = "排单ID-修改排单时为必传条件") + private Long planId; - @Schema(description = "大板分类ID") - private List ids; @Schema(description = "房间ID") private List roomId; + @Schema(description = "柜体ID") private List bodyId; + @Schema(description = "生产单ids") + @Size(max = 20,message = "最多可同时查询20个生产单") private List orderIds; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/OrderRespVOCopy.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/OrderRespVOCopy.java index 9948ff389..144c44f45 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/OrderRespVOCopy.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/OrderRespVOCopy.java @@ -41,20 +41,16 @@ public class OrderRespVOCopy { @Schema(description = "更新时间") @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT) private Date updateTime; + @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT) + private Date createTime; @Schema(description = "片数") private int num; @Schema(description = "平方") private BigDecimal area = new BigDecimal("0"); @Schema(description = "商品id") private String goodsId; -// @Schema(description = "商品名称") -// private String goodsName; @Schema(description = "订单对应的板件的信息") private List platePages; -// @Schema(description = "颜色") -// private String color; -// @Schema(description = "材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板") -// private String material; } \ 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/controller/admin/plan/vo/PlanOrderRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlanOrderRespVO.java index e2969b8bf..bd26df5e7 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlanOrderRespVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlanOrderRespVO.java @@ -1,10 +1,8 @@ package com.cf.imes.module.executor.controller.admin.plan.vo; -import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.time.LocalDateTime; @@ -23,7 +21,7 @@ public class PlanOrderRespVO { private Long planId; @Schema(description = "生产单日期") - @NotNull(message = "交付日期不能为空") + @NotNull(message = "生产单日期不能为空") private LocalDateTime orderDate; @Schema(description = "交付日期") diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlanPageReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlanPageReqVO.java index fce64f723..95827a517 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlanPageReqVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlanPageReqVO.java @@ -1,7 +1,6 @@ package com.cf.imes.module.executor.controller.admin.plan.vo; import com.cf.imes.framework.common.pojo.PageParam; -import com.cf.imes.module.executor.validation.plan.PlanStatusValid; import com.cf.imes.module.executor.validation.plan.PlanTypeValid; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -12,6 +11,7 @@ import org.springframework.format.annotation.DateTimeFormat; import javax.validation.constraints.Pattern; import java.time.LocalDateTime; +import java.util.List; import static com.cf.imes.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @@ -34,16 +34,14 @@ public class PlanPageReqVO extends PageParam { @Schema(description = "排序优先级") private Integer sort; - @Schema(description = "排单类型:1 混单排单,2 生产单排单", example = "2") + @Schema(description = "排单类型:1 混单排单,2 生产单排单") @PlanTypeValid private Integer type; - @Schema(description = "排单状态:0 未开料,1 开料中,2 已开料", example = "1") - @PlanStatusValid - private Integer status; + @Schema(description = "排单状态:0 未开料,1 开料中,2 已开料") +// @PlanStatusValid + private List status; -// @Schema(description = "是否支付:0 否,1 是") -// private Boolean isPay; @Schema(description = "机台 ID", example = "16707") private Long machineId; 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 f6fcd92ea..f7c5d3e6e 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 @@ -19,7 +19,7 @@ public class PlanRespVO { @Schema(description = "排序优先级", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("排序优先级") - private Integer sort; + private Long sort; @Schema(description = "排单类型:1 混单排单,2 生产单排单", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") @ExcelProperty("排单类型:1 混单排单,2 生产单排单") @@ -29,14 +29,16 @@ public class PlanRespVO { @ExcelProperty("排单状态:0 新单,1 板材已申请,2 开料中,3 已开料") private Integer status; + @Schema(description = "板材过滤条件") + private String filter; - @Schema(description = "机台 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "16707") - @ExcelProperty("机台 ID") - private Long machineId; + @Schema(description = "方案 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "16707") + @ExcelProperty("方案 ID") + private Long processId; - @Schema(description = "机台 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "16707") - @ExcelProperty("机台 名称") - private String machineName; + @Schema(description = "方案 名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "16707") + @ExcelProperty("方案 名称") + private String processName; @Schema(description = "计划时间", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("计划时间") @@ -73,8 +75,8 @@ public class PlanRespVO { private LocalDateTime produceTime; - @Schema(description = "优化大板片数") - private Long optimizeGoodsCount; + @Schema(description = "大板总数") + private Long goodsCount; @Schema(description = "已开料的大板片数") diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlanSaveReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlanSaveReqVO.java index 3a3d88a9c..183445095 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlanSaveReqVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlanSaveReqVO.java @@ -1,94 +1,61 @@ package com.cf.imes.module.executor.controller.admin.plan.vo; -import com.cf.imes.framework.es.core.valid.CreateGroup; -import com.cf.imes.framework.es.core.valid.UpdateGroup; +import com.cf.imes.module.executor.controller.admin.plate.vo.OrderPlateIds; import com.cf.imes.module.executor.validation.plan.PlanStatusValid; -import com.cf.imes.module.executor.validation.plan.PlanTypeValid; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -import org.hibernate.validator.constraints.Length; -import javax.validation.Valid; import javax.validation.constraints.Max; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; -import java.time.LocalDateTime; import java.util.List; @Schema(description = "管理后台 - 生产单开料排单新增/修改 Request VO") @Data public class PlanSaveReqVO { - @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "排单数据异常,请重新操作",groups = UpdateGroup.class) + @Schema(description = "ID") +// @NotNull(message = "排单数据异常,请重新操作",groups = UpdateGroup.class) @Max(value = 0x7fffffffffffffffL,message = "排单号异常,无法更新排单数据") private Long id; - @Schema(description = "排序优先级") - private Long sort; + @Schema(description = "是否开启混单", requiredMode = Schema.RequiredMode.REQUIRED) + private Boolean isMix; - @Schema(description = "排单类型:1 混单排单,2 生产单排单", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "排单类型:1 混单排单,2 生产单排单不能为空", groups = CreateGroup.class) - @PlanTypeValid - private Integer type; - - - @Schema(description = "排单状态:0 未开料,1 开料中,2 已开料", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "排单状态:0 未开料,1 开料中,2 已开料 不能为空", groups = CreateGroup.class) + @Schema(description = "排单状态:0 未开料,1 开料中,2 已开料,3 已投产") +// @NotNull(message = "排单状态:0 未开料,1 已投产,2 开料中,3 已开料", groups = UpdateGroup.class) @PlanStatusValid private Integer status; - @Schema(description = "机台 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "16707") - @NotNull(message = "机台 ID不能为空") - private Long machineId; + @Schema(description = "需要进行排单的板材信息") + private SavePlanPlateList savePlanPlateList; - @Schema(description = "计划时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime planTime; + @Schema(description = "方案ID") + private Long processId; + + + @Schema(description = "新增的小板ID") + private List insertOrderPlateIds; + + + @Schema(description = "去除的小板ID") + private List deleteOrderPlateIds; - @Schema(description = "备注") - @Length(max = 255, message = "备注长度不能超过255个字符") - private String remark; + +// @Schema(description = "排单类型:1 混单排单,2 生产单排单", requiredMode = Schema.RequiredMode.REQUIRED) +// @NotNull(message = "排单类型:1 混单排单,2 生产单排单不能为空", groups = CreateGroup.class) +// @PlanTypeValid +// private Integer type; - @Schema(description = "生产操作人") - private String operator; + +// @Schema(description = "板材过滤条件") +// @Size(max = 7,message = "板材过滤条件数量不正确") +// private List filter; - @Schema(description = "生产时间") - private LocalDateTime produceTime; - - - @Schema(description = "生产单id与商品id 列表,修改排单时,只传入新增的那一部分",requiredMode = Schema.RequiredMode.REQUIRED) - @Valid - private List itemList; - - - @Schema(description = "去除的大板分类ID") - private List deleteIds; - - - @Data - public static class Item { - - @Schema(description = "生产单的商品id") - @NotNull(message = "生产单数据错误,请检查生产单数据或重新导入,排单创建失败",groups = {UpdateGroup.class, CreateGroup.class}) - private Long id; - - @Schema(description = "生产单id") - @NotNull(message = "生产单数据错误,请检查生产单数据或重新导入,排单创建失败",groups = {UpdateGroup.class, CreateGroup.class}) - private Long orderId; - - @Schema(description = "板材库大板id") - @NotNull(message = "生产单数据错误,请检查生产单数据或重新导入,排单创建失败",groups = {UpdateGroup.class, CreateGroup.class}) - private String goodsId; - - @Schema(description = "余料板ID") - private Long remainPlateId; - } } \ 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/controller/admin/plan/vo/PlateDetialRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlateDetailRespVO.java similarity index 97% rename from cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlateDetialRespVO.java rename to cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlateDetailRespVO.java index 9e31cdb1a..c68fc09b6 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlateDetialRespVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlateDetailRespVO.java @@ -10,7 +10,7 @@ import java.util.List; @Schema(description = "管理后台 - 生产单板件 Response VO") @Data -public class PlateDetialRespVO { +public class PlateDetailRespVO { @Schema(description = "板件ID", requiredMode = Schema.RequiredMode.REQUIRED) private Long plateId; @@ -49,6 +49,8 @@ public class PlateDetialRespVO { @Schema(description = "板编号", requiredMode = Schema.RequiredMode.REQUIRED) private String plateNo; + @Schema(description = "自定义板编号", requiredMode = Schema.RequiredMode.REQUIRED) + private String customPlateNo; @Schema(description = "板名称", requiredMode = Schema.RequiredMode.REQUIRED) private String name; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlateResList.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlateResList.java index 4044552b6..8fc98160f 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlateResList.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlateResList.java @@ -8,10 +8,16 @@ import java.math.BigDecimal; @Data public class PlateResList { + @Schema(description = "排单ID") + private Long planId; @Schema(description = "板材id") private Long plateId; + @Schema(description = "板材库大板id-大板的实际ID") + private String goodsId; @Schema(description = "生产单id") private Long orderId; + @Schema(description = "大板的分类ID") + private Long id; @Schema(description = "房间id") private Long roomId; @Schema(description = "房间名称") @@ -20,18 +26,20 @@ public class PlateResList { private Long bodyId; @Schema(description = "柜体名称") private String bodyName; - @Schema(description = "自定义板材编号") + @Schema(description = "板编号") private String plateNo; + @Schema(description = "自定义板编号") + private String customPlateNo; @Schema(description = "板材名称") private String plateName; @Schema(description = "商品颜色") private String color; @Schema(description = "小板宽") - private String width; + private BigDecimal width; @Schema(description = "小板高") - private String height; + private BigDecimal height; @Schema(description = "小板厚") - private String thickness; + private BigDecimal thickness; @Schema(description = "面积") private BigDecimal area; @Schema(description = "左封边厚度") @@ -46,6 +54,12 @@ public class PlateResList { private Boolean isSpecialShaped; @Schema(description = "是否造型") private Boolean isSculpt; + @Schema(description = "是否排孔") + private Boolean isRowHole; @Schema(description = "材质") private String material; + @Schema(description = "纹路") + private Boolean texture; + @Schema(description = "备注") + private String remark; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/SavePlanPlateList.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/SavePlanPlateList.java new file mode 100644 index 000000000..366a2d290 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/SavePlanPlateList.java @@ -0,0 +1,80 @@ +package com.cf.imes.module.executor.controller.admin.plan.vo; + +import com.cf.imes.framework.es.core.valid.CreateGroup; +import com.cf.imes.framework.es.core.valid.UpdateGroup; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @author Beal + */ +@Data +public class SavePlanPlateList { + + + + @Schema(description = "小板的信息列表",requiredMode = Schema.RequiredMode.REQUIRED) + @Valid + private List plateItemList; + + + @Schema(description = "大板的信息列表",requiredMode = Schema.RequiredMode.REQUIRED) + @Valid + private List goodsItemList; + + + + + @Data + public static class PlateItemList { + + @Schema(description = "生产单id") + @NotNull(message = "生产单数据错误,请检查生产单数据或重新导入,排单创建失败",groups = {UpdateGroup.class, CreateGroup.class}) + private Long plateId; + + @Schema(description = "生产单的商品id") + @NotNull(message = "生产单数据错误,请检查生产单数据或重新导入,排单创建失败",groups = {UpdateGroup.class, CreateGroup.class}) + private Long id; + + @Schema(description = "生产单id") + @NotNull(message = "生产单数据错误,请检查生产单数据或重新导入,排单创建失败",groups = {UpdateGroup.class, CreateGroup.class}) + private Long orderId; + + + } + + + @Data + public static class GoodsItemList { + + + @Schema(description = "生产单的商品id") + @NotNull(message = "生产单数据错误,请检查生产单数据或重新导入,排单创建失败",groups = {UpdateGroup.class, CreateGroup.class}) + private Long id; + + + @Schema(description = "板材库大板id-这个在新版还是需要的") + @NotNull(message = "生产单数据错误,请检查生产单数据或重新导入,排单创建失败",groups = {UpdateGroup.class, CreateGroup.class}) + private String goodsId; + + + @Schema(description = "大板的材质") + private String material; + + + @Schema(description = "大板的厚度") + private Integer thickness; + + + @Schema(description = "大板的颜色") + private String color; + + + } + +} + diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/SavePlanPlateResult.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/SavePlanPlateResult.java deleted file mode 100644 index c39344f24..000000000 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/SavePlanPlateResult.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.cf.imes.module.executor.controller.admin.plan.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.web.multipart.MultipartFile; -import javax.validation.constraints.NotNull; - -/** - * @author Beal - */ -@Data -public class SavePlanPlateResult { - - @NotNull(message = "排单id") - @Schema(description = "排单id") - private Long planId; - - @Schema(description = "文件附件", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "文件附件不能为空") - private MultipartFile placeOrder; - - @Schema(description = "文件附件", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "文件附件不能为空") - private MultipartFile placeData; -} - diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/SortVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/SortVO.java index 2f328dbb3..0e67f876b 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/SortVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/SortVO.java @@ -12,7 +12,7 @@ import javax.validation.constraints.NotNull; @Data @Valid public class SortVO { - @Schema(description = "排单id") + @Schema(description = "排单id", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "排单id 不能空") private Long planId; @@ -20,4 +20,8 @@ public class SortVO { @NotNull(message = "排序不能空") private Long sort; + @Schema(description = "是否置顶", requiredMode = Schema.RequiredMode.REQUIRED,example = "false") +// @NotNull(message = "是否置顶不能空") + private Boolean isTopUp; + } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/PlateController.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/PlateController.java index 12c1f910a..ee6260c8f 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/PlateController.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/PlateController.java @@ -6,8 +6,10 @@ import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.excel.core.util.ExcelUtils; import com.cf.imes.framework.operatelog.core.annotations.OperateLog; +import com.cf.imes.module.executor.controller.admin.plan.vo.PlateResList; import com.cf.imes.module.executor.controller.admin.plate.vo.*; import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO; +import com.cf.imes.module.executor.dal.dataobject.plate.PlateGoodDO; import com.cf.imes.module.executor.service.plate.PlateService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -76,13 +78,27 @@ public class PlateController { } @GetMapping("/page") - @Operation(summary = "获得生产单板件分页") - @PreAuthorize("@ss.hasPermission('executor:plate:query')") - public CommonResult> getPlatePage(@Valid PlatePageReqVO pageReqVO) { - PageResult pageResult = plateService.getPlatePage(pageReqVO); - return success(BeanUtils.toBean(pageResult, PlateRespVO.class)); + @Operation(summary = "未排单获取实际板材") +// @PreAuthorize("@ss.hasPermission('executor:plate:query')") + public CommonResult> getGoodsPlate(@Valid GoodsPlateFilterPageReqVO pageReqVO) { + + return success(plateService.getGoodsPlate(pageReqVO)); } + + + @GetMapping("/getPlatePage") + @Operation(summary = "获取未排单的生产单板件") +// @PreAuthorize("@ss.hasPermission('executor:plate:query')") + public CommonResult> getPlatePage(@Valid NoPlanPlatePageReqVO reqVO) { + + return success(plateService.getOrderPlatePage(reqVO)); + + } + + + + @GetMapping("/export-excel") @Operation(summary = "导出生产单板件 Excel") @PreAuthorize("@ss.hasPermission('executor:plate:export')") diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/GoodsPlateFilterPageReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/GoodsPlateFilterPageReqVO.java new file mode 100644 index 000000000..e9ec87e9f --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/GoodsPlateFilterPageReqVO.java @@ -0,0 +1,86 @@ +package com.cf.imes.module.executor.controller.admin.plate.vo; + + +import com.cf.imes.framework.common.pojo.PageParam; +import com.cf.imes.framework.common.validation.NumberValid; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * @author 分页 + */ +@Schema(description = "未排单查询实际板材分页") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@AllArgsConstructor +@NoArgsConstructor +public class GoodsPlateFilterPageReqVO extends PageParam { + + + @Schema(description = "排单ID",requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "排单ID不能为空") + private Long planId; + + + @Schema(description = "厚度",requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "厚度不能为空") + private BigDecimal thickness; + + + @Schema(description = "材质",requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "材质不能为空") + private String material; + + + @Schema(description = "颜色",requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "颜色不能为空") + private String color; + + + @Schema(description = "大板的实际ID") + private String goodsIds; + + + @Schema(description = "商品名称") + private String goodsName; + + @Schema(description = "选择实际板材的颜色字段") + private String filterColor; + + + @Schema(description = "是否有纹路") + private Boolean texture; + + + @Schema(description = "规格") + private String spec; + + + @Schema(description = "长 小范围") + @NumberValid(name = "长度") + private BigDecimal longMinRang; + + + @Schema(description = "长 大范围") + @NumberValid(name = "长度") + private BigDecimal longMaxRang; + + + @Schema(description = "宽 小范围") + @NumberValid(name = "宽度") + private BigDecimal widthMinRang; + + + @Schema(description = "宽 大范围") + @NumberValid(name = "宽度") + private BigDecimal widthMaxRang; + + + @Schema(description = "备注") + private String remark; + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/KaiLiaoSize.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/KaiLiaoSize.java deleted file mode 100644 index 5140b947c..000000000 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/KaiLiaoSize.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.cf.imes.module.executor.controller.admin.plate.vo; - -import lombok.Data; - -/** - * @author Beal - */ -@Data -public class KaiLiaoSize { - private Double width; - private Double height; -} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/NoPlanPlatePageReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/NoPlanPlatePageReqVO.java new file mode 100644 index 000000000..4e1af4ca9 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/NoPlanPlatePageReqVO.java @@ -0,0 +1,109 @@ +package com.cf.imes.module.executor.controller.admin.plate.vo; + + +import com.cf.imes.framework.common.pojo.PageParam; +import com.cf.imes.framework.common.validation.NumberValid; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.Pattern; +import java.math.BigDecimal; +import java.util.List; + + +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class NoPlanPlatePageReqVO extends PageParam { + + + @Schema(description = "生产单id") + @Pattern(regexp = "^[0-9]*$",message = "生产单号必须为数字") + @Length(max = 19,message = "生产单号长度不能超过19位") + private String orderId; + + + @Schema(description = "板编号") + private String plateNo; + + @Schema(description = "大板") + private List goodsIdList; + + @Schema(description = "板号-小板ID") + private String plateId; + + + @Schema(description = "自定义板编号") + private String customPlateNo; + + + @Schema(description = "材质-在排单界面添加板材时为必传的") + private String material; + + + @Schema(description = "颜色-在排单界面添加板材时为必传的") + private String color; + + + @Schema(description = "厚度-在排单界面添加板材时为必传的") + private Integer thickness; + + + @Schema(description = "板名称") + private String name; + + + @Schema(description = "长 小范围") + @NumberValid(name = "长度") + private BigDecimal longMinRang; + + + @Schema(description = "长 大范围") + @NumberValid(name = "长度") + private BigDecimal longMaxRang; + + + @Schema(description = "宽 小范围") + @NumberValid(name = "宽度") + private BigDecimal widthMinRang; + + + @Schema(description = "宽 大范围") + @NumberValid(name = "宽度") + private BigDecimal widthMaxRang; + + + @Schema(description = "厚 小范围") + @NumberValid(name = "厚度") + private BigDecimal thicknessMinRang; + + + @Schema(description = "厚 大范围") + @NumberValid(name = "厚度") + private BigDecimal thicknessMaxRang; + + + @Schema(description = "纹路") + private Boolean texture; + + + @Schema(description = "异形") + private Boolean isSpecialShaped; + + + @Schema(description = "造型") + private Boolean isSculpt; + + + @Schema(description = "是否排孔") + private Boolean isRowHole; + + + @Schema(description = "备注") + private String remark; + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/OffSet.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/OffSet.java deleted file mode 100644 index 9f5a7b8d5..000000000 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/OffSet.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.cf.imes.module.executor.controller.admin.plate.vo; - -import lombok.Data; - -/** - * @author Beal - */ -@Data -public class OffSet { - private Integer x; - private Integer y; - private Integer z; -} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/OrderPlateIds.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/OrderPlateIds.java new file mode 100644 index 000000000..3ae5c3e9c --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/OrderPlateIds.java @@ -0,0 +1,30 @@ +package com.cf.imes.module.executor.controller.admin.plate.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +@Schema(description = "管理后台 - 查询板件") +@Data +@ToString(callSuper = true) +public class OrderPlateIds { + + + @Schema(description = "大板ID-大板分类的ID") + private Long id; + + + @Schema(description = "生产单ID") + private Long orderId; + + + @Schema(description = "板材ID") + private Long plateId; + + + @Schema(description = "删除和添加小板时传入") + private Long planId; + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/PlateModelDetailRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/PlateModelDetailRespVO.java new file mode 100644 index 000000000..912fc1112 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/PlateModelDetailRespVO.java @@ -0,0 +1,30 @@ +package com.cf.imes.module.executor.controller.admin.plate.vo; + + +import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.module.executor.controller.admin.plan.vo.PlateResList; +import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderModelDO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; +import lombok.Data; + +import java.util.List; + + +/** + * @author 未排单的小板和造型的信息 + */ +@Data +@Builder +public class PlateModelDetailRespVO { + + + @Schema(description = "未排单的小板的信息数据") + private PageResult plateResLists; + + + @Schema(description = "小板造型列表") + private List plateModels; + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/ProcessPlateReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/ProcessPlateReqVO.java deleted file mode 100644 index 53bb9a30f..000000000 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/ProcessPlateReqVO.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.cf.imes.module.executor.controller.admin.plate.vo; - - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.ToString; - -@Schema(description = "管理后台 - 查询板件") -@Data -@ToString(callSuper = true) -public class ProcessPlateReqVO { - - - @Schema(description = "工序类型",requiredMode = Schema.RequiredMode.REQUIRED) - private Long processType; - - - @Schema(description = "生产单号",requiredMode = Schema.RequiredMode.REQUIRED) - private Long orderId; - - - @Schema(description = "工序明细ID",requiredMode = Schema.RequiredMode.REQUIRED) - private Long stepItemId; - - - @Schema(description = "柜体ID") - private Long bodyId; - - - -} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/goods/CutedBoardInfo.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/goods/CutedBoardInfo.java index ef37a28f9..ebda41901 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/goods/CutedBoardInfo.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/goods/CutedBoardInfo.java @@ -17,6 +17,9 @@ import java.util.List; public class CutedBoardInfo { + @Schema(description = "实际开料的大板ID") + private String goodsId; + @Schema(description = "已开料大板数量") private Long cutedBoardNumber; @@ -25,4 +28,7 @@ public class CutedBoardInfo { private List cutedBoardList; + @Schema(description = "开料中的大板编号") + private List cutedBoardIsCuttingList; + } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/goods/OptimizeBoardModelDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/goods/OptimizeBoardModelDO.java index 42628df2b..be0bc749b 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/goods/OptimizeBoardModelDO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/goods/OptimizeBoardModelDO.java @@ -2,6 +2,7 @@ package com.cf.imes.module.executor.dal.dataobject.goods; import com.cf.imes.framework.es.core.dal.ESDocument; +import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.ActualGoodsList; import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.RemainBoardList; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; @@ -30,21 +31,44 @@ public class OptimizeBoardModelDO extends ESDocument { private List orderId; - @Schema(description = "大板的实际ID") - private String goodsId; + @Schema(description = "方案组的配置项ID") + private Long planConfigId; + + + @Schema(description = "方案组的配置项名称") + private String planConfigName; + + + @Schema(description = "是否锁定排单") + private Boolean isLock; + + + @Schema(description = "实际的开料的大板的ID") + @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY) + private List goodsId; + + + @Schema(description = "原板材信息的大板ID") + @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY) + private List mixGoodsIds; @Schema(description = "生产单已优化小板数量") private Long placeBlockNumber; + @Schema(description = "已开料大板数量") + private Long cutedBoardNumber; + + // 新的数据集需要去除 @Schema(description = "排单优化的大板数量") private Long placeBoardNumber; @Schema(description = "已开料大板数据集") - private CutedBoardInfo cutedBoardInfo; + @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY) + private List cutedBoardInfo; @Schema(description = "大板原长") @@ -147,6 +171,8 @@ public class OptimizeBoardModelDO extends ESDocument { private List remainBoardList; + @Schema(description = "大板板材列表-实际的开料的大板信息") + private List actualGoodsList; } 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 b2616549d..b88c34d69 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 @@ -43,10 +43,23 @@ public class PlanDO extends BaseDO { */ private Integer status; + /** + * 板材过滤条件 + */ + private String filter; + + /** * 机台 ID */ private Long machineId; + + /** + * 方案 ID + */ + private Long processId; + + /** * 计划时间 */ @@ -69,4 +82,10 @@ public class PlanDO extends BaseDO { */ private LocalDateTime produceTime; + +// /** +// * 是否置顶( 0:不置顶,1:置顶 ) +// */ +// private Boolean isTopUp; + } \ 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/planitem/PlanItemDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/planitem/PlanItemDO.java index 1874f1218..0b5c9a209 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/planitem/PlanItemDO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/planitem/PlanItemDO.java @@ -1,9 +1,7 @@ package com.cf.imes.module.executor.dal.dataobject.planitem; -import lombok.*; -import java.util.*; import com.baomidou.mybatisplus.annotation.*; -import com.cf.imes.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; /** * 生产单开料排单明细 DO @@ -25,9 +23,17 @@ public class PlanItemDO { @TableId private Long id; /** - * 明细 ID + * 生产单 ID */ - private Long itemId; + private Long orderId; + /** + * 小板 ID + */ + private Long plateId; + /** + * 大板 ID + */ + private Long goodsId; /** * 排单 ID */ 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 17302d419..c1086fd72 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 @@ -169,6 +169,10 @@ public class PlateDO extends BaseDO { * 是否优化 */ private Boolean isOptimized; + /** + * 是否开料,0:未开料,1:开料中,2:已开料 + */ + private Integer isCutted; /** * 排单过滤类型,1 有挖穿造型 2 有挖穿孔 4 有二维刀路 8 可叠 */ diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/goods/GoodsMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/goods/GoodsMapper.java index 9b37b2e93..5b45d7087 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/goods/GoodsMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/goods/GoodsMapper.java @@ -8,8 +8,11 @@ import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.module.executor.controller.admin.goods.vo.GoodsPageReqVO; +import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderGoodsPlateIds; import com.cf.imes.module.executor.controller.admin.plan.bo.OrderRoomBodyList; -import com.cf.imes.module.executor.controller.admin.plan.vo.*; +import com.cf.imes.module.executor.controller.admin.plan.vo.GoodsReqVO; +import com.cf.imes.module.executor.controller.admin.plan.vo.PlateInfoVO; +import com.cf.imes.module.executor.controller.admin.plan.vo.PlateResList; import com.cf.imes.module.executor.dal.dataobject.goods.GoodsDO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -82,15 +85,20 @@ public interface GoodsMapper extends BaseMapperX { - default List selectListByGoodsId(String goodsId, Long organId) { + default List selectListByGoodsId(List orderIds,List goodsIds, Long organId) { return selectList(new LambdaQueryWrapperX() .eq(GoodsDO::getOrganId, organId) - .eq(GoodsDO::getDeleted, false) - .eq(GoodsDO::getPlanId ,0) - .eq(GoodsDO::getGoodsId, goodsId)); + .in(GoodsDO::getOrderId,orderIds) + .in(GoodsDO::getGoodsId, goodsIds) + .eq(GoodsDO::getDeleted, false)); } + + List selectListByGoodsIdList(@Param("goodsId") List goodsId,@Param("organId") Long organId); + + + // 根据生产单删除 default int deleteByOrderId(Long orderId, Long organId) { return delete(new LambdaQueryWrapperX() @@ -118,11 +126,11 @@ public interface GoodsMapper extends BaseMapperX { - default List selectPlanGoodsList(List goodsIds, Long organId) { + default List selectPlanGoodsList(List ids, Long organId) { return selectList(new LambdaQueryWrapperX() .eq(GoodsDO::getOrganId, organId) .eq(GoodsDO::getDeleted, false) - .inIfPresent(GoodsDO::getId,goodsIds)); + .inIfPresent(GoodsDO::getId,ids)); } @@ -132,8 +140,7 @@ public interface GoodsMapper extends BaseMapperX { return selectList(new LambdaQueryWrapperX() .eq(GoodsDO::getOrganId, organId) .eq(GoodsDO::getDeleted, false) - .eqIfPresent(GoodsDO::getPlanId,planId) - .select(GoodsDO::getGoodsId,GoodsDO::getId,GoodsDO::getOrderId)); + .eqIfPresent(GoodsDO::getPlanId,planId)); } @@ -146,17 +153,6 @@ public interface GoodsMapper extends BaseMapperX { - - default int deletePlanGoods(List orderIds,List ids, Long organId) { - return update(new LambdaUpdateWrapper() - .set(GoodsDO::getPlanId, 0) - .eq(GoodsDO::getOrganId, organId) - .in(GoodsDO::getOrderId, orderIds) - .in(GoodsDO::getPlanId, ids)); - } - - - default List selectPlanGoodsListByPlanIdList(List orderIds,List planIds, Long organId) { return selectList(new LambdaQueryWrapperX() .eq(GoodsDO::getOrganId, organId) @@ -204,18 +200,22 @@ public interface GoodsMapper extends BaseMapperX { List selectNoPlanOrders(@Param("orderId") Long orderId, @Param("organId") Long organId); - default List selectNoPlanOrdersListByOrderIds(List orderIds, Long organId) { - return selectList(new LambdaQueryWrapperX() - .eq(GoodsDO::getOrganId, organId) - .eq(GoodsDO::getDeleted, false) - .in(GoodsDO::getOrderId,orderIds) - .eq(GoodsDO::getPlanId,0) - .select(GoodsDO::getOrderId)); - - } - List selectOrderPlanList(@Param("orderIds") List orderIds,@Param("organId") Long organId); List selectPlanOrderListByOrderIds(@Param("orderIds") List orderIds,@Param("organId") Long organId); + List selectPlateGoodIds(@Param("orderIds") List orderIds, @Param("organId") Long organId); + + + default List selectOrderGoodsList(List orderIds, List goodsIds, Long organId) { + return selectList(new LambdaQueryWrapperX() + .eq(GoodsDO::getOrganId, organId) + .eq(GoodsDO::getDeleted, false) +// .eq(GoodsDO::getPlanId,0) + .in(GoodsDO::getOrderId,orderIds) + .in(GoodsDO::getGoodsId,goodsIds) + .select(GoodsDO::getId)); + + } + } \ 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/mysql/order/OrderMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java index 15674c2cd..fe7ea96de 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java @@ -15,10 +15,7 @@ import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderCountPro import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderOverdueRespVO; import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPageReqVO; import com.cf.imes.module.executor.controller.admin.plan.bo.OrderIds; -import com.cf.imes.module.executor.controller.admin.plan.vo.OrderGoodsResp; -import com.cf.imes.module.executor.controller.admin.plan.vo.OrderPageReqVOCopy; -import com.cf.imes.module.executor.controller.admin.plan.vo.OrderRespVOCopy; -import com.cf.imes.module.executor.controller.admin.plan.vo.PlanOrderRespVO; +import com.cf.imes.module.executor.controller.admin.plan.vo.*; import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; import com.cf.imes.module.executor.enums.OrderDeletedEnum; import com.cf.imes.module.executor.enums.OrderStatusEnum; @@ -150,7 +147,7 @@ public interface OrderMapper extends BaseMapperX { } - List selectOrderListByIds(@Param("orderIds") List orderIds, @Param("organId") Long organId); + List selectOrderListByIds(@Param("orderIds") List orderIds, @Param("organId") Long organId); IPage selectOrderIds(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); @@ -282,4 +279,18 @@ public interface OrderMapper extends BaseMapperX { List selectPlanOrderList(@Param("planIds") List planIds, @Param("organId") Long organId); + + + IPage selectFilterOrderPagePlate(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + List selectFilterOrderPlateList(@Param(Constants.WRAPPER) QueryWrapperX queryWrapperX); + + List selectFilterGoodsPlateList(@Param(Constants.WRAPPER) QueryWrapperX queryWrapperX); + + IPage selectFilterGoodsPlatePage(@Param("page") IPage page,@Param(Constants.WRAPPER) QueryWrapperX queryWrapperX); + + + Long selectNoPlanOrderPlateCount(@Param(Constants.WRAPPER) Wrapper wrapper); + + List selectNoPlanOrderPlateList(@Param(Constants.WRAPPER) Wrapper wrapper,@Param("pageNo") Integer pageNo,@Param("pageSize") Integer pageSize); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderGroup/OrderGroupMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderGroup/OrderGroupMapper.java index 7e4e80fd7..75ea0a7bc 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderGroup/OrderGroupMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderGroup/OrderGroupMapper.java @@ -1,9 +1,15 @@ package com.cf.imes.module.executor.dal.mysql.orderGroup; +import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.module.executor.api.plan.vo.OrderGroupRespVO; +import com.cf.imes.module.executor.controller.admin.plan.bo.OrderIds; +import com.cf.imes.module.executor.controller.admin.plan.vo.OrderGoodsResp; +import com.cf.imes.module.executor.controller.admin.plan.vo.OrderRespVOCopy; import com.cf.imes.module.executor.dal.dataobject.orderGroup.OrderGroupDO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -137,4 +143,13 @@ public interface OrderGroupMapper extends BaseMapperX { .eq(OrderGroupDO::getDeleted, deleted) .eq(OrderGroupDO::getOrganId, organId)); } + + IPage selectFilterOrderPagePlate(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + List selectFilterOrderPlateList( @Param(Constants.WRAPPER) Wrapper wrapper); + + IPage selectFilterGoodsPagePlate(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + List selectFilterGoodsPlateList(@Param(Constants.WRAPPER) Wrapper wrapper); + } \ 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/mysql/plan/PlanMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plan/PlanMapper.java index 8f780d90f..e6cedc353 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plan/PlanMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plan/PlanMapper.java @@ -5,10 +5,7 @@ import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.framework.mybatis.core.query.MPJLambdaWrapperX; import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderStatisticsReqVO; -import com.cf.imes.module.executor.controller.admin.plan.vo.OrderPlanStatisticsAreaRespVO; -import com.cf.imes.module.executor.controller.admin.plan.vo.OrderPlanStatisticsCountRespVO; -import com.cf.imes.module.executor.controller.admin.plan.vo.PlanPageReqVO; -import com.cf.imes.module.executor.controller.admin.plan.vo.PlateOptimize; +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.order.OrderDO; import com.cf.imes.module.executor.dal.dataobject.plan.PlanDO; @@ -36,7 +33,7 @@ public interface PlanMapper extends BaseMapperX { .eqIfPresent(PlanDO::getId, reqVO.getId()) .eqIfPresent(PlanDO::getSort, reqVO.getSort()) .eqIfPresent(PlanDO::getType, reqVO.getType()) - .eqIfPresent(PlanDO::getStatus, reqVO.getStatus()) + .inIfPresent(PlanDO::getStatus, reqVO.getStatus()) .eqIfPresent(PlanDO::getMachineId, reqVO.getMachineId()) .betweenIfPresent(PlanDO::getPlanTime, reqVO.getPlanTime()) .likeIfPresent(PlanDO::getOrderNos, reqVO.getOrderNos()) @@ -58,7 +55,7 @@ public interface PlanMapper extends BaseMapperX { .eqIfPresent(PlanDO::getId, reqVO.getId()) .eqIfPresent(PlanDO::getSort, reqVO.getSort()) .eqIfPresent(PlanDO::getType, reqVO.getType()) - .eqIfPresent(PlanDO::getStatus, reqVO.getStatus()) + .inIfPresent(PlanDO::getStatus, reqVO.getStatus()) .eqIfPresent(PlanDO::getMachineId, reqVO.getMachineId()) .betweenIfPresent(PlanDO::getPlanTime, reqVO.getPlanTime()) .likeIfPresent(PlanDO::getOrderNos, reqVO.getOrderNos()) @@ -118,4 +115,20 @@ public interface PlanMapper extends BaseMapperX { + + default List selectPlanListByData(String planData,Long organId) { + return selectList( new LambdaQueryWrapperX() + .eq(PlanDO::getOrganId,organId) + .eq(PlanDO::getDeleted,false) + .eq(PlanDO::getCreateTime,planData)); + } + + + default List selectPlanSortList(List status,Long organId) { + return selectList( new LambdaQueryWrapperX() + .eq(PlanDO::getOrganId,organId) + .eq(PlanDO::getDeleted,false) + .in(PlanDO::getStatus,status) + .orderByAsc(PlanDO::getSort)); + } } \ 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/mysql/planitem/PlanItemMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/planitem/PlanItemMapper.java index 2b9dc7d79..e421037c6 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/planitem/PlanItemMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/planitem/PlanItemMapper.java @@ -1,8 +1,18 @@ -package com.cf.imes.module.executor.dal.mysql.planitem; +package com.cf.imes.module.executor.dal.mysql.planItem; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; +import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.cf.imes.module.executor.controller.admin.plan.vo.*; +import com.cf.imes.module.executor.controller.admin.plate.vo.OrderPlateIds; +import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; import com.cf.imes.module.executor.dal.dataobject.planitem.PlanItemDO; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 生产单开料排单明细 Mapper @@ -13,4 +23,32 @@ import org.apache.ibatis.annotations.Mapper; public interface PlanItemMapper extends BaseMapperX { + + IPage selectOrderList(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + + + default List selectPlanPlateList(List planIds, List orderIds, Long organId) { + return selectList( new LambdaQueryWrapperX() + .eq(PlanItemDO::getOrganId, organId) + .in(PlanItemDO::getOrderId,orderIds) + .in(PlanItemDO::getPlanId,planIds)); + + } + + + List selectPlanPlateDetailList(@Param("planId") Long planId, @Param("organId") Long organId); + + + List selectOrderPlanPlateList(@Param("planIds") List planIds, @Param("organId") Long organId); + + IPage selectPlateListByPlateIds(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + IPage selectNoPlanGoodsByRoomAndBodyIds(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + IPage selectNoPlanGoodsList(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + List selectNoOrderGoodsIdList(@Param(Constants.WRAPPER) Wrapper wrapper); + + List selectPlanIncrementPlate(@Param("noPlanIds") List noPlanIds,@Param("organId") Long organId); } \ 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/mysql/plate/PlateGoodMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateGoodMapper.java index 6f3500231..d22e2df7b 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateGoodMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateGoodMapper.java @@ -1,8 +1,10 @@ package com.cf.imes.module.executor.dal.mysql.plate; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; -import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; +import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.cf.imes.module.executor.controller.admin.plate.vo.GoodsPlateFilterPageReqVO; import com.cf.imes.module.executor.dal.dataobject.plate.PlateGoodDO; import org.apache.ibatis.annotations.Mapper; @@ -47,4 +49,36 @@ public interface PlateGoodMapper extends BaseMapperX { return selectList(queryWrapper); } + + default PageResult selectGoodsPage(GoodsPlateFilterPageReqVO pageReqVO, Long organId) { + return selectPage(pageReqVO, new LambdaQueryWrapperX() + .eq(PlateGoodDO::getOrganId,organId) + .eq(PlateGoodDO::getDeleted,false) + .likeIfPresent(PlateGoodDO::getGoodsId,pageReqVO.getGoodsIds()) + .likeIfPresent(PlateGoodDO::getGoodsName,pageReqVO.getGoodsName()) + .eqIfPresent(PlateGoodDO::getThickness, pageReqVO.getThickness()) + .eqIfPresent(PlateGoodDO::getMaterial, pageReqVO.getMaterial()) + .eqIfPresent(PlateGoodDO::getColor, pageReqVO.getColor()) + .eqIfPresent(PlateGoodDO::getTexture,pageReqVO.getTexture()) + .likeIfPresent(PlateGoodDO::getSpec,pageReqVO.getSpec()) + .likeIfPresent(PlateGoodDO::getColor,pageReqVO.getFilterColor()) + .betweenIfPresent(PlateGoodDO::getWidth,new BigDecimal[]{pageReqVO.getWidthMinRang(), pageReqVO.getWidthMaxRang()}) + .betweenIfPresent(PlateGoodDO::getHeight,new BigDecimal[]{pageReqVO.getLongMinRang(),pageReqVO.getLongMaxRang()}) + .likeIfPresent(PlateGoodDO::getRemark,pageReqVO.getRemark()) + .orderByDesc(PlateGoodDO::getId) + .select(PlateGoodDO::getGoodsId, PlateGoodDO::getGoodsName, PlateGoodDO::getMaterial, PlateGoodDO::getColor, PlateGoodDO::getTexture, + PlateGoodDO::getWidth, PlateGoodDO::getHeight, PlateGoodDO::getThickness, PlateGoodDO::getBrand, PlateGoodDO::getSpec, + PlateGoodDO::getRemark,PlateGoodDO::getColorBlack,PlateGoodDO::getOrganId)); + } + + + + + default PlateGoodDO selectGoodsByGoodsId(String goodsId, Long organId) { + return selectOne(new LambdaQueryWrapper() + .eq(PlateGoodDO::getOrganId,organId) + .eq(PlateGoodDO::getDeleted,false) + .eq(PlateGoodDO::getGoodsId, goodsId)); + } + } 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 4e36bb25f..17b792423 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 @@ -4,12 +4,15 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.cf.imes.framework.common.enums.OrderPlateCutStatusEnum; import com.cf.imes.framework.common.enums.OrderPlateTypeEnum; import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.PrintOrderPackReqVO; -import com.cf.imes.module.executor.controller.admin.plan.vo.*; +import com.cf.imes.module.executor.controller.admin.plan.vo.NotPlanOrderPlateRespVO; +import com.cf.imes.module.executor.controller.admin.plan.vo.PlateDetailRespVO; +import com.cf.imes.module.executor.controller.admin.plan.vo.PlatePage; import com.cf.imes.module.executor.controller.admin.plate.vo.PlateGoodsIdVO; import com.cf.imes.module.executor.controller.admin.plate.vo.PlateGoodsRespVO; import com.cf.imes.module.executor.controller.admin.plate.vo.PlatePageReqVO; @@ -19,9 +22,9 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.math.BigDecimal; +import java.util.Arrays; import java.util.Collection; import java.util.List; -import java.util.Set; import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; @@ -72,20 +75,10 @@ public interface PlateMapper extends BaseMapperX { .orderByDesc(PlateDO::getId)); } - // IPage selectPlatePage(@Param("page") IPage page, @Param("orderId")Long organId, @Param("goodsId") String goodsId); - - IPage selectProductList(@Param("page") IPage page , @Param("orderId")Long orderId, @Param("roomId")Long roomId , @Param("bodyId")Long bodyId,@Param("organId") Long organId); - Set selectBatchOrderIdsAndGoodsIds(@Param("itemList") List itemList, @Param("organId") Long organId ); - -// PlateDetailRespVO selectPlateNumList(PlateDetailReqVO reqVO); - - List selectPlateDetialList(@Param("orderId") Long orderId,@Param("organId") Long organId); - - List selectPlateGoodsList(@Param("orderId") Long orderId, @Param("organId") Long organId, @Param("deleted") Integer deleted); // 明细 List selectPlateGoodsListSummary(@Param("orderId") Long orderId, @Param("organId") Long organId, @Param("deleted") Integer deleted); // 汇总 @@ -122,8 +115,6 @@ public interface PlateMapper extends BaseMapperX { List selectPlateGoodsListByList(@Param("plates") List goodsIdList, @Param("orderId") Long orderId, @Param("organId") Long organId); -// List selectGoodsPage( @Param("orderIds") List orderIds, @Param("organId") Long organId); - List selectGoodsPage( @Param(Constants.WRAPPER) Wrapper wrapper); @@ -131,11 +122,12 @@ public interface PlateMapper extends BaseMapperX { void deletedById(@Param("plateIds") List plateIds, @Param("organId") Long organId); - default List selectPlateNum(Long orderId, Long organId) { + default List selectPlateNum(List orderId, Long organId) { return selectList(new LambdaQueryWrapperX() .eq(PlateDO::getOrganId,organId) .eq(PlateDO::getDeleted,false) - .eqIfPresent(PlateDO::getOrderId, orderId)); + .in(PlateDO::getOrderId, orderId) + .select(PlateDO::getId)); } @@ -171,18 +163,18 @@ public interface PlateMapper extends BaseMapperX { - default List selectPlateByPlateNo(List plateNo, Long organId) { + default List selectPlateByPlateNo(List orderIdList,List plateNo, Long organId) { return selectList(new LambdaQueryWrapperX() .eq(PlateDO::getOrganId,organId) .eq(PlateDO::getDeleted,false) - .inIfPresent(PlateDO::getPlateNo, plateNo) - .select(PlateDO::getOrderId)); + .inIfPresent(PlateDO::getOrderId,orderIdList) + .inIfPresent(PlateDO::getPlateNo, plateNo)); } - List selectPlateListByGoodsIds(@Param("goodsIdList") List goodsIdList,@Param("organId") Long organId); + List selectPlateListByGoodsIds(@Param("orderIds") List orderIds,@Param("goodsIdList") List goodsIdList, @Param("organId") Long organId); // 批量删除 @@ -214,8 +206,10 @@ public interface PlateMapper extends BaseMapperX { void updatePlateOptimized(@Param("orderIdList") List orderIdList,@Param("ids") List ids,@Param("organId") Long organId); + void updatePlateIsOptimized(@Param("orderIdList") List orderIdList,@Param("ids") List ids,@Param("plateIds") List plateIds,@Param("organId") Long organId); - void updateNoPlateOptimized(@Param("orderIdList") List orderIdList,@Param("ids") List ids,@Param("organId") Long organId); + + void updateNoPlateOptimized(@Param("orderIdList") List orderIdList,@Param("ids") List ids,@Param("plateIds") List plateIds,@Param("organId") Long organId); List selectPlanPackList(@Param("ids") List ids,@Param("organId") Long organId); @@ -237,22 +231,38 @@ public interface PlateMapper extends BaseMapperX { - default List selectPlateIsOptimized(Long orderId, Long organId) { + default List selectPlateIsOptimized(List orderId, Long organId) { return selectList(new LambdaQueryWrapperX() .eq(PlateDO::getOrganId,organId) .eq(PlateDO::getDeleted,false) - .eqIfPresent(PlateDO::getOrderId,orderId) - .eq(PlateDO::getIsOptimized,true)); + .inIfPresent(PlateDO::getOrderId,orderId) + .eq(PlateDO::getIsOptimized,true) + .select(PlateDO::getId,PlateDO::getOrderId)); } - default PlateDO selectByPlateNo(Long plateNo, Long organId) { - return selectOne(new LambdaQueryWrapperX() + default List selectPlateIds(List orderIds, List ids, Long organId) { + return selectList(new LambdaQueryWrapperX() .eq(PlateDO::getOrganId,organId) + .in(PlateDO::getOrderId,orderIds) + .in(PlateDO::getGoodsId,ids) .eq(PlateDO::getDeleted,false) - .eq(PlateDO::getPlateNo, plateNo)); + .select(PlateDO::getId)); + + } + + + + + default List selectNoCutPlateByPlateId(List deleteOrderIds,Long organId) { + return selectList(new LambdaQueryWrapperX() + .eq(PlateDO::getOrganId,organId) + .in(PlateDO::getOrderId,deleteOrderIds) + .eq(PlateDO::getDeleted,false) + .in(PlateDO::getIsCutted, Arrays.asList(OrderPlateCutStatusEnum.NOCUTTING.getStatus(),OrderPlateCutStatusEnum.OPENING.getStatus())) + .select(PlateDO::getId,PlateDO::getOrderId)); } 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 07651faa3..d56c564f4 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,15 +1,12 @@ package com.cf.imes.module.executor.service.optimizeplan; +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.saveOptimize.CuttingStatusRespVO; -import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.SavePlanPlateResultReqVO; -import com.cf.imes.module.executor.controller.admin.plan.vo.AddRemainReqVO; -import com.cf.imes.module.executor.controller.admin.plan.vo.GetSourceDataReq; -import com.cf.imes.module.executor.controller.admin.plan.vo.PlateOptimize; -import com.cf.imes.module.executor.dal.dataobject.goods.OptimizeBoardModelDO; +import com.cf.imes.module.executor.controller.admin.plan.bo.PlanProcessSchemeList; +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; -import java.util.Collection; import java.util.List; import java.util.Map; @@ -17,27 +14,31 @@ public interface OptimizePlanService { String ORDER_PLATE_MODEL = "imes_order_plate_model"; - String ORDER_REMAIN_PLATE_MODEL = "imes_order_optimize_plate_model"; - + String ORDER_OPTIMIZE_PLATE_MODEL = "imes_order_optimize_plate_model"; String ORDER_PARTS_REMARK_MODEL = "imes_order_parts_remark_model"; + String PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL = "imes_plan_process_scheme_optimize_model"; + List getPlateListByPlanId(Long planId); Boolean addRemain(AddRemainReqVO vo); - Boolean commit(Long planId, List goodsNo); + Boolean commit(Long planId,String goodsId,Long planConfigId, List goodsNo); + + + Boolean endCutting(Long planId,String goodsId,List goodsNo,Long planConfigId); + void updateCuttingStatus(CuttingStatusRespVO respVO); - Boolean endCutting(Long planId); Map getLabelDataSourceValue(GetSourceDataReq req); - OrderSource getOrderSource(Long orderId, Long planId, Long machineId,List ids); + OrderSource getOrderSource(Long orderId, Long planId, Long machineId); OrderSource getOrderSourceByOrderId(Long orderId); @@ -46,10 +47,17 @@ public interface OptimizePlanService { void saveOptimizationResults(SavePlanPlateResultReqVO req); + void saveProcessSchemeResults(SaveProcessSchemeReqVO saveProcessSchemeReqVO); + + PlanProcessSchemeList getProcessSchemeConfig(Long processId,Long planId); + + void updateProcessScheme(PlanProcessSchemeReqVO reqVO); List getPlateModel(Long orderId); - List buildBoardByOrderIds(Collection orderIds, String index, Integer size); + OrderSource getNoPlanPlateData(NoPlanFilterPlateReqVO reqVO); + PageResult getOrderPlateDataFilter(FilterDataPageReqVO pageReqVO); + PageResult getGoodsPlateDataFilter(FilterDataPageReqVO pageReqVO); } 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 c176fd3f7..48e2c284b 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 @@ -1,46 +1,63 @@ package com.cf.imes.module.executor.service.optimizeplan; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.ObjectUtil; import co.elastic.clients.elasticsearch.ElasticsearchClient; -import co.elastic.clients.elasticsearch._types.FieldValue; -import co.elastic.clients.elasticsearch.core.*; +import co.elastic.clients.elasticsearch._types.SortOrder; +import co.elastic.clients.elasticsearch._types.aggregations.Aggregate; +import co.elastic.clients.elasticsearch.core.SearchRequest; +import co.elastic.clients.elasticsearch.core.SearchResponse; +import co.elastic.clients.elasticsearch.core.UpdateByQueryRequest; import co.elastic.clients.elasticsearch.core.search.Hit; -import co.elastic.clients.elasticsearch.indices.RefreshRequest; +import co.elastic.clients.elasticsearch.sql.TranslateRequest; +import co.elastic.clients.elasticsearch.sql.TranslateResponse; +import co.elastic.clients.json.JsonData; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; +import com.cf.imes.framework.common.enums.GoodsFilterConditionsEnum; +import com.cf.imes.framework.common.enums.OrderPlateCutStatusEnum; import com.cf.imes.framework.common.enums.OrderStatusEnum; import com.cf.imes.framework.common.enums.PlanStatusEnum; import com.cf.imes.framework.common.exception.ServiceException; +import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.common.util.Assert.AssertUtils; 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.module.executor.controller.admin.orderParts.vo.OrderPartsRemark; -import com.cf.imes.module.executor.controller.admin.plan.bo.OrderSource; -import com.cf.imes.module.executor.controller.admin.plan.bo.ProcessGroupList; -import com.cf.imes.module.executor.controller.admin.plan.bo.ProcessStepAreaIds; -import com.cf.imes.module.executor.controller.admin.plan.bo.ProcessStepSalaryIds; +import com.cf.imes.module.executor.controller.admin.plan.bo.*; 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.CutedBoardInfo; 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.order.OrderDO; +import com.cf.imes.module.executor.dal.dataobject.orderGroup.OrderGroupDO; import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderModelDO; +import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderPlateModel; import com.cf.imes.module.executor.dal.dataobject.plan.PlanDO; +import com.cf.imes.module.executor.dal.dataobject.planitem.PlanItemDO; import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO; import com.cf.imes.module.executor.dal.dataobject.remainplaten.RemainPlateDO; import com.cf.imes.module.executor.dal.mysql.goods.GoodsMapper; import com.cf.imes.module.executor.dal.mysql.order.OrderMapper; +import com.cf.imes.module.executor.dal.mysql.orderGroup.OrderGroupMapper; import com.cf.imes.module.executor.dal.mysql.orderParts.OrderPartsMapper; import com.cf.imes.module.executor.dal.mysql.plan.PlanMapper; +import com.cf.imes.module.executor.dal.mysql.planItem.PlanItemMapper; +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.processStep.ProcessStepMapper; import com.cf.imes.module.executor.dal.mysql.processStepItem.ProcessStepItemMapper; import com.cf.imes.module.executor.dal.mysql.remainplaten.RemainPlateMapper; import com.cf.imes.module.executor.enums.ErrorCodeConstants; +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; -import com.fasterxml.jackson.core.type.TypeReference; +import com.cf.imes.module.system.api.systemconfig.SystemConfigApi; +import com.cf.imes.module.system.api.systemconfig.dto.ProcessSchemeDTO; import com.fasterxml.jackson.databind.JsonNode; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -51,11 +68,12 @@ import java.io.IOException; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.util.*; +import java.util.function.Function; -import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.*; +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.exception.util.ServiceExceptionUtil.exception; -import static com.cf.imes.framework.common.util.json.JsonUtils.parseObject; -import static com.cf.imes.framework.common.util.json.JsonUtils.parseTree; +import static com.cf.imes.framework.common.util.json.JsonUtils.*; import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_NOT_EXISTS; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.PLAN_NOT_EXISTS; @@ -93,6 +111,14 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { @Resource private MachineApi machineApi; + + @Resource + private SystemConfigApi systemConfigApi; + + + @Resource + private EsUtils esUtils; + @Resource private ESDocumentService esDocumentService; @@ -105,10 +131,23 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { @Resource private ProcessStepItemMapper processStepItemMapper; + @Resource + private PlateGoodMapper plateGoodMapper; + + @Resource + private OrderGroupMapper orderGroupMapper; + + @Resource + private PlanItemMapper planItemMapper; + private static final String FIELD_ORDER_ID = "orderId"; private static final String FIELD_PLAN_ID = "planId"; + private static final String FIELD_GOODS_ID = "goodsId"; + private static final String FIELD_SORT = " order by createTime desc "; + private static final String FIELD_IS_OPTIMIZED = " op.is_optimized"; + private static final String FIELD_PLAN_CONFIG_ID = "planConfigId"; - private static final String ES_SELECT_DATA_ERROR = "优化生产ES文档查询异常: "; + private static final String ES_ORDER_MODEL_DATA_ERROR = "生产单板材造型信息ES文档查询数据异常: "; SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @@ -141,60 +180,108 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { @Override @Transactional(rollbackFor = Exception.class) - public Boolean commit(Long planId, List goodsNo) { + public Boolean commit(Long planId,String goodsId,Long planConfigId, List goodsNo) { - PlanDO planDO = planMapper.selectById(planId); + PlanDO planDO = validatePlanExists(planId); - AssertUtils.notEmpty(planDO,PLAN_NOT_EXISTS); + if(planDO.getStatus().equals(PlanStatusEnum.NOCUTTING.getStatus())){ + throw exception(PLAN_STATUS_ERROR); + } Date date = new Date(); - // todo 目前只解决了非混单的情况,混单情况待解决 - List optimizeBoardModelDOS = buildBoardByPlanId(planId, ORDER_REMAIN_PLATE_MODEL, 10); + List optimizeBoardModelDOS = esUtils.getEsDocument(FIELD_PLAN_CONFIG_ID,FIELD_PLAN_ID,planConfigId, planId, ORDER_OPTIMIZE_PLATE_MODEL, OptimizeBoardModelDO.class); + + + List plateDOS = getPlanGoodsPlateList(goodsNo,planDO,optimizeBoardModelDOS); + + List orderIds = new ArrayList<>(plateDOS.stream().map(PlateDO::getOrderId).distinct().toList()); - AssertUtils.notEmpty(optimizeBoardModelDOS,ORDER_PLAN_OPTIMIZE_ERROR); OptimizeBoardModelDO optimizeBoardModelDO = optimizeBoardModelDOS.get(0); - Boolean isOptimized = optimizeBoardModelDO.getIsOptimized(); - if(Boolean.FALSE.equals(isOptimized)){ - throw exception(ORDER_PLAN_NO_OPTIMIZE_UPDATE_ERROR); + List cutedBoardInfoList = Optional.ofNullable(optimizeBoardModelDO.getCutedBoardInfo()).orElse(new ArrayList<>()); + + List cutedBoardInfos = cutedBoardInfoList.stream().filter(f -> f.getGoodsId().equals(goodsId)).toList(); + + CutedBoardInfo cutedBoardInfo = new CutedBoardInfo(); + + if(CollUtil.isNotEmpty(cutedBoardInfos)) { + + CutedBoardInfo boardInfo = cutedBoardInfos.get(0); + + // 获取原排单的已开料的大板编号 + List cutedBoardIsCuttingList = Optional.ofNullable(boardInfo.getCutedBoardIsCuttingList()).orElseGet(ArrayList::new); + + + // 将开料的大板编号和已经开料的大板编号进行去重,相同去除,不同新增 + goodsNo.forEach(item -> { + if (!cutedBoardIsCuttingList.contains(item)) { + cutedBoardIsCuttingList.add(item); + } + }); + + // 将需要更新更新的数据更新到原数据中 + boardInfo.setCutedBoardIsCuttingList(cutedBoardIsCuttingList); + + cutedBoardInfo = boardInfo; + + }else { + + cutedBoardInfo.setCutedBoardIsCuttingList(goodsNo); + + } + + // 更新开料相关的数据 + HashMap objectObjectHashMap = new HashMap<>(); + objectObjectHashMap.put("cutedBoardInfo",cutedBoardInfo); + objectObjectHashMap.put("updateTime",simpleDateFormat.format(date)); + + try { + + esDocumentService.updateById(ORDER_OPTIMIZE_PLATE_MODEL, optimizeBoardModelDO.getId(), HashMap.class, objectObjectHashMap); + + }catch (Exception e) { + log.error(e.getMessage()); + throw new ServiceException(ES_DATA_ERROR); } - List plateNo = new ArrayList<>(); - // 创建一个列表存储 BlockPlaceInfo 对象,将优化的小板信息拿出,获取到小板编号,查询生产单,修改生产单的状态 - List outputList = new ArrayList<>(); + // 修改生产单的状态 + orderMapper.updateOrderListStatus(orderIds,OrderStatusEnum.IN_PRODUCTION.getStatus(),getUserOrganId()); - String blockPlaceInfo = optimizeBoardModelDO.getBlockPlaceInfo(); - AssertUtils.notEmpty(blockPlaceInfo, ORDER_PLAN_OPTIMIZE_ERROR); + // 修改小板的开料状态 + plateDOS.forEach(f->f.setIsCutted(OrderPlateCutStatusEnum.OPENING.getStatus())); + plateMapper.updateBatch(plateDOS); - JsonNode jsonArray = parseTree(blockPlaceInfo); - boolean isArray = jsonArray.isArray(); - - if (Boolean.FALSE.equals(isArray)) { - throw exception(ORDER_PLAN_OPTIMIZE_ERROR); - } - - for (JsonNode jsonNode : jsonArray) { - Long bi = jsonNode.get("bi").asLong(); - String bo = jsonNode.get("bo").asText(); - outputList.add(new BlockPlaceInfo(bi,bo)); + if(planDO.getStatus().equals(PlanStatusEnum.PUTINTOPRODUCTION.getStatus())){ + planDO.setStatus(PlanStatusEnum.OPENING.getStatus()); + planMapper.updateById(planDO); } - goodsNo.forEach(g-> - plateNo.addAll(outputList.stream().filter(f -> f.getBi().equals(g)).map(BlockPlaceInfo::getBo).distinct().toList()) - ); + return Boolean.TRUE; + + } - List plateDOS = plateMapper.selectPlateByPlateNo(plateNo.stream().distinct().toList(), getUserOrganId()); - AssertUtils.notEmpty(plateDOS,ORDER_PLAN_OPTIMIZE_ERROR); + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean endCutting(Long planId,String goodsId,List goodsNo,Long planConfigId) { + + PlanDO planDO = validatePlanExists(planId); + + List optimizeBoardModelDOS = esUtils.getEsDocument(FIELD_PLAN_CONFIG_ID,FIELD_PLAN_ID,planConfigId, planId, ORDER_OPTIMIZE_PLATE_MODEL, OptimizeBoardModelDO.class); + + Date date = new Date(); + + List plateDOS = getPlanGoodsPlateList(goodsNo,planDO,optimizeBoardModelDOS); List orderIds = new ArrayList<>(plateDOS.stream().map(PlateDO::getOrderId).distinct().toList()); @@ -203,14 +290,28 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { orderMapper.updateOrderListStatus(orderIds,OrderStatusEnum.IN_PRODUCTION.getStatus(),getUserOrganId()); - CutedBoardInfo cutedBoardInfo = Optional.ofNullable(optimizeBoardModelDO.getCutedBoardInfo()).orElse(new CutedBoardInfo()); + // 修改小板的开料状态 + plateDOS.forEach(f->f.setIsCutted(OrderPlateCutStatusEnum.OPENED.getStatus())); + plateMapper.updateBatch(plateDOS); + OptimizeBoardModelDO optimizeBoardModelDO = optimizeBoardModelDOS.get(0); + + + List cutedBoardInfoList = Optional.ofNullable(optimizeBoardModelDO.getCutedBoardInfo()).orElse(new ArrayList<>()); + + List cutedBoardInfos = cutedBoardInfoList.stream().filter(f -> f.getGoodsId().equals(goodsId)).toList(); + + + AssertUtils.notEmpty(cutedBoardInfos,ORDER_PLAN_OPTIMIZE_ERROR); + + CutedBoardInfo cutedBoardInfo = cutedBoardInfos.get(0); + // 获取原排单的已开料的大板编号 List cutedBoardList = Optional.ofNullable(cutedBoardInfo.getCutedBoardList()).orElseGet(ArrayList::new); - + List cutedBoardIsCuttingList = cutedBoardInfo.getCutedBoardIsCuttingList(); // 将开料的大板编号和已经开料的大板编号进行去重,相同去除,不同新增 goodsNo.forEach(item -> { @@ -226,9 +327,12 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { cutedBoardNumber = 0; } + cutedBoardIsCuttingList.removeAll(goodsNo); + // 将需要更新更新的数据更新到原数据中 cutedBoardInfo.setCutedBoardNumber(cutedBoardNumber); cutedBoardInfo.setCutedBoardList(cutedBoardList); + cutedBoardInfo.setCutedBoardIsCuttingList(cutedBoardIsCuttingList); // 更新开料相关的数据 @@ -238,7 +342,7 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { try { - esDocumentService.updateById(ORDER_REMAIN_PLATE_MODEL, optimizeBoardModelDO.getId(), HashMap.class, objectObjectHashMap); + esDocumentService.updateById(ORDER_OPTIMIZE_PLATE_MODEL, optimizeBoardModelDO.getId(), HashMap.class, objectObjectHashMap); }catch (Exception e) { log.error(e.getMessage()); @@ -252,6 +356,28 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { } + + List plateDOList = plateMapper.selectNoCutPlateByPlateId(orderIds, getUserOrganId()); + + List orderIdList = plateDOList.stream().map(PlateDO::getOrderId).distinct().toList(); + + orderIds.removeAll(orderIdList); + + if(CollUtil.isNotEmpty(orderIds)){ + + // 查询生产单的打包状态是否为已打包 + 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); + } + } + + if(optimizeBoardModelDO.getBoardCount() == cutedBoardNumber){ planDO.setStatus(PlanStatusEnum.OPENED.getStatus()); @@ -259,36 +385,11 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { planMapper.updateById(planDO); - // 需要去除的生产单ID - List deleteOrderIds = new ArrayList<>(); - - // 筛选出还有未排单的生产单ID - deleteOrderIds.addAll(goodsMapper.selectNoPlanOrdersListByOrderIds(orderIds, getUserOrganId()).stream().map(GoodsDO::getOrderId).distinct().toList()); - - // 筛选出生产单对应的排单里状态为 未排单的 生产单ID - deleteOrderIds.addAll(goodsMapper.selectOrderPlanList(orderIds, getUserOrganId())); - - // 去除 - orderIds.removeAll(deleteOrderIds); - - if(ObjectUtil.isNotEmpty(orderIds)) { - - List orderDOS = orderMapper.selectOrderPackList(orderIds, getUserOrganId()); - - if (ObjectUtil.isNotEmpty(orderDOS)) { - orderDOS.forEach(f -> { - f.setStatus(OrderStatusEnum.FINISH_PRODUCTION.getStatus()); - f.setFinishTime(LocalDateTime.now()); - }); - orderMapper.updateBatch(orderDOS); - } - - } } return Boolean.TRUE; - } + } @@ -297,133 +398,185 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { public void updateCuttingStatus(CuttingStatusRespVO respVO) { Long planId = respVO.getPlanId(); - List goodsNo = respVO.getGoodsNo(); + List goodsIds = respVO.getGoodsId(); - if(goodsNo.isEmpty()){ + + if(goodsIds.isEmpty()){ return; } Date date = new Date(); - PlanDO planDO = planMapper.selectById(planId); + PlanDO planDO = validatePlanExists(planId); - AssertUtils.notEmpty(planDO,PLAN_NOT_EXISTS); - // todo 目前只解决了非混单的情况,混单情况待解决 - List optimizeBoardModelDOS = buildBoardByPlanId(planId, ORDER_REMAIN_PLATE_MODEL, 10); + List orderIds = JSON.parseArray(planDO.getOrderNos()).toJavaList(Long.class).stream().distinct().toList(); + + + List optimizeBoardModelDOS = esUtils.getEsDocument(FIELD_PLAN_CONFIG_ID,FIELD_PLAN_ID,respVO.getPlanConfigId(), planId, ORDER_OPTIMIZE_PLATE_MODEL, OptimizeBoardModelDO.class); - AssertUtils.notEmpty(optimizeBoardModelDOS,ORDER_PLAN_OPTIMIZE_ERROR); OptimizeBoardModelDO optimizeBoardModelDO = optimizeBoardModelDOS.get(0); - Boolean isOptimized = optimizeBoardModelDO.getIsOptimized(); - if(Boolean.FALSE.equals(isOptimized)){ - throw exception(ORDER_PLAN_NO_OPTIMIZE_UPDATE_ERROR); - } + String remainBoardInfo = optimizeBoardModelDO.getRemainBoardInfo(); - CutedBoardInfo cutedBoardInfo = Optional.ofNullable(optimizeBoardModelDO.getCutedBoardInfo()).orElse(new CutedBoardInfo()); + List remainBoardInfos = parseArray(remainBoardInfo, RemainBoardInfo.class); - if(cutedBoardInfo.getCutedBoardNumber() != null) { - // 已经开料的大板信息 - List cutedBoardList = cutedBoardInfo.getCutedBoardList(); - // 开料的大板数量 - long cutedBoardNumber = cutedBoardInfo.getCutedBoardNumber(); - - // 移除取消开料的数据 - cutedBoardList.removeAll(goodsNo); - - // 减去取消开料的大板数量 - cutedBoardNumber -= goodsNo.size(); - - if(CollUtil.isEmpty(cutedBoardList)){ - cutedBoardNumber = 0; - } - - // 将需要更新更新的数据更新到原数据中 - cutedBoardInfo.setCutedBoardNumber(cutedBoardNumber); - cutedBoardInfo.setCutedBoardList(cutedBoardList); + List boardInfos = remainBoardInfos.stream().filter(f -> goodsIds.contains(f.getGoodsId())).toList(); - // 更新开料相关的数据 - HashMap objectObjectHashMap = new HashMap<>(); - objectObjectHashMap.put("cutedBoardInfo", cutedBoardInfo); - objectObjectHashMap.put("updateTime",simpleDateFormat.format(date)); + List boardInfos2 = remainBoardInfos.stream().filter(f -> !goodsIds.contains(f.getGoodsId())).toList(); - try { + List planNo = new ArrayList<>(); - esDocumentService.updateById(ORDER_REMAIN_PLATE_MODEL, optimizeBoardModelDO.getId(), HashMap.class, objectObjectHashMap); + boardInfos.forEach(f->{ - } catch (IOException e) { - log.error(e.getMessage()); - throw new ServiceException(ES_DATA_ERROR); - } - - if(cutedBoardInfo.getCutedBoardNumber() == 0){ - - planMapper.updatePlanStatus(planId,PlanStatusEnum.NOCUTTING.getStatus(),getUserOrganId()); - - List orderIdList = JSON.parseArray(planDO.getOrderNos()).toJavaList(Long.class); - - orderIdList.removeAll(goodsMapper.selectPlanOrderListByOrderIds(orderIdList,getUserOrganId())); - - - if(!orderIdList.isEmpty()) { - List orderDOList = orderMapper.selectBatchIds(orderIdList); - orderDOList.forEach(f -> { - f.setStatus(OrderStatusEnum.SORTED.getStatus()); - f.setFinishTime(null); - }); - orderMapper.updateBatch(orderDOList); - - } - - return; - - } - - - planMapper.updatePlanStatus(planId,PlanStatusEnum.OPENING.getStatus(),getUserOrganId()); - - - // 判断取消开料的大板对应的生产单号的状态,修改状态 - List asJsonObject = parseObject(optimizeBoardModelDO.getBlockPlaceInfo(), new TypeReference<>() {}); - - List plateNo = new ArrayList<>(); - - - goodsNo.forEach(g->{ - plateNo.addAll(asJsonObject.stream().filter(f->f.getBi().equals(g)).map(PlatePlaceInfo::getBo).toList()); + f.setCutedType(respVO.getCutedType()); + f.getPlaceBoardList().forEach(p->{ + planNo.addAll(p.getBlocks().stream().map(RemainBoardInfo.Blocks::getBlockId).toList()); }); - List orderIds = plateMapper.selectPlateByPlateNo(plateNo, getUserOrganId()).stream().map(PlateDO::getOrderId).toList(); + }); - List orderDOS = orderMapper.selectOrderList(orderIds, getUserOrganId()); - if(!orderDOS.isEmpty()){ - orderDOS.forEach(f -> { - f.setStatus(OrderStatusEnum.IN_PRODUCTION.getStatus()); - f.setFinishTime(null); - }); - orderMapper.updateBatch(orderDOS); - } + List remainBoardInfos2 = new ArrayList<>(); + remainBoardInfos2.addAll(boardInfos2); + remainBoardInfos2.addAll(boardInfos); + + + // 更新开料相关的数据 + HashMap objectObjectHashMap = new HashMap<>(); + objectObjectHashMap.put("remainBoardInfo", toJsonString(remainBoardInfos2)); + objectObjectHashMap.put("updateTime",simpleDateFormat.format(date)); + + try { + + esDocumentService.updateById(ORDER_OPTIMIZE_PLATE_MODEL, optimizeBoardModelDO.getId(), HashMap.class, objectObjectHashMap); + + } catch (IOException e) { + log.error(e.getMessage()); + throw new ServiceException(ES_DATA_ERROR); } + List plateDOS = plateMapper.selectPlateByPlateNo(orderIds, planNo, getUserOrganId()); + plateDOS.forEach(f->{ + f.setIsCutted(respVO.getCutedType()); + }); + + +// +// List plateDOS = getPlanGoodsPlateList(goodsNo,planDO,optimizeBoardModelDOS); +// +// +// List orderIds = new ArrayList<>(plateDOS.stream().map(PlateDO::getOrderId).distinct().toList()); +// +// +// // 修改生产单的状态 +// orderMapper.updateOrderListStatus(orderIds,OrderStatusEnum.IN_PRODUCTION.getStatus(),getUserOrganId()); +// +// +// // 修改小板的开料状态 +// plateDOS.forEach(f->f.setIsCutted(OrderPlateCutStatusEnum.NOCUTTING.getStatus())); +// plateMapper.updateBatch(plateDOS); +// +// +// OptimizeBoardModelDO optimizeBoardModelDO = optimizeBoardModelDOS.get(0); +// +// +// List cutedBoardInfoList = Optional.ofNullable(optimizeBoardModelDO.getCutedBoardInfo()).orElse(new ArrayList<>()); +// +// List cutedBoardInfos = cutedBoardInfoList.stream().filter(f -> f.getGoodsId().equals(goodsId)).toList(); +// +// AssertUtils.notEmpty(cutedBoardInfos,ORDER_PLAN_OPTIMIZE_ERROR); +// +// CutedBoardInfo cutedBoardInfo = cutedBoardInfos.get(0); +// +// +// if(cutedBoardInfo.getCutedBoardNumber() != null) { +// // 已经开料的大板信息 +// List cutedBoardList = cutedBoardInfo.getCutedBoardList(); +// // 开料的大板数量 +// long cutedBoardNumber = cutedBoardInfo.getCutedBoardNumber(); +// +// // 移除取消开料的数据 +// cutedBoardList.removeAll(goodsNo); +// +// // 减去取消开料的大板数量 +// cutedBoardNumber -= goodsNo.size(); +// +// if(CollUtil.isEmpty(cutedBoardList)){ +// cutedBoardNumber = 0; +// } +// +// // 将需要更新的数据更新到原数据中 +// cutedBoardInfo.setCutedBoardNumber(cutedBoardNumber); +// cutedBoardInfo.setCutedBoardList(cutedBoardList); +// +// +// // 更新开料相关的数据 +// HashMap objectObjectHashMap = new HashMap<>(); +// objectObjectHashMap.put("cutedBoardInfo", cutedBoardInfo); +// objectObjectHashMap.put("updateTime",simpleDateFormat.format(date)); +// +// try { +// +// esDocumentService.updateById(ORDER_OPTIMIZE_PLATE_MODEL, optimizeBoardModelDO.getId(), HashMap.class, objectObjectHashMap); +// +// } catch (IOException e) { +// log.error(e.getMessage()); +// throw new ServiceException(ES_DATA_ERROR); +// } +// +// if(cutedBoardInfo.getCutedBoardNumber() == 0){ +// +// planMapper.updatePlanStatus(planId,PlanStatusEnum.NOCUTTING.getStatus(),getUserOrganId()); +// +// }else { +// +// planMapper.updatePlanStatus(planId,PlanStatusEnum.OPENING.getStatus(), getUserOrganId()); +// +// } +// +// +// List orderDOS = orderMapper.selectBatchIds(orderIds); +// +// orderDOS.forEach(f->f.setFinishTime(null)); +// +// +// List plateDOList = plateMapper.selectIsCutPlateByPlateId(orderIds, getUserOrganId()); +// +// List orderIdList = plateDOList.stream().map(PlateDO::getOrderId).distinct().toList(); +// +// orderIds.removeAll(orderIdList); +// +// +// +// if(CollUtil.isNotEmpty(orderIds)) { +// +// List orderDOList = orderDOS.stream().filter(f -> orderIds.contains(f.getId())).toList(); +// +// orderDOList.forEach(f -> f.setStatus(OrderStatusEnum.SORTED.getStatus())); +// } +// +// if(CollUtil.isNotEmpty(orderIdList)) { +// +// List orderDOList1 = orderDOS.stream().filter(f -> orderIdList.contains(f.getId())).toList(); +// +// orderDOList1.forEach(f -> f.setStatus(OrderStatusEnum.IN_PRODUCTION.getStatus())); +// } +// +// +// } } - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean endCutting(Long planId) { - // 目前结束开料已去掉,所以这些代码先注释,后面如果加再修改逻辑 - return Boolean.TRUE; - } @@ -455,8 +608,8 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { } @Override - public OrderSource getOrderSource(Long orderId, Long planId, Long machineId,List ids) { - if (!Objects.isNull(orderId) && !Objects.isNull(planId) && !Objects.isNull(ids)) { + public OrderSource getOrderSource(Long orderId, Long planId, Long machineId) { + if (!Objects.isNull(orderId) && !Objects.isNull(planId)) { throw exception(154112, "生产单id与排单id与大板分类ID只能传一个"); } OrderSource orderSource; @@ -467,14 +620,9 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { } if (ObjectUtil.isNotNull(planId)) { orderSource = getOrderSourceByPlanId(planId); - orderSource.setMachineDTO(machineApi.getMachineDetail(machineId).getCheckedData()); - return orderSource; - } - if (ObjectUtil.isNotNull(ids)) { - orderSource = getOrderSourceByGoodId(ids); - orderSource.setMachineDTO(machineApi.getMachineDetail(machineId).getCheckedData()); return orderSource; } + throw exception(ErrorCodeConstants.SOURCE_NOT_EXITS_ERROR); } @@ -485,15 +633,15 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { AssertUtils.notEmpty(orderDO,ORDER_NOT_EXISTS); - List goodsDOS = goodsMapper.selectGoodsList(orderId,getUserOrganId()); + List goodsIds = goodsDOS.stream().map(GoodsReqVO::getId).distinct().toList(); - List plateDOS = plateMapper.selectPlateDetialList(orderId,getUserOrganId()); + List plateDOS = plateMapper.selectPlateListByGoodsIds(Collections.singletonList(orderId),goodsIds,getUserOrganId()); AssertUtils.notEmpty(plateDOS,ORDER_PLATE_ERROR); - for (PlateDetialRespVO plateDetailsRespVO : plateDOS) { + for (PlateDetailRespVO plateDetailsRespVO : plateDOS) { StringBuilder name = new StringBuilder(); if(!plateDetailsRespVO.getProcessGroupLists().isEmpty()) { for (ProcessGroupList groupNameList : plateDetailsRespVO.getProcessGroupLists()) { @@ -511,25 +659,18 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { Integer orderModelSize = plateDOS.size(); - List orderModelDOS = buildRespByOrderId(orderId, orderModelSize); + List orderModelDOS = esUtils.getEsDocument(FIELD_ORDER_ID, orderId, orderModelSize, OptimizePlanService.ORDER_PLATE_MODEL, OrderModelDO.class); AssertUtils.notEmpty(orderModelDOS,ORDER_PLATE_MODEL_DATE_ERROR); - // 大板数据的尺寸长度 - Integer boardSize = goodsDOS.size(); - - - List optimizeBoardModelDOS = buildBoardByOrderId(orderId, ORDER_REMAIN_PLATE_MODEL, boardSize); - - // 查询生产单对应的配件信息 List printOrderPartsRespVOS = orderPartsMapper.selectPartList(Collections.singletonList(orderId), getUserOrganId()); // 查询生产单对应的配件的ES信息 - List orderPartsRemarks = buildOrderPartsByOrderId(Collections.singletonList(orderId), ORDER_PARTS_REMARK_MODEL, printOrderPartsRespVOS.size()); + List orderPartsRemarks = esUtils.getEsDocument(FIELD_ORDER_ID, orderId, printOrderPartsRespVOS.size(), ORDER_PARTS_REMARK_MODEL, OrderPartsRemark.class); // 查询生产单对应的包裹信息 @@ -548,7 +689,7 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { .goodsList(goodsDOS) .plateList(plateDOS) .plateModels(orderModelDOS) - .optimizeBoardModelDOS(optimizeBoardModelDOS) +// .optimizeBoardModelDOS(optimizeBoardModelDOS) .orderPartsRespVOS(printOrderPartsRespVOS) .orderPartsRemarks(orderPartsRemarks) .orderPackReqVOS(printOrderPackReqVOS) @@ -571,15 +712,15 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { List orderIds = goodsDOS.stream().map(GoodsReqVO::getOrderId).distinct().toList(); - List ids = goodsDOS.stream().map(GoodsReqVO::getId).toList(); + // 查询排单对应的小板信息 + List plateDetailRespVOS = planItemMapper.selectPlanPlateDetailList(planId,getUserOrganId()); - List plateDetialRespVOS = plateMapper.selectPlateListByGoodsIds(ids, getUserOrganId()); - AssertUtils.notEmpty(plateDetialRespVOS,ORDER_PLAN_PLATE_ERROR); + AssertUtils.notEmpty(plateDetailRespVOS,ORDER_PLAN_PLATE_ERROR); - for (PlateDetialRespVO plateDetailsRespVO : plateDetialRespVOS) { + for (PlateDetailRespVO plateDetailsRespVO : plateDetailRespVOS) { StringBuilder name = new StringBuilder(); if(!plateDetailsRespVO.getProcessGroupLists().isEmpty()) { for (ProcessGroupList groupNameList : plateDetailsRespVO.getProcessGroupLists()) { @@ -594,30 +735,22 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { } - List orderDOS = orderMapper.selectBatchIds(orderIds); AssertUtils.notEmpty(orderDOS,ORDER_PLAN_ERROR); // 造型数据的尺寸长度 - Integer orderModelSize = plateDetialRespVOS.size(); + Integer orderModelSize = plateDetailRespVOS.size(); // 需要查询小板造型信息的板材ID - List plateIds = plateDetialRespVOS.stream().map(PlateDetialRespVO::getPlateId).toList(); - - List orderModelDOS = buildRespByPlateIds(plateIds, orderModelSize); + List plateIds = plateDetailRespVOS.stream().map(PlateDetailRespVO::getPlateId).toList(); + List orderModelDOS = esUtils.getEsDocument("plateId", plateIds, orderModelSize, OptimizePlanService.ORDER_PLATE_MODEL, OrderModelDO.class); AssertUtils.notEmpty(orderModelDOS,ORDER_PLAN_PLATE_MODEL_DATE_ERROR); - // 大板数据的尺寸长度 - Integer boardSize = goodsDOS.size(); - - List optimizeBoardModelDOS = buildBoardByPlanId(planId, ORDER_REMAIN_PLATE_MODEL, boardSize); - - List remainPlateDOS = remainPlateMapper.selectByPlanId(planId,getUserOrganId()); @@ -628,20 +761,22 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { List printOrderPartsRespVOS = orderPartsMapper.selectPartList(orderIds, getUserOrganId()); // 查询生产单对应的配件的ES信息 - List orderPartsRemarks = buildOrderPartsByOrderId(orderIds, ORDER_PARTS_REMARK_MODEL, printOrderPartsRespVOS.size()); + List orderPartsRemarks = esUtils.getEsDocument(FIELD_ORDER_ID, orderIds, printOrderPartsRespVOS.size(), ORDER_PARTS_REMARK_MODEL, OrderPartsRemark.class); + // 查询生产单对应的包裹信息 List printOrderPackReqVOS = plateMapper.selectPlanPackList(ids,getUserOrganId()); - if(!printOrderPackReqVOS.isEmpty()) { + if(CollUtil.isNotEmpty(printOrderPackReqVOS)) { for (Long orderId : orderIds) { - // 统计每个订单的包装数量 printOrderPackReqVOS .stream() .filter(f -> f.getOrderId().equals(orderId)) - .forEach(f -> f.setPackNum(printOrderPackReqVOS.stream().filter(e -> e.getOrderId().equals(orderId)).map(PrintOrderPackReqVO::getPackId).toList().size())); - + .forEach(f -> f.setPackNum(printOrderPackReqVOS.stream() + .filter(e -> e.getOrderId().equals(orderId)) + .map(PrintOrderPackReqVO::getPackId).toList() + .size())); } } @@ -649,9 +784,8 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { .orderList(orderDOS) .plan(planDO) .goodsList(goodsDOS) - .plateList(plateDetialRespVOS) + .plateList(plateDetailRespVOS) .plateModels(orderModelDOS) - .optimizeBoardModelDOS(optimizeBoardModelDOS) .optimizeRemainPlates(optimizeRemainPlates) .orderPartsRespVOS(printOrderPartsRespVOS) .orderPartsRemarks(orderPartsRemarks) @@ -660,23 +794,217 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { } - public OrderSource getOrderSourceByGoodId(List ids) { + // 保存优化后的数据 + @Override + @Transactional(rollbackFor = Exception.class) + public void saveOptimizationResults(SavePlanPlateResultReqVO req) { + + OptimizeBoardModelDO boardModelDO = req.getOptimizeBoardModelDOS().get(0); + + List actualGoodsLists = Optional.ofNullable(boardModelDO.getActualGoodsList()).orElse(new ArrayList<>()); + + AssertUtils.notEmpty(actualGoodsLists,PLAN_NO_ACTUAL_PLATE); + + // 先根据排单查找是否有优化数据,如果有,删除 + Long planId = boardModelDO.getPlanId(); + + + List optimizeBoardModelDOS = esUtils.getEsDocument(FIELD_PLAN_CONFIG_ID,FIELD_PLAN_ID,req.getPlanConfigId(), planId, ORDER_OPTIMIZE_PLATE_MODEL, OptimizeBoardModelDO.class); + + // 删除原来的优化信息 + if(!optimizeBoardModelDOS.isEmpty()){ + esUtils.deleteEsDocument(FIELD_PLAN_CONFIG_ID,FIELD_PLAN_ID,req.getPlanConfigId(),planId,ORDER_OPTIMIZE_PLATE_MODEL); + + } + + // 保存优化后的大板数据 + esUtils.saveEsDocument(ORDER_OPTIMIZE_PLATE_MODEL,req.getOptimizeBoardModelDOS()); + + + // ES文档数据刷新 + esUtils.refresh(ORDER_OPTIMIZE_PLATE_MODEL); + + + } + + + + @Override + public void saveProcessSchemeResults(SaveProcessSchemeReqVO saveProcessSchemeReqVO) { + + Long processId = saveProcessSchemeReqVO.getProcessId(); + + List modelDOList = saveProcessSchemeReqVO.getModelDOList(); + + Long planId = modelDOList.stream().map(SaveProcessSchemeModelDO::getPlanId).distinct().toList().get(0); + + PlanDO planDO = planMapper.selectById(planId); + + // 如果方案组ID不相等,就删除旧的方案组信息,再保存新的加工方案组ID + if(!planDO.getProcessId().equals(processId)){ + planMapper.updateById(planDO.setProcessId(processId)); + } + + esUtils.deleteEsDocument(FIELD_PLAN_ID,planId,PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL); + + List orderIds = JSON.parseArray(planDO.getOrderNos()).toJavaList(Long.class).stream().distinct().toList(); + + List planItemDOS = planItemMapper.selectPlanPlateList(Collections.singletonList(planId), orderIds, getUserOrganId()); + + List ids = planItemDOS.stream().map(PlanItemDO::getGoodsId).distinct().toList(); + + List plateIds = planItemDOS.stream().map(PlanItemDO::getPlateId).toList(); + + plateMapper.updatePlateIsOptimized(orderIds,ids,plateIds,getUserOrganId()); + + + // 不能加非空判断,因为方案组里可能没有优化信息 + List optimizeBoardModelDOS = esUtils.getEsDocument(FIELD_PLAN_ID, planId, ORDER_OPTIMIZE_PLATE_MODEL, OptimizeBoardModelDO.class); + + + if(CollUtil.isNotEmpty(optimizeBoardModelDOS)){ + + optimizeBoardModelDOS.forEach(f->{ + + modelDOList.add(SaveProcessSchemeModelDO.builder() + .planConfigId(f.getPlanConfigId()) + .planName(f.getPlanConfigName()) + .plateNum(f.getPlaceBlockNumber()) + .goodsNum(f.getBoardCount()) + .isOptimized(true) + .build()); + + }); + + } + + esUtils.saveEsDocument(PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL,modelDOList); + + + } + + + + @Override + public PlanProcessSchemeList getProcessSchemeConfig(Long processId,Long planId) { + + PlanProcessSchemeList planProcessSchemeList = new PlanProcessSchemeList(); + + List schemeDTOList = systemConfigApi.getProcessById(processId).getCheckedData(); + + planProcessSchemeList.setProcessSchemeList(schemeDTOList); + + if(planId != null) { + + validatePlanExists(planId); + + // 查询排单对应的方案组信息 + List saveProcessSchemeReqVOS = Optional.ofNullable(esUtils.getEsDocument(FIELD_PLAN_ID,planId,PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL,SaveProcessSchemeModelDO.class)).orElse(new ArrayList<>()); + + + // 查询排单对应的优化信息 + List optimizeBoardModelDOS = esUtils.getEsDocument(FIELD_PLAN_ID, planId,schemeDTOList.size(), ORDER_OPTIMIZE_PLATE_MODEL, OptimizeBoardModelDO.class); + + + if (CollUtil.isNotEmpty(optimizeBoardModelDOS)) { + + + if(CollUtil.isNotEmpty(saveProcessSchemeReqVOS)) { + + saveProcessSchemeReqVOS.forEach(f -> { + + List modelDOList = optimizeBoardModelDOS.stream().filter(o -> o.getPlanConfigId().equals(f.getPlanConfigId())).toList(); + if(CollUtil.isNotEmpty(modelDOList)) { + + String jsonString = toJsonString(modelDOList.get(0)); + + f.setPlanOptimize(jsonString); + } + }); + }else { + optimizeBoardModelDOS.forEach(f -> { + + saveProcessSchemeReqVOS.add(SaveProcessSchemeModelDO.builder() + .planConfigId(f.getPlanConfigId()) + .planName(f.getPlanConfigName()) + .planId(f.getPlanId()) + .plateNum(f.getPlaceBlockNumber()) + .goodsNum(f.getBoardCount()) + .planOptimize(toJsonString(f)) + .build()); + + }); + } + } + + planProcessSchemeList.setSaveProcessSchemeReqVOS(saveProcessSchemeReqVOS); + + + } + + + return planProcessSchemeList; + } + + + + + + @Override + public void updateProcessScheme(PlanProcessSchemeReqVO reqVO) { + + validatePlanExists(reqVO.getPlanId()); + + updatePlanProcessScheme(reqVO.getPlanId(),reqVO.getPlanConfigId(),reqVO.getIsLock()); + + + } + + + + + @Override + public List getPlateModel(Long orderId) { + + List plateDOS = plateMapper.selectPlateNum(Collections.singletonList(orderId), getUserOrganId()); + + if(plateDOS.isEmpty()){ + return new ArrayList<>(); + } + + return esUtils.getEsDocument(FIELD_ORDER_ID, orderId, plateDOS.size(), OptimizePlanService.ORDER_PLATE_MODEL, OrderModelDO.class); + + + } + + + + + + + @Override + public OrderSource getNoPlanPlateData(NoPlanFilterPlateReqVO reqVO) { + + List orderIds = reqVO.getOrderIds(); + + List goodsDOS = goodsMapper.selectOrderGoodsList(orderIds, reqVO.getGoodsIdList(), getUserOrganId()); + + AssertUtils.notEmpty(goodsDOS,ORDER_GOODS_DATA_ERROR); + + + List ids = goodsDOS.stream().map(GoodsDO::getId).toList(); List goodsReqVOS = goodsMapper.selectGoodsAndRemainPlate(ids, getUserOrganId()); AssertUtils.notEmpty(goodsReqVOS,ORDER_GOODS_DATA_ERROR); - List orderIds = goodsReqVOS.stream().map(GoodsReqVO::getOrderId).distinct().toList(); - List orderDOS = orderMapper.selectBatchIds(orderIds); + List plateDetailRespVOS = plateMapper.selectPlateListByGoodsIds(orderIds,ids,getUserOrganId()); - List plateDetialRespVOS = plateMapper.selectPlateListByGoodsIds(ids, getUserOrganId()); - - - for (PlateDetialRespVO plateDetailsRespVO : plateDetialRespVOS) { + for (PlateDetailRespVO plateDetailsRespVO : plateDetailRespVOS) { StringBuilder name = new StringBuilder(); if(!plateDetailsRespVO.getProcessGroupLists().isEmpty()) { for (ProcessGroupList groupNameList : plateDetailsRespVO.getProcessGroupLists()) { @@ -692,272 +1020,496 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { // 造型数据的尺寸长度 - Integer orderModelSize = plateDetialRespVOS.size(); + Integer orderModelSize = plateDetailRespVOS.size(); // 需要查询的小板造型信息的板材ID - List plateIds = plateDetialRespVOS.stream().map(PlateDetialRespVO::getPlateId).toList(); + List plateIds = plateDetailRespVOS.stream().map(PlateDetailRespVO::getPlateId).toList(); + + List orderModelDOS = esUtils.getEsDocument("plateId", plateIds, orderModelSize, OptimizePlanService.ORDER_PLATE_MODEL, OrderModelDO.class); - List orderModelDOS = buildRespByPlateIds(plateIds, orderModelSize); return OrderSource.builder() .orderList(orderDOS) .goodsList(goodsReqVOS) - .plateList(plateDetialRespVOS) + .plateList(plateDetailRespVOS) .plateModels(orderModelDOS) .build(); - } - - - - - - // 保存优化后的数据 - @Override - @Transactional(rollbackFor = Exception.class) - public void saveOptimizationResults(SavePlanPlateResultReqVO req) { - - // 先根据排单查找是否有优化数据,如果有,删除 - List planIds = req.getOptimizeBoardModelDOS().stream().map(OptimizeBoardModelDO::getPlanId).distinct().toList(); - - List goodsDOS = goodsMapper.selectPlanGoodsListByPlanIdList(null,planIds, getUserOrganId()); - - AssertUtils.notEmpty(goodsDOS,CREATE_PLAN_DATA_ERROR); - - List ids = goodsDOS.stream().map(GoodsDO::getId).distinct().toList(); - - List orderIds = goodsDOS.stream().map(GoodsDO::getOrderId).distinct().toList(); - - List goodsIds = goodsDOS.stream().map(GoodsDO::getGoodsId).distinct().toList(); - - // todo 目前只解决非混单的情况下 (目前已解决混单的情况,数据正确性待校验) - List optimizeBoardModelDOS = buildBoardByPlanIds(planIds, ORDER_REMAIN_PLATE_MODEL, goodsIds.size()); - - if(!optimizeBoardModelDOS.isEmpty()){ - deleteByPlanId(planIds,ORDER_REMAIN_PLATE_MODEL); - } - - - // 保存优化后的大板数据 - batchSaveBoardModel(req.getOptimizeBoardModelDOS()); - - // ES文档数据刷新 - refresh(ORDER_REMAIN_PLATE_MODEL); - - plateMapper.updatePlateOptimized(orderIds,ids,getUserOrganId()); - - - } - - @Override - public List getPlateModel(Long orderId) { - - List plateDOS = plateMapper.selectPlateNum(orderId, getUserOrganId()); - - if(plateDOS.isEmpty()){ - return new ArrayList<>(); - } - - return buildRespByOrderId(orderId, plateDOS.size()); } - private List buildRespByPlateIds(Collection plateIds, Integer size) { - List fieldValues = plateIds.stream().map(FieldValue::of).toList(); - SearchRequest.Builder builder = new SearchRequest.Builder(); - builder.index(OptimizePlanService.ORDER_PLATE_MODEL); - builder.size(size); - builder.query(q -> q.terms(b -> b.field("plateId").terms(e -> e.value(fieldValues)))); - try { - SearchResponse search = elasticsearchClient.search(builder.build(), OrderModelDO.class); - List> hits = search.hits().hits(); - if (CollUtil.isNotEmpty(hits)) { - return hits.stream().map(Hit::source).toList(); - } - return new ArrayList<>(); - } catch (Exception e) { - log.error("生产单板材造型信息ES文档查询数据异常: "+e.getMessage()); - throw new ServiceException(DATA_DATA_ERROR); - } - } - - private List buildRespByOrderId(Long orderId, Integer size) { - SearchRequest.Builder builder = new SearchRequest.Builder(); - builder.index(OptimizePlanService.ORDER_PLATE_MODEL); - builder.size(size); - builder.query(q -> q.term(b -> b.field(FIELD_ORDER_ID).value(orderId))); - try { - SearchResponse search = elasticsearchClient.search(builder.build(), OrderModelDO.class); - List> hits = search.hits().hits(); - if (CollUtil.isNotEmpty(hits)) { - return hits.stream().map(Hit::source).toList(); - } - return new ArrayList<>(); - } catch (Exception e) { - log.error("生产单板材造型信息ES文档查询数据异常: "+e.getMessage()); - throw new ServiceException(DATA_DATA_ERROR); - } - } - - - /** - * 保存优化后的大板的数据 - * - * @param optimizeBoardModelDOS - */ - public void batchSaveBoardModel(List optimizeBoardModelDOS) { - try { - - esDocumentService.bulkCreate(ORDER_REMAIN_PLATE_MODEL, optimizeBoardModelDOS); - - } catch (Exception e) { - e.printStackTrace(); - log.error("优化生产ES文档保存数据异常: "+e.getMessage()); - throw new ServiceException(DATA_DATA_ERROR); - } - - } - - - private List buildBoardByOrderId(Long orderId, String index,Integer size) { - SearchRequest.Builder builder = new SearchRequest.Builder(); - builder.index(index); - builder.size(size); - builder.query(q -> q.term(b -> b.field(FIELD_ORDER_ID).value(orderId))); - try { - SearchResponse search = elasticsearchClient.search(builder.build(), OptimizeBoardModelDO.class); - List> hits = search.hits().hits(); - if (CollUtil.isNotEmpty(hits)) { - return hits.stream().map(Hit::source).toList(); - } - return new ArrayList<>(); - } catch (Exception e) { - log.error(ES_SELECT_DATA_ERROR+e.getMessage()); - throw new ServiceException(DATA_DATA_ERROR); - } - } - - - private List buildBoardByPlanId(Long planId, String index,Integer size) { - SearchRequest.Builder builder = new SearchRequest.Builder(); - builder.index(index); - builder.size(size); - builder.query(q -> q.term(b -> b.field(FIELD_PLAN_ID).value(planId))); - try { - SearchResponse search = elasticsearchClient.search(builder.build(), OptimizeBoardModelDO.class); - List> hits = search.hits().hits(); - if (CollUtil.isNotEmpty(hits)) { - return hits.stream().map(Hit::source).toList(); - } - return new ArrayList<>(); - } catch (Exception e) { - log.error(ES_SELECT_DATA_ERROR+e.getMessage()); - throw new ServiceException(DATA_DATA_ERROR); - } - } @Override - public List buildBoardByOrderIds(Collection orderIds, String index, Integer size) { - List fieldValues = orderIds.stream().map(FieldValue::of).toList(); - SearchRequest.Builder builder = new SearchRequest.Builder(); - builder.index(index); - builder.size(size); - builder.query(q -> q.terms(b -> b.field(FIELD_ORDER_ID).terms(e -> e.value(fieldValues)))); - try { - SearchResponse search = elasticsearchClient.search(builder.build(), OptimizeBoardModelDO.class); - List> hits = search.hits().hits(); - if (CollUtil.isNotEmpty(hits)) { - return hits.stream().map(Hit::source).toList(); + public PageResult getOrderPlateDataFilter(FilterDataPageReqVO pageReqVO) { + + PageDTO page = new PageDTO<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()); + + IPage orderRespVOCopyIPage = new PageDTO<>(); + + AdvancedScreeningConfig filterConfigs = parseObject(pageReqVO.getConfig(), AdvancedScreeningConfig.class); + + AssertUtils.notEmpty(filterConfigs,ADVANCED_SCREENING_CONFIG_ERROR); + + + boolean isPlateFilter = CharSequenceUtil.isNotBlank(filterConfigs.getPlateDataFilter()); + + // Mysql 的筛选条件 + String plateDataFilter = isPlateFilter ? filterConfigs.getPlateDataFilter() : "" ; + + // ES 的筛选条件 + String modelDataFilter = filterConfigs.getModelDataFilter(); + + // 连接中间运算符 + String logicalOperator = filterConfigs.getLogicalOperator(); + + List orderIdLists = Optional.ofNullable(pageReqVO.getOrderIds()).orElse(new ArrayList<>()); + + + + // 如果有加工组的字段,SQL查询走加工组表 + if(plateDataFilter.contains("og.name")){ + + QueryWrapperX queryWrapperX = new QueryWrapperX<>(); + queryWrapperX + .eq("og.organ_id",getUserOrganId()) + .eq("og.deleted",false) + .eq("ogs.plan_id",0) + .eq(FIELD_IS_OPTIMIZED,false) + .inIfPresent("ogs.good_id",pageReqVO.getGoodsIds()) + .apply(plateDataFilter); + + if(CharSequenceUtil.isBlank(modelDataFilter)) { + queryWrapperX.orderByDesc("og.order_id"); + orderRespVOCopyIPage = orderGroupMapper.selectFilterOrderPagePlate(page, queryWrapperX); + List orderIdList = orderRespVOCopyIPage.getRecords().stream().map(OrderRespVOCopy::getOrderId).toList(); + List orderRespVOCopies = orderMapper.selectOrderListByIds(orderIdList, getUserOrganId()); + orderRespVOCopyIPage.setRecords(orderRespVOCopies); + + return new PageResult<>(orderRespVOCopyIPage.getRecords(), orderRespVOCopyIPage.getTotal()); + } + + orderIdLists.addAll(orderGroupMapper.selectFilterOrderPlateList(queryWrapperX)); + + + }else { + + QueryWrapperX queryWrapperX = new QueryWrapperX<>(); + queryWrapperX + .eq("o.organ_id", getUserOrganId()) + .eq("o.deleted", false) + .eq("og.plan_id", 0) + .inIfPresent("og.good_id",pageReqVO.getGoodsIds()) + .apply(isPlateFilter,plateDataFilter); + + if (CharSequenceUtil.isBlank(modelDataFilter)) { + queryWrapperX.orderByDesc("o.id"); + IPage orderPlateList = orderMapper.selectFilterOrderPagePlate(page, queryWrapperX); + return new PageResult<>(orderPlateList.getRecords(), orderPlateList.getTotal()); + } + + List orderIds = orderMapper.selectFilterOrderPlateList(queryWrapperX); + + orderIdLists.addAll(orderIds); + + } + + + + + if(CharSequenceUtil.isNotBlank(modelDataFilter)){ + + Map> orderPlateModelMap = getOrderPlateModelList(conversion(orderIdLists.toString()), null, logicalOperator, modelDataFilter, pageReqVO,FIELD_ORDER_ID); + if(orderPlateModelMap.isEmpty()){ + return null; + } + for (Map.Entry> entry : orderPlateModelMap.entrySet()) { + + List orderRespVOCopies = orderMapper.selectOrderListByIds(entry.getValue().stream().map(OrderPlateModel::getOrderId).toList(), getUserOrganId()); + + orderRespVOCopyIPage.setRecords(orderRespVOCopies); + orderRespVOCopyIPage.setTotal(entry.getKey()); } - return new ArrayList<>(); - } catch (Exception e) { - log.error(ES_SELECT_DATA_ERROR+e.getMessage()); - throw new ServiceException(DATA_DATA_ERROR); } + + return new PageResult<>(orderRespVOCopyIPage.getRecords(), orderRespVOCopyIPage.getTotal()); + } - public List buildBoardByPlanIds(Collection planIds, String index, Integer size) { - List fieldValues = planIds.stream().map(FieldValue::of).toList(); - SearchRequest.Builder builder = new SearchRequest.Builder(); - builder.index(index); - builder.size(size); - builder.query(q -> q.terms(b -> b.field(FIELD_PLAN_ID).terms(e -> e.value(fieldValues)))); - try { - SearchResponse search = elasticsearchClient.search(builder.build(), OptimizeBoardModelDO.class); - List> hits = search.hits().hits(); - if (CollUtil.isNotEmpty(hits)) { - return hits.stream().map(Hit::source).toList(); + + @Override + public PageResult getGoodsPlateDataFilter(FilterDataPageReqVO pageReqVO) { + + PageDTO page = new PageDTO<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()); + + IPage orderRespVOCopyIPage = new PageDTO<>(); + + AdvancedScreeningConfig filterConfigs = parseObject(pageReqVO.getConfig(), AdvancedScreeningConfig.class); + + AssertUtils.notEmpty(filterConfigs,ADVANCED_SCREENING_CONFIG_ERROR); + + // MySql 筛选条件非空判断,方便判断是否进行 SQL 拼接 + boolean isPlateFilter = CharSequenceUtil.isNotBlank(filterConfigs.getPlateDataFilter()); + + // Mysql 的筛选条件 + String plateDataFilter = isPlateFilter ? filterConfigs.getPlateDataFilter() : "" ; + + // ES 的筛选条件 + String modelDataFilter = filterConfigs.getModelDataFilter(); + + // 连接中间运算符 + String logicalOperator = filterConfigs.getLogicalOperator(); + + + List orderIdList = Optional.ofNullable(pageReqVO.getOrderIds()).orElse(new ArrayList<>()); + + List goodsIdList = Optional.ofNullable(pageReqVO.getGoodsIds()).orElse(new ArrayList<>()); + + // 判断 MySql 的查询条件是否为空 + + // 如果有加工组的字段,SQL查询走加工组表 + if (plateDataFilter.contains("og.name")) { + + QueryWrapperX queryWrapperX = new QueryWrapperX<>(); + queryWrapperX + .eq("og.organ_id", getUserOrganId()) + .eq("og.deleted", false) + .eq("ogs.plan_id", 0) + .eq(FIELD_IS_OPTIMIZED, false) + .inIfPresent("og.id", pageReqVO.getOrderIds()) + .apply(plateDataFilter); + + if (CharSequenceUtil.isBlank(modelDataFilter)) { + orderRespVOCopyIPage = orderGroupMapper.selectFilterGoodsPagePlate(page, queryWrapperX); + List goodsIds = orderRespVOCopyIPage.getRecords().stream().map(OrderGoodsResp::getGoodsId).toList(); + + orderRespVOCopyIPage.setRecords(BeanUtils.toBean(goodsMapper.selectListByGoodsIdList(goodsIds, getUserOrganId()), OrderGoodsResp.class)); + + return new PageResult<>(orderRespVOCopyIPage.getRecords(), orderRespVOCopyIPage.getTotal()); } - return new ArrayList<>(); - } catch (Exception e) { - log.error(ES_SELECT_DATA_ERROR+e.getMessage()); - throw new ServiceException(DATA_DATA_ERROR); + + List orderIds = orderGroupMapper.selectFilterGoodsPlateList(queryWrapperX); + + orderIdList.addAll(orderIds.stream().map(OrderIds::getOrderId).distinct().toList()); + + goodsIdList.addAll(orderIds.stream().map(OrderIds::getGoodsId).distinct().toList()); + + } else { + + QueryWrapperX queryWrapperX = new QueryWrapperX<>(); + queryWrapperX + .eq("o.organ_id", getUserOrganId()) + .eq("o.deleted", false) + .eq("og.plan_id", 0) + .eq(FIELD_IS_OPTIMIZED, false) + .inIfPresent("o.id", pageReqVO.getOrderIds()) + .apply(isPlateFilter, plateDataFilter); + + // ES筛选条件为空,查询后直接返回 + if (CharSequenceUtil.isBlank(modelDataFilter)) { + IPage orderGoodsRespIPage = orderMapper.selectFilterGoodsPlatePage(page, queryWrapperX); + return new PageResult<>(orderGoodsRespIPage.getRecords(), orderGoodsRespIPage.getTotal()); + } + + List orderIds = orderMapper.selectFilterGoodsPlateList(queryWrapperX); + + orderIdList.addAll(orderIds.stream().map(OrderIds::getOrderId).distinct().toList()); + + goodsIdList.addAll(orderIds.stream().map(OrderIds::getGoodsId).distinct().toList()); + } + + + // 判断 ES 是否为空 + if(CharSequenceUtil.isNotBlank(modelDataFilter)){ + + Map> orderModelMap = getOrderPlateModelList(conversion(orderIdList.toString()), conversion(goodsIdList.toString()), logicalOperator, modelDataFilter, pageReqVO,FIELD_GOODS_ID); + if(orderModelMap.isEmpty()){ + return null; + } + for (Map.Entry> entry : orderModelMap.entrySet()) { + + List goodsIds = entry.getValue().stream().map(OrderPlateModel::getGoodsId).toList(); + + List orderGoodsRests = BeanUtils.toBean(goodsMapper.selectListByGoodsIdList(goodsIds, getUserOrganId()), OrderGoodsResp.class); + + orderRespVOCopyIPage.setRecords(orderGoodsRests); + orderRespVOCopyIPage.setTotal(entry.getKey()); + } + } + + return new PageResult<>(orderRespVOCopyIPage.getRecords(), orderRespVOCopyIPage.getTotal()); } - public List buildOrderPartsByOrderId(List orderIds, String index, Integer size) { - List fieldValues = orderIds.stream().map(FieldValue::of).toList(); - SearchRequest.Builder builder = new SearchRequest.Builder(); - builder.index(index); - builder.size(size); - builder.query(q -> q.terms(b -> b.field(FIELD_ORDER_ID).terms(e -> e.value(fieldValues)))); + + + private Map> getOrderPlateModelList(String orderIdList, + String goodsIdList, + String logicalOperator, + String config, + FilterDataPageReqVO pageReqVO, String field) { try { - SearchResponse search = elasticsearchClient.search(builder.build(), OrderPartsRemark.class); - List> hits = search.hits().hits(); + + // < 去重后查询到的总数量 , 查询到的板材造型数据 > + Map> orderModelMap = new HashMap<>(); + + SearchRequest.Builder builder = new SearchRequest.Builder(); + + builder.index(OptimizePlanService.ORDER_PLATE_MODEL); + + + // 生成查询 SQL + String filterSql = generateSql(orderIdList, goodsIdList, logicalOperator, config); + + + TranslateRequest.Builder builderTranslate = new TranslateRequest.Builder(); + + builderTranslate.query(filterSql); + + TranslateResponse translate = elasticsearchClient.sql().translate(builderTranslate.build()); + + builder.query(q->q.constantScore(c->c.filter(translate.query()))); + + + // 排序 + builder.sort(s->s.field(f->f.field("createTime").order(SortOrder.Desc))); + + + // 只查询一个字段 + builder.source(q->q.filter(f->f.includes(field))); + + + // 去重 + builder.collapse(q->q.field(field)); + + + // 分页 + builder.from(((pageReqVO.getPageNo() -1) * pageReqVO.getPageSize())); + builder.size(pageReqVO.getPageSize()); + + + // 获取去重后的总数量 + builder.aggregations("distinct_count",agg->agg.cardinality(c->c.field(field))); + + + // 执行查询 + SearchResponse search = elasticsearchClient.search(builder.build(), OrderPlateModel.class); + + Map aggregations = search.aggregations(); + + // 获取总数量 + long value = aggregations.get("distinct_count").cardinality().value(); + + List> hits = search.hits().hits(); if (CollUtil.isNotEmpty(hits)) { - return hits.stream().map(Hit::source).toList(); + orderModelMap.put(value,hits.stream().map(Hit::source).toList()); } - return new ArrayList<>(); + return orderModelMap; + } catch (Exception e) { - log.error("生产单配件ES文档查询异常:"+e.getMessage()); + log.error(ES_ORDER_MODEL_DATA_ERROR+e.getMessage()); throw new ServiceException(DATA_DATA_ERROR); } } + private void goodsFilter(List filter, List goodsReqVOS) { + + int goodsNum = goodsReqVOS.size(); + + Map> attributeMap = new HashMap<>(); + attributeMap.put(GoodsFilterConditionsEnum.THICKNESS.getFilterField(), GoodsReqVO::getThickness); + attributeMap.put(GoodsFilterConditionsEnum.MATERIAL.getFilterField(), GoodsReqVO::getMaterial); + attributeMap.put(GoodsFilterConditionsEnum.COLOR.getFilterField(), GoodsReqVO::getColor); + attributeMap.put(GoodsFilterConditionsEnum.TEXTURE.getFilterField(), GoodsReqVO::getTexture); + attributeMap.put(GoodsFilterConditionsEnum.BRAND.getFilterField(), GoodsReqVO::getBrand); + attributeMap.put(GoodsFilterConditionsEnum.WIDTH.getFilterField(), GoodsReqVO::getWidth); + attributeMap.put(GoodsFilterConditionsEnum.HEIGHT.getFilterField(), GoodsReqVO::getWidth); + + for (String s : filter) { + Function attributeFunc = attributeMap.get(s); + if (attributeFunc == null) { + throw new ServiceException(PLAN_MIXED_DATA_ERROR); + } + + // 获取当前属性的第一个值 + Object attributeValue = goodsReqVOS.stream() + .map(attributeFunc) + .findFirst() + .orElse(null); + + // 根据属性值过滤列表 + long count = goodsReqVOS.stream() + .filter(f -> attributeValue.equals(attributeFunc.apply(f))) + .count(); + + if (goodsNum != count) { + throw exception(PLAN_MIXED_ORDER_ERROR,GoodsFilterConditionsEnum.getValueByKey(s)); + } + + } + + } + + + private String conversion(String filed) { + + // 去除字段中的 【 】 + return filed.replaceAll("\\[|\\]", ""); + + } - public void deleteByPlanId(List planIds, String index) { - List fieldValues = planIds.stream().map(FieldValue::of).toList(); + private String generateSql(String orderIdList,String goodsIdList,String logicalOperator,String config){ - DeleteByQueryRequest.Builder builder = new DeleteByQueryRequest.Builder(); - builder.index(index); + String filterSql; - builder.query(q -> q.terms(b -> b.field(FIELD_PLAN_ID).terms(e -> e.value(fieldValues)))); + // 因生成 ES DSL 语句规则限制,无法赋值为空,只能赋值为 0 + String orderIds = CharSequenceUtil.isNotBlank(orderIdList) ? orderIdList : "0"; + + if(CharSequenceUtil.isNotBlank(logicalOperator)){ + + if(CharSequenceUtil.isNotBlank(goodsIdList)){ + + filterSql = " SELECT orderId,goodsId FROM " + OptimizePlanService.ORDER_PLATE_MODEL + " WHERE " + + "isOptimized = false " + + "and ( orderId in ( " + orderIds + " ) and goodsId in ( " + goodsIdList + " ) )" + + logicalOperator + + config + + FIELD_SORT; + + }else { + + filterSql = "SELECT orderId,goodsId FROM " + OptimizePlanService.ORDER_PLATE_MODEL + " WHERE " + + " " + + " ( orderId in ( " + orderIds + "))" + + logicalOperator + + config + + FIELD_SORT; + + } + }else { + + filterSql = "SELECT orderId,goodsId FROM " + OptimizePlanService.ORDER_PLATE_MODEL + " WHERE " + + "isOptimized = false and " + + config + + FIELD_SORT; + + } + + return filterSql; + } + + + + private List getPlanGoodsPlateList(List goodsNo,PlanDO planDO,List optimizeBoardModelDOS){ + + + List orderIdList = JSON.parseArray(planDO.getOrderNos()).toJavaList(Long.class).stream().distinct().toList(); + + + AssertUtils.notEmpty(optimizeBoardModelDOS,ORDER_PLAN_OPTIMIZE_ERROR); + + OptimizeBoardModelDO optimizeBoardModelDO = optimizeBoardModelDOS.get(0); + + Boolean isOptimized = optimizeBoardModelDO.getIsOptimized(); + + if(Boolean.FALSE.equals(isOptimized)){ + throw exception(ORDER_PLAN_NO_OPTIMIZE_UPDATE_ERROR); + } + + + List plateNo = new ArrayList<>(); + + + // 创建一个列表存储 BlockPlaceInfo 对象,将优化的小板信息拿出,获取到小板编号,查询生产单,修改生产单的状态 + List outputList = new ArrayList<>(); + + + String blockPlaceInfo = optimizeBoardModelDO.getBlockPlaceInfo(); + + + AssertUtils.notEmpty(blockPlaceInfo, ORDER_PLAN_OPTIMIZE_ERROR); + + + JsonNode jsonArray = parseTree(blockPlaceInfo); + + + boolean isArray = jsonArray.isArray(); + + + if (Boolean.FALSE.equals(isArray)) { + throw exception(ORDER_PLAN_OPTIMIZE_ERROR); + } + + + for (JsonNode jsonNode : jsonArray) { + Long bi = jsonNode.get("bi").asLong(); + String bo = jsonNode.get("bo").asText(); + outputList.add(new BlockPlaceInfo(bi,bo)); + } + + + goodsNo.forEach(g-> + plateNo.addAll(outputList.stream().filter(f -> f.getBi().equals(g)).map(BlockPlaceInfo::getBo).distinct().toList()) + ); + + + List plateDOS = plateMapper.selectPlateByPlateNo(orderIdList,plateNo.stream().distinct().toList(), getUserOrganId()); + + AssertUtils.notEmpty(plateDOS,ORDER_PLAN_OPTIMIZE_ERROR); + + return plateDOS; + + + } + + + + private PlanDO validatePlanExists(Long id ) { + PlanDO planDO = planMapper.selectById(id); + + AssertUtils.notEmpty(planDO,PLAN_NOT_EXISTS); + return planDO; + } + + + + + private void updatePlanProcessScheme(Long planId,Long planConfigId,Boolean isLock) { try { - DeleteByQueryResponse response = elasticsearchClient.deleteByQuery(builder.build()); - log.info("Deleted {} documents with planId {}", response.deleted(), planIds); - } catch (Exception e) { - log.error("Error deleting documents with planId {}: {}", planIds, e.getMessage()); + + UpdateByQueryRequest.Builder builder = new UpdateByQueryRequest.Builder(); + + builder.index(ORDER_OPTIMIZE_PLATE_MODEL) + .query(qb -> qb.bool(bq -> bq.filter(f->{ + f.term(t->t.field(FIELD_PLAN_ID).value(planId)); + f.term(t->t.field(FIELD_PLAN_CONFIG_ID).value(planConfigId)); + return f; + }) + )) + .script(s -> s.inline(i -> i + .source("ctx._source.isLock = params.new_value") + .params("new_value", JsonData.of(isLock)) + )); + + UpdateByQueryRequest request = builder.build(); + + // 执行更新操作 + elasticsearchClient.updateByQuery(request); + + }catch (Exception e){ + log.error(e.getMessage()); throw new ServiceException(ES_DATA_ERROR); + } + } - - // ES 文档数据刷新 - public void refresh( String index) { - - try { - - // 创建刷新请求 - RefreshRequest refreshRequest = new RefreshRequest.Builder().index(index).build(); - - elasticsearchClient.indices().refresh(refreshRequest); - - } catch (Exception e) { - log.error("ES文档数据刷新失败:"+e.getMessage()); - throw new ServiceException(ES_DATA_ERROR); - } - } - - - - } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderServiceImpl.java index 425db1464..724d9314e 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderServiceImpl.java @@ -35,6 +35,7 @@ import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderModelDO; import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderPlateList; import com.cf.imes.module.executor.dal.dataobject.pack.OrderPackageDO; import com.cf.imes.module.executor.dal.dataobject.plan.PlanDO; +import com.cf.imes.module.executor.dal.dataobject.planitem.PlanItemDO; import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO; import com.cf.imes.module.executor.dal.dataobject.plate.PlateGoodDO; import com.cf.imes.module.executor.dal.dataobject.rawgoods.RawGoodsDO; @@ -48,6 +49,7 @@ import com.cf.imes.module.executor.dal.mysql.orderParts.PartsMapper; import com.cf.imes.module.executor.dal.mysql.pack.OrderPackageMapper; import com.cf.imes.module.executor.dal.mysql.pack.OrderPrepackagedMapper; import com.cf.imes.module.executor.dal.mysql.plan.PlanMapper; +import com.cf.imes.module.executor.dal.mysql.planItem.PlanItemMapper; 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.rawgoods.RawGoodsMapper; @@ -58,6 +60,7 @@ import com.cf.imes.module.executor.service.customplateno.CustomPlateNoGenerateSe import com.cf.imes.module.executor.service.plan.PlanService; import com.cf.imes.module.executor.util.deviseData.structure.FieldConstants; import com.cf.imes.module.executor.util.deviseData.structure.PlateDetail; +import com.cf.imes.module.executor.util.elasticsearch.EsUtils; import com.cf.imes.module.executor.util.fileConversion.admin.SnowflakeIdWorker3rd; import com.cf.imes.module.executor.util.fileConversion.admin.api.webcad.ApiDataTypeVo; import org.springframework.aop.framework.AopContext; @@ -132,6 +135,9 @@ public class OrderServiceImpl implements OrderService { @Resource private OrderPrepackagedMapper orderPrepackagedMapper; + @Resource + private PlanItemMapper planItemMapper; + @Resource private OrderInputProcessor orderInputProcessor; @@ -147,6 +153,8 @@ public class OrderServiceImpl implements OrderService { @Resource private CustomPlateNoGenerateService customPlateNoGenerateService; + @Resource + private EsUtils esUtils; private static final String SUBMIT_STATE = "1"; // 空订单 原生产系统 @@ -376,7 +384,7 @@ public class OrderServiceImpl implements OrderService { } - List plateDOS = plateMapper.selectPlateIsOptimized(orderId, getUserOrganId()); + List plateDOS = plateMapper.selectPlateIsOptimized(Collections.singletonList(orderId), getUserOrganId()); if(!plateDOS.isEmpty()){ return; @@ -519,7 +527,7 @@ public class OrderServiceImpl implements OrderService { if (plateDetail != null && !plateDetail.isEmpty()){ List orderModelDOs = BeanUtils.toBean(plateDetail, OrderModelDO.class); - orderInputProcessor.batchSaveModel(orderModelDOs); +// orderInputProcessor.batchSaveModel(orderModelDOs); // 将生产单板材的造型信息进行压缩并保存 OrderModelCompressDO orderModelCompressDO = new OrderModelCompressDO(); @@ -1081,7 +1089,15 @@ public class OrderServiceImpl implements OrderService { List goodsIds = plateDOList.stream().map(PlateDO::getGoodsId).distinct().toList(); - plateMapper.updateDeletedPlate(plateIds, getUserOrganId(), orderId);// 删小板 + // 删除小板的信息 和 排单小板关联表中的小板信息 + plateMapper.updateDeletedPlate(plateIds, getUserOrganId(), orderId); + + planItemMapper.delete(new LambdaQueryWrapperX() + .eq(PlanItemDO::getOrganId, getUserOrganId()) + .eq(PlanItemDO::getOrderId,orderId) + .in(PlanItemDO::getPlateId, plateIds) + .in(PlanItemDO::getPlanId, planIds)); + // 删除包裹,只需删除,无需还原 List packIds = orderItemMapper.selectPackId(orderId,bodyIds, getUserOrganId()).stream().map(OrderItemDO::getPackageId).distinct().toList(); @@ -1123,6 +1139,7 @@ public class OrderServiceImpl implements OrderService { if (!planIds.isEmpty()) { + // 判断删除的柜体对应的板材是否和排单板材一样 List goodsDOS = goodsMapper.selectPlanGoodsListByPlanIdList(null,planIds, getUserOrganId()); @@ -1131,7 +1148,7 @@ public class OrderServiceImpl implements OrderService { planService.deletePlan(planIds); } else { // 只要有排单,不管删除的柜体的板材数和排单数一样,都要删除排单对应的优化数据(不用这种写法进行删除时,有时会报错,原因目前还没找到) - planService.deleteByPlanId(planIds, ORDER_REMAIN_PLATE_MODEL); + esUtils.deleteEsDocument("planId",planIds,ORDER_REMAIN_PLATE_MODEL); } } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderStatisticsServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderStatisticsServiceImpl.java index 1aa5861a5..7b232f728 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderStatisticsServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderStatisticsServiceImpl.java @@ -426,7 +426,7 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService { // 查询创建时间段内,数量最多的goods_id前十 SearchRequest searchRequest = new SearchRequest.Builder() .size(0) - .index(OptimizePlanService.ORDER_REMAIN_PLATE_MODEL) + .index(OptimizePlanService.ORDER_OPTIMIZE_PLATE_MODEL) .query(q -> q.bool(b -> b .must(m -> m.range(m1 -> m1.field(ORDER_REMAIN_PLATE_MODEL_CREATE_TIME_FIELDNAME) @@ -457,7 +457,7 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService { // 查询创建时间段内,数量最多的goods_id前十下的数据,按goods_id和日期分组 SearchRequest dateGroupRequest = new SearchRequest.Builder() .size(0) - .index(OptimizePlanService.ORDER_REMAIN_PLATE_MODEL) + .index(OptimizePlanService.ORDER_OPTIMIZE_PLATE_MODEL) .query(q -> q.bool(b -> b .must(m -> m.range(m1 -> m1.field(ORDER_REMAIN_PLATE_MODEL_CREATE_TIME_FIELDNAME) diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanService.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanService.java index bb8dbdbe0..2fd151cef 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanService.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanService.java @@ -3,13 +3,11 @@ package com.cf.imes.module.executor.service.plan; import com.cf.imes.framework.common.pojo.PageResult; 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.NotPlanGoodsReqVO; -import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.NotPlanGoodsRespVO; import com.cf.imes.module.executor.controller.admin.plan.vo.*; +import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderModelDO; import javax.validation.Valid; import java.util.List; -import java.util.Map; /** * 生产单开料排单 Service 接口 @@ -24,7 +22,7 @@ public interface PlanService { * @param createReqVO 创建信息 * @return 编号 */ - Map createPlan(@Valid PlanSaveReqVO createReqVO); + void createPlan(@Valid PlanSaveReqVO createReqVO); /** * 更新生产单开料排单 @@ -36,9 +34,9 @@ public interface PlanService { /** * 删除生产单开料排单 * - * @param ids 编号 + * @param planIds 编号 */ - Boolean deletePlan(List ids); + Boolean deletePlan(List planIds); /** * 获得生产单开料排单 @@ -56,31 +54,26 @@ public interface PlanService { */ PageResult getPlanPage(PlanPageReqVO pageReqVO); + List getPlanList(); PageResult getOrderPage(OrderPageReqVOCopy pageReqVO); PageResult getOrderGoodsPage(OrderPageReqVOCopy pageReqVO); - Boolean addPlate(AddPlateReq req); - - PageResult getPlateByPlanId(GetPlateByPlanIdVO vo); PageResult getOrderByPlanId(PlanOrderPageReqVO pageReqVO); - PageResult getNotPlanGoodsListPageByOrderId( NotPlanGoodsListPageVO pageVO); - - Boolean setSort(List list); + Boolean setSort(List sortVos); List getPlateList(List planIds); List getOrderRoomBody(List orderIds); - List getOrderPlateList(OrderPageReqVOCopy pageReqVO); - List getNotOptimizeGoodsList(NotPlanGoodsReqVO reqVO); + List buildPlateByOrderIds(List orderIds, List ids, Integer size); + - void deleteByPlanId(List planIds, String index); } \ 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/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 2ba1f775d..1b2c81f75 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 @@ -3,70 +3,76 @@ package com.cf.imes.module.executor.service.plan; import cn.hutool.core.collection.CollUtil; import co.elastic.clients.elasticsearch.ElasticsearchClient; import co.elastic.clients.elasticsearch._types.FieldValue; -import co.elastic.clients.elasticsearch.core.DeleteByQueryRequest; -import co.elastic.clients.elasticsearch.core.DeleteByQueryResponse; import co.elastic.clients.elasticsearch.core.SearchRequest; import co.elastic.clients.elasticsearch.core.SearchResponse; +import co.elastic.clients.elasticsearch.core.UpdateByQueryRequest; import co.elastic.clients.elasticsearch.core.search.Hit; +import co.elastic.clients.json.JsonData; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; -import com.cf.imes.framework.common.enums.PlanFilterTypeEnum; -import com.cf.imes.framework.common.enums.PlanStatusEnum; +import com.cf.imes.framework.common.enums.*; import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.common.util.Assert.AssertUtils; 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.MPJLambdaWrapperX; 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.order.vo.order.OrderRespVO; -import com.cf.imes.module.executor.controller.admin.plan.bo.OrderIds; import com.cf.imes.module.executor.controller.admin.plan.bo.OrderRoomBodyList; -import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.NotPlanGoodsReqVO; -import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.NotPlanGoodsRespVO; +import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.PlatePlaceInfo; import com.cf.imes.module.executor.controller.admin.plan.vo.*; +import com.cf.imes.module.executor.controller.admin.plate.vo.OrderPlateIds; 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.order.OrderDO; import com.cf.imes.module.executor.dal.dataobject.orderBody.OrderBodyDO; import com.cf.imes.module.executor.dal.dataobject.orderItem.OrderItemDO; +import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderModelDO; import com.cf.imes.module.executor.dal.dataobject.plan.PlanDO; import com.cf.imes.module.executor.dal.dataobject.planitem.PlanItemDO; import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO; import com.cf.imes.module.executor.dal.mysql.goods.GoodsMapper; -import com.cf.imes.module.executor.dal.mysql.module.ModuleMapper; import com.cf.imes.module.executor.dal.mysql.order.OrderMapper; import com.cf.imes.module.executor.dal.mysql.orderBody.OrderBodyMapper; import com.cf.imes.module.executor.dal.mysql.orderItem.OrderItemMapper; import com.cf.imes.module.executor.dal.mysql.plan.PlanMapper; -import com.cf.imes.module.executor.dal.mysql.planitem.PlanItemMapper; +import com.cf.imes.module.executor.dal.mysql.planItem.PlanItemMapper; 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.OrderStatusEnum; -import com.cf.imes.module.executor.service.optimizeplan.OptimizePlanService; -import com.cf.imes.module.system.api.machine.MachineApi; -import com.cf.imes.module.system.api.machine.dto.CuttingRespDTO; -import com.cf.imes.module.system.api.machine.dto.MachineDTO; +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 com.fasterxml.jackson.core.type.TypeReference; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.ObjectUtils; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.math.BigDecimal; +import java.time.LocalDateTime; import java.util.*; +import java.util.concurrent.atomic.AtomicLong; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; -import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.*; +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.exception.util.ServiceExceptionUtil.exception; +import static com.cf.imes.framework.common.util.json.JsonUtils.parseObject; +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.system.enums.ErrorCodeConstants.ORDER_PLAN_ERROR; import static com.cf.imes.module.system.enums.ErrorCodeConstants.*; /** @@ -98,10 +104,7 @@ public class PlanServiceImpl implements PlanService { private PlateMapper plateMapper; @Resource - private MachineApi machineApi; - - @Resource - private ModuleMapper moduleMapper; + private SystemConfigApi systemConfigApi; @Resource private OrderBodyMapper orderBodyMapper; @@ -112,193 +115,254 @@ public class PlanServiceImpl implements PlanService { @Resource private IdentifierGenerator identifierGenerator; - String ORDER_REMAIN_PLATE_MODEL = "imes_order_optimize_plate_model"; + private static final String ORDER_REMAIN_PLATE_MODEL = "imes_order_optimize_plate_model"; + + private static final String ORDER_PLATE_MODEL = "imes_order_optimize"; + + private static final String PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL = "imes_plan_process_scheme_optimize_model"; @Resource private ElasticsearchClient elasticsearchClient; @Resource - private OptimizePlanService optimizePlanService; + private ESDocumentService esDocumentService; + + @Resource + private EsUtils esUtils; + // 重复使用的常量 - private static final String FIELD_OG_ID = "og.id"; - private static final String FIELD_OP_FILTER_TYPE = "op.filter_type"; private static final String FIELD_OP_IS_SPECIAL_SHAPED = "op.is_special_shaped"; - private static final String FIELD_IS_SCULPT = "op.is_sculpt"; - private static final String FIELD_IS_DOOR = "op.is_door"; - private static final String FIELD_OP_HEIGHT = "op.height"; - private static final String FIELD_OP_WIDTH = "op.width"; private static final String FIELD_PLANID = "planId"; + private static final String FIELD_ORGAN_ID = "o.organ_id"; + private static final String FIELD_DELETED = "o.deleted"; + private static final String FIELD_STATUS = "o.status"; + private static final String FIELD_PLAN_ID = "opi.plan_id"; + private static final String FIELD_CUSTOMER = "o.customer"; + private static final String FIELD_CUSTOM_ORDER_NO = "o.custom_order_no"; + private static final String FIELD_ADDRESS = "o.address"; + private static final String FIELD_ORDER_DATE = "o.order_date"; @Override @Transactional(rollbackFor = Exception.class) - public Map createPlan(PlanSaveReqVO createReqVO) { - - MachineDTO checkedData = machineApi.getMachineDetail(createReqVO.getMachineId()).getCheckedData(); - AssertUtils.notEmpty(checkedData,MACHINE_NO_DATA_ERROR); + public void createPlan(PlanSaveReqVO createReqVO) { LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); assert loginUser != null; - createReqVO.setOperator(loginUser.getNickname()); + SystemConfigRespDTO systemConfigRespDTO = systemConfigApi.getDefaultProcessConfig().getCheckedData(); - // todo 目前只考虑了非混单的情况,混单的情况待考虑 - List itemList = createReqVO.getItemList(); - - AssertUtils.notEmpty(itemList,INSERT_PLATE_DATE_ERROR); + Long processId = systemConfigRespDTO.getId(); ArrayList planDOS = new ArrayList<>(); - List goodsDOS = new ArrayList<>(); + List ids = new ArrayList<>(); - List ids = new ArrayList<>(); + List orderIds = new ArrayList<>(); - List orderIdList = new ArrayList<>(); + List plateIds = new ArrayList<>(); - // <大板实际ID,排单ID> - Map goodsPlanId = new HashMap<>(); + List planItemDOS = new ArrayList<>(); - Map> groupedItems = itemList.stream() - .collect(Collectors.groupingBy(PlanSaveReqVO.Item::getGoodsId)); + SavePlanPlateList savePlanPlateList = createReqVO.getSavePlanPlateList(); + + if (Boolean.TRUE.equals(createReqVO.getIsMix())) { + + // 混单时走的逻辑 + List plateItemList = savePlanPlateList.getPlateItemList(); + + List goodsItemList = savePlanPlateList.getGoodsItemList(); + + // 查找材质和厚度相同的大板 + Map> grouped = groupByMaterialAndThickness(goodsItemList); + + // 进行数据处理:value 里为 大板的分类ID + grouped.forEach((key, value) -> { + + // 查找和大板分类ID相同的小板的数据 + List plateList = plateItemList.stream().filter(p -> value.contains(p.getId())).toList(); + + List orderIdList = plateList.stream().map(SavePlanPlateList.PlateItemList::getOrderId).distinct().toList(); + + AtomicLong sort = new AtomicLong(System.currentTimeMillis()); + sort.addAndGet(1); + + Long planId = (Long) identifierGenerator.nextId(null); + + // 创建排单 + planDOS.add(PlanDO.builder() + .id(planId) + .sort(sort.get()) + .type(PlanTypeEnum.MIXEDORDERPLAN.getType()) + .processId(processId) + .orderNos(orderIdList.toString()) + .produceTime(null) + .status(PlanStatusEnum.NOCUTTING.getStatus()) + .operator(loginUser.getNickname()) + .planTime(LocalDateTime.now()) + .build()); + + plateList.forEach(i -> + planItemDOS.add(PlanItemDO.builder() + .planId(planId) + .plateId(i.getPlateId()) + .orderId(i.getOrderId()) + .goodsId(i.getId()) + .build())); + + }); + + // 获取所有的大板ID + ids.addAll(goodsItemList.stream().map(SavePlanPlateList.GoodsItemList::getId).distinct().toList()); + // 获取所有的小板ID + plateIds.addAll(plateItemList.stream().map(SavePlanPlateList.PlateItemList::getPlateId).map(Long::valueOf).toList()); + // 获取所有的生产单ID + orderIds.addAll(plateItemList.stream().map(SavePlanPlateList.PlateItemList::getOrderId).distinct().map(Long::valueOf).toList()); - for (Map.Entry> entry : groupedItems.entrySet()) { + } else { - List items = entry.getValue(); + // 非混单 + List plateItemList = savePlanPlateList.getPlateItemList(); - List orderIds = items.stream().map(PlanSaveReqVO.Item::getOrderId).distinct().toList(); + List goodsItemList = savePlanPlateList.getGoodsItemList(); - orderIdList.addAll(orderIds); + // 查找材质和厚度和颜色相同的大板 + Map> grouped = groupByMaterialAndThicknessAndColor(goodsItemList); - // 创建排单 - PlanDO plan = BeanUtils.toBean(createReqVO, PlanDO.class); - plan.setId(identifierGenerator.nextId(plan).longValue()); - plan.setSort(0L); - String orderNos = orderIds.toString(); - plan.setOrderNos(orderNos); - plan.setProduceTime(null); + // 进行数据处理:value 里为 大板的分类ID + grouped.forEach((key, value) -> { - planDOS.add(plan); + // 查找和大板分类ID相同的小板的数据 + List plateList = plateItemList.stream().filter(p -> value.contains(p.getId())).toList(); - goodsPlanId.put(entry.getKey(), plan.getId()); + List orderIdList = plateList.stream().map(SavePlanPlateList.PlateItemList::getOrderId).distinct().toList(); - List goodsIds = items.stream().map(PlanSaveReqVO.Item::getId).toList(); + AtomicLong sort = new AtomicLong(System.currentTimeMillis()); + sort.addAndGet(1); - List goodsDOList = goodsMapper.selectPlanGoodsList(goodsIds, getUserOrganId()).stream().map(m -> m.setPlanId(plan.getId())).toList(); + Long planId = (Long) identifierGenerator.nextId(null); - ids.addAll(goodsDOList.stream().map(GoodsDO::getId).toList()); + // 创建排单 + planDOS.add(PlanDO.builder() + .id(planId) + .sort(sort.get()) + .type(PlanTypeEnum.MIXEDORDERPLAN.getType()) + .processId(processId) + .orderNos(orderIdList.toString()) + .produceTime(null) + .status(PlanStatusEnum.NOCUTTING.getStatus()) + .operator(loginUser.getNickname()) + .planTime(LocalDateTime.now()) + .build()); - goodsDOS.addAll(goodsDOList); + plateList.forEach(i -> { + planItemDOS.add(PlanItemDO.builder() + .planId(planId) + .plateId(i.getPlateId()) + .orderId(i.getOrderId()) + .goodsId(i.getId()) + .build()); + }); + }); + + + // 获取所有的大板ID + ids.addAll(goodsItemList.stream().map(SavePlanPlateList.GoodsItemList::getId).distinct().toList()); + // 获取所有的小板ID + plateIds.addAll(plateItemList.stream().map(SavePlanPlateList.PlateItemList::getPlateId).toList()); + // 获取所有的生产单ID + orderIds.addAll(plateItemList.stream().map(SavePlanPlateList.PlateItemList::getOrderId).distinct().toList()); } - List orderDOList = orderMapper.selectBatchIds(orderIdList); + + List orderDOList = orderMapper.selectBatchIds(orderIds); List orderDOS = orderDOList.stream() .filter(f -> !f.getStatus().equals(OrderStatusEnum.IN_PRODUCTION.getStatus())) .map(m -> m.setStatus(OrderStatusEnum.SORTED.getStatus())) .toList(); - - if(!orderDOS.isEmpty()) { + if(CollUtil.isNotEmpty(orderDOS)) { orderMapper.updateBatch(orderDOS); } + planMapper.insertBatch(planDOS); - goodsMapper.updateBatch(goodsDOS); + plateMapper.updatePlateIsOptimized(orderIds, ids, plateIds, getUserOrganId()); - plateMapper.updatePlateOptimized(orderIdList,ids,getUserOrganId()); + // 后面还需要测试一下这个新增的数量 + planItemMapper.insertBatch(planItemDOS, planItemDOS.size()); - return goodsPlanId; } + + + @Override @Transactional(rollbackFor = Exception.class) public void updatePlan(PlanSaveReqVO updateReqVO) { - // 校验排单是否存在,是否开料 - Long machineId = validatePlanExists(updateReqVO.getId()); + Long planId = updateReqVO.getId(); - // 更新 - PlanDO plan = BeanUtils.toBean(updateReqVO, PlanDO.class); + if(planId != null) { - // 校验新增的板材是否和排单为统一类型的 - if(updateReqVO.getItemList() != null){ + PlanDO planDO = validatePlan(planId); - // TODO 目前之解决非混单的情况,混单的情况待解决 - String goodsId = updateReqVO.getItemList().stream().map(PlanSaveReqVO.Item::getGoodsId).distinct().toList().get(0); + if(updateReqVO.getProcessId() != null){ + if(planDO.getStatus().equals(PlanStatusEnum.OPENING.getStatus()) || planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus())){ + throw exception(LIST_CHANGES_ARE_PROHIBITED); + } - // TODO 目前只解决非混单的情况 - String goodsIds = goodsMapper.selectPlanGoods(plan.getId(), getUserOrganId()).stream().map(GoodsDO::getGoodsId).toList().get(0); + planDO.setProcessId(updateReqVO.getProcessId()); - if(!goodsId.equals(goodsIds)){ - throw exception(PLATE_ERROR); + planMapper.updateById(planDO); + + }else { + + planDO.setStatus(updateReqVO.getStatus()); + planMapper.updateById(planDO); } - // 修改排单板材,删除排单的优化生产数据 - deleteByPlanId(Collections.singletonList(plan.getId()),ORDER_REMAIN_PLATE_MODEL); - - List ids = updateReqVO.getItemList().stream().map(PlanSaveReqVO.Item::getId).toList(); - - List orderIds = updateReqVO.getItemList().stream().map(PlanSaveReqVO.Item::getOrderId).toList(); - - List orderDOList = orderMapper.selectBatchIds(orderIds); - - orderDOList.forEach(m -> m.setStatus(OrderStatusEnum.SORTED.getStatus())); - - orderMapper.updateBatch(orderDOList); - - // 修改新增的大板对应的板材为已优化 - plateMapper.updatePlateOptimized(orderIds,ids,getUserOrganId()); - - List goodsDOS = new ArrayList<>(goodsMapper.selectPlanGoodsList(ids, getUserOrganId()) - .stream().map(m -> m.setPlanId(plan.getId())).toList()); - - if (!updateReqVO.getDeleteIds().isEmpty()){ - - List goodsDOList = goodsMapper.selectPlanGoodsList(updateReqVO.getDeleteIds(), getUserOrganId()); - - List goodsIdList = goodsDOList.stream().map(GoodsDO::getId).distinct().toList(); - - List orderIdList = goodsDOList.stream().map(GoodsDO::getOrderId).distinct().toList(); - - // 修改删除的大板对应的小板为未优化 - plateMapper.updateNoPlateOptimized(orderIdList,goodsIdList,getUserOrganId()); - - goodsDOS.addAll(goodsDOList.stream().map(m -> m.setPlanId(null)).toList()); - - } - - goodsMapper.updateBatch(goodsDOS); - - - } - - if(!machineId.equals(plan.getMachineId())){ - - deleteByPlanId(Collections.singletonList(plan.getId()),ORDER_REMAIN_PLATE_MODEL); - + return; } + // 删除小板 + List deleteOrderPlateIds = updateReqVO.getDeleteOrderPlateIds(); - planMapper.updateById(plan); + if(CollUtil.isNotEmpty(deleteOrderPlateIds)){ + deletePlanPlate(deleteOrderPlateIds); + + return; + } + + + // 添加小板 + List insertOrderPlateIds = updateReqVO.getInsertOrderPlateIds(); + + if(CollUtil.isNotEmpty(insertOrderPlateIds)){ + + insertPlanPlate(insertOrderPlateIds); + + } } @Override @Transactional(rollbackFor = Exception.class) - public Boolean deletePlan(List ids) { + public Boolean deletePlan(List planIds) { // 校验存在 - validatePlan(ids); + validatePlan(planIds); - List planDOS = planMapper.selectBatchIds(ids); + List planDOS = planMapper.selectBatchIds(planIds); List orderIds = new ArrayList<>(); for (PlanDO planDO : planDOS) { @@ -307,63 +371,78 @@ public class PlanServiceImpl implements PlanService { } - // 删除排单信息, ES优化数据,更新排单对应的余料板的排单ID为0 - planMapper.deleteBatchIds(ids); + // 删除排单信息,更新排单对应的余料板的排单ID为0 + planMapper.deleteBatchIds(planIds); - remainPlateMapper.deletePlanRemainPlate(ids,getUserOrganId()); + remainPlateMapper.deletePlanRemainPlate(planIds,getUserOrganId()); - List goodsIdList = goodsMapper.selectPlanGoodsListByPlanIdList(orderIds,ids, getUserOrganId()).stream().map(GoodsDO::getId).toList(); + // 删除板件表排单表的关联信息 + List planItemDOList = planItemMapper.selectPlanPlateList(planIds, orderIds, getUserOrganId()); - if(!goodsIdList.isEmpty()) { - // 修改删除的大板对应的小板为未优化 - plateMapper.updateNoPlateOptimized(orderIds, goodsIdList, getUserOrganId()); + List plateIds = planItemDOList.stream().map(PlanItemDO::getPlateId).toList(); - // 查询当前排单是否有自增板,如果有,删除 - List plateDOS = plateMapper.selectPlateIdList(orderIds, goodsIdList, getUserOrganId()); - if (!plateDOS.isEmpty()) { - List plateIds = plateDOS.stream().map(PlateDO::getId).toList(); + List ids = planItemDOList.stream().map(PlanItemDO::getGoodsId).toList(); - plateMapper.deleteBatchIds(plateIds); - - orderItemMapper.delete(new LambdaQueryWrapperX() - .eq(OrderItemDO::getOrganId, getUserOrganId()) - .in(OrderItemDO::getOrderId, orderIds) - .in(OrderItemDO::getPlateId, plateIds)); + plateMapper.updateNoPlateOptimized(orderIds, ids,plateIds, getUserOrganId()); + // 删除板材和排单明细表里对应的小板ID + planItemMapper.delete(new LambdaQueryWrapperX() + .eq(PlanItemDO::getOrganId, getUserOrganId()) + .in(PlanItemDO::getOrderId,orderIds) + .in(PlanItemDO::getPlateId, plateIds) + .in(PlanItemDO::getPlanId, planIds)); + + + // 查询当前排单是否有自增板,如果有,删除 + List plateDOS = plateMapper.selectPlateIdList(orderIds, ids, getUserOrganId()); + + if (!plateDOS.isEmpty()) { + List plateIdList = plateDOS.stream().map(PlateDO::getId).toList(); + + plateMapper.deleteBatchIds(plateIdList); + + orderItemMapper.delete(new LambdaQueryWrapperX() + .eq(OrderItemDO::getOrganId, getUserOrganId()) + .in(OrderItemDO::getOrderId, orderIds) + .in(OrderItemDO::getPlateId, plateIdList)); + + + } + + + // 排单对应的优化数据删除 + esUtils.deleteEsDocument(FIELD_PLANID,planIds,ORDER_REMAIN_PLATE_MODEL); + + + // 删除排单对应的加工方案的优化数据 + esUtils.deleteEsDocument(FIELD_PLANID,planIds,PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL); + + + + // 查询删除的小板对应的生产单信息,如果生产单的小板全部改成了未优化,修改状态 + List plateIsOptimizedList = plateMapper.selectPlateIsOptimized(orderIds, getUserOrganId()); + + if(CollUtil.isNotEmpty(plateIsOptimizedList)){ + + List orderIdList = plateIsOptimizedList.stream().map(PlateDO::getOrderId).distinct().toList(); + + List diff = Stream.concat( + orderIdList.stream().filter(str -> !orderIds.contains(str)), + orderIds.stream().filter(str -> !orderIdList.contains(str))) + .toList(); + + if(CollUtil.isNotEmpty(diff)){ + + List orderList = orderMapper.selectBatchIds(diff); + + orderList.forEach(f->f.setStatus(OrderStatusEnum.NEW_ORDER.getStatus())); + + orderMapper.updateBatch(orderList); } - } - - - // 排单对应的自增板的删除 todo 目前值解决了非混单的情况 - List boardModelDOS = buildBoardByPlanIds(ids, ORDER_REMAIN_PLATE_MODEL, ids.size()); - if(!boardModelDOS.isEmpty()) { - // 删除排单对应的优化生产数据 - deleteByPlanId(ids, ORDER_REMAIN_PLATE_MODEL); } - // 删除商品表里的 planId - goodsMapper.deletePlanGoods(orderIds,ids,getUserOrganId()); - - - List longList = goodsMapper.selectNoPlanOrdersList(orderIds, getUserOrganId()); - - - List diff = Stream.concat( - orderIds.stream().filter(str -> !longList.contains(str)), - longList.stream().filter(str -> !orderIds.contains(str))) - .toList(); - - - if(!diff.isEmpty()){ - - List orderList = orderMapper.selectBatchIds(diff); - - List orderDOList = orderList.stream().map(m -> m.setStatus(OrderStatusEnum.NEW_ORDER.getStatus())).toList(); - - orderMapper.updateBatch(orderDOList); - } return Boolean.TRUE; } @@ -421,32 +500,32 @@ public class PlanServiceImpl implements PlanService { } - Set machineIds = planDOPageResult.getList().stream().map(PlanDO::getMachineId).collect(Collectors.toSet()); + List processIds = planDOPageResult.getList().stream().map(PlanDO::getProcessId).distinct().toList(); List planIds = planDOPageResult.getList().stream().map(PlanDO::getId).toList(); - List machines = machineApi.list(machineIds).getCheckedData(); + List configDOS = systemConfigApi.getProcessByIds(processIds).getData(); // 查询排单对应的大板板材信息 - List plateInfoVOS = goodsMapper.selectOrderGoodsPlateList(planIds, getUserOrganId()); + List plateInfoVOS = planItemMapper.selectOrderPlanPlateList(planIds,getUserOrganId()); // 查询排单对应的小板数量和小板面积 - List infoVOList = plateInfoVOS.stream().peek(m -> { + plateInfoVOS.forEach(m -> { m.setCount((int) m.getPlatePages().stream().map(PlatePage::getPlateId).count()); m.setArea(m.getPlatePages().stream().map(PlatePage::getArea).reduce(BigDecimal.ZERO, BigDecimal::add)); m.setPlatePages(null); - }).toList(); + }); - // 根据排单ID查询ES中的优化数据 todo 目前只解决无混单的情况,混单情况待解决 - List optimizeBoardModelDOS = buildBoardByPlanIds(planIds, ORDER_REMAIN_PLATE_MODEL, infoVOList.size()); + // 根据排单ID查询ES中的优化数据 + List optimizeBoardModelDOS = esUtils.getEsDocument(FIELD_PLANID, planIds, planIds.size(), ORDER_REMAIN_PLATE_MODEL, OptimizeBoardModelDO.class); // 获取排单对应的生产单的信息 @@ -458,14 +537,14 @@ public class PlanServiceImpl implements PlanService { planRespVOPageResult.getList().forEach(e -> { - // 机台信息 - e.setMachineName(getMachineName(e.getMachineId(), machines)); - // 板材信息列表 - e.setPlateInfoList(getPlateInfoList(e.getId(), infoVOList)); - // todo 小板总数量目前只解决没有混单的情况时的小板数量,后续待加入混单情况 (目前解决,数据正确性待测试) - e.setPlateNum(getPlateNum(e.getId(), infoVOList)); - // todo 大板优化数量目前只解决没有混单的情况时的小板数量,后续待加入混单情况 (目前解决,数据正确性待测试) - e.setOptimizeGoodsCount(getOptimizeGoodsCount(e.getId(), optimizeBoardModelDOS)); + // 方案信息 + e.setProcessName(getProcessName(e.getProcessId(), configDOS)); + // 大板信息列表 + e.setPlateInfoList(getPlateInfoList(e.getId(), plateInfoVOS)); + // 小板的总数量 + e.setPlateNum(getPlateNum(e.getId(), plateInfoVOS)); + // 大板总数量 + e.setGoodsCount(getOptimizeGoodsCount(e.getId(), optimizeBoardModelDOS)); // 大板开料数 e.setCutGoodsCount(getCutGoodsCount(e.getId(), optimizeBoardModelDOS)); // 小板优化数量 @@ -481,181 +560,158 @@ public class PlanServiceImpl implements PlanService { } + @Override + public List getPlanList() { + + List status = Arrays.asList(PlanStatusEnum.NOCUTTING.getStatus(),PlanStatusEnum.OPENING.getStatus()); + + List planDOList = planMapper.selectPlanSortList(status, getUserOrganId()); + + if (CollUtil.isEmpty(planDOList)) { + 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()); + + + // 查询排单对应的小板数量和小板面积 + plateInfoVOS.forEach(m -> { + + m.setCount((int) m.getPlatePages().stream().map(PlatePage::getPlateId).count()); + + m.setArea(m.getPlatePages().stream().map(PlatePage::getArea).reduce(BigDecimal.ZERO, BigDecimal::add)); + m.setPlatePages(null); + + }); + + + // 根据排单ID查询ES中的优化数据 + List optimizeBoardModelDOS = esUtils.getEsDocument(FIELD_PLANID, planIds, planIds.size(), ORDER_REMAIN_PLATE_MODEL, OptimizeBoardModelDO.class); + + + // 获取排单对应的生产单的信息 + List planOrderRespVOS = orderMapper.selectPlanOrderList(planIds, getUserOrganId()); + + + List planRespVOList = BeanUtils.toBean(planDOList, PlanRespVO.class); + + + planRespVOList.forEach(e -> { + // 机台信息 + e.setProcessName(getProcessName(e.getProcessId(), configDOS)); + // 板材信息列表 + 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.setOrderList(getOrderList(e.getId(), planOrderRespVOS)); + }); + + + return planRespVOList; + + + } + + @Override public PageResult getOrderPage(OrderPageReqVOCopy pageReqVO) { PageDTO page = new PageDTO<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()); List statusList = new ArrayList<>(); - List goodsIds = new ArrayList<>(); + statusList.add(OrderStatusEnum.NEW_ORDER.getStatus()); statusList.add(OrderStatusEnum.IN_PRODUCTION.getStatus()); statusList.add(OrderStatusEnum.SORTED.getStatus()); - // todo 修改排单数据筛选,目前只解决了非混单的情况,混单情况待解决 - if(pageReqVO.getGoodsId() != null) { - List goodsDOS = goodsMapper.selectListByGoodsId(pageReqVO.getGoodsId(), getUserOrganId()); - goodsIds.addAll(goodsDOS.stream().map(GoodsDO::getId).toList()); - } + List goodsId = pageReqVO.getGoodsId(); QueryWrapperX queryWrapperX = new QueryWrapperX<>(); queryWrapperX - .eq("o.organ_id",getUserOrganId()) - .eq("o.deleted",false) - .in("o.status",statusList) + .eq(FIELD_ORGAN_ID,getUserOrganId()) + .eq(FIELD_DELETED,false) + .in(FIELD_STATUS,statusList) + .isNull(FIELD_PLAN_ID) - // todo 修改排单数据筛选,目前只解决了非混单的情况,混单情况待解决 - .inIfPresent(FIELD_OG_ID,goodsIds) + .inIfPresent("og.goods_id",goodsId) .inIfPresent("o.id",pageReqVO.getOrderIds()) .likeIfPresent("o.id", pageReqVO.getOrderId() != null ? pageReqVO.getOrderId() : null) - .inIfPresent(FIELD_OG_ID,pageReqVO.getIds()) - .likeIfPresent("o.customer", pageReqVO.getConsignee()) - .likeIfPresent("o.custom_order_no", pageReqVO.getDefaultId()) - .likeIfPresent("o.address", pageReqVO.getConsigneeAddress()) - .betweenIfPresent("o.order_date", pageReqVO.getCreateTime()) - .eqIfPresent(FIELD_OP_IS_SPECIAL_SHAPED, pageReqVO.getRectangle() != null ? false: null) - .eqIfPresent(FIELD_OP_IS_SPECIAL_SHAPED, pageReqVO.getSpecialShaped()) - .eqIfPresent(FIELD_IS_SCULPT, pageReqVO.getSculpt()) - .eqIfPresent(FIELD_IS_DOOR, pageReqVO.getIsDoor()) - .betweenIfPresent(FIELD_OP_HEIGHT, new BigDecimal[]{pageReqVO.getLongMinRang(), pageReqVO.getLongMaxRang()}) - .betweenIfPresent(FIELD_OP_WIDTH, new BigDecimal[]{pageReqVO.getWidthMinRang(), pageReqVO.getWidthMaxRang()}) + + .likeIfPresent(FIELD_CUSTOMER, pageReqVO.getConsignee()) + .likeIfPresent(FIELD_CUSTOM_ORDER_NO, pageReqVO.getDefaultId()) + .likeIfPresent(FIELD_ADDRESS, pageReqVO.getConsigneeAddress()) + .betweenIfPresent(FIELD_ORDER_DATE, pageReqVO.getCreateTime()) .orderByDesc("o.id"); - String filterTypes = ""; - if (Objects.nonNull(pageReqVO.getHoleThrough()) && pageReqVO.getHoleThrough()) { - filterTypes += PlanFilterTypeEnum.DIGGINGTHROUGHTHESHAPE.getType().toString(); - } - if (Objects.nonNull(pageReqVO.getBurrow()) && pageReqVO.getBurrow()) { - filterTypes += PlanFilterTypeEnum.THEREAREPERFORATEDHOLES.getType().toString(); - } - if (Objects.nonNull(pageReqVO.getTwoDimensionalToolPath()) && pageReqVO.getTwoDimensionalToolPath()) { - filterTypes += PlanFilterTypeEnum.TWODIMENSIONALCUTTINGPATH.getType().toString(); - } - - queryWrapperX.likeIfPresent(FIELD_OP_FILTER_TYPE, insertSeparator(filterTypes)); - - - IPage orderRespVOCopies = orderMapper.selectOrderPage(page,queryWrapperX); - - if (CollUtil.isEmpty(orderRespVOCopies.getRecords())) { - return new PageResult<>(); - } + IPage orderRespVOCopies = planItemMapper.selectOrderList(page,queryWrapperX); List records = orderRespVOCopies.getRecords(); + if (CollUtil.isEmpty(records)) { + return new PageResult<>(); + } + List orderIds = records.stream().map(OrderRespVOCopy::getOrderId).toList(); + List ids = new ArrayList<>(); + + if(CollUtil.isNotEmpty(goodsId)) { + + List goodsDOS = goodsMapper.selectListByGoodsId(orderIds,goodsId, getUserOrganId()); + ids.addAll(goodsDOS.stream().map(GoodsDO::getId).toList()); + + } + + QueryWrapperX queryWrapperX2 = new QueryWrapperX<>(); queryWrapperX2 - .eq("organ_id",getUserOrganId()) - .eq("deleted",false) - .in("order_id",orderIds) - .eq("is_optimized",false) - .inIfPresent("goods_id",goodsIds) - .inIfPresent("goods_id",pageReqVO.getIds()) - .eqIfPresent("is_special_shaped", pageReqVO.getRectangle() != null ? false: null) - .eqIfPresent("is_special_shaped", pageReqVO.getSpecialShaped()) - .eqIfPresent("is_sculpt", pageReqVO.getSculpt()) - .eqIfPresent("is_door", pageReqVO.getIsDoor()) - .betweenIfPresent("height", new BigDecimal[]{pageReqVO.getLongMinRang(), pageReqVO.getLongMaxRang()}) - .betweenIfPresent("width", new BigDecimal[]{pageReqVO.getWidthMinRang(), pageReqVO.getWidthMaxRang()}); + .eq("op.organ_id",getUserOrganId()) + .in("op.order_id",orderIds) + .eq("op.deleted",false) + .eq("op.is_optimized",false) + .inIfPresent("op.goods_id",ids) + .isNull(FIELD_PLAN_ID); + List plateList = plateMapper.selectNoPlanPlateList(queryWrapperX2); - orderRespVOCopies.setRecords(records.stream().peek(m->{ + orderRespVOCopies.getRecords().forEach(m->{ m.setNum((int) plateList.stream().filter(f->f.getOrderId().equals(m.getOrderId())).map(PlatePage::getPlateId).count()); m.setArea(plateList.stream().filter(f->f.getOrderId().equals(m.getOrderId())).map(PlatePage::getArea).reduce(BigDecimal.ZERO,BigDecimal::add)); - }).toList()); - + }); return new PageResult<>(orderRespVOCopies.getRecords(), orderRespVOCopies.getTotal()); } - @Override - public List getOrderPlateList(OrderPageReqVOCopy pageReqVO) { - - QueryWrapperX queryWrapperX = new QueryWrapperX<>(); - queryWrapperX - .eq("c.organ_id",getUserOrganId()) - .inIfPresent("c.order_id", pageReqVO.getOrderIds()) - .isNull("opi.item_id") - .inIfPresent("oi.room_id",pageReqVO.getRoomId()) - .inIfPresent("oi.body_id",pageReqVO.getBodyId()) - .eqIfPresent("a.is_special_shaped", pageReqVO.getRectangle() != null ? false: null) - .eqIfPresent("a.is_special_shaped", pageReqVO.getSpecialShaped()) - .eqIfPresent("a.is_sculpt", pageReqVO.getSculpt()) - .eqIfPresent("a.is_door", pageReqVO.getIsDoor()) - .betweenIfPresent("a.height", new BigDecimal[]{pageReqVO.getLongMinRang(), pageReqVO.getLongMaxRang()}) - .betweenIfPresent("a.width", new BigDecimal[]{pageReqVO.getWidthMinRang(), pageReqVO.getWidthMaxRang()}) - .groupBy("c.id", " c.order_id", "c.goods_name", "c.width", "c.height", "c.thickness","c.material","c.color","c.texture","c.goods_id"); - - String filterTypes = ""; - if (Objects.nonNull(pageReqVO.getHoleThrough()) && pageReqVO.getHoleThrough()) { - filterTypes += PlanFilterTypeEnum.DIGGINGTHROUGHTHESHAPE.getType().toString(); - } - if (Objects.nonNull(pageReqVO.getBurrow()) && pageReqVO.getBurrow()) { - filterTypes += PlanFilterTypeEnum.THEREAREPERFORATEDHOLES.getType().toString(); - } - if (Objects.nonNull(pageReqVO.getTwoDimensionalToolPath()) && pageReqVO.getTwoDimensionalToolPath()) { - filterTypes += PlanFilterTypeEnum.TWODIMENSIONALCUTTINGPATH.getType().toString(); - } - - queryWrapperX.likeIfPresent("a.filter_type", insertSeparator(filterTypes)); - - List notPlanOrderPlateRespVOS = plateMapper.selectGoodsPage(queryWrapperX); - - // todo 目前数据筛选只考虑了非混单的情况,混单情况待解决 - if(pageReqVO.getGoodsId() != null) { - return notPlanOrderPlateRespVOS.stream().filter(f -> f.getGoodsId().equals(pageReqVO.getGoodsId())).toList(); - } - - return notPlanOrderPlateRespVOS; - - - - } - - @Override - public List getNotOptimizeGoodsList(NotPlanGoodsReqVO reqVO) { - - // 板材库对应的大板ID - List plateGoodIds = reqVO.getOrderIdList().stream().map(OrderIds::getId).toList(); - - - List notPlanGoodsRespVOS = goodsMapper.selectJoinList(NotPlanGoodsRespVO.class, new MPJLambdaWrapperX() - - .leftJoin(PlateDO.class, PlateDO::getGoodsId, GoodsDO::getId) - .selectCount(PlateDO::getId,"plateNum") - .select(GoodsDO::getGoodsId, GoodsDO::getHeight, GoodsDO::getWidth, GoodsDO::getColor, GoodsDO::getGoodsName, GoodsDO::getThickness,GoodsDO::getSpec,GoodsDO::getMaterial,GoodsDO::getTexture) - .isNotNull(PlanItemDO::getId) - .eq(GoodsDO::getOrganId, getUserOrganId()) - .in(GoodsDO::getId, plateGoodIds) - .groupBy(GoodsDO::getGoodsId, GoodsDO::getHeight, GoodsDO::getWidth, GoodsDO::getColor, GoodsDO::getGoodsName, GoodsDO::getThickness,GoodsDO::getSpec,GoodsDO::getMaterial,GoodsDO::getTexture)); - - - for (NotPlanGoodsRespVO notPlanGoodsRespVO : notPlanGoodsRespVOS) { - notPlanGoodsRespVO.setOrderIdList(reqVO.getOrderIdList() - .stream() - .filter(orderIds -> orderIds.getGoodsId().equals(notPlanGoodsRespVO.getGoodsId())).toList()); - - notPlanGoodsRespVO.setGoodsNum(notPlanGoodsRespVO.getOrderIdList().stream().map(OrderIds::getId).toList().size()); - - } - - return notPlanGoodsRespVOS; - } - @Override public PageResult getOrderGoodsPage(OrderPageReqVOCopy pageReqVO) { - PageDTO page = new PageDTO<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()); List statusList = new ArrayList<>(); @@ -663,81 +719,79 @@ public class PlanServiceImpl implements PlanService { statusList.add(OrderStatusEnum.IN_PRODUCTION.getStatus()); statusList.add(OrderStatusEnum.SORTED.getStatus()); + QueryWrapperX queryWrapperX = new QueryWrapperX<>(); + IPage orderGoodsResps = new PageDTO<>(); + if(CollUtil.isNotEmpty(pageReqVO.getRoomId()) || CollUtil.isNotEmpty(pageReqVO.getBodyId() )){ - QueryWrapperX queryWrapperX = new QueryWrapperX<>(); - queryWrapperX - .eq("o.organ_id",getUserOrganId()) - .eq("o.deleted",false) - .in("o.status",statusList) + AssertUtils.notEmpty(pageReqVO.getOrderIds(),ORDER_PLAN_ERROR); - .inIfPresent("og.order_id", pageReqVO.getOrderIds()) - .inIfPresent(FIELD_OG_ID, pageReqVO.getIds()) - // todo 修改排单数据筛选,目前只解决了非混单的情况,混单情况待解决 - .eqIfPresent("og.goods_id",pageReqVO.getGoodsId()) - .likeIfPresent("o.id", pageReqVO.getOrderId() != null ? pageReqVO.getOrderId() : null) - .likeIfPresent("o.customer", pageReqVO.getConsignee()) - .likeIfPresent("o.custom_order_no", pageReqVO.getDefaultId()) - .likeIfPresent("o.address", pageReqVO.getConsigneeAddress()) - .betweenIfPresent("o.order_date", pageReqVO.getCreateTime()) - .eqIfPresent(FIELD_OP_IS_SPECIAL_SHAPED, pageReqVO.getRectangle() != null ? false: null) - .eqIfPresent(FIELD_OP_IS_SPECIAL_SHAPED, pageReqVO.getSpecialShaped()) - .eqIfPresent(FIELD_IS_SCULPT, pageReqVO.getSculpt()) - .eqIfPresent(FIELD_IS_DOOR, pageReqVO.getIsDoor()) - .betweenIfPresent(FIELD_OP_HEIGHT, new BigDecimal[]{pageReqVO.getLongMinRang(), pageReqVO.getLongMaxRang()}) - .betweenIfPresent(FIELD_OP_WIDTH, new BigDecimal[]{pageReqVO.getWidthMinRang(), pageReqVO.getWidthMaxRang()}); - String filterTypes = ""; - if (Objects.nonNull(pageReqVO.getHoleThrough()) && pageReqVO.getHoleThrough()) { - filterTypes += PlanFilterTypeEnum.DIGGINGTHROUGHTHESHAPE.getType().toString(); - } - if (Objects.nonNull(pageReqVO.getBurrow()) && pageReqVO.getBurrow()) { - filterTypes += PlanFilterTypeEnum.THEREAREPERFORATEDHOLES.getType().toString(); - } - if (Objects.nonNull(pageReqVO.getTwoDimensionalToolPath()) && pageReqVO.getTwoDimensionalToolPath()) { - filterTypes += PlanFilterTypeEnum.TWODIMENSIONALCUTTINGPATH.getType().toString(); - } + queryWrapperX + .eq(FIELD_ORGAN_ID, getUserOrganId()) + .eq(FIELD_DELETED, false) + .in(FIELD_STATUS, statusList) + .isNull(FIELD_PLAN_ID) - queryWrapperX.likeIfPresent(FIELD_OP_FILTER_TYPE, insertSeparator(filterTypes)); + .in("o.id", pageReqVO.getOrderIds()) + .inIfPresent("oi.room_id",pageReqVO.getRoomId()) + .inIfPresent("oi.body_id",pageReqVO.getBodyId()) + .likeIfPresent("o.id", pageReqVO.getOrderId()) + .likeIfPresent(FIELD_CUSTOMER, pageReqVO.getConsignee()) + .likeIfPresent(FIELD_CUSTOM_ORDER_NO, pageReqVO.getDefaultId()) + .likeIfPresent(FIELD_ADDRESS, pageReqVO.getConsigneeAddress()) + .betweenIfPresent(FIELD_ORDER_DATE, pageReqVO.getCreateTime()); + orderGoodsResps = planItemMapper.selectNoPlanGoodsByRoomAndBodyIds(page,queryWrapperX); - IPage orderGoodsResps = orderMapper.selectOrderIds(page,queryWrapperX); + }else { + queryWrapperX + .eq(FIELD_ORGAN_ID, getUserOrganId()) + .eq(FIELD_DELETED, false) + .in(FIELD_STATUS, statusList) + .isNull(FIELD_PLAN_ID) + + .inIfPresent("o.id", pageReqVO.getOrderIds()) + .likeIfPresent("o.id", pageReqVO.getOrderId()) + .likeIfPresent(FIELD_CUSTOMER, pageReqVO.getConsignee()) + .likeIfPresent(FIELD_CUSTOM_ORDER_NO, pageReqVO.getDefaultId()) + .likeIfPresent(FIELD_ADDRESS, pageReqVO.getConsigneeAddress()) + .betweenIfPresent(FIELD_ORDER_DATE, pageReqVO.getCreateTime()); + + orderGoodsResps = planItemMapper.selectNoPlanGoodsList(page,queryWrapperX); - if (CollUtil.isEmpty(orderGoodsResps.getRecords())) { - return new PageResult<>(); } List records = orderGoodsResps.getRecords(); - - - List goodsIdList = records.stream().map(OrderGoodsResp::getGoodsId).toList(); - - - queryWrapperX.in("og.goods_id", goodsIdList); - - - List goodsResp = orderMapper.selectGoodsListByGoodsId(queryWrapperX); - - - for (OrderGoodsResp vosRecords : records) { - - List orderIdsList = new ArrayList<>(); - - List> list = goodsResp.stream().filter(f -> f.getGoodsId().equals(vosRecords.getGoodsId())).map(OrderGoodsResp::getOrderIds).toList(); - - if(!list.isEmpty()){ - - orderIdsList = list.stream().flatMap(Collection::stream).toList(); - - } - - vosRecords.setOrderIds(orderIdsList); + if (CollUtil.isEmpty(records)) { + return new PageResult<>(); } + List goodsName = records.stream().map(OrderGoodsResp::getGoodsName).distinct().toList(); - orderGoodsResps.setRecords(records); + List material = records.stream().map(OrderGoodsResp::getMaterial).distinct().toList(); + List color = records.stream().map(OrderGoodsResp::getColor).distinct().toList(); + + List texture = records.stream().map(OrderGoodsResp::getTexture).distinct().toList(); + + List thickness = records.stream().map(OrderGoodsResp::getThickness).distinct().toList(); + + List brand = records.stream().map(OrderGoodsResp::getBrand).distinct().toList(); + + + queryWrapperX + .inIfPresent("og.goods_name",goodsName) + .inIfPresent("og.material",material) + .inIfPresent("og.color",color) + .inIfPresent("og.texture",texture) + .inIfPresent("og.thickness",thickness) + .inIfPresent("og.brand",brand); + + List orderGoodsIdList = planItemMapper.selectNoOrderGoodsIdList(queryWrapperX); + + mergeOrderGoodsLists(records,orderGoodsIdList); return new PageResult<>(orderGoodsResps.getRecords(), orderGoodsResps.getTotal()); @@ -746,31 +800,6 @@ public class PlanServiceImpl implements PlanService { - - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean addPlate(AddPlateReq req) { - List orderItemDOS = new ArrayList<>(); - List planItemDOS = new ArrayList<>(); - for (AddPlateReq.Obj obj : req.getList()) { - orderItemDOS.add(OrderItemDO.builder() - .planId(req.getPlanId()) - .orderId(obj.getOrderId()) - .plateId(obj.getPlateId()) - .type(1) - .build()); - - planItemDOS.add(PlanItemDO.builder() - .planId(req.getPlanId()) - .itemId(obj.getPlateId()) - .build()); - } - orderItemMapper.insertBatch(orderItemDOS); - planItemMapper.insertBatch(planItemDOS); - return Boolean.TRUE; - } - - @Override public PageResult getPlateByPlanId(GetPlateByPlanIdVO vo) { if(vo.getPlanIds().isEmpty()){ @@ -779,7 +808,7 @@ public class PlanServiceImpl implements PlanService { for (Long planId : vo.getPlanIds()) { validatePlan(planId); } - QueryWrapperX queryWrapperX = new QueryWrapperX<>(); + QueryWrapperX queryWrapperX = new QueryWrapperX<>(); String filterTypes = ""; if (Objects.nonNull(vo.getHoleThrough()) && vo.getHoleThrough()) { @@ -792,84 +821,82 @@ public class PlanServiceImpl implements PlanService { filterTypes += PlanFilterTypeEnum.TWODIMENSIONALCUTTINGPATH.getType().toString(); } - queryWrapperX.eq("og.organ_id",getUserOrganId()) - .eq("og.deleted",false) - .in("og.plan_id", vo.getPlanIds()) - .eqIfPresent(FIELD_IS_DOOR, vo.getIsDoor()) + queryWrapperX.eq("opi.organ_id",getUserOrganId()) + .in(FIELD_PLAN_ID, vo.getPlanIds()) + .eqIfPresent("op.is_door", vo.getIsDoor()) .eqIfPresent(FIELD_OP_IS_SPECIAL_SHAPED, vo.getRectangle() != null ? false: null) .eqIfPresent(FIELD_OP_IS_SPECIAL_SHAPED, vo.getSpecialShaped()) - .eqIfPresent(FIELD_IS_SCULPT, vo.getSculpt()) - .betweenIfPresent(FIELD_OP_WIDTH, new BigDecimal[]{vo.getWidthMinRang(), vo.getWidthMaxRang()}) - .betweenIfPresent(FIELD_OP_HEIGHT, new BigDecimal[]{vo.getLongMinRang(), vo.getLongMaxRang()}) - .likeIfPresent(FIELD_OP_FILTER_TYPE, insertSeparator(filterTypes)); + .eqIfPresent("op.is_sculpt", vo.getSculpt()) + .betweenIfPresent("op.width", new BigDecimal[]{vo.getWidthMinRang(), vo.getWidthMaxRang()}) + .betweenIfPresent("op.height", new BigDecimal[]{vo.getLongMinRang(), vo.getLongMaxRang()}) + .likeIfPresent("op.filter_type", insertSeparator(filterTypes)); PageDTO page = new PageDTO<>(vo.getPageNo(), vo.getPageSize()); - IPage pageResult = goodsMapper.selectPlanGoodsListByPlanId(page, queryWrapperX); + IPage pageResult = planItemMapper.selectPlateListByPlateIds(page,queryWrapperX); + if (CollUtil.isEmpty(pageResult.getRecords())) { return new PageResult<>(); } - Set bodyIds = pageResult.getRecords().stream().map(PlateResList::getBodyId).collect(Collectors.toSet()); - if (CollUtil.isNotEmpty(bodyIds)) { - List orderBodyDOS = orderBodyMapper.selectBatchIds(bodyIds); - for (PlateResList resList : pageResult.getRecords()) { - resList.setBodyName(orderBodyDOS.stream().filter(e -> Objects.equals(e.getId(), resList.getBodyId())).map(OrderBodyDO::getName).findAny().orElse(null)); - resList.setRoomName(orderBodyDOS.stream().filter(e -> Objects.equals(e.getRoomId(), resList.getRoomId())).map(OrderBodyDO::getRoomName).findAny().orElse(null)); - } - } return new PageResult<>(pageResult.getRecords(), pageResult.getTotal()); } + + + + @Override public PageResult getOrderByPlanId(PlanOrderPageReqVO pageReqVO) { - validatePlan(pageReqVO.getPlanId()); + PlanDO planDO = validatePlan(pageReqVO.getPlanId()); - MPJLambdaWrapperX lambdaWrapperX = new MPJLambdaWrapperX<>(); - lambdaWrapperX.leftJoin(GoodsDO.class, GoodsDO::getOrderId, OrderDO::getId) - .eq(GoodsDO::getOrganId,getUserOrganId()) - .eq(GoodsDO::getDeleted,false) - .eq(GoodsDO::getPlanId, pageReqVO.getPlanId()) - .distinct(); + List orderIds = JSON.parseArray(planDO.getOrderNos()).toJavaList(Long.class).stream().distinct().toList(); - PageResult pageResult = orderMapper.selectJoinPage(pageReqVO, OrderDO.class, lambdaWrapperX); - if (CollUtil.isEmpty(pageResult.getList())) { - return new PageResult<>(); + List orderDOList = orderMapper.selectBatchIds(orderIds); + + return new PageResult<>(BeanUtils.toBean(orderDOList, OrderRespVO.class), (long) orderDOList.size()); + + } + + + + + @Override + public Boolean setSort(List sortVos) { + + ArrayList planDOS = new ArrayList<>(); + + Boolean isTopUp = sortVos.get(0).getIsTopUp(); + + if(Boolean.TRUE.equals(isTopUp)){ + + List status = Arrays.asList(PlanStatusEnum.NOCUTTING.getStatus(),PlanStatusEnum.OPENING.getStatus()); + + // 后续的查询需要加上 是否置顶 的判断条件 + List planDOList = planMapper.selectPlanSortList(status, getUserOrganId()); + if(CollUtil.isNotEmpty(planDOList)) { + // 修改为 未置顶 +// planDOList.forEach(f->f); + + planDOS.addAll(planDOList); + } } - return BeanUtils.toBean(pageResult, OrderRespVO.class); - } - @Override - public PageResult getNotPlanGoodsListPageByOrderId(NotPlanGoodsListPageVO pageVO) { - return goodsMapper.selectJoinPage(pageVO, PlanGoodsVO.class, new MPJLambdaWrapperX() - .leftJoin(PlateDO.class, PlateDO::getGoodsId, GoodsDO::getId) - .leftJoin(OrderItemDO.class, OrderItemDO::getPlateId, PlateDO::getId) - .leftJoin(PlanItemDO.class, PlanItemDO::getItemId, OrderItemDO::getId) - .select(GoodsDO::getGoodsId, GoodsDO::getHeight, GoodsDO::getWidth, GoodsDO::getColor, GoodsDO::getGoodsName, GoodsDO::getThickness) - .selectSum(PlateDO::getArea, "area") - .selectCount(PlateDO::getId, "num") - .isNotNull(PlanItemDO::getId) - .eq(GoodsDO::getOrganId,getUserOrganId()) - .eq(GoodsDO::getOrderId, pageVO.getOrderId()) - .groupBy(GoodsDO::getId) - ); - } - @Override - public Boolean setSort(List list) { - ArrayList planDOS = new ArrayList<>(); - list.forEach(e -> { + sortVos.forEach(e -> { planDOS.add(PlanDO.builder() .id(e.getPlanId()) .sort(e.getSort()) +// .isTopUp(e.getIsTopUp()) .build()); }); + planMapper.updateBatch(planDOS); return Boolean.TRUE; } @@ -918,67 +945,31 @@ public class PlanServiceImpl implements PlanService { } - @Override - public void deleteByPlanId(List planIds, String index) { - List fieldValues = planIds.stream().map(FieldValue::of).toList(); - DeleteByQueryRequest.Builder builder = new DeleteByQueryRequest.Builder(); - builder.index(index); + private PlanDO validatePlan(Long id) { - builder.query(q -> q.terms(b -> b.field(FIELD_PLANID).terms(e -> e.value(fieldValues)))); + PlanDO planDO = planMapper.selectById(id); - try { - DeleteByQueryResponse response = elasticsearchClient.deleteByQuery(builder.build()); - log.info("Deleted {} documents with planId {}", response.deleted(), planIds); - } catch (Exception e) { - log.error("Error deleting documents with planId {}: {}", planIds, e.getMessage()); - throw new ServiceException(ES_DATA_ERROR); - } + AssertUtils.notEmpty(planDO,PLAN_NOT_EXISTS); + + return planDO; } - public List buildBoardByPlanIds(Collection planIds, String index, Integer size) { - List fieldValues = planIds.stream().map(FieldValue::of).toList(); - SearchRequest.Builder builder = new SearchRequest.Builder(); - builder.index(index); - builder.size(size); - builder.query(q -> q.terms(b -> b.field(FIELD_PLANID).terms(e -> e.value(fieldValues)))); - try { - SearchResponse search = elasticsearchClient.search(builder.build(), OptimizeBoardModelDO.class); - List> hits = search.hits().hits(); - if (CollUtil.isNotEmpty(hits)) { - return hits.stream().map(Hit::source).toList(); + + private List validatePlanExists(List planIds ) { + + List planDOS = new ArrayList<>(); + for (Long planId : planIds) { + PlanDO planDO = planMapper.selectById(planId); + if(ObjectUtils.isEmpty(planDO)){ + throw exception(PLAN_NOT_DATA_EXISTS,planDO.getId()); } - return new ArrayList<>(); - } catch (Exception e) { - log.error("优化生产ES文档数据查询异常:"+e.getMessage()); - throw new ServiceException(DATA_DATA_ERROR); - } - } - - - - private void validatePlan(Long id) { - - PlanDO planDO = planMapper.selectById(id); - - AssertUtils.notEmpty(planDO,PLAN_NOT_EXISTS); - } - - - - - private Long validatePlanExists(Long id) { - PlanDO planDO = planMapper.selectById(id); - - AssertUtils.notEmpty(planDO,PLAN_NOT_EXISTS); - - if(planDO.getStatus().equals(PlanStatusEnum.OPENING.getStatus()) || planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus())){ - throw exception(LIST_CHANGES_ARE_PROHIBITED); + planDOS.add(planDO); } - return planDO.getMachineId(); + return planDOS; } @@ -1001,11 +992,11 @@ public class PlanServiceImpl implements PlanService { - // 机台信息 - private String getMachineName(Long machineId, List machines) { - return machines.stream() - .filter(f -> Objects.equals(f.getId(), machineId)) - .map(CuttingRespDTO::getName) + // 方案信息 + private String getProcessName(Long processId,List configDOS) { + return configDOS.stream() + .filter(f -> Objects.equals(f.getId(), processId)) + .map(SystemConfigRespDTO::getName) .findAny() .orElse(null); } @@ -1037,7 +1028,7 @@ public class PlanServiceImpl implements PlanService { private long getCutGoodsCount(Long planId, List optimizeBoardModelDos) { return optimizeBoardModelDos.stream() .filter(f -> Objects.equals(f.getPlanId(), planId)) - .mapToLong(m -> m.getCutedBoardInfo() == null ? 0 : m.getCutedBoardInfo().getCutedBoardNumber()) + .mapToLong(m -> m.getCutedBoardNumber() == null ? 0 : m.getCutedBoardNumber()) .sum(); } @@ -1058,4 +1049,450 @@ public class PlanServiceImpl implements PlanService { + private void goodsFilter(List filter, List goodsReqVOS) { + + int goodsNum = goodsReqVOS.size(); + + Map> attributeMap = new HashMap<>(); + attributeMap.put(GoodsFilterConditionsEnum.THICKNESS.getFilterField(), GoodsDO::getThickness); + attributeMap.put(GoodsFilterConditionsEnum.MATERIAL.getFilterField(), GoodsDO::getMaterial); + attributeMap.put(GoodsFilterConditionsEnum.COLOR.getFilterField(), GoodsDO::getColor); + attributeMap.put(GoodsFilterConditionsEnum.TEXTURE.getFilterField(), GoodsDO::getTexture); + attributeMap.put(GoodsFilterConditionsEnum.BRAND.getFilterField(), GoodsDO::getBrand); + attributeMap.put(GoodsFilterConditionsEnum.WIDTH.getFilterField(), GoodsDO::getWidth); + attributeMap.put(GoodsFilterConditionsEnum.HEIGHT.getFilterField(), GoodsDO::getHeight); + + for (String s : filter) { + Function attributeFunc = attributeMap.get(s); + if (attributeFunc == null) { + throw new ServiceException(PLAN_MIXED_DATA_ERROR); + } + + // 获取当前属性的第一个值 + Object attributeValue = goodsReqVOS.stream() + .map(attributeFunc) + .findFirst() + .orElse(null); + + // 根据属性值过滤列表 + long count = goodsReqVOS.stream() + .filter(f -> attributeValue.equals(attributeFunc.apply(f))) + .count(); + + if (goodsNum != count) { + throw exception(PLAN_MIXED_ORDER_ERROR,GoodsFilterConditionsEnum.getValueByKey(s)); + } + + } + + } + + + + + private List getOrderModelList(List orderIds,List ids,Boolean isOptimized) { + + int plateSize = plateMapper.selectPlateIds(orderIds, ids, getUserOrganId()).size(); + + + List orderModelDOS = buildPlateByOrderIds(orderIds,ids,plateSize); + + AssertUtils.notEmpty(orderModelDOS,ORDER_PLAN_PLATE_MODEL_DATE_ERROR); + + orderModelDOS.forEach(f->{ + f.setIsOptimized(isOptimized); + f.setUpdateTime(LocalDateTime.now().toString()); + }); + + return orderModelDOS; + + } + + + + @Override + public List buildPlateByOrderIds(List orderIds,List ids, Integer size) { + + List orderIdList = orderIds.stream().map(FieldValue::of).toList(); + List plateGoodsIds = ids.stream().map(FieldValue::of).toList(); + + SearchRequest.Builder builder = new SearchRequest.Builder(); + builder.index(ORDER_PLATE_MODEL); + builder.size(size); + + builder.query(q -> q.bool(b -> b + .filter(m->{ + m.terms(t->t.field("orderId").terms(e -> e.value(orderIdList))); + m.terms(t->t.field("plateGoodsId").terms(e -> e.value(plateGoodsIds))); + return m; + }))); + + try { + SearchResponse search = elasticsearchClient.search(builder.build(), OrderModelDO.class); + List> hits = search.hits().hits(); + if (CollUtil.isNotEmpty(hits)) { + return hits.stream().map(Hit::source).toList(); + } + return new ArrayList<>(); + } catch (Exception e) { + log.error("ES_SELECT_DATA_ERROR"+e.getMessage()); + throw new ServiceException(DATA_DATA_ERROR); + } + + } + + + + + + + private void deletePlanPlate( List deleteOrderPlateIds) { + + List deletePlanIds = deleteOrderPlateIds.stream().map(OrderPlateIds::getPlanId).distinct().toList(); + + List planDOS = validatePlanExists(deletePlanIds); + + for (PlanDO planDO : planDOS) { + if (planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus())) { + throw exception(PLAN_PLATE_IS_ALL_CUT,planDO.getId()); + } + } + + + + List plateStatus = Arrays.asList(OrderPlateCutStatusEnum.OPENING.getStatus(),OrderPlateCutStatusEnum.OPENED.getStatus()); + + List deletePlateIds = deleteOrderPlateIds.stream().map(OrderPlateIds::getPlateId).toList(); + + List deleteOrderIds = deleteOrderPlateIds.stream().map(OrderPlateIds::getOrderId).distinct().toList(); + + // 查询需要删除的小板对应的信息 + List plateDOS = plateMapper.selectBatchIds(deletePlateIds); + + + List plateDOList = plateDOS.stream().filter(f -> plateStatus.contains(f.getIsCutted())).toList(); + + AssertUtils.empty(plateDOList,PLAN_PLATE_IS_CUTTED); + + + // 删除优化生产中未开料的小板的优化数据 + List optimizeBoardModelDOS = esUtils.getEsDocument(FIELD_PLANID, 1L, 10, ORDER_REMAIN_PLATE_MODEL, OptimizeBoardModelDO.class); + + if(CollUtil.isNotEmpty(optimizeBoardModelDOS)){ + + + List plateNo = plateDOS.stream().map(PlateDO::getPlateNo).toList(); + + optimizeBoardModelDOS.forEach(f->{ + + List asJsonObject = parseObject(f.getBlockPlaceInfo(), new TypeReference<>() {}); + + List platePlaceInfos = asJsonObject.stream() + .filter(fi -> !plateNo.contains(fi.getBo())) + .toList(); + + String blockPlaceInfo = toJsonString(platePlaceInfos); + + f.setBlockPlaceInfo(blockPlaceInfo); + f.setPlaceBlockNumber((long) platePlaceInfos.size()); + + }); + + try { + + esDocumentService.bulkUpdate(ORDER_REMAIN_PLATE_MODEL, optimizeBoardModelDOS); + + }catch (Exception e){ + log.error(e.getMessage()); + throw new ServiceException(ES_DATA_ERROR); + } + + + } + + + // 修改排单加工方案的优化状态 + updateProcessSchemeStatus(deletePlanIds); + + // 删除板材和排单明细表里对应的小板ID + planItemMapper.delete(new LambdaQueryWrapperX() + .eq(PlanItemDO::getOrganId, getUserOrganId()) + .in(PlanItemDO::getOrderId,deleteOrderIds) + .in(PlanItemDO::getPlateId, deletePlateIds) + .in(PlanItemDO::getPlanId, deletePlanIds)); + + // 修改板件表的优化信息为:未优化 + plateDOS.forEach(f->f.setIsOptimized(false)); + + plateMapper.updateBatch(plateDOS); + + + + // 查询排单对应的小板ID的数量 + List planItemDOS = planItemMapper.selectPlanPlateList(deletePlanIds, deleteOrderIds, getUserOrganId()); + + + List planIds = planItemDOS.stream().map(PlanItemDO::getPlanId).distinct().toList(); + + + List noPlanIds = Stream.concat( + planIds.stream().filter(str -> !deletePlanIds.contains(str)), + deletePlanIds.stream().filter(str -> !planIds.contains(str))) + .toList(); + + if(CollUtil.isNotEmpty(noPlanIds)){ + + planMapper.deleteBatchIds(noPlanIds); + + + // 删除排单对应的优化生产数据 + esUtils.deleteEsDocument(FIELD_PLANID,planIds,ORDER_REMAIN_PLATE_MODEL); + + + } + + + if(CollUtil.isNotEmpty(planIds)){ + + List planDOList = planDOS.stream().filter(f -> planIds.contains(f.getId())).toList(); + + List planOrderIds = planItemDOS.stream().map(PlanItemDO::getOrderId).distinct().toList(); + + if(planOrderIds.size() != deleteOrderIds.size()){ + + planDOList.forEach(f->{ + f.setOrderNos(planItemDOS.stream().filter(p->f.getId().equals(p.getPlanId())).map(PlanItemDO::getOrderId).distinct().toString()); + }); + + planMapper.updateBatch(planDOList); + + } + } + + + + + // 查询删除的小板对应的生产单信息,如果生产单的小板全部改成了未优化,修改状态 + List plateIsOptimizedList = plateMapper.selectPlateIsOptimized(deleteOrderIds, getUserOrganId()); + + if(CollUtil.isNotEmpty(plateIsOptimizedList)){ + + List orderIds = plateIsOptimizedList.stream().map(PlateDO::getOrderId).distinct().toList(); + + List diff = Stream.concat( + orderIds.stream().filter(str -> !deleteOrderIds.contains(str)), + deleteOrderIds.stream().filter(str -> !orderIds.contains(str))) + .toList(); + + if(CollUtil.isNotEmpty(diff)){ + + List orderList = orderMapper.selectBatchIds(diff); + + orderList.forEach(f->f.setStatus(OrderStatusEnum.NEW_ORDER.getStatus())); + + orderMapper.updateBatch(orderList); + } + + } + + } + + + + private void insertPlanPlate(List insertOrderPlateIds){ + + // 后面还需要看看是否需要进行混单的判断 + + List insertPlanIds = insertOrderPlateIds.stream().map(OrderPlateIds::getPlanId).distinct().toList(); + + List planDOS = validatePlanExists(insertPlanIds); + + + List planItemDOS = new ArrayList<>(); + + insertOrderPlateIds.forEach(f->{ + planItemDOS.add(PlanItemDO.builder() + .plateId(f.getPlateId()) + .planId(f.getPlanId()) + .orderId(f.getOrderId()) + .goodsId(f.getId()) + .build()); + + }); + + planDOS.forEach(f->{ + + if(f.getType().equals(PlanStatusEnum.OPENED.getStatus())){ + f.setStatus(PlanStatusEnum.OPENING.getStatus()); + + } + + List orderIds = new ArrayList<>(insertOrderPlateIds.stream().map(OrderPlateIds::getOrderId).distinct().toList()); + + orderIds.addAll(JSON.parseArray(f.getOrderNos()).toJavaList(Long.class).stream().distinct().toList()); + + f.setOrderNos(orderIds.stream().distinct().toList().toString()); + + }); + + + // 修改排单加工方案的优化状态 + updateProcessSchemeStatus(insertPlanIds); + + planItemMapper.insertBatch(planItemDOS); + + } + + + + + + + + + + public static Map> groupByMaterialAndThickness(List items) { + Map> groupedItems = new HashMap<>(); + + for (SavePlanPlateList.GoodsItemList item : items) { + // 将 material 和 thickness 组合成键 + String key = item.getMaterial() + "|" + item.getThickness(); + + // 如果键不存在,初始化一个新的列表 + groupedItems.putIfAbsent(key, new ArrayList<>()); + + // 添加当前项的 id 到对应的分组 + groupedItems.get(key).add(item.getId()); + } + + // 过滤掉只包含一个 id 的分组(可选,视需求) +// groupedItems.entrySet().removeIf(entry -> entry.getValue().size() < 2); + + return groupedItems; + } + + + + public static Map> groupByMaterialAndThicknessAndColor(List items) { + Map> groupedItems = new HashMap<>(); + + for (SavePlanPlateList.GoodsItemList item : items) { + // 将 material 和 thickness 组合成键 + String key = item.getMaterial() + "|" + item.getThickness() + "|" + item.getColor(); + + // 如果键不存在,初始化一个新的列表 + groupedItems.putIfAbsent(key, new ArrayList<>()); + + // 添加当前项的 id 到对应的分组 + groupedItems.get(key).add(item.getId()); + } + + + return groupedItems; + } + + + + + + private void updateProcessSchemeStatus(List planIds) { + + + try { + + + UpdateByQueryRequest.Builder builder = new UpdateByQueryRequest.Builder(); + + List fieldValues = planIds.stream().map(FieldValue::of).toList(); + + builder.index(PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL) + .query(qb -> qb.bool(bq -> bq + .must(mq -> mq.terms(tq -> tq.field(FIELD_PLANID).terms(t->t.value(fieldValues)))) + .must(mq -> mq.match(mtq -> mtq.field("machineType").query(MachineTypeEnum.CUTTING.getType()))) + )) + .script(s -> s.inline(i -> i + .source("ctx._source.isOptimized = params.new_value") + .params("new_value", JsonData.of(false)) + )); + + UpdateByQueryRequest request = builder.build(); + + // 执行更新操作 + elasticsearchClient.updateByQuery(request); + + }catch (Exception e){ + log.error("排单加工方案状态更新异常:"+e.getMessage()); + throw new ServiceException(DATA_DATA_ERROR); + + } + + + } + + + + + // // 构建查询和脚本 +// builder.index(PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL) +// .query(qb -> qb.bool(bq -> bq +// .must(mq -> mq.terms(tq -> tq.field("FIELD_PLANID").terms(t -> t.value(fieldValues)))) +// .must(mq -> mq.match(mtq -> mtq.field("machineType").query(MachineTypeEnum.CUTTING.getType()))) +// )) +// .script(s -> s.inline(i -> i +// .source(""" +// ctx._source.isOptimized = params.isOptimized; +// ctx._source.lastUpdated = params.lastUpdated; +// ctx._source.updatedBy = params.updatedBy; +// """) +// .params("isOptimized", JsonData.of(false)) +// .params("lastUpdated", JsonData.of("2025-01-02T12:00:00Z")) +// .params("updatedBy", JsonData.of("AutomatedSystem")) +// )); + + + + + public static void mergeOrderGoodsLists(List list1, List list2) { + // Build a map for quick lookup of items in list1 by their unique properties + Map list1Map = new HashMap<>(); + for (OrderGoodsResp item1 : list1) { + String key = generateKey(item1); + list1Map.put(key, item1); + } + + AtomicLong sort = new AtomicLong(System.currentTimeMillis()); + + for (OrderGoodsResp item2 : list2) { + String key = generateKey(item2); + OrderGoodsResp matchedItem = list1Map.get(key); + if (matchedItem != null) { + if (matchedItem.getOrderIds() == null) { + matchedItem.setOrderIds(new ArrayList<>()); + matchedItem.setSort(String.valueOf(sort.get())); + } + if (item2.getOrderIds() != null) { + matchedItem.getOrderIds().addAll(item2.getOrderIds()); + matchedItem.setSort(String.valueOf(sort.get())); + } + } + sort.addAndGet(1); + + } + } + + private static String generateKey(OrderGoodsResp item) { + return String.join("|", + Objects.toString(item.getGoodsName(), ""), + Objects.toString(item.getMaterial(), ""), + Objects.toString(item.getColor(), ""), + Objects.toString(item.getThickness(), ""), + Objects.toString(item.getTexture(), ""), + Objects.toString(item.getBrand(), "") + ); + } + + + + + } \ 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/plate/PlateService.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plate/PlateService.java index c8ceaf5b7..740ccb573 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plate/PlateService.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plate/PlateService.java @@ -2,8 +2,10 @@ package com.cf.imes.module.executor.service.plate; import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.module.executor.controller.admin.goods.vo.GoodsSaveReqVO; +import com.cf.imes.module.executor.controller.admin.plan.vo.PlateResList; import com.cf.imes.module.executor.controller.admin.plate.vo.*; import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO; +import com.cf.imes.module.executor.dal.dataobject.plate.PlateGoodDO; import javax.validation.Valid; import java.util.List; @@ -54,6 +56,11 @@ public interface PlateService { */ PageResult getPlatePage(PlatePageReqVO pageReqVO); + PageResult getGoodsPlate(GoodsPlateFilterPageReqVO pageReqVO); + + PageResult getOrderPlatePage(NoPlanPlatePageReqVO reqVO); + + /** * 批量导入小板 * diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plate/PlateServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plate/PlateServiceImpl.java index 92835e258..c61a92b8d 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plate/PlateServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plate/PlateServiceImpl.java @@ -9,7 +9,10 @@ import co.elastic.clients.elasticsearch.core.search.Hit; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; +import com.cf.imes.framework.common.enums.GoodsFilterConditionsEnum; import com.cf.imes.framework.common.enums.OrderPlateTypeEnum; +import com.cf.imes.framework.common.enums.PlanStatusEnum; +import com.cf.imes.framework.common.enums.PlanTypeEnum; import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; import com.cf.imes.framework.common.pojo.PageResult; @@ -17,25 +20,33 @@ import com.cf.imes.framework.common.util.Assert.AssertUtils; 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.MPJLambdaWrapperX; +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.goods.vo.GoodsSaveReqVO; import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.PlatePlaceInfo; +import com.cf.imes.module.executor.controller.admin.plan.vo.PlateResList; import com.cf.imes.module.executor.controller.admin.plate.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.order.OrderDO; import com.cf.imes.module.executor.dal.dataobject.orderBody.OrderBodyDO; import com.cf.imes.module.executor.dal.dataobject.orderItem.OrderItemDO; import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderModelDO; import com.cf.imes.module.executor.dal.dataobject.plan.PlanDO; import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO; +import com.cf.imes.module.executor.dal.dataobject.plate.PlateGoodDO; import com.cf.imes.module.executor.dal.mysql.goods.GoodsMapper; +import com.cf.imes.module.executor.dal.mysql.order.OrderMapper; import com.cf.imes.module.executor.dal.mysql.orderBody.OrderBodyMapper; import com.cf.imes.module.executor.dal.mysql.orderItem.OrderItemMapper; import com.cf.imes.module.executor.dal.mysql.plan.PlanMapper; +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.enums.OrderItemType; +import com.cf.imes.module.executor.enums.OrderStatusEnum; import com.cf.imes.module.executor.service.plan.PlanService; +import com.cf.imes.module.executor.util.elasticsearch.EsUtils; import com.cf.imes.module.executor.util.fileConversion.admin.SnowflakeIdWorker3rd; import com.cf.imes.module.system.enums.ErrorCodeConstants; import com.fasterxml.jackson.core.type.TypeReference; @@ -47,15 +58,20 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.io.IOException; +import java.math.BigDecimal; import java.util.*; +import java.util.function.Consumer; +import java.util.function.Function; import java.util.stream.Collectors; -import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.*; +import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.ES_DATA_ERROR; +import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.cf.imes.framework.common.util.json.JsonUtils.parseObject; import static com.cf.imes.framework.common.util.json.JsonUtils.toJsonString; import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; -import static com.cf.imes.module.executor.service.optimizeplan.OptimizePlanService.ORDER_PLATE_MODEL; +import static com.cf.imes.module.executor.enums.ErrorCodeConstants.LIST_CHANGES_ARE_PROHIBITED; +import static com.cf.imes.module.executor.enums.ErrorCodeConstants.PLAN_NOT_EXISTS; import static com.cf.imes.module.system.enums.ErrorCodeConstants.*; /** * 生产单板件 Service 实现类 @@ -82,6 +98,11 @@ public class PlateServiceImpl implements PlateService { @Resource private OrderBodyMapper orderBodyMapper; + @Resource + private PlateGoodMapper plateGoodMapper; + + @Resource + private OrderMapper orderMapper; @Resource private SnowflakeIdWorker3rd idWorker; @@ -95,7 +116,14 @@ public class PlateServiceImpl implements PlateService { @Resource private ESDocumentService esDocumentService; - String ORDER_REMAIN_PLATE_MODEL = "imes_order_optimize_plate_model"; + @Resource + private EsUtils esUtils; + + private static final String ORDER_REMAIN_PLATE_MODEL = "imes_order_optimize_plate_model"; + + private static final String ORDER_PLATE_MODEL = "imes_order_plate_model"; + + private static final String FIELD_PLATE_ID = "plateId"; @Override public Long createPlate(PlateSaveReqVO createReqVO) { @@ -133,25 +161,17 @@ public class PlateServiceImpl implements PlateService { } - if(plateDO.getIsOptimized()) { + if(Boolean.TRUE.equals(plateDO.getIsOptimized())) { - List optimizeBoardModelDOS = buildBoardByPlanId(planId, ORDER_REMAIN_PLATE_MODEL, 11); + List optimizeBoardModelDOS = buildBoardByPlanId(planId, ORDER_REMAIN_PLATE_MODEL); if (!optimizeBoardModelDOS.isEmpty()) { - // todo 目前只解决了非混单的情况 + // todo 目前只解决了非混单的情况(目前混单的问题应该已经解决,数据正确性问题待验证) OptimizeBoardModelDO optimizeBoardModelDO = optimizeBoardModelDOS.get(0); try { -// ObjectMapper mapper = new ObjectMapper(); -// -// // 解析 JSON 字符串 -// JsonNode jsonNode = mapper.readTree(optimizeBoardModelDO.getBlockPlaceInfo()); - -// List asJsonObject = mapper.convertValue(jsonNode, new TypeReference<>() {}); - - Long placeBlockNumber = optimizeBoardModelDO.getPlaceBlockNumber() - 1; List asJsonObject = parseObject(optimizeBoardModelDO.getBlockPlaceInfo(), new TypeReference<>() {}); @@ -188,14 +208,8 @@ public class PlateServiceImpl implements PlateService { orderBodyDO.setPlateNum(orderBodyDO.getPlateNum() - 1); orderBodyMapper.updateById(orderBodyDO); - orderItemMapper.deleteByPlateId(id, plateDO.getOrderId(), plateDO.getOrganId()); - - // todo 还需考虑下是否需要和包裹关联,预打包优化数据是否需要关联 - - - // 删除 plateMapper.deleteById(id); } @@ -245,6 +259,88 @@ public class PlateServiceImpl implements PlateService { return plateMapper.selectPage(pageReqVO); } + + @Override + public PageResult getGoodsPlate(GoodsPlateFilterPageReqVO pageReqVO) { + + PlanDO planDO = validatePlanExists(pageReqVO.getPlanId()); + + if (planDO.getType().equals(PlanTypeEnum.MIXEDORDERPLAN.getType())) { + + pageReqVO.setColor(null); + + } + + + if(planDO.getType().equals(PlanTypeEnum.ORDERPLAN.getType()) && pageReqVO.getFilterColor() != null){ + throw exception(PLAN_GOODS_IS_FILTER_DATA_ERROR); + + } + + return plateGoodMapper.selectGoodsPage(pageReqVO, getUserOrganId()); + + } + + + + + @Override + public PageResult getOrderPlatePage(NoPlanPlatePageReqVO pageReqVO) { + + // 使用这种方法分页查询速度太慢,所以要自己实现分页 +// PageDTO page = new PageDTO<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()); + + List statusList = new ArrayList<>(); + statusList.add(OrderStatusEnum.NEW_ORDER.getStatus()); + statusList.add(OrderStatusEnum.IN_PRODUCTION.getStatus()); + statusList.add(OrderStatusEnum.SORTED.getStatus()); + + Integer pageNo = (pageReqVO.getPageNo() - 1) * pageReqVO.getPageSize(); + + QueryWrapperX queryWrapperX = new QueryWrapperX<>(); + queryWrapperX + .eq("o.organ_id",getUserOrganId()) + .eq("o.deleted",false) + .in("o.status",statusList) + .isNull("opi.plan_id") + + .inIfPresent("op.goods_id",pageReqVO.getGoodsIdList()) + .likeIfPresent("o.id", pageReqVO.getOrderId() != null ? pageReqVO.getOrderId() : null) + .likeIfPresent("op.id",pageReqVO.getPlateId()) + .likeIfPresent("op.name",pageReqVO.getName()) + .likeIfPresent("op.plate_no",pageReqVO.getPlateNo()) + .likeIfPresent("op.custom_plate_no",pageReqVO.getCustomPlateNo()) + .likeIfPresent("og.material",pageReqVO.getMaterial()) + .likeIfPresent("og.color",pageReqVO.getColor()) + .eqIfPresent("op.thickness",pageReqVO.getThickness()) + .betweenIfPresent("op.height", new BigDecimal[]{pageReqVO.getLongMinRang(), pageReqVO.getLongMaxRang()}) + .betweenIfPresent("op.width", new BigDecimal[]{pageReqVO.getWidthMinRang(), pageReqVO.getWidthMaxRang()}) + .betweenIfPresent("op.thickness", new BigDecimal[]{pageReqVO.getThicknessMinRang(), pageReqVO.getThicknessMaxRang()}) + .eqIfPresent("op.texture",pageReqVO.getTexture()) + .eqIfPresent("op.is_special_shaped",pageReqVO.getIsSpecialShaped()) + .eqIfPresent("op.is_sculpt",pageReqVO.getIsSculpt()) + .eqIfPresent("op.is_row_hole",pageReqVO.getIsRowHole()) + .orderByDesc("o.id"); + + Long plateCount = orderMapper.selectNoPlanOrderPlateCount(queryWrapperX); + + List plateResLists = orderMapper.selectNoPlanOrderPlateList(queryWrapperX,pageNo,pageReqVO.getPageSize()); + + List plateIds = plateResLists.stream().map(PlateResList::getPlateId).toList(); + + List orderModelDOS = esUtils.getEsDocument(FIELD_PLATE_ID, plateIds, plateIds.size(), ORDER_PLATE_MODEL, OrderModelDO.class); + + + PlateModelDetailRespVO.builder() + .plateResLists(new PageResult<>(plateResLists,plateCount)) + .plateModels(orderModelDOS) + .build(); + + return new PageResult<>(plateResLists,plateCount); + + } + + @Override @Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入 public PlateImportRespVO importPlatesList(List importPlates, Long orderId) { @@ -305,7 +401,7 @@ public class PlateServiceImpl implements PlateService { @Override public List getPlateModelByPlateId(List bodyIds) { List list = plateMapper.selectJoinList(BodyPlateIdDTO.class, new MPJLambdaWrapperX() - .selectAs(PlateDO::getId, "plateId") + .selectAs(PlateDO::getId, FIELD_PLATE_ID) .leftJoin(OrderItemDO.class, OrderItemDO::getPlateId, PlateDO::getId) .eq(OrderItemDO::getOrganId,getUserOrganId()) .in(OrderItemDO::getBodyId, bodyIds) @@ -407,7 +503,7 @@ public class PlateServiceImpl implements PlateService { List fieldValues = plateIds.stream().map(FieldValue::of).toList(); SearchRequest.Builder builder = new SearchRequest.Builder(); builder.index(index); - builder.query(q -> q.terms(b -> b.field("plateId").terms(e->e.value(fieldValues)))); + builder.query(q -> q.terms(b -> b.field(FIELD_PLATE_ID).terms(e->e.value(fieldValues)))); builder.size(plateIds.size()); try { SearchResponse search = elasticsearchClient.search(builder.build(), OrderModelDO.class); @@ -424,16 +520,15 @@ public class PlateServiceImpl implements PlateService { - private List buildBoardByPlanId(Long planId, String index, Integer size) { + private List buildBoardByPlanId(Long planId, String index) { SearchRequest.Builder builder = new SearchRequest.Builder(); builder.index(index); - builder.size(size); builder.query(q -> q.term(b -> b.field("planId").value(planId))); try { SearchResponse search = elasticsearchClient.search(builder.build(), OptimizeBoardModelDO.class); List> hits = search.hits().hits(); if (CollUtil.isNotEmpty(hits)) { - return hits.stream().map(Hit::source).collect(Collectors.toList()); + return hits.stream().map(Hit::source).toList(); } return new ArrayList<>(); } catch (IOException e) { @@ -442,5 +537,76 @@ public class PlateServiceImpl implements PlateService { } } + private PlanDO validatePlanExists(Long id) { + PlanDO planDO = planMapper.selectById(id); + + AssertUtils.notEmpty(planDO,PLAN_NOT_EXISTS); + + if(planDO.getStatus().equals(PlanStatusEnum.OPENING.getStatus()) || planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus())){ + throw exception(LIST_CHANGES_ARE_PROHIBITED); + } + + return planDO; + + } + + + + private static void goodsFilter(List filters, List goodsDOS,GoodsPlateFilterPageReqVO pageReqVO) { + + int goodsNum = goodsDOS.size(); + + + // 查询条件 + Map> attributeGetters = new HashMap<>(); + attributeGetters.put(GoodsFilterConditionsEnum.THICKNESS.getFilterField(), GoodsDO::getThickness); + attributeGetters.put(GoodsFilterConditionsEnum.MATERIAL.getFilterField(), GoodsDO::getMaterial); + attributeGetters.put(GoodsFilterConditionsEnum.COLOR.getFilterField(), GoodsDO::getColor); + attributeGetters.put(GoodsFilterConditionsEnum.TEXTURE.getFilterField(), GoodsDO::getTexture); + attributeGetters.put(GoodsFilterConditionsEnum.BRAND.getFilterField(), GoodsDO::getBrand); + attributeGetters.put(GoodsFilterConditionsEnum.WIDTH.getFilterField(), GoodsDO::getWidth); + attributeGetters.put(GoodsFilterConditionsEnum.HEIGHT.getFilterField(), GoodsDO::getHeight); + + // 赋值 + Map> attributeSetters = new HashMap<>(); + attributeSetters.put(GoodsFilterConditionsEnum.THICKNESS.getFilterField(), value -> pageReqVO.setThickness((BigDecimal) value)); + attributeSetters.put(GoodsFilterConditionsEnum.MATERIAL.getFilterField(), value -> pageReqVO.setMaterial((String) value)); + attributeSetters.put(GoodsFilterConditionsEnum.COLOR.getFilterField(), value -> pageReqVO.setColor((String) value)); +// attributeSetters.put(GoodsFilterConditionsEnum.TEXTURE.getFilterField(), value -> pageReqVO.setTexture((Boolean) value)); +// attributeSetters.put(GoodsFilterConditionsEnum.BRAND.getFilterField(), value -> pageReqVO.setBrand((String) value)); +// attributeSetters.put(GoodsFilterConditionsEnum.WIDTH.getFilterField(), value -> pageReqVO.setWidth((BigDecimal) value)); +// attributeSetters.put(GoodsFilterConditionsEnum.HEIGHT.getFilterField(), value -> pageReqVO.setHeight((BigDecimal) value)); + + for (String filter : filters) { + Function getter = attributeGetters.get(filter); + + Consumer setter = attributeSetters.get(filter); + + if (getter == null || setter == null) { + throw exception(PLAN_MIXED_DATA_ERROR); + } + + // 获取当前属性的第一个值 + Object attributeValue = goodsDOS.stream() + .map(getter) + .findFirst() + .orElse(null); + + // 根据属性值过滤列表 + long count = goodsDOS.stream() + .filter(good -> attributeValue.equals(getter.apply(good))) + .count(); + + if (goodsNum != count) { + throw exception(PLAN_MIXED_ORDER_ERROR,GoodsFilterConditionsEnum.getValueByKey(filter)); + } + + // 设置属性值 + setter.accept(attributeValue); + } + + } + + } \ 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/util/OrganIdUtils.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/OrganIdUtils.java deleted file mode 100644 index c22ecac12..000000000 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/OrganIdUtils.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.cf.imes.module.executor.util; - -import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; - - -/** - * 获取当前用户的组织ID - * - * @author 晨丰科技 - */ -public class OrganIdUtils { - -// public static Long getUserOrganId(){ -// -// return SecurityFrameworkUtils.getLoginUser().getOrganId(); -// -// } -} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/elasticsearch/EsUtils.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/elasticsearch/EsUtils.java new file mode 100644 index 000000000..85a7d0042 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/elasticsearch/EsUtils.java @@ -0,0 +1,297 @@ +package com.cf.imes.module.executor.util.elasticsearch; + + +import cn.hutool.core.collection.CollUtil; +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import co.elastic.clients.elasticsearch._types.FieldValue; +import co.elastic.clients.elasticsearch.core.DeleteByQueryRequest; +import co.elastic.clients.elasticsearch.core.DeleteByQueryResponse; +import co.elastic.clients.elasticsearch.core.SearchRequest; +import co.elastic.clients.elasticsearch.core.SearchResponse; +import co.elastic.clients.elasticsearch.core.search.Hit; +import co.elastic.clients.elasticsearch.indices.RefreshRequest; +import com.cf.imes.framework.common.exception.ServiceException; +import com.cf.imes.framework.es.core.dal.ESDocument; +import com.cf.imes.framework.es.core.service.ESDocumentService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +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; + +/** + * @author ES 工具类 + */ +@Component +@Slf4j +public class EsUtils { + + private final ElasticsearchClient elasticsearchClient; + + + @Resource + private ESDocumentService esDocumentService; + + + public EsUtils(ElasticsearchClient elasticsearchClient) { + this.elasticsearchClient = elasticsearchClient; + + } + + + /** + * ES 文档查询 + * @param filedName 需要查询的文档字段 + * @param value 需要查询的值 + * @param index 索引 + * @param targetClass 索引文档的实体类 + */ + public List getEsDocument(String filedName, Long value, String index, Class targetClass) { + + SearchRequest.Builder builder = new SearchRequest.Builder(); + builder.index(index); + + builder.query(q->q.bool(b->b.filter(f->f.term(t->t.field(filedName).value(value))))); + + try { + SearchResponse search = elasticsearchClient.search(builder.build(), targetClass); + List> hits = search.hits().hits(); + if (CollUtil.isNotEmpty(hits)) { + return hits.stream().map(Hit::source).toList(); + } + return new ArrayList<>(); + } catch (Exception e) { + log.error(e.getMessage()); + throw new ServiceException(DATA_DATA_ERROR); + } + } + + + public List getEsDocument(String filedName, Long value,Integer size, String index, Class targetClass) { + + SearchRequest.Builder builder = new SearchRequest.Builder(); + builder.index(index); + builder.size(size); + + builder.query(q->q.bool(b->b.filter(f->f.term(t->t.field(filedName).value(value))))); + + try { + SearchResponse search = elasticsearchClient.search(builder.build(), targetClass); + List> hits = search.hits().hits(); + if (CollUtil.isNotEmpty(hits)) { + return hits.stream().map(Hit::source).toList(); + } + return new ArrayList<>(); + } catch (Exception e) { + log.error(e.getMessage()); + throw new ServiceException(DATA_DATA_ERROR); + } + } + + + /** + * ES 文档查询 + * @param filedName 需要查询的文档字段 + * @param values 需要查询的值(集合类型) + * @param index 索引对象 + */ + public List getEsDocument(String filedName, List values, String index, Class targetClass) { + + List fieldValues = values.stream().map(FieldValue::of).toList(); + SearchRequest.Builder builder = new SearchRequest.Builder(); + builder.index(index); + + builder.query(q -> q.terms(b -> b.field(filedName).terms(t->t.value(fieldValues)))); + try { + SearchResponse search = elasticsearchClient.search(builder.build(), targetClass); + List> hits = search.hits().hits(); + if (CollUtil.isNotEmpty(hits)) { + return hits.stream().map(Hit::source).toList(); + } + return new ArrayList<>(); + } catch (Exception e) { + log.error(e.getMessage()); + throw new ServiceException(DATA_DATA_ERROR); + } + } + + + public List getEsDocument(String filedName, List values,Integer size, String index, Class targetClass) { + + List fieldValues = values.stream().map(FieldValue::of).toList(); + SearchRequest.Builder builder = new SearchRequest.Builder(); + builder.index(index); + builder.size(size); + + builder.query(q -> q.terms(b -> b.field(filedName).terms(t->t.value(fieldValues)))); + try { + SearchResponse search = elasticsearchClient.search(builder.build(), targetClass); + List> hits = search.hits().hits(); + if (CollUtil.isNotEmpty(hits)) { + return hits.stream().map(Hit::source).toList(); + } + return new ArrayList<>(); + } catch (Exception e) { + log.error(e.getMessage()); + throw new ServiceException(DATA_DATA_ERROR); + } + } + + + + public List getEsDocument(String filedName1,String filedName2, Long value1,Long value2, String index, Class targetClass) { + + SearchRequest.Builder builder = new SearchRequest.Builder(); + builder.index(index); + + + builder.query(q->q.bool(b->b.filter(f->{ + f.term(t->t.field(filedName1).value(value1)); + f.term(t->t.field(filedName2).value(value2)); + return f; + }))); + + try { + SearchResponse search = elasticsearchClient.search(builder.build(), targetClass); + List> hits = search.hits().hits(); + if (CollUtil.isNotEmpty(hits)) { + return hits.stream().map(Hit::source).toList(); + } + return new ArrayList<>(); + } catch (Exception e) { + log.error(e.getMessage()); + throw new ServiceException(DATA_DATA_ERROR); + } + } + + + + public List getEsDocument(String filedName1,String filedName2, Long value1,Long value2,Integer size, String index, Class targetClass) { + + SearchRequest.Builder builder = new SearchRequest.Builder(); + builder.index(index); + builder.size(size); + + builder.query(q->q.bool(b->b.filter(f->{ + f.term(t->t.field(filedName1).value(value1)); + f.term(t->t.field(filedName2).value(value2)); + return f; + }))); + + try { + SearchResponse search = elasticsearchClient.search(builder.build(), targetClass); + List> hits = search.hits().hits(); + if (CollUtil.isNotEmpty(hits)) { + return hits.stream().map(Hit::source).toList(); + } + return new ArrayList<>(); + } catch (Exception e) { + log.error(e.getMessage()); + throw new ServiceException(DATA_DATA_ERROR); + } + } + + + + // ES 文档删除 + public void deleteEsDocument(String filedName,Long value, String index) { + + DeleteByQueryRequest.Builder builder = new DeleteByQueryRequest.Builder(); + builder.index(index); + + builder.query(q -> q.term(b -> b.field(filedName).value(value))); + + try { + DeleteByQueryResponse response = elasticsearchClient.deleteByQuery(builder.build()); + log.info("Deleted {} documents with value {}", response.deleted(), value); + } catch (Exception e) { + log.error("Error deleting documents with value {}: {}", value, e.getMessage()); + throw new ServiceException(ES_DATA_ERROR); + } + } + + public void deleteEsDocument(String filedName1,String filedName2, Long value1,Long value2, String index) { + + DeleteByQueryRequest.Builder builder = new DeleteByQueryRequest.Builder(); + builder.index(index); + + builder.query(q->q.bool(b->b.filter(f->{ + f.term(t->t.field(filedName1).value(value1)); + f.term(t->t.field(filedName2).value(value2)); + return f; + }))); + + try { + elasticsearchClient.deleteByQuery(builder.build()); + } catch (Exception e) { + log.error("ES文档删除失败:", e.getMessage()); + throw new ServiceException(ES_DATA_ERROR); + } + } + + + public void deleteEsDocument(String filedName,List values, String index) { + + List fieldValues = values.stream().map(FieldValue::of).toList(); + DeleteByQueryRequest.Builder builder = new DeleteByQueryRequest.Builder(); + builder.index(index); + + + builder.query(q -> q.terms(b -> b.field(filedName).terms(e -> e.value(fieldValues)))); + + try { + DeleteByQueryResponse response = elasticsearchClient.deleteByQuery(builder.build()); + log.info("Deleted {} documents with values {}", response.deleted(), values); + } catch (Exception e) { + log.error("Error deleting documents with values {}: {}", values, e.getMessage()); + throw new ServiceException(ES_DATA_ERROR); + } + } + + + + /** + * ES 文档保存 + * + * @param targetClass + */ + public void saveEsDocument(String index,List targetClass) { + try { + + esDocumentService.bulkCreate(index, targetClass); + + } catch (Exception e) { + e.printStackTrace(); + log.error(e.getMessage()); + throw new ServiceException(DATA_DATA_ERROR); + } + + } + + + + + + + // ES 文档数据刷新 + public void refresh( String index) { + + try { + // 创建刷新请求 + RefreshRequest refreshRequest = new RefreshRequest.Builder().index(index).build(); + + elasticsearchClient.indices().refresh(refreshRequest); + + } catch (Exception e) { + log.error("ES文档数据刷新失败:"+e.getMessage()); + throw new ServiceException(ES_DATA_ERROR); + } + } + + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/goods/GoodsMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/goods/GoodsMapper.xml index 602690a6f..170075729 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/goods/GoodsMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/goods/GoodsMapper.xml @@ -27,12 +27,15 @@ @@ -289,25 +292,27 @@ parameterType="java.lang.Long"> - select distinct - og.order_id as orderId, - ob.id as bodyId, - ob.name as bodyName, - ob.room_id as roomId, - ob.room_name as roomName - from order_goods og - left join order_plate op on og.organ_id = op.organ_id and og.order_id = op.order_id and og.id = op.goods_id - left join order_item oi on op.organ_id = oi.organ_id and op.order_id = oi.order_id and op.id = oi.plate_id - left join order_body ob on oi.organ_id = ob.organ_id and oi.order_id = ob.order_id and oi.body_id = ob.id + select distinct ob.order_id as orderId, + ob.id as bodyId, + ob.name as bodyName, + ob.room_id as roomId, + ob.room_name as roomName - where og.organ_id = #{organId} - and og.deleted = false - and og.plan_id = 0 - and og.order_id in + from order_body ob + + left join order_item oi on ob.organ_id = oi.organ_id and ob.order_id = oi.order_id and ob.id = oi.body_id + left join order_plate op on oi.organ_id = op.organ_id and oi.order_id = op.order_id and oi.plate_id = op.id + left join order_plan_item opi on op.organ_id = opi.organ_id and op.order_id = opi.order_id and op.id = opi.plate_id + + where ob.organ_id = #{organId} + and ob.order_id in #{orderIds} + and ob.deleted = false + and op.is_optimized = false + and opi.plan_id is null; @@ -420,7 +425,7 @@ and deleted = false and order_id = #{orderId} and goods_id = #{goodsId} - and plan_id !=0 +-- and plan_id !=0 limit 1; @@ -491,4 +496,50 @@ + + + + + \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderMapper.xml index d0ba8c86d..2f873d651 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderMapper.xml @@ -76,45 +76,30 @@ @@ -292,23 +277,24 @@ select distinct o.id, - og.plan_id, + opi.plan_id, o.order_date, o.delivery_date, o.custom_order_no, o.customer, o.address, o.phone_number, + o.dealer, + o.dealer_phone_number, o.salesman, o.splitter, o.remark from orders o - left join order_goods og on o.organ_id = og.organ_id and o.id = og.order_id + left join order_plan_item opi on o.organ_id = opi.organ_id and o.id = opi.order_id - where og.organ_id = #{organId} - and og.deleted = false - and og.plan_id in + where opi.organ_id = #{organId} + and opi.plan_id in #{ids} @@ -317,4 +303,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderGroup/OrderGroupMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderGroup/OrderGroupMapper.xml index 115b9c448..d6267a6a1 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderGroup/OrderGroupMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderGroup/OrderGroupMapper.xml @@ -27,4 +27,78 @@ ${field2} + + + + + + + + + + + + \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderParts/OrderPartsMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderParts/OrderPartsMapper.xml index e4b3e7fc4..6dcf74b58 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderParts/OrderPartsMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderParts/OrderPartsMapper.xml @@ -134,6 +134,12 @@ + + + + + + @@ -159,7 +165,13 @@ op.model as model , op.name as name, op.order_id as orderId, - op.type as type + op.type as type, + op.color as partsColor, + op.width as partsWidth, + op.length as partsLength, + op.thickness as partsThickness, + op.category as category, + op.subparts as subparts from order_parts op left join order_item oi on op.organ_id = oi.organ_id and op.order_id = oi.order_id and op.id = oi.parts_id left join order_body ob on oi.organ_id = ob.organ_id and oi.order_id = ob.order_id and oi.body_id = ob.id diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plan/PlanMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plan/PlanMapper.xml index 15ef5b98a..e1ff9737f 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plan/PlanMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plan/PlanMapper.xml @@ -143,7 +143,8 @@ UPDATE order_plan - SET status = #{status}, produce_time = null + SET status = #{status}, + produce_time = null WHERE organ_id = #{organId} and deleted = false diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/planitem/PlanItemMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/planitem/PlanItemMapper.xml index a8c987180..d7d2b3caf 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/planitem/PlanItemMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/planitem/PlanItemMapper.xml @@ -1,8 +1,384 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 a00a998c2..faa9a760e 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 @@ -18,65 +18,16 @@ GROUP BY a.id, c.material, c.color; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -126,69 +77,6 @@ - - - - @@ -535,6 +390,7 @@ op.order_id as orderId, op.name as name, op.plate_no as plateNo, + op.custom_plate_no as customPlateNo, op.type as type, op.goods_id as goodsId, op.width as width, @@ -577,13 +433,18 @@ left join order_group og on oi.organ_id = og.organ_id and oi.order_id = og.order_id and oi.group_id = og.id left join order_body ob on oi.organ_id = ob.organ_id and oi.order_id = ob.order_id and oi.body_id = ob.id - where op.organ_id = #{organId} and op.deleted = false and op.goods_id in + where op.organ_id = #{organId} + and op.deleted = false + and op.order_id in + + #{orderIds} + + + and op.goods_id in #{goodsIdList} --- and op.is_optimized = true - @@ -601,11 +462,12 @@