日志统计

This commit is contained in:
aikai 2024-04-15 09:35:00 +08:00
parent 7ede50975a
commit 746db0efbb
45 changed files with 1561 additions and 155 deletions

View File

@ -35,6 +35,11 @@ public class CommonResult<T> implements Serializable {
*/
private String msg;
/**
* 时间戳
*/
private long timestamp = System.currentTimeMillis();
/**
* 将传入的 result 对象转换成另外一个泛型结果的对象
*
@ -65,6 +70,7 @@ public class CommonResult<T> implements Serializable {
result.code = GlobalErrorCodeConstants.SUCCESS.getCode();
result.data = data;
result.msg = "";
return result;
}

View File

@ -1,16 +1,17 @@
package cn.iocoder.yudao.framework.common.util.date;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import java.text.SimpleDateFormat;
import java.time.*;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
* 时间工具类
*
*/
public class DateUtils {
@ -34,6 +35,7 @@ public class DateUtils {
/**
* 根据传入的时间格式将Date对象转换成对应的时间格式
*
* @param date
* @param format
* @return
@ -41,7 +43,7 @@ public class DateUtils {
public static String dateFormat(Date date, String format) {
SimpleDateFormat formatter = new SimpleDateFormat(format);
String formattedDate = formatter.format(date);
return formattedDate ;
return formattedDate;
}
/**
@ -131,6 +133,42 @@ public class DateUtils {
return calendar.getTime();
}
/**
* 创建指定时间
*
* @param timeStr 时间字符串格式为 HH:mm
* @return 指定时间
*/
public static Date buildHHmmTime(String timeStr) {
String[] time = timeStr.split(":");
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(time[0]));
calendar.set(Calendar.MINUTE, Integer.parseInt(time[1]));
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date endTime = calendar.getTime();
return calendar.getTime();
}
public static Date buildWeekHHmmTime(String timeStr) {
String[] time = timeStr.split(",");
int week = Integer.parseInt(time[0]);
boolean isItTheNextDay = false;
if (week == 7) {
isItTheNextDay = true;
}
week = (week + 1) == 8 ? 7 : (week + 1);
String[] hhmm = time[1].split(":");
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_WEEK, week);
calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(hhmm[0]));
calendar.set(Calendar.MINUTE, Integer.parseInt(hhmm[1]));
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return isItTheNextDay ? DateUtil.offsetDay(calendar.getTime(), 1) : calendar.getTime();
}
public static Date max(Date a, Date b) {
if (a == null) {
return b;
@ -192,4 +230,23 @@ public class DateUtils {
return LocalDateTimeUtil.isSameDay(date, LocalDateTime.now());
}
/**
* 获取两个时间区间 - 获取两个时间区间的所有日期
*
* @param beginTime
* @param endTime
* @return
*/
public static List<String> betweenDayStrList(String beginTime, String endTime) {
List<String> list = new ArrayList<>();
Date begin = DateUtil.parse(beginTime, "yyyy-MM-dd").toJdkDate();
Date end = DateUtil.parse(endTime, "yyyy-MM-dd").toJdkDate();
int num = (int) DateUtil.betweenDay(begin, end, true);
for (int i = 0; i <= num; i++) {
Date time = DateUtil.offsetDay(begin, i).toJdkDate();
list.add(DateUtil.format(time, "yyyy-MM-dd"));
}
return list;
}
}

View File

@ -58,7 +58,9 @@ public class DeptDataPermissionRule implements DataPermissionRule {
// TODO: 2024/4/10 注意 - 如果需要降级低权的话 要把需要的表名称加在这里 并且在方法上开启数据权限 并且添加 DataPermissionConfiguration 对象
private static final List<String> LOW_POWER_TABLES = Arrays.asList(
"bpm_process_instance_ext"
"bpm_process_instance_ext",
"work_log_use",
"work_log_statistics"
);
/**

View File

@ -0,0 +1,49 @@
package cn.iocoder.yudao.module.system.controller.admin.worklog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.system.controller.admin.worklog.dto.statistics.LogStatisticsDetailsListDTO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.LogStatisticsDetailsListVO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.LogStatisticsModelVO;
import cn.iocoder.yudao.module.system.service.worklog.LogStatisticsService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 工作日志统计")
@RestController
@RequestMapping("/system/worklog/statistics")
@Validated
public class LogStatisticsController {
@Resource
private LogStatisticsService logStatisticsService;
@GetMapping("/myManageModel")
@Operation(summary = "获取我管理的模版")
public CommonResult<List<LogStatisticsModelVO>> myManageModel() {
return success(logStatisticsService.myManageModel());
}
@GetMapping("/getStatistics")
@Operation(summary = "获取我管理的模版")
public CommonResult<LogStatisticsDetailsListVO> getStatistics(@ModelAttribute LogStatisticsDetailsListDTO dto) {
return success(logStatisticsService.getStatistics(dto));
}
// @GetMapping("/getNeedWrite")
// @Operation(summary = "获取需要填写的")
// public CommonResult<List<LogStatisticsModelVO>> getNeedWrite() {
// List<LogStatisticsModelVO> list = logStatisticsService.getNeedWrite();
// return success(list);
// }
}

View File

@ -1,43 +0,0 @@
package cn.iocoder.yudao.module.system.controller.admin.worklog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.system.controller.admin.worklog.dto.statistics.WorkLogStatisticsModelDTO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.form.LogFormUpdateReqVO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.WorkLogStatisticsModelVO;
import cn.iocoder.yudao.module.system.service.worklog.WorkLogStatisticsService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 工作日志统计")
@RestController
@RequestMapping("/system/worklog/statistics")
@Validated
public class WorkLogStatisticsController {
@Resource
private WorkLogStatisticsService workLogStatisticsService;
@GetMapping("/myManageModel")
@Operation(summary = "获取我管理的模版")
public CommonResult<List<WorkLogStatisticsModelVO>> myManageModel(@ModelAttribute WorkLogStatisticsModelDTO dto) {
return success(workLogStatisticsService.myManageModel(dto));
}
// @PutMapping("/update")
// @Operation(summary = "更新动态表单")
// @PreAuthorize("@ss.hasPermission('worklog:form:update')")
// public CommonResult<Boolean> updateForm(@Valid @RequestBody LogFormUpdateReqVO updateReqVO) {
// formService.updateForm(updateReqVO);
// return success(true);
// }
}

View File

@ -0,0 +1,17 @@
package cn.iocoder.yudao.module.system.controller.admin.worklog.dto.statistics;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class LogStatisticsDetailsListDTO {
@Schema(description = "模板编号")
private Long formId;
@Schema(description = "开始时间 格式yyyy-MM-dd 如果是日报的话 开始时间结束时间都传同一天即可")
private String beginTime;
@Schema(description = "结束时间 格式yyyy-MM-dd 如果是日报的话 开始时间结束时间都传同一天即可")
private String endTime;
}

View File

@ -0,0 +1,14 @@
package cn.iocoder.yudao.module.system.controller.admin.worklog.vo.form;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogFormDO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogRuleDO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class LogFormRuleVO {
@Schema(description = "模版对象", example = "模版对象")
private LogFormDO formDO;
@Schema(description = "规则对象", example = "规则对象")
private LogRuleDO ruleDO;
}

View File

@ -0,0 +1,23 @@
package cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
/**
* 动态表单 Base VO提供给添加修改详细的子 VO 使用
* 如果子 VO 存在差异的字段请不要添加到这里影响 Swagger 文档生成
*/
@Data
public class LogStatisticsDetailsListVO {
@Schema(description = "按时提交")
private List<LogStatisticsDetailsVO> onTime;
@Schema(description = "迟交")
private List<LogStatisticsDetailsVO> late;
@Schema(description = "未提交")
private List<LogStatisticsDetailsVO> unSubmitted;
}

View File

@ -0,0 +1,41 @@
package cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.TIME_ZONE_DEFAULT;
@Data
public class LogStatisticsDetailsVO {
@Schema(description = "用户id")
private Long userId;
@Schema(description = "名称")
private String nickname;
@Schema(description = "头像")
private String avatar;
@Schema(description = "部门id")
private Long deptId;
@Schema(description = "部门名称")
private String deptName;
@Schema(description = "日志id", example = "30875")
private Long logInstanceExtId;
@Schema(description = "提交状态 1按时提交 2迟交 3未提交", example = "2")
private Integer status;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT)
private Date createTime;
}

View File

@ -0,0 +1,25 @@
package cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogFormDO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 动态表单 Base VO提供给添加修改详细的子 VO 使用
* 如果子 VO 存在差异的字段请不要添加到这里影响 Swagger 文档生成
*/
@Data
public class LogStatisticsModelVO extends LogFormDO {
@Schema(description = "按时提交数量")
private Integer onTimeNum = 0;
@Schema(description = "迟交数量")
private Integer lateNum = 0;
@Schema(description = "未提交数量")
private Integer unSubmittedNum = 0;
@Schema(description = "提交范围")
private String commitTimeRange;
}

View File

@ -0,0 +1,47 @@
package cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 工作日志统计分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class LogStatisticsPageReqVO extends PageParam {
@Schema(description = "模板编号", example = "27285")
private Long formId;
@Schema(description = "模板规则编号", example = "17370")
private Long ruleId;
@Schema(description = "用户id", example = "23689")
private Long userId;
@Schema(description = "部门编号", example = "21782")
private Long deptId;
@Schema(description = "日志id", example = "30875")
private Long logInstanceExtId;
@Schema(description = "日志类型 1日报 2周报", example = "1")
private Integer type;
@Schema(description = "提交状态 1按时提交 2迟交 3未提交", example = "2")
private Integer status;
@Schema(description = "提交日期 格式 yyyy-MM-dd")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private String[] time;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@ -0,0 +1,56 @@
package cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - 工作日志统计 Response VO")
@Data
@ExcelIgnoreUnannotated
public class LogStatisticsRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "29400")
@ExcelProperty("编号")
private Long id;
@Schema(description = "模板编号", example = "27285")
@ExcelProperty("模板编号")
private Long formId;
@Schema(description = "模板规则编号", example = "17370")
@ExcelProperty("模板规则编号")
private Long ruleId;
@Schema(description = "用户id", example = "23689")
@ExcelProperty("用户id")
private Long userId;
@Schema(description = "部门编号", example = "21782")
@ExcelProperty("部门编号")
private Long deptId;
@Schema(description = "日志id", example = "30875")
@ExcelProperty("日志id")
private Long logInstanceExtId;
@Schema(description = "日志类型 1日报 2周报", example = "1")
@ExcelProperty("日志类型 1日报 2周报")
private Integer type;
@Schema(description = "提交状态 1按时提交 2迟交 3未提交", example = "2")
@ExcelProperty("提交状态 1按时提交 2迟交 3未提交")
private Integer status;
@Schema(description = "提交日期 格式 yyyy-MM-dd")
@ExcelProperty("提交日期 格式 yyyy-MM-dd")
private String time;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

View File

@ -0,0 +1,39 @@
package cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
import java.util.*;
@Schema(description = "管理后台 - 工作日志统计新增/修改 Request VO")
@Data
public class LogStatisticsSaveReqVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "21181")
private Long id;
@Schema(description = "模板编号", example = "27285")
private Long formId;
@Schema(description = "模板规则编号", example = "17370")
private Long ruleId;
@Schema(description = "用户id", example = "23689")
private Long userId;
@Schema(description = "部门编号", example = "21782")
private Long deptId;
@Schema(description = "日志id", example = "30875")
private Long logInstanceExtId;
@Schema(description = "日志类型 1日报 2周报", example = "1")
private Integer type;
@Schema(description = "提交状态 1按时提交 2迟交 3未提交", example = "2")
private Integer status;
@Schema(description = "提交日期 格式 yyyy-MM-dd")
private String time;
}

