浏览代码

万里牛售后单同步调整

fgd 1 年之前
父节点
当前提交
66298b6e2f

+ 1 - 0
sd-business/src/main/java/com/sd/business/service/check/impl/CheckBomServiceImpl.java

@@ -30,6 +30,7 @@ public class CheckBomServiceImpl extends ServiceImpl<CheckBomMapper, CheckBom> i
         IWrapper<CheckBom> wrapper = getWrapper();
         wrapper.orderByDesc("c", Check::getId);
         wrapper.orderByDesc("cb", CheckBom::getStatus);
+        wrapper.orderByDesc("abs(cb.check_quantity - cb.surplus_stock)");
         wrapper.like("c", Check::getCode, dto.getCode());
         wrapper.like("bs", BomSpec::getCode, dto.getBomSpecCode());
         wrapper.like("bs", BomSpec::getName, dto.getBomSpecName());

+ 2 - 1
sd-business/src/main/java/com/sd/business/service/check/impl/CheckServiceImpl.java

@@ -226,7 +226,8 @@ public class CheckServiceImpl extends ServiceImpl<CheckMapper, Check> implements
             }
             checkBomList.add(checkBom);
         }
-        checkBomList.sort(comparing(CheckBom::getStatus).reversed());
+        checkBomList.sort(comparing(CheckBom::getStatus, Comparator.reverseOrder())
+                .thenComparing(item -> item.getCheckQuantity().subtract(item.getSurplusStock()).abs(), Comparator.reverseOrder()));
         vo.setCheckBomList(checkBomList);
 
         // 保存上传文件

+ 39 - 0
sd-wln/src/main/java/com/sd/wln/entity/SalesReturnStockInParam.java

@@ -0,0 +1,39 @@
+package com.sd.wln.entity;
+
+import com.alibaba.fastjson2.JSONObject;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 查询销售退货入库单参数实体类
+ */
+@Getter
+@Setter
+public class SalesReturnStockInParam extends Signature {
+
+    /**
+     * 单据编码
+     */
+    private String bill_code;
+
+    /**
+     * 修改时间,只能查近3个月
+     */
+    private Long modify_time;
+
+    /**
+     * 修改结束时间,与查询开始时间最大时间间隔为7天;不填默认与开始时间间隔7天
+     */
+    private Long modify_end_time;
+
+    /**
+     * 是否拆分组合商品
+     */
+    private Boolean is_split;
+
+    /**
+     * 扩展字段 为JSON格式
+     * {"shop_type":1}
+     */
+    private JSONObject query_extend;
+}

+ 3 - 6
sd-wln/src/main/java/com/sd/wln/scheduled/WlnSyncTask.java

@@ -1,9 +1,6 @@
 package com.sd.wln.scheduled;
 
-import com.sd.wln.service.WlnOrderService;
-import com.sd.wln.service.WlnReturnOrderService;
-import com.sd.wln.service.WlnSkuService;
-import com.sd.wln.service.WlnStatementOfAccount;
+import com.sd.wln.service.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Profile;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -26,7 +23,7 @@ public class WlnSyncTask {
     private WlnStatementOfAccount wlnStatementOfAccount;
 
     @Autowired
-    private WlnReturnOrderService wlnReturnOrderService;
+    private WlnSalesReturnStockInService wlnSalesReturnStockInService;
 
     /**
      * 每天凌晨1点同步一次sku信息
@@ -64,7 +61,7 @@ public class WlnSyncTask {
      */
     @Scheduled(cron = "0 0 0/1 * * ?")
     public void syncReturnOrder() {
-        wlnReturnOrderService.syncReturnOrder();
+        wlnSalesReturnStockInService.syncSalesReturnStockIn();
     }
 
 }

+ 9 - 0
sd-wln/src/main/java/com/sd/wln/service/WlnSalesReturnStockInService.java

@@ -0,0 +1,9 @@
+package com.sd.wln.service;
+
+public interface WlnSalesReturnStockInService {
+
+    /**
+     * 同步万里牛销售退货入库单数据
+     */
+    void syncSalesReturnStockIn();
+}

