| 
					
				 | 
			
			
				@ -0,0 +1,174 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				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 javax.annotation.Resource; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import javax.sql.DataSource; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.text.SimpleDateFormat; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.util.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.util.Calendar; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 * 咨询模块 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 * 及时回复的指标执行类 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				@Component 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				@Scope("prototype") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				@DisallowConcurrentExecution//防止到了执行时间点前一任务还在执行中,但是这时有空闲的线程,那么马上又会执行,这样一来就会存在同一job被并行执行 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				public class ReyTimeConsultJob 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; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    //im库的jdbcTemplate 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private JdbcTemplate imjdbcTemplate; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    @Resource(name="imData") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private DataSource dataSource; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    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"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            //初始化im数据源 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            this.imjdbcTemplate = new JdbcTemplate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            this.imjdbcTemplate.setDataSource(dataSource); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            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='" + 23 + "'"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            //新建任务日志对象 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            QuartzJobLog quartzJobLog = new QuartzJobLog(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            quartzJobLog.setJobStartTime(new Date()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            quartzJobLog.setJobId(wlyyJobConfig.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            quartzJobLog.setJobName(wlyyJobConfig.getJobName()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            //查找Im库中的所有的医生ID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            List<String> consultIdMaps = getConsultIdsByIm(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            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< '" + 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<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(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public String getYesterday() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        Calendar cal = Calendar.getInstance(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        cal.add(Calendar.DATE, -1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String yesterday = new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return yesterday; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 找出 im中的所有未回复的topic 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 名医有算 求助没有 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public List<String> getConsultIdsByIm() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String sql = "SELECT DISTINCT t.id consultId " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                " 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 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"))+"'"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        System.out.println("ims num:"+ims.size()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        System.out.println("sql:"+sql); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        System.out.println("ids num:"+ids.size()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return ids; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				} 
			 |