diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/dto/UserSaveRespDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/dto/UserSaveRespDTO.java index 69f99092..26908713 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/dto/UserSaveRespDTO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/dto/UserSaveRespDTO.java @@ -57,4 +57,7 @@ public class UserSaveRespDTO { @Schema(description = "是否为外勤人员", example = "1") private Integer fieldworkFlag; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举", example = "1") + private Integer status; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserSaveReqVO.java index 6d231aa4..99e3cceb 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserSaveReqVO.java @@ -74,6 +74,9 @@ public class UserSaveReqVO { @Schema(description = "用户性质", example = "1") private Integer userStaffing; + @Schema(description = "状态", example = "1") + private Integer status; + // ========== 仅【创建】时,需要传递的字段 ========== @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/notice/NoticeConvert.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/notice/NoticeConvert.java index bd927305..a5fe6b16 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/notice/NoticeConvert.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/notice/NoticeConvert.java @@ -73,6 +73,12 @@ public interface NoticeConvert { return message; } + /** + * 生日提醒 + * @param openId 微信小程序唯一id + * @param miniProgramState 小程序的状态 + * @return 提醒模板 + */ default SubscribeMessageReqDTO convertBirthday(String openId, String miniProgramState) { SubscribeMessageReqDTO message = new SubscribeMessageReqDTO(); @@ -108,4 +114,46 @@ public interface NoticeConvert { return message; } + + /** + * 生日提醒 + * @param openId 微信小程序唯一id + * @param miniProgramState 小程序的状态 + * @return 提醒模板 + */ + default SubscribeMessageReqDTO convertRegular(String openId, String miniProgramState) { + + SubscribeMessageReqDTO message = new SubscribeMessageReqDTO(); + message.setToUser(openId); + message.setTemplateId("fH29xjNb8pe-7onQ-wE3QrBAC-y8aaC_oosYZKNMtzM"); + + //消息类型 + MsgData noticeType = new MsgData(); + noticeType.setName("phrase8"); + noticeType.setValue("转正提醒"); + message.addData(noticeType); + + //发送人 + MsgData publishMan = new MsgData(); + publishMan.setName("thing16"); + publishMan.setValue("系统"); + message.addData(publishMan); + + //发送时间 + MsgData createTime = new MsgData(); + createTime.setName("time3"); + createTime.setValue(DateUtils.dateFormat(new Date(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)); + message.addData(createTime); + + //消息内容 + MsgData content = new MsgData(); + content.setName("thing2"); + content.setValue("恭喜快要转正了哦,记得走转正流程!"); + message.addData(content); + + message.setMiniprogramState(miniProgramState); + message.setPage(""); + + return message; + } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/rpc/config/RpcConfiguration.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/rpc/config/RpcConfiguration.java index 58e97f76..e34db831 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/rpc/config/RpcConfiguration.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/rpc/config/RpcConfiguration.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.system.framework.rpc.config; import cn.iocoder.yudao.module.bpm.api.model.BpmModelApi; +import cn.iocoder.yudao.module.bpm.api.oa.BpmOAEntryApi; import cn.iocoder.yudao.module.bpm.api.oa.BpmOAGoOutApi; import cn.iocoder.yudao.module.infra.api.file.FileApi; import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi; @@ -9,6 +10,6 @@ import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Configuration; @Configuration(proxyBeanMethods = false) -@EnableFeignClients(clients = {FileApi.class, WebSocketSenderApi.class, FactoryInfoApi.class, BpmModelApi.class, BpmOAGoOutApi.class}) +@EnableFeignClients(clients = {FileApi.class, WebSocketSenderApi.class, FactoryInfoApi.class, BpmModelApi.class, BpmOAGoOutApi.class, BpmOAEntryApi.class}) public class RpcConfiguration { } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/birthday/BirthdayJob.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/birthday/BirthdayJob.java index 4d7ac00b..5dd94110 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/birthday/BirthdayJob.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/birthday/BirthdayJob.java @@ -5,8 +5,10 @@ import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.tenant.core.job.TenantJob; import cn.iocoder.yudao.module.system.api.subscribe.SubscribeMessageSendApi; import cn.iocoder.yudao.module.system.convert.notice.NoticeConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.laborcontract.LaborContractDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper; +import cn.iocoder.yudao.module.system.service.laborcontract.LaborContractService; import cn.iocoder.yudao.module.system.service.permission.PermissionService; import cn.iocoder.yudao.module.system.service.user.AdminUserService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -19,10 +21,12 @@ import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.stereotype.Component; import javax.annotation.Resource; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; @@ -43,38 +47,78 @@ public class BirthdayJob { @Resource private SubscribeMessageSendApi subscribeMessageSendApi; - /** - * 生日提醒 - * - * @return - */ + @Resource + private LaborContractService laborContractService; + + @XxlJob("birthdayJob") @TenantJob // --- ⚠️ 这个注解 会将租户列表拉出来 完了后逐个租户执行 定时任务需要注意 public ReturnT execute() { - // 生日提醒 - birthdayRemind(); + //获取参数 + XxlJobContext xxlJobContext = XxlJobContext.getXxlJobContext(); + String jobParam = xxlJobContext.getJobParam(); + if (!StringUtil.isNullOrEmpty(jobParam)) { + // 解析参数 + JSONObject object = new JSONObject(jobParam); + // 获取角色id + Long roleId = object.getLong("roleId"); + // 获取提醒时长 + Integer remindDuration = object.getInt("remindDuration"); + + // 生日提醒 + birthdayRemind(roleId); + + // 转正提醒 + PositiveReminders(remindDuration); + } // 返回执行成功 return ReturnT.SUCCESS; } - private void birthdayRemind() { + /** + * 转正提醒 + */ + private void PositiveReminders(Integer remindDuration) { - String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("MM-dd")); - // -- 获取当天月日 生日的人员列表 - List list = adminUserMapper.selectList(new LambdaQueryWrapper() - .like(AdminUserDO::getBirthdayDay, time)); - if (!list.isEmpty()) { + // 获得提醒日期 + LocalDate remindDate = LocalDate.now().plusDays(remindDuration == null ? 7 : remindDuration); - //获取参数 - XxlJobContext xxlJobContext = XxlJobContext.getXxlJobContext(); - String jobParam = xxlJobContext.getJobParam(); - if (!StringUtil.isNullOrEmpty(jobParam)) { + // 查询所有试用人员 + List userDOS = userService.getUserListByUserStaffing(5); + List userIds = convertList(userDOS, AdminUserDO::getId); - // 解析参数 - JSONObject object = new JSONObject(jobParam); - Long roleId = object.getLong("roleId"); + List laborContractDOS = laborContractService.getListByUserIds(userIds); + List contractUserIds = laborContractDOS.stream().filter(item -> remindDate.isEqual(item.getSigningDate().plusMonths(item.getProbationPeriodTime()))) + .map(LaborContractDO::getUserId) + .collect(Collectors.toList()); + + // 过滤需要提醒的用户 + List positiveUserList = userDOS.stream().filter(item -> contractUserIds.contains(item.getId())).collect(Collectors.toList()); + for (AdminUserDO adminUserDO : positiveUserList) { + if( adminUserDO.getOpenId() != null && !adminUserDO.getOpenId().isEmpty()) { + + subscribeMessageSendApi.sendCompanyNotice(NoticeConvert.INSTANCE.convertRegular( + adminUserDO.getOpenId(), "formal")); + } + } + + log.info("转正提醒,人员为{}", convertList(positiveUserList, AdminUserDO::getNickname)); + } + + /** + * 生日提醒 + */ + private void birthdayRemind(Long roleId) { + + if (roleId != null) { + + String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("MM-dd")); + // -- 获取当天月日 生日的人员列表 + List list = adminUserMapper.selectList(new LambdaQueryWrapper() + .like(AdminUserDO::getBirthdayDay, time)); + if (!list.isEmpty()) { Set userIds = permissionService.getUserRoleIdListByRoleId(CollectionUtils.singleton(roleId)); //获得用户组中 用户信息 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/fieldwork/FieldworkJob.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/fieldwork/FieldworkJob.java index c4ff63d8..a3dbea8c 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/fieldwork/FieldworkJob.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/fieldwork/FieldworkJob.java @@ -1,8 +1,16 @@ package cn.iocoder.yudao.module.system.job.fieldwork; import cn.hutool.core.collection.CollectionUtil; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.common.util.string.DTO.IdCardDO; +import cn.iocoder.yudao.framework.common.util.string.StrUtils; import cn.iocoder.yudao.framework.tenant.core.job.TenantJob; +import cn.iocoder.yudao.module.bpm.api.oa.BpmOAEntryApi; import cn.iocoder.yudao.module.bpm.api.oa.BpmOAGoOutApi; +import cn.iocoder.yudao.module.bpm.api.oa.vo.BpmOAEntryDTO; +import cn.iocoder.yudao.module.system.api.user.dto.UserSaveRespDTO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -13,8 +21,14 @@ import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.stereotype.Component; import javax.annotation.Resource; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; + +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; @Component @Slf4j @@ -27,6 +41,9 @@ public class FieldworkJob { @Resource private BpmOAGoOutApi goOutApi; + @Resource + private BpmOAEntryApi entryApi; + /** * 外勤打卡权限调整, 针对外出申请流程 */ @@ -61,7 +78,29 @@ public class FieldworkJob { log.info(ex.toString()); } + // 修改的入职日期为当天的用户状态 + updEntryUser(); + // 返回执行成功 return ReturnT.SUCCESS; } -} + + /** + * 修改的入职日期为当天的用户状态 + */ + private void updEntryUser() { + + LocalDate now = LocalDate.now(); + // 获得入职信息 + List entryDTOS = entryApi.getEntryListByTime(now).getCheckedData(); + + if (CollectionUtil.isNotEmpty(entryDTOS)) { + // 开启入职用户状态 + List userDOS = entryDTOS.stream().map(entry -> new AdminUserDO() + .setId(entry.getEntryUserId()) + .setStatus(CommonStatusEnum.ENABLE.getStatus())).collect(Collectors.toList()); + + adminUserMapper.updateBatch(userDOS); + } + } +} \ 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 a7960306..bd2a30dd 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 @@ -354,4 +354,11 @@ public interface AdminUserService { * @return 用户列表 */ List getListByNature(Integer userNature); + + /** + * 获取指定用户编制列表 + * @param userStaffing 编制 + * @return 用户列表 + */ + List getUserListByUserStaffing(Integer userStaffing); } 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 6d91c8dc..b2da396b 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 @@ -118,7 +118,7 @@ public class AdminUserServiceImpl implements AdminUserService { createReqVO.getMobile(), createReqVO.getEmail(), createReqVO.getDeptId(), createReqVO.getPostIds()); // 插入用户 AdminUserDO user = BeanUtils.toBean(createReqVO, AdminUserDO.class); - user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启 + user.setStatus(createReqVO.getStatus() == null ? CommonStatusEnum.ENABLE.getStatus() : createReqVO.getStatus()); // 默认开启 user.setPassword(encodePassword(createReqVO.getPassword())); // 加密密码 userMapper.insert(user); @@ -728,4 +728,9 @@ public class AdminUserServiceImpl implements AdminUserService { return userMapper.selectList(AdminUserDO::getUserNature, userNature); } + @Override + public List getUserListByUserStaffing(Integer userStaffing) { + + return userMapper.selectList(AdminUserDO::getUserStaffing, userStaffing); + } }