SignJob.java 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872
  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.doctor.profile.Doctor;
  6. import com.yihu.wlyy.entity.doctor.team.sign.DoctorPatientGroupInfo;
  7. import com.yihu.wlyy.entity.job.QuartzJobLog;
  8. import com.yihu.wlyy.entity.patient.SignFamily;
  9. import com.yihu.wlyy.entity.statistics.WlyyQuotaResult;
  10. import com.yihu.wlyy.job.elt.base.ETLModel;
  11. import com.yihu.wlyy.job.elt.role.LevelRole;
  12. import com.yihu.wlyy.job.elt.role.PatientAgeRole;
  13. import com.yihu.wlyy.job.elt.role.PatientGroupRole;
  14. import com.yihu.wlyy.job.elt.role.PatientSexRole;
  15. import com.yihu.wlyy.job.elt.storage.DBStorage;
  16. import com.yihu.wlyy.repository.address.TownDao;
  17. import com.yihu.wlyy.repository.doctor.DoctorAdminTeamDao;
  18. import com.yihu.wlyy.repository.doctor.DoctorDao;
  19. import com.yihu.wlyy.repository.doctor.DoctorPatientGroupInfoDao;
  20. import com.yihu.wlyy.repository.job.QuartzJobLogDao;
  21. import com.yihu.wlyy.repository.organization.HospitalDao;
  22. import com.yihu.wlyy.repository.patient.SignFamilyDao;
  23. import com.yihu.wlyy.repository.statistics.WlyyQuotaResultDao;
  24. import com.yihu.wlyy.util.IdCardUtil;
  25. import com.yihu.wlyy.web.quota.WlyyJobConfigVO;
  26. import com.yihu.wlyy.web.quota.WlyyQuotaVO;
  27. import org.json.JSONArray;
  28. import org.json.JSONObject;
  29. import org.quartz.Job;
  30. import org.quartz.JobDataMap;
  31. import org.quartz.JobExecutionContext;
  32. import org.quartz.JobExecutionException;
  33. import org.springframework.beans.factory.annotation.Autowired;
  34. import org.springframework.data.redis.core.StringRedisTemplate;
  35. import org.springframework.jdbc.core.JdbcTemplate;
  36. import org.springframework.stereotype.Component;
  37. import org.springframework.transaction.annotation.Transactional;
  38. import org.springframework.util.StringUtils;
  39. import org.springframework.web.context.support.SpringBeanAutowiringSupport;
  40. import java.text.SimpleDateFormat;
  41. import java.util.*;
  42. /**
  43. * 签约的指标执行类
  44. */
  45. @Component
  46. public class SignJob implements Job {
  47. private WlyyQuotaVO wlyyQuota;//指标对象
  48. private WlyyJobConfigVO wlyyJobConfig;//配置对象
  49. @Autowired
  50. private WlyyQuotaResultDao wlyyQuotaResultDao;//指标结果Dao
  51. @Autowired
  52. private QuartzJobLogDao quartzJobLogDao;//执行日志Dao
  53. @Autowired
  54. private SignFamilyDao signFamilyDao;
  55. @Autowired
  56. private HospitalDao hospitalDao;
  57. @Autowired
  58. private TownDao townDao;
  59. @Autowired
  60. private DoctorPatientGroupInfoDao doctorPatientGroupInfoDao;
  61. @Autowired
  62. private JdbcTemplate jdbcTemplate;
  63. @Autowired
  64. private StringRedisTemplate redisTemplate;
  65. @Autowired
  66. private DoctorAdminTeamDao doctorAdminTeamDao;
  67. @Autowired
  68. private LevelRole levelRole;
  69. @Autowired
  70. private PatientAgeRole patientAgeRole;
  71. @Autowired
  72. private PatientGroupRole patientGroupRole;
  73. @Autowired
  74. private PatientSexRole patientSexRole;
  75. @Autowired
  76. private DBStorage dbStorage;
  77. String yesterday;
  78. String now;
  79. @Override
  80. public void execute(JobExecutionContext context)
  81. throws JobExecutionException {
  82. SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
  83. //初始化参数
  84. JobDataMap map = context.getJobDetail().getJobDataMap();
  85. wlyyQuota = (WlyyQuotaVO) map.get("quota");
  86. wlyyJobConfig = (WlyyJobConfigVO) map.get("jobConfig");
  87. now = StringUtils.isEmpty(map.get("now")) ? SignJob.getDayString(0) : map.get("now").toString();
  88. yesterday = StringUtils.isEmpty(map.get("yesterday")) ? SignJob.getDayString(-1) : map.get("yesterday").toString();
  89. String level1 = wlyyQuota.getLevel1();//得到一级维度
  90. String level2 = wlyyQuota.getLevel2();//得到二级维度
  91. //如果一级维度为空 不进行统计
  92. if (!StringUtils.isEmpty(level1)) {
  93. if (StringUtils.isEmpty(level2)) {
  94. //線刪除今天的数据
  95. //2级维度是空按照一级的机构唯独计算指标
  96. computequota();
  97. } else {
  98. switch (level2) {
  99. case "1": {
  100. //線刪除今天的数据
  101. //患者性别
  102. computequotaByPatientSex();
  103. break;
  104. }
  105. case "2": {
  106. //患者分组
  107. computequotaByPatientGroup();
  108. break;
  109. }
  110. case "3": {
  111. //患者年龄
  112. computequotaByPatientAge();
  113. break;
  114. }
  115. }
  116. }
  117. }
  118. }
  119. /**
  120. * 机构维度下患者性别维度计算指标
  121. */
  122. @Transactional
  123. private void computequotaByPatientSex() {
  124. jdbcTemplate.execute("delete from wlyy_quota_result where quota_date='" + yesterday + "' and quato_code='" + 6 + "'");
  125. try{
  126. //新建任务日志对象
  127. QuartzJobLog quartzJobLog = new QuartzJobLog();
  128. quartzJobLog.setJobStartTime(new Date());
  129. quartzJobLog.setJobId(wlyyJobConfig.getId());
  130. quartzJobLog.setJobName(wlyyJobConfig.getJobName());
  131. //查找出系统全部的团队
  132. List<AdminTeam> adminTeams=doctorAdminTeamDao.findAllTeam();
  133. Map<String, AdminTeam> adminTeamMap = new HashMap<String, AdminTeam>();
  134. for (AdminTeam adminTeam : adminTeams) {
  135. adminTeamMap.put(adminTeam.getId()+"", adminTeam);
  136. }
  137. //查找出系统全部的机构
  138. List<Hospital> hospitals = hospitalDao.findHospitalzxFWZ();
  139. Map<String, Hospital> hospitalsMap = new HashMap<String, Hospital>();
  140. for (Hospital hospital : hospitals) {
  141. hospitalsMap.put(hospital.getCode(), hospital);
  142. }
  143. //查找出厦门市全部的区
  144. List<Town> towns = townDao.findByCityCode(Constant.city);
  145. Map<String, Town> townsMap = new HashMap<String, Town>();
  146. for (Town town : towns) {
  147. townsMap.put(town.getCode(), town);
  148. }
  149. //找出今天的签约信息
  150. List<SignFamily> signFamilys = signFamilyDao.findByJiatingSignYesterday(yesterday, now);
  151. Long cityCount = new Long(0L); //统计到市的数目
  152. Long townCount = new Long(0L); //统计到所有区的数目
  153. Long orgCount =new Long(0L);//统计到所有机构的数目
  154. Long adminCount = new Long(0L);//统计到所有团队的数目
  155. Long errorCount=new Long(0L);//脏数据
  156. Boolean isAll=true;//是否统计失败
  157. StringBuffer errorContent=new StringBuffer();
  158. //统计有已改簽的
  159. List<ETLModel> etlModels=new ArrayList<ETLModel>();
  160. //数据过滤清洗出脏数据 -----------start
  161. for(SignFamily signFamily:signFamilys){
  162. ETLModel etlModel=new ETLModel();
  163. String orgCode = signFamily.getHospital();
  164. if(StringUtils.isEmpty(orgCode)) {
  165. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据为空");
  166. isAll=false;
  167. errorCount++;
  168. continue;
  169. }
  170. String orgCodeTemp="";
  171. if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
  172. //站
  173. orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
  174. }else{
  175. //社区
  176. orgCodeTemp=orgCode;
  177. }
  178. //判断社区有没有值
  179. Hospital hospital=hospitalsMap.get(orgCodeTemp);
  180. if(hospital == null) {
  181. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据不存在");
  182. isAll=false;
  183. errorCount++;
  184. continue;
  185. }
  186. Long adminId=signFamily.getAdminTeamId();
  187. if(adminId == null||adminId<=0) {
  188. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据为空");
  189. isAll=false;
  190. errorCount++;
  191. continue;
  192. }
  193. AdminTeam adminTeam=adminTeamMap.get(signFamily.getAdminTeamId()+"");
  194. if(adminTeam == null) {
  195. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据不存在");
  196. isAll=false;
  197. errorCount++;
  198. continue;
  199. }
  200. String idCard=signFamily.getIdcard();
  201. if(idCard == null||((idCard.length()!=18&&idCard.length()!=15))) {
  202. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的idCard数据异常");
  203. isAll=false;
  204. errorCount++;
  205. continue;
  206. }
  207. String town =hospital.getTown();
  208. if(StringUtils.isEmpty(town)) {
  209. errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town为空");
  210. isAll=false;
  211. errorCount++;
  212. continue;
  213. }
  214. Town townObj =townsMap.get(town);
  215. if(townObj==null) {
  216. errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town不存在");
  217. isAll=false;
  218. errorCount++;
  219. continue;
  220. }
  221. etlModel.setHospital(orgCodeTemp);
  222. etlModel.setTown(hospital.getTown());
  223. etlModel.setCity(Constant.city);
  224. etlModel.setIdcard(signFamily.getIdcard());
  225. etlModels.add(etlModel);
  226. //统计数目+1
  227. cityCount++;
  228. townCount++;
  229. orgCount++;
  230. adminCount++;
  231. }
  232. //数据过滤清洗出脏数据 -----------end
  233. try{
  234. //统计数据
  235. List<Map<String, List<ETLModel>>> returnData1s= levelRole.elt(etlModels);
  236. List<Map<String, Map<String, List<ETLModel>>>> patientSexRoleData= patientSexRole.elt(returnData1s);
  237. //保存数据
  238. dbStorage.saveByLevel2(patientSexRoleData,yesterday,wlyyQuota,3,1);
  239. }catch (Exception e){
  240. errorContent.append("统计失败:"+e.getMessage());
  241. }
  242. //保存日志
  243. quartzJobLog.setJobEndTime(new Date());
  244. quartzJobLog.setJobContent(saveContent(signFamilys,adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount));
  245. quartzJobLog.setJobType(isAll?"1":"0");
  246. quartzJobLogDao.save(quartzJobLog);
  247. }catch (Exception e){
  248. e.printStackTrace();
  249. }
  250. }
  251. /**
  252. * 机构维度患者分组维度计算指标
  253. */
  254. @Transactional
  255. private void computequotaByPatientGroup() {
  256. jdbcTemplate.execute("delete from wlyy_quota_result where quota_date='" + yesterday + "' and quato_code='" + 7 + "'");
  257. try {
  258. //数组里面第一个是健康人群 第二个是慢病人群 第三个是65岁以上人群
  259. Map<String, Map<String, Long>> cityGroupMap = new HashMap<String, Map<String, Long>>();//key是市行政代码 目前只有厦门市
  260. cityGroupMap.put(Constant.city, new HashMap<String, Long>());
  261. Map<String, Map<String, Long>> townGroupMap = new HashMap<String, Map<String, Long>>();//key是区行政代码
  262. Map<String, Map<String, Long>> orgGroupMap = new HashMap<String, Map<String, Long>>();//key是机构代码
  263. //新建任务日志对象
  264. QuartzJobLog QuartzJobLog = new QuartzJobLog();
  265. QuartzJobLog.setJobStartTime(new Date());
  266. QuartzJobLog.setJobId(wlyyJobConfig.getId());
  267. QuartzJobLog.setJobName(wlyyJobConfig.getJobName());
  268. //查找出系统全部的团队
  269. List<AdminTeam> adminTeams=doctorAdminTeamDao.findAllTeam();
  270. Map<String, AdminTeam> adminTeamMap = new HashMap<String, AdminTeam>();
  271. for (AdminTeam adminTeam : adminTeams) {
  272. adminTeamMap.put(adminTeam.getId()+"", adminTeam);
  273. }
  274. //查找出系统全部的机构
  275. List<Hospital> hospitals = hospitalDao.findHospital2();
  276. Map<String, Hospital> hospitalsMap = new HashMap<String, Hospital>();
  277. for (Hospital hospital : hospitals) {
  278. hospitalsMap.put(hospital.getCode(), hospital);
  279. Map<String, Long> one = new HashMap<String, Long>();
  280. one.put("1", 0L);
  281. one.put("2", 0L);
  282. one.put("3", 0L);
  283. one.put("4", 0L);
  284. one.put("5", 0L);
  285. one.put("6", 0L);
  286. orgGroupMap.put(hospital.getCode(), one);
  287. }
  288. //查找出厦门市全部的区
  289. List<Town> towns = townDao.findByCityCode(Constant.city);
  290. Map<String, Town> townsMap = new HashMap<String, Town>();
  291. for (Town town : towns) {
  292. townsMap.put(town.getCode(), town);
  293. Map<String, Long> one = new HashMap<String, Long>();
  294. one.put("1", 0L);
  295. one.put("2", 0L);
  296. one.put("3", 0L);
  297. one.put("4", 0L);
  298. one.put("5", 0L);
  299. one.put("6", 0L);
  300. townGroupMap.put(town.getCode(), one);
  301. }
  302. //找出今天的签约信息
  303. List<SignFamily> signFamilys = signFamilyDao.findByJiatingSignYesterday(yesterday, now);
  304. Long cityCount = 0L; //统计到市的数目
  305. Long townCount = 0L; //统计到所有区的数目
  306. Long orgCount = 0L;//统计到所有机构的数目
  307. Long qkCount = 0L;//统计到所有全科医生的数目
  308. Long errorCount=0L;//错误数目
  309. boolean isAll=true;//是否统计失败
  310. StringBuffer errorContent=new StringBuffer();
  311. //统计有签约的
  312. for (SignFamily signFamily : signFamilys) {
  313. String patient = signFamily.getPatient();
  314. //设置查看病人所在分组
  315. List<DoctorPatientGroupInfo> dctorPatientGroupInfo = doctorPatientGroupInfoDao.findByMorenPatient(patient);
  316. String group ="";//得到该签约病人的所在分组 1 普通 2 慢病 3是 65岁以上人群 4是 高血压 5是糖尿病 100是高血压和糖尿病
  317. if (dctorPatientGroupInfo != null && dctorPatientGroupInfo.size() > 0) {
  318. group=dctorPatientGroupInfo.get(0).getGroup();
  319. } else {
  320. errorContent.append("签约code:"+signFamily.getCode()+",患者未分组");
  321. group="1";
  322. }
  323. String orgCode = signFamily.getHospital();
  324. if(StringUtils.isEmpty(orgCode)) {
  325. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据为空");
  326. isAll=false;
  327. errorCount++;
  328. continue;
  329. }
  330. String orgCodeTemp="";
  331. if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
  332. //站
  333. orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
  334. }else{
  335. //社区
  336. orgCodeTemp=orgCode;
  337. }
  338. //判断社区有没有值
  339. Hospital hospital=hospitalsMap.get(orgCodeTemp);
  340. if(hospital == null) {
  341. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据不存在");
  342. isAll=false;
  343. errorCount++;
  344. continue;
  345. }
  346. Long adminId=signFamily.getAdminTeamId();
  347. if(adminId == null||adminId<=0) {
  348. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据为空");
  349. isAll=false;
  350. errorCount++;
  351. continue;
  352. }
  353. AdminTeam adminTeam=adminTeamMap.get(signFamily.getAdminTeamId()+"");
  354. if(adminTeam == null) {
  355. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据不存在");
  356. isAll=false;
  357. errorCount++;
  358. continue;
  359. }
  360. String idCard=signFamily.getIdcard();
  361. if(idCard == null||((idCard.length()!=18&&idCard.length()!=15))) {
  362. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的idCard数据异常");
  363. isAll=false;
  364. errorCount++;
  365. continue;
  366. }
  367. String town =hospital.getTown();
  368. if(StringUtils.isEmpty(town)) {
  369. errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town为空");
  370. isAll=false;
  371. errorCount++;
  372. continue;
  373. }
  374. Town townObj =townsMap.get(town);
  375. if(townObj==null) {
  376. errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town不存在");
  377. isAll=false;
  378. errorCount++;
  379. continue;
  380. }
  381. //统计市 现在只有厦门市 默认先写死 后面再改
  382. compute_level2_2(cityGroupMap, group,Constant.city);
  383. cityCount++;
  384. //统计区
  385. compute_level2_2(townGroupMap, group,town);
  386. townCount++;
  387. //统计站
  388. orgCode=hospital.getCode();
  389. if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
  390. //统计站
  391. orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
  392. //统计机构
  393. compute_level2_2(orgGroupMap, group,orgCodeTemp);
  394. } else {
  395. //统计机构
  396. compute_level2_2(orgGroupMap, group,hospital.getCode());
  397. }
  398. orgCount++;
  399. boolean hasGXY = false;//有高血压
  400. boolean hasTNB = false;//有糖尿病
  401. if ("2".equals(group)) {
  402. //如果是慢病的 统计高血压的 糖尿病 1高血压,2糖尿病
  403. String jsonString = redisTemplate.opsForValue().get("disease:" + patient);
  404. if (StringUtils.isEmpty(jsonString)) {
  405. continue;
  406. }
  407. //排除数据 只留下高血压和糖尿病
  408. List<JSONObject> jsonObjects = new ArrayList<JSONObject>();
  409. JSONArray redisValues = new JSONArray(jsonString);
  410. for (Object obj : redisValues) {
  411. JSONObject redisValue = (JSONObject)(obj);
  412. if(!redisValue.has("signType")){
  413. continue;
  414. }
  415. //排除掉三师签约
  416. if ("1".equals(redisValue.get("signType").toString())) {
  417. continue;
  418. }
  419. String disease = redisValue.getString("disease");
  420. if ("1".equals(disease)) {
  421. jsonObjects.add(redisValue);
  422. hasGXY = true;//设置有高血压
  423. }
  424. if ("2".equals(disease)) {
  425. jsonObjects.add(redisValue);
  426. hasTNB = true;//设置有糖尿病
  427. }
  428. }
  429. if(jsonObjects.size()==0){
  430. continue;//如果没有高血压和糖尿病 不统计
  431. }
  432. if (hasGXY && hasTNB) {
  433. group = "100";//有高血压又有糖尿病
  434. } else if(hasGXY){
  435. group = 4 + "";//4高血压,5糖尿病
  436. }else if(hasTNB){
  437. group = 5 + "";//4高血压,5糖尿病
  438. }
  439. //统计市 现在只有厦门市 默认先写死 后面再改
  440. compute_level2_2(cityGroupMap, group,Constant.city);
  441. //统计区
  442. compute_level2_2(townGroupMap, group,town);
  443. //统计站
  444. orgCode=hospital.getCode();
  445. if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
  446. //统计站
  447. orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
  448. //统计机构
  449. compute_level2_2(orgGroupMap, group,orgCodeTemp);
  450. } else {
  451. //统计机构
  452. compute_level2_2(orgGroupMap, group,hospital.getCode());
  453. }
  454. }
  455. }
  456. //保存统计数据
  457. //保存市的统计数据
  458. for (Map.Entry<String, Map<String, Long>> entry : cityGroupMap.entrySet()) {
  459. //保存健康人群
  460. Map<String, Long> oneMap=entry.getValue();
  461. for(Map.Entry<String, Long> entryCh: oneMap.entrySet()){
  462. String city=entry.getKey();
  463. String cityName=Constant.cityName;
  464. String town="";
  465. String townName="";
  466. String org="";
  467. String orgName="";
  468. String level="4";
  469. String key=entryCh.getKey();
  470. save_level2_2(oneMap, city, cityName, town, townName, org, orgName, level, key);
  471. }
  472. }
  473. //保存区级
  474. //保存区的统计数据
  475. for (Map.Entry<String, Town> townEntry : townsMap.entrySet()) {
  476. //判断该区是否有统计数据
  477. Map<String, Long> oneTownGroupMap = townGroupMap.get(townEntry.getKey());//得到当个区的统计数据
  478. Town townObj = townEntry.getValue();//得到区级信息
  479. for(Map.Entry<String, Long> entryCh: oneTownGroupMap.entrySet()){
  480. String city=entryCh.getKey();
  481. String cityName=Constant.cityName;
  482. String town=townObj.getCode();
  483. String townName=townObj.getName();
  484. String org="";
  485. String orgName="";
  486. String level="3";
  487. String key=entryCh.getKey();
  488. save_level2_2(oneTownGroupMap, city, cityName, town, townName, org, orgName, level, key);
  489. }
  490. }
  491. //保存机构
  492. for (Map.Entry<String, Hospital> hospitalEntry : hospitalsMap.entrySet()) {
  493. //判断该机构是否有统计数据
  494. Map<String, Long> oneOrgGroupMap = orgGroupMap.get(hospitalEntry.getKey());//得到当个机构的统计数据
  495. Hospital hospital = hospitalEntry.getValue();//得到区级信息
  496. for(Map.Entry<String, Long> entryCh: oneOrgGroupMap.entrySet()){
  497. Hospital hospital1=hospitalEntry.getValue();
  498. if(hospital1==null)continue;
  499. String city=entryCh.getKey();
  500. String cityName=Constant.cityName;
  501. String town=hospital.getTown();
  502. String townName=hospital.getTownName();
  503. String org=hospital.getCode();
  504. String orgName=hospital.getName();
  505. String level="2";
  506. String key=entryCh.getKey();
  507. save_level2_2(oneOrgGroupMap, city, cityName, town, townName, org, orgName, level, key);
  508. }
  509. }
  510. QuartzJobLog.setJobEndTime(new Date());
  511. QuartzJobLog.setJobContent(saveContent(signFamilys,qkCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount));
  512. QuartzJobLog.setJobType(isAll?"1":"0");
  513. quartzJobLogDao.save(QuartzJobLog);
  514. } catch (Exception e) {
  515. e.printStackTrace();
  516. }
  517. }
  518. private void save_level2_2(Map<String, Long> oneMap, String city, String cityName, String town, String townName, String org, String orgName, String level, String key) {
  519. WlyyQuotaResult wlyyQuotaResult = new WlyyQuotaResult();
  520. wlyyQuotaResult.setDel("1");
  521. wlyyQuotaResult.setCity(city);
  522. wlyyQuotaResult.setCityName(cityName);
  523. wlyyQuotaResult.setTown(town);
  524. wlyyQuotaResult.setTownName(townName);
  525. wlyyQuotaResult.setOrgCode(org);
  526. wlyyQuotaResult.setOrgName(orgName);
  527. wlyyQuotaResult.setQuatoCode(wlyyQuota.getId());
  528. wlyyQuotaResult.setQuatoName(wlyyQuota.getName());
  529. wlyyQuotaResult.setQuotaDate(getYesterday());
  530. wlyyQuotaResult.setCreateTime(new Date());
  531. wlyyQuotaResult.setLevel1Type(level);//市级
  532. wlyyQuotaResult.setLevel2Type(key);
  533. wlyyQuotaResult.setLevel2TypeName(Constant.getLevelGroupName(key));
  534. if (oneMap != null && oneMap.containsKey(key)) {
  535. wlyyQuotaResult.setResult(oneMap.get(key) + "");
  536. } else {
  537. wlyyQuotaResult.setResult("0");
  538. }
  539. wlyyQuotaResultDao.save(wlyyQuotaResult);
  540. }
  541. private void compute_level2_2(Map<String, Map<String, Long>> cityGroupMap, String group,String key) {
  542. if (cityGroupMap.containsKey(key)) {
  543. Map<String, Long> groupMapTemp = cityGroupMap.get(key);
  544. groupMapTemp.put(group, (groupMapTemp.get(group) == null ? 0l : groupMapTemp.get(group)) + 1);
  545. cityGroupMap.put(key, groupMapTemp);
  546. } else {
  547. Map<String, Long> groupMapTemp = new HashMap<String, Long>();
  548. groupMapTemp.put(group, 1L);
  549. cityGroupMap.put(key, groupMapTemp);
  550. }
  551. }
  552. /**
  553. * 机构维度患者年龄维度计算指标
  554. */
  555. @Transactional
  556. private void computequotaByPatientAge() {
  557. try {
  558. jdbcTemplate.execute("delete from wlyy_quota_result where quota_date='" + yesterday + "' and quato_code='" + 8 + "'");
  559. //新建任务日志对象
  560. QuartzJobLog quartzJobLog = new QuartzJobLog();
  561. quartzJobLog.setJobStartTime(new Date());
  562. quartzJobLog.setJobId(wlyyJobConfig.getId());
  563. quartzJobLog.setJobName(wlyyJobConfig.getJobName());
  564. //查找出系统全部的团队
  565. List<AdminTeam> adminTeams=doctorAdminTeamDao.findAllTeam();
  566. Map<String, AdminTeam> adminTeamMap = new HashMap<String, AdminTeam>();
  567. for (AdminTeam adminTeam : adminTeams) {
  568. adminTeamMap.put(adminTeam.getId()+"", adminTeam);
  569. }
  570. //查找出系统全部的机构
  571. List<Hospital> hospitals = hospitalDao.findHospital2();
  572. Map<String, Hospital> hospitalsMap = new HashMap<String, Hospital>();
  573. for (Hospital hospital : hospitals) {
  574. hospitalsMap.put(hospital.getCode(), hospital);
  575. }
  576. //查找出厦门市全部的区
  577. List<Town> towns = townDao.findByCityCode(Constant.city);
  578. Map<String, Town> townsMap = new HashMap<String, Town>();
  579. for (Town town : towns) {
  580. townsMap.put(town.getCode(), town);
  581. }
  582. //找出今天的签约信息
  583. List<SignFamily> signFamilys = signFamilyDao.findByJiatingSignYesterday(yesterday, now);
  584. Long cityCount = new Long(0L); //统计到市的数目
  585. Long townCount = new Long(0L); //统计到所有区的数目
  586. Long orgCount =new Long(0L);//统计到所有机构的数目
  587. Long adminCount = new Long(0L);//统计到所有团队的数目
  588. Long errorCount=new Long(0L);//脏数据
  589. Boolean isAll=true;//是否统计失败
  590. StringBuffer errorContent=new StringBuffer();
  591. //统计有已改簽的
  592. List<ETLModel> etlModels=new ArrayList<ETLModel>();
  593. //数据过滤清洗出脏数据 -----------start
  594. for(SignFamily signFamily:signFamilys){
  595. ETLModel etlModel=new ETLModel();
  596. String orgCode = signFamily.getHospital();
  597. if(StringUtils.isEmpty(orgCode)) {
  598. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据为空");
  599. isAll=false;
  600. errorCount++;
  601. continue;
  602. }
  603. String orgCodeTemp="";
  604. if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
  605. //站
  606. orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
  607. }else{
  608. //社区
  609. orgCodeTemp=orgCode;
  610. }
  611. //判断社区有没有值
  612. Hospital hospital=hospitalsMap.get(orgCodeTemp);
  613. if(hospital == null) {
  614. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据不存在");
  615. isAll=false;
  616. errorCount++;
  617. continue;
  618. }
  619. Long adminId=signFamily.getAdminTeamId();
  620. if(adminId == null||adminId<=0) {
  621. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据为空");
  622. isAll=false;
  623. errorCount++;
  624. continue;
  625. }
  626. AdminTeam adminTeam=adminTeamMap.get(signFamily.getAdminTeamId()+"");
  627. if(adminTeam == null) {
  628. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据不存在");
  629. isAll=false;
  630. errorCount++;
  631. continue;
  632. }
  633. String idCard=signFamily.getIdcard();
  634. if(idCard == null||((idCard.length()!=18&&idCard.length()!=15))) {
  635. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的idCard数据异常");
  636. isAll=false;
  637. errorCount++;
  638. continue;
  639. }
  640. String town =hospital.getTown();
  641. if(StringUtils.isEmpty(town)) {
  642. errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town为空");
  643. isAll=false;
  644. errorCount++;
  645. continue;
  646. }
  647. Town townObj =townsMap.get(town);
  648. if(townObj==null) {
  649. errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town不存在");
  650. isAll=false;
  651. errorCount++;
  652. continue;
  653. }
  654. etlModel.setHospital(orgCodeTemp);
  655. etlModel.setTown(hospital.getTown());
  656. etlModel.setCity(Constant.city);
  657. etlModel.setIdcard(signFamily.getIdcard());
  658. etlModels.add(etlModel);
  659. //统计数目+1
  660. cityCount++;
  661. townCount++;
  662. orgCount++;
  663. adminCount++;
  664. }
  665. //数据过滤清洗出脏数据 -----------end
  666. try{
  667. //统计数据
  668. List<Map<String, List<ETLModel>>> returnData1s= levelRole.elt(etlModels);
  669. List<Map<String, Map<String, List<ETLModel>>>> patientAgeRoleData= patientAgeRole.elt(returnData1s);
  670. //保存数据
  671. dbStorage.saveByLevel2(patientAgeRoleData,yesterday,wlyyQuota,6,2);
  672. }catch (Exception e){
  673. errorContent.append("统计失败:"+e.getMessage());
  674. }
  675. //保存日志
  676. quartzJobLog.setJobEndTime(new Date());
  677. quartzJobLog.setJobContent(saveContent(signFamilys,adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount));
  678. quartzJobLog.setJobType(isAll?"1":"0");
  679. quartzJobLogDao.save(quartzJobLog);
  680. } catch (Exception e) {
  681. e.printStackTrace();
  682. }
  683. }
  684. /**
  685. * 机构维度计算指标
  686. */
  687. @Transactional
  688. private void computequota() {
  689. jdbcTemplate.execute("delete from wlyy_quota_result where quota_date='" + yesterday + "' and quato_code='" + 1 + "'");
  690. //新建任务日志对象
  691. QuartzJobLog quartzJobLog = new QuartzJobLog();
  692. quartzJobLog.setJobStartTime(new Date());
  693. quartzJobLog.setJobId(wlyyJobConfig.getId());
  694. quartzJobLog.setJobName(wlyyJobConfig.getJobName());
  695. //查找出系统全部的团队
  696. List<AdminTeam> adminTeams=doctorAdminTeamDao.findAllTeam();
  697. Map<String, AdminTeam> adminTeamMap = new HashMap<String, AdminTeam>();
  698. for (AdminTeam adminTeam : adminTeams) {
  699. adminTeamMap.put(adminTeam.getId()+"", adminTeam);
  700. }
  701. //查找出系统全部的机构
  702. List<Hospital> hospitals = hospitalDao.findHospitalzxFWZ();
  703. Map<String, Hospital> hospitalsMap = new HashMap<String, Hospital>();
  704. for (Hospital hospital : hospitals) {
  705. hospitalsMap.put(hospital.getCode(), hospital);
  706. }
  707. //查找出厦门市全部的区
  708. List<Town> towns = townDao.findByCityCode(Constant.city);
  709. Map<String, Town> townsMap = new HashMap<String, Town>();
  710. for (Town town : towns) {
  711. townsMap.put(town.getCode(), town);
  712. }
  713. //找出今天的签约信息 yesterday,now
  714. List<SignFamily> signFamilys = signFamilyDao.findByJiatingSignYesterday(yesterday, now);
  715. Long cityCount = new Long(0L); //统计到市的数目
  716. Long townCount = new Long(0L); //统计到所有区的数目
  717. Long orgCount =new Long(0L);//统计到所有机构的数目
  718. Long adminCount = new Long(0L);//统计到所有团队的数目
  719. Long errorCount=new Long(0L);//脏数据
  720. Boolean isAll=true;//是否统计失败
  721. StringBuffer errorContent=new StringBuffer();
  722. //统计有已改簽的
  723. List<ETLModel> etlModels=new ArrayList<ETLModel>();
  724. //数据过滤清洗出脏数据 -----------start
  725. for(SignFamily signFamily:signFamilys){
  726. ETLModel etlModel=new ETLModel();
  727. String orgCode = signFamily.getHospital();
  728. if(StringUtils.isEmpty(orgCode)) {
  729. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据为空");
  730. isAll=false;
  731. errorCount++;
  732. continue;
  733. }
  734. String orgCodeTemp="";
  735. if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
  736. //站
  737. orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
  738. }else{
  739. //社区
  740. orgCodeTemp=orgCode;
  741. }
  742. //判断社区有没有值
  743. Hospital hospital=hospitalsMap.get(orgCodeTemp);
  744. if(hospital == null) {
  745. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据不存在");
  746. isAll=false;
  747. errorCount++;
  748. continue;
  749. }
  750. Long adminId=signFamily.getAdminTeamId();
  751. if(adminId == null||adminId<=0) {
  752. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据为空");
  753. isAll=false;
  754. errorCount++;
  755. continue;
  756. }
  757. AdminTeam adminTeam=adminTeamMap.get(signFamily.getAdminTeamId()+"");
  758. if(adminTeam == null) {
  759. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据不存在");
  760. isAll=false;
  761. errorCount++;
  762. continue;
  763. }
  764. String idCard=signFamily.getIdcard();
  765. if(idCard == null||((idCard.length()!=18&&idCard.length()!=15))) {
  766. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的idCard数据异常");
  767. isAll=false;
  768. errorCount++;
  769. continue;
  770. }
  771. String town =hospital.getTown();
  772. if(StringUtils.isEmpty(town)) {
  773. errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town为空");
  774. isAll=false;
  775. errorCount++;
  776. continue;
  777. }
  778. Town townObj =townsMap.get(town);
  779. if(townObj==null) {
  780. errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town不存在");
  781. isAll=false;
  782. errorCount++;
  783. continue;
  784. }
  785. etlModel.setAdminTeam(adminTeam.getId()+"");
  786. etlModel.setHospital(orgCodeTemp);
  787. etlModel.setTown(hospital.getTown());
  788. etlModel.setCity(Constant.city);
  789. etlModel.setIdcard(signFamily.getIdcard());
  790. etlModels.add(etlModel);
  791. //统计数目+1
  792. cityCount++;
  793. townCount++;
  794. orgCount++;
  795. adminCount++;
  796. }
  797. //数据过滤清洗出脏数据 -----------end
  798. try{
  799. //统计数据
  800. List<Map<String, List<ETLModel>>> returnDatas= levelRole.elt(etlModels);
  801. //保存数据
  802. dbStorage.saveByLevel1(returnDatas,yesterday,wlyyQuota);
  803. }catch (Exception e){
  804. errorContent.append("统计失败:"+e.getMessage());
  805. }
  806. //保存日志
  807. quartzJobLog.setJobEndTime(new Date());
  808. quartzJobLog.setJobContent(saveContent(signFamilys,adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount));
  809. quartzJobLog.setJobType(isAll?"1":"0");
  810. quartzJobLogDao.save(quartzJobLog);
  811. }
  812. /*
  813. 得到昨天的日期字符串 yyyy-MM-dd
  814. */
  815. public String getYesterday() {
  816. return yesterday;
  817. }
  818. public static String getDayString(Integer size) {
  819. Date date = new Date();//取时间
  820. Calendar calendar = new GregorianCalendar();
  821. calendar.setTime(date);
  822. calendar.add(calendar.DATE, size);//把日期往后增加一天.整数往后推,负数往前移动
  823. date = calendar.getTime(); //这个时间就是日期往后推一天的结果
  824. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
  825. String dateString = formatter.format(date);
  826. return dateString;
  827. }
  828. private String getOrg(String org){
  829. //if(!"00".equals(org.substring(org.length()-2,org.length()))){
  830. if(org.length() == 10 && !org.endsWith("00")){
  831. return org.substring(0,org.length()-2)+"00";
  832. }else{
  833. return org;
  834. }
  835. }
  836. private String saveContent(List<SignFamily> signFamilys, Long qkCount, Long orgCount, Long townCount, Long cityCount, boolean isAll, StringBuffer errorContent,Long errorCount) {
  837. StringBuffer string=new StringBuffer("统计"+getYesterday()+" 的签约数据完成 ,数据库查询到签约数目:"+signFamilys.size());
  838. string.append(",过滤的脏数据数目:"+errorCount);
  839. string.append(",统计到市的数据总数:"+cityCount);
  840. string.append(",统计到区的数据总数:"+townCount);
  841. string.append(",统计到机构的数据总数:"+orgCount);
  842. string.append(",统计到团队的数据总数:"+qkCount);
  843. string.append(",是否统计成功:"+isAll);
  844. if(!isAll){
  845. string.append(",失败原因:"+errorContent);
  846. }
  847. return string.toString();
  848. }
  849. }