Procházet zdrojové kódy

feat(store): 增加退款审核功能并优化支付统计

- 新增退款审核状态、审核人、审核时间及审核备注字段
- 实现退款审核流程,支持审核通过与拒绝操作
- 优化支付统计逻辑,增加当日、月度、年度及自定义时间段的退款金额统计
- 完善支付明细列表查询,记录退款审核相关查询条件
- 移除冗余的用户手机号脱敏判断空逻辑
- 统一导入service包路径,简化代码结构
- 调整退款审核状态更新逻辑,确保审核信息准确记录- 删除已废弃的getRefundAuditDetail接口及相关实现
-修复退款审核状态检查逻辑,允许直接退款操作- 更新Excel导出配置,增加退款审核相关信息展示
xw před 1 týdnem
rodič
revize
04d6b0e4c4

+ 3 - 1
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreAfterSalesScrmController.java

@@ -109,7 +109,9 @@ public class FsStoreAfterSalesScrmController extends BaseController
         statusMap.setStoreAfterSalesId(id);
         List<FsStoreAfterSalesStatusScrm> logs=storeAfterSalesStatusService.selectFsStoreAfterSalesStatusList(statusMap);
         FsUser user=userService.selectFsUserById(afterSales.getUserId());
-        user.setPhone(ParseUtils.parsePhone(user.getPhone()));
+        if (user != null){
+            user.setPhone(ParseUtils.parsePhone(user.getPhone()));
+        }
         FsStoreOrderScrm order=fsStoreOrderService.selectFsStoreOrderByOrderCode(afterSales.getOrderCode());
         return R.ok().put("afterSales",afterSales).put("items",items).put("logs",logs).put("user",user).put("order",order);
     }

+ 0 - 35
fs-admin/src/main/java/com/fs/hisStore/controller/FsStorePaymentScrmController.java

@@ -302,39 +302,4 @@ public class FsStorePaymentScrmController extends BaseController
         return toAjax(fsStorePaymentService.deleteFsStorePaymentByIds(paymentIds));
     }
 
-    /**
-     * 退款审核
-     */
-    @PreAuthorize("@ss.hasPermi('store:storePayment:refundAudit')")
-    @Log(title = "退款审核", businessType = BusinessType.UPDATE)
-    @PutMapping("/refund/audit")
-    public R auditRefund(@RequestBody Map<String, Object> auditData)
-    {
-        Long paymentId = Long.valueOf(auditData.get("paymentId").toString());
-        Integer auditStatus = Integer.valueOf(auditData.get("auditStatus").toString());
-        String auditRemark = auditData.get("auditRemark") != null ? auditData.get("auditRemark").toString() : "";
-        
-        // 在控制器层直接获取当前用户名
-        String currentUser = "system"; // 默认值
-        try {
-            currentUser = getUsername(); // 使用父类 BaseController 的方法
-            logger.info("控制器层获取到的用户名: {}", currentUser);
-        } catch (Exception e) {
-            logger.warn("控制器层获取用户名失败: {}", e.getMessage());
-        }
-        
-        // 传递用户名到服务层
-        return fsStorePaymentService.auditRefund(paymentId, auditStatus, auditRemark, currentUser);
-    }
-
-    /**
-     * 获取退款审核详情
-     */
-    @PreAuthorize("@ss.hasPermi('store:storePayment:query')")
-    @GetMapping("/refund/audit/{paymentId}")
-    public AjaxResult getRefundAuditDetail(@PathVariable("paymentId") Long paymentId)
-    {
-        FsStorePaymentScrm paymentDetail = fsStorePaymentService.getRefundAuditDetail(paymentId);
-        return AjaxResult.success(paymentDetail);
-    }
 }

+ 7 - 6
fs-company/src/main/java/com/fs/hisStore/controller/FsStoreAfterSalesScrmController.java

@@ -19,10 +19,7 @@ import com.fs.hisStore.domain.FsStoreAfterSalesItemScrm;
 import com.fs.hisStore.domain.FsStoreAfterSalesScrm;
 import com.fs.hisStore.domain.FsStoreAfterSalesStatusScrm;
 import com.fs.hisStore.domain.FsStoreOrderScrm;
-import com.fs.hisStore.service.IFsStoreAfterSalesItemScrmService;
-import com.fs.hisStore.service.IFsStoreAfterSalesScrmService;
-import com.fs.hisStore.service.IFsStoreAfterSalesStatusScrmService;
-import com.fs.hisStore.service.IFsStoreOrderScrmService;
+import com.fs.hisStore.service.*;
 import com.fs.hisStore.vo.FsStoreAfterSalesVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -56,10 +53,12 @@ public class FsStoreAfterSalesScrmController extends BaseController
     private ICompanyUserService companyUserService;
     @Autowired
     private ICompanyService companyService;
