浏览代码

新增加一個統計

chenweida 8 年之前
父节点
当前提交
4a6db73fc1

+ 43 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/etl/dataFilter/SignDataFilter.java

@ -36,6 +36,7 @@ public class SignDataFilter {
    public static String level2Expenses="4";//费用
    public static String level2Health="5";//健康服务分布
    public static String level2Age2="6";//年龄
    public static String level2AgeDisease="7";//年龄疾病
    public static String level3Disease="1";//疾病分组
@ -319,11 +320,53 @@ public class SignDataFilter {
                     returnLevel2Key = getAge2(signFamily);
                     return returnLevel2Key;
                 }
                 //年龄疾病
                 case "7" :{
                     returnLevel2Key = getAgeDisease(signFamily);
                     return returnLevel2Key;
                 }
             }
        }
        return returnLevel2Key;
    }
    private String getAgeDisease(SignFamily signFamily) {
        //得到患者年龄
        StringBuffer returnLevel2KeyBuffer=new StringBuffer("0");
        int age= IdCardUtil.getAgeForIdcard(signFamily.getIdcard());
        if(0==age){
            errorModels.add(ErrorModel.newEM(signFamily.getCode(),ErrorModel.sign_idcard_error_age));
        }
        if(age>=65){
            returnLevel2KeyBuffer.append(",3");
        }
        //疾病标签
        String returnLevel2KeyTemp = "";
        boolean hasGXY=false;//有高血压
        boolean hasTNB=false;//糖尿病
        //得到患者的疾病标签
        List<String> diseaseList=  cachePool.getDiseaseGroup(signFamily.getPatient());
        if(diseaseList!=null&&diseaseList.size()>0){
            for (String diseaseCode:diseaseList){
                if("1".equals(diseaseCode)){//判斷是否有高血壓
                    returnLevel2KeyTemp="1";
                    hasGXY=true;
                }
                if("2".equals(diseaseCode)){//判斷是否有糖尿病
                    returnLevel2KeyTemp="2";
                    hasTNB=true;
                }
            }
        }
        if (hasTNB&&hasGXY){
            returnLevel2KeyTemp="1,2";
        }
        if(!StringUtils.isEmpty(returnLevel2KeyTemp)){
            returnLevel2KeyBuffer.append(","+returnLevel2KeyTemp);
        }
        return returnLevel2KeyBuffer.toString();
    }
    private String getAge2(SignFamily signFamily) {
        String returnLevel2Key;
        int age= IdCardUtil.getAgeForIdcard(signFamily.getIdcard());

+ 6 - 2
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/etl/storage/DBStorage.java

@ -142,7 +142,7 @@ public class DBStorage   {
     * @param day
     * @param wlyyQuota
     * @param foreachNum 标识二级维度循环的次数  例如 年龄就传6  性别就传3
     * @param type 1 性别 2 年龄 3 用户分组 4.签约费用 5 健康分布
     * @param type 1 性别 2 年龄 3 用户分组 4.签约费用 5 健康分布  6年龄2  7 年龄疾病
     */
    public void saveByLevel2(List<Map<String, Map<String, List<ETLModel>>>> data, String day, WlyyQuotaVO wlyyQuota,Integer foreachNum,Integer type) throws Exception{
        Integer start=1;
@ -155,7 +155,7 @@ public class DBStorage   {
     * @param day
     * @param wlyyQuota
     * @param foreachNum 如果start是默认的 标识二级维度循环的次数  例如 年龄就传6  性别就传3
     * @param type 1 性别 2 年龄 3 用户分组 4.签约费用 5 健康分布
     * @param type 1 性别 2 年龄 3 用户分组 4.签约费用 5 健康分布  6年龄2  7 年龄疾病
     * @param start 起始位置 默认是1
     */
    public List<WlyyQuotaResult> getLevel2(List<Map<String, Map<String, List<ETLModel>>>> data, String day, WlyyQuotaVO wlyyQuota,Integer foreachNum,Integer type,Integer start)throws Exception {
@ -812,6 +812,10 @@ public class DBStorage   {
                //年龄2
                return Constant.getLevelAge2(i);
            }
            case  7:{
                //年龄疾病
                return Constant.getLevelAgeDiseaseName(i);
            }
            default:{
                return "";
            }

+ 6 - 2
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/etl/storage/RedisStorage.java

@ -120,7 +120,7 @@ public class RedisStorage {
     * @param data
     * @param wlyyQuotaId
     * @param foreachNum 标识二级维度循环的次数  例如 年龄就传6  性别就传3
     * @param type 1 性别 2 年龄 3 用户分组 4.签约费用 5 健康分布
     * @param type 1 性别 2 年龄 3 用户分组 4.签约费用 5 健康分布 6繳費未交費 7年齡疾病
     * @param start 循环开始
     */
    public void saveByLevel2(List<Map<String, Map<String, List<ETLModel>>>> data,List<Map<String, Map<String, List<ETLModel>>>> deleteData, String wlyyQuotaId,Integer foreachNum,Integer type,Integer start) throws Exception {
@ -1183,9 +1183,13 @@ public class RedisStorage {
                return Constant.getlevelHealthFbName(i);
            }
            case  6:{
                //疾病
                //繳費未交費
                return Constant.getLevelExpenseName(i);
            }
            case  7:{
                //疾病年齡
                return Constant.getLevelAgeDiseaseName(i);
            }
            default:{
                return "";
            }

+ 116 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/business/AgeAndDiseaseJob.java

@ -0,0 +1,116 @@
package com.yihu.wlyy.statistics.job.business;
import com.yihu.wlyy.statistics.dao.QuartzJobLogDao;
import com.yihu.wlyy.statistics.etl.dataFilter.SignDataFilter;
import com.yihu.wlyy.statistics.etl.extract.DBExtract;
import com.yihu.wlyy.statistics.etl.model.CacheModel;
import com.yihu.wlyy.statistics.etl.model.ETLModel;
import com.yihu.wlyy.statistics.etl.model.FilterModel;
import com.yihu.wlyy.statistics.etl.mycache.CachePool;
import com.yihu.wlyy.statistics.etl.role.Level1Role;
import com.yihu.wlyy.statistics.etl.role.Level2Role;
import com.yihu.wlyy.statistics.etl.storage.DBStorage;
import com.yihu.wlyy.statistics.model.job.QuartzJobLog;
import com.yihu.wlyy.statistics.model.signfamily.SignFamily;
import com.yihu.wlyy.statistics.util.JsonUtil;
import com.yihu.wlyy.statistics.vo.WlyyJobConfigVO;
import com.yihu.wlyy.statistics.vo.WlyyQuotaVO;
import org.quartz.*;
import org.quartz.Calendar;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * Created by Administrator on 2016.11.01.
 *  年龄和疾病
 */
@Component
@Scope("prototype")
@DisallowConcurrentExecution
public class AgeAndDiseaseJob implements Job {
    private WlyyQuotaVO wlyyQuota;//指标对象
    private WlyyJobConfigVO wlyyJobConfig;//配置对象
    @Autowired
    private QuartzJobLogDao quartzJobLogDao;//执行日志Dao
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private Level1Role levelRole;
    @Autowired
    private Level2Role level2Role;
    @Autowired
    private DBStorage dbStorage;
    @Autowired
    private SignDataFilter signDataFilter;
    @Autowired
    private CachePool cachePool;
    String yesterday;
    String daybefore;
    public void execute(JobExecutionContext context)
            throws JobExecutionException {
        try{
            SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
            //初始化参数
            JobDataMap map = context.getJobDetail().getJobDataMap();
            wlyyQuota = (WlyyQuotaVO) map.get("quota");
            wlyyJobConfig = (WlyyJobConfigVO) map.get("jobConfig");
            daybefore = StringUtils.isEmpty(map.get("daybefore")) ? SignJob.getDayString(-2) : map.get("daybefore").toString();
            yesterday = StringUtils.isEmpty(map.get("yesterday")) ? SignJob.getDayString(-1) : map.get("yesterday").toString();
            //计算指标
            computequota();
        }catch (Exception e){
            e.printStackTrace();
            //如果出錯立即重新執行
            JobExecutionException e2 =new JobExecutionException(e);
            e2.setRefireImmediately(true);
        }
    }
    /**
     * 计算指标
     */
    private void computequota()throws Exception {
        jdbcTemplate.execute("delete from wlyy_quota_result where quota_date='" + yesterday + "' and quato_code='" + 17 + "'");
        try{
            //新建任务日志对象
            QuartzJobLog quartzJobLog = new QuartzJobLog();
            quartzJobLog.setJobStartTime(new Date());
            quartzJobLog.setJobId(wlyyJobConfig.getId());
            quartzJobLog.setJobName(wlyyJobConfig.getJobName());
            //从缓存取数据
            CacheModel cacheModel=cachePool.getSignFamilysWithExpenseStatus1ByDate(yesterday);
            //清洗數據
            FilterModel etlModels= signDataFilter.filter(cacheModel.getSignFamilies(),SignDataFilter.level2AgeDisease,cacheModel.getSql(),yesterday);
            //统计数据 1级维度
            List<Map<String, List<ETLModel>>>  returnDatas= levelRole.elt(etlModels.getEtlModelList());
            //统计数据 二级维度
            List<Map<String, Map<String, List<ETLModel>>>>  level2Data= level2Role.elt(returnDatas);;
            //保存数据
            dbStorage.saveByLevel2(level2Data,yesterday,wlyyQuota,3,7);
            //保存日志
            quartzJobLog.setJobEndTime(new Date());
            quartzJobLog.setJobContent(JsonUtil.objToStr(etlModels.getLogModel()));
            quartzJobLog.setJobType(etlModels.getError()?"1":"0");
            quartzJobLogDao.save(quartzJobLog);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    public String getYesterday() {
        java.util.Calendar cal = java.util.Calendar.getInstance();
        cal.add(java.util.Calendar.DATE, -1);
        String yesterday = new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
        return yesterday;
    }
}

+ 25 - 1
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/business/Constant.java

@ -75,6 +75,15 @@ public class Constant {
    public static String level_health_fb_3_name="高危人群";
    public static String level_health_fb_4_name="恢复期人群";
    //二姐维度的年龄疾病
    public static String level_age_disease_1="1";
    public static String level_age_disease_2="2";
    public static String level_age_disease_3="3";
    public static String level_age_disease_1_name="高血压";
    public static String level_age_disease_2_name="糖尿病";
    public static String level_age_disease_3_name="65岁以上";
    //三级维度的疾病
    public static String level_disease_1="1";
    public static String level_disease_2="2";
@ -85,6 +94,8 @@ public class Constant {
    public static String level_disease_3_name="糖尿病和高血压";
    public static String level_disease_4_name="健康人群";
    public static String getlevelHealthFbName(String key){
        switch (key){
            case "1":{
@ -217,5 +228,18 @@ public class Constant {
        }
        return "";
    }
    public static String getLevelAgeDiseaseName(String key){
        switch (key){
            case "1":{
                return level_age_disease_1_name;
            }
            case "2":{
                return level_age_disease_2_name;
            }
            case "3":{
                return level_age_disease_3_name;
            }
        }
        return "";
    }
}

+ 20 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/business/CurrentDayAllQuotaJob.java

@ -169,6 +169,7 @@ public class CurrentDayAllQuotaJob implements Job {
        computequota_16_1(sql,signFamilies,null);//统计今天的签约数的扣费钱 1
        computequota_15(sql,signFamilies,null);//统计今天的健康分布统计
        //computequota_16_0(sql,signFamilies,null);//统计今天的签约数的未扣费 0
        computequota_17(sql,signFamilies,null);//统计今天的年龄疾病
        quartzJobLog.setJobContent(allContent.toString());
        quartzJobLog.setJobName("实时统计");
@ -189,6 +190,25 @@ public class CurrentDayAllQuotaJob implements Job {
        redisTemplate.opsForValue().set("quota:timeKey",RedisStorage.timeKey);
    }
    private void computequota_17(String sql, List<SignFamily> signFamilies, Object o) {
        String quotaId="17";
        try{
            //清洗數據
            FilterModel etlModels= SpringUtil.getBean(SignDataFilter.class).filter(signFamilies,SignDataFilter.level2AgeDisease,sql,null);
            //统计数据 1级维度
            List<Map<String, List<ETLModel>>>  returnDatas= SpringUtil.getBean(Level1Role.class).elt(etlModels.getEtlModelList());
            //统计数据 二级维度
            List<Map<String, Map<String, List<ETLModel>>>>  level2Data= SpringUtil.getBean(Level2Role.class).elt(returnDatas);
            //保存数据 1 表示:从1开始循环 6表示:循环6次 3表示 2级维度是 3
            SpringUtil.getBean(RedisStorage.class).saveByLevel2(level2Data,null,quotaId,3,7,1);
            allContent.append(JsonUtil.objToStr(etlModels.getLogModel()));
        }catch (Exception e){
            e.printStackTrace();
            allContent.append("统计失败:"+e.getMessage());
        }
        allContent.append("-----------17----------");
    }
    private void computequota_16_1(String sql,List<SignFamily> signFamilies_1,List<SignFamily> deleteSignFamilies) {
        String quotaId="16";
        try{

+ 57 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/check/ReportAllLogJob.java

@ -90,6 +90,63 @@ public class ReportAllLogJob implements Job {
            sqlCount= " select count(id) from wlyy_sign_family a where  a.type =2 and status in (1,2) and  a.apply_date< '"+getYesterday(-1)+ Constant.quota_date_last+"'and (expenses_status !=1 or expenses_status is null)  ";
            count=jdbcTemplate.queryForObject(sqlCount,Integer.class);
            sb.append("<tr><td>截止到"+date+" 的未缴费数</td><td>"+count+"个</td></tr>");
            //系统共有患者多少个
            sqlCount= " select count(id) from wlyy_patient  ";
            count=jdbcTemplate.queryForObject(sqlCount,Integer.class);
            sb.append("<tr><td>截止到"+date+" 的患者用户数</td><td>"+count+"个</td></tr>");
            //系统共有多少个患者有签约
            sb.append("<tr><td>截止到"+date+" 签约患者数</td><td>"+cachePool.getSignFamilysWithExpenseStatus1ByDate(date).getSignFamilies().size()+"个</td></tr>");
            //系统共有多少个健康管理师
            sqlCount= " select count(id) from wlyy_doctor where level=3  ";
            count=jdbcTemplate.queryForObject(sqlCount,Integer.class);
            sb.append("<tr><td>截止到"+date+" 系统中存在的健康管理师数</td><td>"+count+"个</td></tr>");
            //系统共有多少个全科医生
            sqlCount= " select count(id) from wlyy_doctor where level=2 ";
            count=jdbcTemplate.queryForObject(sqlCount,Integer.class);
            sb.append("<tr><td>截止到"+date+" 系统中存在的全科医生数</td><td>"+count+"个</td></tr>");
            //系统共有多少个专科医生
            sqlCount= " select count(id) from wlyy_doctor where level=1 ";
            count=jdbcTemplate.queryForObject(sqlCount,Integer.class);
            sb.append("<tr><td>截止到"+date+" 系统中存在的专科医生数</td><td>"+count+"个</td></tr>");
            //系统共有多少个医生行政团队
            sqlCount= " select count(id) from wlyy_admin_team where available=1 ";
            count=jdbcTemplate.queryForObject(sqlCount,Integer.class);
            sb.append("<tr><td>截止到"+date+" 系统中存在的行政团队数</td><td>"+count+"个</td></tr>");
            //系统患者总共登录成功的次数
            sqlCount= " select count(id) from wlyy_login_log where type=1 and user_type=1 ";
            count=jdbcTemplate.queryForObject(sqlCount,Integer.class);
            sb.append("<tr><td>截止到"+date+" 患者总共登录成功次数</td><td>"+count+"个</td></tr>");
            //系统患者总共登录失败的次数
            sqlCount= " select count(id) from wlyy_login_log where type=2 and user_type=1 ";
            count=jdbcTemplate.queryForObject(sqlCount,Integer.class);
            sb.append("<tr><td>截止到"+date+" 患者总共登录失败次数</td><td>"+count+"个</td></tr>");
            //系统患者昨天登录成功的次数
            sqlCount= " select count(id) from wlyy_login_log where type=1 and user_type=1 and  create_time<= '"+getYesterday(-1)+" 23:59:59 ' and  create_time>= '"+getYesterday(-1)+" 00:00:00 '";
            count=jdbcTemplate.queryForObject(sqlCount,Integer.class);
            sb.append("<tr><td>"+date+" 患者登录成功次数</td><td>"+count+"个</td></tr>");
            //系统患者昨天登录失败的次数
            sqlCount= " select count(id) from wlyy_login_log where type=2 and user_type=1 and  create_time<= '"+getYesterday(-1)+" 23:59:59 ' and  create_time>= '"+getYesterday(-1)+" 00:00:00 '";
            count=jdbcTemplate.queryForObject(sqlCount,Integer.class);
            sb.append("<tr><td>"+date+" 患者登录失败次数</td><td>"+count+"个</td></tr>");
            //系统医生总共登录成功的次数
            sqlCount= " select count(id) from wlyy_login_log where type=1 and user_type=2 ";
            count=jdbcTemplate.queryForObject(sqlCount,Integer.class);
            sb.append("<tr><td>截止到"+date+" 医生总共登录成功次数</td><td>"+count+"个</td></tr>");
            //系统医生总共登录失败的次数
            sqlCount= " select count(id) from wlyy_login_log where type=2 and user_type=2 ";
            count=jdbcTemplate.queryForObject(sqlCount,Integer.class);
            sb.append("<tr><td>截止到"+date+" 医生总共登录失败次数</td><td>"+count+"个</td></tr>");
            //系统医生昨天登录成功的次数
            sqlCount= " select count(id) from wlyy_login_log where type=1 and user_type=2 and  create_time<= '"+getYesterday(-1)+" 23:59:59 ' and  create_time>= '"+getYesterday(-1)+" 00:00:00 '";
            count=jdbcTemplate.queryForObject(sqlCount,Integer.class);
            sb.append("<tr><td>"+date+" 医生登录成功次数</td><td>"+count+"个</td></tr>");
            //系统医生昨天登录失败的次数
            sqlCount= " select count(id) from wlyy_login_log where type=2 and user_type=2 and  create_time<= '"+getYesterday(-1)+" 23:59:59 ' and  create_time>= '"+getYesterday(-1)+" 00:00:00 '";
            count=jdbcTemplate.queryForObject(sqlCount,Integer.class);
            sb.append("<tr><td>"+date+" 医生登录失败次数</td><td>"+count+"个</td></tr>");
            //今天实时统计执行的次数
            sqlCount= " select count(a.id) from wlyy_job_log a where a.job_id=11 and a.job_start_time>= '"+getYesterday(-1)+ " 00:00:00'and a.job_start_time<=  '"+getYesterday(-1)+" 23:59:59 '";
            count=jdbcTemplate.queryForObject(sqlCount,Integer.class);