View File

@ -1,14 +0,0 @@
package cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogFormDO;
import lombok.Data;
/**
* 动态表单 Base VO提供给添加修改详细的子 VO 使用
* 如果子 VO 存在差异的字段请不要添加到这里影响 Swagger 文档生成
*/
@Data
public class WorkLogStatisticsModelVO extends LogFormDO {
}

View File

@ -0,0 +1,35 @@
package cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statisticsrecord;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 工作日志统计记录分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class LogStatisticsRecordPageReqVO extends PageParam {
@Schema(description = "模板编号", example = "4029")
private Long formId;
@Schema(description = "模板规则编号", example = "19133")
private Long ruleId;
@Schema(description = "是否统计过 0否 1是")
private Integer statisticsFlag;
@Schema(description = "统计日期 格式 yyyy-MM-dd")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private String[] time;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@ -0,0 +1,40 @@
package cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statisticsrecord;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - 工作日志统计记录 Response VO")
@Data
@ExcelIgnoreUnannotated
public class LogStatisticsRecordRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "18988")
@ExcelProperty("编号")
private Long id;
@Schema(description = "模板编号", example = "4029")
@ExcelProperty("模板编号")
private Long formId;
@Schema(description = "模板规则编号", example = "19133")
@ExcelProperty("模板规则编号")
private Long ruleId;
@Schema(description = "是否统计过 0否 1是")
@ExcelProperty("是否统计过 0否 1是")
private Integer statisticsFlag;
@Schema(description = "统计日期 格式 yyyy-MM-dd")
@ExcelProperty("统计日期 格式 yyyy-MM-dd")
private String time;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

View File

@ -0,0 +1,28 @@
package cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statisticsrecord;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
import java.util.*;
@Schema(description = "管理后台 - 工作日志统计记录新增/修改 Request VO")
@Data
public class LogStatisticsRecordSaveReqVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "18988")
private Long id;
@Schema(description = "模板编号", example = "4029")
private Long formId;
@Schema(description = "模板规则编号", example = "19133")
private Long ruleId;
@Schema(description = "是否统计过 0否 1是")
private Integer statisticsFlag;
@Schema(description = "统计日期 格式 yyyy-MM-dd")
private String time;
}