+    @Autowired
+    private IFsStorePaymentScrmService fsStorePaymentService;
 
 
     /**
-     * 查询售后记录列表
+     * 查询审核记录列表
      */
     @PreAuthorize("@ss.hasPermi('store:storeAfterSales:list')")
     @GetMapping("/list")
@@ -130,7 +129,9 @@ public class FsStoreAfterSalesScrmController extends BaseController
         statusMap.setStoreAfterSalesId(id);
         List<FsStoreAfterSalesStatusScrm> logs=storeAfterSalesStatusService.selectFsStoreAfterSalesStatusList(statusMap);
         FsUser user=userService.selectFsUserById(afterSales.getUserId());
-        user.setPhone(ParseUtils.parsePhone(user.getPhone()));
+        if (user != null){
+            user.setPhone(ParseUtils.parsePhone(user.getPhone()));
+        }
         FsStoreOrderScrm order=fsStoreOrderService.selectFsStoreOrderByOrderCode(afterSales.getOrderCode());
         return R.ok().put("afterSales",afterSales).put("items",items).put("logs",logs).put("user",user).put("order",order);
     }

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

@@ -203,7 +203,9 @@ public class FsStoreOrderScrmController extends BaseController
         order.setUserPhone(ParseUtils.parsePhone(order.getUserPhone()));
         order.setUserAddress(ParseUtils.parseAddress(order.getUserAddress()));
         FsUser user=userService.selectFsUserById(order.getUserId());
-        user.setPhone(ParseUtils.parsePhone(user.getPhone()));
+        if (user != null){
+            user.setPhone(ParseUtils.parsePhone(user.getPhone()));
+        }
         FsStoreOrderItemScrm itemMap=new FsStoreOrderItemScrm();
         itemMap.setOrderId(order.getId());
         List<FsStoreOrderItemScrm> items=orderItemService.selectFsStoreOrderItemList(itemMap);

+ 8 - 17
fs-company/src/main/java/com/fs/hisStore/controller/FsStorePaymentScrmController.java

@@ -76,6 +76,10 @@ public class FsStorePaymentScrmController extends BaseController
         for (FsStorePaymentVO vo : list){
             vo.setUserPhone(ParseUtils.parsePhone(vo.getUserPhone()));
         }
+        // 记录查询条件,包括新增的退款审核状态
+        logger.info("支付明细列表查询,公司ID:{},退款审核状态:{},退款审核人:{},查询结果数量:{}",
+            loginUser.getCompany().getCompanyId(), fsStorePayment.getRefundAuditStatus(), 
+            fsStorePayment.getRefundAuditBy(), list.size());
         return getDataTable(list);
     }
 
@@ -170,11 +174,6 @@ public class FsStorePaymentScrmController extends BaseController
         if(payment.getStatus()!=1){
             return R.error("非法操作");
         }
-        // 检查退款审核状态
-        if(payment.getRefundAuditStatus() == null || payment.getRefundAuditStatus() != 1){
-            return R.error("退款申请尚未审核或审核未通过,不能执行退款");
-        }
-
         if(fsStorePayment.getRefundMoney().compareTo(new BigDecimal(0))<1){
             return R.error("退款金额必须大于0");
         }
@@ -197,6 +196,7 @@ public class FsStorePaymentScrmController extends BaseController
                     payment.setRefundMoney(fsStorePayment.getRefundMoney());
                     payment.setStatus(-1);
                     payment.setRefundTime(new Date());
+                    payment.setRefundAuditStatus(2);
                     fsStorePaymentService.updateFsStorePayment(payment);
                     //收款 减去所有
                     if(payment.getCompanyId()!=null&&payment.getCompanyId()>0){
@@ -285,20 +285,11 @@ public class FsStorePaymentScrmController extends BaseController
     public R auditRefund(@RequestBody Map<String, Object> auditData)
     {
         Long paymentId = Long.valueOf(auditData.get("paymentId").toString());
-        Integer auditStatus = Integer.valueOf(auditData.get("auditStatus").toString());
+        Integer auditStatus = Integer.valueOf(auditData.get("refundAuditStatus").toString());
         String auditRemark = auditData.get("auditRemark") != null ? auditData.get("auditRemark").toString() : "";
+        String auditor = auditData.get("auditor") != null ? auditData.get("auditor").toString() : "";
 
-        return fsStorePaymentService.auditRefund(paymentId, auditStatus, auditRemark);
+        return fsStorePaymentService.auditRefund(paymentId, auditStatus, auditRemark , auditor);
     }
 
-    /**
-     * 获取退款审核详情
-     */
-    @PreAuthorize("@ss.hasPermi('store:storePayment:query')")
-    @GetMapping("/refund/audit/{paymentId}")
-    public AjaxResult getRefundAuditDetail(@PathVariable("paymentId") Long paymentId)
-    {
-        FsStorePaymentScrm paymentDetail = fsStorePaymentService.getRefundAuditDetail(paymentId);
-        return AjaxResult.success(paymentDetail);
-    }
 }

