Kaynağa Gözat

Merge remote-tracking branch 'origin/master'

ct 3 gün önce
ebeveyn
işleme
e5648567b1

+ 8 - 3
fs-admin/src/main/java/com/fs/course/task/CompanyBalanceTask.java

@@ -1,5 +1,6 @@
 package com.fs.course.task;
 
+import com.fs.company.service.ICompanyService;
 import com.fs.course.service.BalanceRollbackErrorService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.context.event.ApplicationReadyEvent;
@@ -19,16 +20,19 @@ public class CompanyBalanceTask {
     @Autowired
     private BalanceRollbackErrorService balanceRollbackErrorService;
 
+    @Autowired
+    private ICompanyService companyService;
+
 
     /**
-     * @Description: 每 ? 秒从缓存获取余额同步到公司账户中 todo 待完善
+     * @Description: 每10分钟从缓存获取余额同步到公司账户中
      * @Param:
      * @Return:
      * @Author xgb
      * @Date 2025/10/22 10:56
      */
     public void syncCompanyBalance() {
-
+        companyService.syncCompanyBalance();
     }
 
     /**
@@ -43,7 +47,8 @@ public class CompanyBalanceTask {
     }
 
     /**
-     * @Description: spring启动执行 查询余额报存到缓存中 当缓存没数据时
+     * @Description: spring启动执行 initCompanyBalance 查询余额报存到缓存中
+     * 如果新增公司可以重启admin或者定时配置一下这个方法手动执行一次
      * @Param:
      * @Return:
      * @Author xgb

+ 2 - 0
fs-service/src/main/java/com/fs/company/service/ICompanyService.java

@@ -167,4 +167,6 @@ public interface ICompanyService
     List<OptionsVO> getCompanyListByCorpId(String corpId);
 
     void subtractCompanyMoneyHourse(BigDecimal money, Long companyId, LocalTime start, LocalTime end);
+
+    void syncCompanyBalance();
 }

+ 66 - 0
fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java

@@ -8,7 +8,9 @@ import java.util.stream.Collectors;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
+import com.fs.common.constant.FsConstants;
 import com.fs.common.core.domain.R;
+import com.fs.common.core.redis.RedisCache;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.SecurityUtils;
 import com.fs.common.utils.StringUtils;
@@ -46,6 +48,7 @@ import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import com.fs.company.service.ICompanyService;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.support.TransactionTemplate;
 
 import static com.fs.company.service.impl.CompanyMiniappServiceImpl.GET_MINI_APP_STR;
 
@@ -97,6 +100,12 @@ public class CompanyServiceImpl implements ICompanyService
     @Autowired
     private CompanyUserMapper companyUserMapper;
 
+    @Autowired
+    private RedisCache redisCache;
+
+    @Autowired
+    private TransactionTemplate transactionTemplate;
+
     @Override
     public List<OptionsVO> selectAllCompanyList(Long deptId) {
         return companyMapper.selectAllCompanyList(deptId);
@@ -1285,4 +1294,61 @@ public class CompanyServiceImpl implements ICompanyService
             }
         }
     }
+
+    /**
+     * @Description: 同步公司余额到数据库中
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2025/10/24 16:49
+     */
+    @Override
+    public void syncCompanyBalance() {
+        Company query = new Company();
+        query.setIsDel(0);
+        // 查询公司列表 同步公司余额
+        List<Company> companyList = companyMapper.selectCompanyList(query);
+        Optional.ofNullable(companyList)
+                .ifPresent(list -> list.forEach(company -> {
+                    try {
+                        transactionTemplate.execute(status -> {
+                            String moneyStr = redisCache.getCacheObject(FsConstants.COMPANY_MONEY_KEY + company.getCompanyId());
+                            if (StringUtils.isNotEmpty(moneyStr)) {
+                                BigDecimal redisMoney = new BigDecimal(moneyStr);
+                                BigDecimal dbMoney = company.getMoney();
+                                BigDecimal amount = redisMoney.subtract(dbMoney); // 计算差额
+
+                                // 只有当余额不一致时才更新
+                                if (amount.compareTo(BigDecimal.ZERO) != 0) {
+                                    company.setMoney(redisMoney);
+                                    int updateResult = companyMapper.updateCompany(company);
+                                    if(updateResult != 1){
+                                        logger.error("更新公司余额失败,公司ID: {}", company.getCompanyId());
+                                        throw new RuntimeException("更新公司余额失败");
+                                    }
+
+                                    // 记录余额变更日志
+                                    CompanyMoneyLogs log = new CompanyMoneyLogs();
+                                    log.setCompanyId(company.getCompanyId());
+                                    log.setRemark("同步公司余额,差额: " + amount);
+                                    log.setMoney(amount);
+                                    log.setLogsType(15);
+                                    log.setBalance(redisMoney);
+                                    log.setCreateTime(new Date());
+
+                                    int logResult = moneyLogsMapper.insertCompanyMoneyLogs(log);
+                                    if(logResult != 1){
+                                        logger.error("添加公司余额日志失败,公司ID: {}", company.getCompanyId());
+                                        throw new RuntimeException("添加公司余额日志失败");
+                                    }
+                                }
+                            }
+                            return null;
+                        });
+                    } catch (Exception e) {
+                        logger.error("同步公司余额失败,公司ID: {}", company.getCompanyId(), e);
+                    }
+                }));
+    }
+
 }

