wangweiqun 6 vuotta sitten
vanhempi
commit
c52d94209f

+ 5 - 0
src/main/java/com/yihu/ehr/analyze/controller/DailyReportEndPoint.java

@ -1,5 +1,6 @@
package com.yihu.ehr.analyze.controller;
import com.yihu.ehr.analyze.service.RedisService;
import com.yihu.ehr.constants.ApiVersion;
import com.yihu.ehr.constants.ServiceApi;
import com.yihu.ehr.controller.EnvelopRestEndPoint;
@ -32,6 +33,8 @@ public class DailyReportEndPoint extends EnvelopRestEndPoint {
    @Autowired
    private ElasticSearchUtil elasticSearchUtil;
    @Autowired
    private RedisService redisService;
    @ApiOperation(value = "档案日报上传")
    @RequestMapping(value = ServiceApi.PackageAnalyzer.DailyReport, method = RequestMethod.POST)
@ -76,6 +79,8 @@ public class DailyReportEndPoint extends EnvelopRestEndPoint {
                        elasticSearchUtil.delete(INDEX, TYPE ,m.get("_id").toString());
                    }
                }
                String orgArea = redisService.getOrgArea(map.get("org_code").toString());
                map.put("org_area",orgArea);
                elasticSearchUtil.index(INDEX, TYPE, map);
            }
            return success(true);

+ 1 - 1
src/main/java/com/yihu/ehr/analyze/controller/PackQcReportEndPoint.java

@ -61,7 +61,7 @@ public class PackQcReportEndPoint extends EnvelopRestEndPoint {
            @RequestParam(name = "endDate") String endDate,
            @ApiParam(name = "orgCode", value = "医院代码", required = false)
            @RequestParam(name = "orgCode") String orgCode) throws Exception {
        return packQcReportService.dailyReport(startDate, endDate, orgCode);
        return packQcReportService.dailyReport("event_date",startDate, endDate, orgCode);
    }
    @RequestMapping(value = ServiceApi.PackQcReport.datasetWarningList, method = RequestMethod.GET)

+ 162 - 0
src/main/java/com/yihu/ehr/analyze/controller/dataQuality/DataQualityHomeEndpoint.java

@ -0,0 +1,162 @@
package com.yihu.ehr.analyze.controller.dataQuality;
import com.yihu.ehr.analyze.service.dataQuality.DataQualityHomeService;
import com.yihu.ehr.constants.ApiVersion;
import com.yihu.ehr.constants.ServiceApi;
import com.yihu.ehr.controller.EnvelopRestEndPoint;
import com.yihu.ehr.util.rest.Envelop;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
 *  质控管理- 首页
 * @author HZY
 * @created 2018/8/17 11:24
 */