+ 253 - 0
sd-wln/src/main/java/com/sd/wln/service/impl/WLnSalesReturnStockInServiceImpl.java

@@ -0,0 +1,253 @@
+package com.sd.wln.service.impl;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.ruoyi.common.constant.StatusConstant;
+import com.ruoyi.common.core.domain.BaseIdPo;
+import com.sd.business.entity.after.po.AfterSaleOrder;
+import com.sd.business.entity.bom.bo.BomSpecBo;
+import com.sd.business.entity.bom.constant.BomClassifyConstant;
+import com.sd.business.entity.order.enums.OrderClassifyEnum;
+import com.sd.business.entity.order.po.*;
+import com.sd.business.entity.sku.po.SkuSpec;
+import com.sd.business.entity.warehouse.constant.WarehouseConstant;
+import com.sd.business.service.after.AfterSaleOrderService;
+import com.sd.business.service.order.*;
+import com.sd.business.service.sku.SkuSpecService;
+import com.sd.business.util.CodeEnum;
+import com.sd.wln.service.WlnReturnOrderService;
+import com.sd.wln.service.WlnSalesReturnStockInService;
+import com.sd.wln.util.WlnUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class WLnSalesReturnStockInServiceImpl implements WlnSalesReturnStockInService {
+
+
+    @Autowired
+    private OrderService orderService;
+
+    @Autowired
+    private OrderSkuService orderSkuService;
+
+    @Autowired
+    private OrderSkuBomService orderSkuBomService;
+
+    @Autowired
+    private SkuSpecService skuSpecService;
+
+    @Autowired
+    private OrderExchangeService orderExchangeService;
+
+    @Autowired
+    private OrderExchangeDetailService orderExchangeDetailService;
+
+    @Autowired
+    private AfterSaleOrderService afterSaleOrderService;
+
+    @Autowired
+    private WlnReturnOrderService wlnReturnOrderService;
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void syncSalesReturnStockIn() {
+        // 同步售后单明细
+        wlnReturnOrderService.syncReturnOrder();
+
+        // 获取万里牛销售退货入库明细
+        List<JSONObject> list = getWlnSalesReturnStockIn();
+
+        List<AfterSaleOrder> afterSaleOrderList = afterSaleOrderService.list(q -> q.eq(AfterSaleOrder::getStatus, StatusConstant.NO));
+
+        // 获取订单数据
+        List<String> orderWlnCodeList = afterSaleOrderList.stream().map(AfterSaleOrder::getOrderWlnCode).collect(Collectors.toList());
+        Map<String, OrderInfo> orderInfoMap = orderService.mapKEntity(OrderInfo::getWlnCode, q -> q.in(OrderInfo::getWlnCode, orderWlnCodeList));
+        List<Long> orderIds = orderInfoMap.values().stream().map(BaseIdPo::getId).collect(Collectors.toList());
+        Map<Long, List<OrderSku>> orderSkuMap = orderSkuService.mapKGroup(OrderSku::getOrderId, q -> q.in(OrderSku::getOrderId, orderIds));
+        Map<Long, List<OrderSkuBom>> orderSkuBomMap = orderSkuBomService.mapKGroup(OrderSkuBom::getOrderSkuId, q -> q.in(OrderSkuBom::getOrderId, orderIds));
+        List<Long> bomSpecIdList = orderSkuBomMap.values().stream()
+                .flatMap(item -> item.stream().map(OrderSkuBom::getBomSpecId))
+                .distinct()
+                .collect(Collectors.toList());
+        Map<Long, BomSpecBo> bomSpecBoMap = skuSpecService.getBomSpecBoByIdList(bomSpecIdList);
+
+        // 获取sku信息
+        List<String> skuSpecUidList = afterSaleOrderList.stream().map(AfterSaleOrder::getWlnSkuSpecId).collect(Collectors.toList());
+        Map<String, SkuSpec> skuSpecMap = skuSpecService.mapKEntity(SkuSpec::getWlnUid, q -> q.in(SkuSpec::getWlnUid, skuSpecUidList));
+
+        Map<String, List<AfterSaleOrder>> orderCodeMap = afterSaleOrderList.stream().collect(Collectors.groupingBy(AfterSaleOrder::getOrderCode));
+        Map<String, List<AfterSaleOrder>> orderWlnCodeMap = afterSaleOrderList.stream().collect(Collectors.groupingBy(AfterSaleOrder::getOrderWlnCode));
+        Map<String, List<AfterSaleOrder>> codeMap = afterSaleOrderList.stream().collect(Collectors.groupingBy(AfterSaleOrder::getCode));
+
+        List<OrderExchange> orderExchangeList = new ArrayList<>();
+        List<OrderExchangeDetail> orderExchangeDetailList = new ArrayList<>();
+        List<Long> editAfterSaleOrderIdList = new ArrayList<>();
+
+        for (JSONObject item : list) {
+            if (!Objects.equals(item.getString("storage_code"), "T007")) {
+                continue;
+            }
+
+            // 获取万里牛售后单数据
+            List<AfterSaleOrder> saleOrderList = new ArrayList<>();
+            String fromExchangeNo = item.getString("from_exchange_no");
+            if (StrUtil.isNotBlank(fromExchangeNo)) {
+                saleOrderList = codeMap.getOrDefault(fromExchangeNo, Collections.emptyList());
+            }
+            // 订单号存在两种,XD和普通单号
+            String orderCode = item.getString("tp_tid");
+            if (saleOrderList.isEmpty()) {
+                saleOrderList = orderCodeMap.getOrDefault(orderCode, Collections.emptyList());
+            }
+            if (saleOrderList.isEmpty()) {
+                saleOrderList = orderWlnCodeMap.getOrDefault(orderCode, Collections.emptyList());
+            }
+
+            // 没有万里牛售后单时,不生成售后订单
+            if (saleOrderList.isEmpty()) {
+                continue;
+            }
+
+            Map<String, AfterSaleOrder> afterSaleOrderMap = saleOrderList.stream().collect(Collectors.toMap(AfterSaleOrder::getSkuSpecCode, Function.identity()));
+
+            // 入库单明细
+            List<JSONObject> detailsList = item.getJSONArray("details").toJavaList(JSONObject.class);
+
+
+            // 出库单明细
+            OrderExchange orderExchange = null;
+
+            for (JSONObject itemDetails : detailsList) {
+                AfterSaleOrder afterSaleOrder = afterSaleOrderMap.get(itemDetails.getString("sku_no"));
+                if (afterSaleOrder == null) {
+                    continue;
+                }
+
+                OrderInfo orderInfo = orderInfoMap.get(afterSaleOrder.getOrderWlnCode());
+                // 无理由订单不处理
+                if (orderInfo == null || Objects.equals(orderInfo.getClassify(), OrderClassifyEnum.NO_REASON_ORDER.getKey())) {
+                    continue;
+                }
+                SkuSpec skuSpec = skuSpecMap.get(afterSaleOrder.getWlnSkuSpecId());
+                if (skuSpec == null || Objects.equals(skuSpec.getGiftTag(), StatusConstant.YES)) {
+                    continue;
+                }
+                OrderSku orderSku = orderSkuMap
+                        .getOrDefault(orderInfo.getId(),Collections.emptyList())
+                        .stream()
+                        .filter(i -> Objects.equals(i.getSkuSpecId(), skuSpec.getId()))
+                        .findAny()
+                        .orElse(null);
+                if (orderSku == null) {
+                    continue;
+                }
+                // 包材成本只退可二次利用的包材
+                List<OrderSkuBom> orderSkuBomList = orderSkuBomMap.getOrDefault(orderSku.getId(), Collections.emptyList());
+                BigDecimal packagingMaterialCost = orderSkuBomList.stream()
+                        .map(b -> {
+                            BomSpecBo bomSpecBo = bomSpecBoMap.get(b.getBomSpecId());
+                            if (bomSpecBo == null
+                                    || !(Objects.equals(bomSpecBo.getClassifyId(), BomClassifyConstant.MESH_BAG)
+                                    || Objects.equals(bomSpecBo.getClassifyId(), BomClassifyConstant.SUSPENDERS))) {
+                                return BigDecimal.ZERO;
+                            }
+                            return b.getUnitPrice().multiply(b.getQuantity());
+                        })
+                        .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+                // 新增出库单数据
+                if (orderExchange == null) {
+                    orderExchange = new OrderExchange();
+                    orderExchange.setId(IdWorker.getId());
+                    orderExchange.setOrderInfoId(orderInfo.getId());
+                    orderExchange.setCode(CodeEnum.TH_CODE.getCode());
+                    orderExchange.setWarehouseId(WarehouseConstant.FINISHED_PRODUCT);
+                    orderExchange.setType(StatusConstant.YES);
+                    orderExchange.setStatus(StatusConstant.NO);
+                    orderExchange.setReason(afterSaleOrder.getReason());
+                    orderExchange.setRemark(afterSaleOrder.getRemark());
+                    orderExchange.setCompletionTime(item.getDate("modify_time"));
+                    orderExchange.setCompletionTimestamp(item.getLong("modify_time"));
+                    orderExchangeList.add(orderExchange);
+                }
+                OrderExchangeDetail orderExchangeDetail = new OrderExchangeDetail();
+                orderExchangeDetail.setOrderExchangeId(orderExchange.getId());
+                orderExchangeDetail.setQuantity(afterSaleOrder.getQuantity());
+                orderExchangeDetail.setReturnStatus(StatusConstant.NO);
+                orderExchangeDetail.setExchangeStatus(StatusConstant.NO);
+                orderExchangeDetail.setOrderSkuId(orderSku.getId());
+                orderExchangeDetail.setCheckPassesQuantity(BigDecimal.ZERO);
+                orderExchangeDetail.setReturnAmount((orderSku.getUnitPrice()
+                        .add(packagingMaterialCost)).multiply(orderExchangeDetail.getQuantity()));
+                orderExchangeDetailList.add(orderExchangeDetail);
+
+                editAfterSaleOrderIdList.add(afterSaleOrder.getId());
+            }
+        }
+
+        if (!editAfterSaleOrderIdList.isEmpty()) {
+            // 更新万里牛售后单的状态
+            afterSaleOrderService.update(q -> q.set(AfterSaleOrder::getStatus, StatusConstant.YES)
+                    .in(BaseIdPo::getId, editAfterSaleOrderIdList));
+        }
+        // 新增售后订单
+        orderExchangeService.saveBatch(orderExchangeList);
+        orderExchangeDetailService.saveBatch(orderExchangeDetailList);
+    }
+
+    /**
+     * 查询万里牛销售退货入库单数据
+     */
+    private List<JSONObject> getWlnSalesReturnStockIn() {
+        OrderExchange orderExchange = orderExchangeService.getOne(q -> q
+                .isNotNull(OrderExchange::getCompletionTimestamp)
+                .orderByDesc(OrderExchange::getCompletionTimestamp));
+
+        long startTime;
+        long endTime = System.currentTimeMillis();
+        if (orderExchange != null) {
+            startTime = orderExchange.getCompletionTimestamp() + 1;
+        } else {
+            startTime = endTime - 1000 * 60 * 60 * 24 * 60L;
+        }
+
+        //
+        startTime = DateUtil.parse("2023-12-01 00:00:00").getTime();
+
+        //
+
+        List<JSONObject> list = new ArrayList<>();
+
+        while (startTime < endTime) {
+
+            int page = 1;
+            int size;
+            do {
+                try {
+                    List<JSONObject> itemList = WlnUtil.getSalesReturnStockInList(page, 200, startTime, endTime);
+                    page++;
+                    size = itemList.size();
+                    list.addAll(itemList);
+                } catch (Exception e) {
+                    log.error("销售退货入库单同步失败", e);
+                    return Collections.emptyList();
+                }
+            } while (size >= 200);
+
+            startTime = DateUtil.offsetDay(DateUtil.date(startTime), 7).getTime();
+        }
+
+        return list;
+    }
+}