+ 2 - 1
fs-service/src/main/java/com/fs/course/service/impl/BalanceRollbackErrorServiceImpl.java

@@ -89,7 +89,8 @@ public class BalanceRollbackErrorServiceImpl extends ServiceImpl<BalanceRollback
     }
 
     @Override
-    @EventListener(ApplicationReadyEvent.class)
+    // todo
+//    @EventListener(ApplicationReadyEvent.class)
     public void initCompanyBalance() {
 
         // 查询公司表 Company

+ 55 - 3
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -1491,12 +1491,60 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         //2025.6.19 红包金额为0的时候
         if (amount.compareTo(BigDecimal.ZERO)>0){
 
+            Company company = companyMapper.selectCompanyById(param.getCompanyId());
+            BigDecimal money = company.getMoney();
+            if (money.compareTo(BigDecimal.ZERO)<=0) {
+                return R.error("服务商余额不足,请联系群主服务器充值!");
+            }
+
+            // 发送红包
+            R sendRedPacket = paymentService.sendRedPacket(packetParam);
+            if (sendRedPacket.get("code").equals(200)) {
+                FsCourseRedPacketLog redPacketLog = new FsCourseRedPacketLog();
+                TransferBillsResult transferBillsResult;
+                if (sendRedPacket.get("isNew").equals(1)){
+                    transferBillsResult = (TransferBillsResult)sendRedPacket.get("data");
+                    redPacketLog.setResult(JSON.toJSONString(sendRedPacket));
+                    redPacketLog.setOutBatchNo(transferBillsResult.getOutBillNo());
+                    redPacketLog.setBatchId(transferBillsResult.getTransferBillNo());
+                }else {
+                    redPacketLog.setOutBatchNo(sendRedPacket.get("orderCode").toString());
+                    redPacketLog.setBatchId(sendRedPacket.get("batchId").toString());
+                }
+                // 添加红包记录
+                redPacketLog.setCourseId(param.getCourseId());
+                redPacketLog.setCompanyId(param.getCompanyId());
+                redPacketLog.setUserId(param.getUserId());
+                redPacketLog.setVideoId(param.getVideoId());
+                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);
+
+                // 更新观看记录的奖励类型
+                log.setRewardType(config.getRewardType());
+                courseWatchLogMapper.updateFsCourseWatchLog(log);
+
+                return sendRedPacket;
+            } else {
+                return R.error("奖励发送失败,请联系客服");
+            }
+
+            // 先注释 20251024 redis 余额 充值没有考虑 其余扣减没有考虑
             // ===================== 20251022 xgb 修改 本次修改目的为了实时扣减公司余额=====================
             // 1 使用redis缓存加锁 预扣减余额 红包发送失败 恢复redis缓存余额,如果回滚失败登记异常记录表 定时任务重新回滚余额
             // 2 另起定时任务 同步缓存余额到redis中
             // 3 启动系统时查询公司账户余额(这个时候要保证余额正确)保存到redis缓存中
 
+
             // 预设值异常对象
+            /*
             BalanceRollbackError balanceRollbackError = new BalanceRollbackError();
             balanceRollbackError.setCompanyId(packetParam.getCompanyId());
             balanceRollbackError.setUserId(user.getUserId());
@@ -1554,6 +1602,8 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                 }
             }
 
+
+
             // 调用第三方接口(锁外操作)
             R sendRedPacket;
             try {
@@ -1562,7 +1612,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                 logger.error("红包发送异常: 异常请求参数{}",packetParam, e);
                 // 异常时回滚余额
 
-                rollbackBalance(balanceRollbackError);
+//                rollbackBalance(balanceRollbackError);
                 return R.error("奖励发送失败,请联系客服");
             }
 
@@ -1600,12 +1650,14 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                 courseWatchLogMapper.updateFsCourseWatchLog(log);
                 // 发送成功,记录日志等操作
                 return sendRedPacket;
+
+
             } else {
                 // 发送失败,回滚余额
-                rollbackBalance(balanceRollbackError);
+//                rollbackBalance(balanceRollbackError);
                 return R.error("奖励发送失败,请联系客服");
             }
-
+             */
             // ===================== 本次修改目的为了实时扣减公司余额=====================
         } else {
             FsCourseRedPacketLog redPacketLog = new FsCourseRedPacketLog();

+ 1 - 0
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java

@@ -610,6 +610,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
 
     @Override
     public FsStoreOrderComputeDTO computedOrder(long uid, FsStoreOrderComputedParam param) {
+        logger.info("computedOrder param:{},uid:{}", param,uid);
         String cartIds = redisCache.getCacheObject("orderKey:" + param.getOrderKey());
         if (ObjectUtil.isNull(cartIds)) {
             throw new CustomException("订单已过期", 501);

+ 6 - 0
fs-service/src/main/resources/application-config-druid-ddgy.yml

@@ -69,6 +69,12 @@ fs :
 nuonuo:
   key: 10924508
   secret: A2EB20764D304D16
+  jwt:
+    # 加密秘钥
+    secret: f4e2e52134348f16b27cde513c0f1e16
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 # 存储捅配置
 tencent_cloud_config:
   secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT

+ 6 - 0
fs-service/src/main/resources/application-config-druid-hat.yml

@@ -69,6 +69,12 @@ fs :
 nuonuo:
   key: 10924508
   secret: A2EB20764D304D16
+  jwt:
+    # 加密秘钥
+    secret: f4e2e12512448f86b67cde591c1f9e16
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 # 存储捅配置
 tencent_cloud_config:
   secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT

+ 6 - 1
fs-service/src/main/resources/application-config-druid-hcl.yml

@@ -65,7 +65,12 @@ fs :
 nuonuo:
   key: 10924508
   secret: A2EB20764D304D16
-
+  jwt:
+    # 加密秘钥
+    secret: f4e2e52034348f66b67cde591c0f9e16
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 # 存储捅配置
 tencent_cloud_config:
   secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT

+ 6 - 0
fs-service/src/main/resources/application-config-druid-hst.yml

@@ -65,6 +65,12 @@ fs :
 nuonuo:
   key: 10924508
   secret: A2EB20764D304D16
+  jwt:
+    # 加密秘钥
+    secret: f4e2e22034348f55b67cde544c0f9e16
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 # 存储捅配置
 tencent_cloud_config:
   secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT

+ 6 - 1
fs-service/src/main/resources/application-config-druid-jzzx.yml

@@ -69,7 +69,12 @@ fs :
 nuonuo:
   key: 10924508
   secret: A2EB20764D304D16
-
+  jwt:
+    # 加密秘钥
+    secret: f4e2e52034348f86ba7caa581a0f9e16
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 # 存储捅配置
 tencent_cloud_config:
   secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT

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

@@ -65,6 +65,12 @@ fs :
 nuonuo:
   key: 10924508
   secret: A2EB20764D304D16
+  jwt:
+    # 加密秘钥
+    secret: f4e2e51032348f84b67cde591c0f9e16
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 # 存储捅配置
 tencent_cloud_config:
   secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT

+ 6 - 1
fs-service/src/main/resources/application-config-druid-qdtst.yml

@@ -65,7 +65,12 @@ fs :
 nuonuo:
   key: 10924508
   secret: A2EB20764D304D16
-
+  jwt:
+    # 加密秘钥
+    secret: f4e2e52024343f56b67cde581c0f9e16
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 # 存储捅配置
 tencent_cloud_config:
   secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT

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

@@ -69,6 +69,12 @@ fs :
 nuonuo:
   key: 10924508
   secret: A2EB20764D304D16
+  jwt:
+    # 加密秘钥
+    secret: f4e2e52134358f99b67cde612c0f9e16
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 # 存储捅配置
 tencent_cloud_config:
   secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT