mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 10:18:42 +08:00 
			
		
		
		
	BPM 模型重构 7:任务分配规则的前端,增加指定用户、自定义脚本等
This commit is contained in:
		| @@ -7,6 +7,10 @@ import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.B | ||||
| import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmUserGroupConvert; | ||||
| import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmUserGroupDO; | ||||
| import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmUserGroupService; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserSimpleRespVO; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.convert.user.SysUserConvert; | ||||
| import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; | ||||
| import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||||
| import cn.iocoder.yudao.framework.common.pojo.CommonResult; | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import io.swagger.annotations.Api; | ||||
| @@ -19,6 +23,8 @@ 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; | ||||
|  | ||||
| @Api(tags = "用户组") | ||||
| @@ -71,4 +77,13 @@ public class BpmUserGroupController { | ||||
|         return success(BpmUserGroupConvert.INSTANCE.convertPage(pageResult)); | ||||
|     } | ||||
|  | ||||
|     @GetMapping("/list-all-simple") | ||||
|     @ApiOperation(value = "获取用户组精简信息列表", notes = "只包含被开启的用户组,主要用于前端的下拉选项") | ||||
|     public CommonResult<List<BpmUserGroupRespVO>> getSimpleUserGroups() { | ||||
|         // 获用户门列表,只要开启状态的 | ||||
|         List<BpmUserGroupDO> list = userGroupService.getUserGroupListByStatus(CommonStatusEnum.ENABLE.getStatus()); | ||||
|         // 排序后,返回给前端 | ||||
|         return success(BpmUserGroupConvert.INSTANCE.convertList2(list)); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,21 @@ | ||||
| package cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.rule; | ||||
|  | ||||
| import io.swagger.annotations.ApiModel; | ||||
| import io.swagger.annotations.ApiModelProperty; | ||||
| import lombok.AllArgsConstructor; | ||||
| import lombok.Data; | ||||
| import lombok.NoArgsConstructor; | ||||
|  | ||||
| @ApiModel("用户组精简信息 Response VO") | ||||
| @Data | ||||
| @NoArgsConstructor | ||||
| @AllArgsConstructor | ||||
| public class BpmUserGroupSimpleRespVO { | ||||
|  | ||||
|     @ApiModelProperty(value = "用户组编号", required = true, example = "1024") | ||||
|     private Long id; | ||||
|  | ||||
|     @ApiModelProperty(value = "用户组名字", required = true, example = "芋道") | ||||
|     private String name; | ||||
|  | ||||
| } | ||||
| @@ -9,6 +9,7 @@ import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmUse | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
|  | ||||
| import org.mapstruct.Mapper; | ||||
| import org.mapstruct.Named; | ||||
| import org.mapstruct.factory.Mappers; | ||||
|  | ||||
| /** | ||||
| @@ -31,4 +32,6 @@ public interface BpmUserGroupConvert { | ||||
|  | ||||
|     PageResult<BpmUserGroupRespVO> convertPage(PageResult<BpmUserGroupDO> page); | ||||
|  | ||||
|     @Named("convertList2") | ||||
|     List<BpmUserGroupRespVO> convertList2(List<BpmUserGroupDO> list); | ||||
| } | ||||
|   | ||||
| @@ -7,6 +7,8 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | ||||
| import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; | ||||
| import org.apache.ibatis.annotations.Mapper; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| /** | ||||
|  * 用户组 Mapper | ||||
|  * | ||||
| @@ -23,4 +25,8 @@ public interface BpmUserGroupMapper extends BaseMapperX<BpmUserGroupDO> { | ||||
|                 .orderByDesc("id")); | ||||
|     } | ||||
|  | ||||
|     default List<BpmUserGroupDO> selectListByStatus(Integer status) { | ||||
|         return selectList("status", status); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -54,4 +54,6 @@ public interface BpmErrorCodeConstants { | ||||
|  | ||||
|     // ========== 用户组模块 1-009-011-000 ========== | ||||
|     ErrorCode USER_GROUP_NOT_EXISTS = new ErrorCode(1009011000, "用户组不存在"); | ||||
|     ErrorCode USER_GROUP_IS_DISABLE = new ErrorCode(1009011001, "名字为【{}】的用户组已被禁用"); | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,7 @@ | ||||
| /** | ||||
|  * 拓展 {@link org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior} 实现,基于 {@link cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO} 实现自定义的任务分配规则。 | ||||
|  * 原因:BPMN 默认的 assign、candidateUsers、candidateGroups 拓展起来有一定的难度,所以选择放弃它们,使用自己定义的规则。 | ||||
|  * | ||||
|  * @author 芋道源码 | ||||
|  */ | ||||
| package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior; | ||||
| @@ -0,0 +1,26 @@ | ||||
| package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script; | ||||
|  | ||||
| import org.activiti.engine.impl.persistence.entity.TaskEntity; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| /** | ||||
|  * Bpm 任务分配的自定义 Script 脚本 | ||||
|  * 使用场景: | ||||
|  * 1. 设置审批人为发起人 | ||||
|  * 2. 设置审批人为发起人的 Leader | ||||
|  * 3. 甚至审批人为发起人的 Leader 的 Leader | ||||
|  * | ||||
|  * @author 芋道源码 | ||||
|  */ | ||||
| public interface BpmTaskAssignScript { | ||||
|  | ||||
|     /** | ||||
|      * 基于流程任务,获得任务的候选用户们 | ||||
|      * | ||||
|      * @param task 任务 | ||||
|      * @return 候选人用户的编号数组 | ||||
|      */ | ||||
|     List<Long> calculateTaskCandidateUsers(TaskEntity task); | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,7 @@ | ||||
| /** | ||||
|  * 自定义各种 Activiti 的监听器,实现流程示例、流程任务的拓展表信息的同步 | ||||
|  * 例如说,{@link org.activiti.api.task.model.Task} 新建时,我们也要新建对应的 {@link cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmTaskExtDO} 记录 | ||||
|  * | ||||
|  * @author 芋道源码 | ||||
|  */ | ||||
| package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.listener; | ||||
| @@ -54,6 +54,14 @@ public interface BpmUserGroupService { | ||||
|      */ | ||||
|     List<BpmUserGroupDO> getUserGroupList(Collection<Long> ids); | ||||
|  | ||||
|     /** | ||||
|      * 获得指定状态的用户组列表 | ||||
|      * | ||||
|      * @param status 状态 | ||||
|      * @return 用户组列表 | ||||
|      */ | ||||
|     List<BpmUserGroupDO> getUserGroupListByStatus(Integer status); | ||||
|  | ||||
|     /** | ||||
|      * 获得用户组分页 | ||||
|      * | ||||
| @@ -62,4 +70,13 @@ public interface BpmUserGroupService { | ||||
|      */ | ||||
|     PageResult<BpmUserGroupDO> getUserGroupPage(BpmUserGroupPageReqVO pageReqVO); | ||||
|  | ||||
|     /** | ||||
|      * 校验用户组们是否有效。如下情况,视为无效: | ||||
|      * 1. 用户组编号不存在 | ||||
|      * 2. 用户组被禁用 | ||||
|      * | ||||
|      * @param ids 用户组编号数组 | ||||
|      */ | ||||
|     void validUserGroups(Set<Long> ids); | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -12,9 +12,15 @@ import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmTaskAssignRu | ||||
| import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmModelService; | ||||
| import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; | ||||
| import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; | ||||
| import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmUserGroupService; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictDataService; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; | ||||
| import cn.iocoder.yudao.framework.activiti.core.util.ActivitiUtils; | ||||
| import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | ||||
| import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.activiti.bpmn.model.BpmnModel; | ||||
| @@ -30,6 +36,7 @@ import java.util.Objects; | ||||
| import java.util.Set; | ||||
|  | ||||
| import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.*; | ||||
| import static cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants.BPM_TASK_ASSIGN_RULE_TYPE; | ||||
| import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||||
|  | ||||
| /** | ||||
| @@ -53,6 +60,14 @@ public class BpmTaskAssignRuleServiceImpl implements BpmTaskAssignRuleService { | ||||
|     private SysRoleService roleService; | ||||
|     @Resource | ||||
|     private SysDeptService deptService; | ||||
|     @Resource | ||||
|     private SysPostService postService; | ||||
|     @Resource | ||||
|     private SysUserService userService; | ||||
|     @Resource | ||||
|     private BpmUserGroupService userGroupService; | ||||
|     @Resource | ||||
|     private SysDictDataService dictDataService; | ||||
|  | ||||
|     @Override | ||||
|     public List<BpmTaskAssignRuleDO> getTaskAssignRuleListByProcessDefinitionId(String processDefinitionId, | ||||
| @@ -146,8 +161,18 @@ public class BpmTaskAssignRuleServiceImpl implements BpmTaskAssignRuleService { | ||||
|         } else if (ObjectUtils.equalsAny(BpmTaskAssignRuleTypeEnum.DEPT_MEMBER.getType(), | ||||
|                 BpmTaskAssignRuleTypeEnum.DEPT_LEADER.getType())) { | ||||
|             deptService.validDepts(options); | ||||
|         } else if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.POST.getType())) { | ||||
|             postService.validPosts(options); | ||||
|         } else if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.USER.getType())) { | ||||
|             userService.validUsers(options); | ||||
|         } else if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.USER_GROUP.getType())) { | ||||
|             userGroupService.validUserGroups(options); | ||||
|         } else if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.SCRIPT.getType())) { | ||||
|             dictDataService.validDictDatas(SysDictTypeConstants.BPM_TASK_ASSIGN_SCRIPT, | ||||
|                     CollectionUtils.convertSet(options, String::valueOf)); | ||||
|         } else { | ||||
|             throw new IllegalArgumentException(StrUtil.format("未知的规则类型({})", type)); | ||||
|         } | ||||
|         // TODO 其它的 | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| package cn.iocoder.yudao.adminserver.modules.bpm.service.definition.impl; | ||||
|  | ||||
| import cn.hutool.core.collection.CollUtil; | ||||
| import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupCreateReqVO; | ||||
| import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupPageReqVO; | ||||
| import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupUpdateReqVO; | ||||
| @@ -7,15 +8,23 @@ import cn.iocoder.yudao.adminserver.modules.bpm.convert.definition.BpmUserGroupC | ||||
| import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmUserGroupDO; | ||||
| import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmUserGroupMapper; | ||||
| import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmUserGroupService; | ||||
| import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; | ||||
| import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | ||||
| 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.Map; | ||||
| import java.util.Set; | ||||
|  | ||||
| import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.USER_GROUP_IS_DISABLE; | ||||
| import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.USER_GROUP_NOT_EXISTS; | ||||
| import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.USER_IS_DISABLE; | ||||
| import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.USER_NOT_EXISTS; | ||||
| import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||||
|  | ||||
| /** | ||||
| @@ -72,9 +81,34 @@ public class BpmUserGroupServiceImpl implements BpmUserGroupService { | ||||
|         return userGroupMapper.selectBatchIds(ids); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public List<BpmUserGroupDO> getUserGroupListByStatus(Integer status) { | ||||
|         return userGroupMapper.selectListByStatus(status); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public PageResult<BpmUserGroupDO> getUserGroupPage(BpmUserGroupPageReqVO pageReqVO) { | ||||
|         return userGroupMapper.selectPage(pageReqVO); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void validUserGroups(Set<Long> ids) { | ||||
|         if (CollUtil.isEmpty(ids)) { | ||||
|             return; | ||||
|         } | ||||
|         // 获得用户组信息 | ||||
|         List<BpmUserGroupDO> userGroups = userGroupMapper.selectBatchIds(ids); | ||||
|         Map<Long, BpmUserGroupDO> userGroupMap = CollectionUtils.convertMap(userGroups, BpmUserGroupDO::getId); | ||||
|         // 校验 | ||||
|         ids.forEach(id -> { | ||||
|             BpmUserGroupDO userGroup = userGroupMap.get(id); | ||||
|             if (userGroup == null) { | ||||
|                 throw exception(USER_GROUP_NOT_EXISTS); | ||||
|             } | ||||
|             if (!CommonStatusEnum.ENABLE.getStatus().equals(userGroup.getStatus())) { | ||||
|                 throw exception(USER_GROUP_IS_DISABLE, userGroup.getName()); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -9,6 +9,7 @@ import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; | ||||
| import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | ||||
| import org.apache.ibatis.annotations.Mapper; | ||||
|  | ||||
| import java.util.Collection; | ||||
| import java.util.Date; | ||||
| import java.util.List; | ||||
|  | ||||
| @@ -20,6 +21,11 @@ public interface SysDictDataMapper extends BaseMapperX<SysDictDataDO> { | ||||
|                 .eq("value", value)); | ||||
|     } | ||||
|  | ||||
|     default List<SysDictDataDO> selectByDictTypeAndValues(String dictType, Collection<String> values) { | ||||
|         return selectList(new QueryWrapper<SysDictDataDO>().eq("dict_type", dictType) | ||||
|                 .in("value", values)); | ||||
|     } | ||||
|  | ||||
|     default int selectCountByDictType(String dictType) { | ||||
|         return selectCount("dict_type", dictType); | ||||
|     } | ||||
|   | ||||
| @@ -22,4 +22,7 @@ public interface SysDictTypeConstants { | ||||
|     String SMS_SEND_STATUS = "sys_sms_send_status"; // 短信发送状态 | ||||
|     String SMS_RECEIVE_STATUS = "sys_sms_receive_status"; // 短信接收状态 | ||||
|  | ||||
|     String BPM_TASK_ASSIGN_RULE_TYPE = "bpm_task_assign_rule_type"; // 任务分配规则类型 | ||||
|     String BPM_TASK_ASSIGN_SCRIPT = "bpm_task_assign_script"; // 任务分配自定义脚本 | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -40,6 +40,7 @@ public interface SysErrorCodeConstants { | ||||
|     ErrorCode USER_NOT_EXISTS = new ErrorCode(1002004003, "用户不存在"); | ||||
|     ErrorCode USER_IMPORT_LIST_IS_EMPTY = new ErrorCode(1002004004, "导入用户数据不能为空!"); | ||||
|     ErrorCode USER_PASSWORD_FAILED = new ErrorCode(1002004005, "用户密码校验失败"); | ||||
|     ErrorCode USER_IS_DISABLE = new ErrorCode(1002003004, "名字为【{}】的用户已被禁用"); | ||||
|  | ||||
|     // ========== 部门模块 1002005000 ========== | ||||
|     ErrorCode DEPT_NAME_DUPLICATE = new ErrorCode(1002004001, "已经存在该名字的部门"); | ||||
| @@ -66,7 +67,7 @@ public interface SysErrorCodeConstants { | ||||
|  | ||||
|     // ========== 字典数据 1002007000 ========== | ||||
|     ErrorCode DICT_DATA_NOT_EXISTS = new ErrorCode(1002007001, "当前字典数据不存在"); | ||||
|     ErrorCode DICT_DATA_NOT_ENABLE = new ErrorCode(1002007002, "字典数据不处于开启状态,不允许选择"); | ||||
|     ErrorCode DICT_DATA_NOT_ENABLE = new ErrorCode(1002007002, "字典数据({})不处于开启状态,不允许选择"); | ||||
|     ErrorCode DICT_DATA_VALUE_DUPLICATE = new ErrorCode(1002007003, "已经存在该值的字典数据"); | ||||
|  | ||||
|     // ========== 通知公告 1002008000 ========== | ||||
|   | ||||
| @@ -86,4 +86,13 @@ public interface SysPostService { | ||||
|      */ | ||||
|     SysPostDO getPost(Long id); | ||||
|  | ||||
|     /** | ||||
|      * 校验岗位们是否有效。如下情况,视为无效: | ||||
|      * 1. 岗位编号不存在 | ||||
|      * 2. 岗位被禁用 | ||||
|      * | ||||
|      * @param ids 岗位编号数组 | ||||
|      */ | ||||
|     void validPosts(Collection<Long> ids); | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -1,5 +1,8 @@ | ||||
| package cn.iocoder.yudao.adminserver.modules.system.service.dept.impl; | ||||
|  | ||||
| import cn.hutool.core.collection.CollUtil; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; | ||||
| import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||||
| import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostCreateReqVO; | ||||
| @@ -10,14 +13,17 @@ import cn.iocoder.yudao.adminserver.modules.system.convert.dept.SysPostConvert; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dept.SysPostMapper; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService; | ||||
| import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | ||||
| 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.Map; | ||||
|  | ||||
| import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; | ||||
| import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||||
|  | ||||
| /** | ||||
|  * 岗位 Service 实现类 | ||||
| @@ -78,6 +84,26 @@ public class SysPostServiceImpl implements SysPostService { | ||||
|         return postMapper.selectById(id); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void validPosts(Collection<Long> ids) { | ||||
|         if (CollUtil.isEmpty(ids)) { | ||||
|             return; | ||||
|         } | ||||
|         // 获得岗位信息 | ||||
|         List<SysPostDO> posts = postMapper.selectBatchIds(ids); | ||||
|         Map<Long, SysPostDO> postMap = CollectionUtils.convertMap(posts, SysPostDO::getId); | ||||
|         // 校验 | ||||
|         ids.forEach(id -> { | ||||
|             SysPostDO post = postMap.get(id); | ||||
|             if (post == null) { | ||||
|                 throw exception(POST_NOT_FOUND); | ||||
|             } | ||||
|             if (!CommonStatusEnum.ENABLE.getStatus().equals(post.getStatus())) { | ||||
|                 throw exception(POST_NOT_ENABLE, post.getName()); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     private void checkCreateOrUpdate(Long id, String name, String code) { | ||||
|         // 校验自己存在 | ||||
|         checkPostExists(id); | ||||
|   | ||||
| @@ -8,6 +8,7 @@ import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDi | ||||
| import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataPageReqVO; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataUpdateReqVO; | ||||
|  | ||||
| import java.util.Collection; | ||||
| import java.util.List; | ||||
|  | ||||
| /** | ||||
| @@ -78,4 +79,14 @@ public interface SysDictDataService { | ||||
|      */ | ||||
|     int countByDictType(String dictType); | ||||
|  | ||||
|     /** | ||||
|      * 校验字典数据们是否有效。如下情况,视为无效: | ||||
|      * 1. 字典数据不存在 | ||||
|      * 2. 字典数据被禁用 | ||||
|      * | ||||
|      * @param dictType 字典类型 | ||||
|      * @param values 字典数据值的数组 | ||||
|      */ | ||||
|     void validDictDatas(String dictType, Collection<String> values); | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| package cn.iocoder.yudao.adminserver.modules.system.service.dict.impl; | ||||
|  | ||||
| import cn.hutool.core.collection.CollUtil; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataCreateReqVO; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataExportReqVO; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataPageReqVO; | ||||
| @@ -11,16 +12,16 @@ import cn.iocoder.yudao.adminserver.modules.system.mq.producer.dict.SysDictDataP | ||||
| import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictDataService; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictTypeService; | ||||
| import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO; | ||||
| import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; | ||||
| import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | ||||
| import com.google.common.annotations.VisibleForTesting; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.stereotype.Service; | ||||
|  | ||||
| import javax.annotation.Resource; | ||||
| import java.util.Comparator; | ||||
| import java.util.Date; | ||||
| import java.util.List; | ||||
| import java.util.*; | ||||
|  | ||||
| import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; | ||||
| import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||||
| @@ -133,6 +134,26 @@ public class SysDictDataServiceImpl implements SysDictDataService { | ||||
|         return dictDataMapper.selectCountByDictType(dictType); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void validDictDatas(String dictType, Collection<String> values) { | ||||
|         if (CollUtil.isEmpty(values)) { | ||||
|             return; | ||||
|         } | ||||
|         // 获得字典数据信息 | ||||
|         List<SysDictDataDO> dictDatas = dictDataMapper.selectByDictTypeAndValues(dictType, values); | ||||
|         Map<String, SysDictDataDO> dictDataMap = CollectionUtils.convertMap(dictDatas, SysDictDataDO::getValue); | ||||
|         // 校验 | ||||
|         values.forEach(value -> { | ||||
|             SysDictDataDO dictData = dictDataMap.get(value); | ||||
|             if (dictData == null) { | ||||
|                 throw exception(DICT_DATA_NOT_EXISTS); | ||||
|             } | ||||
|             if (!CommonStatusEnum.ENABLE.getStatus().equals(dictData.getStatus())) { | ||||
|                 throw exception(DICT_DATA_NOT_ENABLE, dictData.getLabel()); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     private void checkCreateOrUpdate(Long id, String value, String dictType) { | ||||
|         // 校验自己存在 | ||||
|         checkDictDataExists(id); | ||||
|   | ||||
| @@ -9,10 +9,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | ||||
|  | ||||
| import java.io.InputStream; | ||||
| import java.util.Collection; | ||||
| import java.util.HashMap; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.*; | ||||
|  | ||||
| /** | ||||
|  * 后台用户 Service 接口 | ||||
| @@ -177,4 +174,13 @@ public interface SysUserService { | ||||
|      */ | ||||
|     List<SysUserDO> getUsersByStatus(Integer status); | ||||
|  | ||||
|     /** | ||||
|      * 校验用户们是否有效。如下情况,视为无效: | ||||
|      * 1. 用户编号不存在 | ||||
|      * 2. 用户被禁用 | ||||
|      * | ||||
|      * @param ids 用户编号数组 | ||||
|      */ | ||||
|     void validUsers(Set<Long> ids); | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -182,6 +182,11 @@ public class SysUserServiceImpl implements SysUserService { | ||||
|         return userMapper.selectBatchIds(ids); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Map<Long, SysUserDO> getUserMap(Collection<Long> ids) { | ||||
|         return SysUserService.super.getUserMap(ids); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public List<SysUserDO> getUsersByNickname(String nickname) { | ||||
|         return userMapper.selectListByNickname(nickname); | ||||
| @@ -384,4 +389,24 @@ public class SysUserServiceImpl implements SysUserService { | ||||
|         return userMapper.selectListByStatus(status); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void validUsers(Set<Long> ids) { | ||||
|         if (CollUtil.isEmpty(ids)) { | ||||
|             return; | ||||
|         } | ||||
|         // 获得岗位信息 | ||||
|         List<SysUserDO> users = userMapper.selectBatchIds(ids); | ||||
|         Map<Long, SysUserDO> userMap = CollectionUtils.convertMap(users, SysUserDO::getId); | ||||
|         // 校验 | ||||
|         ids.forEach(id -> { | ||||
|             SysUserDO user = userMap.get(id); | ||||
|             if (user == null) { | ||||
|                 throw exception(USER_NOT_EXISTS); | ||||
|             } | ||||
|             if (!CommonStatusEnum.ENABLE.getStatus().equals(user.getStatus())) { | ||||
|                 throw exception(USER_IS_DISABLE, user.getNickname()); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 YunaiV
					YunaiV