Browse Source

Merge branch 'master' of http://1.14.104.71:10880/root/ylrz_his_scrm_java

caoliqin 6 days ago
parent
commit
9b7c42ac64

+ 20 - 0
fs-admin/src/main/java/com/fs/his/task/SendRedPacketTask.java

@@ -0,0 +1,20 @@
+package com.fs.his.task;
+
+import com.fs.course.service.IFsCourseRedPacketLogService;
+import com.fs.course.service.IFsUserCourseVideoRedPackageService;
+import com.fs.course.service.IFsUserCourseVideoService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service("sendRedPacketTask")
+public class SendRedPacketTask {
+    @Autowired
+    private IFsCourseRedPacketLogService redPacketLogService;
+
+    public void sendRedPacket(){
+        redPacketLogService.sendRedPacketBf();
+    }
+
+}

+ 1 - 0
fs-service/src/main/java/com/fs/course/config/CourseConfig.java

@@ -39,6 +39,7 @@ public class CourseConfig implements Serializable {
     private String sidebarImageUrl;//侧边栏公共图
     private Integer delayStart;
     private Integer delayEnd;
+    private Integer isNegative;//是否为负数 0、不允许,1、允许
 
     /**
      * 小程序授权头像昵称方式(目前仅会员看课有效)

+ 1 - 1
fs-service/src/main/java/com/fs/course/domain/FsCourseRedPacketLog.java

@@ -49,7 +49,7 @@ public class FsCourseRedPacketLog extends BaseEntity
     @Excel(name = "分享企微userid")
     private String qwUserId;
 
-    private Integer status;//状态 0 发送中  1  已发送
+    private Integer status;//状态 0 发送中  1  已发送 ,2、待发送
 
 
     private Long watchLogId;//观看记录 id

+ 1 - 0
fs-service/src/main/java/com/fs/course/service/IFsCourseRedPacketLogService.java

@@ -82,4 +82,5 @@ public interface IFsCourseRedPacketLogService
 
     R retryCourseRedPacketLog(Long[] logIds);
 
+    void sendRedPacketBf();
 }

+ 142 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsCourseRedPacketLogServiceImpl.java

@@ -5,6 +5,7 @@ import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 
+import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.fs.common.core.domain.R;
 import com.fs.common.utils.DateUtils;
@@ -12,6 +13,7 @@ import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyMoneyLogs;
 import com.fs.company.mapper.CompanyMapper;
 import com.fs.company.mapper.CompanyMoneyLogsMapper;
+import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.FsCourseWatchLog;
 import com.fs.course.mapper.FsCourseWatchLogMapper;
 import com.fs.course.param.FsCourseRedPacketLogParam;
@@ -20,7 +22,10 @@ import com.fs.his.domain.FsUser;
 import com.fs.his.mapper.FsUserMapper;
 import com.fs.his.param.WxSendRedPacketParam;
 import com.fs.his.service.IFsStorePaymentService;
+import com.fs.system.service.ISysConfigService;
 import com.github.binarywang.wxpay.bean.transfer.TransferBillsResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.fs.course.mapper.FsCourseRedPacketLogMapper;
@@ -37,10 +42,14 @@ import org.springframework.transaction.annotation.Transactional;
 @Service
 public class FsCourseRedPacketLogServiceImpl implements IFsCourseRedPacketLogService
 {
+    private static final Logger logger = LoggerFactory.getLogger(FsCourseRedPacketLogServiceImpl.class);
     @Autowired
     private FsCourseRedPacketLogMapper fsCourseRedPacketLogMapper;
     @Autowired
     private CompanyMapper companyMapper;
+
+    @Autowired
+    private ISysConfigService configService;
     /**
      * 查询短链课程看课记录
      *
@@ -236,4 +245,137 @@ public class FsCourseRedPacketLogServiceImpl implements IFsCourseRedPacketLogSer
         return R.ok("成功:"+suc+" 失败:"+err);
     }
 
+    @Override
+    public void sendRedPacketBf() {
+        try {
+            logger.info("【红包发放】开始执行红包发放任务");
+
+            // 初始化查询对象
+            FsCourseRedPacketLog query = new FsCourseRedPacketLog();
+            query.setStatus(2); // 状态2表示待处理红包
+
+            // 获取红包配置
+            String json = configService.selectConfigByKey("course.config");
+            CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
+            logger.info("【红包发放】当前红包发放模式:{}", config.getRedPacketMode());
+
+            // 获取待处理红包列表
+            List<FsCourseRedPacketLog> pendingPackets = fsCourseRedPacketLogMapper.selectFsCourseRedPacketLogList(query);
+            if (pendingPackets == null || pendingPackets.isEmpty()) {
+                logger.info("【红包发放】没有待处理的红包记录");
+                return;
+            }
+
+            logger.info("【红包发放】共发现{}条待处理红包记录", pendingPackets.size());
+
+            // 处理每条红包记录
+            for (FsCourseRedPacketLog redPacket : pendingPackets) {
+                try {
+                    logger.info("【红包处理】开始处理红包记录ID:{},用户ID:{},金额:{}元",
+                            redPacket.getLogId(), redPacket.getUserId(), redPacket.getAmount());
+
+                    processRedPacket(redPacket, config);
+                } catch (Exception e) {
+                    logger.error("【红包处理】处理红包记录ID:{}时发生异常", redPacket.getLogId(), e);
+                    // 即使一条记录失败也继续处理下一条
+                }
+            }
+
+            logger.info("【红包发放】红包发放任务执行完成");
+        } catch (Exception e) {
+            logger.error("【红包发放】红包发放任务执行过程中发生未预期异常", e);
+        }
+    }
+
+    private void processRedPacket(FsCourseRedPacketLog redPacket, CourseConfig config) {
+        // 获取用户信息
+        FsUser user = fsUserMapper.selectFsUserByUserId(redPacket.getUserId());
+        if (user == null || user.getMpOpenId() == null) {
+            logger.error("【红包处理】错误:未找到用户ID:{}或用户缺少openId", redPacket.getUserId());
+            return;
+        }
+
+        logger.info("【红包处理】准备为用户{}发放红包,openId:{}", user.getUserId(), user.getMpOpenId());
+
+        // 准备红包参数
+        WxSendRedPacketParam packetParam = new WxSendRedPacketParam();
+        packetParam.setOpenId(user.getMpOpenId());
+        packetParam.setAmount(redPacket.getAmount());
+        packetParam.setSource(2);
+        packetParam.setAppId(redPacket.getAppId());
+        packetParam.setRedPacketMode(config.getRedPacketMode());
+        packetParam.setCompanyId(redPacket.getCompanyId());
+
+        // 处理企业资金(使用悲观锁)
+        Company company = companyMapper.selectCompanyByIdForUpdate(redPacket.getCompanyId());
+        if (company == null) {
+            logger.error("【红包处理】错误:未找到企业ID:{}", redPacket.getCompanyId());
+            return;
+        }
+
+        BigDecimal remainingBalance = company.getMoney().subtract(redPacket.getAmount());
+        if (remainingBalance.compareTo(BigDecimal.ZERO) < 0) {
+            logger.warn("【红包处理】企业{}余额不足(当前余额:{}元,需要扣除:{}元)",
+                    company.getCompanyId(), company.getMoney(), redPacket.getAmount());
+            return;
+        }
+
+        logger.info("【红包处理】企业{}当前余额:{}元,发放后余额:{}元",
+                company.getCompanyId(), company.getMoney(), remainingBalance);
+
+        // 发送红包
+        R sendRedPacketResult = paymentService.sendRedPacket(packetParam);
+        if (sendRedPacketResult == null) {
+            logger.error("【红包处理】红包接口返回空结果");
+            return;
+        }
+
+        if (!sendRedPacketResult.get("code").equals(200)) {
+            logger.error("【红包处理】红包发放失败,错误码:{},错误信息:{}",
+                    sendRedPacketResult.get("code"), sendRedPacketResult.get("msg"));
+            return;
+        }
+
+        // 处理成功结果
+        logger.info("【红包处理】红包发放成功");
+
+        // 更新红包记录
+        if (sendRedPacketResult.get("isNew").equals(1)) {
+            TransferBillsResult transferBillsResult = (TransferBillsResult)sendRedPacketResult.get("data");
+            redPacket.setResult(JSON.toJSONString(sendRedPacketResult));
+            redPacket.setOutBatchNo(transferBillsResult.getOutBillNo());
+            logger.info("【红包处理】新批次红包,批次号:{}", transferBillsResult.getOutBillNo());
+        } else {
+            redPacket.setOutBatchNo(sendRedPacketResult.get("orderCode").toString());
+            logger.info("【红包处理】已有批次红包,订单号:{}", redPacket.getOutBatchNo());
+        }
+
+        fsCourseRedPacketLogMapper.updateFsCourseRedPacketLog(redPacket);
+
+        // 更新观看记录
+        FsCourseWatchLog watchLog = courseWatchLogMapper.selectFsCourseWatchLogByLogId(redPacket.getLogId());
+        if (watchLog != null) {
+            watchLog.setRewardType(config.getRewardType());
+            courseWatchLogMapper.updateFsCourseWatchLog(watchLog);
+            logger.info("【红包处理】更新观看记录{}的奖励类型为{}", watchLog.getLogId(), config.getRewardType());
+        }
+
+        // 更新企业余额
+        company.setMoney(remainingBalance);
+        companyMapper.updateCompany(company);
+
+        // 记录资金流水
+        CompanyMoneyLogs moneyLog = new CompanyMoneyLogs();
+        moneyLog.setCompanyId(company.getCompanyId());
+        moneyLog.setRemark("扣除红包金额");
+        moneyLog.setMoney(redPacket.getAmount().multiply(new BigDecimal(-1)));
+        moneyLog.setLogsType(15);
+        moneyLog.setBalance(company.getMoney());
+        moneyLog.setCreateTime(new Date());
+        moneyLogsMapper.insertCompanyMoneyLogs(moneyLog);
+
+        logger.info("【红包处理】企业资金流水记录成功,企业ID:{},变动金额:{}元",
+                company.getCompanyId(), moneyLog.getMoney());
+    }
+
 }

+ 70 - 5
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fs.common.BeanCopyUtils;
 import com.fs.common.core.domain.R;
@@ -866,14 +867,14 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         if (log.getRewardType() != null) {
             FsCourseRedPacketLog packetLog = redPacketLogMapper.selectFsCourseRedPacketLogByTemporary(param.getVideoId(), param.getUserId());
             if(packetLog != null && packetLog.getStatus() == 1) {
-                return R.error("奖励已发放");
+                return R.error("已领取该课程奖励,不可重复领取!");
             }
             if(packetLog != null && packetLog.getStatus() == 0) {
                 if(StringUtils.isNotEmpty(packetLog.getResult())){
                     R r = JSON.parseObject(packetLog.getResult(), R.class);
                     return r;
                 } else {
-                    return R.error("奖励已发放");
+                    return R.error("操作频繁,请稍后再试!");
                 }
             }
             if(packetLog != null && packetLog.getStatus() == 2) {
@@ -914,14 +915,14 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         if (log.getRewardType() != null) {
             FsCourseRedPacketLog fsCourseRedPacketLog = redPacketLogMapper.selectUserFsCourseRedPacketLog(param.getVideoId(), param.getUserId(),param.getPeriodId());
             if(fsCourseRedPacketLog != null && fsCourseRedPacketLog.getStatus() == 1) {
-                return R.error("奖励已发放");
+                return R.error("已领取该课程奖励,不可重复领取!");
             }
             if(fsCourseRedPacketLog != null && fsCourseRedPacketLog.getStatus() == 0) {
                 if(StringUtils.isNotEmpty(fsCourseRedPacketLog.getResult())){
                     R r = JSON.parseObject(fsCourseRedPacketLog.getResult(), R.class);
                     return r;
                 } else {
-                    return R.error();
+                    return R.error("操作频繁,请稍后再试!");
                 }
             }
         }
@@ -1149,6 +1150,9 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
 
         System.out.println("红包金额"+amount);
         System.out.println("红包商户号"+packetParam);
+        if (ObjectUtils.isNotEmpty(config.getIsNegative())&&config.getIsNegative() == 1) {
+            return processRedPacket(config, packetParam, param, amount, log);
+        }
         //2025.6.19 红包金额为0的时候
         if (amount.compareTo(BigDecimal.ZERO)>0){
 
@@ -1161,13 +1165,14 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                 redPacketLog.setCompanyId(param.getCompanyId());
                 redPacketLog.setUserId(param.getUserId());
                 redPacketLog.setVideoId(param.getVideoId());
-                redPacketLog.setStatus(2);
+                redPacketLog.setStatus(0);
                 redPacketLog.setQwUserId(param.getQwUserId() != null ? param.getQwUserId() : null);
                 redPacketLog.setCompanyUserId(param.getCompanyUserId());
                 redPacketLog.setCreateTime(new Date());
                 redPacketLog.setAmount(amount);
                 redPacketLog.setWatchLogId(log.getLogId() != null ? log.getLogId() : null);
                 redPacketLog.setPeriodId(param.getPeriodId());
+                redPacketLog.setAppId(param.getAppId());
                 redPacketLogMapper.insertFsCourseRedPacketLog(redPacketLog);
                 return R.error("销售公司余额不足");
             }
@@ -1196,6 +1201,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                 redPacketLog.setAmount(amount);
                 redPacketLog.setWatchLogId(log.getLogId() != null ? log.getLogId() : null);
                 redPacketLog.setPeriodId(param.getPeriodId());
+                redPacketLog.setAppId(param.getAppId());
                 redPacketLogMapper.insertFsCourseRedPacketLog(redPacketLog);
 
                 // 更新观看记录的奖励类型
@@ -1232,6 +1238,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             redPacketLog.setAmount(BigDecimal.ZERO);
             redPacketLog.setWatchLogId(log.getLogId() != null ? log.getLogId() : null);
             redPacketLog.setPeriodId(param.getPeriodId());
+            redPacketLog.setAppId(param.getAppId());
             redPacketLogMapper.insertFsCourseRedPacketLog(redPacketLog);
 
             // 更新观看记录的奖励类型
@@ -1244,6 +1251,64 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
 
     }
 
+    /**
+     * 直接发送奖励
+     *
+     * @param config
+     * @param packetParam
+     * @param param
+     * @param amount
+     * @param log
+     * @return
+     */
+    private R processRedPacket(CourseConfig config, WxSendRedPacketParam packetParam, FsCourseSendRewardUParam param, BigDecimal amount, FsCourseWatchLog log) {
+        R sendRedPacket = paymentService.sendRedPacket(packetParam);
+
+        if (!sendRedPacket.get("code").equals(200)) {
+            return R.error("奖励发送失败,请联系客服");
+        }
+
+        createRedPacketLog(sendRedPacket, param, amount, log);
+        updateWatchLogRewardType(log, config);
+
+        return sendRedPacket;
+    }
+
+    private void createRedPacketLog(R sendRedPacket, FsCourseSendRewardUParam param, BigDecimal amount, FsCourseWatchLog log) {
+        FsCourseRedPacketLog redPacketLog = new FsCourseRedPacketLog();
+
+        // Set common fields
+        redPacketLog.setCourseId(param.getCourseId());
+        redPacketLog.setCompanyId(param.getCompanyId());
+        redPacketLog.setUserId(param.getUserId());
+        redPacketLog.setVideoId(param.getVideoId());
+        redPacketLog.setStatus(0);
+        redPacketLog.setQwUserId(param.getQwUserId());
+        redPacketLog.setCompanyUserId(param.getCompanyUserId());
+        redPacketLog.setCreateTime(new Date());
+        redPacketLog.setAmount(amount);
+        redPacketLog.setWatchLogId(log != null ? log.getLogId() : null);
+        redPacketLog.setPeriodId(param.getPeriodId());
+        redPacketLog.setAppId(param.getAppId());
+
+        // Set batch number based on isNew flag
+        if (sendRedPacket.get("isNew").equals(1)) {
+            TransferBillsResult transferBillsResult = (TransferBillsResult) sendRedPacket.get("data");
+            redPacketLog.setResult(JSON.toJSONString(sendRedPacket));
+            redPacketLog.setOutBatchNo(transferBillsResult.getOutBillNo());
+        } else {
+            redPacketLog.setOutBatchNo(sendRedPacket.get("orderCode").toString());
+        }
+
+        redPacketLogMapper.insertFsCourseRedPacketLog(redPacketLog);
+    }
+
+    private void updateWatchLogRewardType(FsCourseWatchLog log, CourseConfig config) {
+        if (log != null) {
+            log.setRewardType(config.getRewardType());
+            courseWatchLogMapper.updateFsCourseWatchLog(log);
+        }
+    }
     /**
      * 获取用户openId
      *

+ 12 - 0
fs-service/src/main/java/com/fs/statis/domain/FsStatisQwWatch.java

@@ -187,4 +187,16 @@ public class FsStatisQwWatch {
      */
     @Excel(name = "完课率")
     private BigDecimal finishedRate;
+
+    /**
+     * 流量数
+     */
+    @Excel(name = "流量数")
+    private Long trafficSum;
+
+    /**
+     * 注册数
+     */
+    @Excel(name = "注册数")
+    private Long regNum;
 }

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