View File

@ -50,4 +50,9 @@ public class CommentPageListVO {
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Schema(description = "创建日期")
private String createTime;
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Schema(description = "发布日志时间")
private String workLogTime;
}

View File

@ -25,19 +25,23 @@ public class LogRuleDO extends BaseDO {
@TableId
private Long id;
/**
* 日志类型
* 模版id
*/
private Long formId;
/**
* 日志类型 1日报 2周报 3月报 4年报
*/
private Integer type;
/**
* 日报情况需提交的日期
* 日报情况需提交的日期 1,2,3,4,5 周一 周五
*/
private String weekDays;
/**
* 提交开始时间段
* 提交开始时间段 如果是日报的话 格式是 HH:mm 如果是周报的话 格式是 1,HH:mm 其中1代表的是周几
*/
private String startTime;
/**
* 提交结束时间段
* 提交结束时间段 如果是日报的话 格式是 HH:mm 如果是周报的话 格式是 1,HH:mm 其中1代表的是周几
*/
private String endTime;
/**
@ -45,7 +49,7 @@ public class LogRuleDO extends BaseDO {
*/
private Integer remindTime;
/**
* 统计时间段
* 统计时间段 如果是日报的话 格式是 HH:mm 如果是周报的话 格式是 1,HH:mm 其中1代表的是周几
*/
private String statisticalTime;

View File

@ -0,0 +1,63 @@
package cn.iocoder.yudao.module.system.dal.dataobject.worklog;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
/**
* 工作日志统计 DO
*
* @author 艾楷
*/
@TableName("work_log_statistics")
@KeySequence("work_log_statistics_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class LogStatisticsDO extends BaseDO {
/**
* 编号
*/
@TableId
private Long id;
/**
* 模板编号
*/
private Long formId;
/**
* 模板规则编号
*/
private Long ruleId;
/**
* 用户id
*/
private Long userId;
/**
* 部门编号
*/
private Long deptId;
/**
* 日志id
*/
private Long logInstanceExtId;
/**
* 日志类型 1日报 2周报
*/
private Integer type;
/**
* 提交状态 1按时提交 2迟交 3未提交
*/
private Integer status;
/**
* 提交日期 格式 yyyy-MM-dd
*/
private String time;
}

View File

@ -0,0 +1,47 @@
package cn.iocoder.yudao.module.system.dal.dataobject.worklog;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
/**
* 工作日志统计记录 DO
*
* @author 艾楷
*/
@TableName("work_log_statistics_record")
@KeySequence("work_log_statistics_record_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class LogStatisticsRecordDO extends BaseDO {
/**
* 编号
*/
@TableId
private Long id;
/**
* 模板编号
*/
private Long formId;
/**
* 模板规则编号
*/
private Long ruleId;
/**
* 是否统计过 0否 1是
*/
private Integer statisticsFlag;
/**
* 统计日期 格式 yyyy-MM-dd
*/
private String time;
}

View File

@ -4,12 +4,9 @@ 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.QueryWrapperX;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.form.LogFormPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.WorkLogStatisticsModelVO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogFormDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface LogFormMapper extends BaseMapperX<LogFormDO> {

View File

@ -5,10 +5,11 @@ 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.vo.loginstance.LogInstancePageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogInstanceDO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogReadDo;
import cn.iocoder.yudao.module.system.service.worklog.dto.LogReadUserRespDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
/**
@ -39,4 +40,11 @@ public interface LogInstanceMapper extends BaseMapperX<LogInstanceDO> {
}
List<LogReadUserRespDTO> selectRaedUser(Long deptId);
/**
* 获取我管理的日志列表
*
* @return
*/
List<LogInstanceDO> myManageLogInstanceByTimeRange(@Param("fromId") Long fromId, @Param("beginTime") Date beginTime, @Param("endTime") Date endTime);
}

View File

@ -0,0 +1,63 @@
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.vo.statistics.LogStatisticsDetailsVO;
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.LogInstanceDO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogStatisticsDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 工作日志统计 Mapper
*
* @author 艾楷
*/
@Mapper
public interface LogStatisticsMapper extends BaseMapperX<LogStatisticsDO> {
default PageResult<LogStatisticsDO> selectPage(LogStatisticsPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<LogStatisticsDO>()
.eqIfPresent(LogStatisticsDO::getFormId, reqVO.getFormId())
.eqIfPresent(LogStatisticsDO::getRuleId, reqVO.getRuleId())
.eqIfPresent(LogStatisticsDO::getUserId, reqVO.getUserId())
.eqIfPresent(LogStatisticsDO::getDeptId, reqVO.getDeptId())
.eqIfPresent(LogStatisticsDO::getLogInstanceExtId, reqVO.getLogInstanceExtId())
.eqIfPresent(LogStatisticsDO::getType, reqVO.getType())
.eqIfPresent(LogStatisticsDO::getStatus, reqVO.getStatus())
.betweenIfPresent(LogStatisticsDO::getTime, reqVO.getTime())
.betweenIfPresent(LogStatisticsDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(LogStatisticsDO::getId));
}
/**
* 获取为提交用户列表
*
* @param formId
* @param thisTime
* @return
*/
List<AdminUserDO> getUnSubmittedUser(@Param("formId") Long formId, @Param("thisTime") String thisTime);
/**
* 获取统计
* @param dateList
* @param formId
* @return
*/
List<LogStatisticsDetailsVO> getStatistics(@Param("dateList") List<String> dateList, @Param("formId") Long formId);
/**
* 获取当天/本周的统计
*
* @param formId
* @param dateList
* @return
*/
List<LogStatisticsDetailsVO> getCurrentStatistics(@Param("formId") Long formId, @Param("dateList") List<String> dateList);
}

View File

@ -0,0 +1,30 @@
package cn.iocoder.yudao.module.system.dal.mysql.worklog;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statisticsrecord.LogStatisticsRecordPageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogStatisticsRecordDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 工作日志统计记录 Mapper
*
* @author 艾楷
*/
@Mapper
public interface LogStatisticsRecordMapper extends BaseMapperX<LogStatisticsRecordDO> {
default PageResult<LogStatisticsRecordDO> selectPage(LogStatisticsRecordPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<LogStatisticsRecordDO>()
.eqIfPresent(LogStatisticsRecordDO::getFormId, reqVO.getFormId())
.eqIfPresent(LogStatisticsRecordDO::getRuleId, reqVO.getRuleId())
.eqIfPresent(LogStatisticsRecordDO::getStatisticsFlag, reqVO.getStatisticsFlag())
.betweenIfPresent(LogStatisticsRecordDO::getTime, reqVO.getTime())
.betweenIfPresent(LogStatisticsRecordDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(LogStatisticsRecordDO::getId));
}
}

View File

@ -18,5 +18,5 @@ public interface LogUseMapper extends BaseMapperX<LogUseDO> {
*
* @return
*/
List<Long> getFormIdsByDataPermission();
List<Long> getFormIdsByDataPermission(Long userId);
}

View File

@ -1,15 +1,15 @@
package cn.iocoder.yudao.module.system.framework.datapermission.config;
import cn.iocoder.yudao.framework.datapermission.core.rule.dept.DeptDataPermissionRuleCustomizer;
import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import cn.iocoder.yudao.framework.datapermission.core.rule.dept.DeptDataPermissionRuleCustomizer;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogStatisticsDO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogUseDO;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* system 模块的数据权限 Configuration
*
*/
@Configuration(proxyBeanMethods = false)
public class DataPermissionConfiguration {
@ -20,8 +20,12 @@ public class DataPermissionConfiguration {
// dept
rule.addDeptColumn(AdminUserDO.class);
rule.addDeptColumn(DeptDO.class, "id");
rule.addDeptColumn(LogUseDO.class, "use_user_dept");
rule.addDeptColumn(LogStatisticsDO.class, "dept_id");
// user
rule.addUserColumn(AdminUserDO.class, "id");
rule.addUserColumn(LogUseDO.class, "use_user_id");
rule.addUserColumn(LogStatisticsDO.class, "user_id");
};
}

View File

@ -0,0 +1,119 @@
package cn.iocoder.yudao.module.system.job.worklog;
import cn.hutool.core.date.DateUtil;
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import cn.iocoder.yudao.framework.tenant.core.job.TenantJob;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.form.LogFormRuleVO;
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.LogRuleDO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogStatisticsDO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogStatisticsRecordDO;
import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogStatisticsMapper;
import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogStatisticsRecordMapper;
import cn.iocoder.yudao.module.system.service.worklog.LogFormService;
import cn.iocoder.yudao.module.system.service.worklog.LogStatisticsRecordService;
import cn.iocoder.yudao.module.system.service.worklog.LogStatisticsService;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
@Component
@Slf4j
public class LogStatisticsJob {
@Resource
private LogStatisticsService logStatisticsService;
@Resource
private LogFormService logFormService;
@Resource
private LogStatisticsMapper logStatisticsMapper;
@Resource
private LogStatisticsRecordService logStatisticsRecordService;
@Resource
private LogStatisticsRecordMapper logStatisticsRecordMapper;
@XxlJob("logStatisticsJob")
@TenantJob // --- 这个注解 会将租户列表拉出来 完了后逐个租户执行 定时任务需要注意
public ReturnT<String> execute() throws Exception {
//获取参数
//XxlJobContext xxlJobContext = XxlJobContext.getXxlJobContext();
//String jobParam = xxlJobContext.getJobParam();
//获取模版列表 - 从缓存中拿 - 修改模版或者新增模版的时候 删除缓存 todo 这里后面改成从缓存获取数据
List<LogFormRuleVO> list = logFormService.getLogFormRuleList();
if (list.isEmpty()) {
return ReturnT.SUCCESS;
}
// -- 要判断当前规则 是不是已经统计过了
Date thisDate = new Date();
String thisTime = DateUtils.dateFormat(thisDate, DateUtils.FORMAT_YEAR_MONTH_DAY);
//获取模版列表
List<Long> formIds = list.stream().map(LogFormRuleVO::getFormDO).map(LogFormDO::getId).collect(Collectors.toList());
List<LogStatisticsRecordDO> statisticsRecordDOS = logStatisticsRecordService.getByFormIdsAndTime(formIds, thisTime);
Map<Long, LogStatisticsRecordDO> map = statisticsRecordDOS.stream().collect(Collectors.toMap(LogStatisticsRecordDO::getFormId, v -> v, (k1, k2) -> k1));
// -- 需要插入到统计中为提交 日志的记录
List<LogStatisticsDO> statisticsDOS = new ArrayList<>();
List<LogStatisticsRecordDO> saveRecordDO = new ArrayList<>();
for (LogFormRuleVO item : list) {
//拿到模版规则
LogRuleDO logRuleDO = item.getRuleDO();
LogFormDO logFormDO = item.getFormDO();
if (logFormDO == null || logRuleDO == null) {
continue;
}
if (logRuleDO.getType() == 1) {
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)) || thisDate.getTime() < DateUtils.buildHHmmTime(logRuleDO.getStatisticalTime()).getTime()) {
continue;
}
// -- 统计时间到了 - 判断是否已经统计过了 - 只需要统计谁没有提交就行 - 把没提交的记录插入到统计表中 - 其他的在新增日志里面就插入到统计表即可
this.unSubmittedRecord(statisticsDOS, saveRecordDO, map, logFormDO, thisTime, logRuleDO);
} else if (logRuleDO.getType() == 2) {
Date statisticalTime = DateUtils.buildWeekHHmmTime(logRuleDO.getStatisticalTime());
// -- 还没有到统计的时间 - 跳出循环
if (thisDate.getTime() < statisticalTime.getTime()) {
continue;
}
this.unSubmittedRecord(statisticsDOS, saveRecordDO, map, logFormDO, thisTime, logRuleDO);
}
}
if (!statisticsDOS.isEmpty()) {
logStatisticsMapper.insertBatch(statisticsDOS);
}
if (!saveRecordDO.isEmpty()) {
logStatisticsRecordMapper.insertBatch(saveRecordDO);
}
// 返回执行成功
return ReturnT.SUCCESS;
}
public void unSubmittedRecord(List<LogStatisticsDO> statisticsDOS, List<LogStatisticsRecordDO> saveRecordDO, Map<Long, LogStatisticsRecordDO> map, LogFormDO logFormDO, String thisTime,
LogRuleDO logRuleDO) {
// -- 统计时间到了 - 判断是否已经统计过了 - 只需要统计谁没有提交就行 - 把没提交的记录插入到统计表中 - 其他的在新增日志里面就插入到统计表即可
LogStatisticsRecordDO logStatisticsRecordDO = map.get(logFormDO.getId());
if (logStatisticsRecordDO == null || logStatisticsRecordDO.getStatisticsFlag() == 0) {
List<AdminUserDO> users = logStatisticsService.getUnSubmittedUser(logFormDO.getId(), thisTime);
for (AdminUserDO user : users) {
LogStatisticsDO logStatisticsDO = new LogStatisticsDO();
logStatisticsDO.setUserId(user.getId());
logStatisticsDO.setFormId(logFormDO.getId());
logStatisticsDO.setRuleId(logRuleDO.getId());
logStatisticsDO.setDeptId(user.getDeptId());
logStatisticsDO.setType(logRuleDO.getType());
logStatisticsDO.setStatus(3);
logStatisticsDO.setTime(thisTime);
statisticsDOS.add(logStatisticsDO);
}
// -- 记录当前以统计
saveRecordDO.add(new LogStatisticsRecordDO().setFormId(logFormDO.getId())
.setRuleId(logRuleDO.getId()).setTime(thisTime).setStatisticsFlag(1));
}
}
}

