Bladeren bron

配置修改

chenweida 7 jaren geleden
bovenliggende
commit
78002a48a6
15 gewijzigde bestanden met toevoegingen van 1795 en 585 verwijderingen
  1. 101 101
      patient-co/patient-co-statistics-es/src/main/java/com/yihu/wlyy/statistics/job/message/FollowupPlanJob.java
  2. 150 150
      patient-co/patient-co-statistics-es/src/main/java/com/yihu/wlyy/statistics/job/message/HealthMessageJob.java
  3. 220 220
      patient-co/patient-co-statistics-es/src/main/java/com/yihu/wlyy/statistics/job/message/NoticeJob.java
  4. 1 0
      patient-co/patient-co-statistics-es/src/main/java/com/yihu/wlyy/statistics/service/DoctorWorkTimeService.java
  5. 111 114
      patient-co/patient-co-statistics-es/src/main/java/com/yihu/wlyy/statistics/service/JobService.java
  6. 16 0
      patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/event/ApplicationEvent.java
  7. 150 0
      patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/job/HealthMessageJob.java
  8. 221 0
      patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/job/NoticeJob.java
  9. 4 0
      patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/repository/message/MessageDao.java
  10. 112 0
      patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/service/app/scheduling/DoctorWorkTimeService.java
  11. 139 0
      patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/task/NoticeJobPushMsgTask.java
  12. 65 0
      patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/util/DBExtract.java
  13. 156 0
      patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/util/DBPageExtract.java
  14. 128 0
      patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/util/NoticeHttpClientUtil.java
  15. 221 0
      patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/util/NoticeImUtill.java

+ 101 - 101
patient-co/patient-co-statistics-es/src/main/java/com/yihu/wlyy/statistics/job/message/FollowupPlanJob.java

@ -1,101 +1,101 @@
package com.yihu.wlyy.statistics.job.message;
import com.yihu.wlyy.entity.message.Message;
import com.yihu.wlyy.statistics.dao.MessageDao;
import com.yihu.wlyy.statistics.task.PushMsgTask;
import com.yihu.wlyy.statistics.util.DateUtil;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
import javax.transaction.Transactional;
import java.util.*;
/**
 * Created by hzp on 2017.1.4.
 */
