Browse Source

跑道图 + DNT

master
zhizhi wu 4 years ago
parent
commit
474952eed9
  1. 16
      src/main/java/com/ccsens/carbasics/api/StatisticalController.java
  2. 2
      src/main/java/com/ccsens/carbasics/bean/dto/StatisticalDto.java
  3. 32
      src/main/java/com/ccsens/carbasics/bean/vo/StatisticalVo.java
  4. 33
      src/main/java/com/ccsens/carbasics/persist/dao/FirstAidRecordDao.java
  5. 9
      src/main/java/com/ccsens/carbasics/service/IStatisticalService.java
  6. 60
      src/main/java/com/ccsens/carbasics/service/StatisticalService.java
  7. 40
      src/main/java/com/ccsens/carbasics/util/Constant.java
  8. 1
      src/main/resources/mapper_dao/FirstAidDao.xml
  9. 30
      src/main/resources/mapper_dao/FirstAidRecordDao.xml

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

@ -1,14 +1,11 @@
package com.ccsens.carbasics.api; package com.ccsens.carbasics.api;
import com.ccsens.carbasics.bean.dto.PatientDto;
import com.ccsens.carbasics.bean.dto.StatisticalDto; import com.ccsens.carbasics.bean.dto.StatisticalDto;
import com.ccsens.carbasics.bean.vo.PatientVo;
import com.ccsens.carbasics.bean.vo.StatisticalVo; import com.ccsens.carbasics.bean.vo.StatisticalVo;
import com.ccsens.carbasics.service.IStatisticalService; import com.ccsens.carbasics.service.IStatisticalService;
import com.ccsens.cloudutil.annotation.MustLogin; import com.ccsens.cloudutil.annotation.MustLogin;
import com.ccsens.util.JsonResponse; import com.ccsens.util.JsonResponse;
import com.ccsens.util.bean.dto.QueryDto; import com.ccsens.util.bean.dto.QueryDto;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiParam;
@ -38,11 +35,22 @@ public class StatisticalController {
@MustLogin @MustLogin
@ApiOperation(value = "跑道图", notes = "跑道图") @ApiOperation(value = "跑道图", notes = "跑道图")
@RequestMapping(value = "/runway", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) @RequestMapping(value = "/runway", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse<StatisticalVo.Common> runway(@ApiParam @Validated @RequestBody QueryDto<StatisticalDto.RunWay> params) { public JsonResponse<StatisticalVo.Common> runway(@ApiParam @Validated @RequestBody QueryDto<StatisticalDto.Time> params) {
log.info("跑道图:{}", params); log.info("跑道图:{}", params);
StatisticalVo.Common common = statisticalService.runway(params.getParam(), params.getUserId()); StatisticalVo.Common common = statisticalService.runway(params.getParam(), params.getUserId());
log.info("跑道图结果:{}", common); log.info("跑道图结果:{}", common);
return JsonResponse.newInstance().ok(common); return JsonResponse.newInstance().ok(common);
} }
@MustLogin
@ApiOperation(value = "跑道图", notes = "跑道图")
@RequestMapping(value = "/dnt", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse<StatisticalVo.Common> dnt(@ApiParam @Validated @RequestBody QueryDto<StatisticalDto.Time> params) {
log.info("dnt:{}", params);
StatisticalVo.Common common = statisticalService.dnt(params.getParam(), params.getUserId());
log.info("dnt结果:{}", common);
return JsonResponse.newInstance().ok(common);
}
} }

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

@ -17,7 +17,7 @@ public class StatisticalDto {
@Data @Data
@ApiModel("跑道图-请求") @ApiModel("跑道图-请求")
public static class RunWay{ public static class Time {
@NotNull(message = "项目id不能为空") @NotNull(message = "项目id不能为空")
@ApiModelProperty("项目ID") @ApiModelProperty("项目ID")
private Long projectId; private Long projectId;

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

@ -31,6 +31,38 @@ public class StatisticalVo {
private String name; private String name;
@ApiModelProperty("对应值") @ApiModelProperty("对应值")
private String value; private String value;
public Item() {
}
public Item(String name, String value) {
this.name = name;
this.value = value;
}
}
@ApiModel("分段统计DNT")
@Data
public static class Dnt {
@ApiModelProperty("<=30")
private Long one;
@ApiModelProperty("<=45 && > 30")
private Long two;
@ApiModelProperty("<=60 && > 45")
private Long three;
@ApiModelProperty(">60")
private Long four;
public void fillZero() {
one = one == null ? 0 : one;
two = two == null ? 0 : two;
three = three == null ? 0 : three;
four = four == null ? 0 : four;
}
public long sum(){
fillZero();
return one + two + three + four;
}
} }
} }

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

@ -1,6 +1,10 @@
package com.ccsens.carbasics.persist.dao; package com.ccsens.carbasics.persist.dao;
import com.ccsens.carbasics.bean.vo.StatisticalVo;
import com.ccsens.carbasics.persist.mapper.FirstAidRecordMapper; import com.ccsens.carbasics.persist.mapper.FirstAidRecordMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/** /**
* @description: 急救记录相关 * @description: 急救记录相关
@ -8,4 +12,33 @@ import com.ccsens.carbasics.persist.mapper.FirstAidRecordMapper;
* @time: 2021/9/1 17:43 * @time: 2021/9/1 17:43
*/ */
public interface FirstAidRecordDao extends FirstAidRecordMapper { public interface FirstAidRecordDao extends FirstAidRecordMapper {
/**
* 统计时间窗患者数
* @param hospitalIds 医院ID
* @param startTime 开始时间
* @param endTime 结束时间
* @return 时间窗患者
*/
Long countTimeWindowPatient(@Param("hospitalIds") List<Long> hospitalIds, @Param("startTime") Long startTime, @Param("endTime") Long endTime);
/**
* 统计指定答案的数量
* @param questionCode 统计类型
* @param answer 对应答案
* @param timeCode 时间依据
* @param hospitalIds 医院ID
* @param startTime 开始时间
* @param endTime 结束时间
* @return 指定答案病例
*/
Long countSpecifyAnswer(@Param("questionCode") String questionCode, @Param("answer") String answer, @Param("timeCode") String timeCode, @Param("hospitalIds") List<Long> hospitalIds, @Param("startTime") Long startTime, @Param("endTime") Long endTime);
/**
* DNT统计
* @param hospitalIds 医院ID
* @param startTime 开始时间
* @param endTime 结束时间
* @return DNT
*/
StatisticalVo.Dnt countDnt(@Param("hospitalIds") List<Long> hospitalIds, @Param("startTime") Long startTime, @Param("endTime") Long endTime);
} }

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

@ -16,5 +16,12 @@ public interface IStatisticalService {
* @param userId 用户ID * @param userId 用户ID
* @return 统计 * @return 统计
*/ */
StatisticalVo.Common runway(StatisticalDto.RunWay param, Long userId); StatisticalVo.Common runway(StatisticalDto.Time param, Long userId);
/**
* DNT分段统计
* @param param 请求参数
* @param userId 用户ID
* @return 统计
*/
StatisticalVo.Common dnt(StatisticalDto.Time param, Long userId);
} }

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

