Procházet zdrojové kódy

红包流水回滚流程更新,查询商户后在回滚

xgb před 14 hodinami
rodič
revize
2b6e77aa85

+ 34 - 7
fs-admin/src/main/java/com/fs/his/task/CompanyBalanceTask.java

@@ -1,13 +1,14 @@
 package com.fs.his.task;
 
+import com.fs.common.utils.DateUtils;
+import com.fs.common.utils.StringUtils;
 import com.fs.company.service.ICompanyService;
-import com.fs.company.vo.RedPacketMoneyVO;
 import com.fs.course.service.BalanceRollbackErrorService;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
-import java.util.List;
+import java.util.Date;
 
 /**
  * @description: 公司余额同步定时任务 (红包余额)
@@ -16,6 +17,7 @@ import java.util.List;
  * @version: 1.0
  */
 @Component("companyBalanceTask")
+@Slf4j
 public class CompanyBalanceTask {
 
 
@@ -58,7 +60,6 @@ public class CompanyBalanceTask {
      */
     public void initCompanyBalance() {
         balanceRollbackErrorService.initCompanyBalance();
-
     }
 
     /**
@@ -68,9 +69,21 @@ public class CompanyBalanceTask {
      * @Author xgb
      * @Date 2025/11/7 9:48
      */
-    public void rollbackRedPacketMoney() throws Exception {
-        // 这个地方真加的是company money字段 xgb 红包余额独立后这个方法弃用
-        companyService.rollbackRedPacketMoney();
+    public void rollbackRedPacketMoney(String time) throws Exception {
+        // 默认是前两天时间
+        String createSTime;
+        String createETime;
+        if (StringUtils.isNotBlank(time)) {
+            Date date = DateUtils.parseDate(time);
+            createSTime = time+" 00:00:00";
+            createETime = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD,DateUtils.addDays(date, 1))+" 00:00:00";
+        } else {
+            createSTime = DateUtils.parseDateToStr( DateUtils.YYYY_MM_DD,DateUtils.addDays(new Date(), -2))+" 00:00:00";
+            createETime = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD,DateUtils.addDays(new Date(), -1))+" 00:00:00";
+        }
+
+        // 这个地方真加的是company money字段 xgb
+        companyService.rollbackRedPacketMoney(createSTime, createETime);
     }
 
     /**
@@ -86,6 +99,20 @@ public class CompanyBalanceTask {
 
 
 
+    /**
+     * @Description: 更具批次号查询转账结果
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2025/12/25 10:31
+     */
+    public void checkMchTransferStatus(String outBatchNo,Long companyId) {
+        String result=companyService.checkMchTransferStatus(outBatchNo,companyId);
+        log.info("查询商户转账结果:{}",result);
+    }
+
+
+
 
 
 }

+ 3 - 1
fs-service/src/main/java/com/fs/company/domain/CompanyRedPacketBalanceLogs.java

@@ -39,8 +39,10 @@ public class CompanyRedPacketBalanceLogs extends BaseEntity{
     @Excel(name = "类型")
     private Integer logsType;
 
-    /** 是否处理状态(0-初始化,1-已同步) */
+    /** 是否处理状态(0-初始化,1-已同步(收到红包回调)) */
     private Long status;
 
+    // 红包日志id
+    private Long redPacketId;
 
 }

+ 13 - 7
fs-service/src/main/java/com/fs/company/mapper/CompanyRedPacketBalanceLogsMapper.java

@@ -1,20 +1,22 @@
 package com.fs.company.mapper;
 
+import java.util.Date;
 import java.util.List;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyRedPacketBalanceLogs;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 企业红包余额记录Mapper接口
