zxf 2 週間 前
コミット
78427a46dc

+ 8 - 7
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/controller/BizWaybillOrderController.java

@@ -197,20 +197,22 @@ public class BizWaybillOrderController extends BaseController
                         .head(JDOrderDTO.class)
                         .sheet()
                         .doReadSync();
-
                 // 校验数据
                 if (orderList == null || orderList.isEmpty()) {
                     return AjaxResult.error("Excel 文件中没有有效的订单数据");
                 }
-
+                Map<String,Object> result = bizWaybillOrderService.validateAndGetErrorJd(orderList);
+                if (StringUtils.isNotBlank(result.get("errorMsg").toString())) {
+                    return AjaxResult.error(result.get("errorMsg").toString());
+                }
                 total = orderList.size();
                 // 调用批量下单方法
-                bizWaybillOrderService.batchInsertJDBizWaybillOrder(orderList, orderType);
+              //  bizWaybillOrderService.batchInsertJDBizWaybillOrder(orderList, orderType);
+               bizWaybillOrderService.asyncBatchInsertJd((List<BizWaybillOrder>) result.get("orderList"), orderType);
+
             }
             if (2 == orderType) {
                 ExcelUtil<SfOrderImportDTO> util = new ExcelUtil<>(SfOrderImportDTO.class);
-               // List<SfOrderImportDTO> orderList = util.importExcel(file.getInputStream());
-
                 List<SfOrderImportDTO> orderList = EasyExcel.read(file.getInputStream())
                         .head(SfOrderImportDTO.class)
                         .sheet()
@@ -222,14 +224,13 @@ public class BizWaybillOrderController extends BaseController
                 }
                 // 2. 统一校验(返回错误字符串)
                 Map<String,Object> result = bizWaybillOrderService.validateAndGetError(orderList);
-
                 // 3. 有错误 → 直接返回字符串
                 if (StringUtils.isNotBlank(result.get("errorMsg").toString())) {
                     return AjaxResult.error(result.get("errorMsg").toString());
                 }
                 total=orderList.size();
                 // 调用异步批量下单方法
-               bizWaybillOrderService.asyncBatchInsert((List<BizWaybillOrder>) result.get("orederList"), orderType);
+               bizWaybillOrderService.asyncBatchInsert((List<BizWaybillOrder>) result.get("orderList"), orderType);
             }
             return AjaxResult.success(String.format("本次导入共【%d】条数据,后台已自动开启对接第三方接口下单,请 1-2 分钟后刷新列表仔细核对导入结果!",total));
 

+ 4 - 4
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/domain/dto/JDOrderDTO.java

