AssessmentTemplatePlanServiceImpl.java 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913
  1. package com.xjrsoft.module.assessment.service.impl;
  2. import cn.dev33.satoken.stp.StpUtil;
  3. import cn.hutool.core.bean.BeanUtil;
  4. import cn.hutool.core.util.IdUtil;
  5. import cn.hutool.core.util.StrUtil;
  6. import com.alibaba.fastjson.JSONObject;
  7. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  8. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  9. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  10. import com.github.yulichang.base.MPJBaseServiceImpl;
  11. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  12. import com.xjrsoft.common.enums.ArchivesStatusEnum;
  13. import com.xjrsoft.common.enums.AssessQuestionTypeEnum;
  14. import com.xjrsoft.common.enums.DeleteMark;
  15. import com.xjrsoft.common.exception.MyException;
  16. import com.xjrsoft.common.utils.VoToColumnUtil;
  17. import com.xjrsoft.common.utils.WeChatUtil;
  18. import com.xjrsoft.config.CommonPropertiesConfig;
  19. import com.xjrsoft.module.assessment.dto.*;
  20. import com.xjrsoft.module.assessment.entity.*;
  21. import com.xjrsoft.module.assessment.mapper.*;
  22. import com.xjrsoft.module.assessment.service.IAssessmentTemplatePlanService;
  23. import com.xjrsoft.module.assessment.vo.*;
  24. import com.xjrsoft.module.base.entity.BaseClass;
  25. import com.xjrsoft.module.base.mapper.BaseClassMapper;
  26. import com.xjrsoft.module.organization.dto.WeChatSendMessageDto;
  27. import com.xjrsoft.module.organization.service.IWeChatService;
  28. import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
  29. import com.xjrsoft.module.teacher.entity.XjrUser;
  30. import com.xjrsoft.module.teacher.mapper.XjrUserMapper;
  31. import lombok.AllArgsConstructor;
  32. import org.apache.poi.ss.usermodel.*;
  33. import org.apache.poi.ss.util.CellRangeAddress;
  34. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  35. import org.springframework.stereotype.Service;
  36. import org.springframework.transaction.annotation.Transactional;
  37. import java.io.ByteArrayOutputStream;
  38. import java.io.IOException;
  39. import java.text.SimpleDateFormat;
  40. import java.util.*;
  41. import java.util.stream.Collectors;
  42. /**
  43. * @title: 考核计划
  44. * @Author dzx
  45. * @Date: 2024-04-01
  46. * @Version 1.0
  47. */
  48. @Service
  49. @AllArgsConstructor
  50. public class AssessmentTemplatePlanServiceImpl extends MPJBaseServiceImpl<AssessmentTemplatePlanMapper, AssessmentTemplatePlan> implements IAssessmentTemplatePlanService {
  51. private final AssessmentTemplatePlanMapper templatePlanMapper;
  52. private final AssessmentPlanQuestionMapper planQuestionMapper;
  53. private final AssessmentPlanAnswerClassMapper answerClassMapper;
  54. private final AssessmentPlanAnswerStudentMapper studentMapper;
  55. private final AssessmentTemplateMapper assessmentTemplateMapper;
  56. private final AssessmentQuestionMapper questionMapper;
  57. private final AssessmentPlanAnswerResultMapper resultMapper;
  58. private final XjrUserMapper xjrUserMapper;
  59. private final IWeChatService weChatService;
  60. private final CommonPropertiesConfig commonPropertiesConfig;
  61. private final BaseClassMapper baseClassMapper;
  62. private final WeChatUtil weChatUtil;
  63. @Override
  64. @Transactional(rollbackFor = Exception.class)
  65. public Boolean add(AddAssessmentTemplatePlanDto dto) {
  66. AssessmentTemplate template = assessmentTemplateMapper.selectById(dto.getAssessmentTemplateId());
  67. AssessmentTemplatePlan assessmentTemplatePlan = BeanUtil.toBean(dto, AssessmentTemplatePlan.class);
  68. assessmentTemplatePlan.setScore(template.getScore());
  69. templatePlanMapper.insert(assessmentTemplatePlan);
  70. //查询模板下面的题目信息
  71. List<AssessmentQuestion> questionList = questionMapper.selectList(
  72. new QueryWrapper<AssessmentQuestion>().lambda()
  73. .eq(AssessmentQuestion::getDeleteMark, DeleteMark.NODELETE.getCode())
  74. .eq(AssessmentQuestion::getAssessmentTemplateId, dto.getAssessmentTemplateId())
  75. );
  76. Map<Long, Long> parentMap = new HashMap<>();
  77. for (AssessmentQuestion assessmentQuestion : questionList) {
  78. parentMap.put(assessmentQuestion.getId(), IdUtil.getSnowflakeNextId());
  79. }
  80. for (AssessmentQuestion assessmentQuestion : questionList) {
  81. AssessmentPlanQuestion planQuestion = BeanUtil.toBean(assessmentQuestion, AssessmentPlanQuestion.class);
  82. planQuestion.setId(parentMap.get(assessmentQuestion.getId()));
  83. planQuestion.setParentId(parentMap.get(assessmentQuestion.getParentId()));
  84. planQuestion.setAssessmentTemplatePlanId(assessmentTemplatePlan.getId());
  85. planQuestionMapper.insert(planQuestion);
  86. }
  87. List<BaseClass> classList = baseClassMapper.selectList(
  88. new QueryWrapper<BaseClass>().lambda()
  89. .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
  90. .eq(BaseClass::getIsGraduate, 1)
  91. );
  92. List<Long> classIds = new ArrayList<>();
  93. if ("all".equals(dto.getType())) {
  94. for (BaseClass baseClass : classList) {
  95. classIds.add(baseClass.getId());
  96. }
  97. dto.setClassIds(classIds);
  98. } else if ("random".equals(dto.getType())) {
  99. List<Integer> randomList = new ArrayList<>();
  100. Random random = new Random();
  101. while (randomList.size() < dto.getRandomNumber()) {
  102. int nextInt = random.nextInt(classList.size());
  103. if (!randomList.contains(nextInt) && nextInt >= 0) {
  104. randomList.add(nextInt);
  105. }
  106. }
  107. for (Integer i : randomList) {
  108. classIds.add(classList.get(i).getId());
  109. }
  110. dto.setClassIds(classIds);
  111. }
  112. String[] stduyStatus = assessmentTemplatePlan.getStduyStatus().split(",");
  113. //存入班级,并根据选人方式存入答题学生
  114. for (Long classId : dto.getClassIds()) {
  115. AssessmentPlanAnswerClass answerClass = new AssessmentPlanAnswerClass();
  116. answerClass.setAssessmentTemplatePlanId(assessmentTemplatePlan.getId());
  117. answerClass.setClassId(classId);
  118. answerClassMapper.insert(answerClass);
  119. MPJLambdaWrapper<XjrUser> query = new MPJLambdaWrapper<>();
  120. query.leftJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, XjrUser::getId)
  121. .in(BaseStudentSchoolRoll::getStduyStatus, Arrays.asList(stduyStatus))
  122. .eq(BaseStudentSchoolRoll::getClassId, classId);
  123. List<XjrUser> studentList = xjrUserMapper.selectJoinList(XjrUser.class, query);
  124. for (XjrUser xjrUser : studentList) {
  125. AssessmentPlanAnswerStudent answer = new AssessmentPlanAnswerStudent();
  126. answer.setAssessmentTemplatePlanId(assessmentTemplatePlan.getId());
  127. answer.setStudentUserId(xjrUser.getId());
  128. studentMapper.insert(answer);
  129. }
  130. }
  131. return true;
  132. }
  133. @Override
  134. @Transactional(rollbackFor = Exception.class)
  135. public Boolean update(UpdateAssessmentTemplatePlanDto dto) {
  136. AssessmentTemplate template = assessmentTemplateMapper.selectById(dto.getAssessmentTemplateId());
  137. AssessmentTemplatePlan assessmentTemplatePlan = BeanUtil.toBean(dto, AssessmentTemplatePlan.class);
  138. assessmentTemplatePlan.setScore(template.getScore());
  139. templatePlanMapper.updateById(assessmentTemplatePlan);
  140. //删除以前的题目
  141. planQuestionMapper.deleteByPlanId(assessmentTemplatePlan.getId(), StpUtil.getLoginIdAsLong());
  142. //查询模板下面的题目信息
  143. List<AssessmentQuestion> questionList = questionMapper.selectList(
  144. new QueryWrapper<AssessmentQuestion>().lambda()
  145. .eq(AssessmentQuestion::getDeleteMark, DeleteMark.NODELETE.getCode())
  146. .eq(AssessmentQuestion::getAssessmentTemplateId, dto.getAssessmentTemplateId())
  147. .orderByAsc(AssessmentQuestion::getCategory)
  148. );
  149. Map<Long, Long> parentMap = new HashMap<>();
  150. for (AssessmentQuestion assessmentQuestion : questionList) {
  151. parentMap.put(assessmentQuestion.getId(), IdUtil.getSnowflakeNextId());
  152. }
  153. for (AssessmentQuestion assessmentQuestion : questionList) {
  154. AssessmentPlanQuestion planQuestion = BeanUtil.toBean(assessmentQuestion, AssessmentPlanQuestion.class);
  155. planQuestion.setId(parentMap.get(assessmentQuestion.getId()));
  156. planQuestion.setParentId(parentMap.get(assessmentQuestion.getParentId()));
  157. planQuestion.setAssessmentTemplatePlanId(assessmentTemplatePlan.getId());
  158. planQuestionMapper.insert(planQuestion);
  159. }
  160. //删除班级和学生
  161. answerClassMapper.deleteByPlanId(assessmentTemplatePlan.getId(), StpUtil.getLoginIdAsLong());
  162. studentMapper.deleteByPlanId(assessmentTemplatePlan.getId(), StpUtil.getLoginIdAsLong());
  163. List<BaseClass> classList = baseClassMapper.selectList(
  164. new QueryWrapper<BaseClass>().lambda()
  165. .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
  166. .eq(BaseClass::getIsGraduate, 1)
  167. );
  168. List<Long> classIds = new ArrayList<>();
  169. if ("all".equals(dto.getType())) {
  170. for (BaseClass baseClass : classList) {
  171. classIds.add(baseClass.getId());
  172. }
  173. } else if ("random".equals(dto.getType())) {
  174. List<Integer> randomList = new ArrayList<>();
  175. Random random = new Random();
  176. while (randomList.size() < dto.getRandomNumber()) {
  177. int nextInt = random.nextInt(classList.size());
  178. if (!randomList.contains(nextInt) && nextInt >= 0) {
  179. randomList.add(nextInt);
  180. }
  181. }
  182. for (Integer i : randomList) {
  183. classIds.add(classList.get(i).getId());
  184. }
  185. }
  186. dto.setClassIds(classIds);
  187. //存入班级,并根据选人方式存入答题学生
  188. for (Long classId : dto.getClassIds()) {
  189. AssessmentPlanAnswerClass answerClass = new AssessmentPlanAnswerClass();
  190. answerClass.setAssessmentTemplatePlanId(assessmentTemplatePlan.getId());
  191. answerClass.setClassId(classId);
  192. answerClassMapper.insert(answerClass);
  193. MPJLambdaWrapper<XjrUser> query = new MPJLambdaWrapper<>();
  194. query.leftJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, XjrUser::getId)
  195. .eq(BaseStudentSchoolRoll::getClassId, classId);
  196. List<XjrUser> studentList = xjrUserMapper.selectJoinList(XjrUser.class, query);
  197. for (XjrUser xjrUser : studentList) {
  198. AssessmentPlanAnswerStudent answer = new AssessmentPlanAnswerStudent();
  199. answer.setAssessmentTemplatePlanId(assessmentTemplatePlan.getId());
  200. answer.setStudentUserId(xjrUser.getId());
  201. studentMapper.insert(answer);
  202. }
  203. }
  204. return true;
  205. }
  206. @Override
  207. public Boolean updateTime(UpdateAssessmentTemplatePlanTimeDto dto) {
  208. AssessmentTemplatePlan assessmentTemplatePlan = BeanUtil.toBean(dto, AssessmentTemplatePlan.class);
  209. templatePlanMapper.updateById(assessmentTemplatePlan);
  210. return true;
  211. }
  212. @Override
  213. @Transactional(rollbackFor = Exception.class)
  214. public Boolean delete(List<Long> ids) {
  215. templatePlanMapper.deleteBatchIds(ids);
  216. planQuestionMapper.delete(Wrappers.lambdaQuery(AssessmentPlanQuestion.class).in(AssessmentPlanQuestion::getAssessmentTemplatePlanId, ids));
  217. answerClassMapper.delete(Wrappers.lambdaQuery(AssessmentPlanAnswerClass.class).in(AssessmentPlanAnswerClass::getAssessmentTemplatePlanId, ids));
  218. studentMapper.delete(Wrappers.lambdaQuery(AssessmentPlanAnswerStudent.class).in(AssessmentPlanAnswerStudent::getAssessmentTemplatePlanId, ids));
  219. return true;
  220. }
  221. @Override
  222. public Page<AssessmentTemplatePlanPageVo> getPage(Page<AssessmentTemplatePlanPageVo> page, AssessmentTemplatePlanPageDto dto) {
  223. return templatePlanMapper.getPage(page, dto);
  224. }
  225. @Override
  226. public Page<AssessmentPlanAnswerStudentPageVo> getStudentPage(Page<AssessmentPlanAnswerStudentPageVo> page, AssessmentPlanAnswerPageDto dto) {
  227. return templatePlanMapper.getStudentPage(page, dto);
  228. }
  229. @Override
  230. public Page<AssessmentPlanAnswerTeacherPageVo> getTeacherPage(Page<AssessmentPlanAnswerTeacherPageVo> page, AssessmentPlanAnswerPageDto dto) {
  231. return templatePlanMapper.getTeacherPage(page, dto);
  232. }
  233. @Override
  234. public Boolean sure(AssessmentTemplatePlanSureDto dto) {
  235. long teacherId = StpUtil.getLoginIdAsLong();
  236. answerClassMapper.sure(dto, teacherId);
  237. studentMapper.sure(dto, teacherId);
  238. this.sendMsg(dto);
  239. return true;
  240. }
  241. @Override
  242. public AssessmentTemplatePlanQuestionVo getQuestionsById(Long id) {
  243. List<AssessmentPlanAnswerStudent> studentList = studentMapper.selectList(
  244. new QueryWrapper<AssessmentPlanAnswerStudent>().lambda()
  245. .eq(AssessmentPlanAnswerStudent::getDeleteMark, DeleteMark.NODELETE.getCode())
  246. .eq(AssessmentPlanAnswerStudent::getAssessmentTemplatePlanId, id)
  247. .eq(AssessmentPlanAnswerStudent::getStudentUserId, StpUtil.getLoginIdAsLong())
  248. );
  249. if (studentList.isEmpty()) {
  250. throw new MyException("当前登录账号与消息接收账号不匹配,请重新登录账号!");
  251. }
  252. AssessmentTemplatePlan templatePlan = templatePlanMapper.selectById(id);
  253. AssessmentTemplatePlanQuestionVo vo = BeanUtil.toBean(templatePlan, AssessmentTemplatePlanQuestionVo.class);
  254. List<AssessmentPlanQuestion> questionList = planQuestionMapper.selectList(
  255. new QueryWrapper<AssessmentPlanQuestion>().lambda()
  256. .eq(AssessmentPlanQuestion::getDeleteMark, DeleteMark.NODELETE.getCode())
  257. .eq(AssessmentPlanQuestion::getAssessmentTemplatePlanId, id)
  258. );
  259. Integer submitStatus = studentMapper.getSubmitStatus(id, StpUtil.getLoginIdAsLong());
  260. vo.setSubmitStatus(submitStatus);
  261. AssessmentQuestionResultDto resultDto = new AssessmentQuestionResultDto();
  262. resultDto.setAssessmentTemplatePlanId(id);
  263. resultDto.setUserId(StpUtil.getLoginIdAsLong());
  264. List<AssessmentQuestionResultVo> resultList = resultMapper.getResultList(resultDto);
  265. Map<Long, String> resultMap = new HashMap<>();
  266. for (AssessmentQuestionResultVo resultVo : resultList) {
  267. resultMap.put(resultVo.getQuestionId(), resultVo.getAnswer());
  268. }
  269. //循环大题
  270. List<AssessmentQuestionVo> oneList = new ArrayList<>();
  271. for (AssessmentPlanQuestion assessmentQuestion : questionList) {
  272. if (assessmentQuestion.getCategory() == 1) {
  273. oneList.add(BeanUtil.toBean(assessmentQuestion, AssessmentQuestionVo.class));
  274. }
  275. }
  276. //循环小题
  277. for (AssessmentQuestionVo oneQuestion : oneList) {
  278. List<AssessmentQuestionVo> twoList = new ArrayList<>();
  279. for (AssessmentPlanQuestion assessmentQuestion : questionList) {
  280. if (assessmentQuestion.getCategory() == 2 && assessmentQuestion.getParentId().equals(oneQuestion.getId())) {
  281. AssessmentQuestionVo questionVo = BeanUtil.toBean(assessmentQuestion, AssessmentQuestionVo.class);
  282. questionVo.setValue(resultMap.get(questionVo.getId()));
  283. twoList.add(questionVo);
  284. }
  285. }
  286. oneQuestion.setChildren(twoList);
  287. }
  288. //循环选项
  289. for (AssessmentQuestionVo oneQuestion : oneList) {
  290. for (AssessmentQuestionVo twoQuestion : oneQuestion.getChildren()) {
  291. List<AssessmentQuestionVo> optionList = new ArrayList<>();
  292. for (AssessmentPlanQuestion assessmentQuestion : questionList) {
  293. if (assessmentQuestion.getCategory() == 3 && assessmentQuestion.getParentId().equals(twoQuestion.getId())) {
  294. optionList.add(BeanUtil.toBean(assessmentQuestion, AssessmentQuestionVo.class));
  295. }
  296. }
  297. twoQuestion.setOptions(optionList);
  298. }
  299. }
  300. vo.setChildren(oneList);
  301. return vo;
  302. }
  303. @Override
  304. public Boolean saveAnswer(AssessmentPlanSubmitDto dto) {
  305. long studentUserId = StpUtil.getLoginIdAsLong();
  306. Date date = new Date();
  307. List<Long> questionIds = new ArrayList<>();
  308. for (AssessmentPlanAnswerSubmitDto answerSubmitDto : dto.getAnswerList()) {
  309. questionIds.add(answerSubmitDto.getQuestionId());
  310. }
  311. Map<Long, String> questionTypeMaps = new HashMap<>();
  312. planQuestionMapper.selectList(
  313. new QueryWrapper<AssessmentPlanQuestion>().lambda()
  314. .in(AssessmentPlanQuestion::getId, questionIds)
  315. ).forEach(question -> {
  316. questionTypeMaps.put(question.getId(), question.getType());
  317. });
  318. // 学生提交
  319. studentMapper.submitAnswer(dto.getAssessmentTemplatePlanId(), studentUserId);
  320. for (AssessmentPlanAnswerSubmitDto answerSubmitDto : dto.getAnswerList()) {
  321. if ("multi_question".equals(questionTypeMaps.get(answerSubmitDto.getQuestionId()))) {
  322. String[] split = answerSubmitDto.getAnswerId().split(",");
  323. for (String answerId : split) {
  324. AssessmentPlanAnswerResult answerStudent = new AssessmentPlanAnswerResult();
  325. answerStudent.setAssessmentTemplatePlanId(dto.getAssessmentTemplatePlanId());
  326. answerStudent.setStudentUserId(studentUserId);
  327. answerStudent.setCreateDate(date);
  328. answerStudent.setQuestionId(answerSubmitDto.getQuestionId());
  329. answerStudent.setAnswerId(answerId);
  330. resultMapper.insert(answerStudent);
  331. }
  332. } else {
  333. AssessmentPlanAnswerResult answerStudent = new AssessmentPlanAnswerResult();
  334. answerStudent.setAssessmentTemplatePlanId(dto.getAssessmentTemplatePlanId());
  335. answerStudent.setStudentUserId(studentUserId);
  336. answerStudent.setCreateDate(date);
  337. answerStudent.setQuestionId(answerSubmitDto.getQuestionId());
  338. answerStudent.setAnswerId(answerSubmitDto.getAnswerId());
  339. resultMapper.insert(answerStudent);
  340. }
  341. }
  342. return true;
  343. }
  344. @Override
  345. public List<AssessmentTemplatePlanPageVo> getMobilePage(AssessmentTemplatePlanPageDto dto) {
  346. return templatePlanMapper.getMobilePage(dto);
  347. }
  348. @Override
  349. public Page<AssessmentPlanAnswerStudentVo> getAnswerStudent(Page<AssessmentPlanAnswerStudentDto> page, AssessmentPlanAnswerStudentDto dto) {
  350. List<String> roleList = StpUtil.getRoleList();
  351. if (roleList.size() == 2 && roleList.contains("CLASSTE") && roleList.contains("TEACHER")) {
  352. dto.setTeacherId(StpUtil.getLoginIdAsLong());
  353. }
  354. return templatePlanMapper.getAnswerStudent(page, dto);
  355. }
  356. @Override
  357. public List<AssessmentPlanAnswerStudentVo> getAnswerStudentList(AssessmentPlanAnswerStudentDto dto) {
  358. List<String> roleList = StpUtil.getRoleList();
  359. if (roleList.size() == 2 && roleList.contains("CLASSTE") && roleList.contains("TEACHER")) {
  360. dto.setTeacherId(StpUtil.getLoginIdAsLong());
  361. }
  362. return this.baseMapper.getAnswerStudentList(dto);
  363. }
  364. @Override
  365. public List<Long> getSemesterClass(Long id) {
  366. return templatePlanMapper.getSemesterClass(id);
  367. }
  368. @Override
  369. public List<AssessmentPlanAnswerClassResultVo> getClassResult(Long id) {
  370. return resultMapper.getClassResult(id);
  371. }
  372. @Override
  373. public AssessmentTemplatePlanResultVo getQuestionResult(Long id) {
  374. AssessmentTemplatePlan templatePlan = templatePlanMapper.selectById(id);
  375. AssessmentTemplatePlanResultVo vo = BeanUtil.toBean(templatePlan, AssessmentTemplatePlanResultVo.class);
  376. vo.setStudentCount(studentMapper.getSubmitStudentCount(id));
  377. List<AssessmentPlanQuestion> questionList = planQuestionMapper.selectList(
  378. new QueryWrapper<AssessmentPlanQuestion>().lambda()
  379. .eq(AssessmentPlanQuestion::getDeleteMark, DeleteMark.NODELETE.getCode())
  380. .eq(AssessmentPlanQuestion::getAssessmentTemplatePlanId, id)
  381. );
  382. //循环大题
  383. List<OneQuestionVo> oneList = new ArrayList<>();
  384. for (AssessmentPlanQuestion assessmentQuestion : questionList) {
  385. if (assessmentQuestion.getCategory() == 1) {
  386. oneList.add(BeanUtil.toBean(assessmentQuestion, OneQuestionVo.class));
  387. }
  388. }
  389. //循环小题
  390. for (OneQuestionVo oneQuestion : oneList) {
  391. List<TwoQuestionVo> twoList = new ArrayList<>();
  392. for (AssessmentPlanQuestion assessmentQuestion : questionList) {
  393. if (assessmentQuestion.getCategory() == 2 && assessmentQuestion.getParentId().equals(oneQuestion.getId())) {
  394. TwoQuestionVo questionVo = BeanUtil.toBean(assessmentQuestion, TwoQuestionVo.class);
  395. twoList.add(questionVo);
  396. }
  397. }
  398. oneQuestion.setChildren(twoList);
  399. }
  400. List<AssessmentPlanAnswerDetailVo> questionResult = resultMapper.getQuestionResult(id);
  401. Map<String, Integer> answerCountMap = new HashMap<>();
  402. for (AssessmentPlanAnswerDetailVo countVo : questionResult) {
  403. answerCountMap.put(countVo.getQuestionId().toString() + countVo.getAnswerId(), countVo.getChooseCount());
  404. }
  405. //量表
  406. List<AssessmentPlanAnswerDetailVo> scaleQuestionResult = resultMapper.getScaleQuestionResult(id);
  407. //填空
  408. List<AssessmentPlanAnswerDetailVo> textQuestionResult = resultMapper.getTextQuestionResult(id);
  409. //循环选项
  410. for (OneQuestionVo oneQuestion : oneList) {
  411. for (TwoQuestionVo twoQuestion : oneQuestion.getChildren()) {
  412. List<AssessmentQuestionOptionResultVo> optionList = new ArrayList<>();
  413. if (AssessQuestionTypeEnum.RADIO.getCode().equals(twoQuestion.getType()) || AssessQuestionTypeEnum.MULTI.getCode().equals(twoQuestion.getType())) {
  414. for (AssessmentPlanQuestion assessmentQuestion : questionList) {
  415. if (assessmentQuestion.getCategory() == 3 && assessmentQuestion.getParentId().equals(twoQuestion.getId())) {
  416. AssessmentQuestionOptionResultVo questionVo = BeanUtil.toBean(assessmentQuestion, AssessmentQuestionOptionResultVo.class);
  417. Integer count = answerCountMap.get(assessmentQuestion.getParentId().toString() + assessmentQuestion.getId().toString());
  418. questionVo.setCount(count == null ? 0 : count);
  419. questionVo.setPercentage(vo.getStudentCount());
  420. optionList.add(questionVo);
  421. }
  422. }
  423. } else if (AssessQuestionTypeEnum.JUDGE.getCode().equals(twoQuestion.getType())) {
  424. optionList.add(new AssessmentQuestionOptionResultVo() {{
  425. setName("是");
  426. Integer count = answerCountMap.get(twoQuestion.getId().toString() + "1");
  427. setPercentage(vo.getStudentCount());
  428. setCount(count == null ? 0 : count);
  429. }});
  430. optionList.add(new AssessmentQuestionOptionResultVo() {{
  431. setName("否");
  432. Integer count = answerCountMap.get(twoQuestion.getId().toString() + "0");
  433. setPercentage(vo.getStudentCount());
  434. setCount(count == null ? 0 : count);
  435. }});
  436. } else if (AssessQuestionTypeEnum.SCALE.getCode().equals(twoQuestion.getType())) {
  437. for (AssessmentPlanAnswerDetailVo detailVo : scaleQuestionResult) {
  438. if (detailVo.getQuestionId().equals(twoQuestion.getId())) {
  439. optionList.add(new AssessmentQuestionOptionResultVo() {{
  440. setName(detailVo.getAnswerId() + "星");
  441. Integer count = detailVo.getChooseCount();
  442. setPercentage(vo.getStudentCount());
  443. setCount(count == null ? 0 : count);
  444. }});
  445. }
  446. }
  447. } else if (AssessQuestionTypeEnum.TEXT.getCode().equals(twoQuestion.getType())) {
  448. AssessmentQuestionOptionResultVo questionVo = new AssessmentQuestionOptionResultVo();
  449. int notNullCount = 0;
  450. int nullCount = 0;
  451. for (AssessmentPlanAnswerDetailVo detailVo : textQuestionResult) {
  452. if (!Objects.equals(detailVo.getQuestionId(), twoQuestion.getId())) {
  453. continue;
  454. }
  455. if (StrUtil.isNotEmpty(detailVo.getAnswerId())) {
  456. notNullCount++;
  457. } else {
  458. nullCount++;
  459. }
  460. }
  461. Integer count = answerCountMap.get(twoQuestion.getId().toString() + "null");
  462. questionVo.setCount(notNullCount);
  463. questionVo.setName("已答题");
  464. questionVo.setPercentage(vo.getStudentCount());
  465. optionList.add(questionVo);
  466. }
  467. twoQuestion.setResultList(optionList);
  468. }
  469. }
  470. vo.setChildren(oneList);
  471. return vo;
  472. }
  473. @Override
  474. public Boolean sendMsg(AssessmentTemplatePlanSureDto dto) {
  475. Long teacherId = null;
  476. List<String> roleList = StpUtil.getRoleList();
  477. if (roleList.size() == 2 && roleList.contains("TEACHER") && roleList.contains("CLASSTE")) {
  478. teacherId = StpUtil.getLoginIdAsLong();
  479. }
  480. //先查询班上的所有学生
  481. MPJLambdaWrapper<XjrUser> queryWrapper = new MPJLambdaWrapper<>();
  482. queryWrapper
  483. .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
  484. .innerJoin(AssessmentPlanAnswerStudent.class, AssessmentPlanAnswerStudent::getStudentUserId, XjrUser::getId)
  485. .innerJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, XjrUser::getId)
  486. .innerJoin(BaseClass.class, BaseClass::getId, BaseStudentSchoolRoll::getClassId)
  487. .eq(BaseStudentSchoolRoll::getClassId, dto.getClassId())
  488. .eq(AssessmentPlanAnswerStudent::getAssessmentTemplatePlanId, dto.getId())
  489. .eq(teacherId != null, BaseClass::getTeacherId, teacherId)
  490. .eq(AssessmentPlanAnswerStudent::getSubmitStatus, 0)
  491. .eq(BaseStudentSchoolRoll::getArchivesStatus, ArchivesStatusEnum.FB2901.getCode())
  492. .disableSubLogicDel();
  493. List<XjrUser> userList = xjrUserMapper.selectJoinList(XjrUser.class, queryWrapper);
  494. AssessmentTemplatePlan templatePlan = templatePlanMapper.selectById(dto.getId());
  495. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  496. String templateId = "sHsmz7LRj7HLd7GSTS3r2jCLvK-4Wp19iGzEvYK8n_I";
  497. for (XjrUser user : userList) {
  498. WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
  499. weChatSendMessageDto.setUserId(user.getOpenId());
  500. weChatSendMessageDto.setTemplateId(templateId);
  501. weChatSendMessageDto.setUrl(StrUtil.format("{}/pages/student/canteen/evaluate?id={}", commonPropertiesConfig.getDomainApp(), dto.getId()));
  502. weChatSendMessageDto.setMsgId(IdUtil.getSnowflakeNextIdStr());
  503. JSONObject paramJson = new JSONObject();
  504. JSONObject thing8 = new JSONObject();
  505. thing8.put("value", "食堂评价");
  506. paramJson.put("thing8", thing8);
  507. JSONObject thing2 = new JSONObject();
  508. thing2.put("value", templatePlan.getName());
  509. paramJson.put("thing2", thing2);
  510. JSONObject thing6 = new JSONObject();
  511. thing6.put("value", "重庆市铜梁职业教育中心");
  512. paramJson.put("thing6", thing6);
  513. JSONObject time3 = new JSONObject();
  514. time3.put("value", sdf.format(templatePlan.getStartTime()));
  515. paramJson.put("time3", time3);
  516. weChatSendMessageDto.setContent(paramJson);
  517. weChatService.sendTemplateMessage(weChatSendMessageDto);
  518. }
  519. return true;
  520. }
  521. @Override
  522. public AssessmentTemplatePlanAnswerResultVo getAnswerStudentResult(Long studentUserId, Long assessmentTemplatePlanId) {
  523. AssessmentTemplatePlan templatePlan = templatePlanMapper.selectById(assessmentTemplatePlanId);
  524. AssessmentTemplatePlanAnswerResultVo vo = BeanUtil.toBean(templatePlan, AssessmentTemplatePlanAnswerResultVo.class);
  525. List<AssessmentPlanQuestion> questionList = planQuestionMapper.selectList(
  526. new QueryWrapper<AssessmentPlanQuestion>().lambda()
  527. .eq(AssessmentPlanQuestion::getDeleteMark, DeleteMark.NODELETE.getCode())
  528. .eq(AssessmentPlanQuestion::getAssessmentTemplatePlanId, assessmentTemplatePlanId)
  529. );
  530. //循环大题
  531. List<OneQuestionAnswerVo> oneList = new ArrayList<>();
  532. for (AssessmentPlanQuestion assessmentQuestion : questionList) {
  533. if (assessmentQuestion.getCategory() == 1) {
  534. oneList.add(BeanUtil.toBean(assessmentQuestion, OneQuestionAnswerVo.class));
  535. }
  536. }
  537. //循环小题
  538. for (OneQuestionAnswerVo oneQuestion : oneList) {
  539. List<TwoQuestionAnswerVo> twoList = new ArrayList<>();
  540. for (AssessmentPlanQuestion assessmentQuestion : questionList) {
  541. if (assessmentQuestion.getCategory() == 2 && assessmentQuestion.getParentId().equals(oneQuestion.getId())) {
  542. TwoQuestionAnswerVo questionVo = BeanUtil.toBean(assessmentQuestion, TwoQuestionAnswerVo.class);
  543. twoList.add(questionVo);
  544. }
  545. }
  546. oneQuestion.setChildren(twoList);
  547. }
  548. List<AssessmentPlanAnswerDetailVo> questionResult = resultMapper.getStudentQuestionResultList(assessmentTemplatePlanId, studentUserId);
  549. Map<Long, List<AssessmentPlanAnswerDetailVo>> answerResultMap = questionResult.stream().collect(Collectors.groupingBy(AssessmentPlanAnswerDetailVo::getQuestionId));
  550. //循环选项
  551. for (OneQuestionAnswerVo oneQuestion : oneList) {
  552. for (TwoQuestionAnswerVo twoQuestion : oneQuestion.getChildren()) {
  553. List<AssessmentPlanAnswerDetailVo> resultList = answerResultMap.get(twoQuestion.getId());
  554. if (AssessQuestionTypeEnum.MULTI.getCode().equals(twoQuestion.getType())) {
  555. String answerStr = "";
  556. for (int i = 0; i < resultList.size(); i++) {
  557. if (i > 0) {
  558. answerStr += "\r\n";
  559. }
  560. answerStr += resultList.get(i).getAnswerId();
  561. }
  562. twoQuestion.setResult(answerStr);
  563. } else if (AssessQuestionTypeEnum.SCALE.getCode().equals(twoQuestion.getType())) {
  564. twoQuestion.setResult(resultList.get(0).getAnswerId() + "星");
  565. } else if (AssessQuestionTypeEnum.JUDGE.getCode().equals(twoQuestion.getType())) {
  566. List<String> answerList = resultList.stream().filter(x -> x.getAnswerId() != null)
  567. .map(AssessmentPlanAnswerDetailVo::getAnswerId).collect(Collectors.toList());
  568. String replace = answerList.toString().replace("[", "").replace("]", "");
  569. if ("1".equals(replace)) {
  570. twoQuestion.setResult("是");
  571. } else if ("0".equals(replace)) {
  572. twoQuestion.setResult("否");
  573. }
  574. } else {
  575. List<String> answerList = resultList.stream().filter(x -> x.getAnswerId() != null).map(AssessmentPlanAnswerDetailVo::getAnswerId).collect(Collectors.toList());
  576. if (!answerList.isEmpty()) {
  577. twoQuestion.setResult(answerList.toString().replace("[", "").replace("]", ""));
  578. }
  579. }
  580. }
  581. }
  582. vo.setChildren(oneList);
  583. return vo;
  584. }
  585. @Override
  586. public byte[] answerExportQuery(AssessmentPlanAnswerStudentDto dto) throws IOException {
  587. //查询大题
  588. List<AssessmentPlanQuestion> oneQuesList = planQuestionMapper.selectList(
  589. new QueryWrapper<AssessmentPlanQuestion>().lambda()
  590. .eq(AssessmentPlanQuestion::getDeleteMark, DeleteMark.NODELETE.getCode())
  591. .eq(AssessmentPlanQuestion::getAssessmentTemplatePlanId, dto.getAssessmentTemplatePlanId())
  592. .eq(AssessmentPlanQuestion::getCategory, 1)
  593. .orderByAsc(AssessmentPlanQuestion::getId)
  594. );
  595. //查询二级题目
  596. List<AssessmentPlanQuestion> towQuesList = planQuestionMapper.selectList(
  597. new QueryWrapper<AssessmentPlanQuestion>().lambda()
  598. .eq(AssessmentPlanQuestion::getCategory, 2)
  599. .eq(AssessmentPlanQuestion::getAssessmentTemplatePlanId, dto.getAssessmentTemplatePlanId())
  600. .eq(AssessmentPlanQuestion::getDeleteMark, DeleteMark.NODELETE.getCode())
  601. .orderByAsc(AssessmentPlanQuestion::getId)
  602. );
  603. Map<Long, List<AssessmentPlanQuestion>> towQuesMaps = towQuesList.stream().collect(Collectors.groupingBy(AssessmentPlanQuestion::getParentId));
  604. List<AssessmentPlanAnswerDetailVo> results = resultMapper.getPlanQuestionResultList(dto.getAssessmentTemplatePlanId());
  605. Map<Long, List<AssessmentPlanAnswerDetailVo>> studentAnswerMaps = results.stream().collect(Collectors.groupingBy(AssessmentPlanAnswerDetailVo::getStudentUserId));
  606. //查询已答题学生
  607. dto.setSubmitStatus(1);
  608. List<AssessmentPlanAnswerStudentVo> studentList = this.baseMapper.getAnswerStudentList(dto);
  609. List<List<String>> dataList = new ArrayList<>();
  610. int sortCode = 1;
  611. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  612. for (AssessmentPlanAnswerStudentVo studentVo : studentList) {
  613. List<String> rowData = new ArrayList<>();
  614. rowData.add(sortCode + "");
  615. rowData.add(studentVo.getClassName());
  616. rowData.add(studentVo.getName());
  617. rowData.add(sdf.format(studentVo.getSubmitDate()));
  618. Map<Long, List<AssessmentPlanAnswerDetailVo>> answerMaps = studentAnswerMaps.get(Long.parseLong(studentVo.getStudentUserId()))
  619. .stream().collect(Collectors.groupingBy(AssessmentPlanAnswerDetailVo::getQuestionId));
  620. for (AssessmentPlanQuestion question : towQuesList) {
  621. List<AssessmentPlanAnswerDetailVo> resultList = answerMaps.get(question.getId());
  622. if (resultList.isEmpty()) {
  623. rowData.add("");
  624. continue;
  625. }
  626. if (AssessQuestionTypeEnum.MULTI.getCode().equals(question.getType())) {
  627. String answerStr = "";
  628. for (int i = 0; i < resultList.size(); i++) {
  629. if (i > 0) {
  630. answerStr += "\r\n";
  631. }
  632. answerStr += resultList.get(i).getAnswerId();
  633. }
  634. rowData.add(answerStr);
  635. } else if (AssessQuestionTypeEnum.SCALE.getCode().equals(question.getType())) {
  636. rowData.add(resultList.get(0).getAnswerId() + "星");
  637. } else if (AssessQuestionTypeEnum.TEXT.getCode().equals(question.getType())) {
  638. List<String> answerList = resultList.stream().filter(x -> x.getAnswerId() != null).map(AssessmentPlanAnswerDetailVo::getAnswerId).collect(Collectors.toList());
  639. if (!answerList.isEmpty()) {
  640. rowData.add(answerList.toString().replace("[", "").replace("]", ""));
  641. } else {
  642. rowData.add("");
  643. }
  644. } else if (AssessQuestionTypeEnum.JUDGE.getCode().equals(question.getType())) {
  645. List<String> answerList = resultList.stream().filter(x -> x.getAnswerId() != null)
  646. .map(AssessmentPlanAnswerDetailVo::getAnswerId).collect(Collectors.toList());
  647. String replace = answerList.toString().replace("[", "").replace("]", "");
  648. if ("1".equals(replace)) {
  649. rowData.add("是");
  650. } else if ("0".equals(replace)) {
  651. rowData.add("否");
  652. }
  653. } else {
  654. List<String> answerList = resultList.stream().filter(x -> x.getAnswerId() != null).map(AssessmentPlanAnswerDetailVo::getAnswerId).collect(Collectors.toList());
  655. if (!answerList.isEmpty()) {
  656. rowData.add(answerList.toString().replace("[", "").replace("]", ""));
  657. } else {
  658. rowData.add("");
  659. }
  660. }
  661. }
  662. dataList.add(rowData);
  663. sortCode++;
  664. }
  665. Workbook workbook = new XSSFWorkbook();
  666. // 创建一个工作表(sheet)
  667. String sheetName = "数据";
  668. Sheet sheet = workbook.createSheet(sheetName);
  669. createFirstTitle(workbook, sheet, oneQuesList, towQuesMaps);
  670. createSecondTitle(workbook, sheet, towQuesList);
  671. int dataRowNumber = 2;
  672. for (List<String> rowData : dataList) {
  673. Row dataRow = sheet.createRow(dataRowNumber);
  674. for (int i = 0; i < rowData.size(); i++) {
  675. // if(i < 7){
  676. // sheet.autoSizeColumn(i);
  677. // }
  678. String content = rowData.get(i);
  679. Font font = workbook.createFont();
  680. font.setBold(false);// 设置为粗体
  681. font.setFontName("宋体");
  682. font.setFontHeightInPoints((short) 12);
  683. CellStyle cellStyle = workbook.createCellStyle();
  684. cellStyle.setFont(font); // 将字体应用到样式
  685. cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
  686. cellStyle.setAlignment(HorizontalAlignment.LEFT);
  687. Cell row1cell2 = dataRow.createCell(i);
  688. row1cell2.setCellValue(content);
  689. row1cell2.setCellStyle(cellStyle);
  690. }
  691. dataRowNumber++;
  692. }
  693. //写入文件
  694. ByteArrayOutputStream bot = new ByteArrayOutputStream();
  695. workbook.write(bot);
  696. return bot.toByteArray();
  697. }
  698. @Override
  699. public Boolean sendMsgToTeacher(AssessmentTemplatePlan templatePlan) {
  700. List<XjrUser> userList = xjrUserMapper.selectJoinList(XjrUser.class,
  701. new MPJLambdaWrapper<XjrUser>()
  702. .select(XjrUser::getId)
  703. .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
  704. .innerJoin(BaseClass.class, BaseClass::getTeacherId, XjrUser::getId)
  705. .innerJoin(AssessmentPlanAnswerClass.class, AssessmentPlanAnswerClass::getClassId, BaseClass::getId)
  706. .eq(AssessmentPlanAnswerClass::getAssessmentTemplatePlanId, templatePlan.getId())
  707. .eq(AssessmentPlanAnswerClass::getDeleteMark, DeleteMark.NODELETE.getCode())
  708. );
  709. String templateId = "sHsmz7LRj7HLd7GSTS3r2jCLvK-4Wp19iGzEvYK8n_I";
  710. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  711. for (XjrUser user : userList) {
  712. WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
  713. weChatSendMessageDto.setUserId(user.getOpenId());
  714. weChatSendMessageDto.setTemplateId(templateId);
  715. weChatSendMessageDto.setUrl(StrUtil.format("{}/pages/student/canteen/index", commonPropertiesConfig.getDomainApp()));
  716. weChatSendMessageDto.setMsgId(IdUtil.getSnowflakeNextIdStr());
  717. JSONObject paramJson = new JSONObject();
  718. JSONObject thing8 = new JSONObject();
  719. thing8.put("value", "食堂评价");
  720. paramJson.put("thing8", thing8);
  721. JSONObject thing2 = new JSONObject();
  722. thing2.put("value", templatePlan.getName());
  723. paramJson.put("thing2", thing2);
  724. JSONObject thing6 = new JSONObject();
  725. thing6.put("value", "重庆市铜梁职业教育中心");
  726. paramJson.put("thing6", thing6);
  727. JSONObject time3 = new JSONObject();
  728. time3.put("value", sdf.format(templatePlan.getStartTime()));
  729. paramJson.put("time3", time3);
  730. weChatSendMessageDto.setContent(paramJson);
  731. weChatService.sendTemplateMessage(weChatSendMessageDto);
  732. }
  733. return true;
  734. }
  735. @Override
  736. public Boolean sendMsgToClass(AssessmentTemplatePlan templatePlan) {
  737. List<AssessmentPlanAnswerClass> classList = answerClassMapper.selectList(
  738. new QueryWrapper<AssessmentPlanAnswerClass>().lambda()
  739. .eq(AssessmentPlanAnswerClass::getDeleteMark, DeleteMark.NODELETE.getCode())
  740. .eq(AssessmentPlanAnswerClass::getAssessmentTemplatePlanId, templatePlan.getId())
  741. );
  742. for (AssessmentPlanAnswerClass answerClass : classList) {
  743. this.sendMsg(new AssessmentTemplatePlanSureDto() {{
  744. setClassId(answerClass.getClassId());
  745. setId(templatePlan.getId());
  746. }});
  747. }
  748. return true;
  749. }
  750. /**
  751. * 创建第一行表头
  752. */
  753. void createFirstTitle(Workbook workbook, Sheet sheet, List<AssessmentPlanQuestion> oneQuesList, Map<Long, List<AssessmentPlanQuestion>> towQuesMaps) {
  754. int rowNumber = 0;
  755. Font font = workbook.createFont();
  756. font.setBold(true);// 设置为粗体
  757. font.setFontName("宋体");
  758. //font.setColor(IndexedColors.RED.getIndex()); // 设置字体颜色为红色
  759. font.setFontHeightInPoints((short) 12);
  760. CellStyle cellStyle = workbook.createCellStyle();
  761. cellStyle.setFont(font); // 将字体应用到样式
  762. cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
  763. cellStyle.setAlignment(HorizontalAlignment.CENTER);
  764. Row row = sheet.createRow(rowNumber);
  765. int cellNumber = 0;
  766. Cell cell = row.createCell(cellNumber);
  767. cell.setCellValue("序号");
  768. cell.setCellStyle(cellStyle);
  769. sheet.addMergedRegion(new CellRangeAddress(rowNumber, 1, cellNumber, cellNumber));
  770. sheet.setColumnWidth(cellNumber, 5 * 3 * 256);
  771. cellNumber++;
  772. cell = row.createCell(cellNumber);
  773. cell.setCellValue("班级");
  774. cell.setCellStyle(cellStyle);
  775. sheet.addMergedRegion(new CellRangeAddress(rowNumber, 1, cellNumber, cellNumber));
  776. sheet.setColumnWidth(cellNumber, 5 * 3 * 256);
  777. cellNumber++;
  778. cell = row.createCell(cellNumber);
  779. cell.setCellValue("学生姓名");
  780. cell.setCellStyle(cellStyle);
  781. sheet.addMergedRegion(new CellRangeAddress(rowNumber, 1, cellNumber, cellNumber));
  782. sheet.setColumnWidth(cellNumber, 5 * 3 * 256);
  783. cellNumber++;
  784. cell = row.createCell(cellNumber);
  785. cell.setCellValue("提交时间");
  786. cell.setCellStyle(cellStyle);
  787. sheet.addMergedRegion(new CellRangeAddress(rowNumber, 1, cellNumber, cellNumber));
  788. sheet.setColumnWidth(cellNumber, 5 * 3 * 256);
  789. cellNumber++;
  790. for (AssessmentPlanQuestion question : oneQuesList) {
  791. int size = towQuesMaps.get(question.getId()).size();
  792. cell = row.createCell(cellNumber);
  793. cell.setCellValue(question.getName());
  794. cell.setCellStyle(cellStyle);
  795. if (size > 1) {
  796. sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber, cellNumber, cellNumber + size - 1));
  797. }
  798. cellNumber = cellNumber + size;
  799. }
  800. }
  801. void createSecondTitle(Workbook workbook, Sheet sheet, List<AssessmentPlanQuestion> towQuesList) {
  802. int rowNumber = 1;
  803. Font font = workbook.createFont();
  804. font.setBold(true);// 设置为粗体
  805. font.setFontName("宋体");
  806. //font.setColor(IndexedColors.RED.getIndex()); // 设置字体颜色为红色
  807. font.setFontHeightInPoints((short) 12);
  808. CellStyle cellStyle = workbook.createCellStyle();
  809. cellStyle.setFont(font); // 将字体应用到样式
  810. cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
  811. cellStyle.setAlignment(HorizontalAlignment.CENTER);
  812. Row row = sheet.createRow(rowNumber);
  813. int cellNumber = 4;
  814. for (AssessmentPlanQuestion question : towQuesList) {
  815. Cell cell = row.createCell(cellNumber);
  816. cell.setCellValue(question.getName());
  817. cell.setCellStyle(cellStyle);
  818. sheet.setColumnWidth(cellNumber, 20 * 3 * 256);
  819. cellNumber++;
  820. }
  821. }
  822. }