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 87527c033..ab852cb5c 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 @@ -13,8 +13,6 @@ public class ErrorCodeConstants { public static final ErrorCode PLAN_NOT_ALLOW_DELETE = new ErrorCode(1_001_107_001, "排单号:{},已开料不予许删除"); - 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/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 0bcfe25a7..f9c9e4e42 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 @@ -141,7 +141,7 @@ public class OptimizePlanController { @Parameter(name = "planId", description = "排单ID", required = true) @PreAuthorize("@ss.hasPermission('placeorder:optimize')") public CommonResult getProcessSchemeConfig(@Schema(description = "方案组ID") @NotNull(message = "方案组的ID不能为空") Long processId, - @Schema(description = "排单id") @RequestParam(required = false) Long planId) { + @Schema(description = "排单id") @RequestParam Long planId) { return success(optimizePlanService.getProcessSchemeConfig(processId,planId)); 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 b79119faf..07be0cc95 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 @@ -22,5 +22,8 @@ public class SavePlanPlateResultReqVO { @NotNull(message = "方案组的配置项ID不能为空") private Long planConfigId; + @Schema(description = "方案组的ID", requiredMode = Schema.RequiredMode.REQUIRED) +// @NotNull(message = "方案组的ID不能为空") + private Long processId; } 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 09639de0c..a89c49760 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 @@ -58,12 +58,13 @@ public class PlateController { @DeleteMapping("/delete") @Operation(summary = "删除生产单板件") @Parameters({ - @Parameter(name = "id", description = "板材ID", required = true), + @Parameter(name = "plateIds", description = "板材ID", required = true), @Parameter(name = "planId", description = "排单ID", required = true) }) @PreAuthorize("@ss.hasAnyPermissions('executor:plate:delete','placeorder:optimize')") - public CommonResult deletePlate(@RequestParam("id") @NotNull Long id, @RequestParam("planId") @NotNull Long planId) { - plateService.deletePlate(id,planId); + public CommonResult deletePlate(@RequestParam("plateIds") @NotNull List plateIds, + @RequestParam("planId") @NotNull Long planId) { + plateService.deletePlate(plateIds,planId); return success(true); } @@ -142,7 +143,7 @@ public class PlateController { @PostMapping("/insertPlate") @Operation(summary = "优化生产创建板材") @PreAuthorize("@ss.hasAnyPermissions('executor:plate:create','placeorder:optimize')") - public CommonResult> createNewPlate(@Valid @RequestBody OptimizationSavePlateReqVO reqVO) { + public CommonResult> createNewPlate(@Valid @RequestBody List reqVO) { return success(plateService.createNewPlate(reqVO)); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/InsertPlateRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/InsertPlateRespVO.java new file mode 100644 index 000000000..65ce07c68 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/InsertPlateRespVO.java @@ -0,0 +1,27 @@ +package com.cf.imes.module.executor.controller.admin.plate.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class InsertPlateRespVO { + + + @Schema(description = "唯一标识") + private String blockKey; + + + @Schema(description = "新增的小板编号") + private List plateNo; + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/OptimizationSavePlateReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/OptimizationSavePlateReqVO.java index bbd0a9ce8..7290690fb 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/OptimizationSavePlateReqVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/OptimizationSavePlateReqVO.java @@ -36,6 +36,9 @@ public class OptimizationSavePlateReqVO { private String bodyName; + @Schema(description = "唯一标识") + private String blockKey; + @Schema(description = "房间号") @NotNull(message = "当前板材没有选择房间,请选择") @Max(value = 0x7fffffffffffffffL,message = "房间数据错误,请重新进行新增") diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/OrderBodyNumVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/OrderBodyNumVO.java new file mode 100644 index 000000000..f7aa2d6c0 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plate/vo/OrderBodyNumVO.java @@ -0,0 +1,22 @@ +package com.cf.imes.module.executor.controller.admin.plate.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class OrderBodyNumVO { + + @Schema(description = "柜体ID") + private Long bodyId; + + @Schema(description = "板材数量") + private Integer plateNum; + +} 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 0535b54f2..8d56d936f 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 @@ -150,19 +150,6 @@ public interface GoodsMapper extends BaseMapperX { List selectGoodsAndRemainPlate(@Param("orderIds") List orderIds,@Param("goodsIdList") List goodsIdList,@Param("organId") Long organId); - - - default List selectPlanGoodsListByPlanIdList(List orderIds,List planIds, Long organId) { - return selectList(new LambdaQueryWrapperX() - .eq(GoodsDO::getOrganId, organId) - .eq(GoodsDO::getDeleted, false) - .inIfPresent(GoodsDO::getOrderId,orderIds) - .in(GoodsDO::getPlanId,planIds) - .select(GoodsDO::getGoodsId,GoodsDO::getId,GoodsDO::getOrderId)); - - } - - List selectPlateListByPlanId(@Param("planIds") List planIds, @Param("organId") Long organId); @@ -202,4 +189,17 @@ public interface GoodsMapper extends BaseMapperX { 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) + .inIfPresent(GoodsDO::getOrderId,orderIds) + .inIfPresent(GoodsDO::getGoodsId,goodsIds)); + + } + + + List selectInsertGoodsIds(@Param("orderIds") List orderIds,@Param("goodsIds") List goodsIds,@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/orderItem/OrderItemMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java index dc7cfae0a..d0aded8f1 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java @@ -79,11 +79,11 @@ public interface OrderItemMapper extends BaseMapperX { } - default int deleteByPlateId(Long plateId,Long orderId, Long organId) { + default int deleteByPlateId(List plateId,List orderId, Long organId) { return delete(new LambdaQueryWrapperX() .eq(OrderItemDO::getOrganId, organId) - .eq(OrderItemDO::getOrderId, orderId) - .eq(OrderItemDO::getPlateId, plateId)); + .in(OrderItemDO::getOrderId, orderId) + .in(OrderItemDO::getPlateId, plateId)); } @@ -99,12 +99,12 @@ public interface OrderItemMapper extends BaseMapperX { } - default OrderItemDO selectPlateList(Long plateId,Long orderId, Long organId) { - return selectOne(new LambdaQueryWrapperX() + default List selectPlateList(List plateId,List orderId, Long organId) { + return selectList(new LambdaQueryWrapperX() .eq(OrderItemDO::getOrganId,organId) - .eqIfPresent(OrderItemDO::getOrderId,orderId) - .eqIfPresent(OrderItemDO::getPlateId, plateId) - .select(OrderItemDO::getBodyId)); + .inIfPresent(OrderItemDO::getOrderId,orderId) + .inIfPresent(OrderItemDO::getPlateId, plateId) + .select(OrderItemDO::getBodyId,OrderItemDO::getPlateId)); } 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 d22e2df7b..f89e315e0 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 @@ -74,11 +74,11 @@ public interface PlateGoodMapper extends BaseMapperX { - default PlateGoodDO selectGoodsByGoodsId(String goodsId, Long organId) { - return selectOne(new LambdaQueryWrapper() + default List selectGoodsByGoodsId(List goodsId, Long organId) { + return selectList(new LambdaQueryWrapper() .eq(PlateGoodDO::getOrganId,organId) .eq(PlateGoodDO::getDeleted,false) - .eq(PlateGoodDO::getGoodsId, goodsId)); + .in(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 05ab11e5f..845f86ed5 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 @@ -197,7 +197,7 @@ public interface PlateMapper extends BaseMapperX { .inIfPresent(PlateDO::getOrderId,orderIds) .inIfPresent(PlateDO::getGoodsId,goodsIdList) .eq(PlateDO::getType, OrderPlateTypeEnum.SELFINCREASINGBOARD.getType()) - .select(PlateDO::getId)); + .select(PlateDO::getId,PlateDO::getGoodsId)); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/framework/rpc/config/RpcConfiguration.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/framework/rpc/config/RpcConfiguration.java index f5118b830..b8da26103 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/framework/rpc/config/RpcConfiguration.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/framework/rpc/config/RpcConfiguration.java @@ -4,13 +4,14 @@ import com.cf.imes.module.infra.api.file.FileApi; import com.cf.imes.module.system.api.application.ApplicationApi; import com.cf.imes.module.system.api.customplateno.CustomPlateNoSeqApi; import com.cf.imes.module.system.api.dataSource.DataSourceApi; +import com.cf.imes.module.system.api.dict.DictDataApi; import com.cf.imes.module.system.api.machine.MachineApi; import com.cf.imes.module.system.api.organ.OrganApi; +import com.cf.imes.module.system.api.permission.PermissionApi; import com.cf.imes.module.system.api.process.ProcessApi; import com.cf.imes.module.system.api.process.ProcessGroupApi; import com.cf.imes.module.system.api.systemconfig.SystemConfigApi; import com.cf.imes.module.system.api.user.AdminUserApi; -import com.cf.imes.module.system.api.dict.DictDataApi; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Configuration; @@ -20,6 +21,6 @@ import org.springframework.context.annotation.Configuration; @Configuration(proxyBeanMethods = false) @EnableFeignClients(clients = {AdminUserApi.class, MachineApi.class, DictDataApi.class, AdminUserApi.class, FileApi.class, ProcessGroupApi.class, FileApi.class, DataSourceApi.class, ApplicationApi.class, - ProcessApi.class, OrganApi.class, SystemConfigApi.class, CustomPlateNoSeqApi.class}) + ProcessApi.class, OrganApi.class, SystemConfigApi.class, CustomPlateNoSeqApi.class, PermissionApi.class}) public class RpcConfiguration { } 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 0668ae413..cade3a28a 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 @@ -26,6 +26,8 @@ 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.framework.security.core.LoginUser; +import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; import com.cf.imes.module.executor.controller.admin.orderParts.vo.OrderPartsRemark; import com.cf.imes.module.executor.controller.admin.plan.bo.OrderIds; import com.cf.imes.module.executor.controller.admin.plan.bo.OrderSource; @@ -48,15 +50,13 @@ 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.cf.imes.module.system.api.permission.PermissionApi; 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; @@ -117,6 +117,9 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { @Resource private SystemConfigApi systemConfigApi; + @Resource + private PermissionApi permissionApi; + @Resource private EsUtils esUtils; @@ -127,15 +130,6 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { @Resource private OrderPartsMapper orderPartsMapper; - @Resource - private ProcessStepMapper processStepMapper; - - @Resource - private ProcessStepItemMapper processStepItemMapper; - - @Resource - private PlateGoodMapper plateGoodMapper; - @Resource private OrderGroupMapper orderGroupMapper; @@ -601,7 +595,7 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { List orderDOS = orderMapper.selectBatchIds(orderIds); AssertUtils.notEmpty(orderDOS,ORDER_PLAN_ERROR); - +// // 造型数据的尺寸长度 Integer orderModelSize = plateDetailRespVOS.size(); @@ -665,34 +659,43 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { OptimizeBoardModelDO boardModelDO = req.getOptimizeBoardModelDOS().get(0); + Long processId = req.getProcessId(); + List actualGoodsLists = Optional.ofNullable(boardModelDO.getActualGoodsList()).orElse(new ArrayList<>()); AssertUtils.notEmpty(actualGoodsLists,PLAN_NO_ACTUAL_PLATE); Long planId = boardModelDO.getPlanId(); + PlanDO planDO = planMapper.selectById(planId); + + AssertUtils.notEmpty(planDO,ORDER_PLAN_DATE_ERROR); + List optimizeBoardModelDOS = esUtils.getEsDocument(FIELD_PLAN_CONFIG_ID,FIELD_PLAN_ID,req.getPlanConfigId(), planId, ORDER_OPTIMIZE_PLATE_MODEL, OptimizeBoardModelDO.class); - // 删除原来的优化信息 + List isLocks = new ArrayList<>(); + + // 查询原优化信息然后进行判断 if(CollUtil.isNotEmpty(optimizeBoardModelDOS)){ - PlanDO planDO = planMapper.selectById(planId); - - AssertUtils.notEmpty(planDO,ORDER_PLAN_DATE_ERROR); - if(planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus())){ throw exception(THIS_PLAN_OPTIMIZE_DATA_ERROR); } + isLocks.addAll(optimizeBoardModelDOS.stream().map(OptimizeBoardModelDO::getIsLock).distinct().toList()); + OptimizeBoardModelDO optimizeBoardModelDO = optimizeBoardModelDOS.get(0); Boolean isLock = Optional.ofNullable(optimizeBoardModelDO.getIsLock()).orElse(false); - if(Boolean.TRUE.equals(isLock) && planDO.getIsScheduled().equals(true)){ - throw exception(THIS_PLAN_IS_LOCK); - } + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + assert loginUser != null; - esUtils.deleteEsDocument(FIELD_PLAN_CONFIG_ID,FIELD_PLAN_ID,req.getPlanConfigId(),planId,ORDER_OPTIMIZE_PLATE_MODEL); + Boolean data = permissionApi.hasAnyPermissions(loginUser.getId(), "placeorder:list").getCheckedData(); + + if(Boolean.TRUE.equals(isLock) && planDO.getIsScheduled().equals(true) && Boolean.FALSE.equals(data)){ + throw exception(THIS_PLAN_OPTIMIZE_IS_LOCK); + } } @@ -701,12 +704,23 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { AssertUtils.notEmpty(plateDOS,THIS_PLAN_PLATE_DATA_ERROR); + + if(processId != null && !planDO.getProcessId().equals(processId)) { + + validatePlanStatus(planDO,isLocks); + + planMapper.updateById(planDO.setProcessId(processId)); + + } + + plateDOS.forEach(f->{ f.setIsOptimized(true); }); plateMapper.updateBatch(plateDOS); + esUtils.deleteEsDocument(FIELD_PLAN_CONFIG_ID,FIELD_PLAN_ID,req.getPlanConfigId(),planId,ORDER_OPTIMIZE_PLATE_MODEL); // 保存优化后的大板数据 esUtils.saveEsDocument(ORDER_OPTIMIZE_PLATE_MODEL,req.getOptimizeBoardModelDOS()); @@ -733,13 +747,6 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { AssertUtils.notEmpty(planDO,PLAN_NOT_EXISTS); - // 如果方案组ID不相等,就删除旧的方案组信息,再保存新的加工方案组ID - if(!planDO.getProcessId().equals(processId)){ - planMapper.updateById(planDO.setProcessId(processId)); - } - - esUtils.deleteEsDocument(FIELD_PLAN_ID,planId,PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL); - List plateDOS = planItemMapper.selectOrderPlanPlateListByPlanId(planId,getUserOrganId()); @@ -755,11 +762,14 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { // 不能加非空判断,因为方案组里可能没有优化信息 List optimizeBoardModelDOS = esUtils.getEsDocument(FIELD_PLAN_ID, planId, ORDER_OPTIMIZE_PLATE_MODEL, OptimizeBoardModelDO.class); + List isLocks = new ArrayList<>(); if(CollUtil.isNotEmpty(optimizeBoardModelDOS)){ optimizeBoardModelDOS.forEach(f->{ + isLocks.add(Optional.ofNullable(f.getIsLock()).orElse(false)); + modelDOList.add(SaveProcessSchemeModelDO.builder() .planConfigId(f.getPlanConfigId()) .planName(f.getPlanConfigName()) @@ -772,6 +782,19 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { } + // 如果方案组ID不相等,就删除旧的方案组信息,再保存新的加工方案组ID + if(!planDO.getProcessId().equals(processId)){ + + validatePlanStatus(planDO,isLocks); + + planMapper.updateById(planDO.setProcessId(processId)); + + } + + + esUtils.deleteEsDocument(FIELD_PLAN_ID,planId,PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL); + + esUtils.saveEsDocument(PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL,modelDOList); @@ -788,54 +811,53 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { planProcessSchemeList.setProcessSchemeList(schemeDTOList); - if(planId != null) { - validatePlanExists(planId); + validatePlanExists(planId); - // 查询排单对应的方案组信息 - List saveProcessSchemeReqVOS = Optional.ofNullable(esUtils.getEsDocument(FIELD_PLAN_ID,planId,PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL,SaveProcessSchemeModelDO.class)).orElse(new ArrayList<>()); + // 查询排单对应的方案组信息 + 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); + // 查询排单对应的优化信息 + List optimizeBoardModelDOS = esUtils.getEsDocument(FIELD_PLAN_ID, planId, schemeDTOList.size(), ORDER_OPTIMIZE_PLATE_MODEL, OptimizeBoardModelDO.class); - if (CollUtil.isNotEmpty(optimizeBoardModelDOS)) { + if (CollUtil.isNotEmpty(optimizeBoardModelDOS)) { - if(CollUtil.isNotEmpty(saveProcessSchemeReqVOS)) { + if (CollUtil.isNotEmpty(saveProcessSchemeReqVOS)) { - saveProcessSchemeReqVOS.forEach(f -> { + saveProcessSchemeReqVOS.forEach(f -> { - List modelDOList = optimizeBoardModelDOS.stream().filter(o -> o.getPlanConfigId().equals(f.getPlanConfigId())).toList(); - if(CollUtil.isNotEmpty(modelDOList)) { + List modelDOList = optimizeBoardModelDOS.stream().filter(o -> o.getPlanConfigId().equals(f.getPlanConfigId())).toList(); + if (CollUtil.isNotEmpty(modelDOList)) { - String jsonString = toJsonString(modelDOList.get(0)); + String jsonString = toJsonString(modelDOList.get(0)); - f.setPlanOptimize(jsonString); - } - }); - }else { - optimizeBoardModelDOS.forEach(f -> { + 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()); + 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); - - } + planProcessSchemeList.setSaveProcessSchemeReqVOS(saveProcessSchemeReqVOS); + + + + return planProcessSchemeList; } @@ -1586,4 +1608,22 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { } + private void validatePlanStatus(PlanDO planDO,List isLocks){ + + if(planDO.getStatus().equals(PlanStatusEnum.OPENING.getStatus()) || planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus())){ + throw exception(THIS_PLAN_PLATE_IS_CUT); + } + + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + assert loginUser != null; + + Boolean data = permissionApi.hasAnyPermissions(loginUser.getId(), "placeorder:list").getCheckedData(); + + if(Boolean.TRUE.equals(planDO.getIsScheduled()) && isLocks.contains(true) && Boolean.FALSE.equals(data)){ + throw exception(THIS_PLAN_PROCESS_SCHEME_IS_LOCK); + } + + } + + } 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 7e86c5ddf..1d5cee559 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 @@ -319,7 +319,7 @@ public class PlanServiceImpl implements PlanService { if(updateReqVO.getProcessId() != null){ if(planDO.getStatus().equals(PlanStatusEnum.OPENING.getStatus()) || planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus())){ - throw exception(LIST_CHANGES_ARE_PROHIBITED); + throw exception(THIS_PLAN_PLATE_IS_CUT); } planDO.setProcessId(updateReqVO.getProcessId()); @@ -328,6 +328,8 @@ public class PlanServiceImpl implements PlanService { }else { + + planDO.setIsScheduled(updateReqVO.getIsScheduled()); planMapper.updateById(planDO); } @@ -412,8 +414,12 @@ public class PlanServiceImpl implements PlanService { if (!plateDOS.isEmpty()) { List plateIdList = plateDOS.stream().map(PlateDO::getId).toList(); + List goodsIds = plateDOS.stream().map(PlateDO::getGoodsId).toList(); + plateMapper.deleteBatchIds(plateIdList); + goodsMapper.deleteBatchIds(goodsIds); + orderItemMapper.delete(new LambdaQueryWrapperX() .eq(OrderItemDO::getOrganId, getUserOrganId()) .inIfPresent(OrderItemDO::getOrderId, orderIds) 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 740ccb573..5aa3ed82e 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 @@ -36,9 +36,9 @@ public interface PlateService { /** * 删除生产单板件 * - * @param id 编号 + * @param plateIds 编号 */ - void deletePlate(Long id,Long planId); + void deletePlate(List plateIds,Long planId); /** * 获得生产单板件 @@ -99,6 +99,6 @@ public interface PlateService { List getPlateModelByPlateId(List bodyIds); - List createNewPlate(OptimizationSavePlateReqVO reqVO); + List createNewPlate(List reqVO); } \ 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/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 56347d1e0..5356aabaf 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 @@ -7,8 +7,10 @@ import co.elastic.clients.elasticsearch.core.SearchRequest; import co.elastic.clients.elasticsearch.core.SearchResponse; import co.elastic.clients.elasticsearch.core.search.Hit; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.OrderPlateCutStatusEnum; import com.cf.imes.framework.common.enums.OrderPlateTypeEnum; import com.cf.imes.framework.common.enums.PlanStatusEnum; import com.cf.imes.framework.common.enums.PlanTypeEnum; @@ -18,21 +20,21 @@ 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.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.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.mysql.goods.GoodsMapper; @@ -40,6 +42,7 @@ 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.plate.PlateGoodMapper; import com.cf.imes.module.executor.dal.mysql.plate.PlateMapper; import com.cf.imes.module.executor.enums.OrderItemType; @@ -48,7 +51,6 @@ 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; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -58,14 +60,12 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.io.IOException; import java.math.BigDecimal; +import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; -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.enums.ErrorCodeConstants.PLAN_NOT_EXISTS; import static com.cf.imes.module.system.enums.ErrorCodeConstants.*; @@ -100,6 +100,10 @@ public class PlateServiceImpl implements PlateService { @Resource private OrderMapper orderMapper; + @Resource + private PlanItemMapper planItemMapper; + + @Resource private SnowflakeIdWorker3rd idWorker; @@ -115,12 +119,17 @@ public class PlateServiceImpl implements PlateService { @Resource private EsUtils esUtils; + @Resource + private IdentifierGenerator identifierGenerator; + 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"; + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + @Override public Long createPlate(PlateSaveReqVO createReqVO) { // 插入 @@ -141,73 +150,132 @@ public class PlateServiceImpl implements PlateService { @Override @Transactional(rollbackFor = Exception.class) - public void deletePlate(Long id,Long planId) { + public void deletePlate(List plateIds,Long planId) { + + if(CollUtil.isEmpty(plateIds)){ + return; + } PlanDO planDO = planMapper.selectById(planId); AssertUtils.notEmpty(planDO,ORDER_PLAN_DATE_ERROR); - PlateDO plateDO = plateMapper.selectById(id); + List plateDOS = plateMapper.selectBatchIds(plateIds); - AssertUtils.notEmpty(plateDO,REMAIN_PLATE_NOT_EXISTS); + AssertUtils.notEmpty(plateDOS,REMAIN_PLATE_NOT_EXISTS); - if(!plateDO.getType().equals(OrderPlateTypeEnum.SELFINCREASINGBOARD.getType())){ - throw exception(PLATE_IS_SOURCE); - } + for (PlateDO plateDO : plateDOS) { + if(!plateDO.getType().equals(OrderPlateTypeEnum.SELFINCREASINGBOARD.getType())){ + throw exception(PLATE_IS_SOURCE,plateDO.getPlateNo()); + } - if(Boolean.TRUE.equals(plateDO.getIsOptimized())) { - - List optimizeBoardModelDOS = buildBoardByPlanId(planId, ORDER_REMAIN_PLATE_MODEL); - - if (!optimizeBoardModelDOS.isEmpty()) { - - // todo 目前只解决了非混单的情况(目前混单的问题应该已经解决,数据正确性问题待验证) - OptimizeBoardModelDO optimizeBoardModelDO = optimizeBoardModelDOS.get(0); - - try { - - Long placeBlockNumber = optimizeBoardModelDO.getPlaceBlockNumber() - 1; - - List asJsonObject = parseObject(optimizeBoardModelDO.getBlockPlaceInfo(), new TypeReference<>() {}); - - String blockPlaceInfo = toJsonString( - asJsonObject.stream() - .filter(f -> !f.getBo().equals(plateDO.getPlateNo())) - .toList()); - - HashMap objectObjectHashMap = new HashMap<>(); - - - objectObjectHashMap.put("blockPlaceInfo",blockPlaceInfo); - - objectObjectHashMap.put("placeBlockNumber",placeBlockNumber); - - esDocumentService.updateById(ORDER_REMAIN_PLATE_MODEL, optimizeBoardModelDO.getId(), HashMap.class, objectObjectHashMap); - - - } catch (Exception e) { - - log.error(e.getMessage()); - throw new ServiceException(ES_DATA_ERROR); - - } + if(!plateDO.getIsCutted().equals(OrderPlateCutStatusEnum.NOCUTTING.getStatus())){ + throw exception(THIS_PLATE_IS_OPTIMIZE,plateDO.getPlateNo()); } } - Long bodyId = orderItemMapper.selectPlateList(id, plateDO.getOrderId(), plateDO.getOrganId()).getBodyId(); - OrderBodyDO orderBodyDO = orderBodyMapper.selectById(bodyId); + List plateIdList = plateDOS.stream().map(PlateDO::getId).toList(); - orderBodyDO.setPlateNum(orderBodyDO.getPlateNum() - 1); - orderBodyMapper.updateById(orderBodyDO); + List orderIds = plateDOS.stream().map(PlateDO::getOrderId).distinct().toList(); - orderItemMapper.deleteByPlateId(id, plateDO.getOrderId(), plateDO.getOrganId()); + List goodsIds = plateDOS.stream().map(PlateDO::getGoodsId).distinct().toList(); + + + List orderItemDOS = orderItemMapper.selectPlateList(plateIdList, orderIds, getUserOrganId()); + + List bodyIds = orderItemDOS.stream().map(OrderItemDO::getBodyId).distinct().toList(); + + List orderBodyDOS = orderBodyMapper.selectBatchIds(bodyIds); + + orderBodyDOS.forEach(f->{ + int plateNum = orderItemDOS.stream().filter(o -> f.getId().equals(o.getBodyId())).toList().size(); + f.setPlateNum(f.getPlateNum() - plateNum); + + }); + + orderBodyMapper.updateBatch(orderBodyDOS); + + // 删除小板ID + plateMapper.deleteBatchIds(plateIdList); + + // 删除小板明细信息 + orderItemMapper.deleteByPlateId(plateIdList, orderIds, getUserOrganId()); + + // 删除添加自增板时新增的大板ID + List plateId = goodsMapper.selectInsertGoodsIds(orderIds, goodsIds, getUserOrganId()); + + if(CollUtil.isEmpty(plateId)){ + goodsMapper.deleteBatchIds(goodsIds); + } + + + // 删除排单和板材明细的小板信息 + planItemMapper.delete(new LambdaQueryWrapperX() + .eq(PlanItemDO::getOrganId, getUserOrganId()) + .in(PlanItemDO::getOrderId,orderIds) + .in(PlanItemDO::getPlateId,plateIdList) + .eq(PlanItemDO::getPlanId, planId)); + + + + +// if(Boolean.TRUE.equals(plateDO.getIsOptimized())) { +// +// List optimizeBoardModelDOS = esUtils.getEsDocument("planId","planConfigId", planId, planConfigId, ORDER_REMAIN_PLATE_MODEL, OptimizeBoardModelDO.class); +// +// +// if (CollUtil.isNotEmpty(optimizeBoardModelDOS)) { +// +// OptimizeBoardModelDO optimizeBoardModelDO = optimizeBoardModelDOS.get(0); +// +// String plateNo = plateDO.getPlateNo(); +// +// String blockPlaceInfo = Optional.ofNullable(optimizeBoardModelDO.getBlockPlaceInfo()).orElseThrow(() -> new ServiceException(ORDER_PLAN_OPTIMIZE_ERROR)); +// +// String remainBoardInfo = Optional.ofNullable(optimizeBoardModelDO.getRemainBoardInfo()).orElseThrow(() -> new ServiceException(ORDER_PLAN_OPTIMIZE_ERROR)); +// +// List asJsonObject = new ArrayList<>(parseArray(blockPlaceInfo,PlatePlaceInfo.class)); +// +// List platePlaceInfos = asJsonObject.stream() +// .filter(fi -> !plateNo.equals(fi.getBo())) +// .toList(); +// +// +// List remainBoardInfos = new ArrayList<>(parseArray(remainBoardInfo, RemainBoardInfo.class)); +// +// remainBoardInfos.forEach(r->{ +// r.getPlaceBoardList().forEach(p->{ +// p.setBlocks(p.getBlocks().stream() +// .filter(bl->!plateNo.equals(bl.getBlockId())) +// .toList()); +// }); +// }); +// +// Date date = new Date(); +// +// Map updateData = new HashMap<>(); +// +// updateData.put("blockPlaceInfo", toJsonString(platePlaceInfos)); +// updateData.put("placeBlockNumber", (long) platePlaceInfos.size()); +// updateData.put("remainBoardInfo", toJsonString(remainBoardInfos)); +// updateData.put("updateTime", simpleDateFormat.format(date)); +// +// try { +// esDocumentService.updateById(ORDER_REMAIN_PLATE_MODEL, optimizeBoardModelDO.getId(), HashMap.class, updateData); +// +// }catch (Exception e){ +// log.error(e.getMessage()); +// throw new ServiceException(ES_DATA_ERROR); +// } +// +// +// } +// } - // 删除 - plateMapper.deleteById(id); } private void validatePlateExists(Long id) { @@ -433,75 +501,191 @@ public class PlateServiceImpl implements PlateService { @Override @Transactional(rollbackFor = Exception.class) - public List createNewPlate(OptimizationSavePlateReqVO reqVO) { - - - GoodsDO goodsDO = goodsMapper.selectGoodsId(reqVO.getOrderId(), reqVO.getGoodsId(), getUserOrganId()); - - AssertUtils.notEmpty(goodsDO,ORDER_PLAN_ERROR); + public List createNewPlate(List reqVO) { List plateDOS = new ArrayList<>(); - for (int i = 0; i < reqVO.getMultiple(); i++) { + List orderItemDOS = new ArrayList<>(); - // 生成板编号 - long plateNo = idWorker.nextId(); - long obtainingTime = SnowflakeIdWorker3rd.obtainingTime(); + List planItemDOS = new ArrayList<>(); - PlateDO plateDO = BeanUtils.toBean(reqVO, PlateDO.class); + List insertPlateRespVOS = new ArrayList<>(); + List orderBodyNumVOS = new ArrayList<>(); - String remake1 = reqVO.getRemake1() == null ? "" : reqVO.getRemake1() + ";" ; + List goodsIds = new ArrayList<>(reqVO.stream().map(OptimizationSavePlateReqVO::getGoodsId).distinct().toList()); - String remake2 = reqVO.getRemake2() == null ? "" : reqVO.getRemake2(); + List orderIds = reqVO.stream().map(OptimizationSavePlateReqVO::getOrderId).distinct().toList(); - plateDO.setRemark(remake1+remake2); - plateDO.setHoleArrange(reqVO.getPlaceHole()); - plateDO.setGoodsId(goodsDO.getId()); - plateDO.setThickness(goodsDO.getThickness()); - plateDO.setIsOptimized(false); - plateDO.setPlateNo((obtainingTime) + Long.toString(plateNo).substring(2)); - plateDO.setType(OrderPlateTypeEnum.SELFINCREASINGBOARD.getType()); + List goodsDOList = goodsMapper.selectOrderGoodsList(orderIds, goodsIds, getUserOrganId()); - plateDO.setArea(reqVO.getWidth().multiply(reqVO.getHeight()).movePointLeft(6).stripTrailingZeros()); + goodsIds.removeAll(goodsDOList.stream().map(GoodsDO::getGoodsId).distinct().toList()); - plateDOS.add(plateDO); + if(CollUtil.isNotEmpty(goodsIds)){ + + List goodsDOS = new ArrayList<>(); + + List plateGoodDOS = plateGoodMapper.selectGoodsByGoodsId(goodsIds, getUserOrganId()); + + for (PlateGoodDO plateGoodDO : plateGoodDOS) { + + GoodsDO goodsDO = GoodsDO.builder() + .id(null) + .orderId(reqVO.stream().filter(f -> f.getGoodsId().equals(plateGoodDO.getGoodsId())).map(OptimizationSavePlateReqVO::getOrderId).toList().get(0)) + .rawGoodsId("0") + .goodsId(plateGoodDO.getGoodsId()) + .goodsName(plateGoodDO.getGoodsName()) + .material(plateGoodDO.getMaterial()) + .texture(plateGoodDO.getTexture()) + .color(plateGoodDO.getColor()) + .width(BigDecimal.valueOf(plateGoodDO.getWidth())) + .height(BigDecimal.valueOf(plateGoodDO.getHeight())) + .thickness(BigDecimal.valueOf(plateGoodDO.getThickness())) + .remark(plateGoodDO.getRemark()) + .brand(plateGoodDO.getBrand()) + .build(); + + goodsDOS.add(goodsDO); + } + + goodsMapper.insertBatch(goodsDOS); + + goodsDOList.addAll(goodsDOS); } + + reqVO.forEach(f->{ + + List plateNoList = new ArrayList<>(); + + Long orderId = f.getOrderId(); + + GoodsDO goodsDO = goodsDOList.stream().filter(g -> g.getGoodsId().equals(f.getGoodsId())).toList().get(0); + + orderBodyNumVOS.add(OrderBodyNumVO.builder() + .bodyId(f.getBodyId()) + .plateNum(f.getMultiple()) + .build()); + + for (int i = 0; i < f.getMultiple(); i++) { + + // 生成板编号 + long obtainingTime = SnowflakeIdWorker3rd.obtainingTime(); + + String plateNo = (obtainingTime) + Long.toString(idWorker.nextId()).substring(2); + + plateNoList.add(plateNo); + + String remake1 = f.getRemake1() == null ? "" : f.getRemake1() + ";"; + + String remake2 = f.getRemake2() == null ? "" : f.getRemake2(); + + // 小板ID + Long plateId = (Long) identifierGenerator.nextId(null); + + plateDOS.add(PlateDO.builder() + .id(plateId) + .orderId(orderId) + .name(f.getName()) + .plateNo(plateNo) + .type(OrderPlateTypeEnum.SELFINCREASINGBOARD.getType()) + .isOptimized(true) + .thickness(goodsDO.getThickness()) + .goodsId(goodsDO.getId()) + .holeArrange(f.getPlaceHole()) + .remark(remake1 + remake2) + .area(f.getWidth().multiply(f.getHeight()).movePointLeft(6).stripTrailingZeros()) + .width(f.getWidth()) + .height(f.getHeight()) + .texture(f.getTexture()) + .sealLeft(f.getSealLeft()) + .sealRight(f.getSealRight()) + .sealUp(f.getSealUp()) + .sealDown(f.getSealDown()) + .build()); + + // 生产单明细表新增数据 + orderItemDOS.add(OrderItemDO.builder() + .orderId(f.getOrderId()) + .type(OrderItemType.BOARD.getCode()) + .roomId(f.getRoomId()) + .bodyId(f.getBodyId()) + .plateId(plateId) + .build()); + + planItemDOS.add(PlanItemDO.builder() + .planId(f.getPlanId()) + .goodsId(goodsDO.getId()) + .orderId(f.getOrderId()) + .plateId(plateId) + .build()); + + } + + insertPlateRespVOS.add(InsertPlateRespVO.builder() + .blockKey(f.getBlockKey()) + .plateNo(plateNoList) + .build()); + + }); + + plateMapper.insertBatch(plateDOS); + List numVOS = mergeOrderBody(orderBodyNumVOS); - // 生产单柜体表新增数据 - OrderBodyDO orderBodyDO = orderBodyMapper.selectById(reqVO.getBodyId()); + List bodyIds = numVOS.stream().map(OrderBodyNumVO::getBodyId).toList(); - AssertUtils.notEmpty(orderBodyDO,PLAN_BODY_DATA_ERROR); - orderBodyDO.setPlateNum(reqVO.getMultiple()+orderBodyDO.getPlateNum()); + List orderBodyDOS = orderBodyMapper.selectBatchIds(bodyIds); - orderBodyMapper.updateById(orderBodyDO); + orderBodyDOS.forEach(f->{ - List orderItemDOS = new ArrayList<>(); + Integer plateNum = numVOS.stream() + .filter(n -> n.getBodyId().equals(f.getId())) + .map(OrderBodyNumVO::getPlateNum) + .findFirst().orElse(0); - plateDOS.forEach(plateDO -> { - // 生产单明细表新增数据 - OrderItemDO orderItemDO = OrderItemDO.builder() - .orderId(reqVO.getOrderId()) - .type(OrderItemType.BOARD.getCode()) - .roomId(reqVO.getRoomId()) - .bodyId(reqVO.getBodyId()) - .plateId(plateDO.getId()) - .build(); - orderItemDOS.add(orderItemDO); - } - ); + f.setPlateNum(f.getPlateNum() + plateNum); + + }); + + orderBodyMapper.updateBatch(orderBodyDOS); + + + planItemMapper.insertBatch(planItemDOS); orderItemMapper.insertBatch(orderItemDOS); - - return plateDOS.stream().map(PlateDO::getPlateNo).toList(); + return insertPlateRespVOS; } + + + public static List mergeOrderBody(List dataList) { + if (dataList == null || dataList.isEmpty()) { + return Collections.emptyList(); + } + + // 使用 HashMap 来聚合数据,key 为 filed1,value 为 TestData 对象 + Map mergedMap = new HashMap<>(); + for (OrderBodyNumVO data : dataList) { + // 合并逻辑:将 filed2 的值累加 + mergedMap.merge(data.getBodyId(), data.getPlateNum(), Integer::sum); + } + + // 将结果转换回 List + return mergedMap.entrySet().stream() + .map(entry -> new OrderBodyNumVO(entry.getKey(), entry.getValue())) + .toList(); + } + + + + + + private List buildRespByPlateIds(Collection plateIds, String index) { List fieldValues = plateIds.stream().map(FieldValue::of).toList(); @@ -523,23 +707,4 @@ public class PlateServiceImpl implements PlateService { } - - private List buildBoardByPlanId(Long planId, String index) { - SearchRequest.Builder builder = new SearchRequest.Builder(); - builder.index(index); - 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).toList(); - } - return new ArrayList<>(); - } catch (IOException e) { - log.error(e.getMessage()); - throw new ServiceException(INTERNAL_SERVER_ERROR); - } - } - - } \ No newline at end of file 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 bf2f54f11..4d83ad997 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 @@ -28,7 +28,20 @@ resultType="com.cf.imes.module.executor.controller.admin.plan.vo.GoodsReqVO"> select distinct - og.*, + og.order_id, + og.raw_goods_id, + og.goods_id, + og.goods_name, + og.material, + og.color, + og.texture, + og.width, + og.height, + og.thickness, + og.price, + og.spec, + og.brand, + og.remark, orp.id as remainId from order_goods og @@ -516,4 +529,31 @@ + + + \ No newline at end of file diff --git a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java index c4ffc3e8f..96cbc6091 100644 --- a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java +++ b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java @@ -259,7 +259,7 @@ public class ErrorCodeConstants { public static final ErrorCode RAW_GOODS_NOT_EXISTS = new ErrorCode(1_002_033_006, "设计板材不存在"); public static final ErrorCode RAW_GOODS_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_002_033_007, "生产板材导入数据不可以为空"); public static final ErrorCode PLATE_GOODS_ID_NOT_SAME = new ErrorCode(1_002_033_009, "板材商品编号存在,请重新命名商品编号"); - public static final ErrorCode PLATE_IS_SOURCE = new ErrorCode(1_002_033_010, "当前板材为源小板,无法删除"); + public static final ErrorCode PLATE_IS_SOURCE = new ErrorCode(1_002_033_010, "小板:{} 为源小板,无法删除"); public static final ErrorCode PLAN_GOODS_IS_FILTER_DATA_ERROR = new ErrorCode(1_002_033_011, "当前排单为非混单,无法添加颜色的筛选条件"); public static final ErrorCode PLAN_STATUS_ERROR = new ErrorCode(1_002_033_012, "当前排单未投产,无法进行开料"); @@ -325,11 +325,14 @@ public class ErrorCodeConstants { public static final ErrorCode THIS_PLAN_PLATE_DATA_ERROR = new ErrorCode(1_002_041_039, "当前排单对应的板材数据为空,请重新进行排单或检查生产单对应的板材信息"); public static final ErrorCode PLAN_PROCESS_CONFIG_IS_NULL = new ErrorCode(1_002_041_040, "排单:{} 对应的方案组为空,请进行配置"); public static final ErrorCode PLAN_PROCESS_CONFIG_ALL_IS_NULL = new ErrorCode(1_002_041_041, "当前所选排单对应的方案组配置均为空,请重新进行方案组配置"); - public static final ErrorCode THIS_PLAN_IS_LOCK = new ErrorCode(1_002_041_042, "当前排单已被锁定,无法进行优化,请解锁后再进行优化"); + public static final ErrorCode THIS_PLAN_OPTIMIZE_IS_LOCK = new ErrorCode(1_002_041_042, "当前排单已被锁定,无法进行优化,请解锁后再进行优化"); + public static final ErrorCode THIS_PLAN_PROCESS_SCHEME_IS_LOCK = new ErrorCode(1_002_041_043, "当前排单已被锁定,无法修改方案组,请解锁后再进行修改"); public static final ErrorCode THIS_PLAN_OPTIMIZE_DATA_ERROR = new ErrorCode(1_002_041_044, "当前排单已全部开料,无法进行再次优化"); + public static final ErrorCode THIS_PLAN_PLATE_IS_CUT = new ErrorCode(1_002_041_045, "当前排单已有板材开料,无法修改"); public static final ErrorCode THIS_PLAN_PLATE_OPTIMIZE_IS_ALL = new ErrorCode(1_002_041_046, "当前排单已全部开料,无法进行选择"); + public static final ErrorCode THIS_PLATE_IS_OPTIMIZE = new ErrorCode(1_002_041_046, "小板:{},已开料,无法删除,请重新选择小板再删除");