Prechádzať zdrojové kódy

Merge branch 'openIm' of http://1.14.104.71:10880/root/ylrz_his_scrm_java into openIm

15376779826 1 mesiac pred
rodič
commit
8c98e9cbcc
35 zmenil súbory, kde vykonal 1662 pridanie a 675 odobranie
  1. 2 2
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java
  2. 37 4
      fs-admin/src/main/java/com/fs/hisStore/task/MallStoreTask.java
  3. 110 0
      fs-service/src/main/java/com/fs/erp/mapper/FsJstAftersalePushScrmMapper.java
  4. 77 0
      fs-service/src/main/java/com/fs/erp/mapper/FsJstCodPushScrmMapper.java
  5. 5 0
      fs-service/src/main/java/com/fs/erp/service/FsJstAftersalePushScrmService.java
  6. 5 0
      fs-service/src/main/java/com/fs/erp/service/FsJstCodPushScrmService.java
  7. 3 0
      fs-service/src/main/java/com/fs/erp/service/IErpGoodsService.java
  8. 15 0
      fs-service/src/main/java/com/fs/erp/service/impl/ErpGoodsServiceImpl.java
  9. 176 0
      fs-service/src/main/java/com/fs/erp/service/impl/FsJstAftersalePushScrmServiceImpl.java
  10. 55 0
      fs-service/src/main/java/com/fs/erp/service/impl/FsJstCodPushScrmServiceImpl.java
  11. 15 0
      fs-service/src/main/java/com/fs/erp/service/impl/HzOMSErpGoodsServiceImpl.java
  12. 93 0
      fs-service/src/main/java/com/fs/erp/service/impl/JSTErpGoodsServiceImpl.java
  13. 24 12
      fs-service/src/main/java/com/fs/erp/service/impl/JSTErpOrderServiceImpl.java
  14. 15 0
      fs-service/src/main/java/com/fs/erp/service/impl/K9StockScrmServiceImpl.java
  15. 15 0
      fs-service/src/main/java/com/fs/erp/service/impl/WdtErpGoodsServiceImpl.java
  16. 1 0
      fs-service/src/main/java/com/fs/his/service/impl/FsStoreProductServiceImpl.java
  17. 108 0
      fs-service/src/main/java/com/fs/hisStore/constants/ErpTypeEnum.java
  18. 24 0
      fs-service/src/main/java/com/fs/hisStore/constants/UserAppsLockConstant.java
  19. 2 0
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductAttrValueScrmMapper.java
  20. 2 0
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductScrmMapper.java
  21. 12 0
      fs-service/src/main/java/com/fs/hisStore/service/IFsStoreOrderScrmService.java
  22. 9 7
      fs-service/src/main/java/com/fs/hisStore/service/IFsStoreProductAttrValueScrmService.java
  23. 3 0
      fs-service/src/main/java/com/fs/hisStore/service/IFsStoreProductScrmService.java
  24. 11 1
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreAfterSalesScrmServiceImpl.java
  25. 2 2
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreCartScrmServiceImpl.java
  26. 587 10
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java
  27. 14 8
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductAttrValueScrmServiceImpl.java
  28. 35 28
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductScrmServiceImpl.java
  29. 2 2
      fs-service/src/main/resources/application-druid-fby.yml
  30. 2 2
      fs-service/src/main/resources/application-druid-sxjz.yml
  31. 3 0
      fs-service/src/main/resources/mapper/hisStore/FsStoreProductAttrValueScrmMapper.xml
  32. 7 0
      fs-service/src/main/resources/mapper/hisStore/FsStoreProductScrmMapper.xml
  33. 1 1
      fs-store/src/main/java/com/fs/hisStore/controller/store/FsStoreOrderScrmController.java
  34. 2 2
      fs-user-app/src/main/java/com/fs/app/controller/CompanyUserController.java
  35. 188 594
      fs-user-app/src/main/java/com/fs/app/controller/store/StoreOrderScrmController.java

+ 2 - 2
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java

