|
|
@@ -2,6 +2,9 @@ package com.xjrsoft.module.evaluate.service.impl;
|
|
|
|
|
|
import cn.dev33.satoken.stp.StpUtil;
|
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
|
+import com.alibaba.excel.EasyExcel;
|
|
|
+import com.alibaba.excel.support.ExcelTypeEnum;
|
|
|
+import com.alibaba.excel.write.merge.LoopMergeStrategy;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
@@ -9,6 +12,7 @@ import com.github.yulichang.base.MPJBaseServiceImpl;
|
|
|
import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
|
|
import com.xjrsoft.common.enums.DeleteMark;
|
|
|
import com.xjrsoft.common.enums.EnabledMark;
|
|
|
+import com.xjrsoft.common.model.result.RT;
|
|
|
import com.xjrsoft.common.page.ConventPage;
|
|
|
import com.xjrsoft.module.base.entity.BaseClass;
|
|
|
import com.xjrsoft.module.evaluate.dto.*;
|
|
|
@@ -24,8 +28,10 @@ import com.xjrsoft.module.evaluate.service.IEvaluateResultService;
|
|
|
import com.xjrsoft.module.evaluate.vo.*;
|
|
|
import com.xjrsoft.module.teacher.entity.XjrUser;
|
|
|
import lombok.AllArgsConstructor;
|
|
|
+import org.springframework.http.ResponseEntity;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
+import java.io.ByteArrayOutputStream;
|
|
|
import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
@@ -284,7 +290,154 @@ public class EvaluateResultServiceImpl extends MPJBaseServiceImpl<EvaluateResult
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public List<ResultViewingExportVo> getList() {
|
|
|
- return null;
|
|
|
+ public ResponseEntity<byte[]> getList(ResultViewingExcelDto dto) {
|
|
|
+ List<ResultViewingExcelVo> customerList = new ArrayList<>();
|
|
|
+ //获取该评价管理下的被评对象-分页
|
|
|
+ MPJLambdaWrapper<EvaluateObject> evaluateObjectMPJLambdaWrapper = new MPJLambdaWrapper<>();
|
|
|
+ evaluateObjectMPJLambdaWrapper
|
|
|
+ .distinct()
|
|
|
+ .selectAs(EvaluateObject::getObjectId, ResultViewingPageVo::getObjectId)
|
|
|
+ .select("ifnull(t1.name, t2.name) as objectIdCN")
|
|
|
+ .leftJoin(XjrUser.class, XjrUser::getId, EvaluateObject::getObjectId)
|
|
|
+ .leftJoin(BaseClass.class, BaseClass::getId, EvaluateObject::getObjectId)
|
|
|
+ .eq(EvaluateObject::getEvaluateManageId, dto.getEvaluateManageId())
|
|
|
+ .disableSubLogicDel();
|
|
|
+ List<ResultViewingPageVo> resultViewingPageVoList = evaluateObjectMapper.selectJoinList(ResultViewingPageVo.class, evaluateObjectMPJLambdaWrapper);
|
|
|
+ //被评对象的id集合
|
|
|
+ List<Long> evaluateObjectIdList = new ArrayList<>();
|
|
|
+ for (ResultViewingPageVo resultViewingPageVo : resultViewingPageVoList) {
|
|
|
+ evaluateObjectIdList.add(resultViewingPageVo.getObjectId());
|
|
|
+ }
|
|
|
+
|
|
|
+ //获取该评价管理下的所有题目-多个
|
|
|
+ MPJLambdaWrapper<EvaluateManageItem> evaluateManageItemMPJLambdaWrapper = new MPJLambdaWrapper<>();
|
|
|
+ evaluateManageItemMPJLambdaWrapper
|
|
|
+ .eq(EvaluateManageItem::getEvaluateManageId, dto.getEvaluateManageId());
|
|
|
+ List<EvaluateManageItem> evaluateManageItemList = evaluateManageItemMapper.selectList(evaluateManageItemMPJLambdaWrapper);
|
|
|
+ //题目的id集合
|
|
|
+ //将题目处理成Map
|
|
|
+ List<Long> evaluateManageItemIdList = new ArrayList<>();
|
|
|
+ Map<Long, EvaluateManageItem> evaluateManageItemMap = new HashMap<>();
|
|
|
+ for (EvaluateManageItem evaluateManageItem : evaluateManageItemList) {
|
|
|
+ evaluateManageItemIdList.add(evaluateManageItem.getId());
|
|
|
+ evaluateManageItemMap.put(evaluateManageItem.getId(), evaluateManageItem);
|
|
|
+ }
|
|
|
+ //题目的总数
|
|
|
+ int evaluateManageItemNum = evaluateManageItemList.size();
|
|
|
+
|
|
|
+ //获取该评价管理下的被评对象的应打分人数,实际打分人数
|
|
|
+ MPJLambdaWrapper<EvaluateExecuter> evaluateExecuterMPJLambdaWrapper = new MPJLambdaWrapper<>();
|
|
|
+ evaluateExecuterMPJLambdaWrapper
|
|
|
+ .select("count(t.id) as planExecuterNum")
|
|
|
+ .selectAs(EvaluateObject::getObjectId, ResultViewingPageVo::getObjectId)
|
|
|
+ .selectSum(EvaluateExecuter::getStatus, ResultViewingPageVo::getActualExecuterNum)//这里值得推敲
|
|
|
+ .leftJoin(EvaluateObject.class, EvaluateObject::getId, EvaluateExecuter::getEvaluateObjectId)
|
|
|
+ .eq(EvaluateExecuter::getEvaluateManageId, dto.getEvaluateManageId())
|
|
|
+ .in(EvaluateObject::getObjectId, evaluateObjectIdList)
|
|
|
+ .groupBy(EvaluateObject::getObjectId)
|
|
|
+ .disableSubLogicDel();
|
|
|
+ List<ResultViewingPageVo> planAndActualExecuterNum = evaluateExecuterMapper.selectJoinList(ResultViewingPageVo.class, evaluateExecuterMPJLambdaWrapper);
|
|
|
+ //将应打分人数,实际打分人数处理成Map
|
|
|
+ Map<Long, ResultViewingPageVo> planAndActualExecuterNumMap = new HashMap<>();
|
|
|
+ for (ResultViewingPageVo resultViewingPageVo : planAndActualExecuterNum) {
|
|
|
+ planAndActualExecuterNumMap.put(resultViewingPageVo.getObjectId(), resultViewingPageVo);
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<Long, List<ResultViewingPageVo>> sumScoreMap = new HashMap<>();
|
|
|
+ Map<Long, List<ResultViewingPageVo>> topicScoreMap = new HashMap<>();
|
|
|
+ Map<Long, Integer> synthesisScoreMap = new HashMap<>();
|
|
|
+ if (evaluateManageItemIdList.size() > 0 && evaluateObjectIdList.size() > 0) {
|
|
|
+ //获取该评价管理下的所有被评对象的所有题的总得分
|
|
|
+ List<ResultViewingPageVo> listByObjectIdAndEvaluateItemId = evaluateResultMapper.listByObjectIdAndEvaluateItemId(evaluateObjectIdList, evaluateManageItemIdList);
|
|
|
+ //将所有被评对象的所有题的总得分处理成Map
|
|
|
+ sumScoreMap = listByObjectIdAndEvaluateItemId.stream()
|
|
|
+ .collect(Collectors.groupingBy(ResultViewingPageVo::getObjectId));
|
|
|
+
|
|
|
+ /*//获取该评价管理下的所有被评对象的标题的总得分
|
|
|
+ List<ResultViewingPageVo> listTopicScoreByObjectIdAndTopic = evaluateResultMapper.listTopicScoreByObjectIdAndTopic(evaluateObjectIdList, evaluateManageItemIdList);
|
|
|
+ //将所有被评对象的标题的总得分处理成Map
|
|
|
+ topicScoreMap = listTopicScoreByObjectIdAndTopic.stream()
|
|
|
+ .collect(Collectors.groupingBy(ResultViewingPageVo::getObjectId));*/
|
|
|
+
|
|
|
+ //获取该评价管理下的所有被评对象的总得分
|
|
|
+ List<ResultViewingPageVo> listSynthesisScore = evaluateResultMapper.listSynthesisScore(evaluateObjectIdList, evaluateManageItemIdList);
|
|
|
+ //将所有被评对象的总得分处理成Map
|
|
|
+ for (ResultViewingPageVo r : listSynthesisScore) {
|
|
|
+ synthesisScoreMap.put(r.getObjectId(), r.getSynthesisScore());
|
|
|
+ }
|
|
|
+
|
|
|
+ /*MPJLambdaWrapper<EvaluateResult> evaluateResultMPJLambdaWrapper = new MPJLambdaWrapper<>();
|
|
|
+ evaluateResultMPJLambdaWrapper
|
|
|
+ .selectSum(EvaluateResult::getScore, ResultViewingPageVo::getSumScore)
|
|
|
+ .selectAs(EvaluateObject::getObjectId, ResultViewingPageVo::getObjectId)
|
|
|
+ .selectAs(EvaluateResult::getEvaluateItemId, ResultViewingPageVo::getEvaluateManageItemId)
|
|
|
+ .leftJoin(EvaluateObject.class, EvaluateObject::getId, EvaluateResult::getEvaluatedObjectId)
|
|
|
+ .in(EvaluateObject::getObjectId, evaluateObjectIdList)
|
|
|
+ .in(EvaluateResult::getEvaluateItemId, evaluateManageItemIdList)
|
|
|
+ .groupBy(EvaluateResult::getEvaluateItemId, EvaluateObject::getEvaluateManageId)
|
|
|
+ .disableSubLogicDel();
|
|
|
+ ResultViewingPageVo sumScore = evaluateResultMapper.selectJoinOne(ResultViewingPageVo.class, evaluateResultMPJLambdaWrapper);*/
|
|
|
+ }
|
|
|
+ //遍历分页记录
|
|
|
+ for (ResultViewingPageVo resultViewingPageVo : resultViewingPageVoList) {
|
|
|
+ List<ResultViewingPageVo> sumScoreList = sumScoreMap.get(resultViewingPageVo.getObjectId());
|
|
|
+ if(sumScoreList != null && sumScoreList.size() > 0){
|
|
|
+ for (ResultViewingPageVo r : sumScoreList) {
|
|
|
+ customerList.add(new ResultViewingExcelVo(){{
|
|
|
+ setObjectId(resultViewingPageVo.getObjectId());
|
|
|
+ setObjectIdCN(resultViewingPageVo.getObjectIdCN());
|
|
|
+ setEvaluateManageItemId(r.getEvaluateManageItemId());
|
|
|
+ setProblem(evaluateManageItemMap.get(r.getEvaluateManageItemId()).getProblem());
|
|
|
+ setTopic(evaluateManageItemMap.get(r.getEvaluateManageItemId()).getTopic());
|
|
|
+ setPlanExecuterNum(planAndActualExecuterNumMap.get(resultViewingPageVo.getObjectId()).getPlanExecuterNum());
|
|
|
+ int actualExecuterNum = planAndActualExecuterNumMap.get(resultViewingPageVo.getObjectId()).getActualExecuterNum();
|
|
|
+ setActualExecuterNum(actualExecuterNum);
|
|
|
+ setSumScore(r.getSumScore()/actualExecuterNum);
|
|
|
+ setSynthesisScore(synthesisScoreMap.get(resultViewingPageVo.getObjectId())/actualExecuterNum);
|
|
|
+ }});
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+// SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
|
|
|
+// for (TextbookIssueRecordPageVo textbookIssueRecordPageVo : customerList) {
|
|
|
+// if(textbookIssueRecordPageVo.getCreateDate() == null){
|
|
|
+// continue;
|
|
|
+// }
|
|
|
+// textbookIssueRecordPageVo.setCreateDateStr(sdf.format(textbookIssueRecordPageVo.getCreateDate()));
|
|
|
+// dataList.add(BeanUtil.toBean(textbookIssueRecordPageVo, TextbookIssueRecordExcelVo.class));
|
|
|
+// }
|
|
|
+
|
|
|
+
|
|
|
+ //返回流
|
|
|
+ ByteArrayOutputStream bot = new ByteArrayOutputStream();
|
|
|
+
|
|
|
+ // 设置排除的属性 也可以在数据模型的字段上加@ExcelIgnore注解排除
|
|
|
+ /*Set<String> excludeField = new HashSet<>();
|
|
|
+ excludeField.add("hireDate");
|
|
|
+ excludeField.add("salary");
|
|
|
+ // 写Excel
|
|
|
+ EasyExcel.write(filename, User.class)
|
|
|
+ .excludeColumnFiledNames(excludeField)
|
|
|
+ .sheet("用户信息")
|
|
|
+ .doWrite(getUserData());*/
|
|
|
+
|
|
|
+ // 方法2 自定义合并单元格策略
|
|
|
+ String fileName = "ResultViewing" + ExcelTypeEnum.XLSX.getValue();
|
|
|
+ // 每隔2行会合并 把eachColumn 设置成 3 也就是我们数据的长度,所以就第一列会合并。当然其他合并策略也可以自己写
|
|
|
+ LoopMergeStrategy loopMergeStrategy = new LoopMergeStrategy(evaluateManageItemNum, 0);
|
|
|
+ LoopMergeStrategy loopMergeStrategy1 = new LoopMergeStrategy(evaluateManageItemNum, 1);
|
|
|
+ LoopMergeStrategy loopMergeStrategy2 = new LoopMergeStrategy(evaluateManageItemNum, 2);
|
|
|
+ LoopMergeStrategy loopMergeStrategy3 = new LoopMergeStrategy(evaluateManageItemNum, 5);
|
|
|
+
|
|
|
+ EasyExcel.write(bot, ResultViewingExcelVo.class)
|
|
|
+ .automaticMergeHead(false)
|
|
|
+ .excelType(ExcelTypeEnum.XLSX)
|
|
|
+ .registerWriteHandler(loopMergeStrategy)
|
|
|
+ .registerWriteHandler(loopMergeStrategy1)
|
|
|
+ .registerWriteHandler(loopMergeStrategy2)
|
|
|
+ .registerWriteHandler(loopMergeStrategy3)
|
|
|
+ .sheet()
|
|
|
+ .doWrite(customerList);
|
|
|
+ return RT.fileStream(bot.toByteArray(), fileName);
|
|
|
}
|
|
|
}
|