Browse Source

流量统计与token消耗增加对应的消耗金额,并对流量统计做了SQL优化和索引增加

xw 1 tuần trước cách đây
mục cha
commit
d6630ae939

+ 48 - 2
fs-admin/src/main/java/com/fs/course/controller/FsCourseTrafficLogController.java

@@ -5,7 +5,10 @@ import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.List;
 
+import com.fs.common.constant.HttpStatus;
 import com.fs.common.core.domain.R;
+import com.fs.common.core.page.PageDomain;
+import com.fs.common.core.page.TableSupport;
 import com.fs.common.exception.CustomException;
 import com.fs.course.param.FsCourseTrafficLogParam;
 import com.fs.course.param.InternetTrafficParam;
@@ -52,9 +55,52 @@ public class FsCourseTrafficLogController extends BaseController
     @GetMapping("/list")
     public TableDataInfo list(FsCourseTrafficLogParam param)
     {
-        startPage();
         List<FsCourseTrafficLogListVO> list = fsCourseTrafficLogService.selectTrafficNew(param);
-        return getDataTable(list);
+
+        // 为每条记录计算流量和金额
+        for (FsCourseTrafficLogListVO vo : list) {
+            vo.formatTraffic();
+        }
+
+        // 计算总和
+        FsCourseTrafficLogListVO sumTotal = new FsCourseTrafficLogListVO();
+        sumTotal.setCompanyName("合计");
+        Long totalTrafficSum = list.stream()
+            .filter(item -> item.getTotalInternetTraffic() != null)
+            .mapToLong(FsCourseTrafficLogListVO::getTotalInternetTraffic)
+            .sum();
+        sumTotal.setTotalInternetTraffic(totalTrafficSum);
+        // 为合计行计算流量和金额
+        sumTotal.formatTraffic();
+
+        // 获取分页参数
+        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-admin/src/main/java/com/fs/his/task/Task.java

@@ -250,6 +250,10 @@ public class Task {
                         count = fastGptPushTotal.getCount() * 150;
                     }
                     fastGptPushTotal.setCount(count);
+                    // 计算金额,1元 = 10万token
+                    double amount = count / 100000.0;
+                    fastGptPushTotal.setAmount(Math.round(amount * 100.0) / 100.0);
+                    
                     FastGptPushTokenTotal pushTotal = qwRestrictionPushRecordMapper.selectFastGptPushTokenTotalByInfo(fastGptPushTotal);
                     if(pushTotal == null){
                         qwRestrictionPushRecordMapper.insertPushTokenTotal(fastGptPushTotal);

+ 9 - 4
fs-admin/src/main/java/com/fs/qw/controller/QwPushCountController.java

@@ -161,12 +161,17 @@ public class QwPushCountController extends BaseController {
     public TableDataInfo tokenList(FastGptPushTokenTotal pushTokenInfo) {
         List<FastGptPushTokenTotal> list = qwPushCountService.selectFastGptPushTokenTotalList(pushTokenInfo);
 
-
         // 计算总和
         FastGptPushTokenTotal sumTotal = new FastGptPushTokenTotal();
-        sumTotal.setCompanyName("合计"); // 假设有一个字段用于显示“合计”标签,具体字段名根据实际情况替换
-        Long sum = list.stream().mapToLong(FastGptPushTokenTotal::getCount).sum(); // 假设有一个数字字段需要求和,具体字段名根据实际情况替换
-        sumTotal.setCount(sum); // 设置合计值,具体字段名根据实际情况替换
+        sumTotal.setCompanyName("合计");
+        Long sum = list.stream().mapToLong(FastGptPushTokenTotal::getCount).sum();
+        sumTotal.setCount(sum);
+        // 计算合计金额
+        Double amountSum = list.stream()
+            .filter(item -> item.getAmount() != null)
+            .mapToDouble(FastGptPushTokenTotal::getAmount)
+            .sum();
+        sumTotal.setAmount(Math.round(amountSum * 100.0) / 100.0);
 
         // 获取分页参数
         PageDomain pageDomain = TableSupport.buildPageRequest();

+ 5 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsCourseTrafficLogServiceImpl.java

@@ -202,7 +202,10 @@ public class FsCourseTrafficLogServiceImpl implements IFsCourseTrafficLogService
             param.setCommon(param.getTabType());
         }
         List<FsCourseTrafficLogListVO> fsCourseTrafficLogListVOS = fsCourseTrafficLogMapper.selectTrafficNew(param);
+        
+        // 批量查询,减少循环中的查询次数
         for (FsCourseTrafficLogListVO log : fsCourseTrafficLogListVOS) {
+            // 项目名称查询(字典查询通常有缓存)
             if (ObjectUtils.isNotNull(log.getProject())) {
                 String sysCourseProject = DictUtils.getDictLabel("sys_course_project", String.valueOf(log.getProject()));
                 if (StringUtils.isNotBlank(sysCourseProject)) {
@@ -210,6 +213,7 @@ public class FsCourseTrafficLogServiceImpl implements IFsCourseTrafficLogService
                 }
             }
 
+            // 公司名称查询(使用缓存)
             if (ObjectUtils.isNotNull(log.getCompanyId())) {
                 String companyName = companyCacheService.selectCompanyNameById(log.getCompanyId());
                 if (StringUtils.isNotBlank(companyName)) {
@@ -217,6 +221,7 @@ public class FsCourseTrafficLogServiceImpl implements IFsCourseTrafficLogService
                 }
             }
 
+            // 课程名称查询(使用缓存)
             if (ObjectUtils.isNotNull(log.getCourseId())) {
                 String courseName = fsUserCourseCacheService.selectCourseNameByCourseId(log.getCourseId());
                 if (StringUtils.isNotBlank(courseName)) {

+ 8 - 1
fs-service/src/main/java/com/fs/course/vo/FsCourseTrafficLogListVO.java

@@ -29,17 +29,24 @@ public class FsCourseTrafficLogListVO implements Serializable
 
     @Excel(name = "总流量 (GB)")
     private String formattedTotalTraffic;
+    
+    @Excel(name = "耗费金额(元)")
+    private String formattedAmount;
 
     @Excel(name = "统计月份")
     private String month;
 
-    // 工具方法:根据 totalInternetTraffic 自动计算 formattedTotalTraffic
+    // 工具方法:根据 totalInternetTraffic 自动计算 formattedTotalTraffic 和金额
     public void formatTraffic() {
         if (this.totalInternetTraffic == null) {
             this.formattedTotalTraffic = "0.0000 GB";
+            this.formattedAmount = "0.00";
         } else {
             double gb = this.totalInternetTraffic.doubleValue() / (1024 * 1024 * 1024);
             this.formattedTotalTraffic = String.format("%.4f GB", gb);
+            // 0.08元一个G的流量
+            double amount = gb * 0.08;
+            this.formattedAmount = String.format("%.2f", amount);
         }
     }
 

+ 2 - 0
fs-service/src/main/java/com/fs/fastGpt/domain/FastGptPushTokenTotal.java

@@ -15,6 +15,8 @@ public class FastGptPushTokenTotal extends BaseEntity {
     private String companyName;
     @Excel(name = "token消耗数")
     private Long count;
+    @Excel(name = "耗费金额(元)")
+    private Double amount;
     private Integer status;
     @Excel(name = "生成时间")
     private String statTime;

+ 7 - 6
fs-service/src/main/resources/mapper/course/FsCourseTrafficLogMapper.xml

@@ -251,7 +251,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         ,DATE_FORMAT(create_time, '%Y-%m-%d') AS `month`  from fs_course_traffic_log
         <where>
             <if test="startDate != null and endDate != null">
-                and DATE_FORMAT(create_time, '%Y-%m-%d') between #{startDate} AND #{endDate}
+                and create_time &gt;= CONCAT(#{startDate}, ' 00:00:00')
+                and create_time &lt;= CONCAT(#{endDate}, ' 23:59:59')
             </if>
             <if test='companyId !=null'>
                 and company_id = #{companyId}
@@ -271,19 +272,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </where>
 
         <if test="tabType==null or tabType==''">
-            group by company_id,`month`,course_id,project
+            group by company_id, DATE_FORMAT(create_time, '%Y-%m-%d'), course_id, project
         </if>
         <if test="tabType!=null and tabType=='project'">
-            group by project,`month`
+            group by project, DATE_FORMAT(create_time, '%Y-%m-%d')
         </if>
         <if test="tabType!=null and tabType=='course'">
-            group by course_id,`month`
+            group by course_id, DATE_FORMAT(create_time, '%Y-%m-%d')
         </if>
         <if test="tabType!=null and tabType=='company'">
-            group by company_id,`month`
+            group by company_id, DATE_FORMAT(create_time, '%Y-%m-%d')
         </if>
         <if test="tabType!=null and tabType=='common'">
-            group by course_id,`month`
+            group by course_id, DATE_FORMAT(create_time, '%Y-%m-%d')
         </if>
     </select>
 

+ 6 - 5
fs-service/src/main/resources/mapper/qw/QwRestrictionPushRecordMapper.xml

@@ -4,12 +4,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.fs.qw.mapper.QwRestrictionPushRecordMapper">
     <insert id="insertPushTokenTotal">
-        insert into fastgpt_push_token_total(type,qw_user_id,company_id,status,stat_time,count)
-        values(#{type},#{qwUserId},#{companyId},#{status},#{statTime},#{count})
+        insert into fastgpt_push_token_total(type,qw_user_id,company_id,status,stat_time,count,amount)
+        values(#{type},#{qwUserId},#{companyId},#{status},#{statTime},#{count},#{amount})
     </insert>
     <update id="updatePushTokenTotal">
         update fastgpt_push_token_total
-        set count=#{count}
+        set count=#{count},amount=#{amount}
         where id=#{id}
     </update>
 
@@ -22,12 +22,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </select>
 
     <select id="selectFastGptPushTokenTotalByInfo" resultType="com.fs.fastGpt.domain.FastGptPushTokenTotal">
-        select id,type,qw_user_id as qwUserId,company_id as companyId,status,stat_time statTime,count
+        select id,type,qw_user_id as qwUserId,company_id as companyId,status,stat_time statTime,count,amount
         from fastgpt_push_token_total
         where  type=#{type} and qw_user_id=#{qwUserId} and company_id=#{companyId} and status=#{status} and stat_time=#{statTime}
     </select>
     <select id="selectFastGptPushTokenTotalList" resultType="com.fs.fastGpt.domain.FastGptPushTokenTotal">
-        select ft.id,ft.type,ft.qw_user_id as qwUserId,ft.company_id as companyId,com.company_name as companyName,ft.status,ft.stat_time statTime,sum(ft.count) count
+        select ft.id,ft.type,ft.qw_user_id as qwUserId,ft.company_id as companyId,com.company_name as companyName,ft.status,ft.stat_time statTime,sum(ft.count) count,sum(ft.amount) amount
         from fastgpt_push_token_total ft left join company com on ft.company_id= com.company_id
         <where>
             <if test="type != null" >and `ft.type` = #{type} </if>
@@ -40,5 +40,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             </if>
         </where>
         group by ft.company_id,ft.stat_time
+        order by ft.stat_time desc
     </select>
 </mapper>