BaseStudentAssessmentInspectionServiceImpl.java 66 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301
  1. package com.xjrsoft.module.student.service.impl;
  2. import cn.dev33.satoken.stp.StpUtil;
  3. import cn.hutool.core.util.IdUtil;
  4. import cn.hutool.core.util.StrUtil;
  5. import com.alibaba.excel.EasyExcel;
  6. import com.alibaba.excel.ExcelWriter;
  7. import com.alibaba.excel.support.ExcelTypeEnum;
  8. import com.alibaba.excel.write.metadata.WriteSheet;
  9. import com.alibaba.fastjson.JSONObject;
  10. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  11. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  12. import com.baomidou.mybatisplus.core.metadata.IPage;
  13. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  14. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  15. import com.github.yulichang.base.MPJBaseServiceImpl;
  16. import com.github.yulichang.toolkit.MPJWrappers;
  17. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  18. import com.xjrsoft.common.enums.*;
  19. import com.xjrsoft.common.exception.MyException;
  20. import com.xjrsoft.common.model.result.RT;
  21. import com.xjrsoft.common.utils.VoToColumnUtil;
  22. import com.xjrsoft.common.utils.excel.ExcelMergeUtil;
  23. import com.xjrsoft.config.CommonPropertiesConfig;
  24. import com.xjrsoft.module.base.entity.BaseClass;
  25. import com.xjrsoft.module.base.mapper.BaseClassMapper;
  26. import com.xjrsoft.module.evaluate.dto.TeaEvaluateClassDto;
  27. import com.xjrsoft.module.evaluate.mapper.EvaluateResultMapper;
  28. import com.xjrsoft.module.evaluate.vo.TeaEvaluateClassListVo;
  29. import com.xjrsoft.module.organization.dto.WeChatSendMessageDto;
  30. import com.xjrsoft.module.organization.entity.User;
  31. import com.xjrsoft.module.organization.service.IUserService;
  32. import com.xjrsoft.module.organization.service.IWeChatService;
  33. import com.xjrsoft.module.student.dto.*;
  34. import com.xjrsoft.module.student.entity.*;
  35. import com.xjrsoft.module.student.mapper.*;
  36. import com.xjrsoft.module.student.service.IBaseStudentAssessmentInspectionService;
  37. import com.xjrsoft.module.student.service.IBaseStudentService;
  38. import com.xjrsoft.module.student.service.IQuotaFormulaRuleService;
  39. import com.xjrsoft.module.student.vo.*;
  40. import com.xjrsoft.module.system.entity.File;
  41. import com.xjrsoft.module.system.service.IFileService;
  42. import com.xjrsoft.module.teacher.entity.XjrUser;
  43. import lombok.AllArgsConstructor;
  44. import me.zhyd.oauth.log.Log;
  45. import org.apache.poi.ss.usermodel.*;
  46. import org.apache.poi.ss.util.CellRangeAddress;
  47. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  48. import org.springframework.beans.BeanUtils;
  49. import org.springframework.http.ResponseEntity;
  50. import org.springframework.stereotype.Service;
  51. import org.springframework.transaction.annotation.Transactional;
  52. import javax.script.ScriptEngine;
  53. import javax.script.ScriptEngineManager;
  54. import javax.script.ScriptException;
  55. import java.io.ByteArrayOutputStream;
  56. import java.io.IOException;
  57. import java.math.BigDecimal;
  58. import java.math.RoundingMode;
  59. import java.text.SimpleDateFormat;
  60. import java.time.LocalDate;
  61. import java.time.LocalDateTime;
  62. import java.time.temporal.TemporalAdjusters;
  63. import java.util.*;
  64. import java.util.stream.Collectors;
  65. /**
  66. * @title: 学生班级巡查考核
  67. * @Author dzx
  68. * @Date: 2023-11-16
  69. * @Version 1.0
  70. */
  71. @Service
  72. @AllArgsConstructor
  73. public class BaseStudentAssessmentInspectionServiceImpl extends MPJBaseServiceImpl<BaseStudentAssessmentInspectionMapper, BaseStudentAssessmentInspection> implements IBaseStudentAssessmentInspectionService {
  74. private final BaseStudentAssessmentInspectionMapper assessmentInspectionMapper;
  75. private final BaseStudentAssessmentCategoryMapper categoryMapper;
  76. private final BaseStudentAssessmentProjectMapper projectMapper;
  77. private final BaseStudentAssessmentStudentRelationMapper assessmentStudentRelationMapper;
  78. private final BaseStudentAssessmentClassRelationMapper assessmentClassRelationMapper;
  79. private final BaseClassMapper baseClassMapper;
  80. private final BaseStudentSchoolRollMapper baseStudentSchoolRollMapper;
  81. private final IFileService fileService;
  82. private final IUserService userService;
  83. private final IWeChatService weChatService;
  84. private final EvaluateResultMapper evaluateResultMapper;
  85. private final IQuotaFormulaRuleService quotaFormulaRuleService;
  86. private final CommonPropertiesConfig commonPropertiesConfig;
  87. private final IBaseStudentService studentService;
  88. private final BaseStudentAssessmentItemMapper itemMapper;
  89. @Override
  90. public Page<BaseStudentAssessmentInspectionPageVo> getPage(Page<BaseStudentAssessmentInspectionPageDto> page, BaseStudentAssessmentInspectionPageDto dto) {
  91. Page<BaseStudentAssessmentInspectionPageVo> result = assessmentInspectionMapper.getPage(page, dto);
  92. // 处理加减分
  93. result.getRecords().forEach((node) -> {
  94. if (node.getScoreType().equals(ScoreTypeEnum.ScoreMinus.getCode())) {
  95. node.setScore(node.getScore() * -1);
  96. }
  97. });
  98. return result;
  99. }
  100. @Override
  101. public BaseStudentAssessmentInspectionVo getInfo(Long id) {
  102. BaseStudentAssessmentInspectionVo result = assessmentInspectionMapper.getInfo(id);
  103. if (result == null) {
  104. throw new MyException("该记录已被作废");
  105. }
  106. // 获取班级信息
  107. List<BaseStudentAssessmentClassListVo> baseStudentAssessmentClassListVos = assessmentClassRelationMapper.selectJoinList(BaseStudentAssessmentClassListVo.class,
  108. MPJWrappers.<BaseStudentAssessmentClassRelation>lambdaJoin()
  109. .leftJoin(BaseClass.class, BaseClass::getId, BaseStudentAssessmentClassRelation::getClassId)
  110. .leftJoin(XjrUser.class, XjrUser::getId, BaseClass::getTeacherId)
  111. .eq(BaseStudentAssessmentClassRelation::getBaseStudentAssessmentInspectionId, id)
  112. .select(BaseStudentAssessmentClassRelation::getId)
  113. .selectAs(BaseClass::getName, BaseStudentAssessmentClassListVo::getClassName)
  114. .selectAs(XjrUser::getName, BaseStudentAssessmentClassListVo::getTeacherName)
  115. .selectAs(XjrUser::getMobile, BaseStudentAssessmentClassListVo::getMobile)
  116. .select(BaseStudentAssessmentClassRelation.class, x -> VoToColumnUtil.fieldsToColumns(BaseStudentAssessmentClassRelation.class).contains(x.getProperty()))
  117. );
  118. result.setClassList(baseStudentAssessmentClassListVos);
  119. // 获取学生信息
  120. result.setStudentList(assessmentInspectionMapper.getStudentListByInspectionId(id));
  121. // 获取文件列表
  122. result.setFileInfos(fileService.list(Wrappers.<File>query().lambda().eq(File::getFolderId, result.getFileId())));
  123. return result;
  124. }
  125. @Override
  126. public Page<BaseStudentAssessmentInspectionMobilePageVo> getMobilePage(Page<BaseStudentAssessmentInspectionMobilePageDto> page, BaseStudentAssessmentInspectionMobilePageDto dto) {
  127. if (dto.getClassIds() == null || dto.getClassIds().isEmpty()) {
  128. // 获取当前用户所管班级
  129. List<Long> classIds = baseClassMapper.selectList(
  130. Wrappers.<BaseClass>query().lambda()
  131. .eq(BaseClass::getTeacherId, StpUtil.getLoginIdAsLong())
  132. .select(BaseClass::getId)
  133. ).stream().map(BaseClass::getId).collect(Collectors.toList());
  134. dto.setClassIds(classIds);
  135. }
  136. if (dto.getClassIds() == null || dto.getClassIds().isEmpty()) {
  137. return null;
  138. }
  139. return assessmentInspectionMapper.getMobilePage(page, dto);
  140. }
  141. @Override
  142. public BaseStudentAssessmentInspectionMobileVo getMobileInfo(Long id) {
  143. BaseStudentAssessmentInspectionMobileVo result = assessmentInspectionMapper.getMobileInfo(id);
  144. // 处理加减分
  145. if (result.getScoreType().equals(ScoreTypeEnum.ScoreMinus.getCode())) {
  146. result.setScore(result.getScore() * -1);
  147. }
  148. MPJLambdaWrapper<BaseStudentAssessmentStudentRelation> baseStudentAssessmentStudentRelationWrapper = new MPJLambdaWrapper<>();
  149. baseStudentAssessmentStudentRelationWrapper
  150. .select(BaseStudentAssessmentStudentRelation::getId)
  151. .selectAs(XjrUser::getName, BaseStudentAssessmentStudentRelation::getName)
  152. .selectAs(XjrUser::getCredentialNumber, BaseStudentAssessmentStudentRelation::getStudentId)
  153. .eq(BaseStudentAssessmentStudentRelation::getBaseStudentAssessmentInspectionId, result.getBaseStudentAssessmentInspectionId())
  154. .eq(BaseStudentAssessmentStudentRelation::getClassId, result.getClassId())
  155. .leftJoin(XjrUser.class, XjrUser::getId, BaseStudentAssessmentStudentRelation::getUserId)
  156. .eq(BaseStudentAssessmentStudentRelation::getDeleteMark, DeleteMark.NODELETE.getCode())
  157. .eq(BaseStudentAssessmentStudentRelation::getEnabledMark, EnabledMark.ENABLED.getCode())
  158. ;
  159. // 获取学生信息
  160. List<BaseStudentAssessmentStudentRelation> baseStudentAssessmentStudentRelations = assessmentStudentRelationMapper.selectList(baseStudentAssessmentStudentRelationWrapper);
  161. result.setStudentList(baseStudentAssessmentStudentRelations);
  162. result.setStudentCount(baseStudentAssessmentStudentRelations.size());
  163. // 获取文件列表
  164. result.setFileInfos(fileService.list(Wrappers.<File>query().lambda().eq(File::getFolderId, result.getFileId())));
  165. return result;
  166. }
  167. @Override
  168. public ResponseEntity<byte[]> getQuantitativeAssessmentExcelByte(QuantitativeAssessmentExcelDto dto) {
  169. //导出的文件名,字节流
  170. String fileName = "StudentAssessmentInspection" + ExcelTypeEnum.XLSX.getValue();
  171. ByteArrayOutputStream bot = new ByteArrayOutputStream();
  172. //获取需要导出的子表
  173. List<Long> baseStudentAssessmentCategoryIdList = new ArrayList<>();
  174. baseStudentAssessmentCategoryIdList.add(1768178717588197377L);
  175. baseStudentAssessmentCategoryIdList.add(1768179375900987394L);
  176. baseStudentAssessmentCategoryIdList.add(1769927649167151105L);
  177. LambdaQueryWrapper<BaseStudentAssessmentCategory> baseStudentAssessmentCategoryLambdaQueryWrapper = new LambdaQueryWrapper<>();
  178. baseStudentAssessmentCategoryLambdaQueryWrapper
  179. .in(BaseStudentAssessmentCategory::getId, baseStudentAssessmentCategoryIdList);
  180. List<BaseStudentAssessmentCategory> baseStudentAssessmentCategorieList = categoryMapper.selectList(baseStudentAssessmentCategoryLambdaQueryWrapper);
  181. //导出子表
  182. if (!baseStudentAssessmentCategorieList.isEmpty()) {
  183. //需要合并的列
  184. int[] mergeColumeIndex = {0, 1, 2, 3, 4};
  185. ExcelMergeUtil excelFillCellMergeStrategy = new ExcelMergeUtil(1, mergeColumeIndex);
  186. //开始处理写入
  187. try (ExcelWriter excelWriter = EasyExcel.write(bot, QuantitativeAssessmentSubTableExcelVo.class).registerWriteHandler(excelFillCellMergeStrategy).build()) {
  188. int no = 1;
  189. for (BaseStudentAssessmentCategory bsac : baseStudentAssessmentCategorieList) {
  190. dto.setBaseStudentAssessmentCategoryId(bsac.getId());
  191. //sheet名
  192. String sheetName = bsac.getName();
  193. WriteSheet writeSheet = EasyExcel.writerSheet(no++, sheetName).build();
  194. //求所有的个人行为集合
  195. List<QuantitativeAssessmentSubTableExcelVo> quantitativeAssessmentSubTableExcelVoList = assessmentInspectionMapper.getQuantitativeAssessmentSubTableExcelVoList(dto);
  196. excelWriter.write(quantitativeAssessmentSubTableExcelVoList, writeSheet);
  197. }
  198. //TODO 班级量化考核统计表总
  199. //以班级为数据的基础进行数据的填充
  200. MPJLambdaWrapper<BaseClass> baseClassMPJLambdaWrapper = new MPJLambdaWrapper<>();
  201. baseClassMPJLambdaWrapper
  202. .selectAs(BaseClass::getTeacherId, CalssQuantitativeAssessmentPageVo::getHeadTeacherId)
  203. .selectAs(XjrUser::getUserName, CalssQuantitativeAssessmentPageVo::getOa)
  204. .selectAs(XjrUser::getName, CalssQuantitativeAssessmentPageVo::getHeadTeacherName)
  205. .selectAs(BaseClass::getId, CalssQuantitativeAssessmentPageVo::getClassId)
  206. .selectAs(BaseClass::getName, CalssQuantitativeAssessmentPageVo::getClassName)
  207. .select("(SELECT COUNT(DISTINCT(a1.id)) FROM xjr_user a1" +
  208. " LEFT JOIN base_student_school_roll a2 ON a1.id = a2.user_id" +
  209. " WHERE a1.delete_mark = 0 AND a2.delete_mark = 0" +
  210. " AND a2.class_id = t1.id" +
  211. " AND a2.archives_status = 'FB2901') as student_num")
  212. .selectAs(BaseClass::getIsGraduate, CalssQuantitativeAssessmentPageVo::getClassStatus)
  213. .leftJoin(XjrUser.class, XjrUser::getId, BaseClass::getTeacherId)
  214. .eq(dto.getGradeId() != null, BaseClass::getGradeId, dto.getGradeId())
  215. .eq(dto.getClassId() != null, BaseClass::getId, dto.getClassId())
  216. .eq(dto.getClassStatus() != null, BaseClass::getIsGraduate, dto.getClassStatus())
  217. .like(dto.getName() != null && !dto.getName().isEmpty(), XjrUser::getName, dto.getName());
  218. List<CalssQuantitativeAssessmentPageVo> resultList = baseClassMapper.selectJoinList(CalssQuantitativeAssessmentPageVo.class, baseClassMPJLambdaWrapper);
  219. //当前数据记录班级id
  220. List<Long> classIdList = new ArrayList<>();
  221. for (CalssQuantitativeAssessmentPageVo c : resultList) {
  222. classIdList.add(Long.parseLong(c.getClassId()));
  223. }
  224. dto.setClassIdList(classIdList);
  225. if (dto.getStartTime() != null) {
  226. // 获取上个月的最后一秒
  227. LocalDateTime lastMonthEnd = dto.getStartTime().minusMonths(1).with(TemporalAdjusters.lastDayOfMonth()).withHour(23).withMinute(59).withSecond(59);
  228. // 获取下个月的第一秒
  229. LocalDateTime nextMonthStart = dto.getStartTime().plusMonths(1).with(TemporalAdjusters.firstDayOfMonth()).withHour(0).withMinute(0).withSecond(0);
  230. dto.setStartTime(lastMonthEnd);
  231. dto.setEndTime(nextMonthStart);
  232. }
  233. if (!classIdList.isEmpty()) {
  234. CalssQuantitativeAssessmentPageDto calssQuantitativeAssessmentPageDto = new CalssQuantitativeAssessmentPageDto();
  235. BeanUtils.copyProperties(dto, calssQuantitativeAssessmentPageDto);
  236. //学生个人行为
  237. dto.setBaseStudentAssessmentCategoryId(1782327704603373570L);
  238. Map<Long, QuantitativeAssessmentSingleScoreVo> individualBehaviorMap = getQuantitativeAssessmentSingleScoreMap(calssQuantitativeAssessmentPageDto);
  239. //常规管理
  240. dto.setBaseStudentAssessmentCategoryId(1782329720935329794L);
  241. Map<Long, QuantitativeAssessmentSingleScoreVo> conventionalManagementMap = getQuantitativeAssessmentSingleScoreMap(calssQuantitativeAssessmentPageDto);
  242. //获奖及荣誉奖彰
  243. dto.setBaseStudentAssessmentCategoryId(1787316203484131329L);
  244. Map<Long, QuantitativeAssessmentSingleScoreVo> awardsAndHonorableMap = getQuantitativeAssessmentSingleScoreMap(calssQuantitativeAssessmentPageDto);
  245. //准军事化考核
  246. dto.setBaseStudentAssessmentCategoryId(1868835208799236098L);
  247. Map<Long, QuantitativeAssessmentSingleScoreVo> paramilitaryMap = getQuantitativeAssessmentSingleScoreMap(calssQuantitativeAssessmentPageDto);
  248. //查询任课教师查询班级的数据
  249. TeaEvaluateClassDto evaluateClassDto = new TeaEvaluateClassDto();
  250. evaluateClassDto.setEvaluateType(EvaluateTypeEnum.TEACHER_EVALUATE_CLASS.getCode());
  251. evaluateClassDto.setYear(dto.getYear());
  252. LocalDate now = LocalDate.now();
  253. if (dto.getYear() == null) {
  254. evaluateClassDto.setYear(now.getYear());
  255. }
  256. evaluateClassDto.setMonth(dto.getMonth());
  257. if (dto.getMonth() == null) {
  258. evaluateClassDto.setMonth(now.getMonthValue());
  259. }
  260. List<TeaEvaluateClassListVo> teaEvaluateClassList = evaluateResultMapper.getTeaEvaluateClassList(evaluateClassDto);
  261. Map<Long, List<TeaEvaluateClassListVo>> classEvaluateMap = teaEvaluateClassList.stream().collect(Collectors.groupingBy(TeaEvaluateClassListVo::getEvaluatedObjectId));
  262. String jskhFormula = quotaFormulaRuleService.getFormulaByQuota("teacher_assessment");
  263. //将结果写进对应的班级里
  264. for (CalssQuantitativeAssessmentPageVo c : resultList) {
  265. if (c.getOa() == null) {
  266. c.setOa(" ");
  267. }
  268. if (c.getHeadTeacherName() == null) {
  269. c.setHeadTeacherName(" ");
  270. }
  271. Long classId = Long.parseLong(c.getClassId());
  272. c.setStuPersonalBehaviorSubScore(" ");
  273. c.setStuPersonalBehaviorScore(" ");
  274. if (individualBehaviorMap.get(classId) != null) {
  275. Double sumScore = individualBehaviorMap.get(classId).getSumScore();
  276. if (sumScore != null) {
  277. c.setStuPersonalBehaviorSubScore(sumScore.toString());
  278. double v = (100 + sumScore) / 100 * 25;
  279. c.setStuPersonalBehaviorScore(v + "");
  280. }
  281. }
  282. c.setClassConventionalManageSubScore(" ");
  283. c.setClassConventionalManageScore(" ");
  284. if (conventionalManagementMap.get(classId) != null) {
  285. Double sumScore = conventionalManagementMap.get(classId).getSumScore();
  286. if (sumScore != null) {
  287. c.setClassConventionalManageSubScore(sumScore.toString());
  288. double v = (100 + sumScore) / 100 * 25;
  289. c.setClassConventionalManageScore(v + "");
  290. }
  291. }
  292. c.setHonorSumScore(" ");
  293. c.setHonorScore(" ");
  294. if (awardsAndHonorableMap.get(classId) != null) {
  295. Double sumScore = awardsAndHonorableMap.get(classId).getSumScore();
  296. if (sumScore != null) {
  297. c.setHonorSumScore(sumScore.toString());
  298. if (sumScore < 10) {
  299. c.setHonorScore(sumScore.toString());
  300. } else {
  301. c.setHonorScore("10");
  302. }
  303. }
  304. }
  305. if (c.getClassStatus() != null) {
  306. if (c.getClassStatus() == 1) {
  307. c.setClassStatusCn("在读");
  308. }
  309. if (c.getClassStatus() == 2) {
  310. c.setClassStatusCn("毕业");
  311. }
  312. }
  313. c.setTeacherAssessComprehensiveIndex(" ");
  314. c.setTeacherAssessScore(" ");
  315. if (classEvaluateMap.containsKey(classId)) {
  316. Map<Long, List<TeaEvaluateClassListVo>> evaluateCategoryMap = classEvaluateMap.get(classId).stream().collect(Collectors.groupingBy(TeaEvaluateClassListVo::getId));
  317. int size = evaluateCategoryMap.size();
  318. List<Double> evaluateSocreList = new ArrayList<>();//存每个项的平均分
  319. for (Long id : evaluateCategoryMap.keySet()) {
  320. List<TeaEvaluateClassListVo> evaluateList = evaluateCategoryMap.get(id);
  321. int allSorce = evaluateList.stream().mapToInt(TeaEvaluateClassListVo::getScore).sum();
  322. double avgScore = BigDecimal.valueOf(allSorce).divide(BigDecimal.valueOf(resultList.size()), 2, RoundingMode.HALF_UP).doubleValue();
  323. evaluateSocreList.add(avgScore);
  324. }
  325. double sum = evaluateSocreList.stream().mapToDouble(Double::doubleValue).sum();
  326. double jskhValue = BigDecimal.valueOf(sum).divide(BigDecimal.valueOf(size), 2, RoundingMode.HALF_UP).doubleValue();
  327. c.setTeacherAssessComprehensiveIndex(jskhValue + "");
  328. String replacedExpression = jskhFormula.replace("JSKH", Double.toString(jskhValue));
  329. ScriptEngineManager manager = new ScriptEngineManager();
  330. ScriptEngine engine = manager.getEngineByName("JavaScript");
  331. try {
  332. double result = ((Number) engine.eval(replacedExpression)).doubleValue();
  333. c.setTeacherAssessScore(result + " ");
  334. } catch (ScriptException e) {
  335. Log.error(e.getMessage(), e);
  336. }
  337. }
  338. if (paramilitaryMap.get(classId) != null) {
  339. Double sumScore = awardsAndHonorableMap.get(classId).getSumScore();
  340. if (sumScore != null) {
  341. c.setMilitaryManageScore(sumScore.toString());
  342. if (sumScore < 10) {
  343. c.setHonorScore(sumScore.toString());
  344. } else {
  345. c.setHonorScore("10");
  346. }
  347. double v = (100 + sumScore) / 100 * 25;
  348. c.setMilitaryManageComprehensiveIndex(v + "");
  349. }
  350. }
  351. c.setAssessMoney(" ");
  352. c.setAssessSumScore(" ");
  353. }
  354. }
  355. //sheet名
  356. String sheetName = "量化考核总表";
  357. WriteSheet writeSheet = EasyExcel.writerSheet(0, sheetName).build();
  358. //
  359. excelWriter.write(resultList, writeSheet);
  360. }
  361. /*for (BaseStudentAssessmentCategory bsac : baseStudentAssessmentCategorieList) {
  362. dto.setBaseStudentAssessmentCategoryId(bsac.getId());
  363. //sheet名
  364. String sheetName = bsac.getName();
  365. //求所有的个人行为集合
  366. List<QuantitativeAssessmentSubTableExcelVo> quantitativeAssessmentSubTableExcelVoList = assessmentInspectionMapper.getQuantitativeAssessmentSubTableExcelVoList(dto);
  367. //需要合并的列
  368. int[] mergeColumeIndex = {0, 1, 2, 3, 4};
  369. //写字节流
  370. ExcelMergeUtil excelFillCellMergeStrategy = new ExcelMergeUtil(1, mergeColumeIndex);
  371. EasyExcel.write(bot, QuantitativeAssessmentSubTableExcelVo.class)
  372. .registerWriteHandler(excelFillCellMergeStrategy)
  373. .sheet(sheetName)
  374. .doWrite(quantitativeAssessmentSubTableExcelVoList);
  375. }*/
  376. }
  377. return RT.fileStream(bot.toByteArray(), fileName);
  378. }
  379. @Override
  380. public IPage<CalssQuantitativeAssessmentPageVo> getCalssQuantitativeAssessmentPage(Page<CalssQuantitativeAssessmentPageDto> page, CalssQuantitativeAssessmentPageDto dto) {
  381. //以班级为数据的基础进行数据的填充
  382. MPJLambdaWrapper<BaseClass> baseClassMPJLambdaWrapper = new MPJLambdaWrapper<>();
  383. baseClassMPJLambdaWrapper
  384. .selectAs(BaseClass::getTeacherId, CalssQuantitativeAssessmentPageVo::getHeadTeacherId)
  385. .selectAs(XjrUser::getUserName, CalssQuantitativeAssessmentPageVo::getOa)
  386. .selectAs(XjrUser::getName, CalssQuantitativeAssessmentPageVo::getHeadTeacherName)
  387. .selectAs(BaseClass::getId, CalssQuantitativeAssessmentPageVo::getClassId)
  388. .selectAs(BaseClass::getName, CalssQuantitativeAssessmentPageVo::getClassName)
  389. .select("(SELECT COUNT(DISTINCT(a1.id)) FROM xjr_user a1" +
  390. " LEFT JOIN base_student_school_roll a2 ON a1.id = a2.user_id" +
  391. " WHERE a1.delete_mark = 0 AND a2.delete_mark = 0" +
  392. " AND a2.class_id = t1.id" +
  393. " AND a2.archives_status = 'FB2901') as student_num")
  394. .selectAs(BaseClass::getIsGraduate, CalssQuantitativeAssessmentPageVo::getClassStatus)
  395. .leftJoin(XjrUser.class, XjrUser::getId, BaseClass::getTeacherId)
  396. .eq(dto.getGradeId() != null, BaseClass::getGradeId, dto.getGradeId())
  397. .eq(dto.getClassId() != null, BaseClass::getId, dto.getClassId())
  398. .eq(dto.getClassStatus() != null, BaseClass::getIsGraduate, dto.getClassStatus())
  399. .like(dto.getName() != null && !dto.getName().isEmpty(), XjrUser::getName, dto.getName());
  400. IPage<CalssQuantitativeAssessmentPageVo> resultPage = baseClassMapper.selectJoinPage(page, CalssQuantitativeAssessmentPageVo.class, baseClassMPJLambdaWrapper);
  401. //当前数据记录班级id
  402. List<Long> classIdList = new ArrayList<>();
  403. for (CalssQuantitativeAssessmentPageVo c : resultPage.getRecords()) {
  404. classIdList.add(Long.parseLong(c.getClassId()));
  405. }
  406. dto.setClassIdList(classIdList);
  407. if (dto.getStartTime() != null) {
  408. // 获取上个月的最后一秒
  409. LocalDateTime lastMonthEnd = dto.getStartTime().minusMonths(1).with(TemporalAdjusters.lastDayOfMonth()).withHour(23).withMinute(59).withSecond(59);
  410. // 获取下个月的第一秒
  411. LocalDateTime nextMonthStart = dto.getStartTime().plusMonths(1).with(TemporalAdjusters.firstDayOfMonth()).withHour(0).withMinute(0).withSecond(0);
  412. dto.setStartTime(lastMonthEnd);
  413. dto.setEndTime(nextMonthStart);
  414. }
  415. if (!classIdList.isEmpty()) {
  416. //学生个人行为
  417. dto.setCategoryCode("student_behavior");
  418. Map<Long, QuantitativeAssessmentSingleScoreVo> individualBehaviorMap = getQuantitativeAssessmentSingleScoreMap(dto);
  419. //常规管理
  420. dto.setCategoryCode("convention_manage");
  421. Map<Long, QuantitativeAssessmentSingleScoreVo> conventionalManagementMap = getQuantitativeAssessmentSingleScoreMap(dto);
  422. //获奖及荣誉奖彰
  423. dto.setCategoryCode("awards_and_honors");
  424. Map<Long, QuantitativeAssessmentSingleScoreVo> awardsAndHonorableMap = getQuantitativeAssessmentSingleScoreMap(dto);
  425. //准军事化考核
  426. dto.setCategoryCode("militarize_manage");
  427. Map<Long, QuantitativeAssessmentSingleScoreVo> paramilitaryMap = getQuantitativeAssessmentSingleScoreMap(dto);
  428. //班级文化建设
  429. dto.setCategoryCode("classe_culture");
  430. Map<Long, QuantitativeAssessmentSingleScoreVo> classCultureMap = getQuantitativeAssessmentSingleScoreMap(dto);
  431. //查询任课教师查询班级的数据
  432. TeaEvaluateClassDto evaluateClassDto = new TeaEvaluateClassDto();
  433. evaluateClassDto.setEvaluateType(EvaluateTypeEnum.TEACHER_EVALUATE_CLASS.getCode());
  434. evaluateClassDto.setYear(dto.getYear());
  435. LocalDate now = LocalDate.now();
  436. if (dto.getYear() == null) {
  437. evaluateClassDto.setYear(now.getYear());
  438. }
  439. evaluateClassDto.setMonth(dto.getMonth());
  440. if (dto.getMonth() == null) {
  441. evaluateClassDto.setMonth(now.getMonthValue());
  442. }
  443. List<TeaEvaluateClassListVo> teaEvaluateClassList = evaluateResultMapper.getTeaEvaluateClassList(evaluateClassDto);
  444. Map<Long, List<TeaEvaluateClassListVo>> classEvaluateMap = teaEvaluateClassList.stream().collect(Collectors.groupingBy(TeaEvaluateClassListVo::getEvaluatedObjectId));
  445. String jskhFormula = quotaFormulaRuleService.getFormulaByQuota("teacher_assessment");
  446. String gfjyFormula = quotaFormulaRuleService.getFormulaByQuota("militarize_manage");
  447. String xsgrFormula = quotaFormulaRuleService.getFormulaByQuota("student_behavior");
  448. String cgglFormula = quotaFormulaRuleService.getFormulaByQuota("convention_manage");
  449. String huojiangFormula = quotaFormulaRuleService.getFormulaByQuota("awards_and_honors");
  450. String classCultureFormula = quotaFormulaRuleService.getFormulaByQuota("classe_culture");
  451. //将结果写进对应的班级里
  452. for (CalssQuantitativeAssessmentPageVo c : resultPage.getRecords()) {
  453. Long classId = Long.parseLong(c.getClassId());
  454. //学生个人行为
  455. if (individualBehaviorMap.get(classId) != null && individualBehaviorMap.get(classId) != null) {
  456. Double sumScore = individualBehaviorMap.get(classId).getSumScore();
  457. c.setStuPersonalBehaviorSubScore(sumScore == null ? "" : sumScore.toString());
  458. String replacedExpression = xsgrFormula.replace("xsgrKouFen", Double.toString(sumScore));
  459. ScriptEngineManager manager = new ScriptEngineManager();
  460. ScriptEngine engine = manager.getEngineByName("JavaScript");
  461. try {
  462. double result = ((Number) engine.eval(replacedExpression)).doubleValue();
  463. c.setStuPersonalBehaviorScore(BigDecimal.valueOf(result).setScale(2, RoundingMode.HALF_UP).doubleValue() + "");
  464. } catch (ScriptException e) {
  465. Log.error(e.getMessage(), e);
  466. }
  467. }
  468. //常规管理
  469. if (conventionalManagementMap.get(classId) != null && conventionalManagementMap.get(classId) != null) {
  470. Double sumScore = conventionalManagementMap.get(classId).getSumScore();
  471. if (sumScore != null) {
  472. String scoreStr = sumScore.toString();
  473. c.setClassConventionalManageSubScore(scoreStr);
  474. String replacedExpression = cgglFormula.replace("cgglKouFen", Double.toString(sumScore));
  475. ScriptEngineManager manager = new ScriptEngineManager();
  476. ScriptEngine engine = manager.getEngineByName("JavaScript");
  477. try {
  478. double result = ((Number) engine.eval(replacedExpression)).doubleValue();
  479. c.setClassConventionalManageScore(BigDecimal.valueOf(result).setScale(2, RoundingMode.HALF_UP).doubleValue() + "");
  480. } catch (ScriptException e) {
  481. Log.error(e.getMessage(), e);
  482. }
  483. }
  484. }
  485. //获奖和荣誉
  486. if (awardsAndHonorableMap.get(classId) != null && awardsAndHonorableMap.get(classId) != null) {
  487. Double sumScore = awardsAndHonorableMap.get(classId).getSumScore();
  488. if (sumScore != null) {
  489. c.setHonorSumScore(sumScore.toString());
  490. String replacedExpression = huojiangFormula.replace("HuoJiang", Double.toString(sumScore));
  491. ScriptEngineManager manager = new ScriptEngineManager();
  492. ScriptEngine engine = manager.getEngineByName("JavaScript");
  493. try {
  494. double result = ((Number) engine.eval(replacedExpression)).doubleValue();
  495. c.setHonorScore(BigDecimal.valueOf(result).setScale(2, RoundingMode.HALF_UP).doubleValue() + "");
  496. } catch (ScriptException e) {
  497. Log.error(e.getMessage(), e);
  498. }
  499. }
  500. }
  501. //军事化
  502. if (paramilitaryMap.get(classId) != null && paramilitaryMap.get(classId) != null) {
  503. Double sumScore = paramilitaryMap.get(classId).getSumScore();
  504. if (sumScore != null) {
  505. c.setMilitaryManageComprehensiveIndex(sumScore.toString());
  506. //此项得分
  507. String replacedExpression = gfjyFormula.replace("gfjyKouFen", Double.toString(sumScore));
  508. ScriptEngineManager manager = new ScriptEngineManager();
  509. ScriptEngine engine = manager.getEngineByName("JavaScript");
  510. try {
  511. double result = ((Number) engine.eval(replacedExpression)).doubleValue();
  512. c.setMilitaryManageScore(BigDecimal.valueOf(result).setScale(2, RoundingMode.HALF_UP).doubleValue() + "");
  513. } catch (ScriptException e) {
  514. Log.error(e.getMessage(), e);
  515. }
  516. }
  517. }
  518. //任课教师考核
  519. if (classEvaluateMap.containsKey(classId)) {
  520. Map<Long, List<TeaEvaluateClassListVo>> evaluateCategoryMap = classEvaluateMap.get(classId).stream().collect(Collectors.groupingBy(TeaEvaluateClassListVo::getId));
  521. int size = evaluateCategoryMap.size();
  522. List<Double> evaluateSocreList = new ArrayList<>();//存每个项的平均分
  523. for (Long id : evaluateCategoryMap.keySet()) {
  524. List<TeaEvaluateClassListVo> resultList = evaluateCategoryMap.get(id);
  525. int allSorce = resultList.stream().mapToInt(TeaEvaluateClassListVo::getScore).sum();
  526. double avgScore = BigDecimal.valueOf(allSorce).divide(BigDecimal.valueOf(resultList.size()), 2, RoundingMode.HALF_UP).doubleValue();
  527. evaluateSocreList.add(avgScore);
  528. }
  529. double sum = evaluateSocreList.stream().mapToDouble(Double::doubleValue).sum();
  530. double jskhValue = BigDecimal.valueOf(sum).divide(BigDecimal.valueOf(size), 2, RoundingMode.HALF_UP).doubleValue();
  531. c.setTeacherAssessComprehensiveIndex(jskhValue + "");
  532. String replacedExpression = jskhFormula.replace("JSKH", Double.toString(jskhValue));
  533. ScriptEngineManager manager = new ScriptEngineManager();
  534. ScriptEngine engine = manager.getEngineByName("JavaScript");
  535. try {
  536. double result = ((Number) engine.eval(replacedExpression)).doubleValue();
  537. c.setTeacherAssessScore(BigDecimal.valueOf(result).setScale(2, RoundingMode.HALF_UP).doubleValue() + "");
  538. } catch (ScriptException e) {
  539. Log.error(e.getMessage(), e);
  540. }
  541. }
  542. //班级文化建设
  543. if (classCultureMap.containsKey(classId) && classCultureMap.get(classId) != null) {
  544. Double sumScore = classCultureMap.get(classId).getSumScore();
  545. if (sumScore != null) {
  546. c.setClassCultureScore(sumScore.toString());
  547. String replacedExpression = classCultureFormula.replace("bjwhKouFen", Double.toString(sumScore));
  548. ScriptEngineManager manager = new ScriptEngineManager();
  549. ScriptEngine engine = manager.getEngineByName("JavaScript");
  550. try {
  551. double result = ((Number) engine.eval(replacedExpression)).doubleValue();
  552. c.setClassCultureIndex(BigDecimal.valueOf(result).setScale(2, RoundingMode.HALF_UP).doubleValue() + "");
  553. } catch (ScriptException e) {
  554. Log.error(e.getMessage(), e);
  555. }
  556. }
  557. }
  558. }
  559. }
  560. return resultPage;
  561. }
  562. private Map<Long, QuantitativeAssessmentSingleScoreVo> getQuantitativeAssessmentSingleScoreMap(CalssQuantitativeAssessmentPageDto dto) {
  563. List<QuantitativeAssessmentSingleScoreVo> individualBehaviorList = assessmentInspectionMapper.getAssessmentInspectionByClassIdList(new QuantitativeAssessmentSingleScoreDto() {{
  564. setClassIdList(dto.getClassIdList());
  565. setBaseStudentAssessmentCategoryId(dto.getBaseStudentAssessmentCategoryId());
  566. setCategoryCode(dto.getCategoryCode());
  567. if (dto.getBaseSemesterId() != null) {
  568. setBaseSemesterId(dto.getBaseSemesterId());
  569. }
  570. if (dto.getStartTime() != null) {
  571. setStartTime(dto.getStartTime());
  572. }
  573. if (dto.getEndTime() != null) {
  574. setStartTime(dto.getEndTime());
  575. }
  576. setYear(dto.getYear());
  577. setMonth(dto.getMonth());
  578. }});
  579. Map<Long, QuantitativeAssessmentSingleScoreVo> individualBehaviorMap = new HashMap<>();
  580. for (QuantitativeAssessmentSingleScoreVo q : individualBehaviorList) {
  581. if (q.getClassId() != null) {
  582. individualBehaviorMap.put(q.getClassId(), q);
  583. }
  584. }
  585. return individualBehaviorMap;
  586. }
  587. @Override
  588. @Transactional
  589. public Boolean dataHandle(Long id) {
  590. //获取考核记录
  591. BaseStudentAssessmentInspection baseStudentAssessmentInspection = this.getById(id);
  592. if (baseStudentAssessmentInspection != null) {
  593. double totalScore = 0d;
  594. if (StrUtil.isNotEmpty(baseStudentAssessmentInspection.getClassIds())) {
  595. //同步数据到考核关联班级表
  596. String[] classIds = baseStudentAssessmentInspection.getClassIds().split(",");
  597. for (String classId : classIds) {
  598. assessmentClassRelationMapper.insert(new BaseStudentAssessmentClassRelation() {{
  599. setClassId(Long.parseLong(classId));
  600. setBaseStudentAssessmentInspectionId(baseStudentAssessmentInspection.getId());
  601. QueryWrapper<BaseStudentAssessmentClassRelation> queryWrapperSortcode = new QueryWrapper<>();
  602. queryWrapperSortcode.select("IFNULL(MAX(sort_code),0) as sortCode");
  603. BaseStudentAssessmentClassRelation b = assessmentClassRelationMapper.selectOne(queryWrapperSortcode);
  604. setSortCode(b.getSortCode() + 1);
  605. }});
  606. }
  607. totalScore = baseStudentAssessmentInspection.getScore();
  608. }
  609. //同步数据到考核关联学生表
  610. if (StrUtil.isNotEmpty(baseStudentAssessmentInspection.getPersonalStudentUserIds())) {
  611. String[] studentIds = baseStudentAssessmentInspection.getPersonalStudentUserIds().split(",");
  612. for (String studentId : studentIds) {
  613. assessmentStudentRelationMapper.insert(new BaseStudentAssessmentStudentRelation() {{
  614. MPJLambdaWrapper<BaseStudentSchoolRoll> baseStudentSchoolRollMPJLambdaWrapper = new MPJLambdaWrapper<>();
  615. baseStudentSchoolRollMPJLambdaWrapper
  616. .select(BaseStudentSchoolRoll::getId)
  617. .select(BaseStudentSchoolRoll.class, x -> VoToColumnUtil.fieldsToColumns(BaseStudentSchoolRoll.class).contains(x.getProperty()))
  618. .eq(BaseStudentSchoolRoll::getUserId, studentId);
  619. BaseStudentSchoolRoll baseStudentSchoolRoll = baseStudentSchoolRollMapper.selectOne(baseStudentSchoolRollMPJLambdaWrapper);
  620. if (baseStudentSchoolRoll != null) {
  621. setClassId(baseStudentSchoolRoll.getClassId());
  622. }
  623. setUserId(Long.parseLong(studentId));
  624. setBaseStudentAssessmentInspectionId(baseStudentAssessmentInspection.getId());
  625. QueryWrapper<BaseStudentAssessmentStudentRelation> queryWrapperSortcode = new QueryWrapper<>();
  626. queryWrapperSortcode.select("IFNULL(MAX(sort_code),0) as sortCode");
  627. BaseStudentAssessmentStudentRelation b = assessmentStudentRelationMapper.selectOne(queryWrapperSortcode);
  628. setSortCode(b.getSortCode() + 1);
  629. setScore(baseStudentAssessmentInspection.getScore());
  630. }});
  631. }
  632. totalScore = studentIds.length * baseStudentAssessmentInspection.getScore();
  633. }
  634. baseStudentAssessmentInspection.setTotalScore(totalScore);
  635. this.updateById(baseStudentAssessmentInspection);
  636. }
  637. return true;
  638. }
  639. @Override
  640. public Boolean noticeTeacher(Long id) {
  641. try {
  642. BaseStudentAssessmentInspection inspection = this.getById(id);
  643. String classIds = inspection.getClassIds();
  644. BaseClass baseClass = baseClassMapper.selectById(classIds);
  645. User user = userService.getById(baseClass.getTeacherId());
  646. String wechatTemplate = "Xb21V8au0Ur9puQs4hIDJTl8LP6GTgVOHQtOeie1Oco";
  647. WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
  648. weChatSendMessageDto.setUserId(user.getOpenId());
  649. weChatSendMessageDto.setTemplateId(wechatTemplate);
  650. weChatSendMessageDto.setMsgId(IdUtil.getSnowflakeNextId() + "");
  651. weChatSendMessageDto.setUrl(StrUtil.format("{}pages/student/mentinspection/index", commonPropertiesConfig.getDomainApp()));
  652. JSONObject data = new JSONObject();
  653. String thing4 = "无";
  654. String thing1 = "无";
  655. if (AssessmentTypeEnum.CLASS.getCode().equals(inspection.getAssessmentType())) {
  656. data.put("const3", new JSONObject() {{
  657. put("value", AssessmentTypeEnum.CLASS.getValue());
  658. }});
  659. BaseStudentAssessmentProject project = projectMapper.selectById(inspection.getBaseStudentAssessmentProjectId());
  660. thing4 = project.getName();
  661. } else if (AssessmentTypeEnum.PERSONAL.getCode().equals(inspection.getAssessmentType())) {
  662. data.put("const3", new JSONObject() {{
  663. put("value", AssessmentTypeEnum.PERSONAL.getValue());
  664. }});
  665. String[] studentUsers = inspection.getPersonalStudentUserIds().split(",");
  666. List<String> studentIds = new ArrayList<>();
  667. for (String studentUser : studentUsers) {
  668. studentIds.add(studentUser.trim());
  669. }
  670. List<User> userList = userService.listByIds(studentIds);
  671. for (int i = 0; i < userList.size(); i++) {
  672. if (i > 0) {
  673. thing1 += ",";
  674. }
  675. thing1 += userList.get(i).getName();
  676. }
  677. if (thing1.length() > 20) {
  678. thing1 = thing1.substring(0, 16) + "...";
  679. }
  680. BaseStudentAssessmentCategory category = categoryMapper.selectById(inspection.getBaseStudentAssessmentCategoryId());
  681. thing4 = category.getName();
  682. }
  683. //得分
  684. JSONObject thing4Json = new JSONObject();
  685. thing4Json.put("value", thing4);
  686. data.put("thing4", thing4Json);
  687. //学生
  688. JSONObject thing1Json = new JSONObject();
  689. thing1Json.put("value", thing1);
  690. data.put("thing1", thing1Json);
  691. //得分
  692. data.put("character_string5", new JSONObject() {{
  693. put("value", inspection.getScore());
  694. }});
  695. //考核时间
  696. SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
  697. data.put("time2", new JSONObject() {{
  698. put("value", sdf.format(inspection.getAssessmentDate()));
  699. }});
  700. weChatSendMessageDto.setContent(data);
  701. weChatService.sendTemplateMessage(weChatSendMessageDto);
  702. return true;
  703. } catch (Exception e) {
  704. Log.error(e.getMessage(), e);
  705. return false;
  706. }
  707. }
  708. @Override
  709. public byte[] getExcelByte(CalssQuantitativeAssessmentPageDto dto) throws IOException {
  710. IPage<CalssQuantitativeAssessmentPageVo> page = this.getCalssQuantitativeAssessmentPage(new Page<>(1, 10000), dto);
  711. Workbook workbook = new XSSFWorkbook();
  712. // 创建一个工作表(sheet)
  713. String sheetName = "数据";
  714. Sheet sheet = workbook.createSheet(sheetName);
  715. createFirstTitle(workbook, sheet);
  716. createSecondTitle(workbook, sheet, 6);
  717. Font font = workbook.createFont();
  718. font.setBold(false);// 设置为粗体
  719. font.setFontName("宋体");
  720. CellStyle cellStyle = workbook.createCellStyle();
  721. cellStyle.setFont(font); // 将字体应用到样式
  722. cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
  723. int sortCode = 1;
  724. for (CalssQuantitativeAssessmentPageVo pageVo : page.getRecords()) {
  725. Row dataRow = sheet.createRow(sortCode + 1);
  726. int columnNumber = 0;
  727. Cell cell = dataRow.createCell(columnNumber);
  728. cell.setCellValue(sortCode + "");
  729. cell.setCellStyle(cellStyle);
  730. columnNumber++;
  731. cell = dataRow.createCell(columnNumber);
  732. cell.setCellValue(pageVo.getOa());
  733. cell.setCellStyle(cellStyle);
  734. columnNumber++;
  735. cell = dataRow.createCell(columnNumber);
  736. cell.setCellValue(pageVo.getClassName());
  737. cell.setCellStyle(cellStyle);
  738. columnNumber++;
  739. cell = dataRow.createCell(columnNumber);
  740. cell.setCellValue(pageVo.getHeadTeacherName());
  741. cell.setCellStyle(cellStyle);
  742. columnNumber++;
  743. cell = dataRow.createCell(columnNumber);
  744. cell.setCellValue(pageVo.getStudentNum() == null ? "" : pageVo.getStudentNum().toString());
  745. cell.setCellStyle(cellStyle);
  746. columnNumber++;
  747. cell = dataRow.createCell(columnNumber);
  748. if (pageVo.getClassStatus() != null && pageVo.getClassStatus() == 1) {
  749. cell.setCellValue("在读");
  750. } else {
  751. cell.setCellValue("毕业");
  752. }
  753. cell.setCellStyle(cellStyle);
  754. columnNumber++;
  755. cell = dataRow.createCell(columnNumber);
  756. cell.setCellValue(pageVo.getStuPersonalBehaviorSubScore());
  757. cell.setCellStyle(cellStyle);
  758. columnNumber++;
  759. cell = dataRow.createCell(columnNumber);
  760. cell.setCellValue(pageVo.getStuPersonalBehaviorScore());
  761. cell.setCellStyle(cellStyle);
  762. columnNumber++;
  763. cell = dataRow.createCell(columnNumber);
  764. cell.setCellValue(pageVo.getClassConventionalManageSubScore());
  765. cell.setCellStyle(cellStyle);
  766. columnNumber++;
  767. cell = dataRow.createCell(columnNumber);
  768. cell.setCellValue(pageVo.getClassConventionalManageScore());
  769. cell.setCellStyle(cellStyle);
  770. columnNumber++;
  771. cell = dataRow.createCell(columnNumber);
  772. cell.setCellValue(pageVo.getHonorSumScore());
  773. cell.setCellStyle(cellStyle);
  774. columnNumber++;
  775. cell = dataRow.createCell(columnNumber);
  776. cell.setCellValue(pageVo.getHonorScore());
  777. cell.setCellStyle(cellStyle);
  778. columnNumber++;
  779. cell = dataRow.createCell(columnNumber);
  780. cell.setCellValue(pageVo.getMilitaryManageComprehensiveIndex());
  781. cell.setCellStyle(cellStyle);
  782. columnNumber++;
  783. cell = dataRow.createCell(columnNumber);
  784. cell.setCellValue(pageVo.getMilitaryManageScore());
  785. cell.setCellStyle(cellStyle);
  786. columnNumber++;
  787. cell = dataRow.createCell(columnNumber);
  788. cell.setCellValue(pageVo.getTeacherAssessComprehensiveIndex());
  789. cell.setCellStyle(cellStyle);
  790. columnNumber++;
  791. cell = dataRow.createCell(columnNumber);
  792. cell.setCellValue(pageVo.getTeacherAssessScore());
  793. cell.setCellStyle(cellStyle);
  794. columnNumber++;
  795. cell = dataRow.createCell(columnNumber);
  796. cell.setCellValue(pageVo.getClassCultureScore());
  797. cell.setCellStyle(cellStyle);
  798. columnNumber++;
  799. cell = dataRow.createCell(columnNumber);
  800. cell.setCellValue(pageVo.getClassCultureIndex());
  801. cell.setCellStyle(cellStyle);
  802. columnNumber++;
  803. cell = dataRow.createCell(columnNumber);
  804. cell.setCellValue(pageVo.getAssessSumScore());
  805. cell.setCellStyle(cellStyle);
  806. columnNumber++;
  807. cell = dataRow.createCell(columnNumber);
  808. cell.setCellValue(pageVo.getAssessMoney());
  809. cell.setCellStyle(cellStyle);
  810. sortCode++;
  811. }
  812. ByteArrayOutputStream bot = new ByteArrayOutputStream();
  813. workbook.write(bot);
  814. return bot.toByteArray();
  815. }
  816. @Override
  817. public Boolean importData(List<ImportBaseStudentAssessmentInspectionDto> savedDataList) {
  818. try {
  819. // 提取出所有班级名字
  820. Set<String> classNames = savedDataList.stream().map(ImportBaseStudentAssessmentInspectionDto::getClassName).collect(Collectors.toSet());
  821. Set<String> categorys = savedDataList.stream().map(ImportBaseStudentAssessmentInspectionDto::getAssessmentCategory).collect(Collectors.toSet());
  822. // 提取出所有身份证
  823. Set<String> credentialNumbers = savedDataList.stream().map(ImportBaseStudentAssessmentInspectionDto::getCredentialNumber).collect(Collectors.toSet());
  824. List<BaseClass> classList = baseClassMapper.selectList(
  825. new QueryWrapper<BaseClass>().lambda()
  826. .in(BaseClass::getName, classNames)
  827. );
  828. Map<String, BaseClass> classMap = classList.stream().collect(Collectors.toMap(BaseClass::getName, x -> x));
  829. Set<String> checkClassNames = new HashSet<>(classMap.values().stream().map(BaseClass::getName).collect(Collectors.toSet()));
  830. checkClassNames.removeAll(classMap.keySet());
  831. if (!checkClassNames.isEmpty()) {
  832. throw new MyException("导入表格中的班级:" + checkClassNames + " 在系统中不存在");
  833. }
  834. List<BaseStudentAssessmentProject> projectList = projectMapper.selectList(
  835. new QueryWrapper<BaseStudentAssessmentProject>().lambda()
  836. .eq(BaseStudentAssessmentProject::getDeleteMark, DeleteMark.NODELETE.getCode())
  837. .eq(BaseStudentAssessmentProject::getEnabledMark, EnabledMark.ENABLED.getCode())
  838. );
  839. Map<Long, Map<String, BaseStudentAssessmentProject>> projectMap = projectList.stream().collect(
  840. Collectors.groupingBy(
  841. BaseStudentAssessmentProject::getBaseStudentAssessmentCategoryId,
  842. Collectors.toMap(BaseStudentAssessmentProject::getName, x -> x)
  843. )
  844. );
  845. Map<String, Long> categoryMap = categoryMapper.selectList(
  846. new QueryWrapper<BaseStudentAssessmentCategory>().lambda()
  847. .eq(BaseStudentAssessmentCategory::getDeleteMark, DeleteMark.NODELETE.getCode())
  848. .eq(BaseStudentAssessmentCategory::getEnabledMark, EnabledMark.ENABLED.getCode())
  849. )
  850. .stream().collect(Collectors.toMap(BaseStudentAssessmentCategory::getName, BaseStudentAssessmentCategory::getId));
  851. Set<String> checkCategorys = new HashSet<>(categorys);
  852. checkCategorys.removeAll(categoryMap.keySet());
  853. if (!checkCategorys.isEmpty()) {
  854. throw new MyException("导入表格中的考核类别:" + checkCategorys + " 在系统中不存在");
  855. }
  856. List<BaseStudentAssessmentItem> itemList = itemMapper.selectList(
  857. new QueryWrapper<BaseStudentAssessmentItem>().lambda()
  858. .eq(BaseStudentAssessmentItem::getDeleteMark, DeleteMark.NODELETE.getCode())
  859. .eq(BaseStudentAssessmentItem::getEnabledMark, EnabledMark.ENABLED.getCode())
  860. );
  861. Map<Long, Map<String, Long>> itemMap = itemList.stream().collect(
  862. Collectors.groupingBy(
  863. BaseStudentAssessmentItem::getBaseStudentAssessmentCategoryId,
  864. Collectors.toMap(BaseStudentAssessmentItem::getName, BaseStudentAssessmentItem::getId)
  865. )
  866. );
  867. List<BaseStudentUserPageVo> studentList = studentService.getStudentList(new BaseStudentUserPageDto() {{
  868. setCredentialNumbers(new ArrayList<>(credentialNumbers));
  869. }});
  870. Map<String, String> studentMap = studentList.stream().collect(Collectors.toMap(BaseStudentUserPageVo::getCredentialNumber, BaseStudentUserPageVo::getId));
  871. Set<String> checkStudents = new HashSet<>();
  872. Set<String> checkProjects = new HashSet<>();
  873. Set<String> checkItems = new HashSet<>();
  874. List<BaseStudentAssessmentInspection> insertList = new ArrayList<>();
  875. List<BaseStudentAssessmentStudentRelation> childInsertList = new ArrayList<>();
  876. List<BaseStudentAssessmentClassRelation> child2InsertList = new ArrayList<>();
  877. SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
  878. int sortCode = 1;
  879. for (ImportBaseStudentAssessmentInspectionDto dto : savedDataList) {
  880. long id = IdUtil.getSnowflakeNextId();
  881. BaseStudentAssessmentInspection data = new BaseStudentAssessmentInspection();
  882. data.setId(id);
  883. data.setEnabledMark(EnabledMark.ENABLED.getCode());
  884. data.setDeleteMark(DeleteMark.NODELETE.getCode());
  885. data.setCreateDate(new Date());
  886. data.setCreateUserId(StpUtil.getLoginIdAsLong());
  887. BaseClass baseClass = classMap.get(dto.getClassName());
  888. data.setClassIds(baseClass.getId().toString());
  889. data.setGradeId(baseClass.getGradeId());
  890. data.setBaseStudentAssessmentCategoryId(categoryMap.get(dto.getAssessmentCategory()));
  891. Map<String, Long> itemGroup = itemMap.get(data.getBaseStudentAssessmentCategoryId());
  892. if (itemGroup == null || !itemGroup.containsKey(dto.getAssessmentItem())) {
  893. checkItems.add("考核类别“" + dto.getAssessmentCategory() + "”中不存在考核项“" + dto.getAssessmentItem() + "”");
  894. }
  895. data.setBaseStudentAssessmentItemId(itemGroup.get(dto.getAssessmentItem()));
  896. Map<String, BaseStudentAssessmentProject> projectGroup = projectMap.get(data.getBaseStudentAssessmentItemId());
  897. if (projectGroup == null || !projectGroup.containsKey(dto.getAssessmentProject())) {
  898. checkProjects.add("考核项目“" + dto.getAssessmentItem() + "”中不存在考核项“" + dto.getAssessmentProject() + "”");
  899. continue;
  900. }
  901. BaseStudentAssessmentProject project = projectGroup.get(dto.getAssessmentProject());
  902. data.setBaseStudentAssessmentProjectId(project.getId());
  903. data.setScore(project.getBasicPoints());
  904. data.setTotalScore(project.getBasicPoints());
  905. if (project.getBasicPoints() > 0) {
  906. data.setScoreType("score_add");
  907. } else {
  908. data.setScoreType("score_minus");
  909. }
  910. data.setReason(dto.getReason());
  911. data.setAssessmentUserId(StpUtil.getLoginIdAsLong());
  912. data.setAssessmentDate(sdf.parse(dto.getAssessmentDate()));
  913. BaseStudentAssessmentClassRelation children2 = new BaseStudentAssessmentClassRelation();
  914. children2.setBaseStudentAssessmentInspectionId(id);
  915. children2.setClassId(baseClass.getId());
  916. children2.setSortCode(sortCode);
  917. child2InsertList.add(children2);
  918. sortCode++;
  919. if ("班级".equals(dto.getAssessmentType())) {
  920. data.setAssessmentType("class");
  921. } else if ("个人".equals(dto.getAssessmentType())) {
  922. data.setAssessmentType("personal");
  923. if (!studentMap.containsKey(dto.getCredentialNumber())) {
  924. checkStudents.add(dto.getStudentName());
  925. continue;
  926. }
  927. data.setPersonalStudentUserIds(studentMap.get(dto.getCredentialNumber()));
  928. BaseStudentAssessmentStudentRelation children = new BaseStudentAssessmentStudentRelation();
  929. children.setBaseStudentAssessmentInspectionId(id);
  930. children.setScore(project.getBasicPoints());
  931. children.setUserId(Long.parseLong(studentMap.get(dto.getCredentialNumber())));
  932. children.setClassId(baseClass.getId());
  933. children.setEnabledMark(EnabledMark.ENABLED.getCode());
  934. children.setDeleteMark(DeleteMark.NODELETE.getCode());
  935. childInsertList.add(children);
  936. }
  937. insertList.add(data);
  938. }
  939. if (!checkStudents.isEmpty()) {
  940. throw new MyException("导入表格中的学生:" + checkStudents + " 在系统中不存在");
  941. }
  942. if (!checkProjects.isEmpty()) {
  943. throw new MyException(checkProjects.toString().replace("[", "").replace("]", ""));
  944. }
  945. if (!checkItems.isEmpty()) {
  946. throw new MyException(checkItems.toString().replace("[", "").replace("]", ""));
  947. }
  948. if (!insertList.isEmpty()) {
  949. this.saveBatch(insertList);
  950. }
  951. if (!childInsertList.isEmpty()) {
  952. for (BaseStudentAssessmentStudentRelation baseStudentAssessmentStudentRelation : childInsertList) {
  953. assessmentStudentRelationMapper.insert(baseStudentAssessmentStudentRelation);
  954. }
  955. }
  956. if (!child2InsertList.isEmpty()) {
  957. for (BaseStudentAssessmentClassRelation baseStudentAssessmentStudentRelation : child2InsertList) {
  958. assessmentClassRelationMapper.insert(baseStudentAssessmentStudentRelation);
  959. }
  960. }
  961. } catch (Exception e) {
  962. Log.error(e.getMessage(), e);
  963. if (e.getClass().equals(MyException.class)) {
  964. throw new MyException(e.getMessage());
  965. } else {
  966. throw new MyException("导入报错,请联系管理员");
  967. }
  968. }
  969. return true;
  970. }
  971. void createFirstTitle(Workbook workbook, Sheet sheet) {
  972. int rowNumber = 0;
  973. Font font = workbook.createFont();
  974. font.setFontName("宋体");
  975. //font.setColor(IndexedColors.RED.getIndex()); // 设置字体颜色为红色
  976. font.setFontHeightInPoints((short) 12);
  977. CellStyle cellStyle = workbook.createCellStyle();
  978. cellStyle.setFont(font); // 将字体应用到样式
  979. cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
  980. cellStyle.setAlignment(HorizontalAlignment.CENTER);
  981. Row row = sheet.createRow(rowNumber);
  982. //3、处理表头
  983. int columnNumber = 0;
  984. Cell cell = row.createCell(columnNumber);
  985. cell.setCellValue("序号");
  986. cell.setCellStyle(cellStyle);
  987. sheet.addMergedRegion(new CellRangeAddress(0, 1, columnNumber, columnNumber));
  988. columnNumber++;
  989. cell = row.createCell(columnNumber);
  990. cell.setCellValue("工号");
  991. cell.setCellStyle(cellStyle);
  992. sheet.addMergedRegion(new CellRangeAddress(0, 1, columnNumber, columnNumber));
  993. columnNumber++;
  994. cell = row.createCell(columnNumber);
  995. cell.setCellValue("班级");
  996. cell.setCellStyle(cellStyle);
  997. sheet.addMergedRegion(new CellRangeAddress(0, 1, columnNumber, columnNumber));
  998. columnNumber++;
  999. cell = row.createCell(columnNumber);
  1000. cell.setCellValue("班主任");
  1001. cell.setCellStyle(cellStyle);
  1002. sheet.addMergedRegion(new CellRangeAddress(0, 1, columnNumber, columnNumber));
  1003. columnNumber++;
  1004. cell = row.createCell(columnNumber);
  1005. cell.setCellValue("人数");
  1006. cell.setCellStyle(cellStyle);
  1007. sheet.addMergedRegion(new CellRangeAddress(0, 1, columnNumber, columnNumber));
  1008. columnNumber++;
  1009. cell = row.createCell(columnNumber);
  1010. cell.setCellValue("状态");
  1011. cell.setCellStyle(cellStyle);
  1012. sheet.addMergedRegion(new CellRangeAddress(0, 1, columnNumber, columnNumber));
  1013. columnNumber++;
  1014. cell = row.createCell(columnNumber);
  1015. cell.setCellValue("学生个人行为");
  1016. cell.setCellStyle(cellStyle);
  1017. sheet.addMergedRegion(new CellRangeAddress(0, 0, columnNumber, columnNumber + 1));
  1018. columnNumber++;
  1019. columnNumber++;
  1020. cell = row.createCell(columnNumber);
  1021. cell.setCellValue("常规管理");
  1022. cell.setCellStyle(cellStyle);
  1023. sheet.addMergedRegion(new CellRangeAddress(0, 0, columnNumber, columnNumber + 1));
  1024. columnNumber++;
  1025. columnNumber++;
  1026. cell = row.createCell(columnNumber);
  1027. cell.setCellValue("获奖及荣誉奖章");
  1028. cell.setCellStyle(cellStyle);
  1029. sheet.addMergedRegion(new CellRangeAddress(0, 0, columnNumber, columnNumber + 1));
  1030. columnNumber++;
  1031. columnNumber++;
  1032. cell = row.createCell(columnNumber);
  1033. cell.setCellValue("国防教学特色");
  1034. cell.setCellStyle(cellStyle);
  1035. sheet.addMergedRegion(new CellRangeAddress(0, 0, columnNumber, columnNumber + 1));
  1036. columnNumber++;
  1037. columnNumber++;
  1038. cell = row.createCell(columnNumber);
  1039. cell.setCellValue("任课教师考核");
  1040. cell.setCellStyle(cellStyle);
  1041. sheet.addMergedRegion(new CellRangeAddress(0, 0, columnNumber, columnNumber + 1));
  1042. columnNumber++;
  1043. columnNumber++;
  1044. cell = row.createCell(columnNumber);
  1045. cell.setCellValue("班级文化建设");
  1046. cell.setCellStyle(cellStyle);
  1047. sheet.addMergedRegion(new CellRangeAddress(0, 0, columnNumber, columnNumber + 1));
  1048. columnNumber++;
  1049. columnNumber++;
  1050. cell = row.createCell(columnNumber);
  1051. cell.setCellValue("月份总得分");
  1052. cell.setCellStyle(cellStyle);
  1053. sheet.addMergedRegion(new CellRangeAddress(0, 1, columnNumber, columnNumber));
  1054. columnNumber++;
  1055. cell = row.createCell(columnNumber);
  1056. cell.setCellValue("月考核金额");
  1057. cell.setCellStyle(cellStyle);
  1058. sheet.addMergedRegion(new CellRangeAddress(0, 1, columnNumber, columnNumber));
  1059. }
  1060. void createSecondTitle(Workbook workbook, Sheet sheet, int startColunm) {
  1061. int rowNumber = 1;
  1062. Font font = workbook.createFont();
  1063. font.setFontName("宋体");
  1064. font.setFontHeightInPoints((short) 12);
  1065. CellStyle cellStyle = workbook.createCellStyle();
  1066. cellStyle.setFont(font); // 将字体应用到样式
  1067. cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
  1068. cellStyle.setAlignment(HorizontalAlignment.CENTER);
  1069. Row row = sheet.createRow(rowNumber);
  1070. int columnNumber = startColunm;
  1071. Cell cell = row.createCell(columnNumber);
  1072. cell.setCellValue("扣分");
  1073. cell.setCellStyle(cellStyle);
  1074. columnNumber++;
  1075. cell = row.createCell(columnNumber);
  1076. cell.setCellValue("此项得分");
  1077. cell.setCellStyle(cellStyle);
  1078. columnNumber++;
  1079. cell = row.createCell(columnNumber);
  1080. cell.setCellValue("扣分");
  1081. cell.setCellStyle(cellStyle);
  1082. columnNumber++;
  1083. cell = row.createCell(columnNumber);
  1084. cell.setCellValue("此项得分");
  1085. cell.setCellStyle(cellStyle);
  1086. columnNumber++;
  1087. cell = row.createCell(columnNumber);
  1088. cell.setCellValue("汇总");
  1089. cell.setCellStyle(cellStyle);
  1090. columnNumber++;
  1091. cell = row.createCell(columnNumber);
  1092. cell.setCellValue("此项得分");
  1093. cell.setCellStyle(cellStyle);
  1094. columnNumber++;
  1095. cell = row.createCell(columnNumber);
  1096. cell.setCellValue("扣分");
  1097. cell.setCellStyle(cellStyle);
  1098. columnNumber++;
  1099. cell = row.createCell(columnNumber);
  1100. cell.setCellValue("此项得分");
  1101. cell.setCellStyle(cellStyle);
  1102. columnNumber++;
  1103. cell = row.createCell(columnNumber);
  1104. cell.setCellValue("指数");
  1105. cell.setCellStyle(cellStyle);
  1106. columnNumber++;
  1107. cell = row.createCell(columnNumber);
  1108. cell.setCellValue("此项得分");
  1109. cell.setCellStyle(cellStyle);
  1110. columnNumber++;
  1111. cell = row.createCell(columnNumber);
  1112. cell.setCellValue("扣分");
  1113. cell.setCellStyle(cellStyle);
  1114. columnNumber++;
  1115. cell = row.createCell(columnNumber);
  1116. cell.setCellValue("此项得分");
  1117. cell.setCellStyle(cellStyle);
  1118. }
  1119. }