- * 
+ *
  * @author fs
  * @date 2025-11-19
  */
 public interface CompanyRedPacketBalanceLogsMapper extends BaseMapper<CompanyRedPacketBalanceLogs>{
     /**
      * 查询企业红包余额记录
-     * 
+     *
      * @param logsId 企业红包余额记录主键
      * @return 企业红包余额记录
      */
@@ -22,7 +24,7 @@ public interface CompanyRedPacketBalanceLogsMapper extends BaseMapper<CompanyRed
 
     /**
      * 查询企业红包余额记录列表
-     * 
+     *
      * @param companyRedPacketBalanceLogs 企业红包余额记录
      * @return 企业红包余额记录集合
      */
@@ -30,7 +32,7 @@ public interface CompanyRedPacketBalanceLogsMapper extends BaseMapper<CompanyRed
 
     /**
      * 新增企业红包余额记录
-     * 
+     *
      * @param companyRedPacketBalanceLogs 企业红包余额记录
      * @return 结果
      */
@@ -38,7 +40,7 @@ public interface CompanyRedPacketBalanceLogsMapper extends BaseMapper<CompanyRed
 
     /**
      * 修改企业红包余额记录
-     * 
+     *
      * @param companyRedPacketBalanceLogs 企业红包余额记录
      * @return 结果
      */
@@ -46,7 +48,7 @@ public interface CompanyRedPacketBalanceLogsMapper extends BaseMapper<CompanyRed
 
     /**
      * 删除企业红包余额记录
-     * 
+     *
      * @param logsId 企业红包余额记录主键
      * @return 结果
      */
@@ -54,11 +56,15 @@ public interface CompanyRedPacketBalanceLogsMapper extends BaseMapper<CompanyRed
 
     /**
      * 批量删除企业红包余额记录
-     * 
+     *
      * @param logsIds 需要删除的数据主键集合
      * @return 结果
      */
     int deleteCompanyRedPacketBalanceLogsByLogsIds(Long[] logsIds);
 
     Company getCompanyRedPacketBalance(Long companyId);
+
+    void updateCompanyRedPacketBalanceLogsByRedPacketId(CompanyRedPacketBalanceLogs redLogs);
+
+    List<CompanyRedPacketBalanceLogs> selectCompanyRedPacketBalanceLogsListByStatus(@Param("createSTime") String createSTime,@Param("createETime") String createETime);
 }

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

@@ -2,6 +2,7 @@ package com.fs.company.service;
 
 import java.math.BigDecimal;
 import java.time.LocalTime;
+import java.util.Date;
 import java.util.List;
 
 import com.fs.common.core.domain.R;
@@ -177,7 +178,7 @@ public interface ICompanyService
 
     void redPacketTopUpCompany(Long companyId, BigDecimal money,String type);
 
-    void asyncRecordBalanceLog(Long companyId, BigDecimal money,Integer logType, BigDecimal balance, String remark);
+    void asyncRecordBalanceLog(Long companyId, BigDecimal money, Integer logType, BigDecimal balance, String remark, Long logId);
 
     void recordRedPacketBalance();
 
@@ -187,7 +188,7 @@ public interface ICompanyService
      */
     void batchUpdateCompany(List<Company> list);
 
-    void rollbackRedPacketMoney();
+    void rollbackRedPacketMoney(String createSTime, String createETime);
 
 
     List<CompanyVO> liveShowList(CompanyParam param);
@@ -197,4 +198,6 @@ public interface ICompanyService
     void addCompanyTuiLiveMoney(LiveOrder order);
 
     void subLiveCompanyMoney(LiveOrder order);
+
+    String checkMchTransferStatus(String outBatchNo,Long companyId);
 }

+ 208 - 25
fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java

@@ -6,12 +6,12 @@ import java.util.*;
 import java.util.concurrent.TimeUnit;
 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.exception.CustomException;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.SecurityUtils;
 import com.fs.common.utils.StringUtils;
@@ -19,11 +19,13 @@ import com.fs.company.domain.*;
 import com.fs.company.mapper.*;
 import com.fs.company.param.CompanyLiveShowParam;
 import com.fs.company.param.CompanyParam;
-import com.fs.company.service.ICompanyMiniappService;
-import com.fs.company.service.ICompanyProfitService;
-import com.fs.company.service.ICompanyRoleService;
+import com.fs.company.service.*;
 import com.fs.company.vo.*;
