Jelajahi Sumber

fix(order): 解决订单分配和发货单显示问题

- 修改订单分配逻辑,注释掉 mkt 类型的判断条件,仅保留 zy 类型
- 优化订单主服务中的批量查询逻辑,添加分配记录的批量查询和映射
- 增加按类型分组的分配对象ID收集功能,支持客户、供应商、合作伙伴类型
- 添加分配对象名称的远程调用查询映射
- 新增分配状态查询条件的支持
- 优化订单树形结构中的分配对象名称查询,优先从子订单分配表获取
- 添加订单发货单列表的查询和商品关联功能
- 更新分配人姓名获取逻辑,增加 MKT 类型的支持
hurx 11 jam lalu
induk
melakukan
93b0450fa3

+ 5 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/vo/OrderTreeVo.java

@@ -139,4 +139,9 @@ public class OrderTreeVo implements Serializable {
      * 子订单列表(递归结构)
      */
     private List<OrderTreeVo> childOrders;
+
+    /**
+     * 该订单的包裹/发货单列表
+     */
+    private List<OrderDeliverVo> orderDeliverList;
 }

+ 2 - 1
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/OrderAssignmentServiceImpl.java

@@ -599,7 +599,8 @@ public class OrderAssignmentServiceImpl extends ServiceImpl<OrderAssignmentMappe
         child.setQuantityShipped(parent.getQuantityShipped());
 
         // 根据分配对象类型设置订单状态