@@ -541,7 +541,7 @@ public class FsStoreOrderScrmController extends BaseController {
         IErpOrderService erpOrderService = getErpService();
         ErpOrderQueryRequert request = new ErpOrderQueryRequert();
         request.setCode(order.getExtendOrderId());
-        ErpOrderQueryResponse response = erpOrderService.getOrder(request);
+        ErpOrderQueryResponse response = erpOrderService.getScrmOrder(request);
         if(response.getOrders()!=null&&response.getOrders().size()>0){
             for(ErpOrderQuery orderQuery : response.getOrders()){
                 if(orderQuery.getDeliverys()!=null&&orderQuery.getDeliverys().size()>0){
@@ -632,7 +632,7 @@ public class FsStoreOrderScrmController extends BaseController {
         IErpOrderService erpOrderService = getErpService();
         ErpOrderQueryRequert request = new ErpOrderQueryRequert();
         request.setCode(extendOrderId);
-        ErpOrderQueryResponse response = erpOrderService.getOrder(request);
+        ErpOrderQueryResponse response = erpOrderService.getScrmOrder(request);
         return R.ok().put("data",response);
     }
 

+ 37 - 4
fs-admin/src/main/java/com/fs/hisStore/task/MallStoreTask.java

@@ -17,7 +17,9 @@ import com.fs.erp.dto.ErpOrderQueryResponse;
 import com.fs.erp.service.IErpGoodsService;
 import com.fs.erp.service.IErpOrderService;
 import com.fs.his.config.FsSysConfig;
+import com.fs.his.domain.FsStoreProductAttrValue;
 import com.fs.his.dto.ExpressInfoDTO;
+import com.fs.his.mapper.FsStoreProductAttrValueMapper;
 import com.fs.his.service.IFsExpressService;
 import com.fs.his.service.IFsUserService;
 import com.fs.his.utils.ConfigUtil;
@@ -93,7 +95,7 @@ public class MallStoreTask
     @Autowired
     private ISysConfigService configService;
     @Autowired
-    private FsStoreProductAttrValueScrmMapper fsStoreProductAttrValueMapper;
+    private FsStoreProductAttrValueMapper fsStoreProductAttrValueMapper;
     @Autowired
     private FsStorePaymentScrmMapper paymentMapper;
     @Autowired
@@ -232,8 +234,8 @@ public class MallStoreTask
         String json=configService.selectConfigByKey("store.config");
         StoreConfig config=JSONUtil.toBean(json,StoreConfig.class);
 
-        List<FsStoreProductAttrValueScrm> values = fsStoreProductAttrValueMapper.selectFsStoreProductAttrValueList(new FsStoreProductAttrValueScrm());
-        for (FsStoreProductAttrValueScrm value : values) {
+        List<FsStoreProductAttrValue> values = fsStoreProductAttrValueMapper.selectFsStoreProductAttrValueList(new FsStoreProductAttrValue());
+        for (FsStoreProductAttrValue value : values) {
             ErpGoodsQueryRequert query = new ErpGoodsQueryRequert();
             query.setCode(value.getBarCode());
             ErpGoodsQueryResponse goods = erpGoodsService.getGoods(query);
@@ -246,7 +248,7 @@ public class MallStoreTask
                     BigDecimal divide = salesPrice.multiply(new BigDecimal(config.getSalesPriceRate())).divide(new BigDecimal("100"));
                     System.out.println("代理价格"+divide);
                     System.out.println("成本价"+salesPrice);
-                    FsStoreProductAttrValueScrm va = new FsStoreProductAttrValueScrm();
+                    FsStoreProductAttrValue va = new FsStoreProductAttrValue();
                     va.setCost(salesPrice);
                     va.setAgentPrice(divide);
                     va.setId(value.getId());
@@ -255,9 +257,40 @@ public class MallStoreTask
             }
             System.out.println(goods);
         }
+    }
+
 
+    @Autowired
+    private FsStoreProductAttrValueScrmMapper fsStoreProductAttrValueScrmMapper;
+
+    public void storeProdUpdateCostPriceScrm()
+    {
+        String json=configService.selectConfigByKey("store.config");
+        StoreConfig config=JSONUtil.toBean(json,StoreConfig.class);
 
+        List<FsStoreProductAttrValueScrm> values = fsStoreProductAttrValueScrmMapper.selectFsStoreProductAttrValueList(new FsStoreProductAttrValueScrm());
+        for (FsStoreProductAttrValueScrm value : values) {
+            ErpGoodsQueryRequert query = new ErpGoodsQueryRequert();
+            query.setCode(value.getBarCode());
+            ErpGoodsQueryResponse goods = erpGoodsService.getGoodsScrm(query);
+            List<ErpGoods> items = goods.getItems();
 
+            if (items!=null&&items.size()>0){
+                ErpGoods erpGoods = items.get(0);
+                BigDecimal salesPrice = erpGoods.getSales_price();
+                if (salesPrice!=null&&salesPrice.compareTo(BigDecimal.ZERO) != 0){
+                    BigDecimal divide = salesPrice.multiply(new BigDecimal(config.getSalesPriceRate())).divide(new BigDecimal("100"));
+                    System.out.println("代理价格"+divide);
+                    System.out.println("成本价"+salesPrice);
+                    FsStoreProductAttrValueScrm va = new FsStoreProductAttrValueScrm();
+                    va.setCost(salesPrice);
+                    va.setAgentPrice(divide);
+                    va.setId(value.getId());
+                    fsStoreProductAttrValueScrmMapper.updateFsStoreProductAttrValue(va);
+                }
+            }
+            System.out.println(goods);
+        }
     }
     public void couponOp()
     {

+ 110 - 0
fs-service/src/main/java/com/fs/erp/mapper/FsJstAftersalePushScrmMapper.java

@@ -0,0 +1,110 @@
+package com.fs.erp.mapper;
+
+import com.fs.erp.domain.FsJstAftersalePush;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+
+/**
+ * 订阅物流Mapper
+ */
+@Mapper
+public interface FsJstAftersalePushScrmMapper {
+
+    /**
+     * 根据ID查询
+     */
+    @Select("SELECT * FROM fs_jst_aftersale_push_scrm WHERE id = #{id}")
+    FsJstAftersalePush selectById(Long id);
+
+    /**
+     * 根据订单ID查询
+     */
+    @Select("SELECT * FROM fs_jst_aftersale_push_scrm WHERE order_id = #{orderId}")
+    FsJstAftersalePush selectByOrderId(String orderId);
+
+    /**
+     * 查询待处理的任务
+     */
+    @Select("SELECT * FROM fs_jst_aftersale_push_scrm WHERE task_status = #{status} AND retry_count < #{maxRetry} LIMIT #{limit}")
+    List<FsJstAftersalePush> selectByStatusAndRetry(Byte status, Integer maxRetry, Integer limit);
+
+    /**
+     * 插入记录
+     */
+    @Insert("INSERT INTO fs_jst_aftersale_push_scrm(order_id,after_sale_id, type, task_status, retry_count, last_execute_time, params) " +
+            "VALUES(#{orderId},#{afterSaleId}, #{type}, #{taskStatus}, #{retryCount}, #{lastExecuteTime}, #{params})")
+    @Options(useGeneratedKeys = true, keyProperty = "id")
+    int insert(FsJstAftersalePush push);
+
+    /**
+     * 更新记录
+     */
+    @Update("UPDATE fs_jst_aftersale_push_scrm SET params=#{params},task_status = #{taskStatus}, retry_count = #{retryCount}, " +
+            "last_execute_time = #{lastExecuteTime}, result = #{result}, error_message = #{errorMessage} " +
+            "WHERE id = #{id}")
+    int update(FsJstAftersalePush push);
+
+    /**
+     * 更新任务状态
+     */
+    @Update("UPDATE fs_jst_aftersale_push_scrm SET task_status = #{taskStatus}, " +
+            "last_execute_time = now() WHERE id = #{id}")
+    int updateStatus(@Param("id") Long id, @Param("taskStatus") Byte taskStatus);
+
+    @Select("WITH OrderWithNextTaskType AS (\n" +
+            "    SELECT \n" +
+            "        id,\n" +
+            "        order_id,\n" +
+            "        after_sale_id,\n" +
+            "        type,\n" +
+            "        task_status,\n" +
+            "        retry_count,\n" +
+            "        ROW_NUMBER() OVER(PARTITION BY order_id ORDER BY CAST(type AS UNSIGNED)) AS task_seq\n" +
+            "    FROM \n" +
+            "        fs_jst_aftersale_push_scrm\n" +
+            "),\n" +
+            "PendingTasks AS (\n" +
+            "    SELECT \n" +
+            "        o.id,\n" +
+            "        o.order_id,\n" +
+            "        o.after_sale_id,\n" +
+            "        o.type,\n" +
+            "        o.task_status,\n" +
+            "        o.retry_count,\n" +
+            "        o.task_seq,\n" +
+            "        (\n" +
+            "            SELECT MAX(p.task_status)  \n" +
+            "            FROM OrderWithNextTaskType p\n" +
+            "            WHERE p.order_id = o.order_id\n" +
+            "              AND p.task_seq = o.task_seq - 1\n" +
+            "        ) AS prev_task_status,\n" +
+            "        EXISTS (\n" +
+            "            SELECT 1\n" +
+            "            FROM OrderWithNextTaskType p\n" +
+            "            WHERE p.order_id = o.order_id\n" +
+            "              AND p.task_seq < o.task_seq\n" +
+            "              AND p.task_status != 1\n" +
+            "        ) AS has_pending_prev_task\n" +
+            "    FROM \n" +
+            "        OrderWithNextTaskType o\n" +
+            "    WHERE \n" +
+            "        o.task_status = 0 OR (o.task_status = 2 AND o.retry_count < 3)\n" +
+            ")\n" +
+            "SELECT \n" +
+            "    id,\n" +
+            "    order_id,\n" +
+            "    after_sale_id,\n" +
+            "    type,\n" +
+            "    task_status,\n" +
+            "    retry_count\n" +
+            "FROM \n" +
+            "    PendingTasks\n" +
+            "WHERE \n" +
+            "    (task_seq = 1 OR prev_task_status = 1)\n" +
+            "    AND has_pending_prev_task = 0\n" +
+            "ORDER BY\n" +
+            "    order_id,\n" +
+            "    task_seq;\n")
+    List<FsJstAftersalePush> queryPenddingData();
+}

+ 77 - 0
fs-service/src/main/java/com/fs/erp/mapper/FsJstCodPushScrmMapper.java

@@ -0,0 +1,77 @@
+package com.fs.erp.mapper;
+
+import com.fs.erp.domain.FsJstCodPush;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+
+@Mapper
+public interface FsJstCodPushScrmMapper {
+
+    /**
+     * 根据ID查询记录
+     */
+    @Select("SELECT * FROM fs_jst_cod_push_scrm WHERE id = #{id}")
+    FsJstCodPush selectById(@Param("id") Long id);
+
+    /**
+     * 根据订单ID查询记录
+     */
+    @Select("SELECT * FROM fs_jst_cod_push_scrm WHERE order_id = #{orderId}")
+    List<FsJstCodPush> selectByOrderId(@Param("orderId") String orderId);
+
+    /**
+     * 根据售后ID查询记录
+     */
+    @Select("SELECT * FROM fs_jst_cod_push_scrm WHERE after_sale_id = #{afterSaleId}")
+    List<FsJstCodPush> selectByAfterSaleId(@Param("afterSaleId") String afterSaleId);
+
+    /**
+     * 查询待处理的任务
+     */
+    @Select("SELECT * FROM fs_jst_cod_push_scrm 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_scrm where task_status = 0 OR (task_status = 2 AND retry_count < 3) ")
+    List<FsJstCodPush> queryPenddingData();
+    /**
+     * 插入新记录
+     */
+    @Insert("INSERT INTO fs_jst_cod_push_scrm(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_scrm 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_scrm " +
+            "<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/src/main/java/com/fs/erp/service/FsJstAftersalePushScrmService.java

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

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

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

+ 3 - 0
fs-service/src/main/java/com/fs/erp/service/IErpGoodsService.java

@@ -7,7 +7,10 @@ public interface IErpGoodsService
 {
 
     BaseResponse addGoods(ErpGoods goods);
+    BaseResponse addGoodsScrm(ErpGoods goods);
     ErpGoodsQueryResponse getGoods(ErpGoodsQueryRequert param);
+    ErpGoodsQueryResponse getGoodsScrm(ErpGoodsQueryRequert param);
     ErpGoodsStockQueryResponse getGoodsStock(ErpGoodsStockQueryRequert param);
+    ErpGoodsStockQueryResponse getGoodsStockScrm(ErpGoodsStockQueryRequert param);
 }
 

+ 15 - 0
fs-service/src/main/java/com/fs/erp/service/impl/ErpGoodsServiceImpl.java

@@ -43,6 +43,11 @@ public class ErpGoodsServiceImpl implements IErpGoodsService
         return response;
     }
 
+    @Override
+    public BaseResponse addGoodsScrm(ErpGoods goods) {
+        return null;
+    }
+
     @Override
     public ErpGoodsQueryResponse getGoods(ErpGoodsQueryRequert requert) {
         FsSysConfig sysConfig = configUtil.getSysConfig();
@@ -60,6 +65,11 @@ public class ErpGoodsServiceImpl implements IErpGoodsService
         return response;
     }
 
+    @Override
+    public ErpGoodsQueryResponse getGoodsScrm(ErpGoodsQueryRequert param) {
+        return null;
+    }
+
     @Override
     public ErpGoodsStockQueryResponse getGoodsStock(ErpGoodsStockQueryRequert requert) {
         FsSysConfig sysConfig = configUtil.getSysConfig();
@@ -76,4 +86,9 @@ public class ErpGoodsServiceImpl implements IErpGoodsService
         ErpGoodsStockQueryResponse response=JSONUtil.toBean(result, ErpGoodsStockQueryResponse.class);
         return response;
     }
+
+    @Override
+    public ErpGoodsStockQueryResponse getGoodsStockScrm(ErpGoodsStockQueryRequert param) {
+        return null;
+    }
 }

+ 176 - 0
fs-service/src/main/java/com/fs/erp/service/impl/FsJstAftersalePushScrmServiceImpl.java

@@ -0,0 +1,176 @@
+package com.fs.erp.service.impl;
+
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
+import com.fs.common.utils.ExceptionUtil;
+import com.fs.common.utils.StringUtils;
+import com.fs.erp.constant.AfterSalesOrderStatusEnum;
+import com.fs.erp.constant.TaskStatusEnum;
+import com.fs.erp.domain.FsJstAftersalePush;
+import com.fs.erp.dto.*;
+import com.fs.erp.http.JstErpHttpService;
+import com.fs.erp.mapper.FsJstAftersalePushMapper;
+import com.fs.erp.mapper.FsJstAftersalePushScrmMapper;
+import com.fs.erp.service.FsJstAftersalePushScrmService;
+import com.fs.erp.service.FsJstAftersalePushService;
+import com.fs.his.domain.FsStoreAfterSales;
+import com.fs.his.dto.FsStoreCartDTO;
+import com.fs.his.mapper.FsStoreAfterSalesMapper;
+import com.fs.hisStore.domain.FsStoreAfterSalesScrm;
+import com.fs.hisStore.domain.FsStoreOrderItemScrm;
+import com.fs.hisStore.domain.FsStoreOrderScrm;
+import com.fs.hisStore.mapper.FsStoreAfterSalesScrmMapper;
+import com.fs.hisStore.mapper.FsStoreOrderScrmMapper;
+import com.fs.hisStore.service.IFsStoreOrderItemScrmService;
+import com.fs.ybPay.dto.RefundOrderDTO;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.util.Asserts;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+@Slf4j
+@Service
+public class FsJstAftersalePushScrmServiceImpl implements FsJstAftersalePushScrmService {
+
+    @Autowired
+    private FsJstAftersalePushScrmMapper fsJstAftersalePushMapper;
+
+    @Autowired
+    private JstErpHttpService jstErpHttpService;
+
+    @Autowired
+    private FsStoreOrderScrmMapper fsStoreOrderMapper;
+
+    @Autowired
+    private IFsStoreOrderItemScrmService storeOrderItemService;
+
+    @Autowired
+    private FsStoreAfterSalesScrmMapper fsStoreAfterSalesMapper;
+
+    @Value("${jst.shop_code:''}")
+    private String shopId;
+    @Override
+    public void pushJst() {
+        List<FsJstAftersalePush> fsJstAftersalePushes = fsJstAftersalePushMapper.queryPenddingData();
+
+        for (FsJstAftersalePush item : fsJstAftersalePushes) {
+            item.setTaskStatus(TaskStatusEnum.PROCESSING.getCode());
+            int update = fsJstAftersalePushMapper.update(item);
+            if(update <= 0){
+                log.info("获取记录{} 锁失败!",item.getId());
+                continue;
+            }
+
+            FsStoreOrderScrm fsStoreOrder = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(item.getOrderId());
+
+            item.setRetryCount(item.getRetryCount()+1);
+
+            if(fsStoreOrder == null){
+                item.setErrorMessage("该订单未找到!");
+                item.setTaskStatus(TaskStatusEnum.FAILED.getCode());
+                log.info("该订单未找到!");
+                fsJstAftersalePushMapper.update(item);
+                continue;
+            }
+            Asserts.notNull(fsStoreOrder,"该订单未找到!");
+            RefundOrderDTO dto;
+            dto = getAfterSaleDTO(item, fsStoreOrder);
+            // 买家已经申请,等待卖家同意
+            if(StringUtils.equals(AfterSalesOrderStatusEnum.WAIT_SELLER_AGREE.getIndex().toString()
+                    ,item.getType())){
+
+            // 买家已经退货,等待卖家确认收货
+            } else if(StringUtils.equals(AfterSalesOrderStatusEnum.WAIT_SELLER_CONFIRM_GOODS.getIndex().toString(),
+                    item.getType())){
+                // 查询售后单 同步快递单号过去
+                FsStoreAfterSalesScrm fsStoreAfterSales = fsStoreAfterSalesMapper.selectFsStoreAfterSalesById(item.getId());
+//                dto.setLogisticsCompany(fsStoreAfterSales.getDeliverySn());
+                dto.setLogisticsCompany(fsStoreAfterSales.getDeliveryName());
+//                dto.setLId(fsStoreAfterSales.getDeliveryId());
+                dto.setLId(fsStoreAfterSales.getDeliverySn());
+
+            // 售后关闭
+            } else if(StringUtils.equals(AfterSalesOrderStatusEnum.CLOSED.getIndex().toString(),item.getType())) {
+
+            // 退款成功
+            } else if(StringUtils.equals(AfterSalesOrderStatusEnum.SUCCESS.getIndex().toString(),item.getType())) {
+
+            // 确认
+            }
+
+
+            if(!StringUtils.equals(AfterSalesOrderStatusEnum.CONFIRM.getIndex().toString(),item.getType())) {
+                try{
+                    CommonResponse<AfterSaleResponseDTO> response = jstErpHttpService.aftersaleUpload(dto);
+                    item.setParams(JSON.toJSONString(dto));
+                    item.setResult(JSON.toJSONString(response));
+                    item.setTaskStatus(TaskStatusEnum.SUCCESS.getCode());
+                }catch (Exception e) {
+                    item.setErrorMessage(ExceptionUtil.getExceptionMessage(e));
+                    item.setTaskStatus(TaskStatusEnum.FAILED.getCode());
+                }
+
+            // 如果是确认类型
+            } else{
+                AfterSaleConfirmRequestDTO requestDTO = new AfterSaleConfirmRequestDTO();
+
+                requestDTO.setAsIds(Collections.singletonList(Long.valueOf(item.getAfterSaleId())));
+                requestDTO.setExchangeForce(true);
+                requestDTO.setConfirmRefund(true);
+
+                try{
+                    CommonResponse<AssetProcessResultDTO> response = jstErpHttpService.aftersaleConfirm(requestDTO);
+                    item.setParams(JSON.toJSONString(dto));
+                    item.setResult(JSON.toJSONString(response));
+                    item.setTaskStatus(TaskStatusEnum.SUCCESS.getCode());
+                }catch (Exception e){
+                    item.setErrorMessage(ExceptionUtil.getExceptionMessage(e));
+                    item.setTaskStatus(TaskStatusEnum.FAILED.getCode());
+                }
+            }
+
+            fsJstAftersalePushMapper.update(item);
+        }
+    }
+
+    private RefundOrderDTO getAfterSaleDTO(FsJstAftersalePush item, FsStoreOrderScrm fsStoreOrder) {
+        RefundOrderDTO dto = new RefundOrderDTO();
+        AfterSalesOrderStatusEnum statusEnum = AfterSalesOrderStatusEnum.getByIndex(Integer.valueOf(item.getType()));
+
+        dto.setShopStatus(statusEnum.getCode());
+        dto.setQuestionType("可更新");
+        dto.setOuterAsId(item.getAfterSaleId());
+        dto.setRemark("用户退款");
+        dto.setType("仅退款");
+
+        dto.setShopId(Long.parseLong(shopId));
+        dto.setTotalAmount(fsStoreOrder.getTotalPrice());
+        dto.setSoId(item.getOrderId());
+        dto.setRefund(fsStoreOrder.getPayMoney());
+
+
+        FsStoreOrderItemScrm itemMap=new FsStoreOrderItemScrm();
+//        itemMap.setOrderId(fsStoreOrder.getId());
+        itemMap.setOrderId(fsStoreOrder.getId());
+        List<FsStoreOrderItemScrm> orderItems=storeOrderItemService.selectFsStoreOrderItemList(itemMap);
+        List<RefundItemDTO> refundItemDTOS=new ArrayList<>();
+
+        for(FsStoreOrderItemScrm orderItem: orderItems) {
+            FsStoreCartDTO cartDTO = JSONUtil.toBean(orderItem.getJsonInfo(), FsStoreCartDTO.class);
+
+            RefundItemDTO itemDTO = new RefundItemDTO();
+            itemDTO.setSkuId(cartDTO.getBarCode());
+            itemDTO.setQty(cartDTO.getNum());
+            itemDTO.setAmount(cartDTO.getPrice());
+            itemDTO.setType("退货");
+            refundItemDTOS.add(itemDTO);
+        }
+        dto.setItems(refundItemDTOS);
+        return dto;
+    }
+}

+ 55 - 0
fs-service/src/main/java/com/fs/erp/service/impl/FsJstCodPushScrmServiceImpl.java

@@ -0,0 +1,55 @@
+package com.fs.erp.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fs.erp.constant.TaskStatusEnum;
+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.mapper.FsJstCodPushScrmMapper;
+import com.fs.erp.service.FsJstCodPushScrmService;
+import com.fs.erp.service.FsJstCodPushService;
+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 FsJstCodPushScrmServiceImpl implements FsJstCodPushScrmService {
+    @Autowired
+    private FsJstCodPushScrmMapper 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);
+        }
+    }
+}

+ 15 - 0
fs-service/src/main/java/com/fs/erp/service/impl/HzOMSErpGoodsServiceImpl.java

@@ -48,16 +48,31 @@ public class HzOMSErpGoodsServiceImpl implements IErpGoodsService {
         return null;
     }
 
+    @Override
+    public BaseResponse addGoodsScrm(ErpGoods goods) {
+        return null;
+    }
+
     @Override
     public ErpGoodsQueryResponse getGoods(ErpGoodsQueryRequert param) {
         return null;
     }
 
+    @Override
+    public ErpGoodsQueryResponse getGoodsScrm(ErpGoodsQueryRequert param) {
+        return null;
+    }
+
     @Override
     public ErpGoodsStockQueryResponse getGoodsStock(ErpGoodsStockQueryRequert param) {
         return null;
     }
 
+    @Override
+    public ErpGoodsStockQueryResponse getGoodsStockScrm(ErpGoodsStockQueryRequert param) {
+        return null;
+    }
+
     /**
      * 构建店铺商品上传的参数
      *

+ 93 - 0
fs-service/src/main/java/com/fs/erp/service/impl/JSTErpGoodsServiceImpl.java

@@ -11,6 +11,10 @@ import com.fs.his.domain.FsStoreProduct;
 import com.fs.his.domain.FsStoreProductAttrValue;
 import com.fs.his.service.IFsStoreProductAttrValueService;
 import com.fs.his.service.IFsStoreProductService;
+import com.fs.hisStore.domain.FsStoreProductAttrValueScrm;
+import com.fs.hisStore.domain.FsStoreProductScrm;
+import com.fs.hisStore.service.IFsStoreProductAttrValueScrmService;
+import com.fs.hisStore.service.IFsStoreProductScrmService;
 import com.fs.voice.utils.StringUtil;
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -29,9 +33,13 @@ public class JSTErpGoodsServiceImpl implements IErpGoodsService {
 
     @Autowired
     private IFsStoreProductService fsStoreProductService;
+    @Autowired
+    private IFsStoreProductScrmService fsStoreProductScrmService;
 
     @Autowired
     private IFsStoreProductAttrValueService fsStoreProductAttrValueService;
+    @Autowired
+    private IFsStoreProductAttrValueScrmService fsStoreProductAttrValueScrmService;
 
     // 每次最大处理数量
     private static final int BATCH_SIZE = 190;
@@ -52,6 +60,21 @@ public class JSTErpGoodsServiceImpl implements IErpGoodsService {
         return null;
     }
 
+    @Override
+    public BaseResponse addGoodsScrm(ErpGoods goods) {
+        List<Long> storeProductIds = goods.getProductIdList();
+        JSONArray bulidJSONArray = buildGoodsScrm(storeProductIds);
+
+        //调用接口
+        for (int i = 0; i < bulidJSONArray.size(); i += BATCH_SIZE) {
+            JSONObject request=new JSONObject();
+            int end = Math.min(i + BATCH_SIZE, bulidJSONArray.size());
+            request.put("items",bulidJSONArray.subList(i, end));
+            jstErpHttpService.uploadGoods(request);
+        }
+        return null;
+    }
+
     @Override
     public ErpGoodsQueryResponse getGoods(ErpGoodsQueryRequert param) {
         ProductQueryRequestDTO requestDTO = new ProductQueryRequestDTO();
@@ -77,11 +100,81 @@ public class JSTErpGoodsServiceImpl implements IErpGoodsService {
         return erpGoodsQueryResponse;
     }
 
+    @Override
+    public ErpGoodsQueryResponse getGoodsScrm(ErpGoodsQueryRequert param) {
+        ProductQueryRequestDTO requestDTO = new ProductQueryRequestDTO();
+        requestDTO.setSkuIds(param.getCode());
+        ProductResponseDTO productResponseDTO = jstErpHttpService.queryGoods(requestDTO);
+        List<ProductResponseDTO.ProductInfo> datas = productResponseDTO.getDatas();
+        ErpGoodsQueryResponse erpGoodsQueryResponse = new ErpGoodsQueryResponse();
+        if (CollectionUtils.isNotEmpty(datas)) {
+            List<ErpGoods> erpGoodsList = new ArrayList<>();
+            for (ProductResponseDTO.ProductInfo data : datas) {
+                ErpGoods erpGoods = new ErpGoods();
+                erpGoods.setCode(data.getSkuCode());
+                erpGoods.setName(data.getName());
+                erpGoods.setSimple_name(data.getShortName());
+                erpGoods.setCategory_code(data.getCategory());
+                erpGoods.setCost_price(data.getCostPrice());
+                erpGoods.setSales_price(data.getSalePrice());
+                erpGoods.setPurchase_price(data.getMarketPrice());
+                erpGoodsList.add(erpGoods);
+            }
+            erpGoodsQueryResponse.setItems(erpGoodsList);
+        }
+        return erpGoodsQueryResponse;
+    }
+
     @Override
     public ErpGoodsStockQueryResponse getGoodsStock(ErpGoodsStockQueryRequert param) {
         return null;
     }
 
+    @Override
+    public ErpGoodsStockQueryResponse getGoodsStockScrm(ErpGoodsStockQueryRequert param) {
+        return null;
+    }
+    /**
+     * 构建店铺商品上传的参数
+     *
+     * @param storeProductIds
+     * @return
+     */
+    public JSONArray buildGoodsScrm(List<Long> storeProductIds) {
+        JSONArray res = new JSONArray();
+        //商品
+        List<FsStoreProductScrm> fsStoreProductList = fsStoreProductScrmService.getStoreProductInProductIds(storeProductIds);
+        if (!fsStoreProductList.isEmpty()) {
+
+            Map<Long, FsStoreProductScrm> productMap = fsStoreProductList.stream().collect(Collectors.toMap(FsStoreProductScrm::getProductId, p -> p));
+            //商品规格List
+            List<FsStoreProductAttrValueScrm> fsStoreProductAttrValues = fsStoreProductAttrValueScrmService.getFsStoreProductAttrValueListInProductId(storeProductIds);
+
+            //按规格构建商品数据
+            fsStoreProductAttrValues.forEach(v -> {
+                JSONObject productJson = new JSONObject();
+                FsStoreProductScrm product = productMap.get(v.getProductId());
+                productJson.put("sku_id", v.getBarCode());//商品编码
+                productJson.put("i_id", v.getBarCode());//如果没有款式默认商品编码一致
+                productJson.put("name", v.getSku());//名称
+                productJson.put("short_name", product.getKeyword());//简称
+                if(StringUtils.isNotEmpty(product.getBrand())){
+                    productJson.put("brand", product.getBrand());//品牌
+                }
+                productJson.put("weight", v.getWeight());//重量
+                productJson.put("s_price",v.getPrice());//基本售价
+                productJson.put("c_price", v.getCost());//成本
+                productJson.put("market_price", v.getOtPrice());//市场|吊牌价
+                productJson.put("unit", product.getUnitName());//单位
+                productJson.put("sku_pic", v.getImage());//商品图片
+                productJson.put("pic", v.getImage());//图片地址(款图片)
+                productJson.put("pic_big", v.getImage());//大图地址
+                res.add(productJson);
+            });
+        }
+
+        return res;
+    }
     /**
      * 构建店铺商品上传的参数
      *

+ 24 - 12
fs-service/src/main/java/com/fs/erp/service/impl/JSTErpOrderServiceImpl.java

@@ -12,7 +12,9 @@ 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.FsJstAftersalePushScrmMapper;
 import com.fs.erp.mapper.FsJstCodPushMapper;
+import com.fs.erp.mapper.FsJstCodPushScrmMapper;
 import com.fs.erp.service.IErpOrderService;
 import com.fs.his.domain.FsStoreOrder;
 import com.fs.his.domain.FsStoreOrderItem;
@@ -27,6 +29,7 @@ import com.fs.hisStore.domain.FsStoreProductScrm;
 import com.fs.hisStore.service.IFsStoreOrderItemScrmService;
 import com.fs.hisStore.service.IFsStoreOrderScrmService;
 import com.fs.hisStore.service.IFsStoreProductScrmService;
+import com.fs.hisStore.service.impl.FsStoreProductScrmServiceImpl;
 import com.fs.hisStore.vo.FsStoreOrderItemVO;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.ObjectUtils;
@@ -58,15 +61,20 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
     private IFsStoreOrderItemService fsStoreOrderItemService;
     @Autowired
     private IFsStoreOrderItemScrmService fsStoreOrderItemScrmService;
-
     @Autowired
     private IFsStoreProductService fsStoreProductService;
-    @Autowired
-    private IFsStoreProductScrmService fsStoreProductScrmService;
 
     @Autowired
     private FsJstCodPushMapper fsJstCodPushMapper;
 
+    @Autowired
+    private FsJstAftersalePushScrmMapper fsJstAftersalePushScrmMapper;
+    @Autowired
+    private FsJstCodPushScrmMapper fsJstCodPushScrmMapper;
+
+    @Autowired
+    private IFsStoreProductScrmService fsStoreProductScrmService;
+
     @Override
     public ErpOrderResponse addOrder(ErpOrder order) {
         FsStoreOrder fsStoreOrder = fsStoreOrderService.selectFsStoreOrderByOrderCode(order.getPlatform_code());
@@ -295,7 +303,7 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
             fsJstCodPush.setParams(JSON.toJSONString(shopOrderDTO));
             fsJstCodPush.setRetryCount(0);
             fsJstCodPush.setTaskStatus(TaskStatusEnum.PENDING.getCode());
-            fsJstCodPushMapper.insert(fsJstCodPush);
+            fsJstCodPushScrmMapper.insert(fsJstCodPush);
 
             //shopOrderDTO.setPay(paymentDTO);
         }
@@ -549,13 +557,17 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
     public BaseResponse refundUpdate(ErpRefundUpdateRequest param) {
 
         FsStoreOrder fsStoreOrder = fsStoreOrderService.selectFsStoreOrderByOrderCode(param.getTid());
-        //todo 待合并
-//        FsStoreDelivers byOrderCode = fsStoreDeliversMapper.findByOrderCode(fsStoreOrder.getOrderCode());
-        //todo
         // 发货后退款
-//        if(ObjectUtil.isNotNull(byOrderCode)){
+        if(ObjectUtils.equals(param.getOrderStatus(),2)){
+            FsJstAftersalePush fsJstAftersalePush = new FsJstAftersalePush();
+            fsJstAftersalePush.setOrderId(fsStoreOrder.getOrderCode());
+            fsJstAftersalePush.setTaskStatus(com.fs.hisStore.enums.TaskStatusEnum.PENDING.getCode());
+            fsJstAftersalePush.setType(String.valueOf(AfterSalesOrderStatusEnum.WAIT_SELLER_AGREE.getIndex()));
+            fsJstAftersalePush.setRetryCount(0);
+            fsJstAftersalePush.setAfterSaleId(String.valueOf(param.getStoreAfterSalesId()));
+            fsJstAftersalePushMapper.insert(fsJstAftersalePush);
 
-//        } else {
+        } else {
             // 如果是发货前退款,直接走取消订单流程
             // 如果是发货后退款,走售后流程
             OrderCancelRequestDTO requestDTO = new OrderCancelRequestDTO();
@@ -564,7 +576,7 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
             requestDTO.setRemark("用户退款");
 
             jstErpHttpService.cancel(requestDTO);
-//        }
+        }
 
 
         BaseResponse baseResponse = new BaseResponse();
@@ -574,7 +586,7 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
     }
 
     @Autowired
-    private FsJstAftersalePushMapper fsJstAftersalePushMapper;
+    private FsJstAftersalePushScrmMapper fsJstAftersalePushMapper;
 
     @Override
     public BaseResponse refundUpdateScrm(ErpRefundUpdateRequest param) {
@@ -590,7 +602,7 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
             fsJstAftersalePush.setType(String.valueOf(AfterSalesOrderStatusEnum.WAIT_SELLER_AGREE.getIndex()));
             fsJstAftersalePush.setRetryCount(0);
             fsJstAftersalePush.setAfterSaleId(String.valueOf(param.getStoreAfterSalesId()));
-            fsJstAftersalePushMapper.insert(fsJstAftersalePush);
+            fsJstAftersalePushScrmMapper.insert(fsJstAftersalePush);
 
         } else {
             // 如果是发货前退款,直接走取消订单流程

+ 15 - 0
fs-service/src/main/java/com/fs/erp/service/impl/K9StockScrmServiceImpl.java

@@ -36,11 +36,21 @@ public class K9StockScrmServiceImpl implements IErpGoodsService {
         return null;
     }
 
+    @Override
+    public BaseResponse addGoodsScrm(ErpGoods goods) {
+        return null;
+    }
+
     @Override
     public ErpGoodsQueryResponse getGoods(ErpGoodsQueryRequert param) {
         return null;
     }
 
+    @Override
+    public ErpGoodsQueryResponse getGoodsScrm(ErpGoodsQueryRequert param) {
+        return null;
+    }
+
     @Override
     public ErpGoodsStockQueryResponse getGoodsStock(ErpGoodsStockQueryRequert param) {
         String barcode = param.getBarcode();
@@ -63,6 +73,11 @@ public class K9StockScrmServiceImpl implements IErpGoodsService {
         return response;
     }
 
+    @Override
+    public ErpGoodsStockQueryResponse getGoodsStockScrm(ErpGoodsStockQueryRequert param) {
+        return null;
+    }
+
     /**
      * 查看库存
      * @param request 参数

+ 15 - 0
fs-service/src/main/java/com/fs/erp/service/impl/WdtErpGoodsServiceImpl.java

@@ -35,6 +35,11 @@ public class WdtErpGoodsServiceImpl implements IErpGoodsService {
         return null;
     }
 
+    @Override
+    public BaseResponse addGoodsScrm(ErpGoods goods) {
+        return null;
+    }
+
     @Override
     public ErpGoodsQueryResponse getGoods(ErpGoodsQueryRequert param) {
         Map<String,String> map = new HashMap<>();
@@ -81,6 +86,11 @@ public class WdtErpGoodsServiceImpl implements IErpGoodsService {
 
     }
 
+    @Override
+    public ErpGoodsQueryResponse getGoodsScrm(ErpGoodsQueryRequert param) {
+        return null;
+    }
+
     @Override
     public ErpGoodsStockQueryResponse getGoodsStock(ErpGoodsStockQueryRequert param) {
         String barcode = param.getBarcode();
@@ -115,5 +125,10 @@ public class WdtErpGoodsServiceImpl implements IErpGoodsService {
             throw new RuntimeException(e);
         }
     }
+
+    @Override
+    public ErpGoodsStockQueryResponse getGoodsStockScrm(ErpGoodsStockQueryRequert param) {
+        return null;
+    }
 }
 

+ 1 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsStoreProductServiceImpl.java

@@ -527,6 +527,7 @@ public class FsStoreProductServiceImpl implements IFsStoreProductService {
                 } else if (erpType == 5){
                     //聚水潭商品同步
                     params.setProductIdList(Arrays.asList(product.getProductId()));
+                    
                     jSTErpGoodsService.addGoods(params);
                 }
             }

+ 108 - 0
fs-service/src/main/java/com/fs/hisStore/constants/ErpTypeEnum.java

@@ -0,0 +1,108 @@
+package com.fs.hisStore.constants;
+
+import java.util.Arrays;
+import java.util.Objects;
+
+/**
+ * ERP系统类型枚举
+ *
+ * @author YourName
+ */
+public enum ErpTypeEnum {
+
+    /**
+     * 管易
+     */
+    GUANYI(1, "管易"),
+
+    /**
+     * 旺店通
+     */
+    WANGDIANGTONG(2, "旺店通"),
+
+    /**
+     * 瀚智OMS
+     */
+    HANZHIOMS(3, "瀚智OMS"),
+
+    /**
+     * 代服
+     */
+    DAIFU(4, "代服"),
+
+    /**
+     * 聚水潭
+     */
+    JUSHUITAN(5, "聚水潭"),
+
+    /**
+     * 金博
+     */
+    JINBO(6, "金博");
+
+    /**
+     * ERP系统类型编码
+     */
+    private final Integer code;
+
+    /**
+     * ERP系统类型描述
+     */
+    private final String desc;
+
+    /**
+     * 构造方法
+     *
+     * @param code ERP系统类型编码
+     * @param desc ERP系统类型描述
+     */
+    ErpTypeEnum(Integer code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    /**
+     * 根据编码获取枚举
+     *
+     * @param code ERP系统类型编码
+     * @return 对应的枚举实例,如果未找到返回null
+     */
+    public static ErpTypeEnum getByCode(Integer code) {
+        if (code == null) {
+            return null;
+        }
+
+        return Arrays.stream(ErpTypeEnum.values())
+                .filter(erpType -> Objects.equals(erpType.getCode(), code))
+                .findFirst()
+                .orElse(null);
+    }
+
+    /**
+     * 判断编码是否有效
+     *
+     * @param code ERP系统类型编码
+     * @return 是否有效
+     */
+    public static boolean isValidCode(Integer code) {
+        return getByCode(code) != null;
+    }
+
+    /**
+     * 获取ERP系统类型编码
+     *
+     * @return ERP系统类型编码
+     */
+    public Integer getCode() {
+        return code;
+    }
+
+    /**
+     * 获取ERP系统类型描述
+     *
+     * @return ERP系统类型描述
+     */
+    public String getDesc() {
+        return desc;
+    }
+}

+ 24 - 0
fs-service/src/main/java/com/fs/hisStore/constants/UserAppsLockConstant.java

@@ -0,0 +1,24 @@
+package com.fs.hisStore.constants;
+
+public interface UserAppsLockConstant {
+    /**
+     * APP商城-支付
+     */
+    public static final String LOCK_KEY_PAY = "payment:lock:%d";
+
+    /**
+     * APP商城-支付尾款
+     */
+    public static final String LOCK_KEY_PAY_REMAIN = "payment:remain:lock:%d";
+
+
+    /**
+     * APP商城-取消支付
+     */
+    public static final String LOCK_KEY_CANCEL = "order:cancel:%d";
+
+    /**
+     * 修改支付类型
+     */
+    public static final String LOCK_KEY_EDIT_PAY_TYPE = "payment:paytype:lock:%d";
+}

+ 2 - 0
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductAttrValueScrmMapper.java

@@ -145,4 +145,6 @@ public interface FsStoreProductAttrValueScrmMapper
             "        </foreach>"+
             "</script>"})
     void updateFsStoreProductAttrValuePrice(List<Long> ids, double v);
