Browse Source

feat(payment): 增加支付与退款金额统计功能

- 在支付明细列表中计算并返回总支付金额和总退款金额
- 仅统计状态为已支付或已退款且审核完成的退款记录
- 扩展 TableDataInfo 类以支持附加数据的返回
- 更新日志记录,包含新增的统计金额信息
- 修复课程日期计算逻辑,确保课次日期连续性
xw 1 day ago
parent
commit
513eb73c43

+ 32 - 0
fs-common/src/main/java/com/fs/common/core/page/TableDataInfo.java

@@ -1,7 +1,10 @@
 package com.fs.common.core.page;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 表格分页数据对象
@@ -24,6 +27,9 @@ public class TableDataInfo implements Serializable
     /** 消息内容 */
     private String msg;
 
+    /** 扩展数据(用于存放统计信息等额外数据) */
+    private Map<String, Object> ext;
+
     /**
      * 表格数据对象
      */
@@ -82,4 +88,30 @@ public class TableDataInfo implements Serializable
     {
         this.msg = msg;
     }
+
+    public Map<String, Object> getExt()
+    {
+        return ext;
+    }
+
+    public void setExt(Map<String, Object> ext)
+    {
+        this.ext = ext;
+    }
+
+    /**
+     * 添加扩展数据
+     * @param key 键
+     * @param value 值
+     * @return TableDataInfo
+     */
+    public TableDataInfo put(String key, Object value)
+    {
+        if (this.ext == null)
+        {
+            this.ext = new HashMap<>();
+        }
+        this.ext.put(key, value);
+        return this;
+    }
 }

+ 32 - 3
fs-company/src/main/java/com/fs/hisStore/controller/FsStorePaymentScrmController.java

@@ -73,14 +73,43 @@ public class FsStorePaymentScrmController extends BaseController
         fsStorePayment.setCompanyId(loginUser.getCompany().getCompanyId());
         startPage();
         List<FsStorePaymentVO> list = fsStorePaymentService.selectFsStorePaymentListQueryVO(fsStorePayment);
+        
+        // 计算总支付金额和总退款金额
+        BigDecimal totalPaymentAmount = BigDecimal.ZERO;
+        BigDecimal totalRefundAmount = BigDecimal.ZERO;
+        
         for (FsStorePaymentVO vo : list){
             vo.setUserPhone(ParseUtils.parsePhone(vo.getUserPhone()));
+            
+            // 状态为1(已支付)或-1(已退款)时,累加到总支付金额
+            if (vo.getStatus() != null && (vo.getStatus() == 1 || vo.getStatus() == -1)) {
+                if (vo.getPayMoney() != null) {
+                    totalPaymentAmount = totalPaymentAmount.add(vo.getPayMoney());
+                }
+            }
+            
+            // 状态为-1(已退款)时,累加到总退款金额
+            // 根据规范,只统计退款审核状态为2(审核完成)的退款金额
+            if (vo.getStatus() != null && vo.getStatus() == -1) {
+                if (vo.getRefundAuditStatus() != null && vo.getRefundAuditStatus() == 2) {
+                    if (vo.getRefundMoney() != null) {
+                        totalRefundAmount = totalRefundAmount.add(vo.getRefundMoney());
+                    }
+                }
+            }
         }
+        
         // 记录查询条件,包括新增的退款审核状态
-        logger.info("支付明细列表查询,公司ID:{},退款审核状态:{},退款审核人:{},查询结果数量:{}",
+        logger.info("支付明细列表查询,公司ID:{},退款审核状态:{},退款审核人:{},查询结果数量:{},总支付金额:{},总退款金额:{}",
             loginUser.getCompany().getCompanyId(), fsStorePayment.getRefundAuditStatus(), 
-            fsStorePayment.getRefundAuditBy(), list.size());
-        return getDataTable(list);
+            fsStorePayment.getRefundAuditBy(), list.size(), totalPaymentAmount, totalRefundAmount);
+        
+        TableDataInfo dataTable = getDataTable(list);
+
+        dataTable.put("totalPaymentAmount", totalPaymentAmount);
+        dataTable.put("totalRefundAmount", totalRefundAmount);
+        
+        return dataTable;
     }
 
     /**

+ 24 - 2
fs-service/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodDaysServiceImpl.java

@@ -313,14 +313,35 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
             
             // 确定开始课次 - 从现有最大课次+1开始,确保连续性
             int startLesson;
+            LocalDate startDate; // 新增:确定开始日期
+            
             if (param.getStartLesson() != null) {
                 startLesson = param.getStartLesson();
+                // 如果指定了起始课次,仍然基于营期开始时间计算日期
+                startDate = period.getPeriodStartingTime().plusDays(startLesson - 1);
             } else {
                 // 获取现有最大课次,如果没有则从1开始
                 startLesson = existingDays.stream()
                         .mapToInt(FsUserCoursePeriodDays::getLesson)
                         .max()
                         .orElse(0) + 1;
+                
+                // 关键修复:获取已存在课程的最后日期,从该日期的下一天开始
+                if (!existingDays.isEmpty()) {
+                    // 按日期排序,获取最后一个课程的日期
+                    LocalDate lastDate = existingDays.stream()
+                            .map(FsUserCoursePeriodDays::getDayDate)
+                            .filter(date -> date != null)
+                            .max(LocalDate::compareTo)
+                            .orElse(period.getPeriodStartingTime().plusDays(startLesson - 2));
+                    
+                    startDate = lastDate.plusDays(1); // 从最后日期的下一天开始
+                    log.info("基于已存在课程的最后日期计算起始日期:最后日期={}, 新起始日期={}", lastDate, startDate);
+                } else {
+                    // 如果没有已存在的课程,从营期开始时间计算
+                    startDate = period.getPeriodStartingTime();
+                    log.info("营期暂无课程,从营期开始时间计算起始日期:{}", startDate);
+                }
             }
             
             // 使用排序后的视频列表进行处理,确保按courseSort顺序添加
@@ -336,8 +357,9 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
                 // 设置课次 - 严格按排序后的顺序递增,确保有序
                 newDay.setLesson(startLesson + i);
                 
-                // 计算日期 - 基于课次计算正确日期(课次从1开始,所以偏移量是课次-1)
-                LocalDate courseDate = period.getPeriodStartingTime().plusDays(newDay.getLesson() - 1);
+                // 计算日期 - 修复:基于起始日期递增,而不是基于课次计算
+                // 这样可以避免当已存在课程的日期与课次不对应时出现重复日期
+                LocalDate courseDate = startDate.plusDays(i);
                 newDay.setDayDate(courseDate);
                 
                 // 设置时间 - 优先使用参数中的时间,其次使用视频默认时间