From 4450c5af6eaa2196d8c028251590d961a1532394 Mon Sep 17 00:00:00 2001 From: zhangye <654600784@qq.com> Date: Sun, 1 May 2022 20:59:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=A4=A7=E5=B1=8F=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E6=8E=A5=E5=8F=A3=EF=BC=8C=E7=AE=80=E5=8D=95=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ccsens/ht/bean/dto/StatisticsDto.java | 4 +- .../com/ccsens/ht/bean/vo/StatisticsVo.java | 15 ++ .../ccsens/ht/persist/dao/StatisticsDao.java | 36 ++- .../ccsens/ht/service/StatisticsService.java | 167 +++++++++++- ht/src/main/resources/application.yml | 4 +- .../resources/mapper_dao/StatisticsDao.xml | 240 +++++++++++++++++- .../ccsens/question/api/FileController.java | 2 +- 7 files changed, 454 insertions(+), 14 deletions(-) diff --git a/ht/src/main/java/com/ccsens/ht/bean/dto/StatisticsDto.java b/ht/src/main/java/com/ccsens/ht/bean/dto/StatisticsDto.java index 5a8b4be9..f42d29bd 100644 --- a/ht/src/main/java/com/ccsens/ht/bean/dto/StatisticsDto.java +++ b/ht/src/main/java/com/ccsens/ht/bean/dto/StatisticsDto.java @@ -20,8 +20,8 @@ public class StatisticsDto { @ApiModelProperty("医院id") private Long hospitalId; @ApiModelProperty("报告单类型code") - private Long reportCode; + private String reportCode; @ApiModelProperty("报告单分项code") - private Long subentryCode; + private String subentryCode; } } diff --git a/ht/src/main/java/com/ccsens/ht/bean/vo/StatisticsVo.java b/ht/src/main/java/com/ccsens/ht/bean/vo/StatisticsVo.java index 0f917911..5c6b2085 100644 --- a/ht/src/main/java/com/ccsens/ht/bean/vo/StatisticsVo.java +++ b/ht/src/main/java/com/ccsens/ht/bean/vo/StatisticsVo.java @@ -100,4 +100,19 @@ public class StatisticsVo { @ApiModelProperty("分项信息") private List subentryList; } + + @Data + public static class SundryNum{ + private String ageType; + private int sexType; + private String scoreType; + private int num; + } + + @Data + public static class CodeAndSubentryNum{ + private int codeScore; + private int subentryScore; + private int num; + } } diff --git a/ht/src/main/java/com/ccsens/ht/persist/dao/StatisticsDao.java b/ht/src/main/java/com/ccsens/ht/persist/dao/StatisticsDao.java index 871caa6b..3dd49fc6 100644 --- a/ht/src/main/java/com/ccsens/ht/persist/dao/StatisticsDao.java +++ b/ht/src/main/java/com/ccsens/ht/persist/dao/StatisticsDao.java @@ -1,5 +1,6 @@ package com.ccsens.ht.persist.dao; +import com.ccsens.ht.bean.po.HtReport; import com.ccsens.ht.bean.vo.StatisticsVo; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; @@ -21,7 +22,7 @@ public interface StatisticsDao { * @param endOfDay 当天结束时间 * @return 返回总数 本月数量 当天数量 */ - StatisticsVo.Realtime getTotalNum(@Param("hospitalId") long hospitalId, @Param("beginOfMonth") long beginOfMonth,@Param("endOfMonth") long endOfMonth,@Param("beginOfDay") long beginOfDay,@Param("endOfDay") long endOfDay); + StatisticsVo.Realtime getTotalNum(@Param("hospitalId") Long hospitalId, @Param("beginOfMonth") long beginOfMonth,@Param("endOfMonth") long endOfMonth,@Param("beginOfDay") long beginOfDay,@Param("endOfDay") long endOfDay); /** * 查找实时数据 @@ -63,4 +64,37 @@ public interface StatisticsDao { * @return 返回医院所在省份的数据 */ StatisticsVo.AreaDistribution hospitalProvince(@Param("hospitalId")Long hospitalId); + + /** + * 通过code查找测评类型的所有子类 + * @param reportCode code + * @return 返回该类型的满分 + */ + List getReportSubCode(@Param("reportCode")String reportCode); + + /** + * 根据医院id和报告单code查询各种类型的人数 + * @param reportCode code + * @param hospitalId 医院id + * @param types 分数分类 + * @return 返回各种类型的人数 + */ + List querySundryNumList(@Param("reportCode")String reportCode, @Param("hospitalId")Long hospitalId, @Param("types")List types); + + /** + * 根据医院id和子类id查找各种类型的人数 + * @param hospitalId 医院id + * @param reportList 子类code + * @return 返回各种类型的人数 + */ + List querySundryNumListBySubentry(@Param("hospitalId")Long hospitalId, @Param("reportList")List reportList); + + /** + * 查找类型和分项各分数的人数 + * @param hospitalId 医院id + * @param reportCode 类型code + * @param subentryCode 分项code + * @return 返回人数 + */ + List getCodeAndSubentryNums(@Param("hospitalId")Long hospitalId, @Param("reportCode")String reportCode, @Param("subentryCode")List subentryCode); } diff --git a/ht/src/main/java/com/ccsens/ht/service/StatisticsService.java b/ht/src/main/java/com/ccsens/ht/service/StatisticsService.java index 9ce6624e..f726afdc 100644 --- a/ht/src/main/java/com/ccsens/ht/service/StatisticsService.java +++ b/ht/src/main/java/com/ccsens/ht/service/StatisticsService.java @@ -3,9 +3,12 @@ package com.ccsens.ht.service; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.ccsens.ht.bean.dto.StatisticsDto; import com.ccsens.ht.bean.po.HtPosition; import com.ccsens.ht.bean.po.HtPositionExample; +import com.ccsens.ht.bean.po.HtReport; +import com.ccsens.ht.bean.po.HtReportExample; import com.ccsens.ht.bean.vo.PositionVo; import com.ccsens.ht.bean.vo.StatisticsVo; import com.ccsens.ht.persist.dao.HtPositionDao; @@ -23,6 +26,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; /** * @author 逗 @@ -109,16 +113,173 @@ public class StatisticsService implements IStatisticsService { @Override public StatisticsVo.ReportDistribution reportScore(StatisticsDto.Report report) { - return null; + if(StrUtil.isEmpty(report.getReportCode())){ + return null; + } + //生成横坐标(年龄分类 0~18未成年 19~44青年 45~59中年 60~74老人 75~89老年人 90以上长寿老年人) + List xAxis = new ArrayList<>(); + xAxis.add("0~18"); + xAxis.add("19~44"); + xAxis.add("45~59"); + xAxis.add("60~74"); + xAxis.add("75~89"); + xAxis.add("90以上"); + //查找该类型下的总分 + HtReportExample htReportExample = new HtReportExample(); + htReportExample.createCriteria().andCodeEqualTo(report.getReportCode()).andTotalScoreGreaterThan(0); + List reports = htReportDao.selectByExample(htReportExample); + if(CollectionUtil.isEmpty(reports)){ + return null; + } + int totalScore = reports.get(0).getTotalScore(); + //TODO 暂时将分数分为三个阶段 + List scoreTypes = new ArrayList<>(); + int i = totalScore / 3; + if (i != 0) { + scoreTypes.add(i); + scoreTypes.add((totalScore - i)); + } + scoreTypes.add(totalScore); + //根据类型和医院id查询各个类型分数的人数 + List sundryNumList = statisticsDao.querySundryNumList(report.getReportCode(),report.getHospitalId(),scoreTypes); + //封装数据 + List chartList = new ArrayList<>(); + xAxis.forEach(ageType ->{ + StatisticsVo.ChartManWoman chartManWoman = new StatisticsVo.ChartManWoman(); + List manList = new ArrayList<>(); + List womanList = new ArrayList<>(); + scoreTypes.forEach(scoreType -> { + int manNum = 0; + int womanNum = 0; + for (StatisticsVo.SundryNum sundryNum : sundryNumList) { + if(ageType.equals(sundryNum.getAgeType()) && scoreType.toString().equals(sundryNum.getScoreType())){ + if(sundryNum.getSexType() == 0){ + manNum = sundryNum.getNum(); + }else if(sundryNum.getSexType() == 1){ + womanNum = sundryNum.getNum(); + } + } + } + manList.add(manNum); + womanList.add(womanNum); + }); + chartManWoman.setManList(manList); + chartManWoman.setWomanList(womanList); + chartList.add(chartManWoman); + }); + //修改分数分类返回 + List types = new ArrayList<>(); + String type1 = "0~" + scoreTypes.get(0); + types.add(type1); + for (int j = 1; j < scoreTypes.size(); j++) { + int t = scoreTypes.get(j); + String type = (scoreTypes.get(j - 1) + 1) + "~" + t; + types.add(type); + } + //返回 + StatisticsVo.ReportDistribution reportDistribution = new StatisticsVo.ReportDistribution(); + reportDistribution.setTypes(types); + reportDistribution.setXAxis(xAxis); + reportDistribution.setChartList(chartList); + return reportDistribution; } @Override public StatisticsVo.ReportDistribution subentryScore(StatisticsDto.Report report) { - return null; + //生成年龄类型(年龄分类 0~18未成年 19~44青年 45~59中年 60~74老人 75~89老年人 90以上长寿老年人) + List types = new ArrayList<>(); + types.add("0~18"); + types.add("19~44"); + types.add("45~59"); + types.add("60~74"); + types.add("75~89"); + types.add("90以上"); + //查找该类型下的总分 + HtReportExample htReportExample = new HtReportExample(); + htReportExample.createCriteria().andCodeEqualTo(report.getSubentryCode()).andTotalScoreGreaterThan(0); + List reports = htReportDao.selectByExample(htReportExample); + if(CollectionUtil.isEmpty(reports)){ + return null; + } + int totalScore = reports.get(0).getTotalScore(); + //生成坐标 + List axis = new ArrayList<>(); + for (int i = 0; i <= totalScore; i++) { + axis.add(i + ""); + } + //查找该类型的所有子类 + List reportList = statisticsDao.getReportSubCode(report.getSubentryCode()); + if(CollectionUtil.isEmpty(reportList)){ + return null; + } + //通过医院code和子类查询所有类型的人数 + List sundryNumList = statisticsDao.querySundryNumListBySubentry(report.getHospitalId(),reportList); + //封装数据 + List chartList = new ArrayList<>(); + axis.forEach(scoreType ->{ + StatisticsVo.ChartManWoman chartManWoman = new StatisticsVo.ChartManWoman(); + List manList = new ArrayList<>(); + List womanList = new ArrayList<>(); + types.forEach(ageType -> { + int manNum = 0; + int womanNum = 0; + for (StatisticsVo.SundryNum sundryNum : sundryNumList) { + if(ageType.equals(sundryNum.getAgeType()) && scoreType.equals(sundryNum.getScoreType())){ + if(sundryNum.getSexType() == 0){ + manNum = sundryNum.getNum(); + }else if(sundryNum.getSexType() == 1){ + womanNum = -sundryNum.getNum(); + } + } + } + manList.add(manNum); + womanList.add(womanNum); + }); + chartManWoman.setManList(manList); + chartManWoman.setWomanList(womanList); + chartList.add(chartManWoman); + }); + //返回 + StatisticsVo.ReportDistribution reportDistribution = new StatisticsVo.ReportDistribution(); + reportDistribution.setTypes(types); + reportDistribution.setXAxis(axis); + reportDistribution.setChartList(chartList); + return reportDistribution; } @Override public StatisticsVo.ReportScatterDiagram scatterDiagram(StatisticsDto.Report report) { - return null; + StatisticsVo.ReportScatterDiagram scatterDiagram = new StatisticsVo.ReportScatterDiagram(); + //查找类型和子项的分数 + HtReportExample codeExample = new HtReportExample(); + codeExample.createCriteria().andCodeEqualTo(report.getReportCode()).andTotalScoreGreaterThan(0); + List codeReport = htReportDao.selectByExample(codeExample); + if(CollectionUtil.isNotEmpty(codeReport)){ + scatterDiagram.setAllMax(codeReport.get(0).getTotalScore()); + } + HtReportExample subentryExample = new HtReportExample(); + subentryExample.createCriteria().andCodeEqualTo(report.getSubentryCode()).andTotalScoreGreaterThan(0); + List subentryReport = htReportDao.selectByExample(subentryExample); + if(CollectionUtil.isNotEmpty(subentryReport)){ + scatterDiagram.setMMax(subentryReport.get(0).getTotalScore()); + } + //查找子项的下属分类(包括自己) + List reportList = statisticsDao.getReportSubCode(report.getSubentryCode()); + if(CollectionUtil.isEmpty(reportList)){ + return null; + } + //查找各个分数的人数 + List codeAndSubentryNums = statisticsDao.getCodeAndSubentryNums(report.getHospitalId(),report.getReportCode(),reportList); + //封装数据 + List> lists = new ArrayList<>(); + codeAndSubentryNums.forEach(codeAndSubentryNum -> { + List l = new ArrayList<>(); + l.add(codeAndSubentryNum.getSubentryScore()); + l.add(codeAndSubentryNum.getCodeScore()); + l.add(codeAndSubentryNum.getNum()); + lists.add(l); + }); + scatterDiagram.setList(lists); + return scatterDiagram; } } diff --git a/ht/src/main/resources/application.yml b/ht/src/main/resources/application.yml index 4ecd13fd..f59084b0 100644 --- a/ht/src/main/resources/application.yml +++ b/ht/src/main/resources/application.yml @@ -1,5 +1,5 @@ spring: profiles: - active: dev - include: common, util-dev + active: test + include: common, util-test diff --git a/ht/src/main/resources/mapper_dao/StatisticsDao.xml b/ht/src/main/resources/mapper_dao/StatisticsDao.xml index f60428d1..932b0f92 100644 --- a/ht/src/main/resources/mapper_dao/StatisticsDao.xml +++ b/ht/src/main/resources/mapper_dao/StatisticsDao.xml @@ -21,7 +21,9 @@ p.`name` = r.hospital and r.complete_status = 1 AND r.show_status = 1 + and p.id = #{hospitalId} + and p.is_del = 0 and r.is_del = 0 UNION @@ -35,7 +37,9 @@ p.`name` = r.hospital and r.complete_status = 1 AND r.show_status = 1 + and p.id = #{hospitalId} + and r.report_time >= #{beginOfMonth} and r.report_time <= #{endOfMonth} and p.is_del = 0 @@ -51,7 +55,9 @@ p.`name` = r.hospital and r.complete_status = 1 AND r.show_status = 1 + and p.id = #{hospitalId} + and r.report_time >= #{beginOfDay} and r.report_time <= #{endOfDay} and p.is_del = 0 @@ -74,7 +80,9 @@ p.`name` = r.hospital and r.complete_status = 1 AND r.show_status = 1 + and p.id = #{hospitalId} + and p.is_del = 0 and r.is_del = 0 )a @@ -108,7 +116,9 @@ p.`name` = r.hospital and r.complete_status = 1 AND r.show_status = 1 + and p.id = #{hospitalId} + and p.is_del = 0 and r.is_del = 0 GROUP BY r.id @@ -117,12 +127,12 @@ + + + + + + + \ No newline at end of file diff --git a/question/src/main/java/com/ccsens/question/api/FileController.java b/question/src/main/java/com/ccsens/question/api/FileController.java index dbc5a081..4c3efdc1 100644 --- a/question/src/main/java/com/ccsens/question/api/FileController.java +++ b/question/src/main/java/com/ccsens/question/api/FileController.java @@ -33,7 +33,7 @@ public class FileController { }) @RequestMapping(value="/saveFile", method = RequestMethod.POST) public JsonResponse saveFile(@RequestBody @ApiParam @Valid QueryDto queryDto) throws Exception { - String path = Base64FileUtil.base64ToFile(queryDto.getParam().getBase64(), PropUtil.path, "/file/" + DateUtil.today() + "/"); + String path = Base64FileUtil.base64ToFile(queryDto.getParam().getBase64(), PropUtil.path, "/file/" + DateUtil.today() + "/",null); FileVo.Save save = new FileVo.Save(); save.setPath(PropUtil.imgDomain + path); return JsonResponse.newInstance().ok(save);