###功能增强
- 用户创建时可自定义状态:在创建用户时,现在可以自定义用户的状态,如果不指定则默认为启用状态。 - 添加获取指定编制用户列表功能:新增`getUserListByUserStaffing`方法,能够根据用户编制返回用户列表。 ###定时任务优化 - 生日提醒和转正提醒:生日提醒功能现在可以从定时任务参数中获取角色ID和提醒时长,转正提醒功能已集成并可从参数中读取提醒时长。- 外勤打卡权限更新:新增功能可更新当天入职用户的外勤打卡权限状态。 ### 代码改进 - `生日提醒`和`转正提醒`方法:重构了`BirthdayJob`中的`birthdayRemind`方法,用于处理生日提醒和转正提醒。 - `FieldworkJob`中的`updEntryUser`方法:此方法用于更新当天入职用户的外勤打卡权限状态。
This commit is contained in:
parent
6672357229
commit
fa52566ce8
@ -57,4 +57,7 @@ public class UserSaveRespDTO {
|
|||||||
|
|
||||||
@Schema(description = "是否为外勤人员", example = "1")
|
@Schema(description = "是否为外勤人员", example = "1")
|
||||||
private Integer fieldworkFlag;
|
private Integer fieldworkFlag;
|
||||||
|
|
||||||
|
@Schema(description = "状态,参见 CommonStatusEnum 枚举", example = "1")
|
||||||
|
private Integer status;
|
||||||
}
|
}
|
||||||
|
@ -74,6 +74,9 @@ public class UserSaveReqVO {
|
|||||||
@Schema(description = "用户性质", example = "1")
|
@Schema(description = "用户性质", example = "1")
|
||||||
private Integer userStaffing;
|
private Integer userStaffing;
|
||||||
|
|
||||||
|
@Schema(description = "状态", example = "1")
|
||||||
|
private Integer status;
|
||||||
|
|
||||||
// ========== 仅【创建】时,需要传递的字段 ==========
|
// ========== 仅【创建】时,需要传递的字段 ==========
|
||||||
|
|
||||||
@Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456")
|
@Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456")
|
||||||
|
@ -73,6 +73,12 @@ public interface NoticeConvert {
|
|||||||
return message;
|
return message;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生日提醒
|
||||||
|
* @param openId 微信小程序唯一id
|
||||||
|
* @param miniProgramState 小程序的状态
|
||||||
|
* @return 提醒模板
|
||||||
|
*/
|
||||||
default SubscribeMessageReqDTO convertBirthday(String openId, String miniProgramState) {
|
default SubscribeMessageReqDTO convertBirthday(String openId, String miniProgramState) {
|
||||||
|
|
||||||
SubscribeMessageReqDTO message = new SubscribeMessageReqDTO();
|
SubscribeMessageReqDTO message = new SubscribeMessageReqDTO();
|
||||||
@ -106,6 +112,48 @@ public interface NoticeConvert {
|
|||||||
message.setMiniprogramState(miniProgramState);
|
message.setMiniprogramState(miniProgramState);
|
||||||
message.setPage("");
|
message.setPage("");
|
||||||
|
|
||||||
|
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;
|
return message;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package cn.iocoder.yudao.module.system.framework.rpc.config;
|
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.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.bpm.api.oa.BpmOAGoOutApi;
|
||||||
import cn.iocoder.yudao.module.infra.api.file.FileApi;
|
import cn.iocoder.yudao.module.infra.api.file.FileApi;
|
||||||
import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi;
|
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;
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
@Configuration(proxyBeanMethods = false)
|
@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 {
|
public class RpcConfiguration {
|
||||||
}
|
}
|
||||||
|
@ -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.framework.tenant.core.job.TenantJob;
|
||||||
import cn.iocoder.yudao.module.system.api.subscribe.SubscribeMessageSendApi;
|
import cn.iocoder.yudao.module.system.api.subscribe.SubscribeMessageSendApi;
|
||||||
import cn.iocoder.yudao.module.system.convert.notice.NoticeConvert;
|
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.dataobject.user.AdminUserDO;
|
||||||
import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper;
|
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.permission.PermissionService;
|
||||||
import cn.iocoder.yudao.module.system.service.user.AdminUserService;
|
import cn.iocoder.yudao.module.system.service.user.AdminUserService;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
@ -19,10 +21,12 @@ import org.springframework.scheduling.annotation.EnableScheduling;
|
|||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
import java.time.LocalDate;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
|
||||||
|
|
||||||
@ -43,23 +47,72 @@ public class BirthdayJob {
|
|||||||
@Resource
|
@Resource
|
||||||
private SubscribeMessageSendApi subscribeMessageSendApi;
|
private SubscribeMessageSendApi subscribeMessageSendApi;
|
||||||
|
|
||||||
/**
|
@Resource
|
||||||
* 生日提醒
|
private LaborContractService laborContractService;
|
||||||
*
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@XxlJob("birthdayJob")
|
@XxlJob("birthdayJob")
|
||||||
@TenantJob // --- ⚠️ 这个注解 会将租户列表拉出来 完了后逐个租户执行 定时任务需要注意
|
@TenantJob // --- ⚠️ 这个注解 会将租户列表拉出来 完了后逐个租户执行 定时任务需要注意
|
||||||
public ReturnT<String> execute() {
|
public ReturnT<String> execute() {
|
||||||
|
|
||||||
|
//获取参数
|
||||||
|
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();
|
birthdayRemind(roleId);
|
||||||
|
|
||||||
|
// 转正提醒
|
||||||
|
PositiveReminders(remindDuration);
|
||||||
|
}
|
||||||
|
|
||||||
// 返回执行成功
|
// 返回执行成功
|
||||||
return ReturnT.SUCCESS;
|
return ReturnT.SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void birthdayRemind() {
|
/**
|
||||||
|
* 转正提醒
|
||||||
|
*/
|
||||||
|
private void PositiveReminders(Integer remindDuration) {
|
||||||
|
|
||||||
|
// 获得提醒日期
|
||||||
|
LocalDate remindDate = LocalDate.now().plusDays(remindDuration == null ? 7 : remindDuration);
|
||||||
|
|
||||||
|
// 查询所有试用人员
|
||||||
|
List<AdminUserDO> userDOS = userService.getUserListByUserStaffing(5);
|
||||||
|
List<Long> userIds = convertList(userDOS, AdminUserDO::getId);
|
||||||
|
|
||||||
|
List<LaborContractDO> laborContractDOS = laborContractService.getListByUserIds(userIds);
|
||||||
|
List<Long> contractUserIds = laborContractDOS.stream().filter(item -> remindDate.isEqual(item.getSigningDate().plusMonths(item.getProbationPeriodTime())))
|
||||||
|
.map(LaborContractDO::getUserId)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
// 过滤需要提醒的用户
|
||||||
|
List<AdminUserDO> 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"));
|
String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("MM-dd"));
|
||||||
// -- 获取当天月日 生日的人员列表
|
// -- 获取当天月日 生日的人员列表
|
||||||
@ -67,15 +120,6 @@ public class BirthdayJob {
|
|||||||
.like(AdminUserDO::getBirthdayDay, time));
|
.like(AdminUserDO::getBirthdayDay, time));
|
||||||
if (!list.isEmpty()) {
|
if (!list.isEmpty()) {
|
||||||
|
|
||||||
//获取参数
|
|
||||||
XxlJobContext xxlJobContext = XxlJobContext.getXxlJobContext();
|
|
||||||
String jobParam = xxlJobContext.getJobParam();
|
|
||||||
if (!StringUtil.isNullOrEmpty(jobParam)) {
|
|
||||||
|
|
||||||
// 解析参数
|
|
||||||
JSONObject object = new JSONObject(jobParam);
|
|
||||||
Long roleId = object.getLong("roleId");
|
|
||||||
|
|
||||||
Set<Long> userIds = permissionService.getUserRoleIdListByRoleId(CollectionUtils.singleton(roleId));
|
Set<Long> userIds = permissionService.getUserRoleIdListByRoleId(CollectionUtils.singleton(roleId));
|
||||||
//获得用户组中 用户信息
|
//获得用户组中 用户信息
|
||||||
List<AdminUserDO> userDOs = userService.getUserList(userIds);
|
List<AdminUserDO> userDOs = userService.getUserList(userIds);
|
||||||
|
@ -1,8 +1,16 @@
|
|||||||
package cn.iocoder.yudao.module.system.job.fieldwork;
|
package cn.iocoder.yudao.module.system.job.fieldwork;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollectionUtil;
|
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.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.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.dataobject.user.AdminUserDO;
|
||||||
import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper;
|
import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
@ -13,8 +21,14 @@ import org.springframework.scheduling.annotation.EnableScheduling;
|
|||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@ -27,6 +41,9 @@ public class FieldworkJob {
|
|||||||
@Resource
|
@Resource
|
||||||
private BpmOAGoOutApi goOutApi;
|
private BpmOAGoOutApi goOutApi;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BpmOAEntryApi entryApi;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 外勤打卡权限调整, 针对外出申请流程
|
* 外勤打卡权限调整, 针对外出申请流程
|
||||||
*/
|
*/
|
||||||
@ -61,7 +78,29 @@ public class FieldworkJob {
|
|||||||
log.info(ex.toString());
|
log.info(ex.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 修改的入职日期为当天的用户状态
|
||||||
|
updEntryUser();
|
||||||
|
|
||||||
// 返回执行成功
|
// 返回执行成功
|
||||||
return ReturnT.SUCCESS;
|
return ReturnT.SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改的入职日期为当天的用户状态
|
||||||
|
*/
|
||||||
|
private void updEntryUser() {
|
||||||
|
|
||||||
|
LocalDate now = LocalDate.now();
|
||||||
|
// 获得入职信息
|
||||||
|
List<BpmOAEntryDTO> entryDTOS = entryApi.getEntryListByTime(now).getCheckedData();
|
||||||
|
|
||||||
|
if (CollectionUtil.isNotEmpty(entryDTOS)) {
|
||||||
|
// 开启入职用户状态
|
||||||
|
List<AdminUserDO> userDOS = entryDTOS.stream().map(entry -> new AdminUserDO()
|
||||||
|
.setId(entry.getEntryUserId())
|
||||||
|
.setStatus(CommonStatusEnum.ENABLE.getStatus())).collect(Collectors.toList());
|
||||||
|
|
||||||
|
adminUserMapper.updateBatch(userDOS);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -354,4 +354,11 @@ public interface AdminUserService {
|
|||||||
* @return 用户列表
|
* @return 用户列表
|
||||||
*/
|
*/
|
||||||
List<AdminUserDO> getListByNature(Integer userNature);
|
List<AdminUserDO> getListByNature(Integer userNature);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取指定用户编制列表
|
||||||
|
* @param userStaffing 编制
|
||||||
|
* @return 用户列表
|
||||||
|
*/
|
||||||
|
List<AdminUserDO> getUserListByUserStaffing(Integer userStaffing);
|
||||||
}
|
}
|
||||||
|
@ -118,7 +118,7 @@ public class AdminUserServiceImpl implements AdminUserService {
|
|||||||
createReqVO.getMobile(), createReqVO.getEmail(), createReqVO.getDeptId(), createReqVO.getPostIds());
|
createReqVO.getMobile(), createReqVO.getEmail(), createReqVO.getDeptId(), createReqVO.getPostIds());
|
||||||
// 插入用户
|
// 插入用户
|
||||||
AdminUserDO user = BeanUtils.toBean(createReqVO, AdminUserDO.class);
|
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())); // 加密密码
|
user.setPassword(encodePassword(createReqVO.getPassword())); // 加密密码
|
||||||
userMapper.insert(user);
|
userMapper.insert(user);
|
||||||
|
|
||||||
@ -728,4 +728,9 @@ public class AdminUserServiceImpl implements AdminUserService {
|
|||||||
return userMapper.selectList(AdminUserDO::getUserNature, userNature);
|
return userMapper.selectList(AdminUserDO::getUserNature, userNature);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<AdminUserDO> getUserListByUserStaffing(Integer userStaffing) {
|
||||||
|
|
||||||
|
return userMapper.selectList(AdminUserDO::getUserStaffing, userStaffing);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user