瀏覽代碼

Merge branch 'dev' of trick9191/patient-co-management into dev

linzhuo 8 年之前
父節點
當前提交
9b864ed568

+ 1 - 1
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/QuartzJobConfigDao.java

@ -18,7 +18,7 @@ public interface QuartzJobConfigDao extends PagingAndSortingRepository<QuartzJob
    @Query(" FROM QuartzJobConfig a WHERE a.status=?1 and a.del='1'")
    List<QuartzJobConfig> findByAll(String s);
    @Query(" FROM QuartzJobConfig a WHERE a.id in (1,2,3,4,5,6,7,8,9,10,12,13,14,15,16,17,20,21,22,23)  and a.del='1' ")
    @Query(" FROM QuartzJobConfig a WHERE a.id in (1,2,3,4,5,6,7,8,9,10,12,13,14,15,16,17,20,21,22,23,24,25)  and a.del='1' ")
    List<QuartzJobConfig> findByIds();
    @Query(" FROM QuartzJobConfig a WHERE a.id=?1 and a.del='1'")

+ 159 - 1
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/etl/dataFilter/ConsultDataFilter.java

@ -9,15 +9,16 @@ import com.yihu.wlyy.statistics.etl.model.FilterModel;
import com.yihu.wlyy.statistics.etl.model.LogModel;
import com.yihu.wlyy.statistics.job.business.Constant;
import com.yihu.wlyy.statistics.model.consult.ConsultTeam;
import com.yihu.wlyy.statistics.model.consult.ConsultTeamDto;
import com.yihu.wlyy.statistics.model.hosptial.Hospital;
import com.yihu.wlyy.statistics.model.signfamily.SignFamily;
import com.yihu.wlyy.statistics.model.system.Town;
import com.yihu.wlyy.statistics.model.team.AdminTeam;
import com.yihu.wlyy.statistics.util.DateUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.*;
@ -28,6 +29,9 @@ import java.util.*;
@Component
@Scope("prototype")
public class ConsultDataFilter {
    public static String level2ReplyTime = "1";//回复时间分布
    @Autowired
    private HospitalDao hospitalDao;
    @Autowired
@ -124,6 +128,8 @@ public class ConsultDataFilter {
                isAll=false;
                continue;
            }
            etlModel.setAdminTeam(adminTeam.getId()+"");
            etlModel.setHospital(orgCodeTemp);
            etlModel.setTown(hospital.getTown());
@ -147,6 +153,128 @@ public class ConsultDataFilter {
        return FilterModel.getFiltrerMode(logModel,etlModels,isAll);
    }
    /**
     * 添加时间维度计算
     * @param consultTeams
     * @param sql
     * @param filterDate
     * @return
     */
    public FilterModel filter2(List<ConsultTeamDto> consultTeams, String sql, String filterDate,String level2key){
        //查找出系统全部的全科医生
        List<AdminTeam> adminTeams=doctorAdminTeamDao.findAllTeam();
        Map<String, AdminTeam> adminTeamMap = new HashMap<String, AdminTeam>();
        for (AdminTeam adminTeam : adminTeams) {
            adminTeamMap.put(adminTeam.getId()+"", adminTeam);
        }
        //查找出系统全部的机构
        List<Hospital> hospitals = hospitalDao.findHospital2();
        Map<String, Hospital> hospitalsMap = new HashMap<String, Hospital>();
        for (Hospital hospital : hospitals) {
            hospitalsMap.put(hospital.getCode(), hospital);
        }
        //查找出厦门市全部的区
        List<Town> towns = townDao.findByCityCode(Constant.city);
        Map<String, Town> townsMap = new HashMap<String, Town>();
        for (Town town : towns) {
            townsMap.put(town.getCode(), town);
        }
        Long cityCount = new Long(0L); //统计到市的数目
        Long townCount = new Long(0L); //统计到所有区的数目
        Long orgCount =new Long(0L);//统计到所有机构的数目
        Long adminCount = new Long(0L);//统计到所有团队的数目
        Long errorCount=new Long(0L);//脏数据
        Boolean isAll=true;//是否统计失败
        //统计有已改簽的
        List<ETLModel> etlModels=new ArrayList<ETLModel>();
        LogModel logModel=new LogModel();
        errorModels=new ArrayList<ErrorModel>();
        //数据过滤清洗出脏数据  -----------start
        for(ConsultTeamDto consultTeam:consultTeams){
            ETLModel etlModel=new ETLModel();
            Long adminId=consultTeam.getAdminTeamCode();
            if(adminId == null||adminId<=0) {
                errorModels.add(ErrorModel.newEM(consultTeam.getId().toString(),ErrorModel.consult_adminTeam_null));
                isAll=false;
                continue;
            }
            String teamCode = consultTeam.getAdminTeamCode()+"";//行政的团队的id
            AdminTeam adminTeam=adminTeamMap.get(teamCode);
            if(adminTeam == null) {
                errorModels.add(ErrorModel.newEM(consultTeam.getId().toString(),ErrorModel.consult_adminTeam_noExist));
                isAll=false;
                continue;
            }
            String orgCode = adminTeam.getOrgCode();
            if(StringUtils.isEmpty(orgCode)) {
                errorModels.add(ErrorModel.newEM(consultTeam.getId().toString(),ErrorModel.consult_hospital_null));
                isAll=false;
                continue;
            }
            if(orgCode.length()!=10) {
                errorModels.add(ErrorModel.newEM(consultTeam.getId().toString(),ErrorModel.consult_hospital_isTest));
                isAll=false;
                errorCount++;
                continue;
            }
            String orgCodeTemp="";
            //统计机构
            if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
                //统计站
                orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
            }else{
                //统计社区
                orgCodeTemp=orgCode;
            }
            //统计区 ---------------start--------------
            Hospital hospital=hospitalsMap.get(orgCodeTemp);
            if(hospital == null) {
                errorModels.add(ErrorModel.newEM(consultTeam.getId().toString(),ErrorModel.consult_hospital_noExist));
                isAll=false;
                continue;
            }
            String town=hospital.getTown();
            if(StringUtils.isEmpty(town)) {
                errorModels.add(ErrorModel.newEM(consultTeam.getId().toString(),ErrorModel.consult_town_null));
                isAll=false;
                continue;
            }
            Town townObj=townsMap.get(town);
            if(townObj==null) {
                errorModels.add(ErrorModel.newEM(consultTeam.getId().toString(),ErrorModel.consult_town_noExist));
                isAll=false;
                continue;
            }
            //设置二级维度的Key
            String returnLevel2Key = getLevel2Key(level2key, consultTeam);
            etlModel.setAdminTeam(adminTeam.getId()+"");
            etlModel.setHospital(orgCodeTemp);
            etlModel.setTown(hospital.getTown());
            etlModel.setCity(Constant.city);
            etlModel.setLevel2Key(returnLevel2Key);
            etlModels.add(etlModel);
            //统计数目+1
            cityCount++;
            townCount++;
            orgCount++;
            adminCount++;
        }
        logModel.setDate(filterDate);
        logModel.setEndTime(new Date());
        logModel.setExcuteSql(sql);
        logModel.setAllNum(consultTeams.size());
        logModel.setSuccess(isAll);
        logModel.setSuccessNum(adminCount.intValue());
        logModel.setModelList(errorModels);
        logModel.setErrorNum(errorCount.intValue());
        // String message=saveContent(consultTeams.size(),adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount,sql,filterDate);
        return FilterModel.getFiltrerMode(logModel,etlModels,isAll);
    }
    private String saveContent(Integer size, Long qkCount, Long orgCount, Long townCount, Long cityCount, boolean isAll, StringBuffer errorContent,Long errorCount,String sql,String filterDate) {
        if(StringUtils.isEmpty(filterDate)){
            filterDate= DateUtil.dateToStrLong(new Date());
@ -164,4 +292,34 @@ public class ConsultDataFilter {
        }
        return string.toString();
    }
    public String getLevel2Key(String key,ConsultTeamDto consultTeamDto){
        if(StringUtils.isNotBlank(key)&&"1".equals(key)){
            return paserReplyTime(consultTeamDto);
        }
        return "";
    }
    public String paserReplyTime(ConsultTeamDto consultTeamDto){
        if(consultTeamDto.getReplyTime()!=null){
            Calendar   calendar   =   new   GregorianCalendar();
            calendar.setTime(consultTeamDto.getReplyTime());
            //获取小时
            int hour = calendar.get(calendar.HOUR_OF_DAY);
            if(hour>=0&&hour<8){
                return Constant.level_reply_time_1;
            }else if(hour>=8&&hour<12){
                return Constant.level_reply_time_2;
            }else if(hour>=12&&hour<13){
                return Constant.level_reply_time_3;
            }else if(hour>=13&&hour<18){
                return Constant.level_reply_time_4;
            }else if(hour>=18&&hour<24){
                return Constant.level_reply_time_5;
            }else{
                return "";
            }
        }
        return "";
    }
}

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