+ 15 - 3
fs-service/src/main/java/com/fs/hisStore/mapper/FsStorePaymentScrmMapper.java

@@ -1,8 +1,5 @@
 package com.fs.hisStore.mapper;
 
-import java.util.List;
-import java.util.Map;
-
 import com.alibaba.fastjson.JSONObject;
 import com.fs.hisStore.domain.FsStorePaymentScrm;
 import com.fs.hisStore.param.FsStorePaymentParam;
@@ -16,6 +13,9 @@ import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
 
+import java.util.List;
+import java.util.Map;
+
 /**
  * 支付明细Mapper接口
  *
@@ -238,6 +238,18 @@ public interface FsStorePaymentScrmMapper
             "<if test = 'maps.refundEndTime != null and maps.refundEndTime != \"\"   '> " +
             " AND date_format(p.refund_time,'%y%m%d') &lt;= date_format(#{maps.refundEndTime},'%y%m%d') " +
             "</if>" +
+            "<if test = 'maps.refundAuditStatus != null'> " +
+            "and p.refund_audit_status = #{maps.refundAuditStatus} " +
+            "</if>" +
+            "<if test = 'maps.refundAuditBy != null and maps.refundAuditBy != \"\"'> " +
+            "and p.refund_audit_by like CONCAT('%',#{maps.refundAuditBy},'%') " +
+            "</if>" +
+            "<if test = 'maps.refundAuditTime != null  and maps.refundAuditTime != \"\"    '> " +
+            "and DATE_FORMAT(p.refund_audit_time,'%Y-%m-%d %H:%i:%s') = DATE_FORMAT(#{maps.refundAuditTime},'%Y-%m-%d %H:%i:%s')  " +
+            "</if>" +
+            "<if test = 'maps.refundAuditRemark != null and maps.refundAuditRemark != \"\"'> " +
+            "and p.refund_audit_remark like CONCAT('%',#{maps.refundAuditRemark},'%') " +
+            "</if>" +
 
             "<if test = 'maps.deptId != null    '> " +
             "  AND (p.dept_id = #{maps.deptId} OR p.dept_id IN ( SELECT t.dept_id FROM company_dept t WHERE find_in_set(#{maps.deptId}, ancestors) )) " +

+ 14 - 0
fs-service/src/main/java/com/fs/hisStore/param/FsStorePaymentParam.java

@@ -46,4 +46,18 @@ public class FsStorePaymentParam  extends BaseEntity implements Serializable
     private String createTimeRange;
 
     private String[] createTimeList;
+    
+    /** 退款审核状态 0-未审核 1-审核中 2-已审核 */
+    private Integer refundAuditStatus;
+    
+    /** 退款审核人 */
+    private String refundAuditBy;
+
+    /** 退款审核时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private String refundAuditTime;
+
+    /** 审核备注 **/
+    private String refundAuditRemark;
+
 }

+ 5 - 19
fs-service/src/main/java/com/fs/hisStore/service/IFsStorePaymentScrmService.java

@@ -1,8 +1,5 @@
 package com.fs.hisStore.service;
 
-import java.util.List;
-import java.util.Map;
-
 import com.alibaba.fastjson.JSONObject;
 import com.fs.common.core.domain.R;
 import com.fs.hisStore.domain.FsStorePaymentScrm;
@@ -13,6 +10,8 @@ import com.fs.hisStore.vo.FsStoreScanPaymentStatDetailsVo;
 import com.fs.hisStore.vo.FsStoreScanPaymentStatVo;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
 
 /**
  * 支付明细Service接口
@@ -133,29 +132,16 @@ public interface IFsStorePaymentScrmService
      * **/
     List<FsStoreScanPaymentStatDetailsVo> getScanPaymentStatPage(FsStoreScanPaymentStatParam param);
 
+
     /**
      * 退款审核
      * @param paymentId 支付ID
      * @param auditStatus 审核状态 1-通过 2-拒绝
      * @param auditRemark 审核备注
+     * @param auditor 审核人
      * @return 审核结果
      */
