SysController.java 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866
  1. package com.qmth.distributed.print.api;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.qmth.boot.api.annotation.Aac;
  4. import com.qmth.boot.api.annotation.BOOL;
  5. import com.qmth.boot.api.constant.ApiConstant;
  6. import com.qmth.boot.api.exception.ApiException;
  7. import com.qmth.distributed.print.business.bean.params.LoginParam;
  8. import com.qmth.distributed.print.business.bean.result.DictionaryResult;
  9. import com.qmth.distributed.print.business.bean.result.EditResult;
  10. import com.qmth.distributed.print.business.entity.TBSyncTask;
  11. import com.qmth.distributed.print.business.entity.TeachClazz;
  12. import com.qmth.distributed.print.business.enums.DictionaryEnum;
  13. import com.qmth.distributed.print.business.enums.LoginTypeEnum;
  14. import com.qmth.distributed.print.business.service.ConditionService;
  15. import com.qmth.distributed.print.business.service.PrintCommonService;
  16. import com.qmth.distributed.print.business.service.TBSyncTaskService;
  17. import com.qmth.distributed.print.business.service.TeachClazzService;
  18. import com.qmth.distributed.print.business.util.PdfUtil;
  19. import com.qmth.teachcloud.common.annotation.OperationLogDetail;
  20. import com.qmth.teachcloud.common.bean.auth.AuthBean;
  21. import com.qmth.teachcloud.common.bean.result.LoginResult;
  22. import com.qmth.teachcloud.common.bean.result.UserLoginCheckResult;
  23. import com.qmth.teachcloud.common.config.DictionaryConfig;
  24. import com.qmth.teachcloud.common.contant.SystemConstant;
  25. import com.qmth.teachcloud.common.entity.*;
  26. import com.qmth.teachcloud.common.enums.*;
  27. import com.qmth.teachcloud.common.enums.log.CustomizedOperationTypeEnum;
  28. import com.qmth.teachcloud.common.enums.log.SystemEnum;
  29. import com.qmth.teachcloud.common.enums.userPush.SpecialPrivilegeEnum;
  30. import com.qmth.teachcloud.common.service.*;
  31. import com.qmth.teachcloud.common.util.FileUtil;
  32. import com.qmth.teachcloud.common.util.Result;
  33. import com.qmth.teachcloud.common.util.ResultUtil;
  34. import com.qmth.teachcloud.common.util.ServletUtil;
  35. import io.swagger.annotations.*;
  36. import org.apache.commons.lang3.StringUtils;
  37. import org.slf4j.Logger;
  38. import org.slf4j.LoggerFactory;
  39. import org.springframework.beans.BeanUtils;
  40. import org.springframework.transaction.annotation.Transactional;
  41. import org.springframework.validation.BindingResult;
  42. import org.springframework.web.bind.annotation.*;
  43. import org.springframework.web.multipart.MultipartFile;
  44. import javax.annotation.Resource;
  45. import javax.servlet.http.HttpServletResponse;
  46. import javax.validation.Valid;
  47. import java.io.File;
  48. import java.io.IOException;
  49. import java.io.InputStream;
  50. import java.net.URL;
  51. import java.security.NoSuchAlgorithmException;
  52. import java.util.*;
  53. import java.util.stream.Collectors;
  54. import java.util.stream.Stream;
  55. /**
  56. * @Date: 2021/3/30.
  57. */
  58. @Api(tags = "系统Controller")
  59. @RestController
  60. @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_COMMON)
  61. public class SysController {
  62. private final static Logger log = LoggerFactory.getLogger(SysController.class);
  63. @Resource
  64. SysUserService sysUserService;
  65. @Resource
  66. BasicVerifyCodeService basicVerifyCodeService;
  67. @Resource
  68. DictionaryConfig dictionaryConfig;
  69. @Resource
  70. CommonCacheService commonCacheService;
  71. @Resource
  72. PrintCommonService printCommonService;
  73. @Resource
  74. TBTaskService tbTaskService;
  75. @Resource
  76. BasicAttachmentService basicAttachmentService;
  77. @Resource
  78. SysUserRoleService sysUserRoleService;
  79. @Resource
  80. TeachcloudCommonService teachcloudCommonService;
  81. @Resource
  82. BasicMajorService basicMajorService;
  83. @Resource
  84. BasicClazzService basicClazzService;
  85. @Resource
  86. TeachClazzService teachClazzService;
  87. @Resource
  88. BasicStudentService basicStudentService;
  89. @Resource
  90. BasicSemesterService basicSemesterService;
  91. @Resource
  92. TBSyncTaskService tbSyncTaskService;
  93. @Resource
  94. AuthInfoService authInfoService;
  95. @Resource
  96. BasicOperationLogService basicOperationLogService;
  97. @Resource
  98. ConditionService conditionService;
  99. /**
  100. * 登录
  101. *
  102. * @param login
  103. * @return
  104. */
  105. @ApiOperation(value = "登录")
  106. @RequestMapping(value = "/login", method = RequestMethod.POST)
  107. @ApiResponses({@ApiResponse(code = 200, message = "用户信息", response = LoginResult.class)})
  108. @Aac(auth = BOOL.FALSE)
  109. public Result login(@ApiParam(value = "用户信息", required = true) @Valid @RequestBody LoginParam login, BindingResult bindingResult) throws NoSuchAlgorithmException {
  110. if (bindingResult.hasErrors()) {
  111. return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
  112. }
  113. if (Objects.nonNull(login.getSchoolCode()) && login.getSchoolCode().contains("#")) {
  114. login.setSchoolCode(login.getSchoolCode().substring(0, login.getSchoolCode().indexOf("#")));
  115. }
  116. BasicSchool basicSchool = null;
  117. if (!login.getSchoolCode().equalsIgnoreCase(SystemConstant.ADMIN_CODE)) {
  118. basicSchool = commonCacheService.schoolCache(login.getSchoolCode());
  119. if (Objects.isNull(basicSchool)) {
  120. throw ExceptionResultEnum.SCHOOL_NO_DATA.exception();
  121. }
  122. if (Objects.nonNull(basicSchool.getEnable()) && !basicSchool.getEnable()) {
  123. throw ExceptionResultEnum.SCHOOL_ENABLE.exception();
  124. }
  125. }
  126. QueryWrapper<SysUser> wrapper = new QueryWrapper<>();
  127. if (Objects.nonNull(basicSchool)) {
  128. wrapper.lambda().eq(SysUser::getSchoolId, basicSchool.getId());
  129. }
  130. // 账号密码登录
  131. List<SysUser> userList = null;
  132. if (LoginTypeEnum.ACCOUNT.name().equals(login.getType())) {
  133. String loginName = login.getLoginName();
  134. String password = login.getPassword();
  135. // 非空校验
  136. if (StringUtils.isBlank(loginName)) {
  137. throw ExceptionResultEnum.ERROR.exception("用户名不能为空");
  138. }
  139. if (StringUtils.isBlank(password)) {
  140. throw ExceptionResultEnum.ERROR.exception("密码不能为空");
  141. }
  142. wrapper.lambda().and(w -> w.eq(SysUser::getLoginName, loginName).or().eq(SysUser::getCode, loginName));
  143. userList = sysUserService.list(wrapper);
  144. //用户不存在
  145. if (userList == null || userList.isEmpty()) {
  146. throw ExceptionResultEnum.ERROR.exception("用户名或密码错误");
  147. }
  148. if (userList.size() > 1) {
  149. throw ExceptionResultEnum.ERROR.exception("用户名或密码错误");
  150. }
  151. SysUser sysUser = userList.get(0);
  152. if (!sysUser.getEnable()) {
  153. throw ExceptionResultEnum.ERROR.exception("用户被禁用");
  154. }
  155. if (!password.equals(userList.get(0).getPassword())) {
  156. throw ExceptionResultEnum.ERROR.exception("用户名或密码错误");
  157. }
  158. //2022.11.10日加入用户/密码模式是否开启短信验证
  159. if (!login.getSchoolCode().equalsIgnoreCase(SystemConstant.ADMIN_CODE)) {
  160. SysConfig sysConfigAccount = commonCacheService.addSysConfigCache(basicSchool.getId(), SystemConstant.ACCOUNT_SMS_VERIFY);
  161. if (Objects.nonNull(sysConfigAccount) && Objects.nonNull(sysConfigAccount.getConfigValue())
  162. && Boolean.valueOf(sysConfigAccount.getConfigValue())) {
  163. // 校验验证码
  164. sysUserService.checkSmsCode(sysUser.getId(), sysUser.getMobileNumber(), login.getCode());
  165. // 如果不是共用验证码再过期
  166. SysConfig sysConfig = commonCacheService.addSysConfigCache(SystemConstant.SMS_NORMAL_CODE);
  167. Optional.ofNullable(sysConfig).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未配置万能短信验证码"));
  168. if (!sysConfig.getConfigValue().equals(login.getCode())) {
  169. sysUserService.expiredVerifyCode(sysUser.getId(), sysUser.getMobileNumber());
  170. }
  171. }
  172. }
  173. } else if (LoginTypeEnum.PHONE.name().equals(login.getType())) {
  174. String mobileNumber = login.getMobileNumber();
  175. String code = login.getCode();
  176. // 非空校验
  177. if (StringUtils.isBlank(mobileNumber)) {
  178. throw ExceptionResultEnum.ERROR.exception("手机号不能为空");
  179. }
  180. if (StringUtils.isBlank(code)) {
  181. throw ExceptionResultEnum.ERROR.exception("验证码不能为空");
  182. }
  183. wrapper.lambda().eq(SysUser::getMobileNumber, mobileNumber);
  184. userList = sysUserService.list(wrapper);
  185. //用户不存在
  186. if (userList == null || userList.isEmpty()) {
  187. throw ExceptionResultEnum.ERROR.exception("用户不存在");
  188. }
  189. if (userList.size() > 1) {
  190. throw ExceptionResultEnum.ERROR.exception("查出多个用户");
  191. }
  192. SysUser sysUser = userList.get(0);
  193. // 校验验证码
  194. sysUserService.checkSmsCode(sysUser.getId(), sysUser.getMobileNumber(), code);
  195. // 如果不是共用验证码再过期
  196. SysConfig sysConfig = commonCacheService.addSysConfigCache(SystemConstant.SMS_NORMAL_CODE);
  197. Optional.ofNullable(sysConfig).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未配置万能短信验证码"));
  198. if (!sysConfig.getConfigValue().equals(login.getCode())) {
  199. sysUserService.expiredVerifyCode(sysUser.getId(), sysUser.getMobileNumber());
  200. }
  201. } else {
  202. throw ExceptionResultEnum.ERROR.exception("登录参数错误");
  203. }
  204. if (login.getSchoolCode().equalsIgnoreCase(SystemConstant.ADMIN_CODE)) {
  205. userList.forEach(o -> {
  206. AuthBean authBean = teachcloudCommonService.getUserAuth(o.getId());
  207. if (Objects.nonNull(authBean) && Objects.nonNull(authBean.getRoleList()) && authBean.getRoleList().size() > 0) {
  208. if (Objects.nonNull(authBean.getSchool())) {
  209. throw ExceptionResultEnum.ERROR.exception("用户无法通过当前页面登录");
  210. }
  211. }
  212. });
  213. }
  214. SysUser sysUser = userList.get(0);
  215. LoginResult loginResult = teachcloudCommonService.login(login.getPassword(), sysUser, AppSourceEnum.SYSTEM);
  216. try {
  217. basicOperationLogService.saveOperateLogWithNoAuth(sysUser.getSchoolId(), sysUser.getOrgId(), sysUser.getId(), "用户登录", CustomizedOperationTypeEnum.LOGIN, SystemEnum.DISTRIBUTED_PRINT);
  218. } catch (Exception e) {
  219. log.error(e.getMessage());
  220. }
  221. return ResultUtil.ok(loginResult);
  222. }
  223. /**
  224. * 登出
  225. *
  226. * @return
  227. */
  228. @ApiOperation(value = "登出")
  229. @RequestMapping(value = "/logout", method = RequestMethod.POST)
  230. @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})
  231. @OperationLogDetail(detail = "用户登出(注销)", customizedOperationType = CustomizedOperationTypeEnum.LOGOUT)
  232. public Result logout() throws NoSuchAlgorithmException {
  233. SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
  234. teachcloudCommonService.removeUserInfo(sysUser.getId(), false);
  235. return ResultUtil.ok();
  236. }
  237. /**
  238. * 发送验证码
  239. *
  240. * @param loginParam
  241. * @return
  242. */
  243. @ApiOperation(value = "发送验证码")
  244. @RequestMapping(value = "/get_verify_code", method = RequestMethod.POST)
  245. @Aac(auth = BOOL.FALSE)
  246. public Result getVerifyCode(@RequestBody LoginParam loginParam) {
  247. String mobileNumber = loginParam.getMobileNumber();
  248. if (StringUtils.isBlank(mobileNumber)) {
  249. throw ExceptionResultEnum.ERROR.exception("手机号不能为空");
  250. }
  251. QueryWrapper<SysUser> wrapper = new QueryWrapper<>();
  252. if (StringUtils.isNotBlank(loginParam.getSchoolCode())) {
  253. if (loginParam.getSchoolCode().contains("#")) {
  254. loginParam.setSchoolCode(loginParam.getSchoolCode().substring(0, loginParam.getSchoolCode().indexOf("#")));
  255. }
  256. BasicSchool basicSchool = commonCacheService.schoolCache(loginParam.getSchoolCode());
  257. if (Objects.nonNull(basicSchool)) {
  258. wrapper.lambda().eq(SysUser::getSchoolId, basicSchool.getId());
  259. }
  260. }
  261. wrapper.lambda().eq(SysUser::getMobileNumber, mobileNumber);
  262. List<SysUser> userList = sysUserService.list(wrapper);
  263. //用户不存在
  264. if (userList == null || userList.isEmpty()) {
  265. throw ExceptionResultEnum.ERROR.exception("手机号不存在");
  266. }
  267. if (userList.size() > 1) {
  268. throw ExceptionResultEnum.ERROR.exception("手机号绑定了多个用户");
  269. }
  270. SysUser sysUser = userList.get(0);
  271. if (!sysUser.getEnable()) {
  272. throw ExceptionResultEnum.ERROR.exception("手机号被禁用");
  273. }
  274. if (SystemConstant.strNotNull(mobileNumber)) {
  275. basicVerifyCodeService.sendVeirfyCode(mobileNumber, sysUser);
  276. }
  277. int pwdCount = sysUser.getPwdCount();
  278. List<SysRole> sysRoleList = sysUserRoleService.listRoleByUserId(sysUser.getId());
  279. if (sysRoleList.stream().map(SysRole::getType).collect(Collectors.toSet()).contains(RoleTypeEnum.ADMIN)) {
  280. mobileNumber = sysUser.getLoginName() + "(特权用户)";
  281. pwdCount = 1;
  282. }
  283. UserLoginCheckResult userLoginCheckResult = new UserLoginCheckResult(sysUser.getId(), mobileNumber, pwdCount);
  284. return ResultUtil.ok(userLoginCheckResult, "");
  285. }
  286. /**
  287. * 发送验证码
  288. *
  289. * @param loginParam
  290. * @return
  291. */
  292. @ApiOperation(value = "发送验证码")
  293. @RequestMapping(value = "/get_verify_code_by_account", method = RequestMethod.POST)
  294. @Aac(auth = BOOL.FALSE)
  295. public Object getverifyCodeByAccount(@RequestBody LoginParam loginParam) {
  296. String loginName = loginParam.getLoginName();
  297. String password = loginParam.getPassword();
  298. QueryWrapper<SysUser> wrapper = new QueryWrapper<>();
  299. if (StringUtils.isNotBlank(loginParam.getSchoolCode())) {
  300. if (loginParam.getSchoolCode().contains("#")) {
  301. loginParam.setSchoolCode(loginParam.getSchoolCode().substring(0, loginParam.getSchoolCode().indexOf("#")));
  302. }
  303. BasicSchool basicSchool = commonCacheService.schoolCache(loginParam.getSchoolCode());
  304. wrapper.lambda().eq(SysUser::getSchoolId, basicSchool.getId());
  305. }
  306. wrapper.lambda().eq(SysUser::getLoginName, loginName);
  307. SysUser user = sysUserService.getOne(wrapper);
  308. //用户不存在
  309. if (Objects.isNull(user)) {
  310. throw ExceptionResultEnum.ERROR.exception("用户不存在");
  311. }
  312. if (!password.equals(user.getPassword())) {
  313. throw ExceptionResultEnum.ERROR.exception("密码错误");
  314. }
  315. String mobileNumber = user.getMobileNumber();
  316. if (Objects.isNull(mobileNumber)) {
  317. throw ExceptionResultEnum.ERROR.exception("用户未绑定手机号码");
  318. }
  319. basicVerifyCodeService.sendVeirfyCode(mobileNumber, user);
  320. return ResultUtil.ok(mobileNumber, "");
  321. }
  322. /**
  323. * 发送验证码(绑定手机号)
  324. *
  325. * @param loginParam
  326. * @return
  327. */
  328. @ApiOperation(value = "发送验证码(绑定手机号)")
  329. @RequestMapping(value = "/get_verify_code_for_bind", method = RequestMethod.POST)
  330. @Aac(auth = BOOL.FALSE)
  331. public Result getVerifyCodeForBind(@RequestBody LoginParam loginParam) {
  332. String loginName = loginParam.getLoginName();
  333. String password = loginParam.getPassword();
  334. String schoolCode = loginParam.getSchoolCode();
  335. if (Objects.nonNull(schoolCode) && schoolCode.contains("#")) {
  336. schoolCode = schoolCode.substring(0, schoolCode.indexOf("#"));
  337. }
  338. String mobileNumber = loginParam.getMobileNumber();
  339. if (StringUtils.isBlank(schoolCode)) {
  340. throw ExceptionResultEnum.ERROR.exception("学校代码不能为空");
  341. }
  342. QueryWrapper<SysUser> wrapper = new QueryWrapper<>();
  343. BasicSchool basicSchool = commonCacheService.schoolCache(schoolCode);
  344. if (Objects.isNull(basicSchool)) {
  345. throw ExceptionResultEnum.ERROR.exception("学校不存在");
  346. }
  347. if (StringUtils.isBlank(mobileNumber)) {
  348. throw ExceptionResultEnum.ERROR.exception("手机号不能为空");
  349. }
  350. wrapper.lambda().eq(SysUser::getSchoolId, basicSchool.getId())
  351. .eq(SysUser::getMobileNumber, mobileNumber);
  352. List<SysUser> userList = sysUserService.list(wrapper);
  353. if (userList != null && userList.size() > 0) {
  354. throw ExceptionResultEnum.ERROR.exception("手机号已使用");
  355. }
  356. // 根据账号/密码取用户ID
  357. if (StringUtils.isBlank(loginName)) {
  358. throw ExceptionResultEnum.ERROR.exception("账号不能为空");
  359. }
  360. if (StringUtils.isBlank(password)) {
  361. throw ExceptionResultEnum.ERROR.exception("密码不能为空");
  362. }
  363. QueryWrapper<SysUser> sysUserQueryWrapper = new QueryWrapper<>();
  364. sysUserQueryWrapper.lambda().eq(SysUser::getSchoolId, basicSchool.getId())
  365. .and(w -> w.eq(SysUser::getLoginName, loginName).or().eq(SysUser::getCode, loginName))
  366. .eq(SysUser::getPassword, password);
  367. SysUser sysUser = sysUserService.getOne(sysUserQueryWrapper);
  368. if (sysUser == null) {
  369. throw ExceptionResultEnum.ERROR.exception("用户数据异常");
  370. }
  371. // 发送短信验证码
  372. basicVerifyCodeService.sendVeirfyCode(mobileNumber, sysUser);
  373. int pwdCount = sysUser.getPwdCount();
  374. List<SysRole> sysRoleList = sysUserRoleService.listRoleByUserId(sysUser.getId());
  375. if (sysRoleList.stream().map(SysRole::getType).collect(Collectors.toSet()).contains(RoleTypeEnum.ADMIN)) {
  376. mobileNumber = sysUser.getLoginName() + "(特权用户)";
  377. pwdCount = 1;
  378. }
  379. UserLoginCheckResult userLoginCheckResult = new UserLoginCheckResult(sysUser.getId(), mobileNumber, pwdCount);
  380. return ResultUtil.ok(userLoginCheckResult, "");
  381. }
  382. @ApiOperation(value = "根据机构代码查询机构信息接口")
  383. @RequestMapping(value = "/school/query_by_school_code", method = RequestMethod.POST)
  384. @ApiResponses({@ApiResponse(code = 200, message = "学校信息", response = EditResult.class)})
  385. @Aac(auth = BOOL.FALSE)
  386. public Result queryBySchoolCode(@ApiParam(value = "机构code", required = true) @RequestParam String code) {
  387. if (Objects.nonNull(code) && code.contains("#")) {
  388. code = code.substring(0, code.indexOf("#"));
  389. }
  390. Map<String, Object> map = new HashMap<>();
  391. map.put(SystemConstant.VERSION, SystemConstant.VERSION_VALUE);
  392. if (!code.equalsIgnoreCase(SystemConstant.ADMIN_CODE)) {
  393. BasicSchool basicSchool = commonCacheService.schoolCache(code);
  394. Optional.ofNullable(basicSchool).orElseThrow(() -> ExceptionResultEnum.SCHOOL_NO_DATA.exception());
  395. authInfoService.appHasExpired(code);
  396. SysConfig sysConfig = commonCacheService.addSysConfigCache(basicSchool.getId(), SystemConstant.ACCOUNT_SMS_VERIFY);
  397. map.put(SystemConstant.LOGO, basicSchool.getLogo());
  398. map.put("name", basicSchool.getName());
  399. map.put("accountSmsVerify", Objects.nonNull(sysConfig) ? Boolean.valueOf(sysConfig.getConfigValue()) : false);
  400. // 若为在线激活,则允许手机号登录
  401. map.put("phoneLogin", authInfoService.allowPhoneLogin(basicSchool.getId()));
  402. } else {
  403. SysConfig sysConfig = commonCacheService.addSysConfigCache(SystemConstant.ADMIN_LOGO_URL);
  404. map.put(SystemConstant.LOGO, Objects.nonNull(sysConfig) ? sysConfig.getConfigValue() : null);
  405. map.put("name", null);
  406. map.put("accountSmsVerify", false);
  407. // 若为在线激活,则允许手机号登录,超管默认false
  408. map.put("phoneLogin", false);
  409. }
  410. return ResultUtil.ok(map);
  411. }
  412. @ApiOperation(value = "文件上传接口")
  413. @RequestMapping(value = "/file/upload", method = RequestMethod.POST)
  414. @Transactional
  415. @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})
  416. public Result fileUpload(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file,
  417. @ApiParam(value = "上传文件类型", required = true) @RequestParam UploadFileEnum type) {
  418. BasicAttachment basicAttachment = null;
  419. try {
  420. basicAttachment = printCommonService.saveAttachment(file, ServletUtil.getRequestMd5(), type);
  421. if (Objects.isNull(basicAttachment)) {
  422. throw ExceptionResultEnum.ATTACHMENT_ERROR.exception();
  423. }
  424. } catch (Exception e) {
  425. log.error(SystemConstant.LOG_ERROR, e);
  426. if (Objects.nonNull(basicAttachment)) {
  427. basicAttachmentService.deleteAttachment(basicAttachment);
  428. }
  429. if (e instanceof ApiException) {
  430. ResultUtil.error((ApiException) e, ((ApiException) e).getCode(), e.getMessage());
  431. } else {
  432. ResultUtil.error(e.getMessage());
  433. }
  434. }
  435. return ResultUtil.ok(new EditResult(basicAttachment.getId(), teachcloudCommonService.filePreview(basicAttachment.getPath()), basicAttachment.getPages()));
  436. }
  437. @ApiOperation(value = "考试试卷文件上传接口")
  438. @RequestMapping(value = "/file/exam_paper_upload", method = RequestMethod.POST)
  439. @Transactional
  440. @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})
  441. public Result fileExamPaperUpload(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file,
  442. @ApiParam(value = "上传文件类型", required = true) @RequestParam UploadFileEnum type) {
  443. Map<String, EditResult> resultMap = new HashMap<>();
  444. BasicAttachment basicOriginalAttachment = null;
  445. BasicAttachment basicTranslateAttachment = null;
  446. File pdfOriginalFile = null;
  447. File localTempFile = null;
  448. try {
  449. pdfOriginalFile = FileUtil.multipartFileToFile(file);
  450. PageSizeEnum pageSizeEnum = PdfUtil.getPdfFormat(pdfOriginalFile);
  451. basicOriginalAttachment = printCommonService.saveAttachment(file, ServletUtil.getRequestMd5(), type);
  452. if (Objects.isNull(basicOriginalAttachment)) {
  453. throw ExceptionResultEnum.ATTACHMENT_ERROR.exception();
  454. }
  455. EditResult original = new EditResult(basicOriginalAttachment.getId(), teachcloudCommonService.filePreview(basicOriginalAttachment.getPath()), basicOriginalAttachment.getPages(), pageSizeEnum);
  456. EditResult translate = new EditResult();
  457. BeanUtils.copyProperties(original, translate);
  458. // switch (pageSizeEnum) {
  459. // case A3:
  460. // basicOriginalAttachment = printCommonService.saveAttachment(file, ServletUtil.getRequestMd5(), type);
  461. // if (Objects.isNull(basicOriginalAttachment)) {
  462. // throw ExceptionResultEnum.ATTACHMENT_ERROR.exception();
  463. // }
  464. // original.setId(basicOriginalAttachment.getId());
  465. // original.setUrl(teachcloudCommonService.filePreview(basicOriginalAttachment.getPath()));
  466. // original.setPages(basicOriginalAttachment.getPages());
  467. //
  468. // BeanUtils.copyProperties(original, translate);
  469. // break;
  470. // case A4:
  471. // basicOriginalAttachment = printCommonService.saveAttachment(file, ServletUtil.getRequestMd5(), type);
  472. // if (Objects.isNull(basicOriginalAttachment)) {
  473. // throw ExceptionResultEnum.ATTACHMENT_ERROR.exception();
  474. // }
  475. // original.setId(basicOriginalAttachment.getId());
  476. // original.setUrl(teachcloudCommonService.filePreview(basicOriginalAttachment.getPath()));
  477. // original.setPages(basicOriginalAttachment.getPages());
  478. //
  479. // String destUrl = dictionaryConfig.fssLocalPdfDomain().getConfig() + File.separator + file.getOriginalFilename();
  480. // localTempFile = new File(destUrl);
  481. // OutputStream out = new FileOutputStream(localTempFile);
  482. // PdfUtil.concatPDFs(new FileInputStream(pdfOriginalFile), out, false);
  483. // // File转换成MutipartFile
  484. // FileInputStream inputStream = new FileInputStream(localTempFile);
  485. // MultipartFile multipartFile = new MockMultipartFile(localTempFile.getName(), localTempFile.getName(), ContentType.APPLICATION_OCTET_STREAM.toString(), inputStream);
  486. // basicTranslateAttachment = printCommonService.saveAttachment(multipartFile, DigestUtils.md5Hex(multipartFile.getBytes()), type);
  487. // translate.setId(basicTranslateAttachment.getId());
  488. // translate.setUrl(teachcloudCommonService.filePreview(basicTranslateAttachment.getPath()));
  489. // translate.setPages(basicTranslateAttachment.getPages());
  490. // break;
  491. // default:
  492. // throw ExceptionResultEnum.ERROR.exception("请上传A4或A3格式的试卷文件");
  493. // }
  494. resultMap.put("original", original);
  495. resultMap.put("translate", translate);
  496. } catch (Exception e) {
  497. log.error(SystemConstant.LOG_ERROR, e);
  498. if (Objects.nonNull(basicOriginalAttachment)) {
  499. basicAttachmentService.deleteAttachment(basicOriginalAttachment);
  500. }
  501. if (Objects.nonNull(basicTranslateAttachment)) {
  502. basicAttachmentService.deleteAttachment(basicTranslateAttachment);
  503. }
  504. if (e instanceof ApiException) {
  505. ResultUtil.error((ApiException) e, ((ApiException) e).getCode(), e.getMessage());
  506. } else {
  507. ResultUtil.error(e.getMessage());
  508. }
  509. } finally {
  510. if (Objects.nonNull(localTempFile) && Objects.nonNull(dictionaryConfig.sysDomain()) && dictionaryConfig.sysDomain().isOss()) {
  511. FileUtil.deleteFile(localTempFile);
  512. }
  513. if (Objects.nonNull(pdfOriginalFile) && Objects.nonNull(dictionaryConfig.sysDomain())) {
  514. FileUtil.deleteFile(pdfOriginalFile);
  515. }
  516. }
  517. return ResultUtil.ok(resultMap);
  518. }
  519. @ApiOperation(value = "文件下载接口")
  520. @RequestMapping(value = "/file/download", method = RequestMethod.POST)
  521. @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})
  522. public Result fileDownload(@ApiParam(value = "任务id", required = true) @RequestParam String id,
  523. @ApiParam(value = "下载文件类型", required = true) @RequestParam DownloadFileEnum type) {
  524. String path = null;
  525. if (DownloadFileEnum.SYNC_REPORT.equals(type)) {
  526. TBSyncTask tbSyncTask = tbSyncTaskService.getById(SystemConstant.convertIdToLong(id));
  527. if (Objects.isNull(tbSyncTask)) {
  528. throw ExceptionResultEnum.SYNC_TASK_NO_DATA.exception();
  529. }
  530. path = tbSyncTask.getReportFilePath();
  531. } else {
  532. TBTask tbTask = tbTaskService.getById(Long.parseLong(id));
  533. if (Objects.isNull(tbTask)) {
  534. throw ExceptionResultEnum.TASK_NO_DATA.exception();
  535. }
  536. switch (type) {
  537. case IMPORT_FILE:
  538. path = tbTask.getImportFilePath();
  539. break;
  540. case TASK_REPORT:
  541. path = tbTask.getReportFilePath();
  542. break;
  543. case RESULT:
  544. path = tbTask.getResultFilePath();
  545. break;
  546. case ERROR_FILE:
  547. path = tbTask.getErrorFilePath();
  548. break;
  549. default:
  550. break;
  551. }
  552. }
  553. if (Objects.isNull(path)) {
  554. throw ExceptionResultEnum.PATH_NO_DATA.exception();
  555. }
  556. return ResultUtil.ok(new EditResult(teachcloudCommonService.filePreview(path)));
  557. }
  558. @ApiOperation(value = "文件预览接口")
  559. @RequestMapping(value = "/file/preview", method = RequestMethod.POST)
  560. @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})
  561. public Result filePreview(@ApiParam(value = "附件id", required = false, defaultValue = "") @RequestParam(value = "id", required = false, defaultValue = "") String id) {
  562. if (StringUtils.isBlank(id)) {
  563. throw ExceptionResultEnum.ERROR.exception("没有附件");
  564. } else {
  565. BasicAttachment basicAttachment = basicAttachmentService.getById(Long.parseLong(id));
  566. return ResultUtil.ok(new EditResult(teachcloudCommonService.filePreview(basicAttachment.getPath())));
  567. }
  568. }
  569. @ApiOperation(value = "查询用户权限")
  570. @RequestMapping(value = "/get_menu", method = RequestMethod.POST)
  571. public Result getMenu() {
  572. return ResultUtil.ok(sysUserRoleService.listByUserId());
  573. }
  574. @ApiOperation(value = "获取服务器时间")
  575. @RequestMapping(value = "/get_system_time", method = RequestMethod.POST)
  576. @Aac(auth = BOOL.FALSE)
  577. public Result getSystemTime() {
  578. return ResultUtil.ok(System.currentTimeMillis());
  579. }
  580. @ApiOperation(value = "获取系统编码")
  581. @RequestMapping(value = "/get_code", method = RequestMethod.POST)
  582. public Result getCode(@ApiParam(value = "编码类型", required = true) @RequestParam SystemCodeEnum type) {
  583. SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
  584. String number = teachcloudCommonService.getSysIncrCode(type, sysUser);
  585. return ResultUtil.ok((Object) number);
  586. }
  587. @ApiOperation(value = "共用接口-查询字典")
  588. @RequestMapping(value = "/get_dictionary", method = RequestMethod.POST)
  589. @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
  590. public Result findDictionaryList(@ApiParam(value = "学生学院id") @RequestParam(required = false) String collegeId,
  591. @ApiParam(value = "专业id") @RequestParam(required = false) String majorId,
  592. @ApiParam(value = "班级id") @RequestParam(required = false) String clazzId,
  593. @ApiParam(value = "学生id") @RequestParam(required = false) String studentId,
  594. @ApiParam(value = "查询字典对象", required = true) @RequestParam DictionaryEnum dictionaryEnum) {
  595. Long schoolId = SystemConstant.convertIdToLong(ServletUtil.getRequestHeaderSchoolId().toString());
  596. List<DictionaryResult> dictionaryResultList = new ArrayList<>();
  597. switch (dictionaryEnum) {
  598. case SEMESTER:
  599. List<BasicSemester> basicSemesterList = basicSemesterService.list(new QueryWrapper<BasicSemester>()
  600. .lambda()
  601. .eq(BasicSemester::getSchoolId, schoolId)
  602. .eq(BasicSemester::getEnable, true)
  603. .orderByDesc(BasicSemester::getCreateTime));
  604. dictionaryResultList = basicSemesterList.stream().map(e -> {
  605. DictionaryResult dictionaryResult = new DictionaryResult();
  606. dictionaryResult.setId(e.getId());
  607. dictionaryResult.setCode(e.getCode());
  608. dictionaryResult.setName(e.getName());
  609. return dictionaryResult;
  610. }).collect(Collectors.toList());
  611. break;
  612. case COLLEGE:
  613. List<SysOrg> sysOrgs = conditionService.listCollege();
  614. dictionaryResultList = sysOrgs.stream().map(e -> {
  615. DictionaryResult dictionaryResult = new DictionaryResult();
  616. dictionaryResult.setId(e.getId());
  617. dictionaryResult.setName(e.getName());
  618. return dictionaryResult;
  619. }).collect(Collectors.toList());
  620. break;
  621. // case COLLEGE:
  622. // if (Objects.nonNull(semesterId)) {
  623. // QueryWrapper<BasicExam> basicExamQueryWrapper = new QueryWrapper<>();
  624. // basicExamQueryWrapper.lambda().eq(BasicExam::getSemesterId, SystemConstant.convertIdToLong(semesterId));
  625. // List<BasicExam> basicExamList = basicExamService.list(basicExamQueryWrapper);
  626. // if (Objects.nonNull(basicExamList) && basicExamList.size() > 0) {
  627. // List<Long> examIdList = basicExamList.stream().map(BaseEntity::getId).collect(Collectors.toList());
  628. // QueryWrapper<ExamPrintPlan> examPrintPlanQueryWrapper = new QueryWrapper<>();
  629. // examPrintPlanQueryWrapper.lambda().in(ExamPrintPlan::getExamId, examIdList);
  630. // List<ExamPrintPlan> examPrintPlanList = examPrintPlanService.list(examPrintPlanQueryWrapper);
  631. // if (Objects.nonNull(examPrintPlanList) && examPrintPlanList.size() > 0) {
  632. // Set<Long> orgIdSet = examPrintPlanList.stream().map(ExamPrintPlan::getOrgId).collect(Collectors.toSet());
  633. // QueryWrapper<SysOrg> sysOrgQueryWrapper = new QueryWrapper<>();
  634. // sysOrgQueryWrapper.lambda().in(SysOrg::getId, orgIdSet);
  635. // List<SysOrg> sysOrgList = sysOrgService.list(sysOrgQueryWrapper);
  636. // List<SysOrg> newSysOrgList = new ArrayList<>(sysOrgList);
  637. // for (SysOrg s : sysOrgList) {
  638. // if (s.getType() == OrgTypeEnum.SCHOOL) {
  639. // newSysOrgList.addAll(sysOrgService.findByConnectByRootOrgId(s.getId()));
  640. // } else if (s.getType() == OrgTypeEnum.TEACHING_ROOM || s.getType() == OrgTypeEnum.FACULTY || s.getType() == OrgTypeEnum.PRINTING_HOUSE) {
  641. // newSysOrgList.addAll(sysOrgService.findByConnectByParentId(s.getId(), true, false));
  642. // }
  643. // }
  644. // Map<Long, SysOrg> sysOrgMap = new LinkedHashMap<>();
  645. // for (SysOrg s : newSysOrgList) {
  646. // if (s.getType() == OrgTypeEnum.COLLEGE) {
  647. // sysOrgMap.put(s.getId(), s);
  648. // }
  649. // }
  650. // List<DictionaryResult> finalDictionaryResultList = dictionaryResultList;
  651. // sysOrgMap.forEach((k, v) -> {
  652. // DictionaryResult dictionaryResult = new DictionaryResult();
  653. // dictionaryResult.setId(v.getId());
  654. // dictionaryResult.setCode(v.getCode());
  655. // dictionaryResult.setName(v.getName());
  656. // finalDictionaryResultList.add(dictionaryResult);
  657. // });
  658. // }
  659. // }
  660. // } else {
  661. // List<SysOrg> sysOrgList = sysOrgService.list(new QueryWrapper<SysOrg>().lambda().eq(SysOrg::getSchoolId, schoolId).eq(SysOrg::getEnable, true));
  662. // dictionaryResultList = sysOrgList.stream().map(e -> {
  663. // DictionaryResult dictionaryResult = new DictionaryResult();
  664. // dictionaryResult.setId(e.getId());
  665. // dictionaryResult.setCode(e.getCode());
  666. // dictionaryResult.setName(e.getName());
  667. // return dictionaryResult;
  668. // }).collect(Collectors.toList());
  669. // }
  670. // break;
  671. case MAJOR:
  672. QueryWrapper<BasicMajor> majorQueryWrapper = new QueryWrapper<>();
  673. majorQueryWrapper.lambda()
  674. .eq(BasicMajor::getSchoolId, schoolId)
  675. .eq(BasicMajor::getEnable, true);
  676. if (SystemConstant.longNotNull(SystemConstant.convertIdToLong(collegeId))) {
  677. majorQueryWrapper.lambda().eq(BasicMajor::getBelongOrgId, collegeId);
  678. }
  679. List<BasicMajor> basicMajorList = basicMajorService.list(majorQueryWrapper);
  680. dictionaryResultList = basicMajorList.stream().map(e -> {
  681. DictionaryResult dictionaryResult = new DictionaryResult();
  682. dictionaryResult.setId(e.getId());
  683. dictionaryResult.setCode(e.getCode());
  684. dictionaryResult.setName(e.getName());
  685. return dictionaryResult;
  686. }).collect(Collectors.toList());
  687. break;
  688. case CLAZZ:
  689. QueryWrapper<BasicClazz> clazzQueryWrapper = new QueryWrapper<>();
  690. clazzQueryWrapper.lambda().eq(BasicClazz::getSchoolId, schoolId).eq(BasicClazz::getEnable, true);
  691. if (SystemConstant.longNotNull(SystemConstant.convertIdToLong(majorId))) {
  692. clazzQueryWrapper.lambda().eq(BasicClazz::getMajorId, majorId);
  693. }
  694. // 基础班
  695. List<BasicClazz> basicClazzList = basicClazzService.list(clazzQueryWrapper);
  696. List<DictionaryResult> resultBasicClazzList = basicClazzList.stream().map(e -> {
  697. DictionaryResult dictionaryResult = new DictionaryResult();
  698. dictionaryResult.setId(e.getId());
  699. dictionaryResult.setCode(e.getClazzCode());
  700. dictionaryResult.setName(e.getClazzName());
  701. return dictionaryResult;
  702. }).collect(Collectors.toList());
  703. dictionaryResultList.addAll(resultBasicClazzList);
  704. break;
  705. case ALL_CLAZZ: //针对归档管理临时处理用
  706. QueryWrapper<BasicClazz> basicClazzQueryWrapper = new QueryWrapper<>();
  707. basicClazzQueryWrapper.lambda().eq(BasicClazz::getSchoolId, schoolId).eq(BasicClazz::getEnable, true);
  708. if (SystemConstant.longNotNull(SystemConstant.convertIdToLong(majorId))) {
  709. basicClazzQueryWrapper.lambda().eq(BasicClazz::getMajorId, majorId);
  710. }
  711. // 基础班
  712. List<BasicClazz> bClazzList = basicClazzService.list(basicClazzQueryWrapper);
  713. List<DictionaryResult> rbClazzList = bClazzList.stream().map(e -> {
  714. DictionaryResult dictionaryResult = new DictionaryResult();
  715. dictionaryResult.setId(e.getId());
  716. dictionaryResult.setCode(e.getClazzCode());
  717. dictionaryResult.setName(e.getClazzName());
  718. return dictionaryResult;
  719. }).collect(Collectors.toList());
  720. dictionaryResultList.addAll(rbClazzList);
  721. // 教学班
  722. QueryWrapper<TeachClazz> teachClazzQueryWrapper = new QueryWrapper<>();
  723. teachClazzQueryWrapper.lambda().in(TeachClazz::getSchoolId, schoolId);
  724. List<TeachClazz> teachClazzList = teachClazzService.list(teachClazzQueryWrapper);
  725. List<DictionaryResult> resultTeachClazzList = teachClazzList.stream().map(e -> {
  726. DictionaryResult dictionaryResult = new DictionaryResult();
  727. dictionaryResult.setId(e.getId());
  728. dictionaryResult.setCode(e.getTeachClazzCode());
  729. dictionaryResult.setName(e.getTeachClazzName());
  730. return dictionaryResult;
  731. }).collect(Collectors.toList());
  732. if (resultTeachClazzList.size() > 0) {
  733. dictionaryResultList.addAll(resultTeachClazzList);
  734. }
  735. break;
  736. case STUDENT:
  737. QueryWrapper<BasicStudent> studentQueryWrapper = new QueryWrapper<>();
  738. studentQueryWrapper.lambda().eq(BasicStudent::getSchoolId, schoolId).eq(BasicStudent::getEnable, true);
  739. if (SystemConstant.longNotNull(SystemConstant.convertIdToLong(collegeId))) {
  740. studentQueryWrapper.lambda().eq(BasicStudent::getBelongOrgId, collegeId);
  741. }
  742. if (SystemConstant.longNotNull(SystemConstant.convertIdToLong(majorId))) {
  743. studentQueryWrapper.lambda().eq(BasicStudent::getMajorId, majorId);
  744. }
  745. if (SystemConstant.longNotNull(SystemConstant.convertIdToLong(clazzId))) {
  746. studentQueryWrapper.lambda().eq(BasicStudent::getClazzId, clazzId);
  747. }
  748. if (SystemConstant.longNotNull(SystemConstant.convertIdToLong(studentId))) {
  749. studentQueryWrapper.lambda().eq(BasicStudent::getId, studentId);
  750. }
  751. List<BasicStudent> basicStudentList = basicStudentService.list(studentQueryWrapper);
  752. dictionaryResultList = basicStudentList.stream().map(e -> {
  753. DictionaryResult dictionaryResult = new DictionaryResult();
  754. dictionaryResult.setId(e.getId());
  755. dictionaryResult.setCode(e.getStudentCode());
  756. dictionaryResult.setName(e.getStudentName());
  757. return dictionaryResult;
  758. }).collect(Collectors.toList());
  759. break;
  760. default:
  761. break;
  762. }
  763. return ResultUtil.ok(dictionaryResultList);
  764. }
  765. /**
  766. * 获取用户阅卷角色
  767. *
  768. * @return
  769. */
  770. @ApiOperation(value = "获取用户阅卷角色")
  771. @RequestMapping(value = "/get_open_role", method = RequestMethod.POST)
  772. public Result getOpenRole() {
  773. SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
  774. SpecialPrivilegeEnum userSpecialPrivilege = sysUserService.findUserSpecialPrivilegeByUserId(sysUser.getId(), sysUser.getSchoolId());
  775. List<SpecialPrivilegeEnum> list = new ArrayList<>();
  776. if (!SpecialPrivilegeEnum.UNIDENTIFIED.equals(userSpecialPrivilege)) {
  777. if (SpecialPrivilegeEnum.COMPOSITE.equals(userSpecialPrivilege)) {
  778. list.add(SpecialPrivilegeEnum.MARKER);
  779. list.add(SpecialPrivilegeEnum.SUBJECT_HEADER);
  780. } else {
  781. list.add(userSpecialPrivilege);
  782. }
  783. }
  784. return ResultUtil.ok(list);
  785. }
  786. /**
  787. * 下载导入模板
  788. *
  789. * @return
  790. */
  791. @ApiOperation(value = "下载导入模板")
  792. @RequestMapping(value = "/download_import_template", method = RequestMethod.POST)
  793. public void downloadImportTemplate(@RequestParam(value = "type") String type, HttpServletResponse response) throws IOException {
  794. List<String> templateEnums = Stream.of(ImportTemplateEnum.values()).map(m -> m.name()).collect(Collectors.toList());
  795. if (!templateEnums.contains(type)) {
  796. throw ExceptionResultEnum.ERROR.exception("不支持的模板类型");
  797. }
  798. ImportTemplateEnum importTemplateEnum = ImportTemplateEnum.valueOf(type);
  799. InputStream inputStream = FileUtil.getStream("temps/" + importTemplateEnum.getTemplateName());
  800. // 导出
  801. FileUtil.outputFile(response, inputStream, importTemplateEnum.getFileName());
  802. }
  803. }