+
+    List<FsStoreProductAttrValueScrm> getFsStoreProductAttrValueListInProductId(List<Long> productIds);
 }

+ 2 - 0
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductScrmMapper.java

@@ -408,4 +408,6 @@ public interface FsStoreProductScrmMapper
     List<FsStoreProductActivityListVO> selectFsStoreProductByIdsAudit(String productIds,@Param("config") MedicalMallConfig  config);
 
     List<FsStoreProductScrm> bulkCopyFsStoreProductByIds(Long[] productIds);
+
+    List<FsStoreProductScrm> getStoreProductInProductIds(List<Long> productIds);
 }

+ 12 - 0
fs-service/src/main/java/com/fs/hisStore/service/IFsStoreOrderScrmService.java

@@ -282,4 +282,16 @@ public interface IFsStoreOrderScrmService
      * @param dtoList 订单数据
      * **/
     R importDeliveryNoteExpress(List<FsOrderDeliveryNoteDTO> dtoList);
+
+    R pay(FsStoreOrderPayParam param);
+
+    void cancelPay(FsStoreOrderPayParam param);
+
+    R otherPaymentRemain(FsStoreOrderOtherPayParam param);
+
+    R otherPayment(FsStoreOrderOtherPayParam param);
+
+    R payRemain(FsStoreOrderPayParam param);
+
+    R editPayType(FsStoreOrderPayParam param);
 }

+ 9 - 7
fs-service/src/main/java/com/fs/hisStore/service/IFsStoreProductAttrValueScrmService.java

@@ -11,7 +11,7 @@ import com.fs.hisStore.vo.FsStoreTuiProductAttrValueVO;
 
 /**
  * 商品属性值Service接口
- * 
+ *
  * @author fs
  * @date 2022-03-15
  */
@@ -19,7 +19,7 @@ public interface IFsStoreProductAttrValueScrmService
 {
     /**
      * 查询商品属性值
-     * 
+     *
      * @param id 商品属性值ID
      * @return 商品属性值
      */
@@ -27,7 +27,7 @@ public interface IFsStoreProductAttrValueScrmService
 
     /**
      * 查询商品属性值列表
-     * 
+     *
      * @param fsStoreProductAttrValue 商品属性值
      * @return 商品属性值集合
      */
@@ -35,7 +35,7 @@ public interface IFsStoreProductAttrValueScrmService
 
     /**
      * 新增商品属性值
-     * 
+     *
      * @param fsStoreProductAttrValue 商品属性值
      * @return 结果
      */
@@ -43,7 +43,7 @@ public interface IFsStoreProductAttrValueScrmService
 
     /**
      * 修改商品属性值
-     * 
+     *
      * @param fsStoreProductAttrValue 商品属性值
      * @return 结果
      */
@@ -51,7 +51,7 @@ public interface IFsStoreProductAttrValueScrmService
 
     /**
      * 批量删除商品属性值
-     * 
+     *
      * @param ids 需要删除的商品属性值ID
      * @return 结果
      */
@@ -59,7 +59,7 @@ public interface IFsStoreProductAttrValueScrmService
 
     /**
      * 删除商品属性值信息
-     * 
+     *
      * @param id 商品属性值ID
      * @return 结果
      */
@@ -75,4 +75,6 @@ public interface IFsStoreProductAttrValueScrmService
 
 
     List<FsStoreTuiProductAttrValueVO> selectStoreTuiProductAttrValueVOList(FsStoreTuiProductAttrValueParam param);
+
+    List<FsStoreProductAttrValueScrm> getFsStoreProductAttrValueListInProductId(List<Long> storeProductIds);
 }

+ 3 - 0
fs-service/src/main/java/com/fs/hisStore/service/IFsStoreProductScrmService.java

@@ -4,6 +4,7 @@ import java.util.List;
 import java.util.Map;
 
 import com.fs.common.core.domain.R;
+import com.fs.his.domain.FsStoreProduct;
 import com.fs.hisStore.domain.FsStoreProductScrm;
 import com.fs.hisStore.domain.FsStoreProductRuleScrm;
 import com.fs.his.param.FsStoreProductListSParam;
@@ -137,4 +138,6 @@ public interface IFsStoreProductScrmService
     List<FsStoreProductActivityListVO> selectFsStoreProductByIdsAudit(String productIds);
 
     R bulkCopyFsStoreProductByIds(Long[] productIds);
+
+    List<FsStoreProductScrm> getStoreProductInProductIds(List<Long> storeProductIds);
 }

+ 11 - 1
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreAfterSalesScrmServiceImpl.java

@@ -23,6 +23,7 @@ import com.fs.erp.domain.FsJstAftersalePush;
 import com.fs.erp.dto.BaseResponse;
 import com.fs.erp.dto.ErpRefundUpdateRequest;
 import com.fs.erp.mapper.FsJstAftersalePushMapper;
+import com.fs.erp.mapper.FsJstAftersalePushScrmMapper;
 import com.fs.erp.service.IErpOrderService;
 import com.fs.his.config.FsSysConfig;
 import com.fs.his.domain.*;
@@ -524,6 +525,15 @@ public class FsStoreAfterSalesScrmServiceImpl implements IFsStoreAfterSalesScrmS
         storeAfterSales.setDeliverySn(param.getDeliverySn());
         storeAfterSales.setDeliveryName(param.getDeliveryName());
 
+        if("益善缘".equals(cloudHostProper.getCompanyName())){
+            FsJstAftersalePush fsJstAftersalePush = new FsJstAftersalePush();
+            fsJstAftersalePush.setOrderId(storeAfterSales.getOrderCode());
+            fsJstAftersalePush.setTaskStatus(TaskStatusEnum.PENDING.getCode());
+            fsJstAftersalePush.setType(String.valueOf(AfterSalesOrderStatusEnum.WAIT_SELLER_CONFIRM_GOODS.getIndex()));
+            fsJstAftersalePush.setAfterSaleId(String.valueOf(storeAfterSales.getId()));
+            fsJstAftersalePush.setRetryCount(0);
+            fsJstAftersalePushMapper.insert(fsJstAftersalePush);
+        }
         //操作记录
         FsStoreAfterSalesStatusScrm storeAfterSalesStatus = new FsStoreAfterSalesStatusScrm();
         storeAfterSalesStatus.setStoreAfterSalesId(storeAfterSales.getId());
