package com.qmth.distributed.print.api; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.qmth.boot.api.annotation.Aac; import com.qmth.boot.api.constant.ApiConstant; import com.qmth.boot.api.exception.ApiException; import com.qmth.boot.core.rateLimit.annotation.RateLimit; import com.qmth.boot.core.rateLimit.entity.RateLimitTarget; import com.qmth.distributed.print.business.bean.params.LoginParam; import com.qmth.teachcloud.common.bean.result.*; import com.qmth.distributed.print.business.bean.result.EditResult; import com.qmth.distributed.print.business.entity.TBSyncTask; import com.qmth.distributed.print.business.enums.DictionaryEnum; import com.qmth.distributed.print.business.enums.LoginTypeEnum; import com.qmth.distributed.print.business.service.*; import com.qmth.distributed.print.business.util.PdfUtil; import com.qmth.teachcloud.common.annotation.OperationLogDetail; import com.qmth.teachcloud.common.bean.auth.AuthBean; import com.qmth.teachcloud.common.config.DictionaryConfig; import com.qmth.teachcloud.common.contant.SystemConstant; import com.qmth.teachcloud.common.entity.*; import com.qmth.teachcloud.common.enums.*; import com.qmth.teachcloud.common.enums.log.OperationTypeEnum; import com.qmth.teachcloud.common.service.*; import com.qmth.teachcloud.common.util.*; import io.swagger.annotations.*; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.security.NoSuchAlgorithmException; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; /** * @Date: 2021/3/30. */ @Api(tags = "系统Controller") @RestController @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_COMMON) public class SysController { private final static Logger log = LoggerFactory.getLogger(SysController.class); @Value("${com.qmth.logging.file-path}") private String sysLogPath; @Resource SysUserService sysUserService; @Resource BasicSchoolService basicSchoolService; @Resource BasicVerifyCodeService basicVerifyCodeService; @Resource DictionaryConfig dictionaryConfig; @Resource CommonCacheService commonCacheService; @Resource PrintCommonService printCommonService; @Resource TBTaskService tbTaskService; @Resource BasicAttachmentService basicAttachmentService; @Resource SysUserRoleService sysUserRoleService; @Resource TeachcloudCommonService teachcloudCommonService; @Resource BasicCourseService basicCourseService; @Resource BasicSemesterService basicSemesterService; @Resource private FileUploadService fileUploadService; @Resource TBSyncTaskService tbSyncTaskService; @Resource AuthInfoService authInfoService; @Resource BasicOperationLogService basicOperationLogService; @Resource ConditionService conditionService; @Resource BasicTeachClazzService basicTeachClazzService; /** * 登录 * * @param login * @return */ @ApiOperation(value = "登录") @RequestMapping(value = "/login", method = RequestMethod.POST) @ApiResponses({@ApiResponse(code = 200, message = "用户信息", response = LoginResult.class)}) @Aac(auth = false) public Result login(@ApiParam(value = "用户信息", required = true) @Valid @RequestBody LoginParam login, BindingResult bindingResult) throws NoSuchAlgorithmException { if (bindingResult.hasErrors()) { return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage()); } if (Objects.nonNull(login.getSchoolCode()) && login.getSchoolCode().contains("#")) { login.setSchoolCode(login.getSchoolCode().substring(0, login.getSchoolCode().indexOf("#"))); } BasicSchool basicSchool = null; if (!login.getSchoolCode().equalsIgnoreCase(SystemConstant.ADMIN_CODE)) { basicSchool = commonCacheService.schoolCache(login.getSchoolCode()); if (Objects.isNull(basicSchool)) { throw ExceptionResultEnum.SCHOOL_NO_DATA.exception(); } if (Objects.nonNull(basicSchool.getEnable()) && !basicSchool.getEnable()) { throw ExceptionResultEnum.SCHOOL_ENABLE.exception(); } } QueryWrapper wrapper = new QueryWrapper<>(); if (Objects.nonNull(basicSchool)) { wrapper.lambda().eq(SysUser::getSchoolId, basicSchool.getId()); } // 账号密码登录 List userList = null; if (LoginTypeEnum.ACCOUNT.name().equals(login.getType())) { String loginName = login.getLoginName(); String password = login.getPassword(); // 非空校验 if (StringUtils.isBlank(loginName)) { throw ExceptionResultEnum.ERROR.exception("用户名不能为空"); } if (StringUtils.isBlank(password)) { throw ExceptionResultEnum.ERROR.exception("密码不能为空"); } wrapper.lambda().and(w -> w.eq(SysUser::getLoginName, loginName).or().eq(SysUser::getCode, loginName)); userList = sysUserService.list(wrapper); //用户不存在 if (userList == null || userList.isEmpty()) { throw ExceptionResultEnum.ERROR.exception("用户名或密码错误"); } if (userList.size() > 1) { throw ExceptionResultEnum.ERROR.exception("用户名或密码错误"); } SysUser sysUser = userList.get(0); if (!sysUser.getEnable()) { throw ExceptionResultEnum.ERROR.exception("用户被禁用"); } // String decodePassword = Base64Util.encode(AesECBUtil.decryptSimple(password).getBytes()); String decodePassword = Base64Util.encode(RSAUtil.decrypt(password).getBytes()); if (!decodePassword.equals(userList.get(0).getPassword())) { throw ExceptionResultEnum.ERROR.exception("用户名或密码错误"); } //2022.11.10日加入用户/密码模式是否开启短信验证 if (!login.getSchoolCode().equalsIgnoreCase(SystemConstant.ADMIN_CODE)) { SysConfig sysConfigAccount = commonCacheService.addSysConfigCache(basicSchool.getId(), SystemConstant.ACCOUNT_SMS_VERIFY); if (Objects.nonNull(sysConfigAccount) && Objects.nonNull(sysConfigAccount.getConfigValue()) && Boolean.valueOf(sysConfigAccount.getConfigValue())) { // 校验验证码 sysUserService.checkSmsCode(sysUser.getId(), sysUser.getMobileNumber(), login.getCode()); // 如果不是共用验证码再过期 SysConfig sysConfig = commonCacheService.addSysConfigCache(SystemConstant.SMS_NORMAL_CODE); Optional.ofNullable(sysConfig).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未配置万能短信验证码")); if (!sysConfig.getConfigValue().equals(login.getCode())) { sysUserService.expiredVerifyCode(sysUser.getId(), sysUser.getMobileNumber()); } } } } else if (LoginTypeEnum.PHONE.name().equals(login.getType())) { String mobileNumber = login.getMobileNumber(); String code = login.getCode(); // 非空校验 if (StringUtils.isBlank(mobileNumber)) { throw ExceptionResultEnum.ERROR.exception("手机号不能为空"); } if (StringUtils.isBlank(code)) { throw ExceptionResultEnum.ERROR.exception("验证码不能为空"); } wrapper.lambda().eq(SysUser::getMobileNumber, mobileNumber); userList = sysUserService.list(wrapper); //用户不存在 if (userList == null || userList.isEmpty()) { throw ExceptionResultEnum.ERROR.exception("用户不存在"); } if (userList.size() > 1) { throw ExceptionResultEnum.ERROR.exception("查出多个用户"); } SysUser sysUser = userList.get(0); // 校验验证码 sysUserService.checkSmsCode(sysUser.getId(), sysUser.getMobileNumber(), code); // 如果不是共用验证码再过期 SysConfig sysConfig = commonCacheService.addSysConfigCache(SystemConstant.SMS_NORMAL_CODE); Optional.ofNullable(sysConfig).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未配置万能短信验证码")); if (!sysConfig.getConfigValue().equals(login.getCode())) { sysUserService.expiredVerifyCode(sysUser.getId(), sysUser.getMobileNumber()); } } else { throw ExceptionResultEnum.ERROR.exception("登录参数错误"); } if (login.getSchoolCode().equalsIgnoreCase(SystemConstant.ADMIN_CODE)) { userList.forEach(o -> { AuthBean authBean = teachcloudCommonService.getUserAuth(o.getId()); if (Objects.nonNull(authBean) && Objects.nonNull(authBean.getRoleList()) && authBean.getRoleList().size() > 0) { if (Objects.nonNull(authBean.getSchool())) { throw ExceptionResultEnum.ERROR.exception("用户无法通过当前页面登录"); } } }); } SysUser sysUser = userList.get(0); LoginResult loginResult = teachcloudCommonService.login(login.getPassword(), sysUser, AppSourceEnum.SYSTEM); loginResult.setUiSetting(sysUser.getUiSetting()); // 机器人参数 SysConfig aiRobotSwitch = commonCacheService.addSysConfigCache(sysUser.getSchoolId(), SystemConstant.AI_ROBOT_ENABLE); SysConfig aiRobotUrl = commonCacheService.addSysConfigCache(sysUser.getSchoolId(), SystemConstant.AI_ROBOT_URL); loginResult.setAiRobotResult(new AiRobotResult(aiRobotSwitch != null && StringUtils.isNotBlank(aiRobotSwitch.getConfigValue()) ? Boolean.valueOf(aiRobotSwitch.getConfigValue()) : false, aiRobotUrl != null && StringUtils.isNotBlank(aiRobotUrl.getConfigValue()) ? aiRobotUrl.getConfigValue() : null)); try { basicOperationLogService.saveOperateLogWithNoAuth(sysUser.getSchoolId(), sysUser.getId(), "用户登录", OperationTypeEnum.LOGIN, JSON.toJSONString(login)); } catch (Exception e) { log.error(e.getMessage()); } return ResultUtil.ok(loginResult); } /** * 登出 * * @return */ @ApiOperation(value = "登出") @RequestMapping(value = "/logout", method = RequestMethod.POST) @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)}) @OperationLogDetail(detail = "用户登出(注销)", operationType = OperationTypeEnum.LOGOUT) public Result logout() throws NoSuchAlgorithmException { SysUser sysUser = (SysUser) ServletUtil.getRequestUser(); teachcloudCommonService.removeUserInfo(sysUser.getId(), false); return ResultUtil.ok(); } /** * 发送验证码 * * @param loginParam * @return */ @ApiOperation(value = "发送验证码") @RequestMapping(value = "/get_verify_code", method = RequestMethod.POST) @Aac(auth = false) public Result getVerifyCode(@RequestBody LoginParam loginParam) { String mobileNumber = loginParam.getMobileNumber(); if (StringUtils.isBlank(mobileNumber)) { throw ExceptionResultEnum.ERROR.exception("手机号不能为空"); } QueryWrapper wrapper = new QueryWrapper<>(); if (StringUtils.isNotBlank(loginParam.getSchoolCode())) { if (loginParam.getSchoolCode().contains("#")) { loginParam.setSchoolCode(loginParam.getSchoolCode().substring(0, loginParam.getSchoolCode().indexOf("#"))); } BasicSchool basicSchool = commonCacheService.schoolCache(loginParam.getSchoolCode()); if (Objects.nonNull(basicSchool)) { wrapper.lambda().eq(SysUser::getSchoolId, basicSchool.getId()); } } wrapper.lambda().eq(SysUser::getMobileNumber, mobileNumber); List userList = sysUserService.list(wrapper); //用户不存在 if (userList == null || userList.isEmpty()) { throw ExceptionResultEnum.ERROR.exception("手机号不存在"); } if (userList.size() > 1) { throw ExceptionResultEnum.ERROR.exception("手机号绑定了多个用户"); } SysUser sysUser = userList.get(0); if (!sysUser.getEnable()) { throw ExceptionResultEnum.ERROR.exception("手机号被禁用"); } if (SystemConstant.strNotNull(mobileNumber)) { basicVerifyCodeService.sendVeirfyCode(mobileNumber, sysUser); } int pwdCount = sysUser.getPwdCount(); List sysRoleList = sysUserRoleService.listRoleByUserId(sysUser.getId()); if (sysRoleList.stream().map(SysRole::getType).collect(Collectors.toSet()).contains(RoleTypeEnum.ADMIN)) { mobileNumber = sysUser.getLoginName() + "(特权用户)"; pwdCount = 1; } UserLoginCheckResult userLoginCheckResult = new UserLoginCheckResult(sysUser.getId(), mobileNumber, pwdCount); return ResultUtil.ok(userLoginCheckResult, ""); } /** * 发送验证码 * * @param loginParam * @return */ @ApiOperation(value = "发送验证码") @RequestMapping(value = "/get_verify_code_by_account", method = RequestMethod.POST) @Aac(auth = false) public Object getverifyCodeByAccount(@RequestBody LoginParam loginParam) { String loginName = loginParam.getLoginName(); String password = loginParam.getPassword(); QueryWrapper wrapper = new QueryWrapper<>(); if (StringUtils.isNotBlank(loginParam.getSchoolCode())) { if (loginParam.getSchoolCode().contains("#")) { loginParam.setSchoolCode(loginParam.getSchoolCode().substring(0, loginParam.getSchoolCode().indexOf("#"))); } BasicSchool basicSchool = commonCacheService.schoolCache(loginParam.getSchoolCode()); wrapper.lambda().eq(SysUser::getSchoolId, basicSchool.getId()); } wrapper.lambda().eq(SysUser::getLoginName, loginName); SysUser user = sysUserService.getOne(wrapper); //用户不存在 if (Objects.isNull(user)) { throw ExceptionResultEnum.ERROR.exception("用户不存在"); } if (!password.equals(user.getPassword())) { throw ExceptionResultEnum.ERROR.exception("密码错误"); } String mobileNumber = user.getMobileNumber(); if (Objects.isNull(mobileNumber)) { throw ExceptionResultEnum.ERROR.exception("用户未绑定手机号码"); } basicVerifyCodeService.sendVeirfyCode(mobileNumber, user); return ResultUtil.ok(mobileNumber, ""); } /** * 发送验证码(绑定手机号) * * @param loginParam * @return */ @ApiOperation(value = "发送验证码(绑定手机号)") @RequestMapping(value = "/get_verify_code_for_bind", method = RequestMethod.POST) @Aac(auth = false) public Result getVerifyCodeForBind(@RequestBody LoginParam loginParam) { String loginName = loginParam.getLoginName(); String password = loginParam.getPassword(); String schoolCode = loginParam.getSchoolCode(); if (Objects.nonNull(schoolCode) && schoolCode.contains("#")) { schoolCode = schoolCode.substring(0, schoolCode.indexOf("#")); } String mobileNumber = loginParam.getMobileNumber(); if (StringUtils.isBlank(schoolCode)) { throw ExceptionResultEnum.ERROR.exception("学校代码不能为空"); } QueryWrapper wrapper = new QueryWrapper<>(); BasicSchool basicSchool = commonCacheService.schoolCache(schoolCode); if (Objects.isNull(basicSchool)) { throw ExceptionResultEnum.ERROR.exception("学校不存在"); } if (StringUtils.isBlank(mobileNumber)) { throw ExceptionResultEnum.ERROR.exception("手机号不能为空"); } wrapper.lambda().eq(SysUser::getSchoolId, basicSchool.getId()) .eq(SysUser::getMobileNumber, mobileNumber); List userList = sysUserService.list(wrapper); if (userList != null && userList.size() > 0) { throw ExceptionResultEnum.ERROR.exception("手机号已使用"); } // 根据账号/密码取用户ID if (StringUtils.isBlank(loginName)) { throw ExceptionResultEnum.ERROR.exception("账号不能为空"); } if (StringUtils.isBlank(password)) { throw ExceptionResultEnum.ERROR.exception("密码不能为空"); } QueryWrapper sysUserQueryWrapper = new QueryWrapper<>(); sysUserQueryWrapper.lambda().eq(SysUser::getSchoolId, basicSchool.getId()) .and(w -> w.eq(SysUser::getLoginName, loginName).or().eq(SysUser::getCode, loginName)) .eq(SysUser::getPassword, password); SysUser sysUser = sysUserService.getOne(sysUserQueryWrapper); if (sysUser == null) { throw ExceptionResultEnum.ERROR.exception("用户数据异常"); } // 发送短信验证码 basicVerifyCodeService.sendVeirfyCode(mobileNumber, sysUser); int pwdCount = sysUser.getPwdCount(); List sysRoleList = sysUserRoleService.listRoleByUserId(sysUser.getId()); if (sysRoleList.stream().map(SysRole::getType).collect(Collectors.toSet()).contains(RoleTypeEnum.ADMIN)) { mobileNumber = sysUser.getLoginName() + "(特权用户)"; pwdCount = 1; } UserLoginCheckResult userLoginCheckResult = new UserLoginCheckResult(sysUser.getId(), mobileNumber, pwdCount); return ResultUtil.ok(userLoginCheckResult, ""); } @ApiOperation(value = "根据机构代码查询机构信息接口") @RequestMapping(value = "/school/query_by_school_code", method = RequestMethod.POST) @ApiResponses({@ApiResponse(code = 200, message = "学校信息", response = EditResult.class)}) @Aac(auth = false) public Result queryBySchoolCode(@ApiParam(value = "机构code") @RequestParam(required = false) String code) { if (Objects.nonNull(code) && code.contains("#")) { code = code.substring(0, code.indexOf("#")); } Map map = new HashMap<>(); map.put(SystemConstant.VERSION, SystemConstant.VERSION_VALUE); if (StringUtils.isBlank(code) || !SystemConstant.ADMIN_CODE_LIST.contains(code.toLowerCase())) { BasicSchool basicSchool = null; if (StringUtils.isNotBlank(code)) { basicSchool = commonCacheService.schoolCache(code); } if (basicSchool == null) { List basicSchoolList = basicSchoolService.listByDefaultSchool(true); if (CollectionUtils.isNotEmpty(basicSchoolList)) { basicSchool = basicSchoolList.get(0); } } Optional.ofNullable(basicSchool).orElseThrow(() -> ExceptionResultEnum.SCHOOL_NO_DATA.exception()); code = basicSchool.getCode(); authInfoService.appHasExpired(code); SysConfig sysConfig = commonCacheService.addSysConfigCache(basicSchool.getId(), SystemConstant.ACCOUNT_SMS_VERIFY); SysConfig cardSize = commonCacheService.addSysConfigCache(basicSchool.getId(), SystemConstant.CARD_SIZE_LIST); map.put(SystemConstant.LOGO, basicSchool.getLogo()); String backgroundImageUrl = null; if (StringUtils.isNotBlank(basicSchool.getBackgroundImage())) { try { backgroundImageUrl = fileUploadService.filePreview(basicSchool.getBackgroundImage()); } catch (Exception e) { // 不处理,返回null } } map.put("backgroundImageUrl", backgroundImageUrl); map.put("name", basicSchool.getName()); map.put("accountSmsVerify", Objects.nonNull(sysConfig) ? Boolean.valueOf(sysConfig.getConfigValue()) : false); // 若为在线激活,则允许手机号登录 map.put("phoneLogin", authInfoService.allowPhoneLogin(basicSchool.getId())); map.put("schoolCode", code); // 广药命题界面提示信息 map.put("examTaskInstr", basicSchool.getExamTaskInstr()); map.put("cardSize", Objects.nonNull(cardSize) ? Arrays.asList( cardSize.getConfigValue().replaceAll("\\[", "").replaceAll("\\]", "").split(", ")) : null); } else { SysConfig sysConfig = commonCacheService.addSysConfigCache(SystemConstant.ADMIN_LOGO_URL); map.put(SystemConstant.LOGO, Objects.nonNull(sysConfig) ? sysConfig.getConfigValue() : null); map.put("backgroundImageUrl", null); map.put("name", null); map.put("accountSmsVerify", false); // 若为在线激活,则允许手机号登录,超管默认false map.put("phoneLogin", false); map.put("schoolCode", SystemConstant.ADMIN_CODE); } return ResultUtil.ok(map); } @ApiOperation(value = "文件上传接口") @RequestMapping(value = "/file/upload", method = RequestMethod.POST) @Transactional @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)}) public Result fileUpload(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file, @ApiParam(value = "上传文件类型", required = true) @RequestParam UploadFileEnum type) { BasicAttachment basicAttachment = null; try { basicAttachment = printCommonService.saveAttachment(file, ServletUtil.getRequestMd5(), type); if (Objects.isNull(basicAttachment)) { throw ExceptionResultEnum.ATTACHMENT_ERROR.exception(); } } catch (Exception e) { log.error(SystemConstant.LOG_ERROR, e); if (Objects.nonNull(basicAttachment)) { basicAttachmentService.deleteAttachment(basicAttachment); } if (e instanceof ApiException) { ResultUtil.error((ApiException) e, ((ApiException) e).getCode(), e.getMessage()); } else { ResultUtil.error(e.getMessage()); } } return ResultUtil.ok(new EditResult(basicAttachment.getId(), teachcloudCommonService.filePreview(basicAttachment.getPath()), basicAttachment.getPages())); } @ApiOperation(value = "考试试卷文件上传接口") @RequestMapping(value = "/file/exam_paper_upload", method = RequestMethod.POST) @Transactional @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)}) public Result fileExamPaperUpload(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file, @ApiParam(value = "上传文件类型", required = true) @RequestParam UploadFileEnum type) { Map resultMap = new HashMap<>(); BasicAttachment basicOriginalAttachment = null; BasicAttachment basicTranslateAttachment = null; File pdfOriginalFile = null; File localTempFile = null; try { pdfOriginalFile = FileUtil.multipartFileToFile(file); // PageSizeEnum pageSizeEnum1= PdfUtil.getPdfFormat(pdfOriginalFile); basicOriginalAttachment = printCommonService.saveAttachment(file, ServletUtil.getRequestMd5(), type); if (Objects.isNull(basicOriginalAttachment)) { throw ExceptionResultEnum.ATTACHMENT_ERROR.exception(); } EditResult original = new EditResult(basicOriginalAttachment.getId(), teachcloudCommonService.filePreview(basicOriginalAttachment.getPath()), basicOriginalAttachment.getPages(), null); EditResult translate = new EditResult(); BeanUtils.copyProperties(original, translate); // switch (pageSizeEnum) { // case A3: // basicOriginalAttachment = printCommonService.saveAttachment(file, ServletUtil.getRequestMd5(), type); // if (Objects.isNull(basicOriginalAttachment)) { // throw ExceptionResultEnum.ATTACHMENT_ERROR.exception(); // } // original.setId(basicOriginalAttachment.getId()); // original.setUrl(teachcloudCommonService.filePreview(basicOriginalAttachment.getPath())); // original.setPages(basicOriginalAttachment.getPages()); // // BeanUtils.copyProperties(original, translate); // break; // case A4: // basicOriginalAttachment = printCommonService.saveAttachment(file, ServletUtil.getRequestMd5(), type); // if (Objects.isNull(basicOriginalAttachment)) { // throw ExceptionResultEnum.ATTACHMENT_ERROR.exception(); // } // original.setId(basicOriginalAttachment.getId()); // original.setUrl(teachcloudCommonService.filePreview(basicOriginalAttachment.getPath())); // original.setPages(basicOriginalAttachment.getPages()); // // String destUrl = dictionaryConfig.fssLocalPdfDomain().getConfig() + File.separator + file.getOriginalFilename(); // localTempFile = new File(destUrl); // OutputStream out = new FileOutputStream(localTempFile); // PdfUtil.concatPDFs(new FileInputStream(pdfOriginalFile), out, false); // // File转换成MutipartFile // FileInputStream inputStream = new FileInputStream(localTempFile); // MultipartFile multipartFile = new MockMultipartFile(localTempFile.getName(), localTempFile.getName(), ContentType.APPLICATION_OCTET_STREAM.toString(), inputStream); // basicTranslateAttachment = printCommonService.saveAttachment(multipartFile, DigestUtils.md5Hex(multipartFile.getBytes()), type); // translate.setId(basicTranslateAttachment.getId()); // translate.setUrl(teachcloudCommonService.filePreview(basicTranslateAttachment.getPath())); // translate.setPages(basicTranslateAttachment.getPages()); // break; // default: // throw ExceptionResultEnum.ERROR.exception("请上传A4或A3格式的试卷文件"); // } resultMap.put("original", original); resultMap.put("translate", translate); } catch (Exception e) { log.error(SystemConstant.LOG_ERROR, e); if (Objects.nonNull(basicOriginalAttachment)) { basicAttachmentService.deleteAttachment(basicOriginalAttachment); } if (Objects.nonNull(basicTranslateAttachment)) { basicAttachmentService.deleteAttachment(basicTranslateAttachment); } if (e instanceof ApiException) { ResultUtil.error((ApiException) e, ((ApiException) e).getCode(), e.getMessage()); } else { ResultUtil.error(e.getMessage()); } } finally { if (Objects.nonNull(localTempFile) && Objects.nonNull(dictionaryConfig.sysDomain()) && dictionaryConfig.sysDomain().isOss()) { FileUtil.deleteFile(localTempFile); } if (Objects.nonNull(pdfOriginalFile) && Objects.nonNull(dictionaryConfig.sysDomain())) { FileUtil.deleteFile(pdfOriginalFile); } } return ResultUtil.ok(resultMap); } @ApiOperation(value = "文件下载接口") @RequestMapping(value = "/file/download", method = RequestMethod.POST) @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)}) public Result fileDownload(@ApiParam(value = "任务id", required = true) @RequestParam String id, @ApiParam(value = "下载文件类型", required = true) @RequestParam DownloadFileEnum type) { String path = null; if (DownloadFileEnum.SYNC_REPORT.equals(type)) { TBSyncTask tbSyncTask = tbSyncTaskService.getById(SystemConstant.convertIdToLong(id)); if (Objects.isNull(tbSyncTask)) { throw ExceptionResultEnum.SYNC_TASK_NO_DATA.exception(); } path = tbSyncTask.getReportFilePath(); } else { TBTask tbTask = tbTaskService.getById(Long.parseLong(id)); if (Objects.isNull(tbTask)) { throw ExceptionResultEnum.TASK_NO_DATA.exception(); } switch (type) { case IMPORT_FILE: path = tbTask.getImportFilePath(); break; case TASK_REPORT: path = tbTask.getReportFilePath(); break; case RESULT: path = tbTask.getResultFilePath(); break; case ERROR_FILE: path = tbTask.getErrorFilePath(); break; default: break; } } if (Objects.isNull(path)) { throw ExceptionResultEnum.PATH_NO_DATA.exception(); } return ResultUtil.ok(new EditResult(teachcloudCommonService.filePreview(path))); } @ApiOperation(value = "文件预览接口") @RequestMapping(value = "/file/preview", method = RequestMethod.POST) @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)}) public Result filePreview(@ApiParam(value = "附件id", defaultValue = "") @RequestParam(value = "ids", required = false) List ids) { if (CollectionUtils.isEmpty(ids)) { throw ExceptionResultEnum.ERROR.exception("没有找到文件"); } else { List list = new ArrayList<>(); for (Long id : ids) { BasicAttachment basicAttachment = basicAttachmentService.getById(id); list.add(new EditResult(teachcloudCommonService.filePreview(basicAttachment.getPath()))); } return ResultUtil.ok(list); } } @ApiOperation(value = "PDF加水印") @RequestMapping(value = "/pdf/watermark/preview", method = RequestMethod.POST) @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)}) @Aac(auth = false) public void filePreview(@ApiParam(value = "附件id", defaultValue = "") @RequestParam(value = "id", required = false) Long id, HttpServletResponse response) { if (id == null) { throw ExceptionResultEnum.ERROR.exception("请求参数有误"); } basicAttachmentService.addMaterMark(id, response); } @ApiOperation(value = "查询用户权限") @RequestMapping(value = "/get_menu", method = RequestMethod.POST) public Result getMenu() { return ResultUtil.ok(sysUserRoleService.listByUserId()); } @ApiOperation(value = "获取服务器时间") @RequestMapping(value = "/get_system_time", method = RequestMethod.POST) @Aac(auth = false) public Result getSystemTime() { return ResultUtil.ok(System.currentTimeMillis()); } @ApiOperation(value = "共用接口-查询字典") @RequestMapping(value = "/get_dictionary", method = RequestMethod.POST) @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)}) public Result findDictionaryList(@ApiParam(value = "学生学院id") @RequestParam(required = false) String collegeId, @ApiParam(value = "专业id") @RequestParam(required = false) String majorId, @ApiParam(value = "班级id") @RequestParam(required = false) String clazzId, @ApiParam(value = "学生id") @RequestParam(required = false) String studentId, @ApiParam(value = "考试id") @RequestParam(required = false) String examId, @ApiParam(value = "查询字典对象", required = true) @RequestParam DictionaryEnum dictionaryEnum) { Long schoolId = SystemConstant.convertIdToLong(ServletUtil.getRequestHeaderSchoolId().toString()); List dictionaryResultList = new ArrayList<>(); switch (dictionaryEnum) { case SEMESTER: List basicSemesterList = basicSemesterService.list( new QueryWrapper().lambda().eq(BasicSemester::getSchoolId, schoolId).eq(BasicSemester::getEnable, true).orderByDesc(BasicSemester::getCreateTime)); dictionaryResultList = basicSemesterList.stream().map(e -> { DictionaryResult dictionaryResult = new DictionaryResult(); dictionaryResult.setId(e.getId()); dictionaryResult.setCode(e.getCode()); dictionaryResult.setName(e.getName()); return dictionaryResult; }).collect(Collectors.toList()); break; case COLLEGE: List sysOrgs = conditionService.listCollege(); dictionaryResultList = sysOrgs.stream().map(e -> { DictionaryResult dictionaryResult = new DictionaryResult(); dictionaryResult.setId(e.getId()); dictionaryResult.setName(e.getName()); return dictionaryResult; }).collect(Collectors.toList()); break; case CLAZZ: QueryWrapper clazzQueryWrapper = new QueryWrapper<>(); clazzQueryWrapper.lambda().eq(BasicTeachClazz::getSchoolId, schoolId).eq(BasicTeachClazz::getExamId, examId); List basicTeachClazzList = basicTeachClazzService.list(clazzQueryWrapper); List resultBasicClazzList = basicTeachClazzList.stream().map(e -> { DictionaryResult dictionaryResult = new DictionaryResult(); dictionaryResult.setId(e.getId()); dictionaryResult.setName(e.getClazzName()); return dictionaryResult; }).collect(Collectors.toList()); dictionaryResultList.addAll(resultBasicClazzList); break; case ALL_CLAZZ: //针对归档管理临时处理用 throw ExceptionResultEnum.ERROR.exception("使用枚举[CLAZZ]"); case COURSE: // 考生字典查询课程 dictionaryResultList = basicCourseService.list( new QueryWrapper().lambda().eq(BasicCourse::getSchoolId, schoolId)).stream().flatMap(e -> { DictionaryResult dictionaryResult = new DictionaryResult(); dictionaryResult.setId(e.getId()); dictionaryResult.setCode(e.getCode()); dictionaryResult.setName(e.getName()); return Stream.of(dictionaryResult); }).collect(Collectors.toList()); break; // case STUDENT: // QueryWrapper studentQueryWrapper = new QueryWrapper<>(); // studentQueryWrapper.lambda().eq(BasicExamStudent::getSchoolId, schoolId); // if (SystemConstant.longNotNull(SystemConstant.convertIdToLong(clazzId))) { // studentQueryWrapper.lambda().eq(BasicExamStudent::getClazzId, clazzId); // } // if (SystemConstant.longNotNull(SystemConstant.convertIdToLong(studentId))) { // studentQueryWrapper.lambda().eq(BasicExamStudent::getId, studentId); // } // List basicExamStudentList = basicExamStudentService.list(studentQueryWrapper); // dictionaryResultList = basicExamStudentList.stream().map(e -> { // DictionaryResult dictionaryResult = new DictionaryResult(); // dictionaryResult.setId(e.getId()); // dictionaryResult.setCode(e.getStudentCode()); // dictionaryResult.setName(e.getStudentName()); // return dictionaryResult; // }).collect(Collectors.toList()); // break; default: break; } return ResultUtil.ok(dictionaryResultList); } /** * 获取用户阅卷角色 * * @return */ @ApiOperation(value = "获取用户阅卷角色") @RequestMapping(value = "/get_open_role", method = RequestMethod.POST) public Result getOpenRole() { SysUser sysUser = (SysUser) ServletUtil.getRequestUser(); // SpecialPrivilegeEnum userSpecialPrivilege = sysUserService.findUserSpecialPrivilegeByUserId(sysUser.getId(), sysUser.getSchoolId()); List list = new ArrayList<>(); // if (!SpecialPrivilegeEnum.UNIDENTIFIED.equals(userSpecialPrivilege)) { // if (SpecialPrivilegeEnum.COMPOSITE.equals(userSpecialPrivilege)) { // list.add(SpecialPrivilegeEnum.MARKER); // } else { // list.add(userSpecialPrivilege); // } // } return ResultUtil.ok(list); } /** * 下载导入模板 * * @return */ @ApiOperation(value = "下载导入模板") @RequestMapping(value = "/download_import_template", method = RequestMethod.POST) public void downloadImportTemplate(@RequestParam(value = "type") String type, HttpServletResponse response) throws IOException { List templateEnums = Stream.of(ImportTemplateEnum.values()).map(m -> m.name()).collect(Collectors.toList()); if (!templateEnums.contains(type)) { throw ExceptionResultEnum.ERROR.exception("不支持的模板类型"); } ImportTemplateEnum importTemplateEnum = ImportTemplateEnum.valueOf(type); InputStream inputStream = FileUtil.getStream("temps/" + importTemplateEnum.getTemplateName()); // 导出 FileUtil.outputFile(response, inputStream, importTemplateEnum.getFileName()); } @ApiOperation(value = "系统日志下载") @RequestMapping(value = "/log/download", method = RequestMethod.POST) @Aac(auth = false) public void sysLogDownload(HttpServletResponse response) { FileUtil.outputFile(response, new File(sysLogPath), "sys.log"); } }