Browse Source

统计

master
zhizhi wu 4 years ago
parent
commit
be666c8bd0
  1. 28
      src/main/java/com/ccsens/carbasics/api/StatisticalController.java
  2. 18
      src/main/java/com/ccsens/carbasics/bean/dto/StatisticalDto.java
  3. 35
      src/main/java/com/ccsens/carbasics/bean/vo/StatisticalVo.java
  4. 39
      src/main/java/com/ccsens/carbasics/persist/dao/FirstAidRecordDao.java
  5. 24
      src/main/java/com/ccsens/carbasics/service/IStatisticalService.java
  6. 76
      src/main/java/com/ccsens/carbasics/service/StatisticalService.java
  7. 19
      src/main/java/com/ccsens/carbasics/util/Constant.java
  8. 77
      src/main/resources/mapper_dao/FirstAidRecordDao.xml

28
src/main/java/com/ccsens/carbasics/api/StatisticalController.java

@ -52,5 +52,31 @@ public class StatisticalController {
log.info("dnt结果:{}", common);
return JsonResponse.newInstance().ok(common);
}
@MustLogin
@ApiOperation(value = "dpt", notes = "dpt")
@RequestMapping(value = "/dpt", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse<StatisticalVo.Common> dpt(@ApiParam @Validated @RequestBody QueryDto<StatisticalDto.Time> params) {
log.info("dpt:{}", params);
StatisticalVo.Common common = statisticalService.dpt(params.getParam(), params.getUserId());
log.info("dpt结果:{}", common);
return JsonResponse.newInstance().ok(common);
}
@MustLogin
@ApiOperation(value = "统计列表", notes = "统计列表")
@RequestMapping(value = "/list", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse<StatisticalVo.CommonList> list(@ApiParam @Validated @RequestBody QueryDto<StatisticalDto.Time> params) {
log.info("统计列表:{}", params);
StatisticalVo.CommonList common = statisticalService.list(params.getParam(), params.getUserId());
log.info("统计列表结果:{}", common);
return JsonResponse.newInstance().ok(common);
}
@MustLogin
@ApiOperation(value = "分项-溶栓率", notes = "分项-溶栓率")
@RequestMapping(value = "/thrombosisRate", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse<StatisticalVo.Common> thrombosisRate(@ApiParam @Validated @RequestBody QueryDto<StatisticalDto.ThrombosisRate> params) {
log.info("统计列表:{}", params);
StatisticalVo.Common common = statisticalService.thrombosisRate(params.getParam(), params.getUserId());
log.info("统计列表结果:{}", common);
return JsonResponse.newInstance().ok(common);
}
}

18
src/main/java/com/ccsens/carbasics/bean/dto/StatisticalDto.java

@ -4,8 +4,6 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.Max;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
@ -29,5 +27,21 @@ public class StatisticalDto {
private Long endTime;
}
@Data
@ApiModel("分项-溶栓率-请求")
public static class ThrombosisRate {
@NotNull(message = "项目id不能为空")
@ApiModelProperty("项目ID")
private Long projectId;
@NotNull
@ApiModelProperty("开始时间")
private Long startTime;
@NotNull
@ApiModelProperty("开始时间")
private Long endTime;
@NotNull
@ApiModelProperty("统计类型 0:每小时 1:每天 2:每月")
private byte countType;
}
}

35
src/main/java/com/ccsens/carbasics/bean/vo/StatisticalVo.java

@ -21,7 +21,13 @@ public class StatisticalVo {
private Long total;
@ApiModelProperty("统计列表")
private List<Item> list;
}
@ApiModel("统计列表-返回")
@Data
public static class CommonList{
@ApiModelProperty("统计列表")
private List<Item> list;
}
@ApiModel("统计-每一项")
@ -64,5 +70,34 @@ public class StatisticalVo {
return one + two + three + four;
}
}
@ApiModel("分段统计Dpt")
@Data
public static class Dpt {
@ApiModelProperty("<=60")
private Long one;
@ApiModelProperty("<=90 && > 60")
private Long two;
@ApiModelProperty("<=120 && > 90")
private Long three;
@ApiModelProperty("<=180 && > 120")
private Long four;
@ApiModelProperty("<=240 && > 180")
private Long five;
@ApiModelProperty(">240")
private Long six;
public void fillZero() {
one = one == null ? 0 : one;
two = two == null ? 0 : two;
three = three == null ? 0 : three;
four = four == null ? 0 : four;
five = five == null ? 0 : five;
six = six == null ? 0 : six;
}
public long sum(){
fillZero();
return one + two + three + four + five + six;
}
}
}