@@ -825,7 +835,7 @@ public class FsStoreAfterSalesScrmServiceImpl implements IFsStoreAfterSalesScrmS
 
 
     @Autowired
-    private FsJstAftersalePushMapper fsJstAftersalePushMapper;
+    private FsJstAftersalePushScrmMapper fsJstAftersalePushMapper;
 
     //平台撤销
     @Override

+ 2 - 2
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreCartScrmServiceImpl.java

@@ -233,7 +233,7 @@ public class FsStoreCartScrmServiceImpl implements IFsStoreCartScrmService
                 //单品
                 ErpGoodsStockQueryRequert queryRequert = new ErpGoodsStockQueryRequert();
                 queryRequert.setBarcode(productAttrValue.getBarCode());
-                ErpGoodsStockQueryResponse goodsStock = goodsService.getGoodsStock(queryRequert);
+                ErpGoodsStockQueryResponse goodsStock = goodsService.getGoodsStockScrm(queryRequert);
                 if(goodsStock != null && goodsStock.getStocks() != null && !goodsStock.getStocks().isEmpty()){
 
 //                    int stocks = Double.valueOf(goodsStock.getStocks().get(0).getSalable_qty()).intValue();
@@ -271,7 +271,7 @@ public class FsStoreCartScrmServiceImpl implements IFsStoreCartScrmService
                             FsStoreProductAttrValueScrm attrValue=valueMapper.selectFsStoreProductAttrValueById(dto.getId());
                             ErpGoodsStockQueryRequert queryRequert = new ErpGoodsStockQueryRequert();
                             queryRequert.setBarcode(attrValue.getGroupBarCode());
-                            ErpGoodsStockQueryResponse goodsStock = goodsService.getGoodsStock(queryRequert);
+                            ErpGoodsStockQueryResponse goodsStock = goodsService.getGoodsStockScrm(queryRequert);
                             if(goodsStock != null && goodsStock.getStocks() != null && !goodsStock.getStocks().isEmpty()){
                                 int stocks = Integer.valueOf(goodsStock.getStocks().get(0).getSalable_qty());
 

+ 587 - 10
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java

@@ -1,5 +1,6 @@
 package com.fs.hisStore.service.impl;
 
+import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import cn.hutool.core.date.DateTime;
 import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.hutool.core.net.URLDecoder;
@@ -11,6 +12,7 @@ import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.TypeReference;
 import com.fs.api.param.OrderListParam;
 import com.fs.api.vo.OrderListVO;
 import com.fs.api.vo.ProductListVO;
@@ -23,7 +25,10 @@ import com.fs.common.event.TemplateListenEnum;
 import com.fs.common.exception.CustomException;
 import com.fs.common.exception.ServiceException;
 import com.fs.common.utils.DateUtils;
+import com.fs.common.utils.IpUtil;
+import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.StringUtils;
+import com.fs.common.utils.ip.IpUtils;
 import com.fs.common.utils.spring.SpringUtils;
 import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyDept;
@@ -59,6 +64,7 @@ import com.fs.his.utils.ConfigUtil;
 import com.fs.his.vo.FsInquiryOrderVO;
 import com.fs.his.vo.FsStoreOrderExcelVO;
 import com.fs.hisStore.config.FsErpConfig;
+import com.fs.hisStore.constants.ErpTypeEnum;
 import com.fs.hisStore.dto.*;
 import com.fs.hisStore.mapper.*;
 import com.fs.hisStore.param.*;
@@ -68,9 +74,12 @@ import com.fs.hisapi.domain.ApiResponse;
 import com.fs.hisapi.param.CreateOrderParam;
 import com.fs.hisapi.param.RecipeDetailParam;
 import com.fs.hisapi.service.HisApiService;
+import com.fs.huifuPay.domain.HuiFuCreateOrder;
 import com.fs.huifuPay.domain.HuiFuRefundResult;
+import com.fs.huifuPay.domain.HuifuCreateOrderResult;
 import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayRefundRequest;
 import com.fs.huifuPay.service.HuiFuService;
+import com.fs.pay.pay.dto.OrderQueryDTO;
 import com.fs.pay.pay.dto.RefundDTO;
 import com.fs.pay.service.IPayService;
 import com.fs.hisStore.config.StoreConfig;
@@ -80,7 +89,10 @@ import com.fs.hisStore.domain.*;
 import com.fs.hisStore.enums.*;
 import com.fs.hisStore.service.*;
 import com.fs.system.service.ISysConfigService;
+import com.fs.wx.miniapp.config.WxMaProperties;
+import com.fs.ybPay.domain.OrderResult;
 import com.fs.ybPay.domain.RefundResult;
+import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
 import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
 import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
 import com.github.binarywang.wxpay.bean.result.WxPayRefundQueryResult;
@@ -90,7 +102,10 @@ import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.WxPayService;
 import lombok.Synchronized;
 import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang.ObjectUtils;
+import org.apache.http.util.Asserts;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.aop.framework.AopContext;
@@ -134,6 +149,7 @@ import static com.fs.hisStore.constants.StoreConstants.DELIVERY;
 @EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
 @Slf4j
 public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
+    private static final String STORE_PAY_CONF = "his.pay";
 
     Logger logger = LoggerFactory.getLogger(getClass());
     @Autowired
@@ -159,7 +175,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
     private IFsUserBillScrmService billService;
 
     @Autowired
-    RedisCache redisCache;
+    private RedisCache redisCache;
 
     @Autowired
     private IFsStoreCartScrmService cartService;
@@ -190,13 +206,13 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
     @Autowired
     private ConfigUtil configUtil;
     @Autowired
-    IFsStorePaymentScrmService paymentService;
+    private IFsStorePaymentScrmService paymentService;
 
     @Autowired
-    IFsStoreProductPackageScrmService productPackageService;
+    private IFsStoreProductPackageScrmService productPackageService;
 
     @Autowired
-    ICompanyUserService companyUserService;
+    private ICompanyUserService companyUserService;
     @Autowired
     private IFsStoreProductAttrValueScrmService attrValueService;
     @Autowired
@@ -225,15 +241,15 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
     private FsStorePaymentScrmMapper fsStorePaymentMapper;
 
     @Autowired
-    ICompanyDeptService companyDeptService;
+    private ICompanyDeptService companyDeptService;
     @Autowired
-    IFsPrescribeScrmService prescribeService;
+    private IFsPrescribeScrmService prescribeService;
 
     @Autowired
-    IPayService ybPayService;
+    private IPayService ybPayService;
 
     @Autowired
-    HuiFuService huiFuService;
+    private HuiFuService huiFuService;
     @Autowired
     private WxPayService wxPayService;
     @Autowired
@@ -316,7 +332,8 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
 
     @Autowired
     private FsPackageOrderMapper fsPackageOrderMapper;
-
+    @Autowired
+    private WxMaProperties properties;
     /**
      * 查询订单
      *
@@ -2182,7 +2199,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
         }
         ErpOrderQueryRequert request = new ErpOrderQueryRequert();
         request.setCode(order.getExtendOrderId());
-        ErpOrderQueryResponse response = erpOrderService.getOrder(request);
+        ErpOrderQueryResponse response = erpOrderService.getScrmOrder(request);
         if (response.getOrders() != null && response.getOrders().size() > 0) {
             for (ErpOrderQuery orderQuery : response.getOrders()) {
                 if (orderQuery.getDeliverys() != null && orderQuery.getDeliverys().size() > 0) {
@@ -2938,6 +2955,20 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
         return fsStoreOrderMapper.selectFsStoreOrderStatisticsByUserId(fsUserIdList);
     }
 
+
+    /**
+     * 获取当前ERP类型
+     * @return ERP类型
+     */
+    public ErpTypeEnum getErpType(){
+        FsSysConfig erpConfig = configUtil.getSysConfig();
+        Integer erpType = erpConfig.getErpType();
+        ErpTypeEnum byCode = ErpTypeEnum.getByCode(erpType);
+        Asserts.notNull(byCode,String.format("当前ERP 类型: %d 未找到!",erpType));
+        return byCode;
+    }
+
+
     private IErpOrderService getErpService() {
         //判断是否开启erp
         IErpOrderService erpOrderService = null;
@@ -3690,6 +3721,552 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
         }
     }
 
+    @Override
+    @Transactional(rollbackFor = Throwable.class,propagation = Propagation.REQUIRED)
+    public R pay(FsStoreOrderPayParam param) {
+        FsStoreOrderScrm order=this.selectFsStoreOrderById(param.getOrderId());
+        if(order==null){
+            return R.error("订单不存在");
+        }
+        if(order.getStatus()!= OrderInfoEnum.STATUS_0.getValue()){
+            return R.error("订单状态不正确");
+        }
+        String orderId=redisCache.getCacheObject("isPaying:"+param.getOrderId());
+        if(StringUtils.isNotEmpty(orderId)&&orderId.equals(order.getId().toString())){
+            return R.error("正在支付中...");
+        }
+
+        FsUserScrm user=userService.selectFsUserById(order.getUserId());
+        if(user!=null){
+            //已改价处理
+            if(order.getIsEditMoney()!=null&&order.getIsEditMoney()==1){
+                //改过价不做处理
+
+            }
+            else{
+                String config=configService.selectConfigByKey("his.store");
+                com.fs.store.config.StoreConfig storeConfig= JSONUtil.toBean(config, com.fs.store.config.StoreConfig.class);
+                if(param.getPayType().equals(1)){
+                    order.setPayType("1");
+                    order.setPayMoney(order.getPayPrice());
+                    order.setPayDelivery(BigDecimal.ZERO);
+                }
+                else if(param.getPayType().equals(2)){
+                    order.setPayType("2");
+                    BigDecimal payMoney=order.getPayPrice().multiply(new BigDecimal(storeConfig.getPayRate())).divide(new BigDecimal(100));
+                    payMoney=new BigDecimal(payMoney.setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
+                    order.setPayDelivery(order.getPayPrice().subtract(payMoney));
+                    order.setPayMoney(payMoney);
+                }
+                else if(param.getPayType().equals(3)){
+                    //货到付款
+                    order.setPayType("3");
+                    BigDecimal amount=redisCache.getCacheObject("orderAmount:"+order.getId());
+                    BigDecimal payMoney = BigDecimal.ZERO;
+                    if (amount != null){
+                        payMoney=amount;
+                    }
+                    order.setPayMoney(payMoney);
+                    order.setPayDelivery(order.getPayPrice().subtract(payMoney) );
+                }
+                this.updateFsStoreOrder(order);
+            }
+            String payCode = IdUtil.getSnowflake(0, 0).nextIdStr();
+            if((order.getPayType().equals("1")||order.getPayType().equals("2")||order.getPayType().equals("3")) && order.getPayMoney().compareTo(new BigDecimal(0))>0){
+                String json = configService.selectConfigByKey(STORE_PAY_CONF);
+                FsPayConfigScrm fsPayConfig = JSON.parseObject(json, FsPayConfigScrm.class);
+                FsStorePaymentScrm storePayment=new FsStorePaymentScrm();
+                storePayment.setCompanyId(order.getCompanyId());
+                storePayment.setCompanyUserId(order.getCompanyUserId());
+                storePayment.setPayMode(fsPayConfig.getType());
+                storePayment.setStatus(0);
+                storePayment.setPayCode(payCode);
+                storePayment.setPayMoney(order.getPayMoney());
+                storePayment.setCreateTime(new Date());
+                storePayment.setPayTypeCode("weixin");
+                storePayment.setBusinessType(2);
+                storePayment.setRemark("商城订单支付");
+                storePayment.setOpenId(user.getRealName());
+                storePayment.setUserId(user.getUserId());
+                storePayment.setBusinessOrderId(order.getId().toString());
+                storePayment.setOrderId(order.getId());
+                fsStorePaymentMapper.insertFsStorePayment(storePayment);
+
+                if (fsPayConfig.getType().equals("hf")){
+                    HuiFuCreateOrder o = new HuiFuCreateOrder();
+                    o.setTradeType("T_MINIAPP");
+                    o.setOpenid(user.getMaOpenId());
+                    o.setReqSeqId("store-"+storePayment.getPayCode());
+                    o.setTransAmt(storePayment.getPayMoney().toString());
+                    o.setGoodsDesc("商城订单支付");
+                    o.setAppId(param.getAppId());
+                    HuifuCreateOrderResult result = huiFuService.createOrder(o);
+                    if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
+                        FsStorePaymentScrm mt=new FsStorePaymentScrm();
+                        mt.setPaymentId(storePayment.getPaymentId());
+                        mt.setTradeNo(result.getHf_seq_id());
+                        mt.setAppId(param.getAppId());
+                        fsStorePaymentMapper.updateFsStorePayment(mt);
+                        redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
+                        Map<String, Object> resultMap = JSON.parseObject(result.getPay_info(), new TypeReference<Map<String, Object>>() {});
+                        String s = (String) resultMap.get("package");
+                        resultMap.put("packageValue",s);
+                        return R.ok().put("payType",param.getPayType()).put("result",resultMap);
+                    }
+                    else{
+                        return R.error(result.getResp_desc());
+                    }
+                }else  if (fsPayConfig.getType().equals("wx")){
+                    WxPayConfig payConfig = new WxPayConfig();
+                    payConfig.setAppId(fsPayConfig.getAppId());
+                    payConfig.setMchId(fsPayConfig.getWxMchId());
+                    payConfig.setMchKey(fsPayConfig.getWxMchKey());
+                    payConfig.setSubAppId(org.apache.commons.lang3.StringUtils.trimToNull(null));
+                    payConfig.setSubMchId(org.apache.commons.lang3.StringUtils.trimToNull(null));
+                    payConfig.setKeyPath(fsPayConfig.getKeyPath());
+                    payConfig.setNotifyUrl(fsPayConfig.getNotifyUrlScrm());
+                    wxPayService.setConfig(payConfig);
+                    WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
+                    orderRequest.setOpenid(user.getMaOpenId());//公众号支付提供用户openid
+                    orderRequest.setBody("商城订单支付");
+                    orderRequest.setOutTradeNo("store-" + storePayment.getPayCode());
+                    orderRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(storePayment.getPayMoney().toString()));//测试
+                    orderRequest.setTradeType("JSAPI");
+                    orderRequest.setSpbillCreateIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
+                    //调用统一下单接口,获取"预支付交易会话标识"
+                    try {
+                        WxPayMpOrderResult orderResult = wxPayService.createOrder(orderRequest);
+                        return R.ok().put("result", orderResult).put("type", "wx").put("isPay", 0).put("payType",param.getPayType());
+                    } catch (WxPayException e) {
+                        e.printStackTrace();
+                        throw new CustomException("支付失败" + e.getMessage());
+                    }
+                }
+            }
+            else if(order.getPayType().equals("3") && order.getPayMoney().compareTo(new BigDecimal(0))<=0){
+                //货到付款
+                IFsStoreOrderScrmService fsStoreOrderScrmService = (IFsStoreOrderScrmService) AopContext.currentProxy();
+                fsStoreOrderScrmService.payConfirm(2,order.getId(),null,null,null,null);
+                return R.ok().put("payType",param.getPayType());
+            }
+            return R.error();
+        }
+        else{
+            return R.error("用户OPENID不存在");
+        }
+    }
+
+    @Override
+    public void cancelPay(FsStoreOrderPayParam param) {
+        redisCache.deleteObject("isPaying:"+param.getOrderId());
+    }
+
+    @Override
+    @Transactional(rollbackFor = Throwable.class,propagation = Propagation.REQUIRED)
+    public R otherPaymentRemain(FsStoreOrderOtherPayParam param) {
+        final WxMaService wxService = WxMaConfiguration.getMaService(properties.getConfigs().get(0).getAppid());
+        try {
+            String ip = IpUtil.getRequestIp();
+            WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
+            FsUserScrm user=userService.selectFsUserByMaOpenId(session.getOpenid());
+            if(user==null){
+                //创建
+                user=new FsUserScrm();
+                user.setUsername("");
+                user.setNickname("微信用户");
+                user.setStatus(1);
+                user.setMaOpenId(session.getOpenid());
+                user.setUnionId(session.getUnionid());
+                user.setIsWeixinAuth(0);
+                user.setLastIp(ip);
+                user.setCreateTime(new Date());
+                userService.insertFsUser(user);
+            }
+            FsStoreOrderScrm order=this.selectFsStoreOrderById(param.getOrderId());
+            if(order==null){
+                return R.error("订单不存在");
+            }
+            if(order.getStatus()!= OrderInfoEnum.STATUS_2.getValue()){
+                return R.error("待收货订单可申请支付尾款");
+            }
+            if(order.getPayType().equals(1)){
+                return R.error("此订单已支付");
+            }
+            //只有顺风才可以付尾
+            if(!order.getDeliverySn().trim().equals("SF")){
+                return R.error("只有顺丰物流支持尾款支付");
+            }
+
+            if(!order.getIsPayRemain().equals(0)){
+                return R.error("此订单已支付");
+            }
+            String payCode = IdUtil.getSnowflake(0, 0).nextIdStr();
+            String json = configService.selectConfigByKey(STORE_PAY_CONF);
+            FsPayConfigScrm fsPayConfig = JSON.parseObject(json, FsPayConfigScrm.class);
+            FsStorePaymentScrm storePayment=new FsStorePaymentScrm();
+            storePayment.setCompanyId(order.getCompanyId());
+            storePayment.setCompanyUserId(order.getCompanyUserId());
+            storePayment.setStatus(0);
+            storePayment.setPayMode(fsPayConfig.getType());
+            storePayment.setPayCode(payCode);
+            storePayment.setPayMoney(order.getPayDelivery());
+            storePayment.setCreateTime(new Date());
+            storePayment.setPayTypeCode("weixin");
+            storePayment.setBusinessType(2);
+            storePayment.setRemark("商城订单尾款支付");
+            storePayment.setOpenId(user.getRealName());
+            storePayment.setUserId(user.getUserId());
+            storePayment.setBusinessOrderId(order.getId().toString());
+            storePayment.setOrderId(order.getId());
+            storePayment.setIsPayRemain(1);
+            fsStorePaymentMapper.insertFsStorePayment(storePayment);
+
+            if (fsPayConfig.getType().equals("hf")){
+                HuiFuCreateOrder o = new HuiFuCreateOrder();
+                o.setTradeType("T_MINIAPP");
+                o.setOpenid(user.getMaOpenId());
+                o.setReqSeqId("store-"+storePayment.getPayCode());
+                o.setTransAmt(storePayment.getPayMoney().toString());
+                o.setGoodsDesc("商城订单支付");
+                HuifuCreateOrderResult result = huiFuService.createOrder(o);
+                if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
+
+                    FsStorePaymentScrm mt=new FsStorePaymentScrm();
+                    mt.setPaymentId(storePayment.getPaymentId());
+                    mt.setTradeNo(result.getHf_seq_id());
+                    fsStorePaymentMapper.updateFsStorePayment(mt);
+                    redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
+                    Map<String, Object> resultMap = JSON.parseObject(result.getPay_info(), new TypeReference<Map<String, Object>>() {});
+                    String s = (String) resultMap.get("package");
+                    resultMap.put("packageValue",s);
+                    return R.ok().put("result",resultMap);
+                }
+                else{
+                    return R.error(result.getResp_desc());
+                }
+            }else  if (fsPayConfig.getType().equals("wx")){
+                //创建微信订单
+                WxPayConfig payConfig = new WxPayConfig();
+                payConfig.setAppId(fsPayConfig.getAppId());
+                payConfig.setMchId(fsPayConfig.getWxMchId());
+                payConfig.setMchKey(fsPayConfig.getWxMchKey());
+                payConfig.setSubAppId(org.apache.commons.lang3.StringUtils.trimToNull(null));
+                payConfig.setSubMchId(org.apache.commons.lang3.StringUtils.trimToNull(null));
+                payConfig.setKeyPath(null);
+                payConfig.setNotifyUrl(fsPayConfig.getNotifyUrlScrm());
+                wxPayService.setConfig(payConfig);
+                WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
+                orderRequest.setOpenid(user.getMaOpenId());//公众号支付提供用户openid
+                orderRequest.setBody("商城订单支付");
+                orderRequest.setOutTradeNo("store-" + storePayment.getPayCode());
+                orderRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(storePayment.getPayMoney().toString()));//测试
+                //orderRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(money));//测试
+                orderRequest.setTradeType("JSAPI");
+                orderRequest.setSpbillCreateIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
+                //调用统一下单接口,获取"预支付交易会话标识"
+                try {
+                    WxPayMpOrderResult orderResult = wxPayService.createOrder(orderRequest);
+                    return R.ok().put("result", orderResult).put("type", "wx").put("isPay", 0);
+                } catch (WxPayException e) {
+                    e.printStackTrace();
+                    throw new CustomException("支付失败" + e.getMessage());
+                }
+            }
+        } catch (WxErrorException e) {
+            e.printStackTrace();
+            return R.error(e.getMessage());
+        }
+        return R.error("无支付类型");
+    }
+
+    @Override
+    @Transactional(rollbackFor = Throwable.class,propagation = Propagation.REQUIRED)
+    public R otherPayment(FsStoreOrderOtherPayParam param) {
+        final WxMaService wxService = WxMaConfiguration.getMaService(properties.getConfigs().get(0).getAppid());
+        try {
+            String ip = IpUtil.getRequestIp();
+            WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
+            FsUserScrm user=userService.selectFsUserByMaOpenId(session.getOpenid());
+            if(user==null){
+                //创建
+                user=new FsUserScrm();
+                user.setUsername("");
+                user.setNickname("微信用户");
+                user.setStatus(1);
+                user.setMaOpenId(session.getOpenid());
+                user.setUnionId(session.getUnionid());
+                user.setIsWeixinAuth(0);
+                user.setLastIp(ip);
+                user.setCreateTime(new Date());
+                userService.insertFsUser(user);
+            }
+            FsStoreOrderScrm order=selectFsStoreOrderById(param.getOrderId());
+            if(order==null){
+                return R.error("订单不存在");
+            }
+            if(!Objects.equals(order.getStatus(), OrderInfoEnum.STATUS_0.getValue())){
+                return R.error("此订单不能支付");
+            }
+            if(order.getPayMoney().compareTo(new BigDecimal(0))<1){
+                return R.error("此订单没有可支付的金额");
+            }
+
+            String orderId=redisCache.getCacheObject("isPaying:"+order.getId());
+            if(StringUtils.isNotEmpty(orderId)&&orderId.equals(order.getId().toString())){
+                return R.error("正在支付中...");
+            }
+
+            String json = configService.selectConfigByKey(STORE_PAY_CONF);
+            FsPayConfigScrm fsPayConfig = JSON.parseObject(json, FsPayConfigScrm.class);
+            String payCode = IdUtil.getSnowflake(0, 0).nextIdStr();
+            //易宝支付
+            FsStorePaymentScrm storePayment=new FsStorePaymentScrm();
+            storePayment.setCompanyId(order.getCompanyId());
+            storePayment.setCompanyUserId(order.getCompanyUserId());
+            storePayment.setStatus(0);
+            storePayment.setPayCode(payCode);
+            storePayment.setPayMode(fsPayConfig.getType());
+            storePayment.setPayMoney(order.getPayMoney());
+            storePayment.setCreateTime(new Date());
+            storePayment.setPayTypeCode("weixin");
+            storePayment.setBusinessType(2);
+            storePayment.setRemark("商城订单支付");
+            storePayment.setOpenId(session.getOpenid());
+            storePayment.setUserId(user.getUserId());
+            storePayment.setBusinessOrderId(order.getId().toString());
+            storePayment.setOrderId(order.getId());
+            fsStorePaymentMapper.insertFsStorePayment(storePayment);
+
+            if (fsPayConfig.getType().equals("hf")){
+                HuiFuCreateOrder o = new HuiFuCreateOrder();
+                o.setTradeType("T_MINIAPP");
+                o.setOpenid(user.getMaOpenId());
+                o.setReqSeqId("store-"+storePayment.getPayCode());
+                o.setTransAmt(storePayment.getPayMoney().toString());
+                o.setGoodsDesc("商城订单支付");
+                HuifuCreateOrderResult result = huiFuService.createOrder(o);
+                if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
+
+                    FsStorePaymentScrm mt=new FsStorePaymentScrm();
+                    mt.setPaymentId(storePayment.getPaymentId());
+                    mt.setTradeNo(result.getHf_seq_id());
+                    fsStorePaymentMapper.updateFsStorePayment(mt);
+                    redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
+                    Map<String, Object> resultMap = JSON.parseObject(result.getPay_info(), new TypeReference<Map<String, Object>>() {});
+                    String s = (String) resultMap.get("package");
+                    resultMap.put("packageValue",s);
+                    return R.ok().put("result",resultMap);
+                }
+                else{
+                    return R.error(result.getResp_desc());
+                }
+            }else  if (fsPayConfig.getType().equals("wx")){
+                //创建微信订单
+                WxPayConfig payConfig = new WxPayConfig();
+                payConfig.setAppId(fsPayConfig.getAppId());
+                payConfig.setMchId(fsPayConfig.getWxMchId());
+                payConfig.setMchKey(fsPayConfig.getWxMchKey());
+                payConfig.setSubAppId(org.apache.commons.lang3.StringUtils.trimToNull(null));
+                payConfig.setSubMchId(org.apache.commons.lang3.StringUtils.trimToNull(null));
+                payConfig.setKeyPath(null);
+                payConfig.setNotifyUrl(fsPayConfig.getNotifyUrlScrm());
+                wxPayService.setConfig(payConfig);
+                WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
+                orderRequest.setOpenid(user.getMaOpenId());//公众号支付提供用户openid
+                orderRequest.setBody("商城订单支付");
+                orderRequest.setOutTradeNo("store-" + storePayment.getPayCode());
+                orderRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(storePayment.getPayMoney().toString()));//测试
+                orderRequest.setTradeType("JSAPI");
+                orderRequest.setSpbillCreateIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
+                //调用统一下单接口,获取"预支付交易会话标识"
+                try {
+                    WxPayMpOrderResult orderResult = wxPayService.createOrder(orderRequest);
+                    return R.ok().put("result", orderResult).put("type", "wx").put("isPay", 0);
+                } catch (WxPayException e) {
+                    e.printStackTrace();
+                    throw new CustomException("支付失败" + e.getMessage());
+                }
+            }
+        } catch (WxErrorException e) {
+            e.printStackTrace();
+            return R.error(e.getMessage());
+        }
+        return R.error("无支付类型");
+    }
+
+    @Override
+    @Transactional(rollbackFor = Throwable.class,propagation = Propagation.REQUIRED)
+    public R payRemain(FsStoreOrderPayParam param) {
+        FsStoreOrderScrm order=selectFsStoreOrderById(param.getOrderId());
+        if(order==null){
+            return R.error("订单不存在");
+        }
+        if(order.getStatus()!= OrderInfoEnum.STATUS_2.getValue()){
+            return R.error("待收货订单可申请支付尾款");
+        }
+        if(order.getPayType().equals(1)){
+            return R.error("此订单已支付");
+        }
+        //只有顺风才可以付尾
+        if(!order.getDeliverySn().trim().equals("SF")){
+            return R.error("只有顺丰物流支持尾款支付");
+        }
+
+        if(!order.getIsPayRemain().equals(0)){
+            return R.error("此订单已支付");
+        }
+        FsUserScrm user=userService.selectFsUserById(order.getUserId());
+        if(user!=null){
+            String payCode = IdUtil.getSnowflake(0, 0).nextIdStr();
+            String json = configService.selectConfigByKey(STORE_PAY_CONF);
+            FsPayConfigScrm fsPayConfig = JSON.parseObject(json, FsPayConfigScrm.class);
+            FsStorePaymentScrm storePayment=new FsStorePaymentScrm();
+            storePayment.setCompanyId(order.getCompanyId());
+            storePayment.setCompanyUserId(order.getCompanyUserId());
+            storePayment.setStatus(0);
+            storePayment.setPayMode(fsPayConfig.getType());
+            storePayment.setPayCode(payCode);
+            storePayment.setPayMoney(order.getPayDelivery());
+            storePayment.setCreateTime(new Date());
+            storePayment.setPayTypeCode("weixin");
+            storePayment.setBusinessType(2);
+            storePayment.setRemark("商城订单尾款支付");
+            storePayment.setOpenId(user.getRealName());
+            storePayment.setUserId(user.getUserId());
+            storePayment.setBusinessOrderId(order.getId().toString());
+            storePayment.setOrderId(order.getId());
+            storePayment.setIsPayRemain(1);
+            fsStorePaymentMapper.insertFsStorePayment(storePayment);
+
+            if (fsPayConfig.getType().equals("hf")){
+                HuiFuCreateOrder o = new HuiFuCreateOrder();
+                o.setTradeType("T_MINIAPP");
+                o.setOpenid(user.getMaOpenId());
+                o.setReqSeqId("store_remain-"+storePayment.getPayCode());
+                o.setTransAmt(storePayment.getPayMoney().toString());
+                o.setGoodsDesc("商城订单尾款支付");
+                HuifuCreateOrderResult result = huiFuService.createOrder(o);
+                //创建订单
+                if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
+
+                    FsStorePaymentScrm mt=new FsStorePaymentScrm();
+                    mt.setPaymentId(storePayment.getPaymentId());
+                    mt.setTradeNo(result.getHf_seq_id());
+                    fsStorePaymentMapper.updateFsStorePayment(mt);
+                    redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
+                    Map<String, Object> resultMap = JSON.parseObject(result.getPay_info(), new TypeReference<Map<String, Object>>() {});
+                    String s = (String) resultMap.get("package");
+                    resultMap.put("packageValue",s);
+                    return R.ok().put("payType",param.getPayType()).put("result",resultMap);
+                }
+                else{
+                    return R.error(result.getResp_desc());
+                }
+            }else if(fsPayConfig.getType().equals("wx")) {
+                WxPayConfig payConfig = new WxPayConfig();
+                payConfig.setAppId(fsPayConfig.getAppId());
+                payConfig.setMchId(fsPayConfig.getWxMchId());
+                payConfig.setMchKey(fsPayConfig.getWxMchKey());
+                payConfig.setSubAppId(org.apache.commons.lang3.StringUtils.trimToNull(null));
+                payConfig.setSubMchId(org.apache.commons.lang3.StringUtils.trimToNull(null));
+                payConfig.setKeyPath(null);
+                payConfig.setNotifyUrl(fsPayConfig.getNotifyUrlScrm());
+                wxPayService.setConfig(payConfig);
+                WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
+                orderRequest.setOpenid(user.getMaOpenId());//公众号支付提供用户openid
+                orderRequest.setBody("商城订单支付");
+                orderRequest.setOutTradeNo("store-" + storePayment.getPayCode());
+                orderRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(storePayment.getPayMoney().toString()));//测试
+                //orderRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(money));//测试
+                orderRequest.setTradeType("JSAPI");
+                orderRequest.setSpbillCreateIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
+                //调用统一下单接口,获取"预支付交易会话标识"
+                try {
+                    WxPayMpOrderResult orderResult = wxPayService.createOrder(orderRequest);
+                    return R.ok().put("result", orderResult).put("type", "wx").put("isPay", 0);
+                } catch (WxPayException e) {
+                    e.printStackTrace();
+                    throw new CustomException("支付失败" + e.getMessage());
+                }
+            }
+        }
+        else{
+            return R.error("用户OPENID不存在");
+        }
+        return R.error("无支付类型");
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
+    public R editPayType(FsStoreOrderPayParam param) {
+        FsStoreOrderScrm order=this.selectFsStoreOrderById(param.getOrderId());
+        if(order==null){
+            return R.error("订单不存在");
+        }
+        if(!Objects.equals(order.getStatus(), OrderInfoEnum.STATUS_0.getValue())){
+            return R.error("订单状态不正确");
+        }
+        String orderId=redisCache.getCacheObject("isPaying:"+order.getId());
+        if(StringUtils.isNotEmpty(orderId)&&orderId.equals(order.getId().toString())){
+            return R.error("正在支付中...");
+        }
+        List<FsStorePaymentScrm>  payments=fsStorePaymentMapper.selectFsStorePaymentByOrder(order.getId());
+        if(CollectionUtils.isNotEmpty(payments)){
+            for(FsStorePaymentScrm payment : payments){
+                OrderQueryDTO orderQueryDTO = new OrderQueryDTO();
+                orderQueryDTO.setLowOrderId("store-"+payment.getPayCode());
+                OrderResult orderResult = ybPayService.getOrder(orderQueryDTO);
+                if(orderResult.getStatus()!= null&&orderResult.getStatus().equals("100")){
+                    if(orderResult.getState()!=null&&orderResult.getState().equals("0")){
+                        return R.error("订单已支付");
+                    }
+
+                }
+            }
+        }
+        FsUserScrm user=userService.selectFsUserById(order.getUserId());
+        if(user!=null){
+            //已改价处理
+            if(order.getIsEditMoney()!=null&&order.getIsEditMoney()==1){
+                //改过价不做处理
+            }
+            else{
+                String config=configService.selectConfigByKey("his.store");
+                com.fs.store.config.StoreConfig storeConfig= JSONUtil.toBean(config, com.fs.store.config.StoreConfig.class);
+                if(param.getPayType().equals(1)){
+                    order.setPayType("1");
+                    order.setPayMoney(order.getPayPrice());
+                    order.setPayDelivery(BigDecimal.ZERO);
+                }
+                else if(param.getPayType().equals(2)){
+
+                    order.setPayType("2");
+                    BigDecimal payMoney=order.getPayPrice().multiply(new BigDecimal(storeConfig.getPayRate())).divide(new BigDecimal(100));
+                    payMoney=new BigDecimal(payMoney.setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
+                    order.setPayDelivery(order.getPayPrice().subtract(payMoney));
+                    order.setPayMoney(payMoney);
+                }
+                else if(param.getPayType().equals(3)){
+                    //货到付款
+                    order.setPayType("3");
+                    BigDecimal amount=redisCache.getCacheObject("orderAmount:"+order.getId());
+                    BigDecimal payMoney = BigDecimal.ZERO;
+                    if (amount != null){
+                        payMoney=amount;
+                    }
+                    order.setPayMoney(payMoney);
+                    order.setPayDelivery(order.getPayPrice().subtract(payMoney) );
+                }
+                IFsStoreOrderScrmService fsStoreOrderScrmService = (IFsStoreOrderScrmService) AopContext.currentProxy();
+                fsStoreOrderScrmService.updateFsStoreOrder(order);
+            }
+            return R.ok().put("order",order);
+        }
+        else{
+            return R.error("用户OPENID不存在");
+        }
+    }
+
     private static final DateTimeFormatter CST_FORMATTER = DateTimeFormatter
             .ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US)
             .withZone(ZoneId.of("Asia/Shanghai"));

