SignJob.java 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875
  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. e.printStackTrace();
  241. errorContent.append("统计失败:"+e.getMessage());
  242. }
  243. //保存日志
  244. quartzJobLog.setJobEndTime(new Date());
  245. quartzJobLog.setJobContent(saveContent(signFamilys,adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount));
  246. quartzJobLog.setJobType(isAll?"1":"0");
  247. quartzJobLogDao.save(quartzJobLog);
  248. }catch (Exception e){
  249. e.printStackTrace();
  250. }
  251. }
  252. /**
  253. * 机构维度患者分组维度计算指标
  254. */
  255. @Transactional
  256. private void computequotaByPatientGroup() {
  257. jdbcTemplate.execute("delete from wlyy_quota_result where quota_date='" + yesterday + "' and quato_code='" + 7 + "'");
  258. try {
  259. //数组里面第一个是健康人群 第二个是慢病人群 第三个是65岁以上人群
  260. Map<String, Map<String, Long>> cityGroupMap = new HashMap<String, Map<String, Long>>();//key是市行政代码 目前只有厦门市
  261. cityGroupMap.put(Constant.city, new HashMap<String, Long>());
  262. Map<String, Map<String, Long>> townGroupMap = new HashMap<String, Map<String, Long>>();//key是区行政代码
  263. Map<String, Map<String, Long>> orgGroupMap = new HashMap<String, Map<String, Long>>();//key是机构代码
  264. //新建任务日志对象
  265. QuartzJobLog QuartzJobLog = new QuartzJobLog();
  266. QuartzJobLog.setJobStartTime(new Date());
  267. QuartzJobLog.setJobId(wlyyJobConfig.getId());
  268. QuartzJobLog.setJobName(wlyyJobConfig.getJobName());
  269. //查找出系统全部的团队
  270. List<AdminTeam> adminTeams=doctorAdminTeamDao.findAllTeam();
  271. Map<String, AdminTeam> adminTeamMap = new HashMap<String, AdminTeam>();
  272. for (AdminTeam adminTeam : adminTeams) {
  273. adminTeamMap.put(adminTeam.getId()+"", adminTeam);
  274. }
  275. //查找出系统全部的机构
  276. List<Hospital> hospitals = hospitalDao.findHospital2();
  277. Map<String, Hospital> hospitalsMap = new HashMap<String, Hospital>();
  278. for (Hospital hospital : hospitals) {
  279. hospitalsMap.put(hospital.getCode(), hospital);
  280. Map<String, Long> one = new HashMap<String, Long>();
  281. one.put("1", 0L);
  282. one.put("2", 0L);
  283. one.put("3", 0L);
  284. one.put("4", 0L);
  285. one.put("5", 0L);
  286. one.put("6", 0L);
  287. orgGroupMap.put(hospital.getCode(), one);
  288. }
  289. //查找出厦门市全部的区
  290. List<Town> towns = townDao.findByCityCode(Constant.city);
  291. Map<String, Town> townsMap = new HashMap<String, Town>();
  292. for (Town town : towns) {
  293. townsMap.put(town.getCode(), town);
  294. Map<String, Long> one = new HashMap<String, Long>();
  295. one.put("1", 0L);
  296. one.put("2", 0L);
  297. one.put("3", 0L);
  298. one.put("4", 0L);
  299. one.put("5", 0L);
  300. one.put("6", 0L);
  301. townGroupMap.put(town.getCode(), one);
  302. }
  303. //找出今天的签约信息
  304. List<SignFamily> signFamilys = signFamilyDao.findByJiatingSignYesterday(yesterday, now);
  305. Long cityCount = 0L; //统计到市的数目
  306. Long townCount = 0L; //统计到所有区的数目
  307. Long orgCount = 0L;//统计到所有机构的数目
  308. Long qkCount = 0L;//统计到所有全科医生的数目
  309. Long errorCount=0L;//错误数目
  310. boolean isAll=true;//是否统计失败
  311. StringBuffer errorContent=new StringBuffer();
  312. //统计有签约的
  313. for (SignFamily signFamily : signFamilys) {
  314. String patient = signFamily.getPatient();
  315. //设置查看病人所在分组
  316. List<DoctorPatientGroupInfo> dctorPatientGroupInfo = doctorPatientGroupInfoDao.findByMorenPatient(patient);
  317. String group ="";//得到该签约病人的所在分组 1 普通 2 慢病 3是 65岁以上人群 4是 高血压 5是糖尿病 100是高血压和糖尿病
  318. if (dctorPatientGroupInfo != null && dctorPatientGroupInfo.size() > 0) {
  319. group=dctorPatientGroupInfo.get(0).getGroup();
  320. } else {
  321. errorContent.append("签约code:"+signFamily.getCode()+",患者未分组");
  322. group="1";
  323. }
  324. String orgCode = signFamily.getHospital();
  325. if(StringUtils.isEmpty(orgCode)) {
  326. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据为空");
  327. isAll=false;
  328. errorCount++;
  329. continue;
  330. }
  331. String orgCodeTemp="";
  332. if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
  333. //站
  334. orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
  335. }else{
  336. //社区
  337. orgCodeTemp=orgCode;
  338. }
  339. //判断社区有没有值
  340. Hospital hospital=hospitalsMap.get(orgCodeTemp);
  341. if(hospital == null) {
  342. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据不存在");
  343. isAll=false;
  344. errorCount++;
  345. continue;
  346. }
  347. Long adminId=signFamily.getAdminTeamId();
  348. if(adminId == null||adminId<=0) {
  349. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据为空");
  350. isAll=false;
  351. errorCount++;
  352. continue;
  353. }
  354. AdminTeam adminTeam=adminTeamMap.get(signFamily.getAdminTeamId()+"");
  355. if(adminTeam == null) {
  356. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据不存在");
  357. isAll=false;
  358. errorCount++;
  359. continue;
  360. }
  361. String idCard=signFamily.getIdcard();
  362. if(idCard == null||((idCard.length()!=18&&idCard.length()!=15))) {
  363. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的idCard数据异常");
  364. isAll=false;
  365. errorCount++;
  366. continue;
  367. }
  368. String town =hospital.getTown();
  369. if(StringUtils.isEmpty(town)) {
  370. errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town为空");
  371. isAll=false;
  372. errorCount++;
  373. continue;
  374. }
  375. Town townObj =townsMap.get(town);
  376. if(townObj==null) {
  377. errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town不存在");
  378. isAll=false;
  379. errorCount++;
  380. continue;
  381. }
  382. //统计市 现在只有厦门市 默认先写死 后面再改
  383. compute_level2_2(cityGroupMap, group,Constant.city);
  384. cityCount++;
  385. //统计区
  386. compute_level2_2(townGroupMap, group,town);
  387. townCount++;
  388. //统计站
  389. orgCode=hospital.getCode();
  390. if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
  391. //统计站
  392. orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
  393. //统计机构
  394. compute_level2_2(orgGroupMap, group,orgCodeTemp);
  395. } else {
  396. //统计机构
  397. compute_level2_2(orgGroupMap, group,hospital.getCode());
  398. }
  399. orgCount++;
  400. boolean hasGXY = false;//有高血压
  401. boolean hasTNB = false;//有糖尿病
  402. if ("2".equals(group)) {
  403. //如果是慢病的 统计高血压的 糖尿病 1高血压,2糖尿病
  404. String jsonString = redisTemplate.opsForValue().get("disease:" + patient);
  405. if (StringUtils.isEmpty(jsonString)) {
  406. continue;
  407. }
  408. //排除数据 只留下高血压和糖尿病
  409. List<JSONObject> jsonObjects = new ArrayList<JSONObject>();
  410. JSONArray redisValues = new JSONArray(jsonString);
  411. for (Object obj : redisValues) {
  412. JSONObject redisValue = (JSONObject)(obj);
  413. if(!redisValue.has("signType")){
  414. continue;
  415. }
  416. //排除掉三师签约
  417. if ("1".equals(redisValue.get("signType").toString())) {
  418. continue;
  419. }
  420. String disease = redisValue.getString("disease");
  421. if ("1".equals(disease)) {
  422. jsonObjects.add(redisValue);
  423. hasGXY = true;//设置有高血压
  424. }
  425. if ("2".equals(disease)) {
  426. jsonObjects.add(redisValue);
  427. hasTNB = true;//设置有糖尿病
  428. }
  429. }
  430. if(jsonObjects.size()==0){
  431. continue;//如果没有高血压和糖尿病 不统计
  432. }
  433. if (hasGXY && hasTNB) {
  434. group = "100";//有高血压又有糖尿病
  435. } else if(hasGXY){
  436. group = 4 + "";//4高血压,5糖尿病
  437. }else if(hasTNB){
  438. group = 5 + "";//4高血压,5糖尿病
  439. }
  440. //统计市 现在只有厦门市 默认先写死 后面再改
  441. compute_level2_2(cityGroupMap, group,Constant.city);
  442. //统计区
  443. compute_level2_2(townGroupMap, group,town);
  444. //统计站
  445. orgCode=hospital.getCode();
  446. if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
  447. //统计站
  448. orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
  449. //统计机构
  450. compute_level2_2(orgGroupMap, group,orgCodeTemp);
  451. } else {
  452. //统计机构
  453. compute_level2_2(orgGroupMap, group,hospital.getCode());
  454. }
  455. }
  456. }
  457. //保存统计数据
  458. //保存市的统计数据
  459. for (Map.Entry<String, Map<String, Long>> entry : cityGroupMap.entrySet()) {
  460. //保存健康人群
  461. Map<String, Long> oneMap=entry.getValue();
  462. for(Map.Entry<String, Long> entryCh: oneMap.entrySet()){
  463. String city=entry.getKey();
  464. String cityName=Constant.cityName;
  465. String town="";
  466. String townName="";
  467. String org="";
  468. String orgName="";
  469. String level="4";
  470. String key=entryCh.getKey();
  471. save_level2_2(oneMap, city, cityName, town, townName, org, orgName, level, key);
  472. }
  473. }
  474. //保存区级
  475. //保存区的统计数据
  476. for (Map.Entry<String, Town> townEntry : townsMap.entrySet()) {
  477. //判断该区是否有统计数据
  478. Map<String, Long> oneTownGroupMap = townGroupMap.get(townEntry.getKey());//得到当个区的统计数据
  479. Town townObj = townEntry.getValue();//得到区级信息
  480. for(Map.Entry<String, Long> entryCh: oneTownGroupMap.entrySet()){
  481. String city=entryCh.getKey();
  482. String cityName=Constant.cityName;
  483. String town=townObj.getCode();
  484. String townName=townObj.getName();
  485. String org="";
  486. String orgName="";
  487. String level="3";
  488. String key=entryCh.getKey();
  489. save_level2_2(oneTownGroupMap, city, cityName, town, townName, org, orgName, level, key);
  490. }
  491. }
  492. //保存机构
  493. for (Map.Entry<String, Hospital> hospitalEntry : hospitalsMap.entrySet()) {
  494. //判断该机构是否有统计数据
  495. Map<String, Long> oneOrgGroupMap = orgGroupMap.get(hospitalEntry.getKey());//得到当个机构的统计数据
  496. Hospital hospital = hospitalEntry.getValue();//得到区级信息
  497. for(Map.Entry<String, Long> entryCh: oneOrgGroupMap.entrySet()){
  498. Hospital hospital1=hospitalEntry.getValue();
  499. if(hospital1==null)continue;
  500. String city=entryCh.getKey();
  501. String cityName=Constant.cityName;
  502. String town=hospital.getTown();
  503. String townName=hospital.getTownName();
  504. String org=hospital.getCode();
  505. String orgName=hospital.getName();
  506. String level="2";
  507. String key=entryCh.getKey();
  508. save_level2_2(oneOrgGroupMap, city, cityName, town, townName, org, orgName, level, key);
  509. }
  510. }
  511. QuartzJobLog.setJobEndTime(new Date());
  512. QuartzJobLog.setJobContent(saveContent(signFamilys,qkCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount));
  513. QuartzJobLog.setJobType(isAll?"1":"0");
  514. quartzJobLogDao.save(QuartzJobLog);
  515. } catch (Exception e) {
  516. e.printStackTrace();
  517. }
  518. }
  519. 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) {
  520. WlyyQuotaResult wlyyQuotaResult = new WlyyQuotaResult();
  521. wlyyQuotaResult.setDel("1");
  522. wlyyQuotaResult.setCity(city);
  523. wlyyQuotaResult.setCityName(cityName);
  524. wlyyQuotaResult.setTown(town);
  525. wlyyQuotaResult.setTownName(townName);
  526. wlyyQuotaResult.setOrgCode(org);
  527. wlyyQuotaResult.setOrgName(orgName);
  528. wlyyQuotaResult.setQuatoCode(wlyyQuota.getId());
  529. wlyyQuotaResult.setQuatoName(wlyyQuota.getName());
  530. wlyyQuotaResult.setQuotaDate(getYesterday());
  531. wlyyQuotaResult.setCreateTime(new Date());
  532. wlyyQuotaResult.setLevel1Type(level);//市级
  533. wlyyQuotaResult.setLevel2Type(key);
  534. wlyyQuotaResult.setLevel2TypeName(Constant.getLevelGroupName(key));
  535. if (oneMap != null && oneMap.containsKey(key)) {
  536. wlyyQuotaResult.setResult(oneMap.get(key) + "");
  537. } else {
  538. wlyyQuotaResult.setResult("0");
  539. }
  540. wlyyQuotaResultDao.save(wlyyQuotaResult);
  541. }
  542. private void compute_level2_2(Map<String, Map<String, Long>> cityGroupMap, String group,String key) {
  543. if (cityGroupMap.containsKey(key)) {
  544. Map<String, Long> groupMapTemp = cityGroupMap.get(key);
  545. groupMapTemp.put(group, (groupMapTemp.get(group) == null ? 0l : groupMapTemp.get(group)) + 1);
  546. cityGroupMap.put(key, groupMapTemp);
  547. } else {
  548. Map<String, Long> groupMapTemp = new HashMap<String, Long>();
  549. groupMapTemp.put(group, 1L);
  550. cityGroupMap.put(key, groupMapTemp);
  551. }
  552. }
  553. /**
  554. * 机构维度患者年龄维度计算指标
  555. */
  556. @Transactional
  557. private void computequotaByPatientAge() {
  558. try {
  559. jdbcTemplate.execute("delete from wlyy_quota_result where quota_date='" + yesterday + "' and quato_code='" + 8 + "'");
  560. //新建任务日志对象
  561. QuartzJobLog quartzJobLog = new QuartzJobLog();
  562. quartzJobLog.setJobStartTime(new Date());
  563. quartzJobLog.setJobId(wlyyJobConfig.getId());
  564. quartzJobLog.setJobName(wlyyJobConfig.getJobName());
  565. //查找出系统全部的团队
  566. List<AdminTeam> adminTeams=doctorAdminTeamDao.findAllTeam();
  567. Map<String, AdminTeam> adminTeamMap = new HashMap<String, AdminTeam>();
  568. for (AdminTeam adminTeam : adminTeams) {
  569. adminTeamMap.put(adminTeam.getId()+"", adminTeam);
  570. }
  571. //查找出系统全部的机构
  572. List<Hospital> hospitals = hospitalDao.findHospital2();
  573. Map<String, Hospital> hospitalsMap = new HashMap<String, Hospital>();
  574. for (Hospital hospital : hospitals) {
  575. hospitalsMap.put(hospital.getCode(), hospital);
  576. }
  577. //查找出厦门市全部的区
  578. List<Town> towns = townDao.findByCityCode(Constant.city);
  579. Map<String, Town> townsMap = new HashMap<String, Town>();
  580. for (Town town : towns) {
  581. townsMap.put(town.getCode(), town);
  582. }
  583. //找出今天的签约信息
  584. List<SignFamily> signFamilys = signFamilyDao.findByJiatingSignYesterday(yesterday, now);
  585. Long cityCount = new Long(0L); //统计到市的数目
  586. Long townCount = new Long(0L); //统计到所有区的数目
  587. Long orgCount =new Long(0L);//统计到所有机构的数目
  588. Long adminCount = new Long(0L);//统计到所有团队的数目
  589. Long errorCount=new Long(0L);//脏数据
  590. Boolean isAll=true;//是否统计失败
  591. StringBuffer errorContent=new StringBuffer();
  592. //统计有已改簽的
  593. List<ETLModel> etlModels=new ArrayList<ETLModel>();
  594. //数据过滤清洗出脏数据 -----------start
  595. for(SignFamily signFamily:signFamilys){
  596. ETLModel etlModel=new ETLModel();
  597. String orgCode = signFamily.getHospital();
  598. if(StringUtils.isEmpty(orgCode)) {
  599. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据为空");
  600. isAll=false;
  601. errorCount++;
  602. continue;
  603. }
  604. String orgCodeTemp="";
  605. if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
  606. //站
  607. orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
  608. }else{
  609. //社区
  610. orgCodeTemp=orgCode;
  611. }
  612. //判断社区有没有值
  613. Hospital hospital=hospitalsMap.get(orgCodeTemp);
  614. if(hospital == null) {
  615. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据不存在");
  616. isAll=false;
  617. errorCount++;
  618. continue;
  619. }
  620. Long adminId=signFamily.getAdminTeamId();
  621. if(adminId == null||adminId<=0) {
  622. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据为空");
  623. isAll=false;
  624. errorCount++;
  625. continue;
  626. }
  627. AdminTeam adminTeam=adminTeamMap.get(signFamily.getAdminTeamId()+"");
  628. if(adminTeam == null) {
  629. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据不存在");
  630. isAll=false;
  631. errorCount++;
  632. continue;
  633. }
  634. String idCard=signFamily.getIdcard();
  635. if(idCard == null||((idCard.length()!=18&&idCard.length()!=15))) {
  636. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的idCard数据异常");
  637. isAll=false;
  638. errorCount++;
  639. continue;
  640. }
  641. String town =hospital.getTown();
  642. if(StringUtils.isEmpty(town)) {
  643. errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town为空");
  644. isAll=false;
  645. errorCount++;
  646. continue;
  647. }
  648. Town townObj =townsMap.get(town);
  649. if(townObj==null) {
  650. errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town不存在");
  651. isAll=false;
  652. errorCount++;
  653. continue;
  654. }
  655. etlModel.setHospital(orgCodeTemp);
  656. etlModel.setTown(hospital.getTown());
  657. etlModel.setCity(Constant.city);
  658. etlModel.setIdcard(signFamily.getIdcard());
  659. etlModels.add(etlModel);
  660. //统计数目+1
  661. cityCount++;
  662. townCount++;
  663. orgCount++;
  664. adminCount++;
  665. }
  666. //数据过滤清洗出脏数据 -----------end
  667. try{
  668. //统计数据
  669. List<Map<String, List<ETLModel>>> returnData1s= levelRole.elt(etlModels);
  670. List<Map<String, Map<String, List<ETLModel>>>> patientAgeRoleData= patientAgeRole.elt(returnData1s);
  671. //保存数据
  672. dbStorage.saveByLevel2(patientAgeRoleData,yesterday,wlyyQuota,6,2);
  673. }catch (Exception e){
  674. e.printStackTrace();
  675. errorContent.append("统计失败:"+e.getMessage());
  676. }
  677. //保存日志
  678. quartzJobLog.setJobEndTime(new Date());
  679. quartzJobLog.setJobContent(saveContent(signFamilys,adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount));
  680. quartzJobLog.setJobType(isAll?"1":"0");
  681. quartzJobLogDao.save(quartzJobLog);
  682. } catch (Exception e) {
  683. e.printStackTrace();
  684. }
  685. }
  686. /**
  687. * 机构维度计算指标
  688. */
  689. @Transactional
  690. private void computequota() {
  691. jdbcTemplate.execute("delete from wlyy_quota_result where quota_date='" + yesterday + "' and quato_code='" + 1 + "'");
  692. //新建任务日志对象
  693. QuartzJobLog quartzJobLog = new QuartzJobLog();
  694. quartzJobLog.setJobStartTime(new Date());
  695. quartzJobLog.setJobId(wlyyJobConfig.getId());
  696. quartzJobLog.setJobName(wlyyJobConfig.getJobName());
  697. //查找出系统全部的团队
  698. List<AdminTeam> adminTeams=doctorAdminTeamDao.findAllTeam();
  699. Map<String, AdminTeam> adminTeamMap = new HashMap<String, AdminTeam>();
  700. for (AdminTeam adminTeam : adminTeams) {
  701. adminTeamMap.put(adminTeam.getId()+"", adminTeam);
  702. }
  703. //查找出系统全部的机构
  704. List<Hospital> hospitals = hospitalDao.findHospitalzxFWZ();
  705. Map<String, Hospital> hospitalsMap = new HashMap<String, Hospital>();
  706. for (Hospital hospital : hospitals) {
  707. hospitalsMap.put(hospital.getCode(), hospital);
  708. }
  709. //查找出厦门市全部的区
  710. List<Town> towns = townDao.findByCityCode(Constant.city);
  711. Map<String, Town> townsMap = new HashMap<String, Town>();
  712. for (Town town : towns) {
  713. townsMap.put(town.getCode(), town);
  714. }
  715. //找出今天的签约信息 yesterday,now
  716. List<SignFamily> signFamilys = signFamilyDao.findByJiatingSignYesterday(yesterday, now);
  717. Long cityCount = new Long(0L); //统计到市的数目
  718. Long townCount = new Long(0L); //统计到所有区的数目
  719. Long orgCount =new Long(0L);//统计到所有机构的数目
  720. Long adminCount = new Long(0L);//统计到所有团队的数目
  721. Long errorCount=new Long(0L);//脏数据
  722. Boolean isAll=true;//是否统计失败
  723. StringBuffer errorContent=new StringBuffer();
  724. //统计有已改簽的
  725. List<ETLModel> etlModels=new ArrayList<ETLModel>();
  726. //数据过滤清洗出脏数据 -----------start
  727. for(SignFamily signFamily:signFamilys){
  728. ETLModel etlModel=new ETLModel();
  729. String orgCode = signFamily.getHospital();
  730. if(StringUtils.isEmpty(orgCode)) {
  731. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据为空");
  732. isAll=false;
  733. errorCount++;
  734. continue;
  735. }
  736. String orgCodeTemp="";
  737. if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
  738. //站
  739. orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
  740. }else{
  741. //社区
  742. orgCodeTemp=orgCode;
  743. }
  744. //判断社区有没有值
  745. Hospital hospital=hospitalsMap.get(orgCodeTemp);
  746. if(hospital == null) {
  747. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据不存在");
  748. isAll=false;
  749. errorCount++;
  750. continue;
  751. }
  752. Long adminId=signFamily.getAdminTeamId();
  753. if(adminId == null||adminId<=0) {
  754. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据为空");
  755. isAll=false;
  756. errorCount++;
  757. continue;
  758. }
  759. AdminTeam adminTeam=adminTeamMap.get(signFamily.getAdminTeamId()+"");
  760. if(adminTeam == null) {
  761. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据不存在");
  762. isAll=false;
  763. errorCount++;
  764. continue;
  765. }
  766. String idCard=signFamily.getIdcard();
  767. if(idCard == null||((idCard.length()!=18&&idCard.length()!=15))) {
  768. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的idCard数据异常");
  769. isAll=false;
  770. errorCount++;
  771. continue;
  772. }
  773. String town =hospital.getTown();
  774. if(StringUtils.isEmpty(town)) {
  775. errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town为空");
  776. isAll=false;
  777. errorCount++;
  778. continue;
  779. }
  780. Town townObj =townsMap.get(town);
  781. if(townObj==null) {
  782. errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town不存在");
  783. isAll=false;
  784. errorCount++;
  785. continue;
  786. }
  787. etlModel.setAdminTeam(adminTeam.getId()+"");
  788. etlModel.setHospital(orgCodeTemp);
  789. etlModel.setTown(hospital.getTown());
  790. etlModel.setCity(Constant.city);
  791. etlModel.setIdcard(signFamily.getIdcard());
  792. etlModels.add(etlModel);
  793. //统计数目+1
  794. cityCount++;
  795. townCount++;
  796. orgCount++;
  797. adminCount++;
  798. }
  799. //数据过滤清洗出脏数据 -----------end
  800. try{
  801. //统计数据
  802. List<Map<String, List<ETLModel>>> returnDatas= levelRole.elt(etlModels);
  803. //保存数据
  804. dbStorage.saveByLevel1(returnDatas,yesterday,wlyyQuota);
  805. }catch (Exception e){
  806. e.printStackTrace();
  807. errorContent.append("统计失败:"+e.getMessage());
  808. }
  809. //保存日志
  810. quartzJobLog.setJobEndTime(new Date());
  811. quartzJobLog.setJobContent(saveContent(signFamilys,adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount));
  812. quartzJobLog.setJobType(isAll?"1":"0");
  813. quartzJobLogDao.save(quartzJobLog);
  814. }
  815. /*
  816. 得到昨天的日期字符串 yyyy-MM-dd
  817. */
  818. public String getYesterday() {
  819. return yesterday;
  820. }
  821. public static String getDayString(Integer size) {
  822. Date date = new Date();//取时间
  823. Calendar calendar = new GregorianCalendar();
  824. calendar.setTime(date);
  825. calendar.add(calendar.DATE, size);//把日期往后增加一天.整数往后推,负数往前移动
  826. date = calendar.getTime(); //这个时间就是日期往后推一天的结果
  827. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
  828. String dateString = formatter.format(date);
  829. return dateString;
  830. }
  831. private String getOrg(String org){
  832. //if(!"00".equals(org.substring(org.length()-2,org.length()))){
  833. if(org.length() == 10 && !org.endsWith("00")){
  834. return org.substring(0,org.length()-2)+"00";
  835. }else{
  836. return org;
  837. }
  838. }
  839. private String saveContent(List<SignFamily> signFamilys, Long qkCount, Long orgCount, Long townCount, Long cityCount, boolean isAll, StringBuffer errorContent,Long errorCount) {
  840. StringBuffer string=new StringBuffer("统计"+yesterday+" 的签约数据完成 ,数据库查询到签约数目:"+signFamilys.size());
  841. string.append(",过滤的脏数据数目:"+errorCount);
  842. string.append(",统计到市的数据总数:"+cityCount);
  843. string.append(",统计到区的数据总数:"+townCount);
  844. string.append(",统计到机构的数据总数:"+orgCount);
  845. string.append(",统计到团队的数据总数:"+qkCount);
  846. string.append(",是否统计成功:"+isAll);
  847. if(!isAll){
  848. string.append(",失败原因:"+errorContent);
  849. }
  850. return string.toString();
  851. }
  852. }