@ -819,6 +819,9 @@ public class DBStorage   {
                //年龄疾病
                return Constant.getLevelAgeDiseaseName(i);
            }
            case 8:{
                return Constant.getLevelReplyTimeName(i);
            }
            default:{
                return "";
            }

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

@ -1190,6 +1190,10 @@ public class RedisStorage {
                //疾病年齡
                return Constant.getLevelAgeDiseaseName(i);
            }
            case  8:{
                //疾病年齡
                return Constant.getLevelReplyTimeName(i);
            }
            default:{
                return "";
            }

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

@ -84,6 +84,18 @@ public class Constant {
    public static String level_age_disease_2_name="糖尿病";
    public static String level_age_disease_3_name="65岁以上";
    //耳机维度的时间分布
    public static String level_reply_time_1="1";
    public static String level_reply_time_2="2";
    public static String level_reply_time_3="3";
    public static String level_reply_time_4="4";
    public static String level_reply_time_5="5";
    public static String level_reply_time_1_name="0-8";
    public static String level_reply_time_2_name="8-12";
    public static String level_reply_time_3_name="12-13";
    public static String level_reply_time_4_name="13-18";
    public static String level_reply_time_5_name="18-24";
    //三级维度的疾病
    public static String level_disease_1="1";
    public static String level_disease_2="2";
@ -242,4 +254,25 @@ public class Constant {
        }
        return "";
    }
    public static String getLevelReplyTimeName(String key){
        switch (key){
            case "1":{
                return level_reply_time_1_name;
            }
            case "2":{
                return level_reply_time_2_name;
            }
            case "3":{
                return level_reply_time_3_name;
            }
            case "4":{
                return level_reply_time_4_name;
            }
            case "5":{
                return level_reply_time_5_name;
            }
        }
        return "";
    }
}

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