+ 14 - 8
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductAttrValueScrmServiceImpl.java

@@ -1,5 +1,6 @@
 package com.fs.hisStore.service.impl;
 
+import java.util.Collections;
 import java.util.List;
 
 import com.fs.hisStore.config.MedicalMallConfig;
@@ -17,12 +18,12 @@ import com.fs.hisStore.service.IFsStoreProductAttrValueScrmService;
 
 /**
  * 商品属性值Service业务层处理
- * 
+ *
  * @author fs
  * @date 2022-03-15
  */
 @Service
-public class FsStoreProductAttrValueScrmServiceImpl implements IFsStoreProductAttrValueScrmService 
+public class FsStoreProductAttrValueScrmServiceImpl implements IFsStoreProductAttrValueScrmService
 {
     @Autowired
     private FsStoreProductAttrValueScrmMapper fsStoreProductAttrValueMapper;
@@ -32,7 +33,7 @@ public class FsStoreProductAttrValueScrmServiceImpl implements IFsStoreProductAt
 
     /**
      * 查询商品属性值
-     * 
+     *
      * @param id 商品属性值ID
      * @return 商品属性值
      */
@@ -44,7 +45,7 @@ public class FsStoreProductAttrValueScrmServiceImpl implements IFsStoreProductAt
 
     /**
      * 查询商品属性值列表
-     * 
+     *
      * @param fsStoreProductAttrValue 商品属性值
      * @return 商品属性值
      */
@@ -56,7 +57,7 @@ public class FsStoreProductAttrValueScrmServiceImpl implements IFsStoreProductAt
 
     /**
      * 新增商品属性值
-     * 
+     *
      * @param fsStoreProductAttrValue 商品属性值
      * @return 结果
      */
@@ -68,7 +69,7 @@ public class FsStoreProductAttrValueScrmServiceImpl implements IFsStoreProductAt
 
     /**
      * 修改商品属性值
-     * 
+     *
      * @param fsStoreProductAttrValue 商品属性值
      * @return 结果
      */
@@ -80,7 +81,7 @@ public class FsStoreProductAttrValueScrmServiceImpl implements IFsStoreProductAt
 
     /**
      * 批量删除商品属性值
-     * 
+     *
      * @param ids 需要删除的商品属性值ID
      * @return 结果
      */
@@ -92,7 +93,7 @@ public class FsStoreProductAttrValueScrmServiceImpl implements IFsStoreProductAt
 
     /**
      * 删除商品属性值信息
-     * 
+     *
      * @param id 商品属性值ID
      * @return 结果
      */
@@ -127,5 +128,10 @@ public class FsStoreProductAttrValueScrmServiceImpl implements IFsStoreProductAt
         return fsStoreProductAttrValueMapper.selectStoreTuiProductAttrValueVOList(param);
     }
 