@@ -79,7 +79,8 @@ cloud_host:
 headerImg:
   imgUrl: https://yztcourse-1325300895.cos.ap-guangzhou.myqcloud.com/yztcourse/20250523/e04871a98cc84be39a7f60c084698e21.jpg
 ipad:
-  ipadUrl: http://ipad.cdwjyyh.com
+  ipadUrl:
+  aiApi:
 wx_miniapp_temp:
   pay_order_temp_id:
   inquiry_temp_id:

+ 142 - 0
fs-service/src/main/resources/application-druid-kyt-test.yml

@@ -0,0 +1,142 @@
+# 数据源配置
+spring:
+  profiles:
+    include: common,config-druid-kyt
+  # redis 配置
+  redis:
+    # 地址
+    host: 127.0.0.1
+    # 端口,默认为6379
+    port: 6379
+    # 密码
+    password:
+    # 连接超时时间
+    timeout: 30s
+    lettuce:
+      pool:
+        # 连接池中的最小空闲连接
+        min-idle: 0
+        # 连接池中的最大空闲连接
+        max-idle: 8
+        # 连接池的最大数据库连接数
+        max-active: 8
+        # #连接池最大阻塞等待时间(使用负值表示没有限制)
+        max-wait: -1ms
+    database: 0
+  datasource:
+    mysql:
+      type: com.alibaba.druid.pool.DruidDataSource
+      driverClassName: com.mysql.cj.jdbc.Driver
+      druid:
+        # 主库数据源
+        master:
+          url: jdbc:mysql://49.235.177.79:2345/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+          username: root
+          password: Ylrztek250218!3@.
+        # 从库数据源
+        slave:
+          # 从数据源开关/默认关闭
+          enabled: false
+          url:
+          username:
+          password:
+        # 初始连接数
+        initialSize: 5
+        # 最小连接池数量
+        minIdle: 10
+        # 最大连接池数量
+        maxActive: 20
+        # 配置获取连接等待超时的时间
+        maxWait: 60000
+        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+        timeBetweenEvictionRunsMillis: 60000
+        # 配置一个连接在池中最小生存的时间,单位是毫秒
+        minEvictableIdleTimeMillis: 300000
+        # 配置一个连接在池中最大生存的时间,单位是毫秒
+        maxEvictableIdleTimeMillis: 900000
+        # 配置检测连接是否有效
+        validationQuery: SELECT 1 FROM DUAL
+        testWhileIdle: true
+        testOnBorrow: false
+        testOnReturn: false
+        webStatFilter:
+          enabled: true
+        statViewServlet:
+          enabled: true
+          # 设置白名单,不填则允许所有访问
+          allow:
+          url-pattern: /druid/*
+          # 控制台管理用户名和密码
+          login-username: fs
+          login-password: 123456
+        filter:
+          stat:
+            enabled: true
+            # 慢SQL记录
+            log-slow-sql: true
+            slow-sql-millis: 1000
+            merge-sql: true
+          wall:
+            config:
+              multi-statement-allow: true
+    sop:
+      type: com.alibaba.druid.pool.DruidDataSource
+      driverClassName: com.mysql.cj.jdbc.Driver
+      druid:
+        # 主库数据源
+        master:
+          url: jdbc:mysql://49.235.177.79:2345/sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+          username: root
+          password: Ylrztek250218!3@.
+        # 初始连接数
+        initialSize: 5
+        # 最小连接池数量
+        minIdle: 10
+        # 最大连接池数量
+        maxActive: 20
+        # 配置获取连接等待超时的时间
+        maxWait: 60000
+        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+        timeBetweenEvictionRunsMillis: 60000
+        # 配置一个连接在池中最小生存的时间,单位是毫秒
+        minEvictableIdleTimeMillis: 300000
+        # 配置一个连接在池中最大生存的时间,单位是毫秒
+        maxEvictableIdleTimeMillis: 900000
+        # 配置检测连接是否有效
+        validationQuery: SELECT 1 FROM DUAL
+        testWhileIdle: true
+        testOnBorrow: false
+        testOnReturn: false
+        webStatFilter:
+          enabled: true
+        statViewServlet:
+          enabled: true
+          # 设置白名单,不填则允许所有访问
+          allow:
+          url-pattern: /druid/*
+          # 控制台管理用户名和密码
+          login-username: fs
+          login-password: 123456
+        filter:
+          stat:
+            enabled: true
+            # 慢SQL记录
+            log-slow-sql: true
+            slow-sql-millis: 1000
+            merge-sql: true
+          wall:
+            config:
+              multi-statement-allow: true
+rocketmq:
+  name-server: rmq-1243b25nj.rocketmq.gz.public.tencenttdmq.com:8080 # RocketMQ NameServer 地址
+  producer:
+    group: my-producer-group
+    access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
+    secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
+  consumer:
+    group: test-group
+    access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
+    secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
+openIM:
+  secret: op
+  userID: im

+ 3 - 0
fs-service/src/main/resources/application-druid-kyt.yml

@@ -137,3 +137,6 @@ rocketmq:
     group: test-group
     access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
     secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
+openIM:
+  secret: op
+  userID: im

+ 12 - 0
fs-service/src/main/resources/application-druid-sxjz.yml

@@ -146,3 +146,15 @@ rocketmq:
         group: voice-group
         access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
         secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
+
+# token配置
+token:
+    # 令牌自定义标识
+    header: Authorization
+    # 令牌密钥
+    secret: abcdefghijklmnopqrstuvwxyz
+    # 令牌有效期(默认30分钟)
+    expireTime: 180
+openIM:
+    secret: openIM123
+    userID: imAdmin

+ 1 - 0
fs-service/src/main/resources/mapper/course/FsCourseRedPacketLogMapper.xml

@@ -38,6 +38,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="companyUserId != null "> and company_user_id = #{companyUserId}</if>
             <if test="companyId != null "> and company_id = #{companyId}</if>
             <if test="amount != null "> and amount = #{amount}</if>
+            <if test="status != null "> and `status` = #{status}</if>
             <if test="qwUserId != null  and qwUserId != ''"> and qw_user_id = #{qwUserId}</if>
         </where>
     </select>

+ 39 - 9
fs-service/src/main/resources/mapper/statis/FsStatisQwWatchMapper.xml

@@ -245,7 +245,9 @@
             ifnull(sum(remind_pending_num),0) as remind_pending_num,
             ifnull(sum(remind_processed_num),0) as remind_processed_num,
             (case when sum(send_num)>=sum(registered_num) then ROUND(SUM(registered_num) * 1.0 / SUM(send_num), 4) else 0 end) as reg_rate,
-            (case when sum(send_num)>=sum(completed_num) then ROUND(SUM(completed_num) * 1.0 / SUM(send_num), 4) else 0 end) as finished_rate
+            (case when sum(send_num)>=sum(completed_num) then ROUND(SUM(completed_num) * 1.0 / SUM(send_num), 4) else 0 end) as finished_rate,
+            ifnull(sum(traffic_sum,0)) as traffic_sum,
+            ifnull(sum(reg_num,0)) as reg_num
         from fs_statis_qw_watch
         <where>
             <if test="startDate != null and endDate != null">
@@ -288,7 +290,9 @@
         ifnull(sum(watch.remind_pending_num),0) as remind_pending_num,
         ifnull(sum(watch.remind_processed_num),0) as remind_processed_num,
         (case when sum(watch.send_num)>=sum(watch.registered_num) then ROUND(SUM(watch.registered_num) * 1.0 / SUM(watch.send_num), 4) else 0 end) as reg_rate,
-        (case when sum(watch.send_num)>=sum(watch.completed_num) then ROUND(SUM(watch.completed_num) * 1.0 / SUM(watch.send_num), 4) else 0 end) as finished_rate
+        (case when sum(watch.send_num)>=sum(watch.completed_num) then ROUND(SUM(watch.completed_num) * 1.0 / SUM(watch.send_num), 4) else 0 end) as finished_rate,
+        ifnull(sum(traffic_sum,0)) as traffic_sum,
+        ifnull(sum(reg_num,0)) as reg_num
         from fs_statis_qw_watch watch
         left join company_dept dept on watch.dept_id=dept.dept_id
         left join company_user cu on watch.company_user_id=cu.user_id
@@ -321,7 +325,7 @@
             #{item.deletedNum,jdbcType=BIGINT}, #{item.orderNum,jdbcType=BIGINT}, #{item.orderMoneyTotal,jdbcType=DECIMAL},
             #{item.redPackageMoneyTotal,jdbcType=DECIMAL}, #{item.callNum,jdbcType=BIGINT}, #{item.receivePassNum,jdbcType=BIGINT},
             #{item.receiveNotNum,jdbcType=BIGINT}, #{item.callTimeTotal,jdbcType=BIGINT}, #{item.remindPendingNum,jdbcType=BIGINT},
-            #{item.remindProcessedNum,jdbcType=BIGINT}
+            #{item.remindProcessedNum,jdbcType=BIGINT},#{item.trafficSum,jdbcType=BIGINT},#{item.regNum,jdbcType=BIGINT}
             )
         </foreach>
     </insert>
@@ -349,7 +353,9 @@
                 remind_pending_num,
                 remind_processed_num,
                 qw_repeat_num,
-                user_repeat_num
+                user_repeat_num,
+                traffic_sum,
+                reg_num
             )
             WITH extended_temp AS (
             -- 原始temp表数据
@@ -406,7 +412,9 @@
             IFNULL(qw_work.remind_pending_num, 0) as remind_pending_num,
             IFNULL(qw_work.remind_processed_num, 0) as remind_processed_num,
             IFNULL(contact.qw_repeat_num,0) as qw_repeat_num,
-            IFNULL(contact.user_repeat_num,0) as user_repeat_num
+            IFNULL(contact.user_repeat_num,0) as user_repeat_num,
+            IFNULL(traffic.traffic_sum,0) as traffic_sum,
+            IFNULL(fs_user.reg_num,0) as reg_num
             FROM extended_temp temp
             LEFT JOIN (
             SELECT
@@ -439,7 +447,7 @@
             AND contact.status IN (4, 5, 7)
             AND contact.update_time >= #{startTime}
             AND contact.update_time < #{endTime}
-            GROUP BY qw_user_id, company_user_id
+            GROUP BY company_user_id,qw_user_id
             ) contact ON contact.qw_user_id = temp.qw_user_id
             AND contact.company_user_id = temp.company_user_id
 
@@ -455,7 +463,7 @@
             AND company_user_id IS NOT NULL
             AND create_time >= #{startTime}
             AND create_time < #{endTime}
-            GROUP BY company_user_id
+            GROUP BY company_user_id,qw_user_id
             ) stats_order ON temp.company_user_id = stats_order.company_user_id
             AND temp.qw_user_id = '-1'
             -- 红包数
@@ -468,7 +476,7 @@
             WHERE status = 1
             AND create_time >= #{startTime}
             AND create_time < #{endTime}
-            GROUP BY company_user_id
+            GROUP BY company_user_id,qw_user_id
             ) redp ON temp.company_user_id = redp.company_user_id
             AND temp.qw_user_id = '-1'
             -- 通话统计(总拨打数(可以后面两项相加)、接通数、未接通数、通话时长)
@@ -498,7 +506,29 @@
             GROUP BY company_user_id, qw_user_id
             ) qw_work ON temp.company_user_id = qw_work.company_user_id
             AND temp.qw_user_id = qw_work.qw_user_id
-
+                -- 流量统计
+            LEFT JOIN (
+                select
+                    company_user_id,
+                    qw_user_id,
+                    SUM(internet_traffic) as traffic_sum
+                from fs_course_traffic_log
+                where create_time >= #{startTime}
+                  AND create_time < #{endTime}
+                GROUP BY company_user_id, qw_user_id
+            )traffic ON temp.company_user_id = traffic.company_user_id
+                AND temp.qw_user_id = traffic.qw_user_id
+                -- 注册人数
+            LEFT JOIN (
+                select company_user_id,
+                       qw_user_id,
+                       count(user_id) as reg_num
+                from fs_user
+                WHERE create_time >= #{startTime}
+                  AND create_time < #{endTime}
+                GROUP BY company_user_id, qw_user_id
+            ) fs_user ON temp.company_user_id = fs_user.company_user_id
+                AND temp.qw_user_id = fs_user.qw_user_id
         ]]>
     </insert>
 

+ 1 - 1
fs-user-app/src/main/java/com/fs/app/controller/IndexController.java

@@ -142,7 +142,7 @@ public class IndexController extends AppBaseController {
 
 	@ApiOperation("企业理念")
 	@GetMapping("/getConcept")
-	@springfox.documentation.annotations.Cacheable("getConcept")
+	@Cacheable("getConcept")
 	public R getConcept(HttpServletRequest request){
 		String json=configService.selectConfigByKey("store.concept");
 		ConceptConfig config = JSONUtil.toBean(json, ConceptConfig.class);