@ -0,0 +1,127 @@
package com.yihu.wlyy.statistics.job.business;
import com.yihu.wlyy.statistics.dao.QuartzJobLogDao;
import com.yihu.wlyy.statistics.etl.dataFilter.ConsultDataFilter;
import com.yihu.wlyy.statistics.etl.extract.DBExtract;
import com.yihu.wlyy.statistics.etl.model.ETLModel;
import com.yihu.wlyy.statistics.etl.model.FilterModel;
import com.yihu.wlyy.statistics.etl.role.Level1Role;
import com.yihu.wlyy.statistics.etl.storage.DBStorage;
import com.yihu.wlyy.statistics.model.consult.ConsultTeam;
import com.yihu.wlyy.statistics.model.job.QuartzJobLog;
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.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.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
 * 咨询模块的指标执行类
 */
@Component
@Scope("prototype")
@DisallowConcurrentExecution//防止到了执行时间点前一任务还在执行中,但是这时有空闲的线程,那么马上又会执行,这样一来就会存在同一job被并行执行
public class ConsultTotalJob implements Job {
    private WlyyQuotaVO wlyyQuota;//指标对象
    private WlyyJobConfigVO wlyyJobConfig;//配置对象
    @Autowired
    private QuartzJobLogDao quartzJobLogDao;//执行日志Dao
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private Level1Role levelRole;
    @Autowired
    private DBStorage dbStorage;
    @Autowired
    private ConsultDataFilter consultDataFilter;
    @Autowired
    private DBExtract dbExtract;
    String yesterday;
    String daybefore;
    @Override
    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){
            //如果出錯立即重新執行
            JobExecutionException e2 =new JobExecutionException(e);
            e2.setRefireImmediately(true);
        }
    }
    @Transactional
    private void computequota() {
        try{
            jdbcTemplate.execute("delete from wlyy_quota_result where quota_date='"+yesterday+"' and quato_code='"+25+"'");
            //新建任务日志对象
            QuartzJobLog quartzJobLog = new QuartzJobLog();
            quartzJobLog.setJobStartTime(new Date());
            quartzJobLog.setJobId(wlyyJobConfig.getId());
            quartzJobLog.setJobName(wlyyJobConfig.getJobName());
            String sql=" select admin_team_code,id from wlyy_consult_team a where a.czrq< '"+yesterday+ Constant.quota_date_last+"'";
            //抽取數據
            List<ConsultTeam> consultTeams= dbExtract.extract(ConsultTeam.class,sql);
            //過濾數據
            FilterModel etlModels= consultDataFilter.filter(consultTeams,sql,yesterday);
            //统计数据
            List<Map<String, List<ETLModel>>>  returnDatas= levelRole.elt(etlModels.getEtlModelList());
            //保存数据
            dbStorage.saveByLevel1(returnDatas,yesterday,wlyyQuota);
            //保存日志
            quartzJobLog.setJobEndTime(new Date());
            quartzJobLog.setJobContent(JsonUtil.objToStr(etlModels.getLogModel()));
            quartzJobLog.setJobType(etlModels.getError()?"1":"0");
            quartzJobLogDao.save(quartzJobLog);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    private String saveContent(List<ConsultTeam> consultTeams, Long qkCount, Long orgCount, Long townCount, Long cityCount, boolean isAll, StringBuffer errorContent,Long errorCount,String sql) {
        StringBuffer string=new StringBuffer("统计"+yesterday+" 的咨询数据完成 ,数据库查询到咨询数目:"+consultTeams.size());
        string.append(",sql语句:"+sql);
        string.append(",过滤的脏数据数目:"+errorCount);
        string.append(",统计到市的数据总数:"+cityCount);
        string.append(",统计到区的数据总数:"+townCount);
        string.append(",统计到机构的数据总数:"+orgCount);
        string.append(",统计到团队的数据总数:"+qkCount);
        string.append(",是否统计成功:"+isAll);
        if(!isAll){
            string.append(",失败原因:"+errorContent);
        }
        return string.toString();
    }
    public String getYesterday() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -1);
        String yesterday = new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
        return yesterday;
    }
}

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