-        if ("zy".equals(assigneeType) || "mkt".equals(assigneeType)) {
+//        if ("zy".equals(assigneeType) || "mkt".equals(assigneeType)) {
+        if ("zy".equals(assigneeType) ) {//分配给scm(采购端)后需要收单才能继续分配
             child.setOrderStatus(OrderStatus.PENDING_SHIPMENT.getCode()); // 自营:待发货,不需要确认
 
         } else {

+ 102 - 5
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/OrderMainServiceImpl.java

@@ -344,17 +344,79 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
             Set<Long> createDeptIds = records.stream().map(OrderMainVo::getCreateDept).collect(Collectors.toSet());
             Set<Long> orderIds = records.stream().map(OrderMainVo::getParentOrderId).filter(Objects::nonNull).collect(Collectors.toSet());
             Set<String> dataSources = records.stream().map(OrderMainVo::getDataSource).filter(Objects::nonNull).collect(Collectors.toSet());
+            // 批量查询分配记录
+            Set<Long> recordIds = records.stream().map(OrderMainVo::getId).collect(Collectors.toSet());
+            List<OrderAssignment> assignments = orderAssignmentService.list(
+                new LambdaQueryWrapper<OrderAssignment>()
+                    .in(OrderAssignment::getChildOrderId, recordIds)
+            );
+            Map<Long, OrderAssignment> assignmentMap = assignments.stream()
+                .collect(Collectors.toMap(OrderAssignment::getChildOrderId, Function.identity(), (a, b) -> a));
+            // 收集分配对象ID(按类型分组)
+            Set<Long> customerAssigneeIds = new HashSet<>();
+            Set<Long> supplierAssigneeIds = new HashSet<>();
+            Set<Long> partnerAssigneeIds = new HashSet<>();
+            for (OrderMainVo order : records) {
+                OrderAssignment assignment = assignmentMap.get(order.getId());
+                if (ObjectUtils.isNotEmpty(assignment)) {
+                    String type = assignment.getAssigneeType();
+                    if (AssigneeTypeConstants.CUSTOMER.getCode().equals(type) || AssigneeTypeConstants.MKT.getCode().equals(type)) {
+                        customerAssigneeIds.add(assignment.getAssigneeId());
+                    } else if (AssigneeTypeConstants.SUPPLIER.getCode().equals(type)) {
+                        supplierAssigneeIds.add(assignment.getAssigneeId());
+                    } else if (AssigneeTypeConstants.PARTNER.getCode().equals(type)) {
+                        partnerAssigneeIds.add(assignment.getAssigneeId());
+                    }
+                } else if (order.getAssigneeId() != null && StringUtils.isNotBlank(order.getAssigneeType())) {
+                    String type = order.getAssigneeType();
+                    if (AssigneeTypeConstants.CUSTOMER.getCode().equals(type) || AssigneeTypeConstants.MKT.getCode().equals(type)) {
+                        customerAssigneeIds.add(order.getAssigneeId());
+                    } else if (AssigneeTypeConstants.SUPPLIER.getCode().equals(type)) {
+                        supplierAssigneeIds.add(order.getAssigneeId());
+                    } else if (AssigneeTypeConstants.PARTNER.getCode().equals(type)) {
+                        partnerAssigneeIds.add(order.getAssigneeId());
+                    }
+                }
+            }
             Map<Long, String> UserMap = remoteUserService.selectUserNamesByIds(createUserIds.stream().toList());
             Map<Long, String> deptMap = remoteDeptService.selectDeptNameByIds(createDeptIds);
             Map<Long, String> customerMap = remoteCustomerService.selectCustomerNameByIds(customerIds);
             Map<String, String> dataSourceMap = remoteExternalItemService.selectItemNameByItemKeys(dataSources);
             Map<Long, String> orderNoMap = selectOrderNoByIds(orderIds);
+            Map<Long, String> customerAssigneeNameMap = customerAssigneeIds.isEmpty() ? Collections.emptyMap()
+                : remoteCustomerService.selectCustomerNameByIds(customerAssigneeIds);
+            Map<Long, String> supplierAssigneeNameMap = supplierAssigneeIds.isEmpty() ? Collections.emptyMap()
+                : remoteSupplierInfoService.selectSupplierNameByIds(supplierAssigneeIds);
+            Map<Long, String> partnerAssigneeNameMap = partnerAssigneeIds.isEmpty() ? Collections.emptyMap()
+                : remotePartnerInfoService.selectPartnerNameByIds(partnerAssigneeIds);
             records.forEach(orderMainVo -> {
                 orderMainVo.setProjectOrderNo(orderNoMap.get(orderMainVo.getParentOrderId()));
                 orderMainVo.setCreateName(UserMap.get(orderMainVo.getCreateBy()));
                 orderMainVo.setCreateDeptName(deptMap.get(orderMainVo.getCreateDept()));
                 orderMainVo.setCustomerName(customerMap.get(orderMainVo.getCustomerId()));
                 orderMainVo.setDataSourceStr(dataSourceMap.get(orderMainVo.getDataSource()));
+                // 设置分配对象名称
+                OrderAssignment assignment = assignmentMap.get(orderMainVo.getId());
+                if (ObjectUtils.isNotEmpty(assignment)) {
+                    orderMainVo.setAssigneeRemark(assignment.getRemark());
+                    String type = assignment.getAssigneeType();
+                    if (AssigneeTypeConstants.CUSTOMER.getCode().equals(type) || AssigneeTypeConstants.MKT.getCode().equals(type)) {
+                        orderMainVo.setAssigneeName(customerAssigneeNameMap.get(assignment.getAssigneeId()));
+                    } else if (AssigneeTypeConstants.SUPPLIER.getCode().equals(type)) {
+                        orderMainVo.setAssigneeName(supplierAssigneeNameMap.get(assignment.getAssigneeId()));
+                    } else if (AssigneeTypeConstants.PARTNER.getCode().equals(type)) {
+                        orderMainVo.setAssigneeName(partnerAssigneeNameMap.get(assignment.getAssigneeId()));
+                    }
+                } else if (orderMainVo.getAssigneeId() != null && StringUtils.isNotBlank(orderMainVo.getAssigneeType())) {
+                    String type = orderMainVo.getAssigneeType();
+                    if (AssigneeTypeConstants.CUSTOMER.getCode().equals(type) || AssigneeTypeConstants.MKT.getCode().equals(type)) {
+                        orderMainVo.setAssigneeName(customerAssigneeNameMap.get(orderMainVo.getAssigneeId()));
+                    } else if (AssigneeTypeConstants.SUPPLIER.getCode().equals(type)) {
+                        orderMainVo.setAssigneeName(supplierAssigneeNameMap.get(orderMainVo.getAssigneeId()));
+                    } else if (AssigneeTypeConstants.PARTNER.getCode().equals(type)) {
+                        orderMainVo.setAssigneeName(partnerAssigneeNameMap.get(orderMainVo.getAssigneeId()));
+                    }
+                }
             });
         }
         return TableDataInfo.build(result);
@@ -434,8 +496,8 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
                 if (StringUtils.isNotBlank(bo.getAssigneeType())) {
                     lqw.and(wrapper -> wrapper
                         .eq(OrderMain::getAssigneeType, bo.getAssigneeType())
-                        .or()
-                        .isNotNull(OrderMain::getDataSource)
+//                        .or()
+//                        .isNotNull(OrderMain::getDataSource)
                     );
                 } else {
                     // 如果没有指定 assigneeType,只查询 dataSource 不为空的订单
@@ -472,6 +534,7 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
         lqw.eq(StringUtils.isNotBlank(bo.getPaymentStatus()), OrderMain::getPaymentStatus, bo.getPaymentStatus());
         lqw.eq(StringUtils.isNotBlank(bo.getOrderSource()), OrderMain::getOrderSource, bo.getOrderSource());
         lqw.eq(StringUtils.isNotBlank(bo.getOrderStatus()), OrderMain::getOrderStatus, bo.getOrderStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getAssignmentStatus()), OrderMain::getAssignmentStatus, bo.getAssignmentStatus());
         lqw.eq(bo.getOrderTime() != null, OrderMain::getOrderTime, bo.getOrderTime());
         lqw.eq(bo.getConfirmTime() != null, OrderMain::getConfirmTime, bo.getConfirmTime());
         lqw.eq(bo.getShippingTime() != null, OrderMain::getShippingTime, bo.getShippingTime());
@@ -2022,8 +2085,18 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
         treeVo.setRemark(orderMainVo.getRemark());
         treeVo.setDataSource(orderMainVo.getDataSource());
 
-        // 查询并设置分配对象名称
-        if (orderMainVo.getAssigneeId() != null && StringUtils.isNotBlank(orderMainVo.getAssigneeType())) {
+        // 查询并设置分配对象名称(优先从 order_assignment 表获取子订单的分配人)
+        OrderAssignment orderAssignment = orderAssignmentService.getOne(
+            new LambdaQueryWrapper<OrderAssignment>()
+                .eq(OrderAssignment::getChildOrderId, orderMainVo.getId())
+                .last("Limit 1")
+        );
+        if (ObjectUtils.isNotEmpty(orderAssignment)) {
+            treeVo.setAssigneeType(orderAssignment.getAssigneeType());
+            treeVo.setAssigneeId(orderAssignment.getAssigneeId());
+            String assigneeName = getAssigneeName(orderAssignment.getAssigneeId(), orderAssignment.getAssigneeType());
+            treeVo.setAssigneeName(assigneeName);
+        } else if (orderMainVo.getAssigneeId() != null && StringUtils.isNotBlank(orderMainVo.getAssigneeType())) {
             String assigneeName = getAssigneeName(orderMainVo.getAssigneeId(), orderMainVo.getAssigneeType());
             treeVo.setAssigneeName(assigneeName);
         }
@@ -2032,6 +2105,30 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
         List<OrderProductSimpleVo> productList = queryOrderProductsSimple(orderMainVo.getId());
         treeVo.setProductList(productList);
 
+        // 查询该订单的包裹/发货单列表
+        List<OrderDeliverVo> deliverList = orderDeliverMapper.selectVoList(
+            new LambdaQueryWrapper<OrderDeliver>()
+                .eq(OrderDeliver::getOrderId, orderMainVo.getId())
+                .orderByAsc(OrderDeliver::getId)
+        );
+        // 查询每个包裹的商品
+        if (CollUtil.isNotEmpty(deliverList)) {
+            List<Long> deliverIds = deliverList.stream()
+                .map(OrderDeliverVo::getId)
+                .collect(Collectors.toList());
+            List<OrderDeliverProductVo> allDeliverProducts = orderDeliverProductMapper.selectVoList(
+                new LambdaQueryWrapper<OrderDeliverProduct>()
+                    .in(OrderDeliverProduct::getDeliverId, deliverIds)
+                    .orderByAsc(OrderDeliverProduct::getId)
+            );
+            Map<Long, List<OrderDeliverProductVo>> productMap = allDeliverProducts.stream()
+                .collect(Collectors.groupingBy(OrderDeliverProductVo::getDeliverId));
+            deliverList.forEach(deliver ->
+                deliver.setDeliverProductList(productMap.getOrDefault(deliver.getId(), Collections.emptyList()))
+            );
+        }
+        treeVo.setOrderDeliverList(deliverList);
+
         return treeVo;
     }
 
@@ -2086,7 +2183,7 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
         }
 
         try {
-            if (AssigneeTypeConstants.CUSTOMER.getCode().equals(assigneeType)) {
+            if (AssigneeTypeConstants.CUSTOMER.getCode().equals(assigneeType) || AssigneeTypeConstants.MKT.getCode().equals(assigneeType)) {
                 Map<Long, String> customerMap = remoteCustomerService.selectCustomerNameByIds(Collections.singleton(assigneeId));
                 return customerMap.get(assigneeId);
             } else if (AssigneeTypeConstants.SUPPLIER.getCode().equals(assigneeType)) {