|
@@ -85,6 +85,8 @@ import com.fs.system.service.ISysConfigService;
|
|
|
import com.fs.wx.domain.FsWxExpressTask;
|
|
import com.fs.wx.domain.FsWxExpressTask;
|
|
|
import com.fs.wx.mapper.FsWxExpressTaskMapper;
|
|
import com.fs.wx.mapper.FsWxExpressTaskMapper;
|
|
|
import lombok.Data;
|
|
import lombok.Data;
|
|
|
|
|
+import com.fs.wx.service.ShippingService;
|
|
|
|
|
+import com.google.common.collect.Lists;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.collections4.CollectionUtils;
|
|
import org.apache.commons.collections4.CollectionUtils;
|
|
|
import org.apache.commons.lang.ObjectUtils;
|
|
import org.apache.commons.lang.ObjectUtils;
|
|
@@ -117,6 +119,9 @@ import static com.fs.store.enums.BillDetailEnum.CATEGORY_3;
|
|
|
@Slf4j
|
|
@Slf4j
|
|
|
public class LiveOrderServiceImpl implements ILiveOrderService {
|
|
public class LiveOrderServiceImpl implements ILiveOrderService {
|
|
|
|
|
|
|
|
|
|
+ private static final int DELIVERY_SYNC_BATCH_SIZE = 30;
|
|
|
|
|
+ private static final String JST_SHOP_ID = "18675245";
|
|
|
|
|
+
|
|
|
private final RedisCache redisCache;
|
|
private final RedisCache redisCache;
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private LiveOrderMapper baseMapper;
|
|
private LiveOrderMapper baseMapper;
|
|
@@ -1397,33 +1402,167 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
|
|
|
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
|
|
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
|
|
|
public void syncDeliveryOrder(LiveOrder order) {
|
|
public void syncDeliveryOrder(LiveOrder order) {
|
|
|
log.info("[发货任务] 当前单号: {}", order.getOrderCode());
|
|
log.info("[发货任务] 当前单号: {}", order.getOrderCode());
|
|
|
- ErpOrderQueryRequert request = new ErpOrderQueryRequert();
|
|
|
|
|
- request.setCode(order.getExtendOrderId());
|
|
|
|
|
- // 根据仓库code找erp
|
|
|
|
|
- if (com.fs.common.utils.StringUtils.isNotBlank(order.getStoreHouseCode())) {
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ setErpContext(order);
|
|
|
|
|
+ ErpOrderQueryRequert request = new ErpOrderQueryRequert();
|
|
|
|
|
+ request.setCode(order.getExtendOrderId());
|
|
|
|
|
+ ErpOrderQueryResponse response = erpOrderService.getOrderLive(request);
|
|
|
|
|
+ handleLiveErpOrderQueryResponse(order, response);
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ ErpContextHolder.clear();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void batchSyncDeliveryOrders(List<LiveOrder> orders) {
|
|
|
|
|
+ if (CollectionUtils.isEmpty(orders)) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ Map<String, List<LiveOrder>> erpOrderMap = orders.stream()
|
|
|
|
|
+ .collect(Collectors.groupingBy(this::resolveErpType));
|
|
|
|
|
+ for (Map.Entry<String, List<LiveOrder>> entry : erpOrderMap.entrySet()) {
|
|
|
|
|
+ String erpType = entry.getKey();
|
|
|
|
|
+ List<LiveOrder> erpOrders = entry.getValue();
|
|
|
|
|
+ try {
|
|
|
|
|
+ if (ErpTypeConstant.JST_ERP.equals(erpType)) {
|
|
|
|
|
+ batchSyncJstDeliveryOrders(erpOrders);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ batchSyncSingleDeliveryOrders(erpOrders);
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("[发货任务] 直播订单 ERP类型 {} 批量同步失败", erpType, e);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private String resolveErpType(LiveOrder order) {
|
|
|
|
|
+ if (StringUtils.isNotBlank(order.getStoreHouseCode())) {
|
|
|
String erp = fsWarehousesMapper.selectErpByCode(order.getStoreHouseCode());
|
|
String erp = fsWarehousesMapper.selectErpByCode(order.getStoreHouseCode());
|
|
|
- ErpContextHolder.setErpType(erp);
|
|
|
|
|
|
|
+ if (StringUtils.isNotBlank(erp)) {
|
|
|
|
|
+ return erp;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
- ErpOrderQueryResponse response = erpOrderService.getOrderLive(request);
|
|
|
|
|
- if (CollectionUtils.isNotEmpty(response.getOrders())) {
|
|
|
|
|
- for (ErpOrderQuery orderQuery : response.getOrders()) {
|
|
|
|
|
- // 部分发货或者全部发货
|
|
|
|
|
- if (ObjectUtils.equals(orderQuery.getDelivery_state(), 1) || ObjectUtils.equals(orderQuery.getDelivery_state(), 2)) {
|
|
|
|
|
|
|
+ return ErpTypeConstant.GY_ERP;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- liveOrderLogsService.create(order.getOrderId(), OrderLogEnum.DELIVERY_GOODS.getValue(),
|
|
|
|
|
- OrderLogEnum.DELIVERY_GOODS.getDesc());
|
|
|
|
|
- for (ErpDeliverys delivery : orderQuery.getDeliverys()) {
|
|
|
|
|
- if (delivery.getDelivery()) {
|
|
|
|
|
- this.deliveryOrder(order.getOrderCode(), delivery.getMail_no(),
|
|
|
|
|
- delivery.getExpress_code(), delivery.getExpress_name());
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ private void setErpContext(LiveOrder order) {
|
|
|
|
|
+ ErpContextHolder.setErpType(resolveErpType(order));
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
+ private void handleLiveErpOrderQueryResponse(LiveOrder order, ErpOrderQueryResponse response) {
|
|
|
|
|
+ if (response == null || CollectionUtils.isEmpty(response.getOrders())) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ for (ErpOrderQuery orderQuery : response.getOrders()) {
|
|
|
|
|
+ processLiveErpOrderQuery(order, orderQuery);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void processLiveErpOrderQuery(LiveOrder order, ErpOrderQuery orderQuery) {
|
|
|
|
|
+ if (orderQuery == null) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!ObjectUtils.equals(orderQuery.getDelivery_state(), 1) && !ObjectUtils.equals(orderQuery.getDelivery_state(), 2)) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ liveOrderLogsService.create(order.getOrderId(), OrderLogEnum.DELIVERY_GOODS.getValue(),
|
|
|
|
|
+ OrderLogEnum.DELIVERY_GOODS.getDesc());
|
|
|
|
|
+ if (CollectionUtils.isEmpty(orderQuery.getDeliverys())) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ for (ErpDeliverys delivery : orderQuery.getDeliverys()) {
|
|
|
|
|
+ if (Boolean.TRUE.equals(delivery.getDelivery())) {
|
|
|
|
|
+ this.deliveryOrder(order.getOrderCode(), delivery.getMail_no(),
|
|
|
|
|
+ delivery.getExpress_code(), delivery.getExpress_name());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void batchSyncJstDeliveryOrders(List<LiveOrder> orders) throws InterruptedException {
|
|
|
|
|
+ ErpContextHolder.setErpType(ErpTypeConstant.JST_ERP);
|
|
|
|
|
+ try {
|
|
|
|
|
+ Map<Long, LiveOrder> extendOrderMap = new HashMap<>();
|
|
|
|
|
+ List<Long> oIds = new ArrayList<>();
|
|
|
|
|
+ for (LiveOrder order : orders) {
|
|
|
|
|
+ if (StringUtils.isBlank(order.getExtendOrderId())) {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ try {
|
|
|
|
|
+ Long oId = Long.parseLong(order.getExtendOrderId());
|
|
|
|
|
+ oIds.add(oId);
|
|
|
|
|
+ extendOrderMap.put(oId, order);
|
|
|
|
|
+ } catch (NumberFormatException e) {
|
|
|
|
|
+ log.warn("[发货任务] 直播订单 extendOrderId非法 orderCode={}", order.getOrderCode());
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ if (CollectionUtils.isEmpty(oIds)) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ for (List<Long> batch : Lists.partition(oIds, DELIVERY_SYNC_BATCH_SIZE)) {
|
|
|
|
|
+ Thread.sleep(300);
|
|
|
|
|
+ List<String> extendIds = batch.stream().map(String::valueOf).collect(Collectors.toList());
|
|
|
|
|
+ updateUpdateTimeByExtendIds(extendIds);
|
|
|
|
|
+
|
|
|
|
|
+ ErpOrderQueryRequert request = new ErpOrderQueryRequert();
|
|
|
|
|
+ request.setShop_id(JST_SHOP_ID);
|
|
|
|
|
+ request.setO_ids(new ArrayList<>(batch));
|
|
|
|
|
+ request.setPage_size(DELIVERY_SYNC_BATCH_SIZE);
|
|
|
|
|
+
|
|
|
|
|
+ int pageIndex = 1;
|
|
|
|
|
+ boolean hasNext;
|
|
|
|
|
+ do {
|
|
|
|
|
+ request.setPage_index(pageIndex);
|
|
|
|
|
+ ErpOrderQueryResponse response = erpOrderService.getOrderLive(request);
|
|
|
|
|
+ handleJstBatchLiveDeliveryResponse(batch, extendOrderMap, response);
|
|
|
|
|
+ hasNext = response != null && response.hasNextSafe();
|
|
|
|
|
+ pageIndex++;
|
|
|
|
|
+ } while (hasNext);
|
|
|
|
|
+ }
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ ErpContextHolder.clear();
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ private void handleJstBatchLiveDeliveryResponse(List<Long> batch, Map<Long, LiveOrder> extendOrderMap,
|
|
|
|
|
+ ErpOrderQueryResponse response) {
|
|
|
|
|
+ if (response == null || CollectionUtils.isEmpty(response.getOrders())) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ Map<String, LiveOrder> orderCodeMap = batch.stream()
|
|
|
|
|
+ .map(extendOrderMap::get)
|
|
|
|
|
+ .filter(Objects::nonNull)
|
|
|
|
|
+ .collect(Collectors.toMap(LiveOrder::getOrderCode, order -> order, (a, b) -> a));
|
|
|
|
|
+ for (ErpOrderQuery orderQuery : response.getOrders()) {
|
|
|
|
|
+ LiveOrder order = orderCodeMap.get(orderQuery.getCode());
|
|
|
|
|
+ if (order == null && orderQuery.getO_id() != null) {
|
|
|
|
|
+ order = extendOrderMap.get(orderQuery.getO_id().longValue());
|
|
|
|
|
+ }
|
|
|
|
|
+ if (order != null) {
|
|
|
|
|
+ log.info("[发货任务] 当前单号: {}", order.getOrderCode());
|
|
|
|
|
+ processLiveErpOrderQuery(order, orderQuery);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void batchSyncSingleDeliveryOrders(List<LiveOrder> orders) {
|
|
|
|
|
+ for (List<LiveOrder> batch : Lists.partition(orders, DELIVERY_SYNC_BATCH_SIZE)) {
|
|
|
|
|
+ for (LiveOrder order : batch) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ syncDeliveryOrder(order);
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("[发货任务] 直播订单同步发货失败 orderCode={}", order.getOrderCode(), e);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void updateUpdateTimeByExtendIds(List<String> batch) {
|
|
|
|
|
+ if (CollectionUtils.isEmpty(batch)) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ baseMapper.updateUpdateTimeByExtendIds(batch);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
@Override
|
|
@Override
|
|
|
public List<Long> selectSyncExpressIds() {
|
|
public List<Long> selectSyncExpressIds() {
|
|
|
return baseMapper.selectSyncExpressIds();
|
|
return baseMapper.selectSyncExpressIds();
|
|
@@ -1830,6 +1969,13 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
|
|
|
fsWxExpressTask.setType(1);
|
|
fsWxExpressTask.setType(1);
|
|
|
fsWxExpressTaskMapper.insert(fsWxExpressTask);
|
|
fsWxExpressTaskMapper.insert(fsWxExpressTask);
|
|
|
|
|
|
|
|
|
|
+ //订阅物流回调
|
|
|
|
|
+ String lastFourNumber = "";
|
|
|
|
|
+ if (StringUtils.equals(express.getCode(), ShipperCodeEnum.SF.getValue()) || StringUtils.equals(express.getCode(), ShipperCodeEnum.ZTO.getValue())) {
|
|
|
|
|
+ lastFourNumber = PhoneUtils.getLastFourNum(order.getUserPhone());
|
|
|
|
|
+ }
|
|
|
|
|
+ expressService.subscribeEspress(order.getOrderCode(), express.getCode(), deliveryId, lastFourNumber, 1);
|
|
|
|
|
+
|
|
|
// 微信消息通知
|
|
// 微信消息通知
|
|
|
TemplateBean templateBean = TemplateBean.builder()
|
|
TemplateBean templateBean = TemplateBean.builder()
|
|
|
.orderId(order.getOrderId().toString())
|
|
.orderId(order.getOrderId().toString())
|
|
@@ -1841,12 +1987,7 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
|
|
|
.build();
|
|
.build();
|
|
|
publisher.publishEvent(new TemplateEvent(this, templateBean));
|
|
publisher.publishEvent(new TemplateEvent(this, templateBean));
|
|
|
|
|
|
|
|
- //订阅物流回调
|
|
|
|
|
- String lastFourNumber = "";
|
|
|
|
|
- if (StringUtils.equals(express.getCode(), ShipperCodeEnum.SF.getValue()) || StringUtils.equals(express.getCode(), ShipperCodeEnum.ZTO.getValue())) {
|
|
|
|
|
- lastFourNumber = PhoneUtils.getLastFourNum(order.getUserPhone());
|
|
|
|
|
- }
|
|
|
|
|
- expressService.subscribeEspress(order.getOrderCode(), express.getCode(), deliveryId, lastFourNumber, 1);
|
|
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|