订单详情、装配订单配件分页改为一次性返回

This commit is contained in:
gaoqr
2026-07-09 16:16:06 +08:00
parent abab07f9a0
commit fcfe06e0ec
5 changed files with 280 additions and 302 deletions
@@ -116,4 +116,19 @@ public class OrdersViewPartsPageDO {
* 柜体名称 * 柜体名称
*/ */
private String bodyName; private String bodyName;
/**
* 加工组 id
*/
private Long groupId;
/**
* 加工组名称
*/
private String processGroupName;
/**
* 部件名称
*/
private String componentName;
} }
@@ -274,6 +274,13 @@ public interface OrderItemMapper extends BaseMapperX<OrderItemDO> {
@Param("name") String name, @Param("name") String name,
@Param("deleted") Boolean deleted); @Param("deleted") Boolean deleted);
List<OrdersViewPartsPageDO> selectOrdersViewPartsList(@Param("orderIds") List<Long> orderIds,
@Param("bodyIds") Set<Long> bodyIds,
@Param("groupIds") Set<Long> groupIds,
@Param("componentIds") Set<Long> componentIds,
@Param("name") String name,
@Param("deleted") Boolean deleted);
/** /**
* 查询部件关联的板件ID列表 * 查询部件关联的板件ID列表
* *
@@ -56,12 +56,14 @@ import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayDeque; import java.util.ArrayDeque;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.Deque; import java.util.Deque;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
@@ -417,158 +419,83 @@ public class OrderComponentServiceImpl implements OrderComponentService {
} }
Set<Long> queryComponentIds = componentDOS.stream().map(OrderComponentDO::getId).collect(Collectors.toSet()); Set<Long> queryComponentIds = componentDOS.stream().map(OrderComponentDO::getId).collect(Collectors.toSet());
// 整理出id和cadViewFileId的对应关系 boolean deleted = Boolean.TRUE.equals(pageReqVO.getDeleted());
Map<Long, OrderComponentDO> cadViewFileIdMap = componentDOS.stream()
.filter(item -> item.getCadViewFileId() != null)
.collect(Collectors.toMap(
OrderComponentDO::getId,
Function.identity(),
(a, b) -> a
));
Boolean deleted = pageReqVO.getDeleted(); List<OrdersViewPartsPageDO> rows = orderItemMapper.selectOrdersViewPartsList(
orderIds,
null,
null,
queryComponentIds,
null,
deleted
);
// 查询配件编号+信息 if (CollUtil.isEmpty(rows)) {
PageDTO<OrdersViewPartsPageDO> page = new PageDTO<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
IPage<OrdersViewPartsPageDO> pageRes = orderItemMapper.selectOrdersViewPartsIdsPage(page, orderIds, null, null, queryComponentIds, null, deleted);
List<OrdersViewPartsPageDO> partsPageRecords = pageRes.getRecords();
if(CollUtil.isEmpty(partsPageRecords)) {
return new PageResult<>(Collections.emptyList(), 0L); return new PageResult<>(Collections.emptyList(), 0L);
} }
List<Long> partsIds = partsPageRecords.stream().map(OrdersViewPartsPageDO::getId).toList(); Collection<OrderViewPartPageRespVO> records = buildComponentViewPartsGroup(rows);
return new PageResult<>(new ArrayList<>(records), (long) records.size());
}
if (CollUtil.isEmpty(partsIds)) { /**
return new PageResult<>(); * 组装配件的加工组和部件
} *
// 查询关联关系 * @param rows
List<OrderItemDO> orderItemRelation; * @return
if (!deleted) { */
orderItemRelation = orderItemMapper.selectList(new LambdaQueryWrapperX<OrderItemDO>() private Collection<OrderViewPartPageRespVO> buildComponentViewPartsGroup(List<OrdersViewPartsPageDO> rows) {
.in(OrderItemDO::getOrderId, pageReqVO.getOrderIds()) Map<String, OrderViewPartPageRespVO> records = new LinkedHashMap<>();
.in(OrderItemDO::getPartsId, partsIds) Map<String, Set<String>> processGroupNameMap = new HashMap<>();
.and(wrapper -> Map<String, Set<String>> componentNameMap = new HashMap<>();
wrapper.ne(OrderItemDO::getGroupId, 0L)
.or()
.isNull(OrderItemDO::getGroupId)
)
.select(OrderItemDO::getPartsId, OrderItemDO::getCadViewId, OrderItemDO::getGroupId, OrderItemDO::getCompId, OrderItemDO::getNum)
);
} else {
List<OrderItemTempDO> orderItemTempDOS = orderItemTempMapper.selectList(new LambdaQueryWrapperX<OrderItemTempDO>()
.in(OrderItemTempDO::getOrderId, pageReqVO.getOrderIds())
.in(OrderItemTempDO::getPartsId, partsIds)
.and(wrapper ->
wrapper.ne(OrderItemTempDO::getGroupId, 0L)
.or()
.isNull(OrderItemTempDO::getGroupId)
)
.select(OrderItemTempDO::getPartsId, OrderItemTempDO::getCadViewId, OrderItemTempDO::getGroupId, OrderItemTempDO::getCompId, OrderItemTempDO::getNum)
);
orderItemRelation = BeanUtil.copyToList(orderItemTempDOS, OrderItemDO.class);
}
for (OrdersViewPartsPageDO row : rows) {
String key = buildComponentViewPartKey(row);
// 暂存 partsId:set<groupId> OrderViewPartPageRespVO vo = records.computeIfAbsent(key, k -> {
Map<Pair<Long, Integer>, Set<Long>> partsGroupMap = new HashMap<>(); OrderViewPartPageRespVO newVo = BeanUtil.copyProperties(row, OrderViewPartPageRespVO.class);
newVo.setNum(BigDecimal.ZERO);
newVo.setProcessGroupName("");
newVo.setComponentName("");
return newVo;
});
// 暂存 partsId:set<compId> if (row.getNum() != null && ObjectUtil.isNotNull(row.getCompId())) {
Map<Pair<Long, Integer>, Set<Long>> partsCompMap = new HashMap<>(); vo.setNum(row.getNum());
// 暂存 partsId:num
Map<Pair<Long, Integer>, Double> partsNumMap = new HashMap<>();
for (OrderItemDO item : orderItemRelation) {
Long partsId = item.getPartsId();
Integer cadViewId = item.getCadViewId();
Pair<Long, Integer> pair = new Pair<>(partsId, cadViewId);
// group_id
if (item.getGroupId() != null) {
partsGroupMap
.computeIfAbsent(pair, k -> new HashSet<>())
.add(item.getGroupId());
} }
// comp_id if (row.getCadViewFileId() != null && vo.getCadViewFileId() == null) {
if (item.getCompId() != null) { vo.setCadViewFileId(row.getCadViewFileId());
partsCompMap
.computeIfAbsent(pair, k -> new HashSet<>())
.add(item.getCompId());
} }
// num 从部件组获取 if (row.getProcessGroupName() != null && !row.getProcessGroupName().isBlank()) {
if (item.getNum() != null && ObjectUtil.isNotNull(item.getCompId())) { processGroupNameMap.computeIfAbsent(key, k -> new LinkedHashSet<>()).add(row.getProcessGroupName());
partsNumMap.put( }
pair,
item.getNum() if (row.getComponentName() != null && !row.getComponentName().isBlank()) {
); componentNameMap.computeIfAbsent(key, k -> new LinkedHashSet<>()).add(row.getComponentName());
} }
} }
// 查询加工组 for (Map.Entry<String, OrderViewPartPageRespVO> entry : records.entrySet()) {
Set<Long> allGroupIds = partsGroupMap.values() String key = entry.getKey();
.stream() OrderViewPartPageRespVO vo = entry.getValue();
.flatMap(Set::stream)
.collect(Collectors.toSet());
Map<Long, String> groupNameMap = Collections.emptyMap(); vo.setProcessGroupName(String.join(",", processGroupNameMap.getOrDefault(key, Collections.emptySet())));
vo.setComponentName(String.join(",", componentNameMap.getOrDefault(key, Collections.emptySet())));
if (!allGroupIds.isEmpty()) {
groupNameMap = orderGroupMapper.selectByIds(allGroupIds)
.stream()
.collect(Collectors.toMap(
OrderGroupDO::getId,
OrderGroupDO::getName,
(a, b) -> a
));
} }
// 最终组装 return records.values();
List<OrderViewPartPageRespVO> records = new ArrayList<>(); }
for (OrdersViewPartsPageDO part : partsPageRecords) {
Pair<Long, Integer> pair = new Pair<>(part.getId(), part.getCadViewId()); /**
OrderViewPartPageRespVO partRespVO = BeanUtil.copyProperties(part, OrderViewPartPageRespVO.class); * 配件id+cadviewid key
*
// 设置数量 * @param row
partRespVO.setNum( * @return
BigDecimal.valueOf(partsNumMap.getOrDefault(pair, 0.0)) */
); private String buildComponentViewPartKey(OrdersViewPartsPageDO row) {
return row.getId() + "_" + row.getCadViewId();
// 拼接加工组名称
Set<Long> groupIdsSet = partsGroupMap.getOrDefault(
pair,
Collections.emptySet()
);
String processGroupName = groupIdsSet.stream()
.map(groupNameMap::get)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.joining(","));
partRespVO.setProcessGroupName(processGroupName);
// 用逗号拼接部件组名称
Set<Long> compIds = partsCompMap.getOrDefault(pair, Collections.emptySet());
List<OrderComponentDO> comps = compIds.stream()
.map(cadViewFileIdMap::get)
.filter(Objects::nonNull)
.toList();
if (CollUtil.isNotEmpty(comps)) {
partRespVO.setComponentName(String.join(",", comps.stream().map(OrderComponentDO::getName).collect(Collectors.toSet())));
partRespVO.setCadViewFileId(comps.get(0).getCadViewFileId());
}
records.add(partRespVO);
}
return new PageResult<>(records, pageRes.getTotal());
} }
@Override @Override
@@ -1021,193 +1021,112 @@ public class PlateServiceImpl implements PlateService {
throw new ServiceException(ORDER_BODY_NOT_EXISTS); throw new ServiceException(ORDER_BODY_NOT_EXISTS);
} }
List<Long> orderIds = List.of(pageReqVO.getOrderId()); boolean deleted = Boolean.TRUE.equals(pageReqVO.getDeleted());
boolean fromGroup = CollUtil.isNotEmpty(groupIds);
// 整理出body_id和cad图纸id的关系 List<OrdersViewPartsPageDO> rows = orderItemMapper.selectOrdersViewPartsList(
Map<Long, Long> bodyIdAndCadViewFileIdMap = orderBodyDOList.stream() List.of(pageReqVO.getOrderId()),
.filter(item -> item.getCadViewFileId() != null) bodyIds,
.collect(Collectors.toMap(OrderBodyDO::getId, OrderBodyDO::getCadViewFileId)); groupIds,
null,
pageReqVO.getName(),
deleted
);
Boolean deleted = pageReqVO.getDeleted(); if (CollUtil.isEmpty(rows)) {
// 查询配件编号+信息
PageDTO<OrdersViewPartsPageDO> page = new PageDTO<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
IPage<OrdersViewPartsPageDO> pageRes = orderItemMapper.selectOrdersViewPartsIdsPage(page, orderIds, bodyIds, groupIds, null, pageReqVO.getName(), deleted);
List<OrdersViewPartsPageDO> partsPageRecords = pageRes.getRecords();
if(CollUtil.isEmpty(partsPageRecords)) {
return new PageResult<>(Collections.emptyList(), 0L); return new PageResult<>(Collections.emptyList(), 0L);
} }
List<Long> partsIds = partsPageRecords.stream().map(OrdersViewPartsPageDO::getId).toList(); Collection<OrderViewPartPageRespVO> records = buildBodyViewPartsGroup(rows, fromGroup);
return new PageResult<>(new ArrayList<>(records), (long) records.size());
}
if (CollUtil.isEmpty(partsIds)) { /**
return new PageResult<>(); * 组装配件的加工组和部件
} *
// 查询关联关系 * @param rows
List<OrderItemDO> orderItemRelation; * @param fromGroup
if (!deleted) { * @return
orderItemRelation = orderItemMapper.selectList(new LambdaQueryWrapperX<OrderItemDO>() */
.eq(OrderItemDO::getOrderId, pageReqVO.getOrderId()) private Collection<OrderViewPartPageRespVO> buildBodyViewPartsGroup(List<OrdersViewPartsPageDO> rows,
.inIfPresent(OrderItemDO::getBodyId, bodyIds) boolean fromGroup) {
.inIfPresent(OrderItemDO::getGroupId, groupIds) Map<String, OrderViewPartPageRespVO> records = new LinkedHashMap<>();
.in(OrderItemDO::getPartsId, partsIds) Map<String, Set<String>> processGroupNameMap = new HashMap<>();
.select(OrderItemDO::getPartsId, OrderItemDO::getBodyId, OrderItemDO::getCadViewId, OrderItemDO::getGroupId, OrderItemDO::getCompId, OrderItemDO::getNum) Map<String, Set<String>> componentNameMap = new HashMap<>();
);
} else {
List<OrderItemTempDO> orderItemTempDOS = orderItemTempMapper.selectList(new LambdaQueryWrapperX<OrderItemTempDO>()
.eq(OrderItemTempDO::getOrderId, pageReqVO.getOrderId())
.inIfPresent(OrderItemTempDO::getBodyId, bodyIds)
.inIfPresent(OrderItemTempDO::getGroupId, groupIds)
.in(OrderItemTempDO::getPartsId, partsIds)
.select(OrderItemTempDO::getPartsId, OrderItemTempDO::getBodyId, OrderItemTempDO::getCadViewId, OrderItemTempDO::getGroupId, OrderItemTempDO::getCompId, OrderItemTempDO::getNum)
);
orderItemRelation = BeanUtil.copyToList(orderItemTempDOS, OrderItemDO.class);
}
// 暂存 partsId:set<groupId> for (OrdersViewPartsPageDO row : rows) {
Map<Pair<Long, Integer>, Set<Long>> partsGroupMap = new HashMap<>(); if (!isBodyViewPartNumRow(row, fromGroup)) {
continue;
// 暂存 partsId:set<compId>
Map<Pair<Long, Integer>, Set<Long>> partsCompMap = new HashMap<>();
// 暂存 partsId:num
Map<Pair<Long, Integer>, Double> partsNumMap = new HashMap<>();
// 暂存 partsId:bodyId
Map<Pair<Long, Integer>, Long> partsBodyIdMap = new HashMap<>();
// 是否加工组入口
boolean comFromGroup = CollUtil.isNotEmpty(groupIds);
for (OrderItemDO item : orderItemRelation) {
Long partsId = item.getPartsId();
Integer cadViewId = item.getCadViewId();
Pair<Long, Integer> pair = new Pair<>(partsId, cadViewId);
// group_id
if (item.getGroupId() != null) {
partsGroupMap
.computeIfAbsent(pair, k -> new HashSet<>())
.add(item.getGroupId());
} }
// comp_id String key = buildBodyViewPartKey(row);
if (item.getCompId() != null) { records.computeIfAbsent(key, k -> {
partsCompMap OrderViewPartPageRespVO vo = BeanUtil.copyProperties(row, OrderViewPartPageRespVO.class);
.computeIfAbsent(pair, k -> new HashSet<>()) vo.setNum(BigDecimal.ZERO);
.add(item.getCompId()); vo.setProcessGroupName("");
vo.setComponentName("");
return vo;
});
}
if (records.isEmpty()) {
return Collections.emptyList();
}
for (OrdersViewPartsPageDO row : rows) {
String key = buildBodyViewPartKey(row);
OrderViewPartPageRespVO vo = records.get(key);
if (vo == null) {
continue;
} }
// num if (isBodyViewPartNumRow(row, fromGroup) && row.getNum() != null) {
if (item.getNum() != null && vo.setNum(vo.getNum().add(row.getNum()));
(
(comFromGroup && ObjectUtil.isNotNull(item.getGroupId()) && ObjectUtil.notEqual(item.getGroupId(), 0L)) //加工组入口 统计groupId不是空的
||
(!comFromGroup && (ObjectUtil.equals(item.getGroupId(), 0L) || (ObjectUtil.isNull(item.getGroupId()) && ObjectUtil.isNull(item.getCompId())))) // 非加工组入口,统计groupId = 0(加工组汇总的数量) 或者 null+不是部件item的(没有加工组的数量)
)
) {
partsNumMap.merge(
pair,
item.getNum(),
Double::sum
);
} }
partsBodyIdMap.putIfAbsent(pair, item.getBodyId()); if (row.getProcessGroupName() != null && !row.getProcessGroupName().isBlank()) {
} processGroupNameMap.computeIfAbsent(key, k -> new LinkedHashSet<>()).add(row.getProcessGroupName());
// 查询加工组
Set<Long> allGroupIds = partsGroupMap.values()
.stream()
.flatMap(Set::stream)
.collect(Collectors.toSet());
Map<Long, String> groupNameMap = Collections.emptyMap();
if (!allGroupIds.isEmpty()) {
groupNameMap = orderGroupMapper.selectByIds(allGroupIds)
.stream()
.collect(Collectors.toMap(
OrderGroupDO::getId,
OrderGroupDO::getName,
(a, b) -> a
));
}
// 查询部件
Set<Long> allCompIds = partsCompMap.values()
.stream()
.flatMap(Set::stream)
.collect(Collectors.toSet());
Map<Long, String> compNameMap = Collections.emptyMap();
if (!allCompIds.isEmpty()) {
compNameMap = orderComponentMapper.selectByIds(allCompIds)
.stream()
.collect(Collectors.toMap(
OrderComponentDO::getId,
OrderComponentDO::getName,
(a, b) -> a
));
}
// 最终组装
List<OrderViewPartPageRespVO> records = new ArrayList<>();
for (OrdersViewPartsPageDO part : partsPageRecords) {
Pair<Long, Integer> pair = new Pair<>(part.getId(), part.getCadViewId());
OrderViewPartPageRespVO partRespVO = BeanUtil.copyProperties(part, OrderViewPartPageRespVO.class);
// 设置数量
partRespVO.setNum(
BigDecimal.valueOf(partsNumMap.getOrDefault(pair, 0.0))
);
// 拼接加工组名称
Set<Long> groupIdsSet = partsGroupMap.getOrDefault(
pair,
Collections.emptySet()
);
String processGroupName = groupIdsSet.stream()
.map(groupNameMap::get)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.joining(","));
partRespVO.setProcessGroupName(processGroupName);
// 拼接部件名称
Set<Long> compIdsSet = partsCompMap.getOrDefault(
pair,
Collections.emptySet()
);
String componentName = compIdsSet.stream()
.map(compNameMap::get)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.joining(","));
partRespVO.setComponentName(componentName);
// 匹配图纸id
Long bodyId = partsBodyIdMap.get(pair);
partRespVO.setBodyId(bodyId);
Long cadViewFileId = bodyIdAndCadViewFileIdMap.get(bodyId);
if (ObjectUtil.isNotNull(cadViewFileId)) {
partRespVO.setCadViewFileId(cadViewFileId);
} }
records.add(partRespVO); if (row.getComponentName() != null && !row.getComponentName().isBlank()) {
componentNameMap.computeIfAbsent(key, k -> new LinkedHashSet<>()).add(row.getComponentName());
}
} }
return new PageResult<>(records, pageRes.getTotal()); for (Map.Entry<String, OrderViewPartPageRespVO> entry : records.entrySet()) {
String key = entry.getKey();
OrderViewPartPageRespVO vo = entry.getValue();
vo.setProcessGroupName(String.join(",", processGroupNameMap.getOrDefault(key, Collections.emptySet())));
vo.setComponentName(String.join(",", componentNameMap.getOrDefault(key, Collections.emptySet())));
}
return records.values();
}
/**
* 配件累计规则
*
* @param row
* @param fromGroup
* @return
*/
private boolean isBodyViewPartNumRow(OrdersViewPartsPageDO row, boolean fromGroup) {
if (fromGroup) {
return ObjectUtil.isNotNull(row.getGroupId()) && ObjectUtil.notEqual(row.getGroupId(), 0L);
}
return ObjectUtil.equals(row.getGroupId(), 0L)
|| (ObjectUtil.isNull(row.getGroupId()) && ObjectUtil.isNull(row.getCompId()));
}
/**
* 柜体id+配件id+cadviewid key
*
* @param row
* @return
*/
private String buildBodyViewPartKey(OrdersViewPartsPageDO row) {
return row.getBodyId() + "_" + row.getId() + "_" + row.getCadViewId();
} }
@Override @Override
@@ -741,6 +741,116 @@
ORDER BY op.type, op.id ORDER BY op.type, op.id
</select> </select>
<select id="selectOrdersViewPartsList"
resultType="com.cf.imes.module.executor.dal.dataobject.orderItem.OrdersViewPartsPageDO">
SELECT
i.order_id AS orderId,
i.parts_id AS id,
i.body_id AS bodyId,
ob.name AS bodyName,
ob.room_name AS roomName,
<choose>
<when test="componentIds != null and componentIds.size() > 0">
oc.cad_view_file_id AS cadViewFileId,
</when>
<otherwise>
ob.cad_view_file_id AS cadViewFileId,
</otherwise>
</choose>
i.cad_view_id AS cadViewId,
i.group_id AS groupId,
i.comp_id AS compId,
i.num AS num,
og.name AS processGroupName,
oc.name AS componentName,
op.type,
op.name,
op.material,
op.color,
op.model,
op.spec,
op.unit,
op.brand,
op.factory,
op.remark,
op.width,
op.length,
op.thickness
<choose>
<when test="deleted">
FROM order_item_temp i
</when>
<otherwise>
FROM order_item i
</otherwise>
</choose>
JOIN order_parts op
ON op.organ_id = i.organ_id
AND op.order_id = i.order_id
AND op.id = i.parts_id
AND op.deleted = false
LEFT JOIN order_body ob
ON ob.organ_id = i.organ_id
AND ob.order_id = i.order_id
AND ob.id = i.body_id
LEFT JOIN order_group og
ON og.organ_id = i.organ_id
AND og.order_id = i.order_id
AND og.id = i.group_id
LEFT JOIN order_component oc
ON oc.organ_id = i.organ_id
AND oc.order_id = i.order_id
AND oc.id = i.comp_id
WHERE i.plate_id = 0
AND i.source_id = 0
AND i.parts_id != 0
<if test="orderIds != null and orderIds.size() > 0">
AND i.order_id IN
<foreach item="orderId" collection="orderIds" open="(" separator="," close=")">
#{orderId}
</foreach>
</if>
<if test="bodyIds != null and bodyIds.size() > 0">
AND i.body_id IN
<foreach item="bodyId" collection="bodyIds" open="(" separator="," close=")">
#{bodyId}
</foreach>
</if>
<choose>
<when test="groupIds != null and groupIds.size() > 0">
AND i.group_id IN
<foreach item="groupId" collection="groupIds" open="(" separator="," close=")">
#{groupId}
</foreach>
</when>
<otherwise>
<if test="componentIds == null or componentIds.size() == 0">
AND ((i.group_id is null and i.comp_id is null) or i.group_id = 0)
</if>
</otherwise>
</choose>
<if test="componentIds != null and componentIds.size() > 0">
AND i.comp_id IN
<foreach item="componentId" collection="componentIds" open="(" separator="," close=")">
#{componentId}
</foreach>
</if>
<if test="name != null and name != ''">
AND op.name = #{name}
</if>
ORDER BY
op.type,
op.id
</select>
<select id="selectComponentCorrelationPlateIds" resultType="java.lang.String"> <select id="selectComponentCorrelationPlateIds" resultType="java.lang.String">
SELECT DISTINCT op.plate_no SELECT DISTINCT op.plate_no
FROM order_item oi FROM order_item oi