-    R auditRefund(Long paymentId, Integer auditStatus, String auditRemark);
+    R auditRefund(Long paymentId, Integer auditStatus, String auditRemark, String auditor);
 
-    /**
-     * 退款审核(带审核人参数)
-     * @param paymentId 支付ID
-     * @param auditStatus 审核状态 1-通过 2-拒绝
-     * @param auditRemark 审核备注
-     * @param auditBy 审核人
-     * @return 审核结果
-     */
-    R auditRefund(Long paymentId, Integer auditStatus, String auditRemark, String auditBy);
 
-    /**
-     * 获取退款审核详情
-     * @param paymentId 支付ID
-     * @return 退款审核详情
-     */
-    FsStorePaymentScrm getRefundAuditDetail(Long paymentId);
 }

+ 7 - 28
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStorePaymentScrmServiceImpl.java

@@ -14,7 +14,6 @@ import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.exception.ServiceException;
 import com.fs.common.utils.DateUtils;
-import com.fs.common.utils.SecurityUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyUser;
@@ -954,6 +953,7 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
             paymentStatVo = new FsStoreScanPaymentStatVo();
             paymentStatVo.setPayCount(0);
             paymentStatVo.setTotalSales(BigDecimal.ZERO);
+            paymentStatVo.setTotalReturn(BigDecimal.ZERO);
             paymentStatVo.setTableDataInfo(new TableDataInfo());
 
             String statPeriod;
@@ -1013,27 +1013,13 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
                 && config.getScanCodeDiscountAmount().compareTo(BigDecimal.ZERO) > 0;
     }
 
-    @Override
-    @Transactional
-    public R auditRefund(Long paymentId, Integer auditStatus, String auditRemark) {
-        // 安全获取当前用户名,如果获取失败则使用系统默认值
-        String auditBy;
-        try {
-            auditBy = SecurityUtils.getUsername();
-            logger.info("服务层SecurityUtils获取的用户名: {}", auditBy);
-        } catch (Exception e) {
-            auditBy = "system";
-            logger.warn("服务层SecurityUtils获取用户名失败,异常信息: {}", e.getMessage());
-            logger.warn("异常类型: {}", e.getClass().getSimpleName());
-        }
-        return auditRefund(paymentId, auditStatus, auditRemark, auditBy);
-    }
+
 
     @Override
     @Transactional
-    public R auditRefund(Long paymentId, Integer auditStatus, String auditRemark, String auditBy) {
-        logger.info("开始退款审核,paymentId: {}, auditStatus: {}, auditRemark: {}, auditBy: {}", 
-                    paymentId, auditStatus, auditRemark, auditBy);
+    public R auditRefund(Long paymentId, Integer auditStatus, String auditRemark, String auditor) {
+        logger.info("开始退款审核,paymentId: {}, auditStatus: {}, auditRemark: {}, auditor: {}",
+                    paymentId, auditStatus, auditRemark, auditor);
         
         // 参数校验
         if (paymentId == null) {
@@ -1061,11 +1047,11 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
 
         // 更新审核信息
         payment.setRefundAuditStatus(auditStatus);
-        payment.setRefundAuditBy(auditBy);
+        payment.setRefundAuditBy(auditor);
         payment.setRefundAuditTime(new Date());
         payment.setRefundAuditRemark(auditRemark);
         
-        logger.info("即将更新数据库,审核人: {}", auditBy);
+        logger.info("即将更新数据库,审核人: {}", auditor);
 
         int updateResult = fsStorePaymentMapper.updateFsStorePayment(payment);
         if (updateResult > 0) {
@@ -1086,11 +1072,4 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
         }
     }
 
-    @Override
-    public FsStorePaymentScrm getRefundAuditDetail(Long paymentId) {
-        if (paymentId == null) {
-            return null;
-        }
-        return fsStorePaymentMapper.selectFsStorePaymentById(paymentId);
-    }
 }

+ 15 - 2
fs-service/src/main/java/com/fs/hisStore/vo/FsStorePaymentVO.java

@@ -77,7 +77,6 @@ public class FsStorePaymentVO implements Serializable
     @Excel(name = "公司名称",width = 30)
     private String companyName;
     @Excel(name = "部门",width = 40)
-
     private String deptName;
     @Excel(name = "销售帐号")
     private String companyUserName;
@@ -89,7 +88,21 @@ public class FsStorePaymentVO implements Serializable
     private String title;
 
     private String payMode;
+    
+    /** 退款审核状态 0-待审核 1-审核通过 2-审核拒绝 */
+    @Excel(name = "退款审核状态")
+    private Integer refundAuditStatus;
 
+    /** 退款审核人 */
+    @Excel(name = "退款审核人")
+    private String refundAuditBy;
 
+    /** 退款审核时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "退款审核时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date refundAuditTime;
 
-}
+    /** 退款审核备注 */
+    @Excel(name = "退款审核备注")
+    private String refundAuditRemark;
+}