@Component
@Scope("prototype")
public class FollowupPlanJob implements Job {
    @Autowired
    JdbcTemplate jdbcTemplate;
    @Value("${systemConfig.msg_push_server}")
    private String url;
    @Autowired
    private MessageDao messageDao;
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
        System.out.print("follow plan message sending...");
        String date = DateUtil.dateToStrShort(new Date());
        //发送随访计划消息
        sendMessage(date);
        System.out.print("follow plan message send over.");
    }
    /**
     * 每日发送随访计划提醒消息
     */
    @Transactional
    public void sendMessage(String date)
    {
        try{
            String start = date +" 00:00:00";
            String end = date +" 23:59:59";
            String sql = "select doctor_code,count(1) count from wlyy_followup where status not in ('0','1') and followup_plan_date>='"+start+"' and followup_plan_date<='"+end+"' group by doctor_code";
            //获取所有未执行随访计划
            List<Map<String,Object>> followupToday = jdbcTemplate.queryForList(sql);
            if(followupToday!=null)
            {
                List<Message> list = new ArrayList<>();
                for(Map<String,Object> map:followupToday)
                {
                    String doctor = String.valueOf(map.get("doctor_code"));
                    String count = String.valueOf(map.get("count"));
                    // 添加签约消息
                    String title = "随访计划提醒";
                    String content = "您今日有" +count+"个随访计划待处理";
                    Message message = new Message();
                    message.setCode(UUID.randomUUID().toString());
                    message.setCzrq(new Date());
                    message.setCreateTime(new Date());
                    message.setContent(content);
                    message.setRead(1);//设置未读
                    message.setReceiver(doctor);//设置接受医生的code
                    message.setSender("system");//设置发送的用户
                    message.setTitle(title);
                    message.setType(4);//随访计划提醒
                    message.setReadonly(1);//是否只读消息
                    list.add(message);
                    // 推送消息给医生
                    PushMsgTask.url= url;
                    // 推送消息给医生
                    PushMsgTask.getInstance().put(doctor,"4",title,content,"");
                }
                messageDao.save(list);
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}
//package com.yihu.wlyy.statistics.job.message;
//
//import com.yihu.wlyy.entity.message.Message;
//import com.yihu.wlyy.statistics.dao.MessageDao;
//import com.yihu.wlyy.statistics.task.PushMsgTask;
//import com.yihu.wlyy.statistics.util.DateUtil;
//import org.quartz.Job;
//import org.quartz.JobExecutionContext;
//import org.quartz.JobExecutionException;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.context.annotation.Scope;
//import org.springframework.jdbc.core.JdbcTemplate;
//import org.springframework.stereotype.Component;
//import org.springframework.web.context.support.SpringBeanAutowiringSupport;
//
//import javax.transaction.Transactional;
//import java.util.*;
//
//
///**
// * Created by hzp on 2017.1.4.
// */
//@Component
//@Scope("prototype")
//public class FollowupPlanJob implements Job {
//    @Autowired
//    JdbcTemplate jdbcTemplate;
//
//    @Value("${systemConfig.msg_push_server}")
//    private String url;
//
//    @Autowired
//    private MessageDao messageDao;
//
//    @Override
//    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
//        System.out.print("follow plan message sending...");
//
//        String date = DateUtil.dateToStrShort(new Date());
//        //发送随访计划消息
//        sendMessage(date);
//
//        System.out.print("follow plan message send over.");
//    }
//
//    /**
//     * 每日发送随访计划提醒消息
//     */
//    @Transactional
//    public void sendMessage(String date)
//    {
//        try{
//            String start = date +" 00:00:00";
//            String end = date +" 23:59:59";
//
//            String sql = "select doctor_code,count(1) count from wlyy_followup where status not in ('0','1') and followup_plan_date>='"+start+"' and followup_plan_date<='"+end+"' group by doctor_code";
//            //获取所有未执行随访计划
//            List<Map<String,Object>> followupToday = jdbcTemplate.queryForList(sql);
//
//            if(followupToday!=null)
//            {
//                List<Message> list = new ArrayList<>();
//                for(Map<String,Object> map:followupToday)
//                {
//                    String doctor = String.valueOf(map.get("doctor_code"));
//                    String count = String.valueOf(map.get("count"));
//
//                    // 添加签约消息
//                    String title = "随访计划提醒";
//                    String content = "您今日有" +count+"个随访计划待处理";
//                    Message message = new Message();
//                    message.setCode(UUID.randomUUID().toString());
//                    message.setCzrq(new Date());
//                    message.setCreateTime(new Date());
//                    message.setContent(content);
//                    message.setRead(1);//设置未读
//                    message.setReceiver(doctor);//设置接受医生的code
//                    message.setSender("system");//设置发送的用户
//                    message.setTitle(title);
//                    message.setType(4);//随访计划提醒
//                    message.setReadonly(1);//是否只读消息
//                    list.add(message);
//                    // 推送消息给医生
//                    PushMsgTask.url= url;
//                    // 推送消息给医生
//                    PushMsgTask.getInstance().put(doctor,"4",title,content,"");
//                }
//
//                messageDao.save(list);
//            }
//
//
//        }
//        catch (Exception e)
//        {
//            e.printStackTrace();
//        }
//    }
//}

+ 150 - 150
patient-co/patient-co-statistics-es/src/main/java/com/yihu/wlyy/statistics/job/message/HealthMessageJob.java

@ -1,150 +1,150 @@
package com.yihu.wlyy.statistics.job.message;
import com.yihu.wlyy.entity.job.QuartzJobLog;
import com.yihu.wlyy.entity.message.Message;
import com.yihu.wlyy.entity.patient.SignFamily;
import com.yihu.wlyy.statistics.dao.MessageDao;
import com.yihu.wlyy.statistics.dao.QuartzJobLogDao;
import com.yihu.wlyy.statistics.etl.extract.db.DBExtract;
import com.yihu.wlyy.statistics.task.PushMsgTask;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
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.10.25.
 */
@Component
@Scope("prototype")
public class HealthMessageJob implements Job {
    public static String jobKey = "Health_Message_JOB";
    public static String cron = "0 0 8 * * ?";
    @Value("${systemConfig.msg_push_server}")
    private String url;
    @Autowired
    private DBExtract dbExtract;
    @Autowired
    private MessageDao messageDao;
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private QuartzJobLogDao quartzJobLogDao;
    @Transactional
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        try {
            SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
            QuartzJobLog quartzJobLog = new QuartzJobLog();
            quartzJobLog.setJobStartTime(new Date());
            quartzJobLog.setJobId(jobKey);
            quartzJobLog.setJobName(jobKey);
            String yesterday = jobExecutionContext.getMergedJobDataMap().getString("yesterday");
            String now = jobExecutionContext.getMergedJobDataMap().getString("now");
            if (StringUtils.isEmpty(yesterday)) {
                yesterday = getYesterday(-1, new Date());
            }
            if (StringUtils.isEmpty(now)) {
                now = getYesterday(0, new Date());
            }
            //删除原来的数据
            String deleteSql = "delete from wlyy_message where type=3 and czrq >= '" + yesterday + " 00:00:00'and czrq <= '" + now + " 00:00:00'";
            jdbcTemplate.execute(deleteSql);
            //生成新的数据
            String sql = "select admin_team_code  from wlyy_sign_family " +
                    " where  status >0 and type='2' " +
                    " and apply_date >='" + yesterday + " 00:00:00' and apply_date<'" + now + " 00:00:00' and  (doctor_health is null or doctor_health = '')";
            String countSql = "select count(id) from wlyy_sign_family " +
                    " where  status >0 and type='2'  " +
                    " and apply_date >='" + yesterday + " 00:00:00' and apply_date<'" + now + " 00:00:00' and  (doctor_health is null or doctor_health = '')";
            List<SignFamily> signFamilyList = dbExtract.extractByPage(SignFamily.class, sql, countSql, true, jdbcTemplate);
            Map<Long, List<SignFamily>> signFamilyMap = new HashMap<Long, List<SignFamily>>();
            for (int i = 0; i < signFamilyList.size(); i++) {
                SignFamily signFamilyTemp = signFamilyList.get(i);
                if (signFamilyMap.containsKey(signFamilyTemp.getAdminTeamId())) {
                    signFamilyMap.get(signFamilyTemp.getAdminTeamId()).add(signFamilyTemp);
                } else {
                    List<SignFamily> signFamilies = new ArrayList<>();
                    signFamilies.add(signFamilyTemp);
                    signFamilyMap.put(signFamilyTemp.getAdminTeamId(), signFamilies);
                }
            }
            JSONArray jsonArray = new JSONArray();
            for (Map.Entry<Long, List<SignFamily>> entry : signFamilyMap.entrySet()) {
                //得到未分配的所有数目
                countSql = "select count(id) from wlyy_sign_family " +
                        " where  status >0 and type='2'  " +
                        "  and apply_date<'" + now + " 00:00:00' and  (doctor_health is null or doctor_health = '') and admin_team_code=" + entry.getKey() + "";
                Integer allCount = jdbcTemplate.queryForObject(countSql, Integer.class);
                //得到团队的leader
                sql = "select leader_code from wlyy_admin_team m where m.id= ?";
                String teamLeader = jdbcTemplate.queryForObject(sql, String.class, entry.getKey());
                Message message = new Message();
                message.setType(3);
                message.setRead(0);
                message.setOver("0");
                message.setDel("1");
                message.setSender("system");
                message.setCzrq(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(yesterday + " 23:59:00"));
                message.setCreateTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(yesterday + " 23:59:00"));
                message.setState(1);
                String title = "新增系统消息";
                message.setTitle(title);
                SimpleDateFormat dateFormat1 = new SimpleDateFormat("yyyy-MM-dd");
                SimpleDateFormat dateFormat2 = new SimpleDateFormat("MM月dd日");
                String content = dateFormat2.format(dateFormat1.parse(yesterday)) + "新增" + entry.getValue().size() + "个签约居民待分配健管师,目前共" + allCount + "人待处理";
                message.setContent(content);
                message.setCode(UUID.randomUUID().toString());
                message.setReceiver(teamLeader);
                messageDao.save(message);
                quartzJobLogDao.save(quartzJobLog);
                // 异常通知
                JSONObject json = new JSONObject();
                json.put("receiver", teamLeader);
                json.put("type", "D_NH_01");
                json.put("title", title);
                json.put("msg", content);
                json.put("data", "");
                jsonArray.add(json);
            }
            quartzJobLog.setJobEndTime(new Date());
            quartzJobLog.setJobContent("生成" + yesterday + "的健康管理师消息成功");
            quartzJobLog.setJobType("1");
            // 推送消息给医生
            PushMsgTask.url = url;
            // 推送消息给医生
            PushMsgTask.getInstance().put(jsonArray);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static String getYesterday(Integer day, Date startDate) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(startDate);
        cal.add(Calendar.DAY_OF_MONTH, day);
        String yesterday = new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
        return yesterday;
    }
    public static void main(String[] args) {
    }
}
//package com.yihu.wlyy.statistics.job.message;
//
//import com.yihu.wlyy.entity.job.QuartzJobLog;
//import com.yihu.wlyy.entity.message.Message;
//import com.yihu.wlyy.entity.patient.SignFamily;
//import com.yihu.wlyy.statistics.dao.MessageDao;
//import com.yihu.wlyy.statistics.dao.QuartzJobLogDao;
//import com.yihu.wlyy.statistics.etl.extract.db.DBExtract;
//import com.yihu.wlyy.statistics.task.PushMsgTask;
//import net.sf.json.JSONArray;
//import net.sf.json.JSONObject;
//import org.quartz.Job;
//import org.quartz.JobExecutionContext;
//import org.quartz.JobExecutionException;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//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.10.25.
// */
//@Component
//@Scope("prototype")
//public class HealthMessageJob implements Job {
//    public static String jobKey = "Health_Message_JOB";
//    public static String cron = "0 0 8 * * ?";
//
//    @Value("${systemConfig.msg_push_server}")
//    private String url;
//    @Autowired
//    private DBExtract dbExtract;
//    @Autowired
//    private MessageDao messageDao;
//    @Autowired
//    private JdbcTemplate jdbcTemplate;
//    @Autowired
//    private QuartzJobLogDao quartzJobLogDao;
//
//    @Transactional
//    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//        try {
//
//            SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
//            QuartzJobLog quartzJobLog = new QuartzJobLog();
//            quartzJobLog.setJobStartTime(new Date());
//            quartzJobLog.setJobId(jobKey);
//            quartzJobLog.setJobName(jobKey);
//            String yesterday = jobExecutionContext.getMergedJobDataMap().getString("yesterday");
//            String now = jobExecutionContext.getMergedJobDataMap().getString("now");
//            if (StringUtils.isEmpty(yesterday)) {
//                yesterday = getYesterday(-1, new Date());
//            }
//            if (StringUtils.isEmpty(now)) {
//                now = getYesterday(0, new Date());
//            }
//            //删除原来的数据
//            String deleteSql = "delete from wlyy_message where type=3 and czrq >= '" + yesterday + " 00:00:00'and czrq <= '" + now + " 00:00:00'";
//            jdbcTemplate.execute(deleteSql);
//            //生成新的数据
//            String sql = "select admin_team_code  from wlyy_sign_family " +
//                    " where  status >0 and type='2' " +
//                    " and apply_date >='" + yesterday + " 00:00:00' and apply_date<'" + now + " 00:00:00' and  (doctor_health is null or doctor_health = '')";
//            String countSql = "select count(id) from wlyy_sign_family " +
//                    " where  status >0 and type='2'  " +
//                    " and apply_date >='" + yesterday + " 00:00:00' and apply_date<'" + now + " 00:00:00' and  (doctor_health is null or doctor_health = '')";
//            List<SignFamily> signFamilyList = dbExtract.extractByPage(SignFamily.class, sql, countSql, true, jdbcTemplate);
//            Map<Long, List<SignFamily>> signFamilyMap = new HashMap<Long, List<SignFamily>>();
//            for (int i = 0; i < signFamilyList.size(); i++) {
//                SignFamily signFamilyTemp = signFamilyList.get(i);
//                if (signFamilyMap.containsKey(signFamilyTemp.getAdminTeamId())) {
//                    signFamilyMap.get(signFamilyTemp.getAdminTeamId()).add(signFamilyTemp);
//                } else {
//                    List<SignFamily> signFamilies = new ArrayList<>();
//                    signFamilies.add(signFamilyTemp);
//                    signFamilyMap.put(signFamilyTemp.getAdminTeamId(), signFamilies);
//                }
//            }
//            JSONArray jsonArray = new JSONArray();
//            for (Map.Entry<Long, List<SignFamily>> entry : signFamilyMap.entrySet()) {
//                //得到未分配的所有数目
//                countSql = "select count(id) from wlyy_sign_family " +
//                        " where  status >0 and type='2'  " +
//                        "  and apply_date<'" + now + " 00:00:00' and  (doctor_health is null or doctor_health = '') and admin_team_code=" + entry.getKey() + "";
//                Integer allCount = jdbcTemplate.queryForObject(countSql, Integer.class);
//                //得到团队的leader
//                sql = "select leader_code from wlyy_admin_team m where m.id= ?";
//                String teamLeader = jdbcTemplate.queryForObject(sql, String.class, entry.getKey());
//                Message message = new Message();
//                message.setType(3);
//                message.setRead(0);
//                message.setOver("0");
//                message.setDel("1");
//                message.setSender("system");
//                message.setCzrq(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(yesterday + " 23:59:00"));
//                message.setCreateTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(yesterday + " 23:59:00"));
//                message.setState(1);
//                String title = "新增系统消息";
//                message.setTitle(title);
//                SimpleDateFormat dateFormat1 = new SimpleDateFormat("yyyy-MM-dd");
//                SimpleDateFormat dateFormat2 = new SimpleDateFormat("MM月dd日");
//                String content = dateFormat2.format(dateFormat1.parse(yesterday)) + "新增" + entry.getValue().size() + "个签约居民待分配健管师,目前共" + allCount + "人待处理";
//                message.setContent(content);
//                message.setCode(UUID.randomUUID().toString());
//                message.setReceiver(teamLeader);
//                messageDao.save(message);
//                quartzJobLogDao.save(quartzJobLog);
//
//                // 异常通知
//                JSONObject json = new JSONObject();
//                json.put("receiver", teamLeader);
//                json.put("type", "D_NH_01");
//                json.put("title", title);
//                json.put("msg", content);
//                json.put("data", "");
//                jsonArray.add(json);
//            }
//            quartzJobLog.setJobEndTime(new Date());
//            quartzJobLog.setJobContent("生成" + yesterday + "的健康管理师消息成功");
//            quartzJobLog.setJobType("1");
//
//
//            // 推送消息给医生
//            PushMsgTask.url = url;
//            // 推送消息给医生
//            PushMsgTask.getInstance().put(jsonArray);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//    public static String getYesterday(Integer day, Date startDate) {
//        Calendar cal = Calendar.getInstance();
//        cal.setTime(startDate);
//        cal.add(Calendar.DAY_OF_MONTH, day);
//        String yesterday = new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
//        return yesterday;
//    }
//
//    public static void main(String[] args) {
//
//    }
//}

+ 220 - 220
patient-co/patient-co-statistics-es/src/main/java/com/yihu/wlyy/statistics/job/message/NoticeJob.java

@ -1,220 +1,220 @@
package com.yihu.wlyy.statistics.job.message;
import com.yihu.wlyy.entity.doctor.profile.Doctor;
import com.yihu.wlyy.entity.job.QuartzJobLog;
import com.yihu.wlyy.statistics.dao.DoctorDao;
import com.yihu.wlyy.statistics.dao.MessageDao;
import com.yihu.wlyy.statistics.dao.QuartzJobLogDao;
import com.yihu.wlyy.statistics.service.DoctorWorkTimeService;
import com.yihu.wlyy.statistics.task.PushMsgTask;
import com.yihu.wlyy.statistics.util.DateUtil;
import com.yihu.wlyy.statistics.util.HttpClientUtil;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * Created by Administrator on 2016/11/7.
 */
@Component
@Scope("prototype")
public class NoticeJob implements Job {
    public static String jobKey = "Notice_JOB";
    public static String jobCron = "0 0 8,14 * * ?"; //每天8点,14点,20 点执行一次
    private static String noticeKey1 = "D_ST_01";//专科
    private static String noticeKey2 = "D_ST_02";//全科
    private static String noticeKey3 = "D_ST_03";//健康管理师
    private static String noticeTitle = "系统消息";
    @Autowired
    private DoctorWorkTimeService doctorWorkTimeService;
    @Autowired
    private QuartzJobLogDao dbStorage;
    @Autowired
    private DoctorDao doctorDao;
    @Value("${systemConfig.msg_push_server}")
    private String url;
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private MessageDao messageDao;
    @Transactional
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        //新建任务日志对象
        QuartzJobLog quartzJobLog = new QuartzJobLog();
        quartzJobLog.setJobStartTime(new Date());
        quartzJobLog.setJobId(jobKey);
        quartzJobLog.setJobName(jobKey);
        try {
            List<Doctor> doctors = doctorDao.findAllDoctors();
            //得到所有未发送的医生的通知
            Map<String, JSONObject> maps = new HashMap<>();
            //发送通知
            for (Doctor doctor : doctors) {
                //判断医生是不是在工作时间内
                String noticeContent1 = " 您当前有[zxsize]条未处理消息,其中[qysize]条为签约消息。请尽快处理~";
                String noticeContent2 = " 您当前有[zxsize]条未处理消息,请尽快处理~";
                String noticeContent3 = " 您当前有[qysize]条签约消息待处理,请尽快处理~";
                String workTime = "";
                try {
                    workTime = doctorWorkTimeService.isDoctorWorking(doctor.getCode(), -1).getString("status");
                } catch (Exception e) {
                }
                if ("1".equals(workTime)) {
                    //得到医生多少条咨询消息
                    Integer zxsize = getDoctorMesssageCount(doctor.getCode(), 1);
                    //得到医生多少条签约消息
                    Integer qysize = getDoctorMesssageCount(doctor.getCode(), 2);
                    //如果既有签约又有咨询
                    if (zxsize > 0 && qysize > 0) {
                        JSONObject jo = new JSONObject();
                        noticeContent1 = noticeContent1.replace("[zxsize]", zxsize + "");
                        noticeContent1 = noticeContent1.replace("[qysize]", qysize + "");
                        jo.put("content", noticeContent1);
                        jo.put("level", doctor.getLevel());
                        maps.put(doctor.getCode(), jo);
                    }
                    //只有咨询
                    if (zxsize > 0 && qysize == 0) {
                        JSONObject jo = new JSONObject();
                        noticeContent2 = noticeContent2.replace("[zxsize]", zxsize + "");
                        jo.put("content", noticeContent2);
                        jo.put("level", doctor.getLevel());
                        maps.put(doctor.getCode(), jo);
                    }
                    //只有咨询
                    if (zxsize == 0 && qysize > 0) {
                        JSONObject jo = new JSONObject();
                        noticeContent3 = noticeContent3.replace("[qysize]", qysize + "");
                        jo.put("content", noticeContent3);
                        jo.put("level", doctor.getLevel());
                        maps.put(doctor.getCode(), jo);
                    }
                }
            }
            JSONArray jsonArray = new JSONArray();
            //发送通知
            for (Map.Entry<String, JSONObject> entry : maps.entrySet()) {
                // 异常通知
                JSONObject json = new JSONObject();
                json.put("receiver", entry.getKey());
                json.put("type", getType(entry.getValue().getInt("level")));
                json.put("title", noticeTitle);
                json.put("msg", entry.getValue().getString("content"));
                json.put("data", "");
                jsonArray.add(json);
            }
            // 推送消息给医生
            PushMsgTask.url = url;
            // 推送消息给医生
            PushMsgTask.getInstance().put(jsonArray);
            //保存日志
            quartzJobLog.setJobEndTime(new Date());
            quartzJobLog.setJobContent("通知成功");
            quartzJobLog.setJobType("1");
            dbStorage.save(quartzJobLog);
        } catch (Exception e) {
            //保存日志
            quartzJobLog.setJobEndTime(new Date());
            quartzJobLog.setJobContent("通知失败");
            quartzJobLog.setJobType("0");
            dbStorage.save(quartzJobLog);
            e.printStackTrace();
        }
    }
    private String getType(Integer level) {
        switch (level) {
            case 1: {
                //专科
                return noticeKey1;
            }
            case 2: {
                //全科
                return noticeKey2;
            }
            case 3: {
                //健康管理师
                return noticeKey3;
            }
        }
        return "";
    }
    /**
     * 得到医生的未读数目
     *
     * @param doctorCode 医生code
     * @param type       1是咨询 2个签约 3是体征
     * @return
     */
    private Integer getDoctorMesssageCount(String doctorCode, int type) throws Exception {
        switch (type) {
            case 1: {
                return getImMsgAmount(doctorCode);
            }
            case 2: {
                String sql = "select count(a.id) from wlyy_message a where a.type =1 and a.has_read=1 and a.receiver=?";
                return jdbcTemplate.queryForObject(sql, Integer.class, doctorCode);
            }
        }
        return 0;
    }
    private int findDoctorAllMessage(String doctor) {
        // 签约未读消息总数
        int sign = messageDao.amountUnreadByReceiver(doctor);
        // 体征指标未读消息总数
        int healthIndex = messageDao.amountUnreadHealthByReceiver(doctor);
        //系统消息
        int systemMessage = messageDao.amountUnreadSystemByReceiver(doctor);
        Integer doctorCount = 0;
        Integer patientCount = 0;
        JSONObject json = new JSONObject();
        getImMsgAmount(json, doctor);
        if (json.containsKey("imMsgCount")) {
            JSONObject jsonC = json.getJSONObject("imMsgCount");
            if (jsonC.containsKey("doctor")) {
                doctorCount = jsonC.getInt("doctor");
            }
            if (jsonC.containsKey("patient")) {
                patientCount = jsonC.getInt("patient");
            }
        }
        return sign + healthIndex + systemMessage + doctorCount + patientCount;
    }
    private void getImMsgAmount(JSONObject obj, String doctor) {
        String urlall = url + "/api/v1/chats/msg/amount?user_id=" + doctor;
        String response = HttpClientUtil.get(urlall, "UTF-8");
        obj.put("imMsgCount", response);
    }
    private Integer getImMsgAmount(String doctor) throws Exception {
        /**
         * {"msg":"获取消息总数成功!","data":{"imMsgCount":"{\"doctor\":0,\"patient\":0}","healthIndex":{"amount":0},"sign":{"amount":0}},"status":200}
         */
        return findDoctorAllMessage(doctor);
    }
}
//package com.yihu.wlyy.statistics.job.message;
//
//import com.yihu.wlyy.entity.doctor.profile.Doctor;
//import com.yihu.wlyy.entity.job.QuartzJobLog;
//import com.yihu.wlyy.statistics.dao.DoctorDao;
//import com.yihu.wlyy.statistics.dao.MessageDao;
//import com.yihu.wlyy.statistics.dao.QuartzJobLogDao;
//import com.yihu.wlyy.statistics.service.DoctorWorkTimeService;
//import com.yihu.wlyy.statistics.task.PushMsgTask;
//import com.yihu.wlyy.statistics.util.DateUtil;
//import com.yihu.wlyy.statistics.util.HttpClientUtil;
//import net.sf.json.JSONArray;
//import net.sf.json.JSONObject;
//import org.quartz.Job;
//import org.quartz.JobExecutionContext;
//import org.quartz.JobExecutionException;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.context.annotation.Scope;
//import org.springframework.data.domain.Page;
//import org.springframework.data.domain.PageRequest;
//import org.springframework.jdbc.core.JdbcTemplate;
//import org.springframework.stereotype.Component;
//import org.springframework.transaction.annotation.Transactional;
//
//import java.util.Date;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
///**
// * Created by Administrator on 2016/11/7.
// */
//
//@Component
//@Scope("prototype")
//public class NoticeJob implements Job {
//    public static String jobKey = "Notice_JOB";
//    public static String jobCron = "0 0 8,14 * * ?"; //每天8点,14点,20 点执行一次
//    private static String noticeKey1 = "D_ST_01";//专科
//    private static String noticeKey2 = "D_ST_02";//全科
//    private static String noticeKey3 = "D_ST_03";//健康管理师
//    private static String noticeTitle = "系统消息";
//
//    @Autowired
//    private DoctorWorkTimeService doctorWorkTimeService;
//    @Autowired
//    private QuartzJobLogDao dbStorage;
//    @Autowired
//    private DoctorDao doctorDao;
//    @Value("${systemConfig.msg_push_server}")
//    private String url;
//    @Autowired
//    private JdbcTemplate jdbcTemplate;
//    @Autowired
//    private MessageDao messageDao;
//
//    @Transactional
//    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//        //新建任务日志对象
//        QuartzJobLog quartzJobLog = new QuartzJobLog();
//        quartzJobLog.setJobStartTime(new Date());
//        quartzJobLog.setJobId(jobKey);
//        quartzJobLog.setJobName(jobKey);
//        try {
//            List<Doctor> doctors = doctorDao.findAllDoctors();
//            //得到所有未发送的医生的通知
//            Map<String, JSONObject> maps = new HashMap<>();
//            //发送通知
//            for (Doctor doctor : doctors) {
//                //判断医生是不是在工作时间内
//                String noticeContent1 = " 您当前有[zxsize]条未处理消息,其中[qysize]条为签约消息。请尽快处理~";
//                String noticeContent2 = " 您当前有[zxsize]条未处理消息,请尽快处理~";
//                String noticeContent3 = " 您当前有[qysize]条签约消息待处理,请尽快处理~";
//                String workTime = "";
//                try {
//                    workTime = doctorWorkTimeService.isDoctorWorking(doctor.getCode(), -1).getString("status");
//                } catch (Exception e) {
//
//                }
//                if ("1".equals(workTime)) {
//                    //得到医生多少条咨询消息
//                    Integer zxsize = getDoctorMesssageCount(doctor.getCode(), 1);
//                    //得到医生多少条签约消息
//                    Integer qysize = getDoctorMesssageCount(doctor.getCode(), 2);
//                    //如果既有签约又有咨询
//                    if (zxsize > 0 && qysize > 0) {
//                        JSONObject jo = new JSONObject();
//                        noticeContent1 = noticeContent1.replace("[zxsize]", zxsize + "");
//                        noticeContent1 = noticeContent1.replace("[qysize]", qysize + "");
//                        jo.put("content", noticeContent1);
//                        jo.put("level", doctor.getLevel());
//                        maps.put(doctor.getCode(), jo);
//                    }
//                    //只有咨询
//                    if (zxsize > 0 && qysize == 0) {
//                        JSONObject jo = new JSONObject();
//                        noticeContent2 = noticeContent2.replace("[zxsize]", zxsize + "");
//                        jo.put("content", noticeContent2);
//                        jo.put("level", doctor.getLevel());
//                        maps.put(doctor.getCode(), jo);
//                    }
//                    //只有咨询
//                    if (zxsize == 0 && qysize > 0) {
//                        JSONObject jo = new JSONObject();
//                        noticeContent3 = noticeContent3.replace("[qysize]", qysize + "");
//                        jo.put("content", noticeContent3);
//                        jo.put("level", doctor.getLevel());
//                        maps.put(doctor.getCode(), jo);
//                    }
//                }
//            }
//            JSONArray jsonArray = new JSONArray();
//            //发送通知
//            for (Map.Entry<String, JSONObject> entry : maps.entrySet()) {
//                // 异常通知
//                JSONObject json = new JSONObject();
//                json.put("receiver", entry.getKey());
//                json.put("type", getType(entry.getValue().getInt("level")));
//                json.put("title", noticeTitle);
//                json.put("msg", entry.getValue().getString("content"));
//                json.put("data", "");
//                jsonArray.add(json);
//            }
//            // 推送消息给医生
//            PushMsgTask.url = url;
//            // 推送消息给医生
//            PushMsgTask.getInstance().put(jsonArray);
//            //保存日志
//            quartzJobLog.setJobEndTime(new Date());
//            quartzJobLog.setJobContent("通知成功");
//            quartzJobLog.setJobType("1");
//            dbStorage.save(quartzJobLog);
//        } catch (Exception e) {
//            //保存日志
//            quartzJobLog.setJobEndTime(new Date());
//            quartzJobLog.setJobContent("通知失败");
//            quartzJobLog.setJobType("0");
//            dbStorage.save(quartzJobLog);
//            e.printStackTrace();
//        }
//
//    }
//
//    private String getType(Integer level) {
//        switch (level) {
//            case 1: {
//                //专科
//                return noticeKey1;
//            }
//            case 2: {
//                //全科
//                return noticeKey2;
//            }
//            case 3: {
//                //健康管理师
//                return noticeKey3;
//            }
//        }
//        return "";
//    }
//
//
//    /**
//     * 得到医生的未读数目
//     *
//     * @param doctorCode 医生code
//     * @param type       1是咨询 2个签约 3是体征
//     * @return
//     */
//    private Integer getDoctorMesssageCount(String doctorCode, int type) throws Exception {
//        switch (type) {
//            case 1: {
//                return getImMsgAmount(doctorCode);
//            }
//            case 2: {
//                String sql = "select count(a.id) from wlyy_message a where a.type =1 and a.has_read=1 and a.receiver=?";
//                return jdbcTemplate.queryForObject(sql, Integer.class, doctorCode);
//            }
//        }
//        return 0;
//    }
//
//    private int findDoctorAllMessage(String doctor) {
//        // 签约未读消息总数
//        int sign = messageDao.amountUnreadByReceiver(doctor);
//        // 体征指标未读消息总数
//        int healthIndex = messageDao.amountUnreadHealthByReceiver(doctor);
//        //系统消息
//        int systemMessage = messageDao.amountUnreadSystemByReceiver(doctor);
//        Integer doctorCount = 0;
//        Integer patientCount = 0;
//        JSONObject json = new JSONObject();
//        getImMsgAmount(json, doctor);
//        if (json.containsKey("imMsgCount")) {
//            JSONObject jsonC = json.getJSONObject("imMsgCount");
//            if (jsonC.containsKey("doctor")) {
//                doctorCount = jsonC.getInt("doctor");
//            }
//            if (jsonC.containsKey("patient")) {
//                patientCount = jsonC.getInt("patient");
//            }
//        }
//
//        return sign + healthIndex + systemMessage + doctorCount + patientCount;
//    }
//
//    private void getImMsgAmount(JSONObject obj, String doctor) {
//        String urlall = url + "/api/v1/chats/msg/amount?user_id=" + doctor;
//        String response = HttpClientUtil.get(urlall, "UTF-8");
//        obj.put("imMsgCount", response);
//    }
//
//    private Integer getImMsgAmount(String doctor) throws Exception {
//        /**
//         * {"msg":"获取消息总数成功!","data":{"imMsgCount":"{\"doctor\":0,\"patient\":0}","healthIndex":{"amount":0},"sign":{"amount":0}},"status":200}
//         */
//        return findDoctorAllMessage(doctor);
//    }
//}

