日志统计
This commit is contained in:
parent
7ede50975a
commit
746db0efbb
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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"
|
||||
);
|
||||
|
||||
/**
|
||||
|
@ -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);
|
||||
// }
|
||||
|
||||
}
|
@ -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);
|
||||
// }
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
}
|
@ -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;
|
||||
|
||||
}
|
@ -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;
|
||||
|
||||
}
|
@ -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 {
|
||||
|
||||
|
||||
}
|
@ -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;
|
||||
|
||||
}
|
@ -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;
|
||||
|
||||
}
|
@ -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;
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 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;
|
||||
|
||||
}
|
@ -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") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 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;
|
||||
|
||||
}
|
@ -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> {
|
||||
|
||||
|
@ -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);
|
||||
}
|
@ -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);
|
||||
}
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
@ -18,5 +18,5 @@ public interface LogUseMapper extends BaseMapperX<LogUseDO> {
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
List<Long> getFormIdsByDataPermission();
|
||||
List<Long> getFormIdsByDataPermission(Long userId);
|
||||
}
|
@ -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");
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
|
@ -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 重复
|
||||
*
|
||||
|
@ -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);
|
||||
}
|
@ -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))
|
||||
// }
|
||||
}
|
@ -60,4 +60,12 @@ public interface LogRuleService {
|
||||
* @return
|
||||
*/
|
||||
List<LogRuleDO> getLogRuleByIds(List<Long> ruleIds);
|
||||
|
||||
/**
|
||||
* 通过模版id获取规则
|
||||
*
|
||||
* @param formId
|
||||
* @return
|
||||
*/
|
||||
LogRuleDO getLogRuleByFormId(Long formId);
|
||||
}
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
@ -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);
|
||||
}
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
@ -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();
|
||||
}
|
@ -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;
|
||||
// }
|
||||
}
|
@ -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);
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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
|
||||
|
@ -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 >= #{beginTime}
|
||||
</if>
|
||||
<if test="endTime != null">
|
||||
and a.create_time <= #{endTime}
|
||||
</if>
|
||||
</where>
|
||||
</select>
|
||||
|
||||
<insert id="insertRead">
|
||||
|
||||
|
@ -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>
|
@ -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>
|
@ -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>
|
Loading…
Reference in New Issue
Block a user