1、新增部件信息标签打印接口;2、部件下板件配件明细打印接口url修改;

This commit is contained in:
gaoqr
2026-08-12 14:21:26 +08:00
parent 25ace75f06
commit c6847681cf
15 changed files with 453 additions and 9 deletions
@@ -6,6 +6,8 @@ import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPrintLis
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPrintRespVO;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrdersViewCadViewInfoRespVO;
import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.OrderComponentRespVO;
import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.ComponentPrintDataSourceReqVO;
import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.ComponentPrintDataSourceRespVO;
import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.OrderDetailComponentListReqVO;
import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.OrderDetailComponentPageReqVO;
import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.OrdersTopComponentListReqVO;
@@ -120,10 +122,19 @@ public class OrderComponentController {
return success(true);
}
@PostMapping("/print")
@Operation(summary = "获取订单部件打印列表")
@PostMapping("/print-data-source/detail")
@Operation(summary = "获取部件下板件、配件打印数据源")
@PreAuthorize("@ss.hasPermission('production:assemblyList:print')")
public CommonResult<OrderPrintRespVO> getOrderComponentPrintList(@Valid @RequestBody OrderPrintListReqVO reqVO) {
return success(orderComponentService.getOrderComponentPrintList(reqVO));
public CommonResult<OrderPrintRespVO> getComponentDetailPrintDataSource(
@Valid @RequestBody OrderPrintListReqVO reqVO) {
return success(orderComponentService.getComponentDetailPrintDataSource(reqVO));
}
@PostMapping("/print-data-source/info")
@Operation(summary = "获取部件标签打印数据源")
@PreAuthorize("@ss.hasPermission('production:assemblyList:print')")
public CommonResult<ComponentPrintDataSourceRespVO> getComponentInfoPrintDataSource(
@Valid @RequestBody ComponentPrintDataSourceReqVO reqVO) {
return success(orderComponentService.getComponentInfoPrintDataSource(reqVO));
}
}
@@ -0,0 +1,24 @@
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.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
import java.util.List;
@Data
@Schema(description = "管理后台 - 部件标签打印数据源 Request VO")
public class ComponentPrintDataSourceReqVO {
@NotEmpty(message = "{order.component.print.datasource.orderIds.notEmpty}")
@Size(max = 100, message = "{order.component.print.datasource.orderIds.max}")
@Schema(description = "订单 ID 列表", requiredMode = Schema.RequiredMode.REQUIRED)
private List<@NotNull Long> orderIds;
@NotEmpty(message = "{order.component.print.datasource.componentIds.notEmpty}")
@Size(max = 1000, message = "{order.component.print.datasource.componentIds.max}")
@Schema(description = "部件 ID 列表", requiredMode = Schema.RequiredMode.REQUIRED)
private List<@NotNull Long> componentIds;
}
@@ -0,0 +1,18 @@
package com.cf.imes.module.executor.controller.admin.ordercomponent.vo;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPrintInfoRespVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Data
@Schema(description = "管理后台 - 部件标签打印数据源 Response VO")
public class ComponentPrintDataSourceRespVO {
@Schema(description = "订单打印信息列表")
private List<OrderPrintInfoRespVO> orderPrintInfoVOList;
@Schema(description = "部件标签打印明细列表")
private List<ComponentPrintDetailRespVO> componentPrintDetailVOList;
}
@@ -0,0 +1,49 @@
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.util.List;
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
@Schema(description = "管理后台 - 部件标签打印明细 Response VO")
public class ComponentPrintDetailRespVO {
@Schema(description = "订单 ID")
private Long orderId;
@Schema(description = "房间名称")
private String roomName;
@Schema(description = "柜体名称")
private String bodyName;
@Schema(description = "部件 ID")
private Long componentId;
@Schema(description = "部件名称")
private String componentName;
@Schema(description = "部件长度,对应 order_component.height")
private Double length;
@Schema(description = "部件宽度,对应 order_component.width")
private Double width;
@Schema(description = "部件高度,对应 order_component.depth")
private Double height;
@Schema(description = "直接父级部件;顶级部件为 null")
private ComponentPrintNodeRespVO parentComponent;
@Schema(description = "直接子级部件列表;没有子级时为空数组")
private List<ComponentPrintNodeRespVO> childComponents;
@Schema(description = "部件层级,顶级为 1")
private Integer level;
@Schema(description = "同一棵树中与当前部件同名的未删除部件数量")
private Integer quantity;
}
@@ -0,0 +1,19 @@
package com.cf.imes.module.executor.controller.admin.ordercomponent.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Schema(description = "管理后台 - 部件打印关联节点 Response VO")
public class ComponentPrintNodeRespVO {
@Schema(description = "部件 ID")
private Long componentId;
@Schema(description = "部件名称")
private String componentName;
}
@@ -0,0 +1,67 @@
package com.cf.imes.module.executor.dal.dataobject.ordercomponent;
import lombok.Data;
@Data
public class ComponentPrintDataDO {
/**
* 订单 ID。
*/
private Long orderId;
/**
* 部件 ID。
*/
private Long componentId;
/**
* 当前部件所属顶级部件 ID。
*/
private Long topId;
/**
* 部件名称。
*/
private String componentName;
/**
* 房间名称。
*/
private String roomName;
/**
* 柜体名称。
*/
private String bodyName;
/**
* 部件长度,对应 order_component.height。
*/
private Double length;
/**
* 部件宽度,对应 order_component.width。
*/
private Double width;
/**
* 部件高度,对应 order_component.depth。
*/
private Double height;
/**
* 部件层级,顶级部件为 1。
*/
private Integer level;
/**
* 直接父级部件 ID。
*/
private Long parentComponentId;
/**
* 直接父级部件名称。
*/
private String parentComponentName;
}
@@ -0,0 +1,30 @@
package com.cf.imes.module.executor.dal.dataobject.ordercomponent;
import lombok.Data;
/**
* 部件标签打印同树同名数量统计数据。
*/
@Data
public class ComponentPrintQuantityDO {
/**
* 订单 ID。
*/
private Long orderId;
/**
* 顶级部件 ID,用于标识一棵部件树。
*/
private Long topId;
/**
* 部件名称。
*/
private String componentName;
/**
* 同一订单、同一棵树中同名的未删除部件数量。
*/
private Integer quantity;
}
@@ -212,7 +212,7 @@ public class PlateDO extends BaseDO {
*/
private Long planId;
/**
/**"
* cad自定义板编号
*/
private String cadPlateNo;
@@ -3,6 +3,8 @@ package com.cf.imes.module.executor.dal.mysql.ordercomponent;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.OrderDetailComponentListReqVO;
import com.cf.imes.module.executor.dal.dataobject.ordercomponent.OrderComponentDO;
import com.cf.imes.module.executor.dal.dataobject.ordercomponent.ComponentPrintDataDO;
import com.cf.imes.module.executor.dal.dataobject.ordercomponent.ComponentPrintQuantityDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -17,6 +19,36 @@ import java.util.Set;
*/
@Mapper
public interface OrderComponentMapper extends BaseMapperX<OrderComponentDO> {
/**
* 查询部件标签打印数据,包括当前部件、直接父级、层级及同树同名数量。
*
* @param orderIds 订单 ID 列表
* @param componentIds 部件 ID 列表
* @return 部件标签打印数据列表
*/
List<ComponentPrintDataDO> selectComponentPrintData(@Param("orderIds") List<Long> orderIds,
@Param("componentIds") List<Long> componentIds);
/**
* 按订单、顶级部件和部件名称汇总部件数量。
*
* @param orderIds 订单 ID 列表,用于限制订单范围及分片路由
* @param topIds 顶级部件 ID 列表
* @return 同树同名部件数量列表
*/
List<ComponentPrintQuantityDO> selectComponentPrintQuantities(@Param("orderIds") List<Long> orderIds,
@Param("topIds") List<Long> topIds);
/**
* 查询指定部件的未删除直接子级部件。
*
* @param orderIds 订单 ID 列表
* @param componentIds 父部件 ID 列表
* @return 直接子级部件列表
*/
List<OrderComponentDO> selectComponentPrintChildren(@Param("orderIds") List<Long> orderIds,
@Param("componentIds") List<Long> componentIds);
/**
* 查询订单下部件id、level、name列表,按层级倒序、id正序
* @param orderIds
@@ -5,6 +5,8 @@ import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPrintLis
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPrintRespVO;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrdersViewCadViewInfoRespVO;
import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.OrderComponentRespVO;
import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.ComponentPrintDataSourceReqVO;
import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.ComponentPrintDataSourceRespVO;
import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.OrderDetailComponentListReqVO;
import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.OrderDetailComponentPageReqVO;
import com.cf.imes.module.executor.controller.admin.plate.vo.OrderViewPartPageRespVO;
@@ -120,5 +122,10 @@ public interface OrderComponentService {
* @param pageReqVO
* @return
*/
OrderPrintRespVO getOrderComponentPrintList(OrderPrintListReqVO pageReqVO);
}
OrderPrintRespVO getComponentDetailPrintDataSource(OrderPrintListReqVO pageReqVO);
/**
* 查询部件标签打印数据源。
*/
ComponentPrintDataSourceRespVO getComponentInfoPrintDataSource(ComponentPrintDataSourceReqVO reqVO);
}
@@ -20,9 +20,14 @@ import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPrintDetailRespVO;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPrintListReqVO;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPrintInfoRespVO;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPrintRespVO;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrdersViewCadViewInfoRespVO;
import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.OrderComponentRespVO;
import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.ComponentPrintDataSourceReqVO;
import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.ComponentPrintDataSourceRespVO;
import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.ComponentPrintDetailRespVO;
import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.ComponentPrintNodeRespVO;
import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.OrderDetailComponentListReqVO;
import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.OrderDetailComponentPageReqVO;
import com.cf.imes.module.executor.controller.admin.plate.vo.OrderViewPartPageRespVO;
@@ -33,6 +38,8 @@ import com.cf.imes.module.executor.dal.dataobject.orderItem.OrderItemTempDO;
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;
import com.cf.imes.module.executor.dal.dataobject.ordercomponent.ComponentPrintDataDO;
import com.cf.imes.module.executor.dal.dataobject.ordercomponent.ComponentPrintQuantityDO;
import com.cf.imes.module.executor.dal.dataobject.order.OrderDO;
import com.cf.imes.module.executor.dal.dataobject.orderBody.OrderBodyDO;
import com.cf.imes.module.executor.dal.mysql.order.OrderMapper;
@@ -87,6 +94,8 @@ import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_NOT_EXI
@Service
@Slf4j
public class OrderComponentServiceImpl implements OrderComponentService {
private static final int COMPONENT_PRINT_BATCH_SIZE = 500;
@Resource
private OrderComponentMapper orderComponentMapper;
@@ -1109,7 +1118,7 @@ public class OrderComponentServiceImpl implements OrderComponentService {
}
@Override
public OrderPrintRespVO getOrderComponentPrintList(OrderPrintListReqVO pageReqVO) {
public OrderPrintRespVO getComponentDetailPrintDataSource(OrderPrintListReqVO pageReqVO) {
OrderPrintRespVO result = new OrderPrintRespVO();
List<Long> orderIds = pageReqVO.getOrderIds();
Set<Long> componentIds = pageReqVO.getComponentIds();
@@ -1124,4 +1133,102 @@ public class OrderComponentServiceImpl implements OrderComponentService {
result.setOrderPrintDetailRespVOList(ordersPrintPlatesList);
return result;
}
}
@Override
public ComponentPrintDataSourceRespVO getComponentInfoPrintDataSource(
ComponentPrintDataSourceReqVO reqVO) {
List<Long> orderIds = new ArrayList<>(new LinkedHashSet<>(reqVO.getOrderIds()));
List<Long> componentIds = new ArrayList<>(new LinkedHashSet<>(reqVO.getComponentIds()));
ComponentPrintDataSourceRespVO result = new ComponentPrintDataSourceRespVO();
result.setOrderPrintInfoVOList(sortOrderPrintInfo(orderIds,
orderService.getOrderPrintInfo(orderIds)));
List<ComponentPrintDataDO> componentData = new ArrayList<>();
List<OrderComponentDO> childComponents = new ArrayList<>();
for (int fromIndex = 0; fromIndex < componentIds.size(); fromIndex += COMPONENT_PRINT_BATCH_SIZE) {
int toIndex = Math.min(fromIndex + COMPONENT_PRINT_BATCH_SIZE, componentIds.size());
List<Long> batchComponentIds = componentIds.subList(fromIndex, toIndex);
componentData.addAll(orderComponentMapper.selectComponentPrintData(orderIds, batchComponentIds));
childComponents.addAll(orderComponentMapper.selectComponentPrintChildren(orderIds, batchComponentIds));
}
List<Long> topIds = componentData.stream()
.map(ComponentPrintDataDO::getTopId)
.filter(Objects::nonNull)
.distinct()
.toList();
List<ComponentPrintQuantityDO> quantityData = new ArrayList<>();
for (int fromIndex = 0; fromIndex < topIds.size(); fromIndex += COMPONENT_PRINT_BATCH_SIZE) {
int toIndex = Math.min(fromIndex + COMPONENT_PRINT_BATCH_SIZE, topIds.size());
quantityData.addAll(orderComponentMapper.selectComponentPrintQuantities(
orderIds, topIds.subList(fromIndex, toIndex)));
}
Map<ComponentQuantityKey, Integer> quantityMap = quantityData.stream()
.collect(Collectors.toMap(
item -> new ComponentQuantityKey(
item.getOrderId(), item.getTopId(), item.getComponentName()),
ComponentPrintQuantityDO::getQuantity,
(first, ignored) -> first));
Map<Long, List<ComponentPrintNodeRespVO>> childrenMap = childComponents.stream()
.collect(Collectors.groupingBy(OrderComponentDO::getPid,
LinkedHashMap::new,
Collectors.mapping(child -> new ComponentPrintNodeRespVO(
child.getId(), child.getName()),
Collectors.toList())));
Map<Long, ComponentPrintDataDO> componentDataMap = componentData.stream()
.collect(Collectors.toMap(ComponentPrintDataDO::getComponentId,
Function.identity(), (first, ignored) -> first));
List<ComponentPrintDetailRespVO> detailList = componentIds.stream()
.map(componentDataMap::get)
.filter(Objects::nonNull)
.map(data -> convertComponentPrintDetail(data, childrenMap, quantityMap))
.toList();
result.setComponentPrintDetailVOList(detailList);
return result;
}
private List<OrderPrintInfoRespVO> sortOrderPrintInfo(
List<Long> orderIds, List<OrderPrintInfoRespVO> orderInfoList) {
Map<Long, OrderPrintInfoRespVO> orderInfoMap = orderInfoList.stream()
.collect(Collectors.toMap(OrderPrintInfoRespVO::getId,
Function.identity(), (first, ignored) -> first));
return orderIds.stream()
.map(orderInfoMap::get)
.filter(Objects::nonNull)
.toList();
}
private ComponentPrintDetailRespVO convertComponentPrintDetail(
ComponentPrintDataDO data,
Map<Long, List<ComponentPrintNodeRespVO>> childrenMap,
Map<ComponentQuantityKey, Integer> quantityMap) {
ComponentPrintDetailRespVO result = new ComponentPrintDetailRespVO();
result.setOrderId(data.getOrderId());
result.setRoomName(data.getRoomName());
result.setBodyName(data.getBodyName());
result.setComponentId(data.getComponentId());
result.setComponentName(data.getComponentName());
result.setLength(data.getLength());
result.setWidth(data.getWidth());
result.setHeight(data.getHeight());
result.setLevel(data.getLevel());
result.setQuantity(quantityMap.getOrDefault(new ComponentQuantityKey(
data.getOrderId(), data.getTopId(), data.getComponentName()), 0));
if (data.getParentComponentId() != null) {
result.setParentComponent(new ComponentPrintNodeRespVO(
data.getParentComponentId(), data.getParentComponentName()));
}
result.setChildComponents(childrenMap.getOrDefault(
data.getComponentId(), Collections.emptyList()));
return result;
}
/**
* 部件数量统计键:同一订单、同一棵树、同一名称。
*/
private record ComponentQuantityKey(Long orderId, Long topId, String componentName) {
}
}
@@ -1,6 +1,74 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.cf.imes.module.executor.dal.mysql.ordercomponent.OrderComponentMapper">
<select id="selectComponentPrintData"
resultType="com.cf.imes.module.executor.dal.dataobject.ordercomponent.ComponentPrintDataDO">
SELECT oc.order_id AS orderId,
oc.id AS componentId,
oc.top_id AS topId,
oc.name AS componentName,
oc.room_name AS roomName,
oc.body_name AS bodyName,
oc.height AS length,
oc.width AS width,
oc.depth AS height,
oc.level + 1 AS level,
parent.id AS parentComponentId,
parent.name AS parentComponentName
FROM order_component oc
LEFT JOIN order_component parent
ON parent.organ_id = oc.organ_id
AND parent.order_id = oc.order_id
AND parent.id = oc.pid
AND parent.deleted = 0
WHERE oc.deleted = 0
AND oc.order_id IN
<foreach item="orderId" collection="orderIds" open="(" separator="," close=")">
#{orderId}
</foreach>
AND oc.id IN
<foreach item="componentId" collection="componentIds" open="(" separator="," close=")">
#{componentId}
</foreach>
</select>
<select id="selectComponentPrintQuantities"
resultType="com.cf.imes.module.executor.dal.dataobject.ordercomponent.ComponentPrintQuantityDO">
SELECT order_id AS orderId,
top_id AS topId,
name AS componentName,
COUNT(*) AS quantity
FROM order_component
WHERE deleted = 0
AND order_id IN
<foreach item="orderId" collection="orderIds" open="(" separator="," close=")">
#{orderId}
</foreach>
AND top_id IN
<foreach item="topId" collection="topIds" open="(" separator="," close=")">
#{topId}
</foreach>
GROUP BY order_id, top_id, name
</select>
<select id="selectComponentPrintChildren"
resultType="com.cf.imes.module.executor.dal.dataobject.ordercomponent.OrderComponentDO">
SELECT child.id,
child.pid,
child.name
FROM order_component child
WHERE child.deleted = 0
AND child.order_id IN
<foreach item="orderId" collection="orderIds" open="(" separator="," close=")">
#{orderId}
</foreach>
AND child.pid IN
<foreach item="componentId" collection="componentIds" open="(" separator="," close=")">
#{componentId}
</foreach>
ORDER BY child.id ASC
</select>
<select id="selectAllForFlatList"
resultType="com.cf.imes.module.executor.dal.dataobject.ordercomponent.OrderComponentDO">
SELECT component.id,
@@ -61,3 +61,7 @@ order.cadview.plate.page.orderid.not.null=訂單編號不能為空
order.component.assemble.req.orderIds.max=查詢訂單編號清單不能超過100個
order.component.assemble.req.name.max=名稱長度不能超過64個字元
order.component.print.datasource.orderIds.notEmpty=訂單 ID 清單不能為空
order.component.print.datasource.orderIds.max=訂單 ID 最多傳入 100 個
order.component.print.datasource.componentIds.notEmpty=部件 ID 清單不能為空
order.component.print.datasource.componentIds.max=部件 ID 最多傳入 1000 個
@@ -61,3 +61,7 @@ order.cadview.plate.page.orderid.not.null=order id cannot be empty
order.component.assemble.req.orderIds.max=The list of query order numbers cannot exceed 100
order.component.assemble.req.name.max=name length cannot exceed 64 characters
order.component.print.datasource.orderIds.notEmpty=The order ID list cannot be empty
order.component.print.datasource.orderIds.max=The order ID list cannot contain more than 100 entries
order.component.print.datasource.componentIds.notEmpty=The component ID list cannot be empty
order.component.print.datasource.componentIds.max=The component ID list cannot contain more than 1000 entries
@@ -61,3 +61,7 @@ order.cadview.plate.page.orderid.not.null=订单编号不能为空
order.component.assemble.req.orderIds.max=查询订单编号列表不能超过100个
order.component.assemble.req.name.max=名称长度不能超过 64 个字符
order.component.print.datasource.orderIds.notEmpty=订单 ID 列表不能为空
order.component.print.datasource.orderIds.max=订单 ID 最多传入 100 个
order.component.print.datasource.componentIds.notEmpty=部件 ID 列表不能为空
order.component.print.datasource.componentIds.max=部件 ID 最多传入 1000 个