From cd2f1e3f774a64b57ecd768dac533978898c0e8b Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Mon, 13 Jul 2026 14:37:31 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E5=B9=B6=E4=B8=8B=E7=BA=A7=E9=83=A8?= =?UTF-8?q?=E4=BB=B6=E6=8E=A5=E5=8F=A3=E5=92=8C=E9=83=A8=E4=BB=B6=E4=B8=8B?= =?UTF-8?q?=E6=9D=BF=E4=BB=B6=E9=85=8D=E4=BB=B6=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assemblylist/AssemblyListController.java | 9 +- .../vo/AssemblyComponentChildPrintReqVO.java | 31 ++ .../vo/AssemblyComponentChildPrintRespVO.java | 46 +++ .../AssemblyComponentChildPrintItemDO.java | 27 ++ .../dal/mysql/orderItem/OrderItemMapper.java | 23 ++ .../assemblylist/AssemblyListService.java | 8 +- .../assemblylist/AssemblyListServiceImpl.java | 316 +++++++++++++++++- .../mapper/orderItem/OrderItemMapper.xml | 86 +++++ 8 files changed, 523 insertions(+), 23 deletions(-) create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/ordercomponent/vo/AssemblyComponentChildPrintReqVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/ordercomponent/vo/AssemblyComponentChildPrintRespVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/orderItem/AssemblyComponentChildPrintItemDO.java diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/assemblylist/AssemblyListController.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/assemblylist/AssemblyListController.java index b7c14e5a3..301921335 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/assemblylist/AssemblyListController.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/assemblylist/AssemblyListController.java @@ -8,6 +8,8 @@ import com.cf.imes.module.executor.controller.admin.assemblylist.vo.AssemblyList import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPageReqVO; import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderRespVO; import com.cf.imes.module.executor.controller.admin.order.vo.order.OrdersViewCadViewInfoRespVO; +import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.AssemblyComponentChildPrintReqVO; +import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.AssemblyComponentChildPrintRespVO; import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.OrderComponentRespVO; import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.OrderDetailComponentPageReqVO; import com.cf.imes.module.executor.controller.admin.plate.vo.OrderViewPartPageRespVO; @@ -63,12 +65,13 @@ public class AssemblyListController { return CommonResult.success(assemblyListService.getComponentList(reqVO)); } - @GetMapping("/component/{componentId}/children") + @PostMapping("/component/direct-children") @Operation(summary = "装配清单-获取部件直接下级列表") @Parameter(name = "componentId", description = "部件 ID", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('production:assemblyList:query')") - public CommonResult> getDirectChildComponentList(@PathVariable Long componentId) { - return success(assemblyListService.getDirectChildComponentList(componentId)); + public CommonResult> getDirectChildComponentList( + @Valid @RequestBody AssemblyComponentChildPrintReqVO reqVO) { + return success(assemblyListService.getDirectChildComponentList(reqVO)); } @PostMapping("/list/view/plate/page") diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/ordercomponent/vo/AssemblyComponentChildPrintReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/ordercomponent/vo/AssemblyComponentChildPrintReqVO.java new file mode 100644 index 000000000..52c6a73e2 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/ordercomponent/vo/AssemblyComponentChildPrintReqVO.java @@ -0,0 +1,31 @@ +package com.cf.imes.module.executor.controller.admin.ordercomponent.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.Size; +import lombok.Data; + +import java.util.List; + +/** + * + * + * @author Gqr + * @since 2026/7/13 10:24 + */ +@Data +@Schema(description = "装配清单 - 查询部件子元素表格请求") +public class AssemblyComponentChildPrintReqVO { + @Schema(description = "上级部件ID列表", example = "[1001, 1002]") + @Size(max = 200) + private List componentIds; + + @Schema(description = "底层部件ID列表", example = "[1003, 1004]") + @Size(max = 200) + private List bottomComponentIds; + + @Schema(description = "订单 ID 列表", example = "[10001, 10002]", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "订单 ID 不能为空") + @Size(max = 100) + private List orderIds; +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/ordercomponent/vo/AssemblyComponentChildPrintRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/ordercomponent/vo/AssemblyComponentChildPrintRespVO.java new file mode 100644 index 000000000..fed3e218c --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/ordercomponent/vo/AssemblyComponentChildPrintRespVO.java @@ -0,0 +1,46 @@ +package com.cf.imes.module.executor.controller.admin.ordercomponent.vo; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + * + * + * @author Gqr + * @since 2026/7/13 10:17 + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@Schema(description = "装配清单 - 部件表格数据查询") +public class AssemblyComponentChildPrintRespVO { + @Schema(description = "编号") + private Long id; + + @Schema(description = "名称") + private String name; + + @Schema(description = "长") + private BigDecimal length; + + @Schema(description = "宽") + private BigDecimal width; + + @Schema(description = "厚") + private BigDecimal thickness; + + @Schema(description = "数量") + private BigDecimal quantity; + + @Schema(description = "房名") + private String roomName; + + @Schema(description = "柜名") + private String bodyName; + + @Schema(description = "子元素") + private List children; +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/orderItem/AssemblyComponentChildPrintItemDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/orderItem/AssemblyComponentChildPrintItemDO.java new file mode 100644 index 000000000..30a0c651d --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/orderItem/AssemblyComponentChildPrintItemDO.java @@ -0,0 +1,27 @@ +package com.cf.imes.module.executor.dal.dataobject.orderItem; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * + * + * @author Gqr + * @since 2026/7/13 10:50 + */ +@Data +public class AssemblyComponentChildPrintItemDO { + private Long compId; + private Long bodyId; + + private Long id; + private String name; + private BigDecimal length; + private BigDecimal width; + private BigDecimal thickness; + + private BigDecimal quantity; + private String roomName; + private String bodyName; +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java index 3825be444..1611386a1 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java @@ -11,6 +11,7 @@ import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPlatesDe import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPrintDetailRespVO; import com.cf.imes.module.executor.controller.admin.orderParts.vo.OrderPartsRespVO; import com.cf.imes.module.executor.controller.admin.plate.vo.PlateRespVO; +import com.cf.imes.module.executor.dal.dataobject.orderItem.AssemblyComponentChildPrintItemDO; import com.cf.imes.module.executor.dal.dataobject.orderItem.OrderItemDO; import com.cf.imes.module.executor.dal.dataobject.orderItem.OrdersViewPartsPageDO; import com.cf.imes.module.executor.dal.dataobject.orderItem.OrdersViewPlatesPageDO; @@ -366,4 +367,26 @@ public interface OrderItemMapper extends BaseMapperX { * @return */ int physicalDeleteByOrderIds(@Param("ids") List ids); + + /** + * 查询部件板件列表 + * + * @param orderIds + * @param componentIds + * @return + */ + List selectAssemblyComponentPrintPlates( + @Param("orderIds") List orderIds, + @Param("componentIds") Set componentIds); + + /** + * 查询部件配件列表 + * + * @param orderIds + * @param componentIds + * @return + */ + List selectAssemblyComponentPrintParts( + @Param("orderIds") List orderIds, + @Param("componentIds") Set componentIds); } \ 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/assemblylist/AssemblyListService.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/assemblylist/AssemblyListService.java index 2c2594d1d..dfa92bea8 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/assemblylist/AssemblyListService.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/assemblylist/AssemblyListService.java @@ -4,6 +4,8 @@ import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.module.executor.controller.admin.assemblylist.vo.AssemblyListComponentPageReqVO; import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPageReqVO; import com.cf.imes.module.executor.controller.admin.order.vo.order.OrdersViewCadViewInfoRespVO; +import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.AssemblyComponentChildPrintReqVO; +import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.AssemblyComponentChildPrintRespVO; import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.OrderComponentRespVO; import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.OrdersTopComponentListReqVO; import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; @@ -36,10 +38,10 @@ public interface AssemblyListService { /** * 获取部件的直接下级列表。 * - * @param componentId 部件 ID - * @return 当前部件及其直接下级部件列表 + * @param assemblyComponentChildPrintReqVO + * @return 当前部件及其直接下级列表 */ - List getDirectChildComponentList(Long componentId); + List getDirectChildComponentList(AssemblyComponentChildPrintReqVO assemblyComponentChildPrintReqVO); /** * 获取部件和下级所有的板件视图列表 diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/assemblylist/AssemblyListServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/assemblylist/AssemblyListServiceImpl.java index 03a0067e7..4890c5c66 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/assemblylist/AssemblyListServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/assemblylist/AssemblyListServiceImpl.java @@ -21,12 +21,15 @@ import com.cf.imes.framework.mybatis.core.query.LambdaUpdateWrapperX; import com.cf.imes.module.executor.controller.admin.assemblylist.vo.AssemblyListComponentPageReqVO; import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPageReqVO; import com.cf.imes.module.executor.controller.admin.order.vo.order.OrdersViewCadViewInfoRespVO; +import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.AssemblyComponentChildPrintReqVO; +import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.AssemblyComponentChildPrintRespVO; import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.OrderComponentRespVO; import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.OrderComponentTreeCompareVO; import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.OrdersTopComponentListReqVO; import com.cf.imes.module.executor.controller.admin.plate.vo.OrderViewPartPageRespVO; import com.cf.imes.module.executor.controller.admin.plate.vo.OrderViewPlatePageRespVO; import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; +import com.cf.imes.module.executor.dal.dataobject.orderItem.AssemblyComponentChildPrintItemDO; import com.cf.imes.module.executor.dal.dataobject.orderItem.OrdersViewPartsPageDO; import com.cf.imes.module.executor.dal.dataobject.orderItem.OrdersViewPlatesPageDO; import com.cf.imes.module.executor.dal.dataobject.ordercomponent.OrderComponentDO; @@ -40,6 +43,7 @@ import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; +import java.math.BigDecimal; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collections; @@ -47,9 +51,12 @@ import java.util.Comparator; import java.util.Deque; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; @@ -173,30 +180,305 @@ public class AssemblyListServiceImpl implements AssemblyListService { } @Override - public List getDirectChildComponentList(Long componentId) { - OrderComponentDO parent = orderComponentMapper.selectOne(new LambdaQueryWrapperX() - .eq(OrderComponentDO::getId, componentId) - .eq(OrderComponentDO::getDeleted, DeletedCodeEnum.NOT_DELETED.getStatus()) - .select(OrderComponentDO::getId, OrderComponentDO::getPid, OrderComponentDO::getName, - OrderComponentDO::getWidth, OrderComponentDO::getHeight, OrderComponentDO::getDepth, - OrderComponentDO::getCadViewFileId)); - if (parent == null) { + public List getDirectChildComponentList(AssemblyComponentChildPrintReqVO reqVO) { + + /* + * componentIds: + * 查询这些部件的“直接下级部件”。 + * + * bottomComponentIds: + * 查询这些部件直属的“板件、配件”。 + * + * 两个集合之间允许存在相同 ID。 + * 相同 ID 在两个集合中时,必须返回两个独立父节点: + * 1. 一个节点只承载直接下级部件; + * 2. 一个节点只承载板件、配件。 + */ + List componentIds = new ArrayList<>(new LinkedHashSet<>( + Optional.ofNullable(reqVO.getComponentIds()).orElseGet(Collections::emptyList))); + + List bottomComponentIds = new ArrayList<>(new LinkedHashSet<>( + Optional.ofNullable(reqVO.getBottomComponentIds()).orElseGet(Collections::emptyList))); + + if (CollUtil.isEmpty(componentIds) && CollUtil.isEmpty(bottomComponentIds)) { return Collections.emptyList(); } - List children = orderComponentMapper.selectList(new LambdaQueryWrapperX() - .eq(OrderComponentDO::getPid, componentId) - .eq(OrderComponentDO::getDeleted, DeletedCodeEnum.NOT_DELETED.getStatus()) - .select(OrderComponentDO::getId, OrderComponentDO::getPid, OrderComponentDO::getName, - OrderComponentDO::getWidth, OrderComponentDO::getHeight, OrderComponentDO::getDepth, - OrderComponentDO::getBodyName, OrderComponentDO::getRoomName)); + /* + * 数据库查询时可合并去重,减少重复查库; + * 但仅用于查询,绝不能直接作为最终结果集。 + * + * 原因:同一个部件同时出现在两个入参集合时, + * 最终需要返回两份不同用途的父节点数据。 + */ + Set queryParentIds = new LinkedHashSet<>(); + queryParentIds.addAll(componentIds); + queryParentIds.addAll(bottomComponentIds); - List result = new ArrayList<>(children.size() + 1); - result.add(BeanUtil.toBean(parent, OrderComponentRespVO.class)); - result.addAll(BeanUtil.copyToList(children, OrderComponentRespVO.class)); + + /* + * 部件与订单强关联: + * orderIds 必须参与查询,既限制本次查询范围, + * 也便于 MyCAT 按订单分片路由。 + */ + List parentComponents = orderComponentMapper.selectList( + new LambdaQueryWrapperX() + .in(OrderComponentDO::getId, queryParentIds) + .in(OrderComponentDO::getOrderId, reqVO.getOrderIds()) + .eq(OrderComponentDO::getDeleted, DeletedCodeEnum.NOT_DELETED.getStatus()) + .select( + OrderComponentDO::getId, + OrderComponentDO::getOrderId, + OrderComponentDO::getName, + OrderComponentDO::getWidth, + OrderComponentDO::getHeight, + OrderComponentDO::getDepth + ) + ); + + /* + * 若数量不一致,说明存在以下任一情况: + * 1. 部件不存在; + * 2. 部件已删除; + * 3. 部件不属于前端传入的订单范围。 + */ + if (parentComponents.size() != queryParentIds.size()) { + throw new ServiceException(ORDER_COMPONENT_NOT_EXIST); + } + + Map componentDOMap = parentComponents.stream() + .collect(Collectors.toMap(OrderComponentDO::getId, Function.identity())); + + /* + * 必须创建两份独立的父节点 Map。 + * + * 即使 componentIds 和 bottomComponentIds 中包含相同的部件 ID, + * 两个 Map 中也会存在两个不同的 RespVO 实例,防止子数据混合。 + */ + Map directChildParentMap = + createPrintParentMap(componentIds, componentDOMap); + + Map bottomComponentParentMap = + createPrintParentMap(bottomComponentIds, componentDOMap); + + /* + * 第一类父节点: + * 仅查询并挂载“直接下级部件”。 + * + * 这里按 pid 查询,只查一层,不递归查询孙级部件。 + */ + if (CollUtil.isNotEmpty(componentIds)) { + List childComponents = orderComponentMapper.selectList( + new LambdaQueryWrapperX() + .in(OrderComponentDO::getPid, componentIds) + .in(OrderComponentDO::getOrderId, reqVO.getOrderIds()) + .eq(OrderComponentDO::getDeleted, DeletedCodeEnum.NOT_DELETED.getStatus()) + .orderByAsc(OrderComponentDO::getId) + .select( + OrderComponentDO::getId, + OrderComponentDO::getPid, + OrderComponentDO::getName, + OrderComponentDO::getWidth, + OrderComponentDO::getHeight, + OrderComponentDO::getDepth, + OrderComponentDO::getRoomName, + OrderComponentDO::getBodyName + ) + ); + + for (OrderComponentDO child : childComponents) { + AssemblyComponentChildPrintRespVO parent = + directChildParentMap.get(child.getPid()); + + if (parent != null) { + // false:子部件不创建 children + parent.getChildren().add(convertPrintComponent(child, false)); + } + } + } + + /* + * 第二类父节点: + * 仅查询并挂载直属板件、配件。 + */ + if (CollUtil.isNotEmpty(bottomComponentIds)) { + /* + * 板件数量在业务上固定为 1。 + * SQL 已根据 order_item.comp_id 取得板件归属部件, + * 并根据 order_item.body_id 取得实际房间、柜体。 + */ + List plates = + orderItemMapper.selectAssemblyComponentPrintPlates( + reqVO.getOrderIds(), new LinkedHashSet<>(bottomComponentIds)); + + /* + * 配件可能对应多条 order_item 明细。 + * 先查明细,再在内存中按“部件 + 柜体 + 配件”聚合数量。 + */ + List partRows = + orderItemMapper.selectAssemblyComponentPrintParts( + reqVO.getOrderIds(), new LinkedHashSet<>(bottomComponentIds)); + + List parts = + mergeAssemblyComponentPrintParts(partRows); + + for (AssemblyComponentChildPrintItemDO plate : plates) { + AssemblyComponentChildPrintRespVO parent = + bottomComponentParentMap.get(plate.getCompId()); + + if (parent != null) { + parent.getChildren().add(convertPrintItem(plate)); + } + } + + for (AssemblyComponentChildPrintItemDO part : parts) { + AssemblyComponentChildPrintRespVO parent = + bottomComponentParentMap.get(part.getCompId()); + + if (parent != null) { + parent.getChildren().add(convertPrintItem(part)); + } + } + } + + /* + * 两类父节点分段返回,不能合并。 + * + * 若同一部件 ID 同时位于两个集合: + * - 第一段:展示其直接下级部件; + * - 第二段:展示其板件、配件。 + */ + List result = new ArrayList<>( + directChildParentMap.size() + bottomComponentParentMap.size()); + + result.addAll(directChildParentMap.values()); + result.addAll(bottomComponentParentMap.values()); return result; } + /** + * 按请求 ID 顺序创建父节点。 + * + * 父节点是树的唯一可展开层级,因此统一初始化 children。 + * 同一部件在不同查询类型中调用本方法时,会创建不同的 RespVO 实例。 + */ + private Map createPrintParentMap( + List componentIds, + Map componentDOMap) { + + Map result = new LinkedHashMap<>(); + + for (Long componentId : componentIds) { + OrderComponentDO component = componentDOMap.get(componentId); + if (component != null) { + // true:父节点才初始化 children + result.put(componentId, convertPrintComponent(component, true)); + } + } + + return result; + } + + /** + * 部件节点转换。 + * + * 部件原始字段是:width、height、depth; + * 打印展示统一为:length、width、thickness。 + * + * @param hasChildren true 表示父节点,初始化 children; + * false 表示子部件,children 必须为 null。 + */ + private AssemblyComponentChildPrintRespVO convertPrintComponent( + OrderComponentDO source, boolean hasChildren) { + + AssemblyComponentChildPrintRespVO target = new AssemblyComponentChildPrintRespVO(); + target.setId(source.getId()); + target.setName(source.getName()); + target.setLength(toBigDecimal(source.getHeight())); + target.setWidth(toBigDecimal(source.getWidth())); + target.setThickness(toBigDecimal(source.getDepth())); + target.setRoomName(source.getRoomName()); + target.setBodyName(source.getBodyName()); + + // 仅父节点存在 children;叶子子部件明确设置为 null。 + target.setChildren(hasChildren ? new ArrayList<>() : null); + return target; + } + + /** + * 板件、配件节点转换。 + * + * 板件和配件均为叶子节点,不设置 children。 + * JsonInclude(NON_NULL) 会使响应 JSON 中不输出 children 字段。 + */ + private AssemblyComponentChildPrintRespVO convertPrintItem( + AssemblyComponentChildPrintItemDO source) { + + AssemblyComponentChildPrintRespVO target = new AssemblyComponentChildPrintRespVO(); + target.setId(source.getId()); + target.setName(source.getName()); + target.setLength(source.getLength()); + target.setWidth(source.getWidth()); + target.setThickness(source.getThickness()); + target.setQuantity(source.getQuantity()); + target.setRoomName(source.getRoomName()); + target.setBodyName(source.getBodyName()); + return target; + } + + private BigDecimal toBigDecimal(Double value) { + return value == null ? null : BigDecimal.valueOf(value); + } + + /** + * 配件明细内存聚合。 + * + * 分组维度: + * - compId:所属部件; + * - bodyId:实际所属柜体; + * - id:配件 ID。 + * + * 同一配件在不同柜体、房间中出现时,不应合并; + * 同一部件、同一柜体下存在多条相同配件明细时,数量需要累加。 + */ + private List mergeAssemblyComponentPrintParts( + List rows) { + + if (CollUtil.isEmpty(rows)) { + return Collections.emptyList(); + } + + Map mergedMap = new LinkedHashMap<>(); + + for (AssemblyComponentChildPrintItemDO row : rows) { + // 同一部件、同一柜体、同一配件才合并数量 + String key = row.getCompId() + "_" + row.getBodyId() + "_" + row.getId(); + + AssemblyComponentChildPrintItemDO merged = mergedMap.computeIfAbsent(key, ignored -> { + AssemblyComponentChildPrintItemDO target = new AssemblyComponentChildPrintItemDO(); + target.setCompId(row.getCompId()); + target.setBodyId(row.getBodyId()); + target.setId(row.getId()); + target.setName(row.getName()); + target.setLength(row.getLength()); + target.setWidth(row.getWidth()); + target.setThickness(row.getThickness()); + target.setRoomName(row.getRoomName()); + target.setBodyName(row.getBodyName()); + target.setQuantity(BigDecimal.ZERO); + return target; + }); + + BigDecimal quantity = row.getQuantity() == null + ? BigDecimal.ZERO + : row.getQuantity(); + + merged.setQuantity(merged.getQuantity().add(quantity)); + } + + return new ArrayList<>(mergedMap.values()); + } + /** * 根据装配设置计算部件节点的加工状态 * 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 5f773e081..d2ae095b0 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 @@ -1168,4 +1168,90 @@ #{id} + + + + \ No newline at end of file