package com.qmth.distributed.print.api;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.data.style.CellStyle;
import com.deepoove.poi.data.style.ParagraphStyle;
import com.deepoove.poi.data.style.RowStyle;
import com.qmth.boot.api.constant.ApiConstant;
import com.qmth.distributed.print.business.bean.dto.report.*;
import com.qmth.distributed.print.business.bean.result.ScoreResult;
import com.qmth.distributed.print.business.bean.result.report.ReportResult;
import com.qmth.distributed.print.business.bean.result.report.word.CourseBasicBean;
import com.qmth.distributed.print.business.bean.result.report.word.CourseReportBean;
import com.qmth.distributed.print.business.entity.TRBasicInfo;
import com.qmth.distributed.print.business.entity.TRExamStudent;
import com.qmth.distributed.print.business.service.PrintCommonService;
import com.qmth.distributed.print.business.service.TRBasicInfoService;
import com.qmth.distributed.print.business.service.TRExamStudentService;
import com.qmth.teachcloud.common.annotation.OperationLogDetail;
import com.qmth.teachcloud.common.contant.SystemConstant;
import com.qmth.teachcloud.common.entity.SysUser;
import com.qmth.teachcloud.common.enums.log.CustomizedOperationTypeEnum;
import com.qmth.teachcloud.common.util.ResultUtil;
import com.qmth.teachcloud.common.util.ServletUtil;
import com.qmth.teachcloud.mark.entity.MarkPaper;
import com.qmth.teachcloud.mark.service.MarkPaperService;
import io.swagger.annotations.*;
import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import java.io.IOException;
import java.util.*;
/**
*
* 报告基本情况表 前端控制器
*
*
* @author wangliang
* @since 2024-02-18
*/
@Api(tags = "课程目标达成度-报告基本情况Controller")
@RestController
@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_COURSE_DEGREE)
public class TRBasicInfoController {
@Resource
PrintCommonService printCommonService;
@Resource
MarkPaperService markPaperService;
@Resource
TRBasicInfoService trBasicInfoService;
@Resource
TRExamStudentService trExamStudentService;
@ApiOperation(value = "报告管理列表")
@RequestMapping(value = "/report/list", method = RequestMethod.POST)
@OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.SEARCH)
@ApiResponses({@ApiResponse(code = 200, message = "分页查询", response = ScoreResult.class)})
public Object reportList(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
@ApiParam(value = "课程编码") @RequestParam(required = false) String courseCode,
@ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
@ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
return ResultUtil.ok(printCommonService.scoreList(new Page<>(pageNumber, pageSize), examId, courseCode));
}
@ApiOperation(value = "查看报告")
@RequestMapping(value = "/report/view", method = RequestMethod.POST)
@OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.SEARCH)
@ApiResponses({@ApiResponse(code = 200, message = "查看报告", response = ReportResult.class)})
@Transactional
public Object reportView(@ApiParam(value = "考试id", required = true) @RequestParam Long examId,
@ApiParam(value = "科目编码", required = true) @RequestParam String courseCode,
@ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber) {
MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
Objects.requireNonNull(markPaper, "未找到科目信息");
SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
TRBasicInfo trBasicInfo = trBasicInfoService.getOne(new QueryWrapper().lambda().eq(TRBasicInfo::getExamId, examId).eq(TRBasicInfo::getCourseCode, courseCode).eq(TRBasicInfo::getPaperNumber, paperNumber));
if (Objects.isNull(trBasicInfo)) {
trBasicInfo = trBasicInfoService.getReportView(trBasicInfo, markPaper, sysUser.getId());
} else {
ReportCourseBasicInfoDto reportCourseBasicInfoDto = new ReportCourseBasicInfoDto(trBasicInfo);
ReportCourseEvaluationSpreadDto reportCourseEvaluationSpreadDto = Objects.nonNull(trBasicInfo.getCourseEvaluationSpread()) ? JSONObject.parseObject(trBasicInfo.getCourseEvaluationSpread(), ReportCourseEvaluationSpreadDto.class) : null;
ReportCourseEvaluationResultDto reportCourseEvaluationResultDto = Objects.nonNull(trBasicInfo.getCourseEvaluationResult()) ? JSONObject.parseObject(trBasicInfo.getCourseEvaluationResult(), ReportCourseEvaluationResultDto.class) : null;
ReportCourseEvaluationResultDetailDto reportCourseEvaluationResultDetailDto = null;
List trExamStudentList = trExamStudentService.list(new QueryWrapper().lambda().eq(TRExamStudent::getrBasicInfoId, trBasicInfo.getId()));
if (!CollectionUtils.isEmpty(trExamStudentList)) {
List examStudentList = new ArrayList<>(trExamStudentList.size());
for (TRExamStudent trExamStudent : trExamStudentList) {
examStudentList.add(new ReportExamStudentDto(trExamStudent));
}
reportCourseEvaluationResultDetailDto = new ReportCourseEvaluationResultDetailDto(examStudentList);
}
trBasicInfo.setReportResult(new ReportResult(new ReportCommonDto(examId, courseCode, markPaper.getCourseName(), paperNumber), reportCourseBasicInfoDto, reportCourseEvaluationSpreadDto, reportCourseEvaluationResultDto, reportCourseEvaluationResultDetailDto));
}
trBasicInfo.updateInfo(sysUser.getId());
//课程目标达成评价明细结果-课程目标达成评价值图
trBasicInfoService.saveOrUpdate(trBasicInfo);
return ResultUtil.ok(trBasicInfo.getReportResult());
}
@ApiOperation(value = "保存报告")
@RequestMapping(value = "/report/save", method = RequestMethod.POST)
@OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.UPDATE)
@ApiResponses({@ApiResponse(code = 200, message = "保存报告", response = Object.class)})
@Transactional
public Object reportSave(@ApiParam(value = "保存报告结构", required = true) @Valid @RequestBody TRBasicInfo trBasicInfo, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
}
SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
TRBasicInfo trBasicInfoDb = trBasicInfoService.getOne(new QueryWrapper().lambda().eq(TRBasicInfo::getExamId, trBasicInfo.getExamId()).eq(TRBasicInfo::getCourseCode, trBasicInfo.getCourseCode()).eq(TRBasicInfo::getPaperNumber, trBasicInfo.getPaperNumber()));
if (Objects.isNull(trBasicInfoDb)) {
trBasicInfoDb = new TRBasicInfo(trBasicInfo, sysUser.getId());
MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(trBasicInfo.getExamId(), trBasicInfo.getPaperNumber());
Objects.requireNonNull(markPaper, "未找到科目信息");
trBasicInfoDb = trBasicInfoService.getReportView(trBasicInfoDb, markPaper, sysUser.getId());
} else {
trBasicInfoDb.updateInfo(trBasicInfo, sysUser.getId());
}
return ResultUtil.ok(trBasicInfoService.saveOrUpdate(trBasicInfoDb));
}
@ApiOperation(value = "导出报告")
@RequestMapping(value = "/report/export", method = RequestMethod.POST)
@OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.EXPORT)
@ApiResponses({@ApiResponse(code = 200, message = "下载成功", response = Object.class)})
public void reportExport(@ApiParam(value = "考试id", required = true) @RequestParam Long examId,
@ApiParam(value = "科目编码", required = true) @RequestParam String courseCode,
@ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber) throws IOException {
TRBasicInfo trBasicInfo = trBasicInfoService.getOne(new QueryWrapper().lambda().eq(TRBasicInfo::getExamId, examId).eq(TRBasicInfo::getCourseCode, courseCode).eq(TRBasicInfo::getPaperNumber, paperNumber));
Objects.requireNonNull(trBasicInfo, "没有报告信息");
Objects.requireNonNull(trBasicInfo.getCourseEvaluationResult(), "没有课程目标信息");
Objects.requireNonNull(trBasicInfo.getCourseEvaluationResultDetail(), "没有课程考生信息");
//评价样本的基本信息
String period = Objects.nonNull(trBasicInfo.getPeriod()) ? trBasicInfo.getPeriod() : null;
String credit = Objects.nonNull(trBasicInfo.getCredit()) ? trBasicInfo.getCredit() : null;
period = Objects.nonNull(credit) ? period + "/" + credit : period;
ReportCourseEvaluationResultDto reportCourseEvaluationResultDto = JSONObject.parseObject(trBasicInfo.getCourseEvaluationResult(), ReportCourseEvaluationResultDto.class);
CourseBasicBean courseBasicBean = new CourseBasicBean(trBasicInfo.getCourseName(),
trBasicInfo.getCourseCode(), null, trBasicInfo.getCourseType(),
period, null, null, trBasicInfo.getDirector(),
DateUtil.format(new Date(trBasicInfo.getCreateTime()), SystemConstant.DEFAULT_DATE_PATTERN),
"测试:我们的目标是没有目标", reportCourseEvaluationResultDto.getTargetList().size());
CourseReportBean courseReportBean = new CourseReportBean(trBasicInfo.getOpenTime() + "《" + trBasicInfo.getCourseName() + "》", courseBasicBean);
JSONObject jsonObject = JSONObject.parseObject(trBasicInfo.getCourseEvaluationResultDetail());
List courseTargetWordDtoList = JSONArray.parseArray(jsonObject.get("targetWordMap").toString(), CourseTargetWordDto.class);
List courseTargetWebDtoList = JSONArray.parseArray(jsonObject.get("targetWebMap").toString(), CourseTargetWebDto.class);
//table1-课程目标目标与毕业要求指标点的对应关系
List header2_1List = new ArrayList<>(Arrays.asList("课程目标", "支撑毕业要求")), header2_2List = new ArrayList<>();
header2_2List.addAll(header2_1List);
header2_1List.add("考核/评价环节及目标分值");
courseReportBean.setCourseTargetTable1(trBasicInfoService.buildWordTable1(courseTargetWordDtoList, header2_1List, header2_2List));
//table2-课程目标达成评价依据
courseReportBean.setCourseTargetTable2(trBasicInfoService.buildWordTable2(courseTargetWordDtoList, courseTargetWebDtoList, header2_1List, header2_2List));
//table3-课程课后作业考核/评价内容及目标分值
courseReportBean.setCourseTargetTable3(trBasicInfoService.buildWordTable3(courseTargetWordDtoList));
//table4-课程期末考试考核/评价内容及目标分值
courseReportBean.setCourseTargetTable4(trBasicInfoService.buildWordTable4(courseTargetWordDtoList));
//examstudent-课程目标达成评价依据-考生
// List trExamStudentList = trExamStudentService.list(new QueryWrapper().lambda().eq(TRExamStudent::getrBasicInfoId, trBasicInfo.getId()));
// if (!CollectionUtils.isEmpty(trExamStudentList)) {
//// List finalScoreResultList = tcFinalScoreService.examStudentOverview(trBasicInfo.getExamId(), trBasicInfo.getCourseCode(), trBasicInfo.getPaperNumber());//考生成绩
//// Map finalScoreResultMap = finalScoreResultList.stream().collect(Collectors.toMap(FinalScoreResult::getStudentCode, Function.identity(), (dto1, dto2) -> dto1));
//
// List examStudent_cells_1 = new ArrayList<>(), examStudent_cells_2 = new ArrayList<>(), examStudent_cells_3 = new ArrayList<>(), examStudent_cells_4 = new ArrayList<>(), examStudent_cells_5 = new ArrayList<>();
// examStudent_cells_1.add(Cells.of("序号").center().create());
// examStudent_cells_1.add(Cells.of("学号").center().create());
// examStudent_cells_1.add(Cells.of("姓名").center().create());
// examStudent_cells_1.add(Cells.of("行政班级").center().create());
// examStudent_cells_2.addAll(examStudent_cells_1);
//
// examStudent_cells_3.add(Cells.of("课程目标考核要素的目标分").center().create());
// examStudent_cells_3.add(Cells.of("").center().create());
// examStudent_cells_3.add(Cells.of("").center().create());
// examStudent_cells_3.add(Cells.of("").center().create());
//
// examStudent_cells_4.add(Cells.of("课程目标考核要素的平均分").center().create());
// examStudent_cells_4.add(Cells.of("").center().create());
// examStudent_cells_4.add(Cells.of("").center().create());
// examStudent_cells_4.add(Cells.of("").center().create());
//
// examStudent_cells_5.add(Cells.of("各课程目标平均分").center().create());
// examStudent_cells_5.add(Cells.of("").center().create());
// examStudent_cells_5.add(Cells.of("").center().create());
// examStudent_cells_5.add(Cells.of("").center().create());
//
// List examStudentTableBeanList = new ArrayList<>();
// int seq5 = 0;
// Map targetUsualScoreSizeMap = new HashMap<>();
// trExamStudentList.remove(trExamStudentList.size() - 1);
// TRExamStudent trExamStudentTemp = trExamStudentList.get(0);
//
// //首行
// if (Objects.nonNull(trExamStudentTemp.getResultDetail())) {
// List reportExamStudentTargetDtoList = JSONArray.parseArray(trExamStudentTemp.getResultDetail(), ReportExamStudentTargetDto.class);
// for (ReportExamStudentTargetDto reportExamStudentTargetDto : reportExamStudentTargetDtoList) {
// examStudent_cells_1.add(Cells.of(reportExamStudentTargetDto.getTargetName()).center().create());
// ReportExamStudentUsualScoreDto reportExamStudentUsualScoreDto = reportExamStudentTargetDto.getUsualScore();
// //平常作业
// if (Objects.nonNull(reportExamStudentUsualScoreDto) && !CollectionUtils.isEmpty(reportExamStudentUsualScoreDto.getScoreList())) {
// List reportExamStudentUsualScoreObjDtoList = reportExamStudentUsualScoreDto.getScoreList();
// for (ReportExamStudentUsualScoreObjDto reportExamStudentUsualScoreObjDto : reportExamStudentUsualScoreObjDtoList) {
// if (!targetUsualScoreSizeMap.containsKey(reportExamStudentTargetDto.getTargetId())) {
// targetUsualScoreSizeMap.put(reportExamStudentTargetDto.getTargetId(), 1);
// } else {
// Integer size = targetUsualScoreSizeMap.get(reportExamStudentTargetDto.getTargetId());
// targetUsualScoreSizeMap.put(reportExamStudentTargetDto.getTargetId(), size++);
// }
// examStudent_cells_1.add(Cells.of("").center().create());
// //报错暂时去掉,记得恢复
//// examStudent_cells_2.add(Cells.of(reportExamStudentUsualScoreObjDto.getName()).center().create());
// }
// }
// //期末考试
// ReportExamStudentFinalScoreDto reportExamStudentFinalScoreDto = reportExamStudentTargetDto.getFinalScore();
// if (Objects.nonNull(reportExamStudentFinalScoreDto) && !CollectionUtils.isEmpty(reportExamStudentFinalScoreDto.getDimensionList())) {
// examStudent_cells_2.add(Cells.of("期末考试").center().create());
// }
// }
// examStudent_cells_1.add(Cells.of("综合成绩").center().create());
// examStudent_cells_2.add(Cells.of("综合成绩").center().create());
// }
//
// for (int i = 0; i < trExamStudentList.size(); i++) {
// TRExamStudent trExamStudent = trExamStudentList.get(i);
// LinkedMultiValueMap> scoreMap = new LinkedMultiValueMap<>();
// if (Objects.nonNull(trExamStudent.getResultDetail())) {
// List reportExamStudentTargetDtoList = JSONArray.parseArray(trExamStudent.getResultDetail(), ReportExamStudentTargetDto.class);
// for (ReportExamStudentTargetDto reportExamStudentTargetDto : reportExamStudentTargetDtoList) {
// if (Objects.nonNull(reportExamStudentTargetDto)) {
// ReportExamStudentUsualScoreDto reportExamStudentUsualScoreDto = reportExamStudentTargetDto.getUsualScore();
// //平常作业
// if (Objects.nonNull(reportExamStudentUsualScoreDto) && !CollectionUtils.isEmpty(reportExamStudentUsualScoreDto.getScoreList())) {
// List reportExamStudentUsualScoreObjDtoList = reportExamStudentUsualScoreDto.getScoreList();
// for (ReportExamStudentUsualScoreObjDto reportExamStudentUsualScoreObjDto : reportExamStudentUsualScoreObjDtoList) {
//// scoreMap.add(reportExamStudentTargetDto.getTargetId(), Collections.singletonMap(reportExamStudentUsualScoreObjDto.getName(), new ExamStudentScoreBean(reportExamStudentUsualScoreObjDto.getScore())));
// }
// }
// //期末考试
// ReportExamStudentFinalScoreDto reportExamStudentFinalScoreDto = reportExamStudentTargetDto.getFinalScore();
// if (Objects.nonNull(reportExamStudentFinalScoreDto) && !CollectionUtils.isEmpty(reportExamStudentFinalScoreDto.getDimensionList())) {
// Double sumScore = reportExamStudentFinalScoreDto.getDimensionList().stream().mapToDouble(DimensionDto::getDimensionScore).sum();
// scoreMap.add(reportExamStudentTargetDto.getTargetId(), Collections.singletonMap("期末考试", new ExamStudentScoreBean(sumScore)));
// }
// }
// }
// seq5 = seq5 + 1;
// examStudentTableBeanList.add(new ExamStudentTableBean(seq5, trExamStudent.getStudentCode(), trExamStudent.getName(), trExamStudent.getAdministrativeClass(), scoreMap, 0.0d));
// }
// }
//
// String title = trBasicInfo.getTeachingObject();
// String sumTitle = "学生共${sum}名";
// sumTitle = sumTitle.replace("${sum}", trExamStudentList.size() + "");
//
// courseReportBean.setExamStudentTitle1(title + sumTitle);
// courseReportBean.setExamStudentTitle2(title + "《" + courseReportBean.getCourseBasicBean().getCourseName() + "》");
//
// RowRenderData[] rowRenderDataExamStudent = new RowRenderData[trExamStudentList.size() + 5];
//
// RowRenderData examStudent_header_1 = new RowRenderData();
// examStudent_header_1.setCells(examStudent_cells_1);
// examStudent_header_1.setRowStyle(this.getHeadRowStyle());
//
// RowRenderData examStudent_header_2 = new RowRenderData();
// examStudent_header_2.setCells(examStudent_cells_2);
// examStudent_header_2.setRowStyle(this.getHeadRowStyle());
//
// for (int i = 0; i < examStudentTableBeanList.size(); i++) {
// ExamStudentTableBean e = examStudentTableBeanList.get(i);
// RowRenderData examStudent_row = new RowRenderData();
// List examStudent_cells = new ArrayList<>();
// examStudent_cells.add(Cells.of(e.getNum().toString()).create());
// examStudent_cells.add(Cells.of(e.getStudentCode()).create());
// examStudent_cells.add(Cells.of(e.getName()).create());
// examStudent_cells.add(Cells.of(e.getAdministrativeClass()).create());
//
// String key = null;
// LinkedMultiValueMap> map = e.getMap();
// for (Map.Entry>> entry : map.entrySet()) {
// List