Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
Echo 2024-04-18 16:58:53 +08:00
commit 77a5ce35c8
16 changed files with 153 additions and 44 deletions

View File

@ -12,6 +12,7 @@ import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.Lo
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.convert.worklog.LogInstanceConvert;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import cn.iocoder.yudao.module.system.service.user.AdminUserService;
import cn.iocoder.yudao.module.system.service.worklog.LogInstanceService;
import cn.iocoder.yudao.module.system.service.worklog.LogReadService;
@ -84,7 +85,16 @@ public class LogInstanceController {
//查看日志详情时变更当前用户日志的阅读状态
logReadService.updateReadStatus(id, getLoginUserId());
//获取日志详情
LogInstanceRespVO logInstance = logInstanceService.getLogInstance(id);
//用户日志发起人详情
AdminUserDO userDO = adminUserService.getUser(logInstance.getStartUserId());
//设置日志发起人名称
logInstance.setStartUserName(userDO.getNickname());
//设置日志发起人头像
logInstance.setAvatar(userDO.getAvatar());
return success(logInstance);
}
@ -145,9 +155,12 @@ public class LogInstanceController {
List<Map<String, Object>> readUserVO = new ArrayList<>();
//获取可查看者用户列表
Map<Integer, List<Long>> usrMap = logReadService.getUserId(logId);
//获取未读用户详情
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<>();

View File

@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import cn.iocoder.yudao.module.system.controller.admin.worklog.dto.statistics.LogStatisticsDetailsListDTO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.dto.statistics.NeedWriteHistoryDTO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.LogStatisticsDetailsListVO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.LogStatisticsDetailsVO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.LogStatisticsExcelVO;
@ -54,6 +55,13 @@ public class LogStatisticsController {
return success(list);
}
@GetMapping("/getNeedWriteHistory")
@Operation(summary = "获取需要填写的历史记录")
public CommonResult<List<LogStatisticsModelVO>> getNeedWriteHistory(@ModelAttribute NeedWriteHistoryDTO dto) {
List<LogStatisticsModelVO> list = logStatisticsService.getNeedWriteHistory(dto);
return success(list);
}
@GetMapping("/export-excel")
@Operation(summary = "导出日志规则 Excel")
@OperateLog(type = EXPORT)

View File

@ -19,12 +19,15 @@ public class NeedWriteHistoryDTO {
private Integer type;
@Schema(description = "开始时间 格式yyyy-MM-dd")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT)
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
@JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY, timezone = TIME_ZONE_DEFAULT)
private Date beginTime;
@Schema(description = "结束时间 格式yyyy-MM-dd")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
@JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY, timezone = TIME_ZONE_DEFAULT)
private Date endTime;
@Schema(description = "当前用户id", hidden = true)
private Long userId;
}

View File

