解决依赖循环 - 提交日志新增修改日志统计 -

This commit is contained in:
aikai 2024-04-15 13:10:33 +08:00
parent f268cb4373
commit b1207b4bbe
7 changed files with 102 additions and 53 deletions

View File

@ -48,7 +48,7 @@ public class LogInstanceController {
private LogReadService logReadService;
@Resource
private AdminUserService userService;
private AdminUserService adminUserService;
@PostMapping("/create")
@Operation(summary = "创建日志实例")
@ -136,8 +136,8 @@ public class LogInstanceController {
Map<Integer, List<Long>> usrMap = logReadService.getUserId(logId);
List<UserRespVO> unReadUserInfo = BeanUtils.toBean(userService.getUserList(usrMap.get(0)), UserRespVO.class);
List<UserRespVO> readUserInfo = BeanUtils.toBean(userService.getUserList(usrMap.get(1)), UserRespVO.class);
List<UserRespVO> unReadUserInfo = BeanUtils.toBean(adminUserService.getUserList(usrMap.get(0)), UserRespVO.class);
List<UserRespVO> readUserInfo = BeanUtils.toBean(adminUserService.getUserList(usrMap.get(1)), UserRespVO.class);
Map<String, Object> unReadMap = new HashMap<>();
Map<String, Object> readMap = new HashMap<>();

View File

@ -41,7 +41,7 @@ public class LogStatisticsController {
}
@GetMapping("/getStatistics")
@Operation(summary = "获取我管理的模版")
@Operation(summary = "获取日志统计")
public CommonResult<LogStatisticsDetailsListVO> getStatistics(@ModelAttribute LogStatisticsDetailsListDTO dto) {
return success(logStatisticsService.getStatistics(dto));
}

View File

@ -25,7 +25,6 @@ import cn.iocoder.yudao.module.system.service.dept.DeptService;
import cn.iocoder.yudao.module.system.service.dept.PostService;
import cn.iocoder.yudao.module.system.service.permission.PermissionService;
import cn.iocoder.yudao.module.system.service.tenant.TenantService;
import cn.iocoder.yudao.module.system.service.worklog.LogInstanceService;
import com.google.common.annotations.VisibleForTesting;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
@ -75,9 +74,6 @@ public class AdminUserServiceImpl implements AdminUserService {
@Resource
private UserPostMapper userPostMapper;
@Resource
private LogInstanceService logInstanceService;
@Resource
private FileApi fileApi;

View File

@ -1,26 +1,29 @@
package cn.iocoder.yudao.module.system.service.worklog;
import cn.hutool.core.date.DateUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.hutool.json.JSONObject;
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptRespVO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstancePageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstanceRespVO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstanceSaveReqVO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.LogStatisticsSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogFormDO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogInstanceDO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogRuleDO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogStatisticsDO;
import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogInstanceMapper;
import cn.iocoder.yudao.module.system.enums.ErrorCodeConstants;
import cn.iocoder.yudao.module.system.service.dept.DeptService;
import cn.iocoder.yudao.module.system.service.user.AdminUserService;
import cn.iocoder.yudao.module.system.service.worklog.dto.LogReadUserRespDTO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
@ -32,8 +35,6 @@ import java.time.format.DateTimeFormatter;
import java.time.temporal.WeekFields;
import java.util.*;
import java.util.stream.Collectors;
import java.util.Date;
import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
@ -69,6 +70,11 @@ public class LogInstanceServiceImpl implements LogInstanceService {
@Resource
private LogReadService logReadService;
@Resource
@Lazy
private LogStatisticsService logStatisticsService;
@Override
public Long createLogInstance(LogInstanceSaveReqVO createReqVO) {
@ -76,22 +82,22 @@ public class LogInstanceServiceImpl implements LogInstanceService {
validateLogInstanceByType(createReqVO);
LogInstanceDO logInstance = BeanUtils.toBean(createReqVO, LogInstanceDO.class);
//获取当前登录用户id
Long userId = getLoginUserId();
//获取日志类型
LogFormDO logFormDo = logFormService.getForm(createReqVO.getFormId());
Long count = logUseService.getCountByUser(logFormDo.getId(), getLoginUserId());
Long count = logUseService.getCountByUser(logFormDo.getId(), userId);
if (count == 0L) {
throw exception(LOG_FORM_NOT_USE);
}
//获取部门信息
AdminUserDO adminUserDO = adminUserService.getUser(getLoginUserId());
AdminUserDO adminUserDO = adminUserService.getUser(userId);
//获取规则信息
LogRuleDO logRuleDO = logRuleService.getLogRule(logFormDo.getRuleId());
//设置发起人用户编号
logInstance.setStartUserId(getLoginUserId());
logInstance.setStartUserId(userId);
//设置发起人部门编号
logInstance.setDeptId(adminUserDO.getDeptId());
//设置发起人用户名称
@ -107,10 +113,27 @@ public class LogInstanceServiceImpl implements LogInstanceService {
// 插入
logInstanceMapper.insert(logInstance);
// 插入到统计中
Date endTime = null;
// Date statisticalTime = DateUtils.buildWeekHHmmTime(logRuleDO.getStatisticalTime());
Date thisDate = new Date();
if (logRuleDO.getType() == 1) {
endTime = DateUtils.buildHHmmTime(logRuleDO.getEndTime());
} else if (logRuleDO.getType() == 2) {
endTime = DateUtils.buildWeekHHmmTime(logRuleDO.getEndTime());
}
logStatisticsService.saveOrUpdate(new LogStatisticsDO()
.setFormId(logFormDo.getId())
.setRuleId(logRuleDO.getId())
.setUserId(userId)
.setDeptId(adminUserDO.getDeptId())
.setLogInstanceExtId(logInstance.getId())
.setType(logRuleDO.getType())
.setTime(createReqVO.getTime())
.setStatus(thisDate.getTime() < endTime.getTime() ? 1 : 2)
);
//创建日志时查询可以查看发起人日志的用户组 用线程控制
new Thread(() -> {
List<LogReadUserRespDTO> respDTOS = logInstanceMapper.selectRaedUser(adminUserDO.getDeptId());
logReadService.createLogRule(respDTOS, logInstance.getId(), logInstance.getStartUserId());
}).start();

View File

@ -86,4 +86,11 @@ public interface LogStatisticsService {
* @return
*/
List<LogStatisticsDetailsVO> exportLogRuleExcel(LogStatisticsDetailsListDTO dto);
/**
* 新增或者修改统计表
*
* @param logStatisticsDO
*/
void saveOrUpdate(LogStatisticsDO logStatisticsDO);
}

View File

@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.system.service.worklog;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
@ -17,6 +18,7 @@ import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogStatisticsMapper;
import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogUseMapper;
import cn.iocoder.yudao.module.system.service.worklog.dto.LogUseVO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
@ -91,7 +93,18 @@ public class LogStatisticsServiceImpl implements LogStatisticsService {
List<LogFormDO> formList = new ArrayList<>();
Map<Long, LogRuleDO> ruleMap = new HashMap<>();
this.getFormAndRule(formIds, formList, ruleMap);
//查询模版
formList = logFormMapper.selectList(new LambdaQueryWrapper<LogFormDO>()
.in(LogFormDO::getId, formIds)
.eq(LogFormDO::getStatus, 1)
.isNotNull(LogFormDO::getRuleId)
);
List<Long> ruleIds = formList.stream().map(LogFormDO::getRuleId).collect(Collectors.toList());
List<LogRuleDO> logRuleDOS = new ArrayList<>();
if (CollectionUtil.isNotEmpty(ruleIds)) {
logRuleDOS = logRuleService.getLogRuleByIds(ruleIds);
ruleMap = logRuleDOS.stream().collect(Collectors.toMap(LogRuleDO::getId, v -> v));
}
Date thisDate = new Date();
@ -121,7 +134,7 @@ public class LogStatisticsServiceImpl implements LogStatisticsService {
//迟交数量
Integer lateNum = Math.toIntExact(instanceDOS.stream().filter(a -> DateUtil.isIn(Date.from(a.getCreateTime().atZone(ZoneId.systemDefault()).toInstant()), endTime, statisticalTime)).count());
//未提交数量
Integer unSubmittedNum = num - onTimeNum - lateNum;
Integer unSubmittedNum = Math.max((num - onTimeNum - lateNum), 0);
//按天统计
vo.setOnTimeNum(onTimeNum);
vo.setUnSubmittedNum(unSubmittedNum);
@ -139,7 +152,7 @@ public class LogStatisticsServiceImpl implements LogStatisticsService {
//迟交数量
Integer lateNum = Math.toIntExact(instanceDOS.stream().filter(a -> DateUtil.isIn(Date.from(a.getCreateTime().atZone(ZoneId.systemDefault()).toInstant()), endTime, statisticalTime)).count());
//未提交数量
Integer unSubmittedNum = num - onTimeNum - lateNum;
Integer unSubmittedNum = Math.max((num - onTimeNum - lateNum), 0);
//按天统计
vo.setOnTimeNum(onTimeNum);
vo.setUnSubmittedNum(unSubmittedNum);
@ -151,28 +164,6 @@ public class LogStatisticsServiceImpl implements LogStatisticsService {
return list;
}
/**
* 获取模版和规则
*
* @param formIds
* @param formList
* @param ruleMap
*/
private void getFormAndRule(List<Long> formIds, List<LogFormDO> formList, Map<Long, LogRuleDO> ruleMap) {
//查询模版
formList = logFormMapper.selectList(new LambdaQueryWrapper<LogFormDO>()
.in(LogFormDO::getId, formIds)
.eq(LogFormDO::getStatus, 1)
.isNotNull(LogFormDO::getRuleId)
);
List<Long> ruleIds = formList.stream().map(LogFormDO::getRuleId).collect(Collectors.toList());
List<LogRuleDO> logRuleDOS = new ArrayList<>();
if (CollectionUtil.isNotEmpty(ruleIds)) {
logRuleDOS = logRuleService.getLogRuleByIds(ruleIds);
ruleMap = logRuleDOS.stream().collect(Collectors.toMap(LogRuleDO::getId, v -> v));
}
}
@Override
public List<AdminUserDO> getUnSubmittedUser(Long formId, String thisTime) {
return logStatisticsMapper.getUnSubmittedUser(formId, thisTime);
@ -220,7 +211,18 @@ public class LogStatisticsServiceImpl implements LogStatisticsService {
//获取模版和规则
List<LogFormDO> formList = new ArrayList<>();
Map<Long, LogRuleDO> ruleMap = new HashMap<>();
this.getFormAndRule(formIds, formList, ruleMap);
//查询模版
formList = logFormMapper.selectList(new LambdaQueryWrapper<LogFormDO>()
.in(LogFormDO::getId, formIds)
.eq(LogFormDO::getStatus, 1)
.isNotNull(LogFormDO::getRuleId)
);
List<Long> ruleIds = formList.stream().map(LogFormDO::getRuleId).collect(Collectors.toList());
List<LogRuleDO> logRuleDOS = new ArrayList<>();
if (CollectionUtil.isNotEmpty(ruleIds)) {
logRuleDOS = logRuleService.getLogRuleByIds(ruleIds);
ruleMap = logRuleDOS.stream().collect(Collectors.toMap(LogRuleDO::getId, v -> v));
}
Date thisDate = new Date();
Date beginDate = null;
@ -279,10 +281,11 @@ public class LogStatisticsServiceImpl implements LogStatisticsService {
boolean flag = false;
Date begin = DateUtil.parse(dto.getBeginTime(), "yyyy-MM-dd").toJdkDate();
List<LogStatisticsDetailsVO> logStatisticsDOS = new ArrayList<>();
Date thisDate = new Date();
if (logRuleDO.getType() == 1) {
flag = DateUtil.isSameDay(begin, new Date());
flag = DateUtil.isSameDay(begin, thisDate);
} else if (logRuleDO.getType() == 2) {
flag = DateUtil.isSameWeek(begin, new Date(), true);
flag = DateUtil.isSameWeek(begin, thisDate, true);
}
List<String> dateList = DateUtils.betweenDayStrList(dto.getBeginTime(), dto.getEndTime());
// 这里将区间转换为具体的日期 因为mysql BETWEEN 会导致索引失效
@ -293,4 +296,24 @@ public class LogStatisticsServiceImpl implements LogStatisticsService {
}
return logStatisticsDOS;
}
@Override
public void saveOrUpdate(LogStatisticsDO logStatisticsDO) {
if (logStatisticsDO.getStatus() == 1) {
logStatisticsMapper.insert(logStatisticsDO);
return;
}
List<LogStatisticsDO> logStatisticsDOS = logStatisticsMapper.selectList(new LambdaQueryWrapper<LogStatisticsDO>()
.eq(LogStatisticsDO::getUserId, logStatisticsDO.getUserId())
.eq(LogStatisticsDO::getFormId, logStatisticsDO.getFormId())
.eq(LogStatisticsDO::getTime, logStatisticsDO.getTime()));
if (CollUtil.isEmpty(logStatisticsDOS)) {
logStatisticsMapper.insert(logStatisticsDO);
} else {
logStatisticsMapper.update(logStatisticsDO, new LambdaUpdateWrapper<LogStatisticsDO>()
.eq(LogStatisticsDO::getUserId, logStatisticsDO.getUserId())
.eq(LogStatisticsDO::getFormId, logStatisticsDO.getFormId())
.eq(LogStatisticsDO::getTime, logStatisticsDO.getTime()));
}
}
}

View File

@ -58,7 +58,7 @@
<!-- 本地环境 -->
<springProfile name="local">
<root level="INFO">
<root level="DEBUG">
<appender-ref ref="STDOUT"/>
<appender-ref ref="GRPC"/> <!-- 本地环境下,如果不想接入 SkyWalking 日志服务,可以注释掉本行 -->
<appender-ref ref="ASYNC"/> <!-- 本地环境下,如果不想打印日志,可以注释掉本行 -->
@ -66,7 +66,7 @@
</springProfile>
<!-- 其它环境 -->
<springProfile name="dev,test,stage,prod,default">
<root level="INFO">
<root level="DEBUG">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ASYNC"/>
<appender-ref ref="GRPC"/>