浏览代码

评价结果调整

dzx 4 月之前
父节点
当前提交
fcacf15390

+ 5 - 3
src/main/java/com/xjrsoft/module/evaluate/controller/EvaluateResultController.java

@@ -1,6 +1,7 @@
 package com.xjrsoft.module.evaluate.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
@@ -80,8 +81,9 @@ public class EvaluateResultController {
     @PostMapping("/export-query")
 //    @GetMapping("/expor")
     @ApiOperation(value = "入参导出")
-    public ResponseEntity<byte[]>  exportDataQuery(@Valid @RequestBody ResultViewingExcelDto dto) {
-//    public ResponseEntity<byte[]>  exportDataQuery(@Valid ResultViewingExcelDto dto) {
-        return evaluateResultService.getList(dto);
+    public ResponseEntity<byte[]>  exportDataQuery(@Valid @RequestBody ResultViewingPageDto dto) {
+        String fileName = "recordDetailExportQuery" + ExcelTypeEnum.XLSX.getValue();
+        byte[] bytes = evaluateResultService.getList(dto);
+        return RT.fileStream(bytes, fileName);
     }
 }

+ 1 - 1
src/main/java/com/xjrsoft/module/evaluate/service/IEvaluateResultService.java

@@ -35,5 +35,5 @@ public interface IEvaluateResultService extends MPJBaseService<EvaluateResult> {
 
     String saveBatch(EvaluateResultSaveDto dto);
 
-    ResponseEntity<byte[]> getList(ResultViewingExcelDto dto);
+    byte[] getList(ResultViewingPageDto dto);
 }

+ 119 - 148
src/main/java/com/xjrsoft/module/evaluate/service/impl/EvaluateResultServiceImpl.java

@@ -1,24 +1,21 @@
 package com.xjrsoft.module.evaluate.service.impl;
 
 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.metadata.IPage;
 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.exception.MyException;
 import com.xjrsoft.common.mybatis.SqlRunnerAdapter;
 import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.evaluate.dto.AddEvaluateResultDto;
 import com.xjrsoft.module.evaluate.dto.EvaluateResultDetailPageDetailDto;
 import com.xjrsoft.module.evaluate.dto.EvaluateResultDetailPageDto;
 import com.xjrsoft.module.evaluate.dto.EvaluateResultIndexPageDto;
 import com.xjrsoft.module.evaluate.dto.EvaluateResultSaveDto;
-import com.xjrsoft.module.evaluate.dto.ResultViewingExcelDto;
 import com.xjrsoft.module.evaluate.dto.ResultViewingPageDto;
 import com.xjrsoft.module.evaluate.entity.EvaluateExecuter;
 import com.xjrsoft.module.evaluate.entity.EvaluateManage;
@@ -36,12 +33,17 @@ import com.xjrsoft.module.evaluate.vo.EvaluateResultDetailPageDetailVo;
 import com.xjrsoft.module.evaluate.vo.EvaluateResultDetailPageVo;
 import com.xjrsoft.module.evaluate.vo.EvaluateResultIndexPageVo;
 import com.xjrsoft.module.evaluate.vo.MobileResultPageVo;
-import com.xjrsoft.module.evaluate.vo.ResultViewingExcelVo;
 import com.xjrsoft.module.evaluate.vo.ResultViewingListVo;
 import com.xjrsoft.module.evaluate.vo.ResultViewingPageVo;
 import com.xjrsoft.module.teacher.entity.XjrUser;
 import lombok.AllArgsConstructor;
-import org.springframework.http.ResponseEntity;
+import me.zhyd.oauth.log.Log;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -281,154 +283,123 @@ public class EvaluateResultServiceImpl extends MPJBaseServiceImpl<EvaluateResult
     }
 
     @Override