+ 1 - 0
patient-co/patient-co-statistics-es/src/main/java/com/yihu/wlyy/statistics/service/DoctorWorkTimeService.java

@ -186,6 +186,7 @@ public class DoctorWorkTimeService {
        return json;
    }
    public Date getDoctorWeek(String doctor, Integer week) throws Exception {
        Date json = new Date();
        Calendar calendar = Calendar.getInstance();

+ 111 - 114
patient-co/patient-co-statistics-es/src/main/java/com/yihu/wlyy/statistics/service/JobService.java

@ -6,9 +6,6 @@ import com.yihu.wlyy.statistics.dao.QuartzJobConfigDao;
import com.yihu.wlyy.statistics.dao.SignFamilyDao;
import com.yihu.wlyy.statistics.etl.cache.Cache;
import com.yihu.wlyy.statistics.job.check.CheckSignJob;
import com.yihu.wlyy.statistics.job.message.FollowupPlanJob;
import com.yihu.wlyy.statistics.job.message.HealthMessageJob;
import com.yihu.wlyy.statistics.job.message.NoticeJob;
import com.yihu.wlyy.statistics.util.QuartzHelper;
import com.yihu.wlyy.statistics.vo.WlyyJobConfigVO;
import org.springframework.beans.BeanUtils;
@ -254,11 +251,11 @@ public class JobService {
        }
    }
    @Transactional
    @Async("dbExtractExecutor")
    public void startaaaa() throws Exception {
        quartzHelper.startNow(HealthMessageJob.class, UUID.randomUUID().toString().replace("-", ""), new HashMap<>());
    }