@ -23,12 +23,6 @@ public class LogInstancePageReqVO extends PageParam {
@Schema(description = "日志发起人的部门编号", example = "24292")
private Long deptId;
@Schema(description = "日志发起人的用户名称", example = "张三")
private String startUserName;
@Schema(description = "日志发起人的用户头像", example = "https://www.iocoder.cn/xxx.png")
private String avatar;
@Schema(description = "日志实例的名字", example = "张三的XX日报")
private String name;
@ -45,6 +39,6 @@ public class LogInstancePageReqVO extends PageParam {
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
@Schema(description = "未读", example = "0")
private Integer unRead;
@Schema(description = "已读、读 | 0未读、1", example = "0")
private Integer readStatus;
}

View File

@ -24,5 +24,8 @@ public class LogStatisticsModelVO extends LogFormDO {
@Schema(description = "模版类型 1日报 2周报 3月报")
private Integer type;
@Schema(description = "时间 格式yyyy-MM-dd")
private String time;
}

View File

@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.List;
@ -41,15 +40,6 @@ public class LogInstanceDO extends BaseDO {
*/
private Long deptId;
/**
* 日志发起人的用户名称
*/
private String startUserName;
/**
* 用户头像
*/
private String avatar;
/**
* 日志名称
*/

View File

@ -60,4 +60,9 @@ public class LogStatisticsDO extends BaseDO {
*/
private String time;
/**
* 提交时间区间(避免后面修改了规则后历史数据造成歧义)
*/
private String commitTimeRange;
}

View File

@ -40,13 +40,10 @@ public interface LogInstanceMapper extends BaseMapperX<LogInstanceDO> {
}
IPage<LogInstanceRespVO> selectPageResult(@Param("page") Page<LogInstanceRespVO> page, @Param("reqVO") LogInstancePageReqVO reqVO,
@Param("userId") Long userId, @Param("pagingType") Integer pagingType, @Param("logId") Long logId);
LogInstanceRespVO selectPageResult(@Param("reqVO") LogInstancePageReqVO reqVO, @Param("userId") Long userId,
@Param("pagingType") Integer pagingType, @Param("logId") Long logId);
@Param("userId") Long userId, @Param("pagingType") Integer pagingType);
@DataPermission(enable = false)
List<LogReadUserRespDTO> selectRaedUser(Long deptId);
List<LogReadUserRespDTO> selectRaedUser(@Param("userId")Long userId, @Param("deptId")Long deptId);
/**
* 获取上一篇下一篇

View File

@ -3,7 +3,9 @@ package cn.iocoder.yudao.module.system.dal.mysql.worklog;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.controller.admin.worklog.dto.statistics.NeedWriteHistoryDTO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.LogStatisticsDetailsVO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.LogStatisticsModelVO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.LogStatisticsPageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogStatisticsDO;
@ -71,4 +73,13 @@ public interface LogStatisticsMapper extends BaseMapperX<LogStatisticsDO> {
* @return
*/
List<LogUseVO> getMyCurrentStatistics(@Param("userId") Long userId, @Param("formId") Long formId, @Param("dateList") List<String> dateList);
/**
* 获取我的日志历史记录
*
* @param dto
* @param dateList
* @return
*/
List<LogStatisticsModelVO> getNeedWriteHistory(@Param("dto") NeedWriteHistoryDTO dto, @Param("dateList") List<String> dateList);
}

View File