39
src/main/java/com/ccsens/carbasics/persist/dao/FirstAidRecordDao.java

@ -41,4 +41,43 @@ public interface FirstAidRecordDao extends FirstAidRecordMapper {
* @return DNT
*/
StatisticalVo.Dnt countDnt(@Param("hospitalIds") List<Long> hospitalIds, @Param("startTime") Long startTime, @Param("endTime") Long endTime);
/**
* Dpt统计
* @param hospitalIds 医院ID
* @param startTime 开始时间
* @param endTime 结束时间
* @return Dpt
*/
StatisticalVo.Dpt countDpt(@Param("hospitalIds") List<Long> hospitalIds, @Param("startTime") Long startTime, @Param("endTime") Long endTime);
/**
* 统计中位数
* @param minuendCode 减数code ONT中位数 开始静脉溶栓时间-发病时间
* @param subtractionCode 被减数code ONT中位数 开始静脉溶栓时间 统计时间依据-发病时间
* @param hospitalIds 医院ID
* @param startTime 开始时间
* @param endTime 结束时间
* @return 统计指定的中位数
*/
Long countMedian(@Param("minuendCode") String minuendCode, @Param("subtractionCode") String subtractionCode, @Param("hospitalIds") List<Long> hospitalIds, @Param("startTime") Long startTime, @Param("endTime") Long endTime);
/**
* 统计累计收录病例数
* @param hospitalIds 医院ID
* @param startTime 开始时间
* @param endTime 结束时间
* @return 累计收录病例数
*/
Long countPatient(@Param("hospitalIds") List<Long> hospitalIds, @Param("startTime") Long startTime, @Param("endTime") Long endTime);
/**
* 分项-溶栓率
* @param countType 统计类型 0:每小时 1每天 2每月
* @param hospitalIds 医院ID
* @param startTime 开始时间
* @param endTime 结束时间
* @return 分项-溶栓率
*/
List<StatisticalVo.Item> countThrombosisRateDate(@Param("countType") byte countType, @Param("hospitalIds") List<Long> hospitalIds, @Param("startTime") Long startTime, @Param("endTime") Long endTime);
}

24
src/main/java/com/ccsens/carbasics/service/IStatisticalService.java

@ -24,4 +24,28 @@ public interface IStatisticalService {
* @return 统计
*/
StatisticalVo.Common dnt(StatisticalDto.Time param, Long userId);
/**
* DPT分段统计
* @param param 请求参数
* @param userId 用户ID
* @return 统计
*/
StatisticalVo.Common dpt(StatisticalDto.Time param, Long userId);
/**
* 统计列表溶栓例数机械再通例数脑出血例数时间窗患者例数DNT中位数DPT中位数累计收录病例数
* @param param 请求参数
* @param userId 用户ID
* @return 统计列表
*/
StatisticalVo.CommonList list(StatisticalDto.Time param, Long userId);
/**
* 统计分项溶栓率
* @param param 请求参数
* @param userId 用户ID
* @return 溶栓率列表
*/
StatisticalVo.Common thrombosisRate(StatisticalDto.ThrombosisRate param, Long userId);
}

76
src/main/java/com/ccsens/carbasics/service/StatisticalService.java

