UserRelationController.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. package jnpf.permission.controller;
  2. import cn.dev33.satoken.annotation.SaCheckPermission;
  3. import cn.dev33.satoken.annotation.SaMode;
  4. import cn.hutool.core.collection.CollectionUtil;
  5. import io.swagger.v3.oas.annotations.Operation;
  6. import io.swagger.v3.oas.annotations.Parameter;
  7. import io.swagger.v3.oas.annotations.Parameters;
  8. import io.swagger.v3.oas.annotations.tags.Tag;
  9. import jnpf.base.ActionResult;
  10. import jnpf.base.controller.SuperController;
  11. import jnpf.base.entity.DictionaryDataEntity;
  12. import jnpf.base.entity.SuperBaseEntity;
  13. import jnpf.base.service.DictionaryDataService;
  14. import jnpf.base.vo.PageListVO;
  15. import jnpf.base.vo.PaginationVO;
  16. import jnpf.constant.MsgCode;
  17. import jnpf.constant.PermissionConst;
  18. import jnpf.message.service.SynThirdDingTalkService;
  19. import jnpf.message.service.SynThirdQyService;
  20. import jnpf.permission.entity.GroupEntity;
  21. import jnpf.permission.entity.PositionEntity;
  22. import jnpf.permission.entity.UserEntity;
  23. import jnpf.permission.entity.UserRelationEntity;
  24. import jnpf.permission.model.position.PosConModel;
  25. import jnpf.permission.model.user.page.UserPagination;
  26. import jnpf.permission.model.user.vo.UserListVO;
  27. import jnpf.permission.model.userrelation.UserRelationForm;
  28. import jnpf.permission.service.GroupService;
  29. import jnpf.permission.service.PositionService;
  30. import jnpf.permission.service.UserRelationService;
  31. import jnpf.permission.service.UserService;
  32. import jnpf.util.JsonUtil;
  33. import jnpf.util.StringUtil;
  34. import jnpf.util.ThreadPoolExecutorUtil;
  35. import jnpf.util.enums.DictionaryDataEnum;
  36. import lombok.extern.java.Log;
  37. import org.springframework.beans.factory.annotation.Autowired;
  38. import org.springframework.web.bind.annotation.*;
  39. import java.util.*;
  40. import java.util.stream.Collectors;
  41. /**
  42. * 用户关系
  43. *
  44. * @author JNPF开发平台组
  45. * @version V3.1.0
  46. * @copyright 引迈信息技术有限公司
  47. * @date 2019年9月26日 上午9:18
  48. */
  49. @Tag(name = "用户关系", description = "UserRelation")
  50. @RestController
  51. @RequestMapping("/api/permission/UserRelation")
  52. @Log
  53. public class UserRelationController extends SuperController<UserRelationService, UserRelationEntity> {
  54. @Autowired
  55. private UserRelationService userRelationService;
  56. @Autowired
  57. private SynThirdDingTalkService synThirdDingTalkService;
  58. @Autowired
  59. private UserService userService;
  60. @Autowired
  61. private PositionService positionService;
  62. @Autowired
  63. private GroupService groupService;
  64. @Autowired
  65. private SynThirdQyService synThirdQyService;
  66. @Autowired
  67. private DictionaryDataService dictionaryDataApi;
  68. @Operation(summary = "获取组织岗位绑定用户列表")
  69. @Parameters({
  70. @Parameter(name = "objectId", description = "对象主键", required = true),
  71. @Parameter(name = "type", description = "类型:organize,position", required = true)
  72. })
  73. @SaCheckPermission(value = {"permission.organize"}, mode = SaMode.OR)
  74. @GetMapping("/userList")
  75. public ActionResult<PageListVO<UserListVO>> getRoleList(UserPagination pagination) {
  76. List<UserListVO> relationList = userRelationService.getListPage(pagination);
  77. Map<String, String> positionMap = positionService.getPosFullNameMap();
  78. List<DictionaryDataEntity> dataServiceList4 = dictionaryDataApi.getListByTypeDataCode(DictionaryDataEnum.SEX_TYPE.getDictionaryTypeId());
  79. Map<String, String> genderMap = dataServiceList4.stream().collect(Collectors.toMap(DictionaryDataEntity::getEnCode, DictionaryDataEntity::getFullName));
  80. //责任人(有岗位信息时添加属性)
  81. String dutyUser = "";
  82. if (StringUtil.isNotEmpty(pagination.getPositionId())) {
  83. PositionEntity info = positionService.getInfo(pagination.getPositionId());
  84. if (info != null) dutyUser = info.getDutyUser();
  85. }
  86. for (UserListVO userListVO : relationList) {
  87. // 时间小于当前时间则判断已解锁
  88. if (userListVO.getEnabledMark() != null && userListVO.getEnabledMark() != 0) {
  89. if (Objects.nonNull(userListVO.getUnlockTime()) && userListVO.getUnlockTime().getTime() > System.currentTimeMillis()) {
  90. userListVO.setEnabledMark(2);
  91. } else if (Objects.nonNull(userListVO.getUnlockTime()) && userListVO.getUnlockTime().getTime() < System.currentTimeMillis()) {
  92. userListVO.setEnabledMark(1);
  93. }
  94. }
  95. StringJoiner positionJoiner = new StringJoiner(",");
  96. StringJoiner organizeJoiner = new StringJoiner(",");
  97. List<UserRelationEntity> allPostion = userRelationService.getListByObjectType(userListVO.getId(), PermissionConst.POSITION);
  98. if (CollectionUtil.isNotEmpty(allPostion)) {
  99. for (UserRelationEntity item : allPostion) {
  100. String posName = positionMap.get(item.getObjectId());
  101. if (posName != null) {
  102. positionJoiner.add(posName);
  103. organizeJoiner.add(posName.substring(0, posName.lastIndexOf("/")));
  104. }
  105. }
  106. }
  107. userListVO.setGender(genderMap.get(userListVO.getGender()));
  108. userListVO.setPosition(positionJoiner.toString());
  109. userListVO.setOrganize(organizeJoiner.toString());
  110. if (StringUtil.isNotEmpty(dutyUser) && dutyUser.equals(userListVO.getId())) {
  111. userListVO.setIsDutyUser(1);
  112. }
  113. }
  114. PaginationVO paginationVO = JsonUtil.getJsonToBean(pagination, PaginationVO.class);
  115. return ActionResult.page(relationList, paginationVO);
  116. }
  117. @Operation(summary = "岗位/分组添加用户")
  118. @Parameters({
  119. @Parameter(name = "UserRelationForm", description = "用户关联表单")
  120. })
  121. @SaCheckPermission(value = {"permission.auth", "permission.organize", "permission.user"}, mode = SaMode.OR)
  122. @PostMapping
  123. public ActionResult save(@RequestBody UserRelationForm form) {
  124. if (CollectionUtil.isEmpty(form.getUserIds())) {
  125. return ActionResult.fail(MsgCode.SYS134.get());
  126. }
  127. if (Objects.equals(form.getObjectType(), PermissionConst.GROUP)) {
  128. return groupAddUser(form);
  129. } else {
  130. return positionAddUser(form);
  131. }
  132. }
  133. //分组添加用户
  134. private ActionResult groupAddUser(UserRelationForm form) {
  135. GroupEntity info = groupService.getInfo(form.getObjectId());
  136. if (info == null) {
  137. return ActionResult.fail(MsgCode.FA001.get());
  138. }
  139. Set<String> adminIds = userService.getAdminList().stream().map(UserEntity::getId).collect(Collectors.toSet());
  140. Set<String> userIds = userRelationService.getListByObjectId(form.getObjectId(), PermissionConst.GROUP).stream().map(UserRelationEntity::getUserId).collect(Collectors.toSet());
  141. List<UserRelationEntity> listRelation = new ArrayList<>();
  142. for (String userId : form.getUserIds()) {
  143. if (!userIds.contains(userId) && !adminIds.contains(userId)) {
  144. UserRelationEntity userRelation = new UserRelationEntity();
  145. userRelation.setObjectId(form.getObjectId());
  146. userRelation.setUserId(userId);
  147. userRelation.setObjectType(form.getObjectType());
  148. listRelation.add(userRelation);
  149. }
  150. }
  151. if (CollectionUtil.isNotEmpty(listRelation)) {
  152. userRelationService.save(listRelation);
  153. }
  154. return ActionResult.success(MsgCode.SU018.get());
  155. }
  156. //岗位添加用户
  157. private ActionResult positionAddUser(UserRelationForm form) {
  158. String posId = form.getObjectId();
  159. PositionEntity info = positionService.getInfo(posId);
  160. if (info == null) {
  161. return ActionResult.fail(MsgCode.FA001.get());
  162. }
  163. List<String> errList1 = new ArrayList<>();
  164. List<PositionEntity> allPos = positionService.getList(false);
  165. List<String> userIds = new ArrayList<>(form.getUserIds());
  166. //岗位-移除数据库已有数据 和 超管用户。
  167. List<UserRelationEntity> listByObjectId = userRelationService.getListByObjectId(info.getId(), PermissionConst.POSITION);
  168. Set<String> posUsers = listByObjectId.stream().map(UserRelationEntity::getUserId).collect(Collectors.toSet());
  169. Set<String> adminIds = userService.getAdminList().stream().map(UserEntity::getId).collect(Collectors.toSet());
  170. userIds = userIds.stream().filter(t -> !posUsers.contains(t)).collect(Collectors.toList());
  171. //约束判断
  172. PosConModel conModel = new PosConModel();
  173. if (Objects.equals(info.getIsCondition(), 1)) {
  174. conModel = JsonUtil.getJsonToBean(info.getConditionJson(), PosConModel.class);
  175. conModel.init();
  176. }
  177. if (conModel.getNumFlag()) {
  178. //用户基数限制
  179. if (userIds.size() > 0 && conModel.getUserNum() <= posUsers.size()) {
  180. return ActionResult.fail(MsgCode.SYS135.get(MsgCode.PS004.get()));
  181. }
  182. }
  183. List<String> ids = new ArrayList<>();
  184. List<UserRelationEntity> listRelation = new ArrayList<>();
  185. for (String userId : userIds) {
  186. if (adminIds.contains(userId)) {
  187. errList1.add("超管不能添加");
  188. continue;
  189. }
  190. List<String> errList2 = new ArrayList<>();
  191. UserRelationEntity userRelation = new UserRelationEntity();
  192. userRelation.setObjectId(posId);
  193. userRelation.setUserId(userId);
  194. userRelation.setObjectType(form.getObjectType());
  195. //岗位添加组织关系方便使用
  196. UserRelationEntity userOrgRelation = new UserRelationEntity();
  197. userOrgRelation.setObjectId(info.getOrganizeId());
  198. userOrgRelation.setUserId(userId);
  199. userOrgRelation.setObjectType(PermissionConst.ORGANIZE);
  200. List<String> thisUserPos = userRelationService.getListByUserId(userId, PermissionConst.POSITION).stream()
  201. .map(UserRelationEntity::getObjectId).collect(Collectors.toList());
  202. //现有角色和当前这个角色互斥
  203. List<PositionEntity> posList = allPos.stream().filter(t -> thisUserPos.contains(t.getId())).collect(Collectors.toList());
  204. for (PositionEntity p : posList) {
  205. if (Objects.equals(p.getIsCondition(), 1)) {
  206. PosConModel conModelP = JsonUtil.getJsonToBean(p.getConditionJson(), PosConModel.class);
  207. conModelP.init();
  208. if (conModelP.getMutualExclusionFlag() && conModelP.getMutualExclusion().contains(posId)) {
  209. errList2.add(MsgCode.SYS137.get());
  210. }
  211. }
  212. }
  213. //互斥
  214. if (conModel.getMutualExclusionFlag()) {
  215. if (conModel.getMutualExclusion().stream().anyMatch(thisUserPos::contains)) {
  216. errList2.add(MsgCode.SYS137.get());
  217. }
  218. }
  219. //先决
  220. if (conModel.getPrerequisiteFlag() && !new HashSet<>(thisUserPos).containsAll(conModel.getPrerequisite())) {
  221. errList2.add(MsgCode.SYS138.get());
  222. }
  223. if (errList2.isEmpty()) {
  224. //添加数量超出权限基数后跳出循环
  225. if (conModel.getNumFlag() && conModel.getUserNum() <= (ids.size() + posUsers.size())) {
  226. errList1.add(MsgCode.SYS135.get(MsgCode.PS004.get()));
  227. break;
  228. }
  229. ids.add(userId);
  230. listRelation.add(userRelation);
  231. listRelation.add(userOrgRelation);
  232. } else {
  233. errList1.addAll(errList2);
  234. }
  235. }
  236. if (CollectionUtil.isNotEmpty(ids)) {
  237. ThreadPoolExecutorUtil.getExecutor().execute(() -> {
  238. try {
  239. List<UserEntity> userList = userService.getUserList(ids);
  240. List<UserEntity> collect = userList.stream()
  241. .peek(t -> t.setOrganizeId(info.getOrganizeId())).collect(Collectors.toList());
  242. //创建组织后判断是否需要同步到企业微信
  243. synThirdQyService.createUserSysToQy(false, collect, "", form.getObjectId());
  244. //创建组织后判断是否需要同步到钉钉
  245. synThirdDingTalkService.createUserSysToDing(false, collect, "", form.getObjectId());
  246. } catch (Exception e) {
  247. log.config("创建组织后同步失败到企业微信或钉钉失败,异常:" + e.getMessage());
  248. }
  249. });
  250. userRelationService.save(listRelation);
  251. userService.delCurUser(MsgCode.PS010.get(), ids);
  252. }
  253. if (CollectionUtil.isNotEmpty(errList1) && CollectionUtil.isNotEmpty(ids)) {
  254. return ActionResult.success(MsgCode.SYS139.get());
  255. } else if (CollectionUtil.isNotEmpty(errList1)) {
  256. return ActionResult.fail(MsgCode.DB019.get());
  257. }
  258. return ActionResult.success(MsgCode.SU018.get());
  259. }
  260. @Operation(summary = "岗位/分组移除用户绑定")
  261. @Parameters({
  262. @Parameter(name = "RoleRelationForm", description = "表单数据")
  263. })
  264. @SaCheckPermission(value = {"permission.auth", "permission.organize", "permission.role"}, mode = SaMode.OR)
  265. @PostMapping("/delete")
  266. public ActionResult delete(@RequestBody UserRelationForm form) {
  267. userRelationService.delete(form);
  268. ThreadPoolExecutorUtil.getExecutor().execute(() -> {
  269. try {
  270. List<UserEntity> userList = userService.getUserList(form.getUserIds());
  271. List<String> collect = userList.stream().map(SuperBaseEntity.SuperIBaseEntity::getId)
  272. .collect(Collectors.toList());
  273. //创建组织后判断是否需要同步到企业微信
  274. synThirdQyService.deleteUserSysToQy(false, collect, "", form.getObjectId());
  275. //创建组织后判断是否需要同步到钉钉
  276. synThirdDingTalkService.deleteUserSysToDing(false, collect, "", form.getObjectId());
  277. } catch (Exception e) {
  278. log.config("创建组织后同步失败到企业微信或钉钉失败,异常:" + e.getMessage());
  279. }
  280. });
  281. return ActionResult.success(MsgCode.SU021.get());
  282. }
  283. }