ソースを参照

feat: 对接erp

xdd 3 日 前
コミット
5455a3a4d9

+ 14 - 3
fs-admin/src/main/java/com/fs/task/StoreTask.java

@@ -13,6 +13,7 @@ import com.fs.erp.domain.ErpGoods;
 import com.fs.erp.domain.ErpOrderQuery;
 import com.fs.erp.dto.*;
 import com.fs.erp.service.FsJstAftersalePushService;
+import com.fs.erp.service.FsJstCodPushService;
 import com.fs.erp.service.IErpGoodsService;
 import com.fs.erp.service.IErpOrderService;
 import com.fs.erp.utils.ErpContextHolder;
@@ -122,17 +123,27 @@ public class StoreTask {
     @Autowired
     private FsWarehousesMapper fsWarehousesMapper;
 
-
     @Autowired
     public FsJstAftersalePushService fsJstAftersalePushService;
 
+    @Autowired
+    private FsJstCodPushService fsJstCodPushService;
+
     /**
-     * 推送聚水潭售后单
+     * 推送jst售后单
      */
-    @QuartzRunnable(name = "推送聚水潭售后单")
+    @QuartzRunnable(name = "推送jst售后单")
     public void pushJst(){
         fsJstAftersalePushService.pushJst();
     }
+
+    /**
+     * 推送jst货到付款待支付金额
+     */
+    @QuartzRunnable(name = "推送jst货到付款待支付金额")
+    public void jstCodPush(){
+        fsJstCodPushService.jstCodPush();
+    }
     /**
      * 发货任务
      */

+ 76 - 0
fs-service-system/src/main/java/com/fs/erp/domain/FsJstCodPush.java

@@ -0,0 +1,76 @@
+package com.fs.erp.domain;
+
+import lombok.Data;
+import lombok.Builder;
+import lombok.NoArgsConstructor;
+import lombok.AllArgsConstructor;
+import java.time.LocalDateTime;
+
+/**
+ * jst货到付款推送
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class FsJstCodPush {
+    /**
+     * 主键,自增
+     */
+    private Long id;
+
+    /**
+     * 订单id
+     */
+    private String orderId;
+
+    /**
+     * 售后id
+     */
+    private String afterSaleId;
+
+    /**
+     * 0创建订单 1后续金额
+     */
+    private String type;
+
+    /**
+     * 任务状态:0-待处理,1-成功,2-失败,3-正在处理,4-已取消
+     */
+    private Integer taskStatus;
+
+    /**
+     * 重试次数,默认为 0
+     */
+    private Integer retryCount;
+
+    /**
+     * 上次执行时间,用于记录任务执行的最后时间
+     */
+    private LocalDateTime lastExecuteTime;
+
+    /**
+     * 记录创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 记录更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 调用接口时传入的参数(JSON 格式)
+     */
+    private String params;
+
+    /**
+     * 调用接口返回的结果(JSON 格式)
+     */
+    private String result;
+
+    /**
+     * 错误信息(记录失败原因)
+     */
+    private String errorMessage;
+}

+ 81 - 0
fs-service-system/src/main/java/com/fs/erp/mapper/FsJstCodPushMapper.java

