From 6557d6b502ef7cd9566196af2b17bde76de321e3 Mon Sep 17 00:00:00 2001 From: aikai Date: Fri, 14 Jun 2024 12:05:44 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E6=9B=B4=E6=8D=A2=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=AF=8F=E5=B9=B4=E8=8A=82=E5=81=87=E6=97=A5=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/attendance/AttendanceServiceImpl.java | 14 +++++++++++--- .../admin/factoryinfo/vo/FactoryInfoSaveReqVO.java | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) 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 index ce5899da..a9184eb6 100644 --- 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 @@ -214,10 +214,17 @@ public class AttendanceServiceImpl implements AttendanceService { Boolean flag = stringRedisTemplate.hasKey(key); // 缓存不存在 if (Boolean.FALSE.equals(flag)) { - String url = "https://cdn.jsdelivr.net/gh/NateScarlet/holiday-cn@master/" + year + ".json"; - String json = HttpUtil.get(url, 0); + String url = "https://timor.tech/api/holiday/year/" + year; + String json = HttpUtil.get(url, 3000); + Map map = new HashMap<>(); JSONObject jsonObject = JSONUtil.parseObj(json); - Map map = jsonObject.getBeanList("days", HolidayVO.class).stream().collect(Collectors.toMap(HolidayVO::getDate, HolidayVO::getIsOffDay)); + Object o = jsonObject.get("holiday"); + //将o转为json对象并且循环获取对象中所有的属性 + JSONObject data = JSONUtil.parseObj(o); + data.forEach((k, v) -> { + JSONObject item = JSONUtil.parseObj(v); + map.put(item.get("date").toString(), item.get("isOffDay").toString()); + }); stringRedisTemplate.opsForHash().putAll(key, map); // -- 删除去年的 String lastKey = "holiday_" + (Integer.parseInt(year) - 1); @@ -756,6 +763,7 @@ public class AttendanceServiceImpl implements AttendanceService { // 导出 Excel // ExcelUtils.write(response, "考勤组人员.xls", "数据", AttendanceGroupUserRespVO.class, // BeanUtils.toBean(list, AttendanceGroupUserRespVO.class)); + } /** diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factoryinfo/vo/FactoryInfoSaveReqVO.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factoryinfo/vo/FactoryInfoSaveReqVO.java index 73a39144..19716512 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factoryinfo/vo/FactoryInfoSaveReqVO.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factoryinfo/vo/FactoryInfoSaveReqVO.java @@ -63,7 +63,7 @@ public class FactoryInfoSaveReqVO { private BigDecimal lat; @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "状态不能为空") +// @NotNull(message = "状态不能为空") private Integer status; @Schema(description = "负责人编号", example = "126") From 9fd8c803ffb15aa0bb9d76ca502cdfc5c2e64d85 Mon Sep 17 00:00:00 2001 From: aikai Date: Fri, 14 Jun 2024 17:10:06 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/job/equipment/AttendanceMachineJob.java | 12 +++++------- .../service/attendance/AttendanceServiceImpl.java | 2 +- .../equipment/AttendanceMachineServiceImpl.java | 9 ++++----- .../main/resources/mapper/assets/AssetsMapper.xml | 1 + 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/equipment/AttendanceMachineJob.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/equipment/AttendanceMachineJob.java index 470824dd..e09854e8 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/equipment/AttendanceMachineJob.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/equipment/AttendanceMachineJob.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.system.job.equipment; +import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.tenant.core.job.TenantJob; import cn.iocoder.yudao.framework.websocket.core.session.WebSocketSessionManager; import cn.iocoder.yudao.module.system.dal.dataobject.equipment.AttendanceMachineDO; @@ -32,18 +33,15 @@ public class AttendanceMachineJob { // 获得所有在线的设备 List attendanceMachineDOS = attendanceMachineService.getListByStatus(); for (AttendanceMachineDO reqDO : attendanceMachineDOS) { - // redis数据不存在,则为离线状态 - if (stringRedisTemplate.opsForValue().get(reqDO.getDeviceNo()) == null) { - + String data = stringRedisTemplate.opsForValue().get(reqDO.getDeviceNo()); + if (StrUtil.isEmpty(data)) { attendanceMachineService.updateAttendanceMachineStatus(reqDO.getDeviceNo(), 0, null); - //同步 删除对应sessionId WebSocketSessionManager webSocketSessionManager = SpringContentUtils.getBean(WebSocketSessionManager.class); webSocketSessionManager.removeSession(webSocketSessionManager.getSessionByDeviceNum(reqDO.getDeviceNo())); - }else { - - attendanceMachineService.updateAttendanceMachineStatus(reqDO.getDeviceNo(), 1, stringRedisTemplate.opsForValue().get(reqDO.getDeviceNo())); + } else { + attendanceMachineService.updateAttendanceMachineStatus(reqDO.getDeviceNo(), 1, data); } } } 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 index a9184eb6..65f96213 100644 --- 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 @@ -223,7 +223,7 @@ public class AttendanceServiceImpl implements AttendanceService { JSONObject data = JSONUtil.parseObj(o); data.forEach((k, v) -> { JSONObject item = JSONUtil.parseObj(v); - map.put(item.get("date").toString(), item.get("isOffDay").toString()); + map.put(item.get("date").toString(), item.get("holiday").toString()); }); stringRedisTemplate.opsForHash().putAll(key, map); // -- 删除去年的 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/equipment/AttendanceMachineServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/equipment/AttendanceMachineServiceImpl.java index ea195af1..0b5fd591 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/equipment/AttendanceMachineServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/equipment/AttendanceMachineServiceImpl.java @@ -111,10 +111,9 @@ public class AttendanceMachineServiceImpl implements AttendanceMachineService { @Override public void updateAttendanceMachineStatus(String deviceNo, Integer status, String dateTime) { - AttendanceMachineDO updateDO = new AttendanceMachineDO(); updateDO.setStatus(status); - updateDO.setUpdater(getLoginUserId().toString()); +// updateDO.setUpdater(getLoginUserId().toString()); if (status == 1) { updateDO.setRequestTime(LocalDateTime.parse(dateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); } @@ -130,7 +129,7 @@ public class AttendanceMachineServiceImpl implements AttendanceMachineService { if (attendanceMachineDO == null) { throw exception(ATTENDANCE_MACHINE_NOT_EXISTS); - }else { + } else { if (!passwordEncoder.matches(updateReqVO.getOldPassword(), attendanceMachineDO.getPassword())) { @@ -221,7 +220,7 @@ public class AttendanceMachineServiceImpl implements AttendanceMachineService { deviceNo = new ArrayList<>(); deviceNo.add(addReqVO.getDeviceNo()); - }else { + } else { if (!deviceNo.contains(addReqVO.getDeviceNo())) { @@ -232,7 +231,7 @@ public class AttendanceMachineServiceImpl implements AttendanceMachineService { //设备 用户绑定设备 data.setAttendanceMachineNos(deviceNo); }); - }else if (addReqVO.getMethod() == 1) { + } else if (addReqVO.getMethod() == 1) { usersExtDO.forEach(data -> { diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/assets/AssetsMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/assets/AssetsMapper.xml index 72ecab67..a35bc8f1 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/assets/AssetsMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/assets/AssetsMapper.xml @@ -35,6 +35,7 @@ SELECT a.id, a.util, + a.assets_no, a.item_json, a.name, a.amount, From d0d4c37fddaceaaf984aff6684b3ddedad3ec1fd Mon Sep 17 00:00:00 2001 From: aikai Date: Mon, 17 Jun 2024 09:58:25 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E8=BF=94=E5=9B=9E=E8=80=83=E5=8B=A4?= =?UTF-8?q?=E7=BB=84id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/attendance/vo/AttendancePunchPageVO.java | 2 ++ .../attendance/fixed/AttendanceFixedServiceImpl.java | 1 + .../groupshift/AttendanceGroupShiftServiceImpl.java | 6 +++++- .../groupuser/AttendanceGroupUserServiceImpl.java | 6 +++++- .../scheduling/AttendanceSchedulingServiceImpl.java | 1 + 5 files changed, 14 insertions(+), 2 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/attendance/vo/AttendancePunchPageVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/attendance/vo/AttendancePunchPageVO.java index 501265cb..c691ebd6 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/attendance/vo/AttendancePunchPageVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/attendance/vo/AttendancePunchPageVO.java @@ -13,6 +13,8 @@ import java.util.List; @Data @Accessors(chain = true) public class AttendancePunchPageVO { + @Schema(description = "考勤组id") + private Long attendanceGroupId; @Schema(description = "是否在考勤组 0否 1是") private Integer inGroup = 1; @Schema(description = "当天是否需要考勤 0否 1是") diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/fixed/AttendanceFixedServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/fixed/AttendanceFixedServiceImpl.java index 1724b30c..9c77f431 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/fixed/AttendanceFixedServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/fixed/AttendanceFixedServiceImpl.java @@ -234,6 +234,7 @@ public class AttendanceFixedServiceImpl implements AttendanceFixedService, Punch } vo.setAttendanceGroupShiftId(attendanceFixedDO.getAttendanceGroupShiftId()); attendanceService.calculatePunch(dto, vo); + vo.setAttendanceGroupId(activationGroup.getId()); return vo; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/groupshift/AttendanceGroupShiftServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/groupshift/AttendanceGroupShiftServiceImpl.java index 9661327f..5e721f16 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/groupshift/AttendanceGroupShiftServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/groupshift/AttendanceGroupShiftServiceImpl.java @@ -21,6 +21,7 @@ import cn.iocoder.yudao.module.system.dal.mysql.attendance.groupshiftitem.Attend import cn.iocoder.yudao.module.system.dal.mysql.attendance.punchrecord.AttendancePunchRecordMapper; import cn.iocoder.yudao.module.system.dal.mysql.attendance.scheduling.AttendanceSchedulingMapper; import cn.iocoder.yudao.module.system.service.attendance.group.AttendanceGroupService; +import cn.iocoder.yudao.module.system.service.attendance.punch.dto.AttendanceOnTheDayDTO; import cn.iocoder.yudao.module.system.service.attendance.punchrecord.AttendancePunchRecordService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.springframework.context.annotation.Lazy; @@ -248,7 +249,10 @@ public class AttendanceGroupShiftServiceImpl implements AttendanceGroupShiftServ // -- 删除当前考勤组预留的考勤记录 attendancePunchRecordMapper.delete(new LambdaQueryWrapper() .in(AttendancePunchRecordDO::getAttendanceGroupId, groupIds) - .eq(AttendancePunchRecordDO::getNextDayFlag, Constants.TRUE)); + .and(a -> a.eq(AttendancePunchRecordDO::getNextDayFlag, Constants.TRUE) + .or() + .eq(AttendancePunchRecordDO::getStatus, AttendanceOnTheDayDTO.PUNCH_STATUS_UN_PUNCH)) + ); // -- 重新计算 - 插入到redis 和数据中 attendancePunchRecordService.defaultPersistence(groupIds, LocalDateTime.now()); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/groupuser/AttendanceGroupUserServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/groupuser/AttendanceGroupUserServiceImpl.java index c9dc3053..e207e5f5 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/groupuser/AttendanceGroupUserServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/groupuser/AttendanceGroupUserServiceImpl.java @@ -12,6 +12,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupuser.Attend import cn.iocoder.yudao.module.system.dal.dataobject.attendance.punchrecord.AttendancePunchRecordDO; import cn.iocoder.yudao.module.system.dal.mysql.attendance.groupuser.AttendanceGroupUserMapper; import cn.iocoder.yudao.module.system.dal.mysql.attendance.punchrecord.AttendancePunchRecordMapper; +import cn.iocoder.yudao.module.system.service.attendance.punch.dto.AttendanceOnTheDayDTO; import cn.iocoder.yudao.module.system.service.attendance.punchrecord.AttendancePunchRecordService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.springframework.data.redis.core.StringRedisTemplate; @@ -130,7 +131,10 @@ public class AttendanceGroupUserServiceImpl implements AttendanceGroupUserServic attendancePunchRecordMapper.delete(new LambdaQueryWrapper() .eq(AttendancePunchRecordDO::getAttendanceGroupId, vo.getAttendanceGroupId()) .in(AttendancePunchRecordDO::getUserId, vo.getDelUserIds()) - .eq(AttendancePunchRecordDO::getNextDayFlag, Constants.TRUE)); + .and(a -> a.eq(AttendancePunchRecordDO::getNextDayFlag, Constants.TRUE) + .or() + .eq(AttendancePunchRecordDO::getStatus, AttendanceOnTheDayDTO.PUNCH_STATUS_UN_PUNCH)) + ); } if (CollectionUtil.isNotEmpty(vo.getSaveUserIds())) { attendancePunchRecordService.defaultPersistence(vo.getAttendanceGroupId(), vo.getSaveUserIds(), LocalDateTime.now()); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/scheduling/AttendanceSchedulingServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/scheduling/AttendanceSchedulingServiceImpl.java index 2d2200b2..30129fd7 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/scheduling/AttendanceSchedulingServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/scheduling/AttendanceSchedulingServiceImpl.java @@ -229,6 +229,7 @@ public class AttendanceSchedulingServiceImpl implements AttendanceSchedulingServ } vo.setAttendanceGroupShiftId(attendanceSchedulingDO.getAttendanceGroupShiftId()); attendanceService.calculatePunch(dto, vo); + vo.setAttendanceGroupId(activationGroup.getId()); return vo; } From 880e653979a4ad277952339fdfb27db399338ab8 Mon Sep 17 00:00:00 2001 From: aikai Date: Tue, 18 Jun 2024 11:05:07 +0800 Subject: [PATCH 4/6] =?UTF-8?q?rpc=E8=BF=9C=E7=A8=8B=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E6=97=A0token=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/iocoder/yudao/module/infra/api/config/ConfigApi.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/api/config/ConfigApi.java b/yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/api/config/ConfigApi.java index faabaff0..4ceb4459 100644 --- a/yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/api/config/ConfigApi.java +++ b/yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/api/config/ConfigApi.java @@ -9,6 +9,8 @@ import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; +import javax.annotation.security.PermitAll; + @FeignClient(name = ApiConstants.NAME) // TODO 芋艿:fallbackFactory = @Tag(name = "RPC 服务 - 文件") public interface ConfigApi { @@ -18,6 +20,7 @@ public interface ConfigApi { @GetMapping(value = "/get-value-by-key") @Operation(summary = "根据参数键名查询参数值", description = "不可见的配置,不允许返回给前端") @Parameter(name = "key", description = "参数键", required = true, example = "yunai.biz.username") + @PermitAll CommonResult getConfigKey(@RequestParam("key") String key); } From c1b3031691ed02e1a0e896bda45afd4a97a6164e Mon Sep 17 00:00:00 2001 From: aikai Date: Wed, 19 Jun 2024 18:32:03 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E8=80=83=E5=8B=A4=E6=89=93=E5=8D=A1?= =?UTF-8?q?=E6=8F=90=E9=86=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rule/dept/DeptDataPermissionRule.java | 3 +- .../subscribe/SubscribeMessageSendApi.java | 6 + .../SubscribeMessageSendApiImpl.java | 12 ++ .../admin/assets/AssetsController.java | 1 - .../assets/AssetsSecondmentController.java | 1 - .../attendance/dto/AttendanceWorkDTO.java | 16 +++ .../punchrecord/AttendancePunchRecordDO.java | 5 + .../config/DataPermissionConfiguration.java | 3 +- .../system/job/attendance/RemindJob.java | 131 ++++++++++++++++++ .../DeptAssetsInOutStockServiceImpl.java | 7 +- .../AttendancePunchRecordService.java | 15 ++ .../AttendancePunchRecordServiceImpl.java | 15 ++ .../resources/mapper/assets/AssetsMapper.xml | 3 + 13 files changed, 210 insertions(+), 8 deletions(-) create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/attendance/dto/AttendanceWorkDTO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/attendance/RemindJob.java 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 12af2492..26f2e746 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 @@ -62,7 +62,8 @@ public class DeptDataPermissionRule implements DataPermissionRule { "work_log_use", "work_log_statistics", "work_log_instance_ext", - "bpm_oa_work_task" + "bpm_oa_work_task", + "zc_dept_assets" ); /** diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/subscribe/SubscribeMessageSendApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/subscribe/SubscribeMessageSendApi.java index 76ac304e..168b36bf 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/subscribe/SubscribeMessageSendApi.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/subscribe/SubscribeMessageSendApi.java @@ -9,6 +9,8 @@ import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import java.util.List; + @FeignClient(name = ApiConstants.NAME) // TODO 芋艿:fallbackFactory = @Tag(name = "RPC 服务 - 微信小程序订阅消息发送") public interface SubscribeMessageSendApi { @@ -30,4 +32,8 @@ public interface SubscribeMessageSendApi { @PostMapping(PREFIX + "/send-worklog-comment") @Operation(summary = "发送日志评论、回复通知") CommonResult sendWorkLogComment(@RequestBody SubscribeMessageReqDTO reqDTO); + + @PostMapping(PREFIX + "/send-punch-reminder") + @Operation(summary = "发送打卡提醒通知") + CommonResult sendPunchReminder(@RequestBody SubscribeMessageReqDTO reqDTO); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/subscribe/SubscribeMessageSendApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/subscribe/SubscribeMessageSendApiImpl.java index 9cd4230c..ee834d52 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/subscribe/SubscribeMessageSendApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/subscribe/SubscribeMessageSendApiImpl.java @@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.system.api.subscribe.dto.MsgData; import cn.iocoder.yudao.module.system.api.subscribe.dto.SubscribeMessageReqDTO; import cn.iocoder.yudao.module.system.service.social.SocialClientService; import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RestController; @@ -22,6 +23,7 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; */ @RestController // 提供 RESTful API 接口,给 Feign 调用 @Validated +@Slf4j public class SubscribeMessageSendApiImpl implements SubscribeMessageSendApi { @Resource @@ -55,6 +57,16 @@ public class SubscribeMessageSendApiImpl implements SubscribeMessageSendApi { return success(1L); } + @Override + public CommonResult sendPunchReminder(SubscribeMessageReqDTO reqDTO) { + try { + socialClientService.getWxMaService().getMsgService().sendSubscribeMsg(initWxMaSubscribeMessage(reqDTO)); + } catch (Exception e) { + log.error("当前用户没有订阅考勤消息:{}", reqDTO.getToUser()); + } + return success(1L); + } + private WxMaSubscribeMessage initWxMaSubscribeMessage(SubscribeMessageReqDTO reqDTO) { WxMaSubscribeMessage message = WxMaSubscribeMessage.builder() .toUser(reqDTO.getToUser()) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/assets/AssetsController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/assets/AssetsController.java index c6ce3d25..95a4fa9b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/assets/AssetsController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/assets/AssetsController.java @@ -73,7 +73,6 @@ public class AssetsController { @GetMapping("/page") @Operation(summary = "获得资产分页") - @PreAuthorize("@ss.hasPermission('system:assets:query')") public CommonResult> getAssetsPage(@Valid AssetsPageReqVO pageReqVO) { PageResult pageResult = assetsService.getAssetsPage(pageReqVO); return success(BeanUtils.toBean(pageResult, AssetsRespVO.class)); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/assets/AssetsSecondmentController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/assets/AssetsSecondmentController.java index 20e2e58f..394c3fc6 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/assets/AssetsSecondmentController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/assets/AssetsSecondmentController.java @@ -81,7 +81,6 @@ public class AssetsSecondmentController { @GetMapping("/page") @Operation(summary = "获得资产借调分页") - @PreAuthorize("@ss.hasPermission('system:assets-secondment:query')") public CommonResult> getAssetsSecondmentPage(@Valid AssetsSecondmentPageReqVO pageReqVO) { PageResult pageResult = assetsSecondmentService.getAssetsSecondmentPage(pageReqVO); return success(BeanUtils.toBean(pageResult, AssetsSecondmentRespVO.class)); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/attendance/dto/AttendanceWorkDTO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/attendance/dto/AttendanceWorkDTO.java new file mode 100644 index 00000000..fb858b94 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/attendance/dto/AttendanceWorkDTO.java @@ -0,0 +1,16 @@ +package cn.iocoder.yudao.module.system.controller.admin.attendance.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +public class AttendanceWorkDTO { + + @Schema(description = "上下班") + private String workTypeStr; + + @Schema(description = "内容") + private String data; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/attendance/punchrecord/AttendancePunchRecordDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/attendance/punchrecord/AttendancePunchRecordDO.java index 59ca236d..fb868541 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/attendance/punchrecord/AttendancePunchRecordDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/attendance/punchrecord/AttendancePunchRecordDO.java @@ -124,4 +124,9 @@ public class AttendancePunchRecordDO extends BaseDO { * 早退时长时间戳 */ private Long leaveEarlyTime; + + /** + * 是否已提醒 0否 1是 + */ + private Integer remindFlag; } \ 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 e0974311..0479381b 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,6 +1,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.assets.DeptAssetsDO; 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; @@ -24,13 +25,13 @@ public class DataPermissionConfiguration { rule.addDeptColumn(LogUseDO.class, "use_user_dept"); rule.addDeptColumn(LogStatisticsDO.class, "dept_id"); rule.addDeptColumn(LogInstanceDO.class, "dept_id"); + rule.addDeptColumn(DeptAssetsDO.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/job/attendance/RemindJob.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/attendance/RemindJob.java new file mode 100644 index 00000000..dd76e053 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/attendance/RemindJob.java @@ -0,0 +1,131 @@ +package cn.iocoder.yudao.module.system.job.attendance; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.BetweenFormatter; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.common.Constants; +import cn.iocoder.yudao.framework.tenant.core.job.TenantJob; +import cn.iocoder.yudao.module.system.api.subscribe.SubscribeMessageSendApi; +import cn.iocoder.yudao.module.system.api.subscribe.dto.MsgData; +import cn.iocoder.yudao.module.system.api.subscribe.dto.SubscribeMessageReqDTO; +import cn.iocoder.yudao.module.system.controller.admin.attendance.dto.AttendanceWorkDTO; +import cn.iocoder.yudao.module.system.dal.dataobject.attendance.punchrecord.AttendancePunchRecordDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; +import cn.iocoder.yudao.module.system.service.attendance.punchrecord.AttendancePunchRecordService; +import cn.iocoder.yudao.module.system.service.user.AdminUserService; +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.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Component +@Slf4j +public class RemindJob { + @Resource + private AttendancePunchRecordService attendancePunchRecordService; + @Resource + private SubscribeMessageSendApi subscribeMessageSendApi; + @Resource + private AdminUserService adminUserService; + + // TODO: 2024/4/22 - 考勤提醒 每10分钟执行一次 + @XxlJob("remindJob") + @TenantJob // --- ⚠️ 这个注解 会将租户列表拉出来 完了后逐个租户执行 定时任务需要注意 + public ReturnT execute() throws Exception { + // -- 获取当天以及明天的未打卡并且未提醒记录 + //未提醒列表 + LocalDateTime localDateTime = LocalDateTime.now(); + LocalDateTime futureTime = localDateTime.plusMinutes(15); + + List attendancePunchRecordDOS = attendancePunchRecordService.getNotReminded(localDateTime); + if (attendancePunchRecordDOS.isEmpty()) { + return ReturnT.SUCCESS; + } + + //还有10分钟就要上班了,别忘记打卡哦~ + //幸苦一天了,研发部全体人员提醒您,记得打卡哦~ + + Map map = new HashMap<>(); + //打卡时间 - 15分钟之后是否是 大于打卡时间 - 是的话 - 把用户id拿出来 组装好消息发送 + List editList = new ArrayList<>(); + for (AttendancePunchRecordDO attendancePunchRecordDO : attendancePunchRecordDOS) { + if (attendancePunchRecordDO.getWorkType().equals(Constants.ZERO) && futureTime.isAfter(attendancePunchRecordDO.getShouldPunchTime())) { + AttendanceWorkDTO dto = new AttendanceWorkDTO(); + dto.setWorkTypeStr("上班打卡"); + dto.setData(String.format("还有%s分钟就要上班了,别忘记打卡哦~", + DateUtil.formatBetween(LocalDateTimeUtil.between(localDateTime, attendancePunchRecordDO.getShouldPunchTime()).toMillis(), BetweenFormatter.Level.MINUTE))); + map.put(attendancePunchRecordDO.getUserId(), dto); + attendancePunchRecordDO.setRemindFlag(Constants.TRUE); + editList.add(attendancePunchRecordDO); + } else if (attendancePunchRecordDO.getWorkType().equals(Constants.ONE) && localDateTime.isAfter(attendancePunchRecordDO.getShouldPunchTime())) { + AttendanceWorkDTO dto = new AttendanceWorkDTO(); + dto.setWorkTypeStr("下班打卡"); + dto.setData("工作幸苦了,记得打卡哦~"); + map.put(attendancePunchRecordDO.getUserId(), dto); + attendancePunchRecordDO.setRemindFlag(Constants.TRUE); + editList.add(attendancePunchRecordDO); + } + } + //获取到所有的用户id + if (MapUtil.isEmpty(map)) { + return ReturnT.SUCCESS; + } + List userIds = new ArrayList<>(map.keySet()); + List userList = adminUserService.getUserList(userIds); + List users = userList.stream().filter(a -> StrUtil.isNotEmpty(a.getOpenId())).collect(Collectors.toList()); + String templateId = "5yHyXhrsyqXi8s4hYhvaeMtz9kT5OPvDCe3h6G1T-OE"; + List dtos = new ArrayList<>(); + for (AdminUserDO user : users) { + AttendanceWorkDTO attendanceWorkDTO = map.get(user.getId()); + SubscribeMessageReqDTO dto = new SubscribeMessageReqDTO(); + dto.setToUser(user.getOpenId()); + dto.setTemplateId(templateId); + MsgData data = new MsgData(); + data.setName("thing9"); + data.setValue(attendanceWorkDTO.getWorkTypeStr()); + dto.addData(data); + data = new MsgData(); + data.setName("thing6"); + data.setValue(attendanceWorkDTO.getData()); + dto.addData(data); + dto.setPage("subPages/attendance/index"); + dtos.add(dto); + } + if (CollectionUtil.isNotEmpty(dtos)) { + for (SubscribeMessageReqDTO dto : dtos) { + subscribeMessageSendApi.sendPunchReminder(dto); + } + } + if (CollectionUtil.isNotEmpty(editList)) { + attendancePunchRecordService.batchUpdate(editList); + } + // 返回执行成功 + return ReturnT.SUCCESS; + } + + +} + + + + + + + + + + + + + diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/assets/DeptAssetsInOutStockServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/assets/DeptAssetsInOutStockServiceImpl.java index f2e773d3..03498a57 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/assets/DeptAssetsInOutStockServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/assets/DeptAssetsInOutStockServiceImpl.java @@ -112,11 +112,10 @@ public class DeptAssetsInOutStockServiceImpl implements DeptAssetsInOutStockServ // - 如果是部门入库 则更新该部门的资产 List stockSaveReqVOS = inOutStockByDeptMap.get(vo.getInDeptId()); if (!stockSaveReqVOS.isEmpty()) { - Integer num = 0; - for (DeptAssetsInOutStockSaveReqVO stockSaveReqVO : stockSaveReqVOS) { - num += stockSaveReqVO.getNum(); + Map stockSaveMaps = stockSaveReqVOS.stream().collect(Collectors.groupingBy(DeptAssetsInOutStockSaveReqVO::getAssetsId, Collectors.summingInt(DeptAssetsInOutStockSaveReqVO::getNum))); + for (Map.Entry entry : stockSaveMaps.entrySet()) { + deptInStockMap.put(vo.getInDeptId() + "_" + entry.getKey(), entry.getValue()); } - deptInStockMap.put(vo.getInDeptId() + "_" + vo.getAssetsId(), num); } } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/punchrecord/AttendancePunchRecordService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/punchrecord/AttendancePunchRecordService.java index c394ec2b..ad63bb6d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/punchrecord/AttendancePunchRecordService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/punchrecord/AttendancePunchRecordService.java @@ -68,6 +68,7 @@ public interface AttendancePunchRecordService { /** * 预设考勤 + * * @param groupId * @param userIds * @param localDateTime @@ -96,4 +97,18 @@ public interface AttendancePunchRecordService { */ void defaultPersistence(Map map, Map groupMap, Map> groupUserMap, Map> itemMaps, String time, LocalDateTime localDateTime); + + /** + * 获取未提醒列表 获取当天的未打卡并且未提醒记录 + * + * @return + */ + List getNotReminded(LocalDateTime localDateTime); + + /** + * 批量更新 + * + * @param editList + */ + void batchUpdate(List editList); } \ 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/punchrecord/AttendancePunchRecordServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/punchrecord/AttendancePunchRecordServiceImpl.java index d74eeb17..fa415ef5 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/punchrecord/AttendancePunchRecordServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/punchrecord/AttendancePunchRecordServiceImpl.java @@ -153,6 +153,7 @@ public class AttendancePunchRecordServiceImpl implements AttendancePunchRecordSe } this.defaultPersistence(attendanceGroupDOS, attendanceGroupUserDOS, localDateTime); } + @Override public void defaultPersistence(List attendanceGroupDOS, List attendanceGroupUserDOS, LocalDateTime localDateTime) { // 获取所有考勤组 @@ -231,6 +232,20 @@ public class AttendancePunchRecordServiceImpl implements AttendancePunchRecordSe this.saveBatch(attendancePunchRecordDOList); } + @Override + public List getNotReminded(LocalDateTime localDateTime) { + String targetDayStr = localDateTime.format(Constants.REPO_DATE_FORMAT); + return punchRecordMapper.selectList(new LambdaQueryWrapper() + .eq(AttendancePunchRecordDO::getDayTime, targetDayStr) + .eq(AttendancePunchRecordDO::getStatus, AttendanceOnTheDayDTO.PUNCH_STATUS_UN_PUNCH) + .eq(AttendancePunchRecordDO::getRemindFlag, Constants.FALSE)); + } + + @Override + public void batchUpdate(List editList) { + punchRecordMapper.updateBatch(editList); + } + private Map getAttendanceGroupShiftIdGroupByGroup(List attendanceGroupDOS, LocalDateTime localDateTime) { Map map = new HashMap<>(); List fixedList = attendanceGroupDOS.stream().filter(a -> a.getType().equals(1)).collect(Collectors.toList()); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/assets/AssetsMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/assets/AssetsMapper.xml index a35bc8f1..f27104da 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/assets/AssetsMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/assets/AssetsMapper.xml @@ -58,6 +58,9 @@ and a.assets_no like concat('%', #{reqVO.keyWord}, '%') + + and a.type_id = #{reqVO.typeId} + and ( a.name like concat('%', #{reqVO.keyWord}, '%') From 1257d8e2888eea4f80189f51b8ec064a2c20fcdc Mon Sep 17 00:00:00 2001 From: aikai Date: Fri, 21 Jun 2024 09:34:53 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8A=A0=E7=8F=AD?= =?UTF-8?q?=E6=97=B6=E9=95=BF/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rule/dept/DeptDataPermissionRule.java | 3 +- .../vo/AssetsSecondmentRecordRespVO.java | 4 ++ .../vo/AttendanceExportExcelByCycleVO.java | 53 +++++++++++++++++++ .../permission/vo/role/RoleSimpleRespVO.java | 2 + .../vo/AttendancePunchRecordSaveReqVO.java | 3 ++ .../admin/user/UserProfileController.java | 14 +++++ .../punchrecord/AttendancePunchRecordDO.java | 5 ++ .../system/job/attendance/RemindJob.java | 2 +- .../attendance/AttendanceServiceImpl.java | 5 +- .../assets/AssetsSecondmentRecordMapper.xml | 4 +- 10 files changed, 88 insertions(+), 7 deletions(-) create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/attendance/vo/AttendanceExportExcelByCycleVO.java 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 26f2e746..e3826781 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 @@ -63,7 +63,8 @@ public class DeptDataPermissionRule implements DataPermissionRule { "work_log_statistics", "work_log_instance_ext", "bpm_oa_work_task", - "zc_dept_assets" + "zc_dept_assets", + "zc_dept_assets_in_out_stock" ); /** diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/assets/vo/AssetsSecondmentRecordRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/assets/vo/AssetsSecondmentRecordRespVO.java index 7d8c9fca..02ea3f5c 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/assets/vo/AssetsSecondmentRecordRespVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/assets/vo/AssetsSecondmentRecordRespVO.java @@ -24,6 +24,10 @@ public class AssetsSecondmentRecordRespVO { @ExcelProperty("资产名称") private String assetsName; + @Schema(description = "资产编号", example = "13886") + @ExcelProperty("资产编号") + private String assetsNo; + @Schema(description = "使用人id", example = "12905") @ExcelProperty("使用人id") private Long useUserId; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/attendance/vo/AttendanceExportExcelByCycleVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/attendance/vo/AttendanceExportExcelByCycleVO.java new file mode 100644 index 00000000..e0524e9e --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/attendance/vo/AttendanceExportExcelByCycleVO.java @@ -0,0 +1,53 @@ +package cn.iocoder.yudao.module.system.controller.admin.attendance.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +public class AttendanceExportExcelByCycleVO { + @Schema(description = "用户名称") + private String name; + @Schema(description = "考勤组名称") + private String groupName; + @Schema(description = "部门名称") + private String deptName; + @Schema(description = "职位名称") + private String postName; + @Schema(description = "出勤天数") + private String attendanceDays; + @Schema(description = "休息天数") + private String restDays; + @Schema(description = "工作时长") + private String lengthOfWork; + @Schema(description = "迟到次数") + private String lateNum; + @Schema(description = "迟到时长") + private String lateTime; + @Schema(description = "早退次数") + private String leaveEarlyNum; + @Schema(description = "早退时长") + private String leaveEarlyTime; + @Schema(description = "上班缺卡次数") + private String upMissingCardsNum; + @Schema(description = "下班缺卡次数") + private String downMissingCardsNum; + @Schema(description = "旷工天数") + private String absenteeismNum; +// @Schema(description = "出差时长") +// private String onBusinessTripTime; +// @Schema(description = "加班-审批单统计") +// private String overtimeApprovalOrderStatistics; + + + @Data + public class OvertimeVO { + @Schema(description = "工作日加班") + private String workingOvertimeOnWorkingDays; + @Schema(description = "休息日加班") + private String workOvertimeOnRestDays; + @Schema(description = "节假日加班") + private String workOvertimeOnHolidays; + } +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleSimpleRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleSimpleRespVO.java index c9e174dd..ef8d4753 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleSimpleRespVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleSimpleRespVO.java @@ -13,4 +13,6 @@ public class RoleSimpleRespVO { @Schema(description = "角色名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") private String name; + @Schema(description = "角色编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "admin") + private String code; } 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 index 2fc30ad9..8641c9ae 100644 --- 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 @@ -78,6 +78,9 @@ public class AttendancePunchRecordSaveReqVO { @Schema(description = "早退时长时间戳") private Long leaveEarlyTime; + @Schema(description = "加班时长时间戳") + private Long workOvertimeTime; + /** * 打卡类型(0上班卡 1下班卡 2迟到卡 3早退卡 4未到打卡时间) 转 打卡状态 0正常 1迟到 2早退 3缺卡 4未打卡(还没到打卡时间) 5补卡 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserProfileController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserProfileController.java index 7d66a2d2..69c5a452 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserProfileController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserProfileController.java @@ -3,7 +3,9 @@ package cn.iocoder.yudao.module.system.controller.admin.user; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleSimpleRespVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileRespVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; @@ -73,6 +75,18 @@ public class UserProfileController { return success(UserConvert.INSTANCE.convert(user, userRoles, dept, posts, socialUsers)); } + @GetMapping("/getRoles") + @Operation(summary = "获得登录用户角色信息") + @DataPermission(enable = false) // 关闭数据权限,避免只查看自己时,查询不到部门。 + public CommonResult> getRoles() { + // 获得用户基本信息 + AdminUserDO user = userService.getUser(getLoginUserId()); + // 获得用户角色 + List userRoles = roleService.getRoleListFromCache(permissionService.getUserRoleIdListByUserId(user.getId())); + List bean = BeanUtils.toBean(userRoles, RoleSimpleRespVO.class); + return success(bean); + } + @PutMapping("/update") @Operation(summary = "修改用户个人信息") public CommonResult updateUserProfile(@Valid @RequestBody UserProfileUpdateReqVO reqVO) { diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/attendance/punchrecord/AttendancePunchRecordDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/attendance/punchrecord/AttendancePunchRecordDO.java index fb868541..0d23e1f3 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/attendance/punchrecord/AttendancePunchRecordDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/attendance/punchrecord/AttendancePunchRecordDO.java @@ -125,6 +125,11 @@ public class AttendancePunchRecordDO extends BaseDO { */ private Long leaveEarlyTime; + /** + * 加班时长时间戳 + */ + private Long workOvertimeTime; + /** * 是否已提醒 0否 1是 */ diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/attendance/RemindJob.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/attendance/RemindJob.java index dd76e053..368fa265 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/attendance/RemindJob.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/attendance/RemindJob.java @@ -63,7 +63,7 @@ public class RemindJob { if (attendancePunchRecordDO.getWorkType().equals(Constants.ZERO) && futureTime.isAfter(attendancePunchRecordDO.getShouldPunchTime())) { AttendanceWorkDTO dto = new AttendanceWorkDTO(); dto.setWorkTypeStr("上班打卡"); - dto.setData(String.format("还有%s分钟就要上班了,别忘记打卡哦~", + dto.setData(String.format("还有%s钟就要上班了,别忘记打卡哦~", DateUtil.formatBetween(LocalDateTimeUtil.between(localDateTime, attendancePunchRecordDO.getShouldPunchTime()).toMillis(), BetweenFormatter.Level.MINUTE))); map.put(attendancePunchRecordDO.getUserId(), dto); attendancePunchRecordDO.setRemindFlag(Constants.TRUE); 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 index 65f96213..1d45d895 100644 --- 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 @@ -163,6 +163,7 @@ public class AttendanceServiceImpl implements AttendanceService { //取绝对值 如果status是负数则变为正数 .setLateTime(Constants.ONE.equals(status) ? Math.abs(LocalDateTimeUtil.between(dto.getLocalDateTime(), pageVO.getShouldPunchTime(), ChronoUnit.MILLIS)) : 0L) .setLeaveEarlyTime(Constants.TWO.equals(status) ? Math.abs(LocalDateTimeUtil.between(dto.getLocalDateTime(), pageVO.getShouldPunchTime(), ChronoUnit.MILLIS)) : 0L) + .setWorkOvertimeTime(Constants.ZERO.equals(status) && Constants.ONE.equals(pageVO.getPunchType()) ? Math.abs(LocalDateTimeUtil.between(dto.getLocalDateTime(), pageVO.getShouldPunchTime(), ChronoUnit.MILLIS)) : 0L) .setRemark(dto.getRemark()) .setImage(dto.getImage()) .setPunchAddress(dto.getPunchAddress()); @@ -760,10 +761,6 @@ public class AttendanceServiceImpl implements AttendanceService { @Override public void exportAttendanceExcel(HttpServletResponse response, ExportAttendanceExcelDTO dto) { - // 导出 Excel -// ExcelUtils.write(response, "考勤组人员.xls", "数据", AttendanceGroupUserRespVO.class, -// BeanUtils.toBean(list, AttendanceGroupUserRespVO.class)); - } /** diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/assets/AssetsSecondmentRecordMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/assets/AssetsSecondmentRecordMapper.xml index 2758667b..59d7729e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/assets/AssetsSecondmentRecordMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/assets/AssetsSecondmentRecordMapper.xml @@ -14,6 +14,7 @@ SELECT a.id, a.assets_id, b.name as assetsName, + b.assets_no as assetsNo, a.use_user_id, c.nickname as useUserName, a.use_dept_id, @@ -36,6 +37,7 @@ left join system_users as d on a.principal_user_id = d.id left join system_dept as e on a.use_dept_id = e.id + a.deleted = 0 and a.use_user_id = #{vo.useUserId} @@ -65,7 +67,7 @@ and a.create_time <= #{vo.createTime[1]} - order by a.create_time desc + order by a.create_time desc \ No newline at end of file