07423a14aed42345cf046bcdcb42a8f0490d9856.svn-base 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514
  1. package org.jeecg.modules.system.controller;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  5. import lombok.extern.slf4j.Slf4j;
  6. import org.apache.commons.lang3.StringUtils;
  7. import org.apache.shiro.SecurityUtils;
  8. import org.apache.shiro.authz.annotation.RequiresRoles;
  9. import org.jeecg.common.api.vo.Result;
  10. import org.jeecg.common.constant.CacheConstant;
  11. import org.jeecg.common.constant.CommonConstant;
  12. import org.jeecg.common.system.query.QueryGenerator;
  13. import org.jeecg.common.system.util.JwtUtil;
  14. import org.jeecg.common.system.vo.LoginUser;
  15. import org.jeecg.common.util.ImportExcelUtil;
  16. import org.jeecg.common.util.YouBianCodeUtil;
  17. import org.jeecg.common.util.oConvertUtils;
  18. import org.jeecg.modules.system.entity.SysDepart;
  19. import org.jeecg.modules.system.entity.SysUser;
  20. import org.jeecg.modules.system.model.DepartIdModel;
  21. import org.jeecg.modules.system.model.SysDepartTreeModel;
  22. import org.jeecg.modules.system.service.ISysDepartService;
  23. import org.jeecg.modules.system.service.ISysUserDepartService;
  24. import org.jeecg.modules.system.service.ISysUserService;
  25. import org.jeecgframework.poi.excel.ExcelImportUtil;
  26. import org.jeecgframework.poi.excel.def.NormalExcelConstants;
  27. import org.jeecgframework.poi.excel.entity.ExportParams;
  28. import org.jeecgframework.poi.excel.entity.ImportParams;
  29. import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
  30. import org.springframework.beans.factory.annotation.Autowired;
  31. import org.springframework.cache.annotation.CacheEvict;
  32. import org.springframework.data.redis.core.RedisTemplate;
  33. import org.springframework.web.bind.annotation.*;
  34. import org.springframework.web.multipart.MultipartFile;
  35. import org.springframework.web.multipart.MultipartHttpServletRequest;
  36. import org.springframework.web.servlet.ModelAndView;
  37. import javax.servlet.http.HttpServletRequest;
  38. import javax.servlet.http.HttpServletResponse;
  39. import java.io.IOException;
  40. import java.util.*;
  41. /**
  42. * <p>
  43. * 部门表 前端控制器
  44. * <p>
  45. *
  46. * @Author: Steve @Since: 2019-01-22
  47. */
  48. @RestController
  49. @RequestMapping("/sys/sysDepart")
  50. @Slf4j
  51. public class SysDepartController {
  52. @Autowired
  53. private ISysDepartService sysDepartService;
  54. @Autowired
  55. public RedisTemplate<String, Object> redisTemplate;
  56. @Autowired
  57. private ISysUserService sysUserService;
  58. @Autowired
  59. private ISysUserDepartService sysUserDepartService;
  60. /**
  61. * 查询数据 查出我的部门,并以树结构数据格式响应给前端
  62. *
  63. * @return
  64. */
  65. @RequestMapping(value = "/queryMyDeptTreeList", method = RequestMethod.GET)
  66. public Result<List<SysDepartTreeModel>> queryMyDeptTreeList() {
  67. Result<List<SysDepartTreeModel>> result = new Result<>();
  68. LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
  69. try {
  70. if(oConvertUtils.isNotEmpty(user.getUserIdentity()) && user.getUserIdentity().equals( CommonConstant.USER_IDENTITY_2 )){
  71. //update-begin--Author:liusq Date:20210624 for:部门查询ids为空后的前端显示问题 issues/I3UD06
  72. String departIds = user.getDepartIds();
  73. if(StringUtils.isNotBlank(departIds)){
  74. List<SysDepartTreeModel> list = sysDepartService.queryMyDeptTreeList(departIds);
  75. result.setResult(list);
  76. }
  77. //update-end--Author:liusq Date:20210624 for:部门查询ids为空后的前端显示问题 issues/I3UD06
  78. result.setMessage(CommonConstant.USER_IDENTITY_2.toString());
  79. result.setSuccess(true);
  80. }else{
  81. result.setMessage(CommonConstant.USER_IDENTITY_1.toString());
  82. result.setSuccess(true);
  83. }
  84. } catch (Exception e) {
  85. log.error(e.getMessage(),e);
  86. }
  87. return result;
  88. }
  89. /**
  90. * 查询数据 查出所有部门,并以树结构数据格式响应给前端
  91. *
  92. * @return
  93. */
  94. @RequestMapping(value = "/queryTreeList", method = RequestMethod.GET)
  95. public Result<List<SysDepartTreeModel>> queryTreeList() {
  96. Result<List<SysDepartTreeModel>> result = new Result<>();
  97. try {
  98. // 从内存中读取
  99. // List<SysDepartTreeModel> list =FindsDepartsChildrenUtil.getSysDepartTreeList();
  100. // if (CollectionUtils.isEmpty(list)) {
  101. // list = sysDepartService.queryTreeList();
  102. // }
  103. List<SysDepartTreeModel> list = sysDepartService.queryTreeList();
  104. result.setResult(list);
  105. result.setSuccess(true);
  106. } catch (Exception e) {
  107. log.error(e.getMessage(),e);
  108. }
  109. return result;
  110. }
  111. /**
  112. * 异步查询部门list
  113. *
  114. * @return
  115. */
  116. @RequestMapping(value = "/queryDepartTreeSync", method = RequestMethod.GET)
  117. public Result<List<SysDepartTreeModel>> queryDepartTreeSync(@RequestParam(name = "pid", required = false) String parentId) {
  118. Result<List<SysDepartTreeModel>> result = new Result<>();
  119. try {
  120. List<SysDepartTreeModel> list = sysDepartService.queryTreeListByPid(parentId);
  121. result.setResult(list);
  122. result.setSuccess(true);
  123. } catch (Exception e) {
  124. log.error(e.getMessage(),e);
  125. }
  126. return result;
  127. }
  128. /**
  129. * 获取某个部门的所有父级部门的ID
  130. *
  131. * @param departId 根据departId查
  132. * @param orgCode 根据orgCode查,departId和orgCode必须有一个不为空
  133. */
  134. @GetMapping("/queryAllParentId")
  135. public Result queryParentIds(
  136. @RequestParam(name = "departId", required = false) String departId,
  137. @RequestParam(name = "orgCode", required = false) String orgCode
  138. ) {
  139. try {
  140. JSONObject data;
  141. if (oConvertUtils.isNotEmpty(departId)) {
  142. data = sysDepartService.queryAllParentIdByDepartId(departId);
  143. } else if (oConvertUtils.isNotEmpty(orgCode)) {
  144. data = sysDepartService.queryAllParentIdByOrgCode(orgCode);
  145. } else {
  146. return Result.error("departId 和 orgCode 不能都为空!");
  147. }
  148. return Result.OK(data);
  149. } catch (Exception e) {
  150. log.error(e.getMessage(), e);
  151. return Result.error(e.getMessage());
  152. }
  153. }
  154. /**
  155. * 添加新数据 添加用户新建的部门对象数据,并保存到数据库
  156. *
  157. * @param sysDepart
  158. * @return
  159. */
  160. //@RequiresRoles({"admin"})
  161. @RequestMapping(value = "/add", method = RequestMethod.POST)
  162. @CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true)
  163. public Result<SysDepart> add(@RequestBody SysDepart sysDepart, HttpServletRequest request) {
  164. Result<SysDepart> result = new Result<SysDepart>();
  165. String username = JwtUtil.getUserNameByToken(request);
  166. try {
  167. sysDepart.setCreateBy(username);
  168. sysDepartService.saveDepartData(sysDepart, username);
  169. //清除部门树内存
  170. // FindsDepartsChildrenUtil.clearSysDepartTreeList();
  171. // FindsDepartsChildrenUtil.clearDepartIdModel();
  172. result.success("添加成功!");
  173. } catch (Exception e) {
  174. log.error(e.getMessage(),e);
  175. result.error500("操作失败");
  176. }
  177. return result;
  178. }
  179. /**
  180. * 编辑数据 编辑部门的部分数据,并保存到数据库
  181. *
  182. * @param sysDepart
  183. * @return
  184. */
  185. //@RequiresRoles({"admin"})
  186. @RequestMapping(value = "/edit", method = RequestMethod.POST)
  187. @CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true)
  188. public Result<SysDepart> edit(@RequestBody SysDepart sysDepart, HttpServletRequest request) {
  189. String username = JwtUtil.getUserNameByToken(request);
  190. sysDepart.setUpdateBy(username);
  191. Result<SysDepart> result = new Result<SysDepart>();
  192. SysDepart sysDepartEntity = sysDepartService.getById(sysDepart.getId());
  193. if (sysDepartEntity == null) {
  194. result.error500("未找到对应实体");
  195. } else {
  196. boolean ok = sysDepartService.updateDepartDataById(sysDepart, username);
  197. // TODO 返回false说明什么?
  198. if (ok) {
  199. //清除部门树内存
  200. //FindsDepartsChildrenUtil.clearSysDepartTreeList();
  201. //FindsDepartsChildrenUtil.clearDepartIdModel();
  202. result.success("修改成功!");
  203. }
  204. }
  205. return result;
  206. }
  207. /**
  208. * 通过id删除
  209. * @param id
  210. * @return
  211. */
  212. //@RequiresRoles({"admin"})
  213. @RequestMapping(value = "/delete", method = RequestMethod.POST)
  214. @CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true)
  215. public Result<SysDepart> delete(@RequestParam(name="id",required=true) String id) {
  216. Result<SysDepart> result = new Result<SysDepart>();
  217. SysDepart sysDepart = sysDepartService.getById(id);
  218. if(sysDepart==null) {
  219. result.error500("未找到对应实体");
  220. }else {
  221. boolean ok = sysDepartService.delete(id);
  222. if(ok) {
  223. //清除部门树内存
  224. //FindsDepartsChildrenUtil.clearSysDepartTreeList();
  225. // FindsDepartsChildrenUtil.clearDepartIdModel();
  226. result.success("删除成功!");
  227. }
  228. }
  229. return result;
  230. }
  231. /**
  232. * 批量删除 根据前端请求的多个ID,对数据库执行删除相关部门数据的操作
  233. *
  234. * @param ids
  235. * @return
  236. */
  237. //@RequiresRoles({"admin"})
  238. @RequestMapping(value = "/deleteBatch", method = RequestMethod.POST)
  239. @CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true)
  240. public Result<SysDepart> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
  241. Result<SysDepart> result = new Result<SysDepart>();
  242. if (ids == null || "".equals(ids.trim())) {
  243. result.error500("参数不识别!");
  244. } else {
  245. this.sysDepartService.deleteBatchWithChildren(Arrays.asList(ids.split(",")));
  246. result.success("删除成功!");
  247. }
  248. return result;
  249. }
  250. /**
  251. * 查询数据 添加或编辑页面对该方法发起请求,以树结构形式加载所有部门的名称,方便用户的操作
  252. *
  253. * @return
  254. */
  255. @RequestMapping(value = "/queryIdTree", method = RequestMethod.GET)
  256. public Result<List<DepartIdModel>> queryIdTree() {
  257. // Result<List<DepartIdModel>> result = new Result<List<DepartIdModel>>();
  258. // List<DepartIdModel> idList;
  259. // try {
  260. // idList = FindsDepartsChildrenUtil.wrapDepartIdModel();
  261. // if (idList != null && idList.size() > 0) {
  262. // result.setResult(idList);
  263. // result.setSuccess(true);
  264. // } else {
  265. // sysDepartService.queryTreeList();
  266. // idList = FindsDepartsChildrenUtil.wrapDepartIdModel();
  267. // result.setResult(idList);
  268. // result.setSuccess(true);
  269. // }
  270. // return result;
  271. // } catch (Exception e) {
  272. // log.error(e.getMessage(),e);
  273. // result.setSuccess(false);
  274. // return result;
  275. // }
  276. Result<List<DepartIdModel>> result = new Result<>();
  277. try {
  278. List<DepartIdModel> list = sysDepartService.queryDepartIdTreeList();
  279. result.setResult(list);
  280. result.setSuccess(true);
  281. } catch (Exception e) {
  282. log.error(e.getMessage(),e);
  283. }
  284. return result;
  285. }
  286. /**
  287. * <p>
  288. * 部门搜索功能方法,根据关键字模糊搜索相关部门
  289. * </p>
  290. *
  291. * @param keyWord
  292. * @return
  293. */
  294. @RequestMapping(value = "/searchBy", method = RequestMethod.GET)
  295. public Result<List<SysDepartTreeModel>> searchBy(@RequestParam(name = "keyWord", required = true) String keyWord,@RequestParam(name = "myDeptSearch", required = false) String myDeptSearch) {
  296. Result<List<SysDepartTreeModel>> result = new Result<List<SysDepartTreeModel>>();
  297. //部门查询,myDeptSearch为1时为我的部门查询,登录用户为上级时查只查负责部门下数据
  298. LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
  299. String departIds = null;
  300. if(oConvertUtils.isNotEmpty(user.getUserIdentity()) && user.getUserIdentity().equals( CommonConstant.USER_IDENTITY_2 )){
  301. departIds = user.getDepartIds();
  302. }
  303. List<SysDepartTreeModel> treeList = this.sysDepartService.searhBy(keyWord,myDeptSearch,departIds);
  304. if (treeList == null || treeList.size() == 0) {
  305. result.setSuccess(false);
  306. result.setMessage("未查询匹配数据!");
  307. return result;
  308. }
  309. result.setResult(treeList);
  310. return result;
  311. }
  312. /**
  313. * 导出excel
  314. *
  315. * @param request
  316. */
  317. @RequestMapping(value = "/exportXls")
  318. public ModelAndView exportXls(SysDepart sysDepart,HttpServletRequest request) {
  319. // Step.1 组装查询条件
  320. QueryWrapper<SysDepart> queryWrapper = QueryGenerator.initQueryWrapper(sysDepart, request.getParameterMap());
  321. //Step.2 AutoPoi 导出Excel
  322. ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
  323. List<SysDepart> pageList = sysDepartService.list(queryWrapper);
  324. //按字典排序
  325. Collections.sort(pageList, new Comparator<SysDepart>() {
  326. @Override
  327. public int compare(SysDepart arg0, SysDepart arg1) {
  328. return arg0.getOrgCode().compareTo(arg1.getOrgCode());
  329. }
  330. });
  331. //导出文件名称
  332. mv.addObject(NormalExcelConstants.FILE_NAME, "部门列表");
  333. mv.addObject(NormalExcelConstants.CLASS, SysDepart.class);
  334. LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
  335. mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("部门列表数据", "导出人:"+user.getRealname(), "导出信息"));
  336. mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
  337. return mv;
  338. }
  339. /**
  340. * 通过excel导入数据
  341. *
  342. * @param request
  343. * @param response
  344. * @return
  345. */
  346. //@RequiresRoles({"admin"})
  347. @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
  348. @CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true)
  349. public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
  350. MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
  351. List<String> errorMessageList = new ArrayList<>();
  352. List<SysDepart> listSysDeparts = null;
  353. Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
  354. for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
  355. MultipartFile file = entity.getValue();// 获取上传文件对象
  356. ImportParams params = new ImportParams();
  357. params.setTitleRows(2);
  358. params.setHeadRows(1);
  359. params.setNeedSave(true);
  360. try {
  361. // orgCode编码长度
  362. int codeLength = YouBianCodeUtil.zhanweiLength;
  363. listSysDeparts = ExcelImportUtil.importExcel(file.getInputStream(), SysDepart.class, params);
  364. //按长度排序
  365. Collections.sort(listSysDeparts, new Comparator<SysDepart>() {
  366. @Override
  367. public int compare(SysDepart arg0, SysDepart arg1) {
  368. return arg0.getOrgCode().length() - arg1.getOrgCode().length();
  369. }
  370. });
  371. int num = 0;
  372. for (SysDepart sysDepart : listSysDeparts) {
  373. String orgCode = sysDepart.getOrgCode();
  374. if(orgCode.length() > codeLength) {
  375. String parentCode = orgCode.substring(0, orgCode.length()-codeLength);
  376. QueryWrapper<SysDepart> queryWrapper = new QueryWrapper<SysDepart>();
  377. queryWrapper.eq("org_code", parentCode);
  378. try {
  379. SysDepart parentDept = sysDepartService.getOne(queryWrapper);
  380. if(!parentDept.equals(null)) {
  381. sysDepart.setParentId(parentDept.getId());
  382. } else {
  383. sysDepart.setParentId("");
  384. }
  385. }catch (Exception e) {
  386. //没有查找到parentDept
  387. }
  388. }else{
  389. sysDepart.setParentId("");
  390. }
  391. //update-begin---author:liusq Date:20210223 for:批量导入部门以后,不能追加下一级部门 #2245------------
  392. sysDepart.setOrgType(sysDepart.getOrgCode().length()/codeLength+"");
  393. //update-end---author:liusq Date:20210223 for:批量导入部门以后,不能追加下一级部门 #2245------------
  394. sysDepart.setDelFlag(CommonConstant.DEL_FLAG_0.toString());
  395. ImportExcelUtil.importDateSaveOne(sysDepart, ISysDepartService.class, errorMessageList, num, CommonConstant.SQL_INDEX_UNIQ_DEPART_ORG_CODE);
  396. num++;
  397. }
  398. //清空部门缓存
  399. Set keys3 = redisTemplate.keys(CacheConstant.SYS_DEPARTS_CACHE + "*");
  400. Set keys4 = redisTemplate.keys(CacheConstant.SYS_DEPART_IDS_CACHE + "*");
  401. redisTemplate.delete(keys3);
  402. redisTemplate.delete(keys4);
  403. return ImportExcelUtil.imporReturnRes(errorMessageList.size(), listSysDeparts.size() - errorMessageList.size(), errorMessageList);
  404. } catch (Exception e) {
  405. log.error(e.getMessage(),e);
  406. return Result.error("文件导入失败:"+e.getMessage());
  407. } finally {
  408. try {
  409. file.getInputStream().close();
  410. } catch (IOException e) {
  411. e.printStackTrace();
  412. }
  413. }
  414. }
  415. return Result.error("文件导入失败!");
  416. }
  417. /**
  418. * 查询所有部门信息
  419. * @return
  420. */
  421. @GetMapping("listAll")
  422. public Result<List<SysDepart>> listAll(@RequestParam(name = "id", required = false) String id) {
  423. Result<List<SysDepart>> result = new Result<>();
  424. LambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<SysDepart>();
  425. query.orderByAsc(SysDepart::getOrgCode);
  426. if(oConvertUtils.isNotEmpty(id)){
  427. String arr[] = id.split(",");
  428. query.in(SysDepart::getId,arr);
  429. }
  430. List<SysDepart> ls = this.sysDepartService.list(query);
  431. result.setSuccess(true);
  432. result.setResult(ls);
  433. return result;
  434. }
  435. /**
  436. * 查询数据 查出所有部门,并以树结构数据格式响应给前端
  437. *
  438. * @return
  439. */
  440. @RequestMapping(value = "/queryTreeByKeyWord", method = RequestMethod.GET)
  441. public Result<Map<String,Object>> queryTreeByKeyWord(@RequestParam(name = "keyWord", required = false) String keyWord) {
  442. Result<Map<String,Object>> result = new Result<>();
  443. try {
  444. Map<String,Object> map=new HashMap<String,Object>();
  445. List<SysDepartTreeModel> list = sysDepartService.queryTreeByKeyWord(keyWord);
  446. //根据keyWord获取用户信息
  447. LambdaQueryWrapper<SysUser> queryUser = new LambdaQueryWrapper<SysUser>();
  448. queryUser.eq(SysUser::getDelFlag,CommonConstant.DEL_FLAG_0);
  449. queryUser.and(i -> i.like(SysUser::getUsername, keyWord).or().like(SysUser::getRealname, keyWord));
  450. List<SysUser> sysUsers = this.sysUserService.list(queryUser);
  451. map.put("userList",sysUsers);
  452. map.put("departList",list);
  453. result.setResult(map);
  454. result.setSuccess(true);
  455. } catch (Exception e) {
  456. log.error(e.getMessage(),e);
  457. }
  458. return result;
  459. }
  460. /**
  461. * 根据部门编码获取部门信息
  462. *
  463. * @param orgCode
  464. * @return
  465. */
  466. @GetMapping("/getDepartName")
  467. public Result<SysDepart> getDepartName(@RequestParam(name = "orgCode") String orgCode) {
  468. Result<SysDepart> result = new Result<>();
  469. LambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<>();
  470. query.eq(SysDepart::getOrgCode, orgCode);
  471. SysDepart sysDepart = sysDepartService.getOne(query);
  472. result.setSuccess(true);
  473. result.setResult(sysDepart);
  474. return result;
  475. }
  476. /**
  477. * 根据部门id获取用户信息
  478. *
  479. * @param id
  480. * @return
  481. */
  482. @GetMapping("/getUsersByDepartId")
  483. public Result<List<SysUser>> getUsersByDepartId(@RequestParam(name = "id") String id) {
  484. Result<List<SysUser>> result = new Result<>();
  485. List<SysUser> sysUsers = sysUserDepartService.queryUserByDepId(id);
  486. result.setSuccess(true);
  487. result.setResult(sysUsers);
  488. return result;
  489. }
  490. }