diff --git a/cf-framework/cf-spring-boot-starter-mybatis/src/main/java/com/cf/imes/framework/mybatis/config/ChenfengMybatisAutoConfiguration.java b/cf-framework/cf-spring-boot-starter-mybatis/src/main/java/com/cf/imes/framework/mybatis/config/ChenfengMybatisAutoConfiguration.java index ed03d7794..5861bb53a 100644 --- a/cf-framework/cf-spring-boot-starter-mybatis/src/main/java/com/cf/imes/framework/mybatis/config/ChenfengMybatisAutoConfiguration.java +++ b/cf-framework/cf-spring-boot-starter-mybatis/src/main/java/com/cf/imes/framework/mybatis/config/ChenfengMybatisAutoConfiguration.java @@ -2,6 +2,7 @@ package com.cf.imes.framework.mybatis.config; import cn.hutool.core.text.CharSequenceUtil; import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; +import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import com.cf.imes.framework.mybatis.core.generator.SnowFlakeGenerator; import com.cf.imes.framework.mybatis.core.handler.DefaultDBFieldHandler; import com.baomidou.mybatisplus.annotation.DbType; @@ -43,6 +44,7 @@ public class ChenfengMybatisAutoConfiguration { public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); // 分页插件 + mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());// 乐观锁插件 return mybatisPlusInterceptor; } 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 872752b36..f75c29053 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 @@ -18,7 +18,10 @@ public class ErrorCodeConstants { public static final ErrorCode PLAN_NOT_DATA_EXISTS = new ErrorCode(1_001_107_007, "排单号:{} 不存在,无法进行操作,请检查排单数据"); public static final ErrorCode PLAN_PLATE_IS_CUTTING = new ErrorCode(1_001_107_008, "当前排单已有板材开料,无法开启混单"); public static final ErrorCode PLAN_IS_MIXED_ERROR = new ErrorCode(1_001_107_009, "当前排单为混单,无法开启混单配置"); - + public static final ErrorCode CREATE_PLAN_ORDER_UPDATE_CONCURRENCY_ERROR = new ErrorCode(1_001_107_010, "创建排单失败:生产单号【{}】板件数量已发生改变,请刷新后重新创建单排"); + public static final ErrorCode CREATE_PLAN_GOODS_UPDATE_CONCURRENCY_ERROR = new ErrorCode(1_001_107_011, "创建排单失败:材质【{}】板件数量已发生改变,请刷新后重新创建单排"); + public static final ErrorCode ORDER_PLATE_UPDATE_CONCURRENCY_ERROR = new ErrorCode(1_001_107_012, "更新生产单状态失败:生产单号【{}】板件数量已发生改变,请刷新后重新操作"); + public static final ErrorCode GOODS_PLATE_UPDATE_CONCURRENCY_ERROR = new ErrorCode(1_001_107_013, "更新材质状态失败:材质【{}】板件数量已发生改变,请刷新后重新操作"); // ========== 生产单商品 TODO 补充编号 ========== 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 7293c7ee8..259bd3431 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 @@ -8,6 +8,7 @@ import co.elastic.clients.elasticsearch.core.SearchRequest; import co.elastic.clients.elasticsearch.core.SearchResponse; import co.elastic.clients.elasticsearch.core.search.Hit; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.common.pojo.CommonResult; import com.cf.imes.framework.common.util.json.JsonUtils; @@ -22,7 +23,6 @@ import com.cf.imes.module.executor.dal.dataobject.orderItem.OrderItemDO; import com.cf.imes.module.executor.dal.dataobject.orderParts.OrderPartsDO; 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.remainplaten.RemainPlateDO; import com.cf.imes.module.executor.dal.mysql.goods.GoodsMapper; @@ -32,7 +32,6 @@ import com.cf.imes.module.executor.dal.mysql.orderGroup.OrderGroupMapper; import com.cf.imes.module.executor.dal.mysql.orderItem.OrderItemMapper; 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.PlateMapper; import com.cf.imes.module.executor.dal.mysql.remainplaten.RemainPlateMapper; import com.fasterxml.jackson.databind.JsonNode; @@ -92,9 +91,6 @@ public class OrderPlanApiImpl implements OrderPlanApi{ @Resource private OrderPartsMapper orderPartsMapper; - @Resource - private PlanItemMapper planItemMapper; - @Resource private ElasticsearchClient elasticsearchClient; @@ -119,20 +115,25 @@ public class OrderPlanApiImpl implements OrderPlanApi{ @Override public CommonResult getOrder(Long orderId) { + Long organId = getUserOrganId(); - List plateDOS = plateMapper.selectNoCutPlateByPlateId(Collections.singletonList(orderId), getUserOrganId()); + List plateDOS = plateMapper.selectNoCutPlateByPlateId(Collections.singletonList(orderId), organId); if(CollUtil.isNotEmpty(plateDOS)){ return CommonResult.success(false); } - List planItemDOS = planItemMapper.selectOrderPlanList(orderId, getUserOrganId()); + List orderPlanPlateList = plateMapper.selectList(new LambdaQueryWrapper() + .eq(PlateDO::getOrderId, orderId) + .eq(PlateDO::getOrganId, orderId) + .ne(PlateDO::getPlanId, 0) + .select(PlateDO::getPlanId)); - if(CollUtil.isNotEmpty(planItemDOS)){ + if(CollUtil.isNotEmpty(orderPlanPlateList)){ - List planIds = planItemDOS.stream().map(PlanItemDO::getPlanId).distinct().toList(); + List planIds = orderPlanPlateList.stream().map(PlateDO::getPlanId).distinct().toList(); - List planDOS = planMapper.selectPlanList(planIds,getUserOrganId()); + List planDOS = planMapper.selectPlanList(planIds, organId); if(CollUtil.isEmpty(planDOS)){ return CommonResult.success(true); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/OrderController.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/OrderController.java index e78de2978..2b97293c0 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/OrderController.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/OrderController.java @@ -238,7 +238,6 @@ public class OrderController { if (!isLocked) { throw new ServiceException(ORDER_IMPORT_ORGAN_LOCK_ERROR); } - Thread.sleep(20000); Long orderId = null; try { orderId = (Long) identifierGenerator.nextId(null); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderPlanPlateNumAndAreaRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderPlanPlateNumAndAreaRespVO.java new file mode 100644 index 000000000..3131cdc55 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderPlanPlateNumAndAreaRespVO.java @@ -0,0 +1,28 @@ +package com.cf.imes.module.executor.controller.admin.order.vo.order; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * @author Gqr + * @since 2025/6/26 16:30 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class OrderPlanPlateNumAndAreaRespVO { + /** + * 已排板件数量 + */ + private Integer num; + + /** + * 已排板件面积 + */ + 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/vo/OrderPlanPlateStatisticsRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/OrderPlanPlateStatisticsRespVO.java new file mode 100644 index 000000000..c2db92de0 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/OrderPlanPlateStatisticsRespVO.java @@ -0,0 +1,31 @@ +package com.cf.imes.module.executor.controller.admin.plan.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author Gqr + * @since 2025/6/26 15:53 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class OrderPlanPlateStatisticsRespVO { + /** + * 排单id + */ + private Long planId; + + /** + * 排单板件数量 + */ + private Integer count; + + /** + * 订单id + */ + private Long orderId; +} 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 144c44f45..ad6dd1f9d 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 @@ -8,6 +8,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import java.math.BigDecimal; +import java.time.LocalDateTime; import java.util.Date; import java.util.List; @@ -25,7 +26,7 @@ public class OrderRespVOCopy { @Schema(description = "生产单id") private Long orderId; @Schema(description = "生产单状态") - private Long status; + private Integer status; @Schema(description = "自定义单号") private String defineId; @Schema(description = "客户") @@ -34,10 +35,10 @@ public class OrderRespVOCopy { private String address; @Schema(description = "订单日期") @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY, timezone = TIME_ZONE_DEFAULT) - private Date orderDate; + private LocalDateTime orderDate; @Schema(description = "交付日期") @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT) - private Date deliveryDate; + private LocalDateTime deliveryDate; @Schema(description = "更新时间") @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT) private Date updateTime; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/goods/GoodsDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/goods/GoodsDO.java index 8a4bb8c5f..935562550 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/goods/GoodsDO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/goods/GoodsDO.java @@ -98,4 +98,28 @@ public class GoodsDO extends BaseDO { */ private Boolean deleted; + /** + * 板件数量 + */ + private Integer plateNum; + + /** + * 已排单小板数量 + */ + private Integer plannedPlateNum; + + /** + * 板件总面积 + */ + private Double area; + + /** + * 已排单面积 + */ + private Double plannedPlateArea; + + /** + * 版本号:乐观锁用 + */ + private int version; } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/order/OrderDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/order/OrderDO.java index 77b44d398..bd519570e 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/order/OrderDO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/order/OrderDO.java @@ -123,4 +123,27 @@ public class OrderDO extends BaseDO { */ @TableField(value = "custom_plateno_seq", typeHandler = CompressStringTypeHandler.class) private String customPlatenoSeq; + + + /** + * 板件数量 + */ + private Integer plateNum; + + /** + * 已排单小板数量 + */ + private Integer plannedPlateNum; + + /** + * 板件总面积 + */ + private Double area; + + /** + * 已排单面积 + */ + private Double plannedPlateArea; + + private int version; } 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 d30a93689..e716bf3cb 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 @@ -98,4 +98,8 @@ public class PlanDO extends BaseDO { // */ // private Boolean isTopUp; + /** + * 板材商品id + */ + private String goodsId; } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/plate/PlateDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/plate/PlateDO.java index c1086fd72..62f19de64 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 @@ -206,4 +206,9 @@ public class PlateDO extends BaseDO { @TableField(exist = false) private StringBuilder customPlateNoBuilder; + + /** + * 排单id + */ + private Long planId; } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/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 ff6e3ee91..271515574 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 @@ -10,6 +10,7 @@ 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.goods.vo.GoodsRespVO; import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderGoodsPlateIds; +import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPlanPlateNumAndAreaRespVO; import com.cf.imes.module.executor.controller.admin.plan.bo.OrderRoomBodyList; import com.cf.imes.module.executor.controller.admin.plan.vo.GoodsReqVO; import com.cf.imes.module.executor.controller.admin.plan.vo.PlateInfoVO; @@ -191,4 +192,12 @@ public interface GoodsMapper extends BaseMapperX { .eq(GoodsDO::getDeleted, deleted) .eq(GoodsDO::getOrganId, organId)); } + + /** + * 查询订单材质下已排单的板件数量和面积 + * + * @param orderGoodsId + * @return + */ + OrderPlanPlateNumAndAreaRespVO selectPlannedPlateNumAndArea(@Param("orderGoodsId") Long orderGoodsId); } \ 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 b98090140..76757537a 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 @@ -19,6 +19,7 @@ import com.cf.imes.module.executor.controller.admin.order.vo.order.LabelOrderDat import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderCountProducePeriodRespVO; 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.order.vo.order.OrderPlanPlateNumAndAreaRespVO; import com.cf.imes.module.executor.controller.admin.plan.bo.OrderIds; import com.cf.imes.module.executor.controller.admin.plan.vo.*; import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; @@ -303,4 +304,11 @@ public interface OrderMapper extends BaseMapperX { List selectLabelOrderData(@Param("orderIds") List orderIds,@Param("organId") Long organId); + /** + * 查询订单下已排单的板件数量和面积 + * + * @param orderId + * @return + */ + OrderPlanPlateNumAndAreaRespVO selectPlannedPlateNumAndArea(@Param("orderId") Long orderId); } 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 22db8c44a..d9b6817b5 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 @@ -7,7 +7,7 @@ import com.cf.imes.framework.common.enums.PlanStatusEnum; 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.order.vo.order.OrderStatisticsReqVO; -import com.cf.imes.module.executor.controller.admin.plan.vo.OrderGoodsResp; +import com.cf.imes.module.executor.controller.admin.plan.vo.OrderPlanPlateStatisticsRespVO; 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.PlateOptimize; @@ -18,6 +18,7 @@ import org.apache.ibatis.annotations.Param; import java.time.LocalDateTime; import java.util.Arrays; import java.util.List; +import java.util.Set; /** * 生产单开料排单 Mapper @@ -122,5 +123,31 @@ public interface PlanMapper extends BaseMapperX { List selectIsTopDownPlan(@Param("updateTime") LocalDateTime updateTime,@Param("organId") Long organId); - List selectPlanGoodsList(@Param("planId") Long planId, @Param("organId") Long organId); + /** + * 统计涉及移除小板的排单下还存在的排单数量 + * + * @param planIds + * @param organId + * @return + */ + List countDeletePlanPlate(@Param("planIds") List planIds, @Param("orderIds") Set orderIds, @Param("organId") Long organId); + + /** + * 查询排单下订单id的列表 + * + * @param planIds + * @param organId + * @return + */ + List selectPlanOrderIds(@Param("planIds") List planIds, @Param("orderIds") Set orderIds, @Param("organId") Long organId); + + /** + * 查询排单+生产单下订单材质orderGoodsId + * + * @param planId + * @param orderIds + * @param organId + * @return + */ + List selectPlanOrderGoodsId(@Param("planId") Long planId, @Param("orderIds") List orderIds, @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/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 57027a9fe..8fca229d5 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 @@ -4,13 +4,10 @@ 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.order.vo.order.LabelOrderPlateData; 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 com.cf.imes.module.executor.dal.dataobject.plate.PlateDO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -26,21 +23,7 @@ public interface PlanItemMapper extends BaseMapperX { - List selectOrderList(@Param(Constants.WRAPPER) Wrapper wrapper,@Param("pageNo") Integer pageNo,@Param("pageSize") Integer pageSize); - - - List selectOrderListCount(@Param(Constants.WRAPPER) Wrapper wrapper); - - - - default List selectPlanPlateList(List planIds, List orderIds, Long organId) { - return selectList( new LambdaQueryWrapperX() - .eq(PlanItemDO::getOrganId, organId) - .inIfPresent(PlanItemDO::getOrderId,orderIds) - .in(PlanItemDO::getPlanId,planIds)); - - } - + IPage selectOrderList(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper,@Param("type")int type); List selectPlanPlateDetailList(@Param("planId") Long planId, @Param("organId") Long organId); @@ -49,7 +32,7 @@ public interface PlanItemMapper extends BaseMapperX { List selectPlateListByPlateIds(@Param(Constants.WRAPPER) Wrapper wrapper,@Param("pageNo") Integer pageNo,@Param("pageSize") Integer pageSize); - List selectPlateListByPlateId(@Param("planId") Long planId, @Param("organId") Long organId); + List selectPlateListByPlanId(@Param("planId") Long planId, @Param("organId") Long organId); Long selectPlateCountByPlateIds(@Param(Constants.WRAPPER) Wrapper wrapper); @@ -60,42 +43,8 @@ public interface PlanItemMapper extends BaseMapperX { List selectNoOrderGoodsIdList(@Param(Constants.WRAPPER) Wrapper wrapper,@Param("organId") Long organId); - List selectPlanIncrementPlate(@Param("noPlanIds") List noPlanIds,@Param("organId") Long organId); - - - default List selectOrderPlanList(Long orderId,Long organId) { - return selectList( new LambdaQueryWrapperX() - .eq(PlanItemDO::getOrganId, organId) - .eq(PlanItemDO::getOrderId,orderId) - .select(PlanItemDO::getPlanId)); - } - - - List selectOrderPlanPlateListByPlanId(@Param("planId") Long planId, @Param("organId") Long organId); - - - - default List selectIsPlanPlateList(List orderIds, List plateIds,Long organId) { - return selectList( new LambdaQueryWrapperX() - .eq(PlanItemDO::getOrganId, organId) - .inIfPresent(PlanItemDO::getOrderId,orderIds) - .inIfPresent(PlanItemDO::getPlateId,plateIds) - .select(PlanItemDO::getPlanId)); - } - - List selectOrderPlateList(@Param("orderIds") List orderIds,@Param("organId") Long organId); - Long selectIsCuttingPlate(@Param("planId") Long planId,@Param("organId") Long organId); - - default List selectPlanOrderGoodsList(Long planId, List orderIds,Long organId) { - return selectList( new LambdaQueryWrapperX() - .eq(PlanItemDO::getOrganId, organId) - .eq(PlanItemDO::getPlanId,planId) - .inIfPresent(PlanItemDO::getOrderId,orderIds) - .select(PlanItemDO::getGoodsId)); - } - List selectLabelOrderPlateDataByPlanId(@Param("planId") Long planId, @Param("organId") Long organId); 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 1e49d2a26..eb8adc978 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 @@ -31,6 +31,7 @@ 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; @@ -121,10 +122,6 @@ public interface PlateMapper extends BaseMapperX { List selectPlateGoodsListByList(@Param("plates") List goodsIdList, @Param("orderId") Long orderId, @Param("organId") Long organId); - List selectGoodsPage( @Param(Constants.WRAPPER) Wrapper wrapper); - - - void deletedById(@Param("plateIds") List plateIds, @Param("organId") Long organId); @@ -189,23 +186,17 @@ public interface PlateMapper extends BaseMapperX { List selectPlanPlateListDataSource(@Param("filed") String filed, @Param("field2") String field2,@Param("goodsIdList") List goodsIdList,@Param("orderIds") List orderIds,@Param("organId") Long organId); - - default List selectPlateIdList(List orderIds,List goodsIdList, Long organId) { + default List selectSelfincreasePlateIdList(Set orderIds, List planIds, Long organId) { return selectList(new LambdaQueryWrapperX() .eq(PlateDO::getOrganId,organId) .eq(PlateDO::getDeleted,false) .inIfPresent(PlateDO::getOrderId,orderIds) - .inIfPresent(PlateDO::getGoodsId,goodsIdList) + .inIfPresent(PlateDO::getPlanId, planIds) .eq(PlateDO::getType, OrderPlateTypeEnum.SELFINCREASINGBOARD.getType()) .select(PlateDO::getId,PlateDO::getGoodsId)); } - - - List selectNoPlanPlateList(@Param(Constants.WRAPPER) Wrapper queryWrapperX2); - - 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); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/enums/OrderPlanQueryTypeEnum.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/enums/OrderPlanQueryTypeEnum.java new file mode 100644 index 000000000..82270440b --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/enums/OrderPlanQueryTypeEnum.java @@ -0,0 +1,27 @@ +package com.cf.imes.module.executor.enums; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * 未排订单查询方式枚举 + * + * @author Gqr + * @since 2025/7/1 16:39 + */ +@RequiredArgsConstructor +@Getter +public enum OrderPlanQueryTypeEnum { + ORDER_GROUP(0, "订单分组"), + GOODS_GROUP(1, "板材分组"); + + /** + * 类型编码 + */ + private final Integer type; + + /** + * 描述 + */ + private final String desc; +} 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 b88e20837..9cd1e6f26 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,5 +1,6 @@ package com.cf.imes.module.executor.service.optimizeplan; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.text.CharSequenceUtil; @@ -344,9 +345,9 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { AssertUtils.notEmpty(planDO,PLAN_NOT_EXISTS); // 查询排单对应的大板信息 - List goodsDOS = goodsMapper.selectGoodsListByOrderIds(planId,getUserOrganId()); + List goodsDOS = goodsMapper.selectGoodsListByOrderIds(planId, getUserOrganId()); - AssertUtils.notEmpty(goodsDOS,PLAN_GOODS_DATA_ERROR); + AssertUtils.notEmpty(goodsDOS, PLAN_GOODS_DATA_ERROR); String orderNos = Optional.ofNullable(planDO.getOrderNos()).orElse("[]"); @@ -358,7 +359,6 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { // 查询排单对应的小板信息 List plateDetailRespVOS = planItemMapper.selectPlanPlateDetailList(planId,getUserOrganId()); - AssertUtils.notEmpty(plateDetailRespVOS,ORDER_PLAN_PLATE_ERROR); for (PlateDetailRespVO plateDetailsRespVO : plateDetailRespVOS) { @@ -379,16 +379,18 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { AssertUtils.notEmpty(orderDOS,ORDER_PLAN_ERROR); - - // 造型数据的尺寸长度 - Integer orderModelSize = plateDetailRespVOS.size(); - // 需要查询小板造型信息的板材ID List plateIds = plateDetailRespVOS.stream().map(PlateDetailRespVO::getPlateId).toList(); - List orderModelDOS = esUtils.getEsDocument(FIELD_PLATE_ID, plateIds, orderModelSize, ORDER_PLATE_MODEL.getIndex(), OrderModelDO.class); + // 每一千块查询一次es + List> batchPlateIdsList = batchProcess(plateIds); - AssertUtils.notEmpty(orderModelDOS,ORDER_PLAN_PLATE_MODEL_DATE_ERROR); + List orderModelDOS = new ArrayList<>(); + for (List plateIdsList : batchPlateIdsList) { + orderModelDOS.addAll(esUtils.getEsDocument(FIELD_PLATE_ID, plateIdsList, plateIdsList.size(), ORDER_PLATE_MODEL.getIndex(), OrderModelDO.class)); + } + + AssertUtils.notEmpty(orderModelDOS, ORDER_PLAN_PLATE_MODEL_DATE_ERROR); List remainPlateDOS = remainPlateMapper.selectByPlanId(planId,getUserOrganId()); @@ -397,17 +399,12 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { List optimizeRemainPlates = BeanUtils.toBean(remainPlateDOS, OptimizeRemainPlate.class); - // 获取混单时选择的实际开料的大板信息 - List planActualGoodsModelDOS = esUtils.getEsDocument(FIELD_PLAN_ID, planId, PLAN_ACTUAL_GOODS_MODEL.getIndex(), PlanActualGoodsModelDO.class); - - // 查询生产单对应的配件信息 List printOrderPartsRespVOS = orderPartsMapper.selectPartList(orderIds, getUserOrganId()); // 查询生产单对应的配件的ES信息 List orderPartsRemarks = esUtils.getEsDocument(FIELD_ORDER_ID, orderIds, printOrderPartsRespVOS.size(), ORDER_PARTS_REMARK_MODEL.getIndex(), OrderPartsRemark.class); - // 查询生产单对应的包裹信息 List printOrderPackReqVOS = plateMapper.selectPlanPackList(ids,getUserOrganId()); @@ -431,7 +428,7 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { .goodsList(goodsDOS) .plateList(plateDetailRespVOS) .plateModels(orderModelDOS) - .planActualGoodsModelDO(CollUtil.isNotEmpty(planActualGoodsModelDOS) ? planActualGoodsModelDOS.get(0) : null) + .planActualGoodsModelDO(BeanUtil.copyProperties(goodsDOS.get(0), PlanActualGoodsModelDO.class)) .optimizeRemainPlates(optimizeRemainPlates) .orderPartsRespVOS(printOrderPartsRespVOS) .orderPartsRemarks(orderPartsRemarks) @@ -476,6 +473,11 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { processId = optimizeBoardModelDO.getProcessId(); } + // 更新排单对应小板优化属性 + plateMapper.update(new LambdaUpdateWrapper() + .eq(PlateDO::getPlanId, planId) + .eq(PlateDO::getOrganId, getUserOrganId()) + .set(PlateDO::getIsOptimized, true)); if(req.getProcessId() != null){ @@ -507,18 +509,6 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { esUtils.deleteEsDocument(FIELD_PLAN_ID, FIELD_PLAN_CONFIG_ID, planId, req.getPlanConfigId(), ORDER_OPTIMIZE_PLATE_MODEL.getIndex()); } - - List plateDOS = planItemMapper.selectOrderPlanPlateListByPlanId(planId,getUserOrganId()); - - if(CollUtil.isNotEmpty(plateDOS)) { - - plateDOS.forEach(f -> { - f.setIsOptimized(true); - }); - - plateMapper.updateBatch(plateDOS); - } - boardModelDO.setIsNewInsertPlate(Boolean.FALSE); @@ -561,15 +551,11 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { List planConfigIds = schemeModelDOS.stream().map(SaveProcessSchemeModelDO::getPlanConfigId).distinct().toList(); - List plateDOS = planItemMapper.selectOrderPlanPlateListByPlanId(planId,getUserOrganId()); - - - if(CollUtil.isNotEmpty(plateDOS)) { - - plateDOS.forEach(f -> f.setIsOptimized(true)); - - plateMapper.updateBatch(plateDOS); - } + // 更新排单对应小板优化属性 + plateMapper.update(new LambdaUpdateWrapper() + .eq(PlateDO::getPlanId, planId) + .eq(PlateDO::getOrganId, getUserOrganId()) + .set(PlateDO::getIsOptimized, true)); // 如果方案组ID不相等,就删除旧的方案组信息,再保存新的加工方案组ID @@ -804,7 +790,7 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { .index(ORDER_PLATE_MODEL.getIndex()) .query(q -> q.bool(b -> b .filter(f -> f.terms(t -> t - .field("orderId") + .field(FIELD_ORDER_ID) .terms(e -> e.value(orderIds.stream().map(FieldValue::of).toList())) )) .filter(f -> f.terms(t -> t @@ -826,12 +812,12 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { .size(1000) .sort(s -> s.field(f -> f.field("id.keyword").order(SortOrder.Asc))) .query(q -> q.bool(b -> b - .filter(f -> f.terms(t -> t.field("orderId").terms(e -> e.value(orderIds.stream().map(FieldValue::of).toList())))) + .filter(f -> f.terms(t -> t.field(FIELD_ORDER_ID).terms(e -> e.value(orderIds.stream().map(FieldValue::of).toList())))) .filter(f -> f.terms(t -> t.field("plateGoodsId").terms(e -> e.value(orderGoodsIds.stream().map(FieldValue::of).toList())))) )) .source(s -> s .filter(f -> f - .includes("holeDetail", "sideHoleDetail", "contourDetail", "sideDetail", "id", "plateId", "pointDetail", + .includes("holeDetail", "sideHoleDetail", "contourDetail", "sideDetail", "id", FIELD_PLATE_ID, "pointDetail", "rawPointDetail", "splitLength", "splitWidth", "offsetX", "offsetY") ) ) @@ -1699,5 +1685,30 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { } + /** + * 拆分list,每个1000条 + * + * @param dataList + * @param + * @return + */ + private List> batchProcess(List dataList) { + List> resultList = new ArrayList<>(); + if (CollUtil.isEmpty(dataList)) { + return resultList; + } + + int total = dataList.size(); + for (int i = 0; i < total; i += 1000) { + int end = Math.min(i + 1000, total); + List subList = dataList.subList(i, end); + + if (!subList.isEmpty()) { + resultList.add(subList); + } + } + return resultList; + } + } 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 30ad52023..15584ddb0 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 @@ -1,17 +1,20 @@ package com.cf.imes.module.executor.service.plan; import cn.hutool.core.collection.CollUtil; +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.UpdateByQueryRequest; import co.elastic.clients.json.JsonData; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; 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.*; 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; import com.cf.imes.framework.common.util.Assert.AssertUtils; import com.cf.imes.framework.common.util.object.BeanUtils; @@ -21,6 +24,7 @@ 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.GoodsRespVO; +import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPlanPlateNumAndAreaRespVO; import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderRespVO; import com.cf.imes.module.executor.controller.admin.plan.bo.OrderRoomBodyList; import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.PlatePlaceInfo; @@ -45,11 +49,14 @@ 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.PlateMapper; import com.cf.imes.module.executor.dal.mysql.remainplaten.RemainPlateMapper; +import com.cf.imes.module.executor.enums.ErrorCodeConstants; +import com.cf.imes.module.executor.enums.OrderPlanQueryTypeEnum; import com.cf.imes.module.executor.enums.OrderStatusEnum; import com.cf.imes.module.executor.util.elasticsearch.EsUtils; import com.cf.imes.module.system.api.systemconfig.SystemConfigApi; import com.cf.imes.module.system.api.systemconfig.dto.SystemConfigRespDTO; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.aop.framework.AopContext; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -131,7 +138,7 @@ public class PlanServiceImpl implements PlanService { 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_PLAN_ID = "op.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"; @@ -152,14 +159,6 @@ public class PlanServiceImpl implements PlanService { List planDOS = new ArrayList<>(); - List orderIds = new ArrayList<>(); - - List plateIds = new ArrayList<>(); - - List planItemDOS = new ArrayList<>(); - - List planActualGoodsModelDOS = new ArrayList<>(); - SavePlanPlateList savePlanPlateList = Optional.ofNullable(createReqVO.getSavePlanPlateList()).orElseThrow(()-> new ServiceException(PLAN_PLATE_DATA_ERROR)); @@ -174,17 +173,8 @@ public class PlanServiceImpl implements PlanService { List planActualGoodsLists = Optional.ofNullable(createReqVO.getPlanActualGoodsListList()).orElse(new ArrayList<>()); - // 混单时判断是否进行板材对应并创建排单 - mixConfigPlateCorresponding(planActualGoodsLists,planActualGoodsModelDOS,planItemDOS,plateItemList,goodsItemList,planDOS,processId,loginUser,mixedType); - - - // 获取所有的小板ID - plateIds.addAll(plateItemList.stream().map(SavePlanPlateList.PlateItemList::getPlateId).toList()); - // 获取所有的生产单ID - orderIds.addAll(plateItemList.stream().map(SavePlanPlateList.PlateItemList::getOrderId).distinct().toList()); - - + mixConfigPlateCorresponding(planActualGoodsLists, plateItemList, goodsItemList, planDOS, processId, loginUser, mixedType); } else { @@ -195,31 +185,11 @@ public class PlanServiceImpl implements PlanService { // 查找材质和厚度和颜色相同的大板 Map> grouped = groupByMaterialAndThicknessAndColorAndBrand(goodsItemList); - createPlanAndPlateDataList(grouped,planItemDOS,plateItemList,planDOS,processId,loginUser,PlanTypeEnum.ORDERPLAN.getType()); - - - // 获取所有的小板ID - plateIds.addAll(plateItemList.stream().map(SavePlanPlateList.PlateItemList::getPlateId).toList()); - // 获取所有的生产单ID - orderIds.addAll(plateItemList.stream().map(SavePlanPlateList.PlateItemList::getOrderId).distinct().toList()); - + createPlanAndPlateDataList(grouped, plateItemList, planDOS, processId, loginUser, PlanTypeEnum.ORDERPLAN.getType()); } - - List plateList = planItemMapper.selectIsPlanPlateList(orderIds, plateIds, getUserOrganId()); - - AssertUtils.empty(plateList,CREAT_PLAN_PLATE_DATA_ERROR); - - 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(CollUtil.isNotEmpty(orderDOS)) { - orderMapper.updateBatch(orderDOS); - } + // 增加排单 + planMapper.insertBatch(planDOS); // 排单对应的加工方案组的配置信息 List processSchemeModelDOS; @@ -238,33 +208,6 @@ public class PlanServiceImpl implements PlanService { })); esUtils.saveEsDocument(PLAN_PROCESS_SCHEME_CONFIG.getIndex(),processSchemeModelDOS); - - // 增加排单 - planMapper.insertBatch(planDOS); - - // 排单明细表增加板材 - planItemMapper.insertBatch(planItemDOS, planItemDOS.size()); - - - // 板材造型数据更新排单ID - planDOS.forEach(f->{ - - String orderNos = Optional.ofNullable(f.getOrderNos()).orElse("[]"); - - List orderIdList = JSON.parseArray(orderNos).toJavaList(Long.class).stream().toList(); - - List plateIdList = planItemDOS.stream().filter(pi -> f.getId().equals(pi.getPlanId())).map(PlanItemDO::getPlateId).toList(); - -// insertPlateModelPlanId(orderIdList,plateIdList,f.getId()); - - }); - - - // 增加实际生产选择的板材 - if(CollUtil.isNotEmpty(planActualGoodsModelDOS)) { - esUtils.saveEsDocument(PLAN_ACTUAL_GOODS_MODEL.getIndex(), planActualGoodsModelDOS); - } - } @@ -335,50 +278,23 @@ public class PlanServiceImpl implements PlanService { AssertUtils.notEmpty(planDOS,PLAN_NOT_EXISTS); - List orderIds = new ArrayList<>(); - + // 获取排单下的订单号集合 planDOS.forEach(f->{ if ( f.getStatus().equals(PlanStatusEnum.OPENING.getStatus()) || f.getStatus().equals(PlanStatusEnum.OPENED.getStatus()) ) { throw exception(PLAN_NOT_ALLOW_DELETE,f.getId()); } - - String orderNos = Optional.ofNullable(f.getOrderNos()).orElse("[]"); - - orderIds.addAll(JSON.parseArray(orderNos).toJavaList(Long.class).stream().distinct().toList()); }); - - if(CollUtil.isEmpty(orderIds)){ - planMapper.deleteBatchIds(planDOS); - return; - } - - // 删除排单信息,更新排单对应的余料板的排单ID为0 planMapper.deleteBatchIds(planIds); - remainPlateMapper.deletePlanRemainPlate(planIds,getUserOrganId()); - - // 删除板件表排单表的关联信息 - List planItemDOList = planItemMapper.selectPlanPlateList(planIds, orderIds, getUserOrganId()); - - List plateIds = planItemDOList.stream().map(PlanItemDO::getPlateId).toList(); - - List ids = planItemDOList.stream().map(PlanItemDO::getGoodsId).toList(); - - plateMapper.updateNoPlateOptimized(orderIds, ids,plateIds, getUserOrganId()); - - - // 删除板材和排单明细表里对应的小板ID - planItemMapper.delete(new LambdaQueryWrapperX() - .eq(PlanItemDO::getOrganId, getUserOrganId()) - .inIfPresent(PlanItemDO::getOrderId,orderIds) - .inIfPresent(PlanItemDO::getPlateId, plateIds) - .in(PlanItemDO::getPlanId, planIds)); + remainPlateMapper.deletePlanRemainPlate(planIds, getUserOrganId()); + // 重置板件排单和优化属性 & 计算orders和order_goods的数量和面积 + Set orderIds = computePlanOrderAndGoodsPlate(planDOS); // 查询当前排单是否有自增板,如果有,删除 - List plateDOS = plateMapper.selectPlateIdList(orderIds, ids, getUserOrganId()); + List plateDOS = plateMapper.selectSelfincreasePlateIdList(orderIds, planIds, getUserOrganId()); if (!plateDOS.isEmpty()) { List plateIdList = plateDOS.stream().map(PlateDO::getId).toList(); @@ -392,41 +308,76 @@ public class PlanServiceImpl implements PlanService { } - // 查询删除排单对应的生产单是否还有进行了其他排单 - List orderIdList = planItemMapper.selectOrderPlateList(orderIds, getUserOrganId()); - - 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); - } - - // 排单对应的优化数据删除 - esUtils.deleteEsDocument(FIELD_PLANID,planIds,ORDER_OPTIMIZE_PLATE_MODEL.getIndex()); + esUtils.deleteEsDocument(FIELD_PLANID, planIds, ORDER_OPTIMIZE_PLATE_MODEL.getIndex()); // 删除排单对应的加工方案的优化数据 - esUtils.deleteEsDocument(FIELD_PLANID,planIds,PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL.getIndex()); + esUtils.deleteEsDocument(FIELD_PLANID, planIds, PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL.getIndex()); // 删除排单对应的加工方案组的配置信息 - esUtils.deleteEsDocument(FIELD_PLANID,planIds,PLAN_PROCESS_SCHEME_CONFIG.getIndex()); + esUtils.deleteEsDocument(FIELD_PLANID, planIds, PLAN_PROCESS_SCHEME_CONFIG.getIndex()); // 去除生产单板材造型对应的排单ID // removePlateModelPlanId(orderIds,planIds,new ArrayList<>()); } + /** + * 重置板件排单和优化属性 & 计算orders和order_goods的数量和面积 + * + * @param planDOS + */ + private Set computePlanOrderAndGoodsPlate(List planDOS) { + // 所有涉及移除排单的订单号列表 + Set orderIds = new HashSet<>(); + for (PlanDO planDO : planDOS) { + // 重置排单下的板件 排单和优化属性 + plateMapper.update(new LambdaUpdateWrapper() + .eq(PlateDO::getPlanId, planDO.getId()) + .eq(PlateDO::getOrganId, getUserOrganId()) + .set(PlateDO::getPlanId, 0) + .set(PlateDO::getIsOptimized, false)); + + // 排单对应的商品id + String goodsId = planDO.getGoodsId(); + String orderNos = Optional.ofNullable(planDO.getOrderNos()).orElse("[]"); + + // 排单下的订单号列表 + Set planOrderIds = JSON.parseArray(orderNos).toJavaList(Long.class).stream().collect(Collectors.toSet()); + orderIds.addAll(planOrderIds); + + if (CollUtil.isNotEmpty(planOrderIds) && StringUtils.isNotEmpty(goodsId)) { + // 查询排单下所有订单材质order_goods + List goodsDO = goodsMapper.selectList(new LambdaQueryWrapper() + .in(GoodsDO::getOrderId, planOrderIds) + .eq(GoodsDO::getGoodsId, goodsId) + .eq(GoodsDO::getOrganId, getUserOrganId()) + .eq(GoodsDO::getDeleted, false)); + + for (GoodsDO planGoods : goodsDO) { + Long orderGoodsId = planGoods.getId(); + int version = planGoods.getVersion(); + // 统计每个order_goods下的未排单面积,更新到order_goods中 + OrderPlanPlateNumAndAreaRespVO goodsPlateNumAndAreaPlanInfo = goodsMapper.selectPlannedPlateNumAndArea(orderGoodsId); + int update = goodsMapper.update(new LambdaUpdateWrapper() + .eq(GoodsDO::getId, orderGoodsId) + .eq(GoodsDO::getVersion, version) + .set(GoodsDO::getPlannedPlateArea, goodsPlateNumAndAreaPlanInfo.getArea()) + .set(GoodsDO::getPlannedPlateNum, goodsPlateNumAndAreaPlanInfo.getNum()) + .set(GoodsDO::getVersion, version + 1)); + if (update == 0) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.GOODS_PLATE_UPDATE_CONCURRENCY_ERROR, orderGoodsId); + } + } + } + } + + // 统计更新orders的小板数量和面积 + computeOrderInfo(orderIds); + return orderIds; + } @@ -490,22 +441,8 @@ public class PlanServiceImpl implements PlanService { List configDOS = systemConfigApi.getProcessByIds(processIds).getData(); - // 查询排单对应的大板板材信息 - List plateInfoVOS = planItemMapper.selectOrderPlanPlateList(planIds,getUserOrganId()); - - - // 查询排单对应的小板数量和小板面积 - if(CollUtil.isNotEmpty(plateInfoVOS)) { - 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); - - }); - } + // 查询排单对应的大板板材信息以及 统计小板数量和面积 + List plateInfoVOS = planItemMapper.selectOrderPlanPlateList(planIds, getUserOrganId()); // 根据排单ID查询ES中的优化数据 @@ -628,45 +565,33 @@ public class PlanServiceImpl implements PlanService { List goodsId = Optional.ofNullable(pageReqVO.getGoodsIds()).orElse(new ArrayList<>()); List ids = new ArrayList<>(); - + // 查询类型:订单分组 + int type = OrderPlanQueryTypeEnum.ORDER_GROUP.getType(); if(CollUtil.isNotEmpty(goodsId)) { List orderIdList = Optional.ofNullable(pageReqVO.getOrderIds()).orElse(new ArrayList<>()); List goodsDOS = goodsMapper.selectListByGoodsId(orderIdList,goodsId, getUserOrganId()); ids.addAll(goodsDOS.stream().map(GoodsDO::getId).toList()); - + type = OrderPlanQueryTypeEnum.GOODS_GROUP.getType(); } - Integer pageNo = (pageReqVO.getPageNo() - 1) * pageReqVO.getPageSize(); - QueryWrapperX queryWrapperX = new QueryWrapperX<>(); queryWrapperX .eq(FIELD_ORGAN_ID,getUserOrganId()) .eq(FIELD_DELETED,false) .in(FIELD_STATUS,statusList) - .eq(FIELD_OP_DELETED,false) - .isNull(FIELD_PLAN_ID) - .isNotNull(FIELD_OP_ID) - .inIfPresent("op.goods_id",ids) + .inIfPresent("og.id",ids) .inIfPresent("o.id",pageReqVO.getOrderIds()) .likeIfPresent("o.id", pageReqVO.getOrderId() != null ? pageReqVO.getOrderId() : null) .likeIfPresent(FIELD_CUSTOMER, pageReqVO.getConsignee()) .likeIfPresent(FIELD_CUSTOM_ORDER_NO, pageReqVO.getDefaultId()) .likeIfPresent(FIELD_ADDRESS, pageReqVO.getConsigneeAddress()) .betweenIfPresent(FIELD_ORDER_DATE, pageReqVO.getCreateTime()); - - List orderRespVOCopies = planItemMapper.selectOrderList(queryWrapperX,pageNo,pageReqVO.getPageSize()); - - List sum = planItemMapper.selectOrderListCount(queryWrapperX); - - - if (CollUtil.isEmpty(orderRespVOCopies)) { - return new PageResult<>(); - } - - return new PageResult<>(orderRespVOCopies, (long) sum.size()); + PageDTO page = new PageDTO<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()); + IPage orderList = planItemMapper.selectOrderList(page, queryWrapperX, type); + return new PageResult<>(orderList.getRecords(), orderList.getTotal()); } @@ -687,38 +612,17 @@ public class PlanServiceImpl implements PlanService { QueryWrapperX queryWrapperX = new QueryWrapperX<>(); IPage orderGoodsResps = new PageDTO<>(); - if(CollUtil.isNotEmpty(pageReqVO.getRoomId()) || CollUtil.isNotEmpty(pageReqVO.getBodyId() )){ - - + if (CollUtil.isNotEmpty(pageReqVO.getRoomId()) || CollUtil.isNotEmpty(pageReqVO.getBodyId())) { + // 增加房间id、柜体id条件 queryWrapperX - .eq(FIELD_ORGAN_ID, getUserOrganId()) - .eq(FIELD_DELETED, false) - .in(FIELD_STATUS, statusList) - .eq(FIELD_OP_DELETED,false) - .isNull(FIELD_PLAN_ID) - .isNotNull(FIELD_OP_ID) - - .inIfPresent("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()); - + .inIfPresent("oi.order_id", pageReqVO.getOrderIds()) + .inIfPresent("oi.room_id", pageReqVO.getRoomId()) + .inIfPresent("oi.body_id", pageReqVO.getBodyId()); orderGoodsResps = planItemMapper.selectNoPlanGoodsByRoomAndBodyIds(page,queryWrapperX,getUserOrganId()); - }else { - queryWrapperX - .eq(FIELD_ORGAN_ID, getUserOrganId()) .eq(FIELD_DELETED, false) .in(FIELD_STATUS, statusList) - .eq(FIELD_OP_DELETED,false) - .isNull(FIELD_PLAN_ID) - .isNotNull(FIELD_OP_ID) - .inIfPresent("o.id", pageReqVO.getOrderIds()) .likeIfPresent("o.id", pageReqVO.getOrderId()) .likeIfPresent(FIELD_CUSTOMER, pageReqVO.getConsignee()) @@ -796,7 +700,7 @@ public class PlanServiceImpl implements PlanService { filterTypes += PlanFilterTypeEnum.TWODIMENSIONALCUTTINGPATH.getType().toString(); } - queryWrapperX.eq("opi.organ_id",getUserOrganId()) + queryWrapperX.eq("op.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) @@ -1034,7 +938,7 @@ public class PlanServiceImpl implements PlanService { @Override public List getPlanPlateList(Long planId) { - List plateResLists = planItemMapper.selectPlateListByPlateId(planId,getUserOrganId()); + List plateResLists = planItemMapper.selectPlateListByPlanId(planId,getUserOrganId()); if (CollUtil.isEmpty(plateResLists)) { return new ArrayList<>(); @@ -1229,6 +1133,7 @@ public class PlanServiceImpl implements PlanService { @Transactional(rollbackFor = Exception.class) public void deletePlanPlate(List deleteOrderPlateIds) { + Long organId = getUserOrganId(); List deletePlanIds = deleteOrderPlateIds.stream().map(OrderPlateIds::getPlanId).distinct().toList(); @@ -1258,7 +1163,7 @@ public class PlanServiceImpl implements PlanService { AssertUtils.notEmpty(deletePlateIds,DELETE_PLAN_PLATE_DATA_ERROR); - List deleteOrderIds = deleteOrderPlateIds.stream().map(OrderPlateIds::getOrderId).distinct().toList(); + Set deleteOrderIds = deleteOrderPlateIds.stream().map(OrderPlateIds::getOrderId).collect(Collectors.toSet()); AssertUtils.notEmpty(deleteOrderIds,DELETE_PLAN_PLATE_DATA_ERROR); @@ -1271,6 +1176,8 @@ public class PlanServiceImpl implements PlanService { AssertUtils.empty(plateDOList,PLAN_PLATE_IS_CUTTED); + // 移除排单板件 & 重新计算订单和材质下的数量和面积 + removePlanOrderAndGoodsPlate(plateDOS, deleteOrderIds); // 删除优化生产中未开料的小板的优化数据 List optimizeBoardModelDOS = esUtils.getEsDocument(FIELD_PLANID, deletePlanIds, processSize, ORDER_OPTIMIZE_PLATE_MODEL.getIndex(), OptimizeBoardModelDO.class); @@ -1316,88 +1223,47 @@ public class PlanServiceImpl implements PlanService { esDocumentService.bulkUpdate(ORDER_OPTIMIZE_PLATE_MODEL.getIndex(), optimizeBoardModelDOS); }catch (Exception e){ - log.error(e.getMessage()); + log.error(e.getMessage(), e); throw new ServiceException(ES_DATA_ERROR); } } + // 删除已无排单板件的排单 + List deleteEmptyPlanIdList = planMapper.countDeletePlanPlate(deletePlanIds, deleteOrderIds, organId) + .stream().filter(m -> m.getCount() == 0).map(OrderPlanPlateStatisticsRespVO::getPlanId).distinct().collect(Collectors.toList()); + + if (CollUtil.isNotEmpty(deleteEmptyPlanIdList)) { + planMapper.deleteBatchIds(deleteEmptyPlanIdList); + } + + // 更新排单下的订单列表 + List orderPlanOrderIdList = planMapper.selectPlanOrderIds(deletePlanIds, deleteOrderIds, organId); + if(CollUtil.isNotEmpty(orderPlanOrderIdList)){ + Map> planIdToOrderIds = orderPlanOrderIdList.stream() + .collect(Collectors.groupingBy( + row -> row.getPlanId(), + Collectors.mapping(OrderPlanPlateStatisticsRespVO::getOrderId, Collectors.toList()) + )); + for (Map.Entry> entry : planIdToOrderIds.entrySet()) { + Long planId = entry.getKey(); + String orderNos = entry.getValue().toString(); + + planMapper.update(new LambdaUpdateWrapper() + .eq(PlanDO::getId, planId) + .eq(PlanDO::getOrganId, organId) + .set(PlanDO::getOrderNos, orderNos)); + } + } // 修改排单加工方案的优化状态 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, null, 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_OPTIMIZE_PLATE_MODEL.getIndex()); - - + // 删除排单对应的优化生产数据 + if (CollUtil.isNotEmpty(deleteEmptyPlanIdList)) { + esUtils.deleteEsDocument(FIELD_PLANID, deleteEmptyPlanIdList, ORDER_OPTIMIZE_PLATE_MODEL.getIndex()); } - - - if(CollUtil.isNotEmpty(planIds)){ - - List planDOList = planDOS.stream().filter(f -> planIds.contains(f.getId())).toList(); - - - planDOList.forEach(f->{ - String string = planItemDOS.stream().filter(p -> f.getId().equals(p.getPlanId())).map(PlanItemDO::getOrderId).distinct().toList().toString(); - f.setOrderNos(string); - }); - - planMapper.updateBatch(planDOList); - - } - - - List orderIds = planItemMapper.selectOrderPlateList(deleteOrderIds, getUserOrganId()); - - 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); - } - - // 去除生产单板材造型对应的排单ID -// removePlateModelPlanId(deleteOrderIds,deletePlanIds,deletePlateIds); - } @@ -1410,7 +1276,7 @@ public class PlanServiceImpl implements PlanService { PlanDO planDO = validatePlan(insertPlanIds.get(0)); - List orderIds = new ArrayList<>(insertOrderPlateIds.stream().map(OrderPlateIds::getOrderId).distinct().toList()); + Set orderIds = insertOrderPlateIds.stream().map(OrderPlateIds::getOrderId).collect(Collectors.toSet()); if(planActualGoodsModelDO != null){ @@ -1425,31 +1291,31 @@ public class PlanServiceImpl implements PlanService { } - - List planItemDOS = new ArrayList<>(); - - insertOrderPlateIds.forEach(f->{ - planItemDOS.add(PlanItemDO.builder() - .plateId(f.getPlateId()) - .planId(f.getPlanId()) - .orderId(f.getOrderId()) - .goodsId(f.getId()) - .build()); - - }); - - + // 已开料排单修改为开料中 if(planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus())){ planDO.setStatus(PlanStatusEnum.OPENING.getStatus()); planDO.setProduceTime(null); } - + // 更新排单的订单id列表 orderIds.addAll(JSON.parseArray(planDO.getOrderNos()).toJavaList(Long.class).stream().distinct().toList()); planDO.setOrderNos(orderIds.stream().distinct().toList().toString()); + planMapper.update(new LambdaUpdateWrapper() + .eq(PlanDO::getOrganId,getUserOrganId()) + .eq(PlanDO::getId,planDO.getId()) + + .set(PlanDO::getProduceTime,planDO.getProduceTime()) + .set(PlanDO::getStatus,planDO.getStatus()) + .set(PlanDO::getType,planDO.getType()) + .set(PlanDO::getOrderNos,planDO.getOrderNos()) + .set(PlanDO::getFilter,planDO.getFilter()) + ); + + // 新增排单板件 & 重新计算订单和材质下的数量和面积 + insertPlanOrderAndGoodsPlate(planDO.getId(), insertOrderPlateIds, orderIds); // 有新添加的小板,修改优化信息的字段信息 try { @@ -1474,7 +1340,7 @@ public class PlanServiceImpl implements PlanService { elasticsearchClient.updateByQuery(request); }catch (Exception e){ - log.error(e.getMessage()); + log.error(e.getMessage(), e); throw new ServiceException(ES_DATA_ERROR); } @@ -1483,36 +1349,117 @@ public class PlanServiceImpl implements PlanService { // 修改排单加工方案的优化状态 updateProcessSchemeStatus(insertPlanIds); - planItemMapper.insertBatch(planItemDOS); - - planMapper.update(new LambdaUpdateWrapper() - .eq(PlanDO::getOrganId,getUserOrganId()) - .eq(PlanDO::getId,planDO.getId()) - - .set(PlanDO::getProduceTime,planDO.getProduceTime()) - .set(PlanDO::getStatus,planDO.getStatus()) - .set(PlanDO::getType,planDO.getType()) - .set(PlanDO::getOrderNos,planDO.getOrderNos()) - .set(PlanDO::getFilter,planDO.getFilter()) - ); - // 生产单板材造型信息增加排单ID // insertPlateModelPlanId(orderIds,insertPlateIds,insertPlanIds.get(0)); } + /** + * 新增排单板件 & 重新计算订单和材质下的数量和面积 + * @param planId + * @param insertOrderPlateIds + * @param orderIds + */ + private void insertPlanOrderAndGoodsPlate(Long planId, List insertOrderPlateIds, Set orderIds) { + // 根据orderGoodsId分组 + Map> groupedPlates = insertOrderPlateIds.stream().collect(Collectors.groupingBy(OrderPlateIds::getId)); + for (Map.Entry> entry : groupedPlates.entrySet()) { + Long orderGoodsId = entry.getKey(); + List plates = entry.getValue(); + // 查询version + GoodsDO goodsDO = goodsMapper.selectById(orderGoodsId); + List groupedPlateIdList = plates.stream().map(OrderPlateIds::getPlateId).toList(); + // 排单id更新到小板信息中 + List> batchPlanPlateIdList = batchProcess(groupedPlateIdList); + for (List plateIdList : batchPlanPlateIdList) { + int updatePlateNum = plateMapper.update(new LambdaUpdateWrapper() + .in(PlateDO::getId, plateIdList) + .eq(PlateDO::getPlanId, 0) + .set(PlateDO::getPlanId, planId)); + if (updatePlateNum != plateIdList.size()) { + throw new ServiceException(CREAT_PLAN_PLATE_DATA_ERROR); + } + int version = goodsDO.getVersion(); + // 统计每个order_goods下的未排单面积,更新到order_goods中 + OrderPlanPlateNumAndAreaRespVO goodsPlateNumAndAreaPlanInfo = goodsMapper.selectPlannedPlateNumAndArea(orderGoodsId); + int update = goodsMapper.update(new LambdaUpdateWrapper() + .eq(GoodsDO::getId, orderGoodsId) + .eq(GoodsDO::getVersion, version) + .set(GoodsDO::getPlannedPlateArea, goodsPlateNumAndAreaPlanInfo.getArea()) + .set(GoodsDO::getPlannedPlateNum, goodsPlateNumAndAreaPlanInfo.getNum()) + .set(GoodsDO::getVersion, version + 1)); + if (update == 0) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.GOODS_PLATE_UPDATE_CONCURRENCY_ERROR, orderGoodsId); + } + } + } + // 统计更新orders的小板数量和面积 + computeOrderInfo(orderIds); + } + /** + * 移除排单板件 & 重新计算订单和材质下的数量和面积 + * + * @param plateDOS + * @param orderIds + */ + private void removePlanOrderAndGoodsPlate(List plateDOS, Set orderIds) { + // 根据planId分组 + Map> groupedPlates = plateDOS.stream().collect(Collectors.groupingBy(PlateDO::getPlanId)); + for (Map.Entry> entry : groupedPlates.entrySet()) { + Long planId = entry.getKey(); + List plates = entry.getValue(); + // 根据goodsId分组 + Map> groupedPlatesByGoodsId = plates.stream().collect(Collectors.groupingBy(PlateDO::getGoodsId)); + for (Map.Entry> entryByGoodsId : groupedPlatesByGoodsId.entrySet()) { + Long orderGoodsId = entryByGoodsId.getKey(); + List platesByGoodsId = entryByGoodsId.getValue(); + + // 查询version + GoodsDO goodsDO = goodsMapper.selectById(orderGoodsId); + List groupedPlateIdList = platesByGoodsId.stream().map(PlateDO::getId).toList(); + // 排单id更新到小板信息中 + List> batchPlanPlateIdList = batchProcess(groupedPlateIdList); + for (List plateIdList : batchPlanPlateIdList) { + int updatePlateNum = plateMapper.update(new LambdaUpdateWrapper() + .in(PlateDO::getId, plateIdList) + .eq(PlateDO::getPlanId, planId) + .set(PlateDO::getPlanId, 0) + .set(PlateDO::getIsOptimized, false)); + if (updatePlateNum != plateIdList.size()) { + throw new ServiceException(CREAT_PLAN_PLATE_DATA_ERROR); + } + } + + int version = goodsDO.getVersion(); + // 统计每个order_goods下的未排单面积,更新到order_goods中 + OrderPlanPlateNumAndAreaRespVO goodsPlateNumAndAreaPlanInfo = goodsMapper.selectPlannedPlateNumAndArea(orderGoodsId); + int update = goodsMapper.update(new LambdaUpdateWrapper() + .eq(GoodsDO::getId, orderGoodsId) + .eq(GoodsDO::getVersion, version) + .set(GoodsDO::getPlannedPlateArea, goodsPlateNumAndAreaPlanInfo.getArea()) + .set(GoodsDO::getPlannedPlateNum, goodsPlateNumAndAreaPlanInfo.getNum()) + .set(GoodsDO::getVersion, version + 1)); + if (update == 0) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.GOODS_PLATE_UPDATE_CONCURRENCY_ERROR, orderGoodsId); + } + } + } + + // 统计更新orders的小板数量和面积 + computeOrderInfo(orderIds); + } public static Map> groupByMaterialAndThickness(List items) { Map> groupedItems = new HashMap<>(); for (SavePlanPlateList.GoodsItemList item : items) { // 将 material 和 thickness 组合成键 - String key = item.getMaterial() + "|" + item.getThickness(); + String key = item.getMaterial() + "|" + item.getThickness()+ "|" + item.getGoodsId(); // 如果键不存在,初始化一个新的列表 groupedItems.putIfAbsent(key, new ArrayList<>()); @@ -1521,9 +1468,6 @@ public class PlanServiceImpl implements PlanService { groupedItems.get(key).add(item.getId()); } - // 过滤掉只包含一个 id 的分组(可选,视需求) -// groupedItems.entrySet().removeIf(entry -> entry.getValue().size() < 2); - return groupedItems; } @@ -1532,7 +1476,7 @@ public class PlanServiceImpl implements PlanService { for (SavePlanPlateList.GoodsItemList item : items) { // 将 material 和 thickness 组合成键 - String key = item.getThickness().toString(); + String key = item.getThickness().toString()+ "|" + item.getGoodsId(); // 如果键不存在,初始化一个新的列表 groupedItems.putIfAbsent(key, new ArrayList<>()); @@ -1595,7 +1539,7 @@ public class PlanServiceImpl implements PlanService { for (SavePlanPlateList.GoodsItemList item : items) { // 将 material 和 thickness 组合成键 - String key = item.getMaterial() + "|" + item.getThickness(); + String key = item.getMaterial() + "|" + item.getThickness() + "|" + item.getGoodsId(); // 如果键不存在,初始化一个新的列表 groupedItems.putIfAbsent(key, new ArrayList<>()); @@ -1604,7 +1548,7 @@ public class PlanServiceImpl implements PlanService { groupedItems.get(key).add(item.getId()); } - // 过滤掉只包含一个 id 的分组(可选,视需求) + // 只留混单的材质 groupedItems.entrySet().removeIf(entry -> entry.getValue().size() > 1); return groupedItems; @@ -1616,7 +1560,7 @@ public class PlanServiceImpl implements PlanService { for (SavePlanPlateList.GoodsItemList item : items) { // 将 material 和 thickness 组合成键 - String key = item.getThickness().toString(); + String key = item.getThickness().toString()+ "|" + item.getGoodsId(); // 如果键不存在,初始化一个新的列表 groupedItems.putIfAbsent(key, new ArrayList<>()); @@ -1625,7 +1569,7 @@ public class PlanServiceImpl implements PlanService { groupedItems.get(key).add(item.getId()); } - // 过滤掉只包含一个 id 的分组(可选,视需求) + // 只留混单的材质 groupedItems.entrySet().removeIf(entry -> entry.getValue().size() > 1); return groupedItems; @@ -1639,7 +1583,7 @@ public class PlanServiceImpl implements PlanService { for (SavePlanPlateList.GoodsItemList item : items) { // 将 material 和 thickness 组合成键 - String key = item.getMaterial() + "|" + item.getThickness() + "|" + item.getColor()+ "|" + item.getBrand(); + String key = item.getMaterial() + "|" + item.getThickness() + "|" + item.getColor()+ "|" + item.getBrand() + "|" + item.getGoodsId(); // 如果键不存在,初始化一个新的列表 groupedItems.putIfAbsent(key, new ArrayList<>()); @@ -1656,8 +1600,6 @@ public class PlanServiceImpl implements PlanService { // 混单时判断是否进行板材对应并创建排单 private void mixConfigPlateCorresponding(List planActualGoodsLists, - List planActualGoodsModelDOS, - List planItemDOS, List plateItemList, List goodsItemList, List planDOS, @@ -1671,7 +1613,7 @@ public class PlanServiceImpl implements PlanService { if(CollUtil.isNotEmpty(planActualGoodsLists)) { // 有选实际大板的小板加大板创建排单 - getCreatePlanMultipleGoodsList(planActualGoodsLists,planItemDOS,plateItemList,planActualGoodsModelDOS,planDOS,processId,loginUser); + getCreatePlanMultipleGoodsList(planActualGoodsLists, plateItemList, planDOS, processId, loginUser); // 没有选择实际大板的创建排单 if(MixConfigTypeEnum.SAMEMATERIALANDTHICKNESS.equals(mixedType)){ @@ -1684,7 +1626,7 @@ public class PlanServiceImpl implements PlanService { } if(CollUtil.isNotEmpty(grouped)) { - createPlanAndPlateDataList(grouped,planItemDOS,plateItemList,planDOS,processId,loginUser,PlanTypeEnum.ORDERPLAN.getType()); + createPlanAndPlateDataList(grouped, plateItemList, planDOS, processId, loginUser, PlanTypeEnum.ORDERPLAN.getType()); } }else { @@ -1699,7 +1641,7 @@ public class PlanServiceImpl implements PlanService { } - createPlanAndPlateDataList(grouped,planItemDOS,plateItemList,planDOS,processId,loginUser,PlanTypeEnum.ORDERPLAN.getType()); + createPlanAndPlateDataList(grouped, plateItemList, planDOS, processId, loginUser, PlanTypeEnum.ORDERPLAN.getType()); } @@ -1721,7 +1663,7 @@ public class PlanServiceImpl implements PlanService { List fieldValues = planIds.stream().map(FieldValue::of).toList(); - builder.index(PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL.getName()) + builder.index(PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL.getIndex()) .query(qb -> qb.bool(bq -> bq .filter(mq -> mq.terms(tq -> tq.field(FIELD_PLANID).terms(t->t.value(fieldValues)))) .filter(mq -> mq.match(mtq -> mtq.field("machineType").query(MachineTypeEnum.CUTTING.getType()))) @@ -1737,7 +1679,7 @@ public class PlanServiceImpl implements PlanService { elasticsearchClient.updateByQuery(request); }catch (Exception e){ - log.error("排单加工方案状态更新异常:"+e.getMessage()); + log.error("排单加工方案状态更新异常:" + e.getMessage(), e); throw new ServiceException(DATA_DATA_ERROR); } @@ -1869,63 +1811,72 @@ public class PlanServiceImpl implements PlanService { private void getCreatePlanMultipleGoodsList(List planActualGoodsLists, - List planItemDOS, List plateItemList, - List planActualGoodsModelDOS , List planDOS, Long processId, LoginUser loginUser) { + Set orderIdSet = new HashSet<>(); planActualGoodsLists.forEach(f -> { // 查找和大板分类ID相同的小板的数据 List plateList = plateItemList.stream().filter(p -> f.getIds().contains(p.getId())).toList(); - List orderIdList = plateList.stream().map(SavePlanPlateList.PlateItemList::getOrderId).distinct().toList(); + Set planOrderIdSet = new HashSet<>(); + Map> goodsPlateIdMap = new HashMap<>(); + for (SavePlanPlateList.PlateItemList savePlanPlate : plateList) { + Long orderId = savePlanPlate.getOrderId(); + // 累计排单下的订单号 + planOrderIdSet.add(orderId); + // 累计发生改变的订单号 + orderIdSet.add(orderId); + + // 累计商品id下的订单号 + List goodsPlateIdList = goodsPlateIdMap.get(savePlanPlate.getId()); + if(CollUtil.isEmpty(goodsPlateIdList)) { + goodsPlateIdList = new ArrayList<>(); + goodsPlateIdList.add(savePlanPlate.getPlateId()); + goodsPlateIdMap.put(savePlanPlate.getId(), goodsPlateIdList); + } else { + goodsPlateIdList.add(savePlanPlate.getPlateId()); + } + } AtomicLong sort = new AtomicLong(System.currentTimeMillis()); sort.addAndGet(1); Long planId = (Long) identifierGenerator.nextId(null); + // 大板商品id + String goodsId = f.getPlanActualGoodsModelDO().getGoodsId(); + // 创建排单 planDOS.add(PlanDO.builder() .id(planId) .sort(sort.get()) .type(PlanTypeEnum.MIXEDORDERPLAN.getType()) .processId(processId) - .orderNos(orderIdList.toString()) + .orderNos(planOrderIdSet.toString()) .produceTime(null) .status(PlanStatusEnum.NOCUTTING.getStatus()) .operator(loginUser.getNickname()) .planTime(LocalDateTime.now()) + .goodsId(goodsId) .build()); - plateList.forEach(i -> - planItemDOS.add(PlanItemDO.builder() - .planId(planId) - .plateId(i.getPlateId()) - .orderId(i.getOrderId()) - .goodsId(i.getId()) - .build())); - - if (f.getPlanActualGoodsModelDO() != null) { - - planActualGoodsModelDOS.add(f.getPlanActualGoodsModelDO().setPlanId(planId)); - - } + // 更新板件排单id & 统计更新order_goods的数量和面积 + computePlatePlanAndComputeOrderGoodsInfo(planId, goodsPlateIdMap); }); - - + // 统计更新orders的小板数量和面积 + computeOrderInfo(orderIdSet); } private void createPlanAndPlateDataList(Map> grouped, - List planItemDOS, List plateItemList, List planDOS, Long processId, @@ -1934,42 +1885,163 @@ public class PlanServiceImpl implements PlanService { AtomicLong sort = new AtomicLong(System.currentTimeMillis()); + Set orderIdSet = new HashSet<>(); + // 进行数据处理: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(); + Set planOrderIdSet = new HashSet<>(); + Map> goodsPlateIdMap = new HashMap<>(); + for (SavePlanPlateList.PlateItemList savePlanPlate : plateList) { + Long orderId = savePlanPlate.getOrderId(); + // 累计排单下的订单号 + planOrderIdSet.add(orderId); + // 累计发生改变的订单号 + orderIdSet.add(orderId); + + // 累计商品id下的订单号 + List goodsPlateIdList = goodsPlateIdMap.get(savePlanPlate.getId()); + if(CollUtil.isEmpty(goodsPlateIdList)) { + goodsPlateIdList = new ArrayList<>(); + goodsPlateIdList.add(savePlanPlate.getPlateId()); + goodsPlateIdMap.put(savePlanPlate.getId(), goodsPlateIdList); + } else { + goodsPlateIdList.add(savePlanPlate.getPlateId()); + } + } sort.addAndGet(1); Long planId = (Long) identifierGenerator.nextId(null); + // String key = item.getMaterial() + "|" + item.getThickness() + "|" + item.getColor()+ "|" + item.getBrand() + "|" + item.getGoodsId(); + // 截取key中的goodsId + String goodsId = key.substring(key.lastIndexOf("|") + 1); + // 创建排单 planDOS.add(PlanDO.builder() .id(planId) .sort(sort.get()) .type(planType) .processId(processId) - .orderNos(orderIdList.toString()) + .orderNos(planOrderIdSet.toString()) .produceTime(null) .status(PlanStatusEnum.NOCUTTING.getStatus()) .operator(loginUser.getNickname()) .planTime(LocalDateTime.now()) + .goodsId(goodsId) .build()); - plateList.forEach(i -> - planItemDOS.add(PlanItemDO.builder() - .planId(planId) - .plateId(i.getPlateId()) - .orderId(i.getOrderId()) - .goodsId(i.getId()) - .build())); - + // 更新板件排单id & 统计更新order_goods的数量和面积 + computePlatePlanAndComputeOrderGoodsInfo(planId, goodsPlateIdMap); }); - + // 统计更新orders的小板数量和面积 + computeOrderInfo(orderIdSet); } + /** + * 更新板件排单id & 统计更新order_goods的小板数量和面积 + * + * @param planId + * @param goodsPlateIdMap + */ + public void computePlatePlanAndComputeOrderGoodsInfo(Long planId, Map> goodsPlateIdMap) { + for (Map.Entry> entry : goodsPlateIdMap.entrySet()) { + Long orderGoodsId = entry.getKey(); + // 查询version + GoodsDO goodsDO = goodsMapper.selectById(orderGoodsId); + List groupedPlateIdList = entry.getValue(); + // 排单id更新到小板信息中 + List> batchPlanPlateIdList = batchProcess(groupedPlateIdList); + for (List plateIdList : batchPlanPlateIdList) { + int updatePlateNum = plateMapper.update(new LambdaUpdateWrapper() + .in(PlateDO::getId, plateIdList) + .eq(PlateDO::getPlanId, 0) + .set(PlateDO::getPlanId, planId)); + if (updatePlateNum != plateIdList.size()) { + throw new ServiceException(CREAT_PLAN_PLATE_DATA_ERROR); + } + } + + int version = goodsDO.getVersion(); + // 统计每个order_goods下的未排单面积,更新到order_goods中 + OrderPlanPlateNumAndAreaRespVO goodsPlateNumAndAreaPlanInfo = goodsMapper.selectPlannedPlateNumAndArea(orderGoodsId); + int update = goodsMapper.update(new LambdaUpdateWrapper() + .eq(GoodsDO::getId, orderGoodsId) + .eq(GoodsDO::getVersion, version) + .set(GoodsDO::getPlannedPlateArea, goodsPlateNumAndAreaPlanInfo.getArea()) + .set(GoodsDO::getPlannedPlateNum, goodsPlateNumAndAreaPlanInfo.getNum()) + .set(GoodsDO::getVersion, version + 1)); + if (update == 0) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.CREATE_PLAN_GOODS_UPDATE_CONCURRENCY_ERROR, orderGoodsId); + } + } + } + + /** + * 统计更新orders的小板数量和面积 + * + * @param orderIdSet + */ + public void computeOrderInfo(Set orderIdSet) { + for (Long orderId : orderIdSet) { + // 统计每个orders下的未排单面积,更新到orders中 + OrderDO orderDO = orderMapper.selectById(orderId); + OrderPlanPlateNumAndAreaRespVO orderPlateNumAndAreaPlanInfo = orderMapper.selectPlannedPlateNumAndArea(orderId); + + // 当前生产单下排单的板件数量 + Integer num = orderPlateNumAndAreaPlanInfo.getNum(); + + int version = orderDO.getVersion(); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper() + .eq(OrderDO::getId, orderId) + .eq(OrderDO::getVersion, version) + .set(OrderDO::getPlannedPlateArea, orderPlateNumAndAreaPlanInfo.getArea()) + .set(OrderDO::getPlannedPlateNum, num) + .set(OrderDO::getVersion, version + 1); + Integer orderDOStatus = orderDO.getStatus(); + // 更新生产单排单状态 + if (ObjectUtil.notEqual(orderDOStatus, OrderStatusEnum.IN_PRODUCTION.getStatus()) && ObjectUtil.notEqual(orderDOStatus, OrderStatusEnum.SORTED.getStatus())) { + // 如果生产单下已经没有排单板件,更新生产单为新单 + if (num == 0) { + updateWrapper.set(OrderDO::getStatus, OrderStatusEnum.NEW_ORDER.getStatus()); + } else { + updateWrapper.set(OrderDO::getStatus, OrderStatusEnum.SORTED.getStatus()); + } + } + int update = orderMapper.update(updateWrapper); + if (update == 0) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.CREATE_PLAN_ORDER_UPDATE_CONCURRENCY_ERROR, orderId); + } + } + } + + /** + * 拆分list,每个1000条 + * + * @param dataList + * @param + * @return + */ + private List> batchProcess(List dataList) { + List> resultList = new ArrayList<>(); + if (CollUtil.isEmpty(dataList)) { + return resultList; + } + + int total = dataList.size(); + for (int i = 0; i < total; i += 1000) { + int end = Math.min(i + 1000, total); + List subList = dataList.subList(i, end); + + if (!subList.isEmpty()) { + resultList.add(subList); + } + } + return resultList; + } } \ 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 ccd56ad91..cd5f53249 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 @@ -1,12 +1,14 @@ package com.cf.imes.module.executor.service.plate; import cn.hutool.core.collection.CollUtil; +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.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.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; @@ -16,13 +18,11 @@ import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; 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.id.core.util.SnowflakeIdWorker3rd; -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.module.executor.controller.admin.goods.vo.GoodsSaveReqVO; -import com.cf.imes.module.executor.controller.admin.plan.vo.OrderGoodsResp; +import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPlanPlateNumAndAreaRespVO; 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; @@ -31,7 +31,6 @@ 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; @@ -39,14 +38,11 @@ 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; import com.cf.imes.module.executor.enums.OrderStatusEnum; import com.cf.imes.module.executor.service.order.OrderInputProcessor; -import com.cf.imes.module.executor.service.plan.PlanService; -import com.cf.imes.module.executor.util.elasticsearch.EsUtils; import com.cf.imes.module.system.enums.ErrorCodeConstants; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -98,9 +94,6 @@ public class PlateServiceImpl implements PlateService { @Resource private OrderMapper orderMapper; - @Resource - private PlanItemMapper planItemMapper; - @Resource private SnowflakeIdWorker3rd idWorker; @@ -108,18 +101,9 @@ public class PlateServiceImpl implements PlateService { @Resource private ElasticsearchClient elasticsearchClient; - @Resource - private PlanService planService; - - @Resource - private ESDocumentService esDocumentService; - @Resource private OrderInputProcessor orderInputProcessor; - @Resource - private EsUtils esUtils; - @Resource private IdentifierGenerator identifierGenerator; @@ -151,7 +135,7 @@ public class PlateServiceImpl implements PlateService { @Override @Transactional(rollbackFor = Exception.class) - public void deletePlate(List plateIds,Long planId) { + public void deletePlate(List plateIds, Long planId) { if(CollUtil.isEmpty(plateIds)){ return; @@ -207,22 +191,108 @@ public class PlateServiceImpl implements PlateService { orderItemMapper.deleteByPlateId(plateIdList, orderIds, getUserOrganId()); // 删除添加自增板时新增的大板ID - List plateId = goodsMapper.selectInsertGoodsIds(orderIds, goodsIds, getUserOrganId()); - - - if(CollUtil.isNotEmpty(plateId)){ - goodsMapper.deleteBatchIds(plateId); + List orderGoodsIdList = goodsMapper.selectInsertGoodsIds(orderIds, goodsIds, getUserOrganId()); + if(CollUtil.isNotEmpty(orderGoodsIdList)){ + goodsMapper.deleteBatchIds(orderGoodsIdList); } + // 统计更新板件数量和面积 + computePlatePlanAndComputeOrderGoodsInfo(plateDOS.stream() + .collect(Collectors.groupingBy( + PlateDO::getGoodsId, + Collectors.mapping(PlateDO::getId, Collectors.toList()) + ))); + computeOrderInfo(orderIds); - // 删除排单和板材明细的小板信息 - planItemMapper.delete(new LambdaQueryWrapperX() - .eq(PlanItemDO::getOrganId, getUserOrganId()) - .in(PlanItemDO::getOrderId,orderIds) - .in(PlanItemDO::getPlateId,plateIdList) - .eq(PlanItemDO::getPlanId, planId)); + } + /** + * 统计更新order_goods的小板数量和面积 + * + * @param goodsPlateIdMap + */ + public void computePlatePlanAndComputeOrderGoodsInfo(Map> goodsPlateIdMap) { + for (Map.Entry> entry : goodsPlateIdMap.entrySet()) { + Long orderGoodsId = entry.getKey(); + // 查询version + GoodsDO goodsDO = goodsMapper.selectById(orderGoodsId); + int version = goodsDO.getVersion(); + // 统计每个order_goods下的未排单面积,更新到order_goods中 + OrderPlanPlateNumAndAreaRespVO goodsPlateNumAndAreaPlanInfo = goodsMapper.selectPlannedPlateNumAndArea(orderGoodsId); + int update = goodsMapper.update(new LambdaUpdateWrapper() + .eq(GoodsDO::getId, orderGoodsId) + .eq(GoodsDO::getVersion, version) + .set(GoodsDO::getPlannedPlateArea, goodsPlateNumAndAreaPlanInfo.getArea()) + .set(GoodsDO::getPlannedPlateNum, goodsPlateNumAndAreaPlanInfo.getNum()) + .set(GoodsDO::getVersion, version + 1)); + if (update == 0) { + throw ServiceExceptionUtil.exception(com.cf.imes.module.executor.enums.ErrorCodeConstants.GOODS_PLATE_UPDATE_CONCURRENCY_ERROR, orderGoodsId); + } + } + } + + /** + * 统计更新orders的小板数量和面积 + * + * @param orderIdList + */ + public void computeOrderInfo(List orderIdList) { + for (Long orderId : orderIdList) { + // 统计每个orders下的未排单面积,更新到orders中 + OrderDO orderDO = orderMapper.selectById(orderId); + OrderPlanPlateNumAndAreaRespVO orderPlateNumAndAreaPlanInfo = orderMapper.selectPlannedPlateNumAndArea(orderId); + + // 当前生产单下排单的板件数量 + Integer num = orderPlateNumAndAreaPlanInfo.getNum(); + + int version = orderDO.getVersion(); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper() + .eq(OrderDO::getId, orderId) + .eq(OrderDO::getVersion, version) + .set(OrderDO::getPlannedPlateArea, orderPlateNumAndAreaPlanInfo.getArea()) + .set(OrderDO::getPlannedPlateNum, num) + .set(OrderDO::getVersion, version + 1); + Integer orderDOStatus = orderDO.getStatus(); + // 更新生产单排单状态 + if (ObjectUtil.notEqual(orderDOStatus, OrderStatusEnum.IN_PRODUCTION.getStatus()) && ObjectUtil.notEqual(orderDOStatus, OrderStatusEnum.SORTED.getStatus())) { + // 如果生产单下已经没有排单板件,更新生产单为新单 + if (num == 0) { + updateWrapper.set(OrderDO::getStatus, OrderStatusEnum.NEW_ORDER.getStatus()); + } else { + updateWrapper.set(OrderDO::getStatus, OrderStatusEnum.SORTED.getStatus()); + } + } + int update = orderMapper.update(updateWrapper); + if (update == 0) { + throw ServiceExceptionUtil.exception(com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_PLATE_UPDATE_CONCURRENCY_ERROR, orderId); + } + } + } + + /** + * 拆分list,每个1000条 + * + * @param dataList + * @param + * @return + */ + private List> batchProcess(List dataList) { + List> resultList = new ArrayList<>(); + if (CollUtil.isEmpty(dataList)) { + return resultList; + } + + int total = dataList.size(); + for (int i = 0; i < total; i += 1000) { + int end = Math.min(i + 1000, total); + List subList = dataList.subList(i, end); + + if (!subList.isEmpty()) { + resultList.add(subList); + } + } + return resultList; } private void validatePlateExists(Long id) { @@ -265,7 +335,6 @@ public class PlateServiceImpl implements PlateService { .eq("o.organ_id",organId) .eq("o.deleted",false) .in("o.status",statusList) - .isNull("opi.plan_id") .isNotNull("op.id") .eq("op.deleted",false); @@ -274,37 +343,40 @@ public class PlateServiceImpl implements PlateService { Long planId = pageReqVO.getPlanId(); - List goodsRespVOS = planMapper.selectPlanGoodsList(planId, organId); - - AssertUtils.notEmpty(goodsRespVOS,PLAN_NOT_EXISTS); - PlanDO planDO = planMapper.selectById(planId); - AssertUtils.notEmpty(planDO,PLAN_NOT_EXISTS); + AssertUtils.notEmpty(planDO, PLAN_NOT_EXISTS); + List planGoods = plateGoodMapper.selectList(new LambdaQueryWrapper() + .eq(PlateGoodDO::getGoodsId, planDO.getGoodsId()) + .eq(PlateGoodDO::getOrganId, organId) + .eq(PlateGoodDO::getDeleted, false) + .orderByAsc(PlateGoodDO::getCreateTime)); + AssertUtils.notEmpty(planGoods, PLAN_NOT_EXISTS); - List material = goodsRespVOS.stream().map(OrderGoodsResp::getMaterial).distinct().toList(); + PlateGoodDO planGood = planGoods.get(0); + String material = planGood.getMaterial(); - List color = goodsRespVOS.stream().map(OrderGoodsResp::getColor).distinct().toList(); + String color = planGood.getColor(); - List brand = goodsRespVOS.stream().map(OrderGoodsResp::getBrand).distinct().toList(); + String brand = planGood.getBrand(); - List thickness = goodsRespVOS.stream().map(OrderGoodsResp::getThickness).distinct().toList(); + Double thickness = planGood.getThickness(); // 混单 if(planDO.getType().equals(PlanTypeEnum.MIXEDORDERPLAN.getType())){ // 混单添加查询条件 - mixedInsertQuery(pageReqVO,planDO,material,thickness,queryWrapperX); + mixedInsertQuery(pageReqVO, planDO, material, thickness, queryWrapperX); } // 非混单 else { // 非混单条件查询条件 - noMixedInsertQuery(pageReqVO,planDO,material,brand,color,thickness,queryWrapperX); + noMixedInsertQuery(pageReqVO, planDO, material, brand, color, thickness, queryWrapperX); } } @@ -335,7 +407,7 @@ public class PlateServiceImpl implements PlateService { .eqIfPresent("op.is_sculpt",pageReqVO.getIsSculpt()) .eqIfPresent("op.is_row_hole",pageReqVO.getIsRowHole()) .likeIfPresent("op.remark",pageReqVO.getRemark()) - .orderByDesc("o.id"); + .orderByDesc("o.id, op.id"); Integer pageNo = (pageReqVO.getPageNo() - 1) * pageReqVO.getPageSize(); @@ -455,8 +527,6 @@ public class PlateServiceImpl implements PlateService { List orderItemDOS = new ArrayList<>(); - List planItemDOS = new ArrayList<>(); - List insertPlateRespVOS = new ArrayList<>(); List orderBodyNumVOS = new ArrayList<>(); @@ -470,13 +540,16 @@ public class PlateServiceImpl implements PlateService { List orderIds = reqVO.stream().map(OptimizationSavePlateReqVO::getOrderId).distinct().toList(); - List planItemDOList = planItemMapper.selectPlanOrderGoodsList(planId, orderIds, getUserOrganId()); - - List goodsId = planItemDOList.stream().map(PlanItemDO::getGoodsId).distinct().toList(); + // 查询排单下的orderGoodsId列表 + List goodsId = planMapper.selectPlanOrderGoodsId(planId,orderIds, getUserOrganId()); List goodsDOS = goodsMapper.selectBatchIds(goodsId); + Map orderPlanPlateNumAndAreaRespVOMap = new HashMap<>(); + Map orderGoodsPlanPlateNumAndAreaRespVOMap = new HashMap<>(); + + // 组装新增数据 reqVO.forEach(f->{ Map plateIdAndNo = new HashMap<>(); @@ -504,6 +577,9 @@ public class PlateServiceImpl implements PlateService { plateIdAndNo.put(plateId.toString(),plateNo); + // 计算面积 + BigDecimal area = f.getWidth().multiply(f.getHeight()).movePointLeft(6).stripTrailingZeros(); + plateDOS.add(PlateDO.builder() .id(plateId) .orderId(orderId) @@ -515,7 +591,7 @@ public class PlateServiceImpl implements PlateService { .goodsId(goodsDO.getId()) .holeFace(f.getPlaceHole()) .remark(remake1 + remake2) - .area(f.getWidth().multiply(f.getHeight()).movePointLeft(6).stripTrailingZeros()) + .area(area) .width(f.getWidth()) .height(f.getHeight()) .texture(f.getTexture()) @@ -523,6 +599,7 @@ public class PlateServiceImpl implements PlateService { .sealRight(f.getSealRight()) .sealUp(f.getSealUp()) .sealDown(f.getSealDown()) + .planId(f.getPlanId()) .build()); @@ -546,21 +623,21 @@ public class PlateServiceImpl implements PlateService { .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(plateIdAndNo) .build()); - }); + // 累加生产单板数和面积 + orderPlanPlateNumAndAreaRespVOMap.putIfAbsent(orderId, new OrderPlanPlateNumAndAreaRespVO(0, BigDecimal.ZERO)); + OrderPlanPlateNumAndAreaRespVO orderPlanPlateNumAndAreaRespVO = orderPlanPlateNumAndAreaRespVOMap.get(orderId); + orderPlanPlateNumAndAreaRespVO.setArea(orderPlanPlateNumAndAreaRespVO.getArea().add(area)).setNum(orderPlanPlateNumAndAreaRespVO.getNum() + 1); + // 累加订单材质板数和面积 + orderGoodsPlanPlateNumAndAreaRespVOMap.putIfAbsent(orderId, new OrderPlanPlateNumAndAreaRespVO(0, BigDecimal.ZERO)); + OrderPlanPlateNumAndAreaRespVO orderGoodsPlanPlateNumAndAreaRespVO = orderGoodsPlanPlateNumAndAreaRespVOMap.get(orderId); + orderGoodsPlanPlateNumAndAreaRespVO.setArea(orderGoodsPlanPlateNumAndAreaRespVO.getArea().add(area)).setNum(orderGoodsPlanPlateNumAndAreaRespVO.getNum() + 1); + }); plateMapper.insertBatch(plateDOS); @@ -584,16 +661,71 @@ public class PlateServiceImpl implements PlateService { orderBodyMapper.updateBatch(orderBodyDOS); - - planItemMapper.insertBatch(planItemDOS); - orderItemMapper.insertBatch(orderItemDOS); + // 更新生产单和材质板数量和面积 + updateOrdersPlanPlateNumAndArea(orderPlanPlateNumAndAreaRespVOMap); + updateOrderGoodsPlanPlateNumAndArea(orderGoodsPlanPlateNumAndAreaRespVOMap); + orderInputProcessor.batchSaveModel(orderPlateModelDOS); return insertPlateRespVOS; } + /** + * 更新生产单板件数量和面积 + * + * @param orderPlanPlateNumAndAreaRespVOS + */ + private void updateOrdersPlanPlateNumAndArea(Map orderPlanPlateNumAndAreaRespVOS) { + for (Map.Entry entry : orderPlanPlateNumAndAreaRespVOS.entrySet()) { + Long orderId = entry.getKey(); + OrderDO orderDO = orderMapper.selectById(orderId); + + OrderPlanPlateNumAndAreaRespVO orderPlateNumAndAreaPlanInfo = entry.getValue(); + + int version = orderDO.getVersion(); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper() + .eq(OrderDO::getId, orderId) + .eq(OrderDO::getVersion, version) + .set(OrderDO::getArea, orderPlateNumAndAreaPlanInfo.getArea().add(BigDecimal.valueOf(orderDO.getArea()))) + .set(OrderDO::getPlannedPlateArea, orderPlateNumAndAreaPlanInfo.getArea()) + .set(OrderDO::getPlannedPlateNum, orderPlateNumAndAreaPlanInfo.getNum()) + .set(OrderDO::getPlateNum, orderPlateNumAndAreaPlanInfo.getNum() + orderDO.getPlateNum()) + .set(OrderDO::getVersion, version + 1); + int update = orderMapper.update(updateWrapper); + if (update == 0) { + throw ServiceExceptionUtil.exception(com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_PLATE_UPDATE_CONCURRENCY_ERROR, orderId); + } + } + } + + /** + * 更新订单材质板件数量和面积 + * + * @param orderGoodsPlanPlateNumAndAreaRespVOS + */ + private void updateOrderGoodsPlanPlateNumAndArea(Map orderGoodsPlanPlateNumAndAreaRespVOS) { + for (Map.Entry entry : orderGoodsPlanPlateNumAndAreaRespVOS.entrySet()) { + Long orderGoodsId = entry.getKey(); + // 查询version + GoodsDO goodsDO = goodsMapper.selectById(orderGoodsId); + + int version = goodsDO.getVersion(); + OrderPlanPlateNumAndAreaRespVO goodsPlateNumAndAreaPlanInfo = entry.getValue(); + int update = goodsMapper.update(new LambdaUpdateWrapper() + .eq(GoodsDO::getId, orderGoodsId) + .eq(GoodsDO::getVersion, version) + .set(GoodsDO::getArea, goodsPlateNumAndAreaPlanInfo.getArea().add(BigDecimal.valueOf(goodsDO.getArea()))) + .set(GoodsDO::getPlannedPlateArea, goodsPlateNumAndAreaPlanInfo.getArea().add(BigDecimal.valueOf(goodsDO.getPlannedPlateArea()))) + .set(GoodsDO::getPlannedPlateNum, goodsPlateNumAndAreaPlanInfo.getNum() + goodsDO.getPlannedPlateNum()) + .set(GoodsDO::getPlateNum, goodsPlateNumAndAreaPlanInfo.getNum() + goodsDO.getPlateNum()) + .set(GoodsDO::getVersion, version + 1)); + if (update == 0) { + throw ServiceExceptionUtil.exception(com.cf.imes.module.executor.enums.ErrorCodeConstants.GOODS_PLATE_UPDATE_CONCURRENCY_ERROR, orderGoodsId); + } + } + } @@ -645,8 +777,8 @@ public class PlateServiceImpl implements PlateService { private void mixedInsertQuery(NoPlanPlatePageReqVO pageReqVO, PlanDO planDO, - List material, - List thickness, + String material, + Double thickness, QueryWrapperX queryWrapperX){ @@ -659,10 +791,10 @@ public class PlateServiceImpl implements PlateService { if(planDO.getFilter().equals(MixConfigTypeEnum.SAMEMATERIALANDTHICKNESS.getType())){ queryWrapperX - .inIfPresent(FIELD_OG_MATERIAL,material) + .eqIfPresent(FIELD_OG_MATERIAL,material) .likeIfPresent(FIELD_OG_BRAND,pageReqVO.getBrand()) .likeIfPresent(FIELD_OG_COLOR,pageReqVO.getColor()) - .inIfPresent(FIELD_OP_THICKNESS,thickness); + .eqIfPresent(FIELD_OP_THICKNESS,thickness); } // 相同厚度 @@ -672,7 +804,7 @@ public class PlateServiceImpl implements PlateService { .likeIfPresent(FIELD_OG_MATERIAL,pageReqVO.getMaterial()) .likeIfPresent(FIELD_OG_BRAND,pageReqVO.getBrand()) .likeIfPresent(FIELD_OG_COLOR,pageReqVO.getColor()) - .inIfPresent(FIELD_OP_THICKNESS,thickness); + .eqIfPresent(FIELD_OP_THICKNESS,thickness); } @@ -685,10 +817,10 @@ public class PlateServiceImpl implements PlateService { private void noMixedInsertQuery(NoPlanPlatePageReqVO pageReqVO, PlanDO planDO, - List material, - List brand, - List color, - List thickness, + String material, + String brand, + String color, + Double thickness, QueryWrapperX queryWrapperX){ // 是否开启混单 @@ -701,10 +833,10 @@ public class PlateServiceImpl implements PlateService { // 相同材质和厚度 混单 if(pageReqVO.getMixedType().equals(MixConfigTypeEnum.SAMEMATERIALANDTHICKNESS.getType())){ queryWrapperX - .inIfPresent(FIELD_OG_MATERIAL, material) + .eqIfPresent(FIELD_OG_MATERIAL, material) .likeIfPresent(FIELD_OG_BRAND, pageReqVO.getBrand()) .likeIfPresent(FIELD_OG_COLOR, pageReqVO.getColor()) - .inIfPresent(FIELD_OP_THICKNESS, thickness); + .eqIfPresent(FIELD_OP_THICKNESS, thickness); } // 相同厚度 混单 @@ -713,21 +845,19 @@ public class PlateServiceImpl implements PlateService { .likeIfPresent(FIELD_OG_MATERIAL, pageReqVO.getMaterial()) .likeIfPresent(FIELD_OG_BRAND, pageReqVO.getBrand()) .likeIfPresent(FIELD_OG_COLOR, pageReqVO.getColor()) - .inIfPresent(FIELD_OP_THICKNESS, thickness); + .eqIfPresent(FIELD_OP_THICKNESS, thickness); } }else { queryWrapperX - .inIfPresent(FIELD_OG_MATERIAL, material) - .inIfPresent(FIELD_OG_BRAND, brand) - .inIfPresent(FIELD_OG_COLOR, color) - .inIfPresent(FIELD_OP_THICKNESS, thickness); + .eqIfPresent(FIELD_OG_MATERIAL, material) + .eqIfPresent(FIELD_OG_BRAND, brand) + .eqIfPresent(FIELD_OG_COLOR, color) + .eqIfPresent(FIELD_OP_THICKNESS, thickness); } } - - } \ 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/fileConversion/admin/api/webcad/ApiTypeRealize.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/api/webcad/ApiTypeRealize.java index dbade5660..dbe244a39 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/api/webcad/ApiTypeRealize.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/api/webcad/ApiTypeRealize.java @@ -110,7 +110,8 @@ public class ApiTypeRealize { ApiDataTypeVo platesData = results.get("plate").get(); // 判断是不是空单 - if (order.getOrderDO().getStatus() == 0) { + OrderDO orderDO = order.getOrderDO(); + if (orderDO.getStatus() == 0) { return order; } @@ -122,7 +123,8 @@ public class ApiTypeRealize { // 小板数据补充,order_goods_id添加造型相关数据判断获取,以及配件中添加goods_id // 用方法实现,小板中添加其他信息,以及更新goods_id - updateSmallBoardInfo(goodsData.getMapGoodsDO(), + updateSmallBoardInfo(orderDO, + goodsData.getMapGoodsDO(), plateDetailData.getMapPlateDetails(), platesData.getMapPlatesInfos(), plateDetailData.getMapPlateDetails()); @@ -198,7 +200,7 @@ public class ApiTypeRealize { // 结果整理 ApiDataTypeVo apiDataTypeVo = new ApiDataTypeVo(); - apiDataTypeVo.setOrderDO(order.getOrderDO()).setMapGoodsDO(goodsData.getMapGoodsDO()).setMapRawGoodsDO(goodsData.getMapRawGoodsDO()) + apiDataTypeVo.setOrderDO(orderDO).setMapGoodsDO(goodsData.getMapGoodsDO()).setMapRawGoodsDO(goodsData.getMapRawGoodsDO()) .setMapOrderBodyDO(mapOrderBodyDO).setMapOrderGroupDO(mapOrderGroupDO).setMapItem(mapItem) .setMapPartsInfos(partsData.getMapPartsInfos()).setMapPartRemarks(partsData.getMapPartRemarks()) .setMapPlateDetails(plateDetailData.getMapPlateDetails()).setMapPlatesInfos(platesData.getMapPlatesInfos()); @@ -207,7 +209,8 @@ public class ApiTypeRealize { } // 用方法实现,小板中添加其他信息,以及更新goods_id - private void updateSmallBoardInfo(Map mapGoodsDO, + private void updateSmallBoardInfo(OrderDO orderDO, + Map mapGoodsDO, Map mapPlateDetails, Map mapPlatesInfos, Map mapPlateDetailsRemarks) { @@ -232,7 +235,17 @@ public class ApiTypeRealize { return; } // goods_id更换 - v.setGoodsId(mapGoodsDO.get(String.valueOf(v.getGoodsId())).getId()); + GoodsDO goodsDO = mapGoodsDO.get(String.valueOf(v.getGoodsId())); + v.setGoodsId(goodsDO.getId()); + + // 累加goods板件数量和面积 + goodsDO.setPlateNum(goodsDO.getPlateNum() + 1); + goodsDO.setArea(goodsDO.getArea() + v.getArea().doubleValue()); + + // 累加生产单的板件数量和面积 + orderDO.setPlateNum(orderDO.getPlateNum() + 1); + orderDO.setArea(orderDO.getArea() + v.getArea().doubleValue()); + // 添加其他信息 // 获取小板对应的造型信息 PlateDetail plateDetail = mapPlateDetails.get(k); 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 45b98e454..6a720a8af 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 @@ -37,11 +37,11 @@ og.remark, orp.id as remainId - from order_goods og - left join order_remain_plate orp on og.organ_id = orp.organ_id and og.id = orp.goods_id - left join order_plan_item opi on og.organ_id = opi.organ_id and og.order_id = opi.order_id and og.id = opi.goods_id + from order_plan op + join order_goods og on op.organ_id = og.organ_id and op.goods_id = og.goods_id + left join order_remain_plate orp on og.organ_id = orp.organ_id and og.id = orp.goods_id - where opi.organ_id = #{organId} and opi.plan_id = #{planId} + where op.organ_id = #{organId} and op.id = #{planId} @@ -309,10 +309,6 @@ from order_body ob - left join order_item oi on ob.order_id = oi.order_id and ob.id = oi.body_id and oi.organ_id = #{organId} - left join order_plate op on oi.order_id = op.order_id and oi.plate_id = op.id and op.organ_id = #{organId} - left join order_plan_item opi on op.order_id = opi.order_id and op.id = opi.plate_id and opi.organ_id = #{organId} - where ob.organ_id = #{organId} and ob.order_id in @@ -320,10 +316,6 @@ and ob.deleted = false - and op.is_optimized = false - and opi.plan_id is null; - - @@ -572,5 +564,14 @@ + \ 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 09e975984..a0385d8a6 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 @@ -246,7 +246,7 @@ select distinct o.id, - opi.plan_id, + op.plan_id, o.order_date, o.delivery_date, o.custom_order_no, @@ -259,17 +259,12 @@ o.splitter, o.remark from orders o - - left join order_plan_item opi on o.organ_id = opi.organ_id and o.id = opi.order_id - - where opi.organ_id = #{organId} - and opi.plan_id in + join order_plate op on o.organ_id = op.organ_id and o.id = op.order_id + where op.organ_id = #{organId} + and op.plan_id in #{ids} - - - + select count(op.id) as num, IFNULL(sum(op.area), 0) as area + from orders o + join order_plate op on o.organ_id = op.organ_id and o.id = op.order_id + where o.id = #{orderId} + and op.plan_id != 0 + and op.deleted = false + and o.deleted = false + \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderItem/OrderItemMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderItem/OrderItemMapper.xml index 4d95b4b33..2ab7bae1d 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderItem/OrderItemMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderItem/OrderItemMapper.xml @@ -264,11 +264,10 @@ select distinct - opi.plan_id + op.plan_id from order_item oi - 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 + join order_plate op on oi.organ_id = op.organ_id and oi.order_id = op.order_id and oi.plate_id = op.id oi.organ_id = #{organId} and oi.order_id = #{orderId} @@ -282,7 +281,7 @@ #{roomIds} - and opi.plan_id is not null + and op.plan_id != 0 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 b2458def9..97789979e 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 @@ -15,8 +15,8 @@ select distinct op.* from order_plan op - left join order_plan_item opi on op.organ_id = opi.organ_id and op.id = opi.plan_id - left join orders o on opi.organ_id = o.organ_id and opi.order_id = o.id + join order_plate opt on op.organ_id = opt.organ_id and op.id = opt.plan_id + left join orders o on op.organ_id = o.organ_id and opt.order_id = o.id ${ew.customSqlSegment} @@ -260,23 +260,52 @@ - + select op.plan_id as planId, + count(op.id) as count + from order_plate op + where + op.organ_id = #{organId} + and op.plan_id != 0 + and op.plan_id in + + #{planId} + + and op.order_id in + + #{orderId} + + and op.deleted = false + group by op.plan_id; + + + \ No newline at end of file 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 281b8e06b..3e86aad60 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 @@ -19,45 +19,39 @@ - - - - @@ -72,43 +66,40 @@ - - - - + + - - - - - - @@ -137,7 +128,7 @@ op.texture, op.is_row_hole, op.remark, - opi.plan_id, + op.plan_id, oi.room_id, oi.body_id, ob.name as bodyName, @@ -146,11 +137,10 @@ op.is_2v as is2v, op.is_side_2v as isSide2v - from order_plan_item opi - join order_goods og on opi.order_id = og.order_id and opi.goods_id = og.id - join order_plate op on opi.order_id = op.order_id and opi.goods_id = op.goods_id and opi.plate_id = op.id - join order_item oi on op.order_id = oi.order_id and op.id = oi.plate_id - join order_body ob on oi.order_id = ob.order_id and oi.body_id = ob.id + from order_plate op + join order_goods og on op.organ_id = og.organ_id and op.order_id = og.order_id and op.goods_id = og.id + join order_item oi on op.organ_id = oi.organ_id and op.order_id = oi.order_id and op.id = oi.plate_id + join order_body ob on op.organ_id = ob.organ_id and oi.order_id = ob.order_id and oi.body_id = ob.id ${ew.customSqlSegment} @@ -161,7 +151,7 @@ - @@ -212,11 +201,10 @@ select count(distinct op.id) - from order_plan_item opi - join order_goods og on opi.order_id = og.order_id and opi.goods_id = og.id - join order_plate op on opi.order_id = op.order_id and opi.goods_id = op.goods_id and opi.plate_id = op.id - join order_item oi on op.order_id = oi.order_id and op.id = oi.plate_id - join order_body ob on oi.order_id = ob.order_id and oi.body_id = ob.id + from order_plate op + join order_goods og on op.organ_id = og.organ_id and op.order_id = og.order_id and op.goods_id = og.id + join order_item oi on op.organ_id = oi.organ_id and op.order_id = oi.order_id and op.id = oi.plate_id + join order_body ob on op.organ_id = ob.organ_id and oi.order_id = ob.order_id and oi.body_id = ob.id ${ew.customSqlSegment} @@ -256,14 +244,13 @@ og.thickness as thickness, og.brand as brand - from orders o - left join order_goods og on o.id = og.order_id and og.organ_id = #{organId} - left join order_plate op on og.order_id = op.order_id and og.id = op.goods_id and op.organ_id = #{organId} - left join order_item oi on op.order_id = oi.order_id and op.id = oi.plate_id and oi.organ_id = #{organId} - left join order_plan_item opi on op.order_id = opi.order_id and op.id = opi.plate_id and opi.organ_id = #{organId} - + from order_item oi + join order_plate op on op.order_id = oi.order_id and op.organ_id = oi.organ_id and op.id = oi.plate_id + join order_goods og on og.order_id = oi.order_id and og.organ_id = oi.organ_id and og.id = op.goods_id ${ew.customSqlSegment} - + and oi.plate_id != 0 + and og.plate_num - og.planned_plate_num > 0 + and og.deleted = false @@ -281,13 +268,12 @@ og.brand as brand from orders o - left join order_goods og on o.id = og.order_id and og.organ_id = #{organId} - left join order_plate op on og.order_id = op.order_id and og.id = op.goods_id and op.organ_id = #{organId} - left join order_plan_item opi on op.order_id = opi.order_id and op.id = opi.plate_id and opi.organ_id = #{organId} + join order_goods og on o.id = og.order_id and og.organ_id = #{organId} ${ew.customSqlSegment} - - + and og.plate_num - og.planned_plate_num > 0 + and og.deleted = false + order by thickness desc @@ -308,32 +294,11 @@ og.order_id as orderId from orders o - left join order_goods og on o.id = og.order_id and og.organ_id = #{organId} - left join order_plate op on og.order_id = op.order_id and og.id = op.goods_id and op.organ_id = #{organId} - left join order_item oi on op.order_id = oi.order_id and op.id = oi.plate_id and oi.organ_id = #{organId} - left join order_plan_item opi on op.order_id = opi.order_id and op.id = opi.plate_id and opi.organ_id = #{organId} + join order_goods og on o.id = og.order_id and og.organ_id = #{organId} ${ew.customSqlSegment} - - - - @@ -433,9 +398,6 @@ op.width as width, op.height as height, op.thickness as thickness, - op.split_width as splitWidth, - op.split_height as splitHeight, - op.split_thickness as splitThickness, op.seal_left as sealLeft, op.seal_right as sealRight, op.seal_up as sealUp, @@ -443,75 +405,18 @@ op.area as area, op.texture as texture, op.hole_face as holeFace, - op.hole_arrange as holeArrange, - op.unregular_point_count as unregularPointCount, - op.front_hole_count as frontHoleCount, - op.back_hole_count as backHoleCount, - op.side_hole_count as sideHoleCount, - op.front_model_count as frontModelCount, - op.back_model_count as backModelCount, - op.is_door as isDoor, op.open_door_type as openDoorType, - op.offset_x as offsetX, - op.offset_y as offsetY, - op.is_arc_across as isArcAcross, - op.module_type_id as moduleTypeId, op.is_special_shaped as isSpecialShaped, op.is_sculpt as isSculpt, - op.is_row_hole as hasHole, - op.remark as remark, - op.filter_type as filterType, - op.is_cancel as isCancel, - op.is_row_hole as hasHole, - op.is_side_sculpt as isSideSculpt, - op.is_2v as is2v, - op.is_side_2v as isSide2v + op.remark as remark - from order_plan_item opi - join order_plate op on opi.organ_id = op.organ_id and opi.order_id = op.order_id and opi.plate_id = op.id - left join order_goods ogs on opi.organ_id = ogs.organ_id and opi.order_id = ogs.order_id and opi.goods_id = ogs.id - left join order_item oi on opi.organ_id = oi.organ_id and opi.order_id = oi.order_id and opi.plate_id = oi.plate_id - 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 opi.organ_id = #{organId} and opi.plan_id = #{planId} - - - - - - - - - - @@ -519,12 +424,10 @@ 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 e6a028a8c..fdb03dfd9 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 @@ -278,36 +278,6 @@ - - - - - @@ -535,21 +504,6 @@ - - @@ -978,7 +932,7 @@ ogs.color as plateColor, ogs.material as plateMaterial, op.id as plateId, - opi.plan_id as planId, + op.plan_id as planId, op.order_id as orderId, ogs.goods_name as goodsPlateName, ogs.raw_goods_id as rawGoodsId, @@ -1002,11 +956,10 @@ op.seal_down as sealDown, op.remark as plateRemark - from order_plate op + from order_plate op left join order_goods ogs on op.organ_id = ogs.organ_id and op.order_id = ogs.order_id and op.goods_id = ogs.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 - 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 + left join order_body ob on op.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 diff --git a/cf-module-prod-plan/cf-module-prod-plan-api/src/main/java/com/cf/imes/module/plan/enums/ErrorCodeConstants.java b/cf-module-prod-plan/cf-module-prod-plan-api/src/main/java/com/cf/imes/module/plan/enums/ErrorCodeConstants.java index d7a799882..406d78b1f 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-api/src/main/java/com/cf/imes/module/plan/enums/ErrorCodeConstants.java +++ b/cf-module-prod-plan/cf-module-prod-plan-api/src/main/java/com/cf/imes/module/plan/enums/ErrorCodeConstants.java @@ -22,4 +22,6 @@ public class ErrorCodeConstants { public static final ErrorCode WEBCAD_ORDER_IMPORT_ORDER_PLATENUM_REACH_THRESHOLD_ERROR = new ErrorCode(1_005_000_012, "部分导入成功,生产单【{}】下板件数量已达到{}片,本次拆单超出部分不计入生产单"); public static final ErrorCode ORDER_IMPORT_PLATE_GOODS_NOMATCH_ERROR = new ErrorCode(1_005_000_013, "导入失败,板材库中无板材匹配,商品编码:{},商品名称:{},材质:{},颜色:{},厚度:{},品牌:{}"); public static final ErrorCode WEBCAD_ORDER_IMPORT_PEEK_NOT_EXIST_ERROR = new ErrorCode(1_005_000_014, "导入失败:数据源不存在,请检查消息可靠性"); + public static final ErrorCode WEBCAD_ORDER_IMPORT_ORDER_UPDATE_CONCURRENCY_ERROR = new ErrorCode(1_005_000_015, "导入失败:生产单号【{}】板件数量已发生改变,请重新导入"); + public static final ErrorCode WEBCAD_ORDER_IMPORT_GOODS_UPDATE_CONCURRENCY_ERROR = new ErrorCode(1_005_000_015, "导入失败:材质【{}】板件数量已发生改变,请重新导入"); } diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/dal/dataobject/goods/GoodsDO.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/dal/dataobject/goods/GoodsDO.java index a85d8e7bb..4c199163c 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/dal/dataobject/goods/GoodsDO.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/dal/dataobject/goods/GoodsDO.java @@ -107,4 +107,34 @@ public class GoodsDO extends BaseDO { */ private Boolean deleted; + /** + * 板件数量 + */ + private Integer plateNum; + + /** + * 已排单小板数量 + */ + private Integer plannedPlateNum; + + /** + * 板件总面积 + */ + private Double area; + + /** + * 已排单面积 + */ + private Double plannedPlateArea; + + /** + * 版本号:乐观锁用 + */ + private int version; + + /** + * 是否当前导入前已存在的大板 + */ + @TableField(exist = false) + private boolean exist; } \ No newline at end of file diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/dal/dataobject/order/OrderDO.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/dal/dataobject/order/OrderDO.java index 8a0e26abc..eab5c3247 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/dal/dataobject/order/OrderDO.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/dal/dataobject/order/OrderDO.java @@ -132,4 +132,29 @@ public class OrderDO extends BaseDO { */ @TableField(value = "custom_plateno_seq", typeHandler = CompressStringTypeHandler.class) private String customPlatenoSeq; + + /** + * 板件数量 + */ + private Integer plateNum; + + /** + * 已排单小板数量 + */ + private Integer plannedPlateNum; + + /** + * 板件总面积 + */ + private Double area; + + /** + * 已排单面积 + */ + private Double plannedPlateArea; + + /** + * 版本号:乐观锁用 + */ + private int version; } diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/dal/dataobject/plate/PlateDO.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/dal/dataobject/plate/PlateDO.java index 20a80c4ac..ab010cec4 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/dal/dataobject/plate/PlateDO.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/dal/dataobject/plate/PlateDO.java @@ -284,4 +284,9 @@ public class PlateDO extends BaseDO { @TableField(exist = false) private StringBuilder customPlateNoBuilder; + + /** + * 排单id + */ + private Long planId; } \ No newline at end of file diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/order/OrderInputProcessor.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/order/OrderInputProcessor.java index 8b2eda8cf..7b86d6297 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/order/OrderInputProcessor.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/order/OrderInputProcessor.java @@ -47,7 +47,7 @@ public class OrderInputProcessor { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - public static final String ORDER_PLATE_MODEL = "imes_order_plate_model"; + public static final String ORDER_PLATE_MODEL = "imes_order_plate_model_0"; public static final String ORDER_PARTS_REMARK_MODEL = "imes_order_parts_remark_model"; diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/WebCadOrderImportServiceImpl.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/WebCadOrderImportServiceImpl.java index d4c2cb906..991b704a0 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/WebCadOrderImportServiceImpl.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/WebCadOrderImportServiceImpl.java @@ -177,7 +177,7 @@ public class WebCadOrderImportServiceImpl implements WebCadOrderImportService { ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); WebCadDataReqVO webCadDataReqVO = mapper.readValue(parser, WebCadDataReqVO.class); - WebCadOrderImportFactory webCadOrderImportFactory = new WebCadOrderImportFactory(organId, orderDO, snowFlakeGenerator, orderBodyMapper, plateMapper, + WebCadOrderImportFactory webCadOrderImportFactory = new WebCadOrderImportFactory(organId, orderDO, snowFlakeGenerator, orderMapper, orderBodyMapper, plateMapper, idWorker, orderInputProcessor, goodsMapper, rawGoodsMapper, customPlateNoGenerateService, systemConfigApi, webCadImportProperties.getCadImportPlateNumThreshold(), jdbcTemplate); webCadOrderImportFactory.analyzeTempData(webCadDataReqVO); } else { diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/factory/WebCadOrderImportAsyncFactory.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/factory/WebCadOrderImportAsyncFactory.java index b88393581..24f2f7011 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/factory/WebCadOrderImportAsyncFactory.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/factory/WebCadOrderImportAsyncFactory.java @@ -2,6 +2,7 @@ package com.cf.imes.module.plan.service.orderImport.factory; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; @@ -11,6 +12,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONReader; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.cf.imes.framework.common.exception.ErrorCode; import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; @@ -54,6 +56,7 @@ import com.cf.imes.module.plan.dal.mysql.orderGroup.OrderGroupMapper; import com.cf.imes.module.plan.dal.mysql.orderImport.OrderImportTaskMapper; import com.cf.imes.module.plan.dal.mysql.plate.PlateMapper; import com.cf.imes.module.plan.dal.mysql.rawgoods.RawGoodsMapper; +import com.cf.imes.module.plan.enums.ErrorCodeConstants; import com.cf.imes.module.plan.service.customplateno.CustomPlateNoGenerateService; import com.cf.imes.module.plan.service.customplateno.vo.CustomPlateNoGenerateConfigVO; import com.cf.imes.module.plan.service.order.OrderInputProcessor; @@ -79,6 +82,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; import static com.cf.imes.module.plan.enums.ErrorCodeConstants.WEBCAD_ORDER_IMPORT_GET_ORG_SEALEDGE_ERROR; import static com.cf.imes.module.plan.enums.ErrorCodeConstants.WEBCAD_ORDER_IMPORT_ORDER_PLATENUM_CHECK_ERROR; @@ -156,8 +160,8 @@ public class WebCadOrderImportAsyncFactory { // 房间名+柜体名+加工组名 private Map orderGroupMap = new HashMap<>(); - // 板材缓存:{商品编号:order_goods} - private Map materialMap = new HashMap<>(); + // 板材缓存:{商品编号:GoodsDO} + private Map materialMap = new HashMap<>(); // 已存在房间缓存:{ roomName: roomId } private Map existRoomIdMap = new HashMap<>(); @@ -185,6 +189,8 @@ public class WebCadOrderImportAsyncFactory { // 当前拆单导入的板件数量(初始包含前n次导入的板件总数) private int currentPlateNum; + private BigDecimal currentPlateArea = new BigDecimal(0); + // cad拆单板件数量阈值 private int cadImportPlateNumThreshold; @@ -287,6 +293,12 @@ public class WebCadOrderImportAsyncFactory { saveData(); log.debug("====================【cad拆单全局保存结束】===================="); + // 新增/更新order_goods + insertOrUpdatePlateNumGoods(); + + // 更新生产单板件数量 + updateOrderPlateNum(); + // 更新导入任务为成功 updateTaskSuccess(taskId); @@ -380,6 +392,18 @@ public class WebCadOrderImportAsyncFactory { throw ServiceExceptionUtil.exception(WEBCAD_ORDER_IMPORT_ORDER_PLATENUM_CHECK_ERROR, orderId, cadImportPlateNumThreshold); } else { currentPlateNum = existPlateCount.intValue(); + // 统计当前板件总面积 + List> orderPlateSumResult = plateMapper.selectMaps(new QueryWrapper() + .select("sum(area) as area") + .eq("organ_id", organId) + .eq("order_id", orderId) + .eq("deleted", false)); + if (CollUtil.isNotEmpty(orderPlateSumResult)) { + Map resultMap = orderPlateSumResult.get(0); + if(ObjectUtil.isNotNull(resultMap)) { + currentPlateArea = (BigDecimal) resultMap.get("area"); + } + } } } @@ -397,19 +421,22 @@ public class WebCadOrderImportAsyncFactory { String plateGoodsGoodsId = materialReqVO.getGoodsId(); Long orderGoodsId; - Long existOrderGoodsId = materialMap.get(plateGoodsGoodsId); - if (ObjectUtil.isNull(existOrderGoodsId)) { + GoodsDO existOrderGoods = materialMap.get(plateGoodsGoodsId); + if (ObjectUtil.isNull(existOrderGoods)) { // 检查生产单下是否已经有板材下的order_goods,有不再创建 - List existOrderGoodIds = goodsMapper.selectList(new LambdaQueryWrapper() + List existOrderGoodIds = goodsMapper.selectList(new LambdaQueryWrapper() .eq(GoodsDO::getGoodsId, plateGoodsGoodsId) .eq(GoodsDO::getOrderId, orderId) .eq(GoodsDO::getOrganId, organId) .eq(GoodsDO::getDeleted, false) - .select(GoodsDO::getId)).stream().map(GoodsDO::getId).toList(); + .select(GoodsDO::getId, GoodsDO::getVersion, GoodsDO::getPlateNum, GoodsDO::getPlannedPlateNum)); if (CollUtil.isNotEmpty(existOrderGoodIds)) { // 缓存goodCode和orderGoodsId的对应关系 - materialMap.put(plateGoodsGoodsId, existOrderGoodIds.get(0)); + GoodsDO existGoodsDO = existOrderGoodIds.get(0); + existGoodsDO.setExist(true); + materialMap.put(plateGoodsGoodsId, existGoodsDO); + continue; } // 创建设计端商品 @@ -424,8 +451,8 @@ public class WebCadOrderImportAsyncFactory { .color(materialReqVO.getColor()) .colorBlack(EMPTY_STRING) .thickness(materialReqVO.getThickness()) - .spec(materialReqVO.getSpec()) - .brand(materialReqVO.getBrand()) + .spec(getEmpty(materialReqVO.getSpec())) + .brand(getEmpty(materialReqVO.getBrand())) .price(0.00) .deleted(false) .organId(organId) @@ -450,13 +477,19 @@ public class WebCadOrderImportAsyncFactory { .width(BigDecimal.valueOf(getZeroDouble(materialReqVO.getWidth()))) .height(BigDecimal.valueOf(getZeroDouble(materialReqVO.getHeight()))) .thickness(BigDecimal.valueOf(materialReqVO.getThickness())) - .spec(materialReqVO.getSpec()) - .brand(materialReqVO.getBrand()) + .spec(getEmpty(materialReqVO.getSpec())) + .brand(getEmpty(materialReqVO.getBrand())) .remark(EMPTY_STRING) .planId(0L) .price(0.00) .deleted(false) .organId(organId) + .exist(false) + .plateNum(0) + .plannedPlateNum(0) + .area(0.00) + .plannedPlateArea(0.00) + .version(0) .build(); goodsDO.setCreator(operatorName); goodsDO.setUpdater(operatorName); @@ -467,13 +500,12 @@ public class WebCadOrderImportAsyncFactory { rawGoodsDOS.add(rawGoodsDO); // 缓存goodCode和orderGoodsId的对应关系 - materialMap.put(plateGoodsGoodsId, orderGoodsId); + materialMap.put(plateGoodsGoodsId, goodsDO); } } reader.endArray(); orderInfoBatchInsertWithinThreshold(rawGoodsMapper, rawGoodsDOS, true); - orderInfoBatchInsertWithinThreshold(goodsMapper, goodsDOS, true); } /** @@ -700,8 +732,15 @@ public class WebCadOrderImportAsyncFactory { remark.deleteCharAt(remark.length() - 1); } + Double area = block.getArea(); String splitHeight = block.getSpliteHeight(); String spliteWidth = block.getSpliteWidth(); + + // 累加goods的板件总数 + GoodsDO goodsDO = materialMap.get(block.getGoodsCode()); + goodsDO.setPlateNum(goodsDO.getPlateNum() + 1); + goodsDO.setArea(goodsDO.getArea() + area); + // 创建order_plate PlateDO plateDO = PlateDO.builder() .id(plateId) @@ -709,14 +748,14 @@ public class WebCadOrderImportAsyncFactory { .name(block.getName()) .plateNo(obtainingTime + Long.toString(plateNo).substring(2)) .type(block.getType()) - .goodsId(materialMap.get(block.getGoodsCode())) + .goodsId(goodsDO.getId()) .width(BigDecimal.valueOf(block.getWidth())) .height(BigDecimal.valueOf(block.getHeight())) .thickness(BigDecimal.valueOf(block.getThickness())) .splitHeight(BigDecimal.valueOf(NumberUtil.parseDouble(StringUtils.isNotEmpty(splitHeight) ? splitHeight : String.valueOf(block.getKaiLiaoHeight())))) .splitThickness(BigDecimal.valueOf(NumberUtil.parseDouble(block.getSpliteThickness()))) .splitWidth(BigDecimal.valueOf(NumberUtil.parseDouble(StringUtils.isNotEmpty(spliteWidth) ? spliteWidth : String.valueOf(block.getKaiLiaoWidth())))) - .area(BigDecimal.valueOf(block.getArea())) + .area(BigDecimal.valueOf(area)) .texture(block.getTexture()) .holeFace(block.getHoleFace()) .isDoor(block.getIsDoor()) @@ -750,6 +789,7 @@ public class WebCadOrderImportAsyncFactory { .remark(remark.toString()) .deleted(false) .organId(organId) + .planId(0L) .build(); plateDO.setCreator(operatorName); plateDO.setUpdater(operatorName); @@ -759,6 +799,7 @@ public class WebCadOrderImportAsyncFactory { //批量保存板件 // 达到板件数量阈值,停止入库,更新全局参数停止后续入库 currentPlateNum += 1; + currentPlateArea.add(BigDecimal.valueOf(area)); if (currentPlateNum > cadImportPlateNumThreshold) { plateNumReachThreshold = true; return; @@ -1747,7 +1788,7 @@ public class WebCadOrderImportAsyncFactory { private void orderPlateBatchInsertWithinThreshold(List list, boolean isLast) { // 达到批量的阈值就做一次插入 if (CollUtil.isNotEmpty(list) && (list.size() >= BATCH_THRESHOLD_NUMBER || isLast)) { - String sql = "INSERT INTO order_plate (id,organ_id,order_id,name,plate_no,type,goods_id,width,height,thickness,split_width,split_height,split_thickness,seal_left,seal_right,seal_up,seal_down,area,texture,hole_face,hole_arrange,unregular_point_count,front_hole_count,back_hole_count,side_hole_count,front_model_count,back_model_count,is_door,open_door_type,offset_x,offset_y,is_arc_across,module_type_id,is_special_shaped,is_sculpt,is_side_sculpt,is_2v,is_side_2v,is_row_hole,is_optimized,is_cutted,filter_type,remark,is_cancel,deleted,custom_plate_no,create_time,update_time,creator,updater) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + String sql = "INSERT INTO order_plate (id,organ_id,order_id,name,plate_no,type,goods_id,width,height,thickness,split_width,split_height,split_thickness,seal_left,seal_right,seal_up,seal_down,area,texture,hole_face,hole_arrange,unregular_point_count,front_hole_count,back_hole_count,side_hole_count,front_model_count,back_model_count,is_door,open_door_type,offset_x,offset_y,is_arc_across,module_type_id,is_special_shaped,is_sculpt,is_side_sculpt,is_2v,is_side_2v,is_row_hole,is_optimized,is_cutted,filter_type,remark,is_cancel,deleted,custom_plate_no,create_time,update_time,creator,updater) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() { @Override public void setValues(PreparedStatement ps, int index) throws SQLException { @@ -2092,4 +2133,56 @@ public class WebCadOrderImportAsyncFactory { private void updateTaskSuccess(Long taskId) { orderImportTaskMapper.update(new LambdaUpdateWrapper().eq(OrderImportTaskDO::getId, taskId).set(OrderImportTaskDO::getImportStatus, OrderImportStatusEnum.IMPORT_SUCCESS.getStatus())); } + + /** + * 更新生产单的板件总数 + */ + private void updateOrderPlateNum() { + int version = orderDO.getVersion(); + Long orderId = orderDO.getId(); + int updated = orderMapper.update(new LambdaUpdateWrapper() + .eq(OrderDO::getId, orderId) + .eq(OrderDO::getOrganId, organId) + .eq(OrderDO::getVersion, version) + .set(OrderDO::getPlateNum, currentPlateNum) + .set(OrderDO::getArea, currentPlateArea) + .set(OrderDO::getVersion, version + 1)); + if (updated == 0) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.WEBCAD_ORDER_IMPORT_ORDER_UPDATE_CONCURRENCY_ERROR, orderId); + } + } + + /** + * 新增order_goods/更新已有order_goods的板件总数 + */ + private void insertOrUpdatePlateNumGoods() { + if (MapUtil.isNotEmpty(materialMap)) { + // 分类新增和更新的goods + List insertGoods = new ArrayList<>(); + List updateGoods = new ArrayList<>(); + materialMap.forEach((k, v) -> { + if (v.isExist()) { + updateGoods.add(v); + } else { + insertGoods.add(v); + } + }); + + // 批量插入order_goods + orderInfoBatchInsertWithinThreshold(goodsMapper, insertGoods, true); + + // 批量更新order_goods的plateNum + for (GoodsDO updateDo : updateGoods) { + int updated = goodsMapper.update(new LambdaUpdateWrapper() + .eq(GoodsDO::getId, updateDo.getId()) + .eq(GoodsDO::getOrganId, organId) + .eq(GoodsDO::getVersion, updateDo.getVersion()) + .set(GoodsDO::getPlateNum, updateDo.getPlateNum()) + .set(GoodsDO::getVersion, updateDo.getVersion() + 1)); + if (updated == 0) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.WEBCAD_ORDER_IMPORT_GOODS_UPDATE_CONCURRENCY_ERROR, updateDo.getId()); + } + } + } + } } diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/factory/WebCadOrderImportFactory.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/factory/WebCadOrderImportFactory.java index 45959636c..da70d1f6c 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/factory/WebCadOrderImportFactory.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/factory/WebCadOrderImportFactory.java @@ -1,6 +1,7 @@ package com.cf.imes.module.plan.service.orderImport.factory; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; @@ -10,6 +11,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.cf.imes.framework.common.exception.ErrorCode; import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; import com.cf.imes.framework.common.pojo.CommonResult; @@ -44,9 +46,11 @@ import com.cf.imes.module.plan.dal.elasticsearch.Point; import com.cf.imes.module.plan.dal.elasticsearch.PointDetail; import com.cf.imes.module.plan.dal.elasticsearch.PointList; import com.cf.imes.module.plan.dal.mysql.goods.GoodsMapper; +import com.cf.imes.module.plan.dal.mysql.order.OrderMapper; import com.cf.imes.module.plan.dal.mysql.orderBody.OrderBodyMapper; import com.cf.imes.module.plan.dal.mysql.plate.PlateMapper; import com.cf.imes.module.plan.dal.mysql.rawgoods.RawGoodsMapper; +import com.cf.imes.module.plan.enums.ErrorCodeConstants; import com.cf.imes.module.plan.service.customplateno.CustomPlateNoGenerateService; import com.cf.imes.module.plan.service.customplateno.vo.CustomPlateNoGenerateConfigVO; import com.cf.imes.module.plan.service.order.OrderInputProcessor; @@ -92,6 +96,8 @@ public class WebCadOrderImportFactory { private SnowFlakeGenerator snowFlakeGenerator; + private OrderMapper orderMapper; + private OrderBodyMapper orderBodyMapper; private PlateMapper plateMapper; @@ -141,8 +147,8 @@ public class WebCadOrderImportFactory { // 房间名+柜体名+加工组名:加工组 private Map orderGroupMap = new HashMap<>(); - // 板材缓存:{商品编号:order_goods} - private Map materialMap = new HashMap<>(); + // 板材缓存:{商品编号:GoodsDO} + private Map materialMap = new HashMap<>(); // 已存在房间缓存:{ roomName: roomId } private Map existRoomIdMap = new HashMap<>(); @@ -170,6 +176,8 @@ public class WebCadOrderImportFactory { // 当前拆单导入的板件数量(初始包含前n次导入的板件总数) private int currentPlateNum; + private BigDecimal currentPlateArea = new BigDecimal(0); + // cad拆单板件数量阈值 private int cadImportPlateNumThreshold; @@ -179,6 +187,7 @@ public class WebCadOrderImportFactory { public WebCadOrderImportFactory(Long organId, OrderDO orderDO, SnowFlakeGenerator snowFlakeGenerator, + OrderMapper orderMapper, OrderBodyMapper orderBodyMapper, PlateMapper plateMapper, SnowflakeIdWorker3rd idWorker, @@ -193,6 +202,7 @@ public class WebCadOrderImportFactory { this.orderDO = orderDO; this.orderId = orderDO.getId(); this.snowFlakeGenerator = snowFlakeGenerator; + this.orderMapper = orderMapper; this.orderBodyMapper = orderBodyMapper; this.plateMapper = plateMapper; this.idWorker = idWorker; @@ -247,6 +257,12 @@ public class WebCadOrderImportFactory { saveData(); log.debug("====================【cad拆单全局保存结束】===================="); + // 新增/更新order_goods + insertOrUpdatePlateNumGoods(); + + // 更新生产单板件数量 + updateOrderPlateNum(); + // 所有自定义板编号生成完成后更新配置到生产单 customPlateNoGenerateService.updateCustomPlateNoGenerateConfig(plateNoGenerateConfigVO, orderDO); @@ -321,6 +337,18 @@ public class WebCadOrderImportFactory { throw ServiceExceptionUtil.exception(WEBCAD_ORDER_IMPORT_ORDER_PLATENUM_CHECK_ERROR, orderId, cadImportPlateNumThreshold); } else { currentPlateNum = existPlateCount.intValue(); + // 统计当前板件总面积 + List> orderPlateSumResult = plateMapper.selectMaps(new QueryWrapper() + .select("sum(area) as area") + .eq("organ_id", organId) + .eq("order_id", orderId) + .eq("deleted", false)); + if (CollUtil.isNotEmpty(orderPlateSumResult)) { + Map resultMap = orderPlateSumResult.get(0); + if(ObjectUtil.isNotNull(resultMap)) { + currentPlateArea = (BigDecimal) resultMap.get("area"); + } + } } } @@ -337,22 +365,32 @@ public class WebCadOrderImportFactory { // 检查生产单下是否已经有goodsId下的order_goods,有不再创建 materialMap = goodsMapper.selectMaps( new QueryWrapper() - .select("goods_id,MIN(id) as id") + .select("goods_id ,MIN(id) as id, plate_num, planned_plate_num, area, planned_plate_area version") .eq("order_id", orderId) .eq("organ_id", organId) .eq("deleted", false) .in("goods_id", materialReqVOS.stream().map(WebCadDataMaterialReqVO::getGoodsId).collect(Collectors.toList())) - .groupBy("goods_id")).stream() + .groupBy("goods_id, plate_num, planned_plate_num, area, planned_plate_area, version")).stream() .collect(Collectors.toMap( m -> String.valueOf(m.get("goods_id")), - m -> ((Number) m.get("id")).longValue() + m -> { + GoodsDO goodsDO = new GoodsDO(); + goodsDO.setId(NumberUtil.parseLong(String.valueOf(m.get("id")))); + goodsDO.setExist(true); + goodsDO.setPlateNum(NumberUtil.parseInt(String.valueOf(m.get("plate_num")))); + goodsDO.setPlannedPlateNum(NumberUtil.parseInt(String.valueOf(m.get("planned_plate_num")))); + goodsDO.setArea(NumberUtil.parseDouble(String.valueOf(m.get("area")))); + goodsDO.setPlannedPlateArea(NumberUtil.parseDouble(String.valueOf(m.get("planned_plate_area")))); + goodsDO.setVersion(NumberUtil.parseInt(String.valueOf(m.get("version")))); + return goodsDO; + } )); for (WebCadDataMaterialReqVO materialReqVO : materialReqVOS) { String plateGoodsGoodsId = materialReqVO.getGoodsId(); - Long existOrderGoodsId = materialMap.get(plateGoodsGoodsId); - if (ObjectUtil.isNull(existOrderGoodsId)) { + GoodsDO existOrderGoods = materialMap.get(plateGoodsGoodsId); + if (ObjectUtil.isNull(existOrderGoods)) { // 创建设计端商品 Long rawGoodsId = (Long) snowFlakeGenerator.nextId(null); RawGoodsDO rawGoodsDO = RawGoodsDO.builder() @@ -365,8 +403,8 @@ public class WebCadOrderImportFactory { .color(materialReqVO.getColor()) .colorBlack(EMPTY_STRING) .thickness(materialReqVO.getThickness()) - .spec(materialReqVO.getSpec()) - .brand(materialReqVO.getBrand()) + .spec(getEmpty(materialReqVO.getSpec())) + .brand(getEmpty(materialReqVO.getBrand())) .price(0.00) .deleted(false) .organId(organId) @@ -387,24 +425,29 @@ public class WebCadOrderImportFactory { .width(BigDecimal.valueOf(getZeroDouble(materialReqVO.getWidth()))) .height(BigDecimal.valueOf(getZeroDouble(materialReqVO.getHeight()))) .thickness(BigDecimal.valueOf(materialReqVO.getThickness())) - .spec(materialReqVO.getSpec()) - .brand(materialReqVO.getBrand()) + .spec(getEmpty(materialReqVO.getSpec())) + .brand(getEmpty(materialReqVO.getBrand())) .remark(EMPTY_STRING) .planId(0L) .price(0.00) .deleted(false) .organId(organId) + .exist(false) + .plateNum(0) + .plannedPlateNum(0) + .area(0.00) + .plannedPlateArea(0.00) + .version(0) .build(); goodsDOS.add(goodsDO); rawGoodsDOS.add(rawGoodsDO); // 缓存goodCode和orderGoodsId的对应关系 - materialMap.put(plateGoodsGoodsId, orderGoodsId); + materialMap.put(plateGoodsGoodsId, goodsDO); } } orderInfoBatchInsertWithinThreshold(rawGoodsMapper, rawGoodsDOS, true); - orderInfoBatchInsertWithinThreshold(goodsMapper, goodsDOS, true); } /** @@ -579,6 +622,7 @@ public class WebCadOrderImportFactory { boolean isModel = block.isModel() || sideModel || has2DModel || hasSide2DModel || block.isHas3DModel(); // 是否排孔 boolean isRawHole = (block.getFrontHoleCount() + block.getBackHoleCount()) > 0; + Double area = block.getArea(); // 柜体长宽深 orderBodyDO.setWidth(block.getCabinetWidth()); @@ -600,6 +644,12 @@ public class WebCadOrderImportFactory { remark.deleteCharAt(remark.length() - 1); } + // 累加goods的板件总数 + GoodsDO goodsDO = materialMap.get(block.getGoodsCode()); + goodsDO.setPlateNum(goodsDO.getPlateNum() + 1); + goodsDO.setArea(goodsDO.getArea() + area); + + String splitHeight = block.getSpliteHeight(); String spliteWidth = block.getSpliteWidth(); // 创建order_plate @@ -609,14 +659,14 @@ public class WebCadOrderImportFactory { .name(block.getName()) .plateNo(obtainingTime + Long.toString(plateNo).substring(2)) .type(block.getType()) - .goodsId(materialMap.get(block.getGoodsCode())) + .goodsId(goodsDO.getId()) .width(BigDecimal.valueOf(block.getWidth())) .height(BigDecimal.valueOf(block.getHeight())) .thickness(BigDecimal.valueOf(block.getThickness())) .splitHeight(BigDecimal.valueOf(NumberUtil.parseDouble(StringUtils.isNotEmpty(splitHeight) ? splitHeight : String.valueOf(block.getKaiLiaoHeight())))) .splitThickness(BigDecimal.valueOf(NumberUtil.parseDouble(block.getSpliteThickness()))) .splitWidth(BigDecimal.valueOf(NumberUtil.parseDouble(StringUtils.isNotEmpty(spliteWidth) ? spliteWidth : String.valueOf(block.getKaiLiaoWidth())))) - .area(BigDecimal.valueOf(block.getArea())) + .area(BigDecimal.valueOf(area)) .texture(block.getTexture()) .holeFace(block.getHoleFace()) .isDoor(block.getIsDoor()) @@ -650,6 +700,7 @@ public class WebCadOrderImportFactory { .remark(remark.toString()) .deleted(false) .organId(organId) + .planId(0L) .build(); plateDO.setCreator(operatorName); plateDO.setUpdater(operatorName); @@ -659,6 +710,7 @@ public class WebCadOrderImportFactory { //批量保存板件 // 达到板件数量阈值,停止入库,更新全局参数停止后续入库 currentPlateNum += 1; + currentPlateArea.add(BigDecimal.valueOf(area)); if (currentPlateNum > cadImportPlateNumThreshold) { plateNumReachThreshold = true; return; @@ -1636,7 +1688,7 @@ public class WebCadOrderImportFactory { private void orderPlateBatchInsertWithinThreshold(List list, boolean isLast) { // 达到批量的阈值就做一次插入 if (CollUtil.isNotEmpty(list) && (list.size() >= BATCH_THRESHOLD_NUMBER || isLast)) { - String sql = "INSERT INTO order_plate (id,organ_id,order_id,name,plate_no,type,goods_id,width,height,thickness,split_width,split_height,split_thickness,seal_left,seal_right,seal_up,seal_down,area,texture,hole_face,hole_arrange,unregular_point_count,front_hole_count,back_hole_count,side_hole_count,front_model_count,back_model_count,is_door,open_door_type,offset_x,offset_y,is_arc_across,module_type_id,is_special_shaped,is_sculpt,is_side_sculpt,is_2v,is_side_2v,is_row_hole,is_optimized,is_cutted,filter_type,remark,is_cancel,deleted,custom_plate_no,create_time,update_time,creator,updater) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + String sql = "INSERT INTO order_plate (id,organ_id,order_id,name,plate_no,type,goods_id,width,height,thickness,split_width,split_height,split_thickness,seal_left,seal_right,seal_up,seal_down,area,texture,hole_face,hole_arrange,unregular_point_count,front_hole_count,back_hole_count,side_hole_count,front_model_count,back_model_count,is_door,open_door_type,offset_x,offset_y,is_arc_across,module_type_id,is_special_shaped,is_sculpt,is_side_sculpt,is_2v,is_side_2v,is_row_hole,is_optimized,is_cutted,filter_type,remark,is_cancel,deleted,custom_plate_no,create_time,update_time,creator,updater) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() { @Override public void setValues(PreparedStatement ps, int index) throws SQLException { @@ -1947,6 +1999,58 @@ public class WebCadOrderImportFactory { return resultList; } + /** + * 更新生产单的板件总数 + */ + private void updateOrderPlateNum() { + int version = orderDO.getVersion(); + Long orderId = orderDO.getId(); + int updated = orderMapper.update(new LambdaUpdateWrapper() + .eq(OrderDO::getId, orderId) + .eq(OrderDO::getOrganId, organId) + .eq(OrderDO::getVersion, version) + .set(OrderDO::getPlateNum, currentPlateNum) + .set(OrderDO::getArea, currentPlateArea) + .set(OrderDO::getVersion, version + 1)); + if (updated == 0) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.WEBCAD_ORDER_IMPORT_ORDER_UPDATE_CONCURRENCY_ERROR, orderId); + } + } + + /** + * 新增order_goods/更新已有order_goods的板件总数 + */ + private void insertOrUpdatePlateNumGoods() { + if (MapUtil.isNotEmpty(materialMap)) { + // 分类新增和更新的goods + List insertGoods = new ArrayList<>(); + List updateGoods = new ArrayList<>(); + materialMap.forEach((k, v) -> { + if (v.isExist()) { + updateGoods.add(v); + } else { + insertGoods.add(v); + } + }); + + // 批量插入order_goods + orderInfoBatchInsertWithinThreshold(goodsMapper, insertGoods, true); + + // 批量更新order_goods的plateNum + for (GoodsDO updateDo : updateGoods) { + int updated = goodsMapper.update(new LambdaUpdateWrapper() + .eq(GoodsDO::getId, updateDo.getId()) + .eq(GoodsDO::getOrganId, organId) + .eq(GoodsDO::getVersion, updateDo.getVersion()) + .set(GoodsDO::getPlateNum, updateDo.getPlateNum()) + .set(GoodsDO::getVersion, updateDo.getVersion() + 1)); + if (updated == 0) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.WEBCAD_ORDER_IMPORT_GOODS_UPDATE_CONCURRENCY_ERROR, updateDo.getId()); + } + } + } + } + /** * 清空所有列表 */ 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 737112805..09a46f128 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 @@ -323,7 +323,7 @@ public class ErrorCodeConstants { public static final ErrorCode PLAN_PLATE_IS_CUTTED = new ErrorCode(1_002_041_028, "当前删除的小板中已有小板开料,无法删除!"); public static final ErrorCode PROCESS_CONFIG_DEFAULT_DATA_ERROR = new ErrorCode(1_002_041_031, "当前组织没有默认的加工方案组,请在系统配置中进行配置"); public static final ErrorCode THIS_PROCESS_CONFIG_DATA_ERROR = new ErrorCode(1_002_041_032, "当前选择的加工方案组配置有误,请选择其他方案组或重新配置该方案组"); - public static final ErrorCode CREAT_PLAN_PLATE_DATA_ERROR = new ErrorCode(1_002_041_033, "当前板材已有小板创建板材,请重新查询生产单信息再创建"); + public static final ErrorCode CREAT_PLAN_PLATE_DATA_ERROR = new ErrorCode(1_002_041_033, "当前选择部分小板已排单,请重新查询未排单信息后再次创建排单"); public static final ErrorCode PLAN_PLATE_DATA_ERROR = new ErrorCode(1_002_041_035, "当前排单没有选择板材数据,请进行选择"); public static final ErrorCode DELETE_PLAN_PLATE_DATA_ERROR = new ErrorCode(1_002_041_036, "当前删除的小板信息有误,请检查小板是否存在或重新创建排单"); public static final ErrorCode PLAN_PLATE_OPTIMIZE_DATA_ERROR = new ErrorCode(1_002_041_037, "当前排单对应的优化数据异常,请重新进行优化");