SysAdminSetController.java 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631
  1. package com.qmth.distributed.print.api;
  2. import com.alibaba.fastjson.JSON;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.qmth.boot.api.constant.ApiConstant;
  5. import com.qmth.distributed.print.business.backup.MySQLDatabaseBackup;
  6. import com.qmth.distributed.print.business.bean.dto.StudentNumberConfigDto;
  7. import com.qmth.distributed.print.business.bean.dto.StudentNumberLetterRelationShipDto;
  8. import com.qmth.distributed.print.business.bean.params.SysAdminSetParam;
  9. import com.qmth.distributed.print.business.bean.result.CustomPrivilegeResult;
  10. import com.qmth.distributed.print.business.bean.result.SysAdminSetResult;
  11. import com.qmth.teachcloud.common.annotation.OperationLogDetail;
  12. import com.qmth.teachcloud.common.bean.dto.PrivilegeDto;
  13. import com.qmth.teachcloud.common.bean.result.SysConfigResult;
  14. import com.qmth.teachcloud.common.contant.SystemConstant;
  15. import com.qmth.teachcloud.common.entity.*;
  16. import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
  17. import com.qmth.teachcloud.common.enums.FlowMsgTypeEnum;
  18. import com.qmth.teachcloud.common.enums.log.OperationTypeEnum;
  19. import com.qmth.teachcloud.common.service.*;
  20. import com.qmth.teachcloud.common.util.RedisUtil;
  21. import com.qmth.teachcloud.common.util.Result;
  22. import com.qmth.teachcloud.common.util.ResultUtil;
  23. import io.swagger.annotations.*;
  24. import org.apache.ibatis.annotations.Param;
  25. import org.springframework.transaction.annotation.Transactional;
  26. import org.springframework.util.CollectionUtils;
  27. import org.springframework.validation.BindingResult;
  28. import org.springframework.web.bind.annotation.*;
  29. import javax.annotation.Resource;
  30. import javax.validation.Valid;
  31. import java.security.NoSuchAlgorithmException;
  32. import java.util.*;
  33. import java.util.stream.Collectors;
  34. /**
  35. * @Description: 超管设置
  36. * @Param:
  37. * @return:
  38. * @Author: wangliang
  39. * @Date: 2021/10/29
  40. */
  41. @Api(tags = "超管设置Controller")
  42. @RestController
  43. @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_SET)
  44. //@Aac(auth = BOOL.FALSE, strict = BOOL.FALSE)
  45. public class SysAdminSetController {
  46. @Resource
  47. SysPrivilegeService sysPrivilegeService;
  48. @Resource
  49. TSchoolPrivilegeService tSchoolPrivilegeService;
  50. @Resource
  51. SysRolePrivilegeService sysRolePrivilegeService;
  52. @Resource
  53. SysRoleService sysRoleService;
  54. @Resource
  55. CommonCacheService commonCacheService;
  56. @Resource
  57. SysUserRoleService sysUserRoleService;
  58. @Resource
  59. TeachcloudCommonService commonService;
  60. @Resource
  61. SysConfigService sysConfigService;
  62. @Resource
  63. MySQLDatabaseBackup mySQLDatabaseBackup;
  64. @Resource
  65. TSchoolRoleService tSchoolRoleService;
  66. @Resource
  67. private FileUploadService fileUploadService;
  68. @Resource
  69. private RedisUtil redisUtil;
  70. @ApiOperation(value = "数据还原")
  71. @ApiResponses({@ApiResponse(code = 200, message = "数据还原信息", response = ResultUtil.class)})
  72. @RequestMapping(value = "/backup", method = RequestMethod.POST)
  73. @OperationLogDetail(operationType = OperationTypeEnum.UPDATE)
  74. public Result sysadminBackup(@ApiParam(value = "学校ID", required = true) @RequestParam Long schoolId) {
  75. mySQLDatabaseBackup.backupAndDeleteData(schoolId);
  76. return ResultUtil.ok(true);
  77. }
  78. @ApiOperation(value = "同步配置查询")
  79. @ApiResponses({@ApiResponse(code = 200, message = "同步配置信息", response = SysAdminSetResult.class)})
  80. @RequestMapping(value = "/sync/select", method = RequestMethod.POST)
  81. public Result sysadminSyncSelect(@ApiParam(value = "学校id ", required = true) @RequestParam Long schoolId) {
  82. SysConfig sysConfigQuestionHostUrl = commonCacheService.addSysConfigCache(schoolId, SystemConstant.QUESTION_HOST_URL);
  83. SysConfig sysConfigTeachcloudReportHostUrl = commonCacheService.addSysConfigCache(schoolId, SystemConstant.TEACHCLOUD_REPORT_HOST_URL);
  84. SysConfig sysConfigOpenFlowMsgPush = commonCacheService.addSysConfigCache(schoolId, SystemConstant.OPEN_FLOW_MESSAGE_PUSH);
  85. SysConfig sysConfigFlowMsgType = commonCacheService.addSysConfigCache(schoolId, SystemConstant.FLOW_MESSAGE_TYPE);
  86. SysConfig sysConfigMqHostUrl = commonCacheService.addSysConfigCache(schoolId, SystemConstant.MQ_HOST_URL);
  87. List<SysConfigResult> sysConfigResultList = new ArrayList<>();
  88. if (Objects.nonNull(sysConfigQuestionHostUrl)) {
  89. sysConfigResultList.add(new SysConfigResult(sysConfigQuestionHostUrl));
  90. } else {
  91. sysConfigResultList.add(new SysConfigResult(null, SystemConstant.QUESTION_HOST_URL, "题库地址", "", 1));
  92. }
  93. if (Objects.nonNull(sysConfigTeachcloudReportHostUrl)) {
  94. sysConfigResultList.add(new SysConfigResult(sysConfigTeachcloudReportHostUrl));
  95. } else {
  96. sysConfigResultList.add(new SysConfigResult(null, SystemConstant.TEACHCLOUD_REPORT_HOST_URL, "教研分析地址", "", 4));
  97. }
  98. if (Objects.nonNull(sysConfigOpenFlowMsgPush)) {
  99. sysConfigResultList.add(new SysConfigResult(sysConfigOpenFlowMsgPush));
  100. } else {
  101. sysConfigResultList.add(new SysConfigResult(null, SystemConstant.OPEN_FLOW_MESSAGE_PUSH, "是否开启消息推送", "false", 5));
  102. }
  103. if (Objects.nonNull(sysConfigFlowMsgType)) {
  104. sysConfigResultList.add(new SysConfigResult(sysConfigFlowMsgType));
  105. } else {
  106. sysConfigResultList.add(new SysConfigResult(null, SystemConstant.FLOW_MESSAGE_TYPE, "消息类型", FlowMsgTypeEnum.STANDARD, 6));
  107. }
  108. if (Objects.nonNull(sysConfigMqHostUrl)) {
  109. sysConfigResultList.add(new SysConfigResult(sysConfigMqHostUrl));
  110. } else {
  111. sysConfigResultList.add(new SysConfigResult(null, SystemConstant.MQ_HOST_URL, "消息中心地址", "", 7));
  112. }
  113. return ResultUtil.ok(new SysAdminSetResult(schoolId, sysConfigResultList));
  114. }
  115. @ApiOperation(value = "同步配置保存")
  116. @ApiResponses({@ApiResponse(code = 200, message = "同步配置信息", response = ResultUtil.class)})
  117. @RequestMapping(value = "/sync/save", method = RequestMethod.POST)
  118. @Transactional
  119. @OperationLogDetail(operationType = OperationTypeEnum.SAVE)
  120. public Result sysadminSyncSave(@Valid @RequestBody SysAdminSetParam sysAdminSetParam, BindingResult bindingResult) {
  121. if (bindingResult.hasErrors()) {
  122. return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
  123. }
  124. Optional.ofNullable(sysAdminSetParam.getParam()).orElseThrow(() -> ExceptionResultEnum.PARAMS_ERROR.exception("同步配置地址不能为空"));
  125. List<SysConfigResult> sysConfigResultList = sysAdminSetParam.getParam();
  126. List<SysConfig> sysConfigList = new ArrayList<>();
  127. for (SysConfigResult s : sysConfigResultList) {
  128. sysConfigList.add(new SysConfig(sysAdminSetParam.getSchoolId(), s));
  129. }
  130. sysConfigService.saveOrUpdateBatch(sysConfigList);
  131. for (SysConfigResult s : sysConfigResultList) {
  132. commonCacheService.updateSysConfigCache(sysAdminSetParam.getSchoolId(), s.getCode());
  133. }
  134. return ResultUtil.ok(true);
  135. }
  136. @ApiOperation(value = "系统试卷规格配置查询")
  137. @ApiResponses({@ApiResponse(code = 200, message = "系统试卷规格配置信息", response = CustomPrivilegeResult.class)})
  138. @RequestMapping(value = "/paper/sys/select", method = RequestMethod.POST)
  139. public Result sysadminPaperSysSelect() {
  140. SysAdminSetResult sysAdminSetResult = new SysAdminSetResult();
  141. List<SysConfigResult> list = new ArrayList<>();
  142. // pdf全局格式
  143. SysConfig sysPdfConfig = commonCacheService.addSysConfigCache(SystemConstant.SYS_PDF_SIZE_LIST);
  144. Optional.ofNullable(sysPdfConfig).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未配置全局上传试卷规格"));
  145. SysConfigResult pdfCell = new SysConfigResult(sysPdfConfig);
  146. pdfCell.setValue(Arrays.asList(sysPdfConfig.getConfigValue().replaceAll("\\[", "").replaceAll("\\]", "").split(", ")));
  147. list.add(pdfCell);
  148. // 题卡全局格式
  149. SysConfig sysCardConfig = commonCacheService.addSysConfigCache(SystemConstant.SYS_CARD_SIZE_LIST);
  150. Optional.ofNullable(sysCardConfig).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未配置全局上传试卷规格"));
  151. SysConfigResult cardCell = new SysConfigResult(sysCardConfig);
  152. cardCell.setValue(Arrays.asList(sysCardConfig.getConfigValue().replaceAll("\\[", "").replaceAll("\\]", "").split(", ")));
  153. list.add(cardCell);
  154. sysAdminSetResult.setResult(list);
  155. return ResultUtil.ok(sysAdminSetResult);
  156. }
  157. @ApiOperation(value = "试卷规格配置查询")
  158. @ApiResponses({@ApiResponse(code = 200, message = "试卷规格配置信息", response = SysAdminSetResult.class)})
  159. @RequestMapping(value = "/paper/select", method = RequestMethod.POST)
  160. public Result sysadminPaperSelect(@ApiParam(value = "学校id ", required = true) @RequestParam Long schoolId) {
  161. List<SysConfigResult> resultList = new ArrayList<>();
  162. // 试卷规格
  163. SysConfig sysConfigPdfSize = commonCacheService.addSysConfigCache(schoolId, SystemConstant.PDF_SIZE_LIST);
  164. List<String> pdfSize;
  165. SysConfigResult sysPdfConfigResult;
  166. if (Objects.nonNull(sysConfigPdfSize)) {
  167. pdfSize = Arrays.asList(
  168. sysConfigPdfSize.getConfigValue().replaceAll("\\[", "").replaceAll("\\]", "").split(", "));
  169. sysPdfConfigResult = new SysConfigResult(sysConfigPdfSize);
  170. sysPdfConfigResult.setValue(pdfSize);
  171. } else {
  172. sysPdfConfigResult = new SysConfigResult(null, SystemConstant.PDF_SIZE_LIST, "允许上传试卷规格", new ArrayList<>(),
  173. 1);
  174. }
  175. resultList.add(sysPdfConfigResult);
  176. // 题卡规格
  177. SysConfig sysConfigCardSize = commonCacheService.addSysConfigCache(schoolId, SystemConstant.CARD_SIZE_LIST);
  178. List<String> cardSize;
  179. SysConfigResult sysCardConfigResult;
  180. if (Objects.nonNull(sysConfigCardSize)) {
  181. cardSize = Arrays.asList(
  182. sysConfigCardSize.getConfigValue().replaceAll("\\[", "").replaceAll("\\]", "").split(", "));
  183. sysCardConfigResult = new SysConfigResult(sysConfigCardSize);
  184. sysCardConfigResult.setValue(cardSize);
  185. } else {
  186. sysCardConfigResult = new SysConfigResult(null, SystemConstant.CARD_SIZE_LIST, "允许上传题卡规格", new ArrayList<>(), 2);
  187. }
  188. resultList.add(sysCardConfigResult);
  189. SysAdminSetResult sysAdminSetResult = new SysAdminSetResult(schoolId);
  190. sysAdminSetResult.setResult(resultList);
  191. return ResultUtil.ok(sysAdminSetResult);
  192. }
  193. @ApiOperation(value = "试卷规格配置保存")
  194. @ApiResponses({@ApiResponse(code = 200, message = "试卷规格配置信息", response = ResultUtil.class)})
  195. @RequestMapping(value = "/paper/save", method = RequestMethod.POST)
  196. @Transactional
  197. @OperationLogDetail(operationType = OperationTypeEnum.SAVE)
  198. public Result sysadminPaperSave(@Valid @RequestBody SysAdminSetParam sysAdminSetParam, BindingResult bindingResult) {
  199. if (bindingResult.hasErrors()) {
  200. return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
  201. }
  202. Optional.ofNullable(sysAdminSetParam.getParam()).orElseThrow(() -> ExceptionResultEnum.PARAMS_ERROR.exception("试卷规格配置不能为空"));
  203. List<SysConfigResult> sysConfigResultList = sysAdminSetParam.getParam();
  204. List<SysConfig> sysConfigList = new ArrayList<>();
  205. for (SysConfigResult s : sysConfigResultList) {
  206. SysConfig sysConfig = new SysConfig(sysAdminSetParam.getSchoolId(), s);
  207. sysConfig.setConfigValue(Arrays.asList(s.getValue().toString().replaceAll("\\[", "").replaceAll("\\]", "").split(", ")).toString());
  208. sysConfigList.add(sysConfig);
  209. }
  210. sysConfigService.saveOrUpdateBatch(sysConfigList);
  211. for (SysConfigResult s : sysConfigResultList) {
  212. commonCacheService.updateSysConfigCache(sysAdminSetParam.getSchoolId(), s.getCode());
  213. }
  214. return ResultUtil.ok(true);
  215. }
  216. @ApiOperation(value = "学号配置查询")
  217. @ApiResponses({@ApiResponse(code = 200, message = "学号配置查询", response = SysAdminSetResult.class)})
  218. @RequestMapping(value = "/student_number_config/select", method = RequestMethod.POST)
  219. public Result sysadminStudentNumberConfigSelect(@ApiParam(value = "学校id ", required = true) @RequestParam Long schoolId) {
  220. List<SysConfigResult> resultList = new ArrayList<>();
  221. // 试卷规格
  222. SysConfig sysConfig = commonCacheService.addSysConfigCache(schoolId, SystemConstant.STUDENT_NUMBER_ALLOCATION);
  223. SysConfigResult sysConfigResult;
  224. if (Objects.nonNull(sysConfig)) {
  225. sysConfigResult = new SysConfigResult(sysConfig);
  226. StudentNumberConfigDto studentNumberConfigDto = JSON.parseObject(sysConfig.getConfigValue(), StudentNumberConfigDto.class);
  227. sysConfigResult.setValue(studentNumberConfigDto);
  228. } else {
  229. StudentNumberConfigDto studentNumberConfigDto = new StudentNumberConfigDto();
  230. studentNumberConfigDto.setDigit(0);
  231. studentNumberConfigDto.setContainsLetter(false);
  232. sysConfigResult = new SysConfigResult(null, SystemConstant.STUDENT_NUMBER_ALLOCATION, "学号配置",
  233. studentNumberConfigDto, 1);
  234. }
  235. resultList.add(sysConfigResult);
  236. SysAdminSetResult sysAdminSetResult = new SysAdminSetResult(schoolId);
  237. sysAdminSetResult.setResult(resultList);
  238. return ResultUtil.ok(sysAdminSetResult);
  239. }
  240. @ApiOperation(value = "学号配置保存")
  241. @ApiResponses({@ApiResponse(code = 200, message = "学号配置保存信息", response = ResultUtil.class)})
  242. @RequestMapping(value = "/student_number_config/save", method = RequestMethod.POST)
  243. @Transactional
  244. public Result sysadminStudentNumberConfigSave(@Valid @RequestBody SysAdminSetParam sysAdminSetParam, BindingResult bindingResult) {
  245. if (bindingResult.hasErrors()) {
  246. return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
  247. }
  248. Optional.ofNullable(sysAdminSetParam.getParam()).orElseThrow(() -> ExceptionResultEnum.PARAMS_ERROR.exception("学号配置不能为空"));
  249. List<SysConfigResult> sysConfigResultList = sysAdminSetParam.getParam();
  250. List<SysConfig> sysConfigList = new ArrayList<>();
  251. for (SysConfigResult s : sysConfigResultList) {
  252. StudentNumberConfigDto studentNumberConfigDto = JSON.parseObject(JSON.toJSONString(s.getValue()), StudentNumberConfigDto.class);
  253. Integer digit = studentNumberConfigDto.getDigit();
  254. Boolean containsLetter = studentNumberConfigDto.getContainsLetter();
  255. List<StudentNumberLetterRelationShipDto> relationList = studentNumberConfigDto.getRelationList();
  256. if (containsLetter && CollectionUtils.isEmpty(relationList)) {
  257. throw ExceptionResultEnum.ERROR.exception("学号配置中,包含字母时,必须配置字母对应关系");
  258. }
  259. for (StudentNumberLetterRelationShipDto studentNumberLetterRelationShipDto : relationList) {
  260. Integer columnIndex = studentNumberLetterRelationShipDto.getColumnIndex();
  261. if (columnIndex > digit) {
  262. throw ExceptionResultEnum.ERROR.exception(String.format("第[%s]列,字母所在列不能超过学号位数", columnIndex));
  263. }
  264. String[] letters = studentNumberLetterRelationShipDto.getLetters();
  265. int x = letters.length;
  266. if (x > 10) {
  267. throw ExceptionResultEnum.ERROR.exception(String.format("第[%s]列,字母对应关系中,字母个数不能超过10", columnIndex));
  268. }
  269. int y = (int) Arrays.stream(letters).distinct().count();
  270. if (x != y) {
  271. throw ExceptionResultEnum.ERROR.exception(String.format("第[%s]列,字母对应关系中,字母不能重复", columnIndex));
  272. }
  273. for (String letter : letters) {
  274. // 正则判断必须是大写字母
  275. if (!letter.matches("[A-Z]")) {
  276. throw ExceptionResultEnum.ERROR.exception(String.format("第[%s]列,字母对应关系中,[%s]必须为大写字母", columnIndex, letter));
  277. }
  278. }
  279. }
  280. SysConfig sysConfig = new SysConfig(sysAdminSetParam.getSchoolId(), s, true);
  281. sysConfigList.add(sysConfig);
  282. }
  283. sysConfigService.saveOrUpdateBatch(sysConfigList);
  284. for (SysConfigResult s : sysConfigResultList) {
  285. commonCacheService.updateSysConfigCache(sysAdminSetParam.getSchoolId(), s.getCode());
  286. }
  287. return ResultUtil.ok(true);
  288. }
  289. @ApiOperation(value = "用户验证查询")
  290. @ApiResponses({@ApiResponse(code = 200, message = "用户验证信息", response = SysAdminSetResult.class)})
  291. @RequestMapping(value = "/user/select", method = RequestMethod.POST)
  292. public Result sysadminUserSelect(@ApiParam(value = "学校id ", required = true) @RequestParam Long schoolId) {
  293. SysConfig sysConfigAccount = commonCacheService.addSysConfigCache(schoolId, SystemConstant.ACCOUNT_SMS_VERIFY);
  294. SysConfig sysConfigTeachcloudExchangeHostUrl = commonCacheService.addSysConfigCache(schoolId, SystemConstant.TEACHCLOUD_EXCHANGE_HOST_URL);
  295. List<SysConfigResult> sysConfigResultList = new ArrayList<>();
  296. if (Objects.nonNull(sysConfigAccount)) {
  297. sysConfigResultList.add(new SysConfigResult(sysConfigAccount));
  298. } else {
  299. sysConfigResultList.add(new SysConfigResult(null, SystemConstant.ACCOUNT_SMS_VERIFY, "用户/密码模式是否开启短信验证", false, 1));
  300. }
  301. if (Objects.nonNull(sysConfigTeachcloudExchangeHostUrl)) {
  302. sysConfigResultList.add(new SysConfigResult(sysConfigTeachcloudExchangeHostUrl));
  303. } else {
  304. sysConfigResultList.add(new SysConfigResult(null, SystemConstant.TEACHCLOUD_EXCHANGE_HOST_URL, "第三方统一身份认证", "", 2));
  305. }
  306. return ResultUtil.ok(new SysAdminSetResult(schoolId, sysConfigResultList));
  307. }
  308. @ApiOperation(value = "用户验证保存")
  309. @ApiResponses({@ApiResponse(code = 200, message = "用户验证信息", response = ResultUtil.class)})
  310. @RequestMapping(value = "/user/save", method = RequestMethod.POST)
  311. @Transactional
  312. @OperationLogDetail(operationType = OperationTypeEnum.SAVE)
  313. public Result sysadminUserSave(@Valid @RequestBody SysAdminSetParam sysAdminSetParam, BindingResult bindingResult) {
  314. if (bindingResult.hasErrors()) {
  315. return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
  316. }
  317. Optional.ofNullable(sysAdminSetParam.getParam()).orElseThrow(() -> ExceptionResultEnum.PARAMS_ERROR.exception("用户/密码模式是否开启不能为空"));
  318. List<SysConfigResult> sysConfigResultList = sysAdminSetParam.getParam();
  319. List<SysConfig> sysConfigList = new ArrayList<>();
  320. for (SysConfigResult s : sysConfigResultList) {
  321. sysConfigList.add(new SysConfig(sysAdminSetParam.getSchoolId(), s));
  322. }
  323. sysConfigService.saveOrUpdateBatch(sysConfigList);
  324. for (SysConfigResult s : sysConfigResultList) {
  325. commonCacheService.updateSysConfigCache(sysAdminSetParam.getSchoolId(), s.getCode());
  326. }
  327. return ResultUtil.ok(true);
  328. }
  329. @ApiOperation(value = "查询自定义菜单权限")
  330. @ApiResponses({@ApiResponse(code = 200, message = "菜单权限信息", response = CustomPrivilegeResult.class)})
  331. @RequestMapping(value = "/menu/custom/list", method = RequestMethod.POST)
  332. public Result customMenuList() {
  333. List<PrivilegeDto> customPrivilegeList = sysPrivilegeService.addCustomList();
  334. return ResultUtil.ok(new CustomPrivilegeResult(customPrivilegeList));
  335. }
  336. @ApiOperation(value = "学校新增/修改自定义菜单权限")
  337. @ApiResponses({@ApiResponse(code = 200, message = "菜单权限信息", response = ResultUtil.class)})
  338. @RequestMapping(value = "/menu/custom/save", method = RequestMethod.POST)
  339. @Transactional
  340. @OperationLogDetail(operationType = OperationTypeEnum.SAVE)
  341. public Result schoolPrivilegeSave(@Valid @RequestBody SysAdminSetParam tSchoolPrivilegeParam, BindingResult bindingResult) throws NoSuchAlgorithmException {
  342. if (bindingResult.hasErrors()) {
  343. return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
  344. }
  345. Set<Long> roleSetIds = null;
  346. QueryWrapper<TSchoolPrivilege> tSchoolPrivilegeQueryWrapper = new QueryWrapper<>();
  347. tSchoolPrivilegeQueryWrapper.lambda().eq(TSchoolPrivilege::getSchoolId, tSchoolPrivilegeParam.getSchoolId());
  348. List<TSchoolPrivilege> tSchoolPrivileges = tSchoolPrivilegeService.list(tSchoolPrivilegeQueryWrapper);
  349. if (!CollectionUtils.isEmpty(tSchoolPrivileges)) {//编辑
  350. Set<Long> changePrivilegeSetIds = tSchoolPrivileges.stream().filter(s -> !Arrays.asList(tSchoolPrivilegeParam.getPrivilegeIds()).contains(s.getPrivilegeId()))
  351. .collect(Collectors.toList())
  352. .stream().map(s -> s.getPrivilegeId())
  353. .collect(Collectors.toSet());
  354. //数据发生改变
  355. if (!CollectionUtils.isEmpty(changePrivilegeSetIds)) {
  356. //查询该菜单下所有角色,删除该角色所发生改变的菜单数据
  357. QueryWrapper<SysRole> sysRoleQueryWrapper = new QueryWrapper<>();
  358. sysRoleQueryWrapper.lambda().eq(SysRole::getSchoolId, tSchoolPrivilegeParam.getSchoolId());
  359. List<SysRole> sysRoleList = sysRoleService.list(sysRoleQueryWrapper);
  360. if (!CollectionUtils.isEmpty(sysRoleList)) {
  361. QueryWrapper<SysRolePrivilege> sysRolePrivilegeQueryWrapper = new QueryWrapper<>();
  362. sysRolePrivilegeQueryWrapper.lambda()
  363. .in(SysRolePrivilege::getRoleId, sysRoleList.stream().map(s -> s.getId()).collect(Collectors.toList()))
  364. .in(SysRolePrivilege::getPrivilegeId, changePrivilegeSetIds);
  365. List<SysRolePrivilege> sysRolePrivilegeList = sysRolePrivilegeService.list(sysRolePrivilegeQueryWrapper);
  366. //仅删除绑定了该权限的角色用户缓存
  367. roleSetIds = sysRolePrivilegeList.stream().map(s -> s.getRoleId()).collect(Collectors.toSet());
  368. sysRolePrivilegeService.remove(sysRolePrivilegeQueryWrapper);
  369. }
  370. }
  371. tSchoolPrivilegeService.remove(tSchoolPrivilegeQueryWrapper);
  372. }
  373. Long[] privilegeIds = tSchoolPrivilegeParam.getPrivilegeIds();
  374. if (Objects.nonNull(privilegeIds) && privilegeIds.length > 0) {
  375. List<TSchoolPrivilege> tSchoolPrivilegeList = new ArrayList<>();
  376. for (int i = 0; i < privilegeIds.length; i++) {
  377. tSchoolPrivilegeList.add(new TSchoolPrivilege(tSchoolPrivilegeParam.getSchoolId(), privilegeIds[i]));
  378. }
  379. tSchoolPrivilegeService.saveBatch(tSchoolPrivilegeList);
  380. }
  381. commonCacheService.removeSchoolPrivilegeCache(tSchoolPrivilegeParam.getSchoolId());
  382. //清缓存
  383. if (!CollectionUtils.isEmpty(roleSetIds)) {
  384. for (Long l : roleSetIds) {
  385. commonCacheService.removeRoleCache(l);
  386. // commonCacheService.removeRolePrivilegeCache(tSchoolPrivilegeParam.getSchoolId(), l);
  387. //绑定该角色的用户都需要清除鉴权缓存
  388. List<SysUserRole> sysUserRoleList = sysUserRoleService.listByRoleId(l);
  389. for (SysUserRole s : sysUserRoleList) {
  390. SysUser user = commonCacheService.userCache(s.getUserId());
  391. if (Objects.nonNull(user)) {
  392. commonService.removeUserInfo(s.getUserId(), true);
  393. } else {
  394. sysUserRoleService.removeById(s);
  395. }
  396. }
  397. }
  398. }
  399. // 更新用户菜单缓存
  400. Set<String> userMenuCacheKeySet = (Set<String>) redisUtil.getKeyPatterns(SystemConstant.USER_MENU_CACHE_LIKE);
  401. for (String key : userMenuCacheKeySet) {
  402. String userId = key.substring(key.lastIndexOf(":") + 1);
  403. commonCacheService.updateUserMenuCache(Long.valueOf(userId));
  404. commonCacheService.updateUserAuthCache(Long.valueOf(userId));
  405. }
  406. // 更新自定义菜单
  407. sysPrivilegeService.updateCustomList();
  408. return ResultUtil.ok(true);
  409. }
  410. @ApiOperation(value = "学校已绑定自定义菜单权限列表")
  411. @ApiResponses({@ApiResponse(code = 200, message = "菜单权限信息", response = SysAdminSetResult.class)})
  412. @RequestMapping(value = "/menu/custom/get_school_custom_privileges", method = RequestMethod.POST)
  413. public Result getSchoolPrivileges(@ApiParam(value = "学校id ", required = true) @RequestParam Long schoolId) {
  414. List<TSchoolPrivilege> tSchoolPrivilegeList = commonCacheService.addSchoolPrivilegeCache(schoolId);
  415. List<String> privilegeIdList = tSchoolPrivilegeList.stream().map(s -> String.valueOf(s.getPrivilegeId())).collect(Collectors.toList());
  416. SysAdminSetResult sysAdminSetResult = new SysAdminSetResult(schoolId);
  417. sysAdminSetResult.setPrivilegeIdList(CollectionUtils.isEmpty(privilegeIdList) ? new ArrayList<>() : privilegeIdList);
  418. return ResultUtil.ok(sysAdminSetResult);
  419. }
  420. @ApiOperation(value = "查询自定义角色权限")
  421. @ApiResponses({@ApiResponse(code = 200, message = "角色权限信息", response = CustomPrivilegeResult.class)})
  422. @RequestMapping(value = "/role/custom/list", method = RequestMethod.POST)
  423. public Result customRoleList() {
  424. List<SysRole> sysRoleList = commonCacheService.addCustomRoleCache();
  425. CustomPrivilegeResult customPrivilegeResult = new CustomPrivilegeResult();
  426. customPrivilegeResult.setCustomRoleList(sysRoleList);
  427. return ResultUtil.ok(sysRoleList);
  428. }
  429. @ApiOperation(value = "学校新增/修改自定义角色权限")
  430. @ApiResponses({@ApiResponse(code = 200, message = "角色权限信息", response = ResultUtil.class)})
  431. @RequestMapping(value = "/role/custom/save", method = RequestMethod.POST)
  432. @Transactional
  433. @OperationLogDetail(operationType = OperationTypeEnum.SAVE)
  434. public Result schoolRoleSave(@Valid @RequestBody SysAdminSetParam tSchoolPrivilegeParam, BindingResult bindingResult) throws NoSuchAlgorithmException {
  435. if (bindingResult.hasErrors()) {
  436. return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
  437. }
  438. Set<Long> userSetIds = new HashSet<>();
  439. QueryWrapper<TSchoolRole> tSchoolRoleQueryWrapper = new QueryWrapper<>();
  440. tSchoolRoleQueryWrapper.lambda().eq(TSchoolRole::getSchoolId, tSchoolPrivilegeParam.getSchoolId());
  441. List<TSchoolRole> tSchoolRoles = tSchoolRoleService.list(tSchoolRoleQueryWrapper);
  442. if (!CollectionUtils.isEmpty(tSchoolRoles)) {//编辑
  443. Set<Long> changeRoleSetIds = tSchoolRoles.stream().filter(s -> !Arrays.asList(tSchoolPrivilegeParam.getRoleIds()).contains(s.getRoleId()))
  444. .collect(Collectors.toList())
  445. .stream().map(s -> s.getRoleId())
  446. .collect(Collectors.toSet());
  447. //数据发生改变
  448. if (!CollectionUtils.isEmpty(changeRoleSetIds)) {
  449. //查询该角色下所有用户,删除该角色所发生改变的用户数据
  450. List<SysUserRole> sysUserRoleList = sysUserRoleService.listByRoleIdsAndSchoolId(changeRoleSetIds, tSchoolPrivilegeParam.getSchoolId());
  451. if (!CollectionUtils.isEmpty(sysUserRoleList)) {
  452. List<Long> ids = new ArrayList<>(sysUserRoleList.size());
  453. for (SysUserRole s : sysUserRoleList) {
  454. userSetIds.add(s.getUserId());
  455. ids.add(s.getId());
  456. }
  457. sysUserRoleService.removeByIds(ids);
  458. }
  459. }
  460. tSchoolRoleService.remove(tSchoolRoleQueryWrapper);
  461. }
  462. Long[] roleIds = tSchoolPrivilegeParam.getRoleIds();
  463. if (Objects.nonNull(roleIds) && roleIds.length > 0) {
  464. List<TSchoolRole> tSchoolRoleList = new ArrayList<>();
  465. for (int i = 0; i < roleIds.length; i++) {
  466. tSchoolRoleList.add(new TSchoolRole(tSchoolPrivilegeParam.getSchoolId(), roleIds[i]));
  467. }
  468. tSchoolRoleService.saveBatch(tSchoolRoleList);
  469. }
  470. commonCacheService.removeSchoolRoleCache(tSchoolPrivilegeParam.getSchoolId());
  471. //清缓存
  472. if (!CollectionUtils.isEmpty(userSetIds)) {
  473. for (Long l : userSetIds) {
  474. SystemConstant.deleteUserCache(l);
  475. }
  476. }
  477. return ResultUtil.ok(true);
  478. }
  479. @ApiOperation(value = "学校已绑定自定义角色权限列表")
  480. @ApiResponses({@ApiResponse(code = 200, message = "角色权限信息", response = SysAdminSetResult.class)})
  481. @RequestMapping(value = "/role/custom/get_school_custom_roles", method = RequestMethod.POST)
  482. public Result getSchoolRoles(@ApiParam(value = "学校id ", required = true) @RequestParam Long schoolId) {
  483. List<TSchoolRole> tSchoolRoleList = commonCacheService.addSchoolRoleCache(schoolId);
  484. List<String> roleIdList = tSchoolRoleList.stream().map(s -> String.valueOf(s.getRoleId())).collect(Collectors.toList());
  485. SysAdminSetResult sysAdminSetResult = new SysAdminSetResult(schoolId);
  486. sysAdminSetResult.setRoleIdList(CollectionUtils.isEmpty(roleIdList) ? new ArrayList<>() : roleIdList);
  487. return ResultUtil.ok(sysAdminSetResult);
  488. }
  489. @ApiOperation(value = "课程目标达成度模板配置查询")
  490. @ApiResponses({@ApiResponse(code = 200, message = "课程目标达成度模板配置查询", response = CustomPrivilegeResult.class)})
  491. @RequestMapping(value = "/course/degree/select", method = RequestMethod.POST)
  492. public Result sysadminCourseDegreeSelect(@ApiParam(value = "学校id ", required = true) @RequestParam Long schoolId) {
  493. SysConfig sysConfig = commonCacheService.addSysConfigCache(schoolId, SystemConstant.SCHOOL_COURSE_DEGREE_TEMPLATE);
  494. SysConfigResult sysConfigResult = new SysConfigResult();
  495. if (sysConfig != null) {
  496. sysConfigResult = new SysConfigResult(sysConfig);
  497. if (sysConfigResult != null && sysConfigResult.getValue() != null) {
  498. sysConfigResult.setValue(fileUploadService.filePreview(Long.valueOf(sysConfigResult.getValue().toString())));
  499. }
  500. }
  501. return ResultUtil.ok(sysConfigResult);
  502. }
  503. @ApiOperation(value = "课程目标达成度模板配置保存")
  504. @ApiResponses({@ApiResponse(code = 200, message = "课程目标达成度模板配置保存", response = CustomPrivilegeResult.class)})
  505. @RequestMapping(value = "/course/degree/save", method = RequestMethod.POST)
  506. public Result sysadminCourseDegreeSave(@ApiParam(value = "学校ID", required = true) @RequestParam Long schoolId,
  507. @ApiParam(value = "附件ID", required = true) @RequestParam Long attachmentId) {
  508. SysConfig sysConfig = commonCacheService.addSysConfigCache(schoolId, SystemConstant.SCHOOL_COURSE_DEGREE_TEMPLATE);
  509. if (sysConfig == null) {
  510. sysConfig = new SysConfig(schoolId, SystemConstant.SCHOOL_COURSE_DEGREE_TEMPLATE, "课程目标达成度模板配置", String.valueOf(attachmentId));
  511. } else {
  512. sysConfig.setConfigValue(String.valueOf(attachmentId));
  513. }
  514. if (sysConfigService.saveOrUpdate(sysConfig)) {
  515. commonCacheService.updateSysConfigCache(schoolId, sysConfig.getConfigKey());
  516. }
  517. SysConfigResult sysConfigResult = new SysConfigResult(sysConfig);
  518. if (sysConfigResult != null && sysConfigResult.getValue() != null) {
  519. sysConfigResult.setValue(fileUploadService.filePreview(Long.valueOf(sysConfigResult.getValue().toString())));
  520. }
  521. return ResultUtil.ok(sysConfigResult);
  522. }
  523. @ApiOperation(value = "数据同步参数查询")
  524. @ApiResponses({@ApiResponse(code = 200, message = "系统试卷规格配置信息", response = CustomPrivilegeResult.class)})
  525. @RequestMapping(value = "/data/sync/select", method = RequestMethod.POST)
  526. public Result dataSyncSelect(@ApiParam(value = "schoolId") @Param(value = "schoolId") Long schoolId) {
  527. SysAdminSetResult sysAdminSetResult = new SysAdminSetResult();
  528. List<SysConfigResult> list = new ArrayList<>();
  529. // 数据库类型
  530. SysConfig datasourceType = commonCacheService.addSysConfigCache(schoolId, SystemConstant.DATA_DATASOURCE_TYPE);
  531. list.add(datasourceType != null ? new SysConfigResult(datasourceType) : new SysConfigResult(null, SystemConstant.DATA_DATASOURCE_TYPE, "数据库类型", "", 1));
  532. // 数据库HOST
  533. SysConfig datasourceHost = commonCacheService.addSysConfigCache(schoolId, SystemConstant.DATA_DATASOURCE_HOST);
  534. list.add(datasourceHost != null ? new SysConfigResult(datasourceHost) : new SysConfigResult(null, SystemConstant.DATA_DATASOURCE_HOST, "HOST", "", 2));
  535. // 数据库PORT
  536. SysConfig datasourcePort = commonCacheService.addSysConfigCache(schoolId, SystemConstant.DATA_DATASOURCE_PORT);
  537. list.add(datasourcePort != null ? new SysConfigResult(datasourcePort) : new SysConfigResult(null, SystemConstant.DATA_DATASOURCE_PORT, "端口", "", 3));
  538. // 数据库DataName
  539. SysConfig datasourceDataName = commonCacheService.addSysConfigCache(schoolId, SystemConstant.DATA_DATASOURCE_DATANAME);
  540. list.add(datasourceDataName != null ? new SysConfigResult(datasourceDataName) : new SysConfigResult(null, SystemConstant.DATA_DATASOURCE_DATANAME, "数据库名", "", 4));
  541. // 数据库用户名
  542. SysConfig datasourceUserName = commonCacheService.addSysConfigCache(schoolId, SystemConstant.DATA_DATASOURCE_USERNAME);
  543. list.add(datasourceUserName != null ? new SysConfigResult(datasourceUserName) : new SysConfigResult(null, SystemConstant.DATA_DATASOURCE_USERNAME, "用户名", "", 5));
  544. // 数据库密码
  545. SysConfig datasourcePassword = commonCacheService.addSysConfigCache(schoolId, SystemConstant.DATA_DATASOURCE_PASSWORD);
  546. list.add(datasourcePassword != null ? new SysConfigResult(datasourcePassword) : new SysConfigResult(null, SystemConstant.DATA_DATASOURCE_PASSWORD, "密码", "", 6));
  547. sysAdminSetResult.setResult(list);
  548. return ResultUtil.ok(sysAdminSetResult);
  549. }
  550. @ApiOperation(value = "数据同步参数保存")
  551. @ApiResponses({@ApiResponse(code = 200, message = "同步配置信息", response = ResultUtil.class)})
  552. @RequestMapping(value = "/data/sync/save", method = RequestMethod.POST)
  553. @Transactional
  554. @OperationLogDetail(operationType = OperationTypeEnum.SAVE)
  555. public Result dataSyncSave(@Valid @RequestBody SysAdminSetParam sysAdminSetParam, BindingResult bindingResult) {
  556. if (bindingResult.hasErrors()) {
  557. return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
  558. }
  559. Optional.ofNullable(sysAdminSetParam.getParam()).orElseThrow(() -> ExceptionResultEnum.PARAMS_ERROR.exception("数据同步参数未填写"));
  560. List<SysConfigResult> sysConfigResultList = sysAdminSetParam.getParam();
  561. List<SysConfig> sysConfigList = new ArrayList<>();
  562. for (SysConfigResult s : sysConfigResultList) {
  563. sysConfigList.add(new SysConfig(sysAdminSetParam.getSchoolId(), s));
  564. }
  565. sysConfigService.saveOrUpdateBatch(sysConfigList);
  566. for (SysConfigResult s : sysConfigResultList) {
  567. commonCacheService.updateSysConfigCache(sysAdminSetParam.getSchoolId(), s.getCode());
  568. }
  569. return ResultUtil.ok(true);
  570. }
  571. }