|  | @ -1,27 +1,20 @@
 | 
	
		
			
				|  |  | package com.yihu.wlyy.statistics.job.check;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | import com.yihu.wlyy.statistics.dao.*;
 | 
	
		
			
				|  |  | import com.yihu.wlyy.statistics.job.business.QuartzHelper;
 | 
	
		
			
				|  |  | import com.yihu.wlyy.statistics.job.business.SignAgeGroupDiseaseJob;
 | 
	
		
			
				|  |  | import com.yihu.wlyy.statistics.job.business.SignJob;
 | 
	
		
			
				|  |  | import com.yihu.wlyy.statistics.model.job.QuartzJobConfig;
 | 
	
		
			
				|  |  | import com.yihu.wlyy.statistics.model.job.WlyyQuota;
 | 
	
		
			
				|  |  | import com.yihu.wlyy.statistics.model.job.WlyyQuotaResult;
 | 
	
		
			
				|  |  | import com.yihu.wlyy.statistics.model.signfamily.SignFamily;
 | 
	
		
			
				|  |  | import com.yihu.wlyy.statistics.util.DateUtil;
 | 
	
		
			
				|  |  | import com.yihu.wlyy.statistics.vo.WlyyJobConfigVO;
 | 
	
		
			
				|  |  | import com.yihu.wlyy.statistics.vo.WlyyQuotaVO;
 | 
	
		
			
				|  |  | import org.quartz.Job;
 | 
	
		
			
				|  |  | import org.quartz.JobExecutionContext;
 | 
	
		
			
				|  |  | import org.quartz.JobExecutionException;
 | 
	
		
			
				|  |  | import org.springframework.beans.BeanUtils;
 | 
	
		
			
				|  |  | import org.springframework.beans.factory.annotation.Autowired;
 | 
	
		
			
				|  |  | import org.springframework.beans.factory.annotation.Value;
 | 
	
		
			
				|  |  | import org.springframework.context.annotation.Scope;
 | 
	
		
			
				|  |  | import org.springframework.data.redis.core.StringRedisTemplate;
 | 
	
		
			
				|  |  | import org.springframework.mail.SimpleMailMessage;
 | 
	
		
			
				|  |  | import org.springframework.mail.javamail.JavaMailSender;
 | 
	
		
			
				|  |  | import org.springframework.stereotype.Component;
 | 
	
		
			
				|  |  | import org.springframework.transaction.annotation.Transactional;
 | 
	
		
			
				|  |  | import org.springframework.web.context.support.SpringBeanAutowiringSupport;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | import java.util.*;
 | 
	
		
			
				|  |  | import java.util.Date;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | /**
 | 
	
		
			
				|  |  |  * Created by Administrator on 2016.10.11.
 | 
	
	
		
			
				|  | @ -30,201 +23,42 @@ import java.util.*;
 | 
	
		
			
				|  |  | @Component
 | 
	
		
			
				|  |  | @Scope("prototype")
 | 
	
		
			
				|  |  | public class CheckSignJob implements Job{
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     public static String jobKey="CHECK_SIGN_JOB";
 | 
	
		
			
				|  |  |     public static String cron="0 0 12 * * ?";
 | 
	
		
			
				|  |  |     public static String cron="0 */5 * * * ?";
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
		
			
				|  |  |     private WlyyQuotaResultDao wlyyQuotaResultDao;
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
		
			
				|  |  |     private SignFamilyDao signFamilyDao;
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
		
			
				|  |  |     private QuartzHelper quartzHelper;
 | 
	
		
			
				|  |  |     private StringRedisTemplate redisTemplate;
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
		
			
				|  |  |     private QuartzJobConfigDao wlyyJobConfigDao;
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
		
			
				|  |  |     private QuotaDao quotaDao;
 | 
	
		
			
				|  |  |     private JavaMailSender javaMailSender;
 | 
	
		
			
				|  |  |     @Value("${spring.mail.from}")
 | 
	
		
			
				|  |  |     private String from;;
 | 
	
		
			
				|  |  |     @Value("${spring.mail.to}")
 | 
	
		
			
				|  |  |     private String to;;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     @Transactional
 | 
	
		
			
				|  |  |     public void execute(JobExecutionContext context) throws JobExecutionException {
 | 
	
		
			
				|  |  |         try{
 | 
	
		
			
				|  |  |             SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
 | 
	
		
			
				|  |  |             //得到需要检验的统计
 | 
	
		
			
				|  |  |             List<WlyyQuotaResult> wlyyQuotaResults=getNeedCheckData();
 | 
	
		
			
				|  |  |             //检验统计数据和签约数据是否一致  key:yes 是需要 no:是不需要
 | 
	
		
			
				|  |  |             Map<String,List<WlyyQuotaResult>> wlyyQuotaResultsMap=checkWlyyQuotaResult(wlyyQuotaResults);
 | 
	
		
			
				|  |  |             //更新不需要下一次统计的任务
 | 
	
		
			
				|  |  |             upDataNoNeedCheckQuato(wlyyQuotaResultsMap.get("no"));
 | 
	
		
			
				|  |  |             //添加需要重新统计的指标
 | 
	
		
			
				|  |  |             addNeedCheckQuato(wlyyQuotaResultsMap.get("yes"));
 | 
	
		
			
				|  |  |         }catch (Exception e){
 | 
	
		
			
				|  |  |             //如果出錯立即重新執行
 | 
	
		
			
				|  |  |             JobExecutionException e2 =new JobExecutionException(e);
 | 
	
		
			
				|  |  |             e2.setRefireImmediately(true);
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     private void addNeedCheckQuato(List<WlyyQuotaResult> yes)throws Exception {
 | 
	
		
			
				|  |  |         if(yes.size()>0){
 | 
	
		
			
				|  |  |             for(WlyyQuotaResult wlyyQuotaResult:yes){
 | 
	
		
			
				|  |  |                 QuartzJobConfig quartzJobConfig = wlyyJobConfigDao.findById(wlyyQuotaResult.getId());
 | 
	
		
			
				|  |  |                 if (quartzJobConfig == null) {
 | 
	
		
			
				|  |  |                     throw new Exception("id不存在");
 | 
	
		
			
				|  |  |                 }
 | 
	
		
			
				|  |  |                 WlyyQuota wlyyQuota = quotaDao.findOne(quartzJobConfig.getQuotaId());
 | 
	
		
			
				|  |  |                 WlyyQuotaVO wlyyQuotaVO = new WlyyQuotaVO();
 | 
	
		
			
				|  |  |                 WlyyJobConfigVO wlyyJobConfigVO = new WlyyJobConfigVO();
 | 
	
		
			
				|  |  |                 BeanUtils.copyProperties(wlyyQuota, wlyyQuotaVO);
 | 
	
		
			
				|  |  |                 BeanUtils.copyProperties(quartzJobConfig, wlyyJobConfigVO);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                 Map<String, Object> params = new HashMap<String, Object>();
 | 
	
		
			
				|  |  |                 params.put("quota", wlyyQuotaVO);
 | 
	
		
			
				|  |  |                 params.put("jobConfig", wlyyJobConfigVO);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                 String daybefore=getNextDate(wlyyQuotaResult.getQuotaDate());
 | 
	
		
			
				|  |  |                 String yesterday=wlyyQuotaResult.getQuotaDate();
 | 
	
		
			
				|  |  |                 //往quartz框架添加任务
 | 
	
		
			
				|  |  |                 params.put("daybefore", daybefore);
 | 
	
		
			
				|  |  |                 params.put("yesterday", yesterday);
 | 
	
		
			
				|  |  |                 String jobKey="checkSignQuartz:"+wlyyQuotaResult.getQuotaDate()+":"+wlyyQuotaResult.getQuatoCode();
 | 
	
		
			
				|  |  |                 if(!quartzHelper.isExistJob(jobKey)){
 | 
	
		
			
				|  |  |                     quartzHelper.startAt(weeHours(new Date(),1),SignJob.class,jobKey,params);
 | 
	
		
			
				|  |  |                     //重新生成性别 疾病 扣费 和 年龄的统计
 | 
	
		
			
				|  |  |                     startJob("6",yesterday,daybefore);
 | 
	
		
			
				|  |  |                     startJob("7",yesterday,daybefore);
 | 
	
		
			
				|  |  |                     startJob("8",yesterday,daybefore);
 | 
	
		
			
				|  |  |                     startJob("12",yesterday,daybefore);
 | 
	
		
			
				|  |  |                 }
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     private void startJob(String id, String yesterday, String daybefore) throws Exception{
 | 
	
		
			
				|  |  |         QuartzJobConfig quartzJobConfig = wlyyJobConfigDao.findById(id);
 | 
	
		
			
				|  |  |         if (quartzJobConfig == null) {
 | 
	
		
			
				|  |  |             throw new Exception("id不存在");
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         WlyyQuota wlyyQuota = quotaDao.findOne(quartzJobConfig.getQuotaId());
 | 
	
		
			
				|  |  |         WlyyQuotaVO wlyyQuotaVO = new WlyyQuotaVO();
 | 
	
		
			
				|  |  |         WlyyJobConfigVO wlyyJobConfigVO = new WlyyJobConfigVO();
 | 
	
		
			
				|  |  |         BeanUtils.copyProperties(wlyyQuota, wlyyQuotaVO);
 | 
	
		
			
				|  |  |         BeanUtils.copyProperties(quartzJobConfig, wlyyJobConfigVO);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         Map<String, Object> params = new HashMap<String, Object>();
 | 
	
		
			
				|  |  |         params.put("quota", wlyyQuotaVO);
 | 
	
		
			
				|  |  |         params.put("jobConfig", wlyyJobConfigVO);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         //往quartz框架添加任务
 | 
	
		
			
				|  |  |         params.put("daybefore", daybefore);
 | 
	
		
			
				|  |  |         params.put("yesterday", yesterday);
 | 
	
		
			
				|  |  |         String jobKey="checkSignQuartz:"+yesterday+":"+wlyyQuota.getId();
 | 
	
		
			
				|  |  |         if(!quartzHelper.isExistJob(jobKey)){
 | 
	
		
			
				|  |  |             quartzHelper.startAt(weeHours(new Date(),1),getClassById(id),jobKey,params);
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     private Class getClassById(String id) {
 | 
	
		
			
				|  |  |         switch (id){
 | 
	
		
			
				|  |  |             case "6":{
 | 
	
		
			
				|  |  |                 return SignJob.class;
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             case "7":{
 | 
	
		
			
				|  |  |                 return SignJob.class;
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             case "8":{
 | 
	
		
			
				|  |  |                 return SignJob.class;
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             case "12":{
 | 
	
		
			
				|  |  |                 return SignAgeGroupDiseaseJob.class;
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         return null;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 更新不需要下一次统计的任务   更新qkdoctorJobName字段为1
 | 
	
		
			
				|  |  |      * @param noNeedCheckQuatos
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     private void upDataNoNeedCheckQuato(List<WlyyQuotaResult> noNeedCheckQuatos) {
 | 
	
		
			
				|  |  |         if(noNeedCheckQuatos.size()>0){
 | 
	
		
			
				|  |  |             for(WlyyQuotaResult wlyyQuotaResult:noNeedCheckQuatos){
 | 
	
		
			
				|  |  |                 wlyyQuotaResult.setQkdoctorJobName("1");
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             wlyyQuotaResultDao.save(noNeedCheckQuatos);
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 检验统计数据和签约数据是否一致  key:yes 是需要 no:是不需要
 | 
	
		
			
				|  |  |      * @param wlyyQuotaResults
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     private Map<String,List<WlyyQuotaResult>> checkWlyyQuotaResult(List<WlyyQuotaResult> wlyyQuotaResults) {
 | 
	
		
			
				|  |  |         Map<String,List<WlyyQuotaResult>> returnMap=new HashMap<String,List<WlyyQuotaResult>>();
 | 
	
		
			
				|  |  |         List<WlyyQuotaResult> yes=new ArrayList<WlyyQuotaResult>();//需要重新统计的
 | 
	
		
			
				|  |  |         List<WlyyQuotaResult> no=new ArrayList<WlyyQuotaResult>();//不需要重新统计
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         for(WlyyQuotaResult wlyyQuotaResult:wlyyQuotaResults){
 | 
	
		
			
				|  |  |             String date=  wlyyQuotaResult.getQuotaDate();//格式  2016-10-20
 | 
	
		
			
				|  |  |             String nextDate=getNextDate(date);
 | 
	
		
			
				|  |  |             List<SignFamily> signFamilys = signFamilyDao.findByJiatingSignYesterdayExpensesStatus(date, nextDate);
 | 
	
		
			
				|  |  |             if(signFamilys.size()!=Integer.valueOf(wlyyQuotaResult.getResult())){
 | 
	
		
			
				|  |  |                 //如果数目不相等 说明需要重新统计
 | 
	
		
			
				|  |  |                 yes.add(wlyyQuotaResult);
 | 
	
		
			
				|  |  |             }else{
 | 
	
		
			
				|  |  |                 //如果数目相等 说明需要不需要重新统计
 | 
	
		
			
				|  |  |                 no.add(wlyyQuotaResult);
 | 
	
		
			
				|  |  |             String timeKey=redisTemplate.opsForValue().get("quota:timeKey");
 | 
	
		
			
				|  |  |             if(!redisTemplate.hasKey("quota:16:4:350200:"+timeKey)){
 | 
	
		
			
				|  |  |                 //发送邮件给管理员
 | 
	
		
			
				|  |  |                 sendEmail();
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |         }catch (Exception e){
 | 
	
		
			
				|  |  |             e.printStackTrace();
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         returnMap.put("yes",yes);
 | 
	
		
			
				|  |  |         returnMap.put("no",no);
 | 
	
		
			
				|  |  |         return returnMap;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     private String getNextDate(String date) {
 | 
	
		
			
				|  |  |         Date dateTime=  DateUtil.strToDateShort(date);
 | 
	
		
			
				|  |  |         Calendar calendar = new GregorianCalendar();
 | 
	
		
			
				|  |  |         calendar.setTime(dateTime);
 | 
	
		
			
				|  |  |         calendar.add(calendar.DATE,-1);//把日期往后增加一天.整数往后推,负数往前移动
 | 
	
		
			
				|  |  |         Date nextDateTime=calendar.getTime();
 | 
	
		
			
				|  |  |         return DateUtil.dateToStrShort(nextDateTime);
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  |     private void sendEmail() throws Exception {
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 得到需要检验的统计
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     private List<WlyyQuotaResult> getNeedCheckData() {
 | 
	
		
			
				|  |  |         List<WlyyQuotaResult> wlyyQuotaResults=wlyyQuotaResultDao.findByLevel1TypeAndQkdoctorJobName("4","1");
 | 
	
		
			
				|  |  |         return wlyyQuotaResults;
 | 
	
		
			
				|  |  |         SimpleMailMessage message=new SimpleMailMessage();
 | 
	
		
			
				|  |  |         message.setFrom(from);//发送者.
 | 
	
		
			
				|  |  |         message.setSubject("实时统计失败");//邮件主题.
 | 
	
		
			
				|  |  |         message.setText("实时统计失败,redis数据生成失败 時間:"+ DateUtil.dateToStrLong(new Date()));//邮件内容.
 | 
	
		
			
				|  |  |         message.setTo(to);
 | 
	
		
			
				|  |  |         javaMailSender.send(message);
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 获取当前时间所在的凌晨时间
 | 
	
		
			
				|  |  |      *  凌晨
 | 
	
		
			
				|  |  |      * @param date
 | 
	
		
			
				|  |  |      * @flag 0 返回yyyy-MM-dd 00:00:00日期<br>
 | 
	
		
			
				|  |  |      *       1 返回yyyy-MM-dd 23:59:59日期
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     private  Date weeHours(Date date, int flag) {
 | 
	
		
			
				|  |  |         Calendar cal = Calendar.getInstance();
 | 
	
		
			
				|  |  |         cal.setTime(date);
 | 
	
		
			
				|  |  |         int hour = cal.get(Calendar.HOUR_OF_DAY);
 | 
	
		
			
				|  |  |         int minute = cal.get(Calendar.MINUTE);
 | 
	
		
			
				|  |  |         int second = cal.get(Calendar.SECOND);
 | 
	
		
			
				|  |  |         //时分秒(毫秒数)
 | 
	
		
			
				|  |  |         long millisecond = hour*60*60*1000 + minute*60*1000 + second*1000;
 | 
	
		
			
				|  |  |         //凌晨00:00:00
 | 
	
		
			
				|  |  |         cal.setTimeInMillis(cal.getTimeInMillis()-millisecond);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         if (flag == 0) {
 | 
	
		
			
				|  |  |             return cal.getTime();
 | 
	
		
			
				|  |  |         } else if (flag == 1) {
 | 
	
		
			
				|  |  |             //凌晨23:59:59
 | 
	
		
			
				|  |  |             cal.setTimeInMillis(cal.getTimeInMillis()+23*60*60*1000 + 59*60*1000 + 59*1000);
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         return cal.getTime();
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | }
 |