@ -35,9 +35,61 @@ public class StatisticalService implements IStatisticalService {
private OrganizationDao organizationDao; private OrganizationDao organizationDao;
@Override @Override
public StatisticalVo.Common runway(StatisticalDto.RunWay param, Long userId) { public StatisticalVo.Common runway(StatisticalDto.Time param, Long userId) {
List<Long> hospitalIds = getHospitalIds(param.getProjectId());
// 时间窗患者
Long timeWindowPatient = firstAidRecordDao.countTimeWindowPatient(hospitalIds, param.getStartTime(), param.getEndTime());
//统计溶栓例数(开始静脉溶栓时间)
Long thrombosis = firstAidRecordDao.countSpecifyAnswer(Constant.Statistical.Thrombosis.QUESTION_CODE,
Constant.Statistical.Thrombosis.ANSWER, Constant.Statistical.Thrombosis.TIME_CODE,
hospitalIds, param.getStartTime(), param.getEndTime());
//机械再通例数(穿刺完成时间)
Long mechanical = firstAidRecordDao.countSpecifyAnswer(Constant.Statistical.Mechanical.QUESTION_CODE,
Constant.Statistical.Mechanical.ANSWER, Constant.Statistical.Mechanical.TIME_CODE,
hospitalIds, param.getStartTime(), param.getEndTime());
//脑出血例数(手术开始时间)
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));
return common;
}
@Override
public StatisticalVo.Common dnt(StatisticalDto.Time param, Long userId) {
List<Long> hospitalIds = getHospitalIds(param.getProjectId());
StatisticalVo.Dnt dnt = firstAidRecordDao.countDnt(hospitalIds, param.getStartTime(), param.getEndTime());
if (dnt == null) {
dnt = new StatisticalVo.Dnt();
}
StatisticalVo.Common common = new StatisticalVo.Common();
common.setTotal(dnt.sum());
List<StatisticalVo.Item> items = new ArrayList<>();
items.add(new StatisticalVo.Item(Constant.Statistical.Dnt.ONE, ""+dnt.getOne()));
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()));
return common;
}
/**
* 查找项目对应的医院ID或对应下级医院ID
* @param projectId 项目ID
* @return 医院ID
*/
private List<Long> getHospitalIds(Long projectId) {
// 判断机构是否存在 // 判断机构是否存在
Organization organization = organizationDao.getByProjectId(param.getProjectId()); Organization organization = organizationDao.getByProjectId(projectId);
if (organization == null) { if (organization == null) {
throw new BaseException(DefaultCodeError.NOT_ORGANIZATION); throw new BaseException(DefaultCodeError.NOT_ORGANIZATION);
} }
@ -53,8 +105,6 @@ public class StatisticalService implements IStatisticalService {
} }
hospitals.forEach(hospital -> hospitalIds.add(hospital.getId())); hospitals.forEach(hospital -> hospitalIds.add(hospital.getId()));
} }
return hospitalIds;
return null;
} }
} }

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