View File

@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.form.LogFormCreateReqVO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.form.LogFormPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.form.LogFormRuleVO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.form.LogFormUpdateReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogFormDO;
@ -89,4 +90,11 @@ public interface LogFormService {
* @return 动态表单分页
*/
PageResult<LogFormDO> getFormPageByRule(LogFormPageReqVO pageReqVO);
/**
* 获取考勤规则和模版列表
*
* @return
*/
List<LogFormRuleVO> getLogFormRuleList();
}

View File

@ -1,21 +1,26 @@
package cn.iocoder.yudao.module.system.service.worklog;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Assert;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.form.LogFormCreateReqVO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.form.LogFormPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.form.LogFormRuleVO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.form.LogFormUpdateReqVO;
import cn.iocoder.yudao.module.system.convert.worklog.LogFormConvert;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogFormDO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogRuleDO;
import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogFormMapper;
import cn.iocoder.yudao.module.system.enums.ErrorCodeConstants;
import cn.iocoder.yudao.module.system.service.worklog.dto.LogFormFieldRespDTO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@ -26,10 +31,12 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU
*/
@Service
@Validated
public class LogFormServiceImpl implements LogFormService{
public class LogFormServiceImpl implements LogFormService {
@Resource
private LogFormMapper formMapper;
@Resource
private LogRuleService logRuleService;
@Override
public Long createForm(LogFormCreateReqVO createReqVO) {
@ -90,6 +97,30 @@ public class LogFormServiceImpl implements LogFormService{
return formMapper.selectPageByRule(pageReqVO);
}
@Override
public List<LogFormRuleVO> getLogFormRuleList() {
//查询模版
List<LogFormDO> formList = formMapper.selectList(new LambdaQueryWrapper<LogFormDO>()
.eq(LogFormDO::getStatus, 1)
.isNotNull(LogFormDO::getRuleId)
);
List<Long> ruleIds = formList.stream().map(LogFormDO::getRuleId).collect(Collectors.toList());
List<LogRuleDO> logRuleDOS = new ArrayList<>();
Map<Long, LogRuleDO> ruleMap = new HashMap<>();
if (CollectionUtil.isNotEmpty(ruleIds)) {
logRuleDOS = logRuleService.getLogRuleByIds(ruleIds);
ruleMap = logRuleDOS.stream().collect(Collectors.toMap(LogRuleDO::getId, v -> v));
}
List<LogFormRuleVO> list = new ArrayList<>();
for (LogFormDO logFormDO : formList) {
LogFormRuleVO vo = new LogFormRuleVO();
vo.setFormDO(logFormDO);
vo.setRuleDO(ruleMap.get(logFormDO.getRuleId()));
list.add(vo);
}
return list;
}
/**
* 校验 Field避免 field 重复
*

View File

@ -7,6 +7,8 @@ import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.Lo
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogInstanceDO;
import javax.validation.Valid;
import java.util.Date;
import java.util.List;
/**
* 日志实例的拓展 Service 接口
@ -56,9 +58,35 @@ public interface LogInstanceService {
/**
* 获得我的日志的分页
*
* @param userId 用户编号
* @param userId 用户编号
* @param pageReqVO 分页请求
* @return 流程实例的分页
*/
PageResult<LogInstanceRespVO> getMyProcessInstancePage(Long userId, LogInstancePageReqVO pageReqVO);
/**
* 获取我管理的日志列表(时间区间)
*
* @return
*/
List<LogInstanceDO> myManageLogInstanceByTimeRange(Long formId, Integer type, Date thisDate);
/**
* 获取我管理的日志列表(时间区间)
*
* @param fromId
* @param beginTime
* @param endTime
* @return
*/
List<LogInstanceDO> myManageLogInstanceByTimeRange(Long fromId, Date beginTime, Date endTime);
// /**
// * 获取我需要填写的日志
// *
// * @param fromId
// * @param userId
// * @return
// */
// List<LogInstanceDO> getNeedWriteLogInstanceByTimeRange(Long fromId, List<String> time, Long userId);
}

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.system.service.worklog;
import cn.hutool.core.date.DateUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstancePageReqVO;
@ -14,10 +15,12 @@ import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogInstanceMapper;
import cn.iocoder.yudao.module.system.service.dict.DictDataService;
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 org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@ -132,4 +135,23 @@ public class LogInstanceServiceImpl implements LogInstanceService {
return LogInstanceConvert.INSTANCE.convertPage(logInstanceMapper.selectMyPage(userId, pageReqVO));
}
@Override
public List<LogInstanceDO> myManageLogInstanceByTimeRange(Long fromId, Integer type, Date thisDate) {
Date beginTime = type == 1 ? DateUtil.beginOfDay(thisDate) : DateUtil.beginOfWeek(thisDate);
Date endTime = type == 1 ? DateUtil.endOfDay(thisDate) : DateUtil.endOfWeek(thisDate);
return logInstanceMapper.myManageLogInstanceByTimeRange(fromId, beginTime, endTime);
}
@Override
public List<LogInstanceDO> myManageLogInstanceByTimeRange(Long fromId, Date beginTime, Date endTime) {
return logInstanceMapper.myManageLogInstanceByTimeRange(fromId, beginTime, endTime);
}
// @Override
// public List<LogInstanceDO> getNeedWriteLogInstanceByTimeRange(Long fromId, List<String> time, Long userId) {
// return logInstanceMapper.selectList(new LambdaQueryWrapper<LogInstanceDO>()
// .eq(LogInstanceDO::getFormId,fromId)
// .in(LogInstanceDO::get))
// }
}

View File

@ -60,4 +60,12 @@ public interface LogRuleService {
* @return
*/
List<LogRuleDO> getLogRuleByIds(List<Long> ruleIds);
/**
* 通过模版id获取规则
*
* @param formId
* @return
*/
LogRuleDO getLogRuleByFormId(Long formId);
}

View File

@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.rule.LogRulePa
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.rule.LogRuleSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogRuleDO;
import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogRuleMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
@ -74,4 +75,10 @@ public class LogRuleServiceImpl implements LogRuleService {
return logRuleMapper.selectBatchIds(ruleIds);
}
@Override
public LogRuleDO getLogRuleByFormId(Long formId) {
return logRuleMapper.selectOne(new LambdaQueryWrapper<LogRuleDO>()
.eq(LogRuleDO::getFormId, formId));
}
}

