|
|
@@ -1,9 +1,12 @@
|
|
|
package com.fs.company.service.impl;
|
|
|
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.fs.common.core.redis.RedisCache;
|
|
|
+import com.fs.common.exception.base.BaseException;
|
|
|
+import com.fs.common.utils.date.DateUtil;
|
|
|
import com.fs.company.constant.CompanyTrafficConstants;
|
|
|
import com.fs.company.domain.Company;
|
|
|
import com.fs.company.domain.CompanyTrafficRecord;
|
|
|
@@ -14,15 +17,22 @@ 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.config.CourseConfig;
|
|
|
import com.fs.course.mapper.FsCourseTrafficLogMapper;
|
|
|
import com.fs.system.domain.SysConfig;
|
|
|
+import com.fs.system.domain.SysDeptConfig;
|
|
|
+import com.fs.system.mapper.SysConfigMapper;
|
|
|
import com.fs.system.service.ISysConfigService;
|
|
|
+import com.fs.system.service.ISysDeptConfigLogService;
|
|
|
+import com.fs.system.service.ISysDeptConfigService;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import java.time.LocalDate;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.time.LocalTime;
|
|
|
import java.time.YearMonth;
|
|
|
import java.util.Date;
|
|
|
import java.util.HashMap;
|
|
|
@@ -49,12 +59,18 @@ public class CompanyTrafficRecordServiceImpl extends ServiceImpl<CompanyTrafficR
|
|
|
|
|
|
@Autowired
|
|
|
private FsCourseTrafficLogMapper fsCourseTrafficLogMapper;
|
|
|
+ @Autowired
|
|
|
+ private ISysDeptConfigService sysDeptConfigService;
|
|
|
+ @Autowired
|
|
|
+ private SysConfigMapper sysConfigMapper;
|
|
|
+ @Autowired
|
|
|
+ private ISysDeptConfigLogService sysDeptConfigLogService;
|
|
|
|
|
|
//启动时初始化部门流量缓存
|
|
|
@Override
|
|
|
public void init() {
|
|
|
List<CompanyTrafficRecord> companyTrafficRecords = baseMapper.selectList(new LambdaQueryWrapper<>());
|
|
|
- Map<Long,Long> deptTrafficMap = new HashMap<>();
|
|
|
+ Map<Long, Long> deptTrafficMap = new HashMap<>();
|
|
|
for (CompanyTrafficRecord companyTrafficRecord : companyTrafficRecords) {
|
|
|
// 获取公司ID
|
|
|
Long companyId = companyTrafficRecord.getCompanyId();
|
|
|
@@ -64,8 +80,9 @@ public class CompanyTrafficRecordServiceImpl extends ServiceImpl<CompanyTrafficR
|
|
|
|
|
|
// 公司流量 - 消耗流量
|
|
|
Long balance = companyTrafficRecord.getBalance();
|
|
|
+ Long traffic = fsCourseTrafficLogMapper.sumTrafficByCompany(companyId);
|
|
|
//消耗的流量
|
|
|
- Long totalInternetTraffic = fsCourseTrafficLogMapper.sumTrafficByCompany(companyId) == null?0L:fsCourseTrafficLogMapper.sumTrafficByCompany(companyId);
|
|
|
+ long totalInternetTraffic = traffic == null ? 0L : traffic;
|
|
|
balance -= totalInternetTraffic;
|
|
|
//部门流量记录
|
|
|
Long deptTrafficAdd = (deptTrafficMap.get(deptId) == null ? 0L : deptTrafficMap.get(deptId)) + totalInternetTraffic;
|
|
|
@@ -88,43 +105,49 @@ public class CompanyTrafficRecordServiceImpl extends ServiceImpl<CompanyTrafficR
|
|
|
log.info("【定时更新流量】:{}", "开始");
|
|
|
List<CompanyTrafficRecord> companyTrafficRecords = baseMapper.selectList(new LambdaQueryWrapper<>());
|
|
|
for (CompanyTrafficRecord companyTrafficRecord : companyTrafficRecords) {
|
|
|
- doReduce(companyTrafficRecord,"1");
|
|
|
+ doReduce(companyTrafficRecord);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//通过redis更新表流量并添加扣除日志
|
|
|
- private void doReduce(CompanyTrafficRecord companyTrafficRecord, String doType) {
|
|
|
-
|
|
|
+ private void doReduce(CompanyTrafficRecord companyTrafficRecord) {
|
|
|
+ LocalDateTime now = LocalDateTime.now();
|
|
|
+ // 获取上一个小时的开始时间
|
|
|
+ LocalDateTime startTime = now.minusHours(1)
|
|
|
+ .withMinute(0)
|
|
|
+ .withSecond(0);
|
|
|
+ // 获取上一个小时的结束时间
|
|
|
+ LocalDateTime endTime = startTime
|
|
|
+ .withMinute(59)
|
|
|
+ .withSecond(59);
|
|
|
//根据fs_course_traffic_log表获取公司昨天流量
|
|
|
- Long trafficAmountYesterday = fsCourseTrafficLogMapper.sumTrafficByCompanyYesterday(companyTrafficRecord.getCompanyId());
|
|
|
- if(trafficAmountYesterday!=null) {
|
|
|
+ Long trafficAmountYesterday = fsCourseTrafficLogMapper.sumTrafficByCompanyYesterday(companyTrafficRecord.getCompanyId(), DateUtil.formatLocalDateTime(startTime), DateUtil.formatLocalDateTime(endTime));
|
|
|
+ if (trafficAmountYesterday != null && trafficAmountYesterday < 0) {
|
|
|
//判断是否已经更新当天流量
|
|
|
- CompanyTrafficRecordLog todayRecodeLog = companyTrafficRecordLogService.selectTodayRecord(companyTrafficRecord.getCompanyId());
|
|
|
- if(todayRecodeLog != null){
|
|
|
- return;
|
|
|
- }
|
|
|
+// CompanyTrafficRecordLog todayRecodeLog = companyTrafficRecordLogService.selectTodayRecord(companyTrafficRecord.getCompanyId());
|
|
|
+// if(todayRecodeLog != null){
|
|
|
+// return;
|
|
|
+// }
|
|
|
long balance = companyTrafficRecord.getBalance() - trafficAmountYesterday;
|
|
|
companyTrafficRecord.setBalance(balance);
|
|
|
- log.info("【更新流量】:{}", "部门ID:" + companyTrafficRecord.getDeptId() +"公司ID:" + companyTrafficRecord.getCompanyId() + "消耗流量:" + trafficAmountYesterday+"剩余流量:"+balance);
|
|
|
- if (trafficAmountYesterday > 0) {
|
|
|
- baseMapper.updateById(CompanyTrafficRecord.builder()
|
|
|
- .id(companyTrafficRecord.getId())
|
|
|
- .balance(balance)
|
|
|
- .updateTime(new Date())
|
|
|
- .updateBy(1L).build());
|
|
|
- companyTrafficRecordLogService.save(CompanyTrafficRecordLog.builder()
|
|
|
- .balance(balance)
|
|
|
- .trafficAmount(trafficAmountYesterday)
|
|
|
- .companyId(companyTrafficRecord.getCompanyId())
|
|
|
- .createTime(new Date())
|
|
|
- .operationType(2)
|
|
|
- .userId(1L)//表示amdin
|
|
|
- .remark("0".equals(doType)?"重启同步流量":"定时更新扣除流量")
|
|
|
- .userName("admin")
|
|
|
- .build());
|
|
|
- }
|
|
|
+ log.info("【更新流量】:{}", "部门ID:" + companyTrafficRecord.getDeptId() + "公司ID:" + companyTrafficRecord.getCompanyId() + "消耗流量:" + trafficAmountYesterday + "剩余流量:" + balance);
|
|
|
+ baseMapper.updateById(CompanyTrafficRecord.builder()
|
|
|
+ .id(companyTrafficRecord.getId())
|
|
|
+ .balance(balance)
|
|
|
+ .updateTime(new Date())
|
|
|
+ .updateBy(1L).build());
|
|
|
+ companyTrafficRecordLogService.save(CompanyTrafficRecordLog.builder()
|
|
|
+ .balance(balance)
|
|
|
+ .trafficAmount(trafficAmountYesterday)
|
|
|
+ .companyId(companyTrafficRecord.getCompanyId())
|
|
|
+ .createTime(new Date())
|
|
|
+ .operationType(2)
|
|
|
+ .userId(1L)//表示amdin
|
|
|
+ .remark("定时更新扣除流量")
|
|
|
+ .userName("定时任务")
|
|
|
+ .build());
|
|
|
}
|
|
|
- init();
|
|
|
+// init();
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
@@ -142,6 +165,21 @@ public class CompanyTrafficRecordServiceImpl extends ServiceImpl<CompanyTrafficR
|
|
|
//充值
|
|
|
if (record.getOperationType() == 1) {//获取转换后的流量
|
|
|
Long trafficAmount = trafficConversion(record.getChargeAmount());
|
|
|
+ SysConfig courseConfig = sysConfigMapper.selectConfigByConfigKey("course.config");
|
|
|
+ CourseConfig config = JSON.parseObject(courseConfig.getConfigValue(), CourseConfig.class);
|
|
|
+ if (config.getDeptLimit() != null && config.getDeptLimit() && !record.getIsAdmin()) {
|
|
|
+ SysDeptConfig deptConfig = sysDeptConfigService.getDeptConfig(record.getDeptId());
|
|
|
+ Long flowNum = deptConfig.getFlowNum();
|
|
|
+ long surplus = flowNum - trafficAmount;
|
|
|
+ if (surplus < 0) {
|
|
|
+ throw new BaseException("部门可用流量不足无法分配,请联系管理员充值");
|
|
|
+ }
|
|
|
+ deptConfig.setFlowNum(surplus);
|
|
|
+ deptConfig.setUpdateBy(record.getUserName());
|
|
|
+ deptConfig.setUpdateTime(new Date());
|
|
|
+ sysDeptConfigLogService.addLog(deptConfig.getDeptId(), 2, 1, trafficAmount.toString(), flowNum.toString(), surplus + "", record.getUserName(), "充值公司流量");
|
|
|
+ sysDeptConfigService.updateById(deptConfig);
|
|
|
+ }
|
|
|
record.setChangeTraffic(trafficAmount);//用于处理日志
|
|
|
if (companyRecord != null) {
|
|
|
//不是第一次充值 增加流量
|
|
|
@@ -149,6 +187,7 @@ public class CompanyTrafficRecordServiceImpl extends ServiceImpl<CompanyTrafficR
|
|
|
companyTrafficRecord.setId(companyRecord.getId());
|
|
|
companyTrafficRecord.setUpdateTime(new Date());
|
|
|
companyTrafficRecord.setUpdateBy(record.getUserId());
|
|
|
+ companyTrafficRecord.setDeptId(record.getDeptId());
|
|
|
baseMapper.updateById(companyTrafficRecord);
|
|
|
} else {
|
|
|
companyTrafficRecord.setBalance(trafficAmount);
|
|
|
@@ -157,6 +196,7 @@ public class CompanyTrafficRecordServiceImpl extends ServiceImpl<CompanyTrafficR
|
|
|
companyTrafficRecord.setCompanyName(record.getCompany().getCompanyName());
|
|
|
companyTrafficRecord.setCreateTime(new Date());
|
|
|
companyTrafficRecord.setCreateBy(record.getUserId());
|
|
|
+ companyTrafficRecord.setDeptId(record.getDeptId());
|
|
|
baseMapper.insert(companyTrafficRecord);
|
|
|
}
|
|
|
/*//扣除
|
|
|
@@ -191,8 +231,10 @@ public class CompanyTrafficRecordServiceImpl extends ServiceImpl<CompanyTrafficR
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
/**
|
|
|
* 更新Redis缓存
|
|
|
+ *
|
|
|
* @param record 充值参数
|
|
|
* @param companyTrafficRecord 公司流量记录
|
|
|
*/
|
|
|
@@ -203,27 +245,28 @@ public class CompanyTrafficRecordServiceImpl extends ServiceImpl<CompanyTrafficR
|
|
|
companyTrafficRecord.getBalance());
|
|
|
|
|
|
// 部门新增流量
|
|
|
- calculateTrafficByDeptId(record.getCompany().getDeptId(),companyTrafficRecord.getBalance());
|
|
|
+ calculateTrafficByDeptId(record.getCompany().getDeptId(), companyTrafficRecord.getBalance());
|
|
|
} else {
|
|
|
// 抛出异常
|
|
|
throw new IllegalArgumentException("缓存ID异常");
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
/**
|
|
|
* 部门下所有公司流量总和减去使用的流量
|
|
|
*/
|
|
|
- private void calculateTrafficByDeptId(Long deptId,Long traffic) {
|
|
|
+ private void calculateTrafficByDeptId(Long deptId, Long traffic) {
|
|
|
redisCache.incr(CompanyTrafficConstants.CACHE_KEY + ":" + deptId, traffic);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 部门下所有公司流量总和减去使用的流量
|
|
|
*/
|
|
|
- private void calculateTotalTrafficByDeptId(Map<Long,Long> deptTrafficMap) {
|
|
|
- deptTrafficMap.forEach((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);
|
|
|
+ redisCache.incr(CompanyTrafficConstants.CACHE_KEY + ":" + deptId, total - totalTraffic);
|
|
|
//删除前天缓存
|
|
|
redisCache.deleteObject(CompanyTrafficConstants.CACHE_KEY + ":" + deptId + ":" + LocalDate.now().minusDays(2));
|
|
|
//删除上上月缓存
|