LAPTOP-KB9HII50\70708 %!s(int64=2) %!d(string=hai) anos
pai
achega
9107b6f595

+ 7 - 3
svr/svr-quota/src/main/java/com/yihu/jw/quota/controller/JobController.java

@ -34,9 +34,11 @@ public class JobController extends BaseController {
    @Transactional
    public boolean firstExecuteQuota(
            @ApiParam(name = "id", value = "指标ID", required = true)
            @RequestParam(value = "id", required = true) Long id) {
            @RequestParam(value = "id", required = true) Long id,
            @ApiParam(name = "sleepTime", value = "睡眠时间,毫秒", required = false)
            @RequestParam(value = "sleepTime", required = false) Long sleepTime) {
        try {
            jobService.executeJob(id, "1", null, null);
            jobService.executeJob(id, "1", null, null,sleepTime);
            return true;
        } catch (Exception e) {
            error(e);
@ -53,12 +55,14 @@ public class JobController extends BaseController {
    public boolean executeQuota(
            @ApiParam(name = "id", value = "指标ID", required = true)
            @RequestParam(value = "id", required = true) Long id,
            @ApiParam(name = "sleepTime", value = "睡眠时间,毫秒", required = false)
            @RequestParam(value = "sleepTime", required = false) Long sleepTime,
            @ApiParam(name = "startDate", value = "起始日期")
            @RequestParam(value = "startDate", required = false) String startDate,
            @ApiParam(name = "endDate", value = "截止日期")
            @RequestParam(value = "endDate", required = false) String endDate) {
        try {
            jobService.executeJob(id, "2", startDate, endDate);
            jobService.executeJob(id, "2", startDate, endDate,sleepTime);
            return true;
        } catch (Exception e) {
            error(e);

+ 277 - 117
svr/svr-quota/src/main/java/com/yihu/jw/quota/etl/extract/ExtractUtil.java

@ -1,16 +1,16 @@
package com.yihu.jw.quota.etl.extract;
import com.yihu.jw.entity.base.org.BaseOrgDO;
import com.yihu.jw.entity.ehr.quota.TjQuotaDimensionMain;
import com.yihu.jw.entity.ehr.quota.TjQuotaDimensionSlave;
import com.yihu.jw.restmodel.ehr.org.MOrganization;
import com.yihu.jw.util.date.DateUtil;
import com.yihu.jw.quota.etl.Contant;
import com.yihu.jw.quota.util.BasesicUtil;
import com.yihu.jw.quota.vo.DictModel;
import com.yihu.jw.quota.vo.OrgHealthCategoryShowModel;
import com.yihu.jw.quota.vo.DoctorVo;
import com.yihu.jw.quota.vo.QuotaVo;
import com.yihu.jw.quota.vo.SaveModel;
import com.yihu.jw.util.date.DateUtil;
import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -23,6 +23,7 @@ import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.*;
import java.util.stream.Collectors;
/**
 * Created by janseny on 2017/7/10.
@ -80,8 +81,8 @@ public class ExtractUtil {
            if(saveModel.getTown() != null){
                townDictMap.put(saveModel.getTown(), saveModel.getTownName());
            }
            if(saveModel.getOrg() != null){
                orgDictMap.put(saveModel.getOrg(), saveModel.getOrgName());
            if(saveModel.getHospital() != null){
                orgDictMap.put(saveModel.getHospital(), saveModel.getHospitalName());
            }
            if(saveModel.getDept() != null){
                deptDictMap.put(saveModel.getDept(), saveModel.getDeptName());
@ -125,8 +126,8 @@ public class ExtractUtil {
                        saveModel.setTown(value);
                        saveModel.setTownName(townDictMap.get(value));
                    }else if(main.getMainCode().equals(main_org) && !StringUtils.isEmpty(orgDictMap.get(value))){
                        saveModel.setOrg(value);
                        saveModel.setOrgName(orgDictMap.get(value));
                        saveModel.setHospital(value);
                        saveModel.setHospital(orgDictMap.get(value));
                    }else if(main.getMainCode().equals(main_year) && !StringUtils.isEmpty(yearDictMap.get(value))){
                        saveModel.setYearName(yearDictMap.get(value));
                        saveModel.setYear(value);
@ -144,7 +145,7 @@ public class ExtractUtil {
                    }
                }
            }
            if(saveModel.getTown() != null || saveModel.getOrg() !=null){
            if(saveModel.getTown() != null || saveModel.getHospital() !=null){
                for (int i = 0; i < qds.size(); i++) {
                    int num = i+1 ;
                    if(num == 1) {
@ -243,7 +244,7 @@ public class ExtractUtil {
        }
        //关联机构相关信息
        if(orgDictMap != null && orgDictMap.size() > 0){
            setSaveModelProperties(returnList);
            setSaveModelPropertiesOrg(returnList);
        }
        logger.info("指标:" + quotaVo.getName() + "统计时指标或者机构未关联上错误数据有:" + errorCount);
        return returnList;
@ -324,18 +325,38 @@ public class ExtractUtil {
        }
        // 设置维度组合的统计值
        for (Map.Entry<String, String> entry : statisticsResultMap.entrySet()) {
        for (Map.Entry<String, SaveModel> entry : allData.entrySet()) {
            String key = entry.getKey();
            SaveModel saveModel = allData.get(key);
            if (saveModel != null) {
            String result = statisticsResultMap.get(key);
            if(!StringUtils.isEmpty(result)){
                saveModel.setResult(statisticsResultMap.get(key));
                saveModel.setQuotaDate(daySlaveDictMap.get(key));
                saveModel.setResult1(Double.parseDouble(saveModel.getResult()));
                saveModel.setResult2(Double.parseDouble(saveModel.getResult()));
                saveModel.setTimeLevel(dataLevel);
                returnList.add(saveModel);
            }else {
                saveModel.setResult("0");
                saveModel.setQuotaDate(saveModel.getSlaveKey1());
                saveModel.setResult1(Double.parseDouble(saveModel.getResult()));
                saveModel.setResult2(Double.parseDouble(saveModel.getResult()));
                saveModel.setTimeLevel(dataLevel);
                returnList.add(saveModel);
            }
        }
//        for (Map.Entry<String, String> entry : statisticsResultMap.entrySet()) {
//            String key = entry.getKey();
//            SaveModel saveModel = allData.get(key);
//            if (saveModel != null) {
//                saveModel.setResult(statisticsResultMap.get(key));
//                saveModel.setQuotaDate(daySlaveDictMap.get(key));
//                saveModel.setResult1(Double.parseDouble(saveModel.getResult()));
//                saveModel.setResult2(Double.parseDouble(saveModel.getResult()));
//                saveModel.setTimeLevel(dataLevel);
//                returnList.add(saveModel);
//            }
//        }
        List<String> dimins = new ArrayList<>();
        for (TjQuotaDimensionSlave slave : qds) {
@ -373,9 +394,7 @@ public class ExtractUtil {
                if (dictData == null) {
                    throw new Exception("主纬度配置有误");
                } else {
                    if (dimensionMain.getMainCode().equals("org")) {//机构关联出区县
                        setSaveModelProperties(dictData);
                    }
                    setSaveModelProperties(dimensionMain,dictData);
                    //设置到map里面
                    setAllData(allData, dictData, dimensionMain.getType());
                }
@ -412,24 +431,21 @@ public class ExtractUtil {
        try {
            if (dimensionMains != null) {
                //查询字典数据
                List<SaveModel> dictData = jdbcTemplate.query(dimensionMains.get(0).getDictSql(), new BeanPropertyRowMapper(SaveModel.class));
                TjQuotaDimensionMain dimensionMain = dimensionMains.get(0);
                List<SaveModel> dictData = jdbcTemplate.query(dimensionMain.getDictSql(), new BeanPropertyRowMapper(SaveModel.class));
                if (dictData == null) {
                    throw new Exception("主纬度配置有误");
                } else {
                    if (dimensionMains.get(0).getMainCode().equals("org")) {//机构关联出区县
                        setSaveModelProperties(dictData);
                    }
                    setSaveModelProperties(dimensionMain,dictData);
                    //设置到map里面
                    setAllData(allData, dictData, dimensionMains.get(0).getType());
                    setAllData(allData, dictData, dimensionMain.getType());
                }
            }
            for (int i = 0; i < dimensionMains.size(); i++) {
                if (i != 0) {
                    List<SaveModel> saveDataMain = jdbcTemplate.query(dimensionMains.get(i).getDictSql(), new BeanPropertyRowMapper(SaveModel.class));
                    if (dimensionMains.get(i).getMainCode().equals("org")) {//机构关联出区县
                        setSaveModelProperties(saveDataMain);
                    }
                    setSaveModelProperties(dimensionMains.get(i),saveDataMain);
                    allData = setOtherMainData(allData, saveDataMain, dimensionMains.get(i).getMainCode(), dimensionMains.get(i).getType());
                }
            }
@ -450,11 +466,29 @@ public class ExtractUtil {
                allData = setAllSlaveData(allData, dictDataSlave, i);
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new Exception("纬度配置有误");
        }
        return allData;
    }
    private void setSaveModelProperties(TjQuotaDimensionMain dimensionMain,List<SaveModel> dictData){
        switch (dimensionMain.getMainCode()){
            case "org":
                //机构关联信息
                setSaveModelPropertiesOrg(dictData);
                break;
            case "dept":
                //机构关联信息
                setSaveModelPropertiesDept(dictData);
                break;
            case "doctor":
                //机构关联信息
                setSaveModelPropertiesDoctor(dictData);
                break;
        }
    }
    //如果选择多个维度,除了第一个维度外其他维度组合
    private Map<String, SaveModel> setOtherMainData(Map<String, SaveModel> allData,
                                                    List<SaveModel> saveDataMain,
@ -462,6 +496,7 @@ public class ExtractUtil {
                                                    String dimensionType) {
        Map<String, SaveModel> returnAllData = new HashMap<>();
        try {
            code = "org".equals(code)?"hospital":code;//org转hospital
            for (Map.Entry<String, SaveModel> one : allData.entrySet()) {
                for (int i = 0; i < saveDataMain.size(); i++) {
                    SaveModel mainOne = saveDataMain.get(i);
@ -477,29 +512,37 @@ public class ExtractUtil {
                        saveModelTemp.setTown(mainOne.getTown());
                        saveModelTemp.setTownName(mainOne.getTownName());
                    }
                    if (!StringUtils.isEmpty(mainOne.getEconomic())) {
                        saveModelTemp.setEconomic(mainOne.getEconomic());
                        saveModelTemp.setEconomicName(mainOne.getEconomicName());
                    }
                    if (!StringUtils.isEmpty(mainOne.getLevel())) {
                        saveModelTemp.setLevel(mainOne.getLevel());
                        saveModelTemp.setLevelName(mainOne.getLevelName());
                    }
                    if (!StringUtils.isEmpty(mainOne.getOrgHealthCategoryId())) {
                        saveModelTemp.setOrgHealthCategoryId(mainOne.getOrgHealthCategoryId());
                    if(!StringUtils.isEmpty(mainOne.getCity())){
                        saveModelTemp.setCityName(mainOne.getCityName());
                        saveModelTemp.setCity(mainOne.getCity());
                    }
                    if (!StringUtils.isEmpty(mainOne.getOrgHealthCategoryCode())) {
                        saveModelTemp.setOrgHealthCategoryCode(mainOne.getOrgHealthCategoryCode());
                    }
                    if (!StringUtils.isEmpty(mainOne.getOrgHealthCategoryName())) {
                        saveModelTemp.setOrgHealthCategoryName(mainOne.getOrgHealthCategoryName());
                    }
                    if (!StringUtils.isEmpty(mainOne.getOrgHealthCategoryPid())) {
                        saveModelTemp.setOrgHealthCategoryPid(mainOne.getOrgHealthCategoryPid());
                    }
                    if (!StringUtils.isEmpty(mainOne.getOrgHealthCategoryTopPid())) {
                        saveModelTemp.setOrgHealthCategoryTopPid(mainOne.getOrgHealthCategoryTopPid());
                    if(!StringUtils.isEmpty(mainOne.getProvince())){
                        saveModelTemp.setProvinceName(mainOne.getProvinceName());
                        saveModelTemp.setProvince(mainOne.getProvince());
                    }
//                    if (!StringUtils.isEmpty(mainOne.getEconomic())) {
//                        saveModelTemp.setEconomic(mainOne.getEconomic());
//                        saveModelTemp.setEconomicName(mainOne.getEconomicName());
//                    }
//                    if (!StringUtils.isEmpty(mainOne.getLevel())) {
//                        saveModelTemp.setLevel(mainOne.getLevel());
//                        saveModelTemp.setLevelName(mainOne.getLevelName());
//                    }
//                    if (!StringUtils.isEmpty(mainOne.getOrgHealthCategoryId())) {
//                        saveModelTemp.setOrgHealthCategoryId(mainOne.getOrgHealthCategoryId());
//                    }
//                    if (!StringUtils.isEmpty(mainOne.getOrgHealthCategoryCode())) {
//                        saveModelTemp.setOrgHealthCategoryCode(mainOne.getOrgHealthCategoryCode());
//                    }
//                    if (!StringUtils.isEmpty(mainOne.getOrgHealthCategoryName())) {
//                        saveModelTemp.setOrgHealthCategoryName(mainOne.getOrgHealthCategoryName());
//                    }
//                    if (!StringUtils.isEmpty(mainOne.getOrgHealthCategoryPid())) {
//                        saveModelTemp.setOrgHealthCategoryPid(mainOne.getOrgHealthCategoryPid());
//                    }
//                    if (!StringUtils.isEmpty(mainOne.getOrgHealthCategoryTopPid())) {
//                        saveModelTemp.setOrgHealthCategoryTopPid(mainOne.getOrgHealthCategoryTopPid());
//                    }
@ -574,7 +617,7 @@ public class ExtractUtil {
            case Contant.main_dimension.area_org: {
                //设置机构
                dictData.stream().forEach(one -> {
                    setOneData(allData, one.getOrg(), one, Contant.main_dimension_areaLevel.area_org);
                    setOneData(allData, one.getHospital(), one, Contant.main_dimension_areaLevel.area_org);
                });
                break;
            }
@ -623,8 +666,8 @@ public class ExtractUtil {
                break;
            }
            case Contant.main_dimension.area_org: {
                code = mainOne.getOrg();
                name = mainOne.getOrgName();
                code = mainOne.getHospital();
                name = mainOne.getHospitalName();
                break;
            }
            case Contant.main_dimension.area_dept: {
@ -632,6 +675,11 @@ public class ExtractUtil {
                name = mainOne.getDeptName();
                break;
            }
            case Contant.main_dimension.area_doctor: {
                code = mainOne.getDoctor();
                name = mainOne.getDoctorName();
                break;
            }
            case Contant.main_dimension.time_year: {
                code = mainOne.getYear();
                name = mainOne.getYearName();
@ -658,84 +706,196 @@ public class ExtractUtil {
        allData.put(key, one);
    }
    private void setSaveModelProperties(List<SaveModel> saveDataMain) {
        //上饶区县
        String townSql = "SELECT id as code,name as name  from address_dict where pid = '361100'";
        List<DictModel> townDictDatas = jdbcTemplate.query(townSql, new BeanPropertyRowMapper(DictModel.class));
        Map<String,String> townMap = new HashMap<>();
        for(DictModel dictModel : townDictDatas){
            townMap.put(dictModel.getCode(), dictModel.getName());
        }
        //机构类型 目录对应的名称和节点id
        String orgHealthCategorySql = "SELECT id as orgHealthCategoryId,pid as orgHealthCategoryPid,top_pid as orgHealthCategoryTopPid,code as orgHealthCategoryCode, name as orgHealthCategoryName from org_health_category";
        List<OrgHealthCategoryShowModel> orgHealthCategoryDictDatas = jdbcTemplate.query(orgHealthCategorySql, new BeanPropertyRowMapper(OrgHealthCategoryShowModel.class));
        Map<String,OrgHealthCategoryShowModel>  orgHealthCategoryMap = new HashMap<>();
        for(OrgHealthCategoryShowModel orgHealthCategory : orgHealthCategoryDictDatas){
            orgHealthCategoryMap.put(orgHealthCategory.getOrgHealthCategoryCode(), orgHealthCategory);
    /**
     * 机构关联信息
     * @param saveDataMain
     */
    private void setSaveModelPropertiesOrg(List<SaveModel> saveDataMain) {
        String sql = "SELECT * from base.base_org WHERE del = 1";
        List<BaseOrgDO> baseOrgDOList = jdbcTemplate.query(sql,new BeanPropertyRowMapper<>(BaseOrgDO.class));
        Map<String,BaseOrgDO> orgDOMap = baseOrgDOList.stream().collect(Collectors.toMap(BaseOrgDO::getCode,org->org,(oldVo,newVo)->oldVo));
        for (SaveModel model : saveDataMain) {
            BaseOrgDO orgDO = orgDOMap.get(model.getHospital());
            if(orgDO!=null){
                model.setCity(orgDO.getCityCode());
                model.setCityName(orgDO.getCityName());
                model.setTown(orgDO.getTownCode());
                model.setTownName(orgDO.getTownName());
                model.setProvince(orgDO.getProvinceCode());
                model.setProvinceName(orgDO.getProvinceName());
            }
        }
    }
    /**
     * 部门关联信息
     * @param saveDataMain
     */
    private void setSaveModelPropertiesDept(List<SaveModel> saveDataMain) {
        String sql = "SELECT distinct " +
                "bdh.dept_code deptCode," +
                "hd.name AS deptName," +
                "bdh.org_code hospital," +
                "bdh.org_name hospitalName," +
                "o.town_code townCode," +
                "o.town_name townName," +
                "o.city_code cityCode," +
                "o.city_name cityName," +
                "o.province_code provinceCode," +
                "o.province_name provinceName" +
                " FROM " +
                "base.base_doctor_hospital bdh, " +
                "base.base_doctor bd," +
                "base.base_org o," +
                "base.dict_hospital_dept hd " +
                " WHERE bdh.doctor_code = bd.id  " +
                "AND hd.code= bdh.dept_code " +
                "AND o.code = bdh.org_code " +
                "AND bdh.del=1 AND hd.CONSULT_DEPT_FLAG='1' AND bd.job_title_code IN('1201','1301','1401','1101','066','067','061','1310','061','065','1','2','3','4')";
        List<DoctorVo> doctorVoList = jdbcTemplate.query(sql,new BeanPropertyRowMapper<>(DoctorVo.class));
        Map<String,DoctorVo> doctorVoMap = doctorVoList.stream().collect(Collectors.toMap(DoctorVo::getDeptCode,org->org,(oldVo,newVo)->oldVo));
        //经济类型
        String economicSql = "SELECT code, catalog from system_dict_entries WHERE dict_id = 102 ";
        Map<String, Object> economicMap = new HashMap<>();
        List<Map<String, Object>> list = jdbcTemplate.queryForList(economicSql);
        if (null != list && list.size() > 0) {
            for (Map<String, Object> map : list) {
                economicMap.put(map.get("code") + "", map.get("catalog") + "");
        for (SaveModel model : saveDataMain) {
            DoctorVo doctorVo = doctorVoMap.get(model.getDept());
            if(doctorVo!=null){
                model.setHospital(doctorVo.getHospitalCode());
                model.setHospitalName(doctorVo.getHospitalName());
                model.setCity(doctorVo.getCityCode());
                model.setCityName(doctorVo.getCityName());
                model.setTown(doctorVo.getTownCode());
                model.setTownName(doctorVo.getTownName());
                model.setProvince(doctorVo.getProvinceCode());
                model.setProvinceName(doctorVo.getProvinceName());
            }
        }
    }
    /**
     * 医生关联信息
     * @param saveDataMain
     */
    private void setSaveModelPropertiesDoctor(List<SaveModel> saveDataMain) {
        String sql = "SELECT " +
                "bd.id AS code , " +
                "bd.name ," +
                "bdh.dept_code deptCode," +
                "hd.name AS deptName," +
                "bdh.org_code hospital," +
                "bdh.org_name hospitalName," +
                "o.town_code townCode," +
                "o.town_name townName," +
                "o.city_code cityCode," +
                "o.city_name cityName," +
                "o.province_code provinceCode," +
                "o.province_name provinceName" +
                " FROM " +
                "base.base_doctor_hospital bdh, " +
                "base.base_doctor bd," +
                "base.base_org o," +
                "base.dict_hospital_dept hd " +
                " WHERE bdh.doctor_code = bd.id  " +
                "AND hd.code= bdh.dept_code " +
                "AND o.code = bdh.org_code " +
                "AND bdh.del=1 AND hd.CONSULT_DEPT_FLAG='1' AND bd.job_title_code IN('1201','1301','1401','1101','066','067','061','1310','061','065','1','2','3','4')";
        List<DoctorVo> doctorVoList = jdbcTemplate.query(sql,new BeanPropertyRowMapper<>(DoctorVo.class));
        Map<String,DoctorVo> doctorVoMap = doctorVoList.stream().collect(Collectors.toMap(DoctorVo::getCode,org->org,(oldVo,newVo)->oldVo));
        for (SaveModel model : saveDataMain) {
            String dictSql = "SELECT org_code as orgCode,hos_type_id as hosTypeId,administrative_division as administrativeDivision, hos_economic as hosEconomic, level_id as levelId  from organizations where org_code=";
            dictSql += "'" + model.getOrg() + "'";
            List<MOrganization> organizations = jdbcTemplate.query(dictSql, new BeanPropertyRowMapper(MOrganization.class));
            if (organizations != null && organizations.size() > 0) {
                MOrganization organization = organizations.get(0);
                if (!StringUtils.isEmpty(organization.getAdministrativeDivision())) {
                    String orgCode = organization.getAdministrativeDivision().toString();
                    if(townMap.get(orgCode) != null ){
                        model.setTown(orgCode);
                        model.setTownName(townMap.get(orgCode));
                    }
                }
                //关联出对应的机构类型
                if (!StringUtils.isEmpty(organization.getHosTypeId())) {
                    if(orgHealthCategoryMap.get(organization.getHosTypeId()) != null ){
                        OrgHealthCategoryShowModel orgHealthCategory = orgHealthCategoryMap.get(organization.getHosTypeId());
                        model.setOrgHealthCategoryCode(organization.getHosTypeId());
                        model.setOrgHealthCategoryName(orgHealthCategory.getOrgHealthCategoryName());
                        model.setOrgHealthCategoryId(orgHealthCategory.getOrgHealthCategoryId());
                        model.setOrgHealthCategoryPid(orgHealthCategory.getOrgHealthCategoryPid());
                        model.setOrgHealthCategoryTopPid(orgHealthCategory.getOrgHealthCategoryTopPid());
                    }
                }
                if (!StringUtils.isEmpty(organization.getHosEconomic())) {
                    String name = economicMap.get(organizations.get(0).getHosEconomic()) + "";
                    if ("公立".equals(name)) {
                        model.setEconomic("1021");
                        model.setEconomicName("公立");
                    } else {
                        model.setEconomic("1022");
                        model.setEconomicName("非公立");
                    }
                }
                if (!StringUtils.isEmpty(organization.getLevelId())) {
                    String levelId = organization.getLevelId();
                    if ("1".equals(levelId)) {
                        model.setLevel(levelId);
                        model.setLevelName("一级");
                    } else if ("2".equals(levelId)) {
                        model.setLevel(levelId);
                        model.setLevelName("二级");
                    } else if ("3".equals(levelId)) {
                        model.setLevel(levelId);
                        model.setLevelName("三级");
                    } else {
                        model.setLevel(levelId);
                        model.setLevelName("未定级");
                    }
                }
            DoctorVo doctorVo = doctorVoMap.get(model.getDoctor());
            if(doctorVo!=null){
                model.setDept(doctorVo.getDeptCode());
                model.setDeptName(doctorVo.getDeptName());
                model.setHospital(doctorVo.getHospitalCode());
                model.setHospitalName(doctorVo.getHospitalName());
                model.setCity(doctorVo.getCityCode());
                model.setCityName(doctorVo.getCityName());
                model.setTown(doctorVo.getTownCode());
                model.setTownName(doctorVo.getTownName());
                model.setProvince(doctorVo.getProvinceCode());
                model.setProvinceName(doctorVo.getProvinceName());
            }
        }
    }
//    private void setSaveModelProperties(List<SaveModel> saveDataMain) {
//        //上饶区县
//        String townSql = "SELECT id as code,name as name  from address_dict where pid = '361100'";
//        List<DictModel> townDictDatas = jdbcTemplate.query(townSql, new BeanPropertyRowMapper(DictModel.class));
//        Map<String,String> townMap = new HashMap<>();
//        for(DictModel dictModel : townDictDatas){
//            townMap.put(dictModel.getCode(), dictModel.getName());
//        }
//        //机构类型 目录对应的名称和节点id
//        String orgHealthCategorySql = "SELECT id as orgHealthCategoryId,pid as orgHealthCategoryPid,top_pid as orgHealthCategoryTopPid,code as orgHealthCategoryCode, name as orgHealthCategoryName from org_health_category";
//        List<OrgHealthCategoryShowModel> orgHealthCategoryDictDatas = jdbcTemplate.query(orgHealthCategorySql, new BeanPropertyRowMapper(OrgHealthCategoryShowModel.class));
//        Map<String,OrgHealthCategoryShowModel>  orgHealthCategoryMap = new HashMap<>();
//        for(OrgHealthCategoryShowModel orgHealthCategory : orgHealthCategoryDictDatas){
//            orgHealthCategoryMap.put(orgHealthCategory.getOrgHealthCategoryCode(), orgHealthCategory);
//        }
//
//        //经济类型
//        String economicSql = "SELECT code, catalog from system_dict_entries WHERE dict_id = 102 ";
//        Map<String, Object> economicMap = new HashMap<>();
//        List<Map<String, Object>> list = jdbcTemplate.queryForList(economicSql);
//        if (null != list && list.size() > 0) {
//            for (Map<String, Object> map : list) {
//                economicMap.put(map.get("code") + "", map.get("catalog") + "");
//            }
//        }
//
//        for (SaveModel model : saveDataMain) {
//            String dictSql = "SELECT org_code as orgCode,hos_type_id as hosTypeId,administrative_division as administrativeDivision, hos_economic as hosEconomic, level_id as levelId  from organizations where org_code=";
//            dictSql += "'" + model.getHospital() + "'";
//            List<MOrganization> organizations = jdbcTemplate.query(dictSql, new BeanPropertyRowMapper(MOrganization.class));
//
//            if (organizations != null && organizations.size() > 0) {
//                MOrganization organization = organizations.get(0);
//                if (!StringUtils.isEmpty(organization.getAdministrativeDivision())) {
//                    String orgCode = organization.getAdministrativeDivision().toString();
//                    if(townMap.get(orgCode) != null ){
//                        model.setTown(orgCode);
//                        model.setTownName(townMap.get(orgCode));
//                    }
//                }
//                //关联出对应的机构类型
//                if (!StringUtils.isEmpty(organization.getHosTypeId())) {
//                    if(orgHealthCategoryMap.get(organization.getHosTypeId()) != null ){
//                        OrgHealthCategoryShowModel orgHealthCategory = orgHealthCategoryMap.get(organization.getHosTypeId());
//                        model.setOrgHealthCategoryCode(organization.getHosTypeId());
//                        model.setOrgHealthCategoryName(orgHealthCategory.getOrgHealthCategoryName());
//                        model.setOrgHealthCategoryId(orgHealthCategory.getOrgHealthCategoryId());
//                        model.setOrgHealthCategoryPid(orgHealthCategory.getOrgHealthCategoryPid());
//                        model.setOrgHealthCategoryTopPid(orgHealthCategory.getOrgHealthCategoryTopPid());
//                    }
//                }
//                if (!StringUtils.isEmpty(organization.getHosEconomic())) {
//                    String name = economicMap.get(organizations.get(0).getHosEconomic()) + "";
//                    if ("公立".equals(name)) {
//                        model.setEconomic("1021");
//                        model.setEconomicName("公立");
//                    } else {
//                        model.setEconomic("1022");
//                        model.setEconomicName("非公立");
//                    }
//                }
//                if (!StringUtils.isEmpty(organization.getLevelId())) {
//                    String levelId = organization.getLevelId();
//                    if ("1".equals(levelId)) {
//                        model.setLevel(levelId);
//                        model.setLevelName("一级");
//                    } else if ("2".equals(levelId)) {
//                        model.setLevel(levelId);
//                        model.setLevelName("二级");
//                    } else if ("3".equals(levelId)) {
//                        model.setLevel(levelId);
//                        model.setLevelName("三级");
//                    } else {
//                        model.setLevel(levelId);
//                        model.setLevelName("未定级");
//                    }
//                }
//            }
//        }
//    }
}

+ 5 - 5
svr/svr-quota/src/main/java/com/yihu/jw/quota/etl/extract/es/EsExtract.java

@ -135,7 +135,7 @@ public class EsExtract {
                //查询除开 机构维度  其他维度的字典项和 维度合并到map
                //维度key 统一变小写
                for(TjQuotaDimensionMain main:qdm){
                    if(!main.getMainCode().trim().equals("org")){
                    if(!main.getMainCode().trim().equals("hospital")){
                        dimensionMap.put(main.getMainCode(),main.getMainCode());
                        if(org.apache.commons.lang.StringUtils.isNotEmpty(main.getDictSql())){
                            Map<String,String> dicMap = baseStatistsService.getDimensionMap(main.getDictSql(),main.getMainCode());
@ -172,8 +172,8 @@ public class EsExtract {
                    filter = " quotaDate >= '" + startTime.substring(0,10) + "' and quotaDate <= '" + endTime.substring(0,10) +"' ";
                }
                //查询分组的时候要增加 org 时间 ,每天的不同机构的数据
                dimension += ";org;quotaDate";
                dimensionMap.put("org", "org");
                dimension += ";hospital;quotaDate";
                dimensionMap.put("hospital", "hospital");
                dimensionMap.put("quotaDate","quotaDate");
                List<Map<String, Object>> orgTypeResultList = new ArrayList<>();
@ -181,7 +181,7 @@ public class EsExtract {
                if(mapList != null && mapList.size() > 0){
                    for(Map<String,Object> map : mapList){
                        String dictSql = "SELECT org_code as orgCode,hos_type_id as hosTypeId from organizations where org_code=";
                        dictSql = dictSql + "'"+ map.get("org") + "'";
                        dictSql = dictSql + "'"+ map.get("hospital") + "'";
                        List<MOrganization> organizations = jdbcTemplate.query(dictSql, new BeanPropertyRowMapper(MOrganization.class));
                        if(organizations != null && organizations.size() > 0){
                            if(!StringUtils.isEmpty(organizations.get(0).getHosTypeId())){
@ -196,7 +196,7 @@ public class EsExtract {
                Map<String,String> dimenKeyValMap = new HashMap<>();
                dimensionMap.remove("org");
                dimensionMap.remove("hospital");
                for(Map<String,Object> map : orgTypeResultList){
                    String key = "";
                    for(String dimen:dimensionMap.keySet()){

+ 2 - 4
svr/svr-quota/src/main/java/com/yihu/jw/quota/etl/extract/es/EsResultExtract.java

@ -8,11 +8,9 @@ import com.yihu.jw.entity.ehr.quota.TjQuota;
import com.yihu.jw.entity.ehr.quota.TjQuotaDataSave;
import com.yihu.jw.quota.etl.model.EsConfig;
import com.yihu.jw.quota.etl.util.ElasticsearchUtil;
import com.yihu.jw.quota.service.save.TjDataSaveService;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.aggregations.bucket.terms.DoubleTerms;
import org.elasticsearch.search.aggregations.bucket.terms.LongTerms;
@ -89,7 +87,7 @@ public class EsResultExtract {
                            this.endTime = params.get(key).toString();
                        else if(key.equals("orgName"))
                            this.orgName = params.get(key).toString();
                        else if(key.equals("org"))
                        else if(key.equals("hospital"))
                            this.org = params.get(key).toString();
                        else if(key.equals("province"))
                            this.province = params.get(key).toString();
@ -212,7 +210,7 @@ public class EsResultExtract {
        if( !StringUtils.isEmpty(org) ){
            String [] orgvals =org.split(",");
            for(int i=0;i<orgvals.length ; i++){
                QueryBuilder termOrg = QueryBuilders.matchPhraseQuery("org", orgvals[i]);
                QueryBuilder termOrg = QueryBuilders.matchPhraseQuery("hospital", orgvals[i]);
                qbChild.should(termOrg);
            }
            boolQueryBuilder.must(qbChild);

+ 4 - 2
svr/svr-quota/src/main/java/com/yihu/jw/quota/etl/save/ExtractDataWithRunnable.java

@ -16,6 +16,7 @@ public class ExtractDataWithRunnable implements Runnable {
    private Logger logger = LoggerFactory.getLogger(ExtractDataWithRunnable.class);
    private String saasid;
    private String timeLevel;
    private String dataLevel;
    private String startTime;
    private String endTime;
    private QuotaVo quotaVo;
@ -25,7 +26,7 @@ public class ExtractDataWithRunnable implements Runnable {
    private final int count = 0;
    public ExtractDataWithRunnable(TjQuotaLog tjQuotaLog ,QuotaVo quotaVo, String startTime,String endTime,
                                   String timeLevel,String saasid,int start,int perCount ){
                                   String timeLevel,String dataLevel,String saasid,int start,int perCount ){
        this.tjQuotaLog = tjQuotaLog;
        this.quotaVo = quotaVo;
        this.quotaVo.setStart(start);
@ -33,6 +34,7 @@ public class ExtractDataWithRunnable implements Runnable {
        this.startTime = startTime;
        this.endTime = endTime;
        this.timeLevel = timeLevel;
        this.dataLevel = dataLevel;
        this.saasid = saasid;
    }
@ -47,7 +49,7 @@ public class ExtractDataWithRunnable implements Runnable {
                }
                quotaVo.setRows(Contant.compute.perCount);
                System.out.println("start = " + start );
                SpringUtil.getBean(EsQuotaJob.class).quota(tjQuotaLog,quotaVo);
                SpringUtil.getBean(EsQuotaJob.class).quota(tjQuotaLog,quotaVo,dataLevel);
            }
        }catch (Exception e){
            logger.error(e.getMessage());

+ 5 - 2
svr/svr-quota/src/main/java/com/yihu/jw/quota/etl/save/es/ElastricSearchSave.java

@ -104,7 +104,7 @@ public class ElastricSearchSave {
                    }
                    br = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT) ;
                    //关闭链接
                    restHighLevelClient.close();
//                    restHighLevelClient.close();
                    isSuccessed = br.hasFailures();
                }
            }else{
@ -119,8 +119,11 @@ public class ElastricSearchSave {
                }
                br = restHighLevelClient.bulk(request,RequestOptions.DEFAULT);
                //关闭链接
                restHighLevelClient.close();
//                restHighLevelClient.close();
                isSuccessed = br.hasFailures();
                if(!isSuccessed){
                    logger.info("es保存失败日志"+br.buildFailureMessage());
                }
            }
            return isSuccessed;
        } catch (Exception e) {

+ 3 - 3
svr/svr-quota/src/main/java/com/yihu/jw/quota/job/EsQuotaJob.java

@ -97,7 +97,7 @@ public class EsQuotaJob implements Job {
               /* moreThredQuota(tjQuotaLog,esConfig);*/
            }else{
                //统计并保存
                quota(tjQuotaLog, quotaVo);
                quota(tjQuotaLog, quotaVo,dataLevel);
            }
        } catch (Exception e) {
            //如果出錯立即重新執行
@ -169,8 +169,8 @@ public class EsQuotaJob implements Job {
    /**
     * 统计过程
     */
    public void quota(TjQuotaLog tjQuotaLog,QuotaVo quotaVo) {
        String time = "时间:" + startTime + "到"+ endTime +" , ";
    public void quota(TjQuotaLog tjQuotaLog,QuotaVo quotaVo,String dataLevel) {
        String time = "1".equals(dataLevel)? ("时间:" + startTime + "到"+ endTime +" , "):"时间:"+ endTime +" , ";
        Integer status = 0;
        String content = "";
        try {

+ 37 - 15
svr/svr-quota/src/main/java/com/yihu/jw/quota/service/job/JobService.java

@ -36,9 +36,13 @@ public class JobService {
     * @param endDate     抽取数据截止日期。初始执行时无NULL;立即执行时需要传值;周期执行时也为NULL,如果是基础指标周期执行,后续默认赋值昨天截止。
     * @throws Exception
     */
    public void executeJob(Long id, String executeFlag, String startDate, String endDate) throws Exception {
    public void executeJob(Long id, String executeFlag, String startDate, String endDate,Long sleepTime) throws Exception {
        TjQuota tjQuota = quotaDao.findById(id).orElse(null);
        if (tjQuota != null) {
            if(sleepTime==null){
                //40秒
                sleepTime = 40*1000L;
            }
            QuotaVo quotaVo = new QuotaVo();
            BeanUtils.copyProperties(tjQuota, quotaVo);
            Map<String, Object> params = new HashMap<>();
@ -51,7 +55,7 @@ public class JobService {
            int endNum = 2;
            int startNum = 1;
            if(tjQuota.getDataLevel()==null||tjQuota.getDataLevel()==3){
                startNum = 2;
                startNum = 1;
                endNum = 2;
            }else if(tjQuota.getDataLevel()==1){
                startNum = 1;
@ -60,6 +64,7 @@ public class JobService {
                startNum = 2;
                endNum = 2;
            }
            boolean flag = false;
            for (int i = startNum; i <= endNum; i++){
                String quotaCodeImmediately = quotaCode + "immediately"+i;
                params.put("dataLevel", i+"");
@ -83,11 +88,15 @@ public class JobService {
                        throw  new ObjectAlreadyExistsException(quotaCodeImmediately + "," + tjQuota.getName() + "指标正在执行!");
                    }
                } else {
                    //周期执行指标 更新指标执行状态:0未开启,1执行中
                    tjQuota.setJobStatus("1");
                    quotaDao.save(tjQuota);
                    flag = true;
                    quartzHelper.addJob(Class.forName(quotaVo.getJobClazz()), quotaVo.getCron(), quotaCode, params);
                }
                Thread.sleep(sleepTime);
            }
            if (flag){
                //周期执行指标 更新指标执行状态:0未开启,1执行中
                tjQuota.setJobStatus("1");
                quotaDao.save(tjQuota);
            }
        }
    }
@ -104,21 +113,34 @@ public class JobService {
            QuotaVo quotaVo = new QuotaVo();
            BeanUtils.copyProperties(tjQuota, quotaVo);
            String quotaCode = quotaVo.getCode().replace("_", "");
            String quotaCodeImmediately = quotaCode + "immediately2";
            boolean existJob = quartzHelper.isExistJob(quotaCode);
            boolean existJobImmediately = quartzHelper.isExistJob(quotaCodeImmediately);
            if (existJob) {
                //周期执行jobKey
                quartzHelper.removeJob(quotaCode);
            int endNum = 2;
            int startNum = 1;
            if(tjQuota.getDataLevel()==null||tjQuota.getDataLevel()==3){
                startNum = 1;
                endNum = 2;
            }else if(tjQuota.getDataLevel()==1){
                startNum = 1;
                endNum = 1;
            }else if(tjQuota.getDataLevel()==2){
                startNum = 2;
                endNum = 2;
            }
            if (existJobImmediately) {
                //立即执行jobKey
                quartzHelper.removeJob(quotaCodeImmediately);
            for (int i = startNum; i <= endNum; i++){
                String quotaCodeImmediately = quotaCode + "immediately"+i;
                boolean existJob = quartzHelper.isExistJob(quotaCode);
                boolean existJobImmediately = quartzHelper.isExistJob(quotaCodeImmediately);
                if (existJob) {
                    //周期执行jobKey
                    quartzHelper.removeJob(quotaCode);
                }
                if (existJobImmediately) {
                    //立即执行jobKey
                    quartzHelper.removeJob(quotaCodeImmediately);
                }
            }
            //周期执行指标 更新指标执行状态:0未开启,1执行中
            tjQuota.setJobStatus("0");
            quotaDao.save(tjQuota);
        }
    }

+ 5 - 5
svr/svr-quota/src/main/java/com/yihu/jw/quota/service/quota/BaseStatistsService.java

@ -159,7 +159,7 @@ public class BaseStatistsService {
                        firstKeyVal = firstKeyVal + "-" + firstMap.get(moleDimensions[i]).toString() ;
                    }
                    map.put(moleDimensions[i], firstMap.get(moleDimensions[i]).toString());
                    if(moleDimensions[i].equals("town") || moleDimensions[i].equals("org") ){
                    if(moleDimensions[i].equals("town") || moleDimensions[i].equals("hospital") ){
                        if(firstMap.get(moleDimensions[i] + "Code")  != null){
                            map.put(moleDimensions[i]+ "Code", firstMap.get(moleDimensions[i] + "Code").toString());
                        }
@ -206,7 +206,7 @@ public class BaseStatistsService {
                map.put(firstColumnField, secondMap.get(firstColumnField));
                for(int i = 0 ;i < moleDimensions.length ; i++){
                    map.put(moleDimensions[i], secondMap.get(moleDimensions[i]).toString());
                    if((moleDimensions[i].equals("town") || moleDimensions[i].equals("org")) && null != secondMap.get(moleDimensions[i] + "Code")) {
                    if((moleDimensions[i].equals("town") || moleDimensions[i].equals("hospital")) && null != secondMap.get(moleDimensions[i] + "Code")) {
                        map.put(moleDimensions[i] + "Code", secondMap.get(moleDimensions[i] + "Code").toString());
                    }
                }
@ -442,7 +442,7 @@ public class BaseStatistsService {
                    map.put(firstColumnField, moleMap.get(firstColumnField));
                    map.put(moleDimensions[i], moleMap.get(moleDimensions[i]).toString());
                    map.put(moleDimensions[i]+"Name", moleMap.get(moleDimensions[i]).toString());
                    if("town".equals(moleDimensions[i]) || "org".equals(moleDimensions[i])) {
                    if("town".equals(moleDimensions[i]) || "hospital".equals(moleDimensions[i])) {
                        if(moleMap.get(moleDimensions[i] + "Code")  != null) {
                            map.put(moleDimensions[i]+ "Code", moleMap.get(moleDimensions[i] + "Code").toString());
                        }
@ -1057,7 +1057,7 @@ public class BaseStatistsService {
     */
    private String getQuotaDimensionDictSql(String quotaCode, String dimension) {
        boolean mainFlag = dimension.contains("province") || dimension.contains("city") ||dimension.contains("town")
                ||dimension.contains("org") ||dimension.contains("dept") ||dimension.contains("year") ||dimension.contains("quarter")
                ||dimension.contains("hospital") ||dimension.contains("dept") ||dimension.contains("doctor") ||dimension.contains("year") ||dimension.contains("quarter")
                ||dimension.contains("month") ||dimension.contains("day") || dimension.contains(quotaDateField) ;
        String dictSql = "";
        //查询维度 sql
@ -1100,7 +1100,7 @@ public class BaseStatistsService {
        if(StringUtils.isNotEmpty(dictSql)) {
            BasesicUtil baseUtil = new BasesicUtil();
            boolean main = dimension.contains("province") || dimension.contains("city") ||dimension.contains("town")
                    ||dimension.contains("org") ||dimension.contains("dept") ||dimension.contains("year") ||dimension.contains("month")
                    ||dimension.contains("hospital") ||dimension.contains("dept") ||dimension.contains("doctor") ||dimension.contains("year") ||dimension.contains("month")
                    ||dimension.contains("quarter") ||dimension.contains("day");
            if( main){

+ 116 - 0
svr/svr-quota/src/main/java/com/yihu/jw/quota/vo/DoctorVo.java

@ -0,0 +1,116 @@
package com.yihu.jw.quota.vo;
/**
 * Created by yeshijie on 2022/10/21.
 */
public class DoctorVo {
    private String code;
    private String name;
    private String deptCode;
    private String deptName;
    private String hospitalCode;
    private String hospitalName;
    private String townCode;
    private String townName;
    private String cityCode;
    private String cityName;
    private String provinceCode;
    private String provinceName;
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDeptCode() {
        return deptCode;
    }
    public void setDeptCode(String deptCode) {
        this.deptCode = deptCode;
    }
    public String getDeptName() {
        return deptName;
    }
    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }
    public String getHospitalCode() {
        return hospitalCode;
    }
    public void setHospitalCode(String hospitalCode) {
        this.hospitalCode = hospitalCode;
    }
    public String getHospitalName() {
        return hospitalName;
    }
    public void setHospitalName(String hospitalName) {
        this.hospitalName = hospitalName;
    }
    public String getTownCode() {
        return townCode;
    }
    public void setTownCode(String townCode) {
        this.townCode = townCode;
    }
    public String getTownName() {
        return townName;
    }
    public void setTownName(String townName) {
        this.townName = townName;
    }
    public String getCityCode() {
        return cityCode;
    }
    public void setCityCode(String cityCode) {
        this.cityCode = cityCode;
    }
    public String getCityName() {
        return cityName;
    }
    public void setCityName(String cityName) {
        this.cityName = cityName;
    }
    public String getProvinceCode() {
        return provinceCode;
    }
    public void setProvinceCode(String provinceCode) {
        this.provinceCode = provinceCode;
    }
    public String getProvinceName() {
        return provinceName;
    }
    public void setProvinceName(String provinceName) {
        this.provinceName = provinceName;
    }
}

+ 30 - 12
svr/svr-quota/src/main/java/com/yihu/jw/quota/vo/SaveModel.java

@ -38,8 +38,10 @@ public class SaveModel {
    private String quotaCode;//指标code
    private String quotaName;//指标名称
    private String quotaDate;//统计的指标对应时间 如今天凌晨统计昨天的数据,那就是昨天的时间
    private String org;     //机构代码
    private String orgName;//机构名字
//    private String org;     //机构代码
//    private String orgName;//机构名字
    private String hospital;     //机构代码
    private String hospitalName;//机构名字
    private String province;//省级代码 350000
    private String provinceName;//省名字
    private String city;//城市代码 350200
@ -77,9 +79,9 @@ public class SaveModel {
    private String distinctField;   // 去重字段
    private String distinctFieldValue;   // 去重字段值
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm")// 2017-06-24T11:51:30+080
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssZ")// 2017-06-24T11:51:30+080
    @CreatedDate
    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
    @JSONField(format = "yyyy-MM-dd'T'HH:mm:ssZ")
    private Date createTime;//创建时间
    private Date createDate;//档案入库时间
@ -92,22 +94,38 @@ public class SaveModel {
        this.quotaDate = quotaDate;
    }
    public String getOrg() {
        return org;
    public String getHospital() {
        return hospital;
    }
    public void setOrg(String org) {
        this.org = org;
    public void setHospital(String hospital) {
        this.hospital = hospital;
    }
    public String getOrgName() {
        return orgName;
    public String getHospitalName() {
        return hospitalName;
    }
    public void setOrgName(String orgName) {
        this.orgName = orgName;
    public void setHospitalName(String hospitalName) {
        this.hospitalName = hospitalName;
    }
    //    public String getOrg() {
//        return org;
//    }
//
//    public void setOrg(String org) {
//        this.org = org;
//    }
//
//    public String getOrgName() {
//        return orgName;
//    }
//
//    public void setOrgName(String orgName) {
//        this.orgName = orgName;
//    }
    public String getProvince() {
        return province;
    }