yuhongqi il y a 5 jours
Parent
commit
e95841ba5d

+ 40 - 59
fs-company/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java

@@ -118,7 +118,7 @@ public class FsStoreOrderScrmController extends BaseController
     public TableDataInfo list(FsStoreOrderParam param)
     {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
-        param.setCompanyId(loginUser.getCompany().getCompanyId());
+        applyCompanyDataScope(param, loginUser);
 
         // 郑多燕需求
         if("广州郑多燕".equals(cloudHostProper.getCompanyName())){
@@ -127,32 +127,14 @@ public class FsStoreOrderScrmController extends BaseController
             if(!companyUsers.isEmpty()){
                 List<Long> companyUserIds = companyUsers.stream().map(CompanyUser::getUserId).collect(Collectors.toList());
                 param.setCompanyUserIds(companyUserIds);
+                param.setCompanyUserId(null);
             } else {
-                // 表示数据权限是本人
                 param.setCompanyUserId(loginUser.getUser().getUserId());
             }
         }
         startPage();
-
-        String configJson = configService.selectConfigByKey("his.store");
-        StoreConfig storeConfig = JSONUtil.toBean(configJson, StoreConfig.class);
-        if(storeConfig != null && Boolean.TRUE.equals(storeConfig.getEnableCompanyOrderMode())){
-            if(!"00".equals(loginUser.getUser().getUserType()) && !hasRoleKey(loginUser, "finance_order_goods")){//非管理员看见自己数据
-                param.setCompanyUserId(loginUser.getUser().getUserId());
-            }
-            param.setIsCompanyOrder(1);//是否销售订单
-        }
-
-
-        if(!StringUtils.isEmpty(param.getCreateTimeRange())){
-            param.setCreateTimeList(param.getCreateTimeRange().split("--"));
-        }
-        if(!StringUtils.isEmpty(param.getPayTimeRange())){
-            param.setPayTimeList(param.getPayTimeRange().split("--"));
-        }
-        if(!StringUtils.isEmpty(param.getDeliveryImportTimeRange())){
-            param.setDeliveryImportTimeList(param.getDeliveryImportTimeRange().split("--"));
-        }
+        applyCompanyOrderModeIfEnabled(param);
+        fillListTimeRange(param);
         List<FsStoreOrderVO> list = fsStoreOrderService.selectFsStoreOrderListVO(param);
         return getDataTable(list);
     }