+    @Override
+    public List<FsStoreProductAttrValueScrm> getFsStoreProductAttrValueListInProductId(List<Long> productIds) {
+        return fsStoreProductAttrValueMapper.getFsStoreProductAttrValueListInProductId(productIds);
+    }
+
 
 }

+ 35 - 28
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductScrmServiceImpl.java

@@ -980,7 +980,7 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
                         ErpGoods params = new ErpGoods();
                         params.setStoreProductId(product.getProductId());
                         //瀚智OMS 维护添加商品
-                        hzOMSErpGoodsService.addGoods(params);
+                        hzOMSErpGoodsService.addGoodsScrm(params);
                     }else if(erpType == 5){
                         jstProductIds.add(product.getProductId());
                     }
@@ -998,7 +998,7 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
             //同步聚水潭商品
             ErpGoods params = new ErpGoods();
             params.setProductIdList(jstProductIds);
-            jSTErpGoodsService.addGoods(params);
+            jSTErpGoodsService.addGoodsScrm(params);
         }
 
 
@@ -1058,32 +1058,34 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
         if(list != null && !list.isEmpty()){
             for (FsStoreProductScrm product : list) {
                 List<FsStoreProductAttrValueScrm> param = fsStoreProductAttrValueMapper.selectFsStoreProductAttrValueByProductId(product.getProductId());
-                //获取店铺
-                FsStoreScrm store = fsStoreScrmService.selectFsStoreByStoreId(product.getStoreId());
-                if(store == null || 1 != store.getStatus()){
-                    return R.error("ID为:" + product.getProductId() + "的店铺不存在或未启用");
-                }else{
-                    //验证资质
-                    switch (product.getProductType()){
-                        case 1://非处方
-                            break;
-                        case 2://处方
-                            if("".equals(store.getDrugLicense()) ||  LocalDate.now().isBefore(store.getDrugLicenseExpiryEnd())){
-                                return R.error("ID为:" + product.getProductId() + "的店铺药品资质为空或已过期,请完善后再添加");
-                            }
-                            break;
-                        case 3://食品
-                            if("".equals(store.getFoodLicense()) ||  LocalDate.now().isBefore(store.getFoodLicenseExpiryEnd())){
-                                return R.error("ID为:" + product.getProductId() + "的店铺食品资质为空或已过期,请完善后再添加");
-                            }
-                            break;
-                        case 4://器械
-                            if("".equals(store.getMedicalDevice3()) ||  LocalDate.now().isBefore(store.getMedicalDevice3ExpiryEnd())){
-                                return R.error("ID为:" + product.getProductId() + "的店铺器械资质为空或已过期,请完善后再添加");
-                            }
-                            break;
-                        default:
-                            return R.error("ID为:" + product.getProductId() + "的商品类型错误");
+                if(!("益善缘".equals(cloudHostProper.getCompanyName()))) {
+                    //获取店铺
+                    FsStoreScrm store = fsStoreScrmService.selectFsStoreByStoreId(product.getStoreId());
+                    if (store == null || 1 != store.getStatus()) {
+                        return R.error("ID为:" + product.getProductId() + "的店铺不存在或未启用");
+                    } else {
+                        //验证资质
+                        switch (product.getProductType()) {
+                            case 1://非处方
+                                break;
+                            case 2://处方
+                                if ("".equals(store.getDrugLicense()) || LocalDate.now().isBefore(store.getDrugLicenseExpiryEnd())) {
+                                    return R.error("ID为:" + product.getProductId() + "的店铺药品资质为空或已过期,请完善后再添加");
+                                }
+                                break;
+                            case 3://食品
+                                if ("".equals(store.getFoodLicense()) || LocalDate.now().isBefore(store.getFoodLicenseExpiryEnd())) {
+                                    return R.error("ID为:" + product.getProductId() + "的店铺食品资质为空或已过期,请完善后再添加");
+                                }
+                                break;
+                            case 4://器械
+                                if ("".equals(store.getMedicalDevice3()) || LocalDate.now().isBefore(store.getMedicalDevice3ExpiryEnd())) {
+                                    return R.error("ID为:" + product.getProductId() + "的店铺器械资质为空或已过期,请完善后再添加");
+                                }
+                                break;
+                            default:
+                                return R.error("ID为:" + product.getProductId() + "的商品类型错误");
+                        }
                     }
                 }
 
@@ -1145,4 +1147,9 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
         }
         return R.ok();
     }
+
+    @Override
+    public List<FsStoreProductScrm> getStoreProductInProductIds(List<Long> productIds) {
+        return fsStoreProductMapper.getStoreProductInProductIds(productIds);
+    }
 }

+ 2 - 2
fs-service/src/main/resources/application-druid-fby.yml

@@ -167,9 +167,9 @@ openIM:
     secret: openIM123
     userID: imAdmin
     url: https://web.im.fbylive.com/api
-#是否使用新im
+#im版本
 im:
-    type: NONE
+    type: OPENIM
 #是否为新商户,新商户不走mpOpenId
 isNewWxMerchant: true
 

+ 2 - 2
fs-service/src/main/resources/application-druid-sxjz.yml

@@ -164,8 +164,8 @@ token:
 openIM:
     secret: openIM123
     userID: imAdmin
-    url: https://web.im.fbylive.com/api
-#是否使用新im
+    url:
+#im版本
 im:
     type: NONE
 #是否为新商户,新商户不走mpOpenId

+ 3 - 0
fs-service/src/main/resources/mapper/hisStore/FsStoreProductAttrValueScrmMapper.xml

@@ -55,6 +55,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <include refid="selectFsStoreProductAttrValueVo"/>
         where id = #{id}
     </select>
+    <select id="getFsStoreProductAttrValueListInProductId" resultType="com.fs.hisStore.domain.FsStoreProductAttrValueScrm">
+        select *,cost_price AS cost from fs_store_product_attr_value_scrm where product_id IN <foreach collection="productIds" index="index" item="item" open="(" separator="," close=")">#{item}</foreach>
+    </select>
 
     <insert id="insertFsStoreProductAttrValue" parameterType="FsStoreProductAttrValueScrm" useGeneratedKeys="true" keyProperty="id">
         insert into fs_store_product_attr_value_scrm

+ 7 - 0
fs-service/src/main/resources/mapper/hisStore/FsStoreProductScrmMapper.xml

@@ -452,4 +452,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             #{productId}
         </foreach>
     </select>
+
+    <select id="getStoreProductInProductIds" resultType="com.fs.hisStore.domain.FsStoreProductScrm">
+        <include refid="selectFsStoreProductVo"/>
+        where product_id IN <foreach collection="productIds" index="index" item="item" open="(" separator="," close=")">
+        #{item}
+    </foreach>
+    </select>
 </mapper>

+ 1 - 1
fs-store/src/main/java/com/fs/hisStore/controller/store/FsStoreOrderScrmController.java

@@ -309,7 +309,7 @@ public class FsStoreOrderScrmController extends BaseController
         IErpOrderService erpOrderService = getErpService();
         ErpOrderQueryResponse response = new ErpOrderQueryResponse();
         if (erpOrderService != null){
-            response = erpOrderService.getOrder(request);
+            response = erpOrderService.getScrmOrder(request);
         }
         return R.ok().put("data",response);
     }

+ 2 - 2
fs-user-app/src/main/java/com/fs/app/controller/CompanyUserController.java