@ -15,6 +15,46 @@ public class Constant {
/**xls*/ /**xls*/
public static final String XLS = "xls"; public static final String XLS = "xls";
public static final class Statistical{
/**跑道图-溶栓例数*/
public final static class Thrombosis {
public final static String NAME = "溶栓例数";
/**是否静脉溶栓*/
public final static String QUESTION_CODE = "ZLFA-JMRS";
public final static String ANSWER = "是";
/**开始静脉溶栓时间*/
public final static String TIME_CODE = "JMRSSJ";
}
/**跑道图-机械再通例数*/
public final static class Mechanical {
public final static String NAME = "机械再通例数";
/**是否给予血管内治疗*/
public final static String QUESTION_CODE = "ZLFA-XGZL";
public final static String ANSWER = "是";
/**穿刺完成时间*/
public final static String TIME_CODE = "JRZL-CCSJ";
}
/**跑道图-机械再通例数*/
public final static class Ich {
public final static String NAME = "脑出血例数";
/**CT诊断结果*/
public final static String QUESTION_CODE = "RYPG-ZDJG";
public final static String ANSWER = "出血性脑卒中";
/**手术开始时间*/
public final static String TIME_CODE = "ZYZL-KSSJ";
}
/**DNT分段统计*/
public final static class Dnt {
public final static String ONE = "<30min";
public final static String TWO = "30~45min";
public final static String THREE = "45~60min";
public final static String FOUR = ">60min";
}
}
public static final class Organization{ public static final class Organization{
/**医院*/ /**医院*/
public final static byte HOSPITAL = 3; public final static byte HOSPITAL = 3;

1
src/main/resources/mapper_dao/FirstAidDao.xml

@ -41,6 +41,7 @@
and m.record_user_id in (#{userId}, 0) and m.record_user_id in (#{userId}, 0)
</when> </when>
</choose> </choose>
order by a.updated_at desc
</select> </select>

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

@ -3,4 +3,34 @@
<mapper namespace="com.ccsens.carbasics.persist.dao.FirstAidRecordDao"> <mapper namespace="com.ccsens.carbasics.persist.dao.FirstAidRecordDao">
<select id="countTimeWindowPatient" resultType="java.lang.Long">
select count(*) 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;= #{startTime} and r2.answer + 0 &lt;= #{endTime}
<foreach collection="hospitalIds" item="id" separator="," open="and a.hospital_id in (" close=")">
#{id}
</foreach>
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
</select>
<select id="countSpecifyAnswer" resultType="java.lang.Long">
select count(a.id) 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 = #{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
</select>
<select id="countDnt" resultType="com.ccsens.carbasics.bean.vo.StatisticalVo$Dnt">
select
sum(if (ceil((r1.answer - r2.answer)/60000) &lt;= 30, 1, 0)) as one,
sum(if (ceil((r1.answer - r2.answer)/60000) &lt;= 45 and ceil((r1.answer - r2.answer)/60000) &gt; 30, 1, 0)) as two,
sum(if (ceil((r1.answer - r2.answer)/60000) &lt;= 60 and ceil((r1.answer - r2.answer)/60000) &gt; 45, 1, 0)) as three,
sum(if (ceil((r1.answer - r2.answer)/60000) &gt; 60, 1, 0)) as four
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 = '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
</select>
</mapper> </mapper>

Loading…
Cancel
Save