Browse Source

Merge remote-tracking branch 'origin/master'

Guos 2 days ago
parent
commit
31e1f0b3d3
21 changed files with 697 additions and 105 deletions
  1. 48 0
      fs-admin/src/main/java/com/fs/his/controller/HzOMSErpApiController.java
  2. 21 1
      fs-admin/src/main/java/com/fs/hisStore/task/MallStoreTask.java
  3. 41 2
      fs-admin/src/main/java/com/fs/qw/controller/QwPushCountController.java
  4. 4 0
      fs-service/src/main/java/com/fs/erp/service/IErpOrderService.java
  5. 198 3
      fs-service/src/main/java/com/fs/erp/service/impl/DfOrderServiceImpl.java
  6. 11 0
      fs-service/src/main/java/com/fs/erp/service/impl/ErpOrderServiceImpl.java
  7. 11 0
      fs-service/src/main/java/com/fs/erp/service/impl/HzOMSErpOrderServiceImpl.java
  8. 10 0
      fs-service/src/main/java/com/fs/erp/service/impl/JSTErpOrderServiceImpl.java
  9. 10 0
      fs-service/src/main/java/com/fs/erp/service/impl/K9OrderScrmServiceImpl.java
  10. 10 0
      fs-service/src/main/java/com/fs/erp/service/impl/WdtErpOrderServiceImpl.java
  11. 2 80
      fs-service/src/main/java/com/fs/his/service/impl/FsStoreAfterSalesServiceImpl.java
  12. 25 0
      fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java
  13. 12 1
      fs-service/src/main/java/com/fs/hisStore/enums/OrderLogEnum.java
  14. 3 0
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreOrderScrmMapper.java
  15. 4 0
      fs-service/src/main/java/com/fs/hisStore/service/IFsStoreOrderScrmService.java
  16. 163 0
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java
  17. 1 0
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStorePaymentScrmServiceImpl.java
  18. 96 0
      fs-service/src/main/java/com/fs/huifuPay/sdk/opps/core/utils/HuiFuUtils.java
  19. 2 1
      fs-service/src/main/resources/mapper/course/FsUserCompanyBindMapper.xml
  20. 9 17
      fs-user-app/src/main/java/com/fs/app/controller/HuifuPayController.java
  21. 16 0
      fs-user-app/src/main/java/com/fs/app/controller/store/PayScrmController.java

+ 48 - 0
fs-admin/src/main/java/com/fs/his/controller/HzOMSErpApiController.java

@@ -8,6 +8,7 @@ import com.fs.his.param.HzOMSErpApiParam;
 import com.fs.his.service.ErpApiService;
 import com.fs.his.service.IFsStoreOrderService;
 import com.fs.his.vo.HzOMSErpResponseVO;
+import com.fs.hisStore.service.IFsStoreOrderScrmService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.IOUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -40,6 +41,9 @@ public class HzOMSErpApiController {
     @Autowired
     private IFsStoreOrderService fsStoreOrderService;
 
+    @Autowired
+    private IFsStoreOrderScrmService fsStoreOrderScrmService;
+
     /**
      * 用于将瀚智商品库存同步到第三方
      *
@@ -169,4 +173,48 @@ public class HzOMSErpApiController {
                 ? fsStoreOrderService.receiveWaybillPush(body)
                 : R.ok();
     }
+
+    /**
+     * 代服管家订单回调
+     */
+    @PostMapping("/dfNotifyUrlScrm")
+    public R dfOrderScrmResult(HttpServletRequest request){
+        String body = null;
+        try {
+            // 1. 先设置编码
+            request.setCharacterEncoding("UTF-8");
+            // 3. 按 UTF-8 解码
+            body = IOUtils.toString(request.getInputStream(), StandardCharsets.UTF_8);
+        } catch (IOException e) {
+            log.error("读取 body 失败", e);
+            return null;
+        }
+        log.info("Body UTF-8: {}", body);
+
+        return StringUtils.isNotBlank(body)
+                ? fsStoreOrderScrmService.dfOrderResult(body)
+                : R.ok();
+    }
+
+    /**
+     * 代服管家订单状态回调
+     */
+    @PostMapping("/receiveWaybillPushScrm")
+    public R receiveWaybillPushScrm(HttpServletRequest request) {
+        String body = null;
+        try {
+            // 1. 先设置编码
+            request.setCharacterEncoding("UTF-8");
+            // 3. 按 UTF-8 解码
+            body = IOUtils.toString(request.getInputStream(), StandardCharsets.UTF_8);
+        } catch (IOException e) {
+            log.error("读取 body 失败", e);
+            return null;
+        }
+        log.info("Body UTF-8: {}", body);
+
+        return StringUtils.isNotBlank(body)
+                ? fsStoreOrderScrmService.receiveWaybillPush(body)
+                : R.ok();
+    }
 }

+ 21 - 1
fs-admin/src/main/java/com/fs/hisStore/task/MallStoreTask.java

@@ -51,6 +51,7 @@ import java.time.LocalTime;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.CompletableFuture;
 
 import static com.fs.hisStore.constants.StoreConstants.DELIVERY;
 
@@ -507,7 +508,7 @@ public class MallStoreTask
                     //旺店通
                     erpOrderService = wdtOrderService;
                 } else if (erpType == 3) {
-                    //瀚智
+                    //代服
                     erpOrderService = hzOMSOrderService;
                 } else if (erpType == 4) {
                     //瀚智
@@ -625,4 +626,23 @@ public class MallStoreTask
         });
     }
 
+    public void getOrderDeliveryStatus()
+    {
+        IErpOrderService erpOrderService = getErpOrderService();
+        List<FsStoreOrderScrm> orders = null;
+        if (erpOrderService != null && erpOrderService == dfOrderService) {
+            orders = fsStoreOrderMapper.selectShippedOrder();
+            if (orders != null && !orders.isEmpty()) {
+                List<CompletableFuture<Void>> futures = new ArrayList<>();
+                for (FsStoreOrderScrm order : orders) {
+                    CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
+                        erpOrderService.getOrderScrmDeliveryStatus(order);
+                    });
+                    futures.add(future);
+                }
+                CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
+            }
+        }
+    }
+
 }

+ 41 - 2
fs-admin/src/main/java/com/fs/qw/controller/QwPushCountController.java

@@ -1,9 +1,12 @@
 package com.fs.qw.controller;
 
 import com.fs.common.annotation.Log;
+import com.fs.common.constant.HttpStatus;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.PageDomain;
 import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.core.page.TableSupport;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.fastGpt.domain.FastGptPushTokenTotal;
@@ -156,8 +159,44 @@ public class QwPushCountController extends BaseController {
     @PreAuthorize("@ss.hasPermi('qw:qwPushCount:tokenList')")
     @GetMapping("/tokenList")
     public TableDataInfo tokenList(FastGptPushTokenTotal pushTokenInfo) {
-        startPage();
         List<FastGptPushTokenTotal> list = qwPushCountService.selectFastGptPushTokenTotalList(pushTokenInfo);
-        return getDataTable(list);
+
+
+        // 计算总和
+        FastGptPushTokenTotal sumTotal = new FastGptPushTokenTotal();
+        sumTotal.setCompanyName("合计"); // 假设有一个字段用于显示“合计”标签,具体字段名根据实际情况替换
+        Long sum = list.stream().mapToLong(FastGptPushTokenTotal::getCount).sum(); // 假设有一个数字字段需要求和,具体字段名根据实际情况替换
+        sumTotal.setCount(sum); // 设置合计值,具体字段名根据实际情况替换
+
+        // 获取分页参数
+        PageDomain pageDomain = TableSupport.buildPageRequest();
+        Integer pageNum = pageDomain.getPageNum();
+        Integer pageSize = pageDomain.getPageSize();
+
+        int total = list.size();
+        // 在内存中进行分页处理
+        if (pageNum != null && pageSize != null) {
+            int fromIndex = (pageNum - 1) * pageSize;
+            int toIndex = Math.min(fromIndex + pageSize, total);
+
+            // 确保索引不越界
+            if (fromIndex < total) {
+                list = list.subList(fromIndex, toIndex);
+            } else {
+                list = new ArrayList<>(); // 返回空列表
+            }
+        }
+
+
+
+        list.add(sumTotal); // 将合计行添加到列表末尾
+
+        // 构造返回结果
+        TableDataInfo rspData = new TableDataInfo();
+        rspData.setCode(HttpStatus.SUCCESS);
+        rspData.setMsg("查询成功");
+        rspData.setRows(list);
+        rspData.setTotal(total);
+        return rspData;
     }
 }

