|
@@ -21,10 +21,8 @@ import com.fs.company.param.CompanyParam;
|
|
|
import com.fs.company.service.ICompanyMiniappService;
|
|
import com.fs.company.service.ICompanyMiniappService;
|
|
|
import com.fs.company.service.ICompanyProfitService;
|
|
import com.fs.company.service.ICompanyProfitService;
|
|
|
import com.fs.company.service.ICompanyRoleService;
|
|
import com.fs.company.service.ICompanyRoleService;
|
|
|
-import com.fs.company.vo.CompanyCrmVO;
|
|
|
|
|
-import com.fs.company.vo.CompanyNameVO;
|
|
|
|
|
-import com.fs.company.vo.CompanyVO;
|
|
|
|
|
-import com.fs.company.vo.DeptDataVO;
|
|
|
|
|
|
|
+import com.fs.company.vo.*;
|
|
|
|
|
+import com.fs.course.mapper.FsCourseRedPacketLogMapper;
|
|
|
import com.fs.his.config.StoreConfig;
|
|
import com.fs.his.config.StoreConfig;
|
|
|
import com.fs.his.domain.FsInquiryOrder;
|
|
import com.fs.his.domain.FsInquiryOrder;
|
|
|
import com.fs.his.domain.FsStoreOrder;
|
|
import com.fs.his.domain.FsStoreOrder;
|
|
@@ -110,6 +108,9 @@ public class CompanyServiceImpl implements ICompanyService
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private RedissonClient redissonClient;
|
|
private RedissonClient redissonClient;
|
|
|
|
|
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private FsCourseRedPacketLogMapper fsCourseRedPacketLogMapper;
|
|
|
|
|
+
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private TransactionTemplate transactionTemplate;
|
|
private TransactionTemplate transactionTemplate;
|
|
|
|
|
|
|
@@ -1392,13 +1393,13 @@ public class CompanyServiceImpl implements ICompanyService
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* @Description: 红包充值
|
|
* @Description: 红包充值
|
|
|
- * @Param:
|
|
|
|
|
|
|
+ * @Param: type 充值类型 1 充值 2 扣款
|
|
|
* @Return:
|
|
* @Return:
|
|
|
* @Author xgb
|
|
* @Author xgb
|
|
|
* @Date 2025/11/3 14:01
|
|
* @Date 2025/11/3 14:01
|
|
|
*/
|
|
*/
|
|
|
@Override
|
|
@Override
|
|
|
- public void redPacketTopUpCompany(Long companyId, BigDecimal money) {
|
|
|
|
|
|
|
+ public void redPacketTopUpCompany(Long companyId, BigDecimal money,String type) {
|
|
|
|
|
|
|
|
String companyMoneyKey = FsConstants.COMPANY_MONEY_KEY + companyId;
|
|
String companyMoneyKey = FsConstants.COMPANY_MONEY_KEY + companyId;
|
|
|
|
|
|
|
@@ -1415,23 +1416,31 @@ public class CompanyServiceImpl implements ICompanyService
|
|
|
originalMoney = new BigDecimal(moneyStr);
|
|
originalMoney = new BigDecimal(moneyStr);
|
|
|
}else {
|
|
}else {
|
|
|
// 缓存没有值,重启系统恢复redis数据 保证数据正确性
|
|
// 缓存没有值,重启系统恢复redis数据 保证数据正确性
|
|
|
- logger.error("红包余额充值获取redis余额缓存异常,异常请求参数companyId:{},money:{}",companyId,money);
|
|
|
|
|
|
|
+ logger.error("红包余额充值获取redis余额缓存异常,异常请求参数companyId:{},money:{},type:{}",companyId,money, type);
|
|
|
throw new RuntimeException("红包余额充值获取redis余额缓存异常");
|
|
throw new RuntimeException("红包余额充值获取redis余额缓存异常");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ if(type.equals("1")){// 充值
|
|
|
|
|
+
|
|
|
|
|
+ }else if(type.equals("2")) {// 扣减
|
|
|
|
|
+ money=money.multiply(new BigDecimal(-1));
|
|
|
|
|
+ }else {
|
|
|
|
|
+ logger.error("红包余额充值参数异常,异常请求参数companyId:{},money:{},type:{}",companyId,money, type);
|
|
|
|
|
+ throw new RuntimeException("红包余额充值参数异常");
|
|
|
|
|
+ }
|
|
|
// 增加余额
|
|
// 增加余额
|
|
|
BigDecimal newMoney = originalMoney.add(money);
|
|
BigDecimal newMoney = originalMoney.add(money);
|
|
|
redisCache.setCacheObject(companyMoneyKey, newMoney.toString());
|
|
redisCache.setCacheObject(companyMoneyKey, newMoney.toString());
|
|
|
|
|
|
|
|
// 异步登记余额添加日志
|
|
// 异步登记余额添加日志
|
|
|
- asyncRecordBalanceLog(companyId,money,16,newMoney,"红包充值");
|
|
|
|
|
|
|
+ asyncRecordBalanceLog(companyId,money,16,newMoney,"红包充值(负数为扣款)");
|
|
|
|
|
|
|
|
} else {
|
|
} else {
|
|
|
- logger.error("获取redis锁失败,异常请求参数companyId:{},money:{}",companyId,money);
|
|
|
|
|
|
|
+ logger.error("获取redis锁失败,异常请求参数companyId:{},money:{},type:{}",companyId,money, type);
|
|
|
throw new RuntimeException("服务繁忙,请稍后重试");
|
|
throw new RuntimeException("服务繁忙,请稍后重试");
|
|
|
}
|
|
}
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
|
- logger.error("增加余额失败: 异常请求参数companyId:{},money:{}",companyId,money, e);
|
|
|
|
|
|
|
+ logger.error("增加余额失败: 异常请求参数companyId:{},money:{},type:{}",companyId,money, type, e);
|
|
|
throw new RuntimeException("系统异常,请稍后重试");
|
|
throw new RuntimeException("系统异常,请稍后重试");
|
|
|
}finally {
|
|
}finally {
|
|
|
// 只有在成功获取锁的情况下才释放锁
|
|
// 只有在成功获取锁的情况下才释放锁
|
|
@@ -1439,7 +1448,7 @@ public class CompanyServiceImpl implements ICompanyService
|
|
|
try {
|
|
try {
|
|
|
lock1.unlock();
|
|
lock1.unlock();
|
|
|
} catch (IllegalMonitorStateException e) {
|
|
} catch (IllegalMonitorStateException e) {
|
|
|
- logger.error("尝试释放非当前线程持有的锁: 异常请求参数companyId:{},money:{}",companyId,money);
|
|
|
|
|
|
|
+ logger.error("尝试释放非当前线程持有的锁: 异常请求参数companyId:{},money:{},type:{}",companyId,money, type);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -1516,4 +1525,59 @@ public class CompanyServiceImpl implements ICompanyService
|
|
|
companyMapper.batchUpdateCompany(list);
|
|
companyMapper.batchUpdateCompany(list);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * @Description: 红包余额回滚(回滚的是客户没领取的红包),红包记录表中,两天没领取的记录不会再发送
|
|
|
|
|
+ * @Param:
|
|
|
|
|
+ * @Return:
|
|
|
|
|
+ * @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);
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ logger.error("退回的红包同步增加到缓存和数据表,参数错误,请求异常,异常信息:{}", e.getMessage(), e);
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ if (lockAcquired && lock.isHeldByCurrentThread()) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ lock.unlock();
|
|
|
|
|
+ } catch (IllegalMonitorStateException e) {
|
|
|
|
|
+ logger.warn("尝试释放非当前线程持有的锁: companyId:{}", company.getCompanyId());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
}
|
|
}
|