+ 79 - 126
sd-wln/src/main/java/com/sd/wln/service/impl/WlnReturnOrderServiceImpl.java

@@ -2,19 +2,9 @@ package com.sd.wln.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson2.JSONObject;
-import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.ruoyi.common.constant.StatusConstant;
-import com.ruoyi.common.core.domain.BaseIdPo;
-import com.sd.business.entity.bom.bo.BomSpecBo;
-import com.sd.business.entity.bom.constant.BomClassifyConstant;
-import com.sd.business.entity.order.enums.OrderClassifyEnum;
-import com.sd.business.entity.order.enums.OrderStatusEnum;
-import com.sd.business.entity.order.po.*;
-import com.sd.business.entity.sku.po.SkuSpec;
-import com.sd.business.entity.warehouse.constant.WarehouseConstant;
-import com.sd.business.service.order.*;
-import com.sd.business.service.sku.SkuSpecService;
-import com.sd.business.util.CodeEnum;
+import com.sd.business.entity.after.po.AfterSaleOrder;
+import com.sd.business.service.after.AfterSaleOrderService;
 import com.sd.wln.service.WlnReturnOrderService;
 import com.sd.wln.util.WlnUtil;
 import lombok.extern.slf4j.Slf4j;
@@ -22,7 +12,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -31,150 +20,114 @@ import java.util.stream.Collectors;
 public class WlnReturnOrderServiceImpl implements WlnReturnOrderService {
 
     @Autowired
-    private OrderService orderService;
-
-    @Autowired
-    private OrderSkuService orderSkuService;
-
-    @Autowired
-    private OrderSkuBomService orderSkuBomService;
-
-    @Autowired
-    private SkuSpecService skuSpecService;
-
-    @Autowired
-    private OrderExchangeService orderExchangeService;
-
-    @Autowired
-    private OrderExchangeDetailService orderExchangeDetailService;
+    private AfterSaleOrderService afterSaleOrderService;
 
 
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void syncReturnOrder() {
+        // 获取万里牛数据
+        List<JSONObject> wlnReturnOrderList = getWlnReturnOrder();
+        // 筛选条件
+        List<Integer> wlnTypeList = Arrays.asList(0, 4);
+        List<Integer> wlnStatusList = Arrays.asList(0, 1);
 
-        List<JSONObject> list = getWlnReturnOrder();
-        // 只获取退货类型的订单
-        List<JSONObject> wlnReturnOrder = list.stream()
-                .filter(item -> Objects.equals(item.getInteger("type"), StatusConstant.NO))
-                .collect(Collectors.toList());
-
-        if (ObjectUtil.isEmpty(wlnReturnOrder)) {
+        if (ObjectUtil.isEmpty(wlnReturnOrderList)) {
             return;
         }
-        // 获取订单信息
-        List<String> wlnOrderCodeList = wlnReturnOrder.stream()
-                .map(item -> item.getString("trade_code"))
-                .filter(ObjectUtil::isNotNull)
-                .collect(Collectors.toList());
-        Map<String, OrderInfo> orderMap = orderService.mapKEntity(OrderInfo::getWlnCode, q -> q.
-                in(OrderInfo::getWlnCode, wlnOrderCodeList)
-                .eq(OrderInfo::getStatus, OrderStatusEnum.COMPLETION_PRODUCTION.getKey()));
-        List<Long> orderIds = orderMap.values().stream().map(BaseIdPo::getId).collect(Collectors.toList());
-        Map<Long, List<OrderSku>> orderSkuMap = orderSkuService.mapKGroup(OrderSku::getOrderId, q -> q.in(OrderSku::getOrderId, orderIds));
-        Map<Long, List<OrderSkuBom>> orderSkuBomMap = orderSkuBomService.mapKGroup(OrderSkuBom::getOrderSkuId, q -> q.in(OrderSkuBom::getOrderId, orderIds));
-        List<Long> bomSpecIdList = orderSkuBomMap.values().stream()
-                .flatMap(item -> item.stream().map(OrderSkuBom::getBomSpecId))
-                .distinct()
-                .collect(Collectors.toList());
-        Map<Long, BomSpecBo> bomSpecBoMap = skuSpecService.getBomSpecBoByIdList(bomSpecIdList);
-
-        // 获取sku信息
-        List<String> wlnSkuSpecUidList = wlnReturnOrder.stream()
-                .flatMap(item -> item.getJSONArray("items").toJavaList(JSONObject.class).stream())
-                .map(item -> item.getString("sys_spec_uid"))
-                .filter(ObjectUtil::isNotNull)
-                .distinct()
+
+        // 查询万里牛售后单明细id
+        List<String> uidList = wlnReturnOrderList.stream()
+                .map(item -> item.getJSONArray("items").toJavaList(JSONObject.class))
+                .flatMap(Collection::stream)
+                .map(item -> item.getString("tp_off_id"))
                 .collect(Collectors.toList());
-        Map<String, SkuSpec> skuSpecMap = skuSpecService.mapKEntity(SkuSpec::getWlnUid, q -> q.in(SkuSpec::getWlnUid, wlnSkuSpecUidList));
+        Map<String, AfterSaleOrder> afterSaleOrderMap = afterSaleOrderService.mapKEntity(AfterSaleOrder::getWlnOffId, q -> q.in(AfterSaleOrder::getWlnOffId, uidList));
 
-        List<OrderExchange> orderExchangeList = new ArrayList<>();
-        List<OrderExchangeDetail> orderExchangeDetailList = new ArrayList<>();
+        List<AfterSaleOrder> saveAfterSaleOrderList = new ArrayList<>();
+        List<AfterSaleOrder> editAfterSaleOrderList = new ArrayList<>();
+        List<AfterSaleOrder> removeAfterSaleOrderList = new ArrayList<>();
 
-        for (JSONObject item : wlnReturnOrder) {
-            OrderInfo orderInfo = orderMap.get(item.getString("trade_code"));
-            if (orderInfo == null || Objects.equals(orderInfo.getClassify(), OrderClassifyEnum.NO_REASON_ORDER.getKey())) {
+        for (JSONObject item : wlnReturnOrderList) {
+            // 同步类型为退货和仅退款的订单
+            if (!wlnTypeList.contains(item.getInteger("type"))) {
                 continue;
             }
 
             // 出库单明细
             List<JSONObject> detailsList = item.getJSONArray("items").toJavaList(JSONObject.class);
-            OrderExchange orderExchange = new OrderExchange();
-            orderExchange.setId(IdWorker.getId());
-            orderExchange.setCode(CodeEnum.TH_CODE.getCode());
-            orderExchange.setOrderInfoId(orderInfo.getId());
-            orderExchange.setWarehouseId(WarehouseConstant.FINISHED_PRODUCT);
-            orderExchange.setType(StatusConstant.YES);
-            orderExchange.setStatus(StatusConstant.NO);
-            orderExchange.setReason(item.getString("reason"));
-            orderExchange.setRemark(item.getString("describe"));
-            orderExchange.setCompletionTime(item.getDate("end_time"));
-            orderExchange.setCompletionTimestamp(item.getLong("end_time"));
-            orderExchangeList.add(orderExchange);
             for (JSONObject itemDetails : detailsList) {
-                // 获取订单sku id
-                SkuSpec skuSpec = skuSpecMap.get(itemDetails.getString("sys_spec_uid"));
-                if (skuSpec == null || Objects.equals(skuSpec.getGiftTag(), StatusConstant.YES)) {
-                    continue;
-                }
-                OrderSku orderSku = orderSkuMap
-                        .getOrDefault(orderInfo.getId(),Collections.emptyList())
-                        .stream()
-                        .filter(i -> Objects.equals(i.getSkuSpecId(), skuSpec.getId()))
-                        .findAny()
-                        .orElse(null);
-                if (orderSku == null) {
-                    continue;
+
+                AfterSaleOrder afterSaleOrder = afterSaleOrderMap.get(itemDetails.getString("tp_off_id"));
+
+                // 新增
+                if (afterSaleOrder == null) {
+                    // 新增只同步状态为处理中和已完成的售后单
+                    if (!wlnStatusList.contains(item.getInteger("status"))) {
+                        continue;
+                    }
+
+                    afterSaleOrder = new AfterSaleOrder();
+                    afterSaleOrder.setCode(item.getString("bill_code"));
+                    afterSaleOrder.setStatus(StatusConstant.NO);
+                    afterSaleOrder.setWlnOffId(itemDetails.getString("tp_off_id"));
+                    afterSaleOrder.setOrderCode(item.getString("oln_trade_code"));
+                    afterSaleOrder.setOrderWlnCode(item.getString("trade_code"));
+                    afterSaleOrder.setSkuSpecCode(itemDetails.getString("sku_code"));
+                    afterSaleOrder.setWlnSkuSpecId(itemDetails.getString("sys_spec_uid"));
+                    afterSaleOrder.setStorageCode(item.getString("storage_code"));
+                    afterSaleOrder.setWlnStatus(item.getInteger("status"));
+                    afterSaleOrder.setWlnType(item.getInteger("type"));
+                    afterSaleOrder.setQuantity(itemDetails.getBigDecimal("size"));
+                    afterSaleOrder.setModifyTime(item.getDate("create_time"));
+                    afterSaleOrder.setModifyTimestamp(item.getLong("create_time"));
+                    afterSaleOrder.setReason(item.getString("reason"));
+                    afterSaleOrder.setRemark(item.getString("describe"));
+                    saveAfterSaleOrderList.add(afterSaleOrder);
+                } else {
+                    // 已售后的不修改
+                    if (Objects.equals(afterSaleOrder.getStatus(), StatusConstant.YES)) {
+                        continue;
+                    }
+
+                    // 售后单状态不为处理中和已完成的售后单删除
+                    if (!wlnStatusList.contains(item.getInteger("status"))) {
+                        removeAfterSaleOrderList.add(afterSaleOrder);
+                        continue;
+                    }
+
+                    afterSaleOrder.setWlnStatus(item.getInteger("status"));
+                    afterSaleOrder.setWlnType(item.getInteger("type"));
+                    afterSaleOrder.setModifyTime(item.getDate("create_time"));
+                    afterSaleOrder.setModifyTimestamp(item.getLong("create_time"));
+                    editAfterSaleOrderList.add(afterSaleOrder);
                 }
-                // 包材成本只退可二次利用的包材
-                List<OrderSkuBom> orderSkuBomList = orderSkuBomMap.getOrDefault(orderSku.getId(), Collections.emptyList());
-                BigDecimal packagingMaterialCost = orderSkuBomList.stream()
-                        .map(b -> {
-                            BomSpecBo bomSpecBo = bomSpecBoMap.get(b.getBomSpecId());
-                            if (bomSpecBo == null
-                                    || !(Objects.equals(bomSpecBo.getClassifyId(), BomClassifyConstant.MESH_BAG)
-                                    || Objects.equals(bomSpecBo.getClassifyId(), BomClassifyConstant.SUSPENDERS))) {
-                                return BigDecimal.ZERO;
-                            }
-                            return b.getUnitPrice().multiply(b.getQuantity());
-                        })
-                        .reduce(BigDecimal.ZERO, BigDecimal::add);
-
-
-                OrderExchangeDetail orderExchangeDetail = new OrderExchangeDetail();
-                orderExchangeDetail.setOrderExchangeId(orderExchange.getId());
-                orderExchangeDetail.setQuantity(itemDetails.getBigDecimal("size"));
-                orderExchangeDetail.setReturnStatus(StatusConstant.NO);
-                orderExchangeDetail.setExchangeStatus(StatusConstant.NO);
-                orderExchangeDetail.setOrderSkuId(orderSku.getId());
-                orderExchangeDetail.setCheckPassesQuantity(BigDecimal.ZERO);
-                orderExchangeDetail.setReturnAmount((orderSku.getUnitPrice()
-                        .add(packagingMaterialCost)).multiply(orderExchangeDetail.getQuantity()));
-                orderExchangeDetailList.add(orderExchangeDetail);
             }
         }
 
-        orderExchangeService.saveBatch(orderExchangeList);
-        orderExchangeDetailService.saveBatch(orderExchangeDetailList);
-
+        if (!saveAfterSaleOrderList.isEmpty()) {
+            afterSaleOrderService.saveBatch(saveAfterSaleOrderList);
+        }
+        if (!editAfterSaleOrderList.isEmpty()) {
+            afterSaleOrderService.updateBatchById(editAfterSaleOrderList);
+        }
+        if (!removeAfterSaleOrderList.isEmpty()) {
+            afterSaleOrderService.removeBatchByIds(removeAfterSaleOrderList);
+        }
     }
 
-
-
     /**
      * 查询近万里牛售后单
      */
     private List<JSONObject> getWlnReturnOrder() {
-        OrderExchange orderExchange = orderExchangeService.getOne(q -> q
-                .isNotNull(OrderExchange::getCompletionTimestamp)
-                .orderByDesc(OrderExchange::getCompletionTimestamp));
+        AfterSaleOrder afterSaleOrder = afterSaleOrderService.getOne(q -> q.orderByDesc(AfterSaleOrder::getModifyTimestamp));
 
         long startTime;
         long endTime = System.currentTimeMillis();
-        if (orderExchange != null) {
-            startTime = orderExchange.getCompletionTimestamp() + 1;
+        if (afterSaleOrder != null) {
+            startTime = afterSaleOrder.getModifyTimestamp() + 1;
         } else {
-            startTime = endTime - 1000 * 60 * 60 * 24 * 7;
+            startTime = endTime - 1000 * 60 * 60 * 24 * 60L;
         }
 
         List<JSONObject> list = new ArrayList<>();

+ 21 - 3
sd-wln/src/main/java/com/sd/wln/util/WlnUtil.java

@@ -218,9 +218,6 @@ public class WlnUtil {
         param.setEnd_time(endTime);
         param.setTime_type(2);
         param.setStorage_code("T007");
-        JSONObject ext = new JSONObject();
-        ext.put("status", 1);
-        param.setExt(ext);
         param.generateSign(MapUtil.createLinkString(MapUtil.beanToMap(param)));
 
         String result = send(PREFIX + "erp/open/return/order/list", MapUtil.beanToMap(param));
@@ -232,4 +229,25 @@ public class WlnUtil {
         return json.getJSONArray("data").toJavaList(JSONObject.class);
     }
 
+    /**
+     * 获取销售退货入库单
+     */
+    public static List<JSONObject> getSalesReturnStockInList(Integer page, Integer limit, Long startTime, Long endTime) throws Exception {
+        SalesReturnStockInParam param = new SalesReturnStockInParam();
+        param.setPage(page);
+        param.setLimit(limit);
+        param.setModify_time(startTime);
+        param.setModify_end_time(endTime);
+        param.setIs_split(true);
+        param.generateSign(MapUtil.createLinkString(MapUtil.beanToMap(param)));
+
+        String result = send(PREFIX + "erp/sale/stock/in/query", MapUtil.beanToMap(param));
+        JSONObject json = JSONObject.parseObject(result);
+        Integer code = json.getInteger("code");
+        if (code != 0) {
+            throw new ServiceException(result);
+        }
+        return json.getJSONArray("data").toJavaList(JSONObject.class);
+    }
+
 }