|
@@ -14,24 +14,20 @@ import com.fs.company.param.CompanyTrafficRecordQueryParam;
|
|
|
import com.fs.company.service.ICompanyService;
|
|
|
import com.fs.company.service.ICompanyTrafficRecordLogService;
|
|
|
import com.fs.company.service.ICompanyTrafficRecordService;
|
|
|
+import com.fs.course.mapper.FsCourseTrafficLogMapper;
|
|
|
import com.fs.system.domain.SysConfig;
|
|
|
import com.fs.system.service.ISysConfigService;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
-import org.springframework.data.redis.connection.RedisConnection;
|
|
|
-import org.springframework.data.redis.core.Cursor;
|
|
|
-import org.springframework.data.redis.core.ScanOptions;
|
|
|
import org.springframework.scheduling.annotation.Scheduled;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import javax.annotation.PostConstruct;
|
|
|
-import java.time.LocalDate;
|
|
|
-import java.time.YearMonth;
|
|
|
-import java.time.format.DateTimeFormatter;
|
|
|
-import java.util.ArrayList;
|
|
|
import java.util.Date;
|
|
|
+import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
|
|
|
@Service
|
|
|
@Slf4j
|
|
@@ -51,35 +47,39 @@ public class CompanyTrafficRecordServiceImpl extends ServiceImpl<CompanyTrafficR
|
|
|
@Autowired
|
|
|
private ICompanyTrafficRecordLogService companyTrafficRecordLogService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private FsCourseTrafficLogMapper fsCourseTrafficLogMapper;
|
|
|
+
|
|
|
//启动时初始化流量
|
|
|
@PostConstruct
|
|
|
public void init() {
|
|
|
List<CompanyTrafficRecord> companyTrafficRecords = baseMapper.selectList(new LambdaQueryWrapper<>());
|
|
|
+ Map<Long,Long> deptTrafficMap = new HashMap<>();
|
|
|
for (CompanyTrafficRecord companyTrafficRecord : companyTrafficRecords) {
|
|
|
- // 获取部门ID
|
|
|
- //Long deptId = companyTrafficRecord.getDeptId();从company表获取部门id
|
|
|
// 获取公司ID
|
|
|
Long companyId = companyTrafficRecord.getCompanyId();
|
|
|
+ // 部门ID
|
|
|
Long deptId = companyService.selectCompanyById(companyId).getDeptId();
|
|
|
companyTrafficRecord.setDeptId(deptId);
|
|
|
|
|
|
- //同步redis缓存 更新getBalance()
|
|
|
- doReduce(companyTrafficRecord,"0");
|
|
|
-
|
|
|
- // 获取公司流量
|
|
|
+ // 公司流量 - 消耗流量
|
|
|
Long balance = companyTrafficRecord.getBalance();
|
|
|
- // 缓存 key=CACHE_KEY:deptId:companyId value=剩余流量
|
|
|
-
|
|
|
- //序列化问题,使用incr创建缓存
|
|
|
- //删除缓存
|
|
|
+ //消耗的流量
|
|
|
+ Long totalInternetTraffic = fsCourseTrafficLogMapper.sumTrafficByCompany(companyId) == null?0L:fsCourseTrafficLogMapper.sumTrafficByCompany(companyId);
|
|
|
+ balance -= totalInternetTraffic;
|
|
|
+ //部门流量记录
|
|
|
+ Long deptTrafficAdd = (deptTrafficMap.get(deptId) == null ? 0L : deptTrafficMap.get(deptId)) + totalInternetTraffic;
|
|
|
+ deptTrafficMap.put(deptId, deptTrafficAdd);
|
|
|
+ //更新缓存
|
|
|
redisCache.deleteObject(CompanyTrafficConstants.CACHE_KEY + ":" + deptId + ":" + companyId);
|
|
|
redisCache.incr(CompanyTrafficConstants.CACHE_KEY + ":" + deptId + ":" + companyId, balance);
|
|
|
- // 缓存 key=CACHE_KEY:deptId value=部门ID
|
|
|
- calculateTotalTrafficByDeptId(deptId);
|
|
|
}
|
|
|
+
|
|
|
+ // 缓存 key=CACHE_KEY:deptId value=部门ID
|
|
|
+ calculateTotalTrafficByDeptId(deptTrafficMap);
|
|
|
}
|
|
|
|
|
|
- //@Scheduled(cron = "0 0 0 * * ?")
|
|
|
+ @Scheduled(cron = "0 0 0 * * ?")
|
|
|
public void refreshTraffic() {
|
|
|
log.info("【定时更新流量】:{}", "开始");
|
|
|
List<CompanyTrafficRecord> companyTrafficRecords = baseMapper.selectList(new LambdaQueryWrapper<>());
|
|
@@ -138,42 +138,39 @@ public class CompanyTrafficRecordServiceImpl extends ServiceImpl<CompanyTrafficR
|
|
|
CompanyTrafficRecord companyRecord = baseMapper.selectOne(new LambdaQueryWrapper<CompanyTrafficRecord>()
|
|
|
.eq(CompanyTrafficRecord::getCompanyId, record.getCompanyId()));
|
|
|
|
|
|
- switch (record.getOperationType()) {
|
|
|
- //充值
|
|
|
- case 1:
|
|
|
- //获取转换后的流量
|
|
|
- Long trafficAmount = trafficConversion(record.getChargeAmount());
|
|
|
- record.setChangeTraffic(trafficAmount);//用于处理日志
|
|
|
- if (companyRecord != null) {
|
|
|
- //不是第一次充值 增加流量
|
|
|
- companyTrafficRecord.setBalance(companyRecord.getBalance() + trafficAmount);
|
|
|
- companyTrafficRecord.setId(companyRecord.getId());
|
|
|
- companyTrafficRecord.setUpdateTime(new Date());
|
|
|
- companyTrafficRecord.setUpdateBy(record.getUserId());
|
|
|
- baseMapper.updateById(companyTrafficRecord);
|
|
|
- } else {
|
|
|
- companyTrafficRecord.setBalance(trafficAmount);
|
|
|
- companyTrafficRecord.setCompanyId(record.getCompanyId());
|
|
|
- companyTrafficRecord.setDeptId(record.getCompany().getDeptId());
|
|
|
- companyTrafficRecord.setCompanyName(record.getCompany().getCompanyName());
|
|
|
- companyTrafficRecord.setCreateTime(new Date());
|
|
|
- companyTrafficRecord.setCreateBy(record.getUserId());
|
|
|
- baseMapper.insert(companyTrafficRecord);
|
|
|
- }
|
|
|
- break;
|
|
|
- //扣除
|
|
|
+ //充值
|
|
|
+ if (record.getOperationType() == 1) {//获取转换后的流量
|
|
|
+ Long trafficAmount = trafficConversion(record.getChargeAmount());
|
|
|
+ record.setChangeTraffic(trafficAmount);//用于处理日志
|
|
|
+ if (companyRecord != null) {
|
|
|
+ //不是第一次充值 增加流量
|
|
|
+ companyTrafficRecord.setBalance(companyRecord.getBalance() + trafficAmount);
|
|
|
+ companyTrafficRecord.setId(companyRecord.getId());
|
|
|
+ companyTrafficRecord.setUpdateTime(new Date());
|
|
|
+ companyTrafficRecord.setUpdateBy(record.getUserId());
|
|
|
+ baseMapper.updateById(companyTrafficRecord);
|
|
|
+ } else {
|
|
|
+ companyTrafficRecord.setBalance(trafficAmount);
|
|
|
+ companyTrafficRecord.setCompanyId(record.getCompanyId());
|
|
|
+ companyTrafficRecord.setDeptId(record.getCompany().getDeptId());
|
|
|
+ companyTrafficRecord.setCompanyName(record.getCompany().getCompanyName());
|
|
|
+ companyTrafficRecord.setCreateTime(new Date());
|
|
|
+ companyTrafficRecord.setCreateBy(record.getUserId());
|
|
|
+ baseMapper.insert(companyTrafficRecord);
|
|
|
+ }
|
|
|
+ /*//扣除
|
|
|
case 2:
|
|
|
//扣除流量
|
|
|
- /*if (companyRecord.getBalance() < record.getChangeTraffic())
|
|
|
- throw new IllegalArgumentException("公司流量余额不足");*/
|
|
|
+ *//*if (companyRecord.getBalance() < record.getChangeTraffic())
|
|
|
+ throw new IllegalArgumentException("公司流量余额不足");*//*
|
|
|
companyTrafficRecord.setBalance(companyTrafficRecord.getBalance() - record.getChangeTraffic());
|
|
|
companyTrafficRecord.setId(companyRecord.getId());
|
|
|
companyTrafficRecord.setUpdateTime(new Date());
|
|
|
companyTrafficRecord.setUpdateBy(record.getUserId());
|
|
|
baseMapper.updateById(companyTrafficRecord);
|
|
|
- break;
|
|
|
- default:
|
|
|
- throw new IllegalArgumentException("非法的操作类型");
|
|
|
+ break;*/
|
|
|
+ } else {
|
|
|
+ throw new IllegalArgumentException("非法的操作类型");
|
|
|
}
|
|
|
// 更新Redis缓存
|
|
|
doRefresh(record, companyTrafficRecord);
|
|
@@ -201,26 +198,32 @@ public class CompanyTrafficRecordServiceImpl extends ServiceImpl<CompanyTrafficR
|
|
|
private void doRefresh(CompanyTrafficRecordChargeParam record, CompanyTrafficRecord companyTrafficRecord) {
|
|
|
if (record.getCompany() != null && record.getCompany().getDeptId() != null) {
|
|
|
// 更新缓存 key=CACHE_KEY:deptId:companyId value=剩余流量
|
|
|
-
|
|
|
- redisCache.deleteObject(CompanyTrafficConstants.CACHE_KEY + ":" + record.getCompany().getDeptId() + ":" + record.getCompanyId());
|
|
|
redisCache.incr(CompanyTrafficConstants.CACHE_KEY + ":" + record.getCompany().getDeptId() + ":" + record.getCompanyId(),
|
|
|
companyTrafficRecord.getBalance());
|
|
|
|
|
|
- // 计算该部门下所有公司流量总和
|
|
|
- calculateTotalTrafficByDeptId(record.getCompany().getDeptId());
|
|
|
+ // 部门新增流量
|
|
|
+ calculateTrafficByDeptId(record.getCompany().getDeptId(),companyTrafficRecord.getBalance());
|
|
|
} else {
|
|
|
// 抛出异常
|
|
|
throw new IllegalArgumentException("缓存ID异常");
|
|
|
}
|
|
|
}
|
|
|
+ /**
|
|
|
+ * 部门下所有公司流量总和减去使用的流量
|
|
|
+ */
|
|
|
+ private void calculateTrafficByDeptId(Long deptId,Long traffic) {
|
|
|
+ redisCache.incr(CompanyTrafficConstants.CACHE_KEY + ":" + deptId, traffic);
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
|
- * 部门下所有公司流量总和
|
|
|
+ * 部门下所有公司流量总和减去使用的流量
|
|
|
*/
|
|
|
- private void calculateTotalTrafficByDeptId(Long deptId) {
|
|
|
- Long totalTraffic = baseMapper.calculateTotalTrafficByDeptId(deptId);
|
|
|
- redisCache.deleteObject(CompanyTrafficConstants.CACHE_KEY + ":" + deptId);
|
|
|
- redisCache.incr(CompanyTrafficConstants.CACHE_KEY + ":" + deptId, totalTraffic);
|
|
|
+ private void calculateTotalTrafficByDeptId(Map<Long,Long> deptTrafficMap) {
|
|
|
+ deptTrafficMap.forEach((deptId,totalTraffic) -> {
|
|
|
+ Long total = baseMapper.calculateTotalTrafficByDeptId(deptId);
|
|
|
+ redisCache.deleteObject(CompanyTrafficConstants.CACHE_KEY + ":" + deptId);
|
|
|
+ redisCache.incr(CompanyTrafficConstants.CACHE_KEY + ":" + deptId, total-totalTraffic);
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
private boolean doLog(CompanyTrafficRecord companyTrafficRecord, CompanyTrafficRecordChargeParam record) {
|