View File

@ -0,0 +1,64 @@
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.vo.statisticsrecord.LogStatisticsRecordPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statisticsrecord.LogStatisticsRecordSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogStatisticsRecordDO;
import javax.validation.Valid;
import java.util.List;
/**
* 工作日志统计记录 Service 接口
*
* @author 艾楷
*/
public interface LogStatisticsRecordService {
/**
* 创建工作日志统计记录
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createLogStatisticsRecord(@Valid LogStatisticsRecordSaveReqVO createReqVO);
/**
* 更新工作日志统计记录
*
* @param updateReqVO 更新信息
*/
void updateLogStatisticsRecord(@Valid LogStatisticsRecordSaveReqVO updateReqVO);
/**
* 删除工作日志统计记录
*
* @param id 编号
*/
void deleteLogStatisticsRecord(Long id);
/**
* 获得工作日志统计记录
*
* @param id 编号
* @return 工作日志统计记录
*/
LogStatisticsRecordDO getLogStatisticsRecord(Long id);
/**
* 获得工作日志统计记录分页
*
* @param pageReqVO 分页查询
* @return 工作日志统计记录分页
*/
PageResult<LogStatisticsRecordDO> getLogStatisticsRecordPage(LogStatisticsRecordPageReqVO pageReqVO);
/**
* 获取统计记录
*
* @param formIds
* @param thisTime
* @return
*/
List<LogStatisticsRecordDO> getByFormIdsAndTime(List<Long> formIds, String thisTime);
}

