TRBasicInfoController.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. package com.qmth.distributed.print.api;
  2. import cn.hutool.core.date.DateUtil;
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  7. import com.deepoove.poi.XWPFTemplate;
  8. import com.qmth.boot.api.constant.ApiConstant;
  9. import com.qmth.boot.api.exception.ApiException;
  10. import com.qmth.distributed.print.business.bean.dto.report.*;
  11. import com.qmth.distributed.print.business.bean.result.ScoreResult;
  12. import com.qmth.distributed.print.business.bean.result.report.ReportResult;
  13. import com.qmth.distributed.print.business.bean.result.report.word.CourseBasicBean;
  14. import com.qmth.distributed.print.business.bean.result.report.word.CourseReportBean;
  15. import com.qmth.distributed.print.business.entity.TRBasicInfo;
  16. import com.qmth.distributed.print.business.entity.TRExamStudent;
  17. import com.qmth.distributed.print.business.service.PrintCommonService;
  18. import com.qmth.distributed.print.business.service.TRBasicInfoService;
  19. import com.qmth.distributed.print.business.service.TRExamStudentService;
  20. import com.qmth.teachcloud.common.annotation.OperationLogDetail;
  21. import com.qmth.teachcloud.common.contant.SystemConstant;
  22. import com.qmth.teachcloud.common.entity.BasicSchool;
  23. import com.qmth.teachcloud.common.entity.SysConfig;
  24. import com.qmth.teachcloud.common.entity.SysUser;
  25. import com.qmth.teachcloud.common.enums.ImportTemplateEnum;
  26. import com.qmth.teachcloud.common.enums.log.CustomizedOperationTypeEnum;
  27. import com.qmth.teachcloud.common.service.CommonCacheService;
  28. import com.qmth.teachcloud.common.service.FileUploadService;
  29. import com.qmth.teachcloud.common.util.FileUtil;
  30. import com.qmth.teachcloud.common.util.ResultUtil;
  31. import com.qmth.teachcloud.common.util.ServletUtil;
  32. import com.qmth.teachcloud.mark.entity.MarkPaper;
  33. import com.qmth.teachcloud.mark.service.MarkPaperService;
  34. import io.swagger.annotations.*;
  35. import org.apache.commons.io.FileUtils;
  36. import org.springframework.transaction.annotation.Transactional;
  37. import org.springframework.util.CollectionUtils;
  38. import org.springframework.validation.BindingResult;
  39. import org.springframework.web.bind.annotation.*;
  40. import javax.annotation.Resource;
  41. import javax.validation.Valid;
  42. import javax.validation.constraints.Max;
  43. import javax.validation.constraints.Min;
  44. import java.io.File;
  45. import java.io.FileInputStream;
  46. import java.io.IOException;
  47. import java.io.InputStream;
  48. import java.util.*;
  49. /**
  50. * <p>
  51. * 报告基本情况表 前端控制器
  52. * </p>
  53. *
  54. * @author wangliang
  55. * @since 2024-02-18
  56. */
  57. @Api(tags = "课程目标达成度-报告基本情况Controller")
  58. @RestController
  59. @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_COURSE_DEGREE)
  60. public class TRBasicInfoController {
  61. @Resource
  62. PrintCommonService printCommonService;
  63. @Resource
  64. MarkPaperService markPaperService;
  65. @Resource
  66. TRBasicInfoService trBasicInfoService;
  67. @Resource
  68. TRExamStudentService trExamStudentService;
  69. @Resource
  70. CommonCacheService commonCacheService;
  71. @Resource
  72. FileUploadService fileUploadService;
  73. @ApiOperation(value = "报告管理列表")
  74. @RequestMapping(value = "/report/list", method = RequestMethod.POST)
  75. @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.SEARCH)
  76. @ApiResponses({@ApiResponse(code = 200, message = "分页查询", response = ScoreResult.class)})
  77. public Object reportList(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
  78. @ApiParam(value = "课程编码") @RequestParam(required = false) String courseCode,
  79. @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
  80. @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
  81. return ResultUtil.ok(printCommonService.scoreList(new Page<>(pageNumber, pageSize), examId, courseCode));
  82. }
  83. @ApiOperation(value = "查看报告")
  84. @RequestMapping(value = "/report/view", method = RequestMethod.POST)
  85. @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.SEARCH)
  86. @ApiResponses({@ApiResponse(code = 200, message = "查看报告", response = ReportResult.class)})
  87. @Transactional
  88. public Object reportView(@ApiParam(value = "考试id", required = true) @RequestParam Long examId,
  89. @ApiParam(value = "科目编码", required = true) @RequestParam String courseCode,
  90. @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber) {
  91. MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
  92. Objects.requireNonNull(markPaper, "未找到科目信息");
  93. SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
  94. TRBasicInfo trBasicInfo = trBasicInfoService.getOne(new QueryWrapper<TRBasicInfo>().lambda().eq(TRBasicInfo::getExamId, examId).eq(TRBasicInfo::getCourseCode, courseCode).eq(TRBasicInfo::getPaperNumber, paperNumber));
  95. if (Objects.isNull(trBasicInfo)) {
  96. trBasicInfo = trBasicInfoService.getReportView(trBasicInfo, markPaper, sysUser.getId());
  97. } else {
  98. ReportCourseBasicInfoDto reportCourseBasicInfoDto = new ReportCourseBasicInfoDto(trBasicInfo);
  99. ReportCourseEvaluationSpreadDto reportCourseEvaluationSpreadDto = Objects.nonNull(trBasicInfo.getCourseEvaluationSpread()) ? JSONObject.parseObject(trBasicInfo.getCourseEvaluationSpread(), ReportCourseEvaluationSpreadDto.class) : null;
  100. ReportCourseEvaluationResultDto reportCourseEvaluationResultDto = Objects.nonNull(trBasicInfo.getCourseEvaluationResult()) ? JSONObject.parseObject(trBasicInfo.getCourseEvaluationResult(), ReportCourseEvaluationResultDto.class) : null;
  101. ReportCourseEvaluationResultDetailDto reportCourseEvaluationResultDetailDto = null;
  102. List<TRExamStudent> trExamStudentList = trExamStudentService.list(new QueryWrapper<TRExamStudent>().lambda().eq(TRExamStudent::getrBasicInfoId, trBasicInfo.getId()));
  103. if (!CollectionUtils.isEmpty(trExamStudentList)) {
  104. List<ReportExamStudentDto> examStudentList = new ArrayList<>(trExamStudentList.size());
  105. for (TRExamStudent trExamStudent : trExamStudentList) {
  106. examStudentList.add(new ReportExamStudentDto(trExamStudent));
  107. }
  108. reportCourseEvaluationResultDetailDto = new ReportCourseEvaluationResultDetailDto(examStudentList);
  109. }
  110. trBasicInfo.setReportResult(new ReportResult(new ReportCommonDto(examId, courseCode, markPaper.getCourseName(), paperNumber), reportCourseBasicInfoDto, reportCourseEvaluationSpreadDto, reportCourseEvaluationResultDto, reportCourseEvaluationResultDetailDto));
  111. }
  112. trBasicInfo.updateInfo(sysUser.getId());
  113. //课程目标达成评价明细结果-课程目标达成评价值图
  114. trBasicInfoService.saveOrUpdate(trBasicInfo);
  115. return ResultUtil.ok(trBasicInfo.getReportResult());
  116. }
  117. @ApiOperation(value = "保存报告")
  118. @RequestMapping(value = "/report/save", method = RequestMethod.POST)
  119. @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.UPDATE)
  120. @ApiResponses({@ApiResponse(code = 200, message = "保存报告", response = Object.class)})
  121. @Transactional
  122. public Object reportSave(@ApiParam(value = "保存报告结构", required = true) @Valid @RequestBody TRBasicInfo trBasicInfo, BindingResult bindingResult) {
  123. if (bindingResult.hasErrors()) {
  124. return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
  125. }
  126. SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
  127. TRBasicInfo trBasicInfoDb = trBasicInfoService.getOne(new QueryWrapper<TRBasicInfo>().lambda().eq(TRBasicInfo::getExamId, trBasicInfo.getExamId()).eq(TRBasicInfo::getCourseCode, trBasicInfo.getCourseCode()).eq(TRBasicInfo::getPaperNumber, trBasicInfo.getPaperNumber()));
  128. if (Objects.isNull(trBasicInfoDb)) {
  129. trBasicInfoDb = new TRBasicInfo(trBasicInfo, sysUser.getId());
  130. MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(trBasicInfo.getExamId(), trBasicInfo.getPaperNumber());
  131. Objects.requireNonNull(markPaper, "未找到科目信息");
  132. trBasicInfoDb = trBasicInfoService.getReportView(trBasicInfoDb, markPaper, sysUser.getId());
  133. } else {
  134. trBasicInfoDb.updateInfo(trBasicInfo, sysUser.getId());
  135. }
  136. return ResultUtil.ok(trBasicInfoService.saveOrUpdate(trBasicInfoDb));
  137. }
  138. @ApiOperation(value = "导出报告")
  139. @RequestMapping(value = "/report/export", method = RequestMethod.POST)
  140. @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.EXPORT)
  141. @ApiResponses({@ApiResponse(code = 200, message = "下载成功", response = Object.class)})
  142. public void reportExport(@ApiParam(value = "考试id", required = true) @RequestParam Long examId,
  143. @ApiParam(value = "科目编码", required = true) @RequestParam String courseCode,
  144. @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber) throws IOException {
  145. File txtFileTemp = null, fileTemp = null;
  146. try {
  147. Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
  148. BasicSchool basicSchool = commonCacheService.schoolCache(schoolId);
  149. TRBasicInfo trBasicInfo = trBasicInfoService.getOne(new QueryWrapper<TRBasicInfo>().lambda().eq(TRBasicInfo::getExamId, examId).eq(TRBasicInfo::getCourseCode, courseCode).eq(TRBasicInfo::getPaperNumber, paperNumber));
  150. Objects.requireNonNull(trBasicInfo, "没有报告信息");
  151. Objects.requireNonNull(trBasicInfo.getCourseEvaluationResult(), "没有课程目标信息");
  152. Objects.requireNonNull(trBasicInfo.getCourseEvaluationResultDetail(), "没有课程考生信息");
  153. //评价样本的基本信息
  154. String period = Objects.nonNull(trBasicInfo.getPeriod()) ? trBasicInfo.getPeriod() : null;
  155. String credit = Objects.nonNull(trBasicInfo.getCredit()) ? trBasicInfo.getCredit() : null;
  156. period = Objects.nonNull(credit) ? period + "/" + credit : period;
  157. ReportCourseEvaluationResultDto reportCourseEvaluationResultDto = JSONObject.parseObject(trBasicInfo.getCourseEvaluationResult(), ReportCourseEvaluationResultDto.class);
  158. CourseBasicBean courseBasicBean = new CourseBasicBean(trBasicInfo.getCourseName(),
  159. trBasicInfo.getCourseCode(), null, trBasicInfo.getCourseType(),
  160. period, null, null, trBasicInfo.getDirector(),
  161. DateUtil.format(new Date(trBasicInfo.getCreateTime()), SystemConstant.DEFAULT_DATE_PATTERN),
  162. "测试:我们的目标是没有目标", reportCourseEvaluationResultDto.getTargetList().size());
  163. CourseReportBean courseReportBean = new CourseReportBean(trBasicInfo.getOpenTime() + "《" + trBasicInfo.getCourseName() + "》", courseBasicBean);
  164. JSONObject jsonObject = JSONObject.parseObject(trBasicInfo.getCourseEvaluationResultDetail());
  165. List<CourseTargetWordDto> courseTargetWordDtoList = JSONArray.parseArray(jsonObject.get("targetWordMap").toString(), CourseTargetWordDto.class);
  166. List<CourseTargetWebDto> courseTargetWebDtoList = JSONArray.parseArray(jsonObject.get("targetWebMap").toString(), CourseTargetWebDto.class);
  167. //table1-课程目标目标与毕业要求指标点的对应关系
  168. List<String> header2_1List = new ArrayList<>(Arrays.asList("课程目标", "支撑毕业要求")), header2_2List = new ArrayList<>();
  169. header2_2List.addAll(header2_1List);
  170. header2_1List.add("考核/评价环节及目标分值");
  171. courseReportBean.setCourseTargetTable1(trBasicInfoService.buildWordTable1(courseTargetWordDtoList, header2_1List, header2_2List));
  172. //table2-课程目标达成评价依据
  173. courseReportBean.setCourseTargetTable2(trBasicInfoService.buildWordTable2(courseTargetWordDtoList, courseTargetWebDtoList, header2_1List, header2_2List));
  174. //table3-课程课后作业考核/评价内容及目标分值
  175. courseReportBean.setCourseTargetTable3(trBasicInfoService.buildWordTable3(courseTargetWordDtoList));
  176. //table4-课程期末考试考核/评价内容及目标分值
  177. courseReportBean.setCourseTargetTable4(trBasicInfoService.buildWordTable4(courseTargetWordDtoList));
  178. //examstudent-课程目标达成评价依据-考生
  179. courseReportBean.setExamStudentTable1(trBasicInfoService.buildWordTable5(trBasicInfo, courseReportBean));
  180. InputStream inputStream = null;
  181. txtFileTemp = SystemConstant.getFileTempVar(SystemConstant.WORD_PREFIX);
  182. SysConfig sysConfig = commonCacheService.addSysConfigCache(schoolId, SystemConstant.SCHOOL_COURSE_DEGREE_TEMPLATE);
  183. if (Objects.isNull(sysConfig)) {
  184. inputStream = FileUtil.getStream("static/" + ImportTemplateEnum.STATIC_COURSE_DEGREE_REPORT.getTemplateName());
  185. } else {
  186. fileTemp = fileUploadService.downloadFile(Long.parseLong(sysConfig.getConfigValue()), fileTemp.getName());
  187. inputStream = FileUtil.getStream(fileTemp.getPath());
  188. }
  189. FileUtils.copyInputStreamToFile(inputStream, txtFileTemp);
  190. XWPFTemplate template = XWPFTemplate.compile(txtFileTemp.getAbsolutePath()).render(courseReportBean);
  191. template.writeToFile(txtFileTemp.getAbsolutePath());
  192. // 导出
  193. String fileName = Objects.nonNull(basicSchool) ? basicSchool.getName() + "_" + ImportTemplateEnum.STATIC_COURSE_DEGREE_REPORT.getFileName() + "_" + courseReportBean.getTitle1() + SystemConstant.WORD_PREFIX : ImportTemplateEnum.STATIC_COURSE_DEGREE_REPORT.getFileName() + "_" + courseReportBean.getTitle1() + SystemConstant.WORD_PREFIX;
  194. FileUtil.outputFile(ServletUtil.getResponse(), new FileInputStream(txtFileTemp), fileName);
  195. // XWPFTemplate template = XWPFTemplate.compile("/Users/king/git/teachcloud-server/distributed-print/src/main/resources/static/course_degree_report.docx").render(courseReportBean);
  196. // template.writeToFile("/Users/king/Downloads/demo_course_degree_report.docx");
  197. } catch (Exception e) {
  198. if (e instanceof ApiException) {
  199. ResultUtil.error((ApiException) e, ((ApiException) e).getCode(), e.getMessage());
  200. } else {
  201. ResultUtil.error(e.getMessage());
  202. }
  203. } finally {
  204. if (Objects.nonNull(txtFileTemp)) {
  205. txtFileTemp.delete();
  206. }
  207. if (Objects.nonNull(fileTemp)) {
  208. fileTemp.delete();
  209. }
  210. }
  211. }
  212. }