123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330 |
- package com.yihu.wlyy.job;
- import com.yihu.wlyy.entity.SignFamily;
- import com.yihu.wlyy.entity.WlyyJobLog;
- import com.yihu.wlyy.entity.WlyyQuotaResult;
- import com.yihu.wlyy.entity.address.Hospital;
- import com.yihu.wlyy.entity.address.Town;
- import com.yihu.wlyy.repository.*;
- import com.yihu.wlyy.util.IdCardUtil;
- import com.yihu.wlyy.web.quota.WlyyJobConfigVO;
- import com.yihu.wlyy.web.quota.WlyyQuotaVO;
- import org.json.JSONArray;
- import org.json.JSONObject;
- import org.quartz.Job;
- import org.quartz.JobDataMap;
- import org.quartz.JobExecutionContext;
- import org.quartz.JobExecutionException;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.data.redis.core.StringRedisTemplate;
- 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.*;
- /**
- * 签约下按年龄分组后再按疾病统计
- */
- @Component
- public class SignAgeGroupDiseaseJob implements Job {
- private WlyyQuotaVO wlyyQuota;//指标对象
- private WlyyJobConfigVO wlyyJobConfig;//配置对象
- @Autowired
- private WlyyQuotaResultDao wlyyQuotaResultDao;//指标结果Dao
- @Autowired
- private WlyyJobLogDao wlyyJobLogDao;//执行日志Dao
- @Autowired
- private SignFamilyDao signFamilyDao;
- @Autowired
- private DoctorDao doctorDao;
- @Autowired
- private HospitalDao hospitalDao;
- @Autowired
- private TownDao townDao;
- @Autowired
- private DoctorPatientGroupInfoDao doctorPatientGroupInfoDao;
- @Autowired
- private PatientDao patientDao;
- @Autowired
- private JdbcTemplate jdbcTemplate;
- @Autowired
- private StringRedisTemplate redisTemplate;
- String yesterday;
- String now;
- @Override
- public void execute(JobExecutionContext context)
- throws JobExecutionException {
- SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
- //初始化参数
- JobDataMap map = context.getJobDetail().getJobDataMap();
- wlyyQuota = (WlyyQuotaVO) map.get("quota");
- wlyyJobConfig = (WlyyJobConfigVO) map.get("jobConfig");
- now = StringUtils.isEmpty(map.get("now")) ? SignAgeGroupDiseaseJob.getDayString(0) : map.get("now").toString();
- yesterday = StringUtils.isEmpty(map.get("yesterday")) ? SignAgeGroupDiseaseJob.getDayString(-1) : map.get("yesterday").toString();
- computequotaByPatientAge();
- }
- /**
- * 机构维度患者年龄维度计算指标
- */
- @Transactional
- private void computequotaByPatientAge() {
- try {
- jdbcTemplate.execute("delete from wlyy_quota_result where quota_date='"+yesterday+"' and quato_code='"+12+"'");
- //新建任务日志对象
- WlyyJobLog wlyyJobLog = new WlyyJobLog();
- wlyyJobLog.setJobStartTime(new Date());
- wlyyJobLog.setJobId(wlyyJobConfig.getId());
- wlyyJobLog.setJobName(wlyyJobConfig.getJobName());
- //查找出系统全部的机构
- List<Hospital> hospitals = hospitalDao.findHospital2();
- Map<String, Hospital> hospitalsMap = new HashMap<String, Hospital>();
- for (Hospital hospital : hospitals) {
- hospitalsMap.put(hospital.getCode(), hospital);
- }
- //查找出厦门市全部的区
- List<Town> towns = townDao.findByCityCode(Constant.city);
- Map<String, Town> townsMap = new HashMap<String, Town>();
- for (Town town : towns) {
- townsMap.put(town.getCode(), town);
- }
- //找出今天的签约信息
- List<SignFamily> signFamilys = signFamilyDao.findByJiatingSignYesterday(yesterday, now);
- //数组里面第一个是健康人群 第二个是慢病人群 第三个是65岁以上人群
- Map<String, Map<String, Map>> cityAgeMap = new HashMap<String, Map<String, Map>>();//key是市行政代码 目前只有厦门市
- Map<String,Map> temp =new HashMap<String,Map>();
- cityAgeMap.put(Constant.city, temp);
- Map<String, Map<String, Map>> townAgeMap = new HashMap<String, Map<String, Map>>();//key是区行政代码
- Map<String, Map<String, Map>> orgAgeMap = new HashMap<String, Map<String, Map>>();//key是机构代码
- //统计有签约的
- for (SignFamily signFamily : signFamilys) {
- Hospital hospital = hospitalsMap.get(signFamily.getHospital());//得到患者签约的机构
- String town = hospital.getTown();
- int age = IdCardUtil.getAgeForIdcard(signFamily.getIdcard());//根据card解析年龄
- String ageCode = getAgeCode(age);//得到年龄的code
- boolean hasGXY = false;//有高血压
- boolean hasTNB = false;//有糖尿病
- //如果是慢病的 统计高血压的 糖尿病 1高血压,2糖尿病 糖尿病和高血压是100
- String diseaseType="";
- String jsonString = redisTemplate.opsForValue().get("disease:" + signFamily.getPatient());
- if (StringUtils.isEmpty(jsonString)) {
- continue;
- }
- //排除数据 只留下高血压和糖尿病
- List<JSONObject> jsonObjects = new ArrayList<JSONObject>();
- JSONArray redisValues = new JSONArray(jsonString);
- for (Object obj : redisValues) {
- JSONObject redisValue = new JSONObject(obj);
- //排除掉三师签约
- if ("1".equals(redisValue.get("signType").toString())) {
- continue;
- }
- String disease = redisValue.get("disease").toString();
- if (Integer.valueOf(disease).equals("1")) {
- jsonObjects.add(redisValue);
- hasGXY = true;//设置有高血压
- diseaseType="1";
- }
- if (Integer.valueOf(disease).equals("2")) {
- jsonObjects.add(redisValue);
- hasTNB = true;//设置有糖尿病
- diseaseType="2";
- }
- }
- if(hasGXY&&hasTNB){
- diseaseType="100";
- }
- //统计市
- compute(cityAgeMap, Constant.city, ageCode, diseaseType);
- //统计区
- compute(townAgeMap, town, ageCode, diseaseType);
- //统计机构
- //统计站
- if (!"00".equals(hospital.getCode().substring(8))) {
- String orgCodeTemp = hospital.getCode().substring(0, 8) + "00";
- //统计机构
- compute(orgAgeMap, orgCodeTemp, ageCode, diseaseType);
- } else {
- compute(orgAgeMap, hospital.getCode(), ageCode, diseaseType);
- }
- }
- //保存统计数据
- // 保存市的统计数据
- for (Map.Entry<String, Map<String, Map>> entry : cityAgeMap.entrySet()) {
- Map<String, Map> oneAgeMap = entry.getValue();
- for(int i=1;i<7;i++){
- for(int j=1;j<4;j++){
- String key_2=i+"";
- String key_3=j+"";
- String city=Constant.city;
- String cityName=Constant.cityName;
- String town="";
- String townName="";
- String org="";
- String orgName="";
- save(oneAgeMap, key_2, key_3, city, cityName, town, townName, org, orgName,"4");
- }
- }
- }
- //保存区级
- for (Map.Entry<String, Town> entry : townsMap.entrySet()) {
- //判断该区是否有统计数据
- Map<String, Map> oneAgeMap = townAgeMap.get(entry.getKey());//得到当个区的统计数据
- Town townObj = entry.getValue();//得到区级信息
- for(int i=1;i<7;i++){
- for(int j=1;j<4;j++){
- String key_2=i+"";
- String key_3=j+"";
- String city=Constant.city;
- String cityName=Constant.cityName;
- String town=townObj.getCode();
- String townName=townObj.getName();
- String org="";
- String orgName="";
- save(oneAgeMap, key_2, key_3, city, cityName, town, townName, org, orgName,"3");
- }
- }
- }
- for (Map.Entry<String, Hospital> entry : hospitalsMap.entrySet()) {
- //判断该机构是否有统计数据
- Map<String, Map> oneAgeMap = orgAgeMap.get(entry.getKey());//得到当个机构的统计数据
- Hospital hospital = entry.getValue();//得到机构信息
- for(int i=1;i<7;i++){
- for(int j=1;j<4;j++){
- String key_2=i+"";
- String key_3=j+"";
- String city=Constant.city;
- String cityName=Constant.cityName;
- String town=hospital.getTown();
- String townName=hospital.getTownName();
- String org=hospital.getCode();
- String orgName=hospital.getName();
- save(oneAgeMap, key_2, key_3, city, cityName, town, townName, org, orgName,"2");
- }
- }
- }
- wlyyJobLog.setJobEndTime(new Date());
- wlyyJobLog.setJobContent("统计" + getYesterday() + " 的签约患者年龄数据完成 ");
- wlyyJobLog.setJobType("1");
- wlyyJobLogDao.save(wlyyJobLog);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- private void save(Map<String, Map> oneAgeMap, String key_2, String key_3, String city, String cityName, String town, String townName, String org, String orgName,String level) {
- WlyyQuotaResult wlyyQuotaResult = new WlyyQuotaResult();
- wlyyQuotaResult.setDel("1");
- wlyyQuotaResult.setCity(city);
- wlyyQuotaResult.setCityName(cityName);
- wlyyQuotaResult.setTown(town);
- wlyyQuotaResult.setTownName(townName);
- wlyyQuotaResult.setOrgCode(org);
- wlyyQuotaResult.setOrgName(orgName);
- wlyyQuotaResult.setQuatoCode(wlyyQuota.getId());
- wlyyQuotaResult.setQuatoName(wlyyQuota.getName());
- wlyyQuotaResult.setQuotaDate(getYesterday());
- wlyyQuotaResult.setCreateTime(new Date());
- wlyyQuotaResult.setLevel1Type(level);//等级
- wlyyQuotaResult.setLevel2Type(key_2);
- wlyyQuotaResult.setLevel2TypeName(Constant.getLevelAgeName(key_2));
- wlyyQuotaResult.setLevel3Type(key_3);
- wlyyQuotaResult.setLevel3TypeName(Constant.getLevelDiseaseName(key_3));
- if (oneAgeMap != null && oneAgeMap.containsKey(key_2)) {
- Map<String,Long> key3Map=oneAgeMap.get(key_2);
- if(key3Map!=null&&key3Map.containsKey(key_3)){
- wlyyQuotaResult.setResult(key3Map.get(key_3) + "");
- }else{
- wlyyQuotaResult.setResult("0");
- }
- } else {
- wlyyQuotaResult.setResult("0");
- }
- wlyyQuotaResultDao.save(wlyyQuotaResult);
- }
- private void compute(Map<String, Map<String, Map>> rootMap, String rootKey, String ageCode, String diseaseType) {
- if (rootMap.containsKey(rootKey)) {
- //得到市下面的所有的年龄map
- Map<String, Map> groupMapTemp = rootMap.get(rootKey);
- if(groupMapTemp.containsKey(ageCode)){
- //得到这个年龄下的患者map
- Map<String,Long> mape= groupMapTemp.get(ageCode);
- if(mape.containsKey(diseaseType)){
- mape.put(diseaseType,mape.get(diseaseType)+1L);
- }else{
- mape.put(diseaseType,1L);
- }
- }else{
- //新增疾病的统计map
- Map<String, Long> groupMapTemp1 = new HashMap<String, Long>();
- groupMapTemp1.put(diseaseType, 1L);
- groupMapTemp.put(ageCode,groupMapTemp1);
- }
- } else {
- //没有就新建统计数据 新增疾病的统计map
- Map<String, Long> groupMapTemp = new HashMap<String, Long>();
- groupMapTemp.put(diseaseType, 1L);
- //把统计疾病的map放入对应的年龄组map中
- Map<String, Map> groupMapTemp2 = new HashMap<String, Map>();
- groupMapTemp2.put(ageCode,groupMapTemp);
- //把年龄组map放入市的map里面
- rootMap.put(rootKey, groupMapTemp2);
- }
- }
- /*
- 得到昨天的日期字符串 yyyy-MM-dd
- */
- public String getYesterday() {
- return yesterday;
- }
- /**
- * 根据年龄得到对应的code
- *
- * @param age
- * @return
- */
- public String getAgeCode(int age) {
- if (age < 7) {
- return Constant.level_age_1;
- } else if (age >= 7 && age < 18) {
- return Constant.level_age_2;
- } else if (age >= 18 && age < 30) {
- return Constant.level_age_3;
- } else if (age >= 30 && age < 50) {
- return Constant.level_age_4;
- } else if (age >= 50 && age < 65) {
- return Constant.level_age_5;
- } else {
- return Constant.level_age_6;
- }
- }
- public static String getDayString(Integer size) {
- Date date = new Date();//取时间
- Calendar calendar = new GregorianCalendar();
- calendar.setTime(date);
- calendar.add(calendar.DATE, size);//把日期往后增加一天.整数往后推,负数往前移动
- date = calendar.getTime(); //这个时间就是日期往后推一天的结果
- SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
- String dateString = formatter.format(date);
- return dateString;
- }
- public static void main(String[] args) {
- getDayString(0);
- }
- }
|