View File

@ -0,0 +1,67 @@
package cn.iocoder.yudao.module.system.service.worklog;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statisticsrecord.LogStatisticsRecordPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statisticsrecord.LogStatisticsRecordSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogStatisticsRecordDO;
import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogStatisticsRecordMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.List;
/**
* 工作日志统计记录 Service 实现类
*
* @author 艾楷
*/
@Service
@Validated
public class LogStatisticsRecordServiceImpl implements LogStatisticsRecordService {
@Resource
private LogStatisticsRecordMapper logStatisticsRecordMapper;
@Override
public Long createLogStatisticsRecord(LogStatisticsRecordSaveReqVO createReqVO) {
// 插入
LogStatisticsRecordDO logStatisticsRecord = BeanUtils.toBean(createReqVO, LogStatisticsRecordDO.class);
logStatisticsRecordMapper.insert(logStatisticsRecord);
// 返回
return logStatisticsRecord.getId();
}
@Override
public void updateLogStatisticsRecord(LogStatisticsRecordSaveReqVO updateReqVO) {
// 更新
LogStatisticsRecordDO updateObj = BeanUtils.toBean(updateReqVO, LogStatisticsRecordDO.class);
logStatisticsRecordMapper.updateById(updateObj);
}
@Override
public void deleteLogStatisticsRecord(Long id) {
// 删除
logStatisticsRecordMapper.deleteById(id);
}
@Override
public LogStatisticsRecordDO getLogStatisticsRecord(Long id) {
return logStatisticsRecordMapper.selectById(id);
}
@Override
public PageResult<LogStatisticsRecordDO> getLogStatisticsRecordPage(LogStatisticsRecordPageReqVO pageReqVO) {
return logStatisticsRecordMapper.selectPage(pageReqVO);
}
@Override
public List<LogStatisticsRecordDO> getByFormIdsAndTime(List<Long> formIds, String thisTime) {
return logStatisticsRecordMapper.selectList(new LambdaQueryWrapper<LogStatisticsRecordDO>()
.in(LogStatisticsRecordDO::getFormId, formIds)
.eq(LogStatisticsRecordDO::getTime, thisTime));
}
}

View File

@ -0,0 +1,84 @@
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.vo.statistics.LogStatisticsDetailsListVO;
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.controller.admin.worklog.vo.statistics.LogStatisticsSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogStatisticsDO;
import javax.validation.Valid;
import java.util.List;
public interface LogStatisticsService {
/**
* 创建工作日志统计
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createLogStatistics(@Valid LogStatisticsSaveReqVO createReqVO);
/**
* 更新工作日志统计
*
* @param updateReqVO 更新信息
*/
void updateLogStatistics(@Valid LogStatisticsSaveReqVO updateReqVO);
/**
* 删除工作日志统计
*
* @param id 编号
*/
void deleteLogStatistics(Long id);
/**
* 获得工作日志统计
*
* @param id 编号
* @return 工作日志统计
*/
LogStatisticsDO getLogStatistics(Long id);
/**
* 获得工作日志统计分页
*
* @param pageReqVO 分页查询
* @return 工作日志统计分页
*/
PageResult<LogStatisticsDO> getLogStatisticsPage(LogStatisticsPageReqVO pageReqVO);
/**
* 我管理的工作日志统计模版
*
* @return
*/
List<LogStatisticsModelVO> myManageModel();
/**
* 获取未提交用户
*
* @param formId
* @param thisTime
* @return
*/
List<AdminUserDO> getUnSubmittedUser(Long formId, String thisTime);
/**
* 获取统计信息
*
* @param dto
* @return
*/
LogStatisticsDetailsListVO getStatistics(LogStatisticsDetailsListDTO dto);
// /**
// * 获取我填写的
// *
// * @return
// */
// List<LogStatisticsModelVO> getNeedWrite();
}

View File

