From cb69c5ab7b4000b710a11cd8b27d7f537086d436 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Wed, 5 Aug 2026 14:12:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=AE=A2=E5=8D=95=E8=B4=B4?= =?UTF-8?q?=E7=9A=AE=E5=85=B3=E8=81=94=E5=92=8C=E4=BB=A3=E7=A0=81=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../executor/enums/ErrorCodeConstants.java | 2 + .../veneer/UnplannedVeneerController.java | 10 +- .../admin/veneer/VeneerManageController.java | 12 +- .../vo/UnplannedVeneerPlateDataReqVO.java | 4 +- .../veneer/vo/UnplannedVeneerPlateRespVO.java | 3 + .../vo/VeneerGoodsOrderRelationRespVO.java | 7 +- .../veneer/vo/VeneerManageGoodsPageReqVO.java | 4 +- .../veneer/vo/VeneerManageGoodsRespVO.java | 6 +- .../veneer/vo/VeneerManageOrderPageReqVO.java | 2 +- .../veneer/vo/VeneerManagePlateListReqVO.java | 2 +- .../dal/dataobject/goods/GoodsDO.java | 5 - .../dataobject/veneer/OrderPlateVeneerDO.java | 34 +- .../dataobject/veneer/OrderVeneerGoodsDO.java | 74 ++++ .../veneer/OrderVeneerGoodsKey.java | 10 + .../veneer/OrderVeneerGoodsStatisticsDO.java | 27 ++ .../veneer/OrderVeneerGoodsBatchMapper.java | 14 + .../mysql/veneer/OrderVeneerGoodsMapper.java | 24 ++ .../dal/mysql/veneer/VeneerManageMapper.java | 42 +- .../dal/mysql/veneer/VeneerPlanMapper.java | 13 +- .../veneer/OrderVeneerGoodsService.java | 32 ++ .../veneer/OrderVeneerGoodsServiceImpl.java | 171 ++++++++ .../veneer/VeneerDecomposeServiceImpl.java | 46 ++- .../veneer/VeneerManageServiceImpl.java | 72 ++-- .../service/veneer/VeneerPlanServiceImpl.java | 167 ++++---- .../mapper/veneer/OrderVeneerGoodsMapper.xml | 22 ++ .../mapper/veneer/VeneerManageMapper.xml | 365 +++++++----------- .../mapper/veneer/VeneerPlanMapper.xml | 46 +-- .../message_errorcode_cht.properties | 2 + .../resources/message_errorcode_en.properties | 2 + .../resources/message_errorcode_zh.properties | 2 + 30 files changed, 721 insertions(+), 501 deletions(-) create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/veneer/OrderVeneerGoodsDO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/veneer/OrderVeneerGoodsKey.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/veneer/OrderVeneerGoodsStatisticsDO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/veneer/OrderVeneerGoodsBatchMapper.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/veneer/OrderVeneerGoodsMapper.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/OrderVeneerGoodsService.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/OrderVeneerGoodsServiceImpl.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/veneer/OrderVeneerGoodsMapper.xml 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 e1d2a359b..a4086adaa 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 @@ -215,6 +215,8 @@ public class ErrorCodeConstants { public static final ErrorCode VENEER_DECOMPOSE_PLATE_SIZE_INVALID = new ErrorCode(1_003_009_052, "veneer.decompose.plate.size.invalid"); public static final ErrorCode VENEER_DECOMPOSE_ORDER_IDS_REQUIRED = new ErrorCode(1_003_009_053, "veneer.decompose.order.ids.required"); public static final ErrorCode VENEER_DECOMPOSE_GOODS_IDS_REQUIRED = new ErrorCode(1_003_009_054, "veneer.decompose.goods.ids.required"); + public static final ErrorCode ORDER_VENEER_GOODS_CREATE_FAILED = new ErrorCode(1_003_009_055, "order.veneer.goods.create.failed"); + public static final ErrorCode ORDER_VENEER_GOODS_STATUS_CHANGED = new ErrorCode(1_003_009_056, "order.veneer.goods.status.changed"); //=========== 部件管理 1-003-010-000 ============ public static final ErrorCode ORDER_COMPONENT_NOT_EXIST = new ErrorCode(1_003_010_000, "order.component.not.exist"); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/UnplannedVeneerController.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/UnplannedVeneerController.java index a7e1f21a1..ced0604a1 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/UnplannedVeneerController.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/UnplannedVeneerController.java @@ -49,13 +49,13 @@ public class UnplannedVeneerController { } /** - * 分页查询存在未排贴皮的板材。 + * 分页查询存在未排贴皮的贴皮商品。 * * @param req 分页及筛选条件 - * @return 板材分页列表 + * @return 贴皮商品分页列表 */ @PostMapping("/goods/page") - @Operation(summary = "获取未排贴皮板材分页列表") + @Operation(summary = "获取未排贴皮商品分页列表") @PreAuthorize("@ss.hasPermission('unplannedOrders:query')") public CommonResult> getUnplannedVeneerGoodsPage( @Valid @RequestBody VeneerManageGoodsPageReqVO req) { @@ -63,9 +63,9 @@ public class UnplannedVeneerController { } /** - * 按订单或板材查询未排贴皮、原板件及板件造型数据。 + * 按订单或贴皮商品查询未排贴皮、原板件及板件造型数据。 * - * @param req 订单和/或板材查询范围及可选房间、柜体条件 + * @param req 订单和/或贴皮商品查询范围及可选房间、柜体条件 * @return 未排贴皮排单基础数据 */ @PostMapping("/plate/data") diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/VeneerManageController.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/VeneerManageController.java index 6b8f36a16..521a93286 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/VeneerManageController.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/VeneerManageController.java @@ -53,13 +53,13 @@ public class VeneerManageController { } /** - * 分页查询存在可维护未排单贴皮的板材。 + * 分页查询存在可维护未排单贴皮的贴皮商品。 * * @param req 分页及筛选条件 - * @return 板材分页列表 + * @return 贴皮商品分页列表 */ @PostMapping("/goods/page") - @Operation(summary = "获取贴皮管理板材分页列表") + @Operation(summary = "获取贴皮管理商品分页列表") @PreAuthorize("@ss.hasPermission('unplannedOrders:query')") public CommonResult> getVeneerManageGoodsPage( @Valid @RequestBody VeneerManageGoodsPageReqVO req) { @@ -81,13 +81,13 @@ public class VeneerManageController { } /** - * 按板材查询可维护的未排单板件贴皮列表。 + * 按贴皮商品查询可维护的未排单板件贴皮列表。 * - * @param req 查询条件,必须包含板材商品编码列表 + * @param req 查询条件,必须包含贴皮商品编码列表 * @return 未排单板件贴皮列表 */ @PostMapping("/goods/plate/list") - @Operation(summary = "按板材获取可维护的未排单板件贴皮列表") + @Operation(summary = "按贴皮商品获取可维护的未排单板件贴皮列表") @PreAuthorize("@ss.hasPermission('unplannedOrders:query')") public CommonResult> getVeneerManageGoodsPlateList( @Valid @RequestBody VeneerManagePlateListReqVO req) { diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/UnplannedVeneerPlateDataReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/UnplannedVeneerPlateDataReqVO.java index f70d8942e..fa74219aa 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/UnplannedVeneerPlateDataReqVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/UnplannedVeneerPlateDataReqVO.java @@ -14,10 +14,10 @@ import java.util.List; @Data public class UnplannedVeneerPlateDataReqVO { - @Schema(description = "订单ID列表,与板材商品编码列表至少传入一项") + @Schema(description = "订单ID列表,与贴皮商品编码列表至少传入一项") private List orderIds; - @Schema(description = "板材商品编码列表,与订单ID列表至少传入一项") + @Schema(description = "贴皮商品编码列表,与订单ID列表至少传入一项") private List goodsIds; @Schema(description = "房间ID列表") diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/UnplannedVeneerPlateRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/UnplannedVeneerPlateRespVO.java index c8d776e45..a64bd723d 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/UnplannedVeneerPlateRespVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/UnplannedVeneerPlateRespVO.java @@ -22,6 +22,9 @@ public class UnplannedVeneerPlateRespVO extends VeneerDecomposePlateRespVO { @Schema(description = "订单板材ID") private Long orderGoodsId; + @Schema(description = "订单贴皮商品ID") + private Long orderVeneerGoodsId; + @Schema(description = "贴皮逻辑面:A-A面,B-B面") private String veneerSide; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerGoodsOrderRelationRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerGoodsOrderRelationRespVO.java index 5226d4012..5dd95c42d 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerGoodsOrderRelationRespVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerGoodsOrderRelationRespVO.java @@ -4,12 +4,12 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; /** - * 贴皮板材分组关联订单响应参数。 + * 贴皮商品分组关联订单响应参数。 */ @Data public class VeneerGoodsOrderRelationRespVO { - @Schema(description = "板材商品编码") + @Schema(description = "商品编码") private String goodsId; @Schema(description = "订单ID") @@ -17,4 +17,7 @@ public class VeneerGoodsOrderRelationRespVO { @Schema(description = "订单板材ID,对应 order_goods.id") private Long orderGoodsId; + + @Schema(description = "订单贴皮商品ID,对应 order_veneer_goods.id") + private Long orderVeneerGoodsId; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerManageGoodsPageReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerManageGoodsPageReqVO.java index 1946a68b7..509e96d48 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerManageGoodsPageReqVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerManageGoodsPageReqVO.java @@ -8,7 +8,7 @@ import java.math.BigDecimal; import java.util.List; /** - * 贴皮管理板材分页查询请求参数。 + * 贴皮管理商品分页查询请求参数。 */ @Data public class VeneerManageGoodsPageReqVO extends PageParam { @@ -22,7 +22,7 @@ public class VeneerManageGoodsPageReqVO extends PageParam { @Schema(description = "柜体ID列表") private List bodyIds; - @Schema(description = "板材名称") + @Schema(description = "贴皮商品名称") private String goodsName; @Schema(description = "商品编码") diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerManageGoodsRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerManageGoodsRespVO.java index cf3039be6..cf74fbb46 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerManageGoodsRespVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerManageGoodsRespVO.java @@ -7,15 +7,15 @@ import java.math.BigDecimal; import java.util.List; /** - * 贴皮管理板材分页响应参数。 + * 贴皮管理商品分页响应参数。 */ @Data public class VeneerManageGoodsRespVO { - @Schema(description = "当前板材分组关联的订单") + @Schema(description = "当前贴皮商品分组关联的订单") private List orderIds; - @Schema(description = "板材名称") + @Schema(description = "贴皮商品名称") private String goodsName; @Schema(description = "商品编码") diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerManageOrderPageReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerManageOrderPageReqVO.java index 7b34fcbf1..55452e911 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerManageOrderPageReqVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerManageOrderPageReqVO.java @@ -19,7 +19,7 @@ public class VeneerManageOrderPageReqVO extends PageParam { @Schema(description = "精确限定的订单ID列表") private List orderIds; - @Schema(description = "板材商品编码列表") + @Schema(description = "贴皮商品编码列表") private List goodsIds; @Schema(description = "订单号") diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerManagePlateListReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerManagePlateListReqVO.java index 823e9d88c..34e9709ef 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerManagePlateListReqVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerManagePlateListReqVO.java @@ -20,6 +20,6 @@ public class VeneerManagePlateListReqVO { @Schema(description = "柜体ID列表,仅按订单查询时生效") private List bodyIds; - @Schema(description = "板材商品编码列表") + @Schema(description = "贴皮商品编码列表") private List goodsIds; } 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 35c01e77c..d5a3347d5 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 @@ -113,11 +113,6 @@ public class GoodsDO extends BaseDO { */ private Integer decomposedVeneerPlateNum; - /** - * 已排贴皮板件数量,所有有效贴皮面均已排单时计数 - */ - private Integer plannedVeneerPlateNum; - /** * 板件总面积 */ diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/veneer/OrderPlateVeneerDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/veneer/OrderPlateVeneerDO.java index 4fe2ec5b3..75ba545b7 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/veneer/OrderPlateVeneerDO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/veneer/OrderPlateVeneerDO.java @@ -43,6 +43,11 @@ public class OrderPlateVeneerDO extends BaseDO { */ private Long orderGoodsId; + /** + * 订单贴皮商品主键,对应 {@code order_veneer_goods.id}。 + */ + private Long orderVeneerGoodsId; + /** * 原板件主键,对应 {@code order_plate.id}。 */ @@ -108,33 +113,4 @@ public class OrderPlateVeneerDO extends BaseDO { */ private Long planId; - /** - * 来源贴皮库记录主键,对应 {@code veneers.id}。 - */ - private Long sourceVeneerId; - - /** - * 贴皮商品编号快照。 - */ - private String sourceVeneerNo; - - /** - * 贴皮名称快照。 - */ - private String veneerName; - - /** - * 产品等级快照。 - */ - private Integer productLevel; - - /** - * 颜色快照。 - */ - private String color; - - /** - * 材质快照。 - */ - private String material; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/veneer/OrderVeneerGoodsDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/veneer/OrderVeneerGoodsDO.java new file mode 100644 index 000000000..e0aee2c93 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/veneer/OrderVeneerGoodsDO.java @@ -0,0 +1,74 @@ +package com.cf.imes.module.executor.dal.dataobject.veneer; + +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cf.imes.framework.mybatis.core.dataobject.BaseDO; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * 订单贴皮商品 DO。 + * + *

按订单和贴皮库商品归集板件贴皮,统一保存商品快照及数量统计。

+ */ +@TableName("order_veneer_goods") +@KeySequence("order_veneer_goods_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class OrderVeneerGoodsDO extends BaseDO { + + /** 主键。 */ + @TableId + private Long id; + + /** 组织ID,也是 MyCat 分片键。 */ + private Long organId; + + /** 订单主键,对应 {@code orders.id}。 */ + private Long orderId; + + /** 来源贴皮库主键,对应 {@code veneers.id}。 */ + private Long sourceVeneerId; + + /** 贴皮商品编号快照。 */ + private String goodsId; + + /** 贴皮商品名称快照。 */ + private String goodsName; + + /** 产品等级快照。 */ + private Integer productLevel; + + /** 材质快照。 */ + private String material; + + /** 颜色快照。 */ + private String color; + + /** 厚度快照,单位:mm。 */ + private BigDecimal thickness; + + /** 有效贴皮总数量,A/B 面分别计数。 */ + private Integer veneerNum; + + /** 已排单贴皮数量。 */ + private Integer plannedVeneerNum; + + /** 有效贴皮总面积,单位:平方米。 */ + private BigDecimal veneerArea; + + /** 已排单贴皮面积,单位:平方米。 */ + private BigDecimal plannedVeneerArea; + + /** 乐观锁版本号。 */ + private Integer version; +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/veneer/OrderVeneerGoodsKey.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/veneer/OrderVeneerGoodsKey.java new file mode 100644 index 000000000..94c56842d --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/veneer/OrderVeneerGoodsKey.java @@ -0,0 +1,10 @@ +package com.cf.imes.module.executor.dal.dataobject.veneer; + +/** + * 订单贴皮商品业务唯一键。 + * + * @param orderId 订单主键 + * @param sourceVeneerId 来源贴皮库主键 + */ +public record OrderVeneerGoodsKey(Long orderId, Long sourceVeneerId) { +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/veneer/OrderVeneerGoodsStatisticsDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/veneer/OrderVeneerGoodsStatisticsDO.java new file mode 100644 index 000000000..cb66c9ee2 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/veneer/OrderVeneerGoodsStatisticsDO.java @@ -0,0 +1,27 @@ +package com.cf.imes.module.executor.dal.dataobject.veneer; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 订单贴皮商品数量及面积统计结果。 + */ +@Data +public class OrderVeneerGoodsStatisticsDO { + + /** 订单贴皮商品主键。 */ + private Long orderVeneerGoodsId; + + /** 有效贴皮总数量。 */ + private Integer veneerNum; + + /** 已排单贴皮数量。 */ + private Integer plannedVeneerNum; + + /** 有效贴皮总面积。 */ + private BigDecimal veneerArea; + + /** 已排单贴皮面积。 */ + private BigDecimal plannedVeneerArea; +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/veneer/OrderVeneerGoodsBatchMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/veneer/OrderVeneerGoodsBatchMapper.java new file mode 100644 index 000000000..30b5444cd --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/veneer/OrderVeneerGoodsBatchMapper.java @@ -0,0 +1,14 @@ +package com.cf.imes.module.executor.dal.mysql.veneer; + +import com.cf.imes.framework.mybatis.core.injector.BaseBatchMapper; +import com.cf.imes.module.executor.dal.dataobject.veneer.OrderVeneerGoodsDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 订单贴皮商品批量 Mapper。 + * + *

使用单条 {@code INSERT ... VALUES (...), (...)} SQL 批量写入。

+ */ +@Mapper +public interface OrderVeneerGoodsBatchMapper extends BaseBatchMapper { +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/veneer/OrderVeneerGoodsMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/veneer/OrderVeneerGoodsMapper.java new file mode 100644 index 000000000..eea940bde --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/veneer/OrderVeneerGoodsMapper.java @@ -0,0 +1,24 @@ +package com.cf.imes.module.executor.dal.mysql.veneer; + +import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; +import com.cf.imes.module.executor.dal.dataobject.veneer.OrderVeneerGoodsDO; +import com.cf.imes.module.executor.dal.dataobject.veneer.OrderVeneerGoodsStatisticsDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 订单贴皮商品 Mapper。 + */ +@Mapper +public interface OrderVeneerGoodsMapper extends BaseMapperX { + + /** + * 根据板件贴皮明细重新统计订单贴皮商品数量及面积。 + * + * @param ids 订单贴皮商品主键列表 + * @return 有明细的商品统计结果 + */ + List selectStatistics(@Param("ids") List ids); +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/veneer/VeneerManageMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/veneer/VeneerManageMapper.java index bbc42d7f5..d11fcde14 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/veneer/VeneerManageMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/veneer/VeneerManageMapper.java @@ -59,21 +59,21 @@ public interface VeneerManageMapper { @Param("orderDateTime") LocalDateTime[] orderDateTime); /** - * 分页查询存在可维护未排单贴皮的板材。 + * 分页查询存在可维护未排单贴皮的贴皮商品。 * * @param page 分页参数 - * @param req 板材查询条件 - * @return 板材分页结果 + * @param req 贴皮商品查询条件 + * @return 贴皮商品分页结果 */ IPage selectGoodsPage(@Param("page") IPage page, @Param("req") VeneerManageGoodsPageReqVO req); /** - * 查询当前页贴皮管理板材分组关联的订单。 + * 查询当前页贴皮商品分组关联的订单。 * - * @param goodsIds 当前页板材商品编码 + * @param goodsIds 当前页贴皮商品编码 * @param req 订单、房间及柜体筛选条件 - * @return 板材与订单关系 + * @return 贴皮商品与订单关系 */ List selectGoodsOrderRelationList( @Param("goodsIds") List goodsIds, @@ -105,28 +105,6 @@ public interface VeneerManageMapper { @Param("req") VeneerManageOrderPageReqVO req, @Param("orderDateTime") LocalDateTime[] orderDateTime); - /** - * 分页查询存在待排单贴皮的板材。 - * - * @param page 分页参数 - * @param req 板材查询条件 - * @return 板材分页结果 - */ - IPage selectUnplannedGoodsPage( - @Param("page") IPage page, - @Param("req") VeneerManageGoodsPageReqVO req); - - /** - * 查询当前页未排贴皮板材分组关联的订单。 - * - * @param goodsIds 当前页板材商品编码 - * @param req 订单、房间及柜体筛选条件 - * @return 板材与订单关系 - */ - List selectUnplannedGoodsOrderRelationList( - @Param("goodsIds") List goodsIds, - @Param("req") VeneerManageGoodsPageReqVO req); - /** * 按订单查询可维护的未排单板件贴皮列表。 * @@ -136,19 +114,19 @@ public interface VeneerManageMapper { List selectOrderPlateList(@Param("req") VeneerManagePlateListReqVO req); /** - * 按板材商品编码查询可维护的未排单板件贴皮列表。 + * 按贴皮商品编码查询可维护的未排单板件贴皮列表。 * - * @param req 订单、板材、房间及柜体查询条件 + * @param req 订单、贴皮商品、房间及柜体查询条件 * @return 未排单板件贴皮列表 */ List selectGoodsPlateList( @Param("req") VeneerManagePlateListReqVO req); /** - * 按订单和/或板材范围查询待排单贴皮及其原板件信息。 + * 按订单和/或贴皮商品范围查询待排单贴皮及其原板件信息。 * 同一贴皮可能因多个加工组返回多条,由 Service 层合并。 * - * @param req 订单或板材范围及房间、柜体筛选条件 + * @param req 订单或贴皮商品范围及房间、柜体筛选条件 * @return 待排单贴皮及原板件原始列表 */ List selectUnplannedPlateList( diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/veneer/VeneerPlanMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/veneer/VeneerPlanMapper.java index bb689f511..38b19b6ee 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/veneer/VeneerPlanMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/veneer/VeneerPlanMapper.java @@ -139,19 +139,10 @@ public interface VeneerPlanMapper extends BaseMapperX { @Param("orderIds") List orderIds); /** - * 按订单材质重新统计所有有效贴皮面均已排单的原始板件数量。 - * - * @param orderGoodsIds {@code order_goods} 主键列表 - * @return 订单材质及其所有贴皮面均已排单的板件数量 - */ - List selectGoodsPlannedVeneerPlateCount( - @Param("orderGoodsIds") List orderGoodsIds); - - /** - * 查询待删除排单影响的订单和订单材质范围。 + * 查询待删除排单影响的订单和订单贴皮商品范围。 * * @param planIds 贴皮排单ID列表 - * @return 受影响的订单及订单材质 + * @return 受影响的订单及订单贴皮商品 */ List selectPlanAffectedScope(@Param("planIds") List planIds); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/OrderVeneerGoodsService.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/OrderVeneerGoodsService.java new file mode 100644 index 000000000..5e892f00f --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/OrderVeneerGoodsService.java @@ -0,0 +1,32 @@ +package com.cf.imes.module.executor.service.veneer; + +import com.cf.imes.module.executor.dal.dataobject.veneer.OrderVeneerGoodsDO; +import com.cf.imes.module.executor.dal.dataobject.veneer.OrderVeneerGoodsKey; +import com.cf.imes.module.executor.dal.dataobject.veneer.VeneerDO; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 订单贴皮商品 Service。 + */ +public interface OrderVeneerGoodsService { + + /** + * 查询或创建订单与贴皮库商品的归集关系。 + * + * @param orderIds 订单主键列表 + * @param sourceVeneers 来源贴皮库商品 + * @return 订单和来源贴皮库主键对应的订单贴皮商品 + */ + Map getOrCreate( + List orderIds, Collection sourceVeneers); + + /** + * 根据有效板件贴皮明细重新统计数量及面积。 + * + * @param orderVeneerGoodsIds 订单贴皮商品主键集合 + */ + void refreshStatistics(Collection orderVeneerGoodsIds); +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/OrderVeneerGoodsServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/OrderVeneerGoodsServiceImpl.java new file mode 100644 index 000000000..e41850808 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/OrderVeneerGoodsServiceImpl.java @@ -0,0 +1,171 @@ +package com.cf.imes.module.executor.service.veneer; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +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.cf.imes.framework.common.exception.ServiceException; +import com.cf.imes.framework.security.core.LoginUser; +import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; +import com.cf.imes.module.executor.dal.dataobject.veneer.OrderVeneerGoodsDO; +import com.cf.imes.module.executor.dal.dataobject.veneer.OrderVeneerGoodsKey; +import com.cf.imes.module.executor.dal.dataobject.veneer.OrderVeneerGoodsStatisticsDO; +import com.cf.imes.module.executor.dal.dataobject.veneer.VeneerDO; +import com.cf.imes.module.executor.dal.mysql.veneer.OrderVeneerGoodsBatchMapper; +import com.cf.imes.module.executor.dal.mysql.veneer.OrderVeneerGoodsMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_VENEER_GOODS_CREATE_FAILED; +import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_VENEER_GOODS_STATUS_CHANGED; + +/** + * 订单贴皮商品 Service 实现。 + */ +@Service +public class OrderVeneerGoodsServiceImpl implements OrderVeneerGoodsService { + + /** 查询、插入及统计的单批处理数量。 */ + private static final int BATCH_SIZE = 100; + + @Resource + private OrderVeneerGoodsMapper orderVeneerGoodsMapper; + + @Resource + private OrderVeneerGoodsBatchMapper orderVeneerGoodsBatchMapper; + + @Resource + private IdentifierGenerator identifierGenerator; + + @Override + public Map getOrCreate( + List orderIds, Collection sourceVeneers) { + List normalizedOrderIds = orderIds.stream().filter(Objects::nonNull) + .distinct().sorted().toList(); + Map sourceVeneerMap = new HashMap<>(); + for (VeneerDO sourceVeneer : sourceVeneers) { + sourceVeneerMap.put(sourceVeneer.getId(), sourceVeneer); + } + if (CollUtil.isEmpty(normalizedOrderIds) || sourceVeneerMap.isEmpty()) { + return Map.of(); + } + + // 分批加载已存在的订单贴皮商品,避免订单数量较大时形成超长 IN 条件。 + Map result = new HashMap<>(); + List sourceVeneerIds = new ArrayList<>(sourceVeneerMap.keySet()); + for (List orderIdBatch : CollUtil.split(normalizedOrderIds, BATCH_SIZE)) { + List existingList = orderVeneerGoodsMapper.selectList( + new LambdaQueryWrapper() + .in(OrderVeneerGoodsDO::getOrderId, orderIdBatch) + .in(OrderVeneerGoodsDO::getSourceVeneerId, sourceVeneerIds)); + for (OrderVeneerGoodsDO existing : existingList) { + result.put(new OrderVeneerGoodsKey( + existing.getOrderId(), existing.getSourceVeneerId()), existing); + } + } + + LoginUser loginUser = Objects.requireNonNull(SecurityFrameworkUtils.getLoginUser()); + LocalDateTime now = LocalDateTime.now(); + List createdList = new ArrayList<>(); + for (Long orderId : normalizedOrderIds) { + for (VeneerDO sourceVeneer : sourceVeneerMap.values()) { + OrderVeneerGoodsKey key = new OrderVeneerGoodsKey(orderId, sourceVeneer.getId()); + if (result.containsKey(key)) { + continue; + } + OrderVeneerGoodsDO created = buildOrderVeneerGoods( + orderId, sourceVeneer, loginUser, now); + result.put(key, created); + createdList.add(created); + } + } + + // 使用 BaseBatchMapper 分批执行多值 INSERT,控制单条 SQL 的参数量。 + for (List batch : CollUtil.split(createdList, BATCH_SIZE)) { + int inserted = orderVeneerGoodsBatchMapper.insertBatchSomeColumn(batch); + if (inserted != batch.size()) { + throw new ServiceException(ORDER_VENEER_GOODS_CREATE_FAILED); + } + } + return result; + } + + @Override + public void refreshStatistics(Collection orderVeneerGoodsIds) { + List ids = orderVeneerGoodsIds.stream().filter(Objects::nonNull) + .distinct().sorted().toList(); + for (List idBatch : CollUtil.split(ids, BATCH_SIZE)) { + Map statisticsMap = new HashMap<>(); + for (OrderVeneerGoodsStatisticsDO statistics + : orderVeneerGoodsMapper.selectStatistics(idBatch)) { + statisticsMap.put(statistics.getOrderVeneerGoodsId(), statistics); + } + List goodsList = orderVeneerGoodsMapper.selectList( + new LambdaQueryWrapper() + .select(OrderVeneerGoodsDO::getId, OrderVeneerGoodsDO::getVersion) + .in(OrderVeneerGoodsDO::getId, idBatch)); + if (goodsList.size() != idBatch.size()) { + throw new ServiceException(ORDER_VENEER_GOODS_STATUS_CHANGED); + } + + // 每行携带 version 条件更新,避免并发操作覆盖统计结果。 + for (OrderVeneerGoodsDO goods : goodsList) { + OrderVeneerGoodsStatisticsDO statistics = statisticsMap.get(goods.getId()); + int updated = orderVeneerGoodsMapper.update( + new LambdaUpdateWrapper() + .eq(OrderVeneerGoodsDO::getId, goods.getId()) + .eq(OrderVeneerGoodsDO::getVersion, goods.getVersion()) + .set(OrderVeneerGoodsDO::getVeneerNum, + statistics == null ? 0 : statistics.getVeneerNum()) + .set(OrderVeneerGoodsDO::getPlannedVeneerNum, + statistics == null ? 0 : statistics.getPlannedVeneerNum()) + .set(OrderVeneerGoodsDO::getVeneerArea, + statistics == null ? BigDecimal.ZERO : statistics.getVeneerArea()) + .set(OrderVeneerGoodsDO::getPlannedVeneerArea, + statistics == null ? BigDecimal.ZERO : statistics.getPlannedVeneerArea()) + .set(OrderVeneerGoodsDO::getVersion, goods.getVersion() + 1)); + if (updated != 1) { + throw new ServiceException(ORDER_VENEER_GOODS_STATUS_CHANGED); + } + } + } + } + + /** 构建一条初始化为零统计值的订单贴皮商品。 */ + private OrderVeneerGoodsDO buildOrderVeneerGoods(Long orderId, VeneerDO sourceVeneer, + LoginUser loginUser, LocalDateTime now) { + OrderVeneerGoodsDO goods = OrderVeneerGoodsDO.builder() + .id((Long) identifierGenerator.nextId(null)) + .organId(loginUser.getOrganId()) + .orderId(orderId) + .sourceVeneerId(sourceVeneer.getId()) + .goodsId(sourceVeneer.getVeneerNo()) + .goodsName(sourceVeneer.getVeneerName()) + .productLevel(sourceVeneer.getProductLevel()) + .material(ObjectUtil.defaultIfNull(sourceVeneer.getMaterial(), "")) + .color(ObjectUtil.defaultIfNull(sourceVeneer.getColor(), "")) + .thickness(ObjectUtil.defaultIfNull(sourceVeneer.getThickness(), BigDecimal.ZERO)) + .veneerNum(0) + .plannedVeneerNum(0) + .veneerArea(BigDecimal.ZERO) + .plannedVeneerArea(BigDecimal.ZERO) + .version(0) + .build(); + goods.setCreateTime(now); + goods.setUpdateTime(now); + goods.setCreator(loginUser.getNickname()); + goods.setUpdater(loginUser.getNickname()); + goods.setDeleted(false); + return goods; + } +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerDecomposeServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerDecomposeServiceImpl.java index bd48cb2bb..8f44bd796 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerDecomposeServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerDecomposeServiceImpl.java @@ -27,6 +27,8 @@ import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderModelDO; import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO; import com.cf.imes.module.executor.dal.dataobject.veneer.OrderPlateVeneerDO; +import com.cf.imes.module.executor.dal.dataobject.veneer.OrderVeneerGoodsDO; +import com.cf.imes.module.executor.dal.dataobject.veneer.OrderVeneerGoodsKey; import com.cf.imes.module.executor.dal.dataobject.veneer.VeneerDecomposedPlateCountDO; import com.cf.imes.module.executor.dal.dataobject.veneer.VeneerDO; import com.cf.imes.module.executor.dal.mysql.goods.GoodsMapper; @@ -111,6 +113,9 @@ public class VeneerDecomposeServiceImpl implements VeneerDecomposeService { @Resource private GoodsMapper goodsMapper; + @Resource + private OrderVeneerGoodsService orderVeneerGoodsService; + @Override public PageResult getOrderPage(VeneerDecomposeOrderPageReqVO req) { PageDTO page = new PageDTO<>(req.getPageNo(), req.getPageSize()); @@ -328,18 +333,22 @@ public class VeneerDecomposeServiceImpl implements VeneerDecomposeService { // 从贴皮库加载 A/B 面贴皮,并将贴皮属性以快照形式写入板件贴皮表。 Map sourceVeneerMap = loadSourceVeneers(req); + Map orderVeneerGoodsMap = + orderVeneerGoodsService.getOrCreate(affectedOrderIds, sourceVeneerMap.values()); List plateVeneers = new ArrayList<>(); LoginUser loginUser = Objects.requireNonNull(SecurityFrameworkUtils.getLoginUser()); LocalDateTime createTime = LocalDateTime.now(); for (PlateDO plate : plates) { if (req.getAVeneerId() != null) { plateVeneers.add(buildPlateVeneer( - plate, sourceVeneerMap.get(req.getAVeneerId()), + plate, + getOrderVeneerGoodsId(orderVeneerGoodsMap, plate, req.getAVeneerId()), VeneerSideEnum.A, req.getOuterMargin())); } if (req.getBVeneerId() != null) { plateVeneers.add(buildPlateVeneer( - plate, sourceVeneerMap.get(req.getBVeneerId()), + plate, + getOrderVeneerGoodsId(orderVeneerGoodsMap, plate, req.getBVeneerId()), VeneerSideEnum.B, req.getOuterMargin())); } } @@ -368,6 +377,12 @@ public class VeneerDecomposeServiceImpl implements VeneerDecomposeService { } } + // 明细写入成功后按数据库当前状态重算订单贴皮商品,A/B 面分别计数。 + orderVeneerGoodsService.refreshStatistics(plateVeneers.stream() + .map(OrderPlateVeneerDO::getOrderVeneerGoodsId) + .distinct() + .toList()); + // 以 order_plate 当前状态重新统计,不使用本次请求数量做增量计算。 List affectedOrderGoodsIds = plates.stream() .map(PlateDO::getGoodsId).distinct().sorted().toList(); @@ -515,15 +530,15 @@ public class VeneerDecomposeServiceImpl implements VeneerDecomposeService { } /** - * 根据原板件、贴皮逻辑面及贴皮库快照构建一条板件贴皮记录。 + * 根据原板件、订单贴皮商品及贴皮逻辑面构建一条板件贴皮记录。 * * @param plate 原板件 - * @param sourceVeneer 选中的贴皮库数据 + * @param orderVeneerGoodsId 订单贴皮商品主键 * @param veneerSide 贴皮逻辑面枚举 * @param outerMargin 外扩余量 * @return 待保存的板件贴皮记录 */ - private OrderPlateVeneerDO buildPlateVeneer(PlateDO plate, VeneerDO sourceVeneer, + private OrderPlateVeneerDO buildPlateVeneer(PlateDO plate, Long orderVeneerGoodsId, VeneerSideEnum veneerSide, BigDecimal outerMargin) { BigDecimal actualOuterMargin = ObjectUtil.defaultIfNull(outerMargin, BigDecimal.TEN); BigDecimal sourceLength = plate.getHeight(); @@ -549,6 +564,7 @@ public class VeneerDecomposeServiceImpl implements VeneerDecomposeService { .organId(plate.getOrganId()) .orderId(plate.getOrderId()) .orderGoodsId(plate.getGoodsId()) + .orderVeneerGoodsId(orderVeneerGoodsId) .orderPlateId(plate.getId()) .plateNo(plate.getPlateNo()) .plateName(plate.getName()) @@ -562,15 +578,23 @@ public class VeneerDecomposeServiceImpl implements VeneerDecomposeService { .outerMargin(actualOuterMargin) .veneerArea(veneerArea) .planId(0L) - .sourceVeneerId(sourceVeneer.getId()) - .sourceVeneerNo(sourceVeneer.getVeneerNo()) - .veneerName(sourceVeneer.getVeneerName()) - .productLevel(sourceVeneer.getProductLevel()) - .color(ObjectUtil.defaultIfNull(sourceVeneer.getColor(), "")) - .material(ObjectUtil.defaultIfNull(sourceVeneer.getMaterial(), "")) .build(); } + /** + * 获取板件当前订单与来源贴皮库商品对应的订单贴皮商品主键。 + */ + private Long getOrderVeneerGoodsId( + Map orderVeneerGoodsMap, + PlateDO plate, Long sourceVeneerId) { + OrderVeneerGoodsDO orderVeneerGoods = orderVeneerGoodsMap.get( + new OrderVeneerGoodsKey(plate.getOrderId(), sourceVeneerId)); + if (orderVeneerGoods == null) { + throw new ServiceException(VENEER_DECOMPOSE_RECORD_INSERT_FAILED); + } + return orderVeneerGoods.getId(); + } + /** * 根据 WebCAD 排版面和贴皮逻辑面确定实际板件面。 * 反面排版时 A 面对应反面、B 面对应正面;正面或随意面排版时关系相反。 diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerManageServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerManageServiceImpl.java index c116da230..add72ee93 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerManageServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerManageServiceImpl.java @@ -26,6 +26,8 @@ import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerManageResele import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderModelDO; import com.cf.imes.module.executor.dal.dataobject.veneer.OrderPlateVeneerDO; +import com.cf.imes.module.executor.dal.dataobject.veneer.OrderVeneerGoodsDO; +import com.cf.imes.module.executor.dal.dataobject.veneer.OrderVeneerGoodsKey; import com.cf.imes.module.executor.dal.dataobject.veneer.VeneerDO; import com.cf.imes.module.executor.dal.mysql.order.OrderMapper; import com.cf.imes.module.executor.dal.mysql.veneer.OrderPlateVeneerMapper; @@ -87,6 +89,9 @@ public class VeneerManageServiceImpl implements VeneerManageService { @Resource private VeneerDecomposeService veneerDecomposeService; + @Resource + private OrderVeneerGoodsService orderVeneerGoodsService; + @Resource private OrderMapper orderMapper; @@ -112,7 +117,7 @@ public class VeneerManageServiceImpl implements VeneerManageService { IPage result = veneerManageMapper.selectGoodsPage( new PageDTO<>(req.getPageNo(), req.getPageSize()), req); List goodsList = result.getRecords(); - fillGoodsOrderRelations(goodsList, req, false); + fillGoodsOrderRelations(goodsList, req); return new PageResult<>(goodsList, result.getTotal()); } @@ -155,10 +160,10 @@ public class VeneerManageServiceImpl implements VeneerManageService { @Override public PageResult getUnplannedGoodsPage(VeneerManageGoodsPageReqVO req) { - IPage result = veneerManageMapper.selectUnplannedGoodsPage( + IPage result = veneerManageMapper.selectGoodsPage( new PageDTO<>(req.getPageNo(), req.getPageSize()), req); List goodsList = result.getRecords(); - fillGoodsOrderRelations(goodsList, req, true); + fillGoodsOrderRelations(goodsList, req); return new PageResult<>(goodsList, result.getTotal()); } @@ -167,11 +172,9 @@ public class VeneerManageServiceImpl implements VeneerManageService { * * @param goodsList 当前页板材分组 * @param req 订单、房间及柜体筛选条件 - * @param unplanned 是否使用未排贴皮查询口径 */ private void fillGoodsOrderRelations(List goodsList, - VeneerManageGoodsPageReqVO req, - boolean unplanned) { + VeneerManageGoodsPageReqVO req) { if (CollUtil.isEmpty(goodsList)) { return; } @@ -179,9 +182,8 @@ public class VeneerManageServiceImpl implements VeneerManageService { .map(VeneerManageGoodsRespVO::getGoodsId) .distinct() .toList(); - List relations = unplanned - ? veneerManageMapper.selectUnplannedGoodsOrderRelationList(goodsIds, req) - : veneerManageMapper.selectGoodsOrderRelationList(goodsIds, req); + List relations = + veneerManageMapper.selectGoodsOrderRelationList(goodsIds, req); Map> relationMap = new HashMap<>(); for (VeneerGoodsOrderRelationRespVO relation : relations) { relationMap.computeIfAbsent(relation.getGoodsId(), key -> new ArrayList<>()) @@ -361,34 +363,50 @@ public class VeneerManageServiceImpl implements VeneerManageService { throw new ServiceException(VENEER_NOT_EXIST); } + Set affectedOrderVeneerGoodsIds = new HashSet<>(); for (List idBatch : CollUtil.split(ids, RESELECT_BATCH_SIZE)) { // 仅查询未排单记录;已删除、已排单或状态发生变化时统一按并发冲突处理。 List records = orderPlateVeneerMapper.selectList( new LambdaQueryWrapper() - .select(OrderPlateVeneerDO::getId) + .select(OrderPlateVeneerDO::getId, + OrderPlateVeneerDO::getOrderId, + OrderPlateVeneerDO::getOrderVeneerGoodsId) .eq(OrderPlateVeneerDO::getPlanId, 0L) .in(OrderPlateVeneerDO::getId, idBatch)); if (records.size() != idBatch.size()) { throw new ServiceException(VENEER_RESELECT_RECORD_STATUS_CHANGED); } - // 更新时再次限制未排单状态,避免查询后被其他用户排单仍可重选贴皮。 - int updated = orderPlateVeneerMapper.update( - new LambdaUpdateWrapper() - .eq(OrderPlateVeneerDO::getPlanId, 0L) - .in(OrderPlateVeneerDO::getId, idBatch) - .set(OrderPlateVeneerDO::getSourceVeneerId, veneer.getId()) - .set(OrderPlateVeneerDO::getSourceVeneerNo, veneer.getVeneerNo()) - .set(OrderPlateVeneerDO::getVeneerName, veneer.getVeneerName()) - .set(OrderPlateVeneerDO::getProductLevel, veneer.getProductLevel()) - .set(OrderPlateVeneerDO::getColor, - ObjectUtil.defaultIfNull(veneer.getColor(), "")) - .set(OrderPlateVeneerDO::getMaterial, - ObjectUtil.defaultIfNull(veneer.getMaterial(), ""))); - if (updated != idBatch.size()) { - throw new ServiceException(VENEER_RESELECT_RECORD_STATUS_CHANGED); + List orderIds = records.stream().map(OrderPlateVeneerDO::getOrderId) + .distinct().sorted().toList(); + Map targetGoodsMap = + orderVeneerGoodsService.getOrCreate(orderIds, List.of(veneer)); + Map> targetRecordIds = new HashMap<>(); + for (OrderPlateVeneerDO record : records) { + OrderVeneerGoodsDO targetGoods = targetGoodsMap.get( + new OrderVeneerGoodsKey(record.getOrderId(), veneer.getId())); + if (targetGoods == null) { + throw new ServiceException(VENEER_RESELECT_RECORD_STATUS_CHANGED); + } + targetRecordIds.computeIfAbsent(targetGoods.getId(), key -> new ArrayList<>()) + .add(record.getId()); + affectedOrderVeneerGoodsIds.add(record.getOrderVeneerGoodsId()); + affectedOrderVeneerGoodsIds.add(targetGoods.getId()); + } + + // 按目标订单贴皮商品分组更新,再次限制 plan_id=0 防止并发排单后仍被重选。 + for (Map.Entry> entry : targetRecordIds.entrySet()) { + int updated = orderPlateVeneerMapper.update( + new LambdaUpdateWrapper() + .eq(OrderPlateVeneerDO::getPlanId, 0L) + .in(OrderPlateVeneerDO::getId, entry.getValue()) + .set(OrderPlateVeneerDO::getOrderVeneerGoodsId, entry.getKey())); + if (updated != entry.getValue().size()) { + throw new ServiceException(VENEER_RESELECT_RECORD_STATUS_CHANGED); + } } } + orderVeneerGoodsService.refreshStatistics(affectedOrderVeneerGoodsIds); } /** @@ -430,6 +448,10 @@ public class VeneerManageServiceImpl implements VeneerManageService { List restoredPlateIds = plateIds.stream() .filter(plateId -> !remainingPlateIds.contains(plateId)) .toList(); + orderVeneerGoodsService.refreshStatistics(selectedRecords.stream() + .map(OrderPlateVeneerDO::getOrderVeneerGoodsId) + .distinct() + .toList()); if (CollUtil.isEmpty(restoredPlateIds)) { return; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerPlanServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerPlanServiceImpl.java index fa87f928e..88eec5585 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerPlanServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerPlanServiceImpl.java @@ -26,18 +26,16 @@ import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanSortReqV import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanSortRespVO; import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanUpdateReqVO; import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanWithdrawProduceReqVO; -import com.cf.imes.module.executor.dal.dataobject.goods.GoodsDO; import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; import com.cf.imes.module.executor.dal.dataobject.veneer.OrderPlateVeneerDO; +import com.cf.imes.module.executor.dal.dataobject.veneer.OrderVeneerGoodsDO; import com.cf.imes.module.executor.dal.dataobject.veneer.OrderVeneerPlanDO; -import com.cf.imes.module.executor.dal.dataobject.veneer.VeneerDO; import com.cf.imes.module.executor.dal.dataobject.veneer.VeneerPlannedPlateCountDO; import com.cf.imes.module.executor.dal.dataobject.veneer.VeneerPlanStatisticsDO; -import com.cf.imes.module.executor.dal.mysql.goods.GoodsMapper; import com.cf.imes.module.executor.dal.mysql.order.OrderMapper; import com.cf.imes.module.executor.dal.mysql.veneer.OrderVeneerPlanBatchMapper; +import com.cf.imes.module.executor.dal.mysql.veneer.OrderVeneerGoodsMapper; import com.cf.imes.module.executor.dal.mysql.veneer.VeneerPlanMapper; -import com.cf.imes.module.executor.dal.mysql.veneer.VeneerMapper; import com.cf.imes.module.executor.enums.VeneerPlanStatusEnum; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; @@ -58,7 +56,6 @@ import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; -import static com.cf.imes.module.executor.enums.ErrorCodeConstants.GOODS_PLATE_UPDATE_CONCURRENCY_ERROR; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_PLATE_UPDATE_CONCURRENCY_ERROR; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.VENEER_PLAN_AREA_DATA_INVALID; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.VENEER_PLAN_CREATE_FAILED; @@ -82,9 +79,7 @@ import static com.cf.imes.module.executor.enums.ErrorCodeConstants.VENEER_PLAN_R import static com.cf.imes.module.executor.enums.ErrorCodeConstants.VENEER_PLAN_SORT_RECORD_DUPLICATE; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.VENEER_PLAN_SORT_RECORD_REQUIRED; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.VENEER_PLAN_SORT_STATUS_CHANGED; -import static com.cf.imes.module.executor.enums.ErrorCodeConstants.VENEER_PLAN_SOURCE_NO_DUPLICATE; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.VENEER_PLAN_SOURCE_NO_MISMATCH; -import static com.cf.imes.module.executor.enums.ErrorCodeConstants.VENEER_PLAN_SOURCE_NO_NOT_EXIST; /** * 贴皮排单 Service 实现。 @@ -137,16 +132,15 @@ public class VeneerPlanServiceImpl implements VeneerPlanService { private OrderMapper orderMapper; @Resource - private GoodsMapper goodsMapper; + private OrderVeneerGoodsMapper orderVeneerGoodsMapper; @Resource - private VeneerMapper veneerMapper; + private OrderVeneerGoodsService orderVeneerGoodsService; @Override @Transactional(rollbackFor = Exception.class) public void createPlan(VeneerPlanCreateReqVO req) { Map> groupIdMap = normalizeGroups(req.getGroups()); - Map sourceVeneerIdMap = loadSourceVeneerIdMap(groupIdMap.keySet()); List veneerIds = groupIdMap.values().stream().flatMap(List::stream).toList(); // 将所有分组ID统一分批查询,避免逐组查询产生N+1,同时控制IN条件长度。 @@ -157,6 +151,8 @@ public class VeneerPlanServiceImpl implements VeneerPlanService { if (veneers.size() != veneerIds.size()) { throw new ServiceException(VENEER_PLAN_RECORD_STATUS_CHANGED); } + Map orderVeneerGoodsMap = + loadOrderVeneerGoodsMap(veneers); Map veneerMap = new HashMap<>(veneers.size()); for (OrderPlateVeneerDO veneer : veneers) { @@ -171,7 +167,7 @@ public class VeneerPlanServiceImpl implements VeneerPlanService { // 前端已按贴皮商品编号分组;后端逐组校验归属,并为每个分组创建一个排单。 for (Map.Entry> entry : groupIdMap.entrySet()) { String sourceVeneerNo = entry.getKey(); - Long sourceVeneerId = sourceVeneerIdMap.get(sourceVeneerNo); + Long sourceVeneerId = null; List groupIds = entry.getValue(); List group = new ArrayList<>(groupIds.size()); for (Long veneerId : groupIds) { @@ -179,7 +175,16 @@ public class VeneerPlanServiceImpl implements VeneerPlanService { if (veneer == null) { throw new ServiceException(VENEER_PLAN_RECORD_STATUS_CHANGED); } - if (!StrUtil.equals(sourceVeneerNo, veneer.getSourceVeneerNo())) { + OrderVeneerGoodsDO orderVeneerGoods = + orderVeneerGoodsMap.get(veneer.getOrderVeneerGoodsId()); + if (orderVeneerGoods == null + || !StrUtil.equals(sourceVeneerNo, orderVeneerGoods.getGoodsId())) { + throw new ServiceException( + VENEER_PLAN_SOURCE_NO_MISMATCH, veneerId, sourceVeneerNo); + } + if (sourceVeneerId == null) { + sourceVeneerId = orderVeneerGoods.getSourceVeneerId(); + } else if (!Objects.equals(sourceVeneerId, orderVeneerGoods.getSourceVeneerId())) { throw new ServiceException( VENEER_PLAN_SOURCE_NO_MISMATCH, veneerId, sourceVeneerNo); } @@ -230,12 +235,11 @@ public class VeneerPlanServiceImpl implements VeneerPlanService { .distinct() .sorted() .toList(); - List affectedOrderGoodsIds = veneers.stream() - .map(OrderPlateVeneerDO::getOrderGoodsId) + refreshOrderPlannedVeneerPlateCount(affectedOrderIds); + orderVeneerGoodsService.refreshStatistics(veneers.stream() + .map(OrderPlateVeneerDO::getOrderVeneerGoodsId) .distinct() - .sorted() - .toList(); - refreshPlannedVeneerPlateCount(affectedOrderIds, affectedOrderGoodsIds); + .toList()); } /** @@ -342,8 +346,14 @@ public class VeneerPlanServiceImpl implements VeneerPlanService { if (veneers.size() != veneerIds.size()) { throw new ServiceException(VENEER_PLAN_PLATE_STATUS_CHANGED); } + Map orderVeneerGoodsMap = + loadOrderVeneerGoodsMap(veneers); for (OrderPlateVeneerDO veneer : veneers) { - if (!Objects.equals(plan.getSourceVeneerId(), veneer.getSourceVeneerId())) { + OrderVeneerGoodsDO orderVeneerGoods = + orderVeneerGoodsMap.get(veneer.getOrderVeneerGoodsId()); + if (orderVeneerGoods == null + || !Objects.equals(plan.getSourceVeneerId(), + orderVeneerGoods.getSourceVeneerId())) { throw new ServiceException(VENEER_PLAN_PLATE_SOURCE_MISMATCH, veneer.getId()); } } @@ -457,7 +467,7 @@ public class VeneerPlanServiceImpl implements VeneerPlanService { } } - // 删除前读取受影响范围,恢复贴皮后仍可据此重新统计订单及订单材质数量。 + // 删除前读取受影响范围,恢复贴皮后仍可据此重新统计订单及订单贴皮商品数量。 List affectedScopes = veneerPlanMapper.selectPlanAffectedScope(normalizedPlanIds); int expectedVeneerCount = 0; @@ -487,12 +497,11 @@ public class VeneerPlanServiceImpl implements VeneerPlanService { .distinct() .sorted() .toList(); - List affectedOrderGoodsIds = affectedScopes.stream() - .map(OrderPlateVeneerDO::getOrderGoodsId) + refreshOrderPlannedVeneerPlateCount(affectedOrderIds); + orderVeneerGoodsService.refreshStatistics(affectedScopes.stream() + .map(OrderPlateVeneerDO::getOrderVeneerGoodsId) .distinct() - .sorted() - .toList(); - refreshPlannedVeneerPlateCount(affectedOrderIds, affectedOrderGoodsIds); + .toList()); } /** @@ -690,7 +699,7 @@ public class VeneerPlanServiceImpl implements VeneerPlanService { } /** - * 根据本次新增或移除贴皮的归属范围重新统计订单及订单材质数量。 + * 根据本次新增或移除贴皮的归属范围重新统计订单及订单贴皮商品数量。 * * @param veneers 本次操作的板件贴皮记录 */ @@ -700,56 +709,43 @@ public class VeneerPlanServiceImpl implements VeneerPlanService { .distinct() .sorted() .toList(); - List orderGoodsIds = veneers.stream() - .map(OrderPlateVeneerDO::getOrderGoodsId) + refreshOrderPlannedVeneerPlateCount(orderIds); + orderVeneerGoodsService.refreshStatistics(veneers.stream() + .map(OrderPlateVeneerDO::getOrderVeneerGoodsId) + .distinct() + .toList()); + } + + /** + * 批量加载板件贴皮关联的订单贴皮商品。 + * + * @param veneers 板件贴皮列表 + * @return 订单贴皮商品主键与商品数据的映射 + */ + private Map loadOrderVeneerGoodsMap( + List veneers) { + List orderVeneerGoodsIds = veneers.stream() + .map(OrderPlateVeneerDO::getOrderVeneerGoodsId) + .filter(Objects::nonNull) .distinct() .sorted() .toList(); - refreshPlannedVeneerPlateCount(orderIds, orderGoodsIds); - } - - /** - * 按贴皮商品编号批量查询组织内贴皮库主键,并校验编号唯一性和完整性。 - * - * @param sourceVeneerNos 本次排单涉及的贴皮商品编号集合 - * @return 贴皮商品编号与贴皮库主键的映射 - */ - private Map loadSourceVeneerIdMap(Set sourceVeneerNos) { - List sourceVeneers = new ArrayList<>(); - List sourceVeneerNoList = new ArrayList<>(sourceVeneerNos); - for (List sourceVeneerNoBatch - : CollUtil.split(sourceVeneerNoList, PLAN_BATCH_SIZE)) { - sourceVeneers.addAll(veneerMapper.selectList( - new LambdaQueryWrapper() - .select(VeneerDO::getId, VeneerDO::getVeneerNo) - .in(VeneerDO::getVeneerNo, sourceVeneerNoBatch))); - } - Map sourceVeneerIdMap = new HashMap<>(sourceVeneers.size()); - for (VeneerDO sourceVeneer : sourceVeneers) { - Long previousId = sourceVeneerIdMap.putIfAbsent( - sourceVeneer.getVeneerNo(), sourceVeneer.getId()); - if (previousId != null) { - throw new ServiceException( - VENEER_PLAN_SOURCE_NO_DUPLICATE, sourceVeneer.getVeneerNo()); + Map result = new HashMap<>(orderVeneerGoodsIds.size()); + for (List idBatch : CollUtil.split(orderVeneerGoodsIds, PLAN_BATCH_SIZE)) { + List goodsList = orderVeneerGoodsMapper.selectList( + new LambdaQueryWrapper() + .select(OrderVeneerGoodsDO::getId, + OrderVeneerGoodsDO::getSourceVeneerId, + OrderVeneerGoodsDO::getGoodsId) + .in(OrderVeneerGoodsDO::getId, idBatch)); + for (OrderVeneerGoodsDO goods : goodsList) { + result.put(goods.getId(), goods); } } - for (String sourceVeneerNo : sourceVeneerNos) { - if (!sourceVeneerIdMap.containsKey(sourceVeneerNo)) { - throw new ServiceException(VENEER_PLAN_SOURCE_NO_NOT_EXIST, sourceVeneerNo); - } + if (result.size() != orderVeneerGoodsIds.size()) { + throw new ServiceException(VENEER_PLAN_RECORD_STATUS_CHANGED); } - return sourceVeneerIdMap; - } - - /** - * 根据板件贴皮当前排单状态,重新统计订单和订单材质的已排贴皮板件数量。 - * - * @param orderIds 订单ID列表 - * @param orderGoodsIds {@code order_goods} 主键列表 - */ - private void refreshPlannedVeneerPlateCount(List orderIds, List orderGoodsIds) { - refreshOrderPlannedVeneerPlateCount(orderIds); - refreshGoodsPlannedVeneerPlateCount(orderGoodsIds); + return result; } /** @@ -785,39 +781,6 @@ public class VeneerPlanServiceImpl implements VeneerPlanService { } } - /** - * 分批重新统计并覆盖订单材质的已排贴皮板件数量,更新时使用 version 进行乐观锁校验。 - * - * @param orderGoodsIds {@code order_goods} 主键列表 - */ - private void refreshGoodsPlannedVeneerPlateCount(List orderGoodsIds) { - for (List orderGoodsIdBatch : CollUtil.split(orderGoodsIds, PLAN_STAT_BATCH_SIZE)) { - Map goodsMap = new HashMap<>(); - for (GoodsDO goods : goodsMapper.selectByIds(orderGoodsIdBatch)) { - goodsMap.put(goods.getId(), goods); - } - Map countMap = convertPlannedVeneerPlateCount( - veneerPlanMapper.selectGoodsPlannedVeneerPlateCount(orderGoodsIdBatch)); - - for (Long orderGoodsId : orderGoodsIdBatch) { - GoodsDO goods = goodsMap.get(orderGoodsId); - if (goods == null) { - throw new ServiceException(GOODS_PLATE_UPDATE_CONCURRENCY_ERROR, orderGoodsId); - } - int version = goods.getVersion(); - int updated = goodsMapper.update(new LambdaUpdateWrapper() - .eq(GoodsDO::getId, orderGoodsId) - .eq(GoodsDO::getVersion, version) - .set(GoodsDO::getPlannedVeneerPlateNum, - countMap.getOrDefault(orderGoodsId, 0)) - .set(GoodsDO::getVersion, version + 1)); - if (updated == 0) { - throw new ServiceException(GOODS_PLATE_UPDATE_CONCURRENCY_ERROR, orderGoodsId); - } - } - } - } - /** * 将数据库聚合结果转换为目标ID与已排贴皮板件数量的映射。 * diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/veneer/OrderVeneerGoodsMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/veneer/OrderVeneerGoodsMapper.xml new file mode 100644 index 000000000..b334be280 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/veneer/OrderVeneerGoodsMapper.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/veneer/VeneerManageMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/veneer/VeneerManageMapper.xml index 4db12285a..41cb202af 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/veneer/VeneerManageMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/veneer/VeneerManageMapper.xml @@ -68,13 +68,13 @@ AND EXISTS ( SELECT 1 FROM order_plate_veneer opv - JOIN order_goods og ON og.order_id = opv.order_id - AND og.id = opv.order_goods_id + JOIN order_veneer_goods ovg ON ovg.order_id = opv.order_id + AND ovg.id = opv.order_veneer_goods_id WHERE opv.order_id = o.id AND opv.deleted = false AND opv.plan_id = 0 - AND og.deleted = false - AND og.goods_id IN + AND ovg.deleted = false + AND ovg.goods_id IN #{goodsId} @@ -145,13 +145,13 @@ AND EXISTS ( SELECT 1 FROM order_plate_veneer opv - JOIN order_goods og ON og.order_id = opv.order_id - AND og.id = opv.order_goods_id + JOIN order_veneer_goods ovg ON ovg.order_id = opv.order_id + AND ovg.id = opv.order_veneer_goods_id WHERE opv.order_id = o.id AND opv.deleted = false AND opv.plan_id = 0 - AND og.deleted = false - AND og.goods_id IN + AND ovg.deleted = false + AND ovg.goods_id IN #{goodsId} @@ -182,53 +182,63 @@ ORDER BY o.id DESC - - AND EXISTS ( - SELECT 1 - FROM order_plate_veneer opv - WHERE opv.order_id = og.order_id - AND opv.order_goods_id = og.id - AND opv.deleted = false - AND opv.plan_id = 0 - + SELECT ovg.goods_id AS goodsId, + ovg.goods_name AS goodsName, + ovg.material, + ovg.color, + ovg.thickness, + + - AND EXISTS ( - SELECT 1 FROM order_item oi - WHERE oi.order_id = opv.order_id - AND oi.plate_id = opv.order_plate_id - AND oi.plate_id != 0 - - AND oi.room_id IN - - #{roomId} - - - - AND oi.body_id IN - - #{bodyId} - - - ) - - ) - - - + COUNT(opv.id) AS num, + COALESCE(ROUND(SUM(opv.veneer_area), 3), 0) AS area + + + SUM(ovg.veneer_num - ovg.planned_veneer_num) AS num, + COALESCE(ROUND(SUM(ovg.veneer_area - ovg.planned_veneer_area), 3), 0) AS area + + + FROM order_veneer_goods ovg + JOIN orders o ON o.id = ovg.order_id + + JOIN order_plate_veneer opv ON opv.order_id = ovg.order_id + AND opv.order_veneer_goods_id = ovg.id + AND opv.deleted = false + AND opv.plan_id = 0 + + WHERE o.deleted = false + AND o.status IN (1, 2, 3) + AND ovg.deleted = false + AND ovg.veneer_num > ovg.planned_veneer_num + + AND ovg.order_id IN + + #{orderId} + + + + AND ovg.goods_name LIKE CONCAT('%', #{req.goodsName}, '%') + + + AND ovg.goods_id LIKE CONCAT('%', #{req.goodsId}, '%') + + + AND ovg.material LIKE CONCAT('%', #{req.material}, '%') + + + AND ovg.color LIKE CONCAT('%', #{req.color}, '%') + + + AND ovg.thickness = #{req.thickness} + - AND EXISTS ( - SELECT 1 FROM order_plate_veneer opv - WHERE opv.order_id = op.order_id - AND opv.order_goods_id = og.id - AND opv.order_plate_id = op.id - AND opv.deleted = false - AND opv.plan_id = 0 - ) AND EXISTS ( SELECT 1 FROM order_item oi - WHERE oi.order_id = op.order_id - AND oi.plate_id = op.id + WHERE oi.order_id = opv.order_id + AND oi.plate_id = opv.order_plate_id AND oi.plate_id != 0 AND oi.room_id IN @@ -244,89 +254,58 @@ ) - - - - - - - SELECT FROM order_plate_veneer opv - JOIN order_goods og ON og.order_id = opv.order_id - AND og.id = opv.order_goods_id + JOIN order_veneer_goods ovg ON ovg.order_id = opv.order_id + AND ovg.id = opv.order_veneer_goods_id WHERE opv.deleted = false AND opv.plan_id = 0 - AND og.deleted = false + AND ovg.deleted = false AND opv.order_id IN #{orderId} - AND og.goods_id IN + AND ovg.goods_id IN #{goodsId} @@ -597,12 +495,12 @@ SELECT FROM order_plate_veneer opv - JOIN order_goods og ON og.order_id = opv.order_id - AND og.id = opv.order_goods_id + JOIN order_veneer_goods ovg ON ovg.order_id = opv.order_id + AND ovg.id = opv.order_veneer_goods_id WHERE opv.deleted = false AND opv.plan_id = 0 - AND og.deleted = false - AND og.goods_id IN + AND ovg.deleted = false + AND ovg.goods_id IN #{goodsId} @@ -640,16 +538,17 @@ opv.id, opv.order_id AS orderId, opv.order_goods_id AS orderGoodsId, + opv.order_veneer_goods_id AS orderVeneerGoodsId, opv.veneer_side AS veneerSide, opv.plate_surface AS plateSurface, opv.veneer_no AS veneerNo, opv.outer_margin AS outerMargin, - opv.source_veneer_id AS sourceVeneerId, - opv.source_veneer_no AS sourceVeneerNo, - opv.veneer_name AS veneerName, - opv.product_level AS productLevel, - opv.color AS veneerColor, - opv.material AS veneerMaterial, + ovg.source_veneer_id AS sourceVeneerId, + ovg.goods_id AS sourceVeneerNo, + ovg.goods_name AS veneerName, + ovg.product_level AS productLevel, + ovg.color AS veneerColor, + ovg.material AS veneerMaterial, op.id AS plateId, og.goods_id AS goodsId, og.goods_name AS goodsName, @@ -722,6 +621,8 @@ JOIN order_goods og ON og.order_id = opv.order_id AND og.id = opv.order_goods_id AND og.id = op.goods_id + JOIN order_veneer_goods ovg ON ovg.order_id = opv.order_id + AND ovg.id = opv.order_veneer_goods_id JOIN order_item oi ON oi.order_id = op.order_id AND oi.plate_id = op.id AND oi.plate_id != 0 @@ -731,6 +632,7 @@ AND opv.plan_id = 0 AND op.deleted = false AND og.deleted = false + AND ovg.deleted = false AND opv.order_id IN @@ -738,7 +640,7 @@ - AND og.goods_id IN + AND ovg.goods_id IN #{goodsId} @@ -750,13 +652,13 @@ AND opv.plate_no LIKE CONCAT('%', #{req.plateNo}, '%') - AND opv.source_veneer_no LIKE CONCAT('%', #{req.sourceVeneerNo}, '%') + AND ovg.goods_id LIKE CONCAT('%', #{req.sourceVeneerNo}, '%') - AND opv.material LIKE CONCAT('%', #{req.material}, '%') + AND ovg.material LIKE CONCAT('%', #{req.material}, '%') - AND opv.color LIKE CONCAT('%', #{req.color}, '%') + AND ovg.color LIKE CONCAT('%', #{req.color}, '%') AND opv.plate_name LIKE CONCAT('%', #{req.plateName}, '%') @@ -790,6 +692,7 @@ SELECT opv.id, opv.order_id AS orderId, opv.order_goods_id AS orderGoodsId, + opv.order_veneer_goods_id AS orderVeneerGoodsId, opv.order_plate_id AS orderPlateId FROM order_plate_veneer opv WHERE opv.deleted = true diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/veneer/VeneerPlanMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/veneer/VeneerPlanMapper.xml index d8648e3cb..f5812852b 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/veneer/VeneerPlanMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/veneer/VeneerPlanMapper.xml @@ -89,8 +89,9 @@ SELECT opv.id, opv.order_id AS orderId, opv.order_goods_id AS orderGoodsId, + opv.order_veneer_goods_id AS orderVeneerGoodsId, opv.order_plate_id AS orderPlateId, - opv.source_veneer_id AS sourceVeneerId + opv.plan_id AS planId FROM order_plate_veneer opv WHERE opv.deleted = false AND opv.plan_id = #{planId} @@ -146,12 +147,15 @@ opv.plate_length AS length, opv.plate_width AS width, opv.plate_thickness AS thickness, - opv.source_veneer_no AS sourceVeneerNo, - opv.veneer_name AS veneerName, - opv.product_level AS productLevel, - opv.color, - opv.material + ovg.goods_id AS sourceVeneerNo, + ovg.goods_name AS veneerName, + ovg.product_level AS productLevel, + ovg.color, + ovg.material FROM order_plate_veneer opv + JOIN order_veneer_goods ovg ON ovg.order_id = opv.order_id + AND ovg.id = opv.order_veneer_goods_id + AND ovg.deleted = false WHERE opv.deleted = false AND opv.plan_id = #{planId} ORDER BY opv.order_plate_id DESC, opv.veneer_side @@ -163,11 +167,10 @@ opv.organ_id AS organId, opv.order_id AS orderId, opv.order_goods_id AS orderGoodsId, + opv.order_veneer_goods_id AS orderVeneerGoodsId, opv.order_plate_id AS orderPlateId, opv.plate_no AS plateNo, - opv.veneer_area AS veneerArea, - opv.source_veneer_id AS sourceVeneerId, - opv.source_veneer_no AS sourceVeneerNo + opv.veneer_area AS veneerArea FROM order_plate_veneer opv WHERE opv.deleted = false AND opv.plan_id = 0 @@ -212,33 +215,10 @@ GROUP BY opv.order_id - -