FollowUpJob.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  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.job.QuartzJobLog;
  7. import com.yihu.wlyy.entity.patient.PatientHealthGuidance;
  8. import com.yihu.wlyy.entity.statistics.WlyyQuotaResult;
  9. import com.yihu.wlyy.repository.address.TownDao;
  10. import com.yihu.wlyy.repository.doctor.DoctorAdminTeamDao;
  11. import com.yihu.wlyy.repository.doctor.DoctorDao;
  12. import com.yihu.wlyy.repository.job.QuartzJobLogDao;
  13. import com.yihu.wlyy.repository.organization.HospitalDao;
  14. import com.yihu.wlyy.repository.statistics.WlyyQuotaResultDao;
  15. import com.yihu.wlyy.web.quota.WlyyJobConfigVO;
  16. import com.yihu.wlyy.web.quota.WlyyQuotaVO;
  17. import org.quartz.Job;
  18. import org.quartz.JobDataMap;
  19. import org.quartz.JobExecutionContext;
  20. import org.quartz.JobExecutionException;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.jdbc.core.JdbcTemplate;
  23. import org.springframework.stereotype.Component;
  24. import org.springframework.transaction.annotation.Transactional;
  25. import org.springframework.util.StringUtils;
  26. import org.springframework.web.context.support.SpringBeanAutowiringSupport;
  27. import java.io.IOException;
  28. import java.io.InputStream;
  29. import java.util.*;
  30. /**
  31. * 随访的指标执行类
  32. */
  33. @Component
  34. public class FollowUpJob implements Job {
  35. private WlyyQuotaVO wlyyQuota;//指标对象
  36. private WlyyJobConfigVO wlyyJobConfig;//配置对象
  37. @Autowired
  38. private WlyyQuotaResultDao wlyyQuotaResultDao;//指标结果Dao
  39. @Autowired
  40. private QuartzJobLogDao quartzJobLogDao;//执行日志Dao
  41. @Autowired
  42. private DoctorDao doctorDao;
  43. @Autowired
  44. private HospitalDao hospitalDao;
  45. @Autowired
  46. private TownDao townDao;
  47. @Autowired
  48. private JdbcTemplate jdbcTemplate_wlyy;
  49. @Autowired
  50. private DoctorAdminTeamDao doctorAdminTeamDao;
  51. private org.apache.tomcat.jdbc.pool.DataSource fvdataSource=new org.apache.tomcat.jdbc.pool.DataSource();//随访数据源
  52. private JdbcTemplate jdbcTemplate = new JdbcTemplate();
  53. private Properties systemProperties;
  54. String yesterday;
  55. String now;
  56. @Override
  57. public void execute(JobExecutionContext context)
  58. throws JobExecutionException {
  59. SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
  60. getSystemProperties();
  61. fvdataSource.setDriverClassName( systemProperties.get("fv.jdbc.driver").toString());
  62. fvdataSource.setUrl( systemProperties.get("fv.jdbc.url").toString());
  63. fvdataSource.setUsername( systemProperties.get("fv.jdbc.username").toString());
  64. fvdataSource.setPassword( systemProperties.get("fv.jdbc.password").toString());
  65. //初始化参数
  66. JobDataMap map = context.getJobDetail().getJobDataMap();
  67. wlyyQuota = (WlyyQuotaVO) map.get("quota");
  68. wlyyJobConfig = (WlyyJobConfigVO) map.get("jobConfig");
  69. //计算指标
  70. jdbcTemplate.setDataSource(fvdataSource);//初始化随访的数据源
  71. //線刪除今天的数据
  72. now= StringUtils.isEmpty(map.get("now"))?SignJob.getDayString(0):map.get("now").toString();
  73. yesterday= StringUtils.isEmpty(map.get("yesterday"))?SignJob.getDayString(-1):map.get("yesterday").toString();
  74. computequota();
  75. }
  76. @Transactional
  77. private void computequota() {
  78. jdbcTemplate_wlyy.execute("delete from wlyy_quota_result where quota_date='"+yesterday+"' and quato_code='"+4+"'");
  79. //新建任务日志对象
  80. QuartzJobLog quartzJobLog = new QuartzJobLog();
  81. quartzJobLog.setJobStartTime(new Date());
  82. quartzJobLog.setJobId(wlyyJobConfig.getId());
  83. quartzJobLog.setJobName(wlyyJobConfig.getJobName());
  84. //查找出系统全部的医生
  85. List<AdminTeam> adminTeams=doctorAdminTeamDao.findAllTeam();
  86. Map<String, AdminTeam> adminTeamMap = new HashMap<String, AdminTeam>();
  87. for (AdminTeam adminTeam : adminTeams) {
  88. adminTeamMap.put(adminTeam.getId()+"", adminTeam);
  89. }
  90. //查找出系统全部的机构
  91. List<Hospital> hospitals = hospitalDao.findHospital2();
  92. Map<String, Hospital> hospitalsMap = new HashMap<String, Hospital>();
  93. for (Hospital hospital : hospitals) {
  94. hospitalsMap.put(hospital.getCode(), hospital);
  95. }
  96. //查找出厦门市全部的区
  97. List<Town> towns = townDao.findByCityCode(Constant.city);
  98. Map<String, Town> townsMap = new HashMap<String, Town>();
  99. for (Town town : towns) {
  100. townsMap.put(town.getCode(), town);
  101. }
  102. //找出今天的随访信息
  103. List<Map<String,Object>> plans = getFvYesterday();
  104. Map<String, Long> tjTownMap = new HashMap<String, Long>();//区级的统计map key 是区行政区划350200
  105. Map<String, Long> tjOrgMap = new HashMap<String, Long>();//机构的统计map key 是机构的code
  106. Map<String, Long> tjAdminTeamMap = new HashMap<String, Long>();//团队级的统计map 目前没有团队 先用全科医生统一 key doctorCode
  107. Long cityCount = 0L; //统计到市的数目
  108. Long townCount = 0L; //统计到所有区的数目
  109. Long orgCount = 0L;//统计到所有机构的数目
  110. Long qkCount = 0L;//统计到所有全科医生的数目
  111. boolean isAll=true;//是否统计失败
  112. StringBuffer errorContent=new StringBuffer();
  113. //统计有随访的
  114. String orgCodeTemp="";
  115. for (Map<String,Object> plan : plans) {
  116. //统计市 ------------------start ------------------
  117. cityCount++;
  118. //统计团队------------------start ------------------
  119. String doctorCode = (String) plan.get("doctor_uid");//得到随访中的全部医生的code
  120. String teamId= doctorAdminTeamDao.findIdByLeaderCode(doctorCode)+"";
  121. if(teamId==null){
  122. errorContent.append("随访id:"+plan.get("id")+",随访的医生所属的团队不存在");
  123. isAll=false;
  124. continue;
  125. }
  126. AdminTeam adminTeam=adminTeamMap.get(teamId);
  127. if(adminTeam==null){
  128. errorContent.append("随访id:"+plan.get("id")+",随访的医生所属的团队不存在");
  129. isAll=false;
  130. continue;
  131. }
  132. compute(tjAdminTeamMap, teamId);
  133. qkCount++;
  134. //统计机构------------------start ------------------
  135. //判断医生属于哪个机构
  136. String orgCode = adminTeam.getOrgCode();
  137. Hospital hospital=hospitalsMap.get(orgCode);
  138. if(hospital==null){
  139. errorContent.append("随访id:"+plan.get("id")+",随访的医生所属的团队的机构不存在");
  140. isAll=false;
  141. continue;
  142. }
  143. //统计机构
  144. if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
  145. //统计站
  146. orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
  147. compute(tjOrgMap, orgCodeTemp);
  148. }else{
  149. //统计社区
  150. orgCodeTemp=orgCode;
  151. compute(tjOrgMap, orgCode);
  152. }
  153. orgCount++;
  154. //统计区------------------start ------------------
  155. if(hospital == null) {
  156. errorContent.append("随访id:"+plan.get("id")+",随访的医生所属的机构为空或者不存在");
  157. isAll=false;
  158. continue;
  159. }
  160. String townCode = hospital.getTown();
  161. //统计区
  162. compute(tjTownMap, townCode);
  163. townCount++;
  164. }
  165. //保存统计的结果
  166. //保存全科医生的随访统计
  167. for (Map.Entry<String, AdminTeam> entry : adminTeamMap.entrySet()) {
  168. AdminTeam adminTeam = entry.getValue();//得到健康管理师
  169. orgCodeTemp=getOrg(adminTeam.getOrgCode());
  170. Hospital hospital = hospitalsMap.get(orgCodeTemp);//得到全科医生的机构
  171. if(hospital == null) continue;
  172. String city=Constant.city;
  173. String cityName=Constant.cityName;
  174. String town=hospital.getTown();
  175. String townName=hospital.getTownName();
  176. String org=hospital.getCode();
  177. if(!"00".equals(hospital.getCode().substring(hospital.getCode().length()-2,hospital.getCode().length()))){
  178. //统计站
  179. org=hospital.getCode().substring(0,hospital.getCode().length()-2)+"00";
  180. }
  181. String orgName=hospital.getName();
  182. String doctorCode=adminTeam.getId()+"";
  183. String doctorName=adminTeam.getName();
  184. String doctorJob="";
  185. String level="1";
  186. String key=adminTeam.getId()+"";
  187. save(tjAdminTeamMap, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level, key);
  188. }
  189. //保存机构的随访统计
  190. for (Map.Entry<String, Hospital> entry : hospitalsMap.entrySet()) {
  191. Hospital hospital = hospitalsMap.get(entry.getKey());
  192. if(hospital == null) continue;
  193. String city=Constant.city;
  194. String cityName=Constant.cityName;
  195. String town=hospital.getTown();
  196. String townName=hospital.getTownName();
  197. String org=hospital.getCode();
  198. String orgName=hospital.getName();
  199. String doctorCode="";
  200. String doctorName="";
  201. String doctorJob="";
  202. String level="2";
  203. String key=hospital.getCode();
  204. save(tjOrgMap, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level, key);
  205. }
  206. //保存区级的随访统计
  207. for (Map.Entry<String, Town> entry : townsMap.entrySet()) {
  208. Town townObj = townsMap.get(entry.getKey());
  209. String city=Constant.city;
  210. String cityName=Constant.cityName;
  211. String town=townObj.getCode();
  212. String townName=townObj.getName();
  213. String org="";
  214. String orgName="";
  215. String doctorCode="";
  216. String doctorName="";
  217. String doctorJob="";
  218. String level="3";
  219. String key=townObj.getCode();
  220. save(tjTownMap, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level, key);
  221. }
  222. //保存市级的统计
  223. {
  224. WlyyQuotaResult wlyyQuotaResult = new WlyyQuotaResult();
  225. wlyyQuotaResult.setDel("1");
  226. wlyyQuotaResult.setCity(Constant.city);
  227. wlyyQuotaResult.setCityName(Constant.cityName);
  228. wlyyQuotaResult.setQuatoCode(wlyyQuota.getId());
  229. wlyyQuotaResult.setQuatoName(wlyyQuota.getName());
  230. wlyyQuotaResult.setQuotaDate(getYesterday());
  231. wlyyQuotaResult.setCreateTime(new Date());
  232. wlyyQuotaResult.setLevel1Type("4");
  233. //判断全科医生是否有随访量
  234. if (cityCount > 0) {
  235. wlyyQuotaResult.setResult(cityCount + "");
  236. } else {
  237. wlyyQuotaResult.setResult("0");
  238. }
  239. wlyyQuotaResultDao.save(wlyyQuotaResult);
  240. }
  241. quartzJobLog.setJobEndTime(new Date());
  242. quartzJobLog.setJobContent(saveContent(plans,qkCount,orgCount,townCount,cityCount,isAll,errorContent));
  243. quartzJobLog.setJobType(isAll?"1":"0");
  244. quartzJobLogDao.save(quartzJobLog);
  245. }
  246. private String saveContent( List<Map<String,Object>> plans, Long qkCount, Long orgCount, Long townCount, Long cityCount, boolean isAll, StringBuffer errorContent) {
  247. StringBuffer string=new StringBuffer("统计"+getYesterday()+" 的随访完成 ,数据库查询到随访数目:"+plans.size());
  248. string.append(",统计到市的数据总数:"+cityCount);
  249. string.append(",统计到区的数据总数:"+townCount);
  250. string.append(",统计到机构的数据总数:"+orgCount);
  251. string.append(",统计到团队的数据总数:"+qkCount);
  252. string.append(",是否统计成功:"+isAll);
  253. if(!isAll){
  254. string.append(",失败原因:"+errorContent);
  255. }
  256. return string.toString();
  257. }
  258. /**
  259. * 统计方案
  260. * @param tjQkdoctorMap
  261. * @param doctorCode
  262. */
  263. private void compute(Map<String, Long> tjQkdoctorMap, String doctorCode) {
  264. if (tjQkdoctorMap.containsKey(doctorCode)) {
  265. tjQkdoctorMap.put(doctorCode, tjQkdoctorMap.get(doctorCode) + 1);
  266. } else {
  267. tjQkdoctorMap.put(doctorCode, 1L);
  268. }
  269. }
  270. public String getYesterday() {
  271. return yesterday;
  272. }
  273. public List<Map<String,Object>> getFvYesterday() {
  274. String sql=" select * from fv_plan a where unix_timestamp(a.update_time)>=unix_timestamp('"+yesterday+"') and unix_timestamp(a.update_time)< unix_timestamp('"+now+"') ";
  275. return jdbcTemplate.queryForList(sql);
  276. }
  277. private void save(Map<String, Long> tjTownMap, String city, String cityName, String town, String townName, String org, String orgName, String doctorCode, String doctorName, String doctorJob, String level, String key) {
  278. WlyyQuotaResult wlyyQuotaResult = new WlyyQuotaResult();
  279. wlyyQuotaResult.setDel("1");
  280. wlyyQuotaResult.setCity(city);
  281. wlyyQuotaResult.setCityName(cityName);
  282. wlyyQuotaResult.setTown(town);
  283. wlyyQuotaResult.setTownName(townName);
  284. wlyyQuotaResult.setOrgCode(org);
  285. wlyyQuotaResult.setOrgName(orgName);
  286. wlyyQuotaResult.setQkdoctorJobName(doctorJob);
  287. wlyyQuotaResult.setQkdoctorName(doctorName);
  288. wlyyQuotaResult.setQkdoctorCode(doctorCode);
  289. wlyyQuotaResult.setQuatoCode(wlyyQuota.getId());
  290. wlyyQuotaResult.setQuatoName(wlyyQuota.getName());
  291. wlyyQuotaResult.setQuotaDate(getYesterday());
  292. wlyyQuotaResult.setCreateTime(new Date());
  293. wlyyQuotaResult.setLevel1Type(level);
  294. //判断全科医生是否有随访量
  295. if (tjTownMap.containsKey(key)) {
  296. wlyyQuotaResult.setResult(tjTownMap.get(key) + "");
  297. } else {
  298. wlyyQuotaResult.setResult("0");
  299. }
  300. wlyyQuotaResultDao.save(wlyyQuotaResult);
  301. }
  302. public Properties getSystemProperties() {
  303. if (systemProperties == null) {
  304. InputStream is = null;
  305. try {
  306. is = this.getClass().getResourceAsStream("/application.properties");
  307. systemProperties = new Properties();
  308. systemProperties.load(is);
  309. } catch (IOException e1) {
  310. e1.printStackTrace();
  311. } finally {
  312. if (is != null) {
  313. try {
  314. is.close();
  315. } catch (IOException e) {
  316. e.printStackTrace();
  317. }
  318. }
  319. }
  320. }
  321. return systemProperties;
  322. }
  323. private String getOrg(String org){
  324. if(!"00".equals(org.substring(org.length()-2,org.length()))){
  325. return org.substring(0,org.length()-2)+"00";
  326. }else{
  327. return org;
  328. }
  329. }
  330. }