-    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());
-        }
+    public byte[] getList(ResultViewingPageDto dto) {
+        try {
+            List<ResultViewingPageVo> list = this.pageResultViewing(dto);
+            //查询有多少个题目
+            MPJLambdaWrapper<EvaluateManageItem> evaluateManageItemMPJLambdaWrapper = new MPJLambdaWrapper<>();
+            evaluateManageItemMPJLambdaWrapper
+                    .select(EvaluateManageItem::getId)
+                    .select(EvaluateManageItem.class, x -> VoToColumnUtil.fieldsToColumns(EvaluateManageItem.class).contains(x.getProperty()))
+                    .eq(EvaluateManageItem::getEvaluateManageId, dto.getEvaluateManageId());
+            List<EvaluateManageItem> itemList = evaluateManageItemMapper.selectList(evaluateManageItemMPJLambdaWrapper);
+            //大题个数
+            Map<String, List<EvaluateManageItem>> topicMap = itemList.stream().collect(Collectors.groupingBy(EvaluateManageItem::getTopic));
+
+//        int startRow = 1;
+//        List<Map<Integer, Integer>> mergeList = new ArrayList<>();
+            List<Long> objectList = list.stream().map(ResultViewingPageVo::getObjectId).collect(Collectors.toList());
+            Map<Long, Integer> sortCodeMap = new HashMap<>();
+
+            int sortCode = 1;
+            for (Long objectId : objectList) {
+//            Map<Integer, Integer> rowColumn = new HashMap<>();
+//            rowColumn.put(startRow, startRow + itemList.size() - 1);
+//            mergeList.add(rowColumn);
+//
+//            startRow = startRow + itemList.size();
+
+                sortCodeMap.put(objectId, sortCode);
+                sortCode ++;
+            }
 
-        //获取该评价管理下的所有题目-多个
-        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();
+            Workbook workbook = new XSSFWorkbook();
+            Sheet sheet = workbook.createSheet("数据");
 
-        //获取该评价管理下的被评对象的应打分人数,实际打分人数
-        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);
-        }
+            Row headerRow = sheet.createRow(0);
+            String[] headers = {"序号", "被评人", "应打分人数", "实际打分人数", "题目", "得分", "标题", "得分", "综合得分"};
+            for (int i = 0; i < headers.length; i++) {
+                Cell cell = headerRow.createCell(i);
+                cell.setCellValue(headers[i]);
+            }
 
-        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));
+            // 自动调整列宽
+            for (int i = 0; i < headers.length; i++) {
+                sheet.autoSizeColumn(i);
+            }
 
-            /*//获取该评价管理下的所有被评对象的标题的总得分
-            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);
-                    }});
+            // 填充数据并记录合并的行
+            int rowCount = 1;
+            Map<Long, Integer> classStartRows = new HashMap<>();
+            Map<Long, Integer> classEndRows = new HashMap<>();
+
+            Map<String, Integer> itemStartRows = new HashMap<>();
+            Map<String, Integer> itemEndRows = new HashMap<>();
+
+            for (ResultViewingPageVo el : list) {
+                Row row = sheet.createRow(rowCount ++);
+                row.createCell(0).setCellValue(sortCodeMap.get(el.getObjectId()));
+                row.createCell(1).setCellValue(el.getObjectIdCN());
+                row.createCell(2).setCellValue(el.getPlanExecuterNum());
+                row.createCell(3).setCellValue(el.getActualExecuterNum());
+                row.createCell(4).setCellValue(el.getProblem());
+                row.createCell(5).setCellValue(el.getSumScore());
+                row.createCell(6).setCellValue(el.getTopic());
+                row.createCell(7).setCellValue(el.getTopicScore());
+                row.createCell(8).setCellValue(el.getSynthesisScore());
+
+                Long objectId = el.getObjectId();
+                if (!classStartRows.containsKey(objectId)) {
+                    classStartRows.put(objectId, rowCount - 1);
+                }
+                classEndRows.put(objectId, rowCount - 1);
+
+                String itemInfo = el.getObjectId() + el.getTopic();
+                if (!itemStartRows.containsKey(itemInfo)) {
+                    itemStartRows.put(itemInfo, rowCount - 1);
                 }
+                itemEndRows.put(itemInfo, rowCount - 1);
+            }
+
+            // 合并相同的人
+            for (Map.Entry<Long, Integer> entry : classStartRows.entrySet()) {
+                Long className = entry.getKey();
+                int startRow = entry.getValue();
+                int endRow = classEndRows.get(className);
+                if (startRow != endRow) {
+                    sheet.addMergedRegion(new CellRangeAddress(startRow, endRow, 0, 0));
+                    sheet.addMergedRegion(new CellRangeAddress(startRow, endRow, 1, 1));
+                    sheet.addMergedRegion(new CellRangeAddress(startRow, endRow, 2, 2));
+                    sheet.addMergedRegion(new CellRangeAddress(startRow, endRow, 3, 3));
+                    sheet.addMergedRegion(new CellRangeAddress(startRow, endRow, 8, 8));
+                }
+            }
+
+            // 合并相同的题目
+            for (Map.Entry<String, Integer> entry : itemStartRows.entrySet()) {
+                String itemInfo = entry.getKey();
+                int startRow = entry.getValue();
+                int endRow = itemEndRows.get(itemInfo);
+                if (startRow != endRow) {
+                    sheet.addMergedRegion(new CellRangeAddress(startRow, endRow, 6, 6));
+                    sheet.addMergedRegion(new CellRangeAddress(startRow, endRow, 7, 7));
+                }
+            }
+
+            // 自动调整列宽
+            for (int i = 0; i < headers.length; i++) {
+                sheet.autoSizeColumn(i);
             }
-        }
-//        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();
+            workbook.write(bot);
+            // 关闭工作簿
+            workbook.close();
 
-        //返回流
-        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);
+            return bot.toByteArray();
+        }catch (Exception e){
+            Log.error(e.getMessage(), e);
+            throw new MyException("导出报错,请联系管理员");
+        }
     }
 }