|
|
@@ -3,6 +3,7 @@ package com.fs.company.service.impl;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.time.LocalTime;
|
|
|
import java.util.*;
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
@@ -42,9 +43,12 @@ 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.factory.annotation.Autowired;
|
|
|
+import org.springframework.beans.factory.annotation.Qualifier;
|
|
|
import org.springframework.scheduling.annotation.Async;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import com.fs.company.service.ICompanyService;
|
|
|
@@ -107,6 +111,9 @@ public class CompanyServiceImpl implements ICompanyService
|
|
|
@Autowired
|
|
|
private TransactionTemplate transactionTemplate;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private RedissonClient redissonClient;
|
|
|
+
|
|
|
@Override
|
|
|
public List<OptionsVO> selectAllCompanyList(Long deptId) {
|
|
|
return companyMapper.selectAllCompanyList(deptId);
|
|
|
@@ -1250,17 +1257,48 @@ public class CompanyServiceImpl implements ICompanyService
|
|
|
if(companyId!=null&&companyId>0){
|
|
|
Company company=companyMapper.selectCompanyByIdForUpdate(companyId);
|
|
|
if(company!=null){
|
|
|
- logger.info("退回红包金额:"+money);
|
|
|
- company.setMoney(company.getMoney().add(money));
|
|
|
- companyMapper.updateCompany(company);
|
|
|
- CompanyMoneyLogs log=new CompanyMoneyLogs();
|
|
|
- log.setCompanyId(company.getCompanyId());
|
|
|
- log.setRemark("退回红包金额");
|
|
|
- log.setMoney(money);
|
|
|
- log.setLogsType(16);
|
|
|
- log.setBalance(company.getMoney());
|
|
|
- log.setCreateTime(new Date());
|
|
|
- moneyLogsMapper.insertCompanyMoneyLogs(log);
|
|
|
+ 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 {
|
|
|
+ redisMoney = company.getMoney();
|
|
|
+ }
|
|
|
+ BigDecimal newMoney = redisMoney.add(money);
|
|
|
+ logger.info("退回红包金额:"+money);
|
|
|
+ company.setMoney(newMoney);
|
|
|
+ companyMapper.updateCompany(company);
|
|
|
+ CompanyMoneyLogs log=new CompanyMoneyLogs();
|
|
|
+ log.setCompanyId(company.getCompanyId());
|
|
|
+ log.setRemark("退回红包金额");
|
|
|
+ log.setMoney(money);
|
|
|
+ log.setLogsType(16);
|
|
|
+ log.setBalance(newMoney);
|
|
|
+ log.setCreateTime(new Date());
|
|
|
+ moneyLogsMapper.insertCompanyMoneyLogs(log);
|
|
|
+
|
|
|
+ redisCache.setCacheObject(companyMoneyKey, newMoney.toString());
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ logger.error("退回的红包同步增加到缓存和数据表,参数错误,请求异常,异常信息:{}", e.getMessage(), e);
|
|
|
+ } finally {
|
|
|
+ if (lockAcquired && lock.isHeldByCurrentThread()) {
|
|
|
+ try {
|
|
|
+ lock.unlock();
|
|
|
+ } catch (IllegalMonitorStateException e) {
|
|
|
+ logger.warn("尝试释放非当前线程持有的锁: companyId:{}", company.getCompanyId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
}
|