@@ -211,24 +193,9 @@ public class FsStoreOrderScrmController extends BaseController
             return AjaxResult.error("请筛选数据导出");
         }
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
-        param.setCompanyId(loginUser.getCompany().getCompanyId());
-        if(!StringUtils.isEmpty(param.getCreateTimeRange())){
-            param.setCreateTimeList(param.getCreateTimeRange().split("--"));
-        }
-        if(!StringUtils.isEmpty(param.getPayTimeRange())){
-            param.setPayTimeList(param.getPayTimeRange().split("--"));
-        }
-        if(!StringUtils.isEmpty(param.getDeliveryImportTimeRange())){
-            param.setDeliveryImportTimeList(param.getDeliveryImportTimeRange().split("--"));
-        }
-        String configJson = configService.selectConfigByKey("his.store");
-        StoreConfig storeConfig = JSONUtil.toBean(configJson, StoreConfig.class);
-        if(storeConfig != null && Boolean.TRUE.equals(storeConfig.getEnableCompanyOrderMode())){
-            if(!"00".equals(loginUser.getUser().getUserType()) && !hasRoleKey(loginUser, "finance_order_goods")){//非管理员看见自己数据
-                param.setCompanyUserId(loginUser.getUser().getUserId());
-            }
-            param.setIsCompanyOrder(1);//是否销售订单
-        }
+        applyCompanyDataScope(param, loginUser);
+        applyCompanyOrderModeIfEnabled(param);
+        fillListTimeRange(param);
         List<FsStoreOrderErpExportVO> list = fsStoreOrderService.selectFsStoreOrderListVOByExport(param);
         //对手机号脱敏
         if(list!=null){
@@ -538,25 +505,9 @@ public class FsStoreOrderScrmController extends BaseController
             return AjaxResult.error("请筛选数据导出");
         }
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
-        param.setCompanyId(loginUser.getCompany().getCompanyId());
-
-        if(!StringUtils.isEmpty(param.getCreateTimeRange())){
-            param.setCreateTimeList(param.getCreateTimeRange().split("--"));
-        }
-        if(!StringUtils.isEmpty(param.getPayTimeRange())){
-            param.setPayTimeList(param.getPayTimeRange().split("--"));
-        }
-        if(!StringUtils.isEmpty(param.getDeliveryImportTimeRange())){
-            param.setDeliveryImportTimeList(param.getDeliveryImportTimeRange().split("--"));
-        }
-        String configJson = configService.selectConfigByKey("his.store");
-        StoreConfig storeConfig = JSONUtil.toBean(configJson, StoreConfig.class);
-        if(storeConfig != null && Boolean.TRUE.equals(storeConfig.getEnableCompanyOrderMode())){
-            if(!"00".equals(loginUser.getUser().getUserType()) && !hasRoleKey(loginUser, "finance_order_goods")){//非管理员看见自己数据
-                param.setCompanyUserId(loginUser.getUser().getUserId());
-            }
-            param.setIsCompanyOrder(1);//是否销售订单
-        }
+        applyCompanyDataScope(param, loginUser);
+        applyCompanyOrderModeIfEnabled(param);
+        fillListTimeRange(param);
         List<FsStoreOrderItemExportVO> list=orderItemService.selectFsStoreOrderItemListExportVO(param);
         //对手机号脱敏
         if(list!=null){
@@ -700,4 +651,34 @@ public class FsStoreOrderScrmController extends BaseController
         }
         return roles.stream().anyMatch(role -> roleKey.equals(role.getRoleKey()));
     }
+
+    /**
+     * 销售端数据权限:限定本公司;非管理员且非财务订单角色仅看本人订单
+     */
+    private void applyCompanyDataScope(FsStoreOrderParam param, LoginUser loginUser) {
+        param.setCompanyId(loginUser.getCompany().getCompanyId());
+        if (!"00".equals(loginUser.getUser().getUserType()) && !hasRoleKey(loginUser, "finance_order_goods")) {
+            param.setCompanyUserId(loginUser.getUser().getUserId());
+        }
+    }
+
+    private void applyCompanyOrderModeIfEnabled(FsStoreOrderParam param) {
+        String configJson = configService.selectConfigByKey("his.store");
+        StoreConfig storeConfig = JSONUtil.toBean(configJson, StoreConfig.class);
+        if (storeConfig != null && Boolean.TRUE.equals(storeConfig.getEnableCompanyOrderMode())) {
+            param.setIsCompanyOrder(1);
+        }
+    }
+
+    private void fillListTimeRange(FsStoreOrderParam param) {
+        if (!StringUtils.isEmpty(param.getCreateTimeRange())) {
+            param.setCreateTimeList(param.getCreateTimeRange().split("--"));
+        }
+        if (!StringUtils.isEmpty(param.getPayTimeRange())) {
+            param.setPayTimeList(param.getPayTimeRange().split("--"));
+        }
+        if (!StringUtils.isEmpty(param.getDeliveryImportTimeRange())) {
+            param.setDeliveryImportTimeList(param.getDeliveryImportTimeRange().split("--"));
+        }
+    }
 }

+ 6 - 0
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreAfterSalesScrmMapper.java

@@ -10,6 +10,7 @@ import com.fs.hisStore.domain.FsStoreAfterSalesScrm;
 import com.fs.hisStore.param.FsStoreAfterSalesQueryParam;
 import com.fs.hisStore.vo.FsStoreAfterSalesQueryVO;
 import com.fs.hisStore.vo.FsStoreAfterSalesVO;