//    @Transactional
//    @Async("dbExtractExecutor")
//    public void startaaaa() throws Exception {
//        quartzHelper.startNow(HealthMessageJob.class, UUID.randomUUID().toString().replace("-", ""), new HashMap<>());
//    }
    public void productDataByDayAndId(Integer day, String id) throws Exception {
        QuartzJobConfig quartzJobConfig = wlyyJobConfigDao.findById(id);
@ -349,114 +346,114 @@ public class JobService {
    }
    public void startHealthMessageJob() throws Exception {
        if (!quartzHelper.isExistJob(HealthMessageJob.jobKey)) {
            quartzHelper.addJob(HealthMessageJob.class, HealthMessageJob.cron, HealthMessageJob.jobKey, new HashMap<>());
        } else {
            throw new Exception("已经启动");
        }
    }
    public void stopHealthMessageJob() throws Exception {
        if (quartzHelper.isExistJob(HealthMessageJob.jobKey)) {
            quartzHelper.removeJob(HealthMessageJob.jobKey);
        } else {
            throw new Exception("已经停止");
        }
    }
    public void productHealthDataByOneDay(String day) throws Exception {
        SimpleDateFormat dataSimple = new SimpleDateFormat("yyyy-MM-dd");
        Date date = dataSimple.parse(day);
        if (date == null) {
            throw new Exception("时间格式错误");
        }
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        calendar.add(calendar.DATE, 1);//把日期往后增加一天.整数往后推,负数往前移动
        Date nowDate = calendar.getTime();   //这个时间就是日期往后推一天的结果
        String yesterday = new SimpleDateFormat("yyyy-MM-dd").format(nowDate.getTime());
        Map<String, String> params = new HashMap<String, String>();
        //往quartz框架添加任务
        params.put("now", yesterday);
        params.put("yesterday", day);
        quartzHelper.startNow(HealthMessageJob.class, HealthMessageJob.jobKey + UUID.randomUUID().toString().replace("-", ""), params);
        //Thread.sleep(40000L);
    }
    public void productHealthDataByDayToDay(String start, String end) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date startDate = sdf.parse(start);
        Date endDate = sdf.parse(end);
        if (startDate.after(endDate)) {
            throw new Exception("日期参数错误");
        }
        int day = daysBetween(startDate, endDate);
        for (int i = 0; i < day; i++) {
            productHealthDataByOneDay(getYesterday(i, startDate));
        }
    }
    public static void main(String[] args) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date startDate = sdf.parse("2016-10-20");
        Date endDate = sdf.parse("2016-10-28");
        System.out.println(daysBetween(startDate, endDate));
        System.out.println(getYesterday(0, startDate));
    }
    public void startNoticeJob() throws Exception {
        if (!quartzHelper.isExistJob(NoticeJob.jobKey)) {
            quartzHelper.addJob(NoticeJob.class, NoticeJob.jobCron, NoticeJob.jobKey, new HashMap<>());
            // quartzHelper.startNow(NoticeJob.class, UUID.randomUUID().toString().replace("-", ""), new HashMap<>());
        } else {
            throw new Exception("已经启动");
        }
    }
    public void stopNoticeJob() throws Exception {
        if (quartzHelper.isExistJob(NoticeJob.jobKey)) {
            quartzHelper.removeJob(NoticeJob.jobKey);
        } else {
            throw new Exception("已经停止");
        }
    }
//    public void startHealthMessageJob() throws Exception {
//        if (!quartzHelper.isExistJob(HealthMessageJob.jobKey)) {
//            quartzHelper.addJob(HealthMessageJob.class, HealthMessageJob.cron, HealthMessageJob.jobKey, new HashMap<>());
//        } else {
//            throw new Exception("已经启动");
//        }
//    }
//
//    public void stopHealthMessageJob() throws Exception {
//        if (quartzHelper.isExistJob(HealthMessageJob.jobKey)) {
//            quartzHelper.removeJob(HealthMessageJob.jobKey);
//        } else {
//            throw new Exception("已经停止");
//        }
//    }
//
//    public void productHealthDataByOneDay(String day) throws Exception {
//        SimpleDateFormat dataSimple = new SimpleDateFormat("yyyy-MM-dd");
//
//        Date date = dataSimple.parse(day);
//        if (date == null) {
//            throw new Exception("时间格式错误");
//        }
//        Calendar calendar = new GregorianCalendar();
//        calendar.setTime(date);
//        calendar.add(calendar.DATE, 1);//把日期往后增加一天.整数往后推,负数往前移动
//        Date nowDate = calendar.getTime();   //这个时间就是日期往后推一天的结果
//        String yesterday = new SimpleDateFormat("yyyy-MM-dd").format(nowDate.getTime());
//        Map<String, String> params = new HashMap<String, String>();
//        //往quartz框架添加任务
//        params.put("now", yesterday);
//        params.put("yesterday", day);
//
//        quartzHelper.startNow(HealthMessageJob.class, HealthMessageJob.jobKey + UUID.randomUUID().toString().replace("-", ""), params);
//        //Thread.sleep(40000L);
//    }
//
//    public void productHealthDataByDayToDay(String start, String end) throws Exception {
//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//        Date startDate = sdf.parse(start);
//        Date endDate = sdf.parse(end);
//        if (startDate.after(endDate)) {
//            throw new Exception("日期参数错误");
//        }
//        int day = daysBetween(startDate, endDate);
//        for (int i = 0; i < day; i++) {
//            productHealthDataByOneDay(getYesterday(i, startDate));
//        }
//    }
//
//    public static void main(String[] args) throws Exception {
//
//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//        Date startDate = sdf.parse("2016-10-20");
//        Date endDate = sdf.parse("2016-10-28");
//        System.out.println(daysBetween(startDate, endDate));
//        System.out.println(getYesterday(0, startDate));
//    }
//
//
//    public void startNoticeJob() throws Exception {
//        if (!quartzHelper.isExistJob(NoticeJob.jobKey)) {
//            quartzHelper.addJob(NoticeJob.class, NoticeJob.jobCron, NoticeJob.jobKey, new HashMap<>());
//            // quartzHelper.startNow(NoticeJob.class, UUID.randomUUID().toString().replace("-", ""), new HashMap<>());
//
//        } else {
//            throw new Exception("已经启动");
//        }
//    }
//
//    public void stopNoticeJob() throws Exception {
//        if (quartzHelper.isExistJob(NoticeJob.jobKey)) {
//            quartzHelper.removeJob(NoticeJob.jobKey);
//        } else {
//            throw new Exception("已经停止");
//        }
//    }
    /*******************************
     * 随访计划任务
     *******************************************************/
    @Value("${spring.followupMessage.jobId}")
    private String followupJob;
    @Value("${spring.followupMessage.cron}")
    private String followupJobCron;
    public void startFollowupPlantJob() throws Exception {
        if (!quartzHelper.isExistJob(followupJob)) {
            quartzHelper.addJob(FollowupPlanJob.class, followupJobCron, followupJob, new HashMap<>());
        } else {
            throw new Exception("已经启动");
        }
    }
    public void stopFollowupPlantJob() throws Exception {
        if (quartzHelper.isExistJob(followupJob)) {
            quartzHelper.removeJob(followupJob);
        } else {
            throw new Exception("已经停止");
        }
    }
    public void startNoticeJobNow() throws Exception {
        quartzHelper.startNow(NoticeJob.class, UUID.randomUUID().toString(), new HashMap<>());
    }
    public void startHealthMessageJobNow() throws Exception {
        quartzHelper.startNow(HealthMessageJob.class, UUID.randomUUID().toString(), new HashMap<>());
    }
