Browse Source

实现大屏统计接口,简单测试

sd
zhangye 3 years ago
parent
commit
4450c5af6e
  1. 4
      ht/src/main/java/com/ccsens/ht/bean/dto/StatisticsDto.java
  2. 15
      ht/src/main/java/com/ccsens/ht/bean/vo/StatisticsVo.java
  3. 36
      ht/src/main/java/com/ccsens/ht/persist/dao/StatisticsDao.java
  4. 167
      ht/src/main/java/com/ccsens/ht/service/StatisticsService.java
  5. 4
      ht/src/main/resources/application.yml
  6. 240
      ht/src/main/resources/mapper_dao/StatisticsDao.xml
  7. 2
      question/src/main/java/com/ccsens/question/api/FileController.java

4
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;
}
}

15
ht/src/main/java/com/ccsens/ht/bean/vo/StatisticsVo.java

@ -100,4 +100,19 @@ public class StatisticsVo {
@ApiModelProperty("分项信息")
private List<ReportCode> 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;
}
}

36
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<String> getReportSubCode(@Param("reportCode")String reportCode);
/**
* 根据医院id和报告单code查询各种类型的人数
* @param reportCode code
* @param hospitalId 医院id
* @param types 分数分类
* @return 返回各种类型的人数
*/
List<StatisticsVo.SundryNum> querySundryNumList(@Param("reportCode")String reportCode, @Param("hospitalId")Long hospitalId, @Param("types")List<Integer> types);
/**
* 根据医院id和子类id查找各种类型的人数
* @param hospitalId 医院id
* @param reportList 子类code
* @return 返回各种类型的人数
*/
List<StatisticsVo.SundryNum> querySundryNumListBySubentry(@Param("hospitalId")Long hospitalId, @Param("reportList")List<String> reportList);
/**
* 查找类型和分项各分数的人数
* @param hospitalId 医院id
* @param reportCode 类型code
* @param subentryCode 分项code
* @return 返回人数
*/
List<StatisticsVo.CodeAndSubentryNum> getCodeAndSubentryNums(@Param("hospitalId")Long hospitalId, @Param("reportCode")String reportCode, @Param("subentryCode")List<String> subentryCode);
}

