|
@@ -4,16 +4,15 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
import com.diagbot.aggregate.AverageStatisticsAggregate;
|
|
import com.diagbot.aggregate.AverageStatisticsAggregate;
|
|
-import com.diagbot.aggregate.LeaveHosStatisticsAggregate;
|
|
|
|
import com.diagbot.aggregate.MrStatisticsAggregate;
|
|
import com.diagbot.aggregate.MrStatisticsAggregate;
|
|
import com.diagbot.aggregate.ResultStatisticsAggregate;
|
|
import com.diagbot.aggregate.ResultStatisticsAggregate;
|
|
import com.diagbot.dto.*;
|
|
import com.diagbot.dto.*;
|
|
import com.diagbot.entity.*;
|
|
import com.diagbot.entity.*;
|
|
import com.diagbot.enums.IsDeleteEnum;
|
|
import com.diagbot.enums.IsDeleteEnum;
|
|
|
|
+import com.diagbot.enums.QualityContent;
|
|
import com.diagbot.exception.CommonErrorCode;
|
|
import com.diagbot.exception.CommonErrorCode;
|
|
import com.diagbot.exception.CommonException;
|
|
import com.diagbot.exception.CommonException;
|
|
import com.diagbot.service.MedManagementInfoService;
|
|
import com.diagbot.service.MedManagementInfoService;
|
|
-import com.diagbot.service.MedQcresultDetailService;
|
|
|
|
import com.diagbot.util.*;
|
|
import com.diagbot.util.*;
|
|
import com.diagbot.vo.*;
|
|
import com.diagbot.vo.*;
|
|
import com.google.common.collect.Lists;
|
|
import com.google.common.collect.Lists;
|
|
@@ -24,11 +23,10 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Qualifier;
|
|
import org.springframework.beans.factory.annotation.Qualifier;
|
|
import org.springframework.stereotype.Component;
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
|
|
+import java.lang.reflect.Array;
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
import java.math.RoundingMode;
|
|
import java.math.RoundingMode;
|
|
-import java.text.DateFormat;
|
|
|
|
import java.text.DecimalFormat;
|
|
import java.text.DecimalFormat;
|
|
-import java.text.ParseException;
|
|
|
|
import java.text.SimpleDateFormat;
|
|
import java.text.SimpleDateFormat;
|
|
import java.time.*;
|
|
import java.time.*;
|
|
import java.time.format.DateTimeFormatter;
|
|
import java.time.format.DateTimeFormatter;
|
|
@@ -391,48 +389,49 @@ public class ConsoleFacade {
|
|
Long endCount = selectOperationNumMap.get("住院人数");
|
|
Long endCount = selectOperationNumMap.get("住院人数");
|
|
//手术人数
|
|
//手术人数
|
|
Long operationFeeNum = selectOperationNumMap.get("operationFee");
|
|
Long operationFeeNum = selectOperationNumMap.get("operationFee");
|
|
|
|
+ int operationNum = getOperationNum(filterVO);
|
|
|
|
+ Integer integer = Integer.valueOf(operationNum);
|
|
|
|
+ operationFeeNum=operationFeeNum+integer;
|
|
//抗菌人数
|
|
//抗菌人数
|
|
Long antibiosisFeeNum = selectOperationNumMap.get("antibiosisFee");
|
|
Long antibiosisFeeNum = selectOperationNumMap.get("antibiosisFee");
|
|
//手术病理人数
|
|
//手术病理人数
|
|
Long operationPathologyFeeNum = selectOperationNumMap.get("operationPathologyFee");
|
|
Long operationPathologyFeeNum = selectOperationNumMap.get("operationPathologyFee");
|
|
|
|
+ int operationPathologyNum = getOperationPathologyNum(filterVO);
|
|
|
|
+ Integer operationPathologyInteger = Integer.valueOf(operationPathologyNum);
|
|
|
|
+ operationPathologyFeeNum=operationPathologyFeeNum+operationPathologyInteger;
|
|
Map<String, Long> recordIndicatorMap = behospitalInfoFacade.medicalRecordIndicator(filterVO);
|
|
Map<String, Long> recordIndicatorMap = behospitalInfoFacade.medicalRecordIndicator(filterVO);
|
|
//各指标未完成人数情况
|
|
//各指标未完成人数情况
|
|
- Long operationCount = recordIndicatorMap.get("2170手术记录未在术后24h内完成");
|
|
|
|
- Long InHospitalRecords = recordIndicatorMap.get("2658入院记录未在患者入院24小时内完成");
|
|
|
|
- Long OutHospitalRecords = recordIndicatorMap.get("2635出院记录未在患者出院24小时内完成");
|
|
|
|
- Long recordHomePage = recordIndicatorMap.get("3110病案首页未在患者出院24小时内完成");
|
|
|
|
|
|
+ Long operationCount = recordIndicatorMap.get(QualityContent.SSJLWCC_24H);
|
|
|
|
+ Long InHospitalRecords = recordIndicatorMap.get(QualityContent.RYJLWWC_24H);
|
|
|
|
+ Long OutHospitalRecords = recordIndicatorMap.get(QualityContent.CYJLWWC_24H);
|
|
|
|
+ Long recordHomePage = recordIndicatorMap.get(QualityContent.BASYWWC_24H);
|
|
if(startCount.intValue()!=0){
|
|
if(startCount.intValue()!=0){
|
|
//手术记录完成率
|
|
//手术记录完成率
|
|
//手术完成人数为
|
|
//手术完成人数为
|
|
- medQualityControlDTO.setOperationNum(Double.valueOf(startCount-operationCount));
|
|
|
|
|
|
+ medQualityControlDTO.setOperationNum(Double.valueOf(operationFeeNum-operationCount));
|
|
//手术完成率
|
|
//手术完成率
|
|
- medQualityControlDTO.setOperationStr(String.valueOf((startCount-operationCount)/startCount));
|
|
|
|
|
|
+ medQualityControlDTO.setOperationStr(getResult(operationFeeNum-operationCount,startCount));
|
|
//入院记录24小时完成率
|
|
//入院记录24小时完成率
|
|
//入院记录完成人数为
|
|
//入院记录完成人数为
|
|
medQualityControlDTO.setAdmissionNum(Double.valueOf(startCount-InHospitalRecords));
|
|
medQualityControlDTO.setAdmissionNum(Double.valueOf(startCount-InHospitalRecords));
|
|
//入院记录完成率
|
|
//入院记录完成率
|
|
- medQualityControlDTO.setAdmissionStr(String.valueOf((startCount-InHospitalRecords)/startCount));
|
|
|
|
|
|
+ medQualityControlDTO.setAdmissionStr(getResult(startCount-InHospitalRecords,startCount));
|
|
//出院记录24小时完成率
|
|
//出院记录24小时完成率
|
|
//出院记录完成人数为
|
|
//出院记录完成人数为
|
|
medQualityControlDTO.setLeaveHospitalNum(Double.valueOf(startCount-OutHospitalRecords));
|
|
medQualityControlDTO.setLeaveHospitalNum(Double.valueOf(startCount-OutHospitalRecords));
|
|
//出院记录完成率
|
|
//出院记录完成率
|
|
- medQualityControlDTO.setLeaveHospitalStr(String.valueOf((startCount-OutHospitalRecords)/startCount));
|
|
|
|
|
|
+ medQualityControlDTO.setLeaveHospitalStr(getResult(startCount-OutHospitalRecords,startCount));
|
|
//病案首页24小时完成率
|
|
//病案首页24小时完成率
|
|
//病案首页完成人数为
|
|
//病案首页完成人数为
|
|
medQualityControlDTO.setMedHomePageNum(Double.valueOf(startCount-recordHomePage));
|
|
medQualityControlDTO.setMedHomePageNum(Double.valueOf(startCount-recordHomePage));
|
|
//病案首页完成率
|
|
//病案首页完成率
|
|
- medQualityControlDTO.setMedHomePageStr(String.valueOf((startCount-recordHomePage)/startCount));
|
|
|
|
|
|
+ medQualityControlDTO.setMedHomePageStr(getResult(startCount-recordHomePage,startCount));
|
|
}
|
|
}
|
|
- Map<String, Long> doctorAdviceFacadeOf = doctorAdviceFacade.getCTAndMR(filterVO);
|
|
|
|
//CT人数
|
|
//CT人数
|
|
- Long ctNum = doctorAdviceFacadeOf.get("CTNUM");
|
|
|
|
|
|
+ Long CTNum = getCTNum(filterVO).get("CT");
|
|
//MR人数
|
|
//MR人数
|
|
- Long mrNum = doctorAdviceFacadeOf.get("MRNUM");
|
|
|
|
- //CT次数和MR次数
|
|
|
|
- Long ctCount = doctorAdviceFacadeOf.get("CT");
|
|
|
|
- Long mrCount = doctorAdviceFacadeOf.get("MR");
|
|
|
|
- //细菌培养人数
|
|
|
|
- Long bacterialCultures = doctorAdviceFacadeOf.get("bacterialCulturesNum");
|
|
|
|
|
|
+ Long MRNum = getCTNum(filterVO).get("MR");
|
|
|
|
+
|
|
//触发规则
|
|
//触发规则
|
|
//病理
|
|
//病理
|
|
Map<String, Long> triggeringRulesMap = behospitalInfoFacade.triggeringRules(filterVO);
|
|
Map<String, Long> triggeringRulesMap = behospitalInfoFacade.triggeringRules(filterVO);
|
|
@@ -444,12 +443,150 @@ public class ConsoleFacade {
|
|
//MR
|
|
//MR
|
|
Long mr = triggeringRulesMap.get("MR");
|
|
Long mr = triggeringRulesMap.get("MR");
|
|
//病理完成率为
|
|
//病理完成率为
|
|
- medQualityControlDTO.setPathologicalExamination(String.valueOf((operationPathologyFeeNum - antibiosisNum) / operationPathologyFeeNum));
|
|
|
|
|
|
+ medQualityControlDTO.setPathologicalExamination(getResult(operationPathologyFeeNum - antibiosisNum,operationPathologyFeeNum));
|
|
|
|
+ //CT完成率
|
|
|
|
+ medQualityControlDTO.setCTExaminationConform(getResult(CTNum - ct,CTNum));
|
|
|
|
+ //MR完成率
|
|
|
|
+ medQualityControlDTO.setMRIExaminationConform(getResult(MRNum - mr,MRNum));
|
|
|
|
+
|
|
|
|
+
|
|
return medQualityControlDTO;
|
|
return medQualityControlDTO;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 两数据相除得到百分比
|
|
|
|
+ * @param i
|
|
|
|
+ * @param y
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public String getResult(Long i , Long y){
|
|
|
|
+ DecimalFormat df = new DecimalFormat();
|
|
|
|
+ df.setMaximumFractionDigits(2);
|
|
|
|
+ df.setMinimumFractionDigits(2);
|
|
|
|
+ if(String.valueOf(y).equals("0")){
|
|
|
|
+ return "0.00%";
|
|
|
|
+ }
|
|
|
|
+ String k= df.format((i * 100.00) / y) + "%";
|
|
|
|
+ return k;
|
|
|
|
+ }
|
|
|
|
+ /**
|
|
|
|
+ * 获取无病案首页病人code
|
|
|
|
+ */
|
|
|
|
+ public List<String> adviceVerify(FilterVO filterVO){
|
|
|
|
+ List<Map<String, String>> medicalRecords = behospitalInfoFacade.getMedicalRecords(filterVO);
|
|
|
|
+ ArrayList<String> behospitalCodeList = new ArrayList<>();
|
|
|
|
+ for (Map<String, String> medicalRecord : medicalRecords) {
|
|
|
|
+ String b_code = medicalRecord.get("b_code");
|
|
|
|
+ String behospitalCode = medicalRecord.get("behospital_code");
|
|
|
|
+ if(StringUtil.isEmpty(b_code)){
|
|
|
|
+ behospitalCodeList.add(behospitalCode);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return behospitalCodeList;
|
|
|
|
+ }
|
|
|
|
+ /**
|
|
|
|
+ * 医嘱表判断无病案首页是否为病理手术患者的人数
|
|
|
|
+ */
|
|
|
|
+ public int getOperationPathologyNum(FilterVO filterVO){
|
|
|
|
+ List<String> behospitalCodeList = adviceVerify(filterVO);
|
|
|
|
+ int operationNum=0;
|
|
|
|
+ for (String behospitalCode : behospitalCodeList) {
|
|
|
|
+ QueryWrapper<DoctorAdvice> dtoQueryWrapper = new QueryWrapper<>();
|
|
|
|
+ dtoQueryWrapper.eq("behospital_code",behospitalCode)
|
|
|
|
+ .eq("is_deleted", IsDeleteEnum.N.getKey())
|
|
|
|
+ .eq("doctor_advice_type",QualityContent.STAT_ORDER)
|
|
|
|
+ .eq("da_status","执行");
|
|
|
|
+ //查医嘱表
|
|
|
|
+ List<DoctorAdvice> doctorAdvices = doctorAdviceFacade.getBaseMapper().selectList(dtoQueryWrapper);
|
|
|
|
+ for (DoctorAdvice doctorAdvice : doctorAdvices) {
|
|
|
|
+ String name = doctorAdvice.getDaItemName();
|
|
|
|
+ if(name.contains("手术")) {
|
|
|
|
+ if (name.contains("非手术") || name.contains("手术室") || (name.contains("手术") && name.contains("取消")) || (name.contains("暂停") && name.contains("手术")) || name.contains("静脉穿刺置管术") || name.startsWith("停") || name.contains("前一次")
|
|
|
|
+ || name.contains("特殊病人手术使用一次性卫生材料") || name.contains("人免疫缺陷病毒抗体检测免费")) {
|
|
|
|
+ continue;
|
|
|
|
+ }else {
|
|
|
|
+ for (DoctorAdvice advice : doctorAdvices) {
|
|
|
|
+ String daItemName = advice.getDaItemName();
|
|
|
|
+ if(daItemName.contains("病理")) {
|
|
|
|
+ operationNum++;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return operationNum;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 医嘱表判断无病案首页是否为手术患者的人数
|
|
|
|
+ */
|
|
|
|
+ public int getOperationNum(FilterVO filterVO){
|
|
|
|
+ List<String> behospitalCodeList = adviceVerify(filterVO);
|
|
|
|
+ int operationNum=0;
|
|
|
|
+ for (String behospitalCode : behospitalCodeList) {
|
|
|
|
+ QueryWrapper<DoctorAdvice> dtoQueryWrapper = new QueryWrapper<>();
|
|
|
|
+ dtoQueryWrapper.eq("behospital_code",behospitalCode)
|
|
|
|
+ .eq("is_deleted", IsDeleteEnum.N.getKey())
|
|
|
|
+ .eq("doctor_advice_type",QualityContent.STAT_ORDER)
|
|
|
|
+ .eq("da_status","执行");
|
|
|
|
+ //查医嘱表
|
|
|
|
+ List<DoctorAdvice> doctorAdvices = doctorAdviceFacade.getBaseMapper().selectList(dtoQueryWrapper);
|
|
|
|
+ for (DoctorAdvice doctorAdvice : doctorAdvices) {
|
|
|
|
+ String name = doctorAdvice.getDaItemName();
|
|
|
|
+ if(name.contains("手术")) {
|
|
|
|
+ if (name.contains("非手术") || name.contains("手术室") || (name.contains("手术") && name.contains("取消")) || (name.contains("暂停") && name.contains("手术")) || name.contains("静脉穿刺置管术") || name.startsWith("停") || name.contains("前一次")
|
|
|
|
+ || name.contains("特殊病人手术使用一次性卫生材料") || name.contains("人免疫缺陷病毒抗体检测免费")) {
|
|
|
|
+ continue;
|
|
|
|
+ }else {
|
|
|
|
+ operationNum++;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return operationNum;
|
|
|
|
|
|
|
|
|
|
|
|
+ }
|
|
|
|
+ /**
|
|
|
|
+ * 获取CT/MRI人数
|
|
|
|
+ */
|
|
|
|
+ public Map<String,Long> getCTNum(FilterVO filterVO){
|
|
|
|
+ List<Map<String, String>> getDoctorAdviceNum = doctorAdviceFacade.getDoctorAdviceNum(filterVO);
|
|
|
|
+ HashMap<String, Long> map = new HashMap<>();
|
|
|
|
+ ArrayList<String> codeList = new ArrayList<>();
|
|
|
|
+ for (Map<String, String> ctNumMap : getDoctorAdviceNum) {
|
|
|
|
+ String behospitalCode = ctNumMap.get("behospital_code");
|
|
|
|
+ if (!codeList.contains(behospitalCode)) {
|
|
|
|
+ String daItemName = ctNumMap.get("da_item_name");
|
|
|
|
+ if (daItemName.contains("CT") || daItemName.contains("X线")) {
|
|
|
|
+ if ((!daItemName.contains("ATCH") && !daItemName.contains("TCT") && !daItemName.contains("HCT") && !daItemName.contains("OCT") && !daItemName.contains("NCT")&& !daItemName.contains("LCT")&& !daItemName.contains("ACT"))||(daItemName.contains("停"))) {
|
|
|
|
+ //都不包含为CT
|
|
|
|
+ codeList.add(behospitalCode);
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ ArrayList<String> codeMri = new ArrayList<>();
|
|
|
|
+ for (Map<String, String> MRINumMap : getDoctorAdviceNum) {
|
|
|
|
+ String behospitalCodeMri = MRINumMap.get("behospital_code");
|
|
|
|
+ if(!codeList.contains(behospitalCodeMri)){
|
|
|
|
+ String daItemName = MRINumMap.get("da_item_name");
|
|
|
|
+ if(daItemName.contains("磁共振")||daItemName.contains("MR")){
|
|
|
|
+ if(!daItemName.contains("IMRT")&&!daItemName.contains("mrs评分")){
|
|
|
|
+ codeMri.add(behospitalCodeMri);
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ map.put("CT",Long.valueOf(codeList.size()));
|
|
|
|
+ map.put("MR",Long.valueOf(codeMri.size()));
|
|
|
|
+ return map;
|
|
|
|
+ }
|
|
/**
|
|
/**
|
|
* 质控病历统计
|
|
* 质控病历统计
|
|
*
|
|
*
|