@ -16,6 +16,7 @@ import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@ -52,16 +53,18 @@ public class StatisticalService implements IStatisticalService {
Long ich = firstAidRecordDao.countSpecifyAnswer(Constant.Statistical.Ich.QUESTION_CODE,
Constant.Statistical.Ich.ANSWER, Constant.Statistical.Ich.TIME_CODE,
hospitalIds, param.getStartTime(), param.getEndTime());
StatisticalVo.Common common = new StatisticalVo.Common();
common.setTotal(timeWindowPatient);
List<StatisticalVo.Item> items = new ArrayList<>();
items.add(new StatisticalVo.Item(Constant.Statistical.Thrombosis.NAME, ""+thrombosis));
items.add(new StatisticalVo.Item(Constant.Statistical.Mechanical.NAME, ""+mechanical));
items.add(new StatisticalVo.Item(Constant.Statistical.Ich.NAME, ""+ich));
common.setList(items);
return common;
}
@Override
public StatisticalVo.Common dnt(StatisticalDto.Time param, Long userId) {
List<Long> hospitalIds = getHospitalIds(param.getProjectId());
@ -76,10 +79,81 @@ public class StatisticalService implements IStatisticalService {
items.add(new StatisticalVo.Item(Constant.Statistical.Dnt.TWO, ""+dnt.getTwo()));
items.add(new StatisticalVo.Item(Constant.Statistical.Dnt.THREE, ""+dnt.getThree()));
items.add(new StatisticalVo.Item(Constant.Statistical.Dnt.FOUR, ""+dnt.getFour()));
common.setList(items);
return common;
}
@Override
public StatisticalVo.Common dpt(StatisticalDto.Time param, Long userId) {
List<Long> hospitalIds = getHospitalIds(param.getProjectId());
StatisticalVo.Dpt dpt = firstAidRecordDao.countDpt(hospitalIds, param.getStartTime(), param.getEndTime());
if (dpt == null) {
dpt = new StatisticalVo.Dpt();
}
StatisticalVo.Common common = new StatisticalVo.Common();
common.setTotal(dpt.sum());
List<StatisticalVo.Item> items = new ArrayList<>();
items.add(new StatisticalVo.Item(Constant.Statistical.Dpt.ONE, ""+dpt.getOne()));
items.add(new StatisticalVo.Item(Constant.Statistical.Dpt.TWO, ""+dpt.getTwo()));
items.add(new StatisticalVo.Item(Constant.Statistical.Dpt.THREE, ""+dpt.getThree()));
items.add(new StatisticalVo.Item(Constant.Statistical.Dpt.FOUR, ""+dpt.getFour()));
items.add(new StatisticalVo.Item(Constant.Statistical.Dpt.FIVE, ""+dpt.getFour()));
items.add(new StatisticalVo.Item(Constant.Statistical.Dpt.SIX, ""+dpt.getFour()));
common.setList(items);
return common;
}
@Override
public StatisticalVo.CommonList list(StatisticalDto.Time param, Long userId) {
List<Long> hospitalIds = getHospitalIds(param.getProjectId());
List<StatisticalVo.Item> items = new ArrayList<>();
// 时间窗患者
Long timeWindowPatient = firstAidRecordDao.countTimeWindowPatient(hospitalIds, param.getStartTime(), param.getEndTime());
items.add(new StatisticalVo.Item(Constant.Statistical.TIME_WINDOW_NAME, timeWindowPatient + ""));
//统计溶栓例数(开始静脉溶栓时间)
Long thrombosis = firstAidRecordDao.countSpecifyAnswer(Constant.Statistical.Thrombosis.QUESTION_CODE,
Constant.Statistical.Thrombosis.ANSWER, Constant.Statistical.Thrombosis.TIME_CODE,
hospitalIds, param.getStartTime(), param.getEndTime());
items.add(new StatisticalVo.Item(Constant.Statistical.Thrombosis.NAME, ""+thrombosis));
// 溶栓率 四舍五入,保留两位 52.33%
items.add(new StatisticalVo.Item(Constant.Statistical.THROMBOSIS_RATE_NAME,
timeWindowPatient == null || timeWindowPatient == 0 ? "" :
new BigDecimal(thrombosis*100.00).divide(new BigDecimal(timeWindowPatient), 2, BigDecimal.ROUND_HALF_UP) + "%"));
//机械再通例数(穿刺完成时间)
Long mechanical = firstAidRecordDao.countSpecifyAnswer(Constant.Statistical.Mechanical.QUESTION_CODE,
Constant.Statistical.Mechanical.ANSWER, Constant.Statistical.Mechanical.TIME_CODE,
hospitalIds, param.getStartTime(), param.getEndTime());
items.add(new StatisticalVo.Item(Constant.Statistical.Mechanical.NAME, ""+mechanical));
//脑出血例数(手术开始时间)
Long ich = firstAidRecordDao.countSpecifyAnswer(Constant.Statistical.Ich.QUESTION_CODE,
Constant.Statistical.Ich.ANSWER, Constant.Statistical.Ich.TIME_CODE,
hospitalIds, param.getStartTime(), param.getEndTime());
items.add(new StatisticalVo.Item(Constant.Statistical.Ich.NAME, ""+ich));
// DNT中位数
Long dntMedian = firstAidRecordDao.countMedian(Constant.Statistical.Dnt.MINUEND_CODE, Constant.Statistical.Dnt.SUBTRACTION_CODE, hospitalIds, param.getStartTime(), param.getEndTime());
items.add(new StatisticalVo.Item(Constant.Statistical.DNT_MEDIAN_NAME, "" + dntMedian));
// DPT中位数
Long dptMedian = firstAidRecordDao.countMedian(Constant.Statistical.Dpt.MINUEND_CODE, Constant.Statistical.Dpt.SUBTRACTION_CODE, hospitalIds, param.getStartTime(), param.getEndTime());
items.add(new StatisticalVo.Item(Constant.Statistical.DPT_MEDIAN_NAME, "" + dptMedian));
// 累计收录病例数
Long total = firstAidRecordDao.countPatient(hospitalIds, param.getStartTime(), param.getEndTime());
items.add(new StatisticalVo.Item(Constant.Statistical.PATIENT_TOTAL_NAME, "" + total));
StatisticalVo.CommonList common = new StatisticalVo.CommonList();
items.add(new StatisticalVo.Item(Constant.Statistical.TIME_WINDOW_NAME, ""+timeWindowPatient));
common.setList(items);
return common;
}
@Override
public StatisticalVo.Common thrombosisRate(StatisticalDto.ThrombosisRate param, Long userId) {
List<Long> hospitalIds = getHospitalIds(param.getProjectId());
List<StatisticalVo.Item> items = firstAidRecordDao.countThrombosisRateDate(param.getCountType(), hospitalIds, param.getStartTime(), param.getEndTime());
StatisticalVo.Common common = new StatisticalVo.Common();
// TODO 补充items 计算求和
common.setTotal(0L);
common.setList(items);
return common;
}
/**

19
src/main/java/com/ccsens/carbasics/util/Constant.java

@ -17,6 +17,11 @@ public class Constant {
public static final class Statistical{
public final static String TIME_WINDOW_NAME = "时间窗患者数";
public final static String THROMBOSIS_RATE_NAME = "溶栓率";
public final static String DNT_MEDIAN_NAME = "DNT中位数";
public final static String DPT_MEDIAN_NAME = "DPT中位数";
public final static String PATIENT_TOTAL_NAME = "累计收录病例数";
/**跑道图-溶栓例数*/
public final static class Thrombosis {
public final static String NAME = "溶栓例数";
@ -51,6 +56,20 @@ public class Constant {
public final static String TWO = "30~45min";
public final static String THREE = "45~60min";
public final static String FOUR = ">60min";
public final static String MINUEND_CODE = "JMRSSJ";
public final static String SUBTRACTION_CODE = "JBXX-DYSJ";
}
/**Dpt分段统计*/
public final static class Dpt {
public final static String ONE = "<60min";
public final static String TWO = "60~90min";
public final static String THREE = "90~120min";
public final static String FOUR = "120~180min";
public final static String FIVE = "180~240min";
public final static String SIX = ">240min";
public final static String MINUEND_CODE = "JRZL-CCSJ";
public final static String SUBTRACTION_CODE = "JBXX-DYSJ";
}
}

77
src/main/resources/mapper_dao/FirstAidRecordDao.xml

@ -19,7 +19,10 @@
where a.id = r1.first_aid_id and a.id = r2.first_aid_id
and r1.question_code = #{questionCode} and r1.answer = #{answer}
and r2.question_code = #{timeCode} and r2.answer + 0 &gt;=#{startTime} and r2.answer + 0 &lt;=#{endTime}
and a.hospital_id in (0,1) and a.rec_status = 0 and r1.rec_status = 0
<foreach collection="hospitalIds" item="id" separator="," open="and a.hospital_id in (" close=")">
#{id}
</foreach>
and a.rec_status = 0 and r1.rec_status = 0
</select>
<select id="countDnt" resultType="com.ccsens.carbasics.bean.vo.StatisticalVo$Dnt">
select
@ -31,6 +34,76 @@
where a.id = r1.first_aid_id and r1.question_code = 'JMRSSJ'
and a.id = r2.first_aid_id and r2.question_code = 'JBXX-DYSJ'
and r1.answer + 0 &lt;= #{startTime} and r1.answer + 0 &gt;= #{endTime}
and a.hospital_id in (0,1) and a.rec_status = 0 and r1.rec_status = 0 and r2.rec_status = 0
<foreach collection="hospitalIds" item="id" separator="," open="and a.hospital_id in (" close=")">
#{id}
</foreach>
and a.rec_status = 0 and r1.rec_status = 0 and r2.rec_status = 0
</select>
<select id="countDpt" resultType="com.ccsens.carbasics.bean.vo.StatisticalVo$Dpt">
select
sum(if (ceil((r1.answer - r2.answer)/60000) &lt;= 60, 1, 0)) as one,
sum(if (ceil((r1.answer - r2.answer)/60000) &lt;= 90 and ceil((r1.answer - r2.answer)/60000) &gt; 60, 1, 0)) as two,
sum(if (ceil((r1.answer - r2.answer)/60000) &lt;= 120 and ceil((r1.answer - r2.answer)/60000) &gt; 90, 1, 0)) as three,
sum(if (ceil((r1.answer - r2.answer)/60000) &lt;= 180 and ceil((r1.answer - r2.answer)/60000) &gt; 120, 1, 0)) as four,
sum(if (ceil((r1.answer - r2.answer)/60000) &lt;= 240 and ceil((r1.answer - r2.answer)/60000) &gt; 180, 1, 0)) as five,
sum(if (ceil((r1.answer - r2.answer)/60000) > 240, 1, 0)) as six
from t_qcp_first_aid a, t_qcp_first_aid_record r1 , t_qcp_first_aid_record r2
where a.id = r1.first_aid_id and r1.question_code = 'JRZL-CCSJ'
and a.id = r2.first_aid_id and r2.question_code = 'JBXX-DYSJ'
and r1.answer + 0 &gt;= #{startTime} and r1.answer + 0 &lt;= #{endTime}
<foreach collection="hospitalIds" item="id" separator="," open="and a.hospital_id in (" close=")">
#{id}
</foreach>
and a.rec_status = 0 and r1.rec_status = 0 and r2.rec_status = 0
</select>
<select id="countMedian" resultType="java.lang.Long">
SELECT AVG(dd.val) as num
FROM (
SELECT d.val, @rownum:=@rownum+1 as `row_number`, @total_rows:=@rownum
FROM
(
select
ROUND((r1.answer - r2.answer)/60000, 2) as val
from t_qcp_first_aid a, t_qcp_first_aid_record r1 , t_qcp_first_aid_record r2
where a.id = r1.first_aid_id and r1.question_code = #{minuendCode}
and a.id = r2.first_aid_id and r2.question_code = #{subtractionCode}
and r1.answer + 0 &gt;= #{startTime} and r1.answer + 0 &lt;= #{endTime}
<foreach collection="hospitalIds" item="id" separator="," open="and a.hospital_id in (" close=")">
#{id}
</foreach>
and a.rec_status = 0 and r1.rec_status = 0 and r2.rec_status = 0
)d,
(SELECT @rownum:=0) r
ORDER BY d.val
) as dd
WHERE dd.row_number IN ( FLOOR((@total_rows+1)/2), FLOOR((@total_rows+2)/2) )
</select>
<select id="countPatient" resultType="java.lang.Long">
select count(*) from t_qcp_first_aid where
<foreach collection="hospitalIds" item="id" separator="," open="and a.hospital_id in (" close=")">
#{id}
</foreach>
and unix_timestamp(create_at)*1000 &gt;= #{startTime} and unix_timestamp(create_at)*1000 &lt;= #{endTime} and rec_status = 0
</select>
<select id="countThrombosisRateDate" resultType="com.ccsens.carbasics.bean.vo.StatisticalVo$Item">
select t1.date as name, round(t2.part * 100 / t1.total, 2) as value from
(select FROM_UNIXTIME(r2.answer/1000,'%Y-%m-%d') as date, count(*) as total from t_qcp_first_aid a, t_qcp_first_aid_record r1 , t_qcp_first_aid_record r2
where a.id = r1.first_aid_id and r1.question_code = 'JBXX-FBSJ'
and a.id = r2.first_aid_id and r1.question_code = 'JBXX-DYSJ'
and r2.answer + 0 &gt;= 0 and r2.answer + 0 &lt;= 0
and a.hospital_id in (0)
and r2.answer - r1.answer &lt; 6 * 60 * 60 * 1000
and a.rec_status = 0 and r1.rec_status = 0 and r2.rec_status = 0
group by FROM_UNIXTIME(r2.answer/1000,'%Y-%m-%d')) t1,
(select FROM_UNIXTIME(r2.answer/1000,'%Y-%m-%d') as date, count(a.id) as part from t_qcp_first_aid a, t_qcp_first_aid_record r1, t_qcp_first_aid_record r2
where a.id = r1.first_aid_id and a.id = r2.first_aid_id
and r1.question_code = 'ZLFA-JMRS' and r1.answer = '是'
and r2.question_code = 'JMRSSJ' and r2.answer + 0 &gt;= #{startTime} and r2.answer + 0 &lt;= #{endTime}
<foreach collection="hospitalIds" item="id" separator="," open="and a.hospital_id in (" close=")">
#{id}
</foreach>
and a.rec_status = 0 and r1.rec_status = 0
group by FROM_UNIXTIME(r2.answer/1000,'%Y-%m-%d'))t2
where t1.date = t2.date
</select>
</mapper>

Loading…
Cancel
Save