//    @Value("${spring.followupMessage.jobId}")
//    private String followupJob;
//    @Value("${spring.followupMessage.cron}")
//    private String followupJobCron;
//
//    public void startFollowupPlantJob() throws Exception {
//        if (!quartzHelper.isExistJob(followupJob)) {
//            quartzHelper.addJob(FollowupPlanJob.class, followupJobCron, followupJob, new HashMap<>());
//        } else {
//            throw new Exception("已经启动");
//        }
//    }
//
//    public void stopFollowupPlantJob() throws Exception {
//        if (quartzHelper.isExistJob(followupJob)) {
//            quartzHelper.removeJob(followupJob);
//        } else {
//            throw new Exception("已经停止");
//        }
//    }
//
//    public void startNoticeJobNow() throws Exception {
//        quartzHelper.startNow(NoticeJob.class, UUID.randomUUID().toString(), new HashMap<>());
//
//    }
//
//    public void startHealthMessageJobNow() throws Exception {
//        quartzHelper.startNow(HealthMessageJob.class, UUID.randomUUID().toString(), new HashMap<>());
//    }
}

+ 16 - 0
patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/event/ApplicationEvent.java

@ -206,6 +206,22 @@ public class ApplicationEvent implements ApplicationListener<ContextRefreshedEve
                logger.info("sicard_query_job  job exist");
            }
            //待分配健管师消息提醒 从统计工程中转到到job工程
            if (!quartzHelper.isExistJob(HealthMessageJob.jobKey)) {
                quartzHelper.addJob(HealthMessageJob.class, HealthMessageJob.cron, HealthMessageJob.jobKey, new HashMap<String, Object>());
                logger.info("HealthMessageJob  job success");
            } else {
                logger.info("HealthMessageJob  job exist");
            }
            //签约消息提醒 从统计工程中转到到job工程
            if (!quartzHelper.isExistJob(NoticeJob.jobKey)) {
                quartzHelper.addJob(NoticeJob.class, NoticeJob.jobCron, NoticeJob.jobKey, new HashMap<String, Object>());
                logger.info("NoticeJob  job success");
            } else {
                logger.info("NoticeJob  job exist");
            }
            // 启动redis 消息队列线程
            logger.info("redis message start");
            new Thread(redisThread).start();

+ 150 - 0
patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/job/HealthMessageJob.java

@ -0,0 +1,150 @@
package com.yihu.wlyy.job;
import com.yihu.wlyy.entity.job.QuartzJobLog;
import com.yihu.wlyy.entity.message.Message;
import com.yihu.wlyy.entity.patient.SignFamily;
import com.yihu.wlyy.repository.job.QuartzJobLogDao;
import com.yihu.wlyy.repository.message.MessageDao;
import com.yihu.wlyy.task.NoticeJobPushMsgTask;
import com.yihu.wlyy.util.DBExtract;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
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.10.25.
 */
@Component
@Scope("prototype")
public class HealthMessageJob implements Job {
    public static String jobKey = "Health_Message_JOB";
    public static String cron = "0 0 8 * * ?";
    @Value("${systemConfig.msg_push_server}")
    private String url;
    @Autowired
    private DBExtract dbExtract;
    @Autowired
    private MessageDao messageDao;
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private QuartzJobLogDao quartzJobLogDao;
    @Transactional
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        try {
            SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
            QuartzJobLog quartzJobLog = new QuartzJobLog();
            quartzJobLog.setJobStartTime(new Date());
            quartzJobLog.setJobId(jobKey);
            quartzJobLog.setJobName(jobKey);
            String yesterday = jobExecutionContext.getMergedJobDataMap().getString("yesterday");
            String now = jobExecutionContext.getMergedJobDataMap().getString("now");
            if (StringUtils.isEmpty(yesterday)) {
                yesterday = getYesterday(-1, new Date());
            }
            if (StringUtils.isEmpty(now)) {
                now = getYesterday(0, new Date());
            }
            //删除原来的数据
            String deleteSql = "delete from wlyy_message where type=3 and czrq >= '" + yesterday + " 00:00:00'and czrq <= '" + now + " 00:00:00'";
            jdbcTemplate.execute(deleteSql);
            //生成新的数据
            String sql = "select admin_team_code  from wlyy_sign_family " +
                    " where  status >0 and type='2' " +
                    " and apply_date >='" + yesterday + " 00:00:00' and apply_date<'" + now + " 00:00:00' and  (doctor_health is null or doctor_health = '')";
            String countSql = "select count(id) from wlyy_sign_family " +
                    " where  status >0 and type='2'  " +
                    " and apply_date >='" + yesterday + " 00:00:00' and apply_date<'" + now + " 00:00:00' and  (doctor_health is null or doctor_health = '')";
            List<SignFamily> signFamilyList = dbExtract.extractByPage(SignFamily.class, sql, countSql, true, jdbcTemplate);
            Map<Long, List<SignFamily>> signFamilyMap = new HashMap<Long, List<SignFamily>>();
            for (int i = 0; i < signFamilyList.size(); i++) {
                SignFamily signFamilyTemp = signFamilyList.get(i);
                if (signFamilyMap.containsKey(signFamilyTemp.getAdminTeamId())) {
                    signFamilyMap.get(signFamilyTemp.getAdminTeamId()).add(signFamilyTemp);
                } else {
                    List<SignFamily> signFamilies = new ArrayList<>();
                    signFamilies.add(signFamilyTemp);
                    signFamilyMap.put(signFamilyTemp.getAdminTeamId(), signFamilies);
                }
            }
            JSONArray jsonArray = new JSONArray();
            for (Map.Entry<Long, List<SignFamily>> entry : signFamilyMap.entrySet()) {
                //得到未分配的所有数目
                countSql = "select count(id) from wlyy_sign_family " +
                        " where  status >0 and type='2'  " +
                        "  and apply_date<'" + now + " 00:00:00' and  (doctor_health is null or doctor_health = '') and admin_team_code=" + entry.getKey() + "";
                Integer allCount = jdbcTemplate.queryForObject(countSql, Integer.class);
                //得到团队的leader
                sql = "select leader_code from wlyy_admin_team m where m.id= ?";
                String teamLeader = jdbcTemplate.queryForObject(sql, String.class, entry.getKey());
                Message message = new Message();
                message.setType(3);
                message.setRead(0);
                message.setOver("0");
                message.setDel("1");
                message.setSender("system");
                message.setCzrq(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(yesterday + " 23:59:00"));
                message.setCreateTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(yesterday + " 23:59:00"));
                message.setState(1);
                String title = "新增系统消息";
                message.setTitle(title);
                SimpleDateFormat dateFormat1 = new SimpleDateFormat("yyyy-MM-dd");
                SimpleDateFormat dateFormat2 = new SimpleDateFormat("MM月dd日");
                String content = dateFormat2.format(dateFormat1.parse(yesterday)) + "新增" + entry.getValue().size() + "个签约居民待分配健管师,目前共" + allCount + "人待处理";
                message.setContent(content);
                message.setCode(UUID.randomUUID().toString());
                message.setReceiver(teamLeader);
                messageDao.save(message);
                quartzJobLogDao.save(quartzJobLog);
                // 异常通知
                JSONObject json = new JSONObject();
                json.put("receiver", teamLeader);
                json.put("type", "D_NH_01");
                json.put("title", title);
                json.put("msg", content);
                json.put("data", "");
                jsonArray.add(json);
            }
            quartzJobLog.setJobEndTime(new Date());
            quartzJobLog.setJobContent("生成" + yesterday + "的健康管理师消息成功");
            quartzJobLog.setJobType("1");
            // 推送消息给医生
            NoticeJobPushMsgTask.url = url;
            // 推送消息给医生
            NoticeJobPushMsgTask.getInstance().put(jsonArray);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static String getYesterday(Integer day, Date startDate) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(startDate);
        cal.add(Calendar.DAY_OF_MONTH, day);
        String yesterday = new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
        return yesterday;
    }
    public static void main(String[] args) {
    }
}

+ 221 - 0
patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/job/NoticeJob.java

@ -0,0 +1,221 @@
package com.yihu.wlyy.job;
import com.yihu.wlyy.entity.doctor.profile.Doctor;
import com.yihu.wlyy.entity.job.QuartzJobLog;
import com.yihu.wlyy.repository.doctor.DoctorDao;
import com.yihu.wlyy.repository.job.QuartzJobLogDao;
import com.yihu.wlyy.repository.message.MessageDao;
import com.yihu.wlyy.service.app.scheduling.DoctorWorkTimeService;
import com.yihu.wlyy.task.NoticeJobPushMsgTask;
import com.yihu.wlyy.task.PushMsgTask;
import com.yihu.wlyy.util.HttpClientUtil;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * Created by Administrator on 2016/11/7.
 */
