diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/controller/EvaluationRecordController.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/controller/EvaluationRecordController.java index fb84eb8..c2dcb38 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/controller/EvaluationRecordController.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/controller/EvaluationRecordController.java @@ -51,7 +51,7 @@ public class EvaluationRecordController extends BaseController { * 导出量测记录列表 */ @SaCheckPermission("evaluation:record:export") - @Log(title = "量测记录", businessType = BusinessType.EXPORT) + @Log(title = "个人量测记录", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(BaseQueryBo bo, HttpServletResponse response) throws IOException { XWPFTemplate template = sysEvaluationRecordService.getWordTemplate(bo); diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/controller/ScalePublishController.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/controller/ScalePublishController.java index 7bfc548..1e9c8d0 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/controller/ScalePublishController.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/controller/ScalePublishController.java @@ -1,10 +1,13 @@ package org.dromara.scale.controller; import cn.dev33.satoken.annotation.SaCheckPermission; +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.util.PoitlIOUtils; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.file.FileUtils; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; import org.dromara.common.excel.utils.ExcelUtil; @@ -22,6 +25,9 @@ import org.dromara.scale.service.ISysScalePublishService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.io.BufferedOutputStream; +import java.io.IOException; +import java.io.OutputStream; import java.util.List; /** @@ -62,7 +68,7 @@ public class ScalePublishController extends BaseController { @SaCheckPermission("publish:evaluation:export") @Log(title = "未测名单", businessType = BusinessType.EXPORT) @PostMapping("/evaluation/undone/export") - public void export(BaseQueryBo query, HttpServletResponse response) { + public void undoneExport(BaseQueryBo query, HttpServletResponse response) { List list = sysScalePublishService.queryUndoneExportList(query); ExcelUtil.exportExcel(list, query.getSessionName() + "的未测名单", EvaluationVo.class, response); } @@ -124,4 +130,22 @@ public class ScalePublishController extends BaseController { return toAjax(sysScalePublishService.deleteById(batchNo)); } + /** + * 导出量测记录列表 + */ + @SaCheckPermission("scale:publish:export") + @Log(title = "场次量测记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BaseQueryBo bo, HttpServletResponse response) throws IOException { + XWPFTemplate template = sysScalePublishService.getWordTemplate(bo); + //ExcelUtil.exportExcel(list, "量测记录", SysEvaluationRecordVo.class, response); + FileUtils.setAttachmentResponseHeader(response, bo.getSessionName() + "的报告"); + response.setContentType("application/octet-stream"); + OutputStream out = response.getOutputStream(); + BufferedOutputStream bos = new BufferedOutputStream(out); + template.write(bos); + bos.flush(); + out.flush(); + PoitlIOUtils.closeQuietlyMulti(template, bos, out); + } } diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/SysWarnRecord.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/SysWarnRecord.java index f74792a..2112ef9 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/SysWarnRecord.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/SysWarnRecord.java @@ -35,6 +35,7 @@ public class SysWarnRecord { * 测评人id */ private Long userId; + private Long deptId; /** * 补充说明 diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/vo/SysScalePublishVo.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/vo/SysScalePublishVo.java index d66e0fa..73841de 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/vo/SysScalePublishVo.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/vo/SysScalePublishVo.java @@ -70,6 +70,8 @@ public class SysScalePublishVo implements Serializable { private String createName; + private Date createTime; + private List scaleList; diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/word/EvaluationEecordWordData.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/word/EvaluationRecordWordData.java similarity index 90% rename from ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/word/EvaluationEecordWordData.java rename to ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/word/EvaluationRecordWordData.java index 3c2e906..eea4860 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/word/EvaluationEecordWordData.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/word/EvaluationRecordWordData.java @@ -7,14 +7,14 @@ import lombok.Data; import java.util.List; /** - *

TODO

+ *

个人测试报告

* * @author cjw * @version V1.0.0 * @date 2024/4/29 11:09 */ @Data -public class EvaluationEecordWordData { +public class EvaluationRecordWordData { private String createTime; private String useTime; diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/word/PublishRecordWordData.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/word/PublishRecordWordData.java new file mode 100644 index 0000000..f042edd --- /dev/null +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/word/PublishRecordWordData.java @@ -0,0 +1,53 @@ +package org.dromara.scale.domain.word; + +import com.deepoove.poi.data.ChartSingleSeriesRenderData; +import lombok.Data; + +import java.util.List; + +/** + *

团体测试报告

+ * + * @author cjw + * @version V1.0.0 + * @date 2024/4/29 11:09 + */ +@Data +public class PublishRecordWordData { + + private String sessionName; + + private String publishTime; + private String dataTime; + + private String classNum; + + private String personNum; + + private String maleNum; + private String malePercent; + private String femaleNum; + private String femalePercent; + private ChartSingleSeriesRenderData sexChart; + + private String completeNum; + private String completePercent; + private String undoneNum; + private String undonePercent; + private ChartSingleSeriesRenderData completeChart; + + private String warnNum; + private String warnPercent; + private String normalNum; + private String normalPercent; + private ChartSingleSeriesRenderData warnChart; + + private String classWarnName; + private String classWarnNum; + private String classWarnPercent; + private ChartSingleSeriesRenderData classChart; + + private List warnCharts; + + +} diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/word/WordWarn.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/word/WordWarn.java new file mode 100644 index 0000000..3ef949c --- /dev/null +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/word/WordWarn.java @@ -0,0 +1,19 @@ +package org.dromara.scale.domain.word; + +import com.deepoove.poi.data.ChartSingleSeriesRenderData; +import lombok.Data; + +/** + *

TODO

+ * + * @author cjw + * @version V1.0.0 + * @date 2024/5/11 16:20 + */ +@Data +public class WordWarn { + + + private String scaleName; + private ChartSingleSeriesRenderData warnChart; +} diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/mapper/SysEvaluationRecordMapper.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/mapper/SysEvaluationRecordMapper.java index 08f83c7..44562d3 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/mapper/SysEvaluationRecordMapper.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/mapper/SysEvaluationRecordMapper.java @@ -7,6 +7,7 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.scale.domain.SysEvaluationRecord; +import org.dromara.scale.domain.vo.StatisticNumVo; import org.dromara.scale.domain.vo.SysScaleVo; import org.dromara.scale.domain.word.WordEvaluationFactor; import org.dromara.scale.domain.vo.SysEvaluationRecordVo; @@ -35,4 +36,10 @@ public interface SysEvaluationRecordMapper extends BaseMapperPlus selectMaxWarnNumByBatchNo(Long batchNo); + } diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/mapper/SysScalePublishMapper.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/mapper/SysScalePublishMapper.java index 67672e8..c31f4f6 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/mapper/SysScalePublishMapper.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/mapper/SysScalePublishMapper.java @@ -6,6 +6,7 @@ import org.apache.ibatis.annotations.Param; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.scale.domain.SysScalePublish; import org.dromara.scale.domain.vo.EvaluationVo; +import org.dromara.scale.domain.vo.StatisticNumVo; import org.dromara.scale.domain.vo.SysScalePublishVo; import java.util.List; @@ -32,4 +33,6 @@ public interface SysScalePublishMapper extends BaseMapperPlus queryUndoneExportList(BaseQueryBo query); + XWPFTemplate getWordTemplate(BaseQueryBo bo) throws IOException; + } diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysEvaluationRecordServiceImpl.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysEvaluationRecordServiceImpl.java index 9bde916..b358f85 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysEvaluationRecordServiceImpl.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysEvaluationRecordServiceImpl.java @@ -17,7 +17,7 @@ import org.dromara.scale.domain.bo.BaseQueryBo; import org.dromara.scale.domain.bo.SysEvaluationRecordBo; import org.dromara.scale.domain.vo.SysEvaluationRecordVo; import org.dromara.scale.domain.vo.SysScaleVo; -import org.dromara.scale.domain.word.EvaluationEecordWordData; +import org.dromara.scale.domain.word.EvaluationRecordWordData; import org.dromara.scale.domain.word.WordEvaluationFactor; import org.dromara.scale.domain.word.WordFactor; import org.dromara.scale.mapper.SysEvaluationRecordMapper; @@ -103,7 +103,7 @@ public class SysEvaluationRecordServiceImpl implements ISysEvaluationRecordServi if (scaleId == null) { throw new ServerException("量表ID不能为空"); } - EvaluationEecordWordData wordData = new EvaluationEecordWordData(); + EvaluationRecordWordData wordData = new EvaluationRecordWordData(); SysEvaluationRecord sysEvaluationRecord = baseMapper.selectById(recordId); Date createTime = sysEvaluationRecord.getCreateTime(); diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysScalePublishServiceImpl.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysScalePublishServiceImpl.java index 17084b8..fb94d82 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysScalePublishServiceImpl.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysScalePublishServiceImpl.java @@ -5,6 +5,9 @@ import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.data.ChartSingleSeriesRenderData; +import com.deepoove.poi.data.Charts; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.exception.ServiceException; @@ -19,10 +22,8 @@ import org.dromara.scale.domain.SysEvaluationRecord; import org.dromara.scale.domain.SysScalePublish; import org.dromara.scale.domain.bo.BaseQueryBo; import org.dromara.scale.domain.bo.SysScalePublishBo; -import org.dromara.scale.domain.vo.EvaluationVo; -import org.dromara.scale.domain.vo.SysEvaluationRecordVo; -import org.dromara.scale.domain.vo.SysScalePublishVo; -import org.dromara.scale.domain.vo.SysScaleVo; +import org.dromara.scale.domain.vo.*; +import org.dromara.scale.domain.word.PublishRecordWordData; import org.dromara.scale.mapper.SysEvaluationRecordMapper; import org.dromara.scale.mapper.SysScaleMapper; import org.dromara.scale.mapper.SysScalePublishMapper; @@ -33,9 +34,11 @@ import org.dromara.system.mapper.SysDeptMapper; import org.dromara.system.mapper.SysUserMapper; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; +import java.io.IOException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.rmi.ServerException; +import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -110,9 +113,7 @@ public class SysScalePublishServiceImpl implements ISysScalePublishService { add.setCreateBy(loginUser.getUserId()); add.setCreateTime(new Date()); validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; Integer publishType = add.getPublishType(); - Long batchNo = add.getBatchNo(); String scaleIds = add.getScaleIds(); String deptIds = add.getDeptIds(); String userIds = add.getUserIds(); @@ -149,12 +150,13 @@ public class SysScalePublishServiceImpl implements ISysScalePublishService { add.setUserNames(userList.stream().map(SysUser::getNickName).collect(Collectors.joining(StrUtil.COMMA))); } add.setTotalNum(userList.size()); - //预处理量测记录,方便后续统计与查询 - List scaleList = bo.getScaleIds(); - insertRecordBatch(batchNo, scaleList, userList); + boolean flag = baseMapper.insert(add) > 0; if (flag) { bo.setBatchNo(add.getBatchNo()); } + //预处理量测记录,方便后续统计与查询 + List scaleList = bo.getScaleIds(); + insertRecordBatch(add.getBatchNo(), scaleList, userList); //加入延迟队列 QueueUtils.addDelayedQueueObject("scalePublish-delay-queue", add.getBatchNo(), l, TimeUnit.MILLISECONDS); return flag; @@ -261,4 +263,94 @@ public class SysScalePublishServiceImpl implements ISysScalePublishService { public List queryUndoneExportList(BaseQueryBo query) { return baseMapper.selectUndoneEvaluationVoList(query.getBatchNo()); } + + @Override + public XWPFTemplate getWordTemplate(BaseQueryBo bo) throws IOException { + Long batchNo = bo.getBatchNo(); + if (batchNo == null) { + throw new ServerException("场次Id不能为空"); + } + PublishRecordWordData wordData = new PublishRecordWordData(); + + SysScalePublishVo publishVo = baseMapper.selectVoById(batchNo); + wordData.setSessionName(publishVo.getSessionName()); + + Date createTime = publishVo.getCreateTime(); + Date expireTime = publishVo.getExpireTime(); + wordData.setPublishTime(DateUtils.dateTime(createTime) + "~" + DateUtils.dateTime(expireTime)); + wordData.setDataTime(DateUtils.getTime()); + + int classNum = publishVo.getDeptIds().size(); + wordData.setClassNum(String.valueOf(classNum)); + + StatisticNumVo numVo = baseMapper.selectSexNumByBatchNo(batchNo); + int maleNum = numVo.getValue(); + int femaleNum = numVo.getSpareValue(); + int personTotal = maleNum + femaleNum; + int malePercent = processHalfUpPercent(maleNum, personTotal); + int femalePercent = processHalfUpPercent(femaleNum, personTotal); + wordData.setMaleNum(String.valueOf(maleNum)); + wordData.setMalePercent(malePercent + "%"); + wordData.setFemaleNum(String.valueOf(femaleNum)); + wordData.setFemalePercent(femalePercent + "%"); + ChartSingleSeriesRenderData sexChart = Charts.ofSingleSeries("", new String[]{"男生(人)", "女生(人)"}) + .series("", new Integer[]{maleNum, femaleNum}).create(); + wordData.setSexChart(sexChart); + + int completeNum = recordMapper.selectCompleteNumByBatchNo(batchNo); + int completePercent = processHalfUpPercent(completeNum, personTotal); + int undoneNum = personTotal - completeNum; + int undonePercent = processHalfUpPercent(undoneNum, personTotal); + wordData.setCompleteNum(String.valueOf(completeNum)); + wordData.setCompletePercent(completePercent + "%"); + wordData.setUndoneNum(String.valueOf(undoneNum)); + wordData.setUndonePercent(undonePercent + "%"); + ChartSingleSeriesRenderData completeChart = Charts.ofSingleSeries("", new String[]{"完成计划(人)", "未完成计划(人)"}) + .series("", new Integer[]{completeNum, undoneNum}).create(); + wordData.setCompleteChart(completeChart); + + int warnNum = recordMapper.selectWarnNumByBatchNo(batchNo); + int warnPercent = processHalfUpPercent(warnNum, personTotal); + int normalNum = personTotal - completeNum; + int normalPercent = processHalfUpPercent(normalNum, personTotal); + wordData.setWarnNum(String.valueOf(warnNum)); + wordData.setWarnPercent(warnPercent + "%"); + wordData.setNormalNum(String.valueOf(normalNum)); + wordData.setNormalPercent(normalPercent + "%"); + ChartSingleSeriesRenderData warnChart = Charts.ofSingleSeries("", new String[]{"触发预警(人)", "未触发预警(人)"}) + .series("", new Integer[]{warnNum, normalNum}).create(); + wordData.setWarnChart(warnChart); + + List maxList = recordMapper.selectMaxWarnNumByBatchNo(batchNo); + Optional max = maxList.stream().max(Comparator.comparingInt(StatisticNumVo::getValue)); + if (max.isPresent()) { + StatisticNumVo classVo = max.get(); + String classWarnName = classVo.getName(); + int classWarnNum = classVo.getValue(); + int classWarnPercent = processHalfUpPercent(classWarnNum, personTotal); + int otherNum = personTotal - classWarnNum; + wordData.setClassWarnName(classWarnName); + wordData.setClassWarnNum(String.valueOf(classWarnNum)); + wordData.setClassWarnPercent(classWarnPercent + "%"); + ChartSingleSeriesRenderData classChart = Charts.ofSingleSeries("", new String[]{classWarnName + "(人)", "其他(人)"}) + .series("", new Integer[]{classWarnNum, otherNum}).create(); + wordData.setClassChart(classChart); + } + + + return null; + } + + private int processHalfUpPercent(int num, int total) { + return BigDecimal.valueOf(num) + .divide(BigDecimal.valueOf(total), 2, RoundingMode.HALF_UP) + .multiply(BigDecimal.valueOf(100)).intValue(); + } + + public static void main(String[] args) { + int i = BigDecimal.valueOf(0) + .divide(BigDecimal.valueOf(10), 2, RoundingMode.HALF_UP) + .multiply(BigDecimal.valueOf(100)).intValue(); + System.out.println(i); + } } diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/WebServiceImpl.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/WebServiceImpl.java index 9bab651..bf75b0b 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/WebServiceImpl.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/WebServiceImpl.java @@ -178,7 +178,8 @@ public class WebServiceImpl implements IWebService { if (used.contains(riskLevel)) { SysWarnRecord wre = new SysWarnRecord(); wre.setBatchNo(scalePublishVo.getBatchNo()); - wre.setUserId(getLoginUser().getUserId()); + wre.setUserId(loginUser.getUserId()); + wre.setDeptId(loginUser.getDeptId()); wre.setWarnTime(new Date()); wre.setSituation(riskLevel); warnRecordService.insertByBo(wre); diff --git a/ruoyi-modules/rouyi-scale/src/main/resources/mapper/scale/StatisticMapper.xml b/ruoyi-modules/rouyi-scale/src/main/resources/mapper/scale/StatisticMapper.xml index 450f2a6..de4c335 100644 --- a/ruoyi-modules/rouyi-scale/src/main/resources/mapper/scale/StatisticMapper.xml +++ b/ruoyi-modules/rouyi-scale/src/main/resources/mapper/scale/StatisticMapper.xml @@ -97,7 +97,7 @@ left join sys_scale_publish sp on FIND_IN_SET(d.dept_id, sp.dept_ids) where parent.parent_id = 100 group by parent.dept_id - order by `name` + order by parent.order_num + select count(*) + from sys_evaluation_record + where batch_no = #{batchNo} + and status = 1 + + + + + diff --git a/ruoyi-modules/rouyi-scale/src/main/resources/mapper/scale/SysScalePublishMapper.xml b/ruoyi-modules/rouyi-scale/src/main/resources/mapper/scale/SysScalePublishMapper.xml index f456588..4460998 100644 --- a/ruoyi-modules/rouyi-scale/src/main/resources/mapper/scale/SysScalePublishMapper.xml +++ b/ruoyi-modules/rouyi-scale/src/main/resources/mapper/scale/SysScalePublishMapper.xml @@ -75,4 +75,12 @@ where status = 1 and find_in_set(#{userId}, user_ids) + +