Browse Source

每天的官方群发统计

三七 6 days ago
parent
commit
c153a387af

+ 18 - 6
fs-admin/src/main/java/com/fs/qw/qwTask/qwTask.java

@@ -1,21 +1,17 @@
 package com.fs.qw.qwTask;
 
 import com.fs.course.service.IFsUserCourseService;
-import com.fs.qw.service.IQwExternalContactService;
-import com.fs.qw.service.IQwGroupMsgService;
-import com.fs.qw.service.IQwMaterialService;
-import com.fs.qw.service.IQwUserService;
+import com.fs.qw.service.*;
 import com.fs.sop.service.impl.QwSopLogsServiceImpl;
 import com.fs.sop.service.impl.QwSopServiceImpl;
 import com.fs.sop.service.ISopUserLogsService;
 import com.fs.statis.IFsStatisQwWatchService;
 import com.fs.statis.service.FsStatisSalerWatchService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 
 @Component("qwTask")
 public class qwTask {
@@ -51,6 +47,8 @@ public class qwTask {
     private IQwMaterialService iQwMaterialService;
 
 
+
+
     //正在使用
     public void qwExternalContact()
     {
@@ -199,4 +197,18 @@ public class qwTask {
     public void updateMaterialByTwoDays(){
         iQwMaterialService.updateQwMaterialByQw();
     }
+
+    /**
+     * 统计 每天的官方群发统计
+     */
+    public void countQwApiAopLogToken(){
+        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        // 获取当前日期(只包含年月日)
+        LocalDate currentDate = LocalDate.now();
+
+        String todayStr = currentDate.format(dateFormatter);
+         qwSopLogsService.countQwApiAopLogToken(todayStr);
+
+
+    }
 }

+ 18 - 2
fs-qw-task/src/main/java/com/fs/app/controller/CommonController.java

@@ -134,11 +134,27 @@ public class CommonController {
     @Autowired
     public RedisCache redisCache;
 
+
+
     /**
-     * 获取跳转微信小程序的链接地址
+     *
+     */
+    @GetMapping("/countQwApiAopLogToken")
+    public void countQwApiAopLogToken() {
+
+        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        // 获取当前日期(只包含年月日)
+        LocalDate currentDate = LocalDate.now();
+
+        String todayStr = currentDate.format(dateFormatter);
+        qwSopLogsService.countQwApiAopLogToken(todayStr);
+
+    }
+
+    /**
+     * 查询视频时长
      */
     @GetMapping("/getVideoDuration")
-    @ApiOperation("获取跳转微信小程序的链接地址")
     public Long getVideoDuration(Long videoId) {
 
             String redisKey = "h5user:video:duration:" + videoId;

+ 46 - 0
fs-service/src/main/java/com/fs/qw/domain/QwApiSopLogToken.java

@@ -0,0 +1,46 @@
+package com.fs.qw.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+/**
+ * 企业微信账号 发官方群发的统计对象 qw_api_sop_log_token
+ *
+ * @author fs
+ * @date 2025-11-26
+ */
+@Data
+public class QwApiSopLogToken {
+
+    /** $column.columnComment */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String qwUserId;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Long companyId;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Date sendTime;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Long sendCount;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Long sendCountToken;
+
+
+}

+ 61 - 0
fs-service/src/main/java/com/fs/qw/mapper/QwApiSopLogTokenMapper.java

@@ -0,0 +1,61 @@
+package com.fs.qw.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.qw.domain.QwApiSopLogToken;
+
+/**
+ * 企业微信账号 发官方群发的统计Mapper接口
+ * 
+ * @author fs
+ * @date 2025-11-26
+ */
+public interface QwApiSopLogTokenMapper extends BaseMapper<QwApiSopLogToken>{
+    /**
+     * 查询企业微信账号 发官方群发的统计
+     * 
+     * @param id 企业微信账号 发官方群发的统计主键
+     * @return 企业微信账号 发官方群发的统计
+     */
+    QwApiSopLogToken selectQwApiSopLogTokenById(Long id);
+
+    /**
+     * 查询企业微信账号 发官方群发的统计列表
+     * 
+     * @param qwApiSopLogToken 企业微信账号 发官方群发的统计
+     * @return 企业微信账号 发官方群发的统计集合
+     */
+    List<QwApiSopLogToken> selectQwApiSopLogTokenList(QwApiSopLogToken qwApiSopLogToken);
+
+    /**
+     * 新增企业微信账号 发官方群发的统计
+     * 
+     * @param qwApiSopLogToken 企业微信账号 发官方群发的统计
+     * @return 结果
+     */
+    int insertQwApiSopLogToken(QwApiSopLogToken qwApiSopLogToken);
+
+    /**
+     * 修改企业微信账号 发官方群发的统计
+     * 
+     * @param qwApiSopLogToken 企业微信账号 发官方群发的统计
+     * @return 结果
+     */
+    int updateQwApiSopLogToken(QwApiSopLogToken qwApiSopLogToken);
+
+    /**
+     * 删除企业微信账号 发官方群发的统计
+     * 
+     * @param id 企业微信账号 发官方群发的统计主键
+     * @return 结果
+     */
+    int deleteQwApiSopLogTokenById(Long id);
+
+    /**
+     * 批量删除企业微信账号 发官方群发的统计
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteQwApiSopLogTokenByIds(Long[] ids);
+}

+ 61 - 0
fs-service/src/main/java/com/fs/qw/service/IQwApiSopLogTokenService.java

@@ -0,0 +1,61 @@
+package com.fs.qw.service;
+
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.qw.domain.QwApiSopLogToken;
+
+/**
+ * 企业微信账号 发官方群发的统计Service接口
+ * 
+ * @author fs
+ * @date 2025-11-26
+ */
+public interface IQwApiSopLogTokenService extends IService<QwApiSopLogToken>{
+    /**
+     * 查询企业微信账号 发官方群发的统计
+     * 
+     * @param id 企业微信账号 发官方群发的统计主键
+     * @return 企业微信账号 发官方群发的统计
+     */
+    QwApiSopLogToken selectQwApiSopLogTokenById(Long id);
+
+    /**
+     * 查询企业微信账号 发官方群发的统计列表
+     * 
+     * @param qwApiSopLogToken 企业微信账号 发官方群发的统计
+     * @return 企业微信账号 发官方群发的统计集合
+     */
+    List<QwApiSopLogToken> selectQwApiSopLogTokenList(QwApiSopLogToken qwApiSopLogToken);
+
+    /**
+     * 新增企业微信账号 发官方群发的统计
+     * 
+     * @param qwApiSopLogToken 企业微信账号 发官方群发的统计
+     * @return 结果
+     */
+    int insertQwApiSopLogToken(QwApiSopLogToken qwApiSopLogToken);
+
+    /**
+     * 修改企业微信账号 发官方群发的统计
+     * 
+     * @param qwApiSopLogToken 企业微信账号 发官方群发的统计
+     * @return 结果
+     */
+    int updateQwApiSopLogToken(QwApiSopLogToken qwApiSopLogToken);
+
+    /**
+     * 批量删除企业微信账号 发官方群发的统计
+     * 
+     * @param ids 需要删除的企业微信账号 发官方群发的统计主键集合
+     * @return 结果
+     */
+    int deleteQwApiSopLogTokenByIds(Long[] ids);
+
+    /**
+     * 删除企业微信账号 发官方群发的统计信息
+     * 
+     * @param id 企业微信账号 发官方群发的统计主键
+     * @return 结果
+     */
+    int deleteQwApiSopLogTokenById(Long id);
+}

+ 91 - 0
fs-service/src/main/java/com/fs/qw/service/impl/QwApiSopLogTokenServiceImpl.java

@@ -0,0 +1,91 @@
+package com.fs.qw.service.impl;
+
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.fs.qw.mapper.QwApiSopLogTokenMapper;
+import com.fs.qw.domain.QwApiSopLogToken;
+import com.fs.qw.service.IQwApiSopLogTokenService;
+
+/**
+ * 企业微信账号 发官方群发的统计Service业务层处理
+ * 
+ * @author fs
+ * @date 2025-11-26
+ */
+@Service
+public class QwApiSopLogTokenServiceImpl extends ServiceImpl<QwApiSopLogTokenMapper, QwApiSopLogToken> implements IQwApiSopLogTokenService {
+
+    /**
+     * 查询企业微信账号 发官方群发的统计
+     * 
+     * @param id 企业微信账号 发官方群发的统计主键
+     * @return 企业微信账号 发官方群发的统计
+     */
+    @Override
+    public QwApiSopLogToken selectQwApiSopLogTokenById(Long id)
+    {
+        return baseMapper.selectQwApiSopLogTokenById(id);
+    }
+
+    /**
+     * 查询企业微信账号 发官方群发的统计列表
+     * 
+     * @param qwApiSopLogToken 企业微信账号 发官方群发的统计
+     * @return 企业微信账号 发官方群发的统计
+     */
+    @Override
+    public List<QwApiSopLogToken> selectQwApiSopLogTokenList(QwApiSopLogToken qwApiSopLogToken)
+    {
+        return baseMapper.selectQwApiSopLogTokenList(qwApiSopLogToken);
+    }
+
+    /**
+     * 新增企业微信账号 发官方群发的统计
+     * 
+     * @param qwApiSopLogToken 企业微信账号 发官方群发的统计
+     * @return 结果
+     */
+    @Override
+    public int insertQwApiSopLogToken(QwApiSopLogToken qwApiSopLogToken)
+    {
+        return baseMapper.insertQwApiSopLogToken(qwApiSopLogToken);
+    }
+
+    /**
+     * 修改企业微信账号 发官方群发的统计
+     * 
+     * @param qwApiSopLogToken 企业微信账号 发官方群发的统计
+     * @return 结果
+     */
+    @Override
+    public int updateQwApiSopLogToken(QwApiSopLogToken qwApiSopLogToken)
+    {
+        return baseMapper.updateQwApiSopLogToken(qwApiSopLogToken);
+    }
+
+    /**
+     * 批量删除企业微信账号 发官方群发的统计
+     * 
+     * @param ids 需要删除的企业微信账号 发官方群发的统计主键
+     * @return 结果
+     */
+    @Override
+    public int deleteQwApiSopLogTokenByIds(Long[] ids)
+    {
+        return baseMapper.deleteQwApiSopLogTokenByIds(ids);
+    }
+
+    /**
+     * 删除企业微信账号 发官方群发的统计信息
+     * 
+     * @param id 企业微信账号 发官方群发的统计主键
+     * @return 结果
+     */
+    @Override
+    public int deleteQwApiSopLogTokenById(Long id)
+    {
+        return baseMapper.deleteQwApiSopLogTokenById(id);
+    }
+}

+ 22 - 0
fs-service/src/main/java/com/fs/sop/mapper/QwSopLogsMapper.java

@@ -3,6 +3,7 @@ package com.fs.sop.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.common.annotation.DataSource;
 import com.fs.common.enums.DataSourceType;
+import com.fs.qw.domain.QwApiSopLogToken;
 import com.fs.qw.param.SopMsgParam;
 import com.fs.sop.domain.QwSopLogs;
 import com.fs.sop.params.*;
@@ -332,4 +333,25 @@ public interface QwSopLogsMapper extends BaseMapper<QwSopLogs> {
 
     @DataSource(DataSourceType.SOP)
     void batchUpdateQwSopLogsNewUserById(@Param("data")List<QwSopLogs> qwSopLogsList);
+
+    @DataSource(DataSourceType.SOP)
+    @Select("<script>" +
+            "SELECT\n" +
+            "  qw_user_key as qw_user_id,\n" +
+            "  company_id,\n" +
+            "  send_time,\n" +
+            "  count(*) as send_count," +
+            "  count(*)  * 150 as send_count_token \n" +
+            "FROM\n" +
+            "  `qw_sop_logs`\n" +
+            "WHERE\n" +
+            "  send_type = 1\n" +
+            "  AND send_status = 1\n" +
+            "  AND DATE(send_time) = #{data}\n" +
+            "GROUP BY\n" +
+            "  qw_user_key,\n" +
+            "  company_id\n" +
+            "ORDER BY qw_user_key" +
+            "</script>")
+    List<QwApiSopLogToken> countQwApiAopLogToken(@Param("data") String dateStr);
 }

+ 2 - 0
fs-service/src/main/java/com/fs/sop/service/IQwSopLogsService.java

@@ -132,4 +132,6 @@ public interface IQwSopLogsService extends IService<QwSopLogs>
 
 
     void updateBatch(List<QwSopLogs> collect);
+
+    void countQwApiAopLogToken(String dateStr);
 }

+ 11 - 1
fs-service/src/main/java/com/fs/sop/service/impl/QwSopLogsServiceImpl.java

@@ -17,14 +17,15 @@ import com.fs.company.service.ICompanyUserService;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.FsCourseWatchLog;
 import com.fs.course.service.IFsCourseWatchLogService;
-import com.fs.course.service.IFsUserCompanyUserService;
 import com.fs.fastGpt.service.IFastGptChatSessionService;
+import com.fs.qw.domain.QwApiSopLogToken;
 import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.domain.QwUser;
 import com.fs.qw.mapper.QwExternalContactMapper;
 import com.fs.qw.mapper.QwUserMapper;
 import com.fs.qw.param.SopMsgParam;
 import com.fs.qw.result.QwExternalContactByQwResult;
+import com.fs.qw.service.IQwApiSopLogTokenService;
 import com.fs.qw.service.impl.AsyncSopTestService;
 import com.fs.qw.service.impl.QwExternalContactServiceImpl;
 import com.fs.qw.vo.QwSopTempSetting;
@@ -109,6 +110,9 @@ public class QwSopLogsServiceImpl extends ServiceImpl<QwSopLogsMapper, QwSopLogs
 
     private AsyncSopTestService asyncSopTestService;
 
+    @Autowired
+    private IQwApiSopLogTokenService sopLogTokenService;
+
     @Autowired
     public void setAsyncSopTestService(@Lazy AsyncSopTestService asyncSopTestService){
         this.asyncSopTestService = asyncSopTestService;
@@ -1605,6 +1609,12 @@ public class QwSopLogsServiceImpl extends ServiceImpl<QwSopLogsMapper, QwSopLogs
         super.updateBatchById(collect);
     }
 
+    @Override
+    public void countQwApiAopLogToken(String dateStr) {
+        List<QwApiSopLogToken> qwApiSopLogTokens = qwSopLogsMapper.countQwApiAopLogToken(dateStr);
+        sopLogTokenService.saveBatch(qwApiSopLogTokens,500);
+    }
+
 
     // 定义一个方法来批量处理插入逻辑,支持每 500 条数据一次的批量插入
     private void processAndInsertQwSopLogs(List<QwSopLogsDoSendListTVO> logsByJsApiNotExtId) {

+ 78 - 0
fs-service/src/main/resources/mapper/qw/QwApiSopLogTokenMapper.xml

@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fs.qw.mapper.QwApiSopLogTokenMapper">
+
+    <resultMap type="QwApiSopLogToken" id="QwApiSopLogTokenResult">
+        <result property="id"    column="id"    />
+        <result property="qwUserId"    column="qw_user_id"    />
+        <result property="companyId"    column="company_id"    />
+        <result property="sendTime"    column="send_time"    />
+        <result property="sendCount"    column="send_count"    />
+        <result property="sendCountToken"    column="send_count_token"    />
+    </resultMap>
+
+    <sql id="selectQwApiSopLogTokenVo">
+        select id, qw_user_id, company_id, send_time, send_count, send_count_token from qw_api_sop_log_token
+    </sql>
+
+    <select id="selectQwApiSopLogTokenList" parameterType="QwApiSopLogToken" resultMap="QwApiSopLogTokenResult">
+        <include refid="selectQwApiSopLogTokenVo"/>
+        <where>
+            <if test="qwUserId != null  and qwUserId != ''"> and qw_user_id = #{qwUserId}</if>
+            <if test="companyId != null "> and company_id = #{companyId}</if>
+            <if test="sendTime != null "> and send_time = #{sendTime}</if>
+            <if test="sendCount != null "> and send_count = #{sendCount}</if>
+            <if test="sendCountToken != null "> and send_count_token = #{sendCountToken}</if>
+        </where>
+    </select>
+
+    <select id="selectQwApiSopLogTokenById" parameterType="Long" resultMap="QwApiSopLogTokenResult">
+        <include refid="selectQwApiSopLogTokenVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertQwApiSopLogToken" parameterType="QwApiSopLogToken">
+        insert into qw_api_sop_log_token
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="qwUserId != null">qw_user_id,</if>
+            <if test="companyId != null">company_id,</if>
+            <if test="sendTime != null">send_time,</if>
+            <if test="sendCount != null">send_count,</if>
+            <if test="sendCountToken != null">send_count_token,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="qwUserId != null">#{qwUserId},</if>
+            <if test="companyId != null">#{companyId},</if>
+            <if test="sendTime != null">#{sendTime},</if>
+            <if test="sendCount != null">#{sendCount},</if>
+            <if test="sendCountToken != null">#{sendCountToken},</if>
+         </trim>
+    </insert>
+
+    <update id="updateQwApiSopLogToken" parameterType="QwApiSopLogToken">
+        update qw_api_sop_log_token
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="qwUserId != null">qw_user_id = #{qwUserId},</if>
+            <if test="companyId != null">company_id = #{companyId},</if>
+            <if test="sendTime != null">send_time = #{sendTime},</if>
+            <if test="sendCount != null">send_count = #{sendCount},</if>
+            <if test="sendCountToken != null">send_count_token = #{sendCountToken},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteQwApiSopLogTokenById" parameterType="Long">
+        delete from qw_api_sop_log_token where id = #{id}
+    </delete>
+
+    <delete id="deleteQwApiSopLogTokenByIds" parameterType="String">
+        delete from qw_api_sop_log_token where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>