+ 4 - 0
fs-service/src/main/java/com/fs/erp/service/IErpOrderService.java

@@ -4,6 +4,7 @@ import com.fs.erp.domain.ErpOrder;
 import com.fs.erp.domain.ErpRefundOrder;
 import com.fs.erp.dto.*;
 import com.fs.his.domain.FsStoreOrder;
+import com.fs.hisStore.domain.FsStoreOrderScrm;
 
 public interface IErpOrderService
 {
@@ -14,6 +15,7 @@ public interface IErpOrderService
 
     //用户发起退款,然后后台审核通过后,提交退款单
     ErpOrderResponse refundOrder(ErpRefundOrder order);
+    ErpOrderResponse refundOrderScrm(ErpRefundOrder order);
     ErpDeliverysResponse getDeliver(ErpDeliverysRequest param);
     ErpOrderQueryResponse getOrder(ErpOrderQueryRequert param);
     ErpOrderQueryResponse getScrmOrder(ErpOrderQueryRequert param);
@@ -23,5 +25,7 @@ public interface IErpOrderService
     ErpOrderResponse finishOrder(ErpOrder order);
     //代服管家查物流状态
     void getOrderDeliveryStatus(FsStoreOrder order);
+
+    void getOrderScrmDeliveryStatus(FsStoreOrderScrm order);
 }
 

+ 198 - 3
fs-service/src/main/java/com/fs/erp/service/impl/DfOrderServiceImpl.java

@@ -7,6 +7,7 @@ import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.fs.common.core.redis.RedisCache;
 import com.fs.common.event.TemplateBean;
 import com.fs.common.event.TemplateEvent;
 import com.fs.common.event.TemplateListenEnum;
@@ -40,6 +41,7 @@ import com.fs.hisStore.enums.ShipperCodeEnum;
 import com.fs.hisStore.mapper.FsStoreOrderItemScrmMapper;
 import com.fs.hisStore.mapper.FsStoreOrderScrmMapper;
 import com.fs.hisStore.mapper.FsStoreProductScrmMapper;
+import com.fs.hisStore.param.FsStoreAfterSalesParam;
 import com.fs.hisStore.service.IFsExpressScrmService;
 import com.fs.hisStore.service.IFsStoreOrderScrmService;
 import com.fs.hisStore.vo.FsStoreOrderItemVO;
@@ -58,6 +60,8 @@ import java.math.BigDecimal;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicBoolean;
 