@Component
@Scope("prototype")
public class NoticeJob implements Job {
    public static String jobKey = "Notice_JOB";
    public static String jobCron = "0 0 8,14 * * ?"; //每天8点,14点,20 点执行一次
    private static String noticeKey1 = "D_ST_01";//专科
    private static String noticeKey2 = "D_ST_02";//全科
    private static String noticeKey3 = "D_ST_03";//健康管理师
    private static String noticeTitle = "系统消息";
    @Autowired
    private DoctorWorkTimeService doctorWorkTimeService;
    @Autowired
    private QuartzJobLogDao dbStorage;
    @Autowired
    private DoctorDao doctorDao;
    @Value("${systemConfig.msg_push_server}")
    private String url;
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private MessageDao messageDao;
    @Autowired
    private HttpClientUtil httpClientUtil;
    @Transactional
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        //新建任务日志对象
        QuartzJobLog quartzJobLog = new QuartzJobLog();
        quartzJobLog.setJobStartTime(new Date());
        quartzJobLog.setJobId(jobKey);
        quartzJobLog.setJobName(jobKey);
        try {
            List<Doctor> doctors = doctorDao.findAllDoctors();
            //得到所有未发送的医生的通知
            Map<String, JSONObject> maps = new HashMap<>();
            //发送通知
            for (Doctor doctor : doctors) {
                //判断医生是不是在工作时间内
                String noticeContent1 = " 您当前有[zxsize]条未处理消息,其中[qysize]条为签约消息。请尽快处理~";
                String noticeContent2 = " 您当前有[zxsize]条未处理消息,请尽快处理~";
                String noticeContent3 = " 您当前有[qysize]条签约消息待处理,请尽快处理~";
                String workTime = "";
                try {
                    workTime = doctorWorkTimeService.isDoctorWorking(doctor.getCode(), -1).getString("status");
                } catch (Exception e) {
                }
                if ("1".equals(workTime)) {
                    //得到医生多少条咨询消息
                    Integer zxsize = getDoctorMesssageCount(doctor.getCode(), 1);
                    //得到医生多少条签约消息
                    Integer qysize = getDoctorMesssageCount(doctor.getCode(), 2);
                    //如果既有签约又有咨询
                    if (zxsize > 0 && qysize > 0) {
                        JSONObject jo = new JSONObject();
                        noticeContent1 = noticeContent1.replace("[zxsize]", zxsize + "");
                        noticeContent1 = noticeContent1.replace("[qysize]", qysize + "");
                        jo.put("content", noticeContent1);
                        jo.put("level", doctor.getLevel());
                        maps.put(doctor.getCode(), jo);
                    }
                    //只有咨询
                    if (zxsize > 0 && qysize == 0) {
                        JSONObject jo = new JSONObject();
                        noticeContent2 = noticeContent2.replace("[zxsize]", zxsize + "");
                        jo.put("content", noticeContent2);
                        jo.put("level", doctor.getLevel());
                        maps.put(doctor.getCode(), jo);
                    }
                    //只有咨询
                    if (zxsize == 0 && qysize > 0) {
                        JSONObject jo = new JSONObject();
                        noticeContent3 = noticeContent3.replace("[qysize]", qysize + "");
                        jo.put("content", noticeContent3);
                        jo.put("level", doctor.getLevel());
                        maps.put(doctor.getCode(), jo);
                    }
                }
            }
            JSONArray jsonArray = new JSONArray();
            //发送通知
            for (Map.Entry<String, JSONObject> entry : maps.entrySet()) {
                // 异常通知
                JSONObject json = new JSONObject();
                json.put("receiver", entry.getKey());
                json.put("type", getType(entry.getValue().getInt("level")));
                json.put("title", noticeTitle);
                json.put("msg", entry.getValue().getString("content"));
                json.put("data", "");
                jsonArray.add(json);
            }
            // 推送消息给医生
            NoticeJobPushMsgTask.url = url;
            // 推送消息给医生
            NoticeJobPushMsgTask.getInstance().put(jsonArray);
            //保存日志
            quartzJobLog.setJobEndTime(new Date());
            quartzJobLog.setJobContent("通知成功");
            quartzJobLog.setJobType("1");
            dbStorage.save(quartzJobLog);
        } catch (Exception e) {
            //保存日志
            quartzJobLog.setJobEndTime(new Date());
            quartzJobLog.setJobContent("通知失败");
            quartzJobLog.setJobType("0");
            dbStorage.save(quartzJobLog);
            e.printStackTrace();
        }
    }
    private String getType(Integer level) {
        switch (level) {
            case 1: {
                //专科
                return noticeKey1;
            }
            case 2: {
                //全科
                return noticeKey2;
            }
            case 3: {
                //健康管理师
                return noticeKey3;
            }
        }
        return "";
    }
    /**
     * 得到医生的未读数目
     *
     * @param doctorCode 医生code
     * @param type       1是咨询 2个签约 3是体征
     * @return
     */
    private Integer getDoctorMesssageCount(String doctorCode, int type) throws Exception {
        switch (type) {
            case 1: {
                return getImMsgAmount(doctorCode);
            }
            case 2: {
                String sql = "select count(a.id) from wlyy_message a where a.type =1 and a.has_read=1 and a.receiver=?";
                return jdbcTemplate.queryForObject(sql, Integer.class, doctorCode);
            }
        }
        return 0;
    }
    private int findDoctorAllMessage(String doctor) {
        // 签约未读消息总数
        int sign = messageDao.amountUnreadByReceiver(doctor);
        // 体征指标未读消息总数
        int healthIndex = messageDao.amountUnreadHealthByReceiver(doctor);
        //系统消息
        int systemMessage = messageDao.amountUnreadSystemByReceiver(doctor);
        Integer doctorCount = 0;
        Integer patientCount = 0;
        JSONObject json = new JSONObject();
        getImMsgAmount(json, doctor);
        if (json.containsKey("imMsgCount")) {
            JSONObject jsonC = json.getJSONObject("imMsgCount");
            if (jsonC.containsKey("doctor")) {
                doctorCount = jsonC.getInt("doctor");
            }
            if (jsonC.containsKey("patient")) {
                patientCount = jsonC.getInt("patient");
            }
        }
        return sign + healthIndex + systemMessage + doctorCount + patientCount;
    }
    private void getImMsgAmount(JSONObject obj, String doctor) {
        String urlall = url + "/api/v1/chats/msg/amount?user_id=" + doctor;
        String response = httpClientUtil.get(urlall, "UTF-8");
        obj.put("imMsgCount", response);
    }
    private Integer getImMsgAmount(String doctor) throws Exception {
        /**
         * {"msg":"获取消息总数成功!","data":{"imMsgCount":"{\"doctor\":0,\"patient\":0}","healthIndex":{"amount":0},"sign":{"amount":0}},"status":200}
         */
        return findDoctorAllMessage(doctor);
    }
}

+ 4 - 0
patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/repository/message/MessageDao.java

@ -89,4 +89,8 @@ public interface MessageDao extends PagingAndSortingRepository<Message, Long>, J
    //根据续方关联code查询团队长分配健管师消息
    @Query("from Message a where a.type = 8 and a.state=0 and a.del='1' and a.over='0' and relationCode = ?1  ")
    Message findByRelationCode(String relationCode);
    @Query("select count(a) from Message a where a.read = 1  and a.receiver=?1 and a.type=3 ")
    int amountUnreadSystemByReceiver(String doctor);
}

+ 112 - 0
patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/service/app/scheduling/DoctorWorkTimeService.java