@ -98,6 +98,7 @@ public class LogStatisticsJob {
LogRuleDO logRuleDO) {
// -- 统计时间到了 - 判断是否已经统计过了 - 只需要统计谁没有提交就行 - 把没提交的记录插入到统计表中 - 其他的在新增日志里面就插入到统计表即可
LogStatisticsRecordDO logStatisticsRecordDO = map.get(logFormDO.getId());
String commitTimeRange = logStatisticsService.getCommitTimeRange(logRuleDO);
if (logStatisticsRecordDO == null || logStatisticsRecordDO.getStatisticsFlag() == 0) {
List<AdminUserDO> users = logStatisticsService.getUnSubmittedUser(logFormDO.getId(), thisTime);
for (AdminUserDO user : users) {
@ -109,6 +110,7 @@ public class LogStatisticsJob {
logStatisticsDO.setType(logRuleDO.getType());
logStatisticsDO.setStatus(3);
logStatisticsDO.setTime(thisTime);
logStatisticsDO.setCommitTimeRange(commitTimeRange);
statisticsDOS.add(logStatisticsDO);
}
// -- 记录当前以统计

View File

@ -9,6 +9,7 @@ import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.Lo
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.convert.worklog.LogInstanceConvert;
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;
@ -100,10 +101,6 @@ public class LogInstanceServiceImpl implements LogInstanceService {
logInstance.setStartUserId(userId);
//设置发起人部门编号
logInstance.setDeptId(adminUserDO.getDeptId());
//设置发起人用户名称
logInstance.setStartUserName(adminUserDO.getNickname());
//设置发起人用户头像
logInstance.setAvatar(adminUserDO.getAvatar());
//设置日志类型
logInstance.setType(logRuleDO.getType());
//设置日志名称
@ -131,11 +128,22 @@ public class LogInstanceServiceImpl implements LogInstanceService {
.setType(logRuleDO.getType())
.setTime(createReqVO.getTime())
.setStatus(logInstance.getStatus())
.setCommitTimeRange(logStatisticsService.getCommitTimeRange(logRuleDO))
);
//创建日志时查询可以查看发起人日志的用户组 用线程控制
new Thread(() -> {
List<LogReadUserRespDTO> respDTOS = logInstanceMapper.selectRaedUser(adminUserDO.getDeptId());
List<LogReadUserRespDTO> respDTOS = logInstanceMapper.selectRaedUser(userId, adminUserDO.getDeptId());
//特殊情况 日志发起人为研发部时 手动添加查看者
if (adminUserDO.getDeptId() == 128L && adminUserDO.getId() != 126L) {
LogReadUserRespDTO dto = new LogReadUserRespDTO();
dto.setUserId(126L);
dto.setDeptId(128L);
respDTOS.add(dto);
}
logReadService.createLogRule(respDTOS, logInstance.getId(), logInstance.getStartUserId());
}).start();
@ -213,17 +221,18 @@ public class LogInstanceServiceImpl implements LogInstanceService {
public LogInstanceRespVO getLogInstance(Long id) {
//获取日志详情
LogInstanceRespVO logInstanceRespVO = logInstanceMapper.selectPageResult(new LogInstancePageReqVO(), getLoginUserId(), null, id);
LogInstanceDO logInstanceDO = logInstanceMapper.selectById(id);
// LogInstanceRespVO logInstanceRespVO = logInstanceMapper.selectPageResult(new LogInstancePageReqVO(), getLoginUserId(), null, id);
//设置日志详情 模板内容和时间
return setContentFun(logInstanceRespVO);
return setContentFun(LogInstanceConvert.INSTANCE.convert(logInstanceDO));
}
@Override
public IPage<LogInstanceRespVO> getLogInstancePage(LogInstancePageReqVO pageReqVO, Integer pagingType) {
Page<LogInstanceRespVO> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
IPage<LogInstanceRespVO> pageList = logInstanceMapper.selectPageResult(page, pageReqVO, getLoginUserId(), pagingType, null);
IPage<LogInstanceRespVO> pageList = logInstanceMapper.selectPageResult(page, pageReqVO, getLoginUserId(), pagingType);
List<LogInstanceRespVO> records = pageList.getRecords();
if (!records.isEmpty()) {

View File

@ -35,10 +35,9 @@ public class LogReadServiceImpl implements LogReadService{
logReadDo.setLogInstanceId(logInstanceId);
logReadDo.setStartUserId(startUserId);
logReadDo.setReadUserDept(user.getDeptId());
if (!user.getUserId().toString().equals(startUserId.toString())) {
logReadDo.setReadUserId(user.getUserId());
}
logReadDo.setReadStatus(0);
logReadDo.setCreator(String.valueOf(startUserId));
return logReadDo;
})
.collect(Collectors.toList());

View File

@ -2,8 +2,10 @@ package cn.iocoder.yudao.module.system.service.worklog;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.controller.admin.worklog.dto.statistics.LogStatisticsDetailsListDTO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.dto.statistics.NeedWriteHistoryDTO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.*;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogRuleDO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogStatisticsDO;
import javax.validation.Valid;
@ -93,4 +95,14 @@ public interface LogStatisticsService {
* @param logStatisticsDO
*/
void saveOrUpdate(LogStatisticsDO logStatisticsDO);
String getCommitTimeRange(LogRuleDO logRuleDO);
/**
* 获取我填写的历史
*
* @param dto
* @return
*/
List<LogStatisticsModelVO> getNeedWriteHistory(NeedWriteHistoryDTO dto);
}

View File

@ -8,8 +8,10 @@ import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
import cn.iocoder.yudao.module.system.controller.admin.worklog.dto.statistics.LogStatisticsDetailsListDTO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.dto.statistics.NeedWriteHistoryDTO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.*;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.*;
@ -310,4 +312,35 @@ public class LogStatisticsServiceImpl implements LogStatisticsService {
.eq(LogStatisticsDO::getTime, logStatisticsDO.getTime()));
}
}
@Override
public String getCommitTimeRange(LogRuleDO logRuleDO) {
Date thisDate = new Date();
if (logRuleDO.getType() == 1 && StrUtil.isNotEmpty(logRuleDO.getWeekDays())) {
// -- 判断今天是周几 需要提交的周做对比
int weekNum = ((DateUtil.dayOfWeekEnum(thisDate).getValue() - 1) == 0 ? 7 : (DateUtil.dayOfWeekEnum(thisDate).getValue() - 1));
List<String> weekDays = Arrays.asList(logRuleDO.getWeekDays().split(","));
if (weekDays.contains(Integer.toString(weekNum))) {
return "当天" + logRuleDO.getEndTime() + "截止提交";
} else {
return "当天不需要提交";
}
} else if (logRuleDO.getType() == 2) {
// -- 拼接获取到结束时间
Date endTime = DateUtils.buildWeekHHmmTime(logRuleDO.getEndTime());
return "每周" + DateUtil.dayOfWeekEnum(endTime).toChinese() + (logRuleDO.getEndTime().split(",")[1]) + "截止提交";
}
return null;
}
@Override
public List<LogStatisticsModelVO> getNeedWriteHistory(NeedWriteHistoryDTO dto) {
List<String> dateList = new ArrayList<>();
if (dto.getBeginTime() != null && dto.getEndTime() != null) {
dateList = DateUtils.betweenDayList(dto.getBeginTime(), dto.getEndTime());
}
dto.setUserId(SecurityFrameworkUtils.getLoginUserId());
// 这里将区间转换为具体的日期 因为mysql BETWEEN 会导致索引失效
return logStatisticsMapper.getNeedWriteHistory(dto, dateList);
}
}

View File

@ -76,11 +76,12 @@
AND read_user.data_scope != 5
) result
WHERE
1= 1
and ( LOCATE(#{deptId},result.ids) and result.data_scope = 4 )
result.user_id != #{userId}
and
( ( LOCATE(#{deptId},result.ids) and result.data_scope = 4 )
or ( LOCATE(#{deptId},result.ids) and result.data_scope = 2 )
or ( result.dept_id = #{deptId} and result.data_scope = 3 )
or result.data_scope = 1
or result.data_scope = 1 )
</select>
<select id="selectPageResult" resultType="cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstanceRespVO">
@ -97,9 +98,6 @@
LEFT JOIN (SELECT log_instance_id, COUNT(log_instance_id) AS unReadCount FROM work_log_read where read_status = 0 GROUP BY log_instance_id ) AS d ON a.id = d.log_instance_id
LEFT JOIN (SELECT work_log_id, COUNT(work_log_id) AS comment FROM work_log_comment GROUP BY work_log_id) AS b ON a.id = b.work_log_id
<where>
<if test="logId != null">
and a.id = #{logId}
</if>
<if test="reqVO.type != null">
and a.type = #{reqVO.type}
</if>
@ -117,8 +115,8 @@
and a.create_time &lt;= #{reqVO.createTime[1]}
</if>
</if>
<if test="reqVO.unRead != null">
and e.read_status = 0
<if test="reqVO.readStatus != null">
and e.read_status = #{reqVO.readStatus}
</if>
<if test="pagingType == 0">
and a.start_user_id != #{userId}

View File

@ -109,4 +109,36 @@
</if>
</where>
</select>
<select id="getNeedWriteHistory"
resultType="cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.LogStatisticsModelVO">
SELECT
b.*,
IF( a.STATUS = 1, 1, 0 ) AS onTimeNum,
IF( a.STATUS = 2, 1, 0 ) AS lateNum,
IF( a.STATUS = 3, 1, 0 ) AS unSubmittedNum,
a.time,
c.type,
a.commit_time_range
FROM
work_log_statistics AS a
LEFT JOIN work_log_form AS b ON a.form_id = b.id
LEFT JOIN work_log_rule AS c ON a.rule_id = c.id
<where>
<if test="dto.formId != null">
AND a.form_id = #{dto.formId}
</if>
<if test="dto.userId != null">
AND a.user_id = #{dto.userId}
</if>
<if test="dateList != null and dateList.size() > 0">
AND a.time IN
<foreach collection="dateList" item="date" open="(" separator="," close=")">
#{date}
</foreach>
</if>
<if test="dto.type != null">
AND a.type = #{dto.type}
</if>
</where>
</select>
</mapper>