FollowUpJob.java 13 KB

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