|
|
@@ -1,5 +1,7 @@
|
|
|
package com.fs.his.service.impl;
|
|
|
|
|
|
+import cn.binarywang.wx.miniapp.api.WxMaService;
|
|
|
+import cn.binarywang.wx.miniapp.bean.shop.request.shipping.*;
|
|
|
import cn.hutool.core.date.DateTime;
|
|
|
import cn.hutool.core.lang.TypeReference;
|
|
|
import cn.hutool.core.util.IdUtil;
|
|
|
@@ -22,7 +24,9 @@ import com.fs.common.utils.StringUtils;
|
|
|
import com.fs.common.utils.poi.ExcelUtil;
|
|
|
import com.fs.company.domain.CompanyUser;
|
|
|
import com.fs.company.mapper.CompanyUserMapper;
|
|
|
+import com.fs.core.config.WxMaConfiguration;
|
|
|
import com.fs.core.utils.OrderCodeUtils;
|
|
|
+import com.fs.erp.constant.ErpQueryOrderStatusEnum;
|
|
|
import com.fs.erp.constant.OrderStatusEnum;
|
|
|
import com.fs.erp.dto.*;
|
|
|
import com.fs.erp.http.JstErpHttpService;
|
|
|
@@ -34,6 +38,7 @@ import com.fs.his.enums.FsUserIntegralLogTypeEnum;
|
|
|
import com.fs.his.enums.PaymentMethodEnum;
|
|
|
import com.fs.his.mapper.*;
|
|
|
import com.fs.his.param.*;
|
|
|
+import com.fs.his.service.IFsExpressService;
|
|
|
import com.fs.his.service.IFsIntegralCartService;
|
|
|
import com.fs.his.service.IFsIntegralOrderService;
|
|
|
import com.fs.his.service.IFsStorePaymentService;
|
|
|
@@ -48,6 +53,7 @@ import com.fs.his.vo.FsStoreProductDeliverExcelVO;
|
|
|
import com.fs.hisStore.domain.FsShippingTemplatesFreeScrm;
|
|
|
import com.fs.hisStore.domain.FsShippingTemplatesRegionScrm;
|
|
|
import com.fs.hisStore.domain.FsShippingTemplatesScrm;
|
|
|
+import com.fs.hisStore.enums.ShipperCodeEnum;
|
|
|
import com.fs.hisStore.enums.ShippingTempEnum;
|
|
|
import com.fs.hisStore.mapper.FsShippingTemplatesFreeScrmMapper;
|
|
|
import com.fs.hisStore.mapper.FsShippingTemplatesRegionScrmMapper;
|
|
|
@@ -74,6 +80,9 @@ import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
import java.time.LocalDateTime;
|
|
|
+import java.time.ZoneId;
|
|
|
+import java.time.ZonedDateTime;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
import java.util.*;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
import java.util.stream.Collectors;
|
|
|
@@ -106,6 +115,9 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
|
|
|
@Autowired
|
|
|
private FsIntegralOrderMapper fsIntegralOrderMapper;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private FsIntegralOrderItemMapper fsIntegralOrderItemMapper;
|
|
|
+
|
|
|
@Autowired
|
|
|
private FsUserAddressMapper fsUserAddressMapper;
|
|
|
|
|
|
@@ -179,6 +191,12 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
|
|
|
@Autowired
|
|
|
private JstErpHttpService jstErpHttpService;
|
|
|
|
|
|
+ /**
|
|
|
+ * 快递公司服务(物流回调订阅、本地快递编码映射)
|
|
|
+ */
|
|
|
+ @Autowired
|
|
|
+ private IFsExpressService expressService;
|
|
|
+
|
|
|
/**
|
|
|
* 查询积分商品订单
|
|
|
*
|
|
|
@@ -399,6 +417,10 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
|
|
|
}
|
|
|
|
|
|
if(fsIntegralOrderMapper.insertFsIntegralOrder(order)>0){
|
|
|
+ // 批量写入订单商品明细表(与主订单同事务,承接聚水潭回写的溯源码/批次号)
|
|
|
+ List<FsIntegralOrderItem> orderItems = buildOrderItems(order, goodsItem);
|
|
|
+ fsIntegralOrderItemMapper.batchInsert(orderItems);
|
|
|
+
|
|
|
if (order.getPayType() != 2) {
|
|
|
// 原子扣减用户积分(SQL 层 integral = integral - ? where integral >= ?,并发安全)
|
|
|
// 参考 ylrz 商城订单 FsStoreOrderScrmServiceImpl.decIntegral 规范实现
|
|
|
@@ -442,6 +464,36 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 构建积分订单商品明细列表
|
|
|
+ * <p>从下单时的 goodsItem(List<FsIntegralGoods>)映射为明细实体,
|
|
|
+ * 冗余 isDrug 字段,避免后续商品被修改影响历史订单的药品属性;
|
|
|
+ * 商品快照 jsonInfo 存入图/原价/分类等只读展示字段。</p>
|
|
|
+ *
|
|
|
+ * @param order 积分订单(已含 orderId/orderCode)
|
|
|
+ * @param goodsItem 下单商品集合
|
|
|
+ * @return 明细实体集合
|
|
|
+ */
|
|
|
+ private List<FsIntegralOrderItem> buildOrderItems(FsIntegralOrder order, List<FsIntegralGoods> goodsItem) {
|
|
|
+ List<FsIntegralOrderItem> items = new ArrayList<>();
|
|
|
+ Date now = new Date();
|
|
|
+ for (FsIntegralGoods g : goodsItem) {
|
|
|
+ FsIntegralOrderItem item = new FsIntegralOrderItem();
|
|
|
+ item.setOrderId(order.getOrderId());
|
|
|
+ item.setOrderCode(order.getOrderCode());
|
|
|
+ item.setGoodsId(g.getGoodsId());
|
|
|
+ item.setGoodsName(g.getGoodsName());
|
|
|
+ item.setBarCode(g.getBarCode());
|
|
|
+ item.setNum(g.getNum() != null ? g.getNum() : 1);
|
|
|
+ item.setCash(g.getCash());
|
|
|
+ item.setIsDrug(g.getIsDrug() != null ? g.getIsDrug() : 0);
|
|
|
+ item.setJsonInfo(JSONUtil.toJsonStr(g));
|
|
|
+ item.setCreateTime(now);
|
|
|
+ items.add(item);
|
|
|
+ }
|
|
|
+ return items;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 获取用户已购买指定积分商品的有效订单数(限购校验用)
|
|
|
* <p>缓存策略:优先查 Redis,未命中则回源数据库并回填缓存(1小时过期)。
|
|
|
@@ -607,7 +659,12 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
|
|
|
|
|
|
@Override
|
|
|
public FsIntegralOrderPVO selectFsIntegralOrderPVO(Long orderId) {
|
|
|
- return fsIntegralOrderMapper.selectFsIntegralOrderPVO(orderId);
|
|
|
+ FsIntegralOrderPVO pvo = fsIntegralOrderMapper.selectFsIntegralOrderPVO(orderId);
|
|
|
+ if (pvo != null) {
|
|
|
+ // 填充订单商品明细(含溯源码/批次号/是否药品)
|
|
|
+ pvo.setItemList(fsIntegralOrderItemMapper.selectListByOrderId(orderId));
|
|
|
+ }
|
|
|
+ return pvo;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -1764,4 +1821,316 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
|
|
|
default: return "积分兑换";
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 聚水潭同步发货(单订单回写物流信息)
|
|
|
+ * <p>流程:更新订单状态为待收货(2) → 订阅物流回调 → 微信小程序发货同步。</p>
|
|
|
+ * <p>与普通订单({@link com.fs.hisStore.service.impl.FsStoreOrderScrmServiceImpl#deliveryOrder})逻辑对齐,
|
|
|
+ * 区别:积分订单 deliveryCode=快递公司编码、deliverySn=快递单号、无订单状态日志表、无模板消息。</p>
|
|
|
+ *
|
|
|
+ * @param order 积分订单
|
|
|
+ * @param trackingNo 快递单号(聚水潭 lId / mail_no)
|
|
|
+ * @param expressCode 快递公司OMS编码(聚水潭 lcId)
|
|
|
+ * @param expressName 快递公司名称(聚水潭 logisticsCompany)
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void deliveryOrderBySync(FsIntegralOrder order, String trackingNo, String expressCode, String expressName) {
|
|
|
+ try {
|
|
|
+ // 1. 通过OMS编码映射本地快递公司编码
|
|
|
+ String localExpressCode = expressCode;
|
|
|
+ String localExpressName = expressName;
|
|
|
+ FsExpress express = expressService.selectFsExpressByOmsCode(expressCode);
|
|
|
+ if (express != null) {
|
|
|
+ localExpressCode = express.getCode();
|
|
|
+ if (StringUtils.isNotEmpty(express.getName())) {
|
|
|
+ localExpressName = express.getName();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. 回写订单物流信息,状态 → 2 待收货
|
|
|
+ FsIntegralOrder updateOrder = new FsIntegralOrder();
|
|
|
+ updateOrder.setOrderId(order.getOrderId());
|
|
|
+ updateOrder.setStatus(2);
|
|
|
+ updateOrder.setDeliveryCode(localExpressCode);
|
|
|
+ updateOrder.setDeliveryName(localExpressName);
|
|
|
+ updateOrder.setDeliverySn(trackingNo);
|
|
|
+ updateOrder.setDeliveryTime(DateUtils.getNowDate());
|
|
|
+ fsIntegralOrderMapper.updateFsIntegralOrder(updateOrder);
|
|
|
+ log.info("聚水潭同步发货回写成功 orderId={}, orderCode={}, trackingNo={}, expressCode={}",
|
|
|
+ order.getOrderId(), order.getOrderCode(), trackingNo, localExpressCode);
|
|
|
+
|
|
|
+ // 3. 订阅物流回调(顺丰需要校验手机号后四位)
|
|
|
+ String lastFourNumber = "";
|
|
|
+ if (ShipperCodeEnum.SF.getValue().equals(localExpressCode)) {
|
|
|
+ lastFourNumber = order.getUserPhone();
|
|
|
+ if (StringUtils.isNotEmpty(lastFourNumber) && lastFourNumber.length() == 11) {
|
|
|
+ lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ expressService.subscribeEspress(order.getOrderCode(), localExpressCode, trackingNo, lastFourNumber);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("订阅物流回调异常 orderCode={}, trackingNo={}", order.getOrderCode(), trackingNo, e);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4. 微信小程序发货同步(线上发货)
|
|
|
+ syncWeChatShippingOnline(order, trackingNo, localExpressCode);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("聚水潭同步发货异常 orderId={}, orderCode={}", order.getOrderId(), order.getOrderCode(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步微信发货(线上发货,logisticsType=1)
|
|
|
+ * <p>复用 fs_store_payment 中的 appId/openId/bankTransactionId 调用微信小程序发货信息同步接口。</p>
|
|
|
+ *
|
|
|
+ * @param order 积分订单
|
|
|
+ * @param trackingNo 快递单号
|
|
|
+ * @param expressCode 本地快递公司编码
|
|
|
+ */
|
|
|
+ private void syncWeChatShippingOnline(FsIntegralOrder order, String trackingNo, String expressCode) {
|
|
|
+ try {
|
|
|
+ List<FsStorePayment> payments = fsStorePaymentMapper.selectFsStorePaymentByIntegralOrderId(order.getOrderId());
|
|
|
+ FsStorePayment payment = null;
|
|
|
+ if (payments != null && !payments.isEmpty()) {
|
|
|
+ for (FsStorePayment p : payments) {
|
|
|
+ if (p.getStatus() != null && p.getStatus() == 1
|
|
|
+ && StringUtils.isNotEmpty(p.getBankTransactionId())
|
|
|
+ && StringUtils.isNotEmpty(p.getOpenId())
|
|
|
+ && StringUtils.isNotEmpty(p.getAppId())) {
|
|
|
+ payment = p;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (payment == null) {
|
|
|
+ log.info("微信发货同步跳过,未找到有效支付记录 orderCode={}", order.getOrderCode());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 取首个商品名称作为物品描述
|
|
|
+ String itemDesc = "积分商品";
|
|
|
+ if (StringUtils.isNotEmpty(order.getItemJson())) {
|
|
|
+ try {
|
|
|
+ cn.hutool.json.JSONArray itemArray = JSONUtil.parseArray(order.getItemJson());
|
|
|
+ if (!itemArray.isEmpty()) {
|
|
|
+ String goodsName = itemArray.getJSONObject(0).getStr("goodsName");
|
|
|
+ if (StringUtils.isNotEmpty(goodsName)) {
|
|
|
+ itemDesc = goodsName;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (Exception ignore) {
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ String uploadTime = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"))
|
|
|
+ .format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
|
|
|
+ WxMaService wxService = WxMaConfiguration.getMaService(payment.getAppId());
|
|
|
+ uploadSingleShippingInfoOnline(wxService, payment, order, trackingNo, expressCode, itemDesc, uploadTime);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("微信发货同步异常 orderCode={}", order.getOrderCode(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 上传单个订单物流信息到微信(线上发货,logisticsType=1)
|
|
|
+ */
|
|
|
+ private boolean uploadSingleShippingInfoOnline(WxMaService wxService,
|
|
|
+ FsStorePayment payment,
|
|
|
+ FsIntegralOrder order,
|
|
|
+ String trackingNo,
|
|
|
+ String expressCode,
|
|
|
+ String itemDesc,
|
|
|
+ String uploadTime) {
|
|
|
+ try {
|
|
|
+ WxMaOrderShippingInfoUploadRequest request = new WxMaOrderShippingInfoUploadRequest();
|
|
|
+ OrderKeyBean orderKeyBean = new OrderKeyBean();
|
|
|
+ orderKeyBean.setOrderNumberType(2);
|
|
|
+ orderKeyBean.setTransactionId(payment.getBankTransactionId());
|
|
|
+ request.setOrderKey(orderKeyBean);
|
|
|
+ request.setDeliveryMode(1);
|
|
|
+ request.setLogisticsType(1);
|
|
|
+
|
|
|
+ List<ShippingListBean> shippingList = new ArrayList<>();
|
|
|
+ ShippingListBean shippingListBean = new ShippingListBean();
|
|
|
+ shippingListBean.setTrackingNo(trackingNo);
|
|
|
+ shippingListBean.setExpressCompany(expressCode);
|
|
|
+ shippingListBean.setItemDesc(StringUtils.isEmpty(itemDesc) ? "积分商品" : itemDesc);
|
|
|
+ ContactBean contactBean = new ContactBean();
|
|
|
+ contactBean.setReceiverContact(order.getUserPhone());
|
|
|
+ shippingListBean.setContact(contactBean);
|
|
|
+ shippingList.add(shippingListBean);
|
|
|
+ request.setShippingList(shippingList);
|
|
|
+ request.setUploadTime(uploadTime);
|
|
|
+
|
|
|
+ PayerBean payerBean = new PayerBean();
|
|
|
+ payerBean.setOpenid(payment.getOpenId());
|
|
|
+ request.setPayer(payerBean);
|
|
|
+
|
|
|
+ boolean success = wxService.getWxMaOrderShippingService().upload(request).getErrCode() == 0;
|
|
|
+ if (!success) {
|
|
|
+ log.warn("上传物流信息到微信返回非0 orderCode={}", order.getOrderCode());
|
|
|
+ }
|
|
|
+ return success;
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("上传物流信息到微信失败 orderCode={}", order.getOrderCode(), e);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量同步聚水潭溯源码和批次号
|
|
|
+ * <p>查询聚水潭销售出库单,按 sku_id(即 barCode)匹配积分订单明细,回写 verifyCode 和 batchNumber。</p>
|
|
|
+ * <p>与普通订单({@link com.fs.hisStore.service.impl.FsStoreOrderScrmServiceImpl#syncSkuSnFromJstBatch})逻辑对齐。</p>
|
|
|
+ *
|
|
|
+ * @param orders 已发货的积分订单集合
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void syncSkuSnFromJstBatch(List<FsIntegralOrder> orders) {
|
|
|
+ try {
|
|
|
+ FsSysConfig erpConfig = configUtil.getSysConfig();
|
|
|
+ if (erpConfig.getErpOpen() == null || erpConfig.getErpOpen() != 1
|
|
|
+ || erpConfig.getErpType() == null || erpConfig.getErpType() != 5) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 过滤有效订单(必须有extendOrderId)
|
|
|
+ List<FsIntegralOrder> validOrders = new ArrayList<>();
|
|
|
+ for (FsIntegralOrder order : orders) {
|
|
|
+ if (StringUtils.isNotEmpty(order.getExtendOrderId())) {
|
|
|
+ validOrders.add(order);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (validOrders.isEmpty()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 批量查询所有订单明细
|
|
|
+ List<Long> orderIds = new ArrayList<>();
|
|
|
+ for (FsIntegralOrder order : validOrders) {
|
|
|
+ orderIds.add(order.getOrderId());
|
|
|
+ }
|
|
|
+ List<FsIntegralOrderItem> allItems = fsIntegralOrderItemMapper.selectListByOrderIds(orderIds);
|
|
|
+ Map<Long, List<FsIntegralOrderItem>> orderItemsMap = new HashMap<>();
|
|
|
+ if (allItems != null) {
|
|
|
+ for (FsIntegralOrderItem item : allItems) {
|
|
|
+ orderItemsMap.computeIfAbsent(item.getOrderId(), k -> new ArrayList<>()).add(item);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 收集所有extendOrderId,按最多50个一组分批查询销售出库单
|
|
|
+ List<String> allOIds = new ArrayList<>();
|
|
|
+ Map<String, FsIntegralOrder> extendOrderMap = new HashMap<>();
|
|
|
+ for (FsIntegralOrder order : validOrders) {
|
|
|
+ allOIds.add(order.getExtendOrderId());
|
|
|
+ extendOrderMap.put(order.getExtendOrderId(), order);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 分批查询出库单(o_ids最多50条)
|
|
|
+ int batchSize = 50;
|
|
|
+ List<OutboundOrderQueryResponseDTO.OutboundOrder> allOutboundOrders = new ArrayList<>();
|
|
|
+ for (int i = 0; i < allOIds.size(); i += batchSize) {
|
|
|
+ List<String> batchOIds = allOIds.subList(i, Math.min(i + batchSize, allOIds.size()));
|
|
|
+
|
|
|
+ int pageIndex = 1;
|
|
|
+ while (true) {
|
|
|
+ OutboundOrderQueryRequestDTO requestDTO = OutboundOrderQueryRequestDTO.builder()
|
|
|
+ .oIds(batchOIds)
|
|
|
+ .status("Confirmed")
|
|
|
+ .pageIndex(pageIndex)
|
|
|
+ .pageSize(50)
|
|
|
+ .build();
|
|
|
+ OutboundOrderQueryResponseDTO response = jstErpHttpService.queryOutboundOrder(requestDTO);
|
|
|
+ if (response == null || response.getData() == null
|
|
|
+ || response.getData().getDatas() == null || response.getData().getDatas().isEmpty()) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ allOutboundOrders.addAll(response.getData().getDatas());
|
|
|
+ if (!Boolean.TRUE.equals(response.getData().getHasNext())) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ pageIndex++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (allOutboundOrders.isEmpty()) {
|
|
|
+ log.info("聚水潭销售出库批量查询无数据,积分订单数: {}", validOrders.size());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 按o_id分组出库单
|
|
|
+ Map<String, List<OutboundOrderQueryResponseDTO.OutboundOrder>> outboundByOId = new HashMap<>();
|
|
|
+ for (OutboundOrderQueryResponseDTO.OutboundOrder outOrder : allOutboundOrders) {
|
|
|
+ if (outOrder.getOId() != null) {
|
|
|
+ String oIdStr = String.valueOf(outOrder.getOId());
|
|
|
+ outboundByOId.computeIfAbsent(oIdStr, k -> new ArrayList<>()).add(outOrder);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 遍历每个订单,从出库单中提取溯源码和批次号
|
|
|
+ for (FsIntegralOrder order : validOrders) {
|
|
|
+ List<OutboundOrderQueryResponseDTO.OutboundOrder> matchedOutOrders = outboundByOId.get(order.getExtendOrderId());
|
|
|
+ if (matchedOutOrders == null || matchedOutOrders.isEmpty()) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ List<FsIntegralOrderItem> items = orderItemsMap.get(order.getOrderId());
|
|
|
+ if (items == null || items.isEmpty()) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 从出库单中提取: sns[]→溯源码, batchs[]→批次号,按sku_id分组
|
|
|
+ Map<String, StringBuilder> skuSnMap = new HashMap<>();
|
|
|
+ Map<String, StringBuilder> batchMap = new HashMap<>();
|
|
|
+
|
|
|
+ for (OutboundOrderQueryResponseDTO.OutboundOrder outOrder : matchedOutOrders) {
|
|
|
+ // 提取唯一码(sns)
|
|
|
+ if (outOrder.getSns() != null) {
|
|
|
+ for (OutboundOrderQueryResponseDTO.SnInfo snInfo : outOrder.getSns()) {
|
|
|
+ String skuId = snInfo.getSkuId();
|
|
|
+ if (StringUtils.isNotEmpty(skuId) && StringUtils.isNotEmpty(snInfo.getSn())) {
|
|
|
+ skuSnMap.computeIfAbsent(skuId, k -> new StringBuilder());
|
|
|
+ if (skuSnMap.get(skuId).length() > 0) {
|
|
|
+ skuSnMap.get(skuId).append(",");
|
|
|
+ }
|
|
|
+ skuSnMap.get(skuId).append(snInfo.getSn());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 提取批次号(batchs)
|
|
|
+ if (outOrder.getBatchs() != null) {
|
|
|
+ for (OutboundOrderQueryResponseDTO.BatchInfo batchInfo : outOrder.getBatchs()) {
|
|
|
+ String skuId = batchInfo.getSkuId();
|
|
|
+ String batchNo = batchInfo.getBatchNo();
|
|
|
+ if (StringUtils.isNotEmpty(skuId) && StringUtils.isNotEmpty(batchNo)) {
|
|
|
+ batchMap.computeIfAbsent(skuId, k -> new StringBuilder());
|
|
|
+ if (batchMap.get(skuId).length() > 0 && !batchMap.get(skuId).toString().contains(batchNo)) {
|
|
|
+ batchMap.get(skuId).append(",");
|
|
|
+ batchMap.get(skuId).append(batchNo);
|
|
|
+ } else if (batchMap.get(skuId).length() == 0) {
|
|
|
+ batchMap.get(skuId).append(batchNo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 通过barCode匹配sku_id,回写溯源码和批次号
|
|
|
+ for (FsIntegralOrderItem item : items) {
|
|
|
+ String barCode = item.getBarCode();
|
|
|
+ if (StringUtils.isNotEmpty(barCode)) {
|
|
|
+ String verifyCode = skuSnMap.containsKey(barCode) ? skuSnMap.get(barCode).toString() : null;
|
|
|
+ String batchNumber = batchMap.containsKey(barCode) ? batchMap.get(barCode).toString() : null;
|
|
|
+ if (StringUtils.isNotEmpty(verifyCode) || StringUtils.isNotEmpty(batchNumber)) {
|
|
|
+ fsIntegralOrderItemMapper.updateVerifyCodeAndBatch(item.getItemId(), verifyCode, batchNumber);
|
|
|
+ log.info("积分订单明细溯源码同步成功 orderCode={}, barCode={}, verifyCode={}, batchNumber={}",
|
|
|
+ order.getOrderCode(), barCode, verifyCode, batchNumber);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("批量同步聚水潭溯源码失败(积分订单)", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|