@ -0,0 +1,283 @@
package cn.iocoder.yudao.module.system.service.worklog;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
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.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.vo.statistics.*;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.*;
import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogFormMapper;
import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogStatisticsMapper;
import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogUseMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.time.ZoneId;
import java.util.*;
import java.util.stream.Collectors;
/**
* 工作日志统计 Service 实现类
*
* @author 艾楷
*/
@Service
@Validated
public class LogStatisticsServiceImpl implements LogStatisticsService {
@Resource
private LogFormMapper logFormMapper;
@Resource
private LogInstanceService logInstanceService;
@Resource
private LogRuleService logRuleService;
@Resource
private LogUseMapper logUseMapper;
@Resource
private LogStatisticsMapper logStatisticsMapper;
@Override
public Long createLogStatistics(LogStatisticsSaveReqVO createReqVO) {
// 插入
LogStatisticsDO logStatistics = BeanUtils.toBean(createReqVO, LogStatisticsDO.class);
logStatisticsMapper.insert(logStatistics);
// 返回
return logStatistics.getId();
}
@Override
public void updateLogStatistics(LogStatisticsSaveReqVO updateReqVO) {
// 更新
LogStatisticsDO updateObj = BeanUtils.toBean(updateReqVO, LogStatisticsDO.class);
logStatisticsMapper.updateById(updateObj);
}
@Override
public void deleteLogStatistics(Long id) {
// 删除
logStatisticsMapper.deleteById(id);
}
@Override
public LogStatisticsDO getLogStatistics(Long id) {
return logStatisticsMapper.selectById(id);
}
@Override
public PageResult<LogStatisticsDO> getLogStatisticsPage(LogStatisticsPageReqVO pageReqVO) {
return logStatisticsMapper.selectPage(pageReqVO);
}
@Override
public List<LogStatisticsModelVO> myManageModel() {
List<LogStatisticsModelVO> list = new ArrayList<>();
//获取模版ids - 当前登录用户的数据权限 查看日志模板使用者表
List<Long> formIds = logUseMapper.getFormIdsByDataPermission(null);
if (formIds.isEmpty()) {
return Collections.emptyList();
}
List<LogFormDO> formList = new ArrayList<>();
Map<Long, LogRuleDO> ruleMap = new HashMap<>();
this.getFormAndRule(formIds, formList, ruleMap);
Date thisDate = new Date();
Date beginDate = DateUtil.beginOfDay(thisDate);
Date beginWeek = DateUtil.beginOfWeek(thisDate);
for (LogFormDO logFormDO : formList) {
//拿到模版规则
LogRuleDO logRuleDO = ruleMap.get(logFormDO.getRuleId());
//判断当前模版是什么类型 - 然后再做统计
//查询日志实例表 关联日志模版使用者作为数据权限过滤
List<LogInstanceDO> instanceDOS = logInstanceService.myManageLogInstanceByTimeRange(logFormDO.getId(), logRuleDO.getType(), thisDate);
LogStatisticsModelVO vo = new LogStatisticsModelVO();
BeanUtil.copyProperties(logFormDO, vo);
//查询下应该提交多少日志实例 - 直接通过模版id查询使用表
Integer num = Math.toIntExact(logUseMapper.selectCount(new LambdaQueryWrapper<LogUseDO>()
.eq(LogUseDO::getFormId, logFormDO.getId())));
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))) {
// -- 拼接获取到结束时间
Date endTime = DateUtils.buildHHmmTime(logRuleDO.getEndTime());
Date statisticalTime = DateUtils.buildHHmmTime(logRuleDO.getStatisticalTime());
//按时提交数量
Integer onTimeNum = Math.toIntExact(instanceDOS.stream().filter(a -> DateUtil.isIn(Date.from(a.getCreateTime().atZone(ZoneId.systemDefault()).toInstant()), beginDate, endTime)).count());
//迟交数量
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;
//按天统计
vo.setOnTimeNum(onTimeNum);
vo.setUnSubmittedNum(unSubmittedNum);
vo.setLateNum(lateNum);
vo.setCommitTimeRange("当天" + logRuleDO.getEndTime() + "截止提交");
} else {
vo.setCommitTimeRange("当天不需要提交");
}
} else if (logRuleDO.getType() == 2) {
// -- 拼接获取到结束时间
Date endTime = DateUtils.buildWeekHHmmTime(logRuleDO.getEndTime());
Date statisticalTime = DateUtils.buildWeekHHmmTime(logRuleDO.getStatisticalTime());
//按时提交数量
Integer onTimeNum = Math.toIntExact(instanceDOS.stream().filter(a -> DateUtil.isIn(Date.from(a.getCreateTime().atZone(ZoneId.systemDefault()).toInstant()), beginWeek, endTime)).count());
//迟交数量
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;
//按天统计
vo.setOnTimeNum(onTimeNum);
vo.setUnSubmittedNum(unSubmittedNum);
vo.setLateNum(lateNum);
vo.setCommitTimeRange("每周" + DateUtil.dayOfWeekEnum(endTime).toChinese() + (logRuleDO.getEndTime().split(",")[1]) + "截止提交");
}
list.add(vo);
}
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);
}
@Override
public LogStatisticsDetailsListVO getStatistics(LogStatisticsDetailsListDTO dto) {
LogStatisticsDetailsListVO vo = new LogStatisticsDetailsListVO();
// 获取规则
LogRuleDO logRuleDO = logRuleService.getLogRuleByFormId(dto.getFormId());
// 判断开始时间是否当天 / 是否本周
boolean flag = false;
Date begin = DateUtil.parse(dto.getBeginTime(), "yyyy-MM-dd").toJdkDate();
List<LogStatisticsDetailsVO> logStatisticsDOS = new ArrayList<>();
if (logRuleDO.getType() == 1) {
flag = DateUtil.isSameDay(begin, new Date());
} else if (logRuleDO.getType() == 2) {
flag = DateUtil.isSameWeek(begin, new Date(), true);
}
List<String> dateList = DateUtils.betweenDayStrList(dto.getBeginTime(), dto.getEndTime());
// 这里将区间转换为具体的日期 因为mysql BETWEEN 会导致索引失效
if (flag) {
logStatisticsDOS = logStatisticsMapper.getCurrentStatistics(dto.getFormId(), dateList);
} else {
logStatisticsDOS = logStatisticsMapper.getStatistics(dateList, dto.getFormId());
}
List<LogStatisticsDetailsVO> onTime = logStatisticsDOS.stream().filter(a -> a.getStatus() == 1).collect(Collectors.toList());
List<LogStatisticsDetailsVO> late = logStatisticsDOS.stream().filter(a -> a.getStatus() == 2).collect(Collectors.toList());
List<LogStatisticsDetailsVO> unSubmitted = logStatisticsDOS.stream().filter(a -> a.getStatus() == 3).collect(Collectors.toList());
vo.setOnTime(onTime);
vo.setLate(late);
vo.setUnSubmitted(unSubmitted);
return vo;
}
// @Override
// public List<LogStatisticsModelVO> getNeedWrite() {
// List<LogStatisticsModelVO> list = new ArrayList<>();
// Long userId = WebFrameworkUtils.getLoginUserId();
// //获取模版ids - 当前登录用户的数据权限 查看日志模板使用者表
// List<Long> formIds = logUseMapper.getFormIdsByDataPermission(userId);
// if (formIds.isEmpty()) {
// return Collections.emptyList();
// }
// //获取模版和规则
// List<LogFormDO> formList = new ArrayList<>();
// Map<Long, LogRuleDO> ruleMap = new HashMap<>();
// this.getFormAndRule(formIds, formList, ruleMap);
//
// // TODO: 2024/4/14 待完善
//
// Date thisDate = new Date();
// Date beginDate = DateUtil.beginOfDay(thisDate);
// Date beginWeek = DateUtil.beginOfWeek(thisDate);
// for (LogFormDO logFormDO : formList) {
// //拿到模版规则
// LogRuleDO logRuleDO = ruleMap.get(logFormDO.getRuleId());
// //判断当前模版是什么类型 - 然后再做统计
// //查询日志实例表 关联日志模版使用者作为数据权限过滤
// //List<LogInstanceDO> instanceDOS = logInstanceService.myManageLogInstanceByTimeRange(logFormDO.getId(), logRuleDO.getType(), thisDate);
// LogStatisticsModelVO vo = new LogStatisticsModelVO();
// BeanUtil.copyProperties(logFormDO, vo);
// //查询下应该提交多少日志实例 - 直接通过模版id查询使用表
//// Integer num = Math.toIntExact(logUseMapper.selectCount(new LambdaQueryWrapper<LogUseDO>()
//// .eq(LogUseDO::getFormId, logFormDO.getId())));
// 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))) {
// // -- 拼接获取到结束时间
// Date endTime = DateUtils.buildHHmmTime(logRuleDO.getEndTime());
// Date statisticalTime = DateUtils.buildHHmmTime(logRuleDO.getStatisticalTime());
// List<LogInstanceDO> instanceDOS = logInstanceService.getNeedWriteLogInstanceByTimeRange(logFormDO.getId(), logRuleDO.getType(), userId);
// //按时提交数量
// Integer onTimeNum = Math.toIntExact(instanceDOS.stream().filter(a -> DateUtil.isIn(Date.from(a.getCreateTime().atZone(ZoneId.systemDefault()).toInstant()), beginDate, endTime)).count());
// //迟交数量
// 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;
// //按天统计
// vo.setOnTimeNum(onTimeNum);
// vo.setUnSubmittedNum(unSubmittedNum);
// vo.setLateNum(lateNum);
// vo.setCommitTimeRange("当天" + logRuleDO.getEndTime() + "截止提交");
// } else {
// vo.setCommitTimeRange("当天不需要提交");
// }
// } else if (logRuleDO.getType() == 2) {
// // -- 拼接获取到结束时间
// Date endTime = DateUtils.buildWeekHHmmTime(logRuleDO.getEndTime());
// Date statisticalTime = DateUtils.buildWeekHHmmTime(logRuleDO.getStatisticalTime());
// //按时提交数量
// Integer onTimeNum = Math.toIntExact(instanceDOS.stream().filter(a -> DateUtil.isIn(Date.from(a.getCreateTime().atZone(ZoneId.systemDefault()).toInstant()), beginWeek, endTime)).count());
// //迟交数量
// 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;
// //按天统计
// vo.setOnTimeNum(onTimeNum);
// vo.setUnSubmittedNum(unSubmittedNum);
// vo.setLateNum(lateNum);
// vo.setCommitTimeRange("每周" + DateUtil.dayOfWeekEnum(endTime).toChinese() + (logRuleDO.getEndTime().split(",")[1]) + "截止提交");
// }
// list.add(vo);
// }
// return null;
// }
}