+import com.fs.hisStore.vo.FsStoreOrderRefundAmountVO;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
@@ -324,6 +325,11 @@ public interface FsStoreAfterSalesScrmMapper
             "WHERE sas.order_code = #{orderCode} AND sas.status = 4 AND sas.is_del = 0 LIMIT 1")
     FsStoreAfterSalesScrm selectFsStoreAfterSalesByOrderCode(@Param("orderCode") String orderCode);
 
+    /**
+     * 按订单号批量查询退款金额(仅 order_code、refund_amount,财务已审核且未删除)
+     */
+    List<FsStoreOrderRefundAmountVO> selectRefundAmountByOrderCodes(@Param("orderCodes") List<String> orderCodes);
+
     /**
      * 售后详情(含一级/二级原因展示文案,来自落库字段)
      */

+ 1 - 1
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreOrderItemScrmMapper.java

@@ -77,7 +77,7 @@ public interface FsStoreOrderItemScrmMapper
 
     @Select({"<script> " +
             "select i.*,o.user_id,u.nick_name,psps.cost,o.pay_postage,o.total_num,o.status,fspcs.cate_name, o.real_name,o.user_phone,o.user_address,o.create_time,o.pay_time,o.delivery_sn,o.delivery_name,o.delivery_id, c.company_name ,cu.nick_name as company_user_nick_name ,cu.phonenumber as company_usere_phonenumber,o.upload_time ,CASE WHEN o.certificates IS NULL OR o.certificates = '' THEN 0 ELSE 1 END AS is_upload,p.title as package_name,cts.name as scheduleName,sp_latest.pay_money, sp_latest.bank_transaction_id as bankTransactionId, o.delivery_send_time," +
-            " o.order_code, o.pay_price, o.pay_money, o.deduction_price,o.pay_delivery, o.order_type,psps.price " +
+            " o.order_code, o.pay_price, o.pay_money, o.deduction_price,o.pay_delivery, o.order_type, o.refund_price as refundPrice, psps.price " +
             ", CASE o.is_audit WHEN 1 THEN '是' ELSE '否' END AS isAudit " +
             ", sas.audit_remark as auditRemark, sas.reason_level1_text as reasonValue1, sas.reason_level2_text as reasonValue2 " +
             ", o.delivery_type" +

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

@@ -214,6 +214,16 @@ public interface IFsStoreOrderScrmService
 
     List<FsStoreOrderErpExportVO> selectFsStoreOrderListVOByExport(FsStoreOrderParam param);
 
+    /**
+     * 填充导出订单的退款类型、退款金额(退款中/已退款订单)
+     */
+    void fillOrderRefundExportInfo(List<? extends FsStoreOrderExportVO> list);
+
+    /**
+     * 填充导出订单明细的退款类型、退款金额(退款中/已退款订单)
+     */
+    void fillOrderItemRefundExportInfo(List<FsStoreOrderItemExportVO> list);
+
     List<FsStoreOrderPromotionExportVO> selectFsPromotionOrderListVOByExport(FsStoreOrderParam param);
 
     List<FsStorePayRemainOrderExportVO> selectFsStorePayRemainOrderListVOByExport(FsStoreOrderParam param);

+ 12 - 4
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderItemScrmServiceImpl.java

@@ -7,14 +7,16 @@ import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.fs.his.vo.FsStoreOrderItemListDVO;
 import com.fs.hisStore.dto.FsStoreCartDTO;
+import com.fs.hisStore.domain.FsStoreOrderItemScrm;
+import com.fs.hisStore.mapper.FsStoreOrderItemScrmMapper;
 import com.fs.hisStore.param.FsStoreOrderParam;
 import com.fs.hisStore.vo.FsStoreOrderItemExportVO;
 import com.fs.hisStore.vo.FsStoreOrderItemVO;
+import com.fs.hisStore.service.IFsStoreOrderItemScrmService;
+import com.fs.hisStore.service.IFsStoreOrderScrmService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
-import com.fs.hisStore.mapper.FsStoreOrderItemScrmMapper;
-import com.fs.hisStore.domain.FsStoreOrderItemScrm;
-import com.fs.hisStore.service.IFsStoreOrderItemScrmService;
 
 /**
  * 订单详情Service业务层处理
@@ -28,6 +30,10 @@ public class FsStoreOrderItemScrmServiceImpl implements IFsStoreOrderItemScrmSer
     @Autowired
     private FsStoreOrderItemScrmMapper fsStoreOrderItemMapper;
 
+    @Autowired
+    @Lazy
+    private IFsStoreOrderScrmService fsStoreOrderScrmService;
+
     /**
      * 查询订单详情
      *
@@ -112,7 +118,9 @@ public class FsStoreOrderItemScrmServiceImpl implements IFsStoreOrderItemScrmSer
 
     @Override
     public List<FsStoreOrderItemExportVO> selectFsStoreOrderItemListExportVO(FsStoreOrderParam fsStoreOrder) {
-        return fsStoreOrderItemMapper.selectFsStoreOrderItemListExportVO(fsStoreOrder);
+        List<FsStoreOrderItemExportVO> list = fsStoreOrderItemMapper.selectFsStoreOrderItemListExportVO(fsStoreOrder);
+        fsStoreOrderScrmService.fillOrderItemRefundExportInfo(list);
+        return list;
     }
 
     @Override

+ 119 - 3
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java

@@ -91,6 +91,9 @@ import com.fs.hisStore.param.FsStoreOrderParam;
 import com.fs.hisStore.param.FsStoreOrderPayParam;
 import com.fs.hisStore.vo.*;
 import com.fs.hisStore.vo.FsStoreOrderErpExportVO;
+import com.fs.hisStore.vo.FsStoreOrderExportVO;
+import com.fs.hisStore.vo.FsStoreOrderItemExportVO;
+import com.fs.hisStore.vo.FsStoreOrderRefundAmountVO;
 import com.fs.hisStore.vo.FsStoreOrderItemVO;
 import com.fs.hisStore.vo.FsStoreOrderVO;
 import com.fs.hisStore.vo.FsStoreProductAttrValueVO;
@@ -3975,12 +3978,125 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
 
     @Override
     public List<FsStoreOrderErpExportVO> selectFsStoreOrderListVOByExport(FsStoreOrderParam param) {
+        List<FsStoreOrderErpExportVO> list;
         if (CloudHostUtils.hasCloudHostName("金牛明医","康年堂")){
-            return fsStoreOrderMapper.selectFsStoreOrderErpListVOByExport(param);
-
+            list = fsStoreOrderMapper.selectFsStoreOrderErpListVOByExport(param);
         } else {
-            return fsStoreOrderMapper.selectFsStoreOrderListVOByExport(param);
+            list = fsStoreOrderMapper.selectFsStoreOrderListVOByExport(param);
+        }
+        fillOrderRefundExportInfo(list);
+        return list;
+    }
+
+    @Override
+    public void fillOrderRefundExportInfo(List<? extends FsStoreOrderExportVO> list) {
+        if (CollectionUtil.isEmpty(list)) {
+            return;
+        }
+        List<String> needLookupOrderCodes = new ArrayList<>();
+        for (FsStoreOrderExportVO vo : list) {
+            if (!isRefundedOrderStatus(vo.getStatus())) {
+                continue;
+            }
+            if (needsAfterSalesRefundLookup(vo.getRefundPrice()) && StrUtil.isNotBlank(vo.getOrderCode())) {
+                needLookupOrderCodes.add(vo.getOrderCode());
+            }
+        }
+        Map<String, BigDecimal> refundAmountMap = batchLoadRefundAmountByOrderCodes(needLookupOrderCodes);
+        for (FsStoreOrderExportVO vo : list) {
+            if (!isRefundedOrderStatus(vo.getStatus())) {
+                continue;
+            }
+            BigDecimal refundAmount = vo.getRefundPrice();
+            if (needsAfterSalesRefundLookup(refundAmount)) {
+                refundAmount = refundAmountMap.get(vo.getOrderCode());
+                if (refundAmount != null) {
+                    vo.setRefundPrice(refundAmount);
+                }
+            }
+            BigDecimal payAmount = vo.getPayMoney() != null ? vo.getPayMoney() : vo.getPayPrice();
+            if (refundAmount != null && payAmount != null) {
+                vo.setRefundType(refundAmount.compareTo(payAmount) < 0 ? "部分退款" : "全额退款");
+            }
+        }
+    }
+
+    private static final int REFUND_AMOUNT_BATCH_SIZE = 1000;
+
+    private Map<String, BigDecimal> batchLoadRefundAmountByOrderCodes(List<String> orderCodes) {
+        if (CollectionUtil.isEmpty(orderCodes)) {
+            return Collections.emptyMap();
+        }
+        List<String> distinctOrderCodes = orderCodes.stream()
+                .filter(StrUtil::isNotBlank)
+                .distinct()
+                .collect(Collectors.toList());
+        if (distinctOrderCodes.isEmpty()) {
+            return Collections.emptyMap();
+        }
+        Map<String, BigDecimal> refundAmountMap = new HashMap<>(distinctOrderCodes.size());
+        for (int i = 0; i < distinctOrderCodes.size(); i += REFUND_AMOUNT_BATCH_SIZE) {
+            int end = Math.min(i + REFUND_AMOUNT_BATCH_SIZE, distinctOrderCodes.size());
+            List<String> batch = distinctOrderCodes.subList(i, end);
+            List<FsStoreOrderRefundAmountVO> rows = fsStoreAfterSalesScrmMapper.selectRefundAmountByOrderCodes(batch);
+            if (CollectionUtil.isEmpty(rows)) {
+                continue;
+            }
+            for (FsStoreOrderRefundAmountVO row : rows) {
+                if (row.getOrderCode() != null && row.getRefundAmount() != null) {
+                    refundAmountMap.put(row.getOrderCode(), row.getRefundAmount());
+                }
+            }
+        }
+        return refundAmountMap;
+    }
+
+    private boolean isRefundedOrderStatus(String status) {
+        if (status == null) {
+            return false;
+        }
+        try {
+            int orderStatus = Integer.parseInt(status);
+            return orderStatus == -1 || orderStatus == -2;
+        } catch (NumberFormatException e) {
+            return false;
+        }
+    }
+
+    private boolean needsAfterSalesRefundLookup(BigDecimal refundPrice) {
+        return refundPrice == null || refundPrice.compareTo(BigDecimal.ZERO) == 0;
+    }
 
+    @Override
+    public void fillOrderItemRefundExportInfo(List<FsStoreOrderItemExportVO> list) {
+        if (CollectionUtil.isEmpty(list)) {
+            return;
+        }
+        List<String> needLookupOrderCodes = new ArrayList<>();
+        for (FsStoreOrderItemExportVO vo : list) {
+            if (!isRefundedOrderStatus(vo.getStatus())) {
+                continue;
+            }
+            if (needsAfterSalesRefundLookup(vo.getRefundPrice()) && StrUtil.isNotBlank(vo.getOrderCode())) {
+                needLookupOrderCodes.add(vo.getOrderCode());
+            }
+        }
+        Map<String, BigDecimal> refundAmountMap = batchLoadRefundAmountByOrderCodes(needLookupOrderCodes);
+        for (FsStoreOrderItemExportVO vo : list) {
+            if (!isRefundedOrderStatus(vo.getStatus())) {
+                continue;
+            }
+            BigDecimal refundAmount = vo.getRefundPrice();
+            if (needsAfterSalesRefundLookup(refundAmount)) {
+                refundAmount = refundAmountMap.get(vo.getOrderCode());
+            }
+            if (refundAmount != null) {
+                vo.setRefundPrice(refundAmount);
+            }
+            BigDecimal payAmount = vo.getPayMoney() != null ? vo.getPayMoney() : vo.getPayPrice();
+            if (refundAmount != null && payAmount != null) {
+                vo.setRefundType(refundAmount.compareTo(payAmount) < 0 ? "部分退款" : "全额退款");
+            }
         }
     }
 

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

@@ -170,6 +170,10 @@ public class FsStoreOrderExportVO implements Serializable
 ////    @Excel(name = "不退款的理由")
 //    private String refundReason;
 
+    /** 退款类型:全额退款 / 部分退款 */
+    @Excel(name = "退款类型")
+    private String refundType;
+
     /** 退款金额 */
     @Excel(name = "退款金额",cellType= Excel.ColumnType.NUMERIC)
     private BigDecimal refundPrice;

+ 6 - 0
fs-service/src/main/java/com/fs/hisStore/vo/FsStoreOrderItemExportVO.java

@@ -143,5 +143,11 @@ public class FsStoreOrderItemExportVO implements Serializable
     @Excel(name = "售后备注")
     private String auditRemark;
 
+    @Excel(name = "退款类型")
+    private String refundType;
+
+    @Excel(name = "退款金额", cellType = Excel.ColumnType.NUMERIC)
+    private BigDecimal refundPrice;
+
 
 }

+ 6 - 0
fs-service/src/main/java/com/fs/hisStore/vo/FsStoreOrderItemExportZMVO.java

@@ -132,4 +132,10 @@ public class FsStoreOrderItemExportZMVO implements Serializable {
 
     @Excel(name = "售后备注")
     private String auditRemark;
+
+    @Excel(name = "退款类型")
+    private String refundType;
+
+    @Excel(name = "退款金额", cellType = Excel.ColumnType.NUMERIC)
+    private BigDecimal refundPrice;
 }

+ 16 - 0
fs-service/src/main/java/com/fs/hisStore/vo/FsStoreOrderRefundAmountVO.java

@@ -0,0 +1,16 @@
+package com.fs.hisStore.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 订单导出批量填充退款金额(仅必要字段)
+ */
+@Data
+public class FsStoreOrderRefundAmountVO {
+
+    private String orderCode;
+
+    private BigDecimal refundAmount;
+}

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

@@ -10,8 +10,8 @@ logging:
 wx:
   miniapp:
     configs:
-      - appid: wx40dcfa2797d6fc2d   #云联融智
-        secret: 3c44fb7a1d5ad3aa90efe576c9fb3d19 #北京卓美
+      - appid: wxf3e96f6e152915ad   #云联融智
+        secret: 0d4ba75283b8e557d38a7958c15c6065 #北京卓美
         token: cbnd7lJvkripVOpyTFAna6NAWCxCrvC
         aesKey: HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E
         msgDataFormat: JSON

+ 16 - 0
fs-service/src/main/resources/mapper/hisStore/FsStoreAfterSalesScrmMapper.xml

@@ -243,4 +243,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </foreach>
     </delete>
 
+    <select id="selectRefundAmountByOrderCodes" resultType="com.fs.hisStore.vo.FsStoreOrderRefundAmountVO">
+        SELECT t.order_code AS orderCode, t.refund_amount AS refundAmount
+        FROM fs_store_after_sales_scrm t
+        INNER JOIN (
+            SELECT order_code, MAX(id) AS max_id
+            FROM fs_store_after_sales_scrm
+            WHERE is_del = 0
+              AND status = 4
+              AND order_code IN
+            <foreach collection="orderCodes" item="orderCode" open="(" separator="," close=")">
+                #{orderCode}
+            </foreach>
+            GROUP BY order_code
+        ) latest ON t.id = latest.max_id
+    </select>
+
 </mapper>