+import static com.fs.hisStore.constants.StoreConstants.DELIVERY;
+
 @Service
 @Slf4j
 public class DfOrderServiceImpl implements IErpOrderService {
@@ -115,9 +119,15 @@ public class DfOrderServiceImpl implements IErpOrderService {
     @Autowired
     private IFsStoreOrderService fsStoreOrderService;
 
+    @Autowired
+    private IFsStoreOrderScrmService fsStoreOrderScrmService;
+
     @Autowired
     private SysConfigMapper sysConfigMapper;
 
+    @Autowired
+    private RedisCache redisCache;
+
 
     @Override
     public ErpOrderResponse addOrder(ErpOrder order) {
@@ -184,6 +194,61 @@ public class DfOrderServiceImpl implements IErpOrderService {
         return new ErpOrderResponse();
     }
 
+    /**
+     * 退款 取消订单
+     *
+     * @param order
+     * @return
+     */
+    @Override
+    public ErpOrderResponse refundOrderScrm(ErpRefundOrder order) {
+        //获取代服账户
+        String orderCode = order.getOrderCode();
+        FsStoreOrderScrm fsStoreOrder = fsStoreOrderScrmMapper.selectFsStoreOrderByOrderCode(orderCode);
+        FsStoreOrderDf df = fsStoreOrderDfMapper.selectFsStoreOrderDfByOrderId(fsStoreOrder.getId());
+        if (df == null) {
+            return null;
+        }
+        Long dfAccountId = getSFAccountIndex(fsStoreOrder.getId());
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("loginAccount", df.getLoginAccount());
+        FsDfAccount dfAccount = fsDfAccountMapper.selectFsDfAccountById(dfAccountId);
+        if (dfAccount != null && StringUtils.isNotBlank(dfAccount.getCallBackUrl())) {
+            map.put("callBackUrl", dfAccount.getCallBackUrl());
+        }
+        map.put("orderNumber", orderCode);
+        map.put("mailNumber", fsStoreOrder.getDeliveryId());
+        try {
+            //2.请求
+            log.info("开始取消订单,参数: {}", JSON.toJSONString(map));
+            String response = client.execute(RequestUrlEnum.ORDER_CANCEL, map, dfAccountId);
+            DFApiResponse dfApiResponse = JSON.parseObject(response, DFApiResponse.class);
+            //3.处理请求结果
+            if (dfApiResponse != null && "ok".equals(dfApiResponse.getCode())) {
+                //存储订单推送用的哪个账户
+                log.info("订单取消成功: {}", response);
+                //修改df表
+                df.setStatus(2);
+                df.setUpdateTime(DateUtils.getNowDate());
+                fsStoreOrderDfMapper.updateFsStoreOrderDf(df);
+                //可以回调 也可以查询订单
+                Map<String, Object> orderResultQueryParam = new HashMap<>();
+                orderResultQueryParam.put("orderNumber", orderCode);
+                orderResultQueryParam.put("exInterfaceType", 2); //2为查询取消订单结果
+//                    getOrderResult(orderResultQueryParam,sfAccountIndex);
+                ErpOrderResponse erpOrderResponse = new ErpOrderResponse();
+                erpOrderResponse.setCode(orderCode);
+                erpOrderResponse.setSuccess(true);
+                return erpOrderResponse;
+            } else {
+                throw new RuntimeException(String.format("订单取消失败,原因: %s", dfApiResponse.getMsg()));
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return new ErpOrderResponse();
+    }
+
     @Override
     public ErpDeliverysResponse getDeliver(ErpDeliverysRequest request) {
         ErpDeliverysResponse erpDeliverysResponse = new ErpDeliverysResponse();
@@ -310,8 +375,10 @@ public class DfOrderServiceImpl implements IErpOrderService {
     }
 
     @Override
-    public BaseResponse refundUpdateScrm(ErpRefundUpdateRequest param) {
-        return null;
+    public BaseResponse refundUpdateScrm(ErpRefundUpdateRequest request) {
+        ErpRefundOrder erpRefundOrder = new ErpRefundOrder();
+        erpRefundOrder.setOrderCode(request.getTid());
+        return refundOrderScrm(erpRefundOrder);
     }
 
     @Override
@@ -414,6 +481,101 @@ public class DfOrderServiceImpl implements IErpOrderService {
         }
     }
 
+    @Override
+    public void getOrderScrmDeliveryStatus(FsStoreOrderScrm order) {
+        Map<String, Object> map = new HashMap<>();
+        Long dfAccountId = getSFAccountIndex(order.getId());
+        map.put("orderNumber", order.getOrderCode());
+        map.put("mailNumber", order.getDeliveryId());
+        try {
+            String response = client.execute(RequestUrlEnum.ORDER_DELIVERY_STATUS, map, dfAccountId);
+            DFApiResponse dfApiResponse = JSON.parseObject(response, DFApiResponse.class);
+            if ("运单不存在".equals(dfApiResponse.getMsg())) {
+
+                //查看原来物流状态
+                cancelOrderScrm(order);
+                log.info("代服管家 getOrderDeliveryStatus: {}", response);
+                return;
+            }
+            //3.处理请求结果
+            if (dfApiResponse != null && "ok".equals(dfApiResponse.getCode())) {
+                String jsonString = JSON.toJSONString(dfApiResponse.getResult());
+//                List<DFOrderStatusResultRequest> requestList = JSON.parseArray(jsonString, DFOrderStatusResultRequest.class);
+                DFOrderStatusResultRequest temp = JSON.parseObject(jsonString, DFOrderStatusResultRequest.class);
+                //0待揽收 1已揽收 2运输中 3派送中 4异常件 5退回件 6退回签收 7转寄件 8作废件 9已签收 10 已取消
+                Integer deliveryStatus = 0;
+                String stateEx = "0";
+                FsStoreOrderScrm fsStoreOrderMap = new FsStoreOrderScrm();
+                fsStoreOrderMap.setId(order.getId());
+                Integer status = temp.getStatus();
+                switch (status) {
+                    case 0:
+                        //0待揽收 1已揽收 2运输中
+                        deliveryStatus = status;
+                        stateEx = status.toString();
+                        break;
+                    case 1:
+                        //0待揽收 1已揽收 2运输中
+                        deliveryStatus = status;
+                        stateEx = status.toString();
+                        break;
+                    case 2:
+                        //0待揽收 1已揽收 2运输中
+                        deliveryStatus = status;
+                        stateEx = status.toString();
+                        break;
+                    case 3:
+                        //3派送中
+                        deliveryStatus = 2;
+                        stateEx = "202";
+                        break;
+                    case 4:
+                        // 4异常件
+                        deliveryStatus = status;
+                        stateEx = status.toString();
+                        break;
+                    case 5:
+                        //5退回件
+                        deliveryStatus = 4;
+                        stateEx = "407"; //退货未签收
+                        break;
+                    case 6:
+                        // 6退回签收 7转寄件 8作废件 9已签收 10 已取消
+                        deliveryStatus = status;
+                        stateEx = "406"; //退货签收
+                        break;
+                    case 9:
+                        //已签收
+                        deliveryStatus = 3;
+                        stateEx = "301"; //退货签收
+//                        SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey("his.store");
+//                        Map<String, Object> config = (Map<String, Object>) JSON.parse(sysConfig.getConfigValue());
+//                        Object isUpdateOrder = config.get("isUpdateOrder");
+//                        if (isUpdateOrder == null || "1".equals(isUpdateOrder.toString())) {
+//                            fsStoreOrderService.getGoods(order.getId(), "物流自动");
+//                        }
+                        break;
+                    case 10:
+                        //取消订单
+                        String mailNumber = temp.getMailNumber();
+                        List<FsStoreOrderScrm> fsStoreOrders = fsStoreOrderScrmMapper.selectFsStoreOrderListByDeliveryId(mailNumber);
+                        if (fsStoreOrders != null && !fsStoreOrders.isEmpty()) {
+                            fsStoreOrders.forEach(tempOrder -> {
+                                cancelOrderScrm(order);
+                                log.info("代服管家 订单取消成功: {}", response);
+                            });
+                        }
+                        break;
+                }
+                fsStoreOrderMap.setDeliveryStatus(deliveryStatus); //物流状态:0-暂无轨迹信息 1-已揽收 2-在途中,3-签收,4-问题件
+                fsStoreOrderMap.setDeliveryType(stateEx);
+                fsStoreOrderScrmMapper.updateFsStoreOrder(fsStoreOrderMap);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
     private void cancelOrder(FsStoreOrder order) {
         Integer deliveryStatus = order.getDeliveryStatus();
         if (deliveryStatus == null || deliveryStatus == 0) {
@@ -443,6 +605,37 @@ public class DfOrderServiceImpl implements IErpOrderService {
         fsStoreOrderDfMapper.updateFsStoreOrderDf(df);
     }
 
+    private void cancelOrderScrm(FsStoreOrderScrm order) {
+        Integer deliveryStatus = order.getDeliveryStatus();
+        if (deliveryStatus == null || deliveryStatus == 0) {
+            //没有物流信息
+            //修改订单状态 方便后续重新发货
+            order.setStatus(OrderInfoEnum.STATUS_1.getValue());
+            order.setExtendOrderId("");
+            order.setDeliveryId("");
+            fsStoreOrderScrmMapper.updateFsStoreOrder(order);
+            fsStoreOrderScrmLogsService.create(order.getId(), OrderLogEnum.UPDATE_ORDER_DF.getValue(),
+                    "运单不存在," + OrderLogEnum.UPDATE_ORDER_DF.getDesc());
+        } else {
+            //有物流信息->售后处理
+            //取消订单
+            FsStoreAfterSalesParam afterSalesParam = new FsStoreAfterSalesParam();
+//            afterSalesParam.setOrderId(order.getId());
+//            afterSalesParam.setOrderCode(order.getOrderCode());
+//            afterSalesParam.setReasons("代服管家取消订单");
+//            afterSalesParam.setOperator("代服管家");
+//            fsStoreOrderScrmService.afterSales(afterSalesParam);
+            fsStoreOrderScrmService.refundOrderMoney(order.getId());
+            fsStoreOrderScrmLogsService.create(order.getId(), OrderLogEnum.REFUND_ORDER_DF.getValue(),
+                    "运单不存在," + OrderLogEnum.REFUND_ORDER_DF.getDesc());
+        }
+        FsStoreOrderDf df = new FsStoreOrderDf();
+        df.setOrderId(order.getId());
+        df.setStatus(2);
+        df.setUpdateTime(new Date());
+        fsStoreOrderDfMapper.updateFsStoreOrderDf(df);
+    }
+
     /**
      * 获取erp推送参数
      *
@@ -632,7 +825,7 @@ public class DfOrderServiceImpl implements IErpOrderService {
             couponPrice = BigDecimal.ZERO;
         }
 
-        if (ObjectUtil.equal(1, fsStoreOrder.getPayType())) {
+        if ("1".equals(fsStoreOrder.getPayType())) {
             //在线支付
             orderPayMethod = 1;
         } else { // 如果是线上付款
@@ -1011,6 +1204,7 @@ public class DfOrderServiceImpl implements IErpOrderService {
                                             order.setDeliverySendTime(DateUtils.getNowDate()); //更新发货时间
                                             fsStoreOrderMapper.updateFsStoreOrder(order);
                                             fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.DELIVERY_GOODS.getValue(), FsStoreOrderLogEnum.DELIVERY_GOODS.getDesc());
+                                            redisCache.deleteObject(DELIVERY+":"+order.getExtendOrderId());
                                             if (order.getCompanyId() != null && order.getCompanyId() > 0) {
                                                 companyService.subtractCompanyMoney(order);
                                             }
@@ -1087,6 +1281,7 @@ public class DfOrderServiceImpl implements IErpOrderService {
 
                                             fsStoreOrderScrmMapper.updateFsStoreOrder(order);
                                             fsStoreOrderScrmLogsService.create(order.getId(), FsStoreOrderLogEnum.DELIVERY_GOODS.getValue(), FsStoreOrderLogEnum.DELIVERY_GOODS.getDesc());
+                                            redisCache.deleteObject(DELIVERY+":"+order.getExtendOrderId());
                                             //订阅物流回调
 //                                            String lastFourNumber = "";
 //                                            if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())) {

+ 11 - 0
fs-service/src/main/java/com/fs/erp/service/impl/ErpOrderServiceImpl.java

@@ -11,6 +11,7 @@ import com.fs.erp.utils.CommonUtils;
 import com.fs.his.config.FsSysConfig;
 import com.fs.his.domain.FsStoreOrder;
 import com.fs.his.utils.ConfigUtil;
+import com.fs.hisStore.domain.FsStoreOrderScrm;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -83,6 +84,11 @@ public class ErpOrderServiceImpl implements IErpOrderService
         return response;
     }
 
+    @Override
+    public ErpOrderResponse refundOrderScrm(ErpRefundOrder order) {
+        return null;
+    }
+
     @Override
     public ErpDeliverysResponse getDeliver(ErpDeliverysRequest request) {
         FsSysConfig sysConfig = configUtil.getSysConfig();
@@ -153,4 +159,9 @@ public class ErpOrderServiceImpl implements IErpOrderService
     public void getOrderDeliveryStatus(FsStoreOrder order) {
 
     }
+
+    @Override
+    public void getOrderScrmDeliveryStatus(FsStoreOrderScrm order) {
+
+    }
 }

+ 11 - 0
fs-service/src/main/java/com/fs/erp/service/impl/HzOMSErpOrderServiceImpl.java

@@ -13,6 +13,7 @@ import com.fs.erp.service.IErpOrderService;
 import com.fs.his.domain.*;
 import com.fs.his.service.*;
 import com.fs.his.utils.PhoneUtil;
+import com.fs.hisStore.domain.FsStoreOrderScrm;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -77,6 +78,11 @@ public class HzOMSErpOrderServiceImpl implements IErpOrderService {
         return null;
     }
 
+    @Override
+    public ErpOrderResponse refundOrderScrm(ErpRefundOrder order) {
+        return null;
+    }
+
     @Override
     public ErpDeliverysResponse getDeliver(ErpDeliverysRequest param) {
         return null;
@@ -171,6 +177,11 @@ public class HzOMSErpOrderServiceImpl implements IErpOrderService {
 
     }
 
+    @Override
+    public void getOrderScrmDeliveryStatus(FsStoreOrderScrm order) {
+
+    }
+
     /**
      * 构建瀚智创建订单参数
      *

+ 10 - 0
fs-service/src/main/java/com/fs/erp/service/impl/JSTErpOrderServiceImpl.java

@@ -334,6 +334,11 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
         return null;
     }
 
+    @Override
+    public ErpOrderResponse refundOrderScrm(ErpRefundOrder order) {
+        return null;
+    }
+
     @Override
     public ErpDeliverysResponse getDeliver(ErpDeliverysRequest param) {
         return null;
@@ -636,5 +641,10 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
     public void getOrderDeliveryStatus(FsStoreOrder order) {
 
     }
+
+    @Override
+    public void getOrderScrmDeliveryStatus(FsStoreOrderScrm order) {
+
+    }
 }
 

+ 10 - 0
fs-service/src/main/java/com/fs/erp/service/impl/K9OrderScrmServiceImpl.java

@@ -88,6 +88,11 @@ public class K9OrderScrmServiceImpl implements IErpOrderService {
         return null;
     }
 
+    @Override
+    public ErpOrderResponse refundOrderScrm(ErpRefundOrder order) {
+        return null;
+    }
+
     private KingbosRefundOrderRequest getKingbosRefundOrderRequest(String orderCode) {
         FsStoreOrderScrm order = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(orderCode);
         if (order != null){
@@ -450,4 +455,9 @@ public class K9OrderScrmServiceImpl implements IErpOrderService {
     public void getOrderDeliveryStatus(FsStoreOrder order) {
 
     }
+
+    @Override
+    public void getOrderScrmDeliveryStatus(FsStoreOrderScrm order) {
+
+    }
 }

+ 10 - 0
fs-service/src/main/java/com/fs/erp/service/impl/WdtErpOrderServiceImpl.java

@@ -795,6 +795,11 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
         return null;
     }
 
+    @Override
+    public ErpOrderResponse refundOrderScrm(ErpRefundOrder order) {
+        return null;
+    }
+
     @Override
     public ErpDeliverysResponse getDeliver(ErpDeliverysRequest param) {
         return null;
@@ -1093,6 +1098,11 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
 
     }
 
+    @Override
+    public void getOrderScrmDeliveryStatus(FsStoreOrderScrm order) {
+
+    }
+
     public static String convertToSnakeCase(Object obj) {
         SerializeConfig config = new SerializeConfig();
         config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;

+ 2 - 80
fs-service/src/main/java/com/fs/his/service/impl/FsStoreAfterSalesServiceImpl.java

@@ -50,6 +50,7 @@ import com.fs.his.utils.ConfigUtil;
 import com.fs.his.vo.*;
 import com.fs.huifuPay.domain.HuiFuRefundResult;
 import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayRefundRequest;
+import com.fs.huifuPay.sdk.opps.core.utils.HuiFuUtils;
 import com.fs.huifuPay.service.HuiFuService;
 import com.fs.im.dto.*;
 import com.fs.im.service.IImService;
@@ -562,7 +563,7 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
                 //1.判断是否是全额退款
                 CompanyDivItem companyDivItem = null;
                 try {
-                    companyDivItem = doRefundDiv(fsStoreOrder, reMoney, payment, extendInfoMap);
+                    companyDivItem = HuiFuUtils.doRefundDiv(fsStoreOrder.getPayPrice(), reMoney, payment, extendInfoMap);
                 } catch (Exception e) {
                     logger.error("-----------------分账退款处理失败{}", e.getMessage());
                 }
@@ -629,86 +630,7 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
         return i;
     }
 
-    /**
-     * 处理分账退款
-     *
-     * @param fsStoreOrder
-     * @param reMoney
-     * @param payment
-     * @param extendInfoMap
-     */
-    private CompanyDivItem doRefundDiv(FsStoreOrder fsStoreOrder, BigDecimal reMoney, FsStorePayment payment, Map<String, Object> extendInfoMap) {
-        CompanyDivItem companyDivItem = null;
-        Long companyId = fsStoreOrder.getCompanyId();
-        if (companyId != null) {
-            companyDivItem = companyDivItemService.selectCompanyDivItemByPayCode(payment.getPayCode());
-            if (fsStoreOrder.getPayPrice().compareTo(reMoney) > 0) {
-                //部分退款
-                if (companyDivItem != null) {
-                    SysConfigMapper sysConfigMapper = SpringUtils.getBean(SysConfigMapper.class);
-                    SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey("his.pay");
-                    FsPayConfig fsPayConfig = new Gson().fromJson(sysConfig.getConfigValue(), FsPayConfig.class);
-                    String defaultHuiFuId = fsPayConfig.getHuifuId(); //默认汇付id
-
-                    String detail = companyDivItem.getDetail();
-                    if (StringUtils.isNotBlank(detail)) {
-                        JSONObject acctSplitBunch = JSONObject.parseObject(detail);
-                        if (acctSplitBunch.get("percentage_flag") != null) {
-                            List<Map<String, Object>> param = new ArrayList(); //传入汇付参数
-
-                            String percentageFlag = acctSplitBunch.get("percentage_flag").toString();
-                            Object acctInfosObj = acctSplitBunch.get("acct_infos");
-                            if (acctInfosObj != null) {
-                                if ("Y".equals(percentageFlag)) {
-                                    // 百分比分账
-                                    List<Map> acctInfos = JSON.parseArray(acctInfosObj.toString(), Map.class);
-                                    if (acctInfos != null && !acctInfos.isEmpty()) {
-                                        BigDecimal remainMoney = reMoney;
-
-                                        for (Map acctInfo : acctInfos) {
-                                            String percentageDiv = acctInfo.get("percentage_div").toString();
-                                            BigDecimal divAmt = reMoney.multiply(BigDecimal.valueOf(Float.valueOf(percentageDiv)).multiply(BigDecimal.valueOf(0.01))).setScale(2, BigDecimal.ROUND_HALF_UP);
-                                            if (divAmt.compareTo(BigDecimal.ZERO) <= 0) {
-                                                continue;
-                                            }
-                                            remainMoney = remainMoney.subtract(divAmt);
-                                            String huiFuId = acctInfo.get("huifu_id").toString();
-                                            Map<String, Object> map = new HashMap<>();
-                                            map.put("div_amt", divAmt);
-                                            map.put("huifu_id", huiFuId);
-//                                                part_loan_amt	垫资金额
-                                            param.add(map);
-                                            if (remainMoney.compareTo(BigDecimal.ZERO) >= 0) {
-                                                break;
-                                            }
-                                        }
-                                        if (remainMoney.compareTo(BigDecimal.ZERO) >= 0) {
-                                            BigDecimal divAmt = reMoney.subtract(remainMoney).setScale(2, BigDecimal.ROUND_HALF_UP);
-                                            Map<String, Object> map = new HashMap<>();
-                                            map.put("div_amt", divAmt);
-                                            map.put("huifu_id", defaultHuiFuId);
-                                            param.add(map);
-                                        }
-                                    }
-
-                                } else if ("N".equals(percentageFlag)) {
-                                    // 金额分账 目前按照排序从第一个开始扣 扣到满足退款金额
-                                }
-                                if (!param.isEmpty()) {
-                                    extendInfoMap.put("acct_split_bunch", JSON.toJSONString(param));
-                                }
-                            }
-
-                        }
-
 
-                    }
-                }
-            }
-        }
-        return companyDivItem;
-
-    }
 
     @Override
     public List<FsStoreAfterSalesExcelVO> selectFsStoreAfterSalesExcelListVO(FsStoreAfterSalesParam fsStoreAfterSales) {

+ 25 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java

@@ -26,10 +26,12 @@ import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.ip.IpUtils;
 import com.fs.company.domain.Company;
+import com.fs.company.domain.CompanyDivItem;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.mapper.CompanyConfigMapper;
 import com.fs.company.param.FsStoreStatisticsParam;
 import com.fs.company.service.ICompanyConfigService;
+import com.fs.company.service.ICompanyDivItemService;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.company.vo.FsStorePaymentStatisticsVO;
@@ -206,6 +208,9 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
     @Autowired
     private RedPacketLogMapper redPacketLogMapper;
 
+    @Autowired
+    private ICompanyDivItemService companyDivItemService;
+
     /**
      * 红包账户锁
      */
@@ -421,6 +426,8 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
                 orderType="course";
             }else if (fsStorePayment.getBusinessType()==5){
                 orderType="appvip";
+            } else if (fsStorePayment.getBusinessType()==7){
+                orderType="payment";
             }
 
             if(fsStorePayment.getPayMode().equals("wx")){
@@ -508,6 +515,14 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
                 Map<String, Object> extendInfoMap = new HashMap<>();
                 extendInfoMap.put("org_req_seq_id", orderType+"-"+fsStorePayment.getPayCode());
                 request.setExtendInfo(extendInfoMap);
+                //处理分账退款
+                //1.判断是否是全额退款
+                CompanyDivItem companyDivItem = null;
+                try {
+                    companyDivItem = HuiFuUtils.doRefundDiv(fsStorePayment.getPayMoney(), fsStorePayment.getPayMoney(), fsStorePayment, extendInfoMap);
+                } catch (Exception e) {
+                    logger.error("-----------------分账退款处理失败{}", e.getMessage());
+                }
                 HuiFuRefundResult refund = huiFuService.refund(request);
                 logger.info("订单退款返回结果:"+paymentId+""+refund);
                 if((refund.getResp_code().equals("00000000")||refund.getResp_code().equals("00000100"))&&(refund.getTrans_stat().equals("S")||refund.getTrans_stat().equals("P"))){
@@ -517,6 +532,15 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
                     paymentMap.setRefundTime(DateUtils.getNowDate());
                     paymentMap.setRefundMoney(fsStorePayment.getPayMoney());
                     fsStorePaymentMapper.updateFsStorePayment(paymentMap);
+                    try {
+                        //处理分账退款明细表
+                        if (companyDivItem !=null && companyDivItem.getId() != null) {
+                            companyDivItem.setIsRefund(1);
+                            companyDivItemService.updateCompanyDivItem(companyDivItem);
+                        }
+                    } catch (Exception e) {
+                        logger.error("-----------------分账退款明细处理失败{}", e.getMessage());
+                    }
                 }else {
                     throw new CustomException("退款请求失败"+refund.getResp_desc());
                 }
@@ -1578,6 +1602,7 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
         storePayment.setRemark("商城收款订单支付");
         storePayment.setOpenId(openId);
         storePayment.setUserId(user.getUserId());
+        storePayment.setPayMode("hf");//目前微信收款仅支持汇付
         fsStorePaymentMapper.insertFsStorePayment(storePayment);
 
         //汇付支付

+ 12 - 1
fs-service/src/main/java/com/fs/hisStore/enums/OrderLogEnum.java

@@ -13,6 +13,9 @@ public enum OrderLogEnum {
     REMOVE_ORDER("remove_order","删除订单"),
     EVAL_ORDER("order_eval","用户评价"),
     REFUND_ORDER_APPLY("apply_refund","用户申请退款"),
+    REFUND_ORDER_PLATFORM("REFUND_ORDER_PLATFORM","平台申请退款"),
+    REFUND_ORDER_DF("refund_order_df","代服取消订单,申请退款"),
+    UPDATE_ORDER_DF("update_order_df","代服取消订单,需要重新发货"),
     TAKE_ORDER_DELIVERY("user_take_delivery","用户已收货"),
     PAY_ORDER_SUCCESS("pay_success","用户付款成功"),
     PAY_REMAIN_ORDER_SUCCESS("pay_remain_success","用户付款尾款成功"),
@@ -24,7 +27,15 @@ public enum OrderLogEnum {
     FINISH_ORDER("finish","确认收货"),
     LOCK_TUI_MONEY("lock_tui_money","冻结推广金"),
     UNLOCK_TUI_MONEY("unlock_tui_money","解冻推广金"),
-    EDIT_ORDER_PRICE("edit_order_money","改价");
+    EDIT_ORDER_PRICE("edit_order_money","改价"),
+    PLATFORM_REVIEW_SALES("PLATFORM_REVIEW_SALES","平台已审核"),
+    WAREHOUSE_REVIEW_SALES("WAREHOUSE_REVIEW_SALES","仓库已审核"),
+    FINANCE_REVIEW_SALES("FINANCE_REVIEW_SALES","财务已审核"),
+    PLATFORM_REVIEW_CANCEL("PLATFORM_REVIEW_CANCEL","平台已取消售后"),
+
+    SET_PUSH_MOBILE("SET_PUSH_MOBILE","设置推送手机号"),
+    SET_PUSH_ACCOUNT("SET_PUSH_ACCOUNT","数据分拣"),
+    PUSH_ORDER_ERP("PUSH_ORDER_ERP","创建ERP");
 
     private String value;
     private String desc;

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

@@ -1375,4 +1375,7 @@ public interface FsStoreOrderScrmMapper
             " limit 50000 "+
             "</script>"})
     List<FsStoreOrderErpExportVO> selectFsStoreOrderErpListVOByExport(@Param("maps") FsStoreOrderParam param);
+
+    @Select("select * from fs_store_order_scrm where  `status`=2 and (extend_order_id is not null and extend_order_id != '') and (delivery_id is not null and delivery_id != '')")
+    List<FsStoreOrderScrm> selectShippedOrder();
 }

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

@@ -316,4 +316,8 @@ public interface IFsStoreOrderScrmService
     String selectFsStoreOrderProductStatistics(FsStoreOrderParam param);
 
     int create(Long orderId, String type, String msg);
+
+    R dfOrderResult(String body);
+
+    R receiveWaybillPush(String body);
 }

+ 163 - 0
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java

@@ -50,6 +50,7 @@ import com.fs.core.utils.OrderCodeUtils;
 import com.fs.course.dto.FsOrderDeliveryNoteDTO;
 import com.fs.erp.domain.*;
 import com.fs.erp.dto.*;
+import com.fs.erp.dto.df.*;
 import com.fs.erp.mapper.FsErpFinishPushMapper;
 import com.fs.erp.service.IErpOrderService;
 import com.fs.his.config.FsSysConfig;
@@ -90,6 +91,7 @@ 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.sdk.opps.core.utils.HuiFuUtils;
 import com.fs.huifuPay.service.HuiFuService;
 import com.fs.pay.pay.dto.OrderQueryDTO;
 import com.fs.pay.pay.dto.RefundDTO;
@@ -355,6 +357,9 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
     @Autowired
     private FsStoreOrderLogsScrmMapper fsStoreOrderLogsScrmMapper;
 
+    @Autowired
+    private FsStoreOrderDfMapper fsStoreOrderDfMapper;
+
     @PostConstruct
     public void initErpServiceMap() {
         erpServiceMap = new HashMap<>();
@@ -3916,6 +3921,13 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                     o.setTransAmt(storePayment.getPayMoney().toString());
                     o.setGoodsDesc("商城订单支付");
                     o.setAppId(param.getAppId());
+                    try {
+                        HuiFuUtils.doDiv(o,order.getCompanyId());
+                        //存储分账明细
+                        HuiFuUtils.saveDivItem(o, order.getOrderCode(), storePayment.getPayCode());
+                    } catch (Exception e) {
+                        logger.error("-------------分账出错:{}", e.getMessage());
+                    }
                     HuifuCreateOrderResult result = huiFuService.createOrder(o);
                     if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
                         FsStorePaymentScrm mt=new FsStorePaymentScrm();
@@ -4489,6 +4501,157 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
         return fsStoreOrderLogsScrmMapper.insertFsStoreOrderLogs(logs);
     }
 
+    @Override
+    @Transactional
+    public R dfOrderResult(String body) {
+        //先判断 取消订单/创建订单
+        DFCancelOrderResultRequest cancelParam = JSON.parseObject(body, DFCancelOrderResultRequest.class);
+        if (cancelParam.getIsCancelSuss() != null) {
+            //取消订单
+            log.info("代服管家取消订单回调,{}", JSON.toJSONString(cancelParam));
+            FsStoreOrderScrm fsStoreOrder = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(cancelParam.getOrderNumber());
+            if (fsStoreOrder != null) {
+//                //1.修改订单
+//                FsStoreOrderSalesParam afterSalesParam = new FsStoreOrderSalesParam();
+//                afterSalesParam.setOrderId(fsStoreOrder.getOrderId());
+//                afterSalesParam.setReasons("代服管家取消订单");
+//                afterSalesParam.setOperator("代服管家");
+//                afterSales(afterSalesParam);
+            }
+
+        } else {
+            BspOrderResponseWrapper addParam = JSON.parseObject(body, BspOrderResponseWrapper.class);
+            if (addParam == null) {
+                return R.ok("接收成功").put("code", "ok");
+            }
+            String failMsg = addParam.getFailMsg();
+            if (com.hc.openapi.tool.util.StringUtils.isNotBlank(failMsg)) {
+                if (failMsg.equals("暂未结果, 请稍后再查")) {
+                    return R.ok("接收成功").put("code", "ok");
+                }
+                //下单失败 返回未推送状态
+                String orderNumber = addParam.getOrderNumber();
+                FsStoreOrderScrm fsStoreOrder = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(orderNumber);
+                FsStoreOrderScrm tempOrder = new FsStoreOrderScrm();
+                tempOrder.setId(fsStoreOrder.getId());
+                Integer deliveryStatus = fsStoreOrder.getDeliveryStatus();
+                if (deliveryStatus == null || deliveryStatus == 0) {
+                    //没有物流信息
+                    //修改订单状态 方便后续重新发货
+                    tempOrder.setStatus(FsStoreOrderStatusEnum.STATUS_2.getValue());
+                    tempOrder.setExtendOrderId("");
+                    tempOrder.setDeliverySn("");
+                    fsStoreOrderMapper.updateFsStoreOrder(tempOrder);
+                    fsStoreOrderLogsService.create(tempOrder.getId(), OrderLogEnum.UPDATE_ORDER_DF.getValue(),
+                            "运单不存在,"+OrderLogEnum.UPDATE_ORDER_DF.getDesc());
+                } else {
+                    //有物流信息->售后处理
+                    //取消订单
+//                    FsStoreOrderSalesParam afterSalesParam = new FsStoreOrderSalesParam();
+//                    afterSalesParam.setOrderId(tempOrder.getOrderId());
+//                    afterSalesParam.setReasons("代服管家取消订单");
+//                    afterSalesParam.setOperator("代服管家");
+//                    fsStoreOrderService.afterSales(afterSalesParam);
+                    refundOrderMoney(fsStoreOrder.getId());
+                    fsStoreOrderLogsService.create(tempOrder.getId(), OrderLogEnum.REFUND_ORDER_DF.getValue(),
+                            "运单不存在,"+OrderLogEnum.REFUND_ORDER_DF.getDesc());
+                }
+                FsStoreOrderDf df = new FsStoreOrderDf();
+                df.setOrderId(tempOrder.getId());
+                df.setStatus(0); //回到默认
+                df.setUpdateTime(new Date());
+                df.setFailMsg(failMsg); //失败消息
+                fsStoreOrderDfMapper.updateFsStoreOrderDf(df);
+                //推送失败消息
+                return R.ok("接收成功").put("code", "ok");
+            }
+            if (addParam.getBspResponse() != null) {
+                //更新物流
+                log.info("代服管家创建订单回调,{}", JSON.toJSONString(addParam));
+                List<OrderResponse> list = addParam.getBspResponse().getBody();
+                if (list != null && !list.isEmpty()) {
+                    for (OrderResponse orderResponse : list) {
+                        List<RlsInfo> rlsInfos = orderResponse.getRlsInfo();
+                        String orderNumber = orderResponse.getOrderNumber();
+                        String mailNumber = orderResponse.getMailNumber();
+                        if (rlsInfos != null && rlsInfos.size() > 0) {
+                            RlsInfo rlsInfo = rlsInfos.get(0);
+                            List<RlsDetail> rlsDetails = rlsInfo.getRlsDetail();
+                            if (rlsDetails != null && !rlsDetails.isEmpty()) {
+                                RlsDetail rlsDetail = rlsDetails.get(0);
+                                String proName = rlsDetail.getProName();
+                                if (com.hc.openapi.tool.util.StringUtils.isNotBlank(proName)) {
+                                    FsStoreOrderScrm order = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(orderNumber);
+                                    if (order != null && order.getStatus() == 2) {
+                                        order.setDeliveryId(mailNumber);
+                                        order.setDeliveryName(proName);
+                                        order.setDeliveryCode("SF");
+                                        order.setStatus(OrderInfoEnum.STATUS_2.getValue());
+                                        order.setDeliverySendTime(DateUtils.getNowDate());
+                                        fsStoreOrderMapper.updateFsStoreOrder(order);
+                                        fsStoreOrderLogsService.create(order.getId(), OrderLogEnum.DELIVERY_GOODS.getValue(), OrderLogEnum.DELIVERY_GOODS.getDesc());
+                                    }
+                                    break;
+                                }
+                            }
+                        }
+                    }
+
+                }
+            }
+        }
+        return R.ok("接收成功").put("code", "ok");
+    }
+
+    @Override
+    public R receiveWaybillPush(String body) {
+        DFApiResponse dfApiResponse = JSON.parseObject(body, DFApiResponse.class);
+        Object result = dfApiResponse.getResult();
+        if (result != null) {
+
+            String jsonString = JSON.toJSONString(result);
+            log.info("ct1111111111111111111{}", jsonString);
+            com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(jsonString);
+            if (jsonObject != null) {
+                Object listObj = jsonObject.get("list");
+                String listJson = JSON.toJSONString(listObj);
+                List<DFOrderStatusResultRequest> requestList = JSON.parseArray(listJson, DFOrderStatusResultRequest.class);
+                if (requestList != null && !requestList.isEmpty()) {
+                    //0待揽收 1已揽收 2运输中 3派送中 4异常件 5退回件 6退回签收 7转寄件 8作废件 9已签收 10 已取消
+                    for (DFOrderStatusResultRequest temp : requestList) {
+                        if (temp.getStatus() == 10) {
+                            //取消订单
+                            String mailNumber = temp.getMailNumber();
+                            List<FsStoreOrderScrm> fsStoreOrders = fsStoreOrderMapper.selectFsStoreOrderListByDeliveryId(mailNumber);
+                            if (fsStoreOrders != null && !fsStoreOrders.isEmpty()) {
+                                fsStoreOrders.forEach(order -> {
+//                                    FsStoreOrderSalesParam afterSalesParam = new FsStoreOrderSalesParam();
+                                    //修改订单状态 方便后续重新发货
+                                    order.setStatus(OrderInfoEnum.STATUS_1.getValue());
+                                    order.setExtendOrderId("");
+                                    fsStoreOrderMapper.updateFsStoreOrder(order);
+//                                    afterSalesParam.setOrderId(order.getOrderId());
+//                                    afterSalesParam.setReasons("代服管家取消订单");
+//                                    afterSalesParam.setOperator("代服管家");
+//                                    afterSales(afterSalesParam);
+                                    refundOrderMoney(order.getId());
+                                    FsStoreOrderDf df = new FsStoreOrderDf();
+                                    df.setOrderId(order.getId());
+                                    df.setStatus(2);
+                                    df.setUpdateTime(new Date());
+                                    fsStoreOrderDfMapper.updateFsStoreOrderDf(df);
+                                    fsStoreOrderLogsService.create(order.getId(), OrderLogEnum.REFUND_ORDER_DF.getValue(),
+                                            OrderLogEnum.REFUND_ORDER_DF.getDesc());
+                                });
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
     private static final DateTimeFormatter CST_FORMATTER = DateTimeFormatter
             .ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US)
             .withZone(ZoneId.of("Asia/Shanghai"));

+ 1 - 0
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStorePaymentScrmServiceImpl.java

@@ -882,6 +882,7 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
         storePayment.setRemark("商城收款订单支付");
         storePayment.setOpenId(user.getMaOpenId());
         storePayment.setUserId(user.getUserId());
+        storePayment.setPayMode("hf");//目前微信收款仅支持汇付
         fsStorePaymentMapper.insertFsStorePayment(storePayment);
 
         //汇付支付

+ 96 - 0
fs-service/src/main/java/com/fs/huifuPay/sdk/opps/core/utils/HuiFuUtils.java

@@ -1,6 +1,7 @@
 package com.fs.huifuPay.sdk.opps.core.utils;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.spring.SpringUtils;
 import com.fs.company.domain.CompanyDivItem;
@@ -12,6 +13,7 @@ import com.fs.company.service.impl.CompanyDivConfigServiceImpl;
 import com.fs.company.vo.CompanyDivConfigVo;
 import com.fs.his.domain.FsPackageOrder;
 import com.fs.his.domain.FsPayConfig;
+import com.fs.his.domain.FsStoreOrder;
 import com.fs.his.domain.FsStorePayment;
 import com.fs.huifuPay.domain.HuiFuCreateOrder;
 import com.fs.system.domain.SysConfig;
@@ -155,4 +157,98 @@ public class HuiFuUtils {
             companyDivItemService.insertCompanyDivItem(companyDivItem);
         }
     }
+
+    /**
+     * 回调修改分账明细状态
+     * @param payCode
+     */
+    public static void updateDivItem(String payCode) {
+        //修改分账状态
+        CompanyDivItem companyDivItem = companyDivItemService.selectCompanyDivItemByPayCode(payCode);
+        if (companyDivItem != null) {
+            companyDivItem.setIsPay(1);
+            companyDivItemService.updateCompanyDivItem(companyDivItem);
+        }
+    }
+
+
+
+    /**
+     * 处理分账退款
+     *
+     * @param reMoney
+     * @param payment
+     * @param extendInfoMap
+     */
+    public static CompanyDivItem doRefundDiv(BigDecimal payPrice,BigDecimal reMoney, FsStorePayment payment, Map<String, Object> extendInfoMap) {
+        CompanyDivItem companyDivItem = null;
+        companyDivItem = companyDivItemService.selectCompanyDivItemByPayCode(payment.getPayCode());
+        if (companyDivItem != null) {
+            if (payPrice.compareTo(reMoney) > 0) {
+                //部分退款
+                if (companyDivItem != null) {
+                    SysConfigMapper sysConfigMapper = SpringUtils.getBean(SysConfigMapper.class);
+                    SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey("his.pay");
+                    FsPayConfig fsPayConfig = new Gson().fromJson(sysConfig.getConfigValue(), FsPayConfig.class);
+                    String defaultHuiFuId = fsPayConfig.getHuifuId(); //默认汇付id
+
+                    String detail = companyDivItem.getDetail();
+                    if (StringUtils.isNotBlank(detail)) {
+                        JSONObject acctSplitBunch = JSONObject.parseObject(detail);
+                        if (acctSplitBunch.get("percentage_flag") != null) {
+                            List<Map<String, Object>> param = new ArrayList(); //传入汇付参数
+
+                            String percentageFlag = acctSplitBunch.get("percentage_flag").toString();
+                            Object acctInfosObj = acctSplitBunch.get("acct_infos");
+                            if (acctInfosObj != null) {
+                                if ("Y".equals(percentageFlag)) {
+                                    // 百分比分账
+                                    List<Map> acctInfos = JSON.parseArray(acctInfosObj.toString(), Map.class);
+                                    if (acctInfos != null && !acctInfos.isEmpty()) {
+                                        BigDecimal remainMoney = reMoney;
+
+                                        for (Map acctInfo : acctInfos) {
+                                            String percentageDiv = acctInfo.get("percentage_div").toString();
+                                            BigDecimal divAmt = reMoney.multiply(BigDecimal.valueOf(Float.valueOf(percentageDiv)).multiply(BigDecimal.valueOf(0.01))).setScale(2, BigDecimal.ROUND_HALF_UP);
+                                            if (divAmt.compareTo(BigDecimal.ZERO) <= 0) {
+                                                continue;
+                                            }
+                                            remainMoney = remainMoney.subtract(divAmt);
+                                            String huiFuId = acctInfo.get("huifu_id").toString();
+                                            Map<String, Object> map = new HashMap<>();
+                                            map.put("div_amt", divAmt);
+                                            map.put("huifu_id", huiFuId);
+//                                                part_loan_amt	垫资金额
+                                            param.add(map);
+                                            if (remainMoney.compareTo(BigDecimal.ZERO) >= 0) {
+                                                break;
+                                            }
+                                        }
+                                        if (remainMoney.compareTo(BigDecimal.ZERO) >= 0) {
+                                            BigDecimal divAmt = reMoney.subtract(remainMoney).setScale(2, BigDecimal.ROUND_HALF_UP);
+                                            Map<String, Object> map = new HashMap<>();
+                                            map.put("div_amt", divAmt);
+                                            map.put("huifu_id", defaultHuiFuId);
+                                            param.add(map);
+                                        }
+                                    }
+
+                                } else if ("N".equals(percentageFlag)) {
+                                    // 金额分账 目前按照排序从第一个开始扣 扣到满足退款金额
+                                }
+                                if (!param.isEmpty()) {
+                                    extendInfoMap.put("acct_split_bunch", JSON.toJSONString(param));
+                                }
+                            }
+
+                        }
+
+
+                    }
+                }
+            }
+        }
+        return companyDivItem;
+
+    }
 }

+ 2 - 1
fs-service/src/main/resources/mapper/course/FsUserCompanyBindMapper.xml

@@ -134,7 +134,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         b.nick_name fsUserName,
         c.dict_label projectName,
         e.course_name,
-        IF(g.company_user_id = #{userId}, g.qw_user_name, '其他') qwUserName,
+--         IF(g.company_user_id = #{userId}, g.qw_user_name, '其他') qwUserName,
+        g.qw_user_name as qwUserName,
         f.title videoName,
         qc.corp_name
         from

+ 9 - 17
fs-user-app/src/main/java/com/fs/app/controller/HuifuPayController.java

@@ -10,6 +10,7 @@ import com.fs.his.service.*;
 import com.fs.huifuPay.domain.HuiFuOnlinePay;
 import com.fs.huifuPay.domain.HuiFuOnlineRefund;
 import com.fs.huifuPay.domain.HuiFuResult;
+import com.fs.huifuPay.sdk.opps.core.utils.HuiFuUtils;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -50,7 +51,7 @@ public class HuifuPayController {
                 case "inquiry":
                     inquiryOrderService.payConfirm("",orderId[1],huiFuResult.getHf_seq_id(),"",1,huiFuResult.getOut_trans_id(),huiFuResult.getParty_order_id());
                     try {
-                        updateDivItem(orderId[1]);
+                        HuiFuUtils.updateDivItem(orderId[1]);
                     } catch (Exception e) {
                         logger.error("-------分账明细回调错误{}", e.getMessage());
                     }
@@ -58,7 +59,7 @@ public class HuifuPayController {
                 case "store":
                     storeOrderService.payConfirm("",orderId[1],huiFuResult.getHf_seq_id(),"",1,huiFuResult.getOut_trans_id(),huiFuResult.getParty_order_id());
                     try {
-                        updateDivItem(orderId[1]);
+                        HuiFuUtils.updateDivItem(orderId[1]);
                     } catch (Exception e) {
                         logger.error("-------分账明细回调错误{}", e.getMessage());
                     }
@@ -66,7 +67,7 @@ public class HuifuPayController {
                 case "package":
                     packageOrderService.payConfirm("",orderId[1],huiFuResult.getHf_seq_id(),"",1,huiFuResult.getOut_trans_id(),huiFuResult.getParty_order_id());
                     try {
-                        updateDivItem(orderId[1]);
+                        HuiFuUtils.updateDivItem(orderId[1]);
                     } catch (Exception e) {
                         logger.error("-------分账明细回调错误{}", e.getMessage());
                     }
@@ -74,7 +75,7 @@ public class HuifuPayController {
                 case "course":
                     courseOrderService.payConfirm("",orderId[1],huiFuResult.getHf_seq_id(),"",1,huiFuResult.getOut_trans_id(),huiFuResult.getParty_order_id());
                     try {
-                        updateDivItem(orderId[1]);
+                        HuiFuUtils.updateDivItem(orderId[1]);
                     } catch (Exception e) {
                         logger.error("-------分账明细回调错误{}", e.getMessage());
                     }
@@ -82,7 +83,7 @@ public class HuifuPayController {
                 case "appvip":
                     vipOrderService.payConfirm("",orderId[1],huiFuResult.getHf_seq_id(),"",1,huiFuResult.getOut_trans_id(),huiFuResult.getParty_order_id());
                     try {
-                        updateDivItem(orderId[1]);
+                        HuiFuUtils.updateDivItem(orderId[1]);
                     } catch (Exception e) {
                         logger.error("-------分账明细回调错误{}", e.getMessage());
                     }
@@ -90,7 +91,7 @@ public class HuifuPayController {
                 case "integral":
                     integralOrderService.payConfirm("",orderId[1],huiFuResult.getHf_seq_id(),"",1,huiFuResult.getOut_trans_id(),huiFuResult.getParty_order_id());
                     try {
-                        updateDivItem(orderId[1]);
+                        HuiFuUtils.updateDivItem(orderId[1]);
                     } catch (Exception e) {
                         logger.error("-------分账明细回调错误{}", e.getMessage());
                     }
@@ -98,7 +99,7 @@ public class HuifuPayController {
                 case "product":
                     courseProductOrderService.payConfirm("",orderId[1],huiFuResult.getHf_seq_id(),"",1,huiFuResult.getOut_trans_id(),huiFuResult.getParty_order_id());
                     try {
-                        updateDivItem(orderId[1]);
+                        HuiFuUtils.updateDivItem(orderId[1]);
                     } catch (Exception e) {
                         logger.error("-------分账明细回调错误{}", e.getMessage());
                     }
@@ -106,7 +107,7 @@ public class HuifuPayController {
                 case "payment":
                     storePaymentService.payConfirm(orderId[1],huiFuResult.getHf_seq_id(),huiFuResult.getOut_trans_id(),huiFuResult.getParty_order_id());
                     try {
-                        updateDivItem(orderId[1]);
+                        HuiFuUtils.updateDivItem(orderId[1]);
                     } catch (Exception e) {
                         logger.error("-------分账明细回调错误{}", e.getMessage());
                     }
@@ -117,15 +118,6 @@ public class HuifuPayController {
         return "ok";
     }
 
-    private void updateDivItem(String payCode) {
-        //修改分账状态
-        CompanyDivItem companyDivItem = companyDivItemService.selectCompanyDivItemByPayCode(payCode);
-        if (companyDivItem != null) {
-            companyDivItem.setIsPay(1);
-            companyDivItemService.updateCompanyDivItem(companyDivItem);
-        }
-    }
-
 
     @RequestMapping("/payOnlineNotifyUrl")
     public String asyncHuFuOnlinePay(@RequestParam String resp_desc,@RequestParam String resp_code,@RequestParam String sign,@RequestParam String resp_data) {

+ 16 - 0
fs-user-app/src/main/java/com/fs/app/controller/store/PayScrmController.java

@@ -10,6 +10,7 @@ import com.fs.company.service.ICompanyUserService;
 import com.fs.erp.service.IErpOrderService;
 import com.fs.hisStore.service.*;
 import com.fs.huifuPay.domain.HuiFuResult;
+import com.fs.huifuPay.sdk.opps.core.utils.HuiFuUtils;
 import com.fs.ybPay.domain.OrderCallback;
 import com.fs.ybPay.domain.OrderResult;
 import com.fs.pay.pay.dto.OrderQueryDTO;
@@ -77,10 +78,25 @@ public class PayScrmController {
             String[] order=o.getReq_seq_id().split("-");
             switch (order[0]) {
                 case "store":
+                    try {
+                        HuiFuUtils.updateDivItem(order[1]);
+                    } catch (Exception e) {
+                        logger.error("-------分账明细回调错误{}", e.getMessage());
+                    }
                     return orderService.payConfirm(1,null,order[1], o.getHf_seq_id(),o.getOut_trans_id(),o.getParty_order_id());
                 case "store_remain":
+                    try {
+                        HuiFuUtils.updateDivItem(order[1]);
+                    } catch (Exception e) {
+                        logger.error("-------分账明细回调错误{}", e.getMessage());
+                    }
                     return orderService.payRemainConfirm( order[1], o.getHf_seq_id(),o.getOut_trans_id(),o.getParty_order_id());
                 case "payment":
+                    try {
+                        HuiFuUtils.updateDivItem(order[1]);
+                    } catch (Exception e) {
+                        logger.error("-------分账明细回调错误{}", e.getMessage());
+                    }
                     return storePaymentService.payConfirm(order[1],o.getHf_seq_id(),o.getOut_trans_id(),o.getParty_order_id());
             }