@ -266,6 +266,118 @@ public class DoctorWorkTimeService extends BaseService {
        }
    }
    /**
     * 医生是否在工作
     *
     * @param doctor 医生
     * @return
     */
    public JSONObject isDoctorWorking(String doctor, Integer week) throws Exception {
        JSONObject json = new JSONObject();
        Calendar calendar = Calendar.getInstance();
        if (week < 0) {
            week = calendar.get(Calendar.DAY_OF_WEEK) - 1;
            if (week == 0) {
                week = 7;
            }
        }
        // 医生工作时间设置
        Map<String, Object> result = findDoctorWeekWork(doctor, String.valueOf(week));
        if (result.get("workTime") == null) {
            // 医生未设置时,默认7*24小时工作
            json.put("status", "1");
            json.put("msg", "医生当前接受咨询");
        } else {
            WlyyDoctorWorkTime doctorWorkTime = (WlyyDoctorWorkTime) result.get("workTime");
            if (doctorWorkTime.getReceiveConsult().equals("0")) {
                // 医生设置不接受咨询
                json.put("status", "0");
                json.put("msg", "医生不接受咨询");
            } else {
                if (StringUtils.isEmpty(doctorWorkTime.getMorningBegin()) && StringUtils.isEmpty(doctorWorkTime.getMorningEnd())
                        && StringUtils.isEmpty(doctorWorkTime.getAfternoonBegin()) && StringUtils.isEmpty(doctorWorkTime.getAfternoonEnd())
                        && StringUtils.isEmpty(doctorWorkTime.getNightBegin()) && StringUtils.isEmpty(doctorWorkTime.getNightEnd())) {
                    // 医生未设置工作时间,默认7*24小时工作
                    json.put("status", "1");
                    json.put("msg", "医生当前接受咨询");
                } else {
                    if (result.get("workWeek") != null) {
                        // 当前工作日已设置工作时间
                        int flag = 0;
                        WlyyDoctorWorkTime workTime = (WlyyDoctorWorkTime) result.get("workTime");
                        WlyyDoctorWorkWeek workWeek = (WlyyDoctorWorkWeek) result.get("workWeek");
                        int hour = calendar.get(Calendar.HOUR_OF_DAY);
                        int minute = calendar.get(Calendar.MINUTE);
                        String current = (hour < 10 ? ("0" + hour) : hour) + ":" + (hour < 10 ? ("0" + minute) : minute);
                        // 早上
                        if (workWeek.getMorning().equals("1")) {
                            String currentStart = workTime.getMorningBegin();
                            String currentEnd = workTime.getMorningEnd();
                            if (currentStart.length() == 4) {
                                currentStart = "0" + currentStart;
                            }
                            if (currentEnd.length() == 4) {
                                currentEnd = "0" + currentEnd;
                            }
                            if (current.compareTo(currentStart) >= 0 &&
                                    current.compareTo(currentEnd) < 0) {
                                flag = 1;
                            }
                        }
                        // 下午
                        if (workWeek.getAfternoon().equals("1")) {
                            String currentStart = workTime.getAfternoonBegin();
                            String currentEnd = workTime.getAfternoonEnd();
                            if (currentStart.length() == 4) {
                                currentStart = "0" + currentStart;
                            }
                            if (currentEnd.length() == 4) {
                                currentEnd = "0" + currentEnd;
                            }
                            if (current.compareTo(currentStart) >= 0 &&
                                    current.compareTo(currentEnd) < 0) {
                                flag = 1;
                            }
                        }
                        // 晚上
                        if (workWeek.getNight().equals("1")) {
                            String currentStart = workTime.getNightBegin();
                            String currentEnd = workTime.getNightEnd();
                            if (currentStart.length() == 4) {
                                currentStart = "0" + currentStart;
                            }
                            if (currentEnd.length() == 4) {
                                currentEnd = "0" + currentEnd;
                            }
                            if (current.compareTo(currentStart) >= 0 &&
                                    current.compareTo(currentEnd) < 0) {
                                flag = 1;
                            }
                        }
                        if (flag == 1) {
                            json.put("status", "1");
                            json.put("msg", "医生当前接受咨询");
                        } else {
                            json.put("status", "2");
                            json.put("msg", "医生当前不在工作时间");
                        }
                    } else {
                        json.put("status", "2");
                        json.put("msg", "医生当前不在工作时间");
                    }
                }
            }
        }
        return json;
    }
    /**
     * 医生是否在工作
     *

+ 139 - 0
patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/task/NoticeJobPushMsgTask.java

@ -0,0 +1,139 @@
package com.yihu.wlyy.task;
import com.yihu.wlyy.util.NoticeImUtill;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.LinkedBlockingQueue;
public class NoticeJobPushMsgTask {
	public static String url="";
	private static Logger logger = LoggerFactory.getLogger(PushMsgTask.class);
	// 最大容量为50的数组堵塞队列
	private static LinkedBlockingQueue<JSONObject> queue = new LinkedBlockingQueue<JSONObject>();
	private static NoticeJobPushMsgTask instance;
	private static Object lock = new Object();
	public static NoticeJobPushMsgTask getInstance() {
		synchronized (lock) {
			if (instance == null) {
				instance = new NoticeJobPushMsgTask();
				instance.run();
			}
		}
		return instance;
	}
	/**
	 * 添加一条推送消息
	 * @param receiver 接收人
	 * @param type 消息类型
	 * @param title 消息标题
	 * @param msg 消息内容
	 * @param data 消息数据
	 */
	public void put(String receiver, String type, String title, String msg, String data) {
		try {
			JSONObject json = new JSONObject();
			json.put("receiver", receiver);
			json.put("type", type);
			json.put("title", title);
			json.put("msg", msg);
			json.put("data", data);
			queue.put(json);
		} catch (Exception e) {
			logger.error("添加到消息队列失败!", e);
			e.printStackTrace();
		}
	}
	public void put(JSONArray array) {
		if (array == null || array.size() == 0) {
			return;
		}
		for (int i = 0; i < array.size(); i++) {
			JSONObject json = array.getJSONObject(i);
			if (json == null) {
				continue;
			}
			try {
				queue.put(json);
			} catch (Exception e) {
				logger.error("批量添加到消息队列失败!", e);
			}
		}
	}
	private void run() {
		new Thread(new ConsumerTask()).start();
	}
	// 消费者
	class ConsumerTask implements Runnable {
		@Override
		public void run() {
			try {
				while (true) {
					// 如果queue为空,则当前线程会堵塞,直到有新数据加入
					JSONObject json = queue.take();
					logger.info("发送前:"+json);
					// 推送平台消息
					String receiver = json.containsKey("receiver") ? json.getString("receiver") : "";
					String type = json.containsKey("type") ? json.getString("type") : "";
					String title = json.containsKey("title") ? json.getString("title") : "";
					String msg = json.containsKey("msg") ? json.getString("msg") : "";
					String data = json.containsKey("data") ? json.getString("data") : "";
					boolean res = pushMessage(receiver, type, title, msg, data);
					if (res) {
						logger.info("消息推送成功!");
					} else {
						logger.error("消息推送失败!");
					}
				}
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}
	}
	/**
	 * 消息推送
	 *
	 * @param receiver 消息接收人
	 * @param msgType 消息类型
	 * @param title 消息标题
	 * @param msg 消息内容
	 * @param data 消息数据
	 */
	public static boolean pushMessage(String receiver, String msgType, String title, String msg, String data) {
		try {
			//List<NameValuePair> params = new ArrayList<NameValuePair>();
			//params.add(new BasicNameValuePair("to", receiver));
			//params.add(new BasicNameValuePair("content", msg));
			//params.add(new BasicNameValuePair("contentType", msgType));
			//params.add(new BasicNameValuePair("title", title));
			//params.add(new BasicNameValuePair("summary", data));
			//String response = HttpClientUtil.post(url, params, "UTF-8");
			org.json.JSONObject participants = new org.json.JSONObject();
			participants.put("system",0);
			participants.put(receiver,0);
			org.json.JSONObject sessionObj  = NoticeImUtill.createSession(url,participants,"0","系统消息","");
			if(sessionObj.getInt("status")==-1){
				throw  new RuntimeException(sessionObj.getString("message"));
			}
			org.json.JSONObject session = sessionObj.getJSONObject("data");
			NoticeImUtill.sendImMsg(url,"system","系统",session.getString("id"),"1", msg,msgType);
			return true;
		} catch (Exception e) {
			logger.error("push message error:", e);
		}
		return false;
	}
}

+ 65 - 0
patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/util/DBExtract.java

@ -0,0 +1,65 @@
package com.yihu.wlyy.util;
import org.springframework.context.annotation.Scope;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.List;
/**
 * Created by Administrator on 2016.10.16.
 * 数据库抽取
 */
@Component
@Scope("prototype")
public class DBExtract<T> {
    Integer pageSize=100000;
    /**
     * 不分页抽取
     * @param clazz
     * @param sql
     * @return
     */
    public List<T> extract(Class<T> clazz,String sql,JdbcTemplate jdbcTemplate){
        List<T> returnList= jdbcTemplate.query(sql,new BeanPropertyRowMapper(clazz));
        return returnList;
    }
    /**
     * 分页抽取
     * @param clazz
     * @param sql
     * @param pageSize 每页显示多少 默认10000
     * @param isMultithreading 是否多线程抽取 默认否
     * @return
     */
    public List<T> extractByPage(Class<T> clazz,String sql,String countSql,int pageSize,Boolean isMultithreading,JdbcTemplate jdbcTemplate)throws  Exception{
        return SpringUtil.getBean(DBPageExtract.class).extractByPage(clazz,sql,countSql,pageSize,isMultithreading,jdbcTemplate);
    }
    /**
     * 分页抽取
     * @param clazz
     * @param sql
     * @param isMultithreading 是否多线程抽取 默认否
     * @return
     */
    public List<T> extractByPage(Class<T> clazz,String sql,String countSql,Boolean isMultithreading,JdbcTemplate jdbcTemplate)throws  Exception{
        if(StringUtils.isEmpty(countSql)){
            return extract(clazz,sql,jdbcTemplate);
        }
        return SpringUtil.getBean(DBPageExtract.class).extractByPage(clazz,sql,countSql,pageSize,isMultithreading,jdbcTemplate);
    }
    /**
     * 分页抽取
     * @param clazz
     * @param sql
     * @return
     */
    public List<Object> extractByPage(Class<T> clazz,String sql,JdbcTemplate jdbcTemplate)throws  Exception{
        Boolean isMultithreading=false;
        String countSql="";
        return SpringUtil.getBean(DBPageExtract.class).extractByPage(clazz,sql,countSql,pageSize,isMultithreading,jdbcTemplate);
    }
}

+ 156 - 0
patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/util/DBPageExtract.java

@ -0,0 +1,156 @@
package com.yihu.wlyy.util;
import org.springframework.context.annotation.Scope;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
 * Created by Administrator on 2016.10.16.
 * 分页抽取器
 */
@Component
@Scope("prototype")
public class DBPageExtract<T> {
    private  List<T> returnList=new ArrayList<T>();
    public synchronized void addData( List<T> dataList) {
         returnList.addAll(dataList);
    }
    public List<T> extractByPage(Class<T> clazz, String sql, String countSql, int pageSize, Boolean isMultithreading,JdbcTemplate jdbcTemplate) throws Exception{
        if(!StringUtils.isEmpty(countSql)){
            isMultithreading=true;
        }
        if(isMultithreading){
            if(StringUtils.isEmpty(countSql)){
                throw new Exception("countSql is null");
            }
            return MultiThreadExtract(clazz, sql,countSql, pageSize,jdbcTemplate);
        }else{
            return noMultiThreadExtract(clazz, sql, pageSize,jdbcTemplate);
        }
    }
    /**
     * 不用多线程抽取
     * @param clazz
     * @param sql
     * @param pageSize
     * @return
     */
    private List<T> noMultiThreadExtract(Class<T> clazz, String sql, int pageSize,JdbcTemplate jdbcTemplate) {
        List<T> returnList=new ArrayList<T>();
        int start=0;
        int page=1;
        while (true){
            String finalSql=sql+" limit "+start+","+pageSize; //拼凑分页的语句
            List<T> listTemp= jdbcTemplate.query(finalSql,new BeanPropertyRowMapper(clazz));
            returnList.addAll(listTemp);//添加到list里面
            //判断是都是最后页面
            if(listTemp.size()!=pageSize){
                listTemp.clear();
                break;
            }else{
                start =page*pageSize;
                page++;
                listTemp.clear();
            }
        }
        return returnList;
    }
    /**
     * 多线程抽取数据
     * @param clazz
     * @param sql
     * @param pageSize
     * @return
     */
    private   List<T> MultiThreadExtract(Class<T> clazz, String sql,String countSql, int pageSize,JdbcTemplate jdbcTemplate)  {
        try{
            //得到数据的总数
            Integer dataCount=getCount(countSql,jdbcTemplate);
            //根据count 计算出 总共要执行几次
            Integer forCount=getForCount(dataCount,pageSize);
            forCount++;
            //綫程返回值的值
            List<AsyncResult<Boolean>> asyncResultPool=new ArrayList<AsyncResult<Boolean>>();
            for(int page=0;page<forCount;page++){
                //启动多线程采集数据
                AsyncResult<Boolean> future= multiExtractData(sql,page*pageSize,pageSize,clazz,jdbcTemplate);
                asyncResultPool.add(future);
            }
            ///循环判断,等待获取结果信息
            while (true){
                //得到迭代器
                Iterator<AsyncResult<Boolean>> asyncResultIterator=asyncResultPool.iterator();
                //判断有没有下一个
                while (asyncResultIterator.hasNext()){
                    AsyncResult<Boolean> asyncResult= asyncResultIterator.next();
                    if(asyncResult.isDone()){
                        //如果做完了就移除迭代器
                        asyncResultIterator.remove();
                    }else{
                        Thread.sleep(500L);
                    }
                }
                //如果一直移除到没有下一个就跳出循环 说明数据已经采集完成
                if(!asyncResultIterator.hasNext()){
                    break;
                }
            }
            return returnList;
        }catch (Exception e){
            e.printStackTrace();
            //如果多线程错误 就改用单线程
            return noMultiThreadExtract(clazz,sql,pageSize,jdbcTemplate);
        }
    }
    private Integer getForCount(Integer dataCount, int pageSize) {
        //根据所有的数据取余数
        int yushu=dataCount%pageSize;
        int page=dataCount/pageSize;
        if(yushu==0){
            //如果没有余数 返回总的页数
            return page;
        }else{
            //如果有余数 页数多加1
            page++;
            return page;
        }
    }
    private Integer getCount(String countSql,JdbcTemplate jdbcTemplate) {
        Integer countMap= jdbcTemplate.queryForObject(countSql,Integer.class);
        return countMap;
    }
    /**
     * 多线程采集数据
     * @param sql
     * @param start
     * @param pageSize
     * @param clazz
     * @return
     */
    @Async("dbExtractExecutor")
    private AsyncResult<Boolean> multiExtractData(String sql, int start, int pageSize, Class<T> clazz, JdbcTemplate jdbcTemplate) {
        String finalSql=sql+" limit "+start+","+pageSize; //拼凑分页的语句
        List<T> listTemp= jdbcTemplate.query(finalSql,new BeanPropertyRowMapper(clazz));
        addData(listTemp);
        return new AsyncResult<>(true);
    }
}