167
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<String> 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<HtReport> reports = htReportDao.selectByExample(htReportExample);
if(CollectionUtil.isEmpty(reports)){
return null;
}
int totalScore = reports.get(0).getTotalScore();
//TODO 暂时将分数分为三个阶段
List<Integer> scoreTypes = new ArrayList<>();
int i = totalScore / 3;
if (i != 0) {
scoreTypes.add(i);
scoreTypes.add((totalScore - i));
}
scoreTypes.add(totalScore);
//根据类型和医院id查询各个类型分数的人数
List<StatisticsVo.SundryNum> sundryNumList = statisticsDao.querySundryNumList(report.getReportCode(),report.getHospitalId(),scoreTypes);
//封装数据
List<StatisticsVo.ChartManWoman> chartList = new ArrayList<>();
xAxis.forEach(ageType ->{
StatisticsVo.ChartManWoman chartManWoman = new StatisticsVo.ChartManWoman();
List<Integer> manList = new ArrayList<>();
List<Integer> 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<String> 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<String> 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<HtReport> reports = htReportDao.selectByExample(htReportExample);
if(CollectionUtil.isEmpty(reports)){
return null;
}
int totalScore = reports.get(0).getTotalScore();
//生成坐标
List<String> axis = new ArrayList<>();
for (int i = 0; i <= totalScore; i++) {
axis.add(i + "");
}
//查找该类型的所有子类
List<String> reportList = statisticsDao.getReportSubCode(report.getSubentryCode());
if(CollectionUtil.isEmpty(reportList)){
return null;
}
//通过医院code和子类查询所有类型的人数
List<StatisticsVo.SundryNum> sundryNumList = statisticsDao.querySundryNumListBySubentry(report.getHospitalId(),reportList);
//封装数据
List<StatisticsVo.ChartManWoman> chartList = new ArrayList<>();
axis.forEach(scoreType ->{
StatisticsVo.ChartManWoman chartManWoman = new StatisticsVo.ChartManWoman();
List<Integer> manList = new ArrayList<>();
List<Integer> 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<HtReport> 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<HtReport> subentryReport = htReportDao.selectByExample(subentryExample);
if(CollectionUtil.isNotEmpty(subentryReport)){
scatterDiagram.setMMax(subentryReport.get(0).getTotalScore());
}
//查找子项的下属分类(包括自己)
List<String> reportList = statisticsDao.getReportSubCode(report.getSubentryCode());
if(CollectionUtil.isEmpty(reportList)){
return null;
}
//查找各个分数的人数
List<StatisticsVo.CodeAndSubentryNum> codeAndSubentryNums = statisticsDao.getCodeAndSubentryNums(report.getHospitalId(),report.getReportCode(),reportList);
//封装数据
List<List<Integer>> lists = new ArrayList<>();
codeAndSubentryNums.forEach(codeAndSubentryNum -> {
List<Integer> l = new ArrayList<>();
l.add(codeAndSubentryNum.getSubentryScore());
l.add(codeAndSubentryNum.getCodeScore());
l.add(codeAndSubentryNum.getNum());
lists.add(l);
});
scatterDiagram.setList(lists);
return scatterDiagram;
}
}

4
ht/src/main/resources/application.yml

@ -1,5 +1,5 @@
spring:
profiles:
active: dev
include: common, util-dev
active: test
include: common, util-test

240
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
<if test="hospitalId != null">
and p.id = #{hospitalId}
</if>
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
<if test="hospitalId != null">
and p.id = #{hospitalId}
</if>
and r.report_time >= #{beginOfMonth}
and r.report_time &lt;= #{endOfMonth}
and p.is_del = 0
@ -51,7 +55,9 @@
p.`name` = r.hospital
and r.complete_status = 1
AND r.show_status = 1
<if test="hospitalId != null">
and p.id = #{hospitalId}
</if>
and r.report_time >= #{beginOfDay}
and r.report_time &lt;= #{endOfDay}
and p.is_del = 0
@ -74,7 +80,9 @@
p.`name` = r.hospital
and r.complete_status = 1
AND r.show_status = 1
<if test="hospitalId != null">
and p.id = #{hospitalId}
</if>
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
<if test="hospitalId != null">
and p.id = #{hospitalId}
</if>
and p.is_del = 0
and r.is_del = 0
GROUP BY r.id
@ -117,12 +127,12 @@
</select>
<select id="getWithSex" resultType="com.ccsens.ht.bean.vo.StatisticsVo$AgeAndSex">
SELECT
MAX( CASE p.sex WHEN '女' THEN p.num ELSE 0 END ) as `woman`,
MAX( CASE p.sex WHEN '男' THEN p.num ELSE 0 END ) as `man`
MAX( CASE p.sex WHEN 0 THEN p.num ELSE 0 END ) as `woman`,
MAX( CASE p.sex WHEN 1 THEN p.num ELSE 0 END ) as `man`
FROM
(
SELECT
if(a.sex = 0, '女', '男') as sex,
a.sex,
count(a.id) as num
FROM
(
@ -138,7 +148,9 @@
and r.patient_id = pa.id
and r.complete_status = 1
AND r.show_status = 1
and p.id = #{hospitalId}
<if test="hospitalId != null">
and p.id = #{hospitalId}
</if>
and p.is_del = 0
and r.is_del = 0
and pa.is_del = 0
@ -159,7 +171,9 @@
and r.complete_status = 1
AND r.show_status = 1
and r.clinical_diagnosis != ''
and p.id = #{hospitalId}
<if test="hospitalId != null">
and p.id = #{hospitalId}
</if>
and p.is_del = 0
and r.is_del = 0
GROUP BY r.clinical_diagnosis
@ -220,4 +234,220 @@
and r.show_status = 1
and r.is_del = 0
</select>
<select id="getReportSubCode" resultType="java.lang.String">
SELECT
t.`code`
FROM
(
SELECT
t1.*,
IF
(
find_in_set( t1.parent_code, @pcode ) > 0,
@pcode := concat( @pcode, ',', t1.CODE ),
0
) AS ischild
FROM
( SELECT * FROM t_ht_report WHERE is_show = 1 AND is_del = 0 ORDER BY type, sort ) t1,
( SELECT @pcode := #{reportCode} ) t2
) t
WHERE
(ischild != '0' or code = #{reportCode})
and t.total_score > 0
</select>
<select id="querySundryNumList" resultType="com.ccsens.ht.bean.vo.StatisticsVo$SundryNum">
SELECT
a.ageType,
a.sex as sexType,
a.scoreType,
count(a.reportId) as num
FROM
(
SELECT
s.reportId,
s.sex,
<if test="types != null and types.size() > 0">
CASE 1
<foreach collection="types" item="t" separator=" ">
WHEN IF( s.score &lt;= #{t}, 1, 0 ) THEN #{t}
</foreach>
END as scoreType,
</if>
CASE 1
WHEN
IF( s.patient_age &lt;= 18, 1, 0 ) THEN '0~18'
WHEN
IF( s.patient_age &lt;= 44, 1, 0 ) THEN '19~44'
WHEN
IF( s.patient_age &lt;= 59, 1, 0 ) THEN '45~59'
WHEN
IF( s.patient_age &lt;= 74, 1, 0 ) THEN '60~74'
WHEN
IF( s.patient_age &lt;= 89, 1, 0 ) THEN '75~89' ELSE '90以上'
END as ageType
FROM
(
SELECT
r.id as reportId,
sum( t2.score ) AS score,
r.patient_age,
pa.sex
FROM
t_ht_question q,
t_ht_patient_score t2,
t_ht_patient_report r,
t_ht_patient pa,
t_ht_position p
WHERE
q.evaluation_code = #{reportCode}
AND q.id = t2.question_id
AND t2.patient_report_id = r.id
AND r.patient_id = pa.id
AND p.`name` = r.hospital
AND q.is_del = 0
AND t2.is_del = 0
AND r.is_del = 0
AND pa.is_del = 0
AND p.is_del = 0
AND t2.type IN ( 0, 2 )
and r.complete_status = 1
and r.show_status = 1
<if test="hospitalId != null">
and p.id = #{hospitalId}
</if>
GROUP BY
t2.patient_report_id
)s
)a
GROUP BY a.ageType,a.sex,a.scoreType
</select>
<select id="querySundryNumListBySubentry" resultType="com.ccsens.ht.bean.vo.StatisticsVo$SundryNum">
SELECT
a.ageType,
a.sex as sexType,
a.scoreType,
count(a.reportId) as num
FROM
(
SELECT
s.reportId,
s.sex,
round(s.score) as scoreType,
CASE 1
WHEN
IF( s.patient_age &lt;= 18, 1, 0 ) THEN '0~18'
WHEN
IF( s.patient_age &lt;= 44, 1, 0 ) THEN '19~44'
WHEN
IF( s.patient_age &lt;= 59, 1, 0 ) THEN '45~59'
WHEN
IF( s.patient_age &lt;= 74, 1, 0 ) THEN '60~74'
WHEN
IF( s.patient_age &lt;= 89, 1, 0 ) THEN '75~89' ELSE '90以上'
END as ageType
FROM
(
SELECT
r.id as reportId,
sum( t2.score ) AS score,
r.patient_age,
pa.sex
FROM
t_ht_question q,
t_ht_patient_score t2,
t_ht_patient_report r,
t_ht_patient pa,
t_ht_position p
WHERE
q.id = t2.question_id
AND q.parent_code in (
<foreach collection="reportList" item="code" separator=",">
#{code}
</foreach>
)
AND t2.patient_report_id = r.id
AND r.patient_id = pa.id
AND p.`name` = r.hospital
AND q.is_del = 0
AND t2.is_del = 0
AND r.is_del = 0
AND pa.is_del = 0
AND p.is_del = 0
AND t2.type IN ( 0, 2 )
and r.complete_status = 1
and r.show_status = 1
and p.id = #{hospitalId}
GROUP BY
t2.patient_report_id
)s
)a
GROUP BY a.scoreType,a.sex,a.ageType
</select>
<select id="getCodeAndSubentryNums" resultType="com.ccsens.ht.bean.vo.StatisticsVo$CodeAndSubentryNum">
SELECT
a.score1 as codeScore,
a.score2 as subentryScore,
count(a.reportId) as num
FROM
(
SELECT
r.id as reportId,
round(t1.score) as score1,
round(t2.score) as score2
FROM
(
SELECT
s.patient_report_id as reportId,
sum( s.score ) AS score
FROM
t_ht_question q,
t_ht_patient_score s
WHERE
q.evaluation_code = #{reportCode}
AND q.id = s.question_id
AND q.is_del = 0
AND s.is_del = 0
AND s.type IN ( 0, 2 )
GROUP BY
s.patient_report_id
)t1,
(
SELECT
s.patient_report_id as reportId,
sum( s.score ) AS score
FROM
t_ht_question q,
t_ht_patient_score s
WHERE
q.parent_code in (
<foreach collection="subentryCode" item="code" separator=",">
#{code}
</foreach>
)
AND
q.id = s.question_id
AND q.is_del = 0
AND s.is_del = 0
AND s.type IN ( 0, 2 )
GROUP BY
s.patient_report_id
)t2,
t_ht_patient_report r,
t_ht_position p
WHERE
t1.reportId = t2.reportId
and t2.reportId = r.id
AND p.`name` = r.hospital
AND r.is_del = 0
AND p.is_del = 0
and r.complete_status = 1
and r.show_status = 1
and p.id = #{hospitalId}
)a
GROUP BY a.score1,a.score2
</select>
</mapper>

2
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<FileVo.Save> saveFile(@RequestBody @ApiParam @Valid QueryDto<FileDto.Save> 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);

Loading…
Cancel
Save