@RestController
@RequestMapping(value = ApiVersion.Version1_0, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@Api(value = "DataQualityHomeEndpoint", description = "质控管理首页", tags = {"档案分析服务-质控-首页"})
public class DataQualityHomeEndpoint extends EnvelopRestEndPoint {
    @Autowired
    private DataQualityHomeService dataQualityHomeService;
    @RequestMapping(value = ServiceApi.DataQuality.HomeSummary, method = RequestMethod.GET)
    @ApiOperation(value = "质量监控首页--质控情况")
    public Envelop homneSummary(
            @ApiParam(name = "start", value = "开始时间,(接收时间)")
            @RequestParam(value = "start", required = false) String start,
            @ApiParam(name = "end", value = "结束时间,(接收时间)", defaultValue = "")
            @RequestParam(value = "end", required = false) String end ) throws Exception {
        Envelop envelop = new Envelop();
        try {
            return success(dataQualityHomeService.getQuailyDetail(start,end));
        }catch (Exception e){
            e.printStackTrace();
            envelop.setSuccessFlg(false);
            envelop.setErrorMsg(e.getMessage());
        }
        return envelop;
    }
    @RequestMapping(value = ServiceApi.DataQuality.HomeAreaDataList, method = RequestMethod.GET)
    @ApiOperation(value = "质量监控首页--各区县质控情况")
    public Envelop findAreaData(
            @ApiParam(name = "dataType", value = "数据维度  (0: 完整性,1:及时性,2:准确性)")
            @RequestParam(value = "dataType", required = false) Integer dataType,
            @ApiParam(name = "start", value = "开始时间,(接收时间)")
            @RequestParam(value = "start", required = false) String start,
            @ApiParam(name = "end", value = "结束时间,(接收时间)", defaultValue = "")
            @RequestParam(value = "end", required = false) String end ) throws Exception {
        Envelop envelop = new Envelop();
        try {
            return success(dataQualityHomeService.findAreaData(dataType,start,end));
        }catch (Exception e){
            e.printStackTrace();
            envelop.setSuccessFlg(false);
            envelop.setErrorMsg(e.getMessage());
        }
        return envelop;
    }
    @RequestMapping(value = ServiceApi.DataQuality.HomeOrgDataList, method = RequestMethod.GET)
    @ApiOperation(value = "质量监控首页--区县下各机构质控情况")
    public Envelop findOrgDataByArea(
            @ApiParam(name = "orgArea", value = "市区域编码")
            @RequestParam(value = "orgArea", required = false) String orgArea,
            @ApiParam(name = "dataType", value = "数据维度  (0: 完整性,1:及时性,2:准确性)")
            @RequestParam(value = "dataType", required = false) Integer dataType,
            @ApiParam(name = "start", value = "开始时间,(接收时间)")
            @RequestParam(value = "start", required = false) String start,
            @ApiParam(name = "end", value = "结束时间,(接收时间)", defaultValue = "")
            @RequestParam(value = "end", required = false) String end ) throws Exception {
        Envelop envelop = new Envelop();
        try {
            return success(dataQualityHomeService.findOrgData(dataType,orgArea,start,end));
        }catch (Exception e){
            e.printStackTrace();
            envelop.setSuccessFlg(false);
            envelop.setErrorMsg(e.getMessage());
        }
        return envelop;
    }
    @RequestMapping(value = ServiceApi.DataQuality.HomeDatasetError, method = RequestMethod.GET)
    @ApiOperation(value = "质量监控首页--错误数据集")
    public Envelop homeDatasetError(
            @ApiParam(name = "orgArea", value = "市区域编码")
            @RequestParam(value = "orgArea", required = false) String orgArea,
            @ApiParam(name = "orgCode", value = "机构代码")
            @RequestParam(value = "orgCode", required = false) String orgCode,
            @ApiParam(name = "dataType", value = "数据维度  (0: 完整性,1:准确性)")
            @RequestParam(value = "dataType", required = false) Integer dataType,
            @ApiParam(name = "start", value = "开始时间,(接收时间)")
            @RequestParam(value = "start", required = false) String start,
            @ApiParam(name = "end", value = "结束时间,(接收时间)")
            @RequestParam(value = "end", required = false) String end ) throws Exception {
        Envelop envelop = new Envelop();
        try {
            return success(dataQualityHomeService.homeDatasetError(orgArea,orgCode, dataType, start, end));
        }catch (Exception e){
            e.printStackTrace();
            envelop.setSuccessFlg(false);
            envelop.setErrorMsg(e.getMessage());
        }
        return envelop;
    }
    @RequestMapping(value = ServiceApi.DataQuality.HomeMetadataError, method = RequestMethod.GET)
    @ApiOperation(value = "质量监控首页--错误数据元")
    public Envelop homeMetadataError(
            @ApiParam(name = "orgArea", value = "市区域编码")
            @RequestParam(value = "orgArea", required = false) String orgArea,
            @ApiParam(name = "orgCode", value = "机构代码")
            @RequestParam(value = "orgCode", required = false) String orgCode,
            @ApiParam(name = "dataset", value = "数据集")
            @RequestParam(value = "dataset", required = false) String dataset,
            @ApiParam(name = "dataType", value = "数据维度  (0: 完整性,1:准确性)")
            @RequestParam(value = "dataType", required = false) Integer dataType,
            @ApiParam(name = "start", value = "开始时间,(接收时间)")
            @RequestParam(value = "start", required = false) String start,
            @ApiParam(name = "end", value = "结束时间,(接收时间)")
            @RequestParam(value = "end", required = false) String end ) throws Exception {
        Envelop envelop = new Envelop();
        try {
            return success(dataQualityHomeService.homeMetadataError(orgArea,orgCode,dataset, dataType, start, end));
        }catch (Exception e){
            e.printStackTrace();
            envelop.setSuccessFlg(false);
            envelop.setErrorMsg(e.getMessage());
        }
        return envelop;
    }
    @RequestMapping(value = "bulkUpDateOrgArea", method = RequestMethod.GET)
    @ApiOperation(value = "批量更新机构关联的区域编码")
    public void bulkUploadOrgArea(
            @ApiParam(name = "index", value = "索引")
            @RequestParam(value = "index", required = false) String index,
            @ApiParam(name = "type", value = "type")
            @RequestParam(value = "type", required = false) String type
    ) throws Exception {
        dataQualityHomeService.bulkUpdateOrgArea(index,type);
    }
}

+ 91 - 9
src/main/java/com/yihu/ehr/analyze/controller/dataQuality/WarningRecordEndPoint.java

@ -8,6 +8,7 @@ import com.yihu.ehr.constants.ServiceApi;
import com.yihu.ehr.controller.EnvelopRestEndPoint;
import com.yihu.ehr.entity.quality.DqWarningRecord;
import com.yihu.ehr.model.quality.MDqWarningRecord;
import com.yihu.ehr.util.datetime.DateUtil;
import com.yihu.ehr.util.rest.Envelop;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@ -15,10 +16,10 @@ import io.swagger.annotations.ApiParam;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
/**
 * @author yeshijie on 2018/6/12.
@ -76,35 +77,53 @@ public class WarningRecordEndPoint extends EnvelopRestEndPoint {
            @ApiParam(name = "status", value = "状态(1未解决,2已解决)", defaultValue = "1")
            @RequestParam(value = "status", required = false) String status,
            @ApiParam(name = "type", value = "类型(1接收,2资源化,3上传)", defaultValue = "1")
            @RequestParam(value = "type", required = true) String type,
            @RequestParam(value = "type", required = false) String type,
            @ApiParam(name = "startTime", value = "开始时间", defaultValue = "2018-06-11")
            @RequestParam(value = "startTime", required = false) String startTime,
            @ApiParam(name = "endTime", value = "结束时间", defaultValue = "2018-06-11")
            @RequestParam(value = "endTime", required = false) String endTime,
            @ApiParam(name = "id", value = "将某条数据置顶")
            @RequestParam(value = "id", required = false) String id,
            @ApiParam(name = "size", value = "分页大小", defaultValue = "15")
            @RequestParam(value = "size", required = false) int size,
            @ApiParam(name = "page", value = "页码", defaultValue = "1")
            @RequestParam(value = "page", required = false) int page) {
        Envelop envelop = new Envelop();
        try {
            String filters = "type="+type;
            String filters = "";
            if(StringUtils.isNotBlank(type)){
                filters += "type="+type+";";
            }
            if(StringUtils.isNotBlank(orgCode)){
                filters += ";orgCode="+orgCode;
                filters += "orgCode="+orgCode+";";
            }
            if(StringUtils.isNotBlank(quota)){
                filters += ";warningType="+quota;
                filters += "warningType="+quota+";";
            }
            if(StringUtils.isNotBlank(status)){
                filters += ";status="+status;
                filters += "status="+status+";";
            }
            if(StringUtils.isNotBlank(startTime)){
                filters += ";recordTime>="+startTime;
                filters += "recordTime>="+startTime+";";
            }
            if(StringUtils.isNotBlank(endTime)){
                filters += ";recordTime<="+endTime;
                filters += "recordTime<="+endTime+";";
            }
            if(StringUtils.isNotBlank(id)){
                filters +="id<>"+id+";";
            }
            String sorts = "-warningTime";
            List<DqWarningRecord> list = warningRecordService.search(null, filters, sorts, page, size);
            if(StringUtils.isNotBlank(id)){
                DqWarningRecord upDqWarningRecord = warningRecordService.findById(id);
                if(!CollectionUtils.isEmpty(list)){
                    //移出最后一条,
                    list.remove(list.size()-1);
                }
                list.add(0,upDqWarningRecord);
            }
            List<MDqWarningRecord> records = (List<MDqWarningRecord>) convertToModels(list, new ArrayList<>(list.size()), MDqWarningRecord.class, null);
            return getPageResult(records,(int)warningRecordService.getCount(filters), page, size);
        }catch (Exception e){
@ -162,4 +181,67 @@ public class WarningRecordEndPoint extends EnvelopRestEndPoint {
        return envelop;
    }
    @RequestMapping(value = ServiceApi.DataQuality.RealTimeMonitorList, method = RequestMethod.GET)
    @ApiOperation(value = "实时问题监控列表")
    public Envelop realTimeMonitor() {
        Envelop envelop = new Envelop();
        try {
            //获取上个月第一天
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.MONTH, -1);
            calendar.set(Calendar.DAY_OF_MONTH, 1);
            Date lastMonStart = calendar.getTime();
            String lastMonStartStr = DateUtil.toString(lastMonStart);
            //获取上个月最后一天
            Calendar calendar2 = Calendar.getInstance();
            calendar2.set(Calendar.DAY_OF_MONTH, 1);
            calendar2.add(Calendar.DATE, -1);
            Date lastMonEnd = calendar2.getTime();
            String lastMonEndStr = DateUtil.toString(lastMonEnd);
            //拼接上个月未解决的过滤条件
            String filters = "recordTime>="+lastMonStartStr+";recordTime<="+lastMonEndStr+";status=1;";
            //上个月未解决问题数量
            long lastMonth = warningRecordService.getCount(filters);
            //获取当月第一天
            Calendar c = Calendar.getInstance();
            c.add(Calendar.MONTH, 0);
            c.set(Calendar.DAY_OF_MONTH,1);
            String presentMonthStr = DateUtil.toString(c.getTime());
            //获取当月最后一天
            Calendar ca = Calendar.getInstance();
            ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
            String presentMonthEnd = DateUtil.toString(ca.getTime());
            //拼接本月新增问题过滤条件
            String filters2 = "recordTime>="+presentMonthStr+";recordTime<="+presentMonthEnd+";";
            //本月新增问题数量
            long thisMonthAdd = warningRecordService.getCount(filters2);
            String filters3 = filters2+"status=2;";
            //获取本月已解决问题数量
            long thisMonthDealed = warningRecordService.getCount(filters3);
            //待处理数量 = 本月新增+上月待处理-本月已解决
            long unDeal = lastMonth + thisMonthAdd - thisMonthDealed;
            Map<String, Long> map = new HashMap<String, Long>();
            map.put("lastMonth",lastMonth);//上个月待处理
            map.put("thisMonthAdd",thisMonthAdd);//本月新增
            map.put("thisMonthDealed",thisMonthDealed);//本月已解决
            map.put("unDeal",unDeal);//待解决
            envelop.setSuccessFlg(true);
            envelop.setObj(map);
        }catch (Exception e){
            e.printStackTrace();
            envelop.setSuccessFlg(false);
            envelop.setErrorMsg(e.getMessage());
        }
        return envelop;
    }
}

+ 2 - 0
src/main/java/com/yihu/ehr/analyze/job/PackDatasetDetailsJob.java

@ -55,6 +55,8 @@ public class PackDatasetDetailsJob {
                    map.put("dataset_name", redisClient.get("std_data_set_" + _key[2] + ":" + _key[4] + ":name"));
                    map.put("count", Integer.parseInt(_val[0]));
                    map.put("row", Integer.parseInt(_val[1]));
                    String orgArea = redisClient.get("organizations:" + _key[0] + ":area");
                    map.put("org_area",orgArea);
                    indexs.add(map);
                }
            });

+ 2 - 2
src/main/java/com/yihu/ehr/analyze/job/QcDataSetDetailJob.java

@ -1,7 +1,6 @@
package com.yihu.ehr.analyze.job;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yihu.ehr.analyze.feign.RedisServiceClient;
import com.yihu.ehr.elasticsearch.ElasticSearchUtil;
import com.yihu.ehr.redis.client.RedisClient;
import com.yihu.ehr.util.datetime.DateUtil;
@ -93,7 +92,8 @@ public class QcDataSetDetailJob {
            map.put("dataset_name", redisClient.get("std_data_set_" + version + ":" + dataSet + ":name"));
            map.put("row", row);
            map.put("count", 1);
            String orgArea = redisClient.get("organizations:" + orgCode + ":area");
            map.put("org_area",orgArea);
            res.add(map);
        }
    }

+ 204 - 0
src/main/java/com/yihu/ehr/analyze/service/dataQuality/DataCompleteService.java

@ -0,0 +1,204 @@
package com.yihu.ehr.analyze.service.dataQuality;
import com.yihu.ehr.util.datetime.DateUtil;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.*;
/**
 * 质控管理首页- 完整性逻辑类
 *
 * @author HZY
 * @created 2018/8/17 11:24
 */
@Service
public class DataCompleteService extends DataQualityBaseService {
    private final static Logger logger = LoggerFactory.getLogger(DataCompleteService.class);
    @Value("${quality.orgCode}")
    private String defaultOrgCode;
    @Value("${quality.cloud}")
    private String cloud;
    @Value("${quality.cloudName}")
    private String cloudName;
    @Autowired
    private DataCorrectService dataCorrectService;
    /**
     * 【完整性】 获取区域数据 - 行政区号分组
     *
     * @param startDate
     * @param endDate
     * @return
     * @throws Exception
     */
    @Override
    public List<Map<String, Object>> getAreaDataQuality(Integer dataLevel, String startDate, String endDate) throws Exception {
        String end = DateUtil.addDate(1, endDate, DateUtil.DEFAULT_DATE_YMD_FORMAT);
        Map<String, Object> resMap = null;
        List<Map<String, Object>> list = new ArrayList<>();
        double totalNum = 0;//平台总数
        double totalHospitalNum = 0;//医院总数
        //机构数据
        List<Map<String, Object>> groupList = dataCorrectService.getOrgDataMap(dataLevel, "create_date", startDate, end, null);
        //平台接收数据量
        Map<String, Object> platformDataGroup = getPlatformDataGroup(dataLevel, "receive_date", startDate, end, null);
        // 计算
        for (Map<String, Object> map : groupList) {
            resMap = new HashMap<String, Object>();
            String type = platformDataGroup.get("type").toString();
            String code = "";
            double platPormNum = 0;
            if ("org_area".equals(type)) {
                platPormNum = getDoubleValue(platformDataGroup.get(map.get("org_area")));
                code = map.get("org_area").toString();
            } else {
                platPormNum = getDoubleValue(platformDataGroup.get(map.get("org_code")));
                code = map.get("org_code").toString();
            }
            double orgNum = getDoubleValue(map.get("count"));
            double rate = calDoubleRate(platPormNum, orgNum);
            if (!"".equals(code)) {
                resMap.put("code", code);
                resMap.put("name", map.get("name"));
                resMap.put("count", platPormNum);
                resMap.put("total", orgNum);
                resMap.put("rate", rate);
                totalNum += platPormNum;
                list.add(resMap);
            } else {
                totalHospitalNum = platPormNum;
            }
        }
        //排序
        comparator(list);
        //添加总计
        if (totalHospitalNum !=0) {
            Map<String, Object> totalMap = genTotalData("上饶市",totalNum,totalHospitalNum);
            list.add(0, totalMap);
        }
        return list;
    }
    @Override
    public List<Map<String, Object>> getOrgDataQuality(Integer dataLevel, String areaCode, String startDate, String endDate) throws Exception {
        String end = DateUtil.addDate(1, endDate, DateUtil.DEFAULT_DATE_YMD_FORMAT);
        Map<String, Object> resMap = null;
        List<Map<String, Object>> list = new ArrayList<>();
        double totalNum = 0;//平台总数
        double totalHospitalNum = 0;//医院总数
        //机构数据
        List<Map<String, Object>> groupList = dataCorrectService.getOrgDataMap(dataLevel, "create_date", startDate, end, areaCode);
        //平台接收数据量
        Map<String, Object> platformDataGroup = getPlatformDataGroup(dataLevel, "receive_date", startDate, end, areaCode);
        // 计算
        for (Map<String, Object> map : groupList) {
            resMap = new HashMap<String, Object>();
            String type = platformDataGroup.get("type").toString();
            String code = "";
            double platPormNum = 0;
            if ("org_area".equals(type)) {
                platPormNum = getDoubleValue(platformDataGroup.get(map.get("org_area")));
                code = map.get("org_area").toString();
            } else {
                platPormNum = getDoubleValue(platformDataGroup.get(map.get("org_code")));
                code = map.get("org_code").toString();
            }
            double orgNum = getDoubleValue(map.get("count"));
            double rate = calDoubleRate(platPormNum, orgNum);
            if (!"".equals(code)) {
                resMap.put("code", code);
                resMap.put("name", map.get("name"));
                resMap.put("count", platPormNum);
                resMap.put("total", orgNum);
                resMap.put("rate", rate);
                totalNum += platPormNum;
                list.add(resMap);
            } else {
                totalHospitalNum = platPormNum;
            }
        }
        //排序
        comparator(list);
        //添加总计
        if (totalHospitalNum !=0) {
            Map<String, Object> totalMap = genTotalData("全部机构", totalNum, totalHospitalNum);
            list.add(0, totalMap);
        }
        return list;
    }
    /**
     * 获取平台区域分组档案数据量 - (区域编码分组)
     *
     * @param dataLevel 数据层级,:0:区域,1:机构
     * @param start
     * @param end
     * @return
     * @throws Exception
     */
    public Map<String, Object> getPlatformDataGroup(Integer dataLevel, String dateField, String start, String end, String orgArea) throws Exception {
        Map<String, Object> resMap = new HashMap<>();
        String dateStr = DateUtil.toString(new Date());
        double totalAreaCout = 0;//总计
        if (StringUtils.isBlank(start)) {
            start = dateStr;
        }
        if (StringUtils.isBlank(end)) {
            end = dateStr;
        }
        List<String> fields = new ArrayList<String>();
        fields.add("count");
        String sql1 = "";
        if (StringUtils.isNotEmpty(orgArea)) {
            //添加标识,标识是机构数据
            resMap.put("type", "org_code");
            fields.add("org_code");
            sql1 = "SELECT count(DISTINCT event_no) as count ,org_code FROM json_archives/info where pack_type=1 and analyze_status=3 and org_area='" + orgArea + "' and " +
                    dateField + ">='" + start + " 00:00:00' and " + dateField + "<='" + end + " 23:59:59' group by org_code";
        } else if (StringUtils.isEmpty(orgArea) && (dataLevel == 0 && StringUtils.isEmpty(orgArea))) {
            resMap.put("type", "org_area");
            fields.add("org_area");
            sql1 = "SELECT count(DISTINCT event_no) as count ,org_area FROM json_archives/info  where pack_type=1 and analyze_status=3 and " +
                    dateField + ">='" + start + " 00:00:00' and " + dateField + "<='" + end + " 23:59:59' group by org_area";
        } else if (StringUtils.isEmpty(orgArea) && (dataLevel == 1 && StringUtils.isEmpty(orgArea))) {
            resMap.put("type", "org_code");
            fields.add("org_code");
            sql1 = "SELECT count(DISTINCT event_no) as count ,org_code FROM json_archives/info  where pack_type=1 and analyze_status=3 and " +
                    dateField + ">='" + start + " 00:00:00' and " + dateField + "<='" + end + " 23:59:59' group by org_code";
        }
        List<Map<String, Object>> resultList = elasticSearchUtil.findBySql(fields, sql1);
        for (Map<String, Object> map : resultList) {
            totalAreaCout += getDoubleValue(map.get("count"));
            if (StringUtils.isNotEmpty(orgArea) || (dataLevel == 1 && StringUtils.isEmpty(orgArea))) {
                resMap.put(map.get("org_code").toString(), map.get("count"));
            } else {
                resMap.put(map.get("org_area").toString(), map.get("count"));
            }
        }
        if (!resMap.isEmpty()) {
            //总计
            if (dataLevel == 0) {
                //TODO 默认写上饶市,后面需要修改
                resMap.put("", totalAreaCout);
            } else {
                resMap.put("", totalAreaCout);
            }
        }
        return resMap;
    }
}

+ 347 - 0
src/main/java/com/yihu/ehr/analyze/service/dataQuality/DataCorrectService.java

@ -0,0 +1,347 @@
package com.yihu.ehr.analyze.service.dataQuality;
import com.yihu.ehr.entity.quality.DqPaltformReceiveWarning;
import com.yihu.ehr.redis.client.RedisClient;
import com.yihu.ehr.util.datetime.DateUtil;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.sql.ResultSet;
import java.util.*;
/**
 *  质控管理首页- 准确性逻辑类
 * @author HZY
 * @created 2018/8/17 11:24
 */
@Service
public class DataCorrectService extends DataQualityBaseService {
    private final static Logger logger = LoggerFactory.getLogger(DataCorrectService.class);
    @Value("${quality.orgCode}")
    private String defaultOrgCode;
    @Value("${quality.cloud}")
    private String cloud;
    @Value("${quality.cloudName}")
    private String cloudName;
    @Autowired
    private RedisClient redisClient;
    /**
     *  获取及时上传数
     * @param dateField  时间区间查询字段
     * @param start
     * @param end
     * @param warning  预警信息
     * @return
     */
    public double getInTimeNum(String dateField,String start, String end, DqPaltformReceiveWarning warning) {
        double totalInTime = 0;
        //及时率
        try {
            long starttime = System.currentTimeMillis();
            String sql0 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=2 AND pack_type=1 AND " + dateField +
                    " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59' and delay <=" + warning.getPeInTime();
            String sql1 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=1 AND pack_type=1 AND " + dateField +
                    " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59' and delay <=" + warning.getHospitalInTime();
            String sql2 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=0 AND pack_type=1 AND " + dateField +
                    " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59' and delay <=" + warning.getOutpatientInTime();
            ResultSet resultSet0 = elasticSearchUtil.findBySql(sql0);
            ResultSet resultSet1 = elasticSearchUtil.findBySql(sql1);
            ResultSet resultSet2 = elasticSearchUtil.findBySql(sql2);
            resultSet0.next();
            resultSet1.next();
            resultSet2.next();
            double outpatientInTime = new Double(resultSet2.getObject("COUNT(DISTINCT event_no)").toString());//门诊及时数
            double inpatientInTime = new Double(resultSet1.getObject("COUNT(DISTINCT event_no)").toString());//住院及时数
            double examInTime = new Double(resultSet0.getObject("COUNT(DISTINCT event_no)").toString());//体检及时数
            totalInTime = outpatientInTime + inpatientInTime + examInTime; // //就诊及时性
            logger.info("平台就诊及时人数 去重复:" + (System.currentTimeMillis() - starttime) + "ms");
        } catch (Exception e) {
            if (!"Error".equals(e.getMessage())) {
                e.printStackTrace();
            }
        }
        return totalInTime;
    }
    public Map<String, Object> genVisitMap(String typeField, double value, double total) {
        Map<String, Object> map = new HashMap<>();
        map.put("name", typeField);
        map.put("value", value);
        map.put("rate", calDoubleRate(value,total));
        return map;
    }
        /* ******************************** 区域层级模块相关 ***********************************/
    /**
     * 获取平台准确性-档案错误数
     *  (1. orgArea为空时,根据区域分组查询
     *   2. orgArea不为空时,根据机构分组查询)
     * @param dateField  时间区间查询字段
     * @param start
     * @param end
     * @param orgArea
     * @return
     */
    public Map<String,Object> getErrorPlatformData(Integer dataLevel,String dateField,String start, String end, String orgArea) {
        Map<String,Object> resMap = new HashMap<>();
        double totalAreaCout = 0;
        try {
            String dateStr = DateUtil.toString(new Date());
            if (StringUtils.isBlank(start)) {
                start = dateStr;
            }
            if (StringUtils.isBlank(end)) {
                end = dateStr;
            }
            List<String> fields = new ArrayList<String>();
            fields.add("count");
            String sql1 = "";
            if (StringUtils.isNotEmpty(orgArea) ) {
                resMap.put("type","org_code");
                fields.add("org_code");
                sql1 = "SELECT org_code,count(DISTINCT event_no) as count from json_archives_qc/qc_metadata_info where org_area='" + orgArea + "' and " +
                        dateField + ">='" + start + " 00:00:00' and "+ dateField + "<='" + end + " 23:59:59' and (qc_step=1 or qc_step=2) group by org_code";
            } else  if ( StringUtils.isEmpty(orgArea) && ( dataLevel ==0 && StringUtils.isEmpty(orgArea))){
                resMap.put("type","org_area");
                fields.add("org_area");
                sql1 = "SELECT org_area,count(DISTINCT event_no) as count from json_archives_qc/qc_metadata_info where " +
                        dateField +">='" + start + " 00:00:00' and "+dateField+"<='" + end + " 23:59:59' and (qc_step=1 or qc_step=2) group by org_area";
            }else if ( StringUtils.isEmpty(orgArea) && ( dataLevel ==1 && StringUtils.isEmpty(orgArea))){
                resMap.put("type","org_code");
                fields.add("org_code");
                sql1 = "SELECT org_code,count(DISTINCT event_no) as count from json_archives_qc/qc_metadata_info where " +
                        dateField +">='" + start + " 00:00:00' and "+dateField+"<='" + end + " 23:59:59' and (qc_step=1 or qc_step=2) group by org_code";
            }
            List<Map<String, Object>> resultList = elasticSearchUtil.findBySql(fields, sql1);
            if (resultList != null && resultList.size() > 0) {
                for (Map<String,Object> map : resultList){
                    totalAreaCout += getDoubleValue(map.get("count")) ;
                    if (StringUtils.isNotEmpty(orgArea) || ( dataLevel ==1 && StringUtils.isEmpty(orgArea))) {
                        resMap.put(map.get("org_code").toString(),map.get("count"));
                    }else {
                        resMap.put(map.get("org_area").toString(),map.get("count"));
                    }
                }
            }
            if (!resMap.isEmpty()) {
                //总计
                if (dataLevel ==0) {
                    // 默认上饶市,
                    resMap.put("", totalAreaCout);
                } else {
                    resMap.put("", totalAreaCout);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return resMap;
    }
    /**
     * 获取医院总数据量
     *  (1. orgArea为空时,根据区域分组查询
     *   2. orgArea不为空时,根据机构分组查询)
     *   @param dataLevel 数据级别:  0:区县,1:机构
     * @param start
     * @param end
     * @param orgArea
     * @return
     */
    public List<Map<String, Object>> getOrgDataMap(Integer dataLevel,String dateField,String start, String end, String orgArea) throws IOException {
        List<Map<String, Object>> resultList = new ArrayList<>();
        double totalAreaCout = 0;
        try {
            String dateStr = DateUtil.toString(new Date());
            if (StringUtils.isBlank(start)) {
                start = dateStr;
            }
            if (StringUtils.isBlank(end)) {
                end = dateStr;
            }
            if ("create_date".equals(dateField)) {
                start = start + "T00:00:00Z";
                end = end + "T23:59:59Z";
            }else {
                start = start +" 00:00:00";
                end = end +" 23:59:59";
            }
            List<String> fields = new ArrayList<String>();
            String sql1 = "";
            if (StringUtils.isNotEmpty(orgArea)) {
                fields.add("org_code");
                sql1 = "SELECT org_code,sum(HSI07_01_001) as count from qc/daily_report where org_area='" + orgArea + "' and " +
                        dateField + ">='" + start + "' and "+ dateField + "<='" + end + "' group by org_code";
            } else {
                if (dataLevel == 0) {
                    fields.add("org_area");
                    sql1 = "SELECT org_area,sum(HSI07_01_001) as count from qc/daily_report where " +
                            dateField +">='" + start + "' and "+dateField+"<='" + end + "' group by org_area";
                }else {
                    fields.add("org_code");
                    sql1 = "SELECT org_code,sum(HSI07_01_001) as count from qc/daily_report where " +
                            dateField +">='" + start + "' and "+dateField+"<='" + end + "' group by org_code";
                }
            }
            fields.add("count");
            resultList = elasticSearchUtil.findBySql(fields, sql1);
            //设置机构,区域名称
            if (resultList != null && resultList.size() > 0) {
                for (Map<String, Object> map1 : resultList) {
                    String name = "";
                    if (StringUtils.isNotEmpty(orgArea) || ( dataLevel ==1 && StringUtils.isEmpty(orgArea))) {
                        String code = (String) map1.get("org_code");
                        name = redisClient.get("organizations:" + code + ":name");
                    }else {
                        String code =  map1.get("org_area").toString();
                        name = redisClient.get("area:" + code + ":name");
                        totalAreaCout += getDoubleValue( map1.get("count"));
                    }
                    map1.put("name",name);
                }
            }
            if (!resultList.isEmpty()) {
                Map<String, Object> total = new HashMap<>();
                if (dataLevel ==0) {
                    // 临时写死上饶市
                    total.put("name", "上饶市");
                    total.put("org_area", "");
                    total.put("", totalAreaCout);
                    total.put("count", totalAreaCout);
                } else {
                    total.put("name", "全部机构");
                    total.put("org_code", "");
                    total.put("count", totalAreaCout);
                }
                resultList.add(0, total);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return resultList;
    }
    @Override
    public List<Map<String, Object>> getAreaDataQuality(Integer dataLevel,String startDate, String endDate) throws Exception {
        String end = DateUtil.addDate(1, endDate,DateUtil.DEFAULT_DATE_YMD_FORMAT);
        Map<String,Object> resMap = null;
        List<Map<String,Object>> list = new ArrayList<>();
        double totalNum = 0;//平台总数
        double totalHospitalNum = 0;//医院总数
        //机构数据
        List<Map<String,Object>> groupList = getOrgDataMap(dataLevel,"create_date",startDate,end,null);
        //平台接收错误数据量
        Map<String, Object> platformErrorGroup = getErrorPlatformData(dataLevel,"receive_date",startDate, end,null);
        // 计算
        for (Map<String,Object> map:groupList){
            resMap = new HashMap<String,Object>();
            String type = platformErrorGroup.get("type").toString();
            double platPormErrorNum = 0;
            String code = "";
            if ("org_area".equals(type)) {
                platPormErrorNum = getDoubleValue(platformErrorGroup.get(map.get("org_area")));
                code = map.get("org_area").toString();
            }else {
                platPormErrorNum = getDoubleValue(platformErrorGroup.get(map.get("org_code")));
                code = map.get("org_code").toString();
            }
            double orgNum = getDoubleValue(map.get("count"));
            double platPormNum = orgNum - platPormErrorNum;
            double rate = calDoubleRate(platPormNum,orgNum);
            if (!"".equals(code)) {
                resMap.put("code", code);
                resMap.put("name", map.get("name"));
                resMap.put("count", platPormNum);
                resMap.put("total", orgNum);
                resMap.put("rate", rate);
                list.add(resMap);
                totalNum += platPormNum;
            } else {
                totalHospitalNum = platPormNum;
            }
        }
        //排序
        comparator(list);
        //添加总计
        if (totalHospitalNum !=0) {
            Map<String, Object> totalMap = genTotalData("上饶市", totalNum, totalHospitalNum);
            list.add(0, totalMap);
        }
        return list;
    }
    @Override
    public List<Map<String, Object>> getOrgDataQuality(Integer dataLevel,String areaCode, String startDate, String endDate) throws Exception {
        String end = DateUtil.addDate(1, endDate,DateUtil.DEFAULT_DATE_YMD_FORMAT);
        Map<String,Object> resMap = null;
        List<Map<String,Object>> list = new ArrayList<>();
        double totalNum = 0;//平台总数
        double totalHospitalNum = 0;//医院总数
        //机构数据
        List<Map<String,Object>> groupList = getOrgDataMap(dataLevel,"create_date",startDate,end,areaCode);
        //平台接收数据量
        Map<String, Object> platformDataGroup = getErrorPlatformData(dataLevel,"receive_date",startDate, end,areaCode);
        // 计算
        for (Map<String,Object> map:groupList){
            resMap = new HashMap<String,Object>();
            String type = platformDataGroup.get("type").toString();
            double platPormErrorNum = 0;
            String code = "";
            if ("org_area".equals(type)) {
                platPormErrorNum = getDoubleValue(platformDataGroup.get(map.get("org_area")));
                code = map.get("org_area").toString();
            }else {
                platPormErrorNum = getDoubleValue(platformDataGroup.get(map.get("org_code")));
                code = map.get("org_code").toString();
            }
            double orgNum = getDoubleValue(map.get("count"));
            double platPormNum = orgNum - platPormErrorNum;
            double rate = calDoubleRate(platPormNum,orgNum);
            if (!"".equals(code)) {
                resMap.put("code", code);
                resMap.put("name", map.get("name"));
                resMap.put("count", platPormNum);
                resMap.put("total", orgNum);
                resMap.put("rate", rate);
                list.add(resMap);
                totalNum += platPormNum;
            } else {
                totalHospitalNum = platPormNum;
            }
        }
        //排序
        comparator(list);
        //添加总计
        if (totalHospitalNum !=0) {
            Map<String, Object> totalMap = genTotalData("全部机构", totalNum, totalHospitalNum);
            list.add(0, totalMap);
        }
        return list;
    }
}

+ 243 - 0
src/main/java/com/yihu/ehr/analyze/service/dataQuality/DataInTimeService.java

@ -0,0 +1,243 @@
package com.yihu.ehr.analyze.service.dataQuality;
import com.yihu.ehr.analyze.dao.DqPaltformReceiveWarningDao;
import com.yihu.ehr.entity.quality.DqPaltformReceiveWarning;
import com.yihu.ehr.redis.client.RedisClient;
import com.yihu.ehr.util.datetime.DateUtil;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 质控管理首页- 及时性逻辑类
 *
 * @author HZY
 * @created 2018/8/17 11:24
 */
@Service
public class DataInTimeService extends DataQualityBaseService {
    private final static Logger logger = LoggerFactory.getLogger(DataInTimeService.class);
    @Value("${quality.orgCode}")
    private String defaultOrgCode;
    @Value("${quality.cloud}")
    private String cloud;
    @Value("${quality.cloudName}")
    private String cloudName;
    @Autowired
    private RedisClient redisClient;
    @Autowired
    private DataCorrectService dataCorrectService;
    @Autowired
    private DqPaltformReceiveWarningDao dqPaltformReceiveWarningDao;
    /**
     * 获取及时接收档案数
     *
     * @param dateField 时间区间查询字段
     * @param start
     * @param end
     * @return
     */
    public Map<String, Object> getInTimeMap(Integer dataLevel,Integer eventType, String dateField, String start, String end, String orgArea) {
        Map<String, Object> resMap = new HashMap<>();
        double totalInTime = 0;
        //初始化 及时率预警信息
        DqPaltformReceiveWarning warning = dqPaltformReceiveWarningDao.findByOrgCode(defaultOrgCode);
        long starttime = System.currentTimeMillis();
        String sql0 = "";
        List<String> fields = new ArrayList<String>();
        fields.add("count");
        try {
            if (StringUtils.isNotEmpty(orgArea) ) {
                fields.add("org_code");
                sql0 = "SELECT  COUNT(DISTINCT event_no) as count,org_code FROM json_archives WHERE event_type=" + eventType + " AND pack_type=1 AND org_area='" + orgArea + "' AND " + dateField +
                        " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59' and delay <=" + warning.getPeInTime() + " GROUP BY org_code";
            } else if (  dataLevel ==0 && StringUtils.isEmpty(orgArea)){
                fields.add("org_area");
                sql0 = "SELECT  COUNT(DISTINCT event_no) as count,org_area FROM json_archives WHERE event_type=" + eventType + " AND pack_type=1 AND " + dateField +
                        " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59' and delay <=" + warning.getPeInTime() + " GROUP BY org_area";
            }else  if (  dataLevel ==1 && StringUtils.isEmpty(orgArea)){
                fields.add("org_code");
                sql0 = "SELECT  COUNT(DISTINCT event_no) as count,org_area FROM json_archives WHERE event_type=" + eventType + " AND pack_type=1 AND " + dateField +
                        " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59' and delay <=" + warning.getPeInTime() + " GROUP BY org_code";
            }
            List<Map<String, Object>> resultSet0 = elasticSearchUtil.findBySql(fields, sql0);
            if (resultSet0 != null && resultSet0.size() > 0) {
                for (Map<String, Object> map : resultSet0) {
                    if (StringUtils.isNotEmpty(orgArea) || ( dataLevel ==1 && StringUtils.isEmpty(orgArea))) {
                        resMap.put(map.get("org_code").toString(), map.get("count"));
                    } else {
                        resMap.put(map.get("org_area").toString(), map.get("count"));
                    }
                }
            }
            logger.info("平台就诊及时人数 去重复:" + (System.currentTimeMillis() - starttime) + "ms");
        } catch (Exception e) {
            if (!"Error".equals(e.getMessage())) {
                e.printStackTrace();
            }
        }
        return resMap;
    }
    /**
     * 获取及时上传数
     *
     * @param dateField 时间区间查询字段
     * @param start
     * @param end
     * @return
     */
    public Map<String, Object> getInTimeMap(Integer dataLevel,String dateField, String start, String end, String orgArea) {
        Map<String, Object> resMap = new HashMap<>();
        double totalAreaCout = 0;//总计
        double totalInTime = 0;//就诊及时数
        //初始化 及时率预警信息
        DqPaltformReceiveWarning warning = dqPaltformReceiveWarningDao.findByOrgCode(defaultOrgCode);
        long starttime = System.currentTimeMillis();
        //获取及时数组
        Map<String, Object> outPatientInTimeMap = getInTimeMap(dataLevel,0, dateField, start, end, orgArea); //门诊及时数
        Map<String, Object> inPatientInTimeMap = getInTimeMap(dataLevel,1, dateField, start, end, orgArea); //住院及时数
        Map<String, Object> examInTimeMap = getInTimeMap(dataLevel,2, dateField, start, end, orgArea); //体检及时数
        for (String key : outPatientInTimeMap.keySet()) {
            double outpatientInTime = getDoubleValue(outPatientInTimeMap.get(key));
            double inpatientInTime = getDoubleValue(inPatientInTimeMap.get(key));
            double examInTime = getDoubleValue(examInTimeMap.get(key));
            totalInTime = outpatientInTime + inpatientInTime + examInTime; // //就诊及时性
            resMap.put(key, totalInTime);
            totalAreaCout += totalInTime;
        }
        //指定数据类型
        if (dataLevel ==0) {
            resMap.put("type", "org_area");
        } else {
            resMap.put("type", "org_code");
        }
        //总计
        if (!resMap.isEmpty()) {
            resMap.put("", totalAreaCout);
        }
        logger.info("平台就诊及时人数 去重复:" + (System.currentTimeMillis() - starttime) + "ms");
        return resMap;
    }
    /* ******************************** 区域层级模块相关 ***********************************/
    @Override
    public List<Map<String, Object>> getAreaDataQuality(Integer dataLevel,String startDate, String endDate) throws Exception {
        String end = DateUtil.addDate(1, endDate, DateUtil.DEFAULT_DATE_YMD_FORMAT);
        Map<String, Object> resMap = null;
        List<Map<String, Object>> list = new ArrayList<>();
        double totalNum = 0;//平台总数
        double totalHospitalNum = 0;//医院总数
        //机构数据
        List<Map<String, Object>> groupList = dataCorrectService.getOrgDataMap(dataLevel,"create_date", startDate, end, null);
        //平台接收数据量
        Map<String, Object> platformDataGroup = getInTimeMap(dataLevel,"receive_date", startDate, end, null);
        // 计算
        for (Map<String, Object> map : groupList) {
            resMap = new HashMap<String, Object>();
            String type = platformDataGroup.get("type").toString();
            String code = "";
            double platPormNum = 0;
            if ("org_area".equals(type)) {
                platPormNum = getDoubleValue(platformDataGroup.get(map.get("org_area")));
                code = map.get("org_area").toString();
            } else {
                platPormNum = getDoubleValue(platformDataGroup.get(map.get("org_code")));
                code = map.get("org_code").toString();
            }
            double orgNum = getDoubleValue(map.get("count"));
            double rate = calDoubleRate(platPormNum, orgNum);
            if (!"".equals(code)) {
                resMap.put("code", code);
                resMap.put("name", map.get("name"));
                resMap.put("count", platPormNum);
                resMap.put("total", orgNum);
                resMap.put("rate", rate);
                list.add(resMap);
                totalNum += platPormNum;
            } else {
                totalHospitalNum = platPormNum;
            }
        }
        //排序
        comparator(list);
        //添加总计
        if (totalHospitalNum !=0) {
            Map<String, Object> totalMap = genTotalData("上饶市", totalNum, totalHospitalNum);
            list.add(0, totalMap);
        }
        return list;
    }
    @Override
    public List<Map<String, Object>> getOrgDataQuality(Integer dataLevel,String areaCode, String startDate, String endDate) throws Exception {
        String end = DateUtil.addDate(1, endDate, DateUtil.DEFAULT_DATE_YMD_FORMAT);
        Map<String, Object> resMap = null;
        List<Map<String, Object>> list = new ArrayList<>();
        double totalNum = 0;//平台总数
        double totalHospitalNum = 0;//医院总数
        //机构数据
        List<Map<String, Object>> groupList = dataCorrectService.getOrgDataMap(dataLevel,"create_date", startDate, end, areaCode);
        //平台接收数据量
        Map<String, Object> platformDataGroup = getInTimeMap(dataLevel,"receive_date", startDate, end, areaCode);
        // 计算
        for (Map<String, Object> map : groupList) {
            resMap = new HashMap<String, Object>();
            String type = platformDataGroup.get("type").toString();
            String code = "";
            double platPormNum = 0;
            if ("org_area".equals(type)) {
                platPormNum = getDoubleValue(platformDataGroup.get(map.get("org_area")));
                code = map.get("org_area").toString();
            } else {
                platPormNum = getDoubleValue(platformDataGroup.get(map.get("org_code")));
                code = map.get("org_code").toString();
            }
            double orgNum = getDoubleValue(map.get("count"));
            double rate = calDoubleRate(platPormNum, orgNum);
            if (!"".equals(code)) {
                resMap.put("code", code);
                resMap.put("name", map.get("name"));
                resMap.put("count", platPormNum);
                resMap.put("total", orgNum);
                resMap.put("rate", rate);
                list.add(resMap);
                totalNum += platPormNum;
            } else {
                totalHospitalNum = platPormNum;
            }
        }
        //排序
        comparator(list);
        //添加总计
        if (totalHospitalNum !=0) {
            Map<String, Object> totalMap = genTotalData("全部机构", totalNum, totalHospitalNum);
            list.add(0, totalMap);
        }
        return list;
    }
}

+ 176 - 0
src/main/java/com/yihu/ehr/analyze/service/dataQuality/DataQualityBaseService.java

@ -0,0 +1,176 @@
package com.yihu.ehr.analyze.service.dataQuality;
import com.yihu.ehr.elasticsearch.ElasticSearchUtil;
import com.yihu.ehr.query.BaseJpaService;
import com.yihu.ehr.util.datetime.DateUtil;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.*;
/**
 * 质控管理首页- 基础逻辑类
 *
 * @author HZY
 * @created 2018/8/17 11:24
 */
@Service
public abstract class DataQualityBaseService extends BaseJpaService {
    @Value("${quality.orgCode}")
    private String defaultOrgCode;
    @Value("${quality.cloud}")
    private String cloud;
    @Value("${quality.cloudName}")
    private String cloudName;
    @Autowired
    protected ElasticSearchUtil elasticSearchUtil;
    /**
     * 获取市级下的区县质控信息 - 【区域级别】
     *
     * @param startDate
     * @param endDate
     * @return
     * @throws Exception
     */
    public abstract List<Map<String, Object>> getAreaDataQuality(Integer dataLevel,String startDate, String endDate) throws Exception;
    /**
     * 获取区县下的机构质控信息 - 【机构级别】
     *
     * @param areaCode  区域编码
     * @param startDate
     * @param endDate
     * @return
     * @throws Exception
     */
    public abstract List<Map<String, Object>> getOrgDataQuality(Integer dataLevel,String areaCode, String startDate, String endDate) throws Exception;
    /**
     *  生成总计map
     * @param name  机构名称/区域名称
     * @param platformNum
     * @param orgNum
     * @return
     */
    public Map<String,Object> genTotalData(String name ,double platformNum,double orgNum){
        Map<String,Object> totalMap = new HashMap<>();
        totalMap.put("code", "");
        totalMap.put("name", name);
        totalMap.put("count", platformNum);
        totalMap.put("total", orgNum);
        double rate = calDoubleRate(platformNum, orgNum);
        totalMap.put("rate", rate + "%");
        return totalMap;
    }
    /**
     * 通过map中的rate字段降序排列
     * @param list
     */
    public void comparator(List<Map<String, Object>> list ){
        Collections.sort(list, new Comparator<Map<String, Object>>() {
            public int compare(Map<String, Object> o1, Map<String, Object> o2) {
                return getDoubleValue(o2.get("rate")).compareTo(getDoubleValue(o1.get("rate")));
            }
        });
        list.forEach(map->{
            map.put("rate",map.get("rate") + "%");
        });
    }
    /**
     * 百分比计算(不带单位)
     * @param molecular
     * @param denominator
     * @return
     */
    public Double calDoubleRate(double molecular, double denominator) {
        if (molecular == 0) {
            return 0.00;
        } else if (denominator == 0) {
            return 100.00;
        }
        BigDecimal b = new BigDecimal((molecular/denominator) *100) ;
        return b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
    }
    /**
     * 获取douuble值
     *
     * @param objValue
     * @return
     */
    public Double getDoubleValue(Object objValue) {
        double value = 0;
        try {
            if (objValue != null)
                value = Double.parseDouble(objValue.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return value;
    }
    /**
     * 获取医院日报数据量
     * @param start
     * @param orgCode
     * @return
     */
    public Map<String,Object> getHospitalDataCount(String start,String end, String orgCode) {
        long starttime = System.currentTimeMillis();
        Map<String,Object> resMap = new HashMap<String,Object>();
        int total=0;
        int inpatient_total=0;
        int oupatient_total=0;
        int exam_total=0;
        String dateStr = DateUtil.toString(new Date());
        if (StringUtils.isBlank(start)) {
            start = dateStr;
        }
        if (StringUtils.isBlank(end)) {
            end = dateStr;
        }
        try {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("create_date>=" + start + "T00:00:00Z;");
            stringBuilder.append("create_date<=" + end + "T23:59:59Z;");
            if (StringUtils.isNotEmpty(orgCode)) {
                stringBuilder.append("org_code?" + orgCode);
            }
            List<Map<String, Object>> res = elasticSearchUtil.list("qc","daily_report", stringBuilder.toString());
            if(res!=null && res.size()>0){
                for(Map<String,Object> report : res){
                    total+=Integer.parseInt(report.get("HSI07_01_001").toString());
                    inpatient_total+=Integer.parseInt(report.get("HSI07_01_012").toString());
                    oupatient_total+=Integer.parseInt(report.get("HSI07_01_002").toString());
                    exam_total+=Integer.parseInt(report.get("HSI07_01_004").toString());
                }
            }
            resMap.put("total",total);
            resMap.put("inpatient_total",inpatient_total);
            resMap.put("oupatient_total",oupatient_total);
            resMap.put("exam_total",exam_total);
            long endtime = System.currentTimeMillis();
            System.out.println("获取医院上传数据量耗时:" + (endtime - starttime) + "ms");
            return resMap;
        }catch (Exception e){
            e.printStackTrace();
            resMap.put("total",0);
            resMap.put("inpatient_total",0);
            resMap.put("oupatient_total",0);
            return resMap;
        }
    }
}

+ 514 - 0
src/main/java/com/yihu/ehr/analyze/service/dataQuality/DataQualityHomeService.java

@ -0,0 +1,514 @@
package com.yihu.ehr.analyze.service.dataQuality;
import com.yihu.ehr.analyze.dao.DqPaltformReceiveWarningDao;
import com.yihu.ehr.analyze.service.pack.PackQcReportService;
import com.yihu.ehr.elasticsearch.ElasticSearchUtil;
import com.yihu.ehr.entity.quality.DqPaltformReceiveWarning;
import com.yihu.ehr.profile.qualilty.DqDataType;
import com.yihu.ehr.query.BaseJpaService;
import com.yihu.ehr.redis.client.RedisClient;
import com.yihu.ehr.util.datetime.DateUtil;
import com.yihu.ehr.util.rest.Envelop;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.io.IOException;
import java.sql.ResultSet;
import java.text.DecimalFormat;
import java.util.*;
/**
 *  质控管理- 首页逻辑类
 * @author HZY
 * @created 2018/8/17 11:24
 */
@Service
public class DataQualityHomeService extends BaseJpaService {
    private final static Logger logger = LoggerFactory.getLogger(DataQualityHomeService.class);
    @Autowired
    private ElasticSearchUtil elasticSearchUtil;
    @Autowired
    private DqPaltformReceiveWarningDao dqPaltformReceiveWarningDao;
    @Autowired
    private PackQcReportService packQcReportService;
    @Value("${quality.orgCode}")
    private String defaultOrgCode;
    @Value("${quality.cloud}")
    private String cloud;
    @Value("${quality.cloudName}")
    private String cloudName;
    @Autowired
    private RedisClient redisClient;
    @Autowired
    private DataCompleteService dataCompleteService;
    @Autowired
    private ApplicationContext context;
    private Map<DqDataType, DataQualityBaseService> dqBaseServiceMap;
    @PostConstruct
    private void init() {
        dqBaseServiceMap = new HashMap<>();
        dqBaseServiceMap.put(DqDataType.complete, context.getBean(DataCompleteService.class));
        dqBaseServiceMap.put(DqDataType.imTime, context.getBean(DataInTimeService.class));
        dqBaseServiceMap.put(DqDataType.correct, context.getBean(DataCorrectService.class));
    }
    public DataQualityBaseService getInstance(DqDataType type){
        DataQualityBaseService dataQualityBaseService;
        switch (type) {
            case complete:
                dataQualityBaseService = dqBaseServiceMap.get(DqDataType.complete);
                break;
            case imTime:
                dataQualityBaseService = dqBaseServiceMap.get(DqDataType.imTime);
                break;
            case correct:
                dataQualityBaseService = dqBaseServiceMap.get(DqDataType.correct);
                break;
            default:
                throw new RuntimeException("Failed to identify dataQualityBaseService type");
        }
        return dataQualityBaseService;
    }
    /**
     * 平台就诊人数 去重复(完整人数)  档案完整性
     * @param dateField 时间区间查询字段
     * @param start
     * @param end
     * @param orgCode
     * @return
     */
    public void getPatientCount(String dateField,String start, String end, String orgCode, Map<String, Object> map) throws Exception {
        try {
            long starttime = System.currentTimeMillis();
            String sql0 = "";
            String sql1 = "";
            String sql2 = "";
            String sql3 = "";
            if (StringUtils.isNotEmpty(orgCode)) {
                sql0 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=2 AND pack_type=1 AND org_code='" + orgCode + "' AND " + dateField + " BETWEEN" +
                        " '" + start + " 00:00:00' AND '" + end + " 23:59:59'";
                sql1 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=1 AND pack_type=1 AND org_code='" + orgCode + "' AND " + dateField + " BETWEEN" +
                        " '" + start + " 00:00:00' AND '" + end + " 23:59:59'";
                sql2 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=0 AND pack_type=1 AND org_code='" + orgCode + "' AND " + dateField + " BETWEEN " +
                        "'" + start + " 00:00:00' AND '" + end + " 23:59:59'";
                sql3 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE pack_type=1 AND org_code='" + orgCode + "' AND " + dateField + " BETWEEN " +
                        "'" + start + " 00:00:00' AND '" + end + " 23:59:59'";
            } else {
                sql0 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=2 AND pack_type=1 AND " + dateField +
                        " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59'";
                sql1 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=1 AND pack_type=1 AND " + dateField +
                        " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59'";
                sql2 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=0 AND pack_type=1 AND " + dateField +
                        " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59'";
                sql3 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE pack_type=1 AND " + dateField +
                        " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59'";
            }
            ResultSet resultSet0 = elasticSearchUtil.findBySql(sql0);
            ResultSet resultSet1 = elasticSearchUtil.findBySql(sql1);
            ResultSet resultSet2 = elasticSearchUtil.findBySql(sql2);
            ResultSet resultSet3 = elasticSearchUtil.findBySql(sql3);
            resultSet0.next();
            resultSet1.next();
            resultSet2.next();
            resultSet3.next();
            map.put("peIntegrity", new Double(resultSet0.getObject("COUNT(DISTINCT event_no)").toString()).intValue());//体检
            map.put("hospitalIntegrity", new Double(resultSet1.getObject("COUNT(DISTINCT event_no)").toString()).intValue());//住院
            map.put("outpatientIntegrity", new Double(resultSet2.getObject("COUNT(DISTINCT event_no)").toString()).intValue());//门诊
            map.put("visitIntegrity", new Double(resultSet3.getObject("COUNT(DISTINCT event_no)").toString()).intValue());//就诊
            logger.info("平台就诊人数 去重复:" + (System.currentTimeMillis() - starttime) + "ms");
        } catch (Exception e) {
            if (!"Error".equals(e.getMessage())) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 百分比计算
     *
     * @param molecular   分子
     * @param denominator 分母
     * @return
     */
    public String calRate(double molecular, double denominator) {
        if (molecular == 0) {
            return "0.00%";
        } else if (denominator == 0) {
            return "100.00%";
        }
        DecimalFormat decimalFormat = new DecimalFormat("0.00%");
        return decimalFormat.format(molecular / denominator);
    }
    /**
     * 质控情况 -  总计 (及时率,完整率,准确率)
     *
     * @param start 就诊时间- 起始
     * @param end   就诊时间- 截止
     *              【目前取的是平台全部机构,若做多区域平台的话,需要添加区域参数】
     */
    public Map<String, Object> getQuailyDetail(String start, String end) throws Exception {
        Map<String, Object> totalMap = new HashMap<>();
        List<Map<String, Object>> archiveMapList = new ArrayList<>();
        String dateStr = DateUtil.toString(new Date());
        if (StringUtils.isBlank(start)) {
            start = dateStr;
        }
        if (StringUtils.isBlank(end)) {
            end = dateStr;
        }
        //初始化 及时率预警信息
        DqPaltformReceiveWarning warning = dqPaltformReceiveWarningDao.findByOrgCode(defaultOrgCode);
        int totalHospitalNum = 0;//医院总就诊数
        double hospitalOutpatientNum = 0;//总门诊数
        double hospitalExamNum = 0;//总体检数
        double hospitalInpatientNum = 0;//总住院数
        double totalOutpatientNum = 0;//总门诊数
        double totalExamNum = 0;//总体检数
        double totalInpatientNum = 0;//总住院数
        double totalInTime = 0;//总及时数
        double totalVisitNum = 0;//总完整数(平台总就诊数)
        double totalCorrect = 0;//总准确数
        //1. 获取医院档案量;
        Envelop envelop = packQcReportService.dailyReport("create_date", start + "T00:00:00Z", end + "T23:59:59Z", null);
        Map<String, Object> hospitalDataMap = (Map<String, Object>) envelop.getDetailModelList().get(0);
        //医院总数据量
        totalHospitalNum = (int) hospitalDataMap.get("total");
        hospitalOutpatientNum = (int) hospitalDataMap.get("oupatient");
        hospitalInpatientNum = (int) hospitalDataMap.get("inpatient");
        hospitalExamNum = (int) hospitalDataMap.get("physical");
        Map<String, Object> dataMap = new HashMap<>();
        //2. 平台就诊完整数
        getPatientCount("receive_date",start, end, null, dataMap);
        totalOutpatientNum = Double.valueOf(dataMap.get("outpatientIntegrity").toString());//门诊完整数
        totalInpatientNum = Double.valueOf(dataMap.get("hospitalIntegrity").toString());//住院完整数
        totalExamNum = Double.valueOf(dataMap.get("peIntegrity").toString());//体检完整数
        totalVisitNum = Double.valueOf(dataMap.get("visitIntegrity").toString());//就诊完整数
        //3. 及时数
        totalInTime = getInTimeNum("receive_date" ,start, end, warning);
        // 3. 准确数
        totalCorrect = getErrorDataSetData("receive_date",start, end, null);
        //4. 数据集总条数
        int dataSetsMun = getDataSetsMap(start, end, null);
        totalMap.put("orgCode", cloud);//机构code
        totalMap.put("orgName", cloudName);//机构名称
        totalMap.put("totalInTime", totalInTime);//及时数
        totalMap.put("totalComplete", totalVisitNum);//总就诊完整数
        totalMap.put("totalCorrect", totalCorrect);//准确数
        totalMap.put("totalHospital", totalHospitalNum);//医院总就诊数
        totalMap.put("totalDataSet", dataSetsMun);//数据集总行数
        //计算及时率及完整率,准确性
        totalMap.put("inTimeRate", calRate(totalInTime, totalHospitalNum));//及时率
        totalMap.put("completeRate", calRate(totalVisitNum, totalHospitalNum));//完整率
        totalMap.put("correctRate", calRate(totalCorrect, dataSetsMun));//数据集准确率
        Map<String, Object> outPatientMap = genVisitMap("outPatient", hospitalOutpatientNum, totalHospitalNum);
        Map<String, Object> inPatientMap = genVisitMap("inPatient", hospitalInpatientNum, totalHospitalNum);
        Map<String, Object> examPatientMap = genVisitMap("exam", hospitalExamNum, totalHospitalNum);
        archiveMapList.add(outPatientMap);
        archiveMapList.add(inPatientMap);
        archiveMapList.add(examPatientMap);
        //档案包采集情况
        totalMap.put("rate", archiveMapList);
        return totalMap;
    }
    /**
     * 获取质控错误 - 数据集总条数
     * @param dateField  时间区间查询字段
     * @param start
     * @param end
     * @param orgCode
     * @return
     */
    public double getErrorDataSetData(String dateField,String start, String end, String orgCode) {
        Map<String, Object> map = new HashMap<String, Object>();
        double num1 = 0;
        try {
            String dateStr = DateUtil.toString(new Date());
            if (StringUtils.isBlank(start)) {
                start = dateStr;
            }
            if (StringUtils.isBlank(end)) {
                end = dateStr;
            }
            List<String> fields = new ArrayList<String>();
            fields.add("dataset");
            fields.add("count");
            String sql1 = "";
            if (StringUtils.isNotEmpty(orgCode)) {
                sql1 = "SELECT dataset,count(DISTINCT event_no) as count from json_archives_qc/qc_metadata_info where org_code='" + orgCode + "' " +
                        dateField + ">='" + start + " 00:00:00' and "+ dateField + "<='" + end + " 23:59:59' and (qc_step=1 or qc_step=2) group by dataset";
            } else {
                sql1 = "SELECT dataset,count(DISTINCT event_no) as count from json_archives_qc/qc_metadata_info where " +
                        dateField +">='" + start + " 00:00:00' and "+dateField+"<='" + end + " 23:59:59' and (qc_step=1 or qc_step=2) group by dataset";
            }
            List<Map<String, Object>> list1 = elasticSearchUtil.findBySql(fields, sql1);
            if (list1 != null && list1.size() > 0) {
                for (Map<String, Object> map1 : list1) {
                    num1 += (double) map1.get("count");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            num1 = 0;
        }
        return num1;
    }
    /**
     * 获取数据集总量
     *
     * @param start
     * @param end
     * @param orgCode
     * @return
     */
    public int getDataSetsMap(String start, String end, String orgCode) throws IOException {
        // TODO 数据集总量
        int totalNum = 0;
        String dateStr = DateUtil.toString(new Date());
        if (StringUtils.isBlank(start)) {
            start = dateStr;
        }
        if (StringUtils.isBlank(end)) {
            end = dateStr;
        }
        StringBuilder stringBuilder1 = new StringBuilder();
        stringBuilder1.append("receive_date>=").append(start).append(" 00:00:00").append(";");
        stringBuilder1.append("receive_date<=").append(end).append(" 23:59:59").append(";");
        if (StringUtils.isNotBlank(orgCode)) {
            stringBuilder1.append("org_code=" + orgCode);
        }
        List<Map<String, Object>> dataSets = elasticSearchUtil.list("json_archives_qc", "qc_dataset_detail", stringBuilder1.toString());
        for (Map<String, Object> dataSet : dataSets) {
            for (Map.Entry<String, Object> entry : dataSet.entrySet()) {
                totalNum += (Integer) dataSet.get("row");
            }
        }
        return totalNum;
    }
    /**
     *  获取及时上传数
     * @param dateField  时间区间查询字段
     * @param start
     * @param end
     * @param warning  预警信息
     * @return
     */
    public double getInTimeNum(String dateField,String start, String end, DqPaltformReceiveWarning warning) {
        double totalInTime = 0;
        //及时率
        try {
            long starttime = System.currentTimeMillis();
            String sql0 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=2 AND pack_type=1 AND " + dateField +
                    " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59' and delay <=" + warning.getPeInTime();
            String sql1 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=1 AND pack_type=1 AND " + dateField +
                    " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59' and delay <=" + warning.getHospitalInTime();
            String sql2 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=0 AND pack_type=1 AND " + dateField +
                    " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59' and delay <=" + warning.getOutpatientInTime();
            ResultSet resultSet0 = elasticSearchUtil.findBySql(sql0);
            ResultSet resultSet1 = elasticSearchUtil.findBySql(sql1);
            ResultSet resultSet2 = elasticSearchUtil.findBySql(sql2);
            resultSet0.next();
            resultSet1.next();
            resultSet2.next();
            double outpatientInTime = new Double(resultSet2.getObject("COUNT(DISTINCT event_no)").toString());//门诊及时数
            double inpatientInTime = new Double(resultSet1.getObject("COUNT(DISTINCT event_no)").toString());//住院及时数
            double examInTime = new Double(resultSet0.getObject("COUNT(DISTINCT event_no)").toString());//体检及时数
            totalInTime = outpatientInTime + inpatientInTime + examInTime; // //就诊及时性
            logger.info("平台就诊及时人数 去重复:" + (System.currentTimeMillis() - starttime) + "ms");
        } catch (Exception e) {
            if (!"Error".equals(e.getMessage())) {
                e.printStackTrace();
            }
        }
        return totalInTime;
    }
    public Map<String, Object> genVisitMap(String typeField, double value, double total) {
        Map<String, Object> map = new HashMap<>();
        map.put("name", typeField);
        map.put("value", value);
        map.put("rate", calRate(value,total));
        return map;
    }
    /**
     *  批量更新es中的区域编码org_area
     *  (通过机构编码org_code 更新org_area)
     */
    public void bulkUpdateOrgArea(String index,String type){
        List<Map<String, Object>> result = elasticSearchUtil.list(index, type, "");
        List<Map<String, Object>> updateSourceList = new ArrayList<>();
        result.forEach(item -> {
            Map<String, Object> updateSource = new HashMap<>();
            updateSource.put("_id", item.get("_id"));
            String orgCode = (String) item.get("org_code");
            String orgArea = redisClient.get("organizations:" + orgCode + ":area");
            updateSource.put("org_area", orgArea);
            updateSourceList.add(updateSource);
        });
        elasticSearchUtil.bulkUpdate(index, type, updateSourceList);
    }
             /* ******************************** 区域层级模块相关 ***********************************/
    /**
     *  获取市区域的下级区域质控情况
     * @param dataType 数据维度  (0: 完整性,1:及时性,2:准确性)
     * @param start
     * @param end
     * @return
     */
    public List<Map<String,Object>> findAreaData(Integer dataType, String start, String end) throws Exception {
        List<Map<String,Object>> list = new ArrayList<>();
        String dateStr = DateUtil.toString(new Date());
        if (StringUtils.isBlank(start)) {
            start = dateStr;
        }
        if (StringUtils.isBlank(end)) {
            end = dateStr;
        }
        DataQualityBaseService dataQualityBaseService = getInstance(DqDataType.create(dataType));
        list = dataQualityBaseService.getAreaDataQuality(0,start,end);
        return list;
    }
    /* ******************************** 机构 层级模块相关 ***********************************/
    /**
     *  获取区县下的机构质控情况
     * @param dataType 数据维度  (0: 完整性,1:及时性,2:准确性)
     * @param areaCode 上区域编码
     * @param start
     * @param end
     * @return
     */
    public List<Map<String,Object>> findOrgData(Integer dataType , String areaCode, String start, String end) throws Exception {
        List<Map<String,Object>> list = new ArrayList<>();
        String dateStr = DateUtil.toString(new Date());
        if (StringUtils.isBlank(start)) {
            start = dateStr;
        }
        if (StringUtils.isBlank(end)) {
            end = dateStr;
        }
        DataQualityBaseService dataQualityBaseService = getInstance(DqDataType.create(dataType));
        list = dataQualityBaseService.getOrgDataQuality(1,areaCode,start,end);
        return list;
    }
    /**
     * 首页错误数据集
     * @param orgCode
     * @param dataType
     * @param start
     * @param end
     * @return
     * @throws Exception
     */
    public List<Map<String,Object>> homeDatasetError(String orgArea, String orgCode, Integer dataType, String start, String end) throws Exception {
        List<String> fileds = new ArrayList<>();
        fileds.add("dataset");
        fileds.add("count");
        fileds.add("version");
        StringBuffer sql = new StringBuffer();
        sql.append("SELECT dataset,COUNT(dataset) count ,version FROM json_archives_qc/qc_metadata_info ");
        sql.append(" WHERE receive_date>='" + start + " 00:00:00' and (qc_step=1 or qc_step=2) and  receive_date<='" + end + " 23:59:59'");
        if(StringUtils.isNotEmpty(orgArea)){
            sql.append(" AND org_area = '"+orgArea+"'");
        }
        if(StringUtils.isNotEmpty(orgCode)){
            sql.append(" AND org_code = '"+orgCode+"'");
        }
        if(dataType == 0){
            sql.append(" AND qc_error_type=1");
        }else{
            sql.append(" AND qc_error_type<>1");
        }
        sql.append(" group by dataset,version");
        List<Map<String,Object>> list = elasticSearchUtil.findBySql(fileds,sql.toString());
        for(Map<String,Object> map:list){
            map.put("dataset_name", redisClient.get("std_data_set_" + map.get("version") + ":" + map.get("dataset") + ":name"));
        }
        return list;
    }
    /**
     * 首页错误数据元
     * @param dataset
     * @param dataType
     * @param start
     * @param end
     * @return
     * @throws Exception
     */
    public List<Map<String,Object>> homeMetadataError(String orgArea, String orgCode, String dataset ,Integer dataType,String start,String end) throws Exception {
        List<String> fileds = new ArrayList<>();
        fileds.add("dataset");
        fileds.add("metadata");
        fileds.add("count");
        fileds.add("version");
        StringBuffer sql = new StringBuffer();
        sql.append("SELECT dataset, metadata,COUNT(metadata) count ,version FROM json_archives_qc/qc_metadata_info ");
        sql.append(" WHERE receive_date>='" + start + " 00:00:00' and (qc_step=1 or qc_step=2) and receive_date<='" + end + " 23:59:59'");
        if(StringUtils.isNotEmpty(orgArea)){
            sql.append(" AND org_area = '"+orgArea+"'");
        }
        if(StringUtils.isNotEmpty(orgCode)){
            sql.append(" AND org_code = '"+orgCode+"'");
        }
        if(StringUtils.isNotEmpty(dataset)){
            sql.append(" AND dataset = '"+dataset+"'");
        }
        if(dataType == 0){
            sql.append(" AND qc_error_type=1");
        }else{
            sql.append(" AND qc_error_type<>1");
        }
        sql.append(" group by dataset,metadata,version");
        List<Map<String,Object>> list = elasticSearchUtil.findBySql(fileds,sql.toString());
        for(Map<String,Object> map:list){
            map.put("metadata_name", redisClient.get("std_meta_data_" + map.get("version") + ":" + map.get("dataset")+"."+ map.get("metadata")+ ":name"));
        }
        return list;
    }
}

+ 52 - 33
src/main/java/com/yihu/ehr/analyze/service/dataQuality/DataQualityStatisticsService.java

@ -70,7 +70,7 @@ public class DataQualityStatisticsService extends BaseJpaService {
        orgList.forEach(one -> {
            String orgCode = one[0].toString();
            String name = one[1].toString();
            orgMap.put(orgCode,name);
            orgMap.put(orgCode, name);
        });
        return orgMap;
    }
@ -192,6 +192,7 @@ public class DataQualityStatisticsService extends BaseJpaService {
        double totalHospitalDataset = 0;//医疗云总数据集数
        double totalReceiveArchives = 0;//医疗云总接收档案数
        double totalReceiveException = 0;//医疗云总接收质量异常数
        double totalReceiveError = 0;//医疗云总接收质量错误数
        double totalReceiveDataset = 0;//医疗云总接收据集数
        double totalResourceFailure = 0;//医疗云总资源化失败数
        double totalResourceSuccess = 0;//医疗云总资源化成功数
@ -313,6 +314,23 @@ public class DataQualityStatisticsService extends BaseJpaService {
                }
            }
            //接收 质量异常
            String sql4 = "SELECT count(*) c FROM json_archives/info where receive_date>= '" + start + " 00:00:00' AND receive_date<='" + end + " 23:59:59' and analyze_status=2 and pack_type=1 and org_code='" + orgCode + "' ";
            if (eventType != null) {
                sql4 += " and event_type = " + eventType;
            }
            try {
                ResultSet resultSet4 = elasticSearchUtil.findBySql(sql4);
                resultSet4.next();
                double total = resultSet4.getDouble("c");//接收 解析错误
                map.put("receiveError", total);
                totalReceiveError += total;
            } catch (Exception e) {
                if (!"Error".equals(e.getMessage())) {
                    e.printStackTrace();
                }
            }
            //接收 数据集
            StringBuffer sql = new StringBuffer();
            sql.append("SELECT COUNT(DISTINCT dataset) as count from json_archives_qc/qc_dataset_detail ");
@ -354,7 +372,7 @@ public class DataQualityStatisticsService extends BaseJpaService {
//            }
            //资源化数据
            String sql52 = "SELECT count(*) c FROM json_archives/info where receive_date>= '" + start + " 00:00:00' AND receive_date<='" + end + " 23:59:59' AND pack_type=1 and archive_status<>3 and org_code='" + orgCode + "' ";
            String sql52 = "SELECT count(*) c FROM json_archives/info where receive_date>= '" + start + " 00:00:00' AND receive_date<='" + end + " 23:59:59' AND pack_type=1 and archive_status=2 and org_code='" + orgCode + "' ";
            String sql53 = "SELECT count(*) c FROM json_archives/info where receive_date>= '" + start + " 00:00:00' AND receive_date<='" + end + " 23:59:59' AND pack_type=1 and archive_status=3 and org_code='" + orgCode + "' ";
            try {
@ -398,6 +416,7 @@ public class DataQualityStatisticsService extends BaseJpaService {
        totalMap.put("receiveArchives", totalReceiveArchives);//接收档案数
        totalMap.put("receiveDataset", totalSize); //接收数据集
        totalMap.put("receiveException", totalReceiveException);//接收异常
        totalMap.put("receiveError", totalReceiveError);//接收错误
        totalMap.put("resourceSuccess", totalResourceSuccess);//资源化-成功
        totalMap.put("resourceFailure", totalResourceFailure);//资源化-失败
        totalMap.put("resourceException", totalResourceException);//资源化-异常
@ -843,15 +862,15 @@ public class DataQualityStatisticsService extends BaseJpaService {
                } else {
                    dataMap1 = initRateMap(warningMap, orgMap.get(orgCode), orgCode);
                }
                dataMap1.put("totalVisit",HSI07_01_001);
                dataMap1.put("totalOutpatient",HSI07_01_002);
                dataMap1.put("totalPe",HSI07_01_004);
                dataMap1.put("totalHospital",HSI07_01_012);
                dataMap1.put("totalVisit", HSI07_01_001);
                dataMap1.put("totalOutpatient", HSI07_01_002);
                dataMap1.put("totalPe", HSI07_01_004);
                dataMap1.put("totalHospital", HSI07_01_012);
                totalVisitNum += HSI07_01_001;
                totalOutpatientNum += HSI07_01_002;
                totalPeNum += HSI07_01_004;
                totalHospitalNum += HSI07_01_012;
                dataMap.put(orgCode,dataMap1);
                dataMap.put(orgCode, dataMap1);
            }
        } catch (Exception e) {
            if (!"Error".equals(e.getMessage())) {
@ -866,8 +885,8 @@ public class DataQualityStatisticsService extends BaseJpaService {
            while (resultSetOrg.next()) {
                String orgCode = resultSetOrg.getString("org_code");
                Map<String, Object> map = dataMap.get(orgCode);
                if(map == null){
                    dataMap.put(orgCode,initRateMap(warningMap,orgMap.get(orgCode),orgCode));
                if (map == null) {
                    dataMap.put(orgCode, initRateMap(warningMap, orgMap.get(orgCode), orgCode));
                }
            }
        } catch (Exception e) {
@ -880,7 +899,7 @@ public class DataQualityStatisticsService extends BaseJpaService {
        for (Map<String, Object> map : dataMap.values()) {
            String orgCode = map.get("orgCode").toString();
            //完整数
            getPatientCount(start, end, orgCode, map);
            getPatientCount("event_date",start, end, orgCode, map);
            //及时率
            DqPaltformReceiveWarning warning = null;
            if (warningMap.containsKey(orgCode)) {
@ -932,7 +951,7 @@ public class DataQualityStatisticsService extends BaseJpaService {
        totalMap.put("outpatientInTime", totalOutpatientInTime);//门诊及时数
        totalMap.put("hospitalInTime", totalHospitalInTime);//住院及时数
        totalMap.put("peInTime", totalPeInTime);//体检及时数
        getPatientCount(start, end, null, totalMap);
        getPatientCount("event_date" ,start, end, null, totalMap);
        totalOutpatientIntegrity = Double.valueOf(totalMap.get("outpatientIntegrity").toString());//门诊完整数
        totalHospitalIntegrity = Double.valueOf(totalMap.get("hospitalIntegrity").toString());//住院完整数
        totalPeIntegrity = Double.valueOf(totalMap.get("peIntegrity").toString());//体检完整数
@ -962,7 +981,7 @@ public class DataQualityStatisticsService extends BaseJpaService {
        re.add(totalMap);
        //计算及时率及完整率
        for (Map<String, Object> map:dataMap.values()){
        for (Map<String, Object> map : dataMap.values()) {
            double outpatientInTime = Double.parseDouble(map.get("outpatientInTime").toString());//门诊及时数
            double hospitalInTime = Double.parseDouble(map.get("hospitalInTime").toString());//住院及时数
            double peInTime = Double.parseDouble(map.get("peInTime").toString());//体检及时数
@ -1000,14 +1019,14 @@ public class DataQualityStatisticsService extends BaseJpaService {
    }
    /**
     * 平台就诊人数 去重复(完整人数)
     *
     * 平台就诊人数 去重复(完整人数)  档案完整性
     * @param dateField 时间区间查询字段
     * @param start
     * @param end
     * @param orgCode
     * @return
     */
    public void getPatientCount(String start, String end, String orgCode, Map<String, Object> map) throws Exception {
    public void getPatientCount(String dateField,String start, String end, String orgCode, Map<String, Object> map) throws Exception {
        try {
            long starttime = System.currentTimeMillis();
            String sql0 = "";
@ -1015,29 +1034,29 @@ public class DataQualityStatisticsService extends BaseJpaService {
            String sql2 = "";
            String sql3 = "";
            if (StringUtils.isNotEmpty(orgCode)) {
                sql0 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=2 AND pack_type=1 AND org_code='" + orgCode + "' AND event_date BETWEEN" +
                sql0 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=2 AND pack_type=1 AND org_code='" + orgCode + "' AND " + dateField + " BETWEEN" +
                        " '" + start + " 00:00:00' AND '" + end + " 23:59:59'";
                sql1 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=1 AND pack_type=1 AND org_code='" + orgCode + "' AND event_date BETWEEN" +
                sql1 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=1 AND pack_type=1 AND org_code='" + orgCode + "' AND " + dateField + " BETWEEN" +
                        " '" + start + " 00:00:00' AND '" + end + " 23:59:59'";
                sql2 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=0 AND pack_type=1 AND org_code='" + orgCode + "' AND event_date BETWEEN " +
                sql2 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=0 AND pack_type=1 AND org_code='" + orgCode + "' AND " + dateField + " BETWEEN " +
                        "'" + start + " 00:00:00' AND '" + end + " 23:59:59'";
                sql3 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE pack_type=1 AND org_code='" + orgCode + "' AND event_date BETWEEN " +
                sql3 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE pack_type=1 AND org_code='" + orgCode + "' AND " + dateField + " BETWEEN " +
                        "'" + start + " 00:00:00' AND '" + end + " 23:59:59'";
            } else {
                sql0 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=2 AND pack_type=1 AND event_date " +
                        "BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59'";
                sql0 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=2 AND pack_type=1 AND " + dateField +
                        " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59'";
                sql1 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=1 AND pack_type=1 AND event_date " +
                        "BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59'";
                sql1 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=1 AND pack_type=1 AND " + dateField +
                        " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59'";
                sql2 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=0 AND pack_type=1 AND event_date " +
                        "BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59'";
                sql2 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=0 AND pack_type=1 AND " + dateField +
                        " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59'";
                sql3 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE pack_type=1 AND event_date " +
                        "BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59'";
                sql3 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE pack_type=1 AND " + dateField +
                        " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59'";
            }
            ResultSet resultSet0 = elasticSearchUtil.findBySql(sql0);
            ResultSet resultSet1 = elasticSearchUtil.findBySql(sql1);
@ -1168,18 +1187,18 @@ public class DataQualityStatisticsService extends BaseJpaService {
     * @return
     * @throws Exception
     */
    public Envelop getUploadSuccessListPage(String startDate, String endDate, String orgCode,int size,int page) throws Exception {
    public Envelop getUploadSuccessListPage(String startDate, String endDate, String orgCode, int size, int page) throws Exception {
        List<Map<String, Object>> list = getUploadSuccessList(startDate, endDate, orgCode);
        Envelop pageEnvelop = getPageEnvelop(page, size, list);
        return pageEnvelop;
    }
    private Envelop getPageEnvelop(int page, int size, List totalList){
    private Envelop getPageEnvelop(int page, int size, List totalList) {
        Envelop envelop = new Envelop();
        //设置假分页
        int totalCount = totalList.size();
        envelop.setTotalCount(totalCount);
        int totalPage = totalCount%size==0 ? totalCount%size:totalCount%size+1;
        int totalPage = totalCount % size == 0 ? totalCount % size : totalCount % size + 1;
        envelop.setTotalPage(totalPage);
        envelop.setCurrPage(page);
        envelop.setPageSize(size);
@ -1189,7 +1208,7 @@ public class DataQualityStatisticsService extends BaseJpaService {
        return envelop;
    }
    private List getPageList(int pageNum,int pageSize,List data) {
    private List getPageList(int pageNum, int pageSize, List data) {
        int fromIndex = (pageNum - 1) * pageSize;
        if (fromIndex >= data.size()) {
            return Collections.emptyList();
@ -1258,7 +1277,7 @@ public class DataQualityStatisticsService extends BaseJpaService {
     * @return
     * @throws Exception
     */
    public Envelop getUploadDataSetListPage(String startDate, String endDate, String orgCode,int size,int page) throws Exception {
    public Envelop getUploadDataSetListPage(String startDate, String endDate, String orgCode, int size, int page) throws Exception {
        List<Map<String, Object>> uploadDataSetList = getUploadDataSetList(startDate, endDate, orgCode);
        return getPageEnvelop(page, size, uploadDataSetList);
    }
@ -1333,7 +1352,7 @@ public class DataQualityStatisticsService extends BaseJpaService {
    public Envelop getUploadErrorListPage(String startDate, String endDate, String orgCode, int size, int page) throws Exception {
        List<Map<String, Object>> uploadErrorList = getUploadErrorList(startDate, endDate, orgCode);
        return getPageEnvelop(page,size,uploadErrorList);
        return getPageEnvelop(page, size, uploadErrorList);
    }
    public double getDoubleValue(Double object) {

+ 7 - 3
src/main/java/com/yihu/ehr/analyze/service/pack/PackQcReportService.java

@ -66,13 +66,14 @@ public class PackQcReportService extends BaseJpaService {
    protected final Log logger = LogFactory.getLog(this.getClass());
    /**
     * 获取医院数据
     * @param dateField  时间区间查询字段
     * @param startDate
     * @param endDate
     * @param orgCode
     * @return
     * @throws Exception
     */
    public Envelop dailyReport(String startDate, String endDate, String orgCode) throws Exception{
    public Envelop dailyReport(String dateField,String startDate, String endDate, String orgCode) throws Exception{
        Envelop envelop = new Envelop();
        Date end = DateUtil.addDate(1, DateUtil.formatCharDateYMD(endDate));
        Map<String,Object> resMap = new HashMap<String,Object>();
@ -82,7 +83,7 @@ public class PackQcReportService extends BaseJpaService {
        int oupatient=0;
        int physical=0;
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        RangeQueryBuilder startRange = QueryBuilders.rangeQuery("event_date");
        RangeQueryBuilder startRange = QueryBuilders.rangeQuery(dateField);
        startRange.gte(startDate);
        boolQueryBuilder.must(startRange);
@ -97,12 +98,15 @@ public class PackQcReportService extends BaseJpaService {
        List<Map<String, Object>> res = elasticSearchUtil.list("qc","daily_report", boolQueryBuilder);
        if(res!=null && res.size()>0){
            for(Map<String,Object> report : res){
                total+=Integer.parseInt(report.get("HSI07_01_001").toString());
//                total+=Integer.parseInt(report.get("HSI07_01_001").toString());
                inpatient+=Integer.parseInt(report.get("HSI07_01_012").toString());
                oupatient+=Integer.parseInt(report.get("HSI07_01_002").toString());
                physical+=Integer.parseInt(report.get("HSI07_01_004").toString());
            }
        }
        total +=inpatient;
        total +=oupatient;
        total +=physical;
        resMap.put("total",total);
        resMap.put("inpatient",inpatient);
        resMap.put("oupatient",oupatient);