From 31fec7c53d96919529f21b7093995c3446cf69e0 Mon Sep 17 00:00:00 2001 From: cjw Date: Wed, 8 May 2024 13:59:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=B5=8B=E8=AF=84=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=AE=8C=E6=88=90=E6=97=B6?= =?UTF-8?q?=E9=97=B4=EF=BC=9B=E6=B7=BB=E5=8A=A0=E4=B8=80=E4=BA=9B=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E6=8E=A5=E5=8F=A3=EF=BC=9B=E5=AE=8C=E5=96=84=E4=B8=AA?= =?UTF-8?q?=E4=BA=BA=E6=A8=A1=E6=9D=BF=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/common/core/utils/DateUtils.java | 11 +-- .../scale/controller/StatisticController.java | 53 +++++++++--- .../scale/domain/SysEvaluationRecord.java | 4 +- .../dromara/scale/domain/SysScaleFactor.java | 10 +++ .../dromara/scale/domain/vo/SysScaleVo.java | 1 + .../domain/vo/WordEvaluationAnswerVo.java | 21 ----- .../{ => word}/EvaluationEecordWordData.java | 11 ++- .../domain/word/WordEvaluationFactor.java | 25 ++++++ .../dromara/scale/domain/word/WordFactor.java | 24 ++++++ .../dromara/scale/mapper/StatisticMapper.java | 7 ++ .../mapper/SysEvaluationRecordMapper.java | 4 +- .../scale/mapper/SysScaleFactorMapper.java | 2 +- .../dromara/scale/mapper/SysScaleMapper.java | 5 +- .../scale/service/IStatisticService.java | 16 +++- .../service/impl/StatisticServiceImpl.java | 32 +++++++- .../impl/SysEvaluationRecordServiceImpl.java | 76 +++++++++++++----- .../impl/SysScaleFactorServiceImpl.java | 33 +++----- .../impl/SysScalePublishServiceImpl.java | 11 ++- .../scale/service/impl/WebServiceImpl.java | 3 +- .../mapper/scale/StatisticMapper.xml | 30 +++++++ .../scale/SysEvaluationRecordMapper.xml | 23 +++--- .../mapper/scale/SysScaleFactorMapper.xml | 12 ++- .../resources/mapper/scale/SysScaleMapper.xml | 15 ++-- .../main/resources/word/personalTemplate.docx | Bin 20343 -> 33541 bytes 24 files changed, 310 insertions(+), 119 deletions(-) delete mode 100644 ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/vo/WordEvaluationAnswerVo.java rename ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/{ => word}/EvaluationEecordWordData.java (56%) create mode 100644 ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/word/WordEvaluationFactor.java create mode 100644 ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/word/WordFactor.java diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java index 5c35e1e..354276c 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java @@ -138,13 +138,13 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { /** * 计算两个时间差 */ - public static String getDatePoor(Date endDate, Date nowDate) { + public static String getDatePoor(Date startDate, Date endDate) { long nd = 1000 * 24 * 60 * 60; long nh = 1000 * 60 * 60; long nm = 1000 * 60; - // long ns = 1000; + long ns = 1000; // 获得两个时间的毫秒时间差异 - long diff = endDate.getTime() - nowDate.getTime(); + long diff = endDate.getTime() - startDate.getTime(); // 计算差多少天 long day = diff / nd; // 计算差多少小时 @@ -152,8 +152,9 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { // 计算差多少分钟 long min = diff % nd % nh / nm; // 计算差多少秒//输出结果 - // long sec = diff % nd % nh % nm / ns; - return day + "天" + hour + "小时" + min + "分钟"; + long sec = diff % nd % nh % nm / ns; + //return day + "天" + hour + "小时" + min + "分钟" + sec + "秒"; + return hour + "小时" + min + "分钟" + sec + "秒"; } /** diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/controller/StatisticController.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/controller/StatisticController.java index 05d8d37..fbf47e9 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/controller/StatisticController.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/controller/StatisticController.java @@ -23,17 +23,18 @@ import java.util.List; */ @RequiredArgsConstructor @RestController -@RequestMapping("/scale/statistic") +@RequestMapping("/statistic") public class StatisticController extends BaseController { private final IStatisticService statisticService; + /** - * 获取完成情况统计-整体 + * 获取完成情况统计-年级 */ - @GetMapping("/complete/all") + @GetMapping("/complete/grade") public R> getComplete(BaseQueryBo query) { - return R.ok(statisticService.getComplete4All(query)); + return R.ok(statisticService.getComplete4Grade(query)); } /** @@ -48,8 +49,16 @@ public class StatisticController extends BaseController { * 获取预警情况统计-整体 */ @GetMapping("/warn/all") + public R getWarn4All() { + return R.ok(statisticService.getWarn4All()); + } + + /** + * 获取预警情况统计-年级 + */ + @GetMapping("/warn/grade") public R> getWarn(BaseQueryBo query) { - return R.ok(statisticService.getWarn4All(query)); + return R.ok(statisticService.getWarn4Grade(query)); } /** @@ -61,18 +70,44 @@ public class StatisticController extends BaseController { } /** - * 获取预警情况统计-整体 + * 获取因子统计-年级 */ - @GetMapping("/factor/all") + @GetMapping("/factor/grade") public R> getFactor(BaseQueryBo query) { - return R.ok(statisticService.getFactor4All(query)); + return R.ok(statisticService.getFactor4Grade(query)); } /** - * 获取预警情况统计-班级 + * 获取因子统计-班级 */ @GetMapping("/factor/class") public R> getFactor4Class(BaseQueryBo query) { return R.ok(statisticService.getFactor4Class(query)); } + + /** + * 获取总用户数 + */ + @GetMapping("/user/num") + public R getUserNum() { + return R.ok(statisticService.getUserNum()); + } + + /** + * 获取总干预数 + */ + @GetMapping("/intervene/num") + public R getInterveneNum() { + return R.ok(statisticService.getUserNum()); + } + + /** + * 获取量表发布次数 + */ + @GetMapping("/scale/publish/num") + public R> getPublishNum() { + return R.ok(statisticService.getScalePublishNum()); + } + + } diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/SysEvaluationRecord.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/SysEvaluationRecord.java index 2b13925..a723672 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/SysEvaluationRecord.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/SysEvaluationRecord.java @@ -47,7 +47,7 @@ public class SysEvaluationRecord { private Long batchNo; /** - * 记录状态0初始化,1开始测试 + * 记录状态-1初始化,0准备测试,1完成测试 */ private Integer status; @@ -57,5 +57,7 @@ public class SysEvaluationRecord { //@TableField(fill = FieldFill.INSERT) private Date createTime; + private Date updateTime; + } diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/SysScaleFactor.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/SysScaleFactor.java index c31af93..b62d093 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/SysScaleFactor.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/SysScaleFactor.java @@ -49,6 +49,16 @@ public class SysScaleFactor extends BaseEntity { @AutoMapping(target = "questionIds", expression = "java(cn.hutool.core.util.StrUtil.split(source.getQuestionIds(), \",\"))") private String questionIds; + /** + * 问题数量 + */ + private Integer questionNum; + + /** + * 问题总分 + */ + private BigDecimal questionScore; + /** * 计算类型 */ diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/vo/SysScaleVo.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/vo/SysScaleVo.java index 02a1b90..4979d73 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/vo/SysScaleVo.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/vo/SysScaleVo.java @@ -130,4 +130,5 @@ public class SysScaleVo implements Serializable { private boolean used; private Long recordId; + } diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/vo/WordEvaluationAnswerVo.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/vo/WordEvaluationAnswerVo.java deleted file mode 100644 index cdf8a03..0000000 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/vo/WordEvaluationAnswerVo.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.dromara.scale.domain.vo; - -import lombok.Data; - -import java.math.BigDecimal; - -/** - *

TODO

- * - * @author cjw - * @version V1.0.0 - * @date 2024/4/29 13:41 - */ -@Data -public class WordEvaluationAnswerVo { - - private String factorName; - private String questionContent; - private String answerOption; - private BigDecimal score; -} diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/EvaluationEecordWordData.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/word/EvaluationEecordWordData.java similarity index 56% rename from ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/EvaluationEecordWordData.java rename to ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/word/EvaluationEecordWordData.java index 8ac4347..5749018 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/EvaluationEecordWordData.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/word/EvaluationEecordWordData.java @@ -1,8 +1,11 @@ -package org.dromara.scale.domain; +package org.dromara.scale.domain.word; +import com.deepoove.poi.data.ChartMultiSeriesRenderData; import com.deepoove.poi.data.TableRenderData; import lombok.Data; +import java.util.List; + /** *

TODO

* @@ -13,12 +16,16 @@ import lombok.Data; @Data public class EvaluationEecordWordData { + private String createTime; + private String useTime; private String nickName; private String deptName; private String sex; private String scaleName; private String scaleDetails; private TableRenderData factor; - private TableRenderData intervene; + private ChartMultiSeriesRenderData barChart; + private List factors; + private String propose; } diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/word/WordEvaluationFactor.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/word/WordEvaluationFactor.java new file mode 100644 index 0000000..77bd215 --- /dev/null +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/word/WordEvaluationFactor.java @@ -0,0 +1,25 @@ +package org.dromara.scale.domain.word; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + *

TODO

+ * + * @author cjw + * @version V1.0.0 + * @date 2024/4/29 13:41 + */ +@Data +public class WordEvaluationFactor { + + private String factorName; + private Integer questionNum; + private BigDecimal totalScore; + private BigDecimal score; + private Integer status; + private String evalDesc; + private String evalPropose; + +} diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/word/WordFactor.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/word/WordFactor.java new file mode 100644 index 0000000..e6d2773 --- /dev/null +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/word/WordFactor.java @@ -0,0 +1,24 @@ +package org.dromara.scale.domain.word; + +import lombok.Data; + +/** + *

TODO

+ * + * @author cjw + * @version V1.0.0 + * @date 2024/5/7 14:33 + */ +@Data +public class WordFactor { + /** + * 因子名称 + */ + private String factorName; + /** + * 问题描述 + */ + private String evalDesc; + + private double score; +} diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/mapper/StatisticMapper.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/mapper/StatisticMapper.java index d91c746..4924bb6 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/mapper/StatisticMapper.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/mapper/StatisticMapper.java @@ -23,4 +23,11 @@ public interface StatisticMapper { List selectStatisticWarn(@Param("batchNo") Long batchNo, @Param("scaleId") Long scaleId); List selectStatisticFactor(@Param("batchNo") Long batchNo, @Param("scaleId") Long scaleId); + + StatisticWarnVo selectStatisticWarn4All(); + + int selectUserNum(); + int selectInterveneNum(); + + List selectScalePublishNum(); } 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 45b1f65..08f83c7 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 @@ -8,7 +8,7 @@ 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.SysScaleVo; -import org.dromara.scale.domain.vo.WordEvaluationAnswerVo; +import org.dromara.scale.domain.word.WordEvaluationFactor; import org.dromara.scale.domain.vo.SysEvaluationRecordVo; import org.dromara.scale.domain.vo.SysScalePublishVo; @@ -29,7 +29,7 @@ public interface SysEvaluationRecordMapper extends BaseMapperPlus selectRecordVoPage(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); - List selectAnswer4Word(Long recordId); + List selectEvaluationFactor4Word(Long recordId); List selectUseByBatchNo(Long batchNo); diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/mapper/SysScaleFactorMapper.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/mapper/SysScaleFactorMapper.java index c63f13d..097e676 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/mapper/SysScaleFactorMapper.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/mapper/SysScaleFactorMapper.java @@ -13,5 +13,5 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; */ @Mapper public interface SysScaleFactorMapper extends BaseMapperPlus { - + double sumQusetionMaxScore(String questionIds); } diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/mapper/SysScaleMapper.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/mapper/SysScaleMapper.java index a5fa7f4..bea5977 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/mapper/SysScaleMapper.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/mapper/SysScaleMapper.java @@ -17,8 +17,7 @@ import java.util.List; public interface SysScaleMapper extends BaseMapperPlus { List findSysScaleByIds(String scaleIds); - - void updateEvalNums(Long scaleId); - void updatePublishNums(Long scaleId); + void addPublishNums(Long scaleId); + void subPublishNums(Long scaleId); } diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/IStatisticService.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/IStatisticService.java index d4b9936..542c55e 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/IStatisticService.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/IStatisticService.java @@ -10,16 +10,26 @@ import java.util.List; public interface IStatisticService { - List getComplete4All(BaseQueryBo query); + List getComplete4Grade(BaseQueryBo query); List getComplete4Class(BaseQueryBo query); - List getWarn4All(BaseQueryBo query); + List getWarn4Grade(BaseQueryBo query); List getWarn4Class(BaseQueryBo query); - List getFactor4All(BaseQueryBo query); + List getFactor4Grade(BaseQueryBo query); List getFactor4Class(BaseQueryBo query); + + StatisticWarnVo getWarn4All(); + + int getUserNum(); + + int getInterveneNum(); + + List getByMonth(BaseQueryBo query); + + List getScalePublishNum(); } diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/StatisticServiceImpl.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/StatisticServiceImpl.java index 1b215d7..c7d47d5 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/StatisticServiceImpl.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/StatisticServiceImpl.java @@ -30,7 +30,7 @@ public class StatisticServiceImpl implements IStatisticService { private final StatisticMapper statisticMapper; @Override - public List getComplete4All(BaseQueryBo query) { + public List getComplete4Grade(BaseQueryBo query) { Long batchNo = query.getBatchNo(); Long scaleId = query.getScaleId(); List statisticNumVos = statisticMapper.selectCompleteAvaluation(batchNo, scaleId); @@ -66,7 +66,7 @@ public class StatisticServiceImpl implements IStatisticService { } @Override - public List getWarn4All(BaseQueryBo query) { + public List getWarn4Grade(BaseQueryBo query) { Long batchNo = query.getBatchNo(); Long scaleId = query.getScaleId(); List statisticWarnVos = statisticMapper.selectStatisticWarn(batchNo, scaleId); @@ -108,7 +108,7 @@ public class StatisticServiceImpl implements IStatisticService { } @Override - public List getFactor4All(BaseQueryBo query) { + public List getFactor4Grade(BaseQueryBo query) { Map> collect = processFactorData(query); Set keys = collect.keySet(); List data = new ArrayList<>(); @@ -159,4 +159,30 @@ public class StatisticServiceImpl implements IStatisticService { List data = statisticMapper.selectStatisticFactor(query.getBatchNo(), query.getScaleId()); return data.stream().collect(Collectors.groupingBy(StatisticFactorVo::getFactorName)); } + + @Override + public StatisticWarnVo getWarn4All() { + return statisticMapper.selectStatisticWarn4All(); + } + + @Override + public int getUserNum() { + return statisticMapper.selectUserNum(); + } + + @Override + public int getInterveneNum() { + return statisticMapper.selectInterveneNum(); + } + + @Override + public List getByMonth(BaseQueryBo query) { + //todo + return null; + } + + @Override + public List getScalePublishNum() { + return statisticMapper.selectScalePublishNum(); + } } 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 08cfaaa..9a6ad2e 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 @@ -4,23 +4,21 @@ 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.RowRenderData; -import com.deepoove.poi.data.Rows; -import com.deepoove.poi.data.TableRenderData; -import com.deepoove.poi.data.Tables; +import com.deepoove.poi.data.*; import com.deepoove.poi.data.style.BorderStyle; import lombok.RequiredArgsConstructor; import org.apache.poi.xwpf.usermodel.XWPFTable; +import org.dromara.common.core.utils.DateUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.scale.domain.EvaluationEecordWordData; import org.dromara.scale.domain.SysEvaluationRecord; 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.vo.TimeAxisVo; -import org.dromara.scale.domain.vo.WordEvaluationAnswerVo; +import org.dromara.scale.domain.word.EvaluationEecordWordData; +import org.dromara.scale.domain.word.WordEvaluationFactor; +import org.dromara.scale.domain.word.WordFactor; import org.dromara.scale.mapper.SysEvaluationRecordMapper; import org.dromara.scale.mapper.SysInterveneRecordMapper; import org.dromara.scale.mapper.SysScaleMapper; @@ -32,6 +30,8 @@ import org.springframework.stereotype.Service; import java.io.IOException; import java.rmi.ServerException; +import java.util.Date; +import java.util.LinkedList; import java.util.List; /** @@ -106,37 +106,69 @@ public class SysEvaluationRecordServiceImpl implements ISysEvaluationRecordServi throw new ServerException("量表ID不能为空"); } EvaluationEecordWordData wordData = new EvaluationEecordWordData(); + + SysEvaluationRecord sysEvaluationRecord = baseMapper.selectById(recordId); + Date createTime = sysEvaluationRecord.getCreateTime(); + Date updateTime = sysEvaluationRecord.getUpdateTime(); + wordData.setCreateTime(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, createTime)); + wordData.setUseTime(DateUtils.getDatePoor(createTime,updateTime)); + SysUserVo user = userMapper.selectUserById(userId); wordData.setNickName(user.getNickName()); wordData.setDeptName(user.getDept().getDeptName()); wordData.setSex("0".equals(user.getSex()) ? "男" : "女"); + SysScaleVo scale = scaleMapper.selectVoById(scaleId); wordData.setScaleName(scale.getScaleName()); wordData.setScaleDetails(scale.getScaleDetails()); - List answerVos = baseMapper.selectAnswer4Word(recordId); + + List answerVos = baseMapper.selectEvaluationFactor4Word(recordId); BorderStyle borderStyle = new BorderStyle(); borderStyle.setColor("A6A6A6"); borderStyle.setSize(4); borderStyle.setType(XWPFTable.XWPFBorderType.SINGLE); - RowRenderData factorHeader = Rows.of("因子项", "题目", "选项", "得分").bgColor("F2F2F2").center() + RowRenderData factorHeader = Rows.of("名称", "包含题目", "原始分", "得分").bgColor("F2F2F2").center() .textColor("7F7f7F").textFontFamily("Hei").textFontSize(9).create(); TableRenderData factorTable = Tables.ofA4MediumWidth().addRow(factorHeader).border(borderStyle).center().create(); - for (WordEvaluationAnswerVo answerVo : answerVos) { - RowRenderData one = Rows.of(answerVo.getFactorName(), answerVo.getQuestionContent(), - answerVo.getAnswerOption(), answerVo.getScore().toString()).center().create(); + //一并处理数据 + int size = answerVos.size(); + LinkedList factors = new LinkedList<>(); + String[] strings = new String[size]; + Double[] doubles = new Double[size]; + StringBuilder stringBuilder = new StringBuilder(); + for (int i = 0; i < size; i++) { + WordEvaluationFactor answerVo = answerVos.get(i); + double score = answerVo.getScore().doubleValue(); + //处理因子得分表格 + RowRenderData one = Rows.of(answerVo.getFactorName(), answerVo.getQuestionNum().toString(), + answerVo.getTotalScore().toString(), answerVo.getScore().toString()).center().create(); factorTable.addRow(one); + //处理测评结果 + WordFactor wordFactor = new WordFactor(); + wordFactor.setFactorName(answerVo.getFactorName()); + wordFactor.setScore(score); + wordFactor.setEvalDesc(answerVo.getEvalDesc()); + //判断激活,放到首位并添加建议 + if (answerVo.getStatus() == 1) { + factors.addFirst(wordFactor); + stringBuilder.append(answerVo.getEvalPropose()).append("\n"); + } else { + factors.add(wordFactor); + } + //雷达图使用 + strings[i] = answerVo.getFactorName(); + doubles[i] = score; } + wordData.setFactor(factorTable); - List timeAxisVos = interveneMapper.selectTimeList(userId); - RowRenderData interveneHeader = Rows.of("干预标题", "干预时间", "诊断详情").bgColor("F2F2F2").center() - .textColor("7F7f7F").textFontFamily("Hei").textFontSize(9).create(); - TableRenderData interveneTable = Tables.ofA4MediumWidth().addRow(interveneHeader).border(borderStyle).center().create(); - for (TimeAxisVo timeAxisVo : timeAxisVos) { - RowRenderData one = Rows.of(timeAxisVo.getName(), timeAxisVo.getTime(), - timeAxisVo.getNote()).center().create(); - interveneTable.addRow(one); - } - wordData.setIntervene(interveneTable); + wordData.setFactors(factors); + //处理雷达图 + ChartMultiSeriesRenderData chart = Charts + .ofMultiSeries(scale.getScaleName(), strings) + .addSeries("因子项", doubles) + .create(); + wordData.setBarChart(chart); + wordData.setPropose(stringBuilder.toString()); ClassPathResource classPathResource = new ClassPathResource(resource); return XWPFTemplate.compile(classPathResource.getInputStream()).render(wordData); } diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysScaleFactorServiceImpl.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysScaleFactorServiceImpl.java index 6f732b9..7d6f46c 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysScaleFactorServiceImpl.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysScaleFactorServiceImpl.java @@ -27,6 +27,7 @@ import org.springframework.cache.annotation.Caching; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; @@ -104,12 +105,12 @@ public class SysScaleFactorServiceImpl implements ISysScaleFactorService { @Override public Boolean insertByBo(SysScaleFactorBo bo) { SysScaleFactor add = MapstructUtils.convert(bo, SysScaleFactor.class); + List questionIds = bo.getQuestionIds(); + int questionNum = questionIds.size(); validEntityBeforeSave(add); -// if (CollUtil.isNotEmpty(bo.getQuestionIds())) { -// String questionIds = bo.getQuestionIds().stream().map(Object::toString) -// .collect(Collectors.joining(StringUtils.SEPARATOR)); -// -// } + double maxScore = baseMapper.sumQusetionMaxScore(add.getQuestionIds()); + add.setQuestionNum(questionNum); + add.setQuestionScore(BigDecimal.valueOf(maxScore)); if (CollUtil.isNotEmpty(bo.getFactorRangeList())) { insertFactorRange(bo); } @@ -130,17 +131,6 @@ public class SysScaleFactorServiceImpl implements ISysScaleFactorService { scaleFactorRangeMapper.insertBatch(list, 100); } -// private void updateQuestionFactor(SysScaleFactorBo bo) { -// List list = new ArrayList<>(bo.getQuestionIds().size()); -// for (Long questionId : bo.getQuestionIds()) { -// SysScaleQuestion question = new SysScaleQuestion(); -// question.setQuestionId(questionId); -// question.setFactorId(bo.getFactorId()); -// question.setFactorName(bo.getFactorName()); -// list.add(question); -// } -// scaleQuestionMapper.updateBatchById(list, 100); -// } /** * 修改测评因子 @@ -153,12 +143,12 @@ public class SysScaleFactorServiceImpl implements ISysScaleFactorService { @Override public Boolean updateByBo(SysScaleFactorBo bo) { SysScaleFactor update = MapstructUtils.convert(bo, SysScaleFactor.class); + List questionIds = bo.getQuestionIds(); + int questionNum = questionIds.size(); validEntityBeforeSave(update); - -// if (CollUtil.isNotEmpty(bo.getQuestionIds())) { -// updateQuestionFactor(bo); -// } - + double maxScore = baseMapper.sumQusetionMaxScore(update.getQuestionIds()); + update.setQuestionNum(questionNum); + update.setQuestionScore(BigDecimal.valueOf(maxScore)); if (CollUtil.isNotEmpty(bo.getFactorRangeList())) { scaleFactorRangeMapper.delete(Wrappers.lambdaQuery(SysScaleFactorRange.class).eq(SysScaleFactorRange::getFactorId, bo.getFactorId())); insertFactorRange(bo); @@ -200,6 +190,7 @@ public class SysScaleFactorServiceImpl implements ISysScaleFactorService { } return scaleFactorVos; } + @Cacheable(cacheNames = CacheNames.MAP_SCALE_QUESTION, key = "#scaleId") public Map> getQuestionMapByFactor(Long scaleId) { List factorVos = baseMapper.selectVoList(new LambdaQueryWrapper() 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 d4242b8..17084b8 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 @@ -110,6 +110,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(); @@ -125,7 +126,7 @@ public class SysScalePublishServiceImpl implements ISysScalePublishService { List list = scaleMapper.findSysScaleByIds(scaleIds); add.setScaleNames(list.stream().map(SysScaleVo::getScaleName).collect(Collectors.joining(StrUtil.COMMA))); for (String scaleId : bo.getScaleIds()) { - scaleMapper.updatePublishNums(Long.parseLong(scaleId)); + scaleMapper.addPublishNums(Long.parseLong(scaleId)); } //处理用户 List userList; @@ -151,7 +152,6 @@ public class SysScalePublishServiceImpl implements ISysScalePublishService { //预处理量测记录,方便后续统计与查询 List scaleList = bo.getScaleIds(); insertRecordBatch(batchNo, scaleList, userList); - boolean flag = baseMapper.insert(add) > 0; if (flag) { bo.setBatchNo(add.getBatchNo()); } @@ -169,7 +169,8 @@ public class SysScalePublishServiceImpl implements ISysScalePublishService { record.setDeptId(user.getDeptId()); record.setBatchNo(batchNo); record.setScaleId(Long.parseLong(scaleId)); - record.setStatus(StatusEnum.DISABLED.getValue()); + //初始化字段 + record.setStatus(-1); recordList.add(record); } } @@ -236,6 +237,10 @@ public class SysScalePublishServiceImpl implements ISysScalePublishService { if (ObjectUtil.isNotEmpty(sysEvaluationRecordVos)) { throw new ServiceException("此发布下已有测评,无法删除"); } + SysScalePublishVo sysScalePublishVo = baseMapper.selectVoById(batchNo); + for (String scaleId : sysScalePublishVo.getScaleIds()) { + scaleMapper.subPublishNums(Long.parseLong(scaleId)); + } recordMapper.deleteByBatchNo(batchNo); return baseMapper.deleteById(batchNo) > 0; } 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 ac01d52..0fc649d 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 @@ -116,7 +116,7 @@ public class WebServiceImpl implements IWebService { } SysEvaluationRecord update = new SysEvaluationRecord(); update.setRecordId(recordId); - //以开始时间判断记录是否开始答题 + update.setStatus(StatusEnum.DISABLED.getValue()); update.setCreateTime(new Date()); return recordMapper.updateById(update) > 0; } @@ -167,6 +167,7 @@ public class WebServiceImpl implements IWebService { SysEvaluationRecord update = new SysEvaluationRecord(); update.setRecordId(recordId); update.setStatus(StatusEnum.IN_USE.getValue()); + update.setUpdateTime(new Date()); recordMapper.updateById(update); Integer riskLevel = -1; 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 7293449..571e150 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 @@ -51,4 +51,34 @@ and er.status = 1 and ec.status = 1 + + + + + + + + + + diff --git a/ruoyi-modules/rouyi-scale/src/main/resources/mapper/scale/SysEvaluationRecordMapper.xml b/ruoyi-modules/rouyi-scale/src/main/resources/mapper/scale/SysEvaluationRecordMapper.xml index 39bb70e..80a5bd0 100644 --- a/ruoyi-modules/rouyi-scale/src/main/resources/mapper/scale/SysEvaluationRecordMapper.xml +++ b/ruoyi-modules/rouyi-scale/src/main/resources/mapper/scale/SysEvaluationRecordMapper.xml @@ -32,17 +32,18 @@ ${ew.getCustomSqlSegment} - + select sf.factor_name as `factorName`, + sf.question_num as `questionNum`, + sf.question_score as `totalScore`, + ec.score as `score`, + ec.status as `status`, + sfr.eval_desc as `evalDesc`, + sfr.eval_propose as `evalPropose` + from sys_evaluation_conclusion ec + left join sys_scale_factor sf ON sf.factor_id = ec.factor_id + left join sys_scale_factor_range sfr on sfr.range_id = ec.factor_range_id + where ec.record_id = #{recordId} + SELECT sum(t.score) + FROM (SELECT MAX(score) AS score + FROM sys_scale_answer + WHERE FIND_IN_SET(question_id, #{questionIds}) + GROUP BY question_id) as t + diff --git a/ruoyi-modules/rouyi-scale/src/main/resources/mapper/scale/SysScaleMapper.xml b/ruoyi-modules/rouyi-scale/src/main/resources/mapper/scale/SysScaleMapper.xml index 9ffce8f..bdb5e4f 100644 --- a/ruoyi-modules/rouyi-scale/src/main/resources/mapper/scale/SysScaleMapper.xml +++ b/ruoyi-modules/rouyi-scale/src/main/resources/mapper/scale/SysScaleMapper.xml @@ -9,16 +9,15 @@ WHERE FIND_IN_SET(t.scale_id, #{scaleIds}) - - - update sys_scale - set eval_nums = eval_nums + 1 - where scale_id = #{scaleId} - - - + update sys_scale set publish_nums = publish_nums + 1 where scale_id = #{scaleId} + + diff --git a/ruoyi-modules/rouyi-scale/src/main/resources/word/personalTemplate.docx b/ruoyi-modules/rouyi-scale/src/main/resources/word/personalTemplate.docx index a8f14a2d1c3e13c516f19562a5a38890628c3cdf..4d93e2f21516b632426aabb6de810b455061f710 100644 GIT binary patch delta 17404 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 delta 6545 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 MxiO=v{S)VZ00+|*lK=n!