@@ -0,0 +1,81 @@
+package com.fs.erp.mapper;
+
+import com.fs.erp.domain.FsJstCodPush;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+import org.apache.ibatis.annotations.Options;
+import org.apache.ibatis.annotations.Param;
+import java.util.List;
+
+@Mapper
+public interface FsJstCodPushMapper {
+
+    /**
+     * 根据ID查询记录
+     */
+    @Select("SELECT * FROM fs_jst_cod_push WHERE id = #{id}")
+    FsJstCodPush selectById(@Param("id") Long id);
+
+    /**
+     * 根据订单ID查询记录
+     */
+    @Select("SELECT * FROM fs_jst_cod_push WHERE order_id = #{orderId}")
+    List<FsJstCodPush> selectByOrderId(@Param("orderId") String orderId);
+
+    /**
+     * 根据售后ID查询记录
+     */
+    @Select("SELECT * FROM fs_jst_cod_push WHERE after_sale_id = #{afterSaleId}")
+    List<FsJstCodPush> selectByAfterSaleId(@Param("afterSaleId") String afterSaleId);
+
+    /**
+     * 查询待处理的任务
+     */
+    @Select("SELECT * FROM fs_jst_cod_push WHERE task_status = 0 ORDER BY id ASC LIMIT #{limit}")
+    List<FsJstCodPush> selectPendingTasks(@Param("limit") int limit);
+
+
+    /**
+     * 查询待处理的数据
+     * @return List<FsJstCodPush>
+     */
+    @Select("SELECT * from fs_jst_cod_push where task_status = 0 OR (task_status = 2 AND retry_count < 3) ")
+    List<FsJstCodPush> queryPenddingData();
+    /**
+     * 插入新记录
+     */
+    @Insert("INSERT INTO fs_jst_cod_push(order_id, after_sale_id, type, task_status, params) " +
+            "VALUES(#{orderId}, #{afterSaleId}, #{type}, #{taskStatus}, #{params})")
+    @Options(useGeneratedKeys = true, keyProperty = "id")
+    int insert(FsJstCodPush record);
+
+    /**
+     * 更新任务状态
+     */
+    @Update("UPDATE fs_jst_cod_push SET task_status = #{taskStatus}, retry_count = #{retryCount}, " +
+            "last_execute_time = NOW(), result = #{result}, error_message = #{errorMessage} " +
+            "WHERE id = #{id}")
+    int updateTaskStatus(FsJstCodPush record);
+
+    /**
+     * 根据ID更新记录
+     */
+    @Update("<script>" +
+            "UPDATE fs_jst_cod_push " +
+            "<set>" +
+            "  <if test='orderId != null'>order_id = #{orderId},</if>" +
+            "  <if test='afterSaleId != null'>after_sale_id = #{afterSaleId},</if>" +
+            "  <if test='type != null'>type = #{type},</if>" +
+            "  <if test='taskStatus != null'>task_status = #{taskStatus},</if>" +
+            "  <if test='retryCount != null'>retry_count = #{retryCount},</if>" +
+            "  <if test='lastExecuteTime != null'>last_execute_time = #{lastExecuteTime},</if>" +
+            "  <if test='params != null'>params = #{params},</if>" +
+            "  <if test='result != null'>result = #{result},</if>" +
+            "  <if test='errorMessage != null'>error_message = #{errorMessage},</if>" +
+            "</set>" +
+            "WHERE id = #{id}" +
+            "</script>")
+    int updateById(FsJstCodPush record);
+}

+ 5 - 0
fs-service-system/src/main/java/com/fs/erp/service/FsJstCodPushService.java

@@ -0,0 +1,5 @@
+package com.fs.erp.service;
+
+public interface FsJstCodPushService {
+    public void jstCodPush();
+}

+ 53 - 0
fs-service-system/src/main/java/com/fs/erp/service/impl/FsJstCodPushServiceImpl.java

@@ -0,0 +1,53 @@
+package com.fs.erp.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fs.erp.domain.FsJstCodPush;
+import com.fs.erp.dto.ErpOrderResponseDTO;
+import com.fs.erp.dto.ShopOrderDTO;
+import com.fs.erp.http.JstErpHttpService;
+import com.fs.erp.mapper.FsJstCodPushMapper;
+import com.fs.erp.service.FsJstCodPushService;
+import com.fs.express.enums.TaskStatusEnum;
+import com.hc.openapi.tool.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Slf4j
+@Service
+public class FsJstCodPushServiceImpl implements FsJstCodPushService {
+    @Autowired
+    private FsJstCodPushMapper fsJstCodPushMapper;
+
+    @Autowired
+    private JstErpHttpService jstErpHttpService;
+
+    @Override
+    public void jstCodPush() {
+        List<FsJstCodPush> fsJstCodPushes = fsJstCodPushMapper.queryPenddingData();
+        for (FsJstCodPush fsJstCodPush : fsJstCodPushes) {
+            fsJstCodPush.setTaskStatus(TaskStatusEnum.PROCESSING.getCode());
+            int lock = fsJstCodPushMapper.updateById(fsJstCodPush);
+            if(lock <= 0) {
+                log.info("获取当前记录锁失败! 已跳过");
+                continue;
+            }
+
+            try{
+                String params = fsJstCodPush.getParams();
+                ShopOrderDTO shopOrderDTO = JSONObject.parseObject(params, ShopOrderDTO.class);
+                ErpOrderResponseDTO upload = jstErpHttpService.upload(shopOrderDTO);
+                fsJstCodPush.setResult(JSON.toJSONString(upload));
+                fsJstCodPush.setTaskStatus(TaskStatusEnum.SUCCESS.getCode());
+
+            }catch (Exception e) {
+                fsJstCodPush.setErrorMessage(JSON.toJSONString(e));
+                fsJstCodPush.setRetryCount(fsJstCodPush.getRetryCount()+1);
+            }
+
+            fsJstCodPushMapper.updateById(fsJstCodPush);
+        }
+    }
+}