@@ -110,7 +110,7 @@ public class JDOrderDTO implements Serializable {
     private Date pickupEndTime;
 
     /** 产品类型 */
-    @ExcelProperty(value = "产品类型", order = 12)
+    @ExcelProperty(value = "产品类型", order = 10)
     @ColumnWidth(15)
     private String productCode;
 
@@ -121,17 +121,17 @@ public class JDOrderDTO implements Serializable {
     private String remark;
 
     /** 包装服务 */
-    @ExcelProperty(value = "包装服务", order = 13)
+    @ExcelProperty(value = "包装服务", order = 11)
     @ColumnWidth(15)
     private String isPack;
 
     /** 保价金额 */
-    @ExcelProperty(value = "保价金额", order = 14)
+    @ExcelProperty(value = "保价金额", order = 12)
     @ColumnWidth(15)
     private BigDecimal guaranteeMoney;
 
     /** 签单返还 */
-    @ExcelProperty(value = "签单返还", order = 15)
+    @ExcelProperty(value = "签单返还", order = 13)
     @ColumnWidth(15)
     private String isReceiptCollect;
 

+ 10 - 10
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/handler/JDOrderDynamicTemplateHandler.java

@@ -42,7 +42,7 @@ public class JDOrderDynamicTemplateHandler {
         // 设置响应头
         response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
         response.setCharacterEncoding("utf-8");
-        String fileName = URLEncoder.encode("批量下单模板", "UTF-8").replaceAll("\\+", "%20");
+        String fileName = URLEncoder.encode("京东批量下单模板", "UTF-8").replaceAll("\\+", "%20");
         response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
 
         // 创建 Excel 写入器,注册自定义 SheetWriteHandler 和 RowWriteHandler
@@ -77,30 +77,30 @@ public class JDOrderDynamicTemplateHandler {
                 
                 // 2. 为"产品类型"列(第 M 列,索引 12)添加下拉框
                 if (productCodes != null && !productCodes.isEmpty()) {
-                    addDropdownValidation(workbook, sheet, productCodes, 12, "ProductCodes");
+                    addDropdownValidation(workbook, sheet, productCodes, 10, "ProductCodes");
                 }
 
                 // 3. 为"包装服务"列(第 N 列,索引 13)添加下拉框
-                addDropdownValidation(workbook, sheet, getYesNoOptions(), 13, "YesOrNo");
+                addDropdownValidation(workbook, sheet, getYesNoOptions(), 11, "YesOrNo");
                 
                 // 4. 为"签单返还"列(第 P 列,索引 15)添加下拉框(复用 YesOrNo)
-                addDropdownValidationToExistingRange(workbook, sheet, 15, "YesOrNo");
+                addDropdownValidationToExistingRange(workbook, sheet, 13, "YesOrNo");
                 
                 // 5. 添加数值列的数据验证(不能为负数)
                 // 物品重量(第 H 列,索引 7)
-                addNumberValidation(workbook, sheet, 7, "物品重量");
+                addNumberValidation(workbook, sheet, 7, "物品重量(KG)");
                 // 物品体积(第 I 列,索引 8)
-                addNumberValidation(workbook, sheet, 8, "物品体积");
+                addNumberValidation(workbook, sheet, 8, "物品体积(m³)");
                 // 物品数量(第 J 列,索引 9)
-                addNumberValidation(workbook, sheet, 9, "物品数量");
+                addNumberValidation(workbook, sheet, 9, "物品数量(件)");
                 // 保价金额(第 O 列,索引 14)
-                addNumberValidation(workbook, sheet, 14, "保价金额");
+                addNumberValidation(workbook, sheet, 12, "保价金额(元)");
                 
                 // 6. 添加时间列的数据验证(格式:yyyy-MM-dd HH:00:00)
                 // 上门取件开始时间(第 K 列,索引 10)
-                addDateTimeValidation(workbook, sheet, 10, "上门取件开始时间");
+              //  addDateTimeValidation(workbook, sheet, 10, "上门取件开始时间");
                 // 上门取件结束时间(第 L 列,索引 11)
-                addDateTimeValidation(workbook, sheet, 11, "上门取件结束时间");
+              //  addDateTimeValidation(workbook, sheet, 11, "上门取件结束时间");
             }
         };
     }

+ 4 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/IBizWaybillOrderService.java

@@ -112,4 +112,8 @@ public interface IBizWaybillOrderService
     void asyncBatchInsert(List<BizWaybillOrder> orderList, Integer orderType);
 
     Map<String,Object> validateAndGetError(List<SfOrderImportDTO> orderList);
+
+    Map<String, Object> validateAndGetErrorJd(List<JDOrderDTO> orderList);
+
+    void asyncBatchInsertJd(List<BizWaybillOrder> orderList, Integer orderType);
 }

+ 267 - 46
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/impl/BizWaybillOrderServiceImpl.java

@@ -9,6 +9,7 @@ import java.time.ZoneId;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
@@ -458,7 +459,7 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
     }
 
     @Async