+ 5 - 0
fs-service/src/main/java/com/fs/hisStore/vo/FsStoreScanPaymentStatVo.java

@@ -29,6 +29,11 @@ public class FsStoreScanPaymentStatVo implements Serializable {
      * **/
     private BigDecimal totalSales;
 
+    /**
+     * 退款总金额
+     * **/
+    private BigDecimal totalReturn;
+
     /**
      * 分页数据
      * **/

+ 47 - 4
fs-service/src/main/resources/mapper/hisStore/FsStorePaymentScrmMapper.xml

@@ -218,7 +218,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         SELECT
             DATE_FORMAT(pay_time, '%Y-%m-%d') AS statPeriod,
             COUNT(payment_id) AS payCount,
-            SUM(pay_money) AS totalSales
+            SUM(pay_money) AS totalSales,
+            COALESCE((
+                SELECT SUM(refund_money)
+                FROM fs_store_payment_scrm refund
+                WHERE refund.business_type = 3
+                  AND refund.`status` = 1
+                  AND refund.refund_audit_status = 1
+                  AND refund.company_id = #{dayParam.companyId}
+                  AND refund.pay_time >= DATE_FORMAT(NOW(), '%Y-%m-%d 00:00:00')
+                  AND refund.pay_time &lt; DATE_FORMAT(
+                      DATE_ADD(NOW(), INTERVAL 1 DAY),
+                      '%Y-%m-%d 00:00:00'
+                  )
+            ), 0) AS totalReturn
         FROM
             fs_store_payment_scrm
         WHERE
@@ -258,7 +271,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         SELECT
             DATE_FORMAT(pay_time, '%Y-%m') AS statPeriod,
             COUNT(payment_id) AS payCount,
-            SUM(pay_money) AS totalSales
+            SUM(pay_money) AS totalSales,
+            COALESCE((
+                SELECT SUM(refund_money)
+                FROM fs_store_payment_scrm refund
+                WHERE refund.business_type = 3
+                  AND refund.`status` = 1
+                  AND refund.refund_audit_status = 1
+                  AND refund.company_id = #{monthParam.companyId}
+                  AND refund.pay_time >= DATE_FORMAT(NOW(), '%Y-%m-01 00:00:00')
+                  AND refund.pay_time &lt; DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 1 MONTH), '%Y-%m-01 00:00:00')
+            ), 0) AS totalReturn
         FROM
             fs_store_payment_scrm
         WHERE
@@ -293,7 +316,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         SELECT
         DATE_FORMAT(pay_time, '%Y') AS statPeriod,
         COUNT(payment_id) AS payCount,
-        SUM(pay_money) AS totalSales
+        SUM(pay_money) AS totalSales,
+        COALESCE((
+            SELECT SUM(refund_money)
+            FROM fs_store_payment_scrm refund
+            WHERE refund.business_type = 3
+              AND refund.`status` = 1
+              AND refund.refund_audit_status = 1
+              AND refund.company_id = #{yearParam.companyId}
+              AND refund.pay_time >= DATE_FORMAT(NOW(), '%Y-01-01 00:00:00')
+              AND refund.pay_time &lt; DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 1 YEAR), '%Y-01-01 00:00:00')
+        ), 0) AS totalReturn
         FROM
         fs_store_payment_scrm
         WHERE
@@ -328,7 +361,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         SELECT
             CONCAT(#{dateParam.startDate},'至',#{dateParam.endDate}) AS statPeriod,
             COUNT(payment_id) AS payCount,
-            SUM(pay_money) AS totalSales
+            SUM(pay_money) AS totalSales,
+            COALESCE((
+                SELECT SUM(refund_money)
+                FROM fs_store_payment_scrm refund
+                WHERE refund.business_type = 3
+                  AND refund.`status` = 1
+                  AND refund.refund_audit_status = 1
+                  AND refund.company_id = #{dateParam.companyId}
+                  AND refund.pay_time >= CONCAT(#{dateParam.startDate}, ' 00:00:00')
+                  AND refund.pay_time &lt;= CONCAT(#{dateParam.endDate}, ' 23:59:59')
+            ), 0) AS totalReturn
         FROM
             fs_store_payment_scrm
         WHERE