From aa20705f2d1f1446a3a3a69b7f718d1971f1d454 Mon Sep 17 00:00:00 2001 From: Echo <4759156@qq.com> Date: Wed, 10 Apr 2024 10:21:52 +0800 Subject: [PATCH 01/50] =?UTF-8?q?=E5=88=A0=E9=99=A4idea?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 8 -------- .idea/cloud-server.iml | 9 --------- .idea/misc.xml | 6 ------ .idea/modules.xml | 8 -------- .idea/vcs.xml | 6 ------ 5 files changed, 37 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/cloud-server.iml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b81..00000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/cloud-server.iml b/.idea/cloud-server.iml deleted file mode 100644 index d6ebd480..00000000 --- a/.idea/cloud-server.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 1c2e834b..00000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 06a647e6..00000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1ddf..00000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From da0dcda2fe683c3267f765e63b92703236711e08 Mon Sep 17 00:00:00 2001 From: aikai Date: Wed, 10 Apr 2024 11:19:57 +0800 Subject: [PATCH 02/50] =?UTF-8?q?=E8=80=83=E5=8B=A4=E8=A1=A8=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=94=9F=E6=88=90=20/=20=E8=8E=B7=E5=8F=96=E8=80=83?= =?UTF-8?q?=E5=8B=A4=E6=89=93=E5=8D=A1=E9=A1=B5=E9=9D=A2=EF=BC=88=E9=83=A8?= =?UTF-8?q?=E5=88=86=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/enums/ErrorCodeConstants.java | 7 ++ .../fixed/AttendanceFixedController.java | 95 +++++++++++++++++++ .../fixed/vo/AttendanceFixedPageReqVO.java | 32 +++++++ .../admin/fixed/vo/AttendanceFixedRespVO.java | 36 +++++++ .../fixed/vo/AttendanceFixedSaveReqVO.java | 25 +++++ .../group/AttendanceGroupController.java | 95 +++++++++++++++++++ .../group/vo/AttendanceGroupPageReqVO.java | 49 ++++++++++ .../admin/group/vo/AttendanceGroupRespVO.java | 60 ++++++++++++ .../group/vo/AttendanceGroupSaveReqVO.java | 44 +++++++++ .../AttendanceGroupShiftController.java | 95 +++++++++++++++++++ .../vo/AttendanceGroupShiftPageReqVO.java | 31 ++++++ .../vo/AttendanceGroupShiftRespVO.java | 36 +++++++ .../vo/AttendanceGroupShiftSaveReqVO.java | 25 +++++ .../AttendanceGroupUserController.java | 95 +++++++++++++++++++ .../vo/AttendanceGroupUserPageReqVO.java | 28 ++++++ .../vo/AttendanceGroupUserRespVO.java | 32 +++++++ .../vo/AttendanceGroupUserSaveReqVO.java | 22 +++++ .../AttendancePunchRecordController.java | 95 +++++++++++++++++++ .../vo/AttendancePunchRecordPageReqVO.java | 57 +++++++++++ .../vo/AttendancePunchRecordRespVO.java | 68 +++++++++++++ .../vo/AttendancePunchRecordSaveReqVO.java | 51 ++++++++++ .../AttendanceSchedulingController.java | 95 +++++++++++++++++++ .../vo/AttendanceSchedulingPageReqVO.java | 34 +++++++ .../vo/AttendanceSchedulingRespVO.java | 40 ++++++++ .../vo/AttendanceSchedulingSaveReqVO.java | 28 ++++++ .../app/attendance/AttendanceController.java | 41 ++++++++ .../dto/AttendancePunchPageDTO.java | 20 ++++ .../attendance/vo/AttendancePunchPageVO.java | 9 ++ .../dataobject/fixed/AttendanceFixedDO.java | 43 +++++++++ .../dataobject/group/AttendanceGroupDO.java | 75 +++++++++++++++ .../groupshift/AttendanceGroupShiftDO.java | 43 +++++++++ .../groupuser/AttendanceGroupUserDO.java | 39 ++++++++ .../punchrecord/AttendancePunchRecordDO.java | 76 +++++++++++++++ .../scheduling/AttendanceSchedulingDO.java | 47 +++++++++ .../mysql/fixed/AttendanceFixedMapper.java | 29 ++++++ .../mysql/group/AttendanceGroupMapper.java | 42 ++++++++ .../AttendanceGroupShiftMapper.java | 29 ++++++ .../groupuser/AttendanceGroupUserMapper.java | 28 ++++++ .../AttendancePunchRecordMapper.java | 37 ++++++++ .../AttendanceSchedulingMapper.java | 30 ++++++ .../module/system/handler/PunchHandler.java | 27 ++++++ .../service/attendance/AttendanceService.java | 15 +++ .../attendance/AttendanceServiceImpl.java | 39 ++++++++ .../service/fixed/AttendanceFixedService.java | 55 +++++++++++ .../fixed/AttendanceFixedServiceImpl.java | 74 +++++++++++++++ .../service/group/AttendanceGroupService.java | 62 ++++++++++++ .../group/AttendanceGroupServiceImpl.java | 82 ++++++++++++++++ .../AttendanceGroupShiftService.java | 55 +++++++++++ .../AttendanceGroupShiftServiceImpl.java | 74 +++++++++++++++ .../groupuser/AttendanceGroupUserService.java | 55 +++++++++++ .../AttendanceGroupUserServiceImpl.java | 74 +++++++++++++++ .../system/service/punch/PunchService.java | 12 +++ .../AttendancePunchRecordService.java | 55 +++++++++++ .../AttendancePunchRecordServiceImpl.java | 74 +++++++++++++++ .../AttendanceSchedulingService.java | 55 +++++++++++ .../AttendanceSchedulingServiceImpl.java | 74 +++++++++++++++ .../mapper/fixed/AttendanceFixedMapper.xml | 12 +++ .../mapper/group/AttendanceGroupMapper.xml | 19 ++++ .../groupshift/AttendanceGroupShiftMapper.xml | 12 +++ .../groupuser/AttendanceGroupUserMapper.xml | 12 +++ .../AttendancePunchRecordMapper.xml | 12 +++ .../scheduling/AttendanceSchedulingMapper.xml | 12 +++ 62 files changed, 2824 insertions(+) create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/fixed/AttendanceFixedController.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/fixed/vo/AttendanceFixedPageReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/fixed/vo/AttendanceFixedRespVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/fixed/vo/AttendanceFixedSaveReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/group/AttendanceGroupController.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/group/vo/AttendanceGroupPageReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/group/vo/AttendanceGroupRespVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/group/vo/AttendanceGroupSaveReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupshift/AttendanceGroupShiftController.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupshift/vo/AttendanceGroupShiftPageReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupshift/vo/AttendanceGroupShiftRespVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupshift/vo/AttendanceGroupShiftSaveReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupuser/AttendanceGroupUserController.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupuser/vo/AttendanceGroupUserPageReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupuser/vo/AttendanceGroupUserRespVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupuser/vo/AttendanceGroupUserSaveReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/punchrecord/AttendancePunchRecordController.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/punchrecord/vo/AttendancePunchRecordPageReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/punchrecord/vo/AttendancePunchRecordRespVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/punchrecord/vo/AttendancePunchRecordSaveReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/scheduling/AttendanceSchedulingController.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/scheduling/vo/AttendanceSchedulingPageReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/scheduling/vo/AttendanceSchedulingRespVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/scheduling/vo/AttendanceSchedulingSaveReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/attendance/AttendanceController.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/attendance/dto/AttendancePunchPageDTO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/attendance/vo/AttendancePunchPageVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/fixed/AttendanceFixedDO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/group/AttendanceGroupDO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/groupshift/AttendanceGroupShiftDO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/groupuser/AttendanceGroupUserDO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/punchrecord/AttendancePunchRecordDO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/scheduling/AttendanceSchedulingDO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/fixed/AttendanceFixedMapper.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/group/AttendanceGroupMapper.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/groupshift/AttendanceGroupShiftMapper.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/groupuser/AttendanceGroupUserMapper.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/punchrecord/AttendancePunchRecordMapper.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/scheduling/AttendanceSchedulingMapper.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/handler/PunchHandler.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/AttendanceService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/AttendanceServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/fixed/AttendanceFixedService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/fixed/AttendanceFixedServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/group/AttendanceGroupService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/group/AttendanceGroupServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/groupshift/AttendanceGroupShiftService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/groupshift/AttendanceGroupShiftServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/groupuser/AttendanceGroupUserService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/groupuser/AttendanceGroupUserServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/punch/PunchService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/punchrecord/AttendancePunchRecordService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/punchrecord/AttendancePunchRecordServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/scheduling/AttendanceSchedulingService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/scheduling/AttendanceSchedulingServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/fixed/AttendanceFixedMapper.xml create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/group/AttendanceGroupMapper.xml create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/groupshift/AttendanceGroupShiftMapper.xml create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/groupuser/AttendanceGroupUserMapper.xml create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/punchrecord/AttendancePunchRecordMapper.xml create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/scheduling/AttendanceSchedulingMapper.xml diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index ef5c3a62..0e7d3fbd 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -171,4 +171,11 @@ public interface ErrorCodeConstants { // ========== 站内信发送 1-002-028-000 ========== ErrorCode NOTIFY_SEND_TEMPLATE_PARAM_MISS = new ErrorCode(1_002_028_000, "模板参数({})缺失"); + // ========== 站内信发送 1-003-001-000 ========== + ErrorCode SCHEDULING_NOT_EXISTS = new ErrorCode(1_003_001_000, "排班制考勤设置不存在"); + ErrorCode PUNCH_RECORD_NOT_EXISTS = new ErrorCode(1_003_002_000, "用户打卡记录不存在"); + ErrorCode GROUP_USER_NOT_EXISTS = new ErrorCode(1_003_003_000, "考勤组人员不存在"); + ErrorCode GROUP_SHIFT_NOT_EXISTS = new ErrorCode(1_003_004_000, "考勤组班次不存在"); + ErrorCode GROUP_NOT_EXISTS = new ErrorCode(1_003_005_000, "考勤组不存在"); + ErrorCode FIXED_NOT_EXISTS = new ErrorCode(1_003_006_000, "固定班制考勤设置"); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/fixed/AttendanceFixedController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/fixed/AttendanceFixedController.java new file mode 100644 index 00000000..0aa9db43 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/fixed/AttendanceFixedController.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.module.system.controller.admin.fixed; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.system.controller.admin.fixed.vo.*; +import cn.iocoder.yudao.module.system.dal.dataobject.fixed.AttendanceFixedDO; +import cn.iocoder.yudao.module.system.service.fixed.AttendanceFixedService; + +@Tag(name = "管理后台 - 固定班制考勤设置") +@RestController +@RequestMapping("/system/attendance/fixed") +@Validated +public class AttendanceFixedController { + + @Resource + private AttendanceFixedService fixedService; + + @PostMapping("/create") + @Operation(summary = "创建固定班制考勤设置") + @PreAuthorize("@ss.hasPermission('attendance:fixed:create')") + public CommonResult createFixed(@Valid @RequestBody AttendanceFixedSaveReqVO createReqVO) { + return success(fixedService.createFixed(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新固定班制考勤设置") + @PreAuthorize("@ss.hasPermission('attendance:fixed:update')") + public CommonResult updateFixed(@Valid @RequestBody AttendanceFixedSaveReqVO updateReqVO) { + fixedService.updateFixed(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除固定班制考勤设置") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('attendance:fixed:delete')") + public CommonResult deleteFixed(@RequestParam("id") Long id) { + fixedService.deleteFixed(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得固定班制考勤设置") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('attendance:fixed:query')") + public CommonResult getFixed(@RequestParam("id") Long id) { + AttendanceFixedDO fixed = fixedService.getFixed(id); + return success(BeanUtils.toBean(fixed, AttendanceFixedRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得固定班制考勤设置分页") + @PreAuthorize("@ss.hasPermission('attendance:fixed:query')") + public CommonResult> getFixedPage(@Valid AttendanceFixedPageReqVO pageReqVO) { + PageResult pageResult = fixedService.getFixedPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, AttendanceFixedRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出固定班制考勤设置 Excel") + @PreAuthorize("@ss.hasPermission('attendance:fixed:export')") + @OperateLog(type = EXPORT) + public void exportFixedExcel(@Valid AttendanceFixedPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = fixedService.getFixedPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "固定班制考勤设置.xls", "数据", AttendanceFixedRespVO.class, + BeanUtils.toBean(list, AttendanceFixedRespVO.class)); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/fixed/vo/AttendanceFixedPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/fixed/vo/AttendanceFixedPageReqVO.java new file mode 100644 index 00000000..a7ac1a1e --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/fixed/vo/AttendanceFixedPageReqVO.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.system.controller.admin.fixed.vo; + +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 AttendanceFixedPageReqVO extends PageParam { + + @Schema(description = "考勤组id", example = "19908") + private Long attendanceGroupId; + + @Schema(description = "周时间 1-7") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Integer[] weekTime; + + @Schema(description = "班次id", example = "16385") + private Long attendanceGroupShiftId; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/fixed/vo/AttendanceFixedRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/fixed/vo/AttendanceFixedRespVO.java new file mode 100644 index 00000000..b2e76400 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/fixed/vo/AttendanceFixedRespVO.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.system.controller.admin.fixed.vo; + +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 AttendanceFixedRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23824") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "考勤组id", example = "19908") + @ExcelProperty("考勤组id") + private Long attendanceGroupId; + + @Schema(description = "周时间 1-7") + @ExcelProperty("周时间 1-7") + private Integer weekTime; + + @Schema(description = "班次id", example = "16385") + @ExcelProperty("班次id") + private Long attendanceGroupShiftId; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/fixed/vo/AttendanceFixedSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/fixed/vo/AttendanceFixedSaveReqVO.java new file mode 100644 index 00000000..48f00124 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/fixed/vo/AttendanceFixedSaveReqVO.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.module.system.controller.admin.fixed.vo; + +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 AttendanceFixedSaveReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23824") + private Long id; + + @Schema(description = "考勤组id", example = "19908") + private Long attendanceGroupId; + + @Schema(description = "周时间 1-7") + private Integer weekTime; + + @Schema(description = "班次id", example = "16385") + private Long attendanceGroupShiftId; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/group/AttendanceGroupController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/group/AttendanceGroupController.java new file mode 100644 index 00000000..1f92fd9b --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/group/AttendanceGroupController.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.module.system.controller.admin.group; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.system.controller.admin.group.vo.*; +import cn.iocoder.yudao.module.system.dal.dataobject.group.AttendanceGroupDO; +import cn.iocoder.yudao.module.system.service.group.AttendanceGroupService; + +@Tag(name = "管理后台 - 考勤组") +@RestController +@RequestMapping("/system/attendance/group") +@Validated +public class AttendanceGroupController { + + @Resource + private AttendanceGroupService groupService; + + @PostMapping("/create") + @Operation(summary = "创建考勤组") + @PreAuthorize("@ss.hasPermission('attendance:group:create')") + public CommonResult createGroup(@Valid @RequestBody AttendanceGroupSaveReqVO createReqVO) { + return success(groupService.createGroup(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新考勤组") + @PreAuthorize("@ss.hasPermission('attendance:group:update')") + public CommonResult updateGroup(@Valid @RequestBody AttendanceGroupSaveReqVO updateReqVO) { + groupService.updateGroup(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除考勤组") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('attendance:group:delete')") + public CommonResult deleteGroup(@RequestParam("id") Long id) { + groupService.deleteGroup(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得考勤组") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('attendance:group:query')") + public CommonResult getGroup(@RequestParam("id") Long id) { + AttendanceGroupDO group = groupService.getGroup(id); + return success(BeanUtils.toBean(group, AttendanceGroupRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得考勤组分页") + @PreAuthorize("@ss.hasPermission('attendance:group:query')") + public CommonResult> getGroupPage(@Valid AttendanceGroupPageReqVO pageReqVO) { + PageResult pageResult = groupService.getGroupPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, AttendanceGroupRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出考勤组 Excel") + @PreAuthorize("@ss.hasPermission('attendance:group:export')") + @OperateLog(type = EXPORT) + public void exportGroupExcel(@Valid AttendanceGroupPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = groupService.getGroupPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "考勤组.xls", "数据", AttendanceGroupRespVO.class, + BeanUtils.toBean(list, AttendanceGroupRespVO.class)); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/group/vo/AttendanceGroupPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/group/vo/AttendanceGroupPageReqVO.java new file mode 100644 index 00000000..5e59f3be --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/group/vo/AttendanceGroupPageReqVO.java @@ -0,0 +1,49 @@ +package cn.iocoder.yudao.module.system.controller.admin.group.vo; + +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 AttendanceGroupPageReqVO extends PageParam { + + @Schema(description = "考勤组管理员id", example = "15633") + private Long userId; + + @Schema(description = "群组名称", example = "李四") + private String groupName; + + @Schema(description = "考勤类型 1固定班制 2排班制", example = "1") + private Integer type; + + @Schema(description = "打卡类型 1考勤机 2小程序范围打卡", example = "2") + private Integer punchType; + + @Schema(description = "经度") + private String longitude; + + @Schema(description = "纬度") + private String latitude; + + @Schema(description = "范围(米)") + private Integer scope; + + @Schema(description = "是否允许外勤打卡 0否 1是") + private Integer fieldworkFlag; + + @Schema(description = "节假日自动排休 0否 1是") + private Integer autoHolidaysFlag; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/group/vo/AttendanceGroupRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/group/vo/AttendanceGroupRespVO.java new file mode 100644 index 00000000..936cc28c --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/group/vo/AttendanceGroupRespVO.java @@ -0,0 +1,60 @@ +package cn.iocoder.yudao.module.system.controller.admin.group.vo; + +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 AttendanceGroupRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "22881") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "考勤组管理员id", example = "15633") + @ExcelProperty("考勤组管理员id") + private Long userId; + + @Schema(description = "群组名称", example = "李四") + @ExcelProperty("群组名称") + private String groupName; + + @Schema(description = "考勤类型 1固定班制 2排班制", example = "1") + @ExcelProperty("考勤类型 1固定班制 2排班制") + private Integer type; + + @Schema(description = "打卡类型 1考勤机 2小程序范围打卡", example = "2") + @ExcelProperty("打卡类型 1考勤机 2小程序范围打卡") + private Integer punchType; + + @Schema(description = "经度") + @ExcelProperty("经度") + private String longitude; + + @Schema(description = "纬度") + @ExcelProperty("纬度") + private String latitude; + + @Schema(description = "范围(米)") + @ExcelProperty("范围(米)") + private Integer scope; + + @Schema(description = "是否允许外勤打卡 0否 1是") + @ExcelProperty("是否允许外勤打卡 0否 1是") + private Integer fieldworkFlag; + + @Schema(description = "节假日自动排休 0否 1是") + @ExcelProperty("节假日自动排休 0否 1是") + private Integer autoHolidaysFlag; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/group/vo/AttendanceGroupSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/group/vo/AttendanceGroupSaveReqVO.java new file mode 100644 index 00000000..ac217805 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/group/vo/AttendanceGroupSaveReqVO.java @@ -0,0 +1,44 @@ +package cn.iocoder.yudao.module.system.controller.admin.group.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +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 AttendanceGroupSaveReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "22881") + private Long id; + + @Schema(description = "考勤组管理员id", example = "15633") + private Long userId; + + @Schema(description = "群组名称", example = "李四") + private String groupName; + + @Schema(description = "考勤类型 1固定班制 2排班制", example = "1") + private Integer type; + + @Schema(description = "打卡类型 1考勤机 2小程序范围打卡", example = "2") + private Integer punchType; + + @Schema(description = "经度") + private String longitude; + + @Schema(description = "纬度") + private String latitude; + + @Schema(description = "范围(米)") + private Integer scope; + + @Schema(description = "是否允许外勤打卡 0否 1是") + private Integer fieldworkFlag; + + @Schema(description = "节假日自动排休 0否 1是") + private Integer autoHolidaysFlag; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupshift/AttendanceGroupShiftController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupshift/AttendanceGroupShiftController.java new file mode 100644 index 00000000..15337204 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupshift/AttendanceGroupShiftController.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.module.system.controller.admin.groupshift; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.system.controller.admin.groupshift.vo.*; +import cn.iocoder.yudao.module.system.dal.dataobject.groupshift.AttendanceGroupShiftDO; +import cn.iocoder.yudao.module.system.service.groupshift.AttendanceGroupShiftService; + +@Tag(name = "管理后台 - 考勤组班次") +@RestController +@RequestMapping("/system/attendance/group-shift") +@Validated +public class AttendanceGroupShiftController { + + @Resource + private AttendanceGroupShiftService groupShiftService; + + @PostMapping("/create") + @Operation(summary = "创建考勤组班次") + @PreAuthorize("@ss.hasPermission('attendance:group-shift:create')") + public CommonResult createGroupShift(@Valid @RequestBody AttendanceGroupShiftSaveReqVO createReqVO) { + return success(groupShiftService.createGroupShift(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新考勤组班次") + @PreAuthorize("@ss.hasPermission('attendance:group-shift:update')") + public CommonResult updateGroupShift(@Valid @RequestBody AttendanceGroupShiftSaveReqVO updateReqVO) { + groupShiftService.updateGroupShift(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除考勤组班次") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('attendance:group-shift:delete')") + public CommonResult deleteGroupShift(@RequestParam("id") Long id) { + groupShiftService.deleteGroupShift(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得考勤组班次") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('attendance:group-shift:query')") + public CommonResult getGroupShift(@RequestParam("id") Long id) { + AttendanceGroupShiftDO groupShift = groupShiftService.getGroupShift(id); + return success(BeanUtils.toBean(groupShift, AttendanceGroupShiftRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得考勤组班次分页") + @PreAuthorize("@ss.hasPermission('attendance:group-shift:query')") + public CommonResult> getGroupShiftPage(@Valid AttendanceGroupShiftPageReqVO pageReqVO) { + PageResult pageResult = groupShiftService.getGroupShiftPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, AttendanceGroupShiftRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出考勤组班次 Excel") + @PreAuthorize("@ss.hasPermission('attendance:group-shift:export')") + @OperateLog(type = EXPORT) + public void exportGroupShiftExcel(@Valid AttendanceGroupShiftPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = groupShiftService.getGroupShiftPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "考勤组班次.xls", "数据", AttendanceGroupShiftRespVO.class, + BeanUtils.toBean(list, AttendanceGroupShiftRespVO.class)); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupshift/vo/AttendanceGroupShiftPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupshift/vo/AttendanceGroupShiftPageReqVO.java new file mode 100644 index 00000000..d468a872 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupshift/vo/AttendanceGroupShiftPageReqVO.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.module.system.controller.admin.groupshift.vo; + +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 AttendanceGroupShiftPageReqVO extends PageParam { + + @Schema(description = "考勤组id", example = "24585") + private Long attendanceGroupId; + + @Schema(description = "班次名称", example = "张三") + private String name; + + @Schema(description = "班次考勤时间json[{start_tiem:HH:mm,start_check_flag:true,end_time:HH:mm,end_check_flah: true}]") + private String attendanceTimeJson; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupshift/vo/AttendanceGroupShiftRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupshift/vo/AttendanceGroupShiftRespVO.java new file mode 100644 index 00000000..56e65e08 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupshift/vo/AttendanceGroupShiftRespVO.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.system.controller.admin.groupshift.vo; + +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 AttendanceGroupShiftRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "5305") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "考勤组id", example = "24585") + @ExcelProperty("考勤组id") + private Long attendanceGroupId; + + @Schema(description = "班次名称", example = "张三") + @ExcelProperty("班次名称") + private String name; + + @Schema(description = "班次考勤时间json[{start_tiem:HH:mm,start_check_flag:true,end_time:HH:mm,end_check_flah: true}]") + @ExcelProperty("班次考勤时间json[{start_tiem:HH:mm,start_check_flag:true,end_time:HH:mm,end_check_flah: true}]") + private String attendanceTimeJson; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupshift/vo/AttendanceGroupShiftSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupshift/vo/AttendanceGroupShiftSaveReqVO.java new file mode 100644 index 00000000..3f6b4473 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupshift/vo/AttendanceGroupShiftSaveReqVO.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.module.system.controller.admin.groupshift.vo; + +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 AttendanceGroupShiftSaveReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "5305") + private Long id; + + @Schema(description = "考勤组id", example = "24585") + private Long attendanceGroupId; + + @Schema(description = "班次名称", example = "张三") + private String name; + + @Schema(description = "班次考勤时间json[{start_tiem:HH:mm,start_check_flag:true,end_time:HH:mm,end_check_flah: true}]") + private String attendanceTimeJson; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupuser/AttendanceGroupUserController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupuser/AttendanceGroupUserController.java new file mode 100644 index 00000000..03a10111 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupuser/AttendanceGroupUserController.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.module.system.controller.admin.groupuser; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.system.controller.admin.groupuser.vo.*; +import cn.iocoder.yudao.module.system.dal.dataobject.groupuser.AttendanceGroupUserDO; +import cn.iocoder.yudao.module.system.service.groupuser.AttendanceGroupUserService; + +@Tag(name = "管理后台 - 考勤组人员") +@RestController +@RequestMapping("/system/attendance/group-user") +@Validated +public class AttendanceGroupUserController { + + @Resource + private AttendanceGroupUserService groupUserService; + + @PostMapping("/create") + @Operation(summary = "创建考勤组人员") + @PreAuthorize("@ss.hasPermission('attendance:group-user:create')") + public CommonResult createGroupUser(@Valid @RequestBody AttendanceGroupUserSaveReqVO createReqVO) { + return success(groupUserService.createGroupUser(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新考勤组人员") + @PreAuthorize("@ss.hasPermission('attendance:group-user:update')") + public CommonResult updateGroupUser(@Valid @RequestBody AttendanceGroupUserSaveReqVO updateReqVO) { + groupUserService.updateGroupUser(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除考勤组人员") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('attendance:group-user:delete')") + public CommonResult deleteGroupUser(@RequestParam("id") Long id) { + groupUserService.deleteGroupUser(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得考勤组人员") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('attendance:group-user:query')") + public CommonResult getGroupUser(@RequestParam("id") Long id) { + AttendanceGroupUserDO groupUser = groupUserService.getGroupUser(id); + return success(BeanUtils.toBean(groupUser, AttendanceGroupUserRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得考勤组人员分页") + @PreAuthorize("@ss.hasPermission('attendance:group-user:query')") + public CommonResult> getGroupUserPage(@Valid AttendanceGroupUserPageReqVO pageReqVO) { + PageResult pageResult = groupUserService.getGroupUserPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, AttendanceGroupUserRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出考勤组人员 Excel") + @PreAuthorize("@ss.hasPermission('attendance:group-user:export')") + @OperateLog(type = EXPORT) + public void exportGroupUserExcel(@Valid AttendanceGroupUserPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = groupUserService.getGroupUserPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "考勤组人员.xls", "数据", AttendanceGroupUserRespVO.class, + BeanUtils.toBean(list, AttendanceGroupUserRespVO.class)); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupuser/vo/AttendanceGroupUserPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupuser/vo/AttendanceGroupUserPageReqVO.java new file mode 100644 index 00000000..ec64ead1 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupuser/vo/AttendanceGroupUserPageReqVO.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.system.controller.admin.groupuser.vo; + +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 AttendanceGroupUserPageReqVO extends PageParam { + + @Schema(description = "考勤组id", example = "21406") + private Long attendanceGroupId; + + @Schema(description = "用户id", example = "22547") + private Long userId; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupuser/vo/AttendanceGroupUserRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupuser/vo/AttendanceGroupUserRespVO.java new file mode 100644 index 00000000..e53abc1b --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupuser/vo/AttendanceGroupUserRespVO.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.system.controller.admin.groupuser.vo; + +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 AttendanceGroupUserRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "31257") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "考勤组id", example = "21406") + @ExcelProperty("考勤组id") + private Long attendanceGroupId; + + @Schema(description = "用户id", example = "22547") + @ExcelProperty("用户id") + private Long userId; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupuser/vo/AttendanceGroupUserSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupuser/vo/AttendanceGroupUserSaveReqVO.java new file mode 100644 index 00000000..df0d5031 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupuser/vo/AttendanceGroupUserSaveReqVO.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.module.system.controller.admin.groupuser.vo; + +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 AttendanceGroupUserSaveReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "31257") + private Long id; + + @Schema(description = "考勤组id", example = "21406") + private Long attendanceGroupId; + + @Schema(description = "用户id", example = "22547") + private Long userId; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/punchrecord/AttendancePunchRecordController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/punchrecord/AttendancePunchRecordController.java new file mode 100644 index 00000000..c55fdd50 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/punchrecord/AttendancePunchRecordController.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.module.system.controller.admin.punchrecord; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.system.controller.admin.punchrecord.vo.*; +import cn.iocoder.yudao.module.system.dal.dataobject.punchrecord.AttendancePunchRecordDO; +import cn.iocoder.yudao.module.system.service.punchrecord.AttendancePunchRecordService; + +@Tag(name = "管理后台 - 用户打卡记录") +@RestController +@RequestMapping("/system/attendance/punch-record") +@Validated +public class AttendancePunchRecordController { + + @Resource + private AttendancePunchRecordService punchRecordService; + + @PostMapping("/create") + @Operation(summary = "创建用户打卡记录") + @PreAuthorize("@ss.hasPermission('attendance:punch-record:create')") + public CommonResult createPunchRecord(@Valid @RequestBody AttendancePunchRecordSaveReqVO createReqVO) { + return success(punchRecordService.createPunchRecord(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新用户打卡记录") + @PreAuthorize("@ss.hasPermission('attendance:punch-record:update')") + public CommonResult updatePunchRecord(@Valid @RequestBody AttendancePunchRecordSaveReqVO updateReqVO) { + punchRecordService.updatePunchRecord(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除用户打卡记录") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('attendance:punch-record:delete')") + public CommonResult deletePunchRecord(@RequestParam("id") Long id) { + punchRecordService.deletePunchRecord(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得用户打卡记录") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('attendance:punch-record:query')") + public CommonResult getPunchRecord(@RequestParam("id") Long id) { + AttendancePunchRecordDO punchRecord = punchRecordService.getPunchRecord(id); + return success(BeanUtils.toBean(punchRecord, AttendancePunchRecordRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得用户打卡记录分页") + @PreAuthorize("@ss.hasPermission('attendance:punch-record:query')") + public CommonResult> getPunchRecordPage(@Valid AttendancePunchRecordPageReqVO pageReqVO) { + PageResult pageResult = punchRecordService.getPunchRecordPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, AttendancePunchRecordRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出用户打卡记录 Excel") + @PreAuthorize("@ss.hasPermission('attendance:punch-record:export')") + @OperateLog(type = EXPORT) + public void exportPunchRecordExcel(@Valid AttendancePunchRecordPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = punchRecordService.getPunchRecordPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "用户打卡记录.xls", "数据", AttendancePunchRecordRespVO.class, + BeanUtils.toBean(list, AttendancePunchRecordRespVO.class)); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/punchrecord/vo/AttendancePunchRecordPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/punchrecord/vo/AttendancePunchRecordPageReqVO.java new file mode 100644 index 00000000..bdd7c654 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/punchrecord/vo/AttendancePunchRecordPageReqVO.java @@ -0,0 +1,57 @@ +package cn.iocoder.yudao.module.system.controller.admin.punchrecord.vo; + +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 AttendancePunchRecordPageReqVO extends PageParam { + + @Schema(description = "考勤组管理员id", example = "11409") + private Long userId; + + @Schema(description = "考勤组id", example = "22293") + private Long attendanceGroupId; + + @Schema(description = "班次id", example = "10780") + private Long attendanceGroupShiftId; + + @Schema(description = "考勤类型 1固定班制 2排班制", example = "2") + private Integer type; + + @Schema(description = "打卡类型 1考勤机 2小程序范围打卡", example = "2") + private Integer punchType; + + @Schema(description = "班次考勤时间json[{start_tiem:HH:mm,start_check_flag:true,end_time:HH:mm,end_check_flah: true}]") + private String attendanceTimeJson; + + @Schema(description = "打卡状态 0正常 1迟到 2缺卡 3外勤 4补卡", example = "1") + private Integer status; + + @Schema(description = "日期yyyy-MM-dd格式") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private String[] dayTime; + + @Schema(description = "打卡时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] punchTime; + + @Schema(description = "打卡备注", example = "你说的对") + private String remark; + + @Schema(description = "图片") + private String image; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/punchrecord/vo/AttendancePunchRecordRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/punchrecord/vo/AttendancePunchRecordRespVO.java new file mode 100644 index 00000000..15067d80 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/punchrecord/vo/AttendancePunchRecordRespVO.java @@ -0,0 +1,68 @@ +package cn.iocoder.yudao.module.system.controller.admin.punchrecord.vo; + +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 AttendancePunchRecordRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "65") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "考勤组管理员id", example = "11409") + @ExcelProperty("考勤组管理员id") + private Long userId; + + @Schema(description = "考勤组id", example = "22293") + @ExcelProperty("考勤组id") + private Long attendanceGroupId; + + @Schema(description = "班次id", example = "10780") + @ExcelProperty("班次id") + private Long attendanceGroupShiftId; + + @Schema(description = "考勤类型 1固定班制 2排班制", example = "2") + @ExcelProperty("考勤类型 1固定班制 2排班制") + private Integer type; + + @Schema(description = "打卡类型 1考勤机 2小程序范围打卡", example = "2") + @ExcelProperty("打卡类型 1考勤机 2小程序范围打卡") + private Integer punchType; + + @Schema(description = "班次考勤时间json[{start_tiem:HH:mm,start_check_flag:true,end_time:HH:mm,end_check_flah: true}]") + @ExcelProperty("班次考勤时间json[{start_tiem:HH:mm,start_check_flag:true,end_time:HH:mm,end_check_flah: true}]") + private String attendanceTimeJson; + + @Schema(description = "打卡状态 0正常 1迟到 2缺卡 3外勤 4补卡", example = "1") + @ExcelProperty("打卡状态 0正常 1迟到 2缺卡 3外勤 4补卡") + private Integer status; + + @Schema(description = "日期yyyy-MM-dd格式") + @ExcelProperty("日期yyyy-MM-dd格式") + private String dayTime; + + @Schema(description = "打卡时间") + @ExcelProperty("打卡时间") + private LocalDateTime punchTime; + + @Schema(description = "打卡备注", example = "你说的对") + @ExcelProperty("打卡备注") + private String remark; + + @Schema(description = "图片") + @ExcelProperty("图片") + private String image; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/punchrecord/vo/AttendancePunchRecordSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/punchrecord/vo/AttendancePunchRecordSaveReqVO.java new file mode 100644 index 00000000..397e7019 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/punchrecord/vo/AttendancePunchRecordSaveReqVO.java @@ -0,0 +1,51 @@ +package cn.iocoder.yudao.module.system.controller.admin.punchrecord.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 用户打卡记录新增/修改 Request VO") +@Data +public class AttendancePunchRecordSaveReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "65") + private Long id; + + @Schema(description = "考勤组管理员id", example = "11409") + private Long userId; + + @Schema(description = "考勤组id", example = "22293") + private Long attendanceGroupId; + + @Schema(description = "班次id", example = "10780") + private Long attendanceGroupShiftId; + + @Schema(description = "考勤类型 1固定班制 2排班制", example = "2") + private Integer type; + + @Schema(description = "打卡类型 1考勤机 2小程序范围打卡", example = "2") + private Integer punchType; + + @Schema(description = "班次考勤时间json[{start_tiem:HH:mm,start_check_flag:true,end_time:HH:mm,end_check_flah: true}]") + private String attendanceTimeJson; + + @Schema(description = "打卡状态 0正常 1迟到 2缺卡 3外勤 4补卡", example = "1") + private Integer status; + + @Schema(description = "日期yyyy-MM-dd格式") + private String dayTime; + + @Schema(description = "打卡时间") + private LocalDateTime punchTime; + + @Schema(description = "打卡备注", example = "你说的对") + private String remark; + + @Schema(description = "图片") + private String image; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/scheduling/AttendanceSchedulingController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/scheduling/AttendanceSchedulingController.java new file mode 100644 index 00000000..efa200b5 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/scheduling/AttendanceSchedulingController.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.module.system.controller.admin.scheduling; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.system.controller.admin.scheduling.vo.*; +import cn.iocoder.yudao.module.system.dal.dataobject.scheduling.AttendanceSchedulingDO; +import cn.iocoder.yudao.module.system.service.scheduling.AttendanceSchedulingService; + +@Tag(name = "管理后台 - 排班制考勤设置") +@RestController +@RequestMapping("/system/attendance/scheduling") +@Validated +public class AttendanceSchedulingController { + + @Resource + private AttendanceSchedulingService schedulingService; + + @PostMapping("/create") + @Operation(summary = "创建排班制考勤设置") + @PreAuthorize("@ss.hasPermission('attendance:scheduling:create')") + public CommonResult createScheduling(@Valid @RequestBody AttendanceSchedulingSaveReqVO createReqVO) { + return success(schedulingService.createScheduling(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新排班制考勤设置") + @PreAuthorize("@ss.hasPermission('attendance:scheduling:update')") + public CommonResult updateScheduling(@Valid @RequestBody AttendanceSchedulingSaveReqVO updateReqVO) { + schedulingService.updateScheduling(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除排班制考勤设置") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('attendance:scheduling:delete')") + public CommonResult deleteScheduling(@RequestParam("id") Long id) { + schedulingService.deleteScheduling(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得排班制考勤设置") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('attendance:scheduling:query')") + public CommonResult getScheduling(@RequestParam("id") Long id) { + AttendanceSchedulingDO scheduling = schedulingService.getScheduling(id); + return success(BeanUtils.toBean(scheduling, AttendanceSchedulingRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得排班制考勤设置分页") + @PreAuthorize("@ss.hasPermission('attendance:scheduling:query')") + public CommonResult> getSchedulingPage(@Valid AttendanceSchedulingPageReqVO pageReqVO) { + PageResult pageResult = schedulingService.getSchedulingPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, AttendanceSchedulingRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出排班制考勤设置 Excel") + @PreAuthorize("@ss.hasPermission('attendance:scheduling:export')") + @OperateLog(type = EXPORT) + public void exportSchedulingExcel(@Valid AttendanceSchedulingPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = schedulingService.getSchedulingPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "排班制考勤设置.xls", "数据", AttendanceSchedulingRespVO.class, + BeanUtils.toBean(list, AttendanceSchedulingRespVO.class)); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/scheduling/vo/AttendanceSchedulingPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/scheduling/vo/AttendanceSchedulingPageReqVO.java new file mode 100644 index 00000000..a8227026 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/scheduling/vo/AttendanceSchedulingPageReqVO.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.system.controller.admin.scheduling.vo; + +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 AttendanceSchedulingPageReqVO extends PageParam { + + @Schema(description = "第几天") + private Integer indexDay; + + @Schema(description = "考勤组id", example = "5025") + private Long attendanceGroupId; + + @Schema(description = "班次id", example = "9583") + private Long attendanceGroupShiftId; + + @Schema(description = "是否休息 0否 1是") + private Integer restFlag; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/scheduling/vo/AttendanceSchedulingRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/scheduling/vo/AttendanceSchedulingRespVO.java new file mode 100644 index 00000000..56089990 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/scheduling/vo/AttendanceSchedulingRespVO.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.module.system.controller.admin.scheduling.vo; + +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 AttendanceSchedulingRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23862") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "第几天") + @ExcelProperty("第几天") + private Integer indexDay; + + @Schema(description = "考勤组id", example = "5025") + @ExcelProperty("考勤组id") + private Long attendanceGroupId; + + @Schema(description = "班次id", example = "9583") + @ExcelProperty("班次id") + private Long attendanceGroupShiftId; + + @Schema(description = "是否休息 0否 1是") + @ExcelProperty("是否休息 0否 1是") + private Integer restFlag; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/scheduling/vo/AttendanceSchedulingSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/scheduling/vo/AttendanceSchedulingSaveReqVO.java new file mode 100644 index 00000000..e6dbfd01 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/scheduling/vo/AttendanceSchedulingSaveReqVO.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.system.controller.admin.scheduling.vo; + +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 AttendanceSchedulingSaveReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23862") + private Long id; + + @Schema(description = "第几天") + private Integer indexDay; + + @Schema(description = "考勤组id", example = "5025") + private Long attendanceGroupId; + + @Schema(description = "班次id", example = "9583") + private Long attendanceGroupShiftId; + + @Schema(description = "是否休息 0否 1是") + private Integer restFlag; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/attendance/AttendanceController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/attendance/AttendanceController.java new file mode 100644 index 00000000..fe41559f --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/attendance/AttendanceController.java @@ -0,0 +1,41 @@ +package cn.iocoder.yudao.module.system.controller.app.attendance; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +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.app.attendance.dto.AttendancePunchPageDTO; +import cn.iocoder.yudao.module.system.controller.app.attendance.vo.AttendancePunchPageVO; +import cn.iocoder.yudao.module.system.controller.app.dict.vo.AppDictDataRespVO; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO; +import cn.iocoder.yudao.module.system.handler.PunchHandler; +import cn.iocoder.yudao.module.system.service.attendance.AttendanceService; +import cn.iocoder.yudao.module.system.service.dict.DictDataService; +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.*; + +import javax.annotation.Resource; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Tag(name = "考勤 App - 考勤管理") +@RestController +@RequestMapping("/system/attendance") +@Validated +public class AttendanceController { + + @Resource + private AttendanceService attendanceService; + + @GetMapping("/getPunchPage") + @Operation(summary = "获取考勤页面") + public CommonResult getPunchPage(@ModelAttribute AttendancePunchPageDTO dto) { + Long userId = WebFrameworkUtils.getLoginUserId(); + AttendancePunchPageVO vo = attendanceService.getPunchPage(dto.setUserId(userId)); + return success(vo); + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/attendance/dto/AttendancePunchPageDTO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/attendance/dto/AttendancePunchPageDTO.java new file mode 100644 index 00000000..b78bb757 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/attendance/dto/AttendancePunchPageDTO.java @@ -0,0 +1,20 @@ +package cn.iocoder.yudao.module.system.controller.app.attendance.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +public class AttendancePunchPageDTO { + + @Schema(description = "经度") + private String longitude; + + @Schema(description = "纬度") + private String latitude; + + @Schema(description = "当前用户id", hidden = true) + private Long userId; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/attendance/vo/AttendancePunchPageVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/attendance/vo/AttendancePunchPageVO.java new file mode 100644 index 00000000..2eff07c0 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/attendance/vo/AttendancePunchPageVO.java @@ -0,0 +1,9 @@ +package cn.iocoder.yudao.module.system.controller.app.attendance.vo; + +import lombok.Data; + +@Data +public class AttendancePunchPageVO { + + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/fixed/AttendanceFixedDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/fixed/AttendanceFixedDO.java new file mode 100644 index 00000000..da0900b2 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/fixed/AttendanceFixedDO.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.module.system.dal.dataobject.fixed; + +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("kq_attendance_fixed") +@KeySequence("kq_attendance_fixed_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AttendanceFixedDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 考勤组id + */ + private Long attendanceGroupId; + /** + * 周时间 1-7 + */ + private Integer weekTime; + /** + * 班次id + */ + private Long attendanceGroupShiftId; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/group/AttendanceGroupDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/group/AttendanceGroupDO.java new file mode 100644 index 00000000..1c1ee3fa --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/group/AttendanceGroupDO.java @@ -0,0 +1,75 @@ +package cn.iocoder.yudao.module.system.dal.dataobject.group; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 考勤组 DO + * + * @author 艾楷 + */ +@TableName("kq_attendance_group") +@KeySequence("kq_attendance_group_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AttendanceGroupDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 考勤组管理员id + */ + private Long userId; + /** + * 群组名称 + */ + private String groupName; + /** + * 考勤类型 1固定班制 2排班制 + */ + private Integer type; + /** + * 打卡类型 1考勤机 2小程序范围打卡 + */ + private Integer punchType; + /** + * 经度 + */ + private String longitude; + /** + * 纬度 + */ + private String latitude; + /** + * 范围(米) + */ + private Integer scope; + /** + * 是否允许外勤打卡 0否 1是 + */ + private Integer fieldworkFlag; + /** + * 节假日自动排休 0否 1是 + */ + private Integer autoHolidaysFlag; + + + public static String getCodeByType(Integer type) { + if (type == 1) { + return "fixed"; + } else { + return "scheduling"; + } + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/groupshift/AttendanceGroupShiftDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/groupshift/AttendanceGroupShiftDO.java new file mode 100644 index 00000000..abb2cd66 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/groupshift/AttendanceGroupShiftDO.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.module.system.dal.dataobject.groupshift; + +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("kq_attendance_group_shift") +@KeySequence("kq_attendance_group_shift_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AttendanceGroupShiftDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 考勤组id + */ + private Long attendanceGroupId; + /** + * 班次名称 + */ + private String name; + /** + * 班次考勤时间json[{start_tiem:HH:mm,start_check_flag:true,end_time:HH:mm,end_check_flah: true}] + */ + private String attendanceTimeJson; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/groupuser/AttendanceGroupUserDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/groupuser/AttendanceGroupUserDO.java new file mode 100644 index 00000000..98eb30db --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/groupuser/AttendanceGroupUserDO.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.module.system.dal.dataobject.groupuser; + +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("kq_attendance_group_user") +@KeySequence("kq_attendance_group_user_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AttendanceGroupUserDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 考勤组id + */ + private Long attendanceGroupId; + /** + * 用户id + */ + private Long userId; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/punchrecord/AttendancePunchRecordDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/punchrecord/AttendancePunchRecordDO.java new file mode 100644 index 00000000..e7fd91c1 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/punchrecord/AttendancePunchRecordDO.java @@ -0,0 +1,76 @@ +package cn.iocoder.yudao.module.system.dal.dataobject.punchrecord; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +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("kq_attendance_punch_record") +@KeySequence("kq_attendance_punch_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AttendancePunchRecordDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 考勤组管理员id + */ + private Long userId; + /** + * 考勤组id + */ + private Long attendanceGroupId; + /** + * 班次id + */ + private Long attendanceGroupShiftId; + /** + * 考勤类型 1固定班制 2排班制 + */ + private Integer type; + /** + * 打卡类型 1考勤机 2小程序范围打卡 + */ + private Integer punchType; + /** + * 班次考勤时间json[{start_tiem:HH:mm,start_check_flag:true,end_time:HH:mm,end_check_flah: true}] + */ + private String attendanceTimeJson; + /** + * 打卡状态 0正常 1迟到 2缺卡 3外勤 4补卡 + */ + private Integer status; + /** + * 日期yyyy-MM-dd格式 + */ + private String dayTime; + /** + * 打卡时间 + */ + private LocalDateTime punchTime; + /** + * 打卡备注 + */ + private String remark; + /** + * 图片 + */ + private String image; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/scheduling/AttendanceSchedulingDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/scheduling/AttendanceSchedulingDO.java new file mode 100644 index 00000000..4ea9ab31 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/scheduling/AttendanceSchedulingDO.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.module.system.dal.dataobject.scheduling; + +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("kq_attendance_scheduling") +@KeySequence("kq_attendance_scheduling_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AttendanceSchedulingDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 第几天 + */ + private Integer indexDay; + /** + * 考勤组id + */ + private Long attendanceGroupId; + /** + * 班次id + */ + private Long attendanceGroupShiftId; + /** + * 是否休息 0否 1是 + */ + private Integer restFlag; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/fixed/AttendanceFixedMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/fixed/AttendanceFixedMapper.java new file mode 100644 index 00000000..ac5425df --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/fixed/AttendanceFixedMapper.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.module.system.dal.mysql.fixed; + +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.dal.dataobject.fixed.AttendanceFixedDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.system.controller.admin.fixed.vo.*; + +/** + * 固定班制考勤设置 Mapper + * + * @author 艾楷 + */ +@Mapper +public interface AttendanceFixedMapper extends BaseMapperX { + + default PageResult selectPage(AttendanceFixedPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(AttendanceFixedDO::getAttendanceGroupId, reqVO.getAttendanceGroupId()) + .betweenIfPresent(AttendanceFixedDO::getWeekTime, reqVO.getWeekTime()) + .eqIfPresent(AttendanceFixedDO::getAttendanceGroupShiftId, reqVO.getAttendanceGroupShiftId()) + .betweenIfPresent(AttendanceFixedDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(AttendanceFixedDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/group/AttendanceGroupMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/group/AttendanceGroupMapper.java new file mode 100644 index 00000000..7bb5f9f0 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/group/AttendanceGroupMapper.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.module.system.dal.mysql.group; + +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.group.vo.AttendanceGroupPageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.group.AttendanceGroupDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 考勤组 Mapper + * + * @author 艾楷 + */ +@Mapper +public interface AttendanceGroupMapper extends BaseMapperX { + + default PageResult selectPage(AttendanceGroupPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(AttendanceGroupDO::getUserId, reqVO.getUserId()) + .likeIfPresent(AttendanceGroupDO::getGroupName, reqVO.getGroupName()) + .eqIfPresent(AttendanceGroupDO::getType, reqVO.getType()) + .eqIfPresent(AttendanceGroupDO::getPunchType, reqVO.getPunchType()) + .eqIfPresent(AttendanceGroupDO::getLongitude, reqVO.getLongitude()) + .eqIfPresent(AttendanceGroupDO::getLatitude, reqVO.getLatitude()) + .eqIfPresent(AttendanceGroupDO::getScope, reqVO.getScope()) + .eqIfPresent(AttendanceGroupDO::getAutoHolidaysFlag, reqVO.getAutoHolidaysFlag()) + .betweenIfPresent(AttendanceGroupDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(AttendanceGroupDO::getId)); + } + + /** + * 通过当前登录用户获取用户所在群组 + * + * @param userId + * @return + */ + List getByUserId(@Param("userId") Long userId); +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/groupshift/AttendanceGroupShiftMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/groupshift/AttendanceGroupShiftMapper.java new file mode 100644 index 00000000..8209d587 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/groupshift/AttendanceGroupShiftMapper.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.module.system.dal.mysql.groupshift; + +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.dal.dataobject.groupshift.AttendanceGroupShiftDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.system.controller.admin.groupshift.vo.*; + +/** + * 考勤组班次 Mapper + * + * @author 艾楷 + */ +@Mapper +public interface AttendanceGroupShiftMapper extends BaseMapperX { + + default PageResult selectPage(AttendanceGroupShiftPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(AttendanceGroupShiftDO::getAttendanceGroupId, reqVO.getAttendanceGroupId()) + .likeIfPresent(AttendanceGroupShiftDO::getName, reqVO.getName()) + .eqIfPresent(AttendanceGroupShiftDO::getAttendanceTimeJson, reqVO.getAttendanceTimeJson()) + .betweenIfPresent(AttendanceGroupShiftDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(AttendanceGroupShiftDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/groupuser/AttendanceGroupUserMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/groupuser/AttendanceGroupUserMapper.java new file mode 100644 index 00000000..c212ccc5 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/groupuser/AttendanceGroupUserMapper.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.system.dal.mysql.groupuser; + +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.dal.dataobject.groupuser.AttendanceGroupUserDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.system.controller.admin.groupuser.vo.*; + +/** + * 考勤组人员 Mapper + * + * @author 艾楷 + */ +@Mapper +public interface AttendanceGroupUserMapper extends BaseMapperX { + + default PageResult selectPage(AttendanceGroupUserPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(AttendanceGroupUserDO::getAttendanceGroupId, reqVO.getAttendanceGroupId()) + .eqIfPresent(AttendanceGroupUserDO::getUserId, reqVO.getUserId()) + .betweenIfPresent(AttendanceGroupUserDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(AttendanceGroupUserDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/punchrecord/AttendancePunchRecordMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/punchrecord/AttendancePunchRecordMapper.java new file mode 100644 index 00000000..e4a34032 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/punchrecord/AttendancePunchRecordMapper.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.module.system.dal.mysql.punchrecord; + +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.dal.dataobject.punchrecord.AttendancePunchRecordDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.system.controller.admin.punchrecord.vo.*; + +/** + * 用户打卡记录 Mapper + * + * @author 艾楷 + */ +@Mapper +public interface AttendancePunchRecordMapper extends BaseMapperX { + + default PageResult selectPage(AttendancePunchRecordPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(AttendancePunchRecordDO::getUserId, reqVO.getUserId()) + .eqIfPresent(AttendancePunchRecordDO::getAttendanceGroupId, reqVO.getAttendanceGroupId()) + .eqIfPresent(AttendancePunchRecordDO::getAttendanceGroupShiftId, reqVO.getAttendanceGroupShiftId()) + .eqIfPresent(AttendancePunchRecordDO::getType, reqVO.getType()) + .eqIfPresent(AttendancePunchRecordDO::getPunchType, reqVO.getPunchType()) + .eqIfPresent(AttendancePunchRecordDO::getAttendanceTimeJson, reqVO.getAttendanceTimeJson()) + .eqIfPresent(AttendancePunchRecordDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(AttendancePunchRecordDO::getDayTime, reqVO.getDayTime()) + .betweenIfPresent(AttendancePunchRecordDO::getPunchTime, reqVO.getPunchTime()) + .eqIfPresent(AttendancePunchRecordDO::getRemark, reqVO.getRemark()) + .eqIfPresent(AttendancePunchRecordDO::getImage, reqVO.getImage()) + .betweenIfPresent(AttendancePunchRecordDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(AttendancePunchRecordDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/scheduling/AttendanceSchedulingMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/scheduling/AttendanceSchedulingMapper.java new file mode 100644 index 00000000..13b05f5c --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/scheduling/AttendanceSchedulingMapper.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.system.dal.mysql.scheduling; + +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.dal.dataobject.scheduling.AttendanceSchedulingDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.system.controller.admin.scheduling.vo.*; + +/** + * 排班制考勤设置 Mapper + * + * @author 艾楷 + */ +@Mapper +public interface AttendanceSchedulingMapper extends BaseMapperX { + + default PageResult selectPage(AttendanceSchedulingPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(AttendanceSchedulingDO::getIndexDay, reqVO.getIndexDay()) + .eqIfPresent(AttendanceSchedulingDO::getAttendanceGroupId, reqVO.getAttendanceGroupId()) + .eqIfPresent(AttendanceSchedulingDO::getAttendanceGroupShiftId, reqVO.getAttendanceGroupShiftId()) + .eqIfPresent(AttendanceSchedulingDO::getRestFlag, reqVO.getRestFlag()) + .betweenIfPresent(AttendanceSchedulingDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(AttendanceSchedulingDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/handler/PunchHandler.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/handler/PunchHandler.java new file mode 100644 index 00000000..47b2aec0 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/handler/PunchHandler.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.system.handler; + +import cn.iocoder.yudao.module.system.service.punch.PunchService; +import org.springframework.stereotype.Service; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @Author : AiKai + * @Description : 利用Spring的发现机制,将实现了IChannelLoginService的类都put到channelLoginServiceMap里面。 + * 后面只需要根据channelType对应好 各个实现类的注解 如: @Component("sys") 就可以取出不同的业务实现类 + **/ +@Service +public class PunchHandler { + private final Map punchServiceMap = new ConcurrentHashMap<>(); + + public PunchHandler(Map strategyMap) { + this.punchServiceMap.clear(); + strategyMap.forEach((k, v) -> this.punchServiceMap.put(k, v)); + } + + public PunchService getResource(String channelType) { + return punchServiceMap.get(channelType); + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/AttendanceService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/AttendanceService.java new file mode 100644 index 00000000..f999363c --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/AttendanceService.java @@ -0,0 +1,15 @@ +package cn.iocoder.yudao.module.system.service.attendance; + +import cn.iocoder.yudao.module.system.controller.app.attendance.dto.AttendancePunchPageDTO; +import cn.iocoder.yudao.module.system.controller.app.attendance.vo.AttendancePunchPageVO; + +/** + * 考勤 Service 接口 + * + * @author 艾楷 + */ +public interface AttendanceService { + + + AttendancePunchPageVO getPunchPage(AttendancePunchPageDTO attendancePunchPageDTO); +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/AttendanceServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/AttendanceServiceImpl.java new file mode 100644 index 00000000..0e6f1c77 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/AttendanceServiceImpl.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.module.system.service.attendance; + +import cn.iocoder.yudao.module.system.controller.app.attendance.dto.AttendancePunchPageDTO; +import cn.iocoder.yudao.module.system.controller.app.attendance.vo.AttendancePunchPageVO; +import cn.iocoder.yudao.module.system.dal.dataobject.group.AttendanceGroupDO; +import cn.iocoder.yudao.module.system.handler.PunchHandler; +import cn.iocoder.yudao.module.system.service.group.AttendanceGroupService; +import cn.iocoder.yudao.module.system.service.punch.PunchService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * 考勤 实现类 + */ +@Service +@Slf4j +public class AttendanceServiceImpl implements AttendanceService { + @Resource + private PunchHandler punchHandler; + @Resource + private AttendanceGroupService attendanceGroupService; + + @Override + public AttendancePunchPageVO getPunchPage(AttendancePunchPageDTO attendancePunchPageDTO) { + AttendancePunchPageVO vo = new AttendancePunchPageVO(); + //获取当前登录用户所在群组 + AttendanceGroupDO activationGroup = attendanceGroupService.getByUserId(attendancePunchPageDTO.getUserId()); + if (activationGroup == null) { + // TODO: 2024/4/10 不在考勤组 - 返回回去 + return vo; + } + //判断目前是否在班次内 + PunchService punchService = punchHandler.getResource(AttendanceGroupDO.getCodeByType(activationGroup.getType())); + // TODO: 2024/4/10 处理打卡 + return null; + } +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/fixed/AttendanceFixedService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/fixed/AttendanceFixedService.java new file mode 100644 index 00000000..9e5e6d25 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/fixed/AttendanceFixedService.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.system.service.fixed; + +import java.util.*; +import javax.validation.*; +import cn.iocoder.yudao.module.system.controller.admin.fixed.vo.*; +import cn.iocoder.yudao.module.system.dal.dataobject.fixed.AttendanceFixedDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +/** + * 固定班制考勤设置 Service 接口 + * + * @author 艾楷 + */ +public interface AttendanceFixedService { + + /** + * 创建固定班制考勤设置 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createFixed(@Valid AttendanceFixedSaveReqVO createReqVO); + + /** + * 更新固定班制考勤设置 + * + * @param updateReqVO 更新信息 + */ + void updateFixed(@Valid AttendanceFixedSaveReqVO updateReqVO); + + /** + * 删除固定班制考勤设置 + * + * @param id 编号 + */ + void deleteFixed(Long id); + + /** + * 获得固定班制考勤设置 + * + * @param id 编号 + * @return 固定班制考勤设置 + */ + AttendanceFixedDO getFixed(Long id); + + /** + * 获得固定班制考勤设置分页 + * + * @param pageReqVO 分页查询 + * @return 固定班制考勤设置分页 + */ + PageResult getFixedPage(AttendanceFixedPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/fixed/AttendanceFixedServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/fixed/AttendanceFixedServiceImpl.java new file mode 100644 index 00000000..6c09d70e --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/fixed/AttendanceFixedServiceImpl.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.module.system.service.fixed; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.iocoder.yudao.module.system.controller.admin.fixed.vo.*; +import cn.iocoder.yudao.module.system.dal.dataobject.fixed.AttendanceFixedDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.system.dal.mysql.fixed.AttendanceFixedMapper; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; + +/** + * 固定班制考勤设置 Service 实现类 + * + * @author 艾楷 + */ +@Service("fixed") +@Validated +public class AttendanceFixedServiceImpl implements AttendanceFixedService { + + @Resource + private AttendanceFixedMapper fixedMapper; + + @Override + public Long createFixed(AttendanceFixedSaveReqVO createReqVO) { + // 插入 + AttendanceFixedDO fixed = BeanUtils.toBean(createReqVO, AttendanceFixedDO.class); + fixedMapper.insert(fixed); + // 返回 + return fixed.getId(); + } + + @Override + public void updateFixed(AttendanceFixedSaveReqVO updateReqVO) { + // 校验存在 + validateFixedExists(updateReqVO.getId()); + // 更新 + AttendanceFixedDO updateObj = BeanUtils.toBean(updateReqVO, AttendanceFixedDO.class); + fixedMapper.updateById(updateObj); + } + + @Override + public void deleteFixed(Long id) { + // 校验存在 + validateFixedExists(id); + // 删除 + fixedMapper.deleteById(id); + } + + private void validateFixedExists(Long id) { + if (fixedMapper.selectById(id) == null) { + throw exception(FIXED_NOT_EXISTS); + } + } + + @Override + public AttendanceFixedDO getFixed(Long id) { + return fixedMapper.selectById(id); + } + + @Override + public PageResult getFixedPage(AttendanceFixedPageReqVO pageReqVO) { + return fixedMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/group/AttendanceGroupService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/group/AttendanceGroupService.java new file mode 100644 index 00000000..8f02d0e0 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/group/AttendanceGroupService.java @@ -0,0 +1,62 @@ +package cn.iocoder.yudao.module.system.service.group; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.controller.admin.group.vo.AttendanceGroupPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.group.vo.AttendanceGroupSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.group.AttendanceGroupDO; + +import javax.validation.Valid; + +/** + * 考勤组 Service 接口 + * + * @author 艾楷 + */ +public interface AttendanceGroupService { + + /** + * 创建考勤组 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createGroup(@Valid AttendanceGroupSaveReqVO createReqVO); + + /** + * 更新考勤组 + * + * @param updateReqVO 更新信息 + */ + void updateGroup(@Valid AttendanceGroupSaveReqVO updateReqVO); + + /** + * 删除考勤组 + * + * @param id 编号 + */ + void deleteGroup(Long id); + + /** + * 获得考勤组 + * + * @param id 编号 + * @return 考勤组 + */ + AttendanceGroupDO getGroup(Long id); + + /** + * 获得考勤组分页 + * + * @param pageReqVO 分页查询 + * @return 考勤组分页 + */ + PageResult getGroupPage(AttendanceGroupPageReqVO pageReqVO); + + /** + * 获取用户所在群组 + * + * @param userId + * @return + */ + AttendanceGroupDO getByUserId(Long userId); +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/group/AttendanceGroupServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/group/AttendanceGroupServiceImpl.java new file mode 100644 index 00000000..b7c5cd92 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/group/AttendanceGroupServiceImpl.java @@ -0,0 +1,82 @@ +package cn.iocoder.yudao.module.system.service.group; + +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.group.vo.AttendanceGroupPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.group.vo.AttendanceGroupSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.group.AttendanceGroupDO; +import cn.iocoder.yudao.module.system.dal.mysql.group.AttendanceGroupMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.rmi.activation.ActivationGroup; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.GROUP_NOT_EXISTS; + +/** + * 考勤组 Service 实现类 + * + * @author 艾楷 + */ +@Service +@Validated +public class AttendanceGroupServiceImpl implements AttendanceGroupService { + + @Resource + private AttendanceGroupMapper groupMapper; + + @Override + public Long createGroup(AttendanceGroupSaveReqVO createReqVO) { + // 插入 + AttendanceGroupDO group = BeanUtils.toBean(createReqVO, AttendanceGroupDO.class); + groupMapper.insert(group); + // 返回 + return group.getId(); + } + + @Override + public void updateGroup(AttendanceGroupSaveReqVO updateReqVO) { + // 校验存在 + validateGroupExists(updateReqVO.getId()); + // 更新 + AttendanceGroupDO updateObj = BeanUtils.toBean(updateReqVO, AttendanceGroupDO.class); + groupMapper.updateById(updateObj); + } + + @Override + public void deleteGroup(Long id) { + // 校验存在 + validateGroupExists(id); + // 删除 + groupMapper.deleteById(id); + } + + private void validateGroupExists(Long id) { + if (groupMapper.selectById(id) == null) { + throw exception(GROUP_NOT_EXISTS); + } + } + + @Override + public AttendanceGroupDO getGroup(Long id) { + return groupMapper.selectById(id); + } + + @Override + public PageResult getGroupPage(AttendanceGroupPageReqVO pageReqVO) { + return groupMapper.selectPage(pageReqVO); + } + + @Override + public AttendanceGroupDO getByUserId(Long userId) { + List dos = groupMapper.getByUserId(userId); + if (!dos.isEmpty()) { + return dos.get(0); + } + return null; + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/groupshift/AttendanceGroupShiftService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/groupshift/AttendanceGroupShiftService.java new file mode 100644 index 00000000..0a91cac1 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/groupshift/AttendanceGroupShiftService.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.system.service.groupshift; + +import java.util.*; +import javax.validation.*; +import cn.iocoder.yudao.module.system.controller.admin.groupshift.vo.*; +import cn.iocoder.yudao.module.system.dal.dataobject.groupshift.AttendanceGroupShiftDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +/** + * 考勤组班次 Service 接口 + * + * @author 艾楷 + */ +public interface AttendanceGroupShiftService { + + /** + * 创建考勤组班次 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createGroupShift(@Valid AttendanceGroupShiftSaveReqVO createReqVO); + + /** + * 更新考勤组班次 + * + * @param updateReqVO 更新信息 + */ + void updateGroupShift(@Valid AttendanceGroupShiftSaveReqVO updateReqVO); + + /** + * 删除考勤组班次 + * + * @param id 编号 + */ + void deleteGroupShift(Long id); + + /** + * 获得考勤组班次 + * + * @param id 编号 + * @return 考勤组班次 + */ + AttendanceGroupShiftDO getGroupShift(Long id); + + /** + * 获得考勤组班次分页 + * + * @param pageReqVO 分页查询 + * @return 考勤组班次分页 + */ + PageResult getGroupShiftPage(AttendanceGroupShiftPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/groupshift/AttendanceGroupShiftServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/groupshift/AttendanceGroupShiftServiceImpl.java new file mode 100644 index 00000000..24f73428 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/groupshift/AttendanceGroupShiftServiceImpl.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.module.system.service.groupshift; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.iocoder.yudao.module.system.controller.admin.groupshift.vo.*; +import cn.iocoder.yudao.module.system.dal.dataobject.groupshift.AttendanceGroupShiftDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.system.dal.mysql.groupshift.AttendanceGroupShiftMapper; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; + +/** + * 考勤组班次 Service 实现类 + * + * @author 艾楷 + */ +@Service +@Validated +public class AttendanceGroupShiftServiceImpl implements AttendanceGroupShiftService { + + @Resource + private AttendanceGroupShiftMapper groupShiftMapper; + + @Override + public Long createGroupShift(AttendanceGroupShiftSaveReqVO createReqVO) { + // 插入 + AttendanceGroupShiftDO groupShift = BeanUtils.toBean(createReqVO, AttendanceGroupShiftDO.class); + groupShiftMapper.insert(groupShift); + // 返回 + return groupShift.getId(); + } + + @Override + public void updateGroupShift(AttendanceGroupShiftSaveReqVO updateReqVO) { + // 校验存在 + validateGroupShiftExists(updateReqVO.getId()); + // 更新 + AttendanceGroupShiftDO updateObj = BeanUtils.toBean(updateReqVO, AttendanceGroupShiftDO.class); + groupShiftMapper.updateById(updateObj); + } + + @Override + public void deleteGroupShift(Long id) { + // 校验存在 + validateGroupShiftExists(id); + // 删除 + groupShiftMapper.deleteById(id); + } + + private void validateGroupShiftExists(Long id) { + if (groupShiftMapper.selectById(id) == null) { + throw exception(GROUP_SHIFT_NOT_EXISTS); + } + } + + @Override + public AttendanceGroupShiftDO getGroupShift(Long id) { + return groupShiftMapper.selectById(id); + } + + @Override + public PageResult getGroupShiftPage(AttendanceGroupShiftPageReqVO pageReqVO) { + return groupShiftMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/groupuser/AttendanceGroupUserService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/groupuser/AttendanceGroupUserService.java new file mode 100644 index 00000000..56b80eee --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/groupuser/AttendanceGroupUserService.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.system.service.groupuser; + +import java.util.*; +import javax.validation.*; +import cn.iocoder.yudao.module.system.controller.admin.groupuser.vo.*; +import cn.iocoder.yudao.module.system.dal.dataobject.groupuser.AttendanceGroupUserDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +/** + * 考勤组人员 Service 接口 + * + * @author 艾楷 + */ +public interface AttendanceGroupUserService { + + /** + * 创建考勤组人员 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createGroupUser(@Valid AttendanceGroupUserSaveReqVO createReqVO); + + /** + * 更新考勤组人员 + * + * @param updateReqVO 更新信息 + */ + void updateGroupUser(@Valid AttendanceGroupUserSaveReqVO updateReqVO); + + /** + * 删除考勤组人员 + * + * @param id 编号 + */ + void deleteGroupUser(Long id); + + /** + * 获得考勤组人员 + * + * @param id 编号 + * @return 考勤组人员 + */ + AttendanceGroupUserDO getGroupUser(Long id); + + /** + * 获得考勤组人员分页 + * + * @param pageReqVO 分页查询 + * @return 考勤组人员分页 + */ + PageResult getGroupUserPage(AttendanceGroupUserPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/groupuser/AttendanceGroupUserServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/groupuser/AttendanceGroupUserServiceImpl.java new file mode 100644 index 00000000..f95daf34 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/groupuser/AttendanceGroupUserServiceImpl.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.module.system.service.groupuser; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.iocoder.yudao.module.system.controller.admin.groupuser.vo.*; +import cn.iocoder.yudao.module.system.dal.dataobject.groupuser.AttendanceGroupUserDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.system.dal.mysql.groupuser.AttendanceGroupUserMapper; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; + +/** + * 考勤组人员 Service 实现类 + * + * @author 艾楷 + */ +@Service +@Validated +public class AttendanceGroupUserServiceImpl implements AttendanceGroupUserService { + + @Resource + private AttendanceGroupUserMapper groupUserMapper; + + @Override + public Long createGroupUser(AttendanceGroupUserSaveReqVO createReqVO) { + // 插入 + AttendanceGroupUserDO groupUser = BeanUtils.toBean(createReqVO, AttendanceGroupUserDO.class); + groupUserMapper.insert(groupUser); + // 返回 + return groupUser.getId(); + } + + @Override + public void updateGroupUser(AttendanceGroupUserSaveReqVO updateReqVO) { + // 校验存在 + validateGroupUserExists(updateReqVO.getId()); + // 更新 + AttendanceGroupUserDO updateObj = BeanUtils.toBean(updateReqVO, AttendanceGroupUserDO.class); + groupUserMapper.updateById(updateObj); + } + + @Override + public void deleteGroupUser(Long id) { + // 校验存在 + validateGroupUserExists(id); + // 删除 + groupUserMapper.deleteById(id); + } + + private void validateGroupUserExists(Long id) { + if (groupUserMapper.selectById(id) == null) { + throw exception(GROUP_USER_NOT_EXISTS); + } + } + + @Override + public AttendanceGroupUserDO getGroupUser(Long id) { + return groupUserMapper.selectById(id); + } + + @Override + public PageResult getGroupUserPage(AttendanceGroupUserPageReqVO pageReqVO) { + return groupUserMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/punch/PunchService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/punch/PunchService.java new file mode 100644 index 00000000..c3a7e906 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/punch/PunchService.java @@ -0,0 +1,12 @@ +package cn.iocoder.yudao.module.system.service.punch; + +/** + * 打卡 Service 接口 + * + * @author 艾楷 + */ +public interface PunchService { + + + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/punchrecord/AttendancePunchRecordService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/punchrecord/AttendancePunchRecordService.java new file mode 100644 index 00000000..7d5b9caf --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/punchrecord/AttendancePunchRecordService.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.system.service.punchrecord; + +import java.util.*; +import javax.validation.*; +import cn.iocoder.yudao.module.system.controller.admin.punchrecord.vo.*; +import cn.iocoder.yudao.module.system.dal.dataobject.punchrecord.AttendancePunchRecordDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +/** + * 用户打卡记录 Service 接口 + * + * @author 艾楷 + */ +public interface AttendancePunchRecordService { + + /** + * 创建用户打卡记录 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createPunchRecord(@Valid AttendancePunchRecordSaveReqVO createReqVO); + + /** + * 更新用户打卡记录 + * + * @param updateReqVO 更新信息 + */ + void updatePunchRecord(@Valid AttendancePunchRecordSaveReqVO updateReqVO); + + /** + * 删除用户打卡记录 + * + * @param id 编号 + */ + void deletePunchRecord(Long id); + + /** + * 获得用户打卡记录 + * + * @param id 编号 + * @return 用户打卡记录 + */ + AttendancePunchRecordDO getPunchRecord(Long id); + + /** + * 获得用户打卡记录分页 + * + * @param pageReqVO 分页查询 + * @return 用户打卡记录分页 + */ + PageResult getPunchRecordPage(AttendancePunchRecordPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/punchrecord/AttendancePunchRecordServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/punchrecord/AttendancePunchRecordServiceImpl.java new file mode 100644 index 00000000..6bc54ceb --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/punchrecord/AttendancePunchRecordServiceImpl.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.module.system.service.punchrecord; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.iocoder.yudao.module.system.controller.admin.punchrecord.vo.*; +import cn.iocoder.yudao.module.system.dal.dataobject.punchrecord.AttendancePunchRecordDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.system.dal.mysql.punchrecord.AttendancePunchRecordMapper; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; + +/** + * 用户打卡记录 Service 实现类 + * + * @author 艾楷 + */ +@Service +@Validated +public class AttendancePunchRecordServiceImpl implements AttendancePunchRecordService { + + @Resource + private AttendancePunchRecordMapper punchRecordMapper; + + @Override + public Long createPunchRecord(AttendancePunchRecordSaveReqVO createReqVO) { + // 插入 + AttendancePunchRecordDO punchRecord = BeanUtils.toBean(createReqVO, AttendancePunchRecordDO.class); + punchRecordMapper.insert(punchRecord); + // 返回 + return punchRecord.getId(); + } + + @Override + public void updatePunchRecord(AttendancePunchRecordSaveReqVO updateReqVO) { + // 校验存在 + validatePunchRecordExists(updateReqVO.getId()); + // 更新 + AttendancePunchRecordDO updateObj = BeanUtils.toBean(updateReqVO, AttendancePunchRecordDO.class); + punchRecordMapper.updateById(updateObj); + } + + @Override + public void deletePunchRecord(Long id) { + // 校验存在 + validatePunchRecordExists(id); + // 删除 + punchRecordMapper.deleteById(id); + } + + private void validatePunchRecordExists(Long id) { + if (punchRecordMapper.selectById(id) == null) { + throw exception(PUNCH_RECORD_NOT_EXISTS); + } + } + + @Override + public AttendancePunchRecordDO getPunchRecord(Long id) { + return punchRecordMapper.selectById(id); + } + + @Override + public PageResult getPunchRecordPage(AttendancePunchRecordPageReqVO pageReqVO) { + return punchRecordMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/scheduling/AttendanceSchedulingService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/scheduling/AttendanceSchedulingService.java new file mode 100644 index 00000000..2dc4ca64 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/scheduling/AttendanceSchedulingService.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.system.service.scheduling; + +import java.util.*; +import javax.validation.*; +import cn.iocoder.yudao.module.system.controller.admin.scheduling.vo.*; +import cn.iocoder.yudao.module.system.dal.dataobject.scheduling.AttendanceSchedulingDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +/** + * 排班制考勤设置 Service 接口 + * + * @author 艾楷 + */ +public interface AttendanceSchedulingService { + + /** + * 创建排班制考勤设置 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createScheduling(@Valid AttendanceSchedulingSaveReqVO createReqVO); + + /** + * 更新排班制考勤设置 + * + * @param updateReqVO 更新信息 + */ + void updateScheduling(@Valid AttendanceSchedulingSaveReqVO updateReqVO); + + /** + * 删除排班制考勤设置 + * + * @param id 编号 + */ + void deleteScheduling(Long id); + + /** + * 获得排班制考勤设置 + * + * @param id 编号 + * @return 排班制考勤设置 + */ + AttendanceSchedulingDO getScheduling(Long id); + + /** + * 获得排班制考勤设置分页 + * + * @param pageReqVO 分页查询 + * @return 排班制考勤设置分页 + */ + PageResult getSchedulingPage(AttendanceSchedulingPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/scheduling/AttendanceSchedulingServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/scheduling/AttendanceSchedulingServiceImpl.java new file mode 100644 index 00000000..2319a432 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/scheduling/AttendanceSchedulingServiceImpl.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.module.system.service.scheduling; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.iocoder.yudao.module.system.controller.admin.scheduling.vo.*; +import cn.iocoder.yudao.module.system.dal.dataobject.scheduling.AttendanceSchedulingDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.system.dal.mysql.scheduling.AttendanceSchedulingMapper; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; + +/** + * 排班制考勤设置 Service 实现类 + * + * @author 艾楷 + */ +@Service("scheduling") +@Validated +public class AttendanceSchedulingServiceImpl implements AttendanceSchedulingService { + + @Resource + private AttendanceSchedulingMapper schedulingMapper; + + @Override + public Long createScheduling(AttendanceSchedulingSaveReqVO createReqVO) { + // 插入 + AttendanceSchedulingDO scheduling = BeanUtils.toBean(createReqVO, AttendanceSchedulingDO.class); + schedulingMapper.insert(scheduling); + // 返回 + return scheduling.getId(); + } + + @Override + public void updateScheduling(AttendanceSchedulingSaveReqVO updateReqVO) { + // 校验存在 + validateSchedulingExists(updateReqVO.getId()); + // 更新 + AttendanceSchedulingDO updateObj = BeanUtils.toBean(updateReqVO, AttendanceSchedulingDO.class); + schedulingMapper.updateById(updateObj); + } + + @Override + public void deleteScheduling(Long id) { + // 校验存在 + validateSchedulingExists(id); + // 删除 + schedulingMapper.deleteById(id); + } + + private void validateSchedulingExists(Long id) { + if (schedulingMapper.selectById(id) == null) { + throw exception(SCHEDULING_NOT_EXISTS); + } + } + + @Override + public AttendanceSchedulingDO getScheduling(Long id) { + return schedulingMapper.selectById(id); + } + + @Override + public PageResult getSchedulingPage(AttendanceSchedulingPageReqVO pageReqVO) { + return schedulingMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/fixed/AttendanceFixedMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/fixed/AttendanceFixedMapper.xml new file mode 100644 index 00000000..871e1845 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/fixed/AttendanceFixedMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/group/AttendanceGroupMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/group/AttendanceGroupMapper.xml new file mode 100644 index 00000000..3ef95aaa --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/group/AttendanceGroupMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/groupshift/AttendanceGroupShiftMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/groupshift/AttendanceGroupShiftMapper.xml new file mode 100644 index 00000000..de293bf0 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/groupshift/AttendanceGroupShiftMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/groupuser/AttendanceGroupUserMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/groupuser/AttendanceGroupUserMapper.xml new file mode 100644 index 00000000..817415c0 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/groupuser/AttendanceGroupUserMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/punchrecord/AttendancePunchRecordMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/punchrecord/AttendancePunchRecordMapper.xml new file mode 100644 index 00000000..b564016c --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/punchrecord/AttendancePunchRecordMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/scheduling/AttendanceSchedulingMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/scheduling/AttendanceSchedulingMapper.xml new file mode 100644 index 00000000..511d3a24 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/scheduling/AttendanceSchedulingMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file From c1dedf1e262105964e8ae8c833b18a5741b425ad Mon Sep 17 00:00:00 2001 From: aikai Date: Wed, 10 Apr 2024 19:42:33 +0800 Subject: [PATCH 03/50] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=9D=83=E9=99=90?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rule/dept/DeptDataPermissionRule.java | 42 +++++++++-------- .../task/BpmProcessInstanceController.java | 8 +++- .../task/BpmProcessInstanceExtMapper.java | 46 +++++++------------ .../config/DataPermissionConfiguration.java | 21 ++++----- .../task/BpmProcessInstanceServiceImpl.java | 2 +- 5 files changed, 55 insertions(+), 64 deletions(-) diff --git a/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/main/java/cn/iocoder/yudao/framework/datapermission/core/rule/dept/DeptDataPermissionRule.java b/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/main/java/cn/iocoder/yudao/framework/datapermission/core/rule/dept/DeptDataPermissionRule.java index bff515ed..d40d7f5e 100644 --- a/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/main/java/cn/iocoder/yudao/framework/datapermission/core/rule/dept/DeptDataPermissionRule.java +++ b/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/main/java/cn/iocoder/yudao/framework/datapermission/core/rule/dept/DeptDataPermissionRule.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.framework.datapermission.core.rule.dept; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; @@ -22,27 +23,22 @@ import net.sf.jsqlparser.expression.operators.relational.EqualsTo; import net.sf.jsqlparser.expression.operators.relational.ExpressionList; import net.sf.jsqlparser.expression.operators.relational.InExpression; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * 基于部门的 {@link DataPermissionRule} 数据权限规则实现 - * + *

* 注意,使用 DeptDataPermissionRule 时,需要保证表中有 dept_id 部门编号的字段,可自定义。 - * + *

* 实际业务场景下,会存在一个经典的问题?当用户修改部门时,冗余的 dept_id 是否需要修改? * 1. 一般情况下,dept_id 不进行修改,则会导致用户看不到之前的数据。【yudao-server 采用该方案】 * 2. 部分情况下,希望该用户还是能看到之前的数据,则有两种方式解决:【需要你改造该 DeptDataPermissionRule 的实现代码】 - * 1)编写洗数据的脚本,将 dept_id 修改成新部门的编号;【建议】 - * 最终过滤条件是 WHERE dept_id = ? - * 2)洗数据的话,可能涉及的数据量较大,也可以采用 user_id 进行过滤的方式,此时需要获取到 dept_id 对应的所有 user_id 用户编号; - * 最终过滤条件是 WHERE user_id IN (?, ?, ? ...) - * 3)想要保证原 dept_id 和 user_id 都可以看的到,此时使用 dept_id 和 user_id 一起过滤; - * 最终过滤条件是 WHERE dept_id = ? OR user_id IN (?, ?, ? ...) - * - + * 1)编写洗数据的脚本,将 dept_id 修改成新部门的编号;【建议】 + * 最终过滤条件是 WHERE dept_id = ? + * 2)洗数据的话,可能涉及的数据量较大,也可以采用 user_id 进行过滤的方式,此时需要获取到 dept_id 对应的所有 user_id 用户编号; + * 最终过滤条件是 WHERE user_id IN (?, ?, ? ...) + * 3)想要保证原 dept_id 和 user_id 都可以看的到,此时使用 dept_id 和 user_id 一起过滤; + * 最终过滤条件是 WHERE dept_id = ? OR user_id IN (?, ?, ? ...) */ @AllArgsConstructor @Slf4j @@ -60,10 +56,15 @@ public class DeptDataPermissionRule implements DataPermissionRule { private final PermissionApi permissionApi; + // TODO: 2024/4/10 注意 - 如果需要降级低权的话 要把需要的表名称加在这里 并且在方法上开启数据权限 并且添加 DataPermissionConfiguration 对象 + private static final List LOW_POWER_TABLES = Arrays.asList( + "bpm_process_instance_ext" + ); + /** * 基于部门的表字段配置 * 一般情况下,每个表的部门编号字段是 dept_id,通过该配置自定义。 - * + *

* key:表名 * value:字段名 */ @@ -71,7 +72,7 @@ public class DeptDataPermissionRule implements DataPermissionRule { /** * 基于用户的表字段配置 * 一般情况下,每个表的部门编号字段是 dept_id,通过该配置自定义。 - * + *

* key:表名 * value:字段名 */ @@ -113,18 +114,19 @@ public class DeptDataPermissionRule implements DataPermissionRule { } // 情况一,如果是 ALL 可查看全部,则无需拼接条件 - if (deptDataPermission.getAll()) { + // 并且 (低权 和 支持地权) 都不成立 + if (deptDataPermission.getAll() && !((deptDataPermission.getSelf() || CollectionUtil.isNotEmpty(deptDataPermission.getDeptIds())) && LOW_POWER_TABLES.contains(tableName))) { return null; } // 情况二,即不能查看部门,又不能查看自己,则说明 100% 无权限 if (CollUtil.isEmpty(deptDataPermission.getDeptIds()) - && Boolean.FALSE.equals(deptDataPermission.getSelf())) { + && Boolean.FALSE.equals(deptDataPermission.getSelf())) { return new EqualsTo(null, null); // WHERE null = null,可以保证返回的数据为空 } // 情况三,拼接 Dept 和 User 的条件,最后组合 - Expression deptExpression = buildDeptExpression(tableName,tableAlias, deptDataPermission.getDeptIds()); + Expression deptExpression = buildDeptExpression(tableName, tableAlias, deptDataPermission.getDeptIds()); Expression userExpression = buildUserExpression(tableName, tableAlias, deptDataPermission.getSelf(), loginUser.getId()); if (deptExpression == null && userExpression == null) { // TODO 芋艿:获得不到条件的时候,暂时不抛出异常,而是不返回数据 @@ -180,7 +182,7 @@ public class DeptDataPermissionRule implements DataPermissionRule { public void addDeptColumn(Class entityClass, String columnName) { String tableName = TableInfoHelper.getTableInfo(entityClass).getTableName(); - addDeptColumn(tableName, columnName); + addDeptColumn(tableName, columnName); } public void addDeptColumn(String tableName, String columnName) { diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java index c10b3375..3ef62b01 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java @@ -25,7 +25,6 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti @RestController @RequestMapping("/bpm/process-instance") @Validated -@DataPermission(enable = false) public class BpmProcessInstanceController { @Resource @@ -34,6 +33,7 @@ public class BpmProcessInstanceController { @GetMapping("/my-page") @Operation(summary = "获得我的实例分页列表", description = "在【我的流程】菜单中,进行调用") @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") + @DataPermission(enable = false) public CommonResult> getMyProcessInstancePage( @Valid BpmProcessInstanceMyPageReqVO pageReqVO) { return success(processInstanceService.getMyProcessInstancePage(getLoginUserId(), pageReqVO)); @@ -42,6 +42,7 @@ public class BpmProcessInstanceController { @PostMapping("/create") @Operation(summary = "新建流程实例") @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") + @DataPermission(enable = false) public CommonResult createProcessInstance(@Valid @RequestBody BpmProcessInstanceCreateReqVO createReqVO) { return success(processInstanceService.createProcessInstance(getLoginUserId(), createReqVO)); } @@ -50,6 +51,7 @@ public class BpmProcessInstanceController { @Operation(summary = "获得指定流程实例", description = "在【流程详细】界面中,进行调用") @Parameter(name = "id", description = "流程实例的编号", required = true) @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") + @DataPermission(enable = false) public CommonResult getProcessInstance(@RequestParam("id") String id) { return success(processInstanceService.getProcessInstanceVO(id)); } @@ -57,6 +59,7 @@ public class BpmProcessInstanceController { @DeleteMapping("/cancel") @Operation(summary = "取消流程实例", description = "撤回发起的流程") @PreAuthorize("@ss.hasPermission('bpm:process-instance:cancel')") + @DataPermission(enable = false) public CommonResult cancelProcessInstance(@Valid @RequestBody BpmProcessInstanceCancelReqVO cancelReqVO) { processInstanceService.cancelProcessInstance(getLoginUserId(), cancelReqVO); return success(true); @@ -69,6 +72,7 @@ public class BpmProcessInstanceController { @GetMapping("/process_instance_group_name_statistics") @Operation(summary = "根据流程名称分组,统计各个流程的具体实例数据", description = "根据流程名称分组,统计各个流程的具体实例数据") //@PreAuthorize("@ss.hasPermission('bpm:task:update')") + @DataPermission(enable = false) public CommonResult> getProcessInstancesGroupByModelName(@Valid BpmProcessInstanceStatisticsReqVO reqVO) { List list = processInstanceService.getProcessInstancesGroupByModelName(reqVO); return success(list); @@ -80,6 +84,7 @@ public class BpmProcessInstanceController { */ @GetMapping("/process_instance_result_status_statistics") @Operation(summary = "流程实例的状态统计查询", description = "根据流程状态(处理中,通过,不通过,取消),统计各个状态的数据量") + @DataPermission(enable = false) public CommonResult> getProcessInstancesGroupByResultStatus(@Valid BpmProcessInstanceStatisticsReqVO reqVO) { List list = processInstanceService.getProcessInstancesGroupByResultStatus(reqVO); return success(list); @@ -95,6 +100,7 @@ public class BpmProcessInstanceController { @GetMapping("/getUserProcessTpo10") @Operation(summary = "获得用户审批耗时最长Top10", description = "在工作台-给数据权限是可以查看全部数据的用户查询使用") + @DataPermission(enable = false) public CommonResult> getUserProcessTpo10(@Valid BpmProcessInstanceStatisticsReqVO reqVO) { List list = processInstanceService.getUserProcessTpo10(reqVO); return success(list); diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java index 4916ce68..8128614e 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java @@ -8,10 +8,7 @@ import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessI import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceStatisticsReqVO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceStatisticsRespVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; import java.util.List; @@ -21,7 +18,7 @@ public interface BpmProcessInstanceExtMapper extends BaseMapperX selectCCPage(Long userId, BpmProcessInstanceMyPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() // .eqIfPresent(BpmProcessInstanceExtDO::getStartUserId, userId) - .likeIfPresent(BpmProcessInstanceExtDO::getCcids, "["+userId+"]") + .likeIfPresent(BpmProcessInstanceExtDO::getCcids, "[" + userId + "]") .eqIfPresent(BpmProcessInstanceExtDO::getProcessDefinitionId, reqVO.getProcessDefinitionId()) .eqIfPresent(BpmProcessInstanceExtDO::getCategory, reqVO.getCategory()) .eqIfPresent(BpmProcessInstanceExtDO::getStatus, reqVO.getStatus()) @@ -53,36 +50,25 @@ public interface BpmProcessInstanceExtMapper extends BaseMapperX getProcessInstancesGroupByModelName(BpmProcessInstanceStatisticsReqVO reqVO) ; + List getProcessInstancesGroupByModelName(BpmProcessInstanceStatisticsReqVO reqVO); - List getProcessInstancesGroupByResultStatus(BpmProcessInstanceStatisticsReqVO reqVO) ; + List getProcessInstancesGroupByResultStatus(BpmProcessInstanceStatisticsReqVO reqVO); + + default PageResult selectStatisticePage(BpmProcessInstanceMyPageReqVO reqVO) { + //如果为空,那么查询全部 + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(BpmProcessInstanceExtDO::getName, reqVO.getName()) + .eqIfPresent(BpmProcessInstanceExtDO::getProcessDefinitionId, reqVO.getProcessDefinitionId()) + .eqIfPresent(BpmProcessInstanceExtDO::getCategory, reqVO.getCategory()) + .eqIfPresent(BpmProcessInstanceExtDO::getStatus, reqVO.getStatus()) + .eqIfPresent(BpmProcessInstanceExtDO::getResult, reqVO.getResult()) + .betweenIfPresent(BpmProcessInstanceExtDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(BpmProcessInstanceExtDO::getId)); - default PageResult selectStatisticePage(Long[] userIds, BpmProcessInstanceMyPageReqVO reqVO) { - if( userIds == null ) { - //如果为空,那么查询全部 - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(BpmProcessInstanceExtDO::getName, reqVO.getName()) - .eqIfPresent(BpmProcessInstanceExtDO::getProcessDefinitionId, reqVO.getProcessDefinitionId()) - .eqIfPresent(BpmProcessInstanceExtDO::getCategory, reqVO.getCategory()) - .eqIfPresent(BpmProcessInstanceExtDO::getStatus, reqVO.getStatus()) - .eqIfPresent(BpmProcessInstanceExtDO::getResult, reqVO.getResult()) - .betweenIfPresent(BpmProcessInstanceExtDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(BpmProcessInstanceExtDO::getId)); - }else { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(BpmProcessInstanceExtDO::getName, reqVO.getName()) - .eqIfPresent(BpmProcessInstanceExtDO::getProcessDefinitionId, reqVO.getProcessDefinitionId()) - .eqIfPresent(BpmProcessInstanceExtDO::getCategory, reqVO.getCategory()) - .eqIfPresent(BpmProcessInstanceExtDO::getStatus, reqVO.getStatus()) - .eqIfPresent(BpmProcessInstanceExtDO::getResult, reqVO.getResult()) - .betweenIfPresent(BpmProcessInstanceExtDO::getCreateTime, reqVO.getCreateTime()) - .in(BpmProcessInstanceExtDO::getStartUserId,userIds) - .orderByDesc(BpmProcessInstanceExtDO::getId)); - } } - List getUserProcessTpo10(BpmProcessInstanceStatisticsReqVO reqVO) ; + List getUserProcessTpo10(BpmProcessInstanceStatisticsReqVO reqVO); - List selectUnfinishProcessCount(BpmProcessInstanceStatisticsReqVO reqVO) ; + List selectUnfinishProcessCount(BpmProcessInstanceStatisticsReqVO reqVO); } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/datapermission/config/DataPermissionConfiguration.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/datapermission/config/DataPermissionConfiguration.java index 0c0c3938..140c9c14 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/datapermission/config/DataPermissionConfiguration.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/datapermission/config/DataPermissionConfiguration.java @@ -8,20 +8,17 @@ import org.springframework.context.annotation.Configuration; /** * 工作流 模块的数据权限 Configuration * - + */ -//@Configuration(proxyBeanMethods = false) +@Configuration(proxyBeanMethods = false) public class DataPermissionConfiguration { -// @Bean -// public DeptDataPermissionRuleCustomizer sysDeptDataPermissionRuleCustomizer() { -// return rule -> { -// // dept -// rule.addDeptColumn(AdminUserDO.class); -// rule.addDeptColumn(DeptDO.class, "id"); -// // user -// rule.addUserColumn(BpmProcessInstanceExtDO.class, "start_user_id"); -// }; -// } + @Bean + public DeptDataPermissionRuleCustomizer sysDeptDataPermissionRuleCustomizer() { + return rule -> { + // user + rule.addUserColumn(BpmProcessInstanceExtDO.class, "start_user_id"); + }; + } } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index ab87c40d..8a53a6aa 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -1 +1 @@ -package cn.iocoder.yudao.module.bpm.service.task; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.number.NumberUtils; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO; import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmTaskAssignRuleMapper; import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmProcessInstanceExtMapper; import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmTaskExtMapper; import cn.iocoder.yudao.module.bpm.enums.task.BpmConstants; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum; import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventPublisher; import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; import cn.iocoder.yudao.module.bpm.service.definition.BpmUserGroupService; import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService; import cn.iocoder.yudao.module.system.api.dept.DeptApi; import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; import cn.iocoder.yudao.module.system.api.permission.PermissionApi; import cn.iocoder.yudao.module.system.api.permission.dto.DeptDataPermissionRespDTO; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.HistoryService; import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; import org.flowable.engine.delegate.event.FlowableCancelledEvent; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.task.api.Task; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import javax.validation.Valid; import java.lang.reflect.Field; import java.text.DecimalFormat; import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getLoginUserId; import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; /** * 流程实例 Service 实现类 * * ProcessDefinition & ProcessInstance & Execution & Task 的关系: * 1. * * HistoricProcessInstance & ProcessInstance 的关系: * 1. * * 简单来说,前者 = 历史 + 运行中的流程实例,后者仅是运行中的流程实例 * */ @Service @Validated @Slf4j public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService { @Resource private TaskService engineTaskService; @Resource private BpmTaskAssignRuleMapper taskRuleMapper; @Resource private BpmUserGroupService userGroupService; @Resource private RuntimeService runtimeService; @Resource private BpmProcessInstanceExtMapper processInstanceExtMapper; @Resource @Lazy // 解决循环依赖 private BpmTaskService taskService; @Resource private BpmProcessDefinitionService processDefinitionService; @Resource private HistoryService historyService; @Resource private AdminUserApi adminUserApi; @Resource private DeptApi deptApi; @Resource private BpmProcessInstanceResultEventPublisher processInstanceResultEventPublisher; @Resource @Lazy // 解决循环依赖 private BpmMessageService messageService; @Override public ProcessInstance getProcessInstance(String id) { return runtimeService.createProcessInstanceQuery().processInstanceId(id).singleResult(); } @Override public List getProcessInstances(Set ids) { return runtimeService.createProcessInstanceQuery().processInstanceIds(ids).list(); } @Override public PageResult getMyProcessInstancePage(Long userId, BpmProcessInstanceMyPageReqVO pageReqVO) { // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页 PageResult pageResult = processInstanceExtMapper.selectPage(userId, pageReqVO); if (CollUtil.isEmpty(pageResult.getList())) { return new PageResult<>(pageResult.getTotal()); } // 获得流程 Task Map List processInstanceIds = convertList(pageResult.getList(), BpmProcessInstanceExtDO::getProcessInstanceId); Map> taskMap = taskService.getTaskMapByProcessInstanceIds(processInstanceIds); List ids = taskMap.values().stream() .flatMap(Collection::stream) .map(Task::getAssignee) .collect(Collectors.toList()); List longIds = ids.stream() .map(Long::valueOf) .collect(Collectors.toList()); // 获得 User Map Map userMap = adminUserApi.getUserMap(longIds); // 转换返回 return BpmProcessInstanceConvert.INSTANCE.convertPage(pageResult, taskMap, userMap); } @Override @Transactional(rollbackFor = Exception.class) public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqVO createReqVO) { // 获得流程定义 ProcessDefinition definition = processDefinitionService.getProcessDefinition(createReqVO.getProcessDefinitionId()); // 发起流程 return createProcessInstance0(userId, definition, createReqVO.getVariables(), null); } @Override public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO createReqDTO) { // 获得流程定义 ProcessDefinition definition = processDefinitionService.getActiveProcessDefinition(createReqDTO.getProcessDefinitionKey()); // 发起流程 return createProcessInstance0(userId, definition, createReqDTO.getVariables(), createReqDTO.getBusinessKey()); } @Override public BpmProcessInstanceRespVO getProcessInstanceVO(String id) { // 获得流程实例 HistoricProcessInstance processInstance = getHistoricProcessInstance(id); if (processInstance == null) { return null; } BpmProcessInstanceExtDO processInstanceExt = processInstanceExtMapper.selectByProcessInstanceId(id); Assert.notNull(processInstanceExt, "流程实例拓展({}) 不存在", id); // 获得流程定义 ProcessDefinition processDefinition = processDefinitionService .getProcessDefinition(processInstance.getProcessDefinitionId()); Assert.notNull(processDefinition, "流程定义({}) 不存在", processInstance.getProcessDefinitionId()); BpmProcessDefinitionExtDO processDefinitionExt = processDefinitionService.getProcessDefinitionExt( processInstance.getProcessDefinitionId()); Assert.notNull(processDefinitionExt, "流程定义拓展({}) 不存在", id); String bpmnXml = processDefinitionService.getProcessDefinitionBpmnXML(processInstance.getProcessDefinitionId()); // 获得 User AdminUserRespDTO startUser = adminUserApi.getUser(NumberUtils.parseLong(processInstance.getStartUserId())).getCheckedData(); DeptRespDTO dept = null; if (startUser != null) { dept = deptApi.getDept(startUser.getDeptId()).getCheckedData(); } // 拼接结果 return BpmProcessInstanceConvert.INSTANCE.convert2(processInstance, processInstanceExt, processDefinition, processDefinitionExt, bpmnXml, startUser, dept); } @Override public void cancelProcessInstance(Long userId, @Valid BpmProcessInstanceCancelReqVO cancelReqVO) { // 校验流程实例存在 ProcessInstance instance = getProcessInstance(cancelReqVO.getId()); if (instance == null) { throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_EXISTS); } // 只能取消自己的 if (!Objects.equals(instance.getStartUserId(), String.valueOf(userId))) { throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF); } // 通过删除流程实例,实现流程实例的取消, // 删除流程实例,正则执行任务 ACT_RU_TASK. 任务会被删除。通过历史表查询 deleteProcessInstance(cancelReqVO.getId(), BpmProcessInstanceDeleteReasonEnum.CANCEL_TASK.format(cancelReqVO.getReason())); } /** * 获得历史的流程实例 * * @param id 流程实例的编号 * @return 历史的流程实例 */ @Override public HistoricProcessInstance getHistoricProcessInstance(String id) { return historyService.createHistoricProcessInstanceQuery().processInstanceId(id).singleResult(); } @Override public List getHistoricProcessInstances(Set ids) { return historyService.createHistoricProcessInstanceQuery().processInstanceIds(ids).list(); } @Override public void createProcessInstanceExt(ProcessInstance instance) { // 获得流程定义 ProcessDefinition definition = processDefinitionService.getProcessDefinition2(instance.getProcessDefinitionId()); // 插入 BpmProcessInstanceExtDO 对象 BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO() .setProcessInstanceId(instance.getId()) .setProcessDefinitionId(definition.getId()) .setName(instance.getProcessDefinitionName()) .setStartUserId(Long.valueOf(instance.getStartUserId())) .setCategory(definition.getCategory()) .setStatus(BpmProcessInstanceStatusEnum.RUNNING.getStatus()) .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); processInstanceExtMapper.insert(instanceExtDO); } @Override public void updateProcessInstanceExtCancel(FlowableCancelledEvent event) { // 判断是否为 Reject 不通过。如果是,则不进行更新. // 因为,updateProcessInstanceExtReject 方法,已经进行更新了 if (BpmProcessInstanceDeleteReasonEnum.isRejectReason((String)event.getCause())) { return; } // 需要主动查询,因为 instance 只有 id 属性 // 另外,此时如果去查询 ProcessInstance 的话,字段是不全的,所以去查询了 HistoricProcessInstance HistoricProcessInstance processInstance = getHistoricProcessInstance(event.getProcessInstanceId()); // 更新拓展表 BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO() .setProcessInstanceId(event.getProcessInstanceId()) .setEndTime(LocalDateTime.now()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置 .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) .setResult(BpmProcessInstanceResultEnum.CANCEL.getResult()); processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); // 发送流程实例的状态事件 processInstanceResultEventPublisher.sendProcessInstanceResultEvent( BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult())); } @Override public void updateProcessInstanceExtComplete(ProcessInstance instance) { // 需要主动查询,因为 instance 只有 id 属性 // 另外,此时如果去查询 ProcessInstance 的话,字段是不全的,所以去查询了 HistoricProcessInstance HistoricProcessInstance processInstance = getHistoricProcessInstance(instance.getId()); // 更新拓展表 BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO() .setProcessInstanceId(instance.getProcessInstanceId()) .setEndTime(LocalDateTime.now()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置 .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) .setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()); // 如果正常完全,说明审批通过 processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); Map processVariables = runtimeService.getVariables(instance.getProcessInstanceId()); String reason = (String)processVariables.get("approve_reason") ; // 发送流程被通过的消息 messageService.sendMessageWhenProcessInstanceApprove(BpmProcessInstanceConvert.INSTANCE.convert2ApprovedReq(instance,reason)); // 发送流程实例的状态事件 processInstanceResultEventPublisher.sendProcessInstanceResultEvent( BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult())); } @Override @Transactional(rollbackFor = Exception.class) public void updateProcessInstanceExtReject(String id, String reason) { // 需要主动查询,因为 instance 只有 id 属性 ProcessInstance processInstance = getProcessInstance(id); // 删除流程实例,以实现驳回任务时,取消整个审批流程 deleteProcessInstance(id, StrUtil.format(BpmProcessInstanceDeleteReasonEnum.REJECT_TASK.format(reason))); // 更新 status + result // 注意,不能和上面的逻辑更换位置。因为 deleteProcessInstance 会触发流程的取消,进而调用 updateProcessInstanceExtCancel 方法, // 设置 result 为 BpmProcessInstanceStatusEnum.CANCEL,显然和 result 不一定是一致的 BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO().setProcessInstanceId(id) .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) .setResult(BpmProcessInstanceResultEnum.REJECT.getResult()); processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); // 发送流程被不通过的消息 messageService.sendMessageWhenProcessInstanceReject(BpmProcessInstanceConvert.INSTANCE.convert2RejectReq(processInstance, reason)); // 发送流程实例的状态事件 processInstanceResultEventPublisher.sendProcessInstanceResultEvent( BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult())); } private void deleteProcessInstance(String id, String reason) { runtimeService.deleteProcessInstance(id, reason); } private String createProcessInstance0(Long userId, ProcessDefinition definition, Map variables, String businessKey) { // 校验流程定义 if (definition == null) { throw exception(PROCESS_DEFINITION_NOT_EXISTS); } if (definition.isSuspended()) { throw exception(PROCESS_DEFINITION_IS_SUSPENDED); } // 创建流程实例 ProcessInstance instance = runtimeService.createProcessInstanceBuilder() .processDefinitionId(definition.getId()) .businessKey(businessKey) .name(definition.getName().trim()) .variables(variables) .start(); // 设置流程名字 runtimeService.setProcessInstanceName(instance.getId(), definition.getName()); // 补全流程实例的拓展表 processInstanceExtMapper.updateByProcessInstanceId(new BpmProcessInstanceExtDO().setProcessInstanceId(instance.getId()) .setFormVariables(variables)); /** 创建流程后,添加抄送人 End add by yj 2024.1.4 */ processCCToUsers(definition,instance) ; /** 通过自己发起的流程 */ approveSelfTask(instance.getId()) ; return instance.getId(); } private void approveSelfTask(String processInstanceId ) { List tasks =engineTaskService.createTaskQuery().processInstanceId(processInstanceId).list() ; if( tasks != null && tasks.size() > 0) { Task task = tasks.get(0) ; String assigneeId = task.getAssignee(); //如果当前登陆用户是审批人,那么自动审批通过 if( assigneeId.equals( SecurityFrameworkUtils.getLoginUserId().toString() )) { BpmTaskApproveReqVO reqVO = new BpmTaskApproveReqVO() ; reqVO.setId(task.getId()) ; reqVO.setReason(BpmConstants.AUTO_APPRAVAL); taskService.approveTask(getLoginUserId(), reqVO); } } } /** * 获得抄送我的流程实例的分页 * * @param userId 用户编号 * @param pageReqVO 分页请求 * @return 流程实例的分页 */ public PageResult getMyCCProcessInstancePage(Long userId, BpmProcessInstanceMyPageReqVO pageReqVO) { // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页 PageResult pageResult = processInstanceExtMapper.selectCCPage(userId, pageReqVO); if (CollUtil.isEmpty(pageResult.getList())) { return new PageResult<>(pageResult.getTotal()); } // 获得流程 Task Map List processInstanceIds = convertList(pageResult.getList(), BpmProcessInstanceExtDO::getProcessInstanceId); Map> taskMap = taskService.getTaskMapByProcessInstanceIds(processInstanceIds); // 转换返回 return BpmProcessInstanceConvert.INSTANCE.convertPage(pageResult, taskMap,null); } public List getProcessInstancesGroupByModelName(BpmProcessInstanceStatisticsReqVO pageReqVO){ pageReqVO = getUserids(pageReqVO) ; return processInstanceExtMapper.getProcessInstancesGroupByModelName(pageReqVO) ; } public List getProcessInstancesGroupByResultStatus(BpmProcessInstanceStatisticsReqVO pageReqVO){ pageReqVO = getUserids(pageReqVO) ; return processInstanceExtMapper.getProcessInstancesGroupByResultStatus(pageReqVO) ; } public PageResult getStatisticsProcessInstancePage(@Valid BpmProcessInstanceMyPageReqVO pageReqVO) { pageReqVO = getUserids(pageReqVO) ; // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页 PageResult pageResult = processInstanceExtMapper.selectStatisticePage(pageReqVO.getUserIds(), pageReqVO); if (CollUtil.isEmpty(pageResult.getList())) { return new PageResult<>(pageResult.getTotal()); } // 获得流程 Task Map List processInstanceIds = convertList(pageResult.getList(), BpmProcessInstanceExtDO::getProcessInstanceId); Map> taskMap = taskService.getTaskMapByProcessInstanceIds(processInstanceIds); List ids = taskMap.values().stream() .flatMap(Collection::stream) .map(Task::getAssignee) .collect(Collectors.toList()); List longIds = ids.stream() .map(Long::valueOf) .collect(Collectors.toList()); //获得 审批人 User Map Map assigneeUserMap = adminUserApi.getUserMap(longIds); //获得 发起人 User Map List bpieDOs = pageResult.getList() ; longIds = new ArrayList<>() ; for (BpmProcessInstanceExtDO bpieDO: bpieDOs) { longIds.add(bpieDO.getStartUserId()) ; } Map startUserMap = adminUserApi.getUserMap(longIds); // 转换返回 return BpmProcessInstanceConvert.INSTANCE.convertStatisticsPage(pageResult, taskMap, assigneeUserMap,startUserMap); } @Resource PermissionApi permissionApi; /** * 根据数据权限,查询关联操作的用户IDS * @param pageReqVO * @return * @param */ private T getUserids(T pageReqVO) { try { Class clazz = (Class) pageReqVO.getClass(); Field idField = clazz.getDeclaredField("userIds"); idField.setAccessible(true); // 设置可访问性 Long[] userIds = null; Long userId = WebFrameworkUtils.getLoginUserId(); DeptDataPermissionRespDTO deptDataPermission = permissionApi.getDeptDataPermission(userId).getCheckedData(); //查询全部 if (deptDataPermission.getAll()) { //idField.set(pageReqVO, null); // 设置属性值 return pageReqVO; } // 情况二,即不能查看部门,又不能查看自己,则说明 100% 无权限 if (CollUtil.isEmpty(deptDataPermission.getDeptIds()) && Boolean.FALSE.equals(deptDataPermission.getSelf())) { //设置成0,一个不存在的用户Id,就查询不到数据了。 userIds = new Long[]{0L}; idField.set(pageReqVO, userIds); return pageReqVO; } //情况三 至查询自己 if (deptDataPermission.getSelf()) { userIds = new Long[]{userId}; idField.set(pageReqVO, userIds); return pageReqVO; } Set deptIds = deptDataPermission.getDeptIds(); //查询部门关联的用户Id List users = adminUserApi.getUserListByDeptIds(deptIds).getCheckedData(); List tempList = new ArrayList<>(); for (AdminUserRespDTO user : users) { Long id = user.getId(); tempList.add(id); } tempList.add(userId); userIds = tempList.stream().toArray(Long[]::new); //将临时的List集合转换成数组集合 idField.set(pageReqVO, userIds); return pageReqVO; }catch (Exception exception){ exception.printStackTrace(); throw exception(BPM_SYSTEM_BUG); } } /** * /创建流程后,添加抄送人 Begin add by yj 2024.1.4 * 在设计流程的时候,需要添加一个任务块 名字必须叫Activity_cc 分配权限的时候,需要选择用户组。 * * @param definition * @param instance */ private void processCCToUsers(ProcessDefinition definition, ProcessInstance instance) { //获取bpm_task_assign_reule (Bpm 任务规则表)的流程中有没有配置抄送节点 固定抄送名称为:Activity_cc String processDefinitionId = definition.getId() ; List rules = taskRuleMapper.selectListByProcessDefinitionId(processDefinitionId, null); for(BpmTaskAssignRuleDO rule :rules ){ String key = rule.getTaskDefinitionKey() ; //任务名称 Integer type = rule.getType() ; if( !key.isEmpty() && key.equals(BpmConstants.CC_NAME) && type == 40 ) { StringBuffer str = new StringBuffer() ; Set options = rule.getOptions() ; List list = new ArrayList(options); for(Long groupId : list) { //需要根据这个groupId,查询这个组中的用户id BpmUserGroupDO userGroup = userGroupService.getUserGroup(groupId); Set userIds = userGroup.getMemberUserIds() ; List userIdList = new ArrayList(userIds); for(Long user_id : userIdList) { str.append("[").append(user_id).append("]") ; } } String ccids = str.toString() ; //根据processDefinitionId 将ccids保存到bpm_process_instance_ext中的ccids字段 BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO().setProcessDefinitionId(processDefinitionId) .setCcids(ccids) .setProcessInstanceId(instance.getProcessInstanceId()); processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); break ; } } } @Resource private BpmTaskExtMapper taskExtMapper; @Override public List getUserProcessTpo10(BpmProcessInstanceStatisticsReqVO pageReqVO) { //按审核人分组查询,统计已完成流程数量及平均耗时间 List respVOS = processInstanceExtMapper.getUserProcessTpo10(pageReqVO); if( respVOS == null || respVOS.size() == 0) { return null ; } List idList = respVOS.stream() .map(BpmProcessFinishStatisticsRespVO::getUserId) .collect(Collectors.toList()); //根据userId,查询UserMap Map userMap = adminUserApi.getUserMap(idList) ; Long[] idsArray = new Long[userMap.size()]; // 使用 map 的 keySet() 方法获取键集合 Set keys = userMap.keySet(); // 遍历键集合,将每个键添加到数组中 int index = 0; for (Long key : keys) { idsArray[index++] = key; } pageReqVO.setUserIds(idsArray) ; //按审核人分组查询,未审批完成的流程数量 List bpmTaskExtDOs = processInstanceExtMapper.selectUnfinishProcessCount( pageReqVO ) ; //按审核人分组查询,未完成的记录数 Map unFinfishCountCountMap = new HashMap<>(); for (BpmProcessFinishStatisticsRespVO item : bpmTaskExtDOs) { unFinfishCountCountMap.put(item.getUserId(), item.getUnFinfishCount()); } respVOS.forEach(respVO -> respVO.setName( userMap.get(respVO.getUserId()).getNickname())); respVOS.forEach(respVO -> respVO.setUnFinfishCount( unFinfishCountCountMap.get(respVO.getUserId()))); //获取排行榜第一记录的耗时,作为基础数据 double num = Double.parseDouble(respVOS.get(0).getUserTime()); // 先将字符串转换为双精度浮点数 int baseNumber = (int)num; // 再通过类型转换操作符将其转换为整数 DecimalFormat df = new DecimalFormat("#.00"); respVOS.forEach(respVO -> { //格式化流程完成率 float finfishCount = (float) respVO.getFinfishCount() ; float unFinfishCount = respVO.getUnFinfishCount() == null ? 0: respVO.getUnFinfishCount(); float all = finfishCount + unFinfishCount ; float result = finfishCount / all; float rate = result * 100 ; respVO.setCompletionRate(df.format(rate)+"%") ; double dValue = Double.parseDouble(respVO.getUserTime()); // 将字符串转换为double类型 int roundedValue = (int) Math.round(dValue); // 使用Math.round()进行四舍五入,并转换为int类型 respVO.setUserTime(roundedValue+"") ; //格式化进度百度比, 参照最高的数据进行百分比显示 double percentage = ((int)Double.parseDouble(respVO.getUserTime()) / (double) baseNumber) * 100; respVO.setPercentage((int) Math.round(percentage)) ; //设置未完成 respVO.setUnFinfishCount( Integer.valueOf((int)unFinfishCount)) ; }); return respVOS ; } @Override public BpmProcessInstanceExtDO getProcessInstanceDO(String id) { return processInstanceExtMapper.selectByProcessInstanceId(id); } } \ No newline at end of file +package cn.iocoder.yudao.module.bpm.service.task; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.number.NumberUtils; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO; import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmTaskAssignRuleMapper; import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmProcessInstanceExtMapper; import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmTaskExtMapper; import cn.iocoder.yudao.module.bpm.enums.task.BpmConstants; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum; import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventPublisher; import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; import cn.iocoder.yudao.module.bpm.service.definition.BpmUserGroupService; import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService; import cn.iocoder.yudao.module.system.api.dept.DeptApi; import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; import cn.iocoder.yudao.module.system.api.permission.PermissionApi; import cn.iocoder.yudao.module.system.api.permission.dto.DeptDataPermissionRespDTO; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.HistoryService; import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; import org.flowable.engine.delegate.event.FlowableCancelledEvent; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.task.api.Task; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import javax.validation.Valid; import java.lang.reflect.Field; import java.text.DecimalFormat; import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getLoginUserId; import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; /** * 流程实例 Service 实现类 * * ProcessDefinition & ProcessInstance & Execution & Task 的关系: * 1. * * HistoricProcessInstance & ProcessInstance 的关系: * 1. * * 简单来说,前者 = 历史 + 运行中的流程实例,后者仅是运行中的流程实例 * */ @Service @Validated @Slf4j public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService { @Resource private TaskService engineTaskService; @Resource private BpmTaskAssignRuleMapper taskRuleMapper; @Resource private BpmUserGroupService userGroupService; @Resource private RuntimeService runtimeService; @Resource private BpmProcessInstanceExtMapper processInstanceExtMapper; @Resource @Lazy // 解决循环依赖 private BpmTaskService taskService; @Resource private BpmProcessDefinitionService processDefinitionService; @Resource private HistoryService historyService; @Resource private AdminUserApi adminUserApi; @Resource private DeptApi deptApi; @Resource private BpmProcessInstanceResultEventPublisher processInstanceResultEventPublisher; @Resource @Lazy // 解决循环依赖 private BpmMessageService messageService; @Override public ProcessInstance getProcessInstance(String id) { return runtimeService.createProcessInstanceQuery().processInstanceId(id).singleResult(); } @Override public List getProcessInstances(Set ids) { return runtimeService.createProcessInstanceQuery().processInstanceIds(ids).list(); } @Override public PageResult getMyProcessInstancePage(Long userId, BpmProcessInstanceMyPageReqVO pageReqVO) { // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页 PageResult pageResult = processInstanceExtMapper.selectPage(userId, pageReqVO); if (CollUtil.isEmpty(pageResult.getList())) { return new PageResult<>(pageResult.getTotal()); } // 获得流程 Task Map List processInstanceIds = convertList(pageResult.getList(), BpmProcessInstanceExtDO::getProcessInstanceId); Map> taskMap = taskService.getTaskMapByProcessInstanceIds(processInstanceIds); List ids = taskMap.values().stream() .flatMap(Collection::stream) .map(Task::getAssignee) .collect(Collectors.toList()); List longIds = ids.stream() .map(Long::valueOf) .collect(Collectors.toList()); // 获得 User Map Map userMap = adminUserApi.getUserMap(longIds); // 转换返回 return BpmProcessInstanceConvert.INSTANCE.convertPage(pageResult, taskMap, userMap); } @Override @Transactional(rollbackFor = Exception.class) public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqVO createReqVO) { // 获得流程定义 ProcessDefinition definition = processDefinitionService.getProcessDefinition(createReqVO.getProcessDefinitionId()); // 发起流程 return createProcessInstance0(userId, definition, createReqVO.getVariables(), null); } @Override public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO createReqDTO) { // 获得流程定义 ProcessDefinition definition = processDefinitionService.getActiveProcessDefinition(createReqDTO.getProcessDefinitionKey()); // 发起流程 return createProcessInstance0(userId, definition, createReqDTO.getVariables(), createReqDTO.getBusinessKey()); } @Override public BpmProcessInstanceRespVO getProcessInstanceVO(String id) { // 获得流程实例 HistoricProcessInstance processInstance = getHistoricProcessInstance(id); if (processInstance == null) { return null; } BpmProcessInstanceExtDO processInstanceExt = processInstanceExtMapper.selectByProcessInstanceId(id); Assert.notNull(processInstanceExt, "流程实例拓展({}) 不存在", id); // 获得流程定义 ProcessDefinition processDefinition = processDefinitionService .getProcessDefinition(processInstance.getProcessDefinitionId()); Assert.notNull(processDefinition, "流程定义({}) 不存在", processInstance.getProcessDefinitionId()); BpmProcessDefinitionExtDO processDefinitionExt = processDefinitionService.getProcessDefinitionExt( processInstance.getProcessDefinitionId()); Assert.notNull(processDefinitionExt, "流程定义拓展({}) 不存在", id); String bpmnXml = processDefinitionService.getProcessDefinitionBpmnXML(processInstance.getProcessDefinitionId()); // 获得 User AdminUserRespDTO startUser = adminUserApi.getUser(NumberUtils.parseLong(processInstance.getStartUserId())).getCheckedData(); DeptRespDTO dept = null; if (startUser != null) { dept = deptApi.getDept(startUser.getDeptId()).getCheckedData(); } // 拼接结果 return BpmProcessInstanceConvert.INSTANCE.convert2(processInstance, processInstanceExt, processDefinition, processDefinitionExt, bpmnXml, startUser, dept); } @Override public void cancelProcessInstance(Long userId, @Valid BpmProcessInstanceCancelReqVO cancelReqVO) { // 校验流程实例存在 ProcessInstance instance = getProcessInstance(cancelReqVO.getId()); if (instance == null) { throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_EXISTS); } // 只能取消自己的 if (!Objects.equals(instance.getStartUserId(), String.valueOf(userId))) { throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF); } // 通过删除流程实例,实现流程实例的取消, // 删除流程实例,正则执行任务 ACT_RU_TASK. 任务会被删除。通过历史表查询 deleteProcessInstance(cancelReqVO.getId(), BpmProcessInstanceDeleteReasonEnum.CANCEL_TASK.format(cancelReqVO.getReason())); } /** * 获得历史的流程实例 * * @param id 流程实例的编号 * @return 历史的流程实例 */ @Override public HistoricProcessInstance getHistoricProcessInstance(String id) { return historyService.createHistoricProcessInstanceQuery().processInstanceId(id).singleResult(); } @Override public List getHistoricProcessInstances(Set ids) { return historyService.createHistoricProcessInstanceQuery().processInstanceIds(ids).list(); } @Override public void createProcessInstanceExt(ProcessInstance instance) { // 获得流程定义 ProcessDefinition definition = processDefinitionService.getProcessDefinition2(instance.getProcessDefinitionId()); // 插入 BpmProcessInstanceExtDO 对象 BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO() .setProcessInstanceId(instance.getId()) .setProcessDefinitionId(definition.getId()) .setName(instance.getProcessDefinitionName()) .setStartUserId(Long.valueOf(instance.getStartUserId())) .setCategory(definition.getCategory()) .setStatus(BpmProcessInstanceStatusEnum.RUNNING.getStatus()) .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); processInstanceExtMapper.insert(instanceExtDO); } @Override public void updateProcessInstanceExtCancel(FlowableCancelledEvent event) { // 判断是否为 Reject 不通过。如果是,则不进行更新. // 因为,updateProcessInstanceExtReject 方法,已经进行更新了 if (BpmProcessInstanceDeleteReasonEnum.isRejectReason((String)event.getCause())) { return; } // 需要主动查询,因为 instance 只有 id 属性 // 另外,此时如果去查询 ProcessInstance 的话,字段是不全的,所以去查询了 HistoricProcessInstance HistoricProcessInstance processInstance = getHistoricProcessInstance(event.getProcessInstanceId()); // 更新拓展表 BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO() .setProcessInstanceId(event.getProcessInstanceId()) .setEndTime(LocalDateTime.now()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置 .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) .setResult(BpmProcessInstanceResultEnum.CANCEL.getResult()); processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); // 发送流程实例的状态事件 processInstanceResultEventPublisher.sendProcessInstanceResultEvent( BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult())); } @Override public void updateProcessInstanceExtComplete(ProcessInstance instance) { // 需要主动查询,因为 instance 只有 id 属性 // 另外,此时如果去查询 ProcessInstance 的话,字段是不全的,所以去查询了 HistoricProcessInstance HistoricProcessInstance processInstance = getHistoricProcessInstance(instance.getId()); // 更新拓展表 BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO() .setProcessInstanceId(instance.getProcessInstanceId()) .setEndTime(LocalDateTime.now()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置 .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) .setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()); // 如果正常完全,说明审批通过 processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); Map processVariables = runtimeService.getVariables(instance.getProcessInstanceId()); String reason = (String)processVariables.get("approve_reason") ; // 发送流程被通过的消息 messageService.sendMessageWhenProcessInstanceApprove(BpmProcessInstanceConvert.INSTANCE.convert2ApprovedReq(instance,reason)); // 发送流程实例的状态事件 processInstanceResultEventPublisher.sendProcessInstanceResultEvent( BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult())); } @Override @Transactional(rollbackFor = Exception.class) public void updateProcessInstanceExtReject(String id, String reason) { // 需要主动查询,因为 instance 只有 id 属性 ProcessInstance processInstance = getProcessInstance(id); // 删除流程实例,以实现驳回任务时,取消整个审批流程 deleteProcessInstance(id, StrUtil.format(BpmProcessInstanceDeleteReasonEnum.REJECT_TASK.format(reason))); // 更新 status + result // 注意,不能和上面的逻辑更换位置。因为 deleteProcessInstance 会触发流程的取消,进而调用 updateProcessInstanceExtCancel 方法, // 设置 result 为 BpmProcessInstanceStatusEnum.CANCEL,显然和 result 不一定是一致的 BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO().setProcessInstanceId(id) .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) .setResult(BpmProcessInstanceResultEnum.REJECT.getResult()); processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); // 发送流程被不通过的消息 messageService.sendMessageWhenProcessInstanceReject(BpmProcessInstanceConvert.INSTANCE.convert2RejectReq(processInstance, reason)); // 发送流程实例的状态事件 processInstanceResultEventPublisher.sendProcessInstanceResultEvent( BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult())); } private void deleteProcessInstance(String id, String reason) { runtimeService.deleteProcessInstance(id, reason); } private String createProcessInstance0(Long userId, ProcessDefinition definition, Map variables, String businessKey) { // 校验流程定义 if (definition == null) { throw exception(PROCESS_DEFINITION_NOT_EXISTS); } if (definition.isSuspended()) { throw exception(PROCESS_DEFINITION_IS_SUSPENDED); } // 创建流程实例 ProcessInstance instance = runtimeService.createProcessInstanceBuilder() .processDefinitionId(definition.getId()) .businessKey(businessKey) .name(definition.getName().trim()) .variables(variables) .start(); // 设置流程名字 runtimeService.setProcessInstanceName(instance.getId(), definition.getName()); // 补全流程实例的拓展表 processInstanceExtMapper.updateByProcessInstanceId(new BpmProcessInstanceExtDO().setProcessInstanceId(instance.getId()) .setFormVariables(variables)); /** 创建流程后,添加抄送人 End add by yj 2024.1.4 */ processCCToUsers(definition,instance) ; /** 通过自己发起的流程 */ approveSelfTask(instance.getId()) ; return instance.getId(); } private void approveSelfTask(String processInstanceId ) { List tasks =engineTaskService.createTaskQuery().processInstanceId(processInstanceId).list() ; if( tasks != null && tasks.size() > 0) { Task task = tasks.get(0) ; String assigneeId = task.getAssignee(); //如果当前登陆用户是审批人,那么自动审批通过 if( assigneeId.equals( SecurityFrameworkUtils.getLoginUserId().toString() )) { BpmTaskApproveReqVO reqVO = new BpmTaskApproveReqVO() ; reqVO.setId(task.getId()) ; reqVO.setReason(BpmConstants.AUTO_APPRAVAL); taskService.approveTask(getLoginUserId(), reqVO); } } } /** * 获得抄送我的流程实例的分页 * * @param userId 用户编号 * @param pageReqVO 分页请求 * @return 流程实例的分页 */ public PageResult getMyCCProcessInstancePage(Long userId, BpmProcessInstanceMyPageReqVO pageReqVO) { // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页 PageResult pageResult = processInstanceExtMapper.selectCCPage(userId, pageReqVO); if (CollUtil.isEmpty(pageResult.getList())) { return new PageResult<>(pageResult.getTotal()); } // 获得流程 Task Map List processInstanceIds = convertList(pageResult.getList(), BpmProcessInstanceExtDO::getProcessInstanceId); Map> taskMap = taskService.getTaskMapByProcessInstanceIds(processInstanceIds); // 转换返回 return BpmProcessInstanceConvert.INSTANCE.convertPage(pageResult, taskMap,null); } public List getProcessInstancesGroupByModelName(BpmProcessInstanceStatisticsReqVO pageReqVO){ pageReqVO = getUserids(pageReqVO) ; return processInstanceExtMapper.getProcessInstancesGroupByModelName(pageReqVO) ; } public List getProcessInstancesGroupByResultStatus(BpmProcessInstanceStatisticsReqVO pageReqVO){ pageReqVO = getUserids(pageReqVO) ; return processInstanceExtMapper.getProcessInstancesGroupByResultStatus(pageReqVO) ; } public PageResult getStatisticsProcessInstancePage(@Valid BpmProcessInstanceMyPageReqVO pageReqVO) { // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页 PageResult pageResult = processInstanceExtMapper.selectStatisticePage(pageReqVO); if (CollUtil.isEmpty(pageResult.getList())) { return new PageResult<>(pageResult.getTotal()); } // 获得流程 Task Map List processInstanceIds = convertList(pageResult.getList(), BpmProcessInstanceExtDO::getProcessInstanceId); Map> taskMap = taskService.getTaskMapByProcessInstanceIds(processInstanceIds); List ids = taskMap.values().stream() .flatMap(Collection::stream) .map(Task::getAssignee) .collect(Collectors.toList()); List longIds = ids.stream() .map(Long::valueOf) .collect(Collectors.toList()); //获得 审批人 User Map Map assigneeUserMap = adminUserApi.getUserMap(longIds); //获得 发起人 User Map List bpieDOs = pageResult.getList() ; longIds = new ArrayList<>() ; for (BpmProcessInstanceExtDO bpieDO: bpieDOs) { longIds.add(bpieDO.getStartUserId()) ; } Map startUserMap = adminUserApi.getUserMap(longIds); // 转换返回 return BpmProcessInstanceConvert.INSTANCE.convertStatisticsPage(pageResult, taskMap, assigneeUserMap,startUserMap); } @Resource PermissionApi permissionApi; /** * 根据数据权限,查询关联操作的用户IDS * @param pageReqVO * @return * @param */ private T getUserids(T pageReqVO) { try { Class clazz = (Class) pageReqVO.getClass(); Field idField = clazz.getDeclaredField("userIds"); idField.setAccessible(true); // 设置可访问性 Long[] userIds = null; Long userId = WebFrameworkUtils.getLoginUserId(); DeptDataPermissionRespDTO deptDataPermission = permissionApi.getDeptDataPermission(userId).getCheckedData(); //查询全部 if (deptDataPermission.getAll()) { //idField.set(pageReqVO, null); // 设置属性值 return pageReqVO; } // 情况二,即不能查看部门,又不能查看自己,则说明 100% 无权限 if (CollUtil.isEmpty(deptDataPermission.getDeptIds()) && Boolean.FALSE.equals(deptDataPermission.getSelf())) { //设置成0,一个不存在的用户Id,就查询不到数据了。 userIds = new Long[]{0L}; idField.set(pageReqVO, userIds); return pageReqVO; } //情况三 至查询自己 if (deptDataPermission.getSelf()) { userIds = new Long[]{userId}; idField.set(pageReqVO, userIds); return pageReqVO; } Set deptIds = deptDataPermission.getDeptIds(); //查询部门关联的用户Id List users = adminUserApi.getUserListByDeptIds(deptIds).getCheckedData(); List tempList = new ArrayList<>(); for (AdminUserRespDTO user : users) { Long id = user.getId(); tempList.add(id); } tempList.add(userId); userIds = tempList.stream().toArray(Long[]::new); //将临时的List集合转换成数组集合 idField.set(pageReqVO, userIds); return pageReqVO; }catch (Exception exception){ exception.printStackTrace(); throw exception(BPM_SYSTEM_BUG); } } /** * /创建流程后,添加抄送人 Begin add by yj 2024.1.4 * 在设计流程的时候,需要添加一个任务块 名字必须叫Activity_cc 分配权限的时候,需要选择用户组。 * * @param definition * @param instance */ private void processCCToUsers(ProcessDefinition definition, ProcessInstance instance) { //获取bpm_task_assign_reule (Bpm 任务规则表)的流程中有没有配置抄送节点 固定抄送名称为:Activity_cc String processDefinitionId = definition.getId() ; List rules = taskRuleMapper.selectListByProcessDefinitionId(processDefinitionId, null); for(BpmTaskAssignRuleDO rule :rules ){ String key = rule.getTaskDefinitionKey() ; //任务名称 Integer type = rule.getType() ; if( !key.isEmpty() && key.equals(BpmConstants.CC_NAME) && type == 40 ) { StringBuffer str = new StringBuffer() ; Set options = rule.getOptions() ; List list = new ArrayList(options); for(Long groupId : list) { //需要根据这个groupId,查询这个组中的用户id BpmUserGroupDO userGroup = userGroupService.getUserGroup(groupId); Set userIds = userGroup.getMemberUserIds() ; List userIdList = new ArrayList(userIds); for(Long user_id : userIdList) { str.append("[").append(user_id).append("]") ; } } String ccids = str.toString() ; //根据processDefinitionId 将ccids保存到bpm_process_instance_ext中的ccids字段 BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO().setProcessDefinitionId(processDefinitionId) .setCcids(ccids) .setProcessInstanceId(instance.getProcessInstanceId()); processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); break ; } } } @Resource private BpmTaskExtMapper taskExtMapper; @Override public List getUserProcessTpo10(BpmProcessInstanceStatisticsReqVO pageReqVO) { //按审核人分组查询,统计已完成流程数量及平均耗时间 List respVOS = processInstanceExtMapper.getUserProcessTpo10(pageReqVO); if( respVOS == null || respVOS.size() == 0) { return null ; } List idList = respVOS.stream() .map(BpmProcessFinishStatisticsRespVO::getUserId) .collect(Collectors.toList()); //根据userId,查询UserMap Map userMap = adminUserApi.getUserMap(idList) ; Long[] idsArray = new Long[userMap.size()]; // 使用 map 的 keySet() 方法获取键集合 Set keys = userMap.keySet(); // 遍历键集合,将每个键添加到数组中 int index = 0; for (Long key : keys) { idsArray[index++] = key; } pageReqVO.setUserIds(idsArray) ; //按审核人分组查询,未审批完成的流程数量 List bpmTaskExtDOs = processInstanceExtMapper.selectUnfinishProcessCount( pageReqVO ) ; //按审核人分组查询,未完成的记录数 Map unFinfishCountCountMap = new HashMap<>(); for (BpmProcessFinishStatisticsRespVO item : bpmTaskExtDOs) { unFinfishCountCountMap.put(item.getUserId(), item.getUnFinfishCount()); } respVOS.forEach(respVO -> respVO.setName( userMap.get(respVO.getUserId()).getNickname())); respVOS.forEach(respVO -> respVO.setUnFinfishCount( unFinfishCountCountMap.get(respVO.getUserId()))); //获取排行榜第一记录的耗时,作为基础数据 double num = Double.parseDouble(respVOS.get(0).getUserTime()); // 先将字符串转换为双精度浮点数 int baseNumber = (int)num; // 再通过类型转换操作符将其转换为整数 DecimalFormat df = new DecimalFormat("#.00"); respVOS.forEach(respVO -> { //格式化流程完成率 float finfishCount = (float) respVO.getFinfishCount() ; float unFinfishCount = respVO.getUnFinfishCount() == null ? 0: respVO.getUnFinfishCount(); float all = finfishCount + unFinfishCount ; float result = finfishCount / all; float rate = result * 100 ; respVO.setCompletionRate(df.format(rate)+"%") ; double dValue = Double.parseDouble(respVO.getUserTime()); // 将字符串转换为double类型 int roundedValue = (int) Math.round(dValue); // 使用Math.round()进行四舍五入,并转换为int类型 respVO.setUserTime(roundedValue+"") ; //格式化进度百度比, 参照最高的数据进行百分比显示 double percentage = ((int)Double.parseDouble(respVO.getUserTime()) / (double) baseNumber) * 100; respVO.setPercentage((int) Math.round(percentage)) ; //设置未完成 respVO.setUnFinfishCount( Integer.valueOf((int)unFinfishCount)) ; }); return respVOS ; } @Override public BpmProcessInstanceExtDO getProcessInstanceDO(String id) { return processInstanceExtMapper.selectByProcessInstanceId(id); } } \ No newline at end of file From 98873d8b89790fa1a55ab03314d40b9cb2e8f8e5 Mon Sep 17 00:00:00 2001 From: aikai Date: Wed, 10 Apr 2024 21:13:16 +0800 Subject: [PATCH 04/50] =?UTF-8?q?=E5=BC=80=E5=8F=91=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yudao-gateway/src/main/resources/bootstrap.yaml | 2 +- .../yudao-module-bpm-biz/src/main/resources/bootstrap.yaml | 2 +- .../yudao-module-infra-biz/src/main/resources/bootstrap.yaml | 2 +- .../yudao-module-system-biz/src/main/resources/bootstrap.yaml | 2 +- .../src/main/resources/bootstrap.yaml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/yudao-gateway/src/main/resources/bootstrap.yaml b/yudao-gateway/src/main/resources/bootstrap.yaml index 55165083..ba7a42c4 100644 --- a/yudao-gateway/src/main/resources/bootstrap.yaml +++ b/yudao-gateway/src/main/resources/bootstrap.yaml @@ -3,7 +3,7 @@ spring: name: gateway-server profiles: - active: local #local + active: dev #local # active: prod server: port: 48080 diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/bootstrap.yaml b/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/bootstrap.yaml index 90fc58af..f2da21dc 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/bootstrap.yaml +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/bootstrap.yaml @@ -3,7 +3,7 @@ spring: name: bpm-server profiles: - active: local #local + active: dev #local # active: prod server: diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/bootstrap.yaml b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/bootstrap.yaml index b28d9964..64e03794 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/bootstrap.yaml +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/bootstrap.yaml @@ -3,7 +3,7 @@ spring: name: infra-server profiles: - active: local #local + active: dev #local # active: prod server: diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/bootstrap.yaml b/yudao-module-system/yudao-module-system-biz/src/main/resources/bootstrap.yaml index 7abdef88..9498addd 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/bootstrap.yaml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/bootstrap.yaml @@ -3,7 +3,7 @@ spring: name: system-server profiles: - active: local #local + active: dev #local # active: prod server: diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/bootstrap.yaml b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/bootstrap.yaml index 7591aed7..818d6381 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/bootstrap.yaml +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/bootstrap.yaml @@ -3,7 +3,7 @@ spring: name: smartfactory-server profiles: - active: local + active: dev server: port: 48090 From 72f6b89fd9480bc026aed6d6e809e3cd646e3dc5 Mon Sep 17 00:00:00 2001 From: aikai Date: Thu, 11 Apr 2024 13:04:55 +0800 Subject: [PATCH 05/50] =?UTF-8?q?=E5=BC=80=E5=8F=91=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=B0=8F=E7=A8=8B=E5=BA=8F=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-dev.yaml | 4 ++-- .../src/main/resources/application-local.yaml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/application-dev.yaml b/yudao-module-system/yudao-module-system-biz/src/main/resources/application-dev.yaml index 72d23f84..96835b0f 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/application-dev.yaml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/application-dev.yaml @@ -125,8 +125,8 @@ wx: miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档 # appid: wx62056c0d5e8db250 # secret: 333ae72f41552af1e998fe1f54e1584a - appid: wx63c280fe3248a3e7 # wenhualian的接口测试号 - secret: 6f270509224a7ae1296bbf1c8cb97aed + appid: wxea777d1b1e12eb32 # wenhualian的接口测试号 + secret: 2db58956286099e58e959fa537e046b0 config-storage: type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取 key-prefix: wa # Redis Key 的前缀 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/application-local.yaml b/yudao-module-system/yudao-module-system-biz/src/main/resources/application-local.yaml index 6a749708..bc7aa1a6 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/application-local.yaml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/application-local.yaml @@ -143,8 +143,8 @@ wx: miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档 # appid: wx62056c0d5e8db250 # secret: 333ae72f41552af1e998fe1f54e1584a - appid: wx2919e237e6018bea # wenhualian的接口测试号 - secret: ad7ab17918f6defa85a9677778eb7780 + appid: wxea777d1b1e12eb32 # wenhualian的接口测试号 + secret: 2db58956286099e58e959fa537e046b0 config-storage: type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取 key-prefix: wa # Redis Key 的前缀 From ebe9f0c445a44421a361257978dd382bcf419fe4 Mon Sep 17 00:00:00 2001 From: aikai Date: Thu, 11 Apr 2024 16:02:56 +0800 Subject: [PATCH 06/50] =?UTF-8?q?=E9=87=87=E8=B4=AD=E6=94=AF=E4=BB=98=20?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E9=87=87=E8=B4=AD=E8=AF=A6=E6=83=85json?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/oa/vo/procurepay/BpmOAProcurePayItemRespVO.java | 5 +++++ .../admin/oa/vo/procurepay/BpmOAProcurePayRespVO.java | 7 +++++++ .../admin/oa/vo/procurepay/BpmOAProcurePaySaveReqVO.java | 3 +++ .../main/resources/mapper/oa/BpmOAProcurePayItemMapper.xml | 1 + 4 files changed, 16 insertions(+) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/procurepay/BpmOAProcurePayItemRespVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/procurepay/BpmOAProcurePayItemRespVO.java index 5a4bb4ef..e5a252c0 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/procurepay/BpmOAProcurePayItemRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/procurepay/BpmOAProcurePayItemRespVO.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.procurepay; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; @@ -7,6 +8,7 @@ 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; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.TIME_ZONE_DEFAULT; @Schema(description = "管理后台 - 采购收款明细 Response VO") @Data @@ -45,6 +47,7 @@ public class BpmOAProcurePayItemRespVO { @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 LocalDateTime expectedDeliveryDate; @Schema(description = "备注") @@ -56,4 +59,6 @@ public class BpmOAProcurePayItemRespVO { @Schema(description = "采购总金额大写") private String totalMoneyChinese; + @Schema(description = "采购详情json数据") + private String procureDetailJson; } \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/procurepay/BpmOAProcurePayRespVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/procurepay/BpmOAProcurePayRespVO.java index b3f51e9a..1b4fbc3b 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/procurepay/BpmOAProcurePayRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/procurepay/BpmOAProcurePayRespVO.java @@ -1,13 +1,18 @@ package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.procurepay; import cn.iocoder.yudao.module.bpm.controller.admin.upload.UploadUserFile; +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.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; +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; + @Schema(description = "管理后台 - 采购支付 Response VO") @Data public class BpmOAProcurePayRespVO { @@ -22,6 +27,8 @@ public class BpmOAProcurePayRespVO { private String reason; @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 LocalDateTime payTime; @Schema(description = "采购付款总金额", requiredMode = Schema.RequiredMode.REQUIRED) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/procurepay/BpmOAProcurePaySaveReqVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/procurepay/BpmOAProcurePaySaveReqVO.java index e3bae9f4..99bac792 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/procurepay/BpmOAProcurePaySaveReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/procurepay/BpmOAProcurePaySaveReqVO.java @@ -10,6 +10,8 @@ import java.math.BigDecimal; 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 public class BpmOAProcurePaySaveReqVO { @@ -25,6 +27,7 @@ public class BpmOAProcurePaySaveReqVO { private String reason; @Schema(description = "支付日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime payTime; @Schema(description = "采购付款总金额", requiredMode = Schema.RequiredMode.REQUIRED) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/mapper/oa/BpmOAProcurePayItemMapper.xml b/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/mapper/oa/BpmOAProcurePayItemMapper.xml index cfa7974e..9a2e29de 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/mapper/oa/BpmOAProcurePayItemMapper.xml +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/mapper/oa/BpmOAProcurePayItemMapper.xml @@ -18,6 +18,7 @@ b.reason, b.procure_type, b.expected_delivery_date, + b.procure_detail_json as procureDetailJson, b.remarks, b.total_money, b.total_money_chinese From 55ed940e2fe4331a3c1b58873ce18a3e1cf395cb Mon Sep 17 00:00:00 2001 From: aikai Date: Thu, 11 Apr 2024 17:53:48 +0800 Subject: [PATCH 07/50] =?UTF-8?q?=E6=97=A5=E5=BF=97=E8=AF=84=E8=AE=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/comment/WorkLogCommentController.java | 44 ++++++++ .../app/comment/dto/CommentDTO.java | 17 +++ .../app/comment/vo/CommentPageListVO.java | 53 +++++++++ .../comment/vo/WorkLogCommentPageReqVO.java | 43 +++++++ .../app/comment/vo/WorkLogCommentRespVO.java | 52 +++++++++ .../comment/vo/WorkLogCommentSaveReqVO.java | 37 ++++++ .../dataobject/comment/WorkLogCommentDO.java | 59 ++++++++++ .../mysql/comment/WorkLogCommentMapper.java | 44 ++++++++ .../comment/WorkLogCommentService.java | 66 +++++++++++ .../comment/WorkLogCommentServiceImpl.java | 105 ++++++++++++++++++ .../mapper/comment/WorkLogCommentMapper.xml | 48 ++++++++ 11 files changed, 568 insertions(+) create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/WorkLogCommentController.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/dto/CommentDTO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/vo/CommentPageListVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/vo/WorkLogCommentPageReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/vo/WorkLogCommentRespVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/vo/WorkLogCommentSaveReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/comment/WorkLogCommentDO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/comment/WorkLogCommentMapper.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/comment/WorkLogCommentService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/comment/WorkLogCommentServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/comment/WorkLogCommentMapper.xml diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/WorkLogCommentController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/WorkLogCommentController.java new file mode 100644 index 00000000..9b4d7ea9 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/WorkLogCommentController.java @@ -0,0 +1,44 @@ +package cn.iocoder.yudao.module.system.controller.app.comment; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.module.system.controller.app.comment.dto.CommentDTO; +import cn.iocoder.yudao.module.system.controller.app.comment.vo.CommentPageListVO; +import cn.iocoder.yudao.module.system.service.comment.WorkLogCommentService; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 工作日志评论") +@RestController +@RequestMapping("/system/work-log-comment") +@Validated +public class WorkLogCommentController { + + @Autowired + private WorkLogCommentService workLogCommentService; + + @Operation(summary = "用户工作日志评论-分页查询评论列表") + @GetMapping(value = "/queryCommentPageList") + public CommonResult> queryCommentPageList(CommentDTO dto, + @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { + Page page = new Page<>(pageNo, pageSize); + IPage pageList = workLogCommentService.queryCommentPageList(page, dto); + return success(pageList); + } + +// @Operation(summary = "用户动态评论-评论/回复评论") +// @PostMapping(value = "/addComment") +// public CommonResult addComment(@RequestBody MemberDynamicCommentAddDTO dto) { +// workLogCommentService.addComment(dto); +// return success("添加成功!"); +// } + + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/dto/CommentDTO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/dto/CommentDTO.java new file mode 100644 index 00000000..4e488434 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/dto/CommentDTO.java @@ -0,0 +1,17 @@ +package cn.iocoder.yudao.module.system.controller.app.comment.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class CommentDTO { + @Schema(description = "工作日志id", required = true) + @JsonSerialize(using = ToStringSerializer.class) + private Long workLogId; + @Schema(description = "评论类型(0|评论;1|回评") + private Integer type; + @Schema(description = "是否需要显示日志内容 0否 1是 默认否") + private Integer isShowWorkLogContent; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/vo/CommentPageListVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/vo/CommentPageListVO.java new file mode 100644 index 00000000..70812e1c --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/vo/CommentPageListVO.java @@ -0,0 +1,53 @@ +package cn.iocoder.yudao.module.system.controller.app.comment.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +@Data +public class CommentPageListVO { + @JsonSerialize(using = ToStringSerializer.class) + @Schema(description = "id") + private Long id; + @Schema(description = "工作日志ID") + @JsonSerialize(using = ToStringSerializer.class) + private Long workLogId; + @Schema(description = "评论用户ID") + @JsonSerialize(using = ToStringSerializer.class) + private Long userId; + @Schema(description = "评论用户头像") + private String avatar; + @Schema(description = "评论用户名称") + private String userName; + + @Schema(description = "被评论用户ID") + @JsonSerialize(using = ToStringSerializer.class) + private Long commentUserId; + @Schema(description = "被评论用户头像") + private String commentAvatar; + @Schema(description = "被评论用户名称") + private String commentUserName; + + @Schema(description = "评论内容") + private String comment; + @Schema(description = "评论类型(0|评论;1|回评)") + private Integer type; + + @Schema(description = "被回评内容") + private String replyComment; + + @Schema(description = "工作日志内容(部分)") + private String workLogContent; + @Schema(description = "工作日志名称") + private String workLogName; + @Schema(description = "工作日志模版id") + private Long workFormId; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Schema(description = "创建日期") + private String createTime; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/vo/WorkLogCommentPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/vo/WorkLogCommentPageReqVO.java new file mode 100644 index 00000000..960e4e63 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/vo/WorkLogCommentPageReqVO.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.module.system.controller.app.comment.vo; + +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 WorkLogCommentPageReqVO extends PageParam { + + @Schema(description = "动态ID", example = "26393") + private Long workLogId; + + @Schema(description = "评论ID(回复评论的ID)", example = "25541") + private Long commentId; + + @Schema(description = "评论用户ID", example = "17082") + private Long userId; + + @Schema(description = "被评论用户ID", example = "22388") + private Long commentUserId; + + @Schema(description = "评论内容") + private String comment; + + @Schema(description = "评论类型(0|评论;1|回评)", example = "1") + private Boolean type; + + @Schema(description = "楼栋标识") + private String buildingCode; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/vo/WorkLogCommentRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/vo/WorkLogCommentRespVO.java new file mode 100644 index 00000000..be061652 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/vo/WorkLogCommentRespVO.java @@ -0,0 +1,52 @@ +package cn.iocoder.yudao.module.system.controller.app.comment.vo; + +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 WorkLogCommentRespVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "21304") + @ExcelProperty("id") + private Long id; + + @Schema(description = "动态ID", example = "26393") + @ExcelProperty("动态ID") + private Long workLogId; + + @Schema(description = "评论ID(回复评论的ID)", example = "25541") + @ExcelProperty("评论ID(回复评论的ID)") + private Long commentId; + + @Schema(description = "评论用户ID", example = "17082") + @ExcelProperty("评论用户ID") + private Long userId; + + @Schema(description = "被评论用户ID", example = "22388") + @ExcelProperty("被评论用户ID") + private Long commentUserId; + + @Schema(description = "评论内容") + @ExcelProperty("评论内容") + private String comment; + + @Schema(description = "评论类型(0|评论;1|回评)", example = "1") + @ExcelProperty("评论类型(0|评论;1|回评)") + private Boolean type; + + @Schema(description = "楼栋标识") + @ExcelProperty("楼栋标识") + private String buildingCode; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/vo/WorkLogCommentSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/vo/WorkLogCommentSaveReqVO.java new file mode 100644 index 00000000..1dab74c1 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/vo/WorkLogCommentSaveReqVO.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.module.system.controller.app.comment.vo; + +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 WorkLogCommentSaveReqVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "21304") + private Long id; + + @Schema(description = "动态ID", example = "26393") + private Long workLogId; + + @Schema(description = "评论ID(回复评论的ID)", example = "25541") + private Long commentId; + + @Schema(description = "评论用户ID", example = "17082") + private Long userId; + + @Schema(description = "被评论用户ID", example = "22388") + private Long commentUserId; + + @Schema(description = "评论内容") + private String comment; + + @Schema(description = "评论类型(0|评论;1|回评)", example = "1") + private Boolean type; + + @Schema(description = "楼栋标识") + private String buildingCode; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/comment/WorkLogCommentDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/comment/WorkLogCommentDO.java new file mode 100644 index 00000000..7016fa3a --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/comment/WorkLogCommentDO.java @@ -0,0 +1,59 @@ +package cn.iocoder.yudao.module.system.dal.dataobject.comment; + +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_comment") +@KeySequence("work_log_comment_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WorkLogCommentDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 动态ID + */ + private Long workLogId; + /** + * 评论ID(回复评论的ID) + */ + private Long commentId; + /** + * 评论用户ID + */ + private Long userId; + /** + * 被评论用户ID + */ + private Long commentUserId; + /** + * 评论内容 + */ + private String comment; + /** + * 评论类型(0|评论;1|回评) + */ + private Boolean type; + /** + * 楼栋标识 + */ + private String buildingCode; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/comment/WorkLogCommentMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/comment/WorkLogCommentMapper.java new file mode 100644 index 00000000..af112886 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/comment/WorkLogCommentMapper.java @@ -0,0 +1,44 @@ +package cn.iocoder.yudao.module.system.dal.mysql.comment; + +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.app.comment.dto.CommentDTO; +import cn.iocoder.yudao.module.system.dal.dataobject.comment.WorkLogCommentDO; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.system.controller.app.comment.vo.*; +import org.apache.ibatis.annotations.Param; + +/** + * 工作日志评论 Mapper + * + * @author 艾楷 + */ +@Mapper +public interface WorkLogCommentMapper extends BaseMapperX { + + default PageResult selectPage(WorkLogCommentPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(WorkLogCommentDO::getWorkLogId, reqVO.getWorkLogId()) + .eqIfPresent(WorkLogCommentDO::getCommentId, reqVO.getCommentId()) + .eqIfPresent(WorkLogCommentDO::getUserId, reqVO.getUserId()) + .eqIfPresent(WorkLogCommentDO::getCommentUserId, reqVO.getCommentUserId()) + .eqIfPresent(WorkLogCommentDO::getComment, reqVO.getComment()) + .eqIfPresent(WorkLogCommentDO::getType, reqVO.getType()) + .eqIfPresent(WorkLogCommentDO::getBuildingCode, reqVO.getBuildingCode()) + .betweenIfPresent(WorkLogCommentDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(WorkLogCommentDO::getId)); + } + + /** + * + * @param page + * @param dto + * @return + */ + IPage queryCommentPageList(@Param("page") Page page, @Param("dto") CommentDTO dto); +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/comment/WorkLogCommentService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/comment/WorkLogCommentService.java new file mode 100644 index 00000000..ea657381 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/comment/WorkLogCommentService.java @@ -0,0 +1,66 @@ +package cn.iocoder.yudao.module.system.service.comment; + +import java.util.*; +import javax.validation.*; + +import cn.iocoder.yudao.module.system.controller.app.comment.dto.CommentDTO; +import cn.iocoder.yudao.module.system.controller.app.comment.vo.*; +import cn.iocoder.yudao.module.system.dal.dataobject.comment.WorkLogCommentDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +/** + * 工作日志评论 Service 接口 + * + * @author 艾楷 + */ +public interface WorkLogCommentService { + + /** + * 创建工作日志评论 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createWorkLogComment(@Valid WorkLogCommentSaveReqVO createReqVO); + + /** + * 更新工作日志评论 + * + * @param updateReqVO 更新信息 + */ + void updateWorkLogComment(@Valid WorkLogCommentSaveReqVO updateReqVO); + + /** + * 删除工作日志评论 + * + * @param id 编号 + */ + void deleteWorkLogComment(Long id); + + /** + * 获得工作日志评论 + * + * @param id 编号 + * @return 工作日志评论 + */ + WorkLogCommentDO getWorkLogComment(Long id); + + /** + * 获得工作日志评论分页 + * + * @param pageReqVO 分页查询 + * @return 工作日志评论分页 + */ + PageResult getWorkLogCommentPage(WorkLogCommentPageReqVO pageReqVO); + + /** + * + * @param page + * @param dto + * @return + */ + IPage queryCommentPageList(Page page, CommentDTO dto); +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/comment/WorkLogCommentServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/comment/WorkLogCommentServiceImpl.java new file mode 100644 index 00000000..d61ca0c7 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/comment/WorkLogCommentServiceImpl.java @@ -0,0 +1,105 @@ +package cn.iocoder.yudao.module.system.service.comment; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.system.controller.app.comment.dto.CommentDTO; +import cn.iocoder.yudao.module.system.controller.app.comment.vo.CommentPageListVO; +import cn.iocoder.yudao.module.system.controller.app.comment.vo.WorkLogCommentPageReqVO; +import cn.iocoder.yudao.module.system.controller.app.comment.vo.WorkLogCommentSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.comment.WorkLogCommentDO; +import cn.iocoder.yudao.module.system.dal.mysql.comment.WorkLogCommentMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 工作日志评论 Service 实现类 + * + * @author 艾楷 + */ +@Service +@Validated +public class WorkLogCommentServiceImpl implements WorkLogCommentService { + + @Resource + private WorkLogCommentMapper workLogCommentMapper; + + @Override + public Long createWorkLogComment(WorkLogCommentSaveReqVO createReqVO) { + // 插入 + WorkLogCommentDO workLogComment = BeanUtils.toBean(createReqVO, WorkLogCommentDO.class); + workLogCommentMapper.insert(workLogComment); + // 返回 + return workLogComment.getId(); + } + + @Override + public void updateWorkLogComment(WorkLogCommentSaveReqVO updateReqVO) { + // 校验存在 +// validateWorkLogCommentExists(updateReqVO.getId()); + // 更新 + WorkLogCommentDO updateObj = BeanUtils.toBean(updateReqVO, WorkLogCommentDO.class); + workLogCommentMapper.updateById(updateObj); + } + + @Override + public void deleteWorkLogComment(Long id) { + // 校验存在 +// validateWorkLogCommentExists(id); + // 删除 + workLogCommentMapper.deleteById(id); + } + +// private void validateWorkLogCommentExists(Long id) { +// if (workLogCommentMapper.selectById(id) == null) { +// throw exception(WORK_LOG_COMMENT_NOT_EXISTS); +// } +// } + + @Override + public WorkLogCommentDO getWorkLogComment(Long id) { + return workLogCommentMapper.selectById(id); + } + + @Override + public PageResult getWorkLogCommentPage(WorkLogCommentPageReqVO pageReqVO) { + return workLogCommentMapper.selectPage(pageReqVO); + } + + @Override + public IPage queryCommentPageList(Page page, CommentDTO dto) { + IPage pageList = workLogCommentMapper.queryCommentPageList(page, dto); + if (dto.getIsShowWorkLogContent() != null && dto.getIsShowWorkLogContent() == 1) { + List records = pageList.getRecords(); + //模版ids过滤 + List workFormIds = records.stream().map(CommentPageListVO::getWorkFormId).collect(Collectors.toList()); + // TODO: 2024/4/11 查询模版列表 + + pageList.getRecords().forEach(item -> { + // TODO: 2024/4/11 - 这里需要通过模版id + item.setWorkLogContent(null); + }); + } + return pageList; + } + + + public static void main(String[] args) { + List records = Arrays.asList( + new CommentPageListVO().setWorkLogId(1L).setWorkFormId("1"), + new CommentPageListVO().setWorkLogId(1L).setWorkFormId("1"), + new CommentPageListVO().setWorkLogId(1L).setWorkFormId("1"), + new CommentPageListVO().setWorkLogId(2L).setWorkFormId("1")); + Map collect = records.stream().collect(Collectors.toMap(CommentPageListVO::getWorkLogId, CommentPageListVO::getWorkFormId)); + System.out.println(collect); + + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/comment/WorkLogCommentMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/comment/WorkLogCommentMapper.xml new file mode 100644 index 00000000..e3538cf0 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/comment/WorkLogCommentMapper.xml @@ -0,0 +1,48 @@ + + + + + + + + \ No newline at end of file From 299f5293f5df8a92000e98e9f114b2baa31aac89 Mon Sep 17 00:00:00 2001 From: aikai Date: Thu, 11 Apr 2024 19:37:18 +0800 Subject: [PATCH 08/50] =?UTF-8?q?=E6=97=A5=E5=BF=97=E8=AF=84=E8=AE=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/comment/WorkLogCommentController.java | 12 ++--- .../comment/vo/WorkLogCommentSaveReqVO.java | 11 +---- .../dataobject/comment/WorkLogCommentDO.java | 2 +- .../comment/WorkLogCommentServiceImpl.java | 47 +++++++++++-------- 4 files changed, 36 insertions(+), 36 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/WorkLogCommentController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/WorkLogCommentController.java index 9b4d7ea9..c62032d3 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/WorkLogCommentController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/WorkLogCommentController.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.system.controller.app.comment; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.module.system.controller.app.comment.dto.CommentDTO; import cn.iocoder.yudao.module.system.controller.app.comment.vo.CommentPageListVO; +import cn.iocoder.yudao.module.system.controller.app.comment.vo.WorkLogCommentSaveReqVO; import cn.iocoder.yudao.module.system.service.comment.WorkLogCommentService; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -33,12 +34,11 @@ public class WorkLogCommentController { return success(pageList); } -// @Operation(summary = "用户动态评论-评论/回复评论") -// @PostMapping(value = "/addComment") -// public CommonResult addComment(@RequestBody MemberDynamicCommentAddDTO dto) { -// workLogCommentService.addComment(dto); -// return success("添加成功!"); -// } + @PostMapping("/create") + @Operation(summary = "创建工作日志评论") + public CommonResult createWorkLogComment(@RequestBody WorkLogCommentSaveReqVO createReqVO) { + return success(workLogCommentService.createWorkLogComment(createReqVO)); + } } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/vo/WorkLogCommentSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/vo/WorkLogCommentSaveReqVO.java index 1dab74c1..5ff39ca8 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/vo/WorkLogCommentSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/vo/WorkLogCommentSaveReqVO.java @@ -10,18 +10,12 @@ import java.util.*; @Data public class WorkLogCommentSaveReqVO { - @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "21304") - private Long id; - - @Schema(description = "动态ID", example = "26393") + @Schema(description = "工作日志ID", example = "26393") private Long workLogId; @Schema(description = "评论ID(回复评论的ID)", example = "25541") private Long commentId; - @Schema(description = "评论用户ID", example = "17082") - private Long userId; - @Schema(description = "被评论用户ID", example = "22388") private Long commentUserId; @@ -31,7 +25,4 @@ public class WorkLogCommentSaveReqVO { @Schema(description = "评论类型(0|评论;1|回评)", example = "1") private Boolean type; - @Schema(description = "楼栋标识") - private String buildingCode; - } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/comment/WorkLogCommentDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/comment/WorkLogCommentDO.java index 7016fa3a..16a9b3bf 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/comment/WorkLogCommentDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/comment/WorkLogCommentDO.java @@ -28,7 +28,7 @@ public class WorkLogCommentDO extends BaseDO { @TableId private Long id; /** - * 动态ID + * 工作日志ID */ private Long workLogId; /** diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/comment/WorkLogCommentServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/comment/WorkLogCommentServiceImpl.java index d61ca0c7..3de49267 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/comment/WorkLogCommentServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/comment/WorkLogCommentServiceImpl.java @@ -1,20 +1,24 @@ package cn.iocoder.yudao.module.system.service.comment; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; import cn.iocoder.yudao.framework.common.pojo.PageResult; 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.app.comment.dto.CommentDTO; import cn.iocoder.yudao.module.system.controller.app.comment.vo.CommentPageListVO; import cn.iocoder.yudao.module.system.controller.app.comment.vo.WorkLogCommentPageReqVO; import cn.iocoder.yudao.module.system.controller.app.comment.vo.WorkLogCommentSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.comment.WorkLogCommentDO; +import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogFormDO; import cn.iocoder.yudao.module.system.dal.mysql.comment.WorkLogCommentMapper; +import cn.iocoder.yudao.module.system.service.worklog.LogFormService; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; -import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -30,11 +34,15 @@ public class WorkLogCommentServiceImpl implements WorkLogCommentService { @Resource private WorkLogCommentMapper workLogCommentMapper; + @Resource + private LogFormService logFormService; @Override public Long createWorkLogComment(WorkLogCommentSaveReqVO createReqVO) { // 插入 WorkLogCommentDO workLogComment = BeanUtils.toBean(createReqVO, WorkLogCommentDO.class); + Long userId = WebFrameworkUtils.getLoginUserId(); + workLogComment.setUserId(userId); workLogCommentMapper.insert(workLogComment); // 返回 return workLogComment.getId(); @@ -76,30 +84,31 @@ public class WorkLogCommentServiceImpl implements WorkLogCommentService { @Override public IPage queryCommentPageList(Page page, CommentDTO dto) { IPage pageList = workLogCommentMapper.queryCommentPageList(page, dto); - if (dto.getIsShowWorkLogContent() != null && dto.getIsShowWorkLogContent() == 1) { - List records = pageList.getRecords(); + List records = pageList.getRecords(); + if (dto.getIsShowWorkLogContent() != null && dto.getIsShowWorkLogContent() == 1 && !records.isEmpty()) { //模版ids过滤 List workFormIds = records.stream().map(CommentPageListVO::getWorkFormId).collect(Collectors.toList()); - // TODO: 2024/4/11 查询模版列表 - + // 查询模版列表 + List formList = logFormService.getFormList(workFormIds); + Map formMap = formList.stream().collect(Collectors.toMap(LogFormDO::getId, item -> item)); pageList.getRecords().forEach(item -> { - // TODO: 2024/4/11 - 这里需要通过模版id - item.setWorkLogContent(null); + LogFormDO logFormDO = formMap.get(item.getWorkFormId()); + List fields = logFormDO.getFields(); + StringBuilder workLogContent = new StringBuilder(); + if (StrUtil.isNotEmpty(item.getWorkLogContent())) { + JSONObject workLogContentJson = new JSONObject(item.getWorkLogContent()); + for (String fieldItem : fields) { + JSONObject fieldJson = new JSONObject(fieldItem); + String fieldStr = fieldJson.getStr("field"); + String title = fieldJson.getStr("title"); + String field = workLogContentJson.getStr(fieldStr); + workLogContent.append(title).append(":").append(field); + } + } + item.setWorkLogContent(workLogContent.toString()); }); } return pageList; } - - public static void main(String[] args) { - List records = Arrays.asList( - new CommentPageListVO().setWorkLogId(1L).setWorkFormId("1"), - new CommentPageListVO().setWorkLogId(1L).setWorkFormId("1"), - new CommentPageListVO().setWorkLogId(1L).setWorkFormId("1"), - new CommentPageListVO().setWorkLogId(2L).setWorkFormId("1")); - Map collect = records.stream().collect(Collectors.toMap(CommentPageListVO::getWorkLogId, CommentPageListVO::getWorkFormId)); - System.out.println(collect); - - } - } \ No newline at end of file From 080cc6bea595c1ed943d05d7da5f93cd66874ef2 Mon Sep 17 00:00:00 2001 From: aikai Date: Fri, 12 Apr 2024 12:01:19 +0800 Subject: [PATCH 09/50] =?UTF-8?q?=E6=97=A5=E5=BF=97=E8=AF=84=E8=AE=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/comment/WorkLogCommentMapper.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/comment/WorkLogCommentMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/comment/WorkLogCommentMapper.xml index e3538cf0..144d974b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/comment/WorkLogCommentMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/comment/WorkLogCommentMapper.xml @@ -20,7 +20,8 @@ d.avatar AS commentAvatar, d.nickname AS commentUserName, a.COMMENT AS COMMENT, - a.type AS type e.COMMENT AS replyComment, + a.type AS type, + e.COMMENT AS replyComment, b.name as workLogName, b.form_variables AS workLogContent, From fda0fb5027b76e76ad3302040a95c006d7fd3da0 Mon Sep 17 00:00:00 2001 From: aikai Date: Fri, 12 Apr 2024 15:05:17 +0800 Subject: [PATCH 10/50] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E8=AF=84=E8=AE=BA?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E6=95=B0=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/comment/WorkLogCommentController.java | 6 ++ .../app/comment/dto/CommentDTO.java | 8 +- .../app/comment/vo/CommentTypeCountVO.java | 16 ++++ .../comment/WorkLogCommentService.java | 23 ++++-- .../comment/WorkLogCommentServiceImpl.java | 20 +++++ .../worklog/LogInstanceServiceImpl.java | 76 +++++++++---------- .../mapper/comment/WorkLogCommentMapper.xml | 3 + 7 files changed, 105 insertions(+), 47 deletions(-) create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/vo/CommentTypeCountVO.java diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/WorkLogCommentController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/WorkLogCommentController.java index c62032d3..2cc45650 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/WorkLogCommentController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/WorkLogCommentController.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.system.controller.app.comment; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.module.system.controller.app.comment.dto.CommentDTO; import cn.iocoder.yudao.module.system.controller.app.comment.vo.CommentPageListVO; +import cn.iocoder.yudao.module.system.controller.app.comment.vo.CommentTypeCountVO; import cn.iocoder.yudao.module.system.controller.app.comment.vo.WorkLogCommentSaveReqVO; import cn.iocoder.yudao.module.system.service.comment.WorkLogCommentService; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -40,5 +41,10 @@ public class WorkLogCommentController { return success(workLogCommentService.createWorkLogComment(createReqVO)); } + @GetMapping("/queryCommentTypeCount") + @Operation(summary = "获取评论类型数量") + public CommonResult queryCommentTypeCount() { + return success(workLogCommentService.queryCommentTypeCount()); + } } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/dto/CommentDTO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/dto/CommentDTO.java index 4e488434..8f33d89d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/dto/CommentDTO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/dto/CommentDTO.java @@ -7,11 +7,17 @@ import lombok.Data; @Data public class CommentDTO { - @Schema(description = "工作日志id", required = true) + @Schema(description = "工作日志id") @JsonSerialize(using = ToStringSerializer.class) private Long workLogId; @Schema(description = "评论类型(0|评论;1|回评") private Integer type; @Schema(description = "是否需要显示日志内容 0否 1是 默认否") private Integer isShowWorkLogContent; + + @Schema(description = "是否查看自己的评论记录 0否 1是") + private Integer checkMyselfFlag; + + @Schema(description = "用户id") + private Long userId; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/vo/CommentTypeCountVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/vo/CommentTypeCountVO.java new file mode 100644 index 00000000..09e474ba --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/vo/CommentTypeCountVO.java @@ -0,0 +1,16 @@ +package cn.iocoder.yudao.module.system.controller.app.comment.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class CommentTypeCountVO { + + @Schema(description = "全部数量") + private Integer allNum; + @Schema(description = "评论数量") + private Integer commentNum; + @Schema(description = "回复数量") + private Integer replyNum; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/comment/WorkLogCommentService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/comment/WorkLogCommentService.java index ea657381..8eeaa7b8 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/comment/WorkLogCommentService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/comment/WorkLogCommentService.java @@ -1,16 +1,17 @@ package cn.iocoder.yudao.module.system.service.comment; -import java.util.*; -import javax.validation.*; - -import cn.iocoder.yudao.module.system.controller.app.comment.dto.CommentDTO; -import cn.iocoder.yudao.module.system.controller.app.comment.vo.*; -import cn.iocoder.yudao.module.system.dal.dataobject.comment.WorkLogCommentDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.module.system.controller.app.comment.dto.CommentDTO; +import cn.iocoder.yudao.module.system.controller.app.comment.vo.CommentPageListVO; +import cn.iocoder.yudao.module.system.controller.app.comment.vo.CommentTypeCountVO; +import cn.iocoder.yudao.module.system.controller.app.comment.vo.WorkLogCommentPageReqVO; +import cn.iocoder.yudao.module.system.controller.app.comment.vo.WorkLogCommentSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.comment.WorkLogCommentDO; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import javax.validation.Valid; + /** * 工作日志评论 Service 接口 * @@ -57,10 +58,16 @@ public interface WorkLogCommentService { PageResult getWorkLogCommentPage(WorkLogCommentPageReqVO pageReqVO); /** - * * @param page * @param dto * @return */ IPage queryCommentPageList(Page page, CommentDTO dto); + + /** + * 获取评论类型数量 + * + * @return + */ + CommentTypeCountVO queryCommentTypeCount(); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/comment/WorkLogCommentServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/comment/WorkLogCommentServiceImpl.java index 3de49267..9edc4631 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/comment/WorkLogCommentServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/comment/WorkLogCommentServiceImpl.java @@ -7,12 +7,14 @@ 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.app.comment.dto.CommentDTO; import cn.iocoder.yudao.module.system.controller.app.comment.vo.CommentPageListVO; +import cn.iocoder.yudao.module.system.controller.app.comment.vo.CommentTypeCountVO; import cn.iocoder.yudao.module.system.controller.app.comment.vo.WorkLogCommentPageReqVO; import cn.iocoder.yudao.module.system.controller.app.comment.vo.WorkLogCommentSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.comment.WorkLogCommentDO; import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogFormDO; import cn.iocoder.yudao.module.system.dal.mysql.comment.WorkLogCommentMapper; import cn.iocoder.yudao.module.system.service.worklog.LogFormService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.springframework.stereotype.Service; @@ -83,6 +85,10 @@ public class WorkLogCommentServiceImpl implements WorkLogCommentService { @Override public IPage queryCommentPageList(Page page, CommentDTO dto) { + if (dto.getCheckMyselfFlag() == 1) { + Long userId = WebFrameworkUtils.getLoginUserId(); + dto.setUserId(userId); + } IPage pageList = workLogCommentMapper.queryCommentPageList(page, dto); List records = pageList.getRecords(); if (dto.getIsShowWorkLogContent() != null && dto.getIsShowWorkLogContent() == 1 && !records.isEmpty()) { @@ -111,4 +117,18 @@ public class WorkLogCommentServiceImpl implements WorkLogCommentService { return pageList; } + @Override + public CommentTypeCountVO queryCommentTypeCount() { + Long userId = WebFrameworkUtils.getLoginUserId(); + CommentTypeCountVO vo = new CommentTypeCountVO(); + Integer commentNum = Math.toIntExact(workLogCommentMapper.selectCount(new LambdaQueryWrapper() + .eq(WorkLogCommentDO::getUserId, userId))); + Integer replyNum = Math.toIntExact(workLogCommentMapper.selectCount(new LambdaQueryWrapper() + .eq(WorkLogCommentDO::getCommentUserId, userId))); + vo.setCommentNum(commentNum); + vo.setReplyNum(replyNum); + vo.setAllNum(commentNum + replyNum); + return vo; + } + } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java index 457860ad..c09750a3 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java @@ -74,44 +74,44 @@ public class LogInstanceServiceImpl implements LogInstanceService { Set roleIds = permissionService.getMenuRoleIdListByMenuIdFromCache(menuIds.get(0)); List roleDOS = roleService.getRoleList(roleIds); - for (RoleDO roleDo : roleDOS) { - - if (Objects.equals(roleDo.getDataScope(), DataScopeEnum.ALL.getScope())) { //数据权限是全部时 - - roles.add(roleDo.getId()); - }else if (Objects.equals(roleDo.getDataScope(), DataScopeEnum.DEPT_CUSTOM.getScope())) { //数据权限是指定部门 - - //指定部门组里存在 发起人的部门 - if (roleDo.getDataScopeDeptIds().contains(createReqVO.getDeptId())) { - - roles.add(roleDo.getId()); - } - }else if (Objects.equals(roleDo.getDataScope(), DataScopeEnum.DEPT_ONLY.getScope())) { //数据权限是本部门 - - List userDos = adminUserMapper.selectListByRoleId(roleDo.getId()); - for (AdminUserDO userDO : userDos) { - - //权限部门与发起人部门一致时 - if (Objects.equals(userDO.getDeptId(), createReqVO.getDeptId())) { - - readStatus.put(String.valueOf(userDO.getId()), "0"); - } - } - }else if (Objects.equals(roleDo.getDataScope(), DataScopeEnum.DEPT_AND_CHILD.getScope())) { //数据权限是本部门及一下 - - //根据规则ID 查询用户信息 - List userDos = adminUserMapper.selectListByRoleId(roleDo.getId()); - for (AdminUserDO userDO : userDos) { - - Set deptIds = deptService.getChildDeptIdListFromCache(userDO.getDeptId()); - //权限部门与发起人部门一致时 - if (deptIds.contains(createReqVO.getDeptId())) { - - readStatus.put(String.valueOf(userDO.getId()), "0"); - } - } - } - } +// for (RoleDO roleDo : roleDOS) { +// +// if (Objects.equals(roleDo.getDataScope(), DataScopeEnum.ALL.getScope())) { //数据权限是全部时 +// +// roles.add(roleDo.getId()); +// }else if (Objects.equals(roleDo.getDataScope(), DataScopeEnum.DEPT_CUSTOM.getScope())) { //数据权限是指定部门 +// +// //指定部门组里存在 发起人的部门 +// if (roleDo.getDataScopeDeptIds().contains(createReqVO.getDeptId())) { +// +// roles.add(roleDo.getId()); +// } +// }else if (Objects.equals(roleDo.getDataScope(), DataScopeEnum.DEPT_ONLY.getScope())) { //数据权限是本部门 +// +// List userDos = adminUserMapper.selectListByRoleId(roleDo.getId()); +// for (AdminUserDO userDO : userDos) { +// +// //权限部门与发起人部门一致时 +// if (Objects.equals(userDO.getDeptId(), createReqVO.getDeptId())) { +// +// readStatus.put(String.valueOf(userDO.getId()), "0"); +// } +// } +// }else if (Objects.equals(roleDo.getDataScope(), DataScopeEnum.DEPT_AND_CHILD.getScope())) { //数据权限是本部门及一下 +// +// //根据规则ID 查询用户信息 +// List userDos = adminUserMapper.selectListByRoleId(roleDo.getId()); +// for (AdminUserDO userDO : userDos) { +// +// Set deptIds = deptService.getChildDeptIdListFromCache(userDO.getDeptId()); +// //权限部门与发起人部门一致时 +// if (deptIds.contains(createReqVO.getDeptId())) { +// +// readStatus.put(String.valueOf(userDO.getId()), "0"); +// } +// } +// } +// } //通过满足条件的roleId 查询所有用户信息 List userRoleDOS = userRoleMapper.selectListByRoleIds(roles); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/comment/WorkLogCommentMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/comment/WorkLogCommentMapper.xml index 144d974b..0ab17dbb 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/comment/WorkLogCommentMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/comment/WorkLogCommentMapper.xml @@ -43,6 +43,9 @@ and a.type = #{dto.type} + + and (a.user_id = #{dto.userId} or a.comment_user_id = #{dto.userId}) + ORDER BY a.create_time DESC From 875483cd934dd8c35ab608f5b4a7416a0c930dc3 Mon Sep 17 00:00:00 2001 From: furongxin <419481438@qq.com> Date: Fri, 12 Apr 2024 15:39:36 +0800 Subject: [PATCH 11/50] =?UTF-8?q?=E6=97=A5=E5=BF=97=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/enums/ErrorCodeConstants.java | 4 + .../controller/admin/user/UserController.java | 10 + .../admin/worklog/LogInstanceController.java | 10 +- .../vo/loginstance/LogInstancePageReqVO.java | 3 - .../vo/loginstance/LogInstanceRespVO.java | 3 - .../vo/loginstance/LogInstanceSaveReqVO.java | 9 +- .../worklog/vo/rule/LogRulePageReqVO.java | 3 - .../admin/worklog/vo/rule/LogRuleRespVO.java | 4 - .../worklog/vo/rule/LogRuleSaveReqVO.java | 4 - .../dal/dataobject/worklog/LogInstanceDO.java | 6 - .../dal/dataobject/worklog/LogReadDo.java | 49 +++++ .../dal/dataobject/worklog/LogRuleDO.java | 4 - .../dal/dataobject/worklog/LogUseDO.java | 47 +++++ .../dal/mysql/user/AdminUserMapper.java | 5 + .../dal/mysql/worklog/LogInstanceMapper.java | 6 +- .../dal/mysql/worklog/LogRuleMapper.java | 6 +- .../dal/mysql/worklog/LogUseMapper.java | 16 ++ .../system/service/user/AdminUserService.java | 13 +- .../service/user/AdminUserServiceImpl.java | 13 +- .../worklog/LogInstanceServiceImpl.java | 179 ++++++++++-------- .../system/service/worklog/LogUseService.java | 35 ++++ .../service/worklog/LogUseServiceImpl.java | 55 ++++++ .../worklog/dto/LogReadUserRespDTO.java | 16 ++ .../service/worklog/dto/LogUseSaveReqDTO.java | 32 ++++ .../src/main/resources/application-local.yaml | 4 +- .../src/main/resources/bootstrap.yaml | 1 + .../resources/mapper/user/AdminUserMapper.xml | 16 ++ .../mapper/user/LogInstanceMapper.xml | 85 +++++++++ .../src/test/resources/sql/create_tables.sql | 3 + 29 files changed, 506 insertions(+), 135 deletions(-) create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogReadDo.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogUseDO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogUseMapper.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/dto/LogReadUserRespDTO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/dto/LogUseSaveReqDTO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/LogInstanceMapper.xml diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index 4c78abcb..19c6311e 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -176,4 +176,8 @@ public interface ErrorCodeConstants { ErrorCode LOG_INSTANCE_NOT_EXISTS = new ErrorCode(1_009_010_002, "日志实例的拓展不存在"); ErrorCode LOG_RULE_NOT_EXISTS = new ErrorCode(1_009_010_003, "日志规则不存在"); + + ErrorCode LOG_RULE_NOT_FIND = new ErrorCode(1_009_010_004, "该模板没配置规则"); + + ErrorCode LOG_USE_NOT_EXISTS = new ErrorCode(1_009_010_005, "模板不存在"); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java index 0824c3f2..fe7e72e5 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java @@ -140,6 +140,16 @@ public class UserController { return success(UserConvert.INSTANCE.convert(user, dept, post)); } + @PostMapping("/getByDeptIds") + @Operation(summary = "获得用户详情") + @PreAuthorize("@ss.hasPermission('system:user:query')") + public CommonResult> getUserByDeptIds(@RequestBody Collection deptIds) { + + List user = userService.getUserByDeptIds(deptIds); + + return success(user); + } + @GetMapping("/export") @Operation(summary = "导出用户") @PreAuthorize("@ss.hasPermission('system:user:export')") diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java index 659ef72c..74dbad00 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java @@ -41,14 +41,14 @@ public class LogInstanceController { private LogInstanceService logInstanceService; @PostMapping("/create") - @Operation(summary = "创建日志实例的拓展") + @Operation(summary = "创建日志实例") @PreAuthorize("@ss.hasPermission('system:log-instance:create')") public CommonResult createLogInstance(@Valid @RequestBody LogInstanceSaveReqVO createReqVO) { return success(logInstanceService.createLogInstance(createReqVO)); } @PutMapping("/update") - @Operation(summary = "更新日志实例的拓展") + @Operation(summary = "更新日志实例") @PreAuthorize("@ss.hasPermission('system:log-instance:update')") public CommonResult updateLogInstance(@Valid @RequestBody LogInstanceSaveReqVO updateReqVO) { logInstanceService.updateLogInstance(updateReqVO); @@ -56,7 +56,7 @@ public class LogInstanceController { } @DeleteMapping("/delete") - @Operation(summary = "删除日志实例的拓展") + @Operation(summary = "删除日志实例") @Parameter(name = "id", description = "编号", required = true) @PreAuthorize("@ss.hasPermission('system:log-instance:delete')") public CommonResult deleteLogInstance(@RequestParam("id") Long id) { @@ -65,7 +65,7 @@ public class LogInstanceController { } @GetMapping("/get") - @Operation(summary = "获得日志实例的拓展") + @Operation(summary = "获得日志实例") @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('system:log-instance:query')") public CommonResult getLogInstance(@RequestParam("id") Long id) { @@ -82,7 +82,7 @@ public class LogInstanceController { } @GetMapping("/page") - @Operation(summary = "获得日志实例的拓展分页") + @Operation(summary = "获得我收到的日志分页列表") @PreAuthorize("@ss.hasPermission('system:view-log:query')") public CommonResult> getLogInstancePage(@Valid LogInstancePageReqVO pageReqVO) { PageResult pageResult = logInstanceService.getLogInstancePage(pageReqVO); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstancePageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstancePageReqVO.java index 61d36372..be81dd11 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstancePageReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstancePageReqVO.java @@ -38,9 +38,6 @@ public class LogInstancePageReqVO extends PageParam { @Schema(description = "模板值") private Map formVariables; - @Schema(description = "日志阅读状态", example = "2") - private Map readStatus; - @Schema(description = "附件信息") private List fileItems ; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceRespVO.java index b2d3b780..6ba8f38d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceRespVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceRespVO.java @@ -35,9 +35,6 @@ public class LogInstanceRespVO { @Schema(description = "模板值") private Map formVariables; - @Schema(description = "日志阅读状态", example = "2") - private Map readStatus; - @Schema(description = "附件信息") private List fileItems ; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceSaveReqVO.java index 4c1e156d..041f2374 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceSaveReqVO.java @@ -15,12 +15,10 @@ public class LogInstanceSaveReqVO { @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20649") private Long id; - @Schema(description = "日志发起人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24292") - @NotNull(message = "发起日志的用户编号不能为空") + @Schema(description = "日志发起人的用户编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "24292") private Long startUserId; - @Schema(description = "日志发起人的部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24292") - @NotNull(message = "发起日志的用户编号不能为空") + @Schema(description = "日志发起人的部门编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "24292") private Long deptId; @Schema(description = "日志实例的名字", example = "张三") @@ -35,9 +33,6 @@ public class LogInstanceSaveReqVO { @Schema(description = "模板值") private Map formVariables; - @Schema(description = "日志阅读状态", example = "2") - private Map readStatus; - @Schema(description = "附件信息") private List fileItems ; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/rule/LogRulePageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/rule/LogRulePageReqVO.java index 1aff5090..874becdf 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/rule/LogRulePageReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/rule/LogRulePageReqVO.java @@ -17,9 +17,6 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ @ToString(callSuper = true) public class LogRulePageReqVO extends PageParam { - @Schema(description = "模板使用部门组") - private String deptIds; - @Schema(description = "日志类型 字典值 详情参考work_log_type", example = "2") private Integer type; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/rule/LogRuleRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/rule/LogRuleRespVO.java index 2e1f87de..d28d90a0 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/rule/LogRuleRespVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/rule/LogRuleRespVO.java @@ -16,10 +16,6 @@ public class LogRuleRespVO { @ExcelProperty("编号") private Long id; - @Schema(description = "模板使用部门组", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("模板使用部门组") - private Long deptIds; - @Schema(description = "日志类型 字典值 详情参考work_log_type", example = "2") @ExcelProperty("日志类型") private Integer type; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/rule/LogRuleSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/rule/LogRuleSaveReqVO.java index 4a838719..c0a3c1de 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/rule/LogRuleSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/rule/LogRuleSaveReqVO.java @@ -12,10 +12,6 @@ public class LogRuleSaveReqVO { @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "21181") private Long id; - @Schema(description = "模板使用部门组", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "模板使用部门组不能为空") - private String deptIds; - @Schema(description = "日志类型", example = "2") private Integer type; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogInstanceDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogInstanceDO.java index b0d6013c..f25025d5 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogInstanceDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogInstanceDO.java @@ -61,12 +61,6 @@ public class LogInstanceDO extends BaseDO { @TableField(typeHandler = JacksonTypeHandler.class) private Map formVariables; - /** - * 日志阅读状态 - */ - @TableField(typeHandler = JacksonTypeHandler.class) - private Map readStatus; - /** * 附件基本信息 */ diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogReadDo.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogReadDo.java new file mode 100644 index 00000000..bfa94f9a --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogReadDo.java @@ -0,0 +1,49 @@ +package cn.iocoder.yudao.module.system.dal.dataobject.worklog; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 日志查看状态 DO + * + * @author 符溶馨 + */ +@TableName("work_log_read") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class LogReadDo extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + + /** + * 日志实例编号 + */ + private Long logInstanceId; + + /** + * 日这发起人的用户编号 + */ + private Long startUserId; + + /** + * 日志查看人的用户编号 + */ + private Long readUserId; + + /** + * 日志查看状态 + * 0:未读 + * 1:已读 + */ + private Integer readStatus; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogRuleDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogRuleDO.java index 4e1eadc5..e9633a88 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogRuleDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogRuleDO.java @@ -24,10 +24,6 @@ public class LogRuleDO extends BaseDO { */ @TableId private Long id; - /** - * 模板使用部门组 - */ - private String deptIds; /** * 日志类型 */ diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogUseDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogUseDO.java new file mode 100644 index 00000000..0de8e7bc --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogUseDO.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.module.system.dal.dataobject.worklog; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 日志模板使用者 DO + * + * @author 符溶馨 + */ +@TableName("work_log_use") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class LogUseDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + + /** + * 模板编号 + */ + private Long formId; + + /** + * 规则编号 + */ + private Long ruleId; + + /** + * 使用者编号 + */ + private Long useUserId; + + /** + * 使用者部门编号 + */ + private Long useUserDept; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java index 7ebc6f7b..241edc39 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java @@ -4,6 +4,7 @@ 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.user.vo.user.UserPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserRespVO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -53,4 +54,8 @@ public interface AdminUserMapper extends BaseMapperX { } void emptyOpenId(@Param("openId") String openId); + + List selectListByRoleId(@Param("roleId") Long roleId); + + List selectByDeptIds(@Param("deptIds") Collection deptIds); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java index 4341bd29..b684b937 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java @@ -3,8 +3,10 @@ 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.framework.mybatis.core.query.QueryWrapperX; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstancePageReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogInstanceDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; /** @@ -21,22 +23,22 @@ public interface LogInstanceMapper extends BaseMapperX { .likeIfPresent(LogInstanceDO::getName, reqVO.getName()) .eqIfPresent(LogInstanceDO::getFormId, reqVO.getFormId()) .eqIfPresent(LogInstanceDO::getFormVariables, reqVO.getFormVariables()) - .eqIfPresent(LogInstanceDO::getReadStatus, reqVO.getReadStatus()) .eqIfPresent(LogInstanceDO::getFileItems, reqVO.getFileItems()) .betweenIfPresent(LogInstanceDO::getCreateTime, reqVO.getCreateTime()) .orderByDesc(LogInstanceDO::getId)); } default PageResult selectMyPage(Long userId, LogInstancePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() .eqIfPresent(LogInstanceDO::getStartUserId, userId) .likeIfPresent(LogInstanceDO::getName, reqVO.getName()) .eqIfPresent(LogInstanceDO::getFormId, reqVO.getFormId()) .eqIfPresent(LogInstanceDO::getFormVariables, reqVO.getFormVariables()) - .eqIfPresent(LogInstanceDO::getReadStatus, reqVO.getReadStatus()) .eqIfPresent(LogInstanceDO::getFileItems, reqVO.getFileItems()) .betweenIfPresent(LogInstanceDO::getCreateTime, reqVO.getCreateTime()) .orderByDesc(LogInstanceDO::getId)); } + } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogRuleMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogRuleMapper.java index a4407855..acbfab21 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogRuleMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogRuleMapper.java @@ -4,7 +4,11 @@ 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.rule.LogRulePageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogFormDO; +import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogInstanceDO; import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogRuleDO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import org.apache.ibatis.annotations.Mapper; /** @@ -17,10 +21,8 @@ public interface LogRuleMapper extends BaseMapperX { default PageResult selectPage(LogRulePageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(LogRuleDO::getDeptIds, reqVO.getDeptIds()) .eqIfPresent(LogRuleDO::getType, reqVO.getType()) .betweenIfPresent(LogRuleDO::getCreateTime, reqVO.getCreateTime()) .orderByDesc(LogRuleDO::getId)); } - } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogUseMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogUseMapper.java new file mode 100644 index 00000000..e79ef5d6 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogUseMapper.java @@ -0,0 +1,16 @@ +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.dal.dataobject.worklog.LogUseDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 日志模板使用者 Mapper + * + * @author 符溶馨 + */ +@Mapper +public interface LogUseMapper extends BaseMapperX { +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java index f1538311..2201dc9c 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java @@ -5,10 +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.user.vo.profile.UserProfileUpdatePasswordReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; -import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserImportExcelVO; -import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserImportRespVO; -import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO; -import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSaveReqVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import javax.validation.Valid; @@ -148,6 +145,14 @@ public interface AdminUserService { */ List getUserListByDeptIds(Collection deptIds); + /** + * 获得指定岗位的用户数组 + * + * @param deptIds 岗位数组 + * @return 用户数组 + */ + List getUserByDeptIds(Collection deptIds); + /** * 获得指定岗位的用户数组 * diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java index cdbc4a26..f4fc1af6 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java @@ -15,10 +15,7 @@ import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils; import cn.iocoder.yudao.module.infra.api.file.FileApi; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; -import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserImportExcelVO; -import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserImportRespVO; -import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO; -import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSaveReqVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; import cn.iocoder.yudao.module.system.dal.dataobject.dept.UserPostDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; @@ -251,6 +248,14 @@ public class AdminUserServiceImpl implements AdminUserService { return userMapper.selectListByDeptIds(deptIds); } + @Override + public List getUserByDeptIds(Collection deptIds) { + if (CollUtil.isEmpty(deptIds)) { + return Collections.emptyList(); + } + return userMapper.selectByDeptIds(deptIds); + } + @Override public List getUserListByPostIds(Collection postIds) { if (CollUtil.isEmpty(postIds)) { diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java index 457860ad..1f5fbc8c 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java @@ -6,26 +6,23 @@ import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.Lo import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstanceRespVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstanceSaveReqVO; import cn.iocoder.yudao.module.system.convert.worklog.LogInstanceConvert; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; -import cn.iocoder.yudao.module.system.dal.dataobject.permission.UserRoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogFormDO; import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogInstanceDO; -import cn.iocoder.yudao.module.system.dal.mysql.permission.UserRoleMapper; -import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper; +import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogRuleDO; import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogInstanceMapper; -import cn.iocoder.yudao.module.system.enums.permission.DataScopeEnum; -import cn.iocoder.yudao.module.system.service.dept.DeptService; -import cn.iocoder.yudao.module.system.service.permission.MenuService; -import cn.iocoder.yudao.module.system.service.permission.PermissionService; -import cn.iocoder.yudao.module.system.service.permission.RoleService; +import cn.iocoder.yudao.module.system.service.dict.DictDataService; +import cn.iocoder.yudao.module.system.service.user.AdminUserService; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; -import java.util.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.LOG_INSTANCE_NOT_EXISTS; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.LOG_RULE_NOT_FIND; /** * 日志实例的拓展 Service 实现类 @@ -40,90 +37,108 @@ public class LogInstanceServiceImpl implements LogInstanceService { private LogInstanceMapper logInstanceMapper; @Resource - private MenuService menuService; + private DictDataService dictDataService; @Resource - private PermissionService permissionService; + private LogRuleService logRuleService; @Resource - private RoleService roleService; + private LogFormService logFormService; @Resource - private UserRoleMapper userRoleMapper; - - @Resource - private AdminUserMapper adminUserMapper; - - @Resource - private DeptService deptService; + private AdminUserService adminUserService; @Override public Long createLogInstance(LogInstanceSaveReqVO createReqVO) { - // 插入 + LogInstanceDO logInstance = BeanUtils.toBean(createReqVO, LogInstanceDO.class); + + //获取日志类型 + LogFormDO logFormDo = logFormService.getForm(createReqVO.getFormId()); + LogRuleDO logRuleDO = logRuleService.getLogRule(logFormDo.getRuleId()); + if (logRuleDO == null) { + throw exception(LOG_RULE_NOT_FIND); + } + + //获取部门信息 + AdminUserDO adminUserDO = adminUserService.getUser(getLoginUserId()); + + //获取字典值 + DictDataDO dictDataDO = dictDataService.getDictData("work_log_type", String.valueOf(logRuleDO.getType())); + + //设置发起人用户编号 + logInstance.setStartUserId(getLoginUserId()); + //设置发起人部门编号 + logInstance.setDeptId(adminUserDO.getDeptId()); + //设置日志类型 + logInstance.setType(logRuleDO.getType()); + //设置日志名称 + logInstance.setName(adminUserDO.getNickname() + "的" + dictDataDO.getLabel()); + + // 插入 logInstanceMapper.insert(logInstance); - //根据查询权限获取menuID - List menuIds = menuService.getMenuIdListByPermissionFromCache("system:view-log:query"); - if (menuIds != null && !menuIds.isEmpty()) { - - Map readStatus = new HashMap<>(); - List roles = new ArrayList<>(); - - //根据menuID 获取 roleIds - Set roleIds = permissionService.getMenuRoleIdListByMenuIdFromCache(menuIds.get(0)); - - List roleDOS = roleService.getRoleList(roleIds); - for (RoleDO roleDo : roleDOS) { - - if (Objects.equals(roleDo.getDataScope(), DataScopeEnum.ALL.getScope())) { //数据权限是全部时 - - roles.add(roleDo.getId()); - }else if (Objects.equals(roleDo.getDataScope(), DataScopeEnum.DEPT_CUSTOM.getScope())) { //数据权限是指定部门 - - //指定部门组里存在 发起人的部门 - if (roleDo.getDataScopeDeptIds().contains(createReqVO.getDeptId())) { - - roles.add(roleDo.getId()); - } - }else if (Objects.equals(roleDo.getDataScope(), DataScopeEnum.DEPT_ONLY.getScope())) { //数据权限是本部门 - - List userDos = adminUserMapper.selectListByRoleId(roleDo.getId()); - for (AdminUserDO userDO : userDos) { - - //权限部门与发起人部门一致时 - if (Objects.equals(userDO.getDeptId(), createReqVO.getDeptId())) { - - readStatus.put(String.valueOf(userDO.getId()), "0"); - } - } - }else if (Objects.equals(roleDo.getDataScope(), DataScopeEnum.DEPT_AND_CHILD.getScope())) { //数据权限是本部门及一下 - - //根据规则ID 查询用户信息 - List userDos = adminUserMapper.selectListByRoleId(roleDo.getId()); - for (AdminUserDO userDO : userDos) { - - Set deptIds = deptService.getChildDeptIdListFromCache(userDO.getDeptId()); - //权限部门与发起人部门一致时 - if (deptIds.contains(createReqVO.getDeptId())) { - - readStatus.put(String.valueOf(userDO.getId()), "0"); - } - } - } - } - - //通过满足条件的roleId 查询所有用户信息 - List userRoleDOS = userRoleMapper.selectListByRoleIds(roles); - for (UserRoleDO userRoleDO : userRoleDOS) { - - readStatus.put(String.valueOf(userRoleDO.getUserId()), "0"); - } - - LogInstanceDO updateObj = new LogInstanceDO(); -// updateObj.setReadStatus(JsonObject.); -// logInstanceMapper.updateById(); - } +// //根据查询权限获取menuID +// List menuIds = menuService.getMenuIdListByPermissionFromCache("system:view-log:query"); +// if (menuIds != null && !menuIds.isEmpty()) { +// +// Map readStatus = new HashMap<>(); +// List roles = new ArrayList<>(); +// +// //根据menuID 获取 roleIds +// Set roleIds = permissionService.getMenuRoleIdListByMenuIdFromCache(menuIds.get(0)); +// +// List roleDOS = roleService.getRoleList(roleIds); +// for (RoleDO roleDo : roleDOS) { +// +// if (Objects.equals(roleDo.getDataScope(), DataScopeEnum.ALL.getScope())) { //数据权限是全部时 +// +// roles.add(roleDo.getId()); +// }else if (Objects.equals(roleDo.getDataScope(), DataScopeEnum.DEPT_CUSTOM.getScope())) { //数据权限是指定部门 +// +// //指定部门组里存在 发起人的部门 +// if (roleDo.getDataScopeDeptIds().contains(createReqVO.getDeptId())) { +// +// roles.add(roleDo.getId()); +// } +// }else if (Objects.equals(roleDo.getDataScope(), DataScopeEnum.DEPT_ONLY.getScope())) { //数据权限是本部门 +// +// List userDos = adminUserMapper.selectListByRoleId(roleDo.getId()); +// for (AdminUserDO userDO : userDos) { +// +// //权限部门与发起人部门一致时 +// if (Objects.equals(userDO.getDeptId(), createReqVO.getDeptId())) { +// +// readStatus.put(String.valueOf(userDO.getId()), "0"); +// } +// } +// }else if (Objects.equals(roleDo.getDataScope(), DataScopeEnum.DEPT_AND_CHILD.getScope())) { //数据权限是本部门及一下 +// +// //根据规则ID 查询用户信息 +// List userDos = adminUserMapper.selectListByRoleId(roleDo.getId()); +// for (AdminUserDO userDO : userDos) { +// +// Set deptIds = deptService.getChildDeptIdListFromCache(userDO.getDeptId()); +// //权限部门与发起人部门一致时 +// if (deptIds.contains(createReqVO.getDeptId())) { +// +// readStatus.put(String.valueOf(userDO.getId()), "0"); +// } +// } +// } +// } +// +// //通过满足条件的roleId 查询所有用户信息 +// List userRoleDOS = userRoleMapper.selectListByRoleIds(roles); +// for (UserRoleDO userRoleDO : userRoleDOS) { +// +// readStatus.put(String.valueOf(userRoleDO.getUserId()), "0"); +// } +// +// LogInstanceDO updateObj = new LogInstanceDO(); +// updateObj.setReadStatus(); +//// logInstanceMapper.updateById(); +// } // 返回 return logInstance.getId(); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseService.java new file mode 100644 index 00000000..592da923 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseService.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.module.system.service.worklog; + +import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogUseDO; +import cn.iocoder.yudao.module.system.service.worklog.dto.LogUseSaveReqDTO; + +/** + * 日志模板使用者 Service 接口 + * + * @author 符溶馨 + */ +public interface LogUseService { + + /** + * 创建日志模板使用者 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createLogUse(LogUseSaveReqDTO createReqVO); + + /** + * 更新日志模板使用者 + * + * @param updateReqVO 更新信息 + */ + void updateLogUse(LogUseSaveReqDTO updateReqVO); + + /** + * 获得日志模板使用者 + * + * @param id 编号 + * @return 日志模板使用者 + */ + LogUseDO getLogUse(Long id); +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseServiceImpl.java new file mode 100644 index 00000000..f37ab7b9 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseServiceImpl.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.system.service.worklog; + +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogUseDO; +import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogUseMapper; +import cn.iocoder.yudao.module.system.service.worklog.dto.LogUseSaveReqDTO; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.LOG_USE_NOT_EXISTS; + +/** + * 日志模板使用者 Service 实现类 + * + * @author 符溶馨 + */ +@Service +@Validated +public class LogUseServiceImpl implements LogUseService { + + @Resource + private LogUseMapper logUseMapper; + + @Override + public Long createLogUse(LogUseSaveReqDTO createReqVO) { + // 插入 + LogUseDO logUse = BeanUtils.toBean(createReqVO, LogUseDO.class); + logUseMapper.insert(logUse); + // 返回 + return logUse.getId(); + } + + @Override + public void updateLogUse(LogUseSaveReqDTO updateReqVO) { + // 校验存在 + validateLogUseExists(updateReqVO.getFormId()); + // 更新 + LogUseDO updateObj = BeanUtils.toBean(updateReqVO, LogUseDO.class); + logUseMapper.updateById(updateObj); + } + + private void validateLogUseExists(Long formId) { + if (logUseMapper.selectCount(LogUseDO::getFormId, formId) == 0L) { + throw exception(LOG_USE_NOT_EXISTS); + } + } + + @Override + public LogUseDO getLogUse(Long id) { + return logUseMapper.selectById(id); + } +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/dto/LogReadUserRespDTO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/dto/LogReadUserRespDTO.java new file mode 100644 index 00000000..f3b16d1d --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/dto/LogReadUserRespDTO.java @@ -0,0 +1,16 @@ +package cn.iocoder.yudao.module.system.service.worklog.dto; + +import lombok.Data; + +/** + * 日志可查看用户 Response DTO + * + */ +@Data +public class LogReadUserRespDTO { + + /** + * 可查看日志的用户编号 + */ + private Long userId; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/dto/LogUseSaveReqDTO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/dto/LogUseSaveReqDTO.java new file mode 100644 index 00000000..727ff150 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/dto/LogUseSaveReqDTO.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.system.service.worklog.dto; + +import lombok.Data; + +/** + * 日志模板使用者新增/修改 Request DTO + */ +@Data +public class LogUseSaveReqDTO { + + private Long id; + + /** + * 日志模板编号 + */ + private Long formId; + + /** + * 模板规则编号 + */ + private Long ruleId; + + /** + * 使用模板用户编号 + */ + private Long useUserId; + + /** + * 使用模板用户部门编号 + */ + private Long useUserDept; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/application-local.yaml b/yudao-module-system/yudao-module-system-biz/src/main/resources/application-local.yaml index 6a749708..c74890d1 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/application-local.yaml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/application-local.yaml @@ -47,7 +47,7 @@ spring: # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例 # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.master.name} # SQLServer 连接的示例 username: root - password: root + password: 123456 # username: sa # password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W slave: # 模拟从库,可根据自己需要修改 @@ -58,7 +58,7 @@ spring: # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例 # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.slave.name} # SQLServer 连接的示例 username: root - password: root + password: 123456 # username: sa # password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/bootstrap.yaml b/yudao-module-system/yudao-module-system-biz/src/main/resources/bootstrap.yaml index 7abdef88..d80b600d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/bootstrap.yaml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/bootstrap.yaml @@ -4,6 +4,7 @@ spring: profiles: active: local #local +# active: dev # active: prod server: diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/AdminUserMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/AdminUserMapper.xml index 732f606c..3fac9071 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/AdminUserMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/AdminUserMapper.xml @@ -14,4 +14,20 @@ set open_id = null where open_id = #{openId} + + + + \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/LogInstanceMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/LogInstanceMapper.xml new file mode 100644 index 00000000..8f56c501 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/LogInstanceMapper.xml @@ -0,0 +1,85 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/test/resources/sql/create_tables.sql b/yudao-module-system/yudao-module-system-biz/src/test/resources/sql/create_tables.sql index 78d4e83d..764e6d0d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/test/resources/sql/create_tables.sql +++ b/yudao-module-system/yudao-module-system-biz/src/test/resources/sql/create_tables.sql @@ -3,9 +3,11 @@ CREATE TABLE IF NOT EXISTS "system_dept" ( "name" varchar(30) NOT NULL DEFAULT '', "parent_id" bigint NOT NULL DEFAULT '0', "sort" int NOT NULL DEFAULT '0', + "level" int(11) NOT NULL DEFAULT '0', "leader_user_id" bigint DEFAULT NULL, "phone" varchar(11) DEFAULT NULL, "email" varchar(50) DEFAULT NULL, + "flag" varchar(255) NOT NULL, "status" tinyint NOT NULL, "creator" varchar(64) DEFAULT '', "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, @@ -248,6 +250,7 @@ CREATE TABLE IF NOT EXISTS "system_users" ( "update_time" timestamp not null default current_timestamp, "deleted" bit not null default false, "tenant_id" bigint not null default '0', + "open_id" varchar(255) DEFAULT NULL, primary key ("id") ) comment '用户信息表'; From deb82927d4401585848dbda6d845ccb3f98955ff Mon Sep 17 00:00:00 2001 From: aikai Date: Fri, 12 Apr 2024 16:32:10 +0800 Subject: [PATCH 12/50] =?UTF-8?q?=E6=88=91=E7=AE=A1=E7=90=86=E7=9A=84=20?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E6=A8=A1=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../worklog/WorkLogStatisticsController.java | 43 +++++++++++++++++++ .../statistics/WorkLogStatisticsModelDTO.java | 29 +++++++++++++ .../statistics/WorkLogStatisticsModelVO.java | 14 ++++++ .../dal/mysql/worklog/LogFormMapper.java | 3 ++ .../dal/mysql/worklog/LogUseMapper.java | 12 ++++-- .../worklog/WorkLogStatisticsService.java | 17 ++++++++ .../worklog/WorkLogStatisticsServiceImpl.java | 39 +++++++++++++++++ .../mapper/worklog/WorkLogFormMapper.xml | 13 ++++++ .../mapper/worklog/WorkLogUseMapper.xml | 18 ++++++++ 9 files changed, 185 insertions(+), 3 deletions(-) create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/WorkLogStatisticsController.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/dto/statistics/WorkLogStatisticsModelDTO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/WorkLogStatisticsModelVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/WorkLogStatisticsService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/WorkLogStatisticsServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/WorkLogFormMapper.xml create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/WorkLogUseMapper.xml diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/WorkLogStatisticsController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/WorkLogStatisticsController.java new file mode 100644 index 00000000..8ccdf9ec --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/WorkLogStatisticsController.java @@ -0,0 +1,43 @@ +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> myManageModel(@ModelAttribute WorkLogStatisticsModelDTO dto) { + return success(workLogStatisticsService.myManageModel(dto)); + } + +// @PutMapping("/update") +// @Operation(summary = "更新动态表单") +// @PreAuthorize("@ss.hasPermission('worklog:form:update')") +// public CommonResult updateForm(@Valid @RequestBody LogFormUpdateReqVO updateReqVO) { +// formService.updateForm(updateReqVO); +// return success(true); +// } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/dto/statistics/WorkLogStatisticsModelDTO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/dto/statistics/WorkLogStatisticsModelDTO.java new file mode 100644 index 00000000..c74608db --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/dto/statistics/WorkLogStatisticsModelDTO.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.module.system.controller.admin.worklog.dto.statistics; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** +* 动态表单 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class WorkLogStatisticsModelDTO { + + @Schema(description = "表单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") + @NotNull(message = "表单名称不能为空") + private String name; + + @Schema(description = "日志绑定规则编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "1") + private String ruleId; + + @Schema(description = "表单状态-参见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "表单状态不能为空") + private Integer status; + + @Schema(description = "备注", example = "我是备注") + private String remark; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/WorkLogStatisticsModelVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/WorkLogStatisticsModelVO.java new file mode 100644 index 00000000..19ac81a0 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/WorkLogStatisticsModelVO.java @@ -0,0 +1,14 @@ +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 { + + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogFormMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogFormMapper.java index 41e5b23c..9e11d040 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogFormMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogFormMapper.java @@ -4,9 +4,12 @@ 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 { diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogUseMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogUseMapper.java index e79ef5d6..b1b33be3 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogUseMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogUseMapper.java @@ -1,16 +1,22 @@ 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.dal.dataobject.worklog.LogUseDO; import org.apache.ibatis.annotations.Mapper; +import java.util.List; + /** * 日志模板使用者 Mapper * - * @author 符溶馨 + * @author 艾楷 */ @Mapper public interface LogUseMapper extends BaseMapperX { + /** + * 通过数据权限获取日志模版ids + * + * @return + */ + List getFormIdsByDataPermission(); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/WorkLogStatisticsService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/WorkLogStatisticsService.java new file mode 100644 index 00000000..faa10108 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/WorkLogStatisticsService.java @@ -0,0 +1,17 @@ +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 myManageModel(WorkLogStatisticsModelDTO dto); +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/WorkLogStatisticsServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/WorkLogStatisticsServiceImpl.java new file mode 100644 index 00000000..03ac58a8 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/WorkLogStatisticsServiceImpl.java @@ -0,0 +1,39 @@ +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 cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogFormDO; +import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogUseMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collections; +import java.util.List; + +/** + * 工作日志统计 Service 实现类 + * + * @author 艾楷 + */ +@Service +@Validated +public class WorkLogStatisticsServiceImpl implements WorkLogStatisticsService { + @Resource + private LogFormService logFormService; + @Resource + private LogUseMapper logUseMapper; + + @Override + public List myManageModel(WorkLogStatisticsModelDTO dto) { + //获取模版ids - 当前登录用户的数据权限 查看日志模板使用者表 + // TODO: 2024/4/12 这里要测试下 数据权限问题 + List formIds = logUseMapper.getFormIdsByDataPermission(); + if (!formIds.isEmpty()) { + return Collections.emptyList(); + } + List formList = logFormService.getFormList(formIds); + + return null; + } +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/WorkLogFormMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/WorkLogFormMapper.xml new file mode 100644 index 00000000..f5075dfb --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/WorkLogFormMapper.xml @@ -0,0 +1,13 @@ + + + + + + + + \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/WorkLogUseMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/WorkLogUseMapper.xml new file mode 100644 index 00000000..d5c35f5d --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/WorkLogUseMapper.xml @@ -0,0 +1,18 @@ + + + + + + + + + \ No newline at end of file From d0a086ec00f855b2a4114457efe0fb0a64854533 Mon Sep 17 00:00:00 2001 From: furongxin <419481438@qq.com> Date: Fri, 12 Apr 2024 20:21:19 +0800 Subject: [PATCH 13/50] =?UTF-8?q?=E6=97=A5=E5=BF=97=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/worklog/LogFormController.java | 23 +++-- .../vo/loginstance/LogInstancePageReqVO.java | 8 +- .../vo/loginstance/LogInstanceRespVO.java | 8 +- .../vo/loginstance/LogInstanceSaveReqVO.java | 2 +- .../worklog/vo/rule/LogRuleSaveReqVO.java | 12 +++ .../dal/dataobject/worklog/LogInstanceDO.java | 9 ++ .../dal/mysql/user/AdminUserMapper.java | 4 +- .../dal/mysql/worklog/LogFormMapper.java | 7 ++ .../dal/mysql/worklog/LogInstanceMapper.java | 22 +++-- .../dal/mysql/worklog/LogReadMapper.java | 14 ++++ .../service/worklog/LogFormService.java | 9 +- .../service/worklog/LogFormServiceImpl.java | 5 ++ .../worklog/LogInstanceServiceImpl.java | 84 ++++--------------- .../service/worklog/LogReadService.java | 22 +++++ .../service/worklog/LogReadServiceImpl.java | 41 +++++++++ .../service/worklog/LogRuleServiceImpl.java | 1 - .../resources/mapper/user/AdminUserMapper.xml | 13 +-- .../mapper/user/LogInstanceMapper.xml | 4 + 18 files changed, 185 insertions(+), 103 deletions(-) create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogReadMapper.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogReadService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogReadServiceImpl.java diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogFormController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogFormController.java index 5cb5c7a7..eba19673 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogFormController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogFormController.java @@ -19,7 +19,7 @@ import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -@Tag(name = "管理后台 - 日志动态表单") +@Tag(name = "管理后台 - 日志动态模板") @RestController @RequestMapping("/system/worklog/form") @Validated @@ -29,14 +29,14 @@ public class LogFormController { private LogFormService formService; @PostMapping("/create") - @Operation(summary = "创建动态表单") + @Operation(summary = "创建动态模板") @PreAuthorize("@ss.hasPermission('worklog:form:create')") public CommonResult createForm(@Valid @RequestBody LogFormCreateReqVO createReqVO) { return success(formService.createForm(createReqVO)); } @PutMapping("/update") - @Operation(summary = "更新动态表单") + @Operation(summary = "更新动态模板") @PreAuthorize("@ss.hasPermission('worklog:form:update')") public CommonResult updateForm(@Valid @RequestBody LogFormUpdateReqVO updateReqVO) { formService.updateForm(updateReqVO); @@ -44,7 +44,7 @@ public class LogFormController { } @DeleteMapping("/delete") - @Operation(summary = "删除动态表单") + @Operation(summary = "删除动态模板") @Parameter(name = "id", description = "编号", required = true) @PreAuthorize("@ss.hasPermission('worklog:form:delete')") public CommonResult deleteForm(@RequestParam("id") Long id) { @@ -53,7 +53,7 @@ public class LogFormController { } @GetMapping("/get") - @Operation(summary = "获得动态表单") + @Operation(summary = "获得动态模板") @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('worklog:form:query')") public CommonResult getForm(@RequestParam("id") Long id) { @@ -62,17 +62,26 @@ public class LogFormController { } @GetMapping("/list-all-simple") - @Operation(summary = "获得动态表单的精简列表", description = "用于表单下拉框") + @Operation(summary = "获得动态模板的精简列表", description = "用于表单下拉框") public CommonResult> getSimpleForms() { List list = formService.getFormList(); return success(LogFormConvert.INSTANCE.convertList2(list)); } @GetMapping("/page") - @Operation(summary = "获得动态表单分页") + @Operation(summary = "获得动态模板分页") @PreAuthorize("@ss.hasPermission('worklog:form:query')") public CommonResult> getFormPage(@Valid LogFormPageReqVO pageVO) { PageResult pageResult = formService.getFormPage(pageVO); return success(LogFormConvert.INSTANCE.convertPage(pageResult)); } + + @GetMapping("/page-by-rule") + @Operation(summary = "获得配置规则后的模板分页") + @PreAuthorize("@ss.hasPermission('worklog:form:query')") + public CommonResult> getFormPageByRule(@Valid LogFormPageReqVO pageVO) { + + PageResult pageResult = formService.getFormPageByRule(pageVO); + return success(LogFormConvert.INSTANCE.convertPage(pageResult)); + } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstancePageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstancePageReqVO.java index be81dd11..7fe1d38e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstancePageReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstancePageReqVO.java @@ -26,7 +26,13 @@ public class LogInstancePageReqVO extends PageParam { @Schema(description = "日志发起人的部门编号", example = "24292") private Long deptId; - @Schema(description = "日志实例的名字", example = "张三") + @Schema(description = "日志发起人的用户名称", example = "张三") + private String startUserName; + + @Schema(description = "日志发起人的用户头像", example = "https://www.iocoder.cn/xxx.png") + private String avatar; + + @Schema(description = "日志实例的名字", example = "张三的XX日报") private String name; @Schema(description = "日志类型 字典值 详情参考work_log_type", example = "2") diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceRespVO.java index 6ba8f38d..a88e0c70 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceRespVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceRespVO.java @@ -23,7 +23,13 @@ public class LogInstanceRespVO { @Schema(description = "日志发起人的部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24292") private Long deptId; - @Schema(description = "日志实例的名字", example = "张三") + @Schema(description = "日志发起人的用户名称", example = "张三") + private String startUserName; + + @Schema(description = "日志发起人的用户头像", example = "https://www.iocoder.cn/xxx.png") + private String avatar; + + @Schema(description = "日志实例的名字", example = "张三的XX日报") private String name; @Schema(description = "日志类型 字典值 详情参考work_log_type", example = "2") diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceSaveReqVO.java index 041f2374..7b8603d5 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceSaveReqVO.java @@ -21,7 +21,7 @@ public class LogInstanceSaveReqVO { @Schema(description = "日志发起人的部门编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "24292") private Long deptId; - @Schema(description = "日志实例的名字", example = "张三") + @Schema(description = "日志实例的名字", example = "张三的XX日报") private String name; @Schema(description = "日志类型 字典值 详情参考work_log_type", example = "2") diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/rule/LogRuleSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/rule/LogRuleSaveReqVO.java index c0a3c1de..9e14be87 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/rule/LogRuleSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/rule/LogRuleSaveReqVO.java @@ -4,6 +4,8 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import javax.validation.constraints.NotNull; +import java.util.List; +import java.util.Map; @Schema(description = "管理后台 - 日志规则新增/修改 Request VO") @Data @@ -30,4 +32,14 @@ public class LogRuleSaveReqVO { @Schema(description = "统计时间段") private String statisticalTime; + @Schema(description = "使用者用户信息") + private List userInfo; + + @Data + private static class UserInfo { + + private Long userId; + + private Long deptId; + } } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogInstanceDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogInstanceDO.java index f25025d5..1eff5a48 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogInstanceDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogInstanceDO.java @@ -40,6 +40,15 @@ public class LogInstanceDO extends BaseDO { */ private Long deptId; + /** + * 日志发起人的用户名称 + */ + private String startUserName; + + /** + * 用户头像 + */ + private String avatar; /** * 日志名称 */ diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java index 241edc39..6e7fb58b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java @@ -55,7 +55,5 @@ public interface AdminUserMapper extends BaseMapperX { void emptyOpenId(@Param("openId") String openId); - List selectListByRoleId(@Param("roleId") Long roleId); - - List selectByDeptIds(@Param("deptIds") Collection deptIds); + List selectByDeptIds(Collection deptIds); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogFormMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogFormMapper.java index 41e5b23c..3ae5174c 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogFormMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogFormMapper.java @@ -15,4 +15,11 @@ public interface LogFormMapper extends BaseMapperX { .likeIfPresent("name", reqVO.getName()) .orderByDesc("id")); } + + default PageResult selectPageByRule(LogFormPageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .likeIfPresent("name", reqVO.getName()) + .isNotNull("rule_id") + .orderByDesc("id")); + } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java index b684b937..61708752 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java @@ -6,9 +6,12 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; 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.service.worklog.dto.LogReadUserRespDTO; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; +import java.util.List; + /** * 日志实例的拓展 Mapper * @@ -17,28 +20,23 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface LogInstanceMapper extends BaseMapperX { - default PageResult selectPage(LogInstancePageReqVO reqVO) { + default PageResult selectPage(LogInstancePageReqVO reqVO, Long userId) { return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(LogInstanceDO::getStartUserId, reqVO.getStartUserId()) - .likeIfPresent(LogInstanceDO::getName, reqVO.getName()) - .eqIfPresent(LogInstanceDO::getFormId, reqVO.getFormId()) - .eqIfPresent(LogInstanceDO::getFormVariables, reqVO.getFormVariables()) - .eqIfPresent(LogInstanceDO::getFileItems, reqVO.getFileItems()) + .eqIfPresent(LogInstanceDO::getType, reqVO.getType()) + .eqIfPresent(LogInstanceDO::getDeptId, reqVO.getDeptId()) + .eqIfPresent(LogInstanceDO::getStartUserName, reqVO.getStartUserName()) .betweenIfPresent(LogInstanceDO::getCreateTime, reqVO.getCreateTime()) + .ne(LogInstanceDO::getStartUserId, userId) .orderByDesc(LogInstanceDO::getId)); } default PageResult selectMyPage(Long userId, LogInstancePageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(LogInstanceDO::getStartUserId, userId) - .likeIfPresent(LogInstanceDO::getName, reqVO.getName()) - .eqIfPresent(LogInstanceDO::getFormId, reqVO.getFormId()) - .eqIfPresent(LogInstanceDO::getFormVariables, reqVO.getFormVariables()) - .eqIfPresent(LogInstanceDO::getFileItems, reqVO.getFileItems()) + .eqIfPresent(LogInstanceDO::getType, reqVO.getType()) .betweenIfPresent(LogInstanceDO::getCreateTime, reqVO.getCreateTime()) .orderByDesc(LogInstanceDO::getId)); } - + List selectRaedUser(Long deptId); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogReadMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogReadMapper.java new file mode 100644 index 00000000..7526f696 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogReadMapper.java @@ -0,0 +1,14 @@ +package cn.iocoder.yudao.module.system.dal.mysql.worklog; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogReadDo; +import org.apache.ibatis.annotations.Mapper; + +/** + * 日志查看 Mapper + * + * @author 符溶馨 + */ +@Mapper +public interface LogReadMapper extends BaseMapperX { +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogFormService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogFormService.java index 4bab25fd..dfeaf24c 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogFormService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogFormService.java @@ -75,11 +75,18 @@ public interface LogFormService { } /** - * 获得动态表单分页 + * 获得动态模板分页 * * @param pageReqVO 分页查询 * @return 动态表单分页 */ PageResult getFormPage(LogFormPageReqVO pageReqVO); + /** + * 获得配置规则后的模板分页 + * + * @param pageReqVO 分页查询 + * @return 动态表单分页 + */ + PageResult getFormPageByRule(LogFormPageReqVO pageReqVO); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogFormServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogFormServiceImpl.java index 6596a532..b31cdd37 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogFormServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogFormServiceImpl.java @@ -85,6 +85,11 @@ public class LogFormServiceImpl implements LogFormService{ return formMapper.selectPage(pageReqVO); } + @Override + public PageResult getFormPageByRule(LogFormPageReqVO pageReqVO) { + return formMapper.selectPageByRule(pageReqVO); + } + /** * 校验 Field,避免 field 重复 * diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java index 1f5fbc8c..dc2c4009 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java @@ -14,11 +14,14 @@ import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogRuleDO; 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 org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.util.List; + import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.LOG_INSTANCE_NOT_EXISTS; @@ -48,6 +51,9 @@ public class LogInstanceServiceImpl implements LogInstanceService { @Resource private AdminUserService adminUserService; + @Resource + private LogReadService logReadService; + @Override public Long createLogInstance(LogInstanceSaveReqVO createReqVO) { @@ -63,82 +69,28 @@ public class LogInstanceServiceImpl implements LogInstanceService { //获取部门信息 AdminUserDO adminUserDO = adminUserService.getUser(getLoginUserId()); - //获取字典值 - DictDataDO dictDataDO = dictDataService.getDictData("work_log_type", String.valueOf(logRuleDO.getType())); - //设置发起人用户编号 logInstance.setStartUserId(getLoginUserId()); //设置发起人部门编号 logInstance.setDeptId(adminUserDO.getDeptId()); + //设置发起人用户名称 + logInstance.setStartUserName(adminUserDO.getNickname()); + //设置发起人用户头像 + logInstance.setAvatar(adminUserDO.getAvatar()); //设置日志类型 logInstance.setType(logRuleDO.getType()); //设置日志名称 - logInstance.setName(adminUserDO.getNickname() + "的" + dictDataDO.getLabel()); + logInstance.setName(adminUserDO.getNickname() + "的" + logFormDo.getName()); // 插入 logInstanceMapper.insert(logInstance); -// //根据查询权限获取menuID -// List menuIds = menuService.getMenuIdListByPermissionFromCache("system:view-log:query"); -// if (menuIds != null && !menuIds.isEmpty()) { -// -// Map readStatus = new HashMap<>(); -// List roles = new ArrayList<>(); -// -// //根据menuID 获取 roleIds -// Set roleIds = permissionService.getMenuRoleIdListByMenuIdFromCache(menuIds.get(0)); -// -// List roleDOS = roleService.getRoleList(roleIds); -// for (RoleDO roleDo : roleDOS) { -// -// if (Objects.equals(roleDo.getDataScope(), DataScopeEnum.ALL.getScope())) { //数据权限是全部时 -// -// roles.add(roleDo.getId()); -// }else if (Objects.equals(roleDo.getDataScope(), DataScopeEnum.DEPT_CUSTOM.getScope())) { //数据权限是指定部门 -// -// //指定部门组里存在 发起人的部门 -// if (roleDo.getDataScopeDeptIds().contains(createReqVO.getDeptId())) { -// -// roles.add(roleDo.getId()); -// } -// }else if (Objects.equals(roleDo.getDataScope(), DataScopeEnum.DEPT_ONLY.getScope())) { //数据权限是本部门 -// -// List userDos = adminUserMapper.selectListByRoleId(roleDo.getId()); -// for (AdminUserDO userDO : userDos) { -// -// //权限部门与发起人部门一致时 -// if (Objects.equals(userDO.getDeptId(), createReqVO.getDeptId())) { -// -// readStatus.put(String.valueOf(userDO.getId()), "0"); -// } -// } -// }else if (Objects.equals(roleDo.getDataScope(), DataScopeEnum.DEPT_AND_CHILD.getScope())) { //数据权限是本部门及一下 -// -// //根据规则ID 查询用户信息 -// List userDos = adminUserMapper.selectListByRoleId(roleDo.getId()); -// for (AdminUserDO userDO : userDos) { -// -// Set deptIds = deptService.getChildDeptIdListFromCache(userDO.getDeptId()); -// //权限部门与发起人部门一致时 -// if (deptIds.contains(createReqVO.getDeptId())) { -// -// readStatus.put(String.valueOf(userDO.getId()), "0"); -// } -// } -// } -// } -// -// //通过满足条件的roleId 查询所有用户信息 -// List userRoleDOS = userRoleMapper.selectListByRoleIds(roles); -// for (UserRoleDO userRoleDO : userRoleDOS) { -// -// readStatus.put(String.valueOf(userRoleDO.getUserId()), "0"); -// } -// -// LogInstanceDO updateObj = new LogInstanceDO(); -// updateObj.setReadStatus(); -//// logInstanceMapper.updateById(); -// } + //创建日志时,查询可以查看发起人日志的用户组 用线程控制 + new Thread(() -> { + + List respDTOS = logInstanceMapper.selectRaedUser(adminUserDO.getDeptId()); + logReadService.createLogRule(respDTOS, logInstance.getId(), logInstance.getStartUserId()); + }).start(); // 返回 return logInstance.getId(); @@ -174,7 +126,7 @@ public class LogInstanceServiceImpl implements LogInstanceService { @Override public PageResult getLogInstancePage(LogInstancePageReqVO pageReqVO) { - return logInstanceMapper.selectPage(pageReqVO); + return logInstanceMapper.selectPage(pageReqVO, getLoginUserId()); } @Override diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogReadService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogReadService.java new file mode 100644 index 00000000..18449439 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogReadService.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.module.system.service.worklog; + + +import cn.iocoder.yudao.module.system.service.worklog.dto.LogReadUserRespDTO; + +import javax.validation.Valid; +import java.util.List; + +/** + * 日志查看 Service 接口 + * + * @author 符溶馨 + */ +public interface LogReadService { + + /** + * 创建日志规则 + * + * @param createReqVO 创建信息 + */ + void createLogRule(@Valid List createReqVO, Long logInstanceId, Long startUserId); +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogReadServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogReadServiceImpl.java new file mode 100644 index 00000000..3f6245e3 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogReadServiceImpl.java @@ -0,0 +1,41 @@ +package cn.iocoder.yudao.module.system.service.worklog; + +import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogReadDo; +import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogReadMapper; +import cn.iocoder.yudao.module.system.service.worklog.dto.LogReadUserRespDTO; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 日志查看 Service 实现类 + * + * @author 符溶馨 + */ +@Service +@Validated +public class LogReadServiceImpl implements LogReadService{ + + @Resource + private LogReadMapper logReadMapper; + + @Override + public void createLogRule(List createReqVO, Long logInstanceId, Long startUserId) { + + List userInfoList = createReqVO.stream() + .map(user -> { + LogReadDo logReadDo = new LogReadDo(); + logReadDo.setLogInstanceId(logInstanceId); + logReadDo.setStartUserId(startUserId); + logReadDo.setReadUserId(user.getUserId()); + logReadDo.setReadStatus(0); + return logReadDo; + }) + .collect(Collectors.toList()); + + logReadMapper.insertBatch(userInfoList); + } +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java index e85cf123..ab8fb45e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java @@ -67,5 +67,4 @@ public class LogRuleServiceImpl implements LogRuleService { public PageResult getLogRulePage(LogRulePageReqVO pageReqVO) { return logRuleMapper.selectPage(pageReqVO); } - } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/AdminUserMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/AdminUserMapper.xml index 3fac9071..cd763388 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/AdminUserMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/AdminUserMapper.xml @@ -14,18 +14,11 @@ set open_id = null where open_id = #{openId} - - + + + + \ No newline at end of file From ee2a394c7fdad3e8a7f1680e4b335d71670f8793 Mon Sep 17 00:00:00 2001 From: furongxin <419481438@qq.com> Date: Fri, 12 Apr 2024 20:21:56 +0800 Subject: [PATCH 14/50] =?UTF-8?q?=E6=97=A5=E5=BF=97=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/worklog/vo/loginstance/LogInstanceSaveReqVO.java | 3 +-- .../controller/admin/worklog/vo/rule/LogRuleSaveReqVO.java | 2 -- .../module/system/dal/mysql/worklog/LogInstanceMapper.java | 2 -- .../module/system/service/worklog/LogInstanceServiceImpl.java | 2 -- 4 files changed, 1 insertion(+), 8 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceSaveReqVO.java index 7b8603d5..399d17cc 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceSaveReqVO.java @@ -2,9 +2,8 @@ package cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.upload.UploadUserFile; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; +import lombok.Data; -import javax.validation.constraints.*; import java.util.List; import java.util.Map; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/rule/LogRuleSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/rule/LogRuleSaveReqVO.java index 9e14be87..fb139140 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/rule/LogRuleSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/rule/LogRuleSaveReqVO.java @@ -3,9 +3,7 @@ package cn.iocoder.yudao.module.system.controller.admin.worklog.vo.rule; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -import javax.validation.constraints.NotNull; import java.util.List; -import java.util.Map; @Schema(description = "管理后台 - 日志规则新增/修改 Request VO") @Data diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java index 61708752..f1ba08db 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java @@ -3,11 +3,9 @@ package cn.iocoder.yudao.module.system.dal.mysql.worklog; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; 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.service.worklog.dto.LogReadUserRespDTO; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; import java.util.List; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java index dc2c4009..cb1b972b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java @@ -6,7 +6,6 @@ import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.Lo import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstanceRespVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstanceSaveReqVO; import cn.iocoder.yudao.module.system.convert.worklog.LogInstanceConvert; -import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogFormDO; import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogInstanceDO; @@ -19,7 +18,6 @@ import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; - import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; From f0ca0baa0c47bcb9d31e6a71a817c9579a9d42a3 Mon Sep 17 00:00:00 2001 From: aikai Date: Fri, 12 Apr 2024 20:43:28 +0800 Subject: [PATCH 15/50] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E6=88=91=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E7=9A=84=E6=A8=A1=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/auth/AuthController.java | 2 -- .../service/worklog/LogRuleService.java | 8 +++++ .../service/worklog/LogRuleServiceImpl.java | 6 ++++ .../worklog/WorkLogStatisticsServiceImpl.java | 33 ++++++++++++++++--- 4 files changed, 42 insertions(+), 7 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java index 29e06743..f1ee6018 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java @@ -1,7 +1,6 @@ package cn.iocoder.yudao.module.system.controller.admin.auth; import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; -import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; @@ -27,7 +26,6 @@ import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.annotations.Param; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleService.java index e71b9b76..b10221c6 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleService.java @@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.rule.LogRuleSa import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogRuleDO; import javax.validation.Valid; +import java.util.List; /** * 日志规则 Service 接口 @@ -52,4 +53,11 @@ public interface LogRuleService { */ PageResult getLogRulePage(LogRulePageReqVO pageReqVO); + /** + * 通过规则ids获取规则 + * + * @param ruleIds + * @return + */ + List getLogRuleByIds(List ruleIds); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java index e85cf123..e2937a79 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java @@ -10,6 +10,7 @@ import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.LOG_RULE_NOT_EXISTS; @@ -68,4 +69,9 @@ public class LogRuleServiceImpl implements LogRuleService { return logRuleMapper.selectPage(pageReqVO); } + @Override + public List getLogRuleByIds(List ruleIds) { + return logRuleMapper.selectBatchIds(ruleIds); + } + } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/WorkLogStatisticsServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/WorkLogStatisticsServiceImpl.java index 03ac58a8..4389ab89 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/WorkLogStatisticsServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/WorkLogStatisticsServiceImpl.java @@ -1,15 +1,19 @@ 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.Collections; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; /** * 工作日志统计 Service 实现类 @@ -20,7 +24,11 @@ import java.util.List; @Validated public class WorkLogStatisticsServiceImpl implements WorkLogStatisticsService { @Resource - private LogFormService logFormService; + private LogFormMapper logFormMapper; + + @Resource + private LogRuleService logRuleService; + @Resource private LogUseMapper logUseMapper; @@ -32,8 +40,23 @@ public class WorkLogStatisticsServiceImpl implements WorkLogStatisticsService { if (!formIds.isEmpty()) { return Collections.emptyList(); } - List formList = logFormService.getFormList(formIds); - + List formList = logFormMapper.selectList(new LambdaQueryWrapper() + .in(LogFormDO::getId, formIds) + .eq(LogFormDO::getStatus, 1) + .isNotNull(LogFormDO::getRuleId) + ); + List ruleIds = formList.stream().map(LogFormDO::getRuleId).collect(Collectors.toList()); + List logRuleDOS = new ArrayList<>(); + Map 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; } } \ No newline at end of file From acda782e6e985be5b86cdca7a31931a2ad98ae78 Mon Sep 17 00:00:00 2001 From: furongxin <419481438@qq.com> Date: Fri, 12 Apr 2024 20:56:35 +0800 Subject: [PATCH 16/50] =?UTF-8?q?=E6=97=A5=E5=BF=97=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/worklog/vo/loginstance/LogInstancePageReqVO.java | 3 --- .../module/system/dal/mysql/worklog/LogInstanceMapper.java | 2 ++ 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstancePageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstancePageReqVO.java index 7fe1d38e..57e37eb3 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstancePageReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstancePageReqVO.java @@ -44,9 +44,6 @@ public class LogInstancePageReqVO extends PageParam { @Schema(description = "模板值") private Map formVariables; - @Schema(description = "附件信息") - private List fileItems ; - @Schema(description = "创建时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] createTime; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java index f1ba08db..487a8cdd 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java @@ -5,6 +5,7 @@ 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; @@ -31,6 +32,7 @@ public interface LogInstanceMapper extends BaseMapperX { default PageResult selectMyPage(Long userId, LogInstancePageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() + .eq(LogInstanceDO::getStartUserId, userId) .eqIfPresent(LogInstanceDO::getType, reqVO.getType()) .betweenIfPresent(LogInstanceDO::getCreateTime, reqVO.getCreateTime()) .orderByDesc(LogInstanceDO::getId)); From b58bc365af4c69d3620d1a20ee37915c740a61cb Mon Sep 17 00:00:00 2001 From: furongxin <419481438@qq.com> Date: Fri, 12 Apr 2024 21:57:05 +0800 Subject: [PATCH 17/50] =?UTF-8?q?=E6=97=A5=E5=BF=97=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/worklog/LogInstanceController.java | 1 + .../worklog/vo/loginstance/LogInstancePageReqVO.java | 9 ++++++++- .../module/system/dal/dataobject/worklog/LogReadDo.java | 5 +++++ .../system/service/worklog/LogReadServiceImpl.java | 1 + .../system/service/worklog/dto/LogReadUserRespDTO.java | 5 +++++ .../src/main/resources/mapper/user/LogInstanceMapper.xml | 2 +- 6 files changed, 21 insertions(+), 2 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java index 74dbad00..885a4faa 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java @@ -85,6 +85,7 @@ public class LogInstanceController { @Operation(summary = "获得我收到的日志分页列表") @PreAuthorize("@ss.hasPermission('system:view-log:query')") public CommonResult> getLogInstancePage(@Valid LogInstancePageReqVO pageReqVO) { + PageResult pageResult = logInstanceService.getLogInstancePage(pageReqVO); return success(BeanUtils.toBean(pageResult, LogInstanceRespVO.class)); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstancePageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstancePageReqVO.java index 57e37eb3..c49a9cd7 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstancePageReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstancePageReqVO.java @@ -1,7 +1,6 @@ package cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance; import cn.iocoder.yudao.framework.common.pojo.PageParam; -import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.upload.UploadUserFile; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @@ -48,4 +47,12 @@ public class LogInstancePageReqVO extends PageParam { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] createTime; + @Schema(description = "其他数据") + private OtherData data; + + private static class OtherData{ + + private List deptIds; + + } } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogReadDo.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogReadDo.java index bfa94f9a..5b6321cf 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogReadDo.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogReadDo.java @@ -40,6 +40,11 @@ public class LogReadDo extends BaseDO { */ private Long readUserId; + /** + * 日志查看人的部门编号 + */ + private Long readUserDept; + /** * 日志查看状态 * 0:未读 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogReadServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogReadServiceImpl.java index 3f6245e3..898307cf 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogReadServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogReadServiceImpl.java @@ -30,6 +30,7 @@ public class LogReadServiceImpl implements LogReadService{ LogReadDo logReadDo = new LogReadDo(); logReadDo.setLogInstanceId(logInstanceId); logReadDo.setStartUserId(startUserId); + logReadDo.setReadUserDept(user.getDeptId()); logReadDo.setReadUserId(user.getUserId()); logReadDo.setReadStatus(0); return logReadDo; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/dto/LogReadUserRespDTO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/dto/LogReadUserRespDTO.java index f3b16d1d..6afe3c28 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/dto/LogReadUserRespDTO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/dto/LogReadUserRespDTO.java @@ -13,4 +13,9 @@ public class LogReadUserRespDTO { * 可查看日志的用户编号 */ private Long userId; + + /** + * 可查看日志的用户部门编号 + */ + private Long deptId; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/LogInstanceMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/LogInstanceMapper.xml index e115a2c1..1400c173 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/LogInstanceMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/LogInstanceMapper.xml @@ -10,7 +10,7 @@ --> + + - + - + \ No newline at end of file From 7ede50975ab547358a91bb99150eaa95694f4c71 Mon Sep 17 00:00:00 2001 From: aikai Date: Sat, 13 Apr 2024 13:31:13 +0800 Subject: [PATCH 21/50] =?UTF-8?q?=E8=B0=83=E5=BA=A6=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/module/system/job/demo/DemoJob.java | 23 +++++++++++++++---- .../src/main/resources/application-dev.yaml | 8 ++++++- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/demo/DemoJob.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/demo/DemoJob.java index 2b04dfdc..798bdfe1 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/demo/DemoJob.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/demo/DemoJob.java @@ -1,16 +1,31 @@ package cn.iocoder.yudao.module.system.job.demo; import cn.iocoder.yudao.framework.tenant.core.job.TenantJob; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.context.XxlJobContext; import com.xxl.job.core.handler.annotation.XxlJob; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import java.util.concurrent.atomic.AtomicInteger; + @Component +@Slf4j public class DemoJob { - @XxlJob("demoJob") - @TenantJob - public void execute() { - System.out.println("美滋滋"); + private final AtomicInteger counts = new AtomicInteger(); + + @XxlJob("testJob") + //@TenantJob --- ⚠️ 这个注解 会将租户列表拉出来 完了后逐个租户执行 定时任务需要注意 + public ReturnT execute() throws Exception { + //获取参数 + XxlJobContext xxlJobContext = XxlJobContext.getXxlJobContext(); + String jobParam = xxlJobContext.getJobParam(); + System.out.println(jobParam); + // 打印日志 + log.info("[execute][定时第 ({}) 次执行]", counts.incrementAndGet()); + // 返回执行成功 + return ReturnT.SUCCESS; } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/application-dev.yaml b/yudao-module-system/yudao-module-system-biz/src/main/resources/application-dev.yaml index 96835b0f..2db39bc3 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/application-dev.yaml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/application-dev.yaml @@ -81,7 +81,13 @@ xxl: enabled: false # 是否开启调度中心,默认为 true 开启 admin: addresses: http://127.0.0.1:9090/xxl-job-admin # 调度中心部署跟地址 - + executor: + appname: ${spring.application.name} # 执行器 AppName + ip: # 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务"; + port: 6666 # ### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口; + logpath: ${user.home}/logs/xxl-job/${spring.application.name} # 执行器运行日志文件存储磁盘路径 # 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径; + #accessToken: default_token + logretentiondays: 30 # 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能; --- #################### 服务保障相关配置 #################### # Lock4j 配置项 From f243e54b3ef257c1970630cf6b04d814dd8ddf9c Mon Sep 17 00:00:00 2001 From: furongxin <419481438@qq.com> Date: Sun, 14 Apr 2024 10:43:28 +0800 Subject: [PATCH 22/50] =?UTF-8?q?=E6=97=A5=E5=BF=97=EF=BC=9A=20=E6=88=91?= =?UTF-8?q?=E6=94=B6=E7=9A=84=E5=88=B0=E9=A1=B5=E9=9D=A2=E5=88=86=E9=A1=B5?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=EF=BC=8C=20=E8=A7=84=E5=88=99=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E3=80=81=E6=9B=B4=E6=96=B0=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/worklog/LogInstanceController.java | 78 +++++----- .../admin/worklog/LogRuleController.java | 29 ++++ .../vo/loginstance/LogInstancePageReqVO.java | 14 +- .../vo/loginstance/LogInstanceRespVO.java | 32 +++-- .../worklog/vo/rule/LogRuleSaveReqVO.java | 5 +- .../dal/dataobject/worklog/LogInstanceDO.java | 5 + .../dal/dataobject/worklog/LogRuleDO.java | 4 + .../dal/mysql/worklog/LogInstanceMapper.java | 26 ++-- .../dal/mysql/worklog/LogUseMapper.java | 11 ++ .../service/worklog/LogInstanceService.java | 27 ++-- .../worklog/LogInstanceServiceImpl.java | 136 ++++++++++++++++-- .../service/worklog/LogRuleServiceImpl.java | 42 ++++++ .../system/service/worklog/LogUseService.java | 23 ++- .../service/worklog/LogUseServiceImpl.java | 46 ++++-- .../mapper/user/LogInstanceMapper.xml | 45 +++++- .../mapper/worklog/WorkLogUseMapper.xml | 7 + 16 files changed, 405 insertions(+), 125 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java index f2af66d3..60a69e5e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java @@ -1,39 +1,34 @@ package cn.iocoder.yudao.module.system.controller.admin.worklog; -import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptRespVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstancePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstanceRespVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstanceSaveReqVO; -import org.springframework.web.bind.annotation.*; -import javax.annotation.Resource; -import org.springframework.validation.annotation.Validated; -import org.springframework.security.access.prepost.PreAuthorize; -import io.swagger.v3.oas.annotations.tags.Tag; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Operation; - -import javax.validation.*; -import javax.servlet.http.*; -import java.util.*; -import java.io.IOException; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; - -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*; -import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogInstanceDO; import cn.iocoder.yudao.module.system.service.worklog.LogInstanceService; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +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.*; -@Tag(name = "管理后台 - 日志实例的拓展") +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 日志实例") @RestController @RequestMapping("/system/log-instance") @Validated @@ -75,21 +70,13 @@ public class LogInstanceController { return success(BeanUtils.toBean(logInstance, LogInstanceRespVO.class)); } - @GetMapping("/my-page") - @Operation(summary = "获得我的日志分页列表", description = "在【我的日志】菜单中,进行调用") - @PreAuthorize("@ss.hasPermission('system:log-instance:query')") - public CommonResult> getMyLogInstancePage(@Valid LogInstancePageReqVO pageReqVO) { - - return success(logInstanceService.getMyProcessInstancePage(getLoginUserId(), pageReqVO)); - } - @GetMapping("/page") - @Operation(summary = "获得我收到的日志分页列表") + @Operation(summary = "获得日志分页列表") @PreAuthorize("@ss.hasPermission('system:view-log:query')") - public CommonResult> getLogInstancePage(@Valid LogInstancePageReqVO pageReqVO) { + public CommonResult> getLogInstancePage(@ModelAttribute LogInstancePageReqVO pageReqVO) { - PageResult pageResult = logInstanceService.getLogInstancePage(pageReqVO); - return success(BeanUtils.toBean(pageResult, LogInstanceRespVO.class)); + IPage pageResult = logInstanceService.getLogInstancePage(pageReqVO); + return success(pageResult); } @PostMapping("/get-dept") @@ -101,14 +88,23 @@ public class LogInstanceController { return success(deptInfo); } + @GetMapping("/get-upLog") + @Operation(summary = "获取上一篇日志,用于导入上一篇日志") + @Parameter(name = "type", description = "日志类型", required = true, example = "1") + @PreAuthorize("@ss.hasPermission('system:view-log:query')") + public CommonResult getUpLog(@RequestParam("type") Integer type) { + + return success(BeanUtils.toBean(logInstanceService.getUpLog(type), LogInstanceRespVO.class)); + } + @GetMapping("/export-excel") - @Operation(summary = "导出日志实例的拓展 Excel") + @Operation(summary = "导出日志实例 Excel") @PreAuthorize("@ss.hasPermission('system:log-instance:export')") @OperateLog(type = EXPORT) public void exportLogInstanceExcel(@Valid LogInstancePageReqVO pageReqVO, HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List list = logInstanceService.getLogInstancePage(pageReqVO).getList(); + List list = logInstanceService.getLogInstancePage(pageReqVO).getRecords(); // 导出 Excel ExcelUtils.write(response, "日志实例的拓展.xls", "数据", LogInstanceRespVO.class, BeanUtils.toBean(list, LogInstanceRespVO.class)); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogRuleController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogRuleController.java index 298aa536..ea2e070b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogRuleController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogRuleController.java @@ -6,11 +6,14 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserRespVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.rule.LogRulePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.rule.LogRuleRespVO; 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.service.user.AdminUserService; import cn.iocoder.yudao.module.system.service.worklog.LogRuleService; +import cn.iocoder.yudao.module.system.service.worklog.LogUseService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -23,6 +26,7 @@ import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; import java.util.List; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; @@ -36,6 +40,12 @@ public class LogRuleController { @Resource private LogRuleService logRuleService; + @Resource + private LogUseService logUseService; + + @Resource + private AdminUserService userService; + @PostMapping("/create") @Operation(summary = "创建日志规则") @PreAuthorize("@ss.hasPermission('system:log-rule:create')") @@ -65,10 +75,29 @@ public class LogRuleController { @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('system:log-rule:query')") public CommonResult getLogRule(@RequestParam("id") Long id) { + LogRuleDO logRule = logRuleService.getLogRule(id); + return success(BeanUtils.toBean(logRule, LogRuleRespVO.class)); } + @GetMapping("/get-userInfo") + @Operation(summary = "获得规则内模板使用者信息") + @Parameter(name = "formId", description = "模板编号", required = true, example = "1") + @PreAuthorize("@ss.hasPermission('system:log-rule:query')") + public CommonResult> getLogUseInfo(@RequestParam("formId") Long formId) { + + //获取模板使用者部门编号组 + List deptIds = logUseService.getDeptByFormId(formId); + //获取模板使用者编号组 + List userIds = logUseService.getUserByFormId(formId); + + //根据部门编号组 获取用户信息 + List userInfo = userService.getUserByDeptIds(deptIds); + + return success(userInfo.stream().filter(user -> userIds.contains(user.getId())).collect(Collectors.toList())); + } + @GetMapping("/page") @Operation(summary = "获得日志规则分页") @PreAuthorize("@ss.hasPermission('system:log-rule:query')") diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstancePageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstancePageReqVO.java index c49a9cd7..1ba9beed 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstancePageReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstancePageReqVO.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance; import cn.iocoder.yudao.framework.common.pojo.PageParam; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @@ -8,7 +9,6 @@ import lombok.ToString; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; -import java.util.List; import java.util.Map; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @@ -44,15 +44,13 @@ public class LogInstancePageReqVO extends PageParam { private Map formVariables; @Schema(description = "创建时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] createTime; - @Schema(description = "其他数据") - private OtherData data; + @Schema(description = "未读", example = "0") + private Integer unRead; - private static class OtherData{ - - private List deptIds; - - } + @Schema(description = "分页类型 0是我收到,1是我的", example = "0") + private Integer pagingType; } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceRespVO.java index a88e0c70..f47873b1 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceRespVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceRespVO.java @@ -1,14 +1,9 @@ package cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance; -import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.upload.UploadUserFile; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Map; - @Schema(description = "管理后台 - 日志实例的拓展 Response VO") @Data @ExcelIgnoreUnannotated @@ -17,10 +12,10 @@ public class LogInstanceRespVO { @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20649") private Long id; - @Schema(description = "日志发起人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24292") + @Schema(description = "日志发起人的用户编号", example = "146") private Long startUserId; - @Schema(description = "日志发起人的部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24292") + @Schema(description = "日志发起人的部门编号", example = "128") private Long deptId; @Schema(description = "日志发起人的用户名称", example = "张三") @@ -39,12 +34,27 @@ public class LogInstanceRespVO { private Long formId; @Schema(description = "模板值") - private Map formVariables; + private String formVariables; + + @Schema(description = "工作日志内容(部分)") + private String workLogContent; @Schema(description = "附件信息") - private List fileItems ; + private String fileItems ; - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; + @Schema(description = "创建时间") + private String createTime; + + @Schema(description = "阅读状态, 0:未读、1:已读", example = "0") + private String readStatus; + + @Schema(description = "评论数", example = "10") + private Integer comment; + + @Schema(description = "已读人数", example = "10") + private Integer readCount; + + @Schema(description = "未读人数", example = "10") + private Integer unreadCount; } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/rule/LogRuleSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/rule/LogRuleSaveReqVO.java index fb139140..62d7c486 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/rule/LogRuleSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/rule/LogRuleSaveReqVO.java @@ -12,6 +12,9 @@ public class LogRuleSaveReqVO { @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "21181") private Long id; + @Schema(description = "日志模板编号", example = "12") + private Long formId; + @Schema(description = "日志类型", example = "2") private Integer type; @@ -34,7 +37,7 @@ public class LogRuleSaveReqVO { private List userInfo; @Data - private static class UserInfo { + public static class UserInfo { private Long userId; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogInstanceDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogInstanceDO.java index 1eff5a48..1cdaacbc 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogInstanceDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogInstanceDO.java @@ -75,4 +75,9 @@ public class LogInstanceDO extends BaseDO { */ @TableField(typeHandler = JacksonTypeHandler.class) private List fileItems ; + + /** + * 时间yyyy-MM-dd 比如 2024-03-13 + */ + private String time; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogRuleDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogRuleDO.java index e9633a88..add0ec18 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogRuleDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogRuleDO.java @@ -24,6 +24,10 @@ public class LogRuleDO extends BaseDO { */ @TableId private Long id; + /** + * 日志模板编号 + */ + private Long formId; /** * 日志类型 */ diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java index 487a8cdd..e157d7ab 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java @@ -1,13 +1,15 @@ 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.loginstance.LogInstancePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstanceRespVO; 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 com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -19,24 +21,16 @@ import java.util.List; @Mapper public interface LogInstanceMapper extends BaseMapperX { - default PageResult selectPage(LogInstancePageReqVO reqVO, Long userId) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(LogInstanceDO::getType, reqVO.getType()) - .eqIfPresent(LogInstanceDO::getDeptId, reqVO.getDeptId()) - .eqIfPresent(LogInstanceDO::getStartUserName, reqVO.getStartUserName()) - .betweenIfPresent(LogInstanceDO::getCreateTime, reqVO.getCreateTime()) - .ne(LogInstanceDO::getStartUserId, userId) - .orderByDesc(LogInstanceDO::getId)); - } - default PageResult selectMyPage(Long userId, LogInstancePageReqVO reqVO) { + default List getUpLog(Long userId, Integer type){ - return selectPage(reqVO, new LambdaQueryWrapperX() + return selectList(new LambdaQueryWrapperX() .eq(LogInstanceDO::getStartUserId, userId) - .eqIfPresent(LogInstanceDO::getType, reqVO.getType()) - .betweenIfPresent(LogInstanceDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(LogInstanceDO::getId)); + .eq(LogInstanceDO::getType, type) + .orderByDesc(LogInstanceDO::getCreateTime)); } + IPage selectPageResult(@Param("page")Page page, @Param("reqVO")LogInstancePageReqVO reqVO, @Param("userId")Long userId); + List selectRaedUser(Long deptId); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogUseMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogUseMapper.java index b1b33be3..41942f31 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogUseMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogUseMapper.java @@ -2,8 +2,10 @@ package cn.iocoder.yudao.module.system.dal.mysql.worklog; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogUseDO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.apache.ibatis.annotations.Mapper; +import java.util.Collection; import java.util.List; /** @@ -19,4 +21,13 @@ public interface LogUseMapper extends BaseMapperX { * @return */ List getFormIdsByDataPermission(); + + default void deleteByFormId(Long formId, Collection userIds) { + + delete(new LambdaQueryWrapper() + .eq(LogUseDO::getFormId, formId) + .in(LogUseDO::getUseUserId, userIds)); + } + + List getDeptByFormId(Long formId); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java index 985770af..9655027e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java @@ -1,11 +1,11 @@ package cn.iocoder.yudao.module.system.service.worklog; -import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptRespVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstancePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstanceRespVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstanceSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogInstanceDO; +import com.baomidou.mybatisplus.core.metadata.IPage; import javax.validation.Valid; import java.util.List; @@ -18,7 +18,7 @@ import java.util.List; public interface LogInstanceService { /** - * 创建日志实例的拓展 + * 创建日志实例 * * @param createReqVO 创建信息 * @return 编号 @@ -26,21 +26,21 @@ public interface LogInstanceService { Long createLogInstance(@Valid LogInstanceSaveReqVO createReqVO); /** - * 更新日志实例的拓展 + * 更新日志实例 * * @param updateReqVO 更新信息 */ void updateLogInstance(@Valid LogInstanceSaveReqVO updateReqVO); /** - * 删除日志实例的拓展 + * 删除日志实例 * * @param id 编号 */ void deleteLogInstance(Long id); /** - * 获得日志实例的拓展 + * 获得日志实例 * * @param id 编号 * @return 日志实例的拓展 @@ -48,21 +48,20 @@ public interface LogInstanceService { LogInstanceDO getLogInstance(Long id); /** - * 获得日志实例的拓展分页 + * 获得日志实例分页 * * @param pageReqVO 分页查询 * @return 日志实例的拓展分页 */ - PageResult getLogInstancePage(LogInstancePageReqVO pageReqVO); + IPage getLogInstancePage(LogInstancePageReqVO pageReqVO); /** - * 获得我的日志的分页 - * - * @param userId 用户编号 - * @param pageReqVO 分页请求 - * @return 流程实例的分页 + * 获得我收到的日志页面中的部门列表 */ - PageResult getMyProcessInstancePage(Long userId, LogInstancePageReqVO pageReqVO); - List getDeptInfo(); + + /** + * 获取上一篇日志 + */ + LogInstanceDO getUpLog(Integer type); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java index fe272685..a5b95ac1 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java @@ -1,30 +1,36 @@ package cn.iocoder.yudao.module.system.service.worklog; -import ch.qos.logback.core.pattern.ConverterUtil; -import cn.hutool.core.convert.Convert; -import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.hutool.core.date.DateUtil; +import cn.hutool.json.JSONObject; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.system.api.dept.DeptApiImpl; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptRespVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstancePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstanceRespVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstanceSaveReqVO; -import cn.iocoder.yudao.module.system.convert.worklog.LogInstanceConvert; import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogFormDO; import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogInstanceDO; import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogRuleDO; import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogInstanceMapper; +import cn.iocoder.yudao.module.system.enums.ErrorCodeConstants; import cn.iocoder.yudao.module.system.service.dept.DeptService; -import cn.iocoder.yudao.module.system.service.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.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.WeekFields; +import java.util.Date; import java.util.List; +import java.util.Locale; +import java.util.Map; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -62,6 +68,9 @@ public class LogInstanceServiceImpl implements LogInstanceService { @Override public Long createLogInstance(LogInstanceSaveReqVO createReqVO) { + //校验当前日志类型的日志 是否已提交过 + validateLogInstanceByType(createReqVO); + LogInstanceDO logInstance = BeanUtils.toBean(createReqVO, LogInstanceDO.class); //获取日志类型 @@ -86,6 +95,8 @@ public class LogInstanceServiceImpl implements LogInstanceService { logInstance.setType(logRuleDO.getType()); //设置日志名称 logInstance.setName(adminUserDO.getNickname() + "的" + logFormDo.getName()); + //设置时间 + logInstance.setTime(DateUtil.format(new Date(),"yyyy-MM-dd")); // 插入 logInstanceMapper.insert(logInstance); @@ -101,6 +112,54 @@ public class LogInstanceServiceImpl implements LogInstanceService { return logInstance.getId(); } + private void validateLogInstanceByType(LogInstanceSaveReqVO createReqVO) { + + LogInstanceDO logInstanceDO = getUpLog(createReqVO.getType()); + if (logInstanceDO != null) { + + LocalDate oldTime = logInstanceDO.getCreateTime().toLocalDate(); + LocalDate nowTime = LocalDate.now(); + + //根据日志类型判断 + switch (createReqVO.getType()){ + + //日志类型为日报 + case 1: + if (oldTime.equals(nowTime)) { + + throw exception(ErrorCodeConstants.LOG_TYPE_EXISTS, createReqVO.getType()); + } + //日志类型为周报 + case 2: + WeekFields weekFields = WeekFields.of(Locale.getDefault()); + + // 获取两个日期所属的周数和年份 + int oldWeek = oldTime.get(weekFields.weekOfWeekBasedYear()); + int oldYear = oldTime.get(weekFields.weekBasedYear()); + + int nowWeek = nowTime.get(weekFields.weekOfWeekBasedYear()); + int nowYear = nowTime.get(weekFields.weekBasedYear()); + + if (oldWeek == nowWeek && oldYear == nowYear) { + + throw exception(ErrorCodeConstants.LOG_TYPE_EXISTS, createReqVO.getType()); + } + //日志类型为月报 + case 3: + if (oldTime.getYear() == nowTime.getYear() && oldTime.getMonth() == nowTime.getMonth()) { + + throw exception(ErrorCodeConstants.LOG_TYPE_EXISTS, createReqVO.getType()); + } + //日志类型为年报 + case 4: + if (oldTime.getYear() == nowTime.getYear()) { + + throw exception(ErrorCodeConstants.LOG_TYPE_EXISTS, createReqVO.getType()); + } + } + } + } + @Override public void updateLogInstance(LogInstanceSaveReqVO updateReqVO) { // 校验存在 @@ -130,14 +189,55 @@ public class LogInstanceServiceImpl implements LogInstanceService { } @Override - public PageResult getLogInstancePage(LogInstancePageReqVO pageReqVO) { - return logInstanceMapper.selectPage(pageReqVO, getLoginUserId()); - } + public IPage getLogInstancePage(LogInstancePageReqVO pageReqVO) { - @Override - public PageResult getMyProcessInstancePage(Long userId, LogInstancePageReqVO pageReqVO) { + Page page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()); + IPage pageList = logInstanceMapper.selectPageResult(page, pageReqVO, getLoginUserId()); - return LogInstanceConvert.INSTANCE.convertPage(logInstanceMapper.selectMyPage(userId, pageReqVO)); + List records = pageList.getRecords(); + if (!records.isEmpty()) { + + //模版ids过滤 + List workFormIds = records.stream().map(LogInstanceRespVO::getFormId).collect(Collectors.toList()); + + // 查询模版列表 + List formList = logFormService.getFormList(workFormIds); + Map formMap = formList.stream().collect(Collectors.toMap(LogFormDO::getId, item -> item)); + + //遍历 + records.forEach(item -> { + + //设置日志内部分 + LogFormDO logFormDO = formMap.get(item.getFormId()); + List fields = logFormDO.getFields(); + StringBuilder workLogContent = new StringBuilder(); + if (!item.getFormVariables().isEmpty()) { + JSONObject workLogContentJson = new JSONObject(item.getFormVariables()); + for (String fieldItem : fields) { + JSONObject fieldJson = new JSONObject(fieldItem); + String fieldStr = fieldJson.getStr("field"); + String title = fieldJson.getStr("title"); + String field = workLogContentJson.getStr(fieldStr); + workLogContent.append(title).append(":").append(field); + } + } + item.setWorkLogContent(workLogContent.toString()); + + //设置时间 + LocalDate nowDate = LocalDate.now(); + LocalDateTime createTime = LocalDateTime.parse(item.getCreateTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + //日志创建时间是当前日期时 + if (createTime.toLocalDate().equals(nowDate)) { + item.setCreateTime("今日 " + createTime.getHour() + ":" + createTime.getMinute()); + } + //日志创建时间是当前日期前一天时 + if (createTime.toLocalDate().equals(nowDate.minusDays(1))) { + item.setCreateTime("昨日 " + createTime.getHour() + ":" + createTime.getMinute()); + } + }); + } + + return pageList; } @Override @@ -151,4 +251,16 @@ public class LogInstanceServiceImpl implements LogInstanceService { List deptDOS = deptService.getDeptList(deptIds); return BeanUtils.toBean(deptDOS, DeptRespVO.class); } + + @Override + public LogInstanceDO getUpLog(Integer type) { + + LogInstanceDO logInstanceDO = new LogInstanceDO(); + + List logInstanceDOS = logInstanceMapper.getUpLog(getLoginUserId(), type); + if (!logInstanceDOS.isEmpty()) { + logInstanceDO = logInstanceDOS.get(0); + } + return logInstanceDO; + } } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java index e2937a79..7c7b5a3f 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java @@ -4,13 +4,17 @@ 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.rule.LogRulePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.rule.LogRuleSaveReqVO; +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.LogRuleMapper; +import cn.iocoder.yudao.module.system.service.worklog.dto.LogUseSaveReqDTO; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.util.List; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.LOG_RULE_NOT_EXISTS; @@ -27,11 +31,36 @@ public class LogRuleServiceImpl implements LogRuleService { @Resource private LogRuleMapper logRuleMapper; + @Resource + private LogUseService logUseService; + + @Resource + private LogFormMapper logFormMapper; + @Override public Long createLogRule(LogRuleSaveReqVO createReqVO) { // 插入 LogRuleDO logRule = BeanUtils.toBean(createReqVO, LogRuleDO.class); logRuleMapper.insert(logRule); + + //插入规则后,同步插入模板使用者 + List useDOs = createReqVO.getUserInfo().stream() + .map(user -> { + LogUseSaveReqDTO logUseDo = new LogUseSaveReqDTO(); + logUseDo.setRuleId(createReqVO.getId()); + logUseDo.setFormId(createReqVO.getFormId()); + logUseDo.setUseUserId(user.getUserId()); + logUseDo.setUseUserDept(user.getDeptId()); + return logUseDo; + }).collect(Collectors.toList()); + logUseService.createLogUse(useDOs); + + //把规则编号更新至日志模板表中 + LogFormDO updateObj = new LogFormDO(); + updateObj.setId(createReqVO.getFormId()); + updateObj.setRuleId(createReqVO.getId()); + logFormMapper.updateById(updateObj); + // 返回 return logRule.getId(); } @@ -43,6 +72,19 @@ public class LogRuleServiceImpl implements LogRuleService { // 更新 LogRuleDO updateObj = BeanUtils.toBean(updateReqVO, LogRuleDO.class); logRuleMapper.updateById(updateObj); + + //更新规则表 同步更新模板使用者 + //插入规则后,同步插入模板使用者 + List useDOs = updateReqVO.getUserInfo().stream() + .map(user -> { + LogUseSaveReqDTO logUseDo = new LogUseSaveReqDTO(); + logUseDo.setRuleId(updateReqVO.getId()); + logUseDo.setFormId(updateReqVO.getFormId()); + logUseDo.setUseUserId(user.getUserId()); + logUseDo.setUseUserDept(user.getDeptId()); + return logUseDo; + }).collect(Collectors.toList()); + logUseService.updateLogUse(useDOs, updateReqVO.getFormId()); } @Override diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseService.java index 592da923..4b019de2 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseService.java @@ -1,8 +1,9 @@ package cn.iocoder.yudao.module.system.service.worklog; -import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogUseDO; import cn.iocoder.yudao.module.system.service.worklog.dto.LogUseSaveReqDTO; +import java.util.List; + /** * 日志模板使用者 Service 接口 * @@ -16,20 +17,28 @@ public interface LogUseService { * @param createReqVO 创建信息 * @return 编号 */ - Long createLogUse(LogUseSaveReqDTO createReqVO); + void createLogUse(List createReqVO); /** * 更新日志模板使用者 * * @param updateReqVO 更新信息 */ - void updateLogUse(LogUseSaveReqDTO updateReqVO); + void updateLogUse(List updateReqVO, Long formId); /** - * 获得日志模板使用者 + * 获得日志模板使用者的部门编号组 * - * @param id 编号 - * @return 日志模板使用者 + * @param formId 编号 + * @return 日志模板使用者的部门编号组 */ - LogUseDO getLogUse(Long id); + List getDeptByFormId(Long formId); + + /** + * 获得日志模板使用者编号组 + * + * @param formId 编号 + * @return 日志模板使用者的部门编号组 + */ + List getUserByFormId(Long formId); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseServiceImpl.java index f37ab7b9..589a3cde 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseServiceImpl.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.system.service.worklog; +import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogUseDO; import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogUseMapper; @@ -8,8 +9,12 @@ import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.LOG_USE_NOT_EXISTS; /** @@ -25,21 +30,30 @@ public class LogUseServiceImpl implements LogUseService { private LogUseMapper logUseMapper; @Override - public Long createLogUse(LogUseSaveReqDTO createReqVO) { + public void createLogUse(List createReqVO) { // 插入 - LogUseDO logUse = BeanUtils.toBean(createReqVO, LogUseDO.class); - logUseMapper.insert(logUse); - // 返回 - return logUse.getId(); + List logUse = BeanUtils.toBean(createReqVO, LogUseDO.class); + logUseMapper.insertBatch(logUse); } @Override - public void updateLogUse(LogUseSaveReqDTO updateReqVO) { + public void updateLogUse(List updateReqVO, Long formId) { // 校验存在 - validateLogUseExists(updateReqVO.getFormId()); - // 更新 - LogUseDO updateObj = BeanUtils.toBean(updateReqVO, LogUseDO.class); - logUseMapper.updateById(updateObj); + validateLogUseExists(formId); + List logUseDOS = BeanUtils.toBean(updateReqVO, LogUseDO.class); + + List oldLogUserS = convertList(logUseMapper.selectList(LogUseDO::getFormId, formId), LogUseDO::getUseUserId); + List newLogUsers = convertList(updateReqVO, LogUseSaveReqDTO::getUseUserId); + + Collection createLogUses = CollUtil.subtract(newLogUsers, oldLogUserS); + Collection deleteLogUses = CollUtil.subtract(oldLogUserS, newLogUsers); + + if (CollUtil.isNotEmpty(createLogUses)) { + logUseMapper.insertBatch(logUseDOS.stream().filter(user -> createLogUses.contains(user.getUseUserId())).collect(Collectors.toList())); + } + if (CollUtil.isNotEmpty(deleteLogUses)) { + logUseMapper.deleteByFormId(formId, deleteLogUses); + } } private void validateLogUseExists(Long formId) { @@ -49,7 +63,15 @@ public class LogUseServiceImpl implements LogUseService { } @Override - public LogUseDO getLogUse(Long id) { - return logUseMapper.selectById(id); + public List getDeptByFormId(Long formId) { + + return logUseMapper.getDeptByFormId(formId); + } + + @Override + public List getUserByFormId(Long formId) { + + List logUseDOS = logUseMapper.selectList(LogUseDO::getFormId, formId); + return convertList(logUseDOS, LogUseDO::getUseUserId); } } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/LogInstanceMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/LogInstanceMapper.xml index 4692c756..fb9258b3 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/LogInstanceMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/LogInstanceMapper.xml @@ -83,7 +83,46 @@ or result.data_scope = 1 - - - + \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/WorkLogUseMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/WorkLogUseMapper.xml index d5c35f5d..26f8327e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/WorkLogUseMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/WorkLogUseMapper.xml @@ -15,4 +15,11 @@ DISTINCT form_id from work_log_use + + \ No newline at end of file From a7776f5f8e46f457baccb997ad248de18ae096df Mon Sep 17 00:00:00 2001 From: furongxin <419481438@qq.com> Date: Sun, 14 Apr 2024 10:43:35 +0800 Subject: [PATCH 23/50] =?UTF-8?q?=E6=97=A5=E5=BF=97=EF=BC=9A=20=E6=88=91?= =?UTF-8?q?=E6=94=B6=E7=9A=84=E5=88=B0=E9=A1=B5=E9=9D=A2=E5=88=86=E9=A1=B5?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=EF=BC=8C=20=E8=A7=84=E5=88=99=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E3=80=81=E6=9B=B4=E6=96=B0=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iocoder/yudao/module/system/enums/ErrorCodeConstants.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index cab6af6f..1e4092cb 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -187,4 +187,6 @@ public interface ErrorCodeConstants { ErrorCode LOG_RULE_NOT_FIND = new ErrorCode(1_009_010_004, "该模板没配置规则"); ErrorCode LOG_USE_NOT_EXISTS = new ErrorCode(1_009_010_005, "模板不存在"); + + ErrorCode LOG_TYPE_EXISTS = new ErrorCode(1_009_010_006, "已提交过({}),请勿重复提交"); } From 746db0efbbafbe522297c4f2de96ae8023ad39bc Mon Sep 17 00:00:00 2001 From: aikai Date: Mon, 15 Apr 2024 09:35:00 +0800 Subject: [PATCH 24/50] =?UTF-8?q?=E6=97=A5=E5=BF=97=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/common/pojo/CommonResult.java | 6 + .../framework/common/util/date/DateUtils.java | 63 +++- .../rule/dept/DeptDataPermissionRule.java | 4 +- .../worklog/LogStatisticsController.java | 49 +++ .../worklog/WorkLogStatisticsController.java | 43 --- .../LogStatisticsDetailsListDTO.java | 17 ++ .../admin/worklog/vo/form/LogFormRuleVO.java | 14 + .../LogStatisticsDetailsListVO.java | 23 ++ .../vo/statistics/LogStatisticsDetailsVO.java | 41 +++ .../vo/statistics/LogStatisticsModelVO.java | 25 ++ .../vo/statistics/LogStatisticsPageReqVO.java | 47 +++ .../vo/statistics/LogStatisticsRespVO.java | 56 ++++ .../vo/statistics/LogStatisticsSaveReqVO.java | 39 +++ .../statistics/WorkLogStatisticsModelVO.java | 14 - .../LogStatisticsRecordPageReqVO.java | 35 +++ .../LogStatisticsRecordRespVO.java | 40 +++ .../LogStatisticsRecordSaveReqVO.java | 28 ++ .../app/comment/vo/CommentPageListVO.java | 5 + .../dal/dataobject/worklog/LogRuleDO.java | 14 +- .../dataobject/worklog/LogStatisticsDO.java | 63 ++++ .../worklog/LogStatisticsRecordDO.java | 47 +++ .../dal/mysql/worklog/LogFormMapper.java | 3 - .../dal/mysql/worklog/LogInstanceMapper.java | 10 +- .../mysql/worklog/LogStatisticsMapper.java | 63 ++++ .../worklog/LogStatisticsRecordMapper.java | 30 ++ .../dal/mysql/worklog/LogUseMapper.java | 2 +- .../config/DataPermissionConfiguration.java | 10 +- .../system/job/worklog/LogStatisticsJob.java | 119 ++++++++ .../service/worklog/LogFormService.java | 8 + .../service/worklog/LogFormServiceImpl.java | 33 +- .../service/worklog/LogInstanceService.java | 30 +- .../worklog/LogInstanceServiceImpl.java | 22 ++ .../service/worklog/LogRuleService.java | 8 + .../service/worklog/LogRuleServiceImpl.java | 7 + .../worklog/LogStatisticsRecordService.java | 64 ++++ .../LogStatisticsRecordServiceImpl.java | 67 +++++ .../service/worklog/LogStatisticsService.java | 84 ++++++ .../worklog/LogStatisticsServiceImpl.java | 283 ++++++++++++++++++ .../worklog/WorkLogStatisticsService.java | 17 -- .../worklog/WorkLogStatisticsServiceImpl.java | 62 ---- .../mapper/comment/WorkLogCommentMapper.xml | 1 + .../mapper/user/LogInstanceMapper.xml | 20 ++ .../mapper/worklog/LogStatisticsMapper.xml | 83 +++++ .../worklog/LogStatisticsRecordMapper.xml | 12 + .../mapper/worklog/WorkLogUseMapper.xml | 5 + 45 files changed, 1561 insertions(+), 155 deletions(-) create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogStatisticsController.java delete mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/WorkLogStatisticsController.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/dto/statistics/LogStatisticsDetailsListDTO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/form/LogFormRuleVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsDetailsListVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsDetailsVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsModelVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsPageReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsRespVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsSaveReqVO.java delete mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/WorkLogStatisticsModelVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statisticsrecord/LogStatisticsRecordPageReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statisticsrecord/LogStatisticsRecordRespVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statisticsrecord/LogStatisticsRecordSaveReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogStatisticsDO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogStatisticsRecordDO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogStatisticsMapper.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogStatisticsRecordMapper.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/worklog/LogStatisticsJob.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsRecordService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsRecordServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsServiceImpl.java delete mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/WorkLogStatisticsService.java delete mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/WorkLogStatisticsServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/LogStatisticsMapper.xml create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/LogStatisticsRecordMapper.xml diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/pojo/CommonResult.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/pojo/CommonResult.java index e29292dd..6ef916e7 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/pojo/CommonResult.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/pojo/CommonResult.java @@ -35,6 +35,11 @@ public class CommonResult implements Serializable { */ private String msg; + /** + * 时间戳 + */ + private long timestamp = System.currentTimeMillis(); + /** * 将传入的 result 对象,转换成另外一个泛型结果的对象 * @@ -65,6 +70,7 @@ public class CommonResult implements Serializable { result.code = GlobalErrorCodeConstants.SUCCESS.getCode(); result.data = data; result.msg = ""; + return result; } diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java index 23f9edaa..56fbba2f 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java @@ -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 betweenDayStrList(String beginTime, String endTime) { + List 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; + } + } diff --git a/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/main/java/cn/iocoder/yudao/framework/datapermission/core/rule/dept/DeptDataPermissionRule.java b/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/main/java/cn/iocoder/yudao/framework/datapermission/core/rule/dept/DeptDataPermissionRule.java index d40d7f5e..f33ae98c 100644 --- a/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/main/java/cn/iocoder/yudao/framework/datapermission/core/rule/dept/DeptDataPermissionRule.java +++ b/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/main/java/cn/iocoder/yudao/framework/datapermission/core/rule/dept/DeptDataPermissionRule.java @@ -58,7 +58,9 @@ public class DeptDataPermissionRule implements DataPermissionRule { // TODO: 2024/4/10 注意 - 如果需要降级低权的话 要把需要的表名称加在这里 并且在方法上开启数据权限 并且添加 DataPermissionConfiguration 对象 private static final List LOW_POWER_TABLES = Arrays.asList( - "bpm_process_instance_ext" + "bpm_process_instance_ext", + "work_log_use", + "work_log_statistics" ); /** diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogStatisticsController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogStatisticsController.java new file mode 100644 index 00000000..4200f0af --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogStatisticsController.java @@ -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> myManageModel() { + return success(logStatisticsService.myManageModel()); + } + + @GetMapping("/getStatistics") + @Operation(summary = "获取我管理的模版") + public CommonResult getStatistics(@ModelAttribute LogStatisticsDetailsListDTO dto) { + return success(logStatisticsService.getStatistics(dto)); + } + +// @GetMapping("/getNeedWrite") +// @Operation(summary = "获取需要填写的") +// public CommonResult> getNeedWrite() { +// List list = logStatisticsService.getNeedWrite(); +// return success(list); +// } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/WorkLogStatisticsController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/WorkLogStatisticsController.java deleted file mode 100644 index 8ccdf9ec..00000000 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/WorkLogStatisticsController.java +++ /dev/null @@ -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> myManageModel(@ModelAttribute WorkLogStatisticsModelDTO dto) { - return success(workLogStatisticsService.myManageModel(dto)); - } - -// @PutMapping("/update") -// @Operation(summary = "更新动态表单") -// @PreAuthorize("@ss.hasPermission('worklog:form:update')") -// public CommonResult updateForm(@Valid @RequestBody LogFormUpdateReqVO updateReqVO) { -// formService.updateForm(updateReqVO); -// return success(true); -// } - -} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/dto/statistics/LogStatisticsDetailsListDTO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/dto/statistics/LogStatisticsDetailsListDTO.java new file mode 100644 index 00000000..677b2259 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/dto/statistics/LogStatisticsDetailsListDTO.java @@ -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; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/form/LogFormRuleVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/form/LogFormRuleVO.java new file mode 100644 index 00000000..e1a84e11 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/form/LogFormRuleVO.java @@ -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; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsDetailsListVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsDetailsListVO.java new file mode 100644 index 00000000..83976b20 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsDetailsListVO.java @@ -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 onTime; + + @Schema(description = "迟交") + private List late; + + @Schema(description = "未提交") + private List unSubmitted; +} + diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsDetailsVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsDetailsVO.java new file mode 100644 index 00000000..6ee0bf26 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsDetailsVO.java @@ -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; +} + diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsModelVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsModelVO.java new file mode 100644 index 00000000..6249cef1 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsModelVO.java @@ -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; +} + diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsPageReqVO.java new file mode 100644 index 00000000..5fe48e74 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsPageReqVO.java @@ -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; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsRespVO.java new file mode 100644 index 00000000..e3971441 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsRespVO.java @@ -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; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsSaveReqVO.java new file mode 100644 index 00000000..9d95bebe --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsSaveReqVO.java @@ -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; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/WorkLogStatisticsModelVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/WorkLogStatisticsModelVO.java deleted file mode 100644 index 19ac81a0..00000000 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/WorkLogStatisticsModelVO.java +++ /dev/null @@ -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 { - - -} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statisticsrecord/LogStatisticsRecordPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statisticsrecord/LogStatisticsRecordPageReqVO.java new file mode 100644 index 00000000..dc583e80 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statisticsrecord/LogStatisticsRecordPageReqVO.java @@ -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; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statisticsrecord/LogStatisticsRecordRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statisticsrecord/LogStatisticsRecordRespVO.java new file mode 100644 index 00000000..7a4b864c --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statisticsrecord/LogStatisticsRecordRespVO.java @@ -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; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statisticsrecord/LogStatisticsRecordSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statisticsrecord/LogStatisticsRecordSaveReqVO.java new file mode 100644 index 00000000..ac56e169 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statisticsrecord/LogStatisticsRecordSaveReqVO.java @@ -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; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/vo/CommentPageListVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/vo/CommentPageListVO.java index 70812e1c..891b731d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/vo/CommentPageListVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/comment/vo/CommentPageListVO.java @@ -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; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogRuleDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogRuleDO.java index e9633a88..12a166c5 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogRuleDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogRuleDO.java @@ -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; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogStatisticsDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogStatisticsDO.java new file mode 100644 index 00000000..cf477fd6 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogStatisticsDO.java @@ -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; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogStatisticsRecordDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogStatisticsRecordDO.java new file mode 100644 index 00000000..7bdd78e5 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogStatisticsRecordDO.java @@ -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; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogFormMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogFormMapper.java index cb3a6db6..3ae5174c 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogFormMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogFormMapper.java @@ -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 { diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java index 487a8cdd..c28a7d7a 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java @@ -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 { } List selectRaedUser(Long deptId); + + /** + * 获取我管理的日志列表 + * + * @return + */ + List myManageLogInstanceByTimeRange(@Param("fromId") Long fromId, @Param("beginTime") Date beginTime, @Param("endTime") Date endTime); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogStatisticsMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogStatisticsMapper.java new file mode 100644 index 00000000..0d3ed227 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogStatisticsMapper.java @@ -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 { + + default PageResult selectPage(LogStatisticsPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .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 getUnSubmittedUser(@Param("formId") Long formId, @Param("thisTime") String thisTime); + + /** + * 获取统计 + * @param dateList + * @param formId + * @return + */ + List getStatistics(@Param("dateList") List dateList, @Param("formId") Long formId); + + /** + * 获取当天/本周的统计 + * + * @param formId + * @param dateList + * @return + */ + List getCurrentStatistics(@Param("formId") Long formId, @Param("dateList") List dateList); +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogStatisticsRecordMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogStatisticsRecordMapper.java new file mode 100644 index 00000000..a2d31573 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogStatisticsRecordMapper.java @@ -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 { + + default PageResult selectPage(LogStatisticsRecordPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .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)); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogUseMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogUseMapper.java index b1b33be3..0ed21e48 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogUseMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogUseMapper.java @@ -18,5 +18,5 @@ public interface LogUseMapper extends BaseMapperX { * * @return */ - List getFormIdsByDataPermission(); + List getFormIdsByDataPermission(Long userId); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/DataPermissionConfiguration.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/DataPermissionConfiguration.java index 296a087f..71931418 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/DataPermissionConfiguration.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/DataPermissionConfiguration.java @@ -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"); }; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/worklog/LogStatisticsJob.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/worklog/LogStatisticsJob.java new file mode 100644 index 00000000..f29e9e15 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/worklog/LogStatisticsJob.java @@ -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 execute() throws Exception { + //获取参数 + //XxlJobContext xxlJobContext = XxlJobContext.getXxlJobContext(); + //String jobParam = xxlJobContext.getJobParam(); + //获取模版列表 - 从缓存中拿 - 修改模版或者新增模版的时候 删除缓存 todo 这里后面改成从缓存获取数据 + List list = logFormService.getLogFormRuleList(); + if (list.isEmpty()) { + return ReturnT.SUCCESS; + } + // -- 要判断当前规则 是不是已经统计过了 + Date thisDate = new Date(); + String thisTime = DateUtils.dateFormat(thisDate, DateUtils.FORMAT_YEAR_MONTH_DAY); + //获取模版列表 + List formIds = list.stream().map(LogFormRuleVO::getFormDO).map(LogFormDO::getId).collect(Collectors.toList()); + List statisticsRecordDOS = logStatisticsRecordService.getByFormIdsAndTime(formIds, thisTime); + Map map = statisticsRecordDOS.stream().collect(Collectors.toMap(LogStatisticsRecordDO::getFormId, v -> v, (k1, k2) -> k1)); + // -- 需要插入到统计中为提交 日志的记录 + List statisticsDOS = new ArrayList<>(); + List 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 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 statisticsDOS, List saveRecordDO, Map map, LogFormDO logFormDO, String thisTime, + LogRuleDO logRuleDO) { + // -- 统计时间到了 - 判断是否已经统计过了 - 只需要统计谁没有提交就行 - 把没提交的记录插入到统计表中 - 其他的在新增日志里面就插入到统计表即可 + LogStatisticsRecordDO logStatisticsRecordDO = map.get(logFormDO.getId()); + if (logStatisticsRecordDO == null || logStatisticsRecordDO.getStatisticsFlag() == 0) { + List 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)); + } + } +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogFormService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogFormService.java index dfeaf24c..4a4e1cda 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogFormService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogFormService.java @@ -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 getFormPageByRule(LogFormPageReqVO pageReqVO); + + /** + * 获取考勤规则和模版列表 + * + * @return + */ + List getLogFormRuleList(); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogFormServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogFormServiceImpl.java index b31cdd37..1d7ad09b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogFormServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogFormServiceImpl.java @@ -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 getLogFormRuleList() { + //查询模版 + List formList = formMapper.selectList(new LambdaQueryWrapper() + .eq(LogFormDO::getStatus, 1) + .isNotNull(LogFormDO::getRuleId) + ); + List ruleIds = formList.stream().map(LogFormDO::getRuleId).collect(Collectors.toList()); + List logRuleDOS = new ArrayList<>(); + Map ruleMap = new HashMap<>(); + if (CollectionUtil.isNotEmpty(ruleIds)) { + logRuleDOS = logRuleService.getLogRuleByIds(ruleIds); + ruleMap = logRuleDOS.stream().collect(Collectors.toMap(LogRuleDO::getId, v -> v)); + } + List 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 重复 * diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java index 15da52df..900dcfa6 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java @@ -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 getMyProcessInstancePage(Long userId, LogInstancePageReqVO pageReqVO); + + /** + * 获取我管理的日志列表(时间区间) + * + * @return + */ + List myManageLogInstanceByTimeRange(Long formId, Integer type, Date thisDate); + + /** + * 获取我管理的日志列表(时间区间) + * + * @param fromId + * @param beginTime + * @param endTime + * @return + */ + List myManageLogInstanceByTimeRange(Long fromId, Date beginTime, Date endTime); + +// /** +// * 获取我需要填写的日志 +// * +// * @param fromId +// * @param userId +// * @return +// */ +// List getNeedWriteLogInstanceByTimeRange(Long fromId, List time, Long userId); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java index cb1b972b..ef24b928 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java @@ -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 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 myManageLogInstanceByTimeRange(Long fromId, Date beginTime, Date endTime) { + return logInstanceMapper.myManageLogInstanceByTimeRange(fromId, beginTime, endTime); + } + +// @Override +// public List getNeedWriteLogInstanceByTimeRange(Long fromId, List time, Long userId) { +// return logInstanceMapper.selectList(new LambdaQueryWrapper() +// .eq(LogInstanceDO::getFormId,fromId) +// .in(LogInstanceDO::get)) +// } } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleService.java index b10221c6..091d9d24 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleService.java @@ -60,4 +60,12 @@ public interface LogRuleService { * @return */ List getLogRuleByIds(List ruleIds); + + /** + * 通过模版id获取规则 + * + * @param formId + * @return + */ + LogRuleDO getLogRuleByFormId(Long formId); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java index e2937a79..af7024c6 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java @@ -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() + .eq(LogRuleDO::getFormId, formId)); + } + } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsRecordService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsRecordService.java new file mode 100644 index 00000000..34582ead --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsRecordService.java @@ -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 getLogStatisticsRecordPage(LogStatisticsRecordPageReqVO pageReqVO); + + /** + * 获取统计记录 + * + * @param formIds + * @param thisTime + * @return + */ + List getByFormIdsAndTime(List formIds, String thisTime); +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsRecordServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsRecordServiceImpl.java new file mode 100644 index 00000000..169cbc62 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsRecordServiceImpl.java @@ -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 getLogStatisticsRecordPage(LogStatisticsRecordPageReqVO pageReqVO) { + return logStatisticsRecordMapper.selectPage(pageReqVO); + } + + @Override + public List getByFormIdsAndTime(List formIds, String thisTime) { + return logStatisticsRecordMapper.selectList(new LambdaQueryWrapper() + .in(LogStatisticsRecordDO::getFormId, formIds) + .eq(LogStatisticsRecordDO::getTime, thisTime)); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsService.java new file mode 100644 index 00000000..e9f853e8 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsService.java @@ -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 getLogStatisticsPage(LogStatisticsPageReqVO pageReqVO); + + /** + * 我管理的工作日志统计模版 + * + * @return + */ + List myManageModel(); + + /** + * 获取未提交用户 + * + * @param formId + * @param thisTime + * @return + */ + List getUnSubmittedUser(Long formId, String thisTime); + + /** + * 获取统计信息 + * + * @param dto + * @return + */ + LogStatisticsDetailsListVO getStatistics(LogStatisticsDetailsListDTO dto); + +// /** +// * 获取我填写的 +// * +// * @return +// */ +// List getNeedWrite(); +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsServiceImpl.java new file mode 100644 index 00000000..bf4e51f1 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsServiceImpl.java @@ -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 getLogStatisticsPage(LogStatisticsPageReqVO pageReqVO) { + return logStatisticsMapper.selectPage(pageReqVO); + } + + @Override + public List myManageModel() { + List list = new ArrayList<>(); + //获取模版ids - 当前登录用户的数据权限 查看日志模板使用者表 + List formIds = logUseMapper.getFormIdsByDataPermission(null); + if (formIds.isEmpty()) { + return Collections.emptyList(); + } + + List formList = new ArrayList<>(); + Map 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 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() + .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 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 formIds, List formList, Map ruleMap) { + //查询模版 + formList = logFormMapper.selectList(new LambdaQueryWrapper() + .in(LogFormDO::getId, formIds) + .eq(LogFormDO::getStatus, 1) + .isNotNull(LogFormDO::getRuleId) + ); + List ruleIds = formList.stream().map(LogFormDO::getRuleId).collect(Collectors.toList()); + List logRuleDOS = new ArrayList<>(); + if (CollectionUtil.isNotEmpty(ruleIds)) { + logRuleDOS = logRuleService.getLogRuleByIds(ruleIds); + ruleMap = logRuleDOS.stream().collect(Collectors.toMap(LogRuleDO::getId, v -> v)); + } + } + + @Override + public List 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 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 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 onTime = logStatisticsDOS.stream().filter(a -> a.getStatus() == 1).collect(Collectors.toList()); + List late = logStatisticsDOS.stream().filter(a -> a.getStatus() == 2).collect(Collectors.toList()); + List 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 getNeedWrite() { +// List list = new ArrayList<>(); +// Long userId = WebFrameworkUtils.getLoginUserId(); +// //获取模版ids - 当前登录用户的数据权限 查看日志模板使用者表 +// List formIds = logUseMapper.getFormIdsByDataPermission(userId); +// if (formIds.isEmpty()) { +// return Collections.emptyList(); +// } +// //获取模版和规则 +// List formList = new ArrayList<>(); +// Map 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 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() +//// .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 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 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; +// } +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/WorkLogStatisticsService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/WorkLogStatisticsService.java deleted file mode 100644 index faa10108..00000000 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/WorkLogStatisticsService.java +++ /dev/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 myManageModel(WorkLogStatisticsModelDTO dto); -} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/WorkLogStatisticsServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/WorkLogStatisticsServiceImpl.java deleted file mode 100644 index 4389ab89..00000000 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/WorkLogStatisticsServiceImpl.java +++ /dev/null @@ -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 myManageModel(WorkLogStatisticsModelDTO dto) { - //获取模版ids - 当前登录用户的数据权限 查看日志模板使用者表 - // TODO: 2024/4/12 这里要测试下 数据权限问题 - List formIds = logUseMapper.getFormIdsByDataPermission(); - if (!formIds.isEmpty()) { - return Collections.emptyList(); - } - List formList = logFormMapper.selectList(new LambdaQueryWrapper() - .in(LogFormDO::getId, formIds) - .eq(LogFormDO::getStatus, 1) - .isNotNull(LogFormDO::getRuleId) - ); - List ruleIds = formList.stream().map(LogFormDO::getRuleId).collect(Collectors.toList()); - List logRuleDOS = new ArrayList<>(); - Map 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; - } -} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/comment/WorkLogCommentMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/comment/WorkLogCommentMapper.xml index 0ab17dbb..90c2a9d7 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/comment/WorkLogCommentMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/comment/WorkLogCommentMapper.xml @@ -26,6 +26,7 @@ b.name as workLogName, b.form_variables AS workLogContent, b.form_id as workFormId, + b.create_time as workLogTime, a.create_time AS createTime FROM work_log_comment AS a diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/LogInstanceMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/LogInstanceMapper.xml index e115a2c1..46fad838 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/LogInstanceMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/LogInstanceMapper.xml @@ -82,6 +82,26 @@ or ( result.dept_id = #{deptId} and result.data_scope = 3 ) or result.data_scope = 1 + diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/LogStatisticsMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/LogStatisticsMapper.xml new file mode 100644 index 00000000..8b9d64e3 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/LogStatisticsMapper.xml @@ -0,0 +1,83 @@ + + + + + + + + + + \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/LogStatisticsRecordMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/LogStatisticsRecordMapper.xml new file mode 100644 index 00000000..411bc072 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/LogStatisticsRecordMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/WorkLogUseMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/WorkLogUseMapper.xml index d5c35f5d..5cda9cd7 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/WorkLogUseMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/WorkLogUseMapper.xml @@ -14,5 +14,10 @@ select DISTINCT form_id from work_log_use + + + use_user_id = #{userId} + + \ No newline at end of file From c302178c686b171187d45eb4a0c327a17774657f Mon Sep 17 00:00:00 2001 From: aikai Date: Mon, 15 Apr 2024 10:37:56 +0800 Subject: [PATCH 25/50] =?UTF-8?q?=E6=88=91=E9=9C=80=E8=A6=81=E5=A1=AB?= =?UTF-8?q?=E5=86=99=E7=9A=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/common/util/date/DateUtils.java | 16 ++ .../worklog/LogStatisticsController.java | 12 +- .../dal/dataobject/worklog/LogInstanceDO.java | 8 +- .../mysql/worklog/LogStatisticsMapper.java | 15 +- .../service/worklog/LogInstanceService.java | 2 + .../worklog/LogInstanceServiceImpl.java | 13 +- .../service/worklog/LogStatisticsService.java | 12 +- .../worklog/LogStatisticsServiceImpl.java | 138 ++++++++---------- .../system/service/worklog/dto/LogUseVO.java | 14 ++ .../mapper/worklog/LogStatisticsMapper.xml | 25 +++- 10 files changed, 158 insertions(+), 97 deletions(-) create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/dto/LogUseVO.java diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java index 56fbba2f..e9f8e911 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java @@ -249,4 +249,20 @@ public class DateUtils { return list; } + /** + * 获取两个时间区间 - 获取两个时间区间的所有日期 + * + * @param beginTime + * @param endTime + * @return + */ + public static List betweenDayList(Date beginTime, Date endTime) { + List list = new ArrayList<>(); + int num = (int) DateUtil.betweenDay(beginTime, endTime, true); + for (int i = 0; i <= num; i++) { + Date time = DateUtil.offsetDay(beginTime, i).toJdkDate(); + list.add(DateUtil.format(time, "yyyy-MM-dd")); + } + return list; + } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogStatisticsController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogStatisticsController.java index 4200f0af..7944adf3 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogStatisticsController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogStatisticsController.java @@ -39,11 +39,11 @@ public class LogStatisticsController { return success(logStatisticsService.getStatistics(dto)); } -// @GetMapping("/getNeedWrite") -// @Operation(summary = "获取需要填写的") -// public CommonResult> getNeedWrite() { -// List list = logStatisticsService.getNeedWrite(); -// return success(list); -// } + @GetMapping("/getNeedWrite") + @Operation(summary = "获取需要填写的") + public CommonResult> getNeedWrite() { + List list = logStatisticsService.getNeedWrite(); + return success(list); + } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogInstanceDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogInstanceDO.java index 1eff5a48..5cbc6613 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogInstanceDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogInstanceDO.java @@ -13,7 +13,6 @@ import java.util.Map; /** * 日志的详情 - * */ @TableName(value = "work_log_instance_ext", autoResultMap = true) @Data @@ -64,6 +63,11 @@ public class LogInstanceDO extends BaseDO { */ private Long formId; + /** + * 时间格式 yyyy-MM-dd + */ + private String time; + /** * 日志模板值 */ @@ -74,5 +78,5 @@ public class LogInstanceDO extends BaseDO { * 附件基本信息 */ @TableField(typeHandler = JacksonTypeHandler.class) - private List fileItems ; + private List fileItems; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogStatisticsMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogStatisticsMapper.java index 0d3ed227..3e74c820 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogStatisticsMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogStatisticsMapper.java @@ -6,8 +6,8 @@ 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 cn.iocoder.yudao.module.system.service.worklog.dto.LogUseVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -46,11 +46,12 @@ public interface LogStatisticsMapper extends BaseMapperX { /** * 获取统计 + * * @param dateList * @param formId * @return */ - List getStatistics(@Param("dateList") List dateList, @Param("formId") Long formId); + List getStatistics(@Param("formId") Long formId, @Param("dateList") List dateList); /** * 获取当天/本周的统计 @@ -60,4 +61,14 @@ public interface LogStatisticsMapper extends BaseMapperX { * @return */ List getCurrentStatistics(@Param("formId") Long formId, @Param("dateList") List dateList); + + /** + * 获取我的当天/本周的统计 + * + * @param userId + * @param formId + * @param dateList + * @return + */ + List getMyCurrentStatistics(@Param("userId") Long userId, @Param("formId") Long formId, @Param("dateList") List dateList); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java index 900dcfa6..5a6da749 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java @@ -81,6 +81,8 @@ public interface LogInstanceService { */ List myManageLogInstanceByTimeRange(Long fromId, Date beginTime, Date endTime); + List getNeedWriteLogInstanceByTimeRange(Long fromId, List time, Long userId); + // /** // * 获取我需要填写的日志 // * diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java index ef24b928..40b2602d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java @@ -148,10 +148,11 @@ public class LogInstanceServiceImpl implements LogInstanceService { return logInstanceMapper.myManageLogInstanceByTimeRange(fromId, beginTime, endTime); } -// @Override -// public List getNeedWriteLogInstanceByTimeRange(Long fromId, List time, Long userId) { -// return logInstanceMapper.selectList(new LambdaQueryWrapper() -// .eq(LogInstanceDO::getFormId,fromId) -// .in(LogInstanceDO::get)) -// } + @Override + public List getNeedWriteLogInstanceByTimeRange(Long fromId, List time, Long userId) { + return logInstanceMapper.selectList(new LambdaQueryWrapper() + .eq(LogInstanceDO::getFormId, fromId) + .in(LogInstanceDO::getTime, time) + .eq(LogInstanceDO::getStartUserId, userId)); + } } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsService.java index e9f853e8..624e20a2 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsService.java @@ -75,10 +75,10 @@ public interface LogStatisticsService { */ LogStatisticsDetailsListVO getStatistics(LogStatisticsDetailsListDTO dto); -// /** -// * 获取我填写的 -// * -// * @return -// */ -// List getNeedWrite(); + /** + * 获取我填写的 + * + * @return + */ + List getNeedWrite(); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsServiceImpl.java index bf4e51f1..2cb08633 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsServiceImpl.java @@ -15,6 +15,7 @@ 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 cn.iocoder.yudao.module.system.service.worklog.dto.LogUseVO; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -196,7 +197,7 @@ public class LogStatisticsServiceImpl implements LogStatisticsService { if (flag) { logStatisticsDOS = logStatisticsMapper.getCurrentStatistics(dto.getFormId(), dateList); } else { - logStatisticsDOS = logStatisticsMapper.getStatistics(dateList, dto.getFormId()); + logStatisticsDOS = logStatisticsMapper.getStatistics(dto.getFormId(), dateList); } List onTime = logStatisticsDOS.stream().filter(a -> a.getStatus() == 1).collect(Collectors.toList()); List late = logStatisticsDOS.stream().filter(a -> a.getStatus() == 2).collect(Collectors.toList()); @@ -207,77 +208,66 @@ public class LogStatisticsServiceImpl implements LogStatisticsService { return vo; } -// @Override -// public List getNeedWrite() { -// List list = new ArrayList<>(); -// Long userId = WebFrameworkUtils.getLoginUserId(); -// //获取模版ids - 当前登录用户的数据权限 查看日志模板使用者表 -// List formIds = logUseMapper.getFormIdsByDataPermission(userId); -// if (formIds.isEmpty()) { -// return Collections.emptyList(); -// } -// //获取模版和规则 -// List formList = new ArrayList<>(); -// Map 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 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() -//// .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 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 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; -// } + @Override + public List getNeedWrite() { + List list = new ArrayList<>(); + Long userId = WebFrameworkUtils.getLoginUserId(); + //获取模版ids - 当前登录用户的数据权限 查看日志模板使用者表 + List formIds = logUseMapper.getFormIdsByDataPermission(userId); + if (formIds.isEmpty()) { + return Collections.emptyList(); + } + //获取模版和规则 + List formList = new ArrayList<>(); + Map ruleMap = new HashMap<>(); + this.getFormAndRule(formIds, formList, ruleMap); + + Date thisDate = new Date(); + Date beginDate = null; + Date endDate = null; + for (LogFormDO logFormDO : formList) { + //拿到模版规则 + LogRuleDO logRuleDO = ruleMap.get(logFormDO.getRuleId()); + LogStatisticsModelVO vo = new LogStatisticsModelVO(); + BeanUtil.copyProperties(logFormDO, vo); + //判断当天/本周是否需要提交 + boolean flag = true; + if (logRuleDO.getType() == 1 && StrUtil.isNotEmpty(logRuleDO.getWeekDays())) { + // -- 判断今天是周几 和 需要提交的周做对比 + int weekNum = ((DateUtil.dayOfWeekEnum(thisDate).getValue() - 1) == 0 ? 7 : (DateUtil.dayOfWeekEnum(thisDate).getValue() - 1)); + List weekDays = Arrays.asList(logRuleDO.getWeekDays().split(",")); + if (weekDays.contains(Integer.toString(weekNum))) { + vo.setCommitTimeRange("当天" + logRuleDO.getEndTime() + "截止提交"); + beginDate = DateUtil.beginOfDay(thisDate); + endDate = DateUtil.endOfDay(thisDate); + } else { + flag = false; + vo.setCommitTimeRange("当天不需要提交"); + } + } else if (logRuleDO.getType() == 2) { + beginDate = DateUtil.beginOfWeek(thisDate); + endDate = DateUtil.endOfWeek(thisDate); + // -- 拼接获取到结束时间 + Date endTime = DateUtils.buildWeekHHmmTime(logRuleDO.getEndTime()); + vo.setCommitTimeRange("每周" + DateUtil.dayOfWeekEnum(endTime).toChinese() + (logRuleDO.getEndTime().split(",")[1]) + "截止提交"); + } + // -- 需要提交的话查看下是否需要提交 + if (flag) { + List dateList = DateUtils.betweenDayList(beginDate, endDate); + List logUseVOS = logStatisticsMapper.getMyCurrentStatistics(userId, logFormDO.getId(), dateList); + //按时提交数量 + Integer onTimeNum = Math.toIntExact(logUseVOS.stream().filter(a -> a.getStatus() == 1).count()); + //迟交数量 + Integer lateNum = Math.toIntExact(logUseVOS.stream().filter(a -> a.getStatus() == 2).count()); + //未提交数量 + Integer unSubmittedNum = Math.toIntExact(logUseVOS.stream().filter(a -> a.getStatus() == 3).count()); + //按天统计 + vo.setOnTimeNum(onTimeNum); + vo.setUnSubmittedNum(unSubmittedNum); + vo.setLateNum(lateNum); + } + list.add(vo); + } + return list; + } } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/dto/LogUseVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/dto/LogUseVO.java new file mode 100644 index 00000000..28b472c8 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/dto/LogUseVO.java @@ -0,0 +1,14 @@ +package cn.iocoder.yudao.module.system.service.worklog.dto; + +import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogUseDO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 日志模板使用者新增/修改 Request DTO + */ +@Data +public class LogUseVO extends LogUseDO { + @Schema(description = "提交状态 1按时提交 2迟交 3未提交") + private Integer status; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/LogStatisticsMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/LogStatisticsMapper.xml index 8b9d64e3..4a8d850b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/LogStatisticsMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/LogStatisticsMapper.xml @@ -71,7 +71,7 @@ WHERE form_id = #{formId} - AND b.time IN + AND `time` IN #{date} @@ -80,4 +80,27 @@ b.deleted = 0 + \ No newline at end of file From 9096be7cf38bfb282b340395655b3e085d7c7300 Mon Sep 17 00:00:00 2001 From: furongxin <419481438@qq.com> Date: Mon, 15 Apr 2024 10:38:47 +0800 Subject: [PATCH 26/50] =?UTF-8?q?=E6=97=A5=E5=BF=97=EF=BC=9A=20=E6=88=91?= =?UTF-8?q?=E6=94=B6=E7=9A=84=E5=88=B0=E9=A1=B5=E9=9D=A2=E5=88=86=E9=A1=B5?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=EF=BC=8C=20=E8=A7=84=E5=88=99=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E3=80=81=E6=9B=B4=E6=96=B0=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/worklog/LogFormController.java | 21 +- .../admin/worklog/LogInstanceController.java | 77 +++++++- .../admin/worklog/vo/form/LogFormRespVO.java | 3 + .../vo/loginstance/LogInstancePageReqVO.java | 8 +- .../vo/loginstance/LogInstanceRespVO.java | 18 +- .../vo/loginstance/LogInstanceSaveReqVO.java | 2 + .../convert/worklog/LogInstanceConvert.java | 15 +- .../dal/mysql/worklog/LogFormMapper.java | 11 +- .../dal/mysql/worklog/LogInstanceMapper.java | 11 +- .../dal/mysql/worklog/LogReadMapper.java | 18 ++ .../dal/mysql/worklog/LogUseMapper.java | 8 + .../service/user/AdminUserServiceImpl.java | 4 + .../service/worklog/LogFormServiceImpl.java | 12 +- .../service/worklog/LogInstanceService.java | 8 +- .../worklog/LogInstanceServiceImpl.java | 182 ++++++++++++------ .../service/worklog/LogReadService.java | 15 ++ .../service/worklog/LogReadServiceImpl.java | 24 +++ .../service/worklog/LogRuleService.java | 8 + .../service/worklog/LogRuleServiceImpl.java | 5 + .../system/service/worklog/LogUseService.java | 15 ++ .../service/worklog/LogUseServiceImpl.java | 13 ++ .../mapper/user/LogInstanceMapper.xml | 9 +- 22 files changed, 393 insertions(+), 94 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogFormController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogFormController.java index eba19673..589fc6a0 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogFormController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogFormController.java @@ -5,7 +5,9 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.form.*; 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.service.worklog.LogFormService; +import cn.iocoder.yudao.module.system.service.worklog.LogRuleService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -28,6 +30,9 @@ public class LogFormController { @Resource private LogFormService formService; + @Resource + private LogRuleService logRuleService; + @PostMapping("/create") @Operation(summary = "创建动态模板") @PreAuthorize("@ss.hasPermission('worklog:form:create')") @@ -57,8 +62,20 @@ public class LogFormController { @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('worklog:form:query')") public CommonResult getForm(@RequestParam("id") Long id) { + LogFormDO form = formService.getForm(id); - return success(LogFormConvert.INSTANCE.convert(form)); + LogFormRespVO logFormRespVO = LogFormConvert.INSTANCE.convert(form); + + if (form != null) { + + //获取规则信息 + LogRuleDO logRuleDO = logRuleService.getLogRule(form.getRuleId()); + + //设置日志类型 + logFormRespVO.setType(logRuleDO.getType()); + } + + return success(logFormRespVO); } @GetMapping("/list-all-simple") @@ -77,7 +94,7 @@ public class LogFormController { } @GetMapping("/page-by-rule") - @Operation(summary = "获得配置规则后的模板分页") + @Operation(summary = "获得我可以使用的模板分页") @PreAuthorize("@ss.hasPermission('worklog:form:query')") public CommonResult> getFormPageByRule(@Valid LogFormPageReqVO pageVO) { diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java index 60a69e5e..1598a41a 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java @@ -6,11 +6,14 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptRespVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserRespVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstancePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstanceRespVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstanceSaveReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogInstanceDO; +import cn.iocoder.yudao.module.system.convert.worklog.LogInstanceConvert; +import cn.iocoder.yudao.module.system.service.user.AdminUserService; import cn.iocoder.yudao.module.system.service.worklog.LogInstanceService; +import cn.iocoder.yudao.module.system.service.worklog.LogReadService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -23,10 +26,14 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @Tag(name = "管理后台 - 日志实例") @RestController @@ -37,6 +44,12 @@ public class LogInstanceController { @Resource private LogInstanceService logInstanceService; + @Resource + private LogReadService logReadService; + + @Resource + private AdminUserService userService; + @PostMapping("/create") @Operation(summary = "创建日志实例") @PreAuthorize("@ss.hasPermission('system:log-instance:create')") @@ -63,11 +76,15 @@ public class LogInstanceController { @GetMapping("/get") @Operation(summary = "获得日志实例") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('system:log-instance:query')") + @Parameter(name = "id", description = "编号", required = true, example = "1") + @PreAuthorize("@ss.hasPermission('system:view-log:query')") public CommonResult getLogInstance(@RequestParam("id") Long id) { - LogInstanceDO logInstance = logInstanceService.getLogInstance(id); - return success(BeanUtils.toBean(logInstance, LogInstanceRespVO.class)); + + //查看日志详情时,变更当前用户日志的阅读状态 + logReadService.updateReadStatus(id, getLoginUserId()); + + LogInstanceRespVO logInstance = logInstanceService.getLogInstance(id); + return success(logInstance); } @GetMapping("/page") @@ -75,7 +92,16 @@ public class LogInstanceController { @PreAuthorize("@ss.hasPermission('system:view-log:query')") public CommonResult> getLogInstancePage(@ModelAttribute LogInstancePageReqVO pageReqVO) { - IPage pageResult = logInstanceService.getLogInstancePage(pageReqVO); + IPage pageResult = logInstanceService.getLogInstancePage(pageReqVO, 0); + return success(pageResult); + } + + @GetMapping("/my-page") + @Operation(summary = "获得我的日志分页列表") + @PreAuthorize("@ss.hasPermission('system:view-log:query')") + public CommonResult> getMyLogInstancePage(@ModelAttribute LogInstancePageReqVO pageReqVO) { + + IPage pageResult = logInstanceService.getLogInstancePage(pageReqVO, 1); return success(pageResult); } @@ -90,11 +116,42 @@ public class LogInstanceController { @GetMapping("/get-upLog") @Operation(summary = "获取上一篇日志,用于导入上一篇日志") - @Parameter(name = "type", description = "日志类型", required = true, example = "1") + @Parameter(name = "formId", description = "日志模板编号", required = true, example = "1") @PreAuthorize("@ss.hasPermission('system:view-log:query')") - public CommonResult getUpLog(@RequestParam("type") Integer type) { + public CommonResult getUpLog(@RequestParam("formId") Long formId) { - return success(BeanUtils.toBean(logInstanceService.getUpLog(type), LogInstanceRespVO.class)); + LogInstanceRespVO logInstanceRespVO = LogInstanceConvert.INSTANCE.convert(logInstanceService.getUpLog(formId, null)); + logInstanceRespVO = logInstanceService.setContentFun(logInstanceRespVO); + + return success(logInstanceRespVO); + } + + @PostMapping("/getByLogId") + @Operation(summary = "获得可查看日志的用户详情") + @Parameter(name = "logId", description = "日志编号", required = true, example = "10") + @PreAuthorize("@ss.hasPermission('system:view-log:query')") + public CommonResult>> getUserByLogId(@RequestParam("logId") Long logId) { + + List> readUserVO = new ArrayList<>(); + + Map> usrMap = logReadService.getUserId(logId); + + List unReadUserInfo = BeanUtils.toBean(userService.getUserList(usrMap.get(0)), UserRespVO.class); + List readUserInfo = BeanUtils.toBean(userService.getUserList(usrMap.get(1)), UserRespVO.class); + + Map unReadMap = new HashMap<>(); + Map readMap = new HashMap<>(); + + unReadMap.put("readStatus", 0); + unReadMap.put("value", unReadUserInfo); + + readMap.put("readStatus", 1); + readMap.put("value", readUserInfo); + + readUserVO.add(unReadMap); + readUserVO.add(readMap); + + return success(readUserVO); } @GetMapping("/export-excel") @@ -104,7 +161,7 @@ public class LogInstanceController { public void exportLogInstanceExcel(@Valid LogInstancePageReqVO pageReqVO, HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List list = logInstanceService.getLogInstancePage(pageReqVO).getRecords(); + List list = logInstanceService.getLogInstancePage(pageReqVO,null).getRecords(); // 导出 Excel ExcelUtils.write(response, "日志实例的拓展.xls", "数据", LogInstanceRespVO.class, BeanUtils.toBean(list, LogInstanceRespVO.class)); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/form/LogFormRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/form/LogFormRespVO.java index 9c2128ff..ba00ee6a 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/form/LogFormRespVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/form/LogFormRespVO.java @@ -17,6 +17,9 @@ public class LogFormRespVO extends LogFormBaseVO { @Schema(description = "表单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") private Long id; + @Schema(description = "日志类型", example = "1") + private Integer type; + @Schema(description = "表单的配置-JSON 字符串", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "表单的配置不能为空") private String conf; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstancePageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstancePageReqVO.java index 1ba9beed..92e013e2 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstancePageReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstancePageReqVO.java @@ -1,7 +1,6 @@ package cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance; import cn.iocoder.yudao.framework.common.pojo.PageParam; -import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @@ -9,7 +8,6 @@ import lombok.ToString; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; -import java.util.Map; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @@ -41,16 +39,12 @@ public class LogInstancePageReqVO extends PageParam { private Long formId; @Schema(description = "模板值") - private Map formVariables; + private String formVariables; @Schema(description = "创建时间") - @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] createTime; @Schema(description = "未读", example = "0") private Integer unRead; - - @Schema(description = "分页类型 0是我收到,1是我的", example = "0") - private Integer pagingType; } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceRespVO.java index f47873b1..56ed8882 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceRespVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceRespVO.java @@ -1,8 +1,15 @@ package cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.List; +import java.util.Map; @Schema(description = "管理后台 - 日志实例的拓展 Response VO") @Data @@ -10,6 +17,7 @@ import lombok.Data; public class LogInstanceRespVO { @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20649") + @JsonSerialize(using = ToStringSerializer.class) private Long id; @Schema(description = "日志发起人的用户编号", example = "146") @@ -36,13 +44,21 @@ public class LogInstanceRespVO { @Schema(description = "模板值") private String formVariables; - @Schema(description = "工作日志内容(部分)") + @Schema(description = "工作日志内容(部分) | 分页列表使用") private String workLogContent; + @Schema(description = "工作日志内容详情") + private List> logDetail; + @Schema(description = "附件信息") private String fileItems ; + @Schema(description = "日志日期") + private String time; + @Schema(description = "创建时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private String createTime; @Schema(description = "阅读状态, 0:未读、1:已读", example = "0") diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceSaveReqVO.java index 399d17cc..c99e400c 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogInstanceSaveReqVO.java @@ -35,4 +35,6 @@ public class LogInstanceSaveReqVO { @Schema(description = "附件信息") private List fileItems ; + @Schema(description = "日志详情,日期的值 | yyyy-MM-dd", example = "2024-04-14") + private String time; } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/worklog/LogInstanceConvert.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/worklog/LogInstanceConvert.java index 3dae2faf..46fbd741 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/worklog/LogInstanceConvert.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/worklog/LogInstanceConvert.java @@ -1,12 +1,15 @@ package cn.iocoder.yudao.module.system.convert.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.loginstance.LogInstanceRespVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstanceSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogInstanceDO; +import com.alibaba.fastjson.JSONObject; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; +import java.time.format.DateTimeFormatter; + /** * 日志详情 Convert * @@ -19,8 +22,14 @@ public interface LogInstanceConvert { LogInstanceDO convert(LogInstanceSaveReqVO bean); + default LogInstanceRespVO convert(LogInstanceDO logInstanceDO) { - LogInstanceRespVO convert(LogInstanceDO bean); + LogInstanceRespVO logInstanceRespVO = BeanUtils.toBean(logInstanceDO, LogInstanceRespVO.class); - PageResult convertPage(PageResult page); + logInstanceRespVO.setFormVariables(JSONObject.toJSONString(logInstanceDO.getFormVariables())); + logInstanceRespVO.setFileItems(JSONObject.toJSONString(logInstanceDO.getFileItems())); + logInstanceRespVO.setCreateTime(logInstanceDO.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + + return logInstanceRespVO; + } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogFormMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogFormMapper.java index cb3a6db6..a4d20dbc 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogFormMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogFormMapper.java @@ -2,9 +2,9 @@ package cn.iocoder.yudao.module.system.dal.mysql.worklog; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.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; @@ -19,10 +19,9 @@ public interface LogFormMapper extends BaseMapperX { .orderByDesc("id")); } - default PageResult selectPageByRule(LogFormPageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() - .likeIfPresent("name", reqVO.getName()) - .isNotNull("rule_id") - .orderByDesc("id")); + default PageResult selectPageByRule(LogFormPageReqVO reqVO, List formIds) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .in(LogFormDO::getId, formIds) + .orderByDesc(LogFormDO::getId)); } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java index e157d7ab..bce3f1ec 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java @@ -22,15 +22,20 @@ import java.util.List; public interface LogInstanceMapper extends BaseMapperX { - default List getUpLog(Long userId, Integer type){ + default List getUpLog(Long userId, Long formId, Integer type){ return selectList(new LambdaQueryWrapperX() .eq(LogInstanceDO::getStartUserId, userId) - .eq(LogInstanceDO::getType, type) + .eqIfPresent(LogInstanceDO::getFormId, formId) + .eqIfPresent(LogInstanceDO::getType, type) .orderByDesc(LogInstanceDO::getCreateTime)); } - IPage selectPageResult(@Param("page")Page page, @Param("reqVO")LogInstancePageReqVO reqVO, @Param("userId")Long userId); + IPage selectPageResult(@Param("page")Page page, @Param("reqVO")LogInstancePageReqVO reqVO, + @Param("userId")Long userId, @Param("pagingType") Integer pagingType, @Param("logId")Long logId); + + LogInstanceRespVO selectPageResult(@Param("reqVO")LogInstancePageReqVO reqVO, @Param("userId")Long userId, + @Param("pagingType") Integer pagingType, @Param("logId")Long logId); List selectRaedUser(Long deptId); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogReadMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogReadMapper.java index 7526f696..9a5bea14 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogReadMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogReadMapper.java @@ -1,9 +1,12 @@ package cn.iocoder.yudao.module.system.dal.mysql.worklog; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogReadDo; import org.apache.ibatis.annotations.Mapper; +import java.util.List; + /** * 日志查看 Mapper * @@ -11,4 +14,19 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface LogReadMapper extends BaseMapperX { + + default List selectUserByLogId(Long logId, Integer readStatus) { + + return selectList(new LambdaQueryWrapperX() + .eq(LogReadDo::getLogInstanceId, logId) + .eq(LogReadDo::getReadStatus, readStatus)); + } + + default void updateReadStatus(Long logId, Long userId){ + + update(new LogReadDo().setReadStatus(1), + new LambdaQueryWrapperX() + .eq(LogReadDo::getLogInstanceId, logId) + .eq(LogReadDo::getReadUserId, userId)); + } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogUseMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogUseMapper.java index 41942f31..41734fec 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogUseMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogUseMapper.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.system.dal.mysql.worklog; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogUseDO; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.apache.ibatis.annotations.Mapper; @@ -29,5 +30,12 @@ public interface LogUseMapper extends BaseMapperX { .in(LogUseDO::getUseUserId, userIds)); } + default Long getCountByUser(Long formId, Long userId){ + + return selectCount(new LambdaQueryWrapperX() + .eq(LogUseDO::getUseUserId, userId) + .eq(LogUseDO::getFormId, formId)); + } + List getDeptByFormId(Long formId); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java index 7425ef2a..fdad8b0c 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java @@ -25,6 +25,7 @@ import cn.iocoder.yudao.module.system.service.dept.DeptService; import cn.iocoder.yudao.module.system.service.dept.PostService; import cn.iocoder.yudao.module.system.service.permission.PermissionService; import cn.iocoder.yudao.module.system.service.tenant.TenantService; +import cn.iocoder.yudao.module.system.service.worklog.LogInstanceService; import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -74,6 +75,9 @@ public class AdminUserServiceImpl implements AdminUserService { @Resource private UserPostMapper userPostMapper; + @Resource + private LogInstanceService logInstanceService; + @Resource private FileApi fileApi; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogFormServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogFormServiceImpl.java index b31cdd37..2a5abfeb 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogFormServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogFormServiceImpl.java @@ -18,6 +18,7 @@ import javax.annotation.Resource; import java.util.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; /** * 动态表单 Service 实现类 @@ -31,6 +32,9 @@ public class LogFormServiceImpl implements LogFormService{ @Resource private LogFormMapper formMapper; + @Resource + private LogUseService logUseService; + @Override public Long createForm(LogFormCreateReqVO createReqVO) { this.checkFields(createReqVO.getFields()); @@ -87,7 +91,13 @@ public class LogFormServiceImpl implements LogFormService{ @Override public PageResult getFormPageByRule(LogFormPageReqVO pageReqVO) { - return formMapper.selectPageByRule(pageReqVO); + + List formIds = logUseService.getFormIdByUserId(getLoginUserId()); + if (formIds.isEmpty()) { + + return null; + } + return formMapper.selectPageByRule(pageReqVO, formIds); } /** diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java index 9655027e..c20a06c4 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java @@ -45,7 +45,7 @@ public interface LogInstanceService { * @param id 编号 * @return 日志实例的拓展 */ - LogInstanceDO getLogInstance(Long id); + LogInstanceRespVO getLogInstance(Long id); /** * 获得日志实例分页 @@ -53,7 +53,7 @@ public interface LogInstanceService { * @param pageReqVO 分页查询 * @return 日志实例的拓展分页 */ - IPage getLogInstancePage(LogInstancePageReqVO pageReqVO); + IPage getLogInstancePage(LogInstancePageReqVO pageReqVO, Integer pagingType); /** * 获得我收到的日志页面中的部门列表 @@ -63,5 +63,7 @@ public interface LogInstanceService { /** * 获取上一篇日志 */ - LogInstanceDO getUpLog(Integer type); + LogInstanceDO getUpLog(Long formId, Integer type); + + LogInstanceRespVO setContentFun(LogInstanceRespVO logInstanceRespVO); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java index a5b95ac1..62095a3b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java @@ -1,6 +1,5 @@ package cn.iocoder.yudao.module.system.service.worklog; -import cn.hutool.core.date.DateUtil; import cn.hutool.json.JSONObject; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptRespVO; @@ -25,18 +24,15 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.time.temporal.WeekFields; -import java.util.Date; -import java.util.List; -import java.util.Locale; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.LOG_INSTANCE_NOT_EXISTS; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.LOG_RULE_NOT_FIND; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; /** * 日志实例的拓展 Service 实现类 @@ -54,11 +50,14 @@ public class LogInstanceServiceImpl implements LogInstanceService { private DeptService deptService; @Resource - private LogRuleService logRuleService; + private LogUseService logUseService; @Resource private LogFormService logFormService; + @Resource + private LogRuleService logRuleService; + @Resource private AdminUserService adminUserService; @@ -75,13 +74,16 @@ public class LogInstanceServiceImpl implements LogInstanceService { //获取日志类型 LogFormDO logFormDo = logFormService.getForm(createReqVO.getFormId()); - LogRuleDO logRuleDO = logRuleService.getLogRule(logFormDo.getRuleId()); - if (logRuleDO == null) { - throw exception(LOG_RULE_NOT_FIND); + + Long count = logUseService.getCountByUser(logFormDo.getId(), getLoginUserId()); + if (count == 0L) { + throw exception(LOG_FORM_NOT_USE); } //获取部门信息 AdminUserDO adminUserDO = adminUserService.getUser(getLoginUserId()); + //获取规则信息 + LogRuleDO logRuleDO = logRuleService.getLogRule(logFormDo.getRuleId()); //设置发起人用户编号 logInstance.setStartUserId(getLoginUserId()); @@ -95,8 +97,8 @@ public class LogInstanceServiceImpl implements LogInstanceService { logInstance.setType(logRuleDO.getType()); //设置日志名称 logInstance.setName(adminUserDO.getNickname() + "的" + logFormDo.getName()); - //设置时间 - logInstance.setTime(DateUtil.format(new Date(),"yyyy-MM-dd")); + //设置日志日期 + logInstance.setTime(createReqVO.getTime()); // 插入 logInstanceMapper.insert(logInstance); @@ -112,51 +114,55 @@ public class LogInstanceServiceImpl implements LogInstanceService { return logInstance.getId(); } + /** + * 校验当前日志类型的日志 是否已提交过 + */ private void validateLogInstanceByType(LogInstanceSaveReqVO createReqVO) { - LogInstanceDO logInstanceDO = getUpLog(createReqVO.getType()); - if (logInstanceDO != null) { + LogInstanceDO logInstanceDO = getUpLog(null, createReqVO.getType()); + if (logInstanceDO == null) { + return; + } - LocalDate oldTime = logInstanceDO.getCreateTime().toLocalDate(); - LocalDate nowTime = LocalDate.now(); + LocalDate oldTime = LocalDate.parse(logInstanceDO.getTime()); + LocalDate nowTime = LocalDate.now(); - //根据日志类型判断 - switch (createReqVO.getType()){ + //根据日志类型判断 + switch (createReqVO.getType()){ - //日志类型为日报 - case 1: - if (oldTime.equals(nowTime)) { + //日志类型为日报 + case 1: + if (oldTime.equals(nowTime)) { - throw exception(ErrorCodeConstants.LOG_TYPE_EXISTS, createReqVO.getType()); - } + throw exception(ErrorCodeConstants.LOG_TYPE_EXISTS, "日报"); + } //日志类型为周报 - case 2: - WeekFields weekFields = WeekFields.of(Locale.getDefault()); + case 2: + WeekFields weekFields = WeekFields.of(Locale.getDefault()); - // 获取两个日期所属的周数和年份 - int oldWeek = oldTime.get(weekFields.weekOfWeekBasedYear()); - int oldYear = oldTime.get(weekFields.weekBasedYear()); + // 获取两个日期所属的周数和年份 + int oldWeek = oldTime.get(weekFields.weekOfWeekBasedYear()); + int oldYear = oldTime.get(weekFields.weekBasedYear()); - int nowWeek = nowTime.get(weekFields.weekOfWeekBasedYear()); - int nowYear = nowTime.get(weekFields.weekBasedYear()); + int nowWeek = nowTime.get(weekFields.weekOfWeekBasedYear()); + int nowYear = nowTime.get(weekFields.weekBasedYear()); - if (oldWeek == nowWeek && oldYear == nowYear) { + if (oldWeek == nowWeek && oldYear == nowYear) { - throw exception(ErrorCodeConstants.LOG_TYPE_EXISTS, createReqVO.getType()); - } + throw exception(ErrorCodeConstants.LOG_TYPE_EXISTS, "周报"); + } //日志类型为月报 - case 3: - if (oldTime.getYear() == nowTime.getYear() && oldTime.getMonth() == nowTime.getMonth()) { + case 3: + if (oldTime.getYear() == nowTime.getYear() && oldTime.getMonth() == nowTime.getMonth()) { - throw exception(ErrorCodeConstants.LOG_TYPE_EXISTS, createReqVO.getType()); - } + throw exception(ErrorCodeConstants.LOG_TYPE_EXISTS, "月报"); + } //日志类型为年报 - case 4: - if (oldTime.getYear() == nowTime.getYear()) { + case 4: + if (oldTime.getYear() == nowTime.getYear()) { - throw exception(ErrorCodeConstants.LOG_TYPE_EXISTS, createReqVO.getType()); - } - } + throw exception(ErrorCodeConstants.LOG_TYPE_EXISTS, "年报"); + } } } @@ -164,6 +170,25 @@ public class LogInstanceServiceImpl implements LogInstanceService { public void updateLogInstance(LogInstanceSaveReqVO updateReqVO) { // 校验存在 validateLogInstanceExists(updateReqVO.getId()); + + //校验要修改的日志是否是当天发送的 + LogInstanceDO logInstanceDO = logInstanceMapper.selectById(updateReqVO.getId()); + if (!logInstanceDO.getCreateTime().toLocalDate().equals(LocalDate.now())) { + + throw exception(LOG_NOT_DATE); + } + + LogRuleDO logRuleDO = logRuleService.getLogRuleByFormId(updateReqVO.getFormId()); + String endTime = logRuleDO.getEndTime(); + if (logRuleDO.getType() != 1) { + + endTime = endTime.split(",")[1]; + } + + if (LocalTime.now().isBefore(LocalTime.parse(endTime))) { + throw exception(LOG_NOT_UPDATE); + } + // 更新 LogInstanceDO updateObj = BeanUtils.toBean(updateReqVO, LogInstanceDO.class); logInstanceMapper.updateById(updateObj); @@ -184,15 +209,20 @@ public class LogInstanceServiceImpl implements LogInstanceService { } @Override - public LogInstanceDO getLogInstance(Long id) { - return logInstanceMapper.selectById(id); + public LogInstanceRespVO getLogInstance(Long id) { + + //获取日志详情 + LogInstanceRespVO logInstanceRespVO = logInstanceMapper.selectPageResult(new LogInstancePageReqVO(), getLoginUserId(), null, id); + + //设置日志详情 模板内容和时间 + return setContentFun(logInstanceRespVO); } @Override - public IPage getLogInstancePage(LogInstancePageReqVO pageReqVO) { + public IPage getLogInstancePage(LogInstancePageReqVO pageReqVO, Integer pagingType) { Page page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()); - IPage pageList = logInstanceMapper.selectPageResult(page, pageReqVO, getLoginUserId()); + IPage pageList = logInstanceMapper.selectPageResult(page, pageReqVO, getLoginUserId(), pagingType, null); List records = pageList.getRecords(); if (!records.isEmpty()) { @@ -228,11 +258,11 @@ public class LogInstanceServiceImpl implements LogInstanceService { LocalDateTime createTime = LocalDateTime.parse(item.getCreateTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); //日志创建时间是当前日期时 if (createTime.toLocalDate().equals(nowDate)) { - item.setCreateTime("今日 " + createTime.getHour() + ":" + createTime.getMinute()); + item.setCreateTime("今日 " + createTime.toLocalTime().format(DateTimeFormatter.ofPattern("HH:mm"))); } //日志创建时间是当前日期前一天时 if (createTime.toLocalDate().equals(nowDate.minusDays(1))) { - item.setCreateTime("昨日 " + createTime.getHour() + ":" + createTime.getMinute()); + item.setCreateTime("昨日 " + createTime.toLocalTime().format(DateTimeFormatter.ofPattern("HH:mm"))); } }); } @@ -253,14 +283,56 @@ public class LogInstanceServiceImpl implements LogInstanceService { } @Override - public LogInstanceDO getUpLog(Integer type) { + public LogInstanceDO getUpLog(Long formId, Integer type) { - LogInstanceDO logInstanceDO = new LogInstanceDO(); - - List logInstanceDOS = logInstanceMapper.getUpLog(getLoginUserId(), type); + List logInstanceDOS = logInstanceMapper.getUpLog(getLoginUserId(), formId, type); if (!logInstanceDOS.isEmpty()) { - logInstanceDO = logInstanceDOS.get(0); + + return logInstanceDOS.get(0); } - return logInstanceDO; + + return null; + } + + @Override + public LogInstanceRespVO setContentFun(LogInstanceRespVO logInstanceRespVO) { + + if (logInstanceRespVO.getFormId() == null) { + return logInstanceRespVO; + } + //获取模板信息 + LogFormDO logFormDO = logFormService.getForm(logInstanceRespVO.getFormId()); + List fields = logFormDO.getFields(); + List> logDetail = new ArrayList<>(); + + if (!logInstanceRespVO.getFormVariables().isEmpty()) { + JSONObject workLogContentJson = new JSONObject(logInstanceRespVO.getFormVariables()); + for (String fieldItem : fields) { + Map detail = new HashMap<>(); + + JSONObject fieldJson = new JSONObject(fieldItem); + String fieldStr = fieldJson.getStr("field"); + String title = fieldJson.getStr("title"); + String field = workLogContentJson.getStr(fieldStr); + + detail.put("title", title); + detail.put("value", field); + logDetail.add(detail); + } + logInstanceRespVO.setLogDetail(logDetail); + } + //设置时间 + LocalDate nowDate = LocalDate.now(); + LocalDateTime createTime = LocalDateTime.parse(logInstanceRespVO.getCreateTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + //日志创建时间是当前日期时 + if (createTime.toLocalDate().equals(nowDate)) { + logInstanceRespVO.setCreateTime("今日 " + createTime.toLocalTime().format(DateTimeFormatter.ofPattern("HH:mm"))); + } + //日志创建时间是当前日期前一天时 + if (createTime.toLocalDate().equals(nowDate.minusDays(1))) { + logInstanceRespVO.setCreateTime("昨日 " + createTime.toLocalTime().format(DateTimeFormatter.ofPattern("HH:mm"))); + } + + return logInstanceRespVO; } } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogReadService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogReadService.java index 18449439..5070432d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogReadService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogReadService.java @@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.system.service.worklog.dto.LogReadUserRespDTO; import javax.validation.Valid; import java.util.List; +import java.util.Map; /** * 日志查看 Service 接口 @@ -19,4 +20,18 @@ public interface LogReadService { * @param createReqVO 创建信息 */ void createLogRule(@Valid List createReqVO, Long logInstanceId, Long startUserId); + + /** + * 获取日志可查看的用户编号组 + * @param logId 日志编号 + * @return 阅读状态,用户编号组 + */ + Map> getUserId(Long logId); + + /** + * 更新日志阅读状态 + * @param logId 日志编号 + * @param userId 查看者用户编号 + */ + void updateReadStatus(Long logId, Long userId); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogReadServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogReadServiceImpl.java index 898307cf..57ce78bc 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogReadServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogReadServiceImpl.java @@ -7,9 +7,13 @@ import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; + /** * 日志查看 Service 实现类 * @@ -39,4 +43,24 @@ public class LogReadServiceImpl implements LogReadService{ logReadMapper.insertBatch(userInfoList); } + + @Override + public Map> getUserId(Long logId) { + + Map> readDoMap = new HashMap<>(); + + List UnReadDos = logReadMapper.selectUserByLogId(logId, 0); + List readDos = logReadMapper.selectUserByLogId(logId, 1); + + readDoMap.put(0, convertList(UnReadDos, LogReadDo::getReadUserId)); + readDoMap.put(1, convertList(readDos, LogReadDo::getReadUserId)); + + return readDoMap; + } + + @Override + public void updateReadStatus(Long logId, Long userId) { + + logReadMapper.updateReadStatus(logId, userId); + } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleService.java index b10221c6..945dd2d4 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleService.java @@ -45,6 +45,14 @@ public interface LogRuleService { */ LogRuleDO getLogRule(Long id); + /** + * 获得日志规则 + * + * @param formId 模板编号 + * @return 日志规则 + */ + LogRuleDO getLogRuleByFormId(Long formId); + /** * 获得日志规则分页 * diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java index 7c7b5a3f..59fbced7 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java @@ -106,6 +106,11 @@ public class LogRuleServiceImpl implements LogRuleService { return logRuleMapper.selectById(id); } + @Override + public LogRuleDO getLogRuleByFormId(Long formId) { + return logRuleMapper.selectOne(LogRuleDO::getFormId, formId); + } + @Override public PageResult getLogRulePage(LogRulePageReqVO pageReqVO) { return logRuleMapper.selectPage(pageReqVO); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseService.java index 4b019de2..a1941c09 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseService.java @@ -41,4 +41,19 @@ public interface LogUseService { * @return 日志模板使用者的部门编号组 */ List getUserByFormId(Long formId); + + /** + * 根据使用者编号和模板编号,查询模板数量 + * @param formId 模板编号 + * @param userId 用户编号 + * @return 数量 + */ + Long getCountByUser(Long formId, Long userId); + + /** + * 获取我可以使用的模板编号组 + * @param userId 用户编号 + * @return 日志模板编号组 + */ + List getFormIdByUserId(Long userId); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseServiceImpl.java index 589a3cde..b6e7150f 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseServiceImpl.java @@ -74,4 +74,17 @@ public class LogUseServiceImpl implements LogUseService { List logUseDOS = logUseMapper.selectList(LogUseDO::getFormId, formId); return convertList(logUseDOS, LogUseDO::getUseUserId); } + + @Override + public Long getCountByUser(Long formId, Long userId) { + + return logUseMapper.getCountByUser(formId, userId); + } + + @Override + public List getFormIdByUserId(Long userId) { + + List logUseDOS = logUseMapper.selectList(LogUseDO::getUseUserId, userId); + return convertList(logUseDOS, LogUseDO::getFormId); + } } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/LogInstanceMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/LogInstanceMapper.xml index fb9258b3..0c320b08 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/LogInstanceMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/LogInstanceMapper.xml @@ -92,12 +92,15 @@ COUNT(d.log_instance_id) AS unreadCount FROM work_log_instance_ext as a - LEFT JOIN work_log_comment as b ON a.start_user_id = b.user_id + LEFT JOIN work_log_comment as b ON a.id = b.work_log_id LEFT JOIN work_log_read as e ON a.id = e.log_instance_id and e.read_user_id = #{userId} LEFT JOIN work_log_read as c ON a.id = c.log_instance_id and c.read_status = 1 LEFT JOIN work_log_read as d ON a.id = d.log_instance_id and d.read_status = 0 where 1=1 + + and a.id = #{logId} + and a.type = #{reqVO.type} @@ -116,10 +119,10 @@ and e.read_status = 0 - + and a.start_user_id != #{userId} - + and a.start_user_id = #{userId} GROUP BY a.id,e.read_status From 5d7e9c9e16b3172c97fe49ac71355ebd1845ddb3 Mon Sep 17 00:00:00 2001 From: furongxin <419481438@qq.com> Date: Mon, 15 Apr 2024 10:39:17 +0800 Subject: [PATCH 27/50] =?UTF-8?q?=E6=97=A5=E5=BF=97=EF=BC=9A=20=E6=88=91?= =?UTF-8?q?=E6=94=B6=E7=9A=84=E5=88=B0=E9=A1=B5=E9=9D=A2=E5=88=86=E9=A1=B5?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=EF=BC=8C=20=E8=A7=84=E5=88=99=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E3=80=81=E6=9B=B4=E6=96=B0=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/module/system/enums/ErrorCodeConstants.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index 1e4092cb..da320851 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -184,9 +184,13 @@ public interface ErrorCodeConstants { ErrorCode GROUP_NOT_EXISTS = new ErrorCode(1_003_005_000, "考勤组不存在"); ErrorCode FIXED_NOT_EXISTS = new ErrorCode(1_003_006_000, "固定班制考勤设置"); - ErrorCode LOG_RULE_NOT_FIND = new ErrorCode(1_009_010_004, "该模板没配置规则"); + ErrorCode LOG_FORM_NOT_USE = new ErrorCode(1_009_010_004, "你不用使用该日志模板"); ErrorCode LOG_USE_NOT_EXISTS = new ErrorCode(1_009_010_005, "模板不存在"); ErrorCode LOG_TYPE_EXISTS = new ErrorCode(1_009_010_006, "已提交过({}),请勿重复提交"); + + ErrorCode LOG_NOT_DATE = new ErrorCode(1_009_010_007, "只能修改当天提交的日志"); + + ErrorCode LOG_NOT_UPDATE = new ErrorCode(1_009_010_008, "已过了提交时间,不能修改"); } From b39b25c09ed5e4acf8a2dfade9491620578e9cb5 Mon Sep 17 00:00:00 2001 From: aikai Date: Mon, 15 Apr 2024 10:48:09 +0800 Subject: [PATCH 28/50] =?UTF-8?q?=E5=90=88=E5=B9=B6=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../worklog/LogStatisticsController.java | 23 +++++++++++++++++++ .../service/worklog/LogInstanceService.java | 10 -------- .../service/worklog/LogRuleService.java | 8 ------- .../service/worklog/LogRuleServiceImpl.java | 5 ---- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogStatisticsController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogStatisticsController.java index 7944adf3..49b304bf 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogStatisticsController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogStatisticsController.java @@ -1,12 +1,20 @@ package cn.iocoder.yudao.module.system.controller.admin.worklog; import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.module.system.controller.admin.worklog.dto.statistics.LogStatisticsDetailsListDTO; +import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.rule.LogRulePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.rule.LogRuleRespVO; 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.dal.dataobject.worklog.LogRuleDO; 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.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; @@ -14,9 +22,13 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; @Tag(name = "管理后台 - 工作日志统计") @RestController @@ -46,4 +58,15 @@ public class LogStatisticsController { return success(list); } +// @GetMapping("/export-excel") +// @Operation(summary = "导出日志规则 Excel") +// @OperateLog(type = EXPORT) +// public void exportLogRuleExcel(@Valid LogRulePageReqVO pageReqVO, +// HttpServletResponse response) throws IOException { +// pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); +// List list = logRuleService.getLogRulePage(pageReqVO).getList(); +// // 导出 Excel +// ExcelUtils.write(response, "日志规则.xls", "数据", LogRuleRespVO.class, +// BeanUtils.toBean(list, LogRuleRespVO.class)); +// } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java index 4e5527fe..c767676d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java @@ -62,16 +62,6 @@ public interface LogInstanceService { */ List getDeptInfo(); - /** - * 获得我的日志的分页 - * - * @param userId 用户编号 - * @param pageReqVO 分页请求 - * @return 流程实例的分页 - * 获取上一篇日志 - */ - PageResult getMyProcessInstancePage(Long userId, LogInstancePageReqVO pageReqVO); - /** * 获取我管理的日志列表(时间区间) * diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleService.java index 6b89120c..091d9d24 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleService.java @@ -45,14 +45,6 @@ public interface LogRuleService { */ LogRuleDO getLogRule(Long id); - /** - * 获得日志规则 - * - * @param formId 模板编号 - * @return 日志规则 - */ - LogRuleDO getLogRuleByFormId(Long formId); - /** * 获得日志规则分页 * diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java index fc40e083..7f1c6996 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java @@ -107,11 +107,6 @@ public class LogRuleServiceImpl implements LogRuleService { return logRuleMapper.selectById(id); } - @Override - public LogRuleDO getLogRuleByFormId(Long formId) { - return logRuleMapper.selectOne(LogRuleDO::getFormId, formId); - } - @Override public PageResult getLogRulePage(LogRulePageReqVO pageReqVO) { return logRuleMapper.selectPage(pageReqVO); From b91838a6e90e79aaa6eb0d6bdc222ca520fbb309 Mon Sep 17 00:00:00 2001 From: aikai Date: Mon, 15 Apr 2024 10:54:26 +0800 Subject: [PATCH 29/50] =?UTF-8?q?=E5=90=88=E5=B9=B6=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/module/system/dal/mysql/worklog/LogFormMapper.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogFormMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogFormMapper.java index 398ace20..a4d20dbc 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogFormMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogFormMapper.java @@ -8,6 +8,8 @@ import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.form.LogFormPa 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 { From f268cb4373d0d4e9f934b3730e7e71e549daced2 Mon Sep 17 00:00:00 2001 From: aikai Date: Mon, 15 Apr 2024 11:08:40 +0800 Subject: [PATCH 30/50] =?UTF-8?q?=E6=97=A5=E5=BF=97=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/enums/DictTypeConstants.java | 2 + .../worklog/LogStatisticsController.java | 28 ++++------ .../vo/statistics/LogStatisticsExcelVO.java | 55 +++++++++++++++++++ .../service/worklog/LogStatisticsService.java | 13 +++-- .../worklog/LogStatisticsServiceImpl.java | 23 ++++++++ 5 files changed, 100 insertions(+), 21 deletions(-) create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsExcelVO.java diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java index 0c0ef817..cae94d8a 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java @@ -26,4 +26,6 @@ public interface DictTypeConstants { String SMS_SEND_STATUS = "system_sms_send_status"; // 短信发送状态 String SMS_RECEIVE_STATUS = "system_sms_receive_status"; // 短信接收状态 + + String WORK_LOG_SUBMIT_STATUS = "work_log_submit_status"; // 日志提交状态 } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogStatisticsController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogStatisticsController.java index 49b304bf..94bfe5f5 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogStatisticsController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogStatisticsController.java @@ -1,20 +1,16 @@ package cn.iocoder.yudao.module.system.controller.admin.worklog; import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.module.system.controller.admin.worklog.dto.statistics.LogStatisticsDetailsListDTO; -import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.rule.LogRulePageReqVO; -import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.rule.LogRuleRespVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.LogStatisticsDetailsListVO; +import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.LogStatisticsDetailsVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.LogStatisticsModelVO; -import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogRuleDO; 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.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; @@ -23,7 +19,6 @@ import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; import java.io.IOException; import java.util.List; @@ -58,15 +53,14 @@ public class LogStatisticsController { return success(list); } -// @GetMapping("/export-excel") -// @Operation(summary = "导出日志规则 Excel") -// @OperateLog(type = EXPORT) -// public void exportLogRuleExcel(@Valid LogRulePageReqVO pageReqVO, -// HttpServletResponse response) throws IOException { -// pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); -// List list = logRuleService.getLogRulePage(pageReqVO).getList(); -// // 导出 Excel -// ExcelUtils.write(response, "日志规则.xls", "数据", LogRuleRespVO.class, -// BeanUtils.toBean(list, LogRuleRespVO.class)); -// } + @GetMapping("/export-excel") + @Operation(summary = "导出日志规则 Excel") + @OperateLog(type = EXPORT) + public void exportLogRuleExcel(@ModelAttribute LogStatisticsDetailsListDTO dto, + HttpServletResponse response) throws IOException { + List list = logStatisticsService.exportLogRuleExcel(dto); + // 导出 Excel + ExcelUtils.write(response, "日志规则.xls", "数据", LogStatisticsDetailsVO.class, + BeanUtils.toBean(list, LogStatisticsDetailsVO.class)); + } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsExcelVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsExcelVO.java new file mode 100644 index 00000000..7e886e64 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsExcelVO.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics; + +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +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; + +/** + * 动态表单 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +@ExcelIgnoreUnannotated +public class LogStatisticsExcelVO { + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "名称") + @ExcelProperty("名称") + private String nickname; + + @Schema(description = "头像") + private String avatar; + + @Schema(description = "部门id") + private Long deptId; + + @Schema(description = "部门名称") + @ExcelProperty("部门名称") + private String deptName; + + @Schema(description = "日志id", example = "30875") + private Long logInstanceExtId; + + @Schema(description = "提交状态 1按时提交 2迟交 3未提交", example = "2") + @ExcelProperty(value = "提交状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.WORK_LOG_SUBMIT_STATUS) + 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; +} + diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsService.java index 624e20a2..0d6391ed 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsService.java @@ -2,10 +2,7 @@ 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.controller.admin.worklog.vo.statistics.*; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogStatisticsDO; @@ -81,4 +78,12 @@ public interface LogStatisticsService { * @return */ List getNeedWrite(); + + /** + * 导出 + * + * @param dto + * @return + */ + List exportLogRuleExcel(LogStatisticsDetailsListDTO dto); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsServiceImpl.java index 2cb08633..a659afac 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsServiceImpl.java @@ -270,4 +270,27 @@ public class LogStatisticsServiceImpl implements LogStatisticsService { } return list; } + + @Override + public List exportLogRuleExcel(LogStatisticsDetailsListDTO dto) { + // 获取规则 + LogRuleDO logRuleDO = logRuleService.getLogRuleByFormId(dto.getFormId()); + // 判断开始时间是否当天 / 是否本周 + boolean flag = false; + Date begin = DateUtil.parse(dto.getBeginTime(), "yyyy-MM-dd").toJdkDate(); + List 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 dateList = DateUtils.betweenDayStrList(dto.getBeginTime(), dto.getEndTime()); + // 这里将区间转换为具体的日期 因为mysql BETWEEN 会导致索引失效 + if (flag) { + logStatisticsDOS = logStatisticsMapper.getCurrentStatistics(dto.getFormId(), dateList); + } else { + logStatisticsDOS = logStatisticsMapper.getStatistics(dto.getFormId(), dateList); + } + return logStatisticsDOS; + } } \ No newline at end of file From b1207b4bbeb3a4991eaa01413c2dd3e3550404d9 Mon Sep 17 00:00:00 2001 From: aikai Date: Mon, 15 Apr 2024 13:10:33 +0800 Subject: [PATCH 31/50] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=E5=BE=AA=E7=8E=AF=20-=20=E6=8F=90=E4=BA=A4=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BF=AE=E6=94=B9=E6=97=A5=E5=BF=97=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=20-?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/worklog/LogInstanceController.java | 6 +- .../worklog/LogStatisticsController.java | 2 +- .../service/user/AdminUserServiceImpl.java | 10 +-- .../worklog/LogInstanceServiceImpl.java | 47 ++++++++--- .../service/worklog/LogStatisticsService.java | 7 ++ .../worklog/LogStatisticsServiceImpl.java | 79 ++++++++++++------- .../src/main/resources/logback-spring.xml | 4 +- 7 files changed, 102 insertions(+), 53 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java index 1598a41a..d1445ec8 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java @@ -48,7 +48,7 @@ public class LogInstanceController { private LogReadService logReadService; @Resource - private AdminUserService userService; + private AdminUserService adminUserService; @PostMapping("/create") @Operation(summary = "创建日志实例") @@ -136,8 +136,8 @@ public class LogInstanceController { Map> usrMap = logReadService.getUserId(logId); - List unReadUserInfo = BeanUtils.toBean(userService.getUserList(usrMap.get(0)), UserRespVO.class); - List readUserInfo = BeanUtils.toBean(userService.getUserList(usrMap.get(1)), UserRespVO.class); + List unReadUserInfo = BeanUtils.toBean(adminUserService.getUserList(usrMap.get(0)), UserRespVO.class); + List readUserInfo = BeanUtils.toBean(adminUserService.getUserList(usrMap.get(1)), UserRespVO.class); Map unReadMap = new HashMap<>(); Map readMap = new HashMap<>(); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogStatisticsController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogStatisticsController.java index 94bfe5f5..595ba0d3 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogStatisticsController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogStatisticsController.java @@ -41,7 +41,7 @@ public class LogStatisticsController { } @GetMapping("/getStatistics") - @Operation(summary = "获取我管理的模版") + @Operation(summary = "获取日志统计") public CommonResult getStatistics(@ModelAttribute LogStatisticsDetailsListDTO dto) { return success(logStatisticsService.getStatistics(dto)); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java index fdad8b0c..124549bf 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java @@ -25,7 +25,6 @@ import cn.iocoder.yudao.module.system.service.dept.DeptService; import cn.iocoder.yudao.module.system.service.dept.PostService; import cn.iocoder.yudao.module.system.service.permission.PermissionService; import cn.iocoder.yudao.module.system.service.tenant.TenantService; -import cn.iocoder.yudao.module.system.service.worklog.LogInstanceService; import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -75,9 +74,6 @@ public class AdminUserServiceImpl implements AdminUserService { @Resource private UserPostMapper userPostMapper; - @Resource - private LogInstanceService logInstanceService; - @Resource private FileApi fileApi; @@ -436,7 +432,7 @@ public class AdminUserServiceImpl implements AdminUserService { } UserImportRespVO respVO = UserImportRespVO.builder().createUsernames(new ArrayList<>()).updateUsernames(new ArrayList<>()).failureUsernames(new LinkedHashMap<>()).build(); importUsers.forEach(importUser -> { - //校验,判断是否有不符合的原因 + //校验,判断是否有不符合的原因 try { if (!isUpdateSupport) { validateUserForCreateOrUpdate(null, null, importUser.getMobile(), importUser.getEmail(), null, null); @@ -537,9 +533,9 @@ public class AdminUserServiceImpl implements AdminUserService { String idCard = updateUser.getIdcard(); //通过身份证号码 获得出生日期 - LocalDate date = LocalDate.parse(idCard.substring(6,14)); + LocalDate date = LocalDate.parse(idCard.substring(6, 14)); //通过身份证号码 获得性别 - Integer sex = Integer.parseInt(idCard.substring(16,17)) % 2 == 0 ? 2 : 1; + Integer sex = Integer.parseInt(idCard.substring(16, 17)) % 2 == 0 ? 2 : 1; //通过身份证号码 获得年龄 Integer age = nowDate.getYear() - date.getYear(); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java index b93dba58..d8cc0927 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java @@ -1,26 +1,29 @@ package cn.iocoder.yudao.module.system.service.worklog; import cn.hutool.core.date.DateUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.hutool.json.JSONObject; +import cn.iocoder.yudao.framework.common.util.date.DateUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptRespVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstancePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstanceRespVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstanceSaveReqVO; +import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.LogStatisticsSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogFormDO; import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogInstanceDO; import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogRuleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogStatisticsDO; import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogInstanceMapper; import cn.iocoder.yudao.module.system.enums.ErrorCodeConstants; import cn.iocoder.yudao.module.system.service.dept.DeptService; import cn.iocoder.yudao.module.system.service.user.AdminUserService; import cn.iocoder.yudao.module.system.service.worklog.dto.LogReadUserRespDTO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -32,8 +35,6 @@ import java.time.format.DateTimeFormatter; import java.time.temporal.WeekFields; import java.util.*; import java.util.stream.Collectors; -import java.util.Date; -import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @@ -69,6 +70,11 @@ public class LogInstanceServiceImpl implements LogInstanceService { @Resource private LogReadService logReadService; + @Resource + @Lazy + private LogStatisticsService logStatisticsService; + + @Override public Long createLogInstance(LogInstanceSaveReqVO createReqVO) { @@ -76,22 +82,22 @@ public class LogInstanceServiceImpl implements LogInstanceService { validateLogInstanceByType(createReqVO); LogInstanceDO logInstance = BeanUtils.toBean(createReqVO, LogInstanceDO.class); - + //获取当前登录用户id + Long userId = getLoginUserId(); //获取日志类型 LogFormDO logFormDo = logFormService.getForm(createReqVO.getFormId()); - Long count = logUseService.getCountByUser(logFormDo.getId(), getLoginUserId()); + Long count = logUseService.getCountByUser(logFormDo.getId(), userId); if (count == 0L) { throw exception(LOG_FORM_NOT_USE); } //获取部门信息 - AdminUserDO adminUserDO = adminUserService.getUser(getLoginUserId()); + AdminUserDO adminUserDO = adminUserService.getUser(userId); //获取规则信息 LogRuleDO logRuleDO = logRuleService.getLogRule(logFormDo.getRuleId()); - //设置发起人用户编号 - logInstance.setStartUserId(getLoginUserId()); + logInstance.setStartUserId(userId); //设置发起人部门编号 logInstance.setDeptId(adminUserDO.getDeptId()); //设置发起人用户名称 @@ -107,10 +113,27 @@ public class LogInstanceServiceImpl implements LogInstanceService { // 插入 logInstanceMapper.insert(logInstance); - + // 插入到统计中 + Date endTime = null; +// Date statisticalTime = DateUtils.buildWeekHHmmTime(logRuleDO.getStatisticalTime()); + Date thisDate = new Date(); + if (logRuleDO.getType() == 1) { + endTime = DateUtils.buildHHmmTime(logRuleDO.getEndTime()); + } else if (logRuleDO.getType() == 2) { + endTime = DateUtils.buildWeekHHmmTime(logRuleDO.getEndTime()); + } + logStatisticsService.saveOrUpdate(new LogStatisticsDO() + .setFormId(logFormDo.getId()) + .setRuleId(logRuleDO.getId()) + .setUserId(userId) + .setDeptId(adminUserDO.getDeptId()) + .setLogInstanceExtId(logInstance.getId()) + .setType(logRuleDO.getType()) + .setTime(createReqVO.getTime()) + .setStatus(thisDate.getTime() < endTime.getTime() ? 1 : 2) + ); //创建日志时,查询可以查看发起人日志的用户组 用线程控制 new Thread(() -> { - List respDTOS = logInstanceMapper.selectRaedUser(adminUserDO.getDeptId()); logReadService.createLogRule(respDTOS, logInstance.getId(), logInstance.getStartUserId()); }).start(); @@ -133,7 +156,7 @@ public class LogInstanceServiceImpl implements LogInstanceService { LocalDate nowTime = LocalDate.now(); //根据日志类型判断 - switch (createReqVO.getType()){ + switch (createReqVO.getType()) { //日志类型为日报 case 1: diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsService.java index 0d6391ed..d0ccbe40 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsService.java @@ -86,4 +86,11 @@ public interface LogStatisticsService { * @return */ List exportLogRuleExcel(LogStatisticsDetailsListDTO dto); + + /** + * 新增或者修改统计表 + * + * @param logStatisticsDO + */ + void saveOrUpdate(LogStatisticsDO logStatisticsDO); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsServiceImpl.java index a659afac..109e77e7 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsServiceImpl.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.system.service.worklog; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; @@ -17,6 +18,7 @@ import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogStatisticsMapper; import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogUseMapper; import cn.iocoder.yudao.module.system.service.worklog.dto.LogUseVO; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -91,7 +93,18 @@ public class LogStatisticsServiceImpl implements LogStatisticsService { List formList = new ArrayList<>(); Map ruleMap = new HashMap<>(); - this.getFormAndRule(formIds, formList, ruleMap); + //查询模版 + formList = logFormMapper.selectList(new LambdaQueryWrapper() + .in(LogFormDO::getId, formIds) + .eq(LogFormDO::getStatus, 1) + .isNotNull(LogFormDO::getRuleId) + ); + List ruleIds = formList.stream().map(LogFormDO::getRuleId).collect(Collectors.toList()); + List logRuleDOS = new ArrayList<>(); + if (CollectionUtil.isNotEmpty(ruleIds)) { + logRuleDOS = logRuleService.getLogRuleByIds(ruleIds); + ruleMap = logRuleDOS.stream().collect(Collectors.toMap(LogRuleDO::getId, v -> v)); + } Date thisDate = new Date(); @@ -121,7 +134,7 @@ public class LogStatisticsServiceImpl implements LogStatisticsService { //迟交数量 Integer lateNum = Math.toIntExact(instanceDOS.stream().filter(a -> DateUtil.isIn(Date.from(a.getCreateTime().atZone(ZoneId.systemDefault()).toInstant()), endTime, statisticalTime)).count()); //未提交数量 - Integer unSubmittedNum = num - onTimeNum - lateNum; + Integer unSubmittedNum = Math.max((num - onTimeNum - lateNum), 0); //按天统计 vo.setOnTimeNum(onTimeNum); vo.setUnSubmittedNum(unSubmittedNum); @@ -139,7 +152,7 @@ public class LogStatisticsServiceImpl implements LogStatisticsService { //迟交数量 Integer lateNum = Math.toIntExact(instanceDOS.stream().filter(a -> DateUtil.isIn(Date.from(a.getCreateTime().atZone(ZoneId.systemDefault()).toInstant()), endTime, statisticalTime)).count()); //未提交数量 - Integer unSubmittedNum = num - onTimeNum - lateNum; + Integer unSubmittedNum = Math.max((num - onTimeNum - lateNum), 0); //按天统计 vo.setOnTimeNum(onTimeNum); vo.setUnSubmittedNum(unSubmittedNum); @@ -151,28 +164,6 @@ public class LogStatisticsServiceImpl implements LogStatisticsService { return list; } - /** - * 获取模版和规则 - * - * @param formIds - * @param formList - * @param ruleMap - */ - private void getFormAndRule(List formIds, List formList, Map ruleMap) { - //查询模版 - formList = logFormMapper.selectList(new LambdaQueryWrapper() - .in(LogFormDO::getId, formIds) - .eq(LogFormDO::getStatus, 1) - .isNotNull(LogFormDO::getRuleId) - ); - List ruleIds = formList.stream().map(LogFormDO::getRuleId).collect(Collectors.toList()); - List logRuleDOS = new ArrayList<>(); - if (CollectionUtil.isNotEmpty(ruleIds)) { - logRuleDOS = logRuleService.getLogRuleByIds(ruleIds); - ruleMap = logRuleDOS.stream().collect(Collectors.toMap(LogRuleDO::getId, v -> v)); - } - } - @Override public List getUnSubmittedUser(Long formId, String thisTime) { return logStatisticsMapper.getUnSubmittedUser(formId, thisTime); @@ -220,7 +211,18 @@ public class LogStatisticsServiceImpl implements LogStatisticsService { //获取模版和规则 List formList = new ArrayList<>(); Map ruleMap = new HashMap<>(); - this.getFormAndRule(formIds, formList, ruleMap); + //查询模版 + formList = logFormMapper.selectList(new LambdaQueryWrapper() + .in(LogFormDO::getId, formIds) + .eq(LogFormDO::getStatus, 1) + .isNotNull(LogFormDO::getRuleId) + ); + List ruleIds = formList.stream().map(LogFormDO::getRuleId).collect(Collectors.toList()); + List logRuleDOS = new ArrayList<>(); + if (CollectionUtil.isNotEmpty(ruleIds)) { + logRuleDOS = logRuleService.getLogRuleByIds(ruleIds); + ruleMap = logRuleDOS.stream().collect(Collectors.toMap(LogRuleDO::getId, v -> v)); + } Date thisDate = new Date(); Date beginDate = null; @@ -279,10 +281,11 @@ public class LogStatisticsServiceImpl implements LogStatisticsService { boolean flag = false; Date begin = DateUtil.parse(dto.getBeginTime(), "yyyy-MM-dd").toJdkDate(); List logStatisticsDOS = new ArrayList<>(); + Date thisDate = new Date(); if (logRuleDO.getType() == 1) { - flag = DateUtil.isSameDay(begin, new Date()); + flag = DateUtil.isSameDay(begin, thisDate); } else if (logRuleDO.getType() == 2) { - flag = DateUtil.isSameWeek(begin, new Date(), true); + flag = DateUtil.isSameWeek(begin, thisDate, true); } List dateList = DateUtils.betweenDayStrList(dto.getBeginTime(), dto.getEndTime()); // 这里将区间转换为具体的日期 因为mysql BETWEEN 会导致索引失效 @@ -293,4 +296,24 @@ public class LogStatisticsServiceImpl implements LogStatisticsService { } return logStatisticsDOS; } + + @Override + public void saveOrUpdate(LogStatisticsDO logStatisticsDO) { + if (logStatisticsDO.getStatus() == 1) { + logStatisticsMapper.insert(logStatisticsDO); + return; + } + List logStatisticsDOS = logStatisticsMapper.selectList(new LambdaQueryWrapper() + .eq(LogStatisticsDO::getUserId, logStatisticsDO.getUserId()) + .eq(LogStatisticsDO::getFormId, logStatisticsDO.getFormId()) + .eq(LogStatisticsDO::getTime, logStatisticsDO.getTime())); + if (CollUtil.isEmpty(logStatisticsDOS)) { + logStatisticsMapper.insert(logStatisticsDO); + } else { + logStatisticsMapper.update(logStatisticsDO, new LambdaUpdateWrapper() + .eq(LogStatisticsDO::getUserId, logStatisticsDO.getUserId()) + .eq(LogStatisticsDO::getFormId, logStatisticsDO.getFormId()) + .eq(LogStatisticsDO::getTime, logStatisticsDO.getTime())); + } + } } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/logback-spring.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/logback-spring.xml index b1b9f3fa..b62890e3 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/logback-spring.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/logback-spring.xml @@ -58,7 +58,7 @@ - + @@ -66,7 +66,7 @@ - + From 897d15708d32f00c1d327942544b60f1167ac316 Mon Sep 17 00:00:00 2001 From: aikai Date: Mon, 15 Apr 2024 13:30:59 +0800 Subject: [PATCH 32/50] =?UTF-8?q?dev=E7=8E=AF=E5=A2=83=E5=BC=80=E5=90=AF?= =?UTF-8?q?=E8=B0=83=E5=BA=A6=E4=B8=AD=E5=BF=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-dev.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/application-dev.yaml b/yudao-module-system/yudao-module-system-biz/src/main/resources/application-dev.yaml index 2db39bc3..9227a5fa 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/application-dev.yaml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/application-dev.yaml @@ -78,7 +78,7 @@ spring: --- #################### 定时任务相关配置 #################### xxl: job: - enabled: false # 是否开启调度中心,默认为 true 开启 + enabled: true # 是否开启调度中心,默认为 true 开启 admin: addresses: http://127.0.0.1:9090/xxl-job-admin # 调度中心部署跟地址 executor: From d2e460b56d4b194d6e532e3ad7e5ebf859a114aa Mon Sep 17 00:00:00 2001 From: aikai Date: Mon, 15 Apr 2024 14:02:48 +0800 Subject: [PATCH 33/50] =?UTF-8?q?=E6=88=91=E7=AE=A1=E7=90=86=E7=9A=84/?= =?UTF-8?q?=E6=88=91=E9=9C=80=E8=A6=81=E5=A1=AB=E5=86=99=E7=9A=84=20?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E8=BF=94=E5=9B=9E=E6=A8=A1=E7=89=88=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=201=E6=97=A5=E6=8A=A5=202=E5=91=A8=E6=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/worklog/vo/statistics/LogStatisticsModelVO.java | 3 +++ .../system/service/worklog/LogStatisticsServiceImpl.java | 2 ++ 2 files changed, 5 insertions(+) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsModelVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsModelVO.java index 6249cef1..8d976760 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsModelVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsModelVO.java @@ -21,5 +21,8 @@ public class LogStatisticsModelVO extends LogFormDO { @Schema(description = "提交范围") private String commitTimeRange; + + @Schema(description = "模版类型 1日报 2周报 3月报") + private Integer type; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsServiceImpl.java index 109e77e7..c0b27b7a 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsServiceImpl.java @@ -118,6 +118,7 @@ public class LogStatisticsServiceImpl implements LogStatisticsService { List instanceDOS = logInstanceService.myManageLogInstanceByTimeRange(logFormDO.getId(), logRuleDO.getType(), thisDate); LogStatisticsModelVO vo = new LogStatisticsModelVO(); BeanUtil.copyProperties(logFormDO, vo); + vo.setType(logRuleDO.getType()); //查询下应该提交多少日志实例 - 直接通过模版id查询使用表 Integer num = Math.toIntExact(logUseMapper.selectCount(new LambdaQueryWrapper() .eq(LogUseDO::getFormId, logFormDO.getId()))); @@ -268,6 +269,7 @@ public class LogStatisticsServiceImpl implements LogStatisticsService { vo.setUnSubmittedNum(unSubmittedNum); vo.setLateNum(lateNum); } + vo.setType(logRuleDO.getType()); list.add(vo); } return list; From 27487cf51f6513985b89858500049af3ecc0c1d4 Mon Sep 17 00:00:00 2001 From: furongxin <419481438@qq.com> Date: Mon, 15 Apr 2024 14:19:14 +0800 Subject: [PATCH 34/50] =?UTF-8?q?=E6=97=A5=E5=BF=97=EF=BC=9A=20=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E6=97=A5=E5=BF=97=E6=97=B6=EF=BC=8C=20=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E9=87=8D=E5=A4=8D=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/worklog/LogInstanceController.java | 2 +- .../dal/mysql/worklog/LogInstanceMapper.java | 11 +++- .../service/worklog/LogInstanceService.java | 14 +++- .../worklog/LogInstanceServiceImpl.java | 64 +++++-------------- .../{user => worklog}/LogInstanceMapper.xml | 0 5 files changed, 38 insertions(+), 53 deletions(-) rename yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/{user => worklog}/LogInstanceMapper.xml (100%) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java index d1445ec8..a66a88d4 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java @@ -120,7 +120,7 @@ public class LogInstanceController { @PreAuthorize("@ss.hasPermission('system:view-log:query')") public CommonResult getUpLog(@RequestParam("formId") Long formId) { - LogInstanceRespVO logInstanceRespVO = LogInstanceConvert.INSTANCE.convert(logInstanceService.getUpLog(formId, null)); + LogInstanceRespVO logInstanceRespVO = LogInstanceConvert.INSTANCE.convert(logInstanceService.getUpLog(formId)); logInstanceRespVO = logInstanceService.setContentFun(logInstanceRespVO); return success(logInstanceRespVO); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java index d46fa16f..9f304bc9 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogInstanceMapper.java @@ -23,15 +23,22 @@ import java.util.List; public interface LogInstanceMapper extends BaseMapperX { - default List getUpLog(Long userId, Long formId, Integer type){ + default List getUpLog(Long userId, Long formId) { return selectList(new LambdaQueryWrapperX() .eq(LogInstanceDO::getStartUserId, userId) .eqIfPresent(LogInstanceDO::getFormId, formId) - .eqIfPresent(LogInstanceDO::getType, type) .orderByDesc(LogInstanceDO::getCreateTime)); } + default Long getLogByType(Integer type, Long userId, List dateList) { + + return selectCount(new LambdaQueryWrapperX() + .eq(LogInstanceDO::getType, type) + .eq(LogInstanceDO::getStartUserId, userId) + .in(LogInstanceDO::getTime, dateList)); + } + IPage selectPageResult(@Param("page")Page page, @Param("reqVO")LogInstancePageReqVO reqVO, @Param("userId")Long userId, @Param("pagingType") Integer pagingType, @Param("logId")Long logId); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java index c767676d..5074e9f9 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java @@ -1,6 +1,5 @@ package cn.iocoder.yudao.module.system.service.worklog; -import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptRespVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstancePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstanceRespVO; @@ -9,8 +8,8 @@ import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogInstanceDO; import com.baomidou.mybatisplus.core.metadata.IPage; import javax.validation.Valid; -import java.util.List; import java.util.Date; +import java.util.List; /** * 日志实例的拓展 Service 接口 @@ -89,7 +88,16 @@ public interface LogInstanceService { // * @return // */ // List getNeedWriteLogInstanceByTimeRange(Long fromId, List time, Long userId); - LogInstanceDO getUpLog(Long formId, Integer type); + /** + * 获取用户发送的上一篇日志详情 + * @param formId 日志模板编号 + * @return 日志详情 + */ + LogInstanceDO getUpLog(Long formId); + + /** + * 设置日志详情 模板内容和时间 + */ LogInstanceRespVO setContentFun(LogInstanceRespVO logInstanceRespVO); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java index d8cc0927..808d6e39 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java @@ -8,7 +8,6 @@ import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptRespVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstancePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstanceRespVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstanceSaveReqVO; -import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.LogStatisticsSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogFormDO; @@ -32,7 +31,6 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; -import java.time.temporal.WeekFields; import java.util.*; import java.util.stream.Collectors; @@ -96,6 +94,7 @@ public class LogInstanceServiceImpl implements LogInstanceService { AdminUserDO adminUserDO = adminUserService.getUser(userId); //获取规则信息 LogRuleDO logRuleDO = logRuleService.getLogRule(logFormDo.getRuleId()); + //设置发起人用户编号 logInstance.setStartUserId(userId); //设置发起人部门编号 @@ -108,8 +107,6 @@ public class LogInstanceServiceImpl implements LogInstanceService { logInstance.setType(logRuleDO.getType()); //设置日志名称 logInstance.setName(adminUserDO.getNickname() + "的" + logFormDo.getName()); - //设置日志日期 - logInstance.setTime(createReqVO.getTime()); // 插入 logInstanceMapper.insert(logInstance); @@ -134,6 +131,7 @@ public class LogInstanceServiceImpl implements LogInstanceService { ); //创建日志时,查询可以查看发起人日志的用户组 用线程控制 new Thread(() -> { + List respDTOS = logInstanceMapper.selectRaedUser(adminUserDO.getDeptId()); logReadService.createLogRule(respDTOS, logInstance.getId(), logInstance.getStartUserId()); }).start(); @@ -147,50 +145,22 @@ public class LogInstanceServiceImpl implements LogInstanceService { */ private void validateLogInstanceByType(LogInstanceSaveReqVO createReqVO) { - LogInstanceDO logInstanceDO = getUpLog(null, createReqVO.getType()); - if (logInstanceDO == null) { - return; + List dateList = new ArrayList<>(); + if (createReqVO.getType() == 1) { + + dateList.add(createReqVO.getTime()); + }else { + + String[] times = createReqVO.getTime().split(","); + dateList = DateUtils.betweenDayStrList(times[0], times[1]); + + createReqVO.setTime(times[1]); } - LocalDate oldTime = LocalDate.parse(logInstanceDO.getTime()); - LocalDate nowTime = LocalDate.now(); + Long count = logInstanceMapper.getLogByType(createReqVO.getType(), getLoginUserId(), dateList); + if (count > 0L) { - //根据日志类型判断 - switch (createReqVO.getType()) { - - //日志类型为日报 - case 1: - if (oldTime.equals(nowTime)) { - - throw exception(ErrorCodeConstants.LOG_TYPE_EXISTS, "日报"); - } - //日志类型为周报 - case 2: - WeekFields weekFields = WeekFields.of(Locale.getDefault()); - - // 获取两个日期所属的周数和年份 - int oldWeek = oldTime.get(weekFields.weekOfWeekBasedYear()); - int oldYear = oldTime.get(weekFields.weekBasedYear()); - - int nowWeek = nowTime.get(weekFields.weekOfWeekBasedYear()); - int nowYear = nowTime.get(weekFields.weekBasedYear()); - - if (oldWeek == nowWeek && oldYear == nowYear) { - - throw exception(ErrorCodeConstants.LOG_TYPE_EXISTS, "周报"); - } - //日志类型为月报 - case 3: - if (oldTime.getYear() == nowTime.getYear() && oldTime.getMonth() == nowTime.getMonth()) { - - throw exception(ErrorCodeConstants.LOG_TYPE_EXISTS, "月报"); - } - //日志类型为年报 - case 4: - if (oldTime.getYear() == nowTime.getYear()) { - - throw exception(ErrorCodeConstants.LOG_TYPE_EXISTS, "年报"); - } + throw exception(ErrorCodeConstants.LOG_TYPE_EXISTS); } } @@ -311,9 +281,9 @@ public class LogInstanceServiceImpl implements LogInstanceService { } @Override - public LogInstanceDO getUpLog(Long formId, Integer type) { + public LogInstanceDO getUpLog(Long formId) { - List logInstanceDOS = logInstanceMapper.getUpLog(getLoginUserId(), formId, type); + List logInstanceDOS = logInstanceMapper.getUpLog(getLoginUserId(), formId); if (!logInstanceDOS.isEmpty()) { return logInstanceDOS.get(0); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/LogInstanceMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/LogInstanceMapper.xml similarity index 100% rename from yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/LogInstanceMapper.xml rename to yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/LogInstanceMapper.xml From 791c4986159263a008f8c4500ee4b005d0ad0a49 Mon Sep 17 00:00:00 2001 From: furongxin <419481438@qq.com> Date: Mon, 15 Apr 2024 14:24:02 +0800 Subject: [PATCH 35/50] =?UTF-8?q?=E6=97=A5=E5=BF=97=EF=BC=9A=20=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E6=97=A5=E5=BF=97=E6=97=B6=EF=BC=8C=20=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E9=87=8D=E5=A4=8D=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iocoder/yudao/module/system/enums/ErrorCodeConstants.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index da320851..20e503b2 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -188,7 +188,7 @@ public interface ErrorCodeConstants { ErrorCode LOG_USE_NOT_EXISTS = new ErrorCode(1_009_010_005, "模板不存在"); - ErrorCode LOG_TYPE_EXISTS = new ErrorCode(1_009_010_006, "已提交过({}),请勿重复提交"); + ErrorCode LOG_TYPE_EXISTS = new ErrorCode(1_009_010_006, "当前日期的日志已提交过,请勿重复提交"); ErrorCode LOG_NOT_DATE = new ErrorCode(1_009_010_007, "只能修改当天提交的日志"); From 125c10c160da61d32ed256afbc256ec0baea6253 Mon Sep 17 00:00:00 2001 From: aikai Date: Mon, 15 Apr 2024 15:25:42 +0800 Subject: [PATCH 36/50] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8F=90=E4=BA=A4=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dal/dataobject/worklog/LogInstanceDO.java | 5 +++++ .../service/worklog/LogInstanceServiceImpl.java | 14 +++++++------- .../mapper/worklog/LogStatisticsMapper.xml | 6 +++--- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogInstanceDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogInstanceDO.java index 1d4ab46c..0144d16c 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogInstanceDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/worklog/LogInstanceDO.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.util.List; @@ -58,6 +59,10 @@ public class LogInstanceDO extends BaseDO { * 日报类型 */ private Integer type; + /** + * 提交状态 1按时提交 2迟交 + */ + private Integer status; /** * 日志模板编号 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java index d8cc0927..44bae74a 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java @@ -8,7 +8,6 @@ import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptRespVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstancePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstanceRespVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstanceSaveReqVO; -import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.LogStatisticsSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogFormDO; @@ -111,17 +110,18 @@ public class LogInstanceServiceImpl implements LogInstanceService { //设置日志日期 logInstance.setTime(createReqVO.getTime()); - // 插入 - logInstanceMapper.insert(logInstance); - // 插入到统计中 + // 插入提交状态 Date endTime = null; -// Date statisticalTime = DateUtils.buildWeekHHmmTime(logRuleDO.getStatisticalTime()); Date thisDate = new Date(); if (logRuleDO.getType() == 1) { endTime = DateUtils.buildHHmmTime(logRuleDO.getEndTime()); - } else if (logRuleDO.getType() == 2) { + } else { endTime = DateUtils.buildWeekHHmmTime(logRuleDO.getEndTime()); } + logInstance.setStatus(thisDate.getTime() < endTime.getTime() ? 1 : 2); + // 插入 + logInstanceMapper.insert(logInstance); + logStatisticsService.saveOrUpdate(new LogStatisticsDO() .setFormId(logFormDo.getId()) .setRuleId(logRuleDO.getId()) @@ -130,7 +130,7 @@ public class LogInstanceServiceImpl implements LogInstanceService { .setLogInstanceExtId(logInstance.getId()) .setType(logRuleDO.getType()) .setTime(createReqVO.getTime()) - .setStatus(thisDate.getTime() < endTime.getTime() ? 1 : 2) + .setStatus(logInstance.getStatus()) ); //创建日志时,查询可以查看发起人日志的用户组 用线程控制 new Thread(() -> { diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/LogStatisticsMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/LogStatisticsMapper.xml index 4a8d850b..330976ef 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/LogStatisticsMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/LogStatisticsMapper.xml @@ -66,8 +66,8 @@ 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 + id,start_user_id,create_time,`status` + FROM work_log_instance_ext WHERE form_id = #{formId} @@ -75,7 +75,7 @@ #{date} - ) AS d ON d.user_id = b.use_user_id + ) AS d ON d.start_user_id = b.use_user_id b.deleted = 0 From eb110d4410cfd1a55d04a038551c2dec00cbd1ec Mon Sep 17 00:00:00 2001 From: furongxin <419481438@qq.com> Date: Mon, 15 Apr 2024 15:30:23 +0800 Subject: [PATCH 37/50] =?UTF-8?q?=E6=97=A5=E5=BF=97=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=EF=BC=8C=E5=8A=A0=E5=85=A5=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/module/system/dal/mysql/worklog/LogFormMapper.java | 1 + 1 file changed, 1 insertion(+) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogFormMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogFormMapper.java index a4d20dbc..660699a0 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogFormMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogFormMapper.java @@ -21,6 +21,7 @@ public interface LogFormMapper extends BaseMapperX { default PageResult selectPageByRule(LogFormPageReqVO reqVO, List formIds) { return selectPage(reqVO, new LambdaQueryWrapperX() + .eq(LogFormDO::getStatus, 0) .in(LogFormDO::getId, formIds) .orderByDesc(LogFormDO::getId)); } From 40295d2bd06615148a4d74785ea1f2aaa7f2811a Mon Sep 17 00:00:00 2001 From: aikai Date: Mon, 15 Apr 2024 16:17:19 +0800 Subject: [PATCH 38/50] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/system/service/worklog/LogFormServiceImpl.java | 2 +- .../system/service/worklog/LogStatisticsServiceImpl.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogFormServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogFormServiceImpl.java index 120587dc..fcb6d577 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogFormServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogFormServiceImpl.java @@ -111,7 +111,7 @@ public class LogFormServiceImpl implements LogFormService { public List getLogFormRuleList() { //查询模版 List formList = formMapper.selectList(new LambdaQueryWrapper() - .eq(LogFormDO::getStatus, 1) + .eq(LogFormDO::getStatus, 0) .isNotNull(LogFormDO::getRuleId) ); List ruleIds = formList.stream().map(LogFormDO::getRuleId).collect(Collectors.toList()); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsServiceImpl.java index c0b27b7a..50c7991d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsServiceImpl.java @@ -96,7 +96,7 @@ public class LogStatisticsServiceImpl implements LogStatisticsService { //查询模版 formList = logFormMapper.selectList(new LambdaQueryWrapper() .in(LogFormDO::getId, formIds) - .eq(LogFormDO::getStatus, 1) + .eq(LogFormDO::getStatus, 0) .isNotNull(LogFormDO::getRuleId) ); List ruleIds = formList.stream().map(LogFormDO::getRuleId).collect(Collectors.toList()); @@ -215,7 +215,7 @@ public class LogStatisticsServiceImpl implements LogStatisticsService { //查询模版 formList = logFormMapper.selectList(new LambdaQueryWrapper() .in(LogFormDO::getId, formIds) - .eq(LogFormDO::getStatus, 1) + .eq(LogFormDO::getStatus, 0) .isNotNull(LogFormDO::getRuleId) ); List ruleIds = formList.stream().map(LogFormDO::getRuleId).collect(Collectors.toList()); From 04ccb88c2d8ca43df121d8960661c8d6e1e01502 Mon Sep 17 00:00:00 2001 From: aikai Date: Mon, 15 Apr 2024 16:30:19 +0800 Subject: [PATCH 39/50] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/worklog/LogStatisticsController.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogStatisticsController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogStatisticsController.java index 595ba0d3..655d39e5 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogStatisticsController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogStatisticsController.java @@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.module.system.controller.admin.worklog.dto.statistics.LogStatisticsDetailsListDTO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.LogStatisticsDetailsListVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.LogStatisticsDetailsVO; +import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.LogStatisticsExcelVO; 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; @@ -60,7 +61,7 @@ public class LogStatisticsController { HttpServletResponse response) throws IOException { List list = logStatisticsService.exportLogRuleExcel(dto); // 导出 Excel - ExcelUtils.write(response, "日志规则.xls", "数据", LogStatisticsDetailsVO.class, - BeanUtils.toBean(list, LogStatisticsDetailsVO.class)); + ExcelUtils.write(response, "日志规则.xls", "数据", LogStatisticsExcelVO.class, + BeanUtils.toBean(list, LogStatisticsExcelVO.class)); } } From a436bb9979270cd38181e2dac082d20cab6eb7c0 Mon Sep 17 00:00:00 2001 From: furongxin <419481438@qq.com> Date: Mon, 15 Apr 2024 18:00:32 +0800 Subject: [PATCH 40/50] =?UTF-8?q?=E6=97=A5=E5=BF=97=E8=A7=84=E5=88=99=20?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E4=BF=AE=E6=94=B9=20=E8=87=B3=20=E6=A0=B9?= =?UTF-8?q?=E6=8D=AE=E6=A8=A1=E6=9D=BFID=E6=9F=A5=E8=AF=A2=EF=BC=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/worklog/LogFormController.java | 2 +- .../controller/admin/worklog/LogRuleController.java | 6 +++--- .../admin/worklog/vo/form/LogFormPageReqVO.java | 7 +++++-- .../system/dal/mysql/worklog/LogFormMapper.java | 8 ++++---- .../service/worklog/LogInstanceServiceImpl.java | 4 ++-- .../system/service/worklog/LogRuleService.java | 12 ++++++------ .../system/service/worklog/LogRuleServiceImpl.java | 4 ++-- .../resources/mapper/worklog/LogInstanceMapper.xml | 11 ++++------- 8 files changed, 27 insertions(+), 27 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogFormController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogFormController.java index 589fc6a0..6089b595 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogFormController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogFormController.java @@ -69,7 +69,7 @@ public class LogFormController { if (form != null) { //获取规则信息 - LogRuleDO logRuleDO = logRuleService.getLogRule(form.getRuleId()); + LogRuleDO logRuleDO = logRuleService.getLogRule(form.getId()); //设置日志类型 logFormRespVO.setType(logRuleDO.getType()); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogRuleController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogRuleController.java index ea2e070b..e270f277 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogRuleController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogRuleController.java @@ -72,11 +72,11 @@ public class LogRuleController { @GetMapping("/get") @Operation(summary = "获得日志规则") - @Parameter(name = "id", description = "编号", required = true, example = "1024") + @Parameter(name = "formId", description = "日志模板编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('system:log-rule:query')") - public CommonResult getLogRule(@RequestParam("id") Long id) { + public CommonResult getLogRule(@RequestParam("formId") Long formId) { - LogRuleDO logRule = logRuleService.getLogRule(id); + LogRuleDO logRule = logRuleService.getLogRule(formId); return success(BeanUtils.toBean(logRule, LogRuleRespVO.class)); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/form/LogFormPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/form/LogFormPageReqVO.java index 6abacdf3..5efc833e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/form/LogFormPageReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/form/LogFormPageReqVO.java @@ -6,13 +6,16 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; -@Schema(description = "管理后台 - 动态表单分页 Request VO") +@Schema(description = "管理后台 - 动态模板分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) public class LogFormPageReqVO extends PageParam { - @Schema(description = "表单名称", example = "芋道") + @Schema(description = "模板名称", example = "芋道") private String name; + @Schema(description = "模板状态", example = "0") + private Integer status; + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogFormMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogFormMapper.java index 660699a0..cf573acf 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogFormMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/worklog/LogFormMapper.java @@ -3,7 +3,6 @@ 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.framework.mybatis.core.query.QueryWrapperX; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.form.LogFormPageReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogFormDO; import org.apache.ibatis.annotations.Mapper; @@ -14,9 +13,10 @@ import java.util.List; public interface LogFormMapper extends BaseMapperX { default PageResult selectPage(LogFormPageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() - .likeIfPresent("name", reqVO.getName()) - .orderByDesc("id")); + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(LogFormDO::getName, reqVO.getName()) + .eqIfPresent(LogFormDO::getStatus, reqVO.getStatus()) + .orderByDesc(LogFormDO::getId)); } default PageResult selectPageByRule(LogFormPageReqVO reqVO, List formIds) { diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java index 3b1656ae..884576d2 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java @@ -93,7 +93,7 @@ public class LogInstanceServiceImpl implements LogInstanceService { //获取部门信息 AdminUserDO adminUserDO = adminUserService.getUser(userId); //获取规则信息 - LogRuleDO logRuleDO = logRuleService.getLogRule(logFormDo.getRuleId()); + LogRuleDO logRuleDO = logRuleService.getLogRule(logFormDo.getId()); //设置发起人用户编号 logInstance.setStartUserId(userId); @@ -184,7 +184,7 @@ public class LogInstanceServiceImpl implements LogInstanceService { endTime = endTime.split(",")[1]; } - if (LocalTime.now().isBefore(LocalTime.parse(endTime))) { + if (LocalTime.now().isAfter(LocalTime.parse(endTime))) { throw exception(LOG_NOT_UPDATE); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleService.java index 091d9d24..ccd7727c 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleService.java @@ -40,10 +40,10 @@ public interface LogRuleService { /** * 获得日志规则 * - * @param id 编号 + * @param formId 模板编号 * @return 日志规则 */ - LogRuleDO getLogRule(Long id); + LogRuleDO getLogRule(Long formId); /** * 获得日志规则分页 @@ -56,16 +56,16 @@ public interface LogRuleService { /** * 通过规则ids获取规则 * - * @param ruleIds - * @return + * @param ruleIds 规则编号组 + * @return 规则列表 */ List getLogRuleByIds(List ruleIds); /** * 通过模版id获取规则 * - * @param formId - * @return + * @param formId 日志模板编号 + * @return 日志规则 */ LogRuleDO getLogRuleByFormId(Long formId); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java index 7f1c6996..456ac625 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java @@ -103,8 +103,8 @@ public class LogRuleServiceImpl implements LogRuleService { } @Override - public LogRuleDO getLogRule(Long id) { - return logRuleMapper.selectById(id); + public LogRuleDO getLogRule(Long formId) { + return logRuleMapper.selectOne(LogRuleDO:: getFormId, formId); } @Override diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/LogInstanceMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/LogInstanceMapper.xml index c1e7d74b..4e3480d0 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/LogInstanceMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/LogInstanceMapper.xml @@ -116,8 +116,7 @@ LEFT JOIN work_log_read as e ON a.id = e.log_instance_id and e.read_user_id = #{userId} LEFT JOIN work_log_read as c ON a.id = c.log_instance_id and c.read_status = 1 LEFT JOIN work_log_read as d ON a.id = d.log_instance_id and d.read_status = 0 - where - 1=1 + and a.id = #{logId} @@ -127,11 +126,8 @@ and a.dept_id = #{reqVO.deptId} - - and a.start_user_name = #{reqVO.startUserName} - - - and a.start_user_name = #{reqVO.startUserName} + + and a.start_user_id = #{reqVO.startUserId} and a.create_time BETWEEN #{reqVO.createTime[0]} and #{reqVO.createTime[1]} @@ -145,6 +141,7 @@ and a.start_user_id = #{userId} + GROUP BY a.id,e.read_status ORDER BY a.create_time DESC From 849f1d8d6cb263f75d43828f57d85babf3d76e55 Mon Sep 17 00:00:00 2001 From: aikai Date: Mon, 15 Apr 2024 19:18:30 +0800 Subject: [PATCH 41/50] =?UTF-8?q?=E5=AF=BC=E5=87=BA=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/worklog/vo/statistics/LogStatisticsExcelVO.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsExcelVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsExcelVO.java index 7e886e64..7afcb1d2 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsExcelVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/statistics/LogStatisticsExcelVO.java @@ -8,6 +8,7 @@ import com.alibaba.excel.annotation.ExcelProperty; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import lombok.experimental.Accessors; import org.springframework.format.annotation.DateTimeFormat; import java.util.Date; @@ -21,6 +22,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.TIME_ZONE_DE */ @Data @ExcelIgnoreUnannotated +@Accessors(chain = false) public class LogStatisticsExcelVO { @Schema(description = "用户id") private Long userId; @@ -50,6 +52,7 @@ public class LogStatisticsExcelVO { @Schema(description = "创建时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT) + @ExcelProperty(value = "提交时间") private Date createTime; } From 114be06ea2e3dfac70f253657ced50554f8e0680 Mon Sep 17 00:00:00 2001 From: aikai Date: Mon, 15 Apr 2024 19:31:38 +0800 Subject: [PATCH 42/50] =?UTF-8?q?=E6=97=A5=E5=BF=97=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E7=AD=9B=E9=80=89bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/worklog/LogInstanceMapper.xml | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/LogInstanceMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/LogInstanceMapper.xml index 4e3480d0..f5d67ad8 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/LogInstanceMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/worklog/LogInstanceMapper.xml @@ -105,21 +105,21 @@ SELECT a.*, - e.read_status AS readStatus, - COUNT(b.work_log_id) AS comment, - COUNT(c.log_instance_id) AS readCount, - COUNT(d.log_instance_id) AS unreadCount + e.read_status as readStatus, + COALESCE(c.readCount, 0) as readCount, + COALESCE(d.unreadCount, 0) as unReadCount, + COALESCE(b.comment, 0) as comment FROM work_log_instance_ext as a - LEFT JOIN work_log_comment as b ON a.id = b.work_log_id LEFT JOIN work_log_read as e ON a.id = e.log_instance_id and e.read_user_id = #{userId} - LEFT JOIN work_log_read as c ON a.id = c.log_instance_id and c.read_status = 1 - LEFT JOIN work_log_read as d ON a.id = d.log_instance_id and d.read_status = 0 + LEFT JOIN (SELECT log_instance_id, COUNT(log_instance_id) AS readCount FROM work_log_read where read_status = 1 GROUP BY log_instance_id ) AS c ON a.id = c.log_instance_id + LEFT JOIN (SELECT log_instance_id, COUNT(log_instance_id) AS unReadCount FROM work_log_read where read_status = 0 GROUP BY log_instance_id ) AS d ON a.id = d.log_instance_id + LEFT JOIN (SELECT work_log_id, COUNT(work_log_id) AS comment FROM work_log_comment GROUP BY work_log_id) AS b ON a.id = b.work_log_id and a.id = #{logId} @@ -147,7 +147,7 @@ and a.start_user_id = #{userId} - GROUP BY a.id,e.read_status + GROUP BY a.id, readStatus, readCount, unReadCount, comment ORDER BY a.create_time DESC \ No newline at end of file From 0249884e9600ac2cec4e7de5d121975b381a9a25 Mon Sep 17 00:00:00 2001 From: aikai Date: Mon, 15 Apr 2024 20:54:38 +0800 Subject: [PATCH 44/50] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E6=88=91=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E7=9A=84=E6=A8=A1=E7=89=88=E8=B0=83=E6=95=B4=20-=20?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E7=AD=9B=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../comment/WorkLogCommentServiceImpl.java | 6 ++- .../service/worklog/LogInstanceService.java | 16 ------- .../worklog/LogInstanceServiceImpl.java | 16 +------ .../worklog/LogStatisticsServiceImpl.java | 42 ++++++++----------- 4 files changed, 23 insertions(+), 57 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/comment/WorkLogCommentServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/comment/WorkLogCommentServiceImpl.java index 9edc4631..7f7d5086 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/comment/WorkLogCommentServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/comment/WorkLogCommentServiceImpl.java @@ -122,9 +122,11 @@ public class WorkLogCommentServiceImpl implements WorkLogCommentService { Long userId = WebFrameworkUtils.getLoginUserId(); CommentTypeCountVO vo = new CommentTypeCountVO(); Integer commentNum = Math.toIntExact(workLogCommentMapper.selectCount(new LambdaQueryWrapper() - .eq(WorkLogCommentDO::getUserId, userId))); + .eq(WorkLogCommentDO::getUserId, userId) + .eq(WorkLogCommentDO::getType, 0))); Integer replyNum = Math.toIntExact(workLogCommentMapper.selectCount(new LambdaQueryWrapper() - .eq(WorkLogCommentDO::getCommentUserId, userId))); + .eq(WorkLogCommentDO::getUserId, userId) + .eq(WorkLogCommentDO::getType, 1))); vo.setCommentNum(commentNum); vo.setReplyNum(replyNum); vo.setAllNum(commentNum + replyNum); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java index 5074e9f9..ca15f451 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java @@ -61,22 +61,6 @@ public interface LogInstanceService { */ List getDeptInfo(); - /** - * 获取我管理的日志列表(时间区间) - * - * @return - */ - List myManageLogInstanceByTimeRange(Long formId, Integer type, Date thisDate); - - /** - * 获取我管理的日志列表(时间区间) - * - * @param fromId - * @param beginTime - * @param endTime - * @return - */ - List myManageLogInstanceByTimeRange(Long fromId, Date beginTime, Date endTime); List getNeedWriteLogInstanceByTimeRange(Long fromId, List time, Long userId); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java index 884576d2..06aba662 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java @@ -1,6 +1,5 @@ package cn.iocoder.yudao.module.system.service.worklog; -import cn.hutool.core.date.DateUtil; import cn.hutool.json.JSONObject; import cn.iocoder.yudao.framework.common.util.date.DateUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; @@ -150,7 +149,7 @@ public class LogInstanceServiceImpl implements LogInstanceService { if (createReqVO.getType() == 1) { dateList.add(createReqVO.getTime()); - }else { + } else { String[] times = createReqVO.getTime().split(","); dateList = DateUtils.betweenDayStrList(times[0], times[1]); @@ -335,23 +334,12 @@ public class LogInstanceServiceImpl implements LogInstanceService { return logInstanceRespVO; } - @Override - public List 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 myManageLogInstanceByTimeRange(Long fromId, Date beginTime, Date endTime) { - return logInstanceMapper.myManageLogInstanceByTimeRange(fromId, beginTime, endTime); - } @Override public List getNeedWriteLogInstanceByTimeRange(Long fromId, List time, Long userId) { return logInstanceMapper.selectList(new LambdaQueryWrapper() .eq(LogInstanceDO::getFormId, fromId) .in(LogInstanceDO::getTime, time) - .eq(LogInstanceDO::getStartUserId, userId)); + .eq(userId != null, LogInstanceDO::getStartUserId, userId)); } } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsServiceImpl.java index 50c7991d..308ca0ca 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogStatisticsServiceImpl.java @@ -23,7 +23,6 @@ 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; @@ -108,57 +107,50 @@ public class LogStatisticsServiceImpl implements LogStatisticsService { Date thisDate = new Date(); - Date beginDate = DateUtil.beginOfDay(thisDate); - Date beginWeek = DateUtil.beginOfWeek(thisDate); + Date beginTime = null; + Date endTime = null; for (LogFormDO logFormDO : formList) { //拿到模版规则 LogRuleDO logRuleDO = ruleMap.get(logFormDO.getRuleId()); - //判断当前模版是什么类型 - 然后再做统计 - //查询日志实例表 关联日志模版使用者作为数据权限过滤 - List instanceDOS = logInstanceService.myManageLogInstanceByTimeRange(logFormDO.getId(), logRuleDO.getType(), thisDate); LogStatisticsModelVO vo = new LogStatisticsModelVO(); BeanUtil.copyProperties(logFormDO, vo); vo.setType(logRuleDO.getType()); //查询下应该提交多少日志实例 - 直接通过模版id查询使用表 Integer num = Math.toIntExact(logUseMapper.selectCount(new LambdaQueryWrapper() .eq(LogUseDO::getFormId, logFormDO.getId()))); + boolean flag = false; if (logRuleDO.getType() == 1 && StrUtil.isNotEmpty(logRuleDO.getWeekDays())) { // -- 判断今天是周几 和 需要提交的周做对比 int weekNum = ((DateUtil.dayOfWeekEnum(thisDate).getValue() - 1) == 0 ? 7 : (DateUtil.dayOfWeekEnum(thisDate).getValue() - 1)); List 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 = Math.max((num - onTimeNum - lateNum), 0); - //按天统计 - vo.setOnTimeNum(onTimeNum); - vo.setUnSubmittedNum(unSubmittedNum); - vo.setLateNum(lateNum); + // -- 判断今天是周几 和 需要提交的周做对比 + beginTime = DateUtil.beginOfDay(thisDate); + endTime = DateUtil.endOfDay(thisDate); + flag = true; vo.setCommitTimeRange("当天" + logRuleDO.getEndTime() + "截止提交"); } else { vo.setCommitTimeRange("当天不需要提交"); } } else if (logRuleDO.getType() == 2) { - // -- 拼接获取到结束时间 - Date endTime = DateUtils.buildWeekHHmmTime(logRuleDO.getEndTime()); - Date statisticalTime = DateUtils.buildWeekHHmmTime(logRuleDO.getStatisticalTime()); + beginTime = DateUtil.beginOfWeek(thisDate); + endTime = DateUtil.endOfWeek(thisDate); + flag = true; + vo.setCommitTimeRange("每周" + DateUtil.dayOfWeekEnum(endTime).toChinese() + (logRuleDO.getEndTime().split(",")[1]) + "截止提交"); + } + if (flag) { + List dateList = DateUtils.betweenDayList(beginTime, endTime); + List instanceDOS = logInstanceService.getNeedWriteLogInstanceByTimeRange(logFormDO.getId(), dateList, null); //按时提交数量 - Integer onTimeNum = Math.toIntExact(instanceDOS.stream().filter(a -> DateUtil.isIn(Date.from(a.getCreateTime().atZone(ZoneId.systemDefault()).toInstant()), beginWeek, endTime)).count()); + Integer onTimeNum = Math.toIntExact(instanceDOS.stream().filter(a -> a.getStatus() == 1).count()); //迟交数量 - Integer lateNum = Math.toIntExact(instanceDOS.stream().filter(a -> DateUtil.isIn(Date.from(a.getCreateTime().atZone(ZoneId.systemDefault()).toInstant()), endTime, statisticalTime)).count()); + Integer lateNum = Math.toIntExact(instanceDOS.stream().filter(a -> a.getStatus() == 2).count()); //未提交数量 Integer unSubmittedNum = Math.max((num - onTimeNum - lateNum), 0); //按天统计 vo.setOnTimeNum(onTimeNum); vo.setUnSubmittedNum(unSubmittedNum); vo.setLateNum(lateNum); - vo.setCommitTimeRange("每周" + DateUtil.dayOfWeekEnum(endTime).toChinese() + (logRuleDO.getEndTime().split(",")[1]) + "截止提交"); } list.add(vo); } From 09b24c99677be301a087c74e9f3c926bd97d170d Mon Sep 17 00:00:00 2001 From: aikai Date: Mon, 15 Apr 2024 21:39:09 +0800 Subject: [PATCH 45/50] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E6=8F=90=E4=BA=A4=E7=8A=B6=E6=80=81bug?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/framework/common/util/date/DateUtils.java | 13 +++++++++++++ .../service/worklog/LogInstanceServiceImpl.java | 10 ++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java index e9f8e911..11d0e724 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java @@ -265,4 +265,17 @@ public class DateUtils { } return list; } + + public static Date buildTimeYYYYMMddHHmm(String yyyy_MM_dd, String HH_mm) { + String[] yyyy_MM_dds = yyyy_MM_dd.split("-"); + String[] time = HH_mm.split(":"); + return buildTime(Integer.parseInt(yyyy_MM_dds[0]), Integer.parseInt(yyyy_MM_dds[1]), Integer.parseInt(yyyy_MM_dds[2]), + Integer.parseInt(time[0]), Integer.parseInt(time[1]), 0); + } + + public static Date buildTimeYYYYMMdd(String yyyy_MM_dd) { + String[] yyyy_MM_dds = yyyy_MM_dd.split("-"); + return buildTime(Integer.parseInt(yyyy_MM_dds[0]), Integer.parseInt(yyyy_MM_dds[1]), Integer.parseInt(yyyy_MM_dds[2]), + 0, 0, 0); + } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java index b1c18797..e28d5690 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.system.service.worklog; +import cn.hutool.core.date.DateUtil; import cn.hutool.json.JSONObject; import cn.iocoder.yudao.framework.common.util.date.DateUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; @@ -108,14 +109,15 @@ public class LogInstanceServiceImpl implements LogInstanceService { logInstance.setName(adminUserDO.getNickname() + "的" + logFormDo.getName()); // 插入提交状态 - Date endTime = null; Date thisDate = new Date(); if (logRuleDO.getType() == 1) { - endTime = DateUtils.buildHHmmTime(logRuleDO.getEndTime()); + Date endTime = DateUtils.buildTimeYYYYMMddHHmm(createReqVO.getTime(), logRuleDO.getEndTime()); + logInstance.setStatus(thisDate.getTime() < endTime.getTime() ? 1 : 2); } else { - endTime = DateUtils.buildWeekHHmmTime(logRuleDO.getEndTime()); + Date beginTime = DateUtil.beginOfWeek(thisDate); + Date endTime = DateUtils.buildWeekHHmmTime(logRuleDO.getEndTime()); + logInstance.setStatus(DateUtil.isIn(thisDate, beginTime, endTime) ? 1 : 2); } - logInstance.setStatus(thisDate.getTime() < endTime.getTime() ? 1 : 2); // 插入 logInstanceMapper.insert(logInstance); From e67c183dd55ab470fa3ec2634d521374b05d2670 Mon Sep 17 00:00:00 2001 From: furongxin <419481438@qq.com> Date: Mon, 15 Apr 2024 21:41:32 +0800 Subject: [PATCH 46/50] =?UTF-8?q?=E6=97=A5=E5=BF=97=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E8=80=85=E5=88=9B=E5=BB=BA=E6=97=B6=EF=BC=8C=E8=B7=B3=E8=BF=87?= =?UTF-8?q?=E5=8F=91=E8=B5=B7=E4=BA=BA=E6=9C=AC=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/rule/dept/DeptDataPermissionRule.java | 3 ++- .../datapermission/config/DataPermissionConfiguration.java | 5 +++++ .../module/system/service/worklog/LogReadServiceImpl.java | 4 +++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/main/java/cn/iocoder/yudao/framework/datapermission/core/rule/dept/DeptDataPermissionRule.java b/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/main/java/cn/iocoder/yudao/framework/datapermission/core/rule/dept/DeptDataPermissionRule.java index f33ae98c..7a66c670 100644 --- a/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/main/java/cn/iocoder/yudao/framework/datapermission/core/rule/dept/DeptDataPermissionRule.java +++ b/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/main/java/cn/iocoder/yudao/framework/datapermission/core/rule/dept/DeptDataPermissionRule.java @@ -60,7 +60,8 @@ public class DeptDataPermissionRule implements DataPermissionRule { private static final List LOW_POWER_TABLES = Arrays.asList( "bpm_process_instance_ext", "work_log_use", - "work_log_statistics" + "work_log_statistics", + "work_log_instance_ext" ); /** diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/DataPermissionConfiguration.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/DataPermissionConfiguration.java index 71931418..e0974311 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/DataPermissionConfiguration.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/DataPermissionConfiguration.java @@ -3,6 +3,7 @@ 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.module.system.dal.dataobject.worklog.LogInstanceDO; 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; @@ -22,10 +23,14 @@ public class DataPermissionConfiguration { rule.addDeptColumn(DeptDO.class, "id"); rule.addDeptColumn(LogUseDO.class, "use_user_dept"); rule.addDeptColumn(LogStatisticsDO.class, "dept_id"); + rule.addDeptColumn(LogInstanceDO.class, "dept_id"); + // user rule.addUserColumn(AdminUserDO.class, "id"); rule.addUserColumn(LogUseDO.class, "use_user_id"); rule.addUserColumn(LogStatisticsDO.class, "user_id"); + rule.addUserColumn(LogInstanceDO.class, "start_user_id"); + }; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogReadServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogReadServiceImpl.java index 57ce78bc..eb908e5d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogReadServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogReadServiceImpl.java @@ -35,7 +35,9 @@ public class LogReadServiceImpl implements LogReadService{ logReadDo.setLogInstanceId(logInstanceId); logReadDo.setStartUserId(startUserId); logReadDo.setReadUserDept(user.getDeptId()); - logReadDo.setReadUserId(user.getUserId()); + if (!user.getUserId().toString().equals(startUserId.toString())) { + logReadDo.setReadUserId(user.getUserId()); + } logReadDo.setReadStatus(0); return logReadDo; }) From a50b04c9ecd37c4ce3ab111b0751d03ea81807e3 Mon Sep 17 00:00:00 2001 From: aikai Date: Mon, 15 Apr 2024 22:13:03 +0800 Subject: [PATCH 47/50] =?UTF-8?q?=E8=AF=84=E8=AE=BA=E6=95=B0=E9=87=8Fbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/service/comment/WorkLogCommentServiceImpl.java | 3 ++- .../module/system/service/worklog/LogInstanceServiceImpl.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/comment/WorkLogCommentServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/comment/WorkLogCommentServiceImpl.java index 7f7d5086..6a4ccbe8 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/comment/WorkLogCommentServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/comment/WorkLogCommentServiceImpl.java @@ -125,7 +125,8 @@ public class WorkLogCommentServiceImpl implements WorkLogCommentService { .eq(WorkLogCommentDO::getUserId, userId) .eq(WorkLogCommentDO::getType, 0))); Integer replyNum = Math.toIntExact(workLogCommentMapper.selectCount(new LambdaQueryWrapper() - .eq(WorkLogCommentDO::getUserId, userId) + .and(a -> a.eq(WorkLogCommentDO::getUserId, userId) + .or().eq(WorkLogCommentDO::getCommentUserId, userId)) .eq(WorkLogCommentDO::getType, 1))); vo.setCommentNum(commentNum); vo.setReplyNum(replyNum); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java index e28d5690..ab6867ac 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java @@ -106,7 +106,7 @@ public class LogInstanceServiceImpl implements LogInstanceService { //设置日志类型 logInstance.setType(logRuleDO.getType()); //设置日志名称 - logInstance.setName(adminUserDO.getNickname() + "的" + logFormDo.getName()); + logInstance.setName(adminUserDO.getNickname() + createReqVO.getTime() + "的" + logFormDo.getName()); // 插入提交状态 Date thisDate = new Date(); From 887c9cfb6505066f7128fcc32238536566932466 Mon Sep 17 00:00:00 2001 From: aikai Date: Mon, 15 Apr 2024 22:45:07 +0800 Subject: [PATCH 48/50] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E7=94=9F=E4=BA=A7?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E4=B8=8A=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-prod.yaml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/application-prod.yaml b/yudao-module-system/yudao-module-system-biz/src/main/resources/application-prod.yaml index dbaa7f96..aed35429 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/application-prod.yaml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/application-prod.yaml @@ -90,12 +90,19 @@ spring: xxl: job: - enabled: false # 是否开启调度中心,默认为 true 开启 + enabled: true # 是否开启调度中心,默认为 true 开启 admin: addresses: http://127.0.0.1:9090/xxl-job-admin # 调度中心部署跟地址 - + executor: + appname: ${spring.application.name} # 执行器 AppName + ip: # 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务"; + port: 6666 # ### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口; + logpath: ${user.home}/logs/xxl-job/${spring.application.name} # 执行器运行日志文件存储磁盘路径 # 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径; + #accessToken: default_token + logretentiondays: 30 # 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能; --- #################### 服务保障相关配置 #################### + # Lock4j 配置项 lock4j: acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒 From f8dc5895f22491f0351c725dc3ebd0535587df9b Mon Sep 17 00:00:00 2001 From: furongxin <419481438@qq.com> Date: Mon, 15 Apr 2024 23:33:55 +0800 Subject: [PATCH 49/50] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=9D=83=E9=99=90?= =?UTF-8?q?=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/controller/admin/worklog/LogRuleController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogRuleController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogRuleController.java index e270f277..6d173570 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogRuleController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogRuleController.java @@ -84,7 +84,6 @@ public class LogRuleController { @GetMapping("/get-userInfo") @Operation(summary = "获得规则内模板使用者信息") @Parameter(name = "formId", description = "模板编号", required = true, example = "1") - @PreAuthorize("@ss.hasPermission('system:log-rule:query')") public CommonResult> getLogUseInfo(@RequestParam("formId") Long formId) { //获取模板使用者部门编号组 From 718ee116f61bb5afeccd0d65eeda96b0f0ccfbb2 Mon Sep 17 00:00:00 2001 From: furongxin <419481438@qq.com> Date: Tue, 16 Apr 2024 00:54:07 +0800 Subject: [PATCH 50/50] =?UTF-8?q?=E6=97=A5=E5=BF=97=E6=A8=A1=E6=9D=BF=20?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E3=80=81=E5=88=A0=E9=99=A4=20=20=E5=90=8C?= =?UTF-8?q?=E6=97=B6=E5=85=B3=E8=81=94=E8=A7=84=E5=88=99=E8=A1=A8=E5=92=8C?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E8=80=85=E8=A1=A8=20=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/worklog/vo/rule/LogRuleRespVO.java | 3 +++ .../system/service/worklog/LogFormServiceImpl.java | 6 ++++++ .../system/service/worklog/LogRuleService.java | 7 +++++++ .../system/service/worklog/LogRuleServiceImpl.java | 14 ++++++++++++-- .../system/service/worklog/LogUseService.java | 6 ++++++ .../system/service/worklog/LogUseServiceImpl.java | 6 ++++++ 6 files changed, 40 insertions(+), 2 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/rule/LogRuleRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/rule/LogRuleRespVO.java index d28d90a0..0494cd96 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/rule/LogRuleRespVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/rule/LogRuleRespVO.java @@ -16,6 +16,9 @@ public class LogRuleRespVO { @ExcelProperty("编号") private Long id; + @Schema(description = "日志模板编号", example = "2") + private Long formId; + @Schema(description = "日志类型 字典值 详情参考work_log_type", example = "2") @ExcelProperty("日志类型") private Integer type; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogFormServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogFormServiceImpl.java index fcb6d577..e8f71652 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogFormServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogFormServiceImpl.java @@ -68,6 +68,12 @@ public class LogFormServiceImpl implements LogFormService { this.validateFormExists(id); // 删除 formMapper.deleteById(id); + + //同步删除规则 + logRuleService.deleteLogRuleByFormId(id); + + //同步删除模板使用者 + logUseService.deletByFormId(id); } private void validateFormExists(Long id) { diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleService.java index ccd7727c..13f87aec 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleService.java @@ -37,6 +37,13 @@ public interface LogRuleService { */ void deleteLogRule(Long id); + /** + * 删除日志规则 + * + * @param formId 模板编号 + */ + void deleteLogRuleByFormId(Long formId); + /** * 获得日志规则 * diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java index 456ac625..e5584227 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java @@ -58,8 +58,8 @@ public class LogRuleServiceImpl implements LogRuleService { //把规则编号更新至日志模板表中 LogFormDO updateObj = new LogFormDO(); - updateObj.setId(createReqVO.getFormId()); - updateObj.setRuleId(createReqVO.getId()); + updateObj.setId(logRule.getFormId()); + updateObj.setRuleId(logRule.getId()); logFormMapper.updateById(updateObj); // 返回 @@ -96,6 +96,16 @@ public class LogRuleServiceImpl implements LogRuleService { logRuleMapper.deleteById(id); } + @Override + public void deleteLogRuleByFormId(Long formId) { + + if (logRuleMapper.selectCount(LogRuleDO::getFormId, formId) > 0L) { + + //删除规则 + logRuleMapper.delete(LogRuleDO::getFormId, formId); + } + } + private void validateLogRuleExists(Long id) { if (logRuleMapper.selectById(id) == null) { throw exception(LOG_RULE_NOT_EXISTS); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseService.java index a1941c09..d4f93f23 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseService.java @@ -56,4 +56,10 @@ public interface LogUseService { * @return 日志模板编号组 */ List getFormIdByUserId(Long userId); + + /** + * 删除使用者 + * @param formId 模板编号 + */ + void deletByFormId(Long formId); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseServiceImpl.java index b6e7150f..cef46aea 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseServiceImpl.java @@ -87,4 +87,10 @@ public class LogUseServiceImpl implements LogUseService { List logUseDOS = logUseMapper.selectList(LogUseDO::getUseUserId, userId); return convertList(logUseDOS, LogUseDO::getFormId); } + + @Override + public void deletByFormId(Long formId) { + + logUseMapper.delete(LogUseDO::getFormId, formId); + } } \ No newline at end of file