@ -12,6 +12,7 @@ import com.yihu.wlyy.statistics.etl.mycache.CachePool;
import com.yihu.wlyy.statistics.etl.role.*;
import com.yihu.wlyy.statistics.etl.storage.RedisStorage;
import com.yihu.wlyy.statistics.model.consult.ConsultTeam;
import com.yihu.wlyy.statistics.model.consult.ConsultTeamDto;
import com.yihu.wlyy.statistics.model.hosptial.Hospital;
import com.yihu.wlyy.statistics.model.job.QuartzJobLog;
import com.yihu.wlyy.statistics.model.label.SignPatientLabelInfo;
@ -24,6 +25,7 @@ import com.yihu.wlyy.statistics.util.DateUtil;
import com.yihu.wlyy.statistics.util.IdCardUtil;
import com.yihu.wlyy.statistics.util.JsonUtil;
import com.yihu.wlyy.statistics.util.SpringUtil;
import org.apache.commons.collections.map.HashedMap;
import org.json.JSONArray;
import org.json.JSONObject;
import org.quartz.DisallowConcurrentExecution;
@ -176,6 +178,8 @@ public class CurrentDayAllQuotaJob implements Job {
        computequota_21();//统计今天的已经签约微信关注人数
        computequota_22();//未回复的咨询量
        computequota_23();//及时回复的咨询量
        computequota_24();//及时回复的咨询量时间分布
        computequota_25();//统计质询量总数
        quartzJobLog.setJobContent(allContent.toString());
        quartzJobLog.setJobName("实时统计");
@ -252,7 +256,7 @@ public class CurrentDayAllQuotaJob implements Job {
            if(consultIdMaps.size()>0){
                sql="select admin_team_code,id,consult from wlyy_consult_team a where  a.czrq< '"+tomorrow+"' and a.consult in ("+sb.toString()+")";
            }else{
                sql="select admin_team_code,id,consult from wlyy_consult_team a where  a.czrq< '"+tomorrow+ "' and a.consult ='noRey' ";
                sql="select admin_team_code,id,consult from wlyy_consult_team a where  a.czrq< '"+tomorrow+ "' and a.consult ='Rey' ";
            } //抽取數據
            List<ConsultTeam> consultTeams= SpringUtil.getBean(DBExtract.class).extract(ConsultTeam.class,sql);
@ -270,6 +274,56 @@ public class CurrentDayAllQuotaJob implements Job {
        }
        allContent.append("----------23-----------");
    }
    private void computequota_24() {
        String quotaId="24";
        try{
            //查找Im库中的所有的医生ID
            List<Map<String, Object>>  ims = getConsultIdsByIm24();
            //得到医生的id
            List<String> consultIdMaps=new ArrayList<>();
            ims.stream().forEach(map -> {
                if (map.containsKey("consultId")) {
                    consultIdMaps.add(String.valueOf("'"+map.get("consultId")+"'"));
                }
            });
            StringBuffer sb=new StringBuffer("");
            for(int i=0;i<consultIdMaps.size();i++){
                sb.append(consultIdMaps.get(i));
                if(i<(consultIdMaps.size()-1)){
                    sb.append(",");
                }
            }
            String sql="";
            //找出今天的咨询信息
            if(consultIdMaps.size()>0){
                sql="select admin_team_code,id,consult from wlyy_consult_team a where  a.czrq< '"+tomorrow+"' and a.consult in ("+sb.toString()+")";
            }else{
                sql="select admin_team_code,id,consult from wlyy_consult_team a where  a.czrq< '"+tomorrow+ "' and a.consult ='Rey' ";
            } //抽取數據
            List<ConsultTeam> consultTeams= SpringUtil.getBean(DBExtract.class).extract(ConsultTeam.class,sql);
            List<ConsultTeamDto> consultTeamDtos = getConsultTeams(ims,consultTeams);
            System.out.println("consultTeamDtos num:"+consultTeamDtos.size());
            //過濾數據
            FilterModel etlModels= consultDataFilter.filter2(consultTeamDtos,sql,null,ConsultDataFilter.level2ReplyTime);
            //统计数据
            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);
            //保存数据
            SpringUtil.getBean(RedisStorage.class).saveByLevel2(level2Data,null,quotaId,5,8);
            allContent.append(JsonUtil.objToStr(etlModels.getLogModel()));
        }catch (Exception e){
            e.printStackTrace();
            allContent.append("统计失败:"+e.getMessage());
        }
        allContent.append("----------24----------");
    }
    /**
     * 找出 im中的所有未回复的topic
@ -305,7 +359,7 @@ public class CurrentDayAllQuotaJob implements Job {
    }
    /**
     * 找出 im中的所有未回复的topic
     * 找出 im中的及时回复的topic
     *
     * @return
     */