+import com.fs.course.config.CourseConfig;
+import com.fs.course.config.RedPacketConfig;
+import com.fs.course.domain.FsCourseRedPacketLog;
 import com.fs.course.mapper.FsCourseRedPacketLogMapper;
+import com.fs.course.service.IFsCourseRedPacketLogService;
 import com.fs.his.config.StoreConfig;
 import com.fs.his.domain.FsInquiryOrder;
 import com.fs.his.domain.FsStoreOrder;
@@ -41,18 +43,25 @@ import com.fs.store.config.CompanyMenuConfig;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
 import com.fs.system.service.ISysConfigService;
+import com.github.binarywang.wxpay.bean.transfer.QueryTransferBatchesRequest;
+import com.github.binarywang.wxpay.bean.transfer.QueryTransferBatchesResult;
+import com.github.binarywang.wxpay.bean.transfer.TransferBillsGetResult;
+import com.github.binarywang.wxpay.config.WxPayConfig;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.TransferService;
+import com.github.binarywang.wxpay.service.WxPayService;
+import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
 import com.github.pagehelper.PageHelper;
 import com.google.gson.Gson;
 import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.ObjectUtils;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
-import com.fs.company.service.ICompanyService;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.support.TransactionTemplate;
@@ -127,6 +136,12 @@ public class CompanyServiceImpl implements ICompanyService
     @Autowired
     private CompanyRedPacketBalanceLogsMapper companyRedPacketBalanceLogsMapper;
 
+    @Autowired
+    private ICompanyConfigService companyConfigService;
+
+    @Autowired
+    private  IFsCourseRedPacketLogService redPacketLogService;
+
 
     @Override
     public List<CompanyVO> liveShowList(CompanyParam param) {
@@ -184,6 +199,80 @@ public class CompanyServiceImpl implements ICompanyService
         }
     }
 
+    @Override
+    public String checkMchTransferStatus(String outBatchNo,Long companyId) {
+
+        // 查看红包发送配置
+        String json = configService.selectConfigByKey("course.config");
+        CourseConfig courseConfig = JSONUtil.toBean(json, CourseConfig.class);
+        RedPacketConfig config;
+        switch (courseConfig.getRedPacketMode()){// 1-总配置 2- 分公司配置
+            case 1:
+                json = configService.selectConfigByKey("redPacket.config");
+                config = JSONUtil.toBean(json, RedPacketConfig.class);
+                break;
+            case 2:
+                json = companyConfigService.selectRedPacketConfigByKey(companyId);
+                //如果分公司配置为空就走总后台的配置
+                if (StringUtils.isEmpty(json)){
+                    json = configService.selectConfigByKey("redPacket.config");
+                }
+                config = JSONUtil.toBean(json, RedPacketConfig.class);
+                break;
+            default:
+                throw new UnsupportedOperationException("当前红包模式不支持!");
+        }
+
+        WxPayConfig payConfig = new WxPayConfig();
+        BeanUtils.copyProperties(config, payConfig);
+
+        WxPayService wxPayService = new WxPayServiceImpl();
+        wxPayService.setConfig(payConfig);
+
+        TransferService transferService = wxPayService.getTransferService();
+
+        if (Objects.isNull(config.getIsNew()) || !Arrays.asList(0,1).contains(config.getIsNew())) {
+            logger.error("红包配置错误 isNew is err");
+            throw new CustomException("红包配置错误 isNew is err ");
+        }
+
+        try {
+            if (config.getIsNew() == 0) {
+                QueryTransferBatchesRequest request = new QueryTransferBatchesRequest();
+                request.setOutBatchNo(outBatchNo);
+                request.setNeedQueryDetail(true);
+                request.setOffset(0);
+                request.setLimit(20);
+                request.setDetailStatus("ALL");
+                QueryTransferBatchesResult result = transferService.transferBatchesOutBatchNo(request);
+                List<QueryTransferBatchesResult.TransferDetail> detailList = result.getTransferDetailList();
+                boolean isSuccess = detailList.stream().anyMatch(d -> "SUCCESS".equals(d.getDetailStatus()));
+                if (isSuccess) {
+                    return result.getTransferBatch().getBatchId();
+                }
+
+                boolean isFail = detailList.stream().anyMatch(d -> "FAIL".equals(d.getDetailStatus()));
+                if (isFail) {
+                    return "";
+                }
+            } else {
+                TransferBillsGetResult result = transferService.getBillsByOutBillNo(outBatchNo);
+                if ("SUCCESS".equals(result.getState())) {
+                    return result.getTransferBillNo();
+                } else if ("FAIL".equals(result.getState())) {
+                    return "";
+                } else if ("CANCELLED".equals(result.getState())) {
+                    return "";
+                }
+            }
+        } catch (WxPayException e) {
+            logger.error("查询转账单失败 err: {}", e.getMessage(), e);
+            throw new CustomException("查询转账单失败:" + e.getMessage());
+        }
+
+        throw new CustomException("转账处理中");
+    }
+
     @Override
     public List<OptionsVO> selectAllCompanyList(Long deptId) {
         return companyMapper.selectAllCompanyList(deptId);
@@ -1447,7 +1536,7 @@ public class CompanyServiceImpl implements ICompanyService
                                     // 记录余额变更日志
                                     String remark = "同步公司余额,差额: " + amount+"(正数为增加,负数为扣减)";
                                     // 实际不发生交易只是从缓存同步金额到数据库中 交易金额登记为0,备注清楚同步的金额
-                                    asyncRecordBalanceLog(company.getCompanyId(),new BigDecimal(0),17,redisMoney,remark);
+                                    asyncRecordBalanceLog(company.getCompanyId(),new BigDecimal(0),17,redisMoney,remark, null);
                                 }
                             }
                             return null;
