SysController.java 43 KB

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