+ 29 - 9
fs-service-system/src/main/java/com/fs/erp/service/impl/JSTErpOrderServiceImpl.java

@@ -10,6 +10,7 @@ import com.fs.erp.domain.*;
 import com.fs.erp.dto.*;
 import com.fs.erp.http.JstErpHttpService;
 import com.fs.erp.mapper.FsJstAftersalePushMapper;
+import com.fs.erp.mapper.FsJstCodPushMapper;
 import com.fs.erp.service.IErpOrderService;
 import com.fs.erp.utils.SignUtil;
 import com.fs.express.enums.TaskStatusEnum;
@@ -62,6 +63,9 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
     @Autowired
     private FsStoreAfterSalesMapper fsStoreAfterSalesMapper;
 
+    @Autowired
+    private FsJstCodPushMapper fsJstCodPushMapper;
+
     @Override
     public ErpOrderResponse addOrder(ErpOrder order) {
         FsStoreOrder fsStoreOrder = fsStoreOrderService.selectFsStoreOrderByOrderCode(order.getPlatform_code());
@@ -70,8 +74,6 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
 
         ShopOrderDTO shopOrderDTO = new ShopOrderDTO();
 
-        BigDecimal couponPrice = fsStoreOrder.getCouponPrice();
-
         shopOrderDTO.setShopId(Long.valueOf(order.getShop_code()));
         shopOrderDTO.setSoId(order.getPlatform_code());
         shopOrderDTO.setOrderDate(order.getDeal_datetime());
@@ -129,21 +131,42 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
         }
         shopOrderDTO.setItems(itemDTOList);
 
-
+        // 实际支付金额
         PaymentDTO paymentDTO = new PaymentDTO();
-        paymentDTO.setAmount(erpOrderPayment.getPayment());
+        paymentDTO.setAmount(fsStoreOrder.getPayMoney().doubleValue());
         paymentDTO.setOuterPayId(order.getPlatform_code());
         paymentDTO.setPayDate(order.getDeal_datetime());
-        paymentDTO.setPayment("微信");
+        paymentDTO.setPayment("微信支付");
         paymentDTO.setBuyerAccount(order.getBuyer_account());
         paymentDTO.setSellerAccount("平台销售");
         shopOrderDTO.setPay(paymentDTO);
 
+
         // 如果是货到付款
         if("2".equals(fsStoreOrder.getPayType()) || "3".equals(fsStoreOrder.getPayType())){
             shopOrderDTO.setIsCod(true);
             // 货到付款金额 = 物流代收金额-优惠金额
-            shopOrderDTO.setBuyerPaidAmount(fsStoreOrder.getPayDelivery().subtract(couponPrice));
+            shopOrderDTO.setBuyerPaidAmount(fsStoreOrder.getPayDelivery());
+            shopOrderDTO.setPayAmount(fsStoreOrder.getPayPrice().doubleValue());
+
+            // 货到付款要推两次
+            paymentDTO = new PaymentDTO();
+            // 物流代收金额
+            paymentDTO.setAmount(fsStoreOrder.getPayDelivery().doubleValue());
+            paymentDTO.setOuterPayId(order.getPlatform_code());
+            paymentDTO.setPayDate(order.getDeal_datetime());
+            paymentDTO.setPayment("物流代收金额");
+            paymentDTO.setBuyerAccount(order.getBuyer_account());
+            paymentDTO.setSellerAccount("平台销售");
+            shopOrderDTO.setPay(paymentDTO);
+
+            FsJstCodPush fsJstCodPush = new FsJstCodPush();
+            fsJstCodPush.setOrderId(fsStoreOrder.getOrderCode());
+            fsJstCodPush.setType("0");
+            fsJstCodPush.setParams(JSON.toJSONString(shopOrderDTO));
+            fsJstCodPush.setRetryCount(0);
+            fsJstCodPush.setTaskStatus(TaskStatusEnum.PENDING.getCode());
+            fsJstCodPushMapper.insert(fsJstCodPush);
         }
 
         ErpOrderResponseDTO upload = jstErpHttpService.upload(shopOrderDTO);
@@ -289,9 +312,6 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
         FsStoreOrder fsStoreOrder = fsStoreOrderService.selectFsStoreOrderByOrderCode(param.getTid());
         FsStoreDelivers byOrderCode = fsStoreDeliversMapper.findByOrderCode(fsStoreOrder.getOrderCode());
 
-
-        FsStoreAfterSales afterSales = fsStoreAfterSalesMapper.selectFsStoreAfterSalesByOrderCode(fsStoreOrder.getOrderCode());
-
         // 发货后退款
         if(ObjectUtil.isNotNull(byOrderCode)){