SignAgeGroupDiseaseJob.java 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439
  1. package com.yihu.wlyy.job;
  2. import com.yihu.wlyy.entity.doctor.team.admin.AdminTeam;
  3. import com.yihu.wlyy.entity.organization.Hospital;
  4. import com.yihu.wlyy.entity.address.Town;
  5. import com.yihu.wlyy.entity.job.QuartzJobLog;
  6. import com.yihu.wlyy.entity.patient.SignFamily;
  7. import com.yihu.wlyy.entity.statistics.WlyyQuotaResult;
  8. import com.yihu.wlyy.repository.address.TownDao;
  9. import com.yihu.wlyy.repository.doctor.DoctorAdminTeamDao;
  10. import com.yihu.wlyy.repository.job.QuartzJobLogDao;
  11. import com.yihu.wlyy.repository.organization.HospitalDao;
  12. import com.yihu.wlyy.repository.patient.SignFamilyDao;
  13. import com.yihu.wlyy.repository.statistics.WlyyQuotaResultDao;
  14. import com.yihu.wlyy.util.IdCardUtil;
  15. import com.yihu.wlyy.web.quota.WlyyJobConfigVO;
  16. import com.yihu.wlyy.web.quota.WlyyQuotaVO;
  17. import org.json.JSONArray;
  18. import org.json.JSONObject;
  19. import org.quartz.Job;
  20. import org.quartz.JobDataMap;
  21. import org.quartz.JobExecutionContext;
  22. import org.quartz.JobExecutionException;
  23. import org.springframework.beans.factory.annotation.Autowired;
  24. import org.springframework.data.redis.core.StringRedisTemplate;
  25. import org.springframework.jdbc.core.JdbcTemplate;
  26. import org.springframework.stereotype.Component;
  27. import org.springframework.transaction.annotation.Transactional;
  28. import org.springframework.util.StringUtils;
  29. import org.springframework.web.context.support.SpringBeanAutowiringSupport;
  30. import java.text.SimpleDateFormat;
  31. import java.util.*;
  32. /**
  33. * 签约下按年龄分组后再按疾病统计
  34. */
  35. @Component
  36. public class SignAgeGroupDiseaseJob implements Job {
  37. private WlyyQuotaVO wlyyQuota;//指标对象
  38. private WlyyJobConfigVO wlyyJobConfig;//配置对象
  39. @Autowired
  40. private WlyyQuotaResultDao wlyyQuotaResultDao;//指标结果Dao
  41. @Autowired
  42. private QuartzJobLogDao quartzJobLogDao;//执行日志Dao
  43. @Autowired
  44. private SignFamilyDao signFamilyDao;
  45. @Autowired
  46. private DoctorAdminTeamDao doctorAdminTeamDao;
  47. @Autowired
  48. private HospitalDao hospitalDao;
  49. @Autowired
  50. private TownDao townDao;
  51. @Autowired
  52. private JdbcTemplate jdbcTemplate;
  53. @Autowired
  54. private StringRedisTemplate redisTemplate;
  55. String yesterday;
  56. String now;
  57. @Override
  58. public void execute(JobExecutionContext context)
  59. throws JobExecutionException {
  60. SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
  61. //初始化参数
  62. JobDataMap map = context.getJobDetail().getJobDataMap();
  63. wlyyQuota = (WlyyQuotaVO) map.get("quota");
  64. wlyyJobConfig = (WlyyJobConfigVO) map.get("jobConfig");
  65. now = StringUtils.isEmpty(map.get("now")) ? SignAgeGroupDiseaseJob.getDayString(0) : map.get("now").toString();
  66. yesterday = StringUtils.isEmpty(map.get("yesterday")) ? SignAgeGroupDiseaseJob.getDayString(-1) : map.get("yesterday").toString();
  67. computequotaByPatientAge();
  68. }
  69. /**
  70. * 机构维度患者年龄维度计算指标
  71. */
  72. @Transactional
  73. private void computequotaByPatientAge() {
  74. try {
  75. jdbcTemplate.execute("delete from wlyy_quota_result where quota_date='"+yesterday+"' and quato_code='"+12+"'");
  76. //新建任务日志对象
  77. QuartzJobLog wlyyJobLog = new QuartzJobLog();
  78. wlyyJobLog.setJobStartTime(new Date());
  79. wlyyJobLog.setJobId(wlyyJobConfig.getId());
  80. wlyyJobLog.setJobName(wlyyJobConfig.getJobName());
  81. List<AdminTeam> adminTeams=doctorAdminTeamDao.findAllTeam();
  82. Map<String, AdminTeam> adminTeamMap = new HashMap<String, AdminTeam>();
  83. for (AdminTeam adminTeam : adminTeams) {
  84. adminTeamMap.put(adminTeam.getId()+"", adminTeam);
  85. }
  86. //查找出系统全部的机构
  87. List<Hospital> hospitals = hospitalDao.findHospital2();
  88. Map<String, Hospital> hospitalsMap = new HashMap<String, Hospital>();
  89. for (Hospital hospital : hospitals) {
  90. hospitalsMap.put(hospital.getCode(), hospital);
  91. }
  92. //查找出厦门市全部的区
  93. List<Town> towns = townDao.findByCityCode(Constant.city);
  94. Map<String, Town> townsMap = new HashMap<String, Town>();
  95. for (Town town : towns) {
  96. townsMap.put(town.getCode(), town);
  97. }
  98. //找出今天的签约信息
  99. List<SignFamily> signFamilies = signFamilyDao.findByJiatingSignYesterday(yesterday, now);
  100. //数组里面第一个是健康人群 第二个是慢病人群 第三个是65岁以上人群
  101. Map<String, Map<String, Map>> cityAgeMap = new HashMap<String, Map<String, Map>>();//key是市行政代码 目前只有厦门市
  102. Map<String,Map> temp =new HashMap<String,Map>();
  103. cityAgeMap.put(Constant.city, temp);
  104. Map<String, Map<String, Map>> townAgeMap = new HashMap<String, Map<String, Map>>();//key是区行政代码
  105. Map<String, Map<String, Map>> orgAgeMap = new HashMap<String, Map<String, Map>>();//key是机构代码
  106. //统计有签约的
  107. Long cityCount = 0L; //统计到市的数目
  108. Long townCount = 0L; //统计到所有区的数目
  109. Long orgCount = 0L;//统计到所有机构的数目
  110. Long qkCount = 0L;//统计到所有全科医生的数目
  111. Long errorCount=0L;
  112. boolean isAll=true;//是否统计失败
  113. StringBuffer errorContent=new StringBuffer();
  114. for (SignFamily signFamily : signFamilies) {
  115. String orgCode = signFamily.getHospital();
  116. if(StringUtils.isEmpty(orgCode)) {
  117. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据为空");
  118. isAll=false;
  119. errorCount++;
  120. continue;
  121. }
  122. String orgCodeTemp="";
  123. if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
  124. //站
  125. orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
  126. }else{
  127. //社区
  128. orgCodeTemp=orgCode;
  129. }
  130. //判断社区有没有值
  131. Hospital hospital=hospitalsMap.get(orgCodeTemp);
  132. if(hospital == null) {
  133. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据不存在");
  134. isAll=false;
  135. errorCount++;
  136. continue;
  137. }
  138. Long adminId=signFamily.getAdminTeamId();
  139. if(adminId == null||adminId<=0) {
  140. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据为空");
  141. isAll=false;
  142. errorCount++;
  143. continue;
  144. }
  145. AdminTeam adminTeam=adminTeamMap.get(signFamily.getAdminTeamId()+"");
  146. if(adminTeam == null) {
  147. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据不存在");
  148. isAll=false;
  149. errorCount++;
  150. continue;
  151. }
  152. String idCard=signFamily.getIdcard();
  153. if(idCard == null||((idCard.length()!=18&&idCard.length()!=15))) {
  154. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的idCard数据异常");
  155. isAll=false;
  156. errorCount++;
  157. continue;
  158. }
  159. String town =hospital.getTown();
  160. if(StringUtils.isEmpty(town)) {
  161. errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town为空");
  162. isAll=false;
  163. errorCount++;
  164. continue;
  165. }
  166. Town townObj =townsMap.get(town);
  167. if(townObj==null) {
  168. errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town不存在");
  169. isAll=false;
  170. errorCount++;
  171. continue;
  172. }
  173. int age = IdCardUtil.getAgeForIdcard(idCard);//根据card解析年龄
  174. String ageCode = getAgeCode(age);//得到年龄的code
  175. boolean hasGXY = false;//有高血压
  176. boolean hasTNB = false;//有糖尿病
  177. //如果是慢病的 统计高血压的 糖尿病 1高血压,2糖尿病 3 糖尿病和高血压 4健康人群数
  178. String diseaseType="";
  179. String jsonString = redisTemplate.opsForValue().get("disease:" + signFamily.getPatient());
  180. if (StringUtils.isEmpty(jsonString)) {
  181. diseaseType="4";//健康人群
  182. }else{
  183. //排除数据 只留下高血压和糖尿病
  184. List<JSONObject> jsonObjects = new ArrayList<JSONObject>();
  185. JSONArray redisValues = new JSONArray(jsonString);
  186. if(redisValues.length()>0){
  187. for (Object obj : redisValues) {
  188. JSONObject redisValue = (JSONObject)(obj);
  189. if(!redisValue.has("signType")){
  190. continue;
  191. }
  192. //排除掉三师签约
  193. if ("1".equals(redisValue.get("signType").toString())) {
  194. continue;
  195. }
  196. String disease = redisValue.getString("disease");
  197. if ("1".equals(disease)) {
  198. jsonObjects.add(redisValue);
  199. hasGXY = true;//设置有高血压
  200. diseaseType="1";
  201. }
  202. if ("2".equals(disease)) {
  203. jsonObjects.add(redisValue);
  204. hasTNB = true;//设置有糖尿病
  205. diseaseType="2";
  206. }
  207. }
  208. if(hasGXY&&hasTNB){
  209. diseaseType="3";//高血压和糖尿病
  210. }
  211. }else{
  212. diseaseType="4";//健康人群
  213. }
  214. }
  215. //统计市
  216. compute(cityAgeMap, Constant.city, ageCode, diseaseType);
  217. cityCount++;
  218. //统计区
  219. compute(townAgeMap, town, ageCode, diseaseType);
  220. townCount++;
  221. //统计机构
  222. //统计站
  223. orgCode=hospital.getCode();
  224. if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
  225. //统计站
  226. orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
  227. //统计机构
  228. compute(orgAgeMap, orgCodeTemp, ageCode, diseaseType);
  229. } else {
  230. compute(orgAgeMap, hospital.getCode(), ageCode, diseaseType);
  231. }
  232. orgCount++;
  233. }
  234. //保存统计数据
  235. // 保存市的统计数据
  236. for (Map.Entry<String, Map<String, Map>> entry : cityAgeMap.entrySet()) {
  237. Map<String, Map> oneAgeMap = entry.getValue();
  238. for(int i=1;i<7;i++){
  239. for(int j=1;j<5;j++){
  240. String key_2=i+"";
  241. String key_3=j+"";
  242. String city=Constant.city;
  243. String cityName=Constant.cityName;
  244. String town="";
  245. String townName="";
  246. String org="";
  247. String orgName="";
  248. save(oneAgeMap, key_2, key_3, city, cityName, town, townName, org, orgName,"4");
  249. }
  250. }
  251. }
  252. //保存区级
  253. for (Map.Entry<String, Town> entry : townsMap.entrySet()) {
  254. //判断该区是否有统计数据
  255. Map<String, Map> oneAgeMap = townAgeMap.get(entry.getKey());//得到当个区的统计数据
  256. Town townObj = entry.getValue();//得到区级信息
  257. for(int i=1;i<7;i++){
  258. for(int j=1;j<5;j++){
  259. String key_2=i+"";
  260. String key_3=j+"";
  261. String city=Constant.city;
  262. String cityName=Constant.cityName;
  263. String town=townObj.getCode();
  264. String townName=townObj.getName();
  265. String org="";
  266. String orgName="";
  267. save(oneAgeMap, key_2, key_3, city, cityName, town, townName, org, orgName,"3");
  268. }
  269. }
  270. }
  271. for (Map.Entry<String, Hospital> entry : hospitalsMap.entrySet()) {
  272. //判断该机构是否有统计数据
  273. Map<String, Map> oneAgeMap = orgAgeMap.get(entry.getKey());//得到当个机构的统计数据
  274. Hospital hospital = entry.getValue();//得到机构信息
  275. for(int i=1;i<7;i++){
  276. for(int j=1;j<5;j++){
  277. Hospital hospital1=entry.getValue();
  278. if(hospital1==null)continue;
  279. String key_2=i+"";
  280. String key_3=j+"";
  281. String city=Constant.city;
  282. String cityName=Constant.cityName;
  283. String town=hospital.getTown();
  284. String townName=hospital.getTownName();
  285. String org=hospital.getCode();
  286. String orgName=hospital.getName();
  287. save(oneAgeMap, key_2, key_3, city, cityName, town, townName, org, orgName,"2");
  288. }
  289. }
  290. }
  291. wlyyJobLog.setJobEndTime(new Date());
  292. wlyyJobLog.setJobContent(saveContent(signFamilies,qkCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount));
  293. wlyyJobLog.setJobType(isAll?"1":"0");
  294. quartzJobLogDao.save(wlyyJobLog);
  295. } catch (Exception e) {
  296. e.printStackTrace();
  297. }
  298. }
  299. private String saveContent(List<SignFamily> signFamilys, Long qkCount, Long orgCount, Long townCount, Long cityCount, boolean isAll, StringBuffer errorContent,long errorCount) {
  300. StringBuffer string=new StringBuffer("统计"+yesterday+" 的签约数据完成 ,数据库查询到签约数目:"+signFamilys.size());
  301. string.append(",过滤的脏数据数目:"+errorCount);
  302. string.append(",统计到市的数据总数:"+cityCount);
  303. string.append(",统计到区的数据总数:"+townCount);
  304. string.append(",统计到机构的数据总数:"+orgCount);
  305. string.append(",统计到团队的数据总数:"+qkCount);
  306. string.append(",是否统计成功:"+isAll);
  307. if(!isAll){
  308. string.append(",失败原因:"+errorContent);
  309. }
  310. return string.toString();
  311. }
  312. 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) {
  313. WlyyQuotaResult wlyyQuotaResult = new WlyyQuotaResult();
  314. wlyyQuotaResult.setDel("1");
  315. wlyyQuotaResult.setCity(city);
  316. wlyyQuotaResult.setCityName(cityName);
  317. wlyyQuotaResult.setTown(town);
  318. wlyyQuotaResult.setTownName(townName);
  319. wlyyQuotaResult.setOrgCode(org);
  320. wlyyQuotaResult.setOrgName(orgName);
  321. wlyyQuotaResult.setQuatoCode(wlyyQuota.getId());
  322. wlyyQuotaResult.setQuatoName(wlyyQuota.getName());
  323. wlyyQuotaResult.setQuotaDate(getYesterday());
  324. wlyyQuotaResult.setCreateTime(new Date());
  325. wlyyQuotaResult.setLevel1Type(level);//等级
  326. wlyyQuotaResult.setLevel2Type(key_2);
  327. wlyyQuotaResult.setLevel2TypeName(Constant.getLevelAgeName(key_2));
  328. wlyyQuotaResult.setLevel3Type(key_3);
  329. wlyyQuotaResult.setLevel3TypeName(Constant.getLevelDiseaseName(key_3));
  330. if (oneAgeMap != null && oneAgeMap.containsKey(key_2)) {
  331. Map<String,Long> key3Map=oneAgeMap.get(key_2);
  332. if(key3Map!=null&&key3Map.containsKey(key_3)){
  333. wlyyQuotaResult.setResult(key3Map.get(key_3) + "");
  334. }else{
  335. wlyyQuotaResult.setResult("0");
  336. }
  337. } else {
  338. wlyyQuotaResult.setResult("0");
  339. }
  340. wlyyQuotaResultDao.save(wlyyQuotaResult);
  341. }
  342. /**
  343. * 统计方案
  344. * @param rootMap 数据存放的map
  345. * @param rootKey 数据的key 机构 区 市
  346. * @param ageCode 年龄的key
  347. * @param diseaseType 疾病类型 1是高血压 2是糖尿病 3是高血压和糖尿病 4是健康人群
  348. */
  349. private void compute(Map<String, Map<String, Map>> rootMap, String rootKey, String ageCode, String diseaseType) {
  350. if (rootMap.containsKey(rootKey)) {
  351. //得到市下面的所有的年龄map
  352. Map<String, Map> groupMapTemp = rootMap.get(rootKey);
  353. if(groupMapTemp.containsKey(ageCode)){
  354. //得到这个年龄下的患者map
  355. Map<String,Long> mape= groupMapTemp.get(ageCode);
  356. if(mape.containsKey(diseaseType)){
  357. mape.put(diseaseType,mape.get(diseaseType)+1L); //key是三级维度
  358. }else{
  359. mape.put(diseaseType,1L); //key是三级维度
  360. }
  361. }else{
  362. //新增疾病的统计map
  363. Map<String, Long> groupMapTemp1 = new HashMap<String, Long>();
  364. groupMapTemp1.put(diseaseType, 1L);//key是三级维度
  365. groupMapTemp.put(ageCode,groupMapTemp1);//key是二级维度
  366. }
  367. } else {
  368. //没有就新建统计数据 新增疾病的统计map
  369. Map<String, Long> groupMapTemp = new HashMap<String, Long>();
  370. groupMapTemp.put(diseaseType, 1L); //key是三级维度
  371. //把统计疾病的map放入对应的年龄组map中
  372. Map<String, Map> groupMapTemp2 = new HashMap<String, Map>();
  373. groupMapTemp2.put(ageCode,groupMapTemp); //key是二级维度
  374. //把年龄组map放入市的map里面
  375. rootMap.put(rootKey, groupMapTemp2); //key是一级维度
  376. }
  377. }
  378. /*
  379. 得到昨天的日期字符串 yyyy-MM-dd
  380. */
  381. public String getYesterday() {
  382. return yesterday;
  383. }
  384. /**
  385. * 根据年龄得到对应的code
  386. *
  387. * @param age
  388. * @return
  389. */
  390. public String getAgeCode(int age) {
  391. if (age < 7) {
  392. return Constant.level_age_1;
  393. } else if (age >= 7 && age < 18) {
  394. return Constant.level_age_2;
  395. } else if (age >= 18 && age < 30) {
  396. return Constant.level_age_3;
  397. } else if (age >= 30 && age < 50) {
  398. return Constant.level_age_4;
  399. } else if (age >= 50 && age < 65) {
  400. return Constant.level_age_5;
  401. } else {
  402. return Constant.level_age_6;
  403. }
  404. }
  405. public static String getDayString(Integer size) {
  406. Date date = new Date();//取时间
  407. Calendar calendar = new GregorianCalendar();
  408. calendar.setTime(date);
  409. calendar.add(calendar.DATE, size);//把日期往后增加一天.整数往后推,负数往前移动
  410. date = calendar.getTime(); //这个时间就是日期往后推一天的结果
  411. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
  412. String dateString = formatter.format(date);
  413. return dateString;
  414. }
  415. private String getOrg(String org){
  416. if(!"00".equals(org.substring(org.length()-2,org.length()))){
  417. return org.substring(0,org.length()-2)+"00";
  418. }else{
  419. return org;
  420. }
  421. }
  422. public static void main(String[] args) {
  423. getDayString(0);
  424. }
  425. }