@@ -239,7 +239,7 @@ public class CompanyUserController extends  AppBaseController {
      * @return
      */
     @GetMapping("/companyUserVoice")
-    public R companyUserVoice(@Param("id") Long id){
+    public R companyUserVoice(@RequestParam("id") Long id){
         AudioVO audioVO = new AudioVO();
         Long companyUserId = getCompanyUserId();
         List<QwSopTempVoice> sopTempVoices = redisCache.getVoiceAllList(SOP_TEMP_VOICE_KEY + ":" + companyUserId);
@@ -323,7 +323,7 @@ public class CompanyUserController extends  AppBaseController {
     }
 
     @GetMapping("/querySopVoiceList")
-    public TableDataInfo querySopVoiceList(@Param("recordType") Integer recordType){
+    public TableDataInfo querySopVoiceList(@RequestParam("recordType") Integer recordType){
         startPage();
         QwSopTempVoice sopTempVoice = new QwSopTempVoice();
         sopTempVoice.setRecordType(recordType);

+ 188 - 594
fs-user-app/src/main/java/com/fs/app/controller/store/StoreOrderScrmController.java

@@ -48,6 +48,8 @@ import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import me.chanjar.weixin.common.error.WxErrorException;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -62,40 +64,25 @@ import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 
+import static com.fs.hisStore.constants.UserAppsLockConstant.*;
+
 
 @Api("商城接口")
 @RestController
 @RequestMapping(value="/store/app/storeOrder")
 public class StoreOrderScrmController extends AppBaseController {
 
-    private static final String STORE_PAY_CONF = "his.pay";
-
     Logger logger= LoggerFactory.getLogger(getClass());
 
-    @Autowired
-    private WxMaProperties properties;
-
-    @Autowired
-    private WxPayService wxPayService;
     @Autowired
     private IFsStoreOrderScrmService orderService;
-    @Autowired
-    private FsStorePaymentScrmMapper fsStorePaymentMapper;
 
     @Autowired
     private IFsStoreOrderItemScrmService itemService;
 
-    @Autowired
-    private IFsUserScrmService userService;
-
     @Autowired
     private IFsPrescribeScrmService prescribeService;
-    @Autowired
-    private IPayService payService;
-    @Autowired
-    private FSSysConfig sysConfig;
-    @Autowired
-    private IErpOrderService erpOrderService;
+
     @Autowired
     private ISysConfigService configService;
     @Autowired
@@ -103,66 +90,8 @@ public class StoreOrderScrmController extends AppBaseController {
     @Autowired
     private IFsStoreProductPackageScrmService productPackageService;
     @Autowired
-    IPayService ybPayService;
-    @Autowired
-    private HuiFuService huiFuService;
-    @Autowired
-    @Qualifier("erpOrderServiceImpl")
-    private IErpOrderService gyOrderService;
+    private RedissonClient redissonClient;
 
-    @Autowired
-    @Qualifier("wdtErpOrderServiceImpl")
-    private IErpOrderService wdtOrderService;
-
-    @Autowired
-    @Qualifier("k9OrderScrmServiceImpl")
-    private IErpOrderService k9OrderService;
-
-    @Autowired
-    private ConfigUtil configUtil;
-    //TODO 应该没用到
-    private IErpOrderService getErpService(){
-        //判断是否开启erp
-        IErpOrderService erpOrderService = null;
-        FsErpConfig erpConfig = configUtil.getErpConfig();
-        Integer erpOpen = erpConfig.getErpOpen();
-        if (erpOpen != null && erpOpen == 1) {
-            //判断erp类型
-            Integer erpType = erpConfig.getErpType();
-            if (erpType != null) {
-                if (erpType == 1) {
-                    //管易
-                    erpOrderService = gyOrderService;
-                } else if (erpType == 2) {
-                    //旺店通
-                    erpOrderService = wdtOrderService;
-                } else if (erpType == 3) {
-                    //金博
-                    erpOrderService = k9OrderService;
-                }
-            }
-        }
-        return erpOrderService;
-    }
-
-
-    @ApiOperation("测试ERP")
-    @GetMapping("/test")
-    public R test(){
-        IErpOrderService erpOrderService = getErpService();
-//        erpOrderService.addOmsOrder(172L);
-//        k9OrderService.refundOmsOrder(172L);
-        return R.ok();
-    }
-
-
-    @ApiOperation("测试ERP")
-    @GetMapping("/test2")
-    public R test2(){
-//        k9OrderService.refundOmsOrder(172L);
-//        k9OrderService.refundOmsOrder(172L);
-        return R.ok();
-    }
 
 
     @Login
@@ -278,448 +207,176 @@ public class StoreOrderScrmController extends AppBaseController {
     @Login
     @ApiOperation("支付")
     @PostMapping("/pay")
-    @Transactional
-    //@Synchronized
     public R pay(HttpServletRequest request, @Validated @RequestBody FsStoreOrderPayParam param)
     {
-        FsStoreOrderScrm order=orderService.selectFsStoreOrderById(param.getOrderId());
-        if(order==null){
-            return R.error("订单不存在");
-        }
-        if(order.getStatus()!= OrderInfoEnum.STATUS_0.getValue()){
-            return R.error("订单状态不正确");
-        }
-        String orderId=redisCache.getCacheObject("isPaying:"+order.getId());
-        if(StringUtils.isNotEmpty(orderId)&&orderId.equals(order.getId().toString())){
-            return R.error("正在支付中...");
-        }
+        Long orderId = param.getOrderId();
+        logger.info("开始处理支付请求, 订单号: {}, 支付类型: {}", orderId, param.getPayType());
 
-        FsUserScrm user=userService.selectFsUserById(order.getUserId());
-        if(user!=null){
-            //已改价处理
-            if(order.getIsEditMoney()!=null&&order.getIsEditMoney()==1){
-                //改过价不做处理
+        RLock lock = redissonClient.getLock(String.format(LOCK_KEY_PAY,orderId));
+        R result = null;
 
+        try {
+            boolean locked = lock.tryLock(100, 30000, TimeUnit.MILLISECONDS);
+
+            if (!locked) {
+                logger.warn("订单正在处理中,获取锁失败, 订单号: {}", orderId);
+                return R.error("订单正在处理中,请勿重复提交");
             }
-            else{
-                String config=configService.selectConfigByKey("his.store");
-                StoreConfig storeConfig= JSONUtil.toBean(config,StoreConfig.class);
-                if(param.getPayType().equals(1)){
-                    order.setPayType("1");
-                    order.setPayMoney(order.getPayPrice());
-                    order.setPayDelivery(BigDecimal.ZERO);
-                }
-                else if(param.getPayType().equals(2)){
-                    order.setPayType("2");
-                    BigDecimal payMoney=order.getPayPrice().multiply(new BigDecimal(storeConfig.getPayRate())).divide(new BigDecimal(100));
-                    payMoney=new BigDecimal(payMoney.setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
-                    order.setPayDelivery(order.getPayPrice().subtract(payMoney));
-                    order.setPayMoney(payMoney);
-                }
-                else if(param.getPayType().equals(3)){
-                    //货到付款
-                    order.setPayType("3");
-                    BigDecimal amount=redisCache.getCacheObject("orderAmount:"+order.getId());
-                    BigDecimal payMoney = BigDecimal.ZERO;
-                    if (amount != null){
-                        payMoney=amount;
-                    }
-                    order.setPayMoney(payMoney);
-                    order.setPayDelivery(order.getPayPrice().subtract(payMoney) );
-//                    order.setPayMoney(BigDecimal.ZERO);
-                }
-                orderService.updateFsStoreOrder(order);
-            }
-            String payCode = IdUtil.getSnowflake(0, 0).nextIdStr();
-//            order.setOrderCode(orderCode);
-//            if(order.getPayType().equals("1")||order.getPayType().equals("2")){
-            if((order.getPayType().equals("1")||order.getPayType().equals("2")||order.getPayType().equals("3")) && order.getPayMoney().compareTo(new BigDecimal(0))>0){
-                String json = configService.selectConfigByKey(STORE_PAY_CONF);
-                FsPayConfigScrm fsPayConfig = JSON.parseObject(json, FsPayConfigScrm.class);
-                FsStorePaymentScrm storePayment=new FsStorePaymentScrm();
-                storePayment.setCompanyId(order.getCompanyId());
-                storePayment.setCompanyUserId(order.getCompanyUserId());
-                storePayment.setPayMode(fsPayConfig.getType());
-                storePayment.setStatus(0);
-                storePayment.setPayCode(payCode);
-                storePayment.setPayMoney(order.getPayMoney());
-                storePayment.setCreateTime(new Date());
-                storePayment.setPayTypeCode("weixin");
-                storePayment.setBusinessType(2);
-                storePayment.setRemark("商城订单支付");
-                storePayment.setOpenId(user.getRealName());
-                storePayment.setUserId(user.getUserId());
-                storePayment.setBusinessOrderId(order.getId().toString());
-                storePayment.setOrderId(order.getId());
-                fsStorePaymentMapper.insertFsStorePayment(storePayment);
-
-                if (fsPayConfig.getType().equals("hf")){
-                    HuiFuCreateOrder o = new HuiFuCreateOrder();
-                    o.setTradeType("T_MINIAPP");
-                    o.setOpenid(user.getMaOpenId());
-                    o.setReqSeqId("store-"+storePayment.getPayCode());
-                    o.setTransAmt(storePayment.getPayMoney().toString());
-                    o.setGoodsDesc("商城订单支付");
-                    o.setAppId(param.getAppId());
-                    HuifuCreateOrderResult result = huiFuService.createOrder(o);
-                    if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
-                        FsStorePaymentScrm mt=new FsStorePaymentScrm();
-                        mt.setPaymentId(storePayment.getPaymentId());
-                        mt.setTradeNo(result.getHf_seq_id());
-                        mt.setAppId(param.getAppId());
-                        fsStorePaymentMapper.updateFsStorePayment(mt);
-                        redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
-                        Map<String, Object> resultMap = JSON.parseObject(result.getPay_info(), new TypeReference<Map<String, Object>>() {});
-                        String s = (String) resultMap.get("package");
-                        resultMap.put("packageValue",s);
-                        return R.ok().put("payType",param.getPayType()).put("result",resultMap);
-                    }
-                    else{
-                        return R.error(result.getResp_desc());
-                    }
-                }else  if (fsPayConfig.getType().equals("wx")){
-                    WxPayConfig payConfig = new WxPayConfig();
-                    payConfig.setAppId(fsPayConfig.getAppId());
-                    payConfig.setMchId(fsPayConfig.getWxMchId());
-                    payConfig.setMchKey(fsPayConfig.getWxMchKey());
-                    payConfig.setSubAppId(org.apache.commons.lang3.StringUtils.trimToNull(null));
-                    payConfig.setSubMchId(org.apache.commons.lang3.StringUtils.trimToNull(null));
-                    payConfig.setKeyPath(fsPayConfig.getKeyPath());
-                    payConfig.setNotifyUrl(fsPayConfig.getNotifyUrlScrm());
-                    wxPayService.setConfig(payConfig);
-                    WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
-                    orderRequest.setOpenid(user.getMaOpenId());//公众号支付提供用户openid
-                    orderRequest.setBody("商城订单支付");
-                    orderRequest.setOutTradeNo("store-" + storePayment.getPayCode());
-                    orderRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(storePayment.getPayMoney().toString()));//测试
-                    //orderRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(money));//测试
-                    orderRequest.setTradeType("JSAPI");
-                    orderRequest.setSpbillCreateIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
-                    //调用统一下单接口,获取"预支付交易会话标识"
-                    try {
-                        WxPayMpOrderResult orderResult = wxPayService.createOrder(orderRequest);
-                        return R.ok().put("result", orderResult).put("type", "wx").put("isPay", 0).put("payType",param.getPayType());
-                    } catch (WxPayException e) {
-                        e.printStackTrace();
-                        throw new CustomException("支付失败" + e.getMessage());
-                    }
-                }
-            }
-//            else if(order.getPayType().equals("3")){
-            else if(order.getPayType().equals("3") && order.getPayMoney().compareTo(new BigDecimal(0))<=0){
-                //货到付款
-                orderService.payConfirm(2,order.getId(),null,null,null,null);
-                return R.ok().put("payType",param.getPayType());
+
+            result = orderService.pay(param);
+
+        } catch (InterruptedException e) {
+            logger.error("获取支付锁的过程被中断, 订单号: {}", orderId, e);
+            Thread.currentThread().interrupt();
+            return R.error("支付处理被中断,请稍后重试");
+        } catch (Throwable e) {
+            logger.error("支付过程中发生异常, 订单号: {}", orderId, e);
+            throw e;
+        } finally {
+            if (lock.isHeldByCurrentThread()) {
+                lock.unlock();
+                logger.debug("支付锁已释放, 订单号: {}", orderId);
             }
-            return R.error();
-        }
-        else{
-            return R.error("用户OPENID不存在");
         }
 
+        return result;
     }
 
+    @Login
+    @ApiOperation("取消支付")
+    @PostMapping("/cancelPay")
+    public R cancelPay(@Validated @RequestBody FsStoreOrderPayParam param) {
+        Long orderId = param.getOrderId();
 
+        logger.info("用户取消支付 订单号: {},支付类型",param.getOrderId());
+        RLock lock = redissonClient.getLock(String.format(LOCK_KEY_PAY,orderId));
+        try {
+            boolean locked = lock.tryLock(100, 30000, TimeUnit.MILLISECONDS);
 
+            if (!locked) {
+                logger.warn("订单正在处理中,获取锁失败, 订单号: {}", orderId);
+                return R.error("订单正在处理中,请稍后再试");
+            }
+
+            orderService.cancelPay(param);
+            return R.ok();
+
+        } catch (InterruptedException e) {
+            logger.error("获取取消支付锁的过程被中断, 订单号: {}", orderId, e);
+            Thread.currentThread().interrupt();
+            return R.error("取消支付处理被中断,请稍后重试");
+        } catch (Throwable e) {
+            logger.error("取消支付过程中发生异常, 订单号: {}", orderId, e);
+            throw e;
+        } finally {
+            if (lock.isHeldByCurrentThread()) {
+                lock.unlock();
+                logger.debug("取消支付锁已释放, 订单号: {}", orderId);
+            }
+        }
+    }
 
 
     @Login
     @ApiOperation("修改支付类型")
     @PostMapping("/editPayType")
-    @Transactional
     public R editPayType(HttpServletRequest request, @Validated @RequestBody FsStoreOrderPayParam param) {
-        FsStoreOrderScrm order=orderService.selectFsStoreOrderById(param.getOrderId());
-        if(order==null){
-            return R.error("订单不存在");
-        }
-        if(order.getStatus()!= OrderInfoEnum.STATUS_0.getValue()){
-            return R.error("订单状态不正确");
-        }
-        String orderId=redisCache.getCacheObject("isPaying:"+order.getId());
-        if(StringUtils.isNotEmpty(orderId)&&orderId.equals(order.getId().toString())){
-            return R.error("正在支付中...");
-        }
-        List<FsStorePaymentScrm>  payments=fsStorePaymentMapper.selectFsStorePaymentByOrder(order.getId());
-        if(payments.size()>0){
-            for(FsStorePaymentScrm payment : payments){
-                OrderQueryDTO orderQueryDTO = new OrderQueryDTO();
-                orderQueryDTO.setLowOrderId("store-"+payment.getPayCode());
-                OrderResult orderResult = ybPayService.getOrder(orderQueryDTO);
-                if(orderResult.getStatus()!= null&&orderResult.getStatus().equals("100")){
-                    if(orderResult.getState()!=null&&orderResult.getState().equals("0")){
-                        return R.error("订单已支付");
-                    }
-
-                }
+        Long orderId = param.getOrderId();
+        logger.info("开始处理修改支付类型请求, 订单号: {}, 新支付类型: {}", orderId, param.getPayType());
+        RLock lock = redissonClient.getLock(String.format(LOCK_KEY_EDIT_PAY_TYPE,orderId));
+        R result = null;
+        try {
+            boolean locked = lock.tryLock(100, 10000, TimeUnit.MILLISECONDS);
+            if (!locked) {
+                logger.warn("订单支付类型正在修改中,获取锁失败, 订单号: {}", orderId);
+                return R.error("订单正在处理中,请勿重复提交");
             }
-        }
-        FsUserScrm user=userService.selectFsUserById(order.getUserId());
-        if(user!=null){
-            //已改价处理
-            if(order.getIsEditMoney()!=null&&order.getIsEditMoney()==1){
-                //改过价不做处理
+            result = orderService.editPayType(param);
+        } catch (InterruptedException e) {
+            logger.error("获取修改支付类型锁的过程被中断, 订单号: {}", orderId, e);
+            Thread.currentThread().interrupt();
+            return R.error("修改支付类型处理被中断,请稍后重试");
+        } catch (Throwable e) {
+            logger.error("修改支付类型过程中发生异常, 订单号: {}", orderId, e);
+            throw e;
+        } finally {
+            if (lock != null && lock.isHeldByCurrentThread()) {
+                lock.unlock();
+                logger.debug("修改支付类型锁已释放, 订单号: {}", orderId);
             }
-            else{
-                String config=configService.selectConfigByKey("his.store");
-                StoreConfig storeConfig= JSONUtil.toBean(config,StoreConfig.class);
-                if(param.getPayType().equals(1)){
-                    order.setPayType("1");
-                    order.setPayMoney(order.getPayPrice());
-                    order.setPayDelivery(BigDecimal.ZERO);
-                }
-                else if(param.getPayType().equals(2)){
-
-                    order.setPayType("2");
-                    BigDecimal payMoney=order.getPayPrice().multiply(new BigDecimal(storeConfig.getPayRate())).divide(new BigDecimal(100));
-                    payMoney=new BigDecimal(payMoney.setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
-                    order.setPayDelivery(order.getPayPrice().subtract(payMoney));
-                    order.setPayMoney(payMoney);
-                }
-                else if(param.getPayType().equals(3)){
-                    //货到付款
-                    order.setPayType("3");
-//                    order.setPayDelivery(order.getPayPrice() );
-//                    order.setPayMoney(BigDecimal.ZERO);
-                    BigDecimal amount=redisCache.getCacheObject("orderAmount:"+order.getId());
-                    BigDecimal payMoney = BigDecimal.ZERO;
-                    if (amount != null){
-                        payMoney=amount;
-                    }
-                    order.setPayMoney(payMoney);
-                    order.setPayDelivery(order.getPayPrice().subtract(payMoney) );
-                }
-                orderService.updateFsStoreOrder(order);
-            }
-            return R.ok().put("order",order);
         }
-        else{
-            return R.error("用户OPENID不存在");
-        }
-
+        return result;
     }
 
 
     @Login
     @ApiOperation("支付尾款")
     @PostMapping("/payRemain")
-    @Transactional
     public R payRemain(HttpServletRequest request, @Validated @RequestBody FsStoreOrderPayParam param) {
-        FsStoreOrderScrm order=orderService.selectFsStoreOrderById(param.getOrderId());
-        if(order==null){
-            return R.error("订单不存在");
-        }
-        if(order.getStatus()!= OrderInfoEnum.STATUS_2.getValue()){
-            return R.error("待收货订单可申请支付尾款");
-        }
-        if(order.getPayType().equals(1)){
-            return R.error("此订单已支付");
-        }
-        //只有顺风才可以付尾
-        if(!order.getDeliverySn().trim().equals("SF")){
-            return R.error("只有顺丰物流支持尾款支付");
-        }
-
-        if(!order.getIsPayRemain().equals(0)){
-            return R.error("此订单已支付");
-        }
-        FsUserScrm user=userService.selectFsUserById(order.getUserId());
-        if(user!=null){
-            String payCode = IdUtil.getSnowflake(0, 0).nextIdStr();
-            String json = configService.selectConfigByKey(STORE_PAY_CONF);
-            FsPayConfigScrm fsPayConfig = JSON.parseObject(json, FsPayConfigScrm.class);
-            FsStorePaymentScrm storePayment=new FsStorePaymentScrm();
-            storePayment.setCompanyId(order.getCompanyId());
-            storePayment.setCompanyUserId(order.getCompanyUserId());
-            storePayment.setStatus(0);
-            storePayment.setPayMode(fsPayConfig.getType());
-            storePayment.setPayCode(payCode);
-            storePayment.setPayMoney(order.getPayDelivery());
-            storePayment.setCreateTime(new Date());
-            storePayment.setPayTypeCode("weixin");
-            storePayment.setBusinessType(2);
-            storePayment.setRemark("商城订单尾款支付");
-            storePayment.setOpenId(user.getRealName());
-            storePayment.setUserId(user.getUserId());
-            storePayment.setBusinessOrderId(order.getId().toString());
-            storePayment.setOrderId(order.getId());
-            storePayment.setIsPayRemain(1);
-            fsStorePaymentMapper.insertFsStorePayment(storePayment);
-
-            if (fsPayConfig.getType().equals("hf")){
-                HuiFuCreateOrder o = new HuiFuCreateOrder();
-                o.setTradeType("T_MINIAPP");
-                o.setOpenid(user.getMaOpenId());
-                o.setReqSeqId("store_remain-"+storePayment.getPayCode());
-                o.setTransAmt(storePayment.getPayMoney().toString());
-                o.setGoodsDesc("商城订单尾款支付");
-                HuifuCreateOrderResult result = huiFuService.createOrder(o);
-                //创建订单
-                if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
-
-                    FsStorePaymentScrm mt=new FsStorePaymentScrm();
-                    mt.setPaymentId(storePayment.getPaymentId());
-                    mt.setTradeNo(result.getHf_seq_id());
-                    fsStorePaymentMapper.updateFsStorePayment(mt);
-                    redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
-                    Map<String, Object> resultMap = JSON.parseObject(result.getPay_info(), new TypeReference<Map<String, Object>>() {});
-                    String s = (String) resultMap.get("package");
-                    resultMap.put("packageValue",s);
-                    return R.ok().put("payType",param.getPayType()).put("result",resultMap);
-                }
-                else{
-                    return R.error(result.getResp_desc());
-                }
-            }else if(fsPayConfig.getType().equals("wx")) {
-                WxPayConfig payConfig = new WxPayConfig();
-                payConfig.setAppId(fsPayConfig.getAppId());
-                payConfig.setMchId(fsPayConfig.getWxMchId());
-                payConfig.setMchKey(fsPayConfig.getWxMchKey());
-                payConfig.setSubAppId(org.apache.commons.lang3.StringUtils.trimToNull(null));
-                payConfig.setSubMchId(org.apache.commons.lang3.StringUtils.trimToNull(null));
-                payConfig.setKeyPath(null);
-                payConfig.setNotifyUrl(fsPayConfig.getNotifyUrlScrm());
-                wxPayService.setConfig(payConfig);
-                WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
-                orderRequest.setOpenid(user.getMaOpenId());//公众号支付提供用户openid
-                orderRequest.setBody("商城订单支付");
-                orderRequest.setOutTradeNo("store-" + storePayment.getPayCode());
-                orderRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(storePayment.getPayMoney().toString()));//测试
-                //orderRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(money));//测试
-                orderRequest.setTradeType("JSAPI");
-                orderRequest.setSpbillCreateIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
-                //调用统一下单接口,获取"预支付交易会话标识"
-                try {
-                    WxPayMpOrderResult orderResult = wxPayService.createOrder(orderRequest);
-                    return R.ok().put("result", orderResult).put("type", "wx").put("isPay", 0);
-                } catch (WxPayException e) {
-                    e.printStackTrace();
-                    throw new CustomException("支付失败" + e.getMessage());
-                }
+        Long orderId = param.getOrderId();
+        logger.info("开始处理支付尾款请求, 订单号: {}, 支付类型: {}", orderId, param.getPayType());
+        RLock lock = redissonClient.getLock(String.format(LOCK_KEY_PAY_REMAIN,orderId));
+        R result = null;
+        try {
+            boolean locked = lock.tryLock(100, 30000, TimeUnit.MILLISECONDS);
+            if (!locked) {
+                logger.warn("订单尾款正在处理中,获取锁失败, 订单号: {}", orderId);
+                return R.error("订单尾款正在处理中,请勿重复提交");
+            }
+            result = orderService.payRemain(param);
+        } catch (InterruptedException e) {
+            logger.error("获取支付尾款锁的过程被中断, 订单号: {}", orderId, e);
+            Thread.currentThread().interrupt();
+            return R.error("支付尾款处理被中断,请稍后重试");
+        } catch (Throwable e) {
+            logger.error("支付尾款过程中发生异常, 订单号: {}", orderId, e);
+            throw e;
+        } finally {
+            if (lock.isHeldByCurrentThread()) {
+                lock.unlock();
+                logger.debug("支付尾款锁已释放, 订单号: {}", orderId);
             }
         }
-        else{
-            return R.error("用户OPENID不存在");
-        }
-        return R.error("无支付类型");
+        return result;
     }
 
 
     @Login
     @ApiOperation("亲友支付")
     @PostMapping("/otherPayment")
-    @Transactional
     public R otherPayment(@Validated @RequestBody FsStoreOrderOtherPayParam param, HttpServletRequest request){
-        final WxMaService wxService = WxMaConfiguration.getMaService(properties.getConfigs().get(0).getAppid());
+        Long orderId = param.getOrderId();
+        logger.info("开始处理亲友支付请求, 订单号: {}", orderId);
+
+        String lockKey = String.format(LOCK_KEY_PAY,orderId);
+        RLock lock = redissonClient.getLock(lockKey);
+        R result = null;
+
         try {
-            String ip = IpUtil.getRequestIp();
-            WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
-            FsUserScrm user=userService.selectFsUserByMaOpenId(session.getOpenid());
-            if(user==null){
-                //创建
-                user=new FsUserScrm();
-                user.setUsername("");
-                user.setNickname("微信用户");
-                user.setStatus(1);
-                user.setMaOpenId(session.getOpenid());
-                user.setUnionId(session.getUnionid());
-                user.setIsWeixinAuth(0);
-                user.setLastIp(ip);
-                user.setCreateTime(new Date());
-                userService.insertFsUser(user);
-            }
-            FsStoreOrderScrm order=orderService.selectFsStoreOrderById(param.getOrderId());
-            if(order==null){
-                return R.error("订单不存在");
-            }
-            if(order.getStatus()!= OrderInfoEnum.STATUS_0.getValue()){
-                return R.error("此订单不能支付");
-            }
-            if(order.getPayMoney().compareTo(new BigDecimal(0))<1){
-                return R.error("此订单没有可支付的金额");
-            }
+            boolean locked = lock.tryLock(100, 30000, TimeUnit.MILLISECONDS);
 
-            String orderId=redisCache.getCacheObject("isPaying:"+order.getId());
-            if(StringUtils.isNotEmpty(orderId)&&orderId.equals(order.getId().toString())){
-                return R.error("正在支付中...");
+            if (!locked) {
+                logger.warn("订单正在处理中,获取锁失败, 订单号: {}", orderId);
+                return R.error("订单正在处理中,请勿重复提交");
             }
 
-            String json = configService.selectConfigByKey(STORE_PAY_CONF);
-            FsPayConfigScrm fsPayConfig = JSON.parseObject(json, FsPayConfigScrm.class);
-            String payCode = IdUtil.getSnowflake(0, 0).nextIdStr();
-            //易宝支付
-            FsStorePaymentScrm storePayment=new FsStorePaymentScrm();
-            storePayment.setCompanyId(order.getCompanyId());
-            storePayment.setCompanyUserId(order.getCompanyUserId());
-            storePayment.setStatus(0);
-            storePayment.setPayCode(payCode);
-            storePayment.setPayMode(fsPayConfig.getType());
-            storePayment.setPayMoney(order.getPayMoney());
-            storePayment.setCreateTime(new Date());
-            storePayment.setPayTypeCode("weixin");
-            storePayment.setBusinessType(2);
-            storePayment.setRemark("商城订单支付");
-            storePayment.setOpenId(session.getOpenid());
-            storePayment.setUserId(user.getUserId());
-            storePayment.setBusinessOrderId(order.getId().toString());
-            storePayment.setOrderId(order.getId());
-            fsStorePaymentMapper.insertFsStorePayment(storePayment);
-
-            if (fsPayConfig.getType().equals("hf")){
-                HuiFuCreateOrder o = new HuiFuCreateOrder();
-                o.setTradeType("T_MINIAPP");
-                o.setOpenid(user.getMaOpenId());
-                o.setReqSeqId("store-"+storePayment.getPayCode());
-                o.setTransAmt(storePayment.getPayMoney().toString());
-                o.setGoodsDesc("商城订单支付");
-                HuifuCreateOrderResult result = huiFuService.createOrder(o);
-                if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
-
-                    FsStorePaymentScrm mt=new FsStorePaymentScrm();
-                    mt.setPaymentId(storePayment.getPaymentId());
-                    mt.setTradeNo(result.getHf_seq_id());
-                    fsStorePaymentMapper.updateFsStorePayment(mt);
-                    redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
-                    Map<String, Object> resultMap = JSON.parseObject(result.getPay_info(), new TypeReference<Map<String, Object>>() {});
-                    String s = (String) resultMap.get("package");
-                    resultMap.put("packageValue",s);
-                    return R.ok().put("result",resultMap);
-                }
-                else{
-                    return R.error(result.getResp_desc());
-                }
-            }else  if (fsPayConfig.getType().equals("wx")){
-                //创建微信订单
-                WxPayConfig payConfig = new WxPayConfig();
-                payConfig.setAppId(fsPayConfig.getAppId());
-                payConfig.setMchId(fsPayConfig.getWxMchId());
-                payConfig.setMchKey(fsPayConfig.getWxMchKey());
-                payConfig.setSubAppId(org.apache.commons.lang3.StringUtils.trimToNull(null));
-                payConfig.setSubMchId(org.apache.commons.lang3.StringUtils.trimToNull(null));
-                payConfig.setKeyPath(null);
-                payConfig.setNotifyUrl(fsPayConfig.getNotifyUrlScrm());
-                wxPayService.setConfig(payConfig);
-                WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
-                orderRequest.setOpenid(user.getMaOpenId());//公众号支付提供用户openid
-                orderRequest.setBody("商城订单支付");
-                orderRequest.setOutTradeNo("store-" + storePayment.getPayCode());
-                orderRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(storePayment.getPayMoney().toString()));//测试
-                //orderRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(money));//测试
-                orderRequest.setTradeType("JSAPI");
-                orderRequest.setSpbillCreateIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
-                //调用统一下单接口,获取"预支付交易会话标识"
-                try {
-                    WxPayMpOrderResult orderResult = wxPayService.createOrder(orderRequest);
-                    return R.ok().put("result", orderResult).put("type", "wx").put("isPay", 0);
-                } catch (WxPayException e) {
-                    e.printStackTrace();
-                    throw new CustomException("支付失败" + e.getMessage());
-                }
+            result = orderService.otherPayment(param);
+
+        } catch (InterruptedException e) {
+            logger.error("获取支付锁的过程被中断, 订单号: {}", orderId, e);
+            Thread.currentThread().interrupt();
+            return R.error("支付处理被中断,请稍后重试");
+        } catch (Throwable e) {
+            logger.error("亲友支付过程中发生异常, 订单号: {}", orderId, e);
+            throw e;
+        } finally {
+            if (lock != null && lock.isHeldByCurrentThread()) {
+                lock.unlock();
+                logger.debug("支付锁已释放, 订单号: {}", orderId);
             }
-        } catch (WxErrorException e) {
-            e.printStackTrace();
-            return R.error(e.getMessage());
         }
-        return R.error("无支付类型");
+
+        return result;
     }
 
     @Login
@@ -727,137 +384,74 @@ public class StoreOrderScrmController extends AppBaseController {
     @PostMapping("/otherPaymentRemain")
     @Transactional
     public R otherPaymentRemain(@Validated @RequestBody FsStoreOrderOtherPayParam param, HttpServletRequest request){
-        final WxMaService wxService = WxMaConfiguration.getMaService(properties.getConfigs().get(0).getAppid());
+        Long orderId = param.getOrderId();
+        logger.info("开始处理亲友支付请求, 订单号: {}", orderId);
+        String lockKey = String.format(LOCK_KEY_PAY,orderId);
+        RLock lock = redissonClient.getLock(lockKey);
+        R result = null;
         try {
-            String ip = IpUtil.getRequestIp();
-            WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
-            FsUserScrm user=userService.selectFsUserByMaOpenId(session.getOpenid());
-            if(user==null){
-                //创建
-                user=new FsUserScrm();
-                user.setUsername("");
-                user.setNickname("微信用户");
-                user.setStatus(1);
-                user.setMaOpenId(session.getOpenid());
-                user.setUnionId(session.getUnionid());
-                user.setIsWeixinAuth(0);
-                user.setLastIp(ip);
-                user.setCreateTime(new Date());
-                userService.insertFsUser(user);
-            }
-            FsStoreOrderScrm order=orderService.selectFsStoreOrderById(param.getOrderId());
-            if(order==null){
-                return R.error("订单不存在");
-            }
-            if(order.getStatus()!= OrderInfoEnum.STATUS_2.getValue()){
-                return R.error("待收货订单可申请支付尾款");
-            }
-            if(order.getPayType().equals(1)){
-                return R.error("此订单已支付");
-            }
-            //只有顺风才可以付尾
-            if(!order.getDeliverySn().trim().equals("SF")){
-                return R.error("只有顺丰物流支持尾款支付");
-            }
+            boolean locked = lock.tryLock(100, 30000, TimeUnit.MILLISECONDS);
 
-            if(!order.getIsPayRemain().equals(0)){
-                return R.error("此订单已支付");
+            if (!locked) {
+                logger.warn("订单正在处理中,获取锁失败, 订单号: {}", orderId);
+                return R.error("订单正在处理中,请勿重复提交");
             }
-            String payCode = IdUtil.getSnowflake(0, 0).nextIdStr();
-            String json = configService.selectConfigByKey(STORE_PAY_CONF);
-            FsPayConfigScrm fsPayConfig = JSON.parseObject(json, FsPayConfigScrm.class);
-            FsStorePaymentScrm storePayment=new FsStorePaymentScrm();
-            storePayment.setCompanyId(order.getCompanyId());
-            storePayment.setCompanyUserId(order.getCompanyUserId());
-            storePayment.setStatus(0);
-            storePayment.setPayMode(fsPayConfig.getType());
-            storePayment.setPayCode(payCode);
-            storePayment.setPayMoney(order.getPayDelivery());
-            storePayment.setCreateTime(new Date());
-            storePayment.setPayTypeCode("weixin");
-            storePayment.setBusinessType(2);
-            storePayment.setRemark("商城订单尾款支付");
-            storePayment.setOpenId(user.getRealName());
-            storePayment.setUserId(user.getUserId());
-            storePayment.setBusinessOrderId(order.getId().toString());
-            storePayment.setOrderId(order.getId());
-            storePayment.setIsPayRemain(1);
-            fsStorePaymentMapper.insertFsStorePayment(storePayment);
-
-            if (fsPayConfig.getType().equals("hf")){
-                HuiFuCreateOrder o = new HuiFuCreateOrder();
-                o.setTradeType("T_MINIAPP");
-                o.setOpenid(user.getMaOpenId());
-                o.setReqSeqId("store-"+storePayment.getPayCode());
-                o.setTransAmt(storePayment.getPayMoney().toString());
-                o.setGoodsDesc("商城订单支付");
-                HuifuCreateOrderResult result = huiFuService.createOrder(o);
-                if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
-
-                    FsStorePaymentScrm mt=new FsStorePaymentScrm();
-                    mt.setPaymentId(storePayment.getPaymentId());
-                    mt.setTradeNo(result.getHf_seq_id());
-                    fsStorePaymentMapper.updateFsStorePayment(mt);
-                    redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
-                    Map<String, Object> resultMap = JSON.parseObject(result.getPay_info(), new TypeReference<Map<String, Object>>() {});
-                    String s = (String) resultMap.get("package");
-                    resultMap.put("packageValue",s);
-                    return R.ok().put("result",resultMap);
-                }
-                else{
-                    return R.error(result.getResp_desc());
-                }
-            }else  if (fsPayConfig.getType().equals("wx")){
-                //创建微信订单
-                WxPayConfig payConfig = new WxPayConfig();
-                payConfig.setAppId(fsPayConfig.getAppId());
-                payConfig.setMchId(fsPayConfig.getWxMchId());
-                payConfig.setMchKey(fsPayConfig.getWxMchKey());
-                payConfig.setSubAppId(org.apache.commons.lang3.StringUtils.trimToNull(null));
-                payConfig.setSubMchId(org.apache.commons.lang3.StringUtils.trimToNull(null));
-                payConfig.setKeyPath(null);
-                payConfig.setNotifyUrl(fsPayConfig.getNotifyUrlScrm());
-                wxPayService.setConfig(payConfig);
-                WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
-                orderRequest.setOpenid(user.getMaOpenId());//公众号支付提供用户openid
-                orderRequest.setBody("商城订单支付");
-                orderRequest.setOutTradeNo("store-" + storePayment.getPayCode());
-                orderRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(storePayment.getPayMoney().toString()));//测试
-                //orderRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(money));//测试
-                orderRequest.setTradeType("JSAPI");
-                orderRequest.setSpbillCreateIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
-                //调用统一下单接口,获取"预支付交易会话标识"
-                try {
-                    WxPayMpOrderResult orderResult = wxPayService.createOrder(orderRequest);
-                    return R.ok().put("result", orderResult).put("type", "wx").put("isPay", 0);
-                } catch (WxPayException e) {
-                    e.printStackTrace();
-                    throw new CustomException("支付失败" + e.getMessage());
-                }
+
+            result = orderService.otherPaymentRemain(param);
+
+        } catch (InterruptedException e) {
+            logger.error("获取亲友支付锁的过程被中断, 订单号: {}", orderId, e);
+            Thread.currentThread().interrupt();
+            return R.error("支付处理被中断,请稍后重试");
+        } catch (Throwable e) {
+            logger.error("亲友支付过程中发生异常, 订单号: {}", orderId, e);
+            throw e;
+        } finally {
+            if (lock != null && lock.isHeldByCurrentThread()) {
+                lock.unlock();
+                logger.debug("亲友支付锁已释放, 订单号: {}", orderId);
             }
-        } catch (WxErrorException e) {
-            e.printStackTrace();
-            return R.error(e.getMessage());
         }
-        return R.error("无支付类型");
+
+        return result;
     }
 
 
     @Login
     @ApiOperation("取消订单")
     @PostMapping("/cancelOrder")
-//    @Log(title = "取消订单", businessType = BusinessType.UPDATE)
     public R cancelOrder( @Validated @RequestBody FsStoreOrderCancelParam param, HttpServletRequest request){
-        FsStoreOrderScrm order=orderService.selectFsStoreOrderById(param.getOrderId());
-        if (ObjectUtil.isNull(order)) {
-            throw new CustomException("订单不存在");
-        }
-        if (order.getStatus() !=0) {
-            throw new CustomException("非法操作");
-        }
-        orderService.cancelOrder(param.getOrderId());
 
-        return R.ok("操作成功");
+        Long orderId = param.getOrderId();
+        logger.info("开始处理取消订单请求, 订单号: {}", orderId);
+
+        RLock lock = redissonClient.getLock(String.format(LOCK_KEY_CANCEL,orderId));
+        R result = null;
+
+        try {
+            boolean locked = lock.tryLock(100, 30000, TimeUnit.MILLISECONDS);
+            if (!locked) {
+                throw new CustomException("订单正在处理中,请勿重复提交");
+            }
+            FsStoreOrderScrm order = orderService.selectFsStoreOrderById(orderId);
+            if (ObjectUtil.isNull(order)) {
+                throw new CustomException("订单不存在");
+            }
+            if (order.getStatus() != 0) {
+                throw new CustomException("非法操作");
+            }
+            orderService.cancelOrder(orderId);
+
+            result = R.ok("操作成功");
+        } catch (Exception e) {
+            logger.error("取消订单失败, 订单号: {}", orderId, e);
+            throw new CustomException("取消订单过程中发生错误");
+        } finally {
+            if (lock.isHeldByCurrentThread()) {
+                lock.unlock();
+            }
+        }
+        return result;
     }
     @Login
     @ApiOperation("物流查询")