@ -322,6 +376,7 @@ public class CurrentDayAllQuotaJob implements Job {
                " AND t.session_id = s.id " +
                " AND s.business_type=2 " +
                " AND t.`reply`=1 " +
                " AND TIMESTAMPDIFF(SECOND  ,t.reply_time,t.create_time) <86400 AND TIMESTAMPDIFF(SECOND ,t.reply_time,t.create_time) >0 "+
                " AND t.create_time< '" + tomorrow + "'";
        List<Map<String, Object>> ims = imjdbcTemplate.queryForList(sql);
        //得到医生的id
@ -337,6 +392,56 @@ public class CurrentDayAllQuotaJob implements Job {
        return ids;
    }
    /**
     * 找出 im中的及时回复的topic
     *
     * @return
     */
    public List<Map<String, Object>>  getConsultIdsByIm24() {
        String sql = "SELECT  DISTINCT t.id consultId ,t.reply_time replyTime" +
                " FROM " +
                " topics t, " +
                " participants p, " +
                " doctors d ," +
                " sessions s " +
                " WHERE " +
                " p.participant_id = d.id " +
                " AND t.session_id = p.session_id " +
                " AND t.session_id = s.id " +
                " AND s.business_type=2 " +
                " AND t.`reply`=1 " +
                " AND TIMESTAMPDIFF(SECOND  ,t.reply_time,t.create_time) <86400 AND TIMESTAMPDIFF(SECOND ,t.reply_time,t.create_time) >0 "+
                " AND t.create_time< '" + tomorrow + "'";
        List<Map<String, Object>> ims = imjdbcTemplate.queryForList(sql);
        return ims;
    }
    public List<ConsultTeamDto> getConsultTeams(List<Map<String, Object>> ims, List<ConsultTeam> consultTeams){
        List<ConsultTeamDto> rs = new ArrayList<>();
        if(consultTeams!=null&&consultTeams.size()>0&&ims!=null&&ims.size()>0){
            //將List转换为Map,减小循环层级
            Map<String,Object> mapList = new HashedMap();
            for(Map<String, Object> m : ims){
                mapList.put(m.get("consultId").toString(),m);
            }
            //合并结果集
            for(ConsultTeam consultTeam :consultTeams){
                ConsultTeamDto con = new ConsultTeamDto();
                String key = consultTeam.getConsult();
                Map<String, Object> ms = (Map<String, Object>)mapList.get(key);
                con.setConsult(key);
                con.setId(consultTeam.getId());
                con.setAdminTeamCode(consultTeam.getAdminTeamCode());
                con.setReplyTime((Date)ms.get("replyTime"));
                rs.add(con);
            }
            return rs;
        }
        return rs;
    }
    private void computequota_21() {
        try{
            //找出今天的签约信息 yesterday,now
@ -794,6 +899,26 @@ public class CurrentDayAllQuotaJob implements Job {
        allContent.append("-----------10----------");
    }
    private void computequota_25() {
        String quotaId="25";
        try{
            //找出总的咨询信息
            String sql=" select * from wlyy_consult_team a where a.czrq< '"+tomorrow+"'";
            //抽取數據
            List<ConsultTeam> consultTeams= SpringUtil.getBean(DBExtract.class).extract(ConsultTeam.class,sql);
            //過濾數據
            FilterModel etlModels= consultDataFilter.filter(consultTeams,sql,null);
            //统计数据
            List<Map<String, List<ETLModel>>>  returnDatas= SpringUtil.getBean(Level1Role.class).elt(etlModels.getEtlModelList());
            //保存数据
            SpringUtil.getBean(RedisStorage.class).saveByLevel1(returnDatas,null,quotaId);
            allContent.append(JsonUtil.objToStr(etlModels.getLogModel()));
        }catch (Exception e){
            e.printStackTrace();
            allContent.append("统计失败:"+e.getMessage());
        }
        allContent.append("----------25-----------");
    }
    public static String getDayString(Integer size) {

+ 3 - 2
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/business/ReyConsultJob.java

@ -140,7 +140,7 @@ public class ReyConsultJob implements Job {
    }
    /**
     * 找出 im中的所有未回复的topic
     * 找出 im中的及时回复的topic
     * 名医有算 求助没有
     * @return
     */
@ -157,7 +157,8 @@ public class ReyConsultJob implements Job {
                " AND t.session_id = s.id " +
                " AND s.business_type=2 " +
                " AND t.`reply`=1 " +
                "  AND t.create_time< '" + yesterday + Constant.quota_date_last + "'";
                " AND TIMESTAMPDIFF(SECOND  ,t.reply_time,t.create_time) <86400 AND TIMESTAMPDIFF(SECOND  ,t.reply_time,t.create_time) >0 "+
                " AND t.create_time< '" + yesterday + Constant.quota_date_last + "'";
        List<Map<String, Object>> ims = imjdbcTemplate.queryForList(sql);
        //得到医生的id
        List<String> ids = new ArrayList<>();

+ 55 - 22
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/business/ReyTimeConsultJob.java

@ -6,12 +6,15 @@ import com.yihu.wlyy.statistics.etl.extract.DBExtract;
import com.yihu.wlyy.statistics.etl.model.ETLModel;
import com.yihu.wlyy.statistics.etl.model.FilterModel;
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.consult.ConsultTeam;
import com.yihu.wlyy.statistics.model.consult.ConsultTeamDto;
import com.yihu.wlyy.statistics.model.job.QuartzJobLog;
import com.yihu.wlyy.statistics.util.JsonUtil;
import com.yihu.wlyy.statistics.vo.WlyyJobConfigVO;
import com.yihu.wlyy.statistics.vo.WlyyQuotaVO;
import org.apache.commons.collections.map.HashedMap;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
@ -52,6 +55,8 @@ public class ReyTimeConsultJob implements Job {
    private DBExtract dbExtract;
    //im库的jdbcTemplate
    private JdbcTemplate imjdbcTemplate;
    @Autowired
    private Level2Role level2Role;
    @Resource(name="imData")
    private DataSource dataSource;
@ -87,15 +92,22 @@ public class ReyTimeConsultJob implements Job {
    @Transactional
    private void computequota() {
        try {
            jdbcTemplate.execute("delete from wlyy_quota_result where quota_date='" + yesterday + "' and quato_code='" + 23 + "'");
            jdbcTemplate.execute("delete from wlyy_quota_result where quota_date='" + yesterday + "' and quato_code='" + 24 + "'");
            //新建任务日志对象
            QuartzJobLog quartzJobLog = new QuartzJobLog();
            quartzJobLog.setJobStartTime(new Date());
            quartzJobLog.setJobId(wlyyJobConfig.getId());
            quartzJobLog.setJobName(wlyyJobConfig.getJobName());
            //查找Im库中的所有的医生ID
            List<String> consultIdMaps = getConsultIdsByIm();
            //查找Im库中的所有的医生信息
            List<Map<String, Object>> ims  = getConsultIdsByIm();
            //得到医生的id
            List<String> consultIdMaps = new ArrayList<>();
            ims.stream().forEach(map -> {
                if (map.containsKey("consultId")) {
                    consultIdMaps.add("'"+ String.valueOf(map.get("consultId"))+"'");
                }
            });
            StringBuffer sb=new StringBuffer("");
            for(int i=0;i<consultIdMaps.size();i++){
                sb.append(consultIdMaps.get(i));
@ -106,20 +118,23 @@ public class ReyTimeConsultJob implements Job {
            String sql ="";
            if(consultIdMaps.size()>0){
                sql = " select admin_team_code,id,consult from wlyy_consult_team a where  a.czrq< '" + yesterday + Constant.quota_date_last + "' and a.consult in ("+sb.toString()+")";
                sql = " select admin_team_code,id,consult from wlyy_consult_team a, where  a.czrq< '" + yesterday + Constant.quota_date_last + "' and a.consult in ("+sb.toString()+")";
            }else{
                sql = " select admin_team_code,id,consult from wlyy_consult_team a where  a.czrq< '" + yesterday + Constant.quota_date_last + "' and a.consult ='noRey' ";
            } //抽取數據
            List<ConsultTeam> consultTeams = dbExtract.extract(ConsultTeam.class, sql);
            System.out.println("consultTeams num"+consultTeams.size());
            //過濾數據
            FilterModel etlModels = consultDataFilter.filter(consultTeams, sql, yesterday);
            //将两个数据库的结果集合并,避免跨库查询
            List<ConsultTeamDto> consultTeamDtos = getConsultTeams(ims,consultTeams);
            System.out.println("consultTeamDtos num"+consultTeamDtos.size());
            //過濾數據
            FilterModel etlModels = consultDataFilter.filter2(consultTeamDtos, sql, yesterday ,ConsultDataFilter.level2ReplyTime);
            //统计数据
            List<Map<String, List<ETLModel>>> returnDatas = levelRole.elt(etlModels.getEtlModelList());
            //统计数据 二级维度
            List<Map<String, Map<String, List<ETLModel>>>> patientData= level2Role.elt(returnDatas);
            //保存数据
            dbStorage.saveByLevel1(returnDatas, yesterday, wlyyQuota);
            dbStorage.saveByLevel2(patientData, yesterday, wlyyQuota,5,8);
            //保存日志
            quartzJobLog.setJobEndTime(new Date());
@ -144,8 +159,8 @@ public class ReyTimeConsultJob implements Job {
     * 名医有算 求助没有
     * @return
     */
    public List<String> getConsultIdsByIm() {
        String sql = "SELECT DISTINCT t.id consultId " +
    public List<Map<String, Object>>  getConsultIdsByIm() {
        String sql = "SELECT DISTINCT t.id consultId ,t.reply_time replyTime" +
                " FROM " +
                " topics t, " +
                " participants p, " +
@ -157,18 +172,36 @@ public class ReyTimeConsultJob implements Job {
                " AND t.session_id = s.id " +
                " AND s.business_type=2 " +
                " AND t.`reply`=1 " +
                "  AND t.create_time< '" + yesterday + Constant.quota_date_last + "'";
                " AND TIMESTAMPDIFF(SECOND  ,t.reply_time,t.create_time) <86400 AND TIMESTAMPDIFF(SECOND  ,t.reply_time,t.create_time) >0 "+
                " AND t.create_time< '" + yesterday + Constant.quota_date_last + "'";
        List<Map<String, Object>> ims = imjdbcTemplate.queryForList(sql);
        //得到医生的id
        List<String> ids = new ArrayList<>();
        ims.stream().forEach(map -> {
            if (map.containsKey("consultId")) {
                ids.add("'"+ String.valueOf(map.get("consultId"))+"'");
        return ims;
    }
    public List<ConsultTeamDto> getConsultTeams(List<Map<String, Object>> ims,List<ConsultTeam> consultTeams){
        List<ConsultTeamDto> rs = new ArrayList<>();
        if(consultTeams!=null&&consultTeams.size()>0&&ims!=null&&ims.size()>0){
            //將List转换为Map,减小循环层级
            Map<String,Object> mapList = new HashedMap();
            for(Map<String, Object> m : ims){
                mapList.put(m.get("consultId").toString(),m);
            }
        });
        System.out.println("ims num:"+ims.size());
        System.out.println("sql:"+sql);
        System.out.println("ids num:"+ids.size());
        return ids;
            //合并结果集
            for(ConsultTeam consultTeam :consultTeams){
                ConsultTeamDto con = new ConsultTeamDto();
                String key = consultTeam.getConsult();
                Map<String, Object> ms = (Map<String, Object>)mapList.get(key);
                con.setConsult(key);
                con.setId(consultTeam.getId());
                con.setAdminTeamCode(consultTeam.getAdminTeamCode());
                con.setReplyTime((Date)ms.get("replyTime"));
                rs.add(con);
            }
            return rs;
        }
        return rs;
    }
}

+ 5 - 1
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/consult/ConsultTeamDto.java

@ -1,11 +1,15 @@
package com.yihu.wlyy.statistics.model.consult;
import com.yihu.wlyy.statistics.model.IdEntity;
import java.util.Date;
/**
 * Created by Trick on 2017/4/25.
 */
public class ConsultTeamDto {
public class ConsultTeamDto extends IdEntity {
    private static final long serialVersionUID = -7644448339473861513L;
    private String consult;         // 咨询标识
    private String doctor;          // 医生标识

+ 101 - 18
patient-co-wlyy/src/main/java/com/yihu/wlyy/service/app/statistics/StatisticsService.java

@ -1299,34 +1299,58 @@ public class StatisticsService extends BaseService {
            if(StringUtils.isBlank(lowLevel)){
                String timeKey = redisTemplate.opsForValue().get("quota:timeKey");
                if(StringUtils.isBlank(timeKey)){
                    return null;
                }
                //及时回复数
                String relyVal = redisTemplate.opsForValue().get("quota:23:"+level+":"+area+":3:"+timeKey);
                if(StringUtils.isBlank(relyVal)){
                    return null;
                }
                JSONArray rely = new JSONArray(relyVal);
                //咨询总数
                String relyTotal = redisTemplate.opsForValue().get("quota:3:"+level+":"+area+":3:"+timeKey);
                String relyTotal = redisTemplate.opsForValue().get("quota:25:"+level+":"+area+":3:"+timeKey);
                if(StringUtils.isBlank(relyTotal)){
                    return null;
                }
                JSONArray total = new JSONArray(relyTotal);
                //未回复数
                String onRelyTotal = redisTemplate.opsForValue().get("quota:22:"+level+":"+area+":3:"+timeKey);
                JSONArray onRely = new JSONArray(relyTotal);
                if(StringUtils.isBlank(onRelyTotal)){
                    return null;
                }
                JSONArray onRely = new JSONArray(onRelyTotal);
                result.put("resultList",getCoutList(rely,total,onRely));
            }else{
                String timeKey = redisTemplate.opsForValue().get("quota:timeKey");
                if(StringUtils.isBlank(timeKey)){
                    return null;
                }
                //及时回复数
                String relyVal = redisTemplate.opsForValue().get("quota:23:"+level+":"+area+":2:"+timeKey);
                if(StringUtils.isBlank(relyVal)){
                    return null;
                }
                JSONArray rely = new JSONArray(relyVal);
                //咨询总数
                String relyTotal = redisTemplate.opsForValue().get("quota:3:"+level+":"+area+":2:"+timeKey);
                String relyTotal = redisTemplate.opsForValue().get("quota:25:"+level+":"+area+":2:"+timeKey);
                if(StringUtils.isBlank(relyTotal)){
                    return null;
                }
                JSONArray total = new JSONArray(relyTotal);
                //未回复数
                String onRelyTotal = redisTemplate.opsForValue().get("quota:22:"+level+":"+area+":2:"+timeKey);
                JSONArray onRely = new JSONArray(relyTotal);
                if(StringUtils.isBlank(onRelyTotal)){
                    return null;
                }
                JSONArray onRely = new JSONArray(onRelyTotal);
                result.put("resultList",getCoutList(rely,total,onRely));
            }
@ -1337,40 +1361,63 @@ public class StatisticsService extends BaseService {
            //quota:23:4:350200:2:1492939333191
            String timeKey = redisTemplate.opsForValue().get("quota:timeKey");
            if(StringUtils.isBlank(timeKey)){
                return null;
            }
            //及时回复数
            String relyVal = redisTemplate.opsForValue().get("quota:23:"+level+":"+area+":2:"+timeKey);
            if(StringUtils.isBlank(relyVal)){
                return null;
            }
            JSONArray rely = new JSONArray(relyVal);
            //咨询总数
            String relyTotal = redisTemplate.opsForValue().get("quota:3:"+level+":"+area+":2:"+timeKey);
            String relyTotal = redisTemplate.opsForValue().get("quota:25:"+level+":"+area+":2:"+timeKey);
            if(StringUtils.isBlank(relyTotal)){
                return null;
            }
            JSONArray total = new JSONArray(relyTotal);
            //未回复数
            String onRelyTotal = redisTemplate.opsForValue().get("quota:22:"+level+":"+area+":2:"+timeKey);
            JSONArray onRely = new JSONArray(relyTotal);
            result.put("resultList",getCoutList(rely,total,onRely));
            String noRelyTotal = redisTemplate.opsForValue().get("quota:22:"+level+":"+area+":2:"+timeKey);
            if(StringUtils.isBlank(noRelyTotal)){
                return null;
            }
            JSONArray noRely = new JSONArray(noRelyTotal);
            result.put("resultList",getCoutList(rely,total,noRely));
        }else if(level == 2){//机构级别统计,统计所有团队
            //quota:23:4:350200:2:1492939333191
            String timeKey = redisTemplate.opsForValue().get("quota:timeKey");
            if(StringUtils.isBlank(timeKey)){
                return null;
            }
            //及时回复数
            String relyVal = redisTemplate.opsForValue().get("quota:23:"+level+":"+area+":1:"+timeKey);
            if(StringUtils.isBlank(relyVal)){
                return null;
            }
            JSONArray rely = new JSONArray(relyVal);
            //咨询总数
            String relyTotal = redisTemplate.opsForValue().get("quota:3:"+level+":"+area+":1:"+timeKey);
            String relyTotal = redisTemplate.opsForValue().get("quota:25:"+level+":"+area+":1:"+timeKey);
            if(StringUtils.isBlank(relyTotal)){
                return null;
            }
            JSONArray total = new JSONArray(relyTotal);
            //未回复数
            String onRelyTotal = redisTemplate.opsForValue().get("quota:22:"+level+":"+area+":1:"+timeKey);
            JSONArray onRely = new JSONArray(relyTotal);
            String noRelyTotal = redisTemplate.opsForValue().get("quota:22:"+level+":"+area+":1:"+timeKey);
            if(StringUtils.isBlank(noRelyTotal)){
                return null;
            }
            JSONArray noRely = new JSONArray(noRelyTotal);
            result.put("resultList",getCoutList(rely,total,onRely));
            result.put("resultList",getCoutList(rely,total,noRely));
        }
        return result;
    }
@ -1387,20 +1434,32 @@ public class StatisticsService extends BaseService {
        JSONObject result = new JSONObject();
        String timeKey = redisTemplate.opsForValue().get("quota:timeKey");
        if(StringUtils.isBlank(timeKey)){
            return null;
        }
        //及时回复数
        String relyVal = redisTemplate.opsForValue().get("quota:23:"+level+":"+area+":"+timeKey);
        if(StringUtils.isBlank(relyVal)){
            return null;
        }
        JSONObject relyObject =new JSONObject(relyVal);
        JSONArray rely = new JSONArray();
        rely.put(relyObject);
        //咨询总数
        String relyTotal = redisTemplate.opsForValue().get("quota:3:"+level+":"+area+":"+timeKey);
        JSONObject totalObject =new JSONObject(relyVal);
        String relyTotal = redisTemplate.opsForValue().get("quota:25:"+level+":"+area+":"+timeKey);
        if(StringUtils.isBlank(relyTotal)){
            return null;
        }
        JSONObject totalObject =new JSONObject(relyTotal);
        JSONArray total = new JSONArray();
        total.put(totalObject);
        //未回复数
        String onRelyTotal = redisTemplate.opsForValue().get("quota:22:"+level+":"+area+":"+timeKey);
        JSONObject onRelyObject =new JSONObject(relyVal);
        if(StringUtils.isBlank(onRelyTotal)){
            return null;
        }
        JSONObject onRelyObject =new JSONObject(onRelyTotal);
        JSONArray onRely = new JSONArray();
        onRely.put(onRelyObject);
@ -1464,33 +1523,57 @@ public class StatisticsService extends BaseService {
                    double rr = (double)relyNm/totalNm*100;
                    DecimalFormat df  = new DecimalFormat("0.00");
                    rs.put("relyRate",df.format(rr)+"%");
                    rs.put("relyDoubleRate",rr);
                }else{
                    rs.put("relyRate","0.00%");
                    rs.put("relyDoubleRate",0.0);
                }
                if(noRelyNm!=null&&noRelyNm!=0){
                    double rr = (double)noRelyNm/totalNm*100;
                    DecimalFormat df  = new DecimalFormat("0.00");
                    rs.put("noRelyRate",df.format(rr)+"%");
                    rs.put("noRelyDoubleRate",rr);
                }else{
                    rs.put("noRelyRate","0.00%");
                    rs.put("noRelyDoubleRate",0.0);
                }
            }else{
                rs.put("relyRate","0.00%");
                rs.put("relyDoubleRate",0.0);
                rs.put("noRelyRate","0.00%");
                rs.put("noRelyDoubleRate",0.0);
            }
            resultMaps.add(rs);
        }
        //根据回复数排序
        //根据为回复数排序
        Collections.sort(resultMaps, new Comparator<Map<String,Object>>(){
            public int compare(Map<String,Object> o1,Map<String,Object> o2){
                return  (Long)o1.get("relyCount")<(Long)o2.get("relyCount")?1:( (Long)o1.get("relyCount")==(Long)o2.get("relyCount")?0:-1);
                return  (double)o1.get("noRelyDoubleRate")<(double)o2.get("noRelyDoubleRate")?1:( (double)o1.get("noRelyDoubleRate")==(double)o2.get("noRelyDoubleRate")?0:-1);
            }
        });
        return resultMaps;
    }
    /**
     * 获取及时回复的时间分布
     * @param level
     * @param area
     * @return
     */
    public JSONObject getCoutListByTime(String level,String area){
        JSONObject result = new JSONObject();
        if(StringUtils.isNotBlank(level)&&StringUtils.isNotBlank(area)){
            String timeKey = redisTemplate.opsForValue().get("quota:timeKey");
            String relyVal = redisTemplate.opsForValue().get("quota:24:"+level+":"+area+":"+timeKey);
            JSONArray array = new JSONArray(relyVal);
            result.put("resultList",array);
        }
        return result;
    }
}

+ 28 - 2
patient-co-wlyy/src/main/java/com/yihu/wlyy/web/statistic/StatisticsController.java

@ -568,7 +568,12 @@ public class StatisticsController extends BaseController {
                                               @RequestParam(required = true) String area ,
                                               @RequestParam(required = false) String lowlevel) {
        try {
            return write(200, "查询成功", "data", statisticsService.getConsultingStatisticsList(level,area,lowlevel));
            JSONObject data = statisticsService.getConsultingStatisticsList(level,area,lowlevel);
            if(data!=null){
                return write(200, "查询成功", "data", data);
            }else{
                return error(-1, "查询失败");
            }
        } catch (Exception e) {
            return error(-1, "查询失败");
        }
@ -589,7 +594,28 @@ public class StatisticsController extends BaseController {
    public String getConsultingTitle(@RequestParam(required = true) Integer level,
                                      @RequestParam(required = true) String area) {
        try {
            return write(200, "查询成功", "data", statisticsService.getConsultingTitle(level,area));
            JSONObject data = statisticsService.getConsultingTitle(level,area);
            if(data!=null){
                return write(200, "查询成功", "data", data);
            }else{
                return error(-1, "查询失败");
            }
        } catch (Exception e) {
            return error(-1, "查询失败");
        }
    }
    /**
     * 获取回复数时间分布数
     * @param level
     * @param area
     * @return
     */
    @RequestMapping("/getCoutListByTime")
    @ResponseBody
    public String getCoutListByTime(@RequestParam(required = true)String level,@RequestParam(required = true) String area){
        try {
            return write(200, "查询成功", "data", statisticsService.getCoutListByTime(level,area));
        } catch (Exception e) {
            return error(-1, "查询失败");
        }