View File

@ -1,17 +0,0 @@
package cn.iocoder.yudao.module.system.service.worklog;
import cn.iocoder.yudao.module.system.controller.admin.worklog.dto.statistics.WorkLogStatisticsModelDTO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.WorkLogStatisticsModelVO;
import java.util.List;
public interface WorkLogStatisticsService {
/**
* 我管理的工作日志统计模版
*
* @param dto
* @return
*/
List<WorkLogStatisticsModelVO> myManageModel(WorkLogStatisticsModelDTO dto);
}

View File

@ -1,62 +0,0 @@
package cn.iocoder.yudao.module.system.service.worklog;
import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.module.system.controller.admin.worklog.dto.statistics.WorkLogStatisticsModelDTO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.WorkLogStatisticsModelVO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogFormDO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogRuleDO;
import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogFormMapper;
import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogUseMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
* 工作日志统计 Service 实现类
*
* @author 艾楷
*/
@Service
@Validated
public class WorkLogStatisticsServiceImpl implements WorkLogStatisticsService {
@Resource
private LogFormMapper logFormMapper;
@Resource
private LogRuleService logRuleService;
@Resource
private LogUseMapper logUseMapper;
@Override
public List<WorkLogStatisticsModelVO> myManageModel(WorkLogStatisticsModelDTO dto) {
//获取模版ids - 当前登录用户的数据权限 查看日志模板使用者表
// TODO: 2024/4/12 这里要测试下 数据权限问题
List<Long> formIds = logUseMapper.getFormIdsByDataPermission();
if (!formIds.isEmpty()) {
return Collections.emptyList();
}
List<LogFormDO> 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<>();
Map<Long, LogRuleDO> ruleMap = new HashMap<>();
if (CollectionUtil.isNotEmpty(ruleIds)) {
logRuleDOS = logRuleService.getLogRuleByIds(ruleIds);
ruleMap = logRuleDOS.stream().collect(Collectors.toMap(LogRuleDO::getId, v -> v));
}
for (LogFormDO logFormDO : formList) {
LogRuleDO logRuleDO = ruleMap.get(logFormDO.getRuleId());
//统计谁
}
return null;
}
}

View File

@ -26,6 +26,7 @@
b.name as workLogName,
b.form_variables AS workLogContent,
b.form_id as workFormId,
b.create_time as workLogTime,
</if>
a.create_time AS createTime
FROM work_log_comment AS a

View File

@ -82,6 +82,26 @@
or ( result.dept_id = #{deptId} and result.data_scope = 3 )
or result.data_scope = 1
</select>
<select id="myManageLogInstanceByTimeRange"
resultType="cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogInstanceDO">
SELECT
a.*
FROM
work_log_instance_ext AS a
LEFT JOIN work_log_form AS b ON a.form_id = b.id
LEFT JOIN work_log_use AS d ON b.rule_id = d.id AND d.id > 0
<where>
<if test="fromId != null">
and a.form_id = #{fromId}
</if>
<if test="beginTime != null">
and a.create_time &gt;= #{beginTime}
</if>
<if test="endTime != null">
and a.create_time &lt;= #{endTime}
</if>
</where>
</select>
<insert id="insertRead">

View File

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.system.dal.mysql.worklog.LogStatisticsMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
<select id="getUnSubmittedUser"
resultType="cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO">
SELECT a.id,
a.dept_id
FROM system_users AS a
LEFT JOIN work_log_use AS b ON a.id = b.use_user_id
WHERE b.form_id = #{formId}
AND not EXISTS (SELECT id
FROM work_log_instance_ext
WHERE form_id = b.form_id
AND start_user_id = a.id
AND time = #{thisTime})
</select>
<select id="getStatistics"
resultType="cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.LogStatisticsDetailsVO">
SELECT
a.id AS userId,
a.nickname AS nickname,
a.avatar AS avatar,
a.dept_id AS deptId,
c.`name` AS deptName,
b.log_instance_ext_id AS logInstanceExtId,
b.`status` AS `status`,
d.create_time AS createTime
FROM
system_users AS a
LEFT JOIN work_log_statistics AS b ON a.id = b.user_id
LEFT JOIN system_dept AS c ON a.dept_id = c.id
LEFT JOIN work_log_instance_ext AS d ON b.log_instance_ext_id = d.id
<where>
<if test="formId != null">
AND b.form_id = #{formId}
</if>
<if test="dateList != null and dateList.size() > 0">
AND b.time IN
<foreach collection="dateList" item="date" open="(" separator="," close=")">
#{date}
</foreach>
</if>
</where>
</select>
<select id="getCurrentStatistics"
resultType="cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.LogStatisticsDetailsVO">
SELECT
a.id AS userId,
a.nickname AS nickname,
a.avatar AS avatar,
a.dept_id AS deptId,
c.`name` AS deptName,
IFNULL(d.`status`,3) AS status,
d.id AS logInstanceExtId,
d.create_time AS createTime
FROM
system_users AS a
LEFT JOIN work_log_use AS b ON a.id = b.use_user_id
LEFT JOIN system_dept AS c ON a.dept_id = c.id
LEFT JOIN ( SELECT
user_id, `status`, create_time, id
FROM work_log_statistics
WHERE
form_id = #{formId}
<if test="dateList != null and dateList.size() > 0">
AND b.time IN
<foreach collection="dateList" item="date" open="(" separator="," close=")">
#{date}
</foreach>
</if>) AS d ON d.user_id = b.use_user_id
<where>
b.deleted = 0
</where>
</select>
</mapper>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.system.dal.mysql.worklog.LogStatisticsRecordMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>

View File

@ -14,5 +14,10 @@
select
DISTINCT form_id
from work_log_use
<where>
<if test="userId != null">
use_user_id = #{userId}
</if>
</where>
</select>
</mapper>