|
|
@@ -4210,6 +4210,159 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public R batchDeliveryAllPendingOrders(Integer shipmentType) {
|
|
|
+ try {
|
|
|
+ DeliveryNoteImportResultDTO result = new DeliveryNoteImportResultDTO();
|
|
|
+
|
|
|
+ // 默认使用自提方式
|
|
|
+ if (shipmentType == null) {
|
|
|
+ shipmentType = 4;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取商城配置
|
|
|
+ String json = configService.selectConfigByKey("store.config");
|
|
|
+ StoreConfig config = JSONUtil.toBean(json, StoreConfig.class);
|
|
|
+
|
|
|
+ // 1. 查询所有待发货订单
|
|
|
+ FsStoreOrderScrm condition = new FsStoreOrderScrm();
|
|
|
+ condition.setStatus(OrderInfoEnum.STATUS_1.getValue()); // 待发货状态
|
|
|
+ List<FsStoreOrderScrm> pendingOrders = fsStoreOrderMapper.selectFsStoreOrderList(condition);
|
|
|
+
|
|
|
+ if (pendingOrders.isEmpty()) {
|
|
|
+ return R.ok("暂无待发货订单");
|
|
|
+ }
|
|
|
+
|
|
|
+ List<FsOrderDeliveryNoteDTO> successList = new ArrayList<>(pendingOrders.size());
|
|
|
+ List<FsOrderDeliveryNoteDTO> updateList = new ArrayList<>(pendingOrders.size());
|
|
|
+ // 提取所有订单号
|
|
|
+ List<String> orderCodeList = new ArrayList<>(pendingOrders.size());
|
|
|
+
|
|
|
+
|
|
|
+ for (int i = 0; i < pendingOrders.size(); i++) {
|
|
|
+ FsStoreOrderScrm order = pendingOrders.get(i);
|
|
|
+ FsOrderDeliveryNoteDTO dto = new FsOrderDeliveryNoteDTO();
|
|
|
+
|
|
|
+
|
|
|
+ String orderCode = order.getOrderCode();
|
|
|
+ dto.setOrderNumber(orderCode);
|
|
|
+ dto.setDeliveryName("用户自提");
|
|
|
+ dto.setDeliveryId("ZT" + order.getId());
|
|
|
+ dto.setDeliverySn("ZT");
|
|
|
+
|
|
|
+ orderCodeList.add(orderCode);
|
|
|
+ successList.add(dto);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (orderCodeList.isEmpty()) {
|
|
|
+ return R.ok(result.buildResultMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ List<FsStoreOrderCodeOpenIdVo> orderCodeOpenIdVoList = fsStoreOrderMapper.selectOrderCodeOpenIdInOrderCode(orderCodeList);
|
|
|
+ Map<String, OrderOpenIdTransDTO> orderMap = new HashMap<>(orderCodeOpenIdVoList.size());
|
|
|
+ Map<String, List<FsStoreOrderCodeOpenIdVo>> orderDetailsMap = new HashMap<>(orderCodeOpenIdVoList.size());
|
|
|
+
|
|
|
+ for (FsStoreOrderCodeOpenIdVo vo : orderCodeOpenIdVoList) {
|
|
|
+ orderMap.computeIfAbsent(vo.getOrderCode(), k -> {
|
|
|
+ OrderOpenIdTransDTO dto = new OrderOpenIdTransDTO();
|
|
|
+ dto.setOpenId(vo.getOpenId());
|
|
|
+ dto.setTransactionId(vo.getOutTransId());
|
|
|
+ return dto;
|
|
|
+ });
|
|
|
+
|
|
|
+ orderDetailsMap
|
|
|
+ .computeIfAbsent(vo.getOrderCode(), k -> new ArrayList<>())
|
|
|
+ .add(vo);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4. 按小程序appId分组订单(从支付记录中获取)
|
|
|
+ Map<String, List<FsOrderDeliveryNoteDTO>> ordersByAppId = new HashMap<>();
|
|
|
+ for (FsOrderDeliveryNoteDTO dto : successList) {
|
|
|
+ String orderNumber = dto.getOrderNumber();
|
|
|
+ // 通过订单号查询订单
|
|
|
+ FsStoreOrderScrm order = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(orderNumber);
|
|
|
+ if (order != null) {
|
|
|
+ // 查询订单的支付记录获取appId
|
|
|
+ List<FsStorePaymentScrm> paymentList = fsStorePaymentMapper.selectFsStorePaymentByOrderId(order.getId());
|
|
|
+ if (!paymentList.isEmpty() && paymentList.get(0).getAppId() != null) {
|
|
|
+ String orderAppId = paymentList.get(0).getAppId();
|
|
|
+ ordersByAppId.computeIfAbsent(orderAppId, k -> new ArrayList<>()).add(dto);
|
|
|
+ log.debug("订单号: {} 关联小程序appId: {}", orderNumber, orderAppId);
|
|
|
+ } else {
|
|
|
+ log.warn("订单号: {} 无法获取appId,跳过处理", orderNumber);
|
|
|
+ result.addFailure(0, orderNumber, dto.getDeliveryId(), "无法获取订单对应的小程序appId,请确保订单已支付");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ log.warn("订单号: {} 不存在,跳过处理", orderNumber);
|
|
|
+ result.addFailure(0, orderNumber, dto.getDeliveryId(), "订单不存在");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ordersByAppId.isEmpty()) {
|
|
|
+ return R.error("所有订单都无法获取对应的小程序appId,请确保订单已支付");
|
|
|
+ }
|
|
|
+
|
|
|
+ log.info("待发货订单涉及{}个小程序,开始分组处理", ordersByAppId.size());
|
|
|
+
|
|
|
+ // 5. 按小程序分组批量上传微信发货信息
|
|
|
+ for (Map.Entry<String, List<FsOrderDeliveryNoteDTO>> entry : ordersByAppId.entrySet()) {
|
|
|
+ String currentAppId = entry.getKey();
|
|
|
+ List<FsOrderDeliveryNoteDTO> appOrders = entry.getValue();
|
|
|
+
|
|
|
+ log.info("处理小程序appId: {},订单数: {}", currentAppId, appOrders.size());
|
|
|
+
|
|
|
+ final WxMaService wxService = WxMaConfiguration.getMaService(currentAppId);
|
|
|
+ String uploadTime = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"))
|
|
|
+ .format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
|
|
|
+
|
|
|
+ for (int i = 0; i < appOrders.size(); i++) {
|
|
|
+ FsOrderDeliveryNoteDTO dto = appOrders.get(i);
|
|
|
+ int rowNum = successList.indexOf(dto) + 2;
|
|
|
+ if (StringUtils.isEmpty(dto.getOrderNumber())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查订单是否存在
|
|
|
+ String orderNumber = dto.getOrderNumber();
|
|
|
+ OrderOpenIdTransDTO orderInfo = orderMap.get(orderNumber);
|
|
|
+ if (orderInfo == null) {
|
|
|
+ result.addFailure(rowNum, orderNumber, dto.getDeliveryId(), "订单号不存在");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 验证是否开启微信发货
|
|
|
+ if (config.getIsWeChatShipping() != null && config.getIsWeChatShipping()) {
|
|
|
+ // 上传物流信息到微信
|
|
|
+ List<FsStoreOrderCodeOpenIdVo> orderDetails = orderDetailsMap.get(orderNumber);
|
|
|
+ WxShippingUploadResult uploadResult = uploadShippingInfoToWechat(wxService, orderInfo, orderDetails, dto, uploadTime, shipmentType);
|
|
|
+ if (uploadResult.isSuccess()) {
|
|
|
+ updateList.add(dto);
|
|
|
+ result.addSuccess();
|
|
|
+ } else {
|
|
|
+ String failureReason = uploadResult.getErrorDesc();
|
|
|
+ result.addFailure(rowNum, orderNumber, dto.getDeliveryId(), failureReason);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ updateList.add(dto);
|
|
|
+ result.addSuccess();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 6. 批量更新发货记录
|
|
|
+ if (!updateList.isEmpty()) {
|
|
|
+ batchUpdateDeliveryNotes(updateList);
|
|
|
+ }
|
|
|
+
|
|
|
+ return R.ok(result.buildResultMessage());
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("一键发货操作失败", e);
|
|
|
+ return R.error("一键发货操作失败:" + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public R importDeliveryNoteExpress(List<FsStoreOrderDeliveryNoteExportVO> voList, String appId,Integer shipmentType) {
|