@@ -1500,7 +1589,7 @@ public class CompanyServiceImpl implements ICompanyService
                 redisCache.setCacheObject(companyMoneyKey, newMoney.toString());
 
                 // 异步登记余额添加日志
-                asyncRecordBalanceLog(companyId,money,16,newMoney,"红包充值(负数为扣款)");
+                asyncRecordBalanceLog(companyId,money,16,newMoney,"红包充值(负数为扣款)", null);
 
             } else {
                 logger.error("获取redis锁失败,异常请求参数companyId:{},money:{},type:{}",companyId,money, type);
@@ -1526,15 +1615,17 @@ public class CompanyServiceImpl implements ICompanyService
 
     /**
      * 异步登记余额添加日志  xgb
+     *
      * @param companyId 公司ID
-     * @param money 变更金额
-     * @param balance 当前余额
-     * @param remark 备注信息
-     * @param logType 16-红包余额充值 15-红包余额扣除 17-同步公司余额
+     * @param money     变更金额
+     * @param logType   16-红包余额充值 15-红包余额扣除 17-同步公司余额
+     * @param balance   当前余额
+     * @param remark    备注信息
+     * @param logId
      */
     @Async
     @Override
-    public void asyncRecordBalanceLog(Long companyId, BigDecimal money,Integer logType, BigDecimal balance, String remark) {
+    public void asyncRecordBalanceLog(Long companyId, BigDecimal money, Integer logType, BigDecimal balance, String remark, Long logId) {
         try {
             CompanyRedPacketBalanceLogs log = new CompanyRedPacketBalanceLogs();
             log.setCompanyId(companyId);
@@ -1543,6 +1634,7 @@ public class CompanyServiceImpl implements ICompanyService
             log.setLogsType(logType); // 同步余额
             log.setBalance(balance);
             log.setCreateTime(new Date());
+            log.setRedPacketId(logId);
             companyRedPacketBalanceLogsMapper.insertCompanyRedPacketBalanceLogs(log);
         } catch (Exception e) {
             logger.error("异步登记红包余额日志失败 - 公司ID: {}, 金额: {}, 余额: {}, 备注: {}",
@@ -1573,7 +1665,7 @@ public class CompanyServiceImpl implements ICompanyService
                     // 实际不发生交易只是从缓存获取当天余额报错25小时 交易金额登记为0,备注清楚同步的金额
                     String remark = "时间:" + time +",当前公司余额,金额: " + moneyStr;
                     BigDecimal money = new BigDecimal(moneyStr);
-                    asyncRecordBalanceLog(company.getCompanyId(),new BigDecimal(0),18,money,remark);
+                    asyncRecordBalanceLog(company.getCompanyId(),new BigDecimal(0),18,money,remark, null);
                 }
                 return null;
             });
@@ -1597,18 +1689,100 @@ public class CompanyServiceImpl implements ICompanyService
      * @Author xgb
      * @Date 2025/11/7 9:53
      */
+//    @Override
+//    public void rollbackRedPacketMoney() {
+//        List<RedPacketMoneyVO> redPacketMoneyVOS = fsCourseRedPacketLogMapper.selectFsCourseAddRedPacketLogByCompany();
+//        for(RedPacketMoneyVO company:redPacketMoneyVOS){
+//            logger.info("红包余额回滚开始:{}",company);
+//        }
+//        Optional.ofNullable(redPacketMoneyVOS).ifPresent(list -> list.forEach(company -> {
+//
+//            if(company.getCompanyId()==null){
+//                logger.error("红包记录表中存在公司id为null的异常数据");
+//                return;
+//            }
+//            String companyMoneyKey = FsConstants.COMPANY_MONEY_KEY + company.getCompanyId();
+//            // 加锁,与看课发放红包的加锁保持一致
+//            RLock lock = redissonClient.getLock(FsConstants.COMPANY_MONEY_LOCK + company.getCompanyId());
+//            boolean lockAcquired = false;
+//            try {
+//                lockAcquired = lock.tryLock(3, 10, TimeUnit.SECONDS);
+//                if (lockAcquired) {
+//                    BigDecimal redisMoney;
+//                    // 获取当前余额
+//                    String moneyStr = redisCache.getCacheObject(companyMoneyKey);
+//                    if (StringUtils.isNotEmpty(moneyStr)) {
+//                        redisMoney = new BigDecimal(moneyStr);
+//                    }else {
+//                        logger.error("缓存公司id:{}的余额不存在,回滚金额{}",company.getCompanyId(),company.getMoney());
+//                        return;
+//                    }
+//                    BigDecimal newMoney = redisMoney.add(company.getMoney());
+//                    redisCache.setCacheObject(companyMoneyKey, newMoney.toString());
+//
+//                    String remark = "执行时间:"+DateUtils.getTime()+",T2天客户未领取红包退回,金额: " + company.getMoney();
+//                    asyncRecordBalanceLog(company.getCompanyId(),company.getMoney(),16,newMoney,remark, null);
+//                }
+//            } catch (Exception e) {
+//                logger.error("退回的红包同步增加到缓存和数据表,参数错误,请求异常,异常信息:{}", e.getMessage(), e);
+//            } finally {
+//                if (lockAcquired && lock.isHeldByCurrentThread()) {
+//                    try {
+//                        lock.unlock();
+//                    } catch (IllegalMonitorStateException e) {
+//                        logger.warn("尝试释放非当前线程持有的锁: companyId:{}", company.getCompanyId());
+//                    }
+//                }
+//            }
+//        }));
+//    }
+
+
+    /**
+     * @Description: 红包余额回滚(回滚的是客户没领取的红包),红包记录表中,两天没领取的记录不会再发送
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2025/12/25 9:32
+     */
     @Override
-    public void rollbackRedPacketMoney() {
-        List<RedPacketMoneyVO> redPacketMoneyVOS = fsCourseRedPacketLogMapper.selectFsCourseAddRedPacketLogByCompany();
-        for(RedPacketMoneyVO company:redPacketMoneyVOS){
-            logger.info("红包余额回滚开始:{}",company);
-        }
-        Optional.ofNullable(redPacketMoneyVOS).ifPresent(list -> list.forEach(company -> {
+    public void rollbackRedPacketMoney(String createSTime, String createETime) {
+        // 回滚前查询一下红包记录
+        List<CompanyRedPacketBalanceLogs> companyRedPacketBalanceLogsList = companyRedPacketBalanceLogsMapper.selectCompanyRedPacketBalanceLogsListByStatus(createSTime, createETime);
+
+//        List<RedPacketMoneyVO> redPacketMoneyVOS = fsCourseRedPacketLogMapper.selectFsCourseAddRedPacketLogByCompany();
+//        for(RedPacketMoneyVO company:redPacketMoneyVOS){
+//            logger.info("红包余额回滚开始:{}",company);
+//        }
+        Optional.ofNullable(companyRedPacketBalanceLogsList).ifPresent(list -> list.forEach(company -> {
+
+            // 查询红包记录
+            FsCourseRedPacketLog redLogs = fsCourseRedPacketLogMapper.selectFsCourseRedPacketLogByLogId(company.getRedPacketId());
+            if(redLogs==null){
+                logger.error("未查询到红包记录,流水{}",company.getLogsId());
+                return;
+            }
 
             if(company.getCompanyId()==null){
-                logger.error("红包记录表中存在公司id为null的异常数据");
+                logger.error("红包记录表中存在公司id为null的异常数据,流水{}",company.getLogsId());
                 return;
             }
+
+            if(StringUtils.isEmpty(redLogs.getOutBatchNo())){
+                String batchId=checkMchTransferStatus(redLogs.getOutBatchNo(),redLogs.getCompanyId());
+                if (StringUtils.isNotBlank(batchId)) {
+                    redPacketLogService.syncRedPacket(redLogs.getOutBatchNo(),batchId);
+                    return;
+                }else {
+                    logger.error("未查询到商户转账批次号,进行退款,流水{}",company.getLogsId());
+                    // 更新支付状态
+                    updateBalanceStatus(company.getLogsId(), 2,company.getRemark()+";退回经销商"); // 更新为已退款
+                }
+                logger.error("未查询到OutBatchNo,进行退款,流水{}",company.getLogsId());
+                // 更新支付状态
+                updateBalanceStatus(company.getLogsId(), 2,company.getRemark()+";退回经销商"); // 更新为已退款
+            }
+
             String companyMoneyKey = FsConstants.COMPANY_MONEY_KEY + company.getCompanyId();
             // 加锁,与看课发放红包的加锁保持一致
             RLock lock = redissonClient.getLock(FsConstants.COMPANY_MONEY_LOCK + company.getCompanyId());
@@ -1622,14 +1796,14 @@ public class CompanyServiceImpl implements ICompanyService
                     if (StringUtils.isNotEmpty(moneyStr)) {
                         redisMoney = new BigDecimal(moneyStr);
                     }else {
-                        logger.error("缓存公司id:{}的余额不存在,回滚金额{}",company.getCompanyId(),company.getMoney());
+                        logger.error("缓存公司id:{}的余额不存在,回滚金额{}",company.getCompanyId(),redLogs.getAmount());
                         return;
                     }
-                    BigDecimal newMoney = redisMoney.add(company.getMoney());
+                    BigDecimal newMoney = redisMoney.add(redLogs.getAmount());
                     redisCache.setCacheObject(companyMoneyKey, newMoney.toString());
 
-                    String remark = "执行时间:"+DateUtils.getTime()+",T2天客户未领取红包退回,金额: " + company.getMoney();
-                    asyncRecordBalanceLog(company.getCompanyId(),company.getMoney(),16,newMoney,remark);
+                    String remark = "执行时间:"+DateUtils.getTime()+",T2天客户未领取红包退回,金额: " + redLogs.getAmount();
+                    asyncRecordBalanceLog(company.getCompanyId(),redLogs.getAmount(),16,newMoney,remark, redLogs.getLogId());
                 }
             } catch (Exception e) {
                 logger.error("退回的红包同步增加到缓存和数据表,参数错误,请求异常,异常信息:{}", e.getMessage(), e);
@@ -1645,4 +1819,13 @@ public class CompanyServiceImpl implements ICompanyService
         }));
     }
 
+
+    private void updateBalanceStatus(Long logsId, Integer status,String remark){
+        FsCourseRedPacketLog redLogs = new FsCourseRedPacketLog();
+        redLogs.setLogId(logsId);
+        redLogs.setStatus(status);
+        redLogs.setRemark(remark);
+        fsCourseRedPacketLogMapper.updateFsCourseRedPacketLog(redLogs);
+    }
+
 }

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

@@ -15,8 +15,10 @@ import com.fs.common.utils.StringUtils;
 import com.fs.company.cache.ICompanyDeptCacheService;
 import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyMoneyLogs;
+import com.fs.company.domain.CompanyRedPacketBalanceLogs;
 import com.fs.company.mapper.CompanyMapper;
 import com.fs.company.mapper.CompanyMoneyLogsMapper;
+import com.fs.company.mapper.CompanyRedPacketBalanceLogsMapper;
 import com.fs.company.service.ICompanyConfigService;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.config.RedPacketConfig;
@@ -67,6 +69,8 @@ public class FsCourseRedPacketLogServiceImpl implements IFsCourseRedPacketLogSer
     private ISysConfigService configService;
     @Autowired
     private ICompanyDeptCacheService companyDeptCacheService;
+    @Autowired
+    private CompanyRedPacketBalanceLogsMapper companyRedPacketBalanceLogsMapper;
     /**
      * 查询短链课程看课记录
      *
@@ -160,6 +164,13 @@ public class FsCourseRedPacketLogServiceImpl implements IFsCourseRedPacketLogSer
             log.setUpdateTime(new Date());
             log.setBatchId(batchId);
             fsCourseRedPacketLogMapper.updateFsCourseRedPacketLog(log);
+
+            // 更新扣减状态
+            CompanyRedPacketBalanceLogs redLogs = new CompanyRedPacketBalanceLogs();
+            redLogs.setRedPacketId(log.getLogId());
+            redLogs.setStatus(1L);
+            companyRedPacketBalanceLogsMapper.updateCompanyRedPacketBalanceLogsByRedPacketId(redLogs);
+
             return R.ok();
         }
         return R.error("批次不存在");

+ 2 - 8
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -27,7 +27,6 @@ import com.fs.company.domain.CompanyCompanyFsuser;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.mapper.CompanyCompanyFsuserMapper;
 import com.fs.company.mapper.CompanyMapper;
-import com.fs.company.mapper.CompanyMoneyLogsMapper;
 import com.fs.company.mapper.CompanyUserMapper;
 import com.fs.company.service.ICompanyService;
 import com.fs.config.cloud.CloudHostProper;
@@ -83,8 +82,6 @@ import com.fs.system.mapper.SysDictDataMapper;
 import com.fs.system.service.ISysConfigService;
 import com.fs.voice.utils.StringUtil;
 import com.github.binarywang.wxpay.bean.transfer.TransferBillsResult;
-import com.volcengine.helper.VodUploadProgressListener;
-import com.volcengine.model.beans.Functions;
 import com.volcengine.service.vod.IVodService;
 import com.volcengine.service.vod.model.business.VodUrlUploadURLSet;
 import com.volcengine.service.vod.model.request.*;
@@ -102,12 +99,9 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.multipart.MultipartFile;
 
-import java.io.File;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.text.SimpleDateFormat;
 import java.time.*;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
@@ -1882,7 +1876,7 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
 
                 // 异步登记余额扣减日志
                 BigDecimal money=amount.multiply(BigDecimal.valueOf(-1));
-                companyService.asyncRecordBalanceLog(param.getCompanyId(), money, 15, newMoney, "发放红包");
+                companyService.asyncRecordBalanceLog(param.getCompanyId(), money, 15, newMoney, "发放红包",redPacketLog.getLogId());
 //            redisCache.setCacheObject("h5user:redPacket:"+param.getUserId(),LocalDateTime.now().toString());
 
                 return sendRedPacket;
@@ -2145,7 +2139,7 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
 
                     // 异步登记余额扣减日志
                     BigDecimal money = amount.multiply(BigDecimal.valueOf(-1));
-                    companyService.asyncRecordBalanceLog(param.getCompanyId(), money, 15, newMoney, "发放红包");
+                    companyService.asyncRecordBalanceLog(param.getCompanyId(), money, 15, newMoney, "发放红包", redPacketLog.getLogId());
 
                     return sendRedPacket;
 

+ 17 - 2
fs-service/src/main/resources/mapper/company/CompanyRedPacketBalanceLogsMapper.xml

@@ -13,14 +13,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="balance"    column="balance"    />
         <result property="logsType"    column="logs_type"    />
         <result property="status"    column="status"    />
+        <result property="redPacketId"    column="red_packet_id"    />
     </resultMap>
 
     <sql id="selectCompanyRedPacketBalanceLogsVo">
-        select logs_id, company_id, money, remark, create_time, balance, logs_type, status from company_red_packet_balance_logs
+        select logs_id, company_id, money, remark, create_time, balance, logs_type, status,redPacketId from company_red_packet_balance_logs
     </sql>
 
     <select id="selectCompanyRedPacketBalanceLogsList" parameterType="CompanyRedPacketBalanceLogs" resultMap="CompanyRedPacketBalanceLogsResult">
-        select l.logs_id, l.company_id, l.money, l.remark, l.create_time, l.balance, l.logs_type, l.status,c.company_name
+        select l.logs_id, l.company_id, l.money, l.remark, l.create_time, l.balance, l.logs_type, l.status,l.redPacketId,c.company_name
         from
         company_red_packet_balance_logs l
         left join company c on c.company_id = l.company_id
@@ -40,6 +41,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="getCompanyRedPacketBalance" resultType="com.fs.company.domain.Company">
         SELECT * FROM company WHERE company_id = #{companyId}
     </select>
+    <select id="selectCompanyRedPacketBalanceLogsListByStatus"
+            resultType="com.fs.company.domain.CompanyRedPacketBalanceLogs">
+        <include refid="selectCompanyRedPacketBalanceLogsVo"/>  where logs_type = 15 and status = 0  and create_time &gt;= #{createSTime}  AND create_time &lt; #{createETime}
+    </select>
 
     <insert id="insertCompanyRedPacketBalanceLogs" parameterType="CompanyRedPacketBalanceLogs" useGeneratedKeys="true" keyProperty="logsId">
         insert into company_red_packet_balance_logs
@@ -51,6 +56,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="balance != null">balance,</if>
             <if test="logsType != null">logs_type,</if>
             <if test="status != null">status,</if>
+            <if test="redPacketId != null">red_packet_id,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="companyId != null">#{companyId},</if>
@@ -60,6 +66,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="balance != null">#{balance},</if>
             <if test="logsType != null">#{logsType},</if>
             <if test="status != null">#{status},</if>
+            <if test="redPacketId != null">#{redPacketId},</if>
          </trim>
     </insert>
 
@@ -73,9 +80,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="balance != null">balance = #{balance},</if>
             <if test="logsType != null">logs_type = #{logsType},</if>
             <if test="status != null">status = #{status},</if>
+            <if test="redPacketId != null">red_packet_id = #{redPacketId},</if>
         </trim>
         where logs_id = #{logsId}
     </update>
+    <update id="updateCompanyRedPacketBalanceLogsByRedPacketId">
+        update company_red_packet_balance_logs
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="status != null">status = #{status},</if>
+        </trim>
+        where red_packet_id = #{redPacketId}
+    </update>
 
     <delete id="deleteCompanyRedPacketBalanceLogsByLogsId" parameterType="Long">
         delete from company_red_packet_balance_logs where logs_id = #{logsId}