-    private void jdOrderImport(List<BizWaybillOrder> bizWaybillOrders) {
+    public  void jdOrderImport(List<BizWaybillOrder> bizWaybillOrders) {
         String batchNum = redisIdGenerator.generateUniqueId("JDPC");
 
         int successCount = 0;
@@ -698,7 +699,7 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
                 dto.setPickupType(1);
                 dto.setCreateTime(DateUtils.getNowDate());
                 dto.setBatchNum(batchNum);
-
+                dto.setOrderStatus(OrderStatusEnum.ORDER_STATUS_1.getCode());
                 // 保存到数据库
                 int result = bizWaybillOrderMapper.insertBizWaybillOrder(dto);
                 if (result > 0) {
@@ -726,12 +727,10 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
     public Map<String,Object> validateAndGetError(List<SfOrderImportDTO> orderList) {
         LoginUser loginUser = SecurityUtils.getLoginUser();
         Map<String,Object> result= new HashMap<>();
-        List<BizWaybillOrder> bizWaybillOrderList= new ArrayList<>();
-        StringBuilder errorMsg = new StringBuilder();
-        List<String> rowErrors = new ArrayList<>();
         //先把类型拿出来
         Map productParam= new HashMap<>();
         productParam.put("dictType","sf_logistics_product_code");
+        productParam.put("companyType","2");
         productParam.put("deptId",loginUser.getSysUser().getDeptId());
         List<SysDictData> allProductDictList = dictDataMapper.selectDictDataSfProductList(productParam);
        // 转成 Map:label -> value,方便快速查找
@@ -741,9 +740,16 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
                         SysDictData::getDictValue,
                         (existing, replacement) -> existing // 重复 label 保留第一个
                 ));
-        for (int i = 0; i < orderList.size(); i++) {
+
+        // ===================== 并行校验(线程安全,行号正确) =====================
+        List<Map<String, Object>> errorList = Collections.synchronizedList(new ArrayList<>());
+        List<BizWaybillOrder> successList = Collections.synchronizedList(new ArrayList<>());
+
+
+        IntStream.range(0, orderList.size()).parallel().forEach(i -> {
             SfOrderImportDTO vo = orderList.get(i);
-            int row = i + 2; // 行号从1开始
+            int row = i + 2; // 行号完全正确
+            List<String> rowErrors = new ArrayList<>();
             try {
                 if (StringUtils.isBlank(vo.getSenderPhone())) {
                     rowErrors.add("寄件人手机号不能为空");
@@ -766,12 +772,12 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
                 if (StringUtils.isBlank(vo.getGoodsName())) {
                     rowErrors.add("物品名称不能为空");
                 }
-             // 货物重量校验
+                // 货物重量校验
                 BigDecimal weight = vo.getGoodsWeight();
                 if (weight == null||weight.compareTo(BigDecimal.ZERO) <= 0) {
                     rowErrors.add("货物重量不能为空,且必须输入大于0的有效数字");
                 }
-              // 货物体积
+                // 货物体积
                 BigDecimal volume = vo.getGoodsVolume();
                 if (volume == null||volume.compareTo(BigDecimal.ZERO) <= 0) {
                     rowErrors.add("货物体积不能为空,且必须输入大于0的有效数字");
@@ -780,7 +786,7 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
                 if (goodsQty == null || goodsQty <= 0) {
                     rowErrors.add("货物数量不能为空,且必须输入大于0的有效数字");
                 }
-                String productLabel = vo.getProductCode(); // Excel 传的是中文
+                String productLabel = vo.getProductCode();
                 if (!StringUtils.hasText(productLabel)) {
                     rowErrors.add("产品类型不能为空");
                 }
@@ -790,11 +796,208 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
                     rowErrors.add("产品类型【" + productLabel + "】不存在,请检查填写是否正确");
                 }
                 vo.setProductCode(productCode);
+                if (!rowErrors.isEmpty()) {
+                    Map<String, Object> errorMap = new HashMap<>();
+                    errorMap.put("row", row);
+                    errorMap.put("msg", String.join(",", rowErrors));
+                    errorList.add(errorMap);
+                    return;
+                }
+
+                //这里拿到生成的id进行前置校验用 如果全部通过的时候  这个还需要用到
+                String orderId = redisIdGenerator.generateUniqueId("RJSD");
+                vo.setWaybillNo(orderId);
+                //全部校验完后在进行  下单前置校验
+                BizWaybillOrder bizWaybillOrder = convertToSFBizWaybillOrder(vo, loginUser);
+                JSONObject jsonObject = logisticsOrderService.precheckOrder(bizWaybillOrder);
+                if (!jsonObject.getBooleanValue("success")) {
+                    log.warn("订单前置校验未通过!发件人:{}, 收件人:{}, 原因:{}",
+                            vo.getSenderName(), vo.getReceiverName(), jsonObject.getString("msg"));
+                    Map<String, Object> errorMap = new HashMap<>();
+                    errorMap.put("row", row);
+                    errorMap.put("msg", "订单前置校验未通过 原因:" + jsonObject.getString("msg"));
+                    errorList.add(errorMap);
+                    return;
+                }
+                successList.add(bizWaybillOrder);
+            } catch (Exception e) {
+                Map<String, Object> errorMap = new HashMap<>();
+                errorMap.put("row", row);
+                errorMap.put("msg", "系统异常:" + e.getMessage());
+                errorList.add(errorMap);
+                log.error("第{}行校验异常", row, e);
+            }
+
+
+
+        });
+        List<Map<String, Object>> sortedErrors = errorList.stream()
+                .sorted(Comparator.comparingInt(m -> (Integer) m.get("row")))
+                .collect(Collectors.toList());
+
 
-                /*//还需要校验一下收件地址寄件地址的省市区信息是否合规
+        StringBuilder errorMsg = new StringBuilder();
+        for (Map<String, Object> map : sortedErrors) {
+            errorMsg.append("第").append(map.get("row")).append("行:")
+                    .append(map.get("msg")).append("\n");
+        }
+
+        result.put("errorMsg", errorMsg.toString());
+        result.put("orderList", successList); // 注意:你之前是 orederList 拼写错误
+        return result;
+    }
+
+    @Override
+    public Map<String, Object> validateAndGetErrorJd(List<JDOrderDTO> orderList) {
+        {
+            LoginUser loginUser = SecurityUtils.getLoginUser();
+            Map<String,Object> result= new HashMap<>();
+            //先把类型拿出来
+            Map productParam= new HashMap<>();
+            productParam.put("dictType","jd_logistics_product_code");
+            productParam.put("companyType","1");
+            productParam.put("deptId",loginUser.getSysUser().getDeptId());
+            List<SysDictData> allProductDictList = dictDataMapper.selectDictDataSfProductList(productParam);
+            // 转成 Map:label -> value,方便快速查找
+            Map<String, String> productMap = allProductDictList.stream()
+                    .collect(Collectors.toMap(
+                            SysDictData::getDictLabel,
+                            SysDictData::getDictValue,
+                            (existing, replacement) -> existing // 重复 label 保留第一个
+                    ));
+
+            // ===================== 并行校验(线程安全,行号正确) =====================
+            List<Map<String, Object>> errorList = Collections.synchronizedList(new ArrayList<>());
+            List<BizWaybillOrder> successList = Collections.synchronizedList(new ArrayList<>());
+
+
+            IntStream.range(0, orderList.size()).parallel().forEach(i -> {
+                JDOrderDTO vo = orderList.get(i);
+                int row = i + 2; // 行号完全正确
+                List<String> rowErrors = new ArrayList<>();
+                try {
+
+                    if (StringUtils.isBlank(vo.getReceiverPhone()) || !vo.getReceiverPhone().matches("1[3-9]\\d{9}")) {
+                        rowErrors.add("收件人手机号为空或格式不正确");
+                    }
+                    if (StringUtils.isBlank(vo.getSenderPhone()) || !vo.getSenderPhone().matches("1[3-9]\\d{9}")) {
+                        rowErrors.add("寄件人手机号为空或格式不正确");
+                    }
+                    if (StringUtils.isBlank(vo.getReceiverAddress())) {
+                        rowErrors.add("收件地址不能为空");
+                    }
+                    if (StringUtils.isBlank(vo.getSenderAddress())) {
+                        rowErrors.add("寄件地址不能为空");
+                    }
+                    if (StringUtils.isBlank(vo.getGoodsName())) {
+                        rowErrors.add("物品名称不能为空");
+                    }
+                    // 货物重量校验
+                    BigDecimal weight = vo.getGoodsWeight();
+                    if (weight == null||weight.compareTo(BigDecimal.ZERO) <= 0) {
+                        rowErrors.add("货物重量不能为空,且必须输入大于0的有效数字");
+                    }
+                    // 货物体积
+                    BigDecimal volume = vo.getGoodsVolume();
+                    if (volume == null||volume.compareTo(BigDecimal.ZERO) <= 0) {
+                        rowErrors.add("货物体积不能为空,且必须输入大于0的有效数字");
+                    }
+                    Long goodsQty = vo.getGoodsQty();
+                    if (goodsQty == null || goodsQty <= 0) {
+                        rowErrors.add("货物数量不能为空,且必须输入大于0的有效数字");
+                    }
+                    String productLabel = vo.getProductCode();
+                    if (!StringUtils.hasText(productLabel)) {
+                        rowErrors.add("产品类型不能为空");
+                    }
+
+                    String productCode = productMap.get(productLabel);
+                    if (productCode == null) {
+                        rowErrors.add("产品类型【" + productLabel + "】不存在,请检查填写是否正确");
+                    }
+
+                    if (null != vo.getIsPack() && !"是".equals(vo.getIsPack()) && !"否".equals(vo.getIsPack())) {
+                        rowErrors.add("包装服务参数有误;");
+                    }
+                    if (null != vo.getIsReceiptCollect() && !"是".equals(vo.getIsReceiptCollect()) && !"否".equals(vo.getIsReceiptCollect())) {
+                        rowErrors.add("签单返还参数有误;");
+                    }
+                    if (null != vo.getGuaranteeMoney() && vo.getGuaranteeMoney().compareTo(new BigDecimal("0")) <= 0) {
+                        rowErrors.add("保价金额不能小于等于0;");
+                    }
+                    vo.setAddedService(getAddedService(vo));
+                    vo.setProductCode(productCode);
+                    if (!rowErrors.isEmpty()) {
+                        Map<String, Object> errorMap = new HashMap<>();
+                        errorMap.put("row", row);
+                        errorMap.put("msg", String.join(",", rowErrors));
+                        errorList.add(errorMap);
+                        return;
+                    }
+
+                    BizWaybillOrder bizWaybillOrder = convertToBizWaybillOrder(vo, loginUser);
+                    String orderId = redisIdGenerator.generateUniqueId("RJSD");
+                    bizWaybillOrder.setWaybillNo(orderId);
+                    bizWaybillOrder.setOrderStatus(OrderStatusEnum.ORDER_STATUS_1.getCode());
+
+                    // 前置校验
+                    bizWaybillOrder.setSenderProvince("");
+                    bizWaybillOrder.setSenderCity("");
+                    bizWaybillOrder.setSenderCounty("");
+                    bizWaybillOrder.setReceiverProvince("");
+                    bizWaybillOrder.setReceiverCity("");
+                    bizWaybillOrder.setReceiverCounty("");
+
+                    JSONObject jsonObject = logisticsOrderService.precheckOrder(bizWaybillOrder);
+                    if (!jsonObject.getBooleanValue("success")) { log.warn("订单前置校验未通过!发件人:{}, 收件人:{}, 原因:{}",
+                            vo.getSenderName(), vo.getReceiverName(), jsonObject.getString("msg"));
+                        Map<String, Object> errorMap = new HashMap<>();
+                        errorMap.put("row", row);
+                        errorMap.put("msg", "订单前置校验未通过 原因:" + jsonObject.getString("msg"));
+                        errorList.add(errorMap);
+                        return;
+                    }
+                    successList.add(bizWaybillOrder);
+                } catch (Exception e) {
+                    Map<String, Object> errorMap = new HashMap<>();
+                    errorMap.put("row", row);
+                    errorMap.put("msg", "系统异常:" + e.getMessage());
+                    errorList.add(errorMap);
+                    log.error("第{}行校验异常", row, e);
+                }
+            });
+            List<Map<String, Object>> sortedErrors = errorList.stream()
+                    .sorted(Comparator.comparingInt(m -> (Integer) m.get("row")))
+                    .collect(Collectors.toList());
+
+
+            StringBuilder errorMsg = new StringBuilder();
+            for (Map<String, Object> map : sortedErrors) {
+                errorMsg.append("第").append(map.get("row")).append("行:")
+                        .append(map.get("msg")).append("\n");
+            }
+
+            result.put("errorMsg", errorMsg.toString());
+            result.put("orderList", successList); // 注意:你之前是 orederList 拼写错误
+            return result;
+        }
+    }
+
+    @Async
+    @Override
+    public void asyncBatchInsertJd(List<BizWaybillOrder> orderList, Integer orderType) {
+        String batchNum = redisIdGenerator.generateUniqueId("JDPC");
+
+        int successCount = 0;
+        int failCount = 0;
+        List<String> errorMessages = new ArrayList<>();
+        List<BizWaybillOrder> failList= new ArrayList<>();
+        for (BizWaybillOrder dto : orderList) {
+            try {
+                //还需要校验一下收件地址寄件地址的省市区信息是否合规
                 // ===================== 解析 发件地址 省市区 =====================
                 Map<String, Object> senderParam = new HashMap<>();
-                senderParam.put("param", vo.getSenderAddress());
+                senderParam.put("param", dto.getSenderAddress());
                 Map<String, Object> senderResultMap = kuaidi100Service.queryIcrExpres(senderParam);
                 Map<String, Object> senderData = (Map<String, Object>) senderResultMap.get("data");
                 List<Map<String, Object>> senderResultList = (List<Map<String, Object>>) senderData.get("result");
@@ -806,12 +1009,12 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
                 String senderProvince = senderSplit[0];
                 String senderCity = senderSplit[1];
                 String senderDistrict = senderSplit[2];
-                vo.setSenderProvince(senderProvince);
-                vo.setSenderCity(senderCity);
-                vo.setSenderCounty(senderDistrict);
-                 // ===================== 解析 收件地址 省市区 =====================
+                dto.setSenderProvince(senderProvince);
+                dto.setSenderCity(senderCity);
+                dto.setSenderCounty(senderDistrict);
+                // ===================== 解析 收件地址 省市区 =====================
                 Map<String, Object> receiverParam = new HashMap<>();
-                receiverParam.put("param", vo.getReceiverAddress());
+                receiverParam.put("param", dto.getReceiverAddress());
                 Map<String, Object> receiverResultMap = kuaidi100Service.queryIcrExpres(receiverParam);
                 Map<String, Object> receiverData = (Map<String, Object>) receiverResultMap.get("data");
                 List<Map<String, Object>> receiverResultList = (List<Map<String, Object>>) receiverData.get("result");
@@ -823,36 +1026,50 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
                 String receiverProvince = receiverSplit[0];
                 String receiverCity = receiverSplit[1];
                 String receiverDistrict = receiverSplit[2];
-                vo.setReceiverProvince(receiverProvince);
-                vo.setReceiverCity(receiverCity);
-                vo.setReceiverCounty(receiverDistrict);*/
-                //这里拿到生成的id进行前置校验用 如果全部通过的时候  这个还需要用到
-                String orderId = redisIdGenerator.generateUniqueId("RJSD");
-                vo.setWaybillNo(orderId);
+                dto.setReceiverProvince(receiverProvince);
+                dto.setReceiverCity(receiverCity);
+                dto.setReceiverCounty(receiverDistrict);
 
-                //全部校验完后在进行  下单前置校验
-                BizWaybillOrder bizWaybillOrder = convertToSFBizWaybillOrder(vo, loginUser);
-                JSONObject jsonObject = logisticsOrderService.precheckOrder(bizWaybillOrder);
-                if (!jsonObject.getBooleanValue("success")) {
-                    log.warn("订单前置校验未通过!发件人:{}, 收件人:{}, 原因:{}",
-                            vo.getSenderName(), vo.getReceiverName(), jsonObject.getString("msg"));
-                    rowErrors.add("订单前置校验未通过 原因:"+jsonObject.getString("msg"));
+                // 调用下单接口
+                JSONObject orderObject = logisticsOrderService.createOrder(dto);
+                if (!orderObject.getBooleanValue("success")) {
+                    log.warn("下单失败!发件人:{}, 收件人:{}, 原因:{}",
+                            dto.getSenderName(), dto.getReceiverName(), orderObject.getString("msg"));
+                    failCount++;
+                    errorMessages.add(String.format("订单 %s-%s 下单失败:%s",
+                            dto.getSenderName(), dto.getReceiverName(), orderObject.getString("msg")));
+                    failList.add(dto);
+                    continue;
                 }
-                bizWaybillOrderList.add(bizWaybillOrder);
-                if (!rowErrors.isEmpty()) {
-                    errorMsg.append("第").append(row).append("行:")
-                            .append(String.join(",", rowErrors)) // 用逗号拼接所有错误
-                            .append("\n");
-                    continue; // 跳过这一行,不进正常列表
+
+                // 设置默认值
+                dto.setPickupType(1);
+                dto.setCreateTime(DateUtils.getNowDate());
+                dto.setBatchNum(batchNum);
+                dto.setOrderStatus(OrderStatusEnum.ORDER_STATUS_1.getCode());
+                dto.setWaybillNo(redisIdGenerator.generateUniqueId("RJSD"));
+                // 保存到数据库
+                int result = bizWaybillOrderMapper.insertBizWaybillOrder(dto);
+                if (result > 0) {
+                    successCount++;
+                    // 保存最近使用地址
+                    saveRecentAddresses(dto, dto.getUserId());
+                } else {
+                    failCount++;
+                    errorMessages.add(String.format("订单 %s-%s 保存失败",
+                            dto.getSenderName(), dto.getReceiverName()));
                 }
             } catch (Exception e) {
-                // 拼接错误:第X行 + 原因
-                errorMsg.append("第").append(row).append("行:").append(e.getMessage()).append("\n");
+                log.error("批量下单异常!发件人:{}, 收件人:{}",
+                        dto.getSenderName(), dto.getReceiverName(), e);
+                failCount++;
+                errorMessages.add(String.format("订单 %s-%s 异常:%s",
+                        dto.getSenderName(), dto.getReceiverName(), e.getMessage()));
             }
         }
-        result.put("errorMsg",errorMsg);
-        result.put("orederList",bizWaybillOrderList);
-        return result;
+        log.info("批量下单完成!总数:{}, 成功:{}, 失败:{}", orderList.size(), successCount, failCount);
+
+
     }
 
     /**
@@ -887,7 +1104,7 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
         // 取件时间
         bizWaybillOrder.setSendStartTime(dto.getSendStartTime());
         //结束时间需要计算出来
-        //bizWaybillOrder.setSendEndTime(dto.getSendEndTime());
+
         LocalDateTime now = LocalDateTime.now();
        // 先整点归零
         LocalDateTime hourStart = now.withMinute(0).withSecond(0).withNano(0);
@@ -905,7 +1122,7 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
 
 
 
-        // 2. 构建保价 JSON 格式(你要的结构)
+        // 2. 构建保价 JSON 格式
         Map<String, Object> serviceMap = new HashMap<>();
         serviceMap.put("isPack", null);                // 固定 null 顺丰没有现在
         serviceMap.put("guaranteeMoney", dto.getProtecPrice()); // 赋值 Excel 里的报价金额
@@ -966,13 +1183,12 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
         LocalDateTime nextHour = hourStart.plusHours(1);
         // 结束再+1
         LocalDateTime endHour = nextHour.plusHours(1);
+
         // 转Date给你原有字段用
         Date startTime = Date.from(nextHour.atZone(ZoneId.systemDefault()).toInstant());
         Date endTime = Date.from(endHour.atZone(ZoneId.systemDefault()).toInstant());
         bizWaybillOrder.setSendStartTime(startTime);
         bizWaybillOrder.setSendEndTime(endTime);
-//        bizWaybillOrder.setSendStartTime(DateUtils.parseDate(dto.getSendStartTime()));
-//        bizWaybillOrder.setSendEndTime(DateUtils.parseDate(dto.getSendEndTime()));
         
         // 产品信息和增值服务
         bizWaybillOrder.setProductCode(dto.getProductCode());
@@ -980,7 +1196,12 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
         
         // 备注
         bizWaybillOrder.setRemark(dto.getRemark());
-        
+
+
+        bizWaybillOrder.setDeptId(loginUser.getSysUser().getDeptId());
+        bizWaybillOrder.setUserId(loginUser.getUserid());
+
+
         return bizWaybillOrder;
     }
 

+ 1 - 1
jd-logistics-modules/jd-logistics-system/src/main/resources/mapper/system/SysDictDataMapper.xml

@@ -52,7 +52,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		LEFT JOIN sys_dict_data b ON b.dict_value = a.product_type
 
 		<where>
-			a.company_type = '2' and  b.status = 0
+			a.company_type = #{companyType} and  b.status = 0
 			<if test="dictType != null and dictType != ''">
 				AND b.dict_type = #{dictType}
 			</if>