HealthJob.java 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533
  1. package com.yihu.figure.job;
  2. import com.yihu.figure.dao.health.HealthIndexDao;
  3. import com.yihu.figure.dao.health.HealthIndexStatisticsDao;
  4. import com.yihu.figure.model.health.HealthIndex;
  5. import com.yihu.figure.model.health.HealthIndexStatistics;
  6. import com.yihu.figure.util.DateUtil;
  7. import com.yihu.figure.util.ETLConstantData;
  8. import com.yihu.figure.util.IdCardUtil;
  9. import org.quartz.Job;
  10. import org.quartz.JobExecutionContext;
  11. import org.quartz.JobExecutionException;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.context.annotation.Scope;
  14. import org.springframework.jdbc.core.JdbcTemplate;
  15. import org.springframework.stereotype.Component;
  16. import org.springframework.web.context.support.SpringBeanAutowiringSupport;
  17. import javax.transaction.Transactional;
  18. import java.text.DecimalFormat;
  19. import java.util.*;
  20. /**
  21. * Created by ysj
  22. */
  23. @Component
  24. @Scope("prototype")
  25. public class HealthJob implements Job {
  26. @Autowired
  27. JdbcTemplate jdbcTemplate;
  28. @Autowired
  29. private HealthIndexDao healthIndexDao;
  30. @Autowired
  31. private HealthIndexStatisticsDao healthIndexStatisticsDao;
  32. private DecimalFormat df = new DecimalFormat("#.0");
  33. @Override
  34. public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
  35. SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
  36. System.out.print("health static start...");
  37. //生成体征数据并统计(只生成test1 高血压示例和test2 糖尿病示例)
  38. staticsHealth();
  39. System.out.print("health static over.");
  40. }
  41. /**
  42. * 生成体征数据并统计(只生成test1 高血压示例和test2 糖尿病示例)
  43. */
  44. @Transactional
  45. public void staticsHealth()
  46. {
  47. try{
  48. String[] patient = {"test1","test2"};
  49. // String[] patient = {"915d1169-5b1d-11e6-8344-fa163e8aee56"};
  50. List<HealthIndex> healthIndexList = new ArrayList<>();
  51. for(int i=0;i<patient.length;i++){
  52. String user = patient[i];
  53. String sql = "select code,idcard,ssc from wlyy_patient_info where code = '"+user+"'";
  54. List<Map<String,Object>> list = jdbcTemplate.queryForList(sql);
  55. if(list!=null&&list.size()>0){
  56. Map<String,Object> map = list.get(0);
  57. String idcard = map.get("idcard").toString();
  58. int age = IdCardUtil.getAgeForIdcard(idcard);
  59. String sex = IdCardUtil.getSexForIdcard(idcard);//1女 2男 3未知
  60. xuetang(user,null,idcard,healthIndexList);
  61. xueya(user,null,idcard,age,sex,healthIndexList);
  62. healthIndexDao.save(healthIndexList);
  63. //统计
  64. statisticsXT(user);
  65. statisticsXY(user);
  66. }
  67. }
  68. }
  69. catch (Exception e)
  70. {
  71. e.printStackTrace();
  72. }
  73. }
  74. /**
  75. * 统计血压
  76. * @param patient
  77. * @param type 健康指标类型(1血糖,2血压)
  78. // * @param bloodType 测试类型(8舒张压,9收缩压,10心率)
  79. * @param timeType 时间类型(1近1个月,2近半年,3近1年)
  80. * @param list
  81. * @param statisticsList
  82. */
  83. private void statisticsXY(String patient,Integer type, Integer timeType,List<HealthIndex> list,List<HealthIndexStatistics> statisticsList){
  84. int high1=0,low1=0,normal1=0;//舒张压
  85. int high2=0,low2=0,normal2=0;//收缩压
  86. int high3=0,low3=0,normal3=0;//心率
  87. for (HealthIndex healthIndex:list){
  88. //统计数据
  89. Double value1 = Double.parseDouble(healthIndex.getValue1());
  90. Double value2 = Double.parseDouble(healthIndex.getValue2());
  91. Double value3 = Double.parseDouble(healthIndex.getValue3());
  92. int flag1 = ETLConstantData.ssy(value1);
  93. int flag2 = ETLConstantData.szy(value2);
  94. int flag3 = ETLConstantData.heartRate(value3);
  95. if(flag1>0){
  96. high1 ++;
  97. }else if(flag1<0){
  98. low1 ++;
  99. }else {
  100. //正常
  101. normal1 ++;
  102. }
  103. if(flag2>0){
  104. high2 ++;
  105. }else if(flag2<0){
  106. low2 ++;
  107. }else {
  108. //正常
  109. normal2 ++;
  110. }
  111. if(flag3>0){
  112. high3 ++;
  113. }else if(flag3<0){
  114. low3 ++;
  115. }else {
  116. //正常
  117. normal3 ++;
  118. }
  119. }
  120. HealthIndexStatistics healthIndexStatistics1 = new HealthIndexStatistics(patient,high1,normal1,low1,type,8,timeType,new Date());
  121. HealthIndexStatistics healthIndexStatistics2 = new HealthIndexStatistics(patient,high2,normal2,low2,type,9,timeType,new Date());
  122. HealthIndexStatistics healthIndexStatistics3 = new HealthIndexStatistics(patient,high3,normal3,low3,type,10,timeType,new Date());
  123. statisticsList.add(healthIndexStatistics1);
  124. statisticsList.add(healthIndexStatistics2);
  125. statisticsList.add(healthIndexStatistics3);
  126. }
  127. /**
  128. * 统计血压
  129. * @param patient
  130. * @param timeType 时间类型(1近1个月,2近半年,3近1年)
  131. * @param startTime
  132. * @param endTime
  133. * @param statisticsList
  134. */
  135. private void statisticsXY(String patient,Integer timeType,Date startTime,Date endTime,List<HealthIndexStatistics> statisticsList){
  136. List<HealthIndex> list = healthIndexDao.findByUserAndRecordDate(patient,2,startTime,endTime);
  137. statisticsXY(patient,2,timeType,list,statisticsList);
  138. }
  139. /**
  140. * 统计血压
  141. * @param patient
  142. */
  143. private void statisticsXY(String patient){
  144. Calendar cal = Calendar.getInstance();
  145. cal.add(Calendar.DAY_OF_YEAR,-29);
  146. String startMonth = DateUtil.dateToStrShort(cal.getTime())+" 00:00:00";
  147. cal.add(Calendar.DAY_OF_YEAR,-(182-30));
  148. String startHalfYear = DateUtil.dateToStrShort(cal.getTime())+" 00:00:00";
  149. cal.add(Calendar.DAY_OF_YEAR,-(365-182));
  150. String startYear = DateUtil.dateToStrShort(cal.getTime())+" 00:00:00";
  151. String endTime = DateUtil.getStringDateShort() + " 23:59:59";
  152. Date start1 = DateUtil.strToDate(startMonth);
  153. Date start2 = DateUtil.strToDate(startHalfYear);
  154. Date start3 = DateUtil.strToDate(startYear);
  155. Date end = DateUtil.strToDate(endTime);
  156. List<HealthIndexStatistics> statisticsList = new ArrayList<>();
  157. statisticsXY(patient,1,start1,end,statisticsList);
  158. statisticsXY(patient,2,start2,end,statisticsList);
  159. statisticsXY(patient,3,start3,end,statisticsList);
  160. healthIndexStatisticsDao.save(statisticsList);
  161. }
  162. /**
  163. * 统计血糖
  164. * @param patient
  165. * @param type 健康指标类型(1血糖,2血压)
  166. * @param bloodType 测试类型(1空腹血糖 2早餐后血糖 3午餐前血糖 4午餐后血糖 5晚餐前血糖 6晚餐后血糖 7睡前血糖)
  167. * @param timeType 时间类型(1近1个月,2近半年,3近1年)
  168. * @param list
  169. * @param statisticsList
  170. */
  171. private void statisticsXT(String patient,Integer type, Integer bloodType, Integer timeType,List<HealthIndex> list,List<HealthIndexStatistics> statisticsList){
  172. int high=0,low=0,normal=0;
  173. for (HealthIndex healthIndex:list){
  174. //统计数据
  175. Double value = Double.parseDouble(healthIndex.getValue1());
  176. int flag = 0;
  177. if(type%2==1){
  178. flag = ETLConstantData.xueTangBefore(value);
  179. }else{
  180. flag = ETLConstantData.xueTangAfter(value);
  181. }
  182. if(flag>0){
  183. high ++;
  184. }else if(flag<0){
  185. low ++;
  186. }else {
  187. //正常
  188. normal ++;
  189. }
  190. }
  191. HealthIndexStatistics healthIndexStatistics = new HealthIndexStatistics(patient,high,normal,low,type,bloodType,timeType,new Date());
  192. statisticsList.add(healthIndexStatistics);
  193. }
  194. /**
  195. * 统计血糖
  196. * @param patient
  197. * @param timeType 时间类型(1近1个月,2近半年,3近1年)
  198. * @param startTime
  199. * @param endTime
  200. * @param statisticsList
  201. */
  202. private void statisticsXT(String patient,Integer timeType,Date startTime,Date endTime,List<HealthIndexStatistics> statisticsList){
  203. List<HealthIndex> list = healthIndexDao.findByUserAndRecordDate(patient,1,startTime,endTime);
  204. List<HealthIndex> list1 = new ArrayList<>();
  205. List<HealthIndex> list2 = new ArrayList<>();
  206. List<HealthIndex> list3 = new ArrayList<>();
  207. List<HealthIndex> list4 = new ArrayList<>();
  208. List<HealthIndex> list5 = new ArrayList<>();
  209. List<HealthIndex> list6 = new ArrayList<>();
  210. List<HealthIndex> list7 = new ArrayList<>();
  211. for (HealthIndex healthIndex:list){
  212. String value2 = healthIndex.getValue2();
  213. if("1".equals(value2)){
  214. list1.add(healthIndex);
  215. }else if("2".equals(value2)){
  216. list2.add(healthIndex);
  217. }else if("3".equals(value2)){
  218. list3.add(healthIndex);
  219. }else if("4".equals(value2)){
  220. list4.add(healthIndex);
  221. }else if("5".equals(value2)){
  222. list5.add(healthIndex);
  223. }else if("6".equals(value2)){
  224. list6.add(healthIndex);
  225. }else if("7".equals(value2)){
  226. list7.add(healthIndex);
  227. }
  228. }
  229. statisticsXT(patient,1,1,timeType,list1,statisticsList);
  230. statisticsXT(patient,1,2,timeType,list2,statisticsList);
  231. statisticsXT(patient,1,3,timeType,list3,statisticsList);
  232. statisticsXT(patient,1,4,timeType,list4,statisticsList);
  233. statisticsXT(patient,1,5,timeType,list5,statisticsList);
  234. statisticsXT(patient,1,6,timeType,list6,statisticsList);
  235. statisticsXT(patient,1,7,timeType,list7,statisticsList);
  236. }
  237. /**
  238. * 统计血糖
  239. * @param patient
  240. */
  241. private void statisticsXT(String patient){
  242. Calendar cal = Calendar.getInstance();
  243. cal.add(Calendar.DAY_OF_YEAR,-29);
  244. String startMonth = DateUtil.dateToStrShort(cal.getTime())+" 00:00:00";
  245. cal.add(Calendar.DAY_OF_YEAR,-(182-30));
  246. String startHalfYear = DateUtil.dateToStrShort(cal.getTime())+" 00:00:00";
  247. cal.add(Calendar.DAY_OF_YEAR,-(365-182));
  248. String startYear = DateUtil.dateToStrShort(cal.getTime())+" 00:00:00";
  249. String endTime = DateUtil.getStringDateShort() + " 23:59:59";
  250. Date start1 = DateUtil.strToDate(startMonth);
  251. Date start2 = DateUtil.strToDate(startHalfYear);
  252. Date start3 = DateUtil.strToDate(startYear);
  253. Date end = DateUtil.strToDate(endTime);
  254. List<HealthIndexStatistics> statisticsList = new ArrayList<>();
  255. statisticsXT(patient,1,start1,end,statisticsList);
  256. statisticsXT(patient,2,start2,end,statisticsList);
  257. statisticsXT(patient,3,start3,end,statisticsList);
  258. healthIndexStatisticsDao.save(statisticsList);
  259. }
  260. private double random2ten(Random random){
  261. int i = random.nextInt(20);
  262. return i==0?0:i/10.0;
  263. }
  264. private double random3ten(Random random){
  265. int i = random.nextInt(30);
  266. return i==0?0:i/10.0;
  267. }
  268. /**
  269. * 血糖
  270. * @param patient
  271. * @param deviceSn
  272. * @param idcard
  273. */
  274. private List<HealthIndex> xuetang(String patient, String deviceSn, String idcard, List<HealthIndex> list){
  275. String startTime = DateUtil.getStringDateShort()+" 00:00:00";
  276. String endTime = DateUtil.getStringDateShort()+" 23:59:59";
  277. HealthIndex healthIndex = healthIndexDao.findByPatientAndType(patient,"1",startTime,endTime);
  278. if(healthIndex!=null){//判断是否已经生成过数据
  279. return list;
  280. }
  281. double value1,value2,value3,value4,value5,value6,value7;
  282. //value2 1空腹血糖 2早餐后血糖 3午餐前血糖 4午餐后血糖 5晚餐前血糖 6晚餐后血糖 7睡前血糖
  283. //≥7.0 mmol/l或餐后血糖≥11.1 mmol/l 属于糖尿病
  284. HealthIndex healthIndex1 = null;
  285. HealthIndex healthIndex2 = null;
  286. HealthIndex healthIndex3 = null;
  287. HealthIndex healthIndex4 = null;
  288. HealthIndex healthIndex5 = null;
  289. HealthIndex healthIndex6 = null;
  290. HealthIndex healthIndex7 = null;
  291. double high = 11.1,normal=7.0,low = 4.0;//(空腹4.0-7.0为正常,餐后7.0-11.0为正常)
  292. Random random = new Random();
  293. value1 = 6.0;
  294. value2 = 10.0;
  295. value3 = 6.0;
  296. value4 = 10.0;
  297. value5 = 6.0;
  298. value6 = 10.0;
  299. value7 = 6.0;
  300. healthIndex1 = new HealthIndex();
  301. healthIndex2 = new HealthIndex();
  302. healthIndex3 = new HealthIndex();
  303. healthIndex4 = new HealthIndex();
  304. healthIndex5 = new HealthIndex();
  305. healthIndex6 = new HealthIndex();
  306. healthIndex7 = new HealthIndex();
  307. Date recordDate = new Date();
  308. if(random.nextInt(2)==1){
  309. //加
  310. value1 += random3ten(random);
  311. }else{
  312. //减
  313. value1 -= random2ten(random);
  314. }
  315. healthIndex1.setCzrq(new Date());
  316. healthIndex1.setDel("1");
  317. healthIndex1.setDeviceSn(deviceSn);
  318. healthIndex1.setIdcard(idcard);
  319. healthIndex1.setRecordDate(recordDate);
  320. healthIndex1.setType(1);
  321. healthIndex1.setUser(patient);
  322. healthIndex1.setValue1(df.format(value1));
  323. healthIndex1.setValue2("1");
  324. if(random.nextInt(2)==1){
  325. //加
  326. value2 += random3ten(random);
  327. }else{
  328. //减
  329. value2 -= random2ten(random);
  330. }
  331. healthIndex2.setCzrq(new Date());
  332. healthIndex2.setDel("1");
  333. healthIndex2.setDeviceSn(deviceSn);
  334. healthIndex2.setIdcard(idcard);
  335. healthIndex2.setRecordDate(recordDate);
  336. healthIndex2.setType(1);
  337. healthIndex2.setUser(patient);
  338. healthIndex2.setValue1(df.format(value2));
  339. healthIndex2.setValue2("2");
  340. if(random.nextInt(2)==1){
  341. //加
  342. value3 += random3ten(random);
  343. }else{
  344. //减
  345. value3 -= random2ten(random);
  346. }
  347. healthIndex3.setCzrq(new Date());
  348. healthIndex3.setDel("1");
  349. healthIndex3.setDeviceSn(deviceSn);
  350. healthIndex3.setIdcard(idcard);
  351. healthIndex3.setRecordDate(recordDate);
  352. healthIndex3.setType(1);
  353. healthIndex3.setUser(patient);
  354. healthIndex3.setValue1(df.format(value3));
  355. healthIndex3.setValue2("3");
  356. if(random.nextInt(2)==1){
  357. //加
  358. value4 += random3ten(random);
  359. }else{
  360. //减
  361. value4 -= random2ten(random);
  362. }
  363. healthIndex4.setCzrq(new Date());
  364. healthIndex4.setDel("1");
  365. healthIndex4.setDeviceSn(deviceSn);
  366. healthIndex4.setIdcard(idcard);
  367. healthIndex4.setRecordDate(recordDate);
  368. healthIndex4.setType(1);
  369. healthIndex4.setUser(patient);
  370. healthIndex4.setValue1(df.format(value4));
  371. healthIndex4.setValue2("4");
  372. if(random.nextInt(2)==1){
  373. //加
  374. value5 += random3ten(random);
  375. }else{
  376. //减
  377. value5 -= random2ten(random);
  378. }
  379. healthIndex5.setCzrq(new Date());
  380. healthIndex5.setDel("1");
  381. healthIndex5.setDeviceSn(deviceSn);
  382. healthIndex5.setIdcard(idcard);
  383. healthIndex5.setRecordDate(recordDate);
  384. healthIndex5.setType(1);
  385. healthIndex5.setUser(patient);
  386. healthIndex5.setValue1(df.format(value5));
  387. healthIndex5.setValue2("5");
  388. if(random.nextInt(2)==1){
  389. //加
  390. value6 += random3ten(random);
  391. }else{
  392. //减
  393. value6 -= random2ten(random);
  394. }
  395. healthIndex6.setCzrq(new Date());
  396. healthIndex6.setDel("1");
  397. healthIndex6.setDeviceSn(deviceSn);
  398. healthIndex6.setIdcard(idcard);
  399. healthIndex6.setRecordDate(recordDate);
  400. healthIndex6.setType(1);
  401. healthIndex6.setUser(patient);
  402. healthIndex6.setValue1(df.format(value6));
  403. healthIndex6.setValue2("6");
  404. if(random.nextInt(2)==1){
  405. //加
  406. value7 += random3ten(random);
  407. }else{
  408. //减
  409. value7 -= random2ten(random);
  410. }
  411. healthIndex7.setCzrq(new Date());
  412. healthIndex7.setDel("1");
  413. healthIndex7.setDeviceSn(deviceSn);
  414. healthIndex7.setIdcard(idcard);
  415. healthIndex7.setRecordDate(recordDate);
  416. healthIndex7.setType(1);
  417. healthIndex7.setUser(patient);
  418. healthIndex7.setValue1(df.format(value7));
  419. healthIndex7.setValue2("7");
  420. list.add(healthIndex1);
  421. list.add(healthIndex2);
  422. list.add(healthIndex3);
  423. list.add(healthIndex4);
  424. list.add(healthIndex5);
  425. list.add(healthIndex6);
  426. list.add(healthIndex7);
  427. return list;
  428. }
  429. /**
  430. * 血压
  431. * @param patient
  432. * @param deviceSn
  433. * @param idcard
  434. */
  435. private List<HealthIndex> xueya(String patient, String deviceSn, String idcard, int age, String sex, List<HealthIndex> list){
  436. String startTime = DateUtil.getStringDateShort()+" 00:00:00";
  437. String endTime = DateUtil.getStringDateShort()+" 23:59:59";
  438. HealthIndex healthIndex = healthIndexDao.findByPatientAndType(patient,"2",startTime,endTime);
  439. if(healthIndex!=null){//判断是否已经生成过数据
  440. return list;
  441. }
  442. int value1,value2,value3,value4,intValue1,intValue2;
  443. //140/90mmHg至160/95mmHg之间,不能确定为高血压
  444. //成年人收缩压90-139.舒张压60-89为正常
  445. Random random = new Random();
  446. int month = 30;//一个月取30天
  447. int halfYear = 182;//半年取182天
  448. age = age>65?65:age;
  449. if("2".equals(sex)){
  450. intValue1 = 82+age;
  451. if(random.nextInt(2)==0){
  452. intValue2 = 84+random.nextInt(3);
  453. }else{
  454. intValue2 = 84-random.nextInt(3);
  455. }
  456. }else{
  457. intValue1 = 80+age;
  458. if(random.nextInt(2)==0){
  459. intValue2 = 81+random.nextInt(3);
  460. }else{
  461. intValue2 = 81-random.nextInt(3);
  462. }
  463. }
  464. value1 = intValue1;//收缩压
  465. value2 = intValue2;//舒张压
  466. healthIndex = new HealthIndex();
  467. Date recordDate = new Date();
  468. int temp = random.nextInt(10);
  469. if(temp<5){
  470. value1 += random.nextInt(21);
  471. value2 += random.nextInt(6);
  472. }else if(temp>7){
  473. value1 += 40+ random.nextInt(10);
  474. value2 += 15 + random.nextInt(5);
  475. }else{
  476. value1 += 20+ random.nextInt(21);
  477. value2 += 10 + random.nextInt(6);
  478. }
  479. value3 = random.nextInt(2)==1?(value2+random.nextInt(9)):(value2-random.nextInt(9));//心率
  480. value4 = random.nextInt(100)>96?1:0;//心率是否不齐
  481. healthIndex.setCzrq(new Date());
  482. healthIndex.setDel("1");
  483. healthIndex.setDeviceSn(deviceSn);
  484. healthIndex.setIdcard(idcard);
  485. healthIndex.setRecordDate(recordDate);
  486. healthIndex.setType(2);
  487. healthIndex.setUser(patient);
  488. healthIndex.setValue1(String.valueOf(value1));
  489. healthIndex.setValue2(String.valueOf(value2));
  490. healthIndex.setValue3(String.valueOf(value3));
  491. healthIndex.setValue4(String.valueOf(value4));
  492. list.add(healthIndex);
  493. return list;
  494. }
  495. }