+ 128 - 0
patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/util/NoticeHttpClientUtil.java

@ -0,0 +1,128 @@
package com.yihu.wlyy.util;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.web.client.RestTemplate;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;
public class NoticeHttpClientUtil {
	/**
	 * 发送post请求
	 * @param url 请求地址
	 * @param params 请求参数
	 * @param chatSet 编码格式
	 * @return
	 */
	public static String post(String url, List<NameValuePair> params, String chatSet) {
		// 创建默认的httpClient实例.
		CloseableHttpClient httpclient = HttpClients.createDefault();
		// 创建httppost
		HttpPost httppost = new HttpPost(url);
		UrlEncodedFormEntity uefEntity;
		try {
			uefEntity = new UrlEncodedFormEntity(params, chatSet);
			httppost.setEntity(uefEntity);
			CloseableHttpResponse response = httpclient.execute(httppost);
			try {
				HttpEntity entity = response.getEntity();
				if (entity != null) {
					return EntityUtils.toString(entity, chatSet);
				}
			} finally {
				response.close();
			}
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e1) {
			e1.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			// 关闭连接,释放资源
			try {
				httpclient.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return null;
	}
	/**
	 * 发送get请求
	 * @param url 请求地址
	 * @param chatSet 编码格式
	 * @return
	 */
	public static String get(String url, String chatSet) {
		CloseableHttpClient httpclient = HttpClients.createDefault();
		try {
			// 创建httpget.
			HttpGet httpget = new HttpGet(url);
			// 执行get请求.
			CloseableHttpResponse response = httpclient.execute(httpget);
			try {
				// 获取响应实体
				HttpEntity entity = response.getEntity();
				if (entity != null) {
					return EntityUtils.toString(entity, chatSet);
				}
			} finally {
				response.close();
			}
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (ParseException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			// 关闭连接,释放资源
			try {
				httpclient.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return null;
	}
	public static String postBody(String url,JSONObject params){
		RestTemplate restTemplate = new RestTemplate();
		HttpHeaders headers = new HttpHeaders();
		MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
		headers.setContentType(type);
		headers.add("Accept", MediaType.APPLICATION_JSON.toString());
		org.springframework.http.HttpEntity<String> formEntity = new org.springframework.http.HttpEntity<String>(params.toString(), headers);
		String ret = restTemplate.postForObject(url, formEntity, String.class);
		return ret;
	}
	public static void putBody(String url,JSONObject params){
		RestTemplate restTemplate = new RestTemplate();
		HttpHeaders headers = new HttpHeaders();
		MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
		headers.setContentType(type);
		headers.add("Accept", MediaType.APPLICATION_JSON.toString());
		org.springframework.http.HttpEntity<String> formEntity = new org.springframework.http.HttpEntity<String>(params.toString(), headers);
		restTemplate.put(url, formEntity, String.class);
	}
}

+ 221 - 0
patient-co/patient-co-wlyy-job/src/main/java/com/yihu/wlyy/util/NoticeImUtill.java

@ -0,0 +1,221 @@
package com.yihu.wlyy.util;
import org.json.JSONObject;
/**
 * Created by 卓 on 2017/1/13.
 */
public class NoticeImUtill {
    /**
     * 发送消息给IM
     *
     * @param from        来自
     * @param contentType 1文字 2图片消息
     * @param content     内容
     */
    public static String sendImMsg(String baseUrl,String from,String fromName, String sessionId, String contentType, String content,String businessType) {
        String imAddr = baseUrl + "/api/v2/sessions/"+sessionId+"/messages";
        JSONObject params = new JSONObject();
        params.put("sender_id", from);
        params.put("sender_name", fromName);
        params.put("content_type", contentType);
        params.put("content", content);
        params.put("session_id", sessionId);
        params.put("business_type", businessType);
        String response = NoticeHttpClientUtil.postBody(imAddr, params);
        return response;
    }
    /**
     * 发送消息给IM
     *
     * @param from        来自
     * @param contentType 1文字 2图片消息
     * @param content     内容
     */
    public static String sendTopicIM(String baseUrl,String from,String fromName, String topicId, String contentType, String content) {
        String url = baseUrl+ ("api/v2/sessions/topic/"+topicId+"/messages");
        JSONObject params = new JSONObject();
        params.put("sender_id", from);
        params.put("sender_name", fromName);
        params.put("content_type", contentType);
        params.put("content", content);
        params.put("topic_id", topicId);;
        String response = NoticeHttpClientUtil.postBody(url, params);
        return response;
    }
    /**
     * 结束议题
     *
     * @param topicId  议题ID
     * @param endUser  结束人
     * @param endUserName 结束人名字
     * @param sessionId 会话ID
     */
    public static JSONObject endTopics(String baseUrl,String sessionId,String endUser, String endUserName,String topicId) {
        String imAddr = baseUrl + "api/v2/sessions/"+sessionId+"/topics/"+topicId+"/ended";
        JSONObject params = new JSONObject();
        params.put("session_id", sessionId);
        params.put("end_user", endUser);
        params.put("end_user_name",endUserName);
        params.put("topic_id", topicId);
        String ret = NoticeHttpClientUtil.postBody(imAddr,params);
        JSONObject obj  = null;
        try{
            obj = new JSONObject(ret);
        }catch (Exception e){
            return null;
        }
        return obj;
    }
    /**
     * 议题邀请人员
     * @param user 结束人名字
     * @param sessionId 会话ID
     */
    public static void updateTopicUser(String baseUrl,String sessionId,String user) {
        String imAddr = baseUrl + "api/v2/sessions/"+sessionId+"/participants/"+user;
        JSONObject params = new JSONObject();
        params.put("user", user+":"+0);
        NoticeHttpClientUtil.putBody(imAddr,params);
    }
    /**
     * 创建议题
     *
     * @param topicId  议题ID
     * @param topicName  议题名称
     * @param participants 成员
     */
    public static JSONObject createTopics(String baseUrl,String sessionId, String topicId, String topicName, JSONObject participants, JSONObject messages, String sessionType) {
        String imAddr = baseUrl + "api/v2/sessions/"+topicId+"/topics";
        JSONObject params = new JSONObject();
        params.put("topic_id", topicId);
        params.put("topic_name", topicName);
        params.put("participants", participants.toString());
        params.put("messages", messages.toString());
        params.put("session_id", sessionId);
        params.put("session_type", sessionType);
        String ret = NoticeHttpClientUtil.postBody(imAddr,params);
        JSONObject obj  = null;
        try{
            obj = new JSONObject(ret);
        }catch (Exception e){
            return null;
        }
        return obj;
    }
    /**
     * 创建会话(system)
     *
     */
    public static JSONObject createSession(String baseUrl,JSONObject participants,String sessionType,String sessionName,String sessionId) {
        String imAddr = baseUrl + "api/v2/sessions";
        JSONObject params = new JSONObject();
        params.put("participants", participants.toString());
        params.put("session_name", sessionName);
        params.put("session_type", sessionType);
        params.put("session_id", sessionId);
        String ret = NoticeHttpClientUtil.postBody(imAddr,params);
        JSONObject obj  = null;
        try{
            obj = new JSONObject(ret);
        }catch (Exception e){
            return null;
        }
        return obj;
    }
    /**
     * 获取会话实例的消息对象
     * @param senderId
     * @param senderName
     * @param title
     * @param description
     * @param images
     * @return
     */
    public static JSONObject getCreateTopicMessage(String senderId,String senderName,String title,String description,String images){
        JSONObject messages = new JSONObject();
        messages.put("description",description);
        messages.put("title",title);
        messages.put("img",images);
        messages.put("sender_id",senderId);
        messages.put("sender_name",senderName);
        return messages;
    }
    public static JSONObject getTopicMessage(String baseUrl,String topicId,String startMsgId,String endMsgId,int page,int pagesize,String uid){
        String url = baseUrl
                + "api/v2/sessions/topic/"+topicId+"/messages?topic_id="+topicId+"&end="+startMsgId
                +"&start="+(endMsgId==null?"":endMsgId)+"&page="+page+"&pagesize="+pagesize+"&user="+uid;
        try{
            String ret = HttpClientUtil.get(url, "UTF-8");
            JSONObject obj = new JSONObject(ret);
            if(obj.getInt("status")==-1){
                throw new RuntimeException(obj.getString("message"));
            }else{
                return  obj.getJSONObject("data");
            }
        }catch (Exception e){
            return null;
        }
    }
    /**
     * 删除对应的成员信息在MUC模式中
     * @param userId
     * @param oldUserId
     * @param sessionId
     * @return
     */
    public static JSONObject deleteMucUser(String baseUrl,String userId,String oldUserId,String sessionId) throws  Exception{
        String url = baseUrl
                + "api/v2/sessions/"+sessionId+"/participant/update";
        try{
            JSONObject params = new JSONObject();
            params.put("user_id", userId);
            params.put("old_user_id", oldUserId);
            params.put("session_id", sessionId);
            String ret = NoticeHttpClientUtil.postBody(url,params);
            JSONObject obj = new JSONObject(ret);
            if(obj.getInt("status")==-1){
                throw new RuntimeException("人员更换失败!");
            }else{
                return obj;
            }
        }catch (Exception e){
           throw new RuntimeException("人员更换失败!");
        }
    }
    /**
     * 获取议题
     * @param topicId
     * @return
     */
    public static JSONObject getTopic(String baseUrl,String topicId) throws  Exception{
        String url =baseUrl
                + "api/v2/sessions/topics/"+topicId+"?topic_id="+topicId;
        try{
            String ret = HttpClientUtil.get(url,"utf-8");
            JSONObject obj = new JSONObject(ret);
            if(obj.getInt("status")==-1){
                throw new RuntimeException("获取议题失败!");
            }else{
                return obj;
            }
        }catch (Exception e){
            throw new RuntimeException("获取议题失败!");
        }
    }
}