ChangeSignJob.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  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.SignFamily;
  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.patient.SignFamilyDao;
  15. import com.yihu.wlyy.repository.statistics.WlyyQuotaResultDao;
  16. import com.yihu.wlyy.web.quota.WlyyJobConfigVO;
  17. import com.yihu.wlyy.web.quota.WlyyQuotaVO;
  18. import org.quartz.Job;
  19. import org.quartz.JobDataMap;
  20. import org.quartz.JobExecutionContext;
  21. import org.quartz.JobExecutionException;
  22. import org.springframework.beans.factory.annotation.Autowired;
  23. import org.springframework.jdbc.core.JdbcTemplate;
  24. import org.springframework.stereotype.Component;
  25. import org.springframework.transaction.annotation.Transactional;
  26. import org.springframework.util.StringUtils;
  27. import org.springframework.web.context.support.SpringBeanAutowiringSupport;
  28. import java.text.SimpleDateFormat;
  29. import java.util.*;
  30. /**
  31. * 已改簽的指标执行类
  32. */
  33. @Component
  34. public class ChangeSignJob 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 SignFamilyDao signFamilyDao;
  43. @Autowired
  44. private DoctorDao doctorDao;
  45. @Autowired
  46. private HospitalDao hospitalDao;
  47. @Autowired
  48. private TownDao townDao;
  49. @Autowired
  50. private JdbcTemplate jdbcTemplate;
  51. @Autowired
  52. private DoctorAdminTeamDao doctorAdminTeamDao;
  53. String yesterday;
  54. String now;
  55. public void execute(JobExecutionContext context)
  56. throws JobExecutionException {
  57. SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
  58. //初始化参数
  59. JobDataMap map = context.getJobDetail().getJobDataMap();
  60. wlyyQuota = (WlyyQuotaVO) map.get("quota");
  61. wlyyJobConfig = (WlyyJobConfigVO) map.get("jobConfig");
  62. now= StringUtils.isEmpty(map.get("now"))?SignJob.getDayString(0):map.get("now").toString();
  63. yesterday= StringUtils.isEmpty(map.get("yesterday"))?SignJob.getDayString(-1):map.get("yesterday").toString();
  64. //计算指标
  65. computequota();
  66. }
  67. /**
  68. * 计算指标
  69. */
  70. @Transactional
  71. private void computequota() {
  72. jdbcTemplate.execute("delete from wlyy_quota_result where quota_date='"+yesterday+"' and quato_code='"+10+"'");
  73. //新建任务日志对象
  74. QuartzJobLog quartzJobLog = new QuartzJobLog();
  75. quartzJobLog.setJobStartTime(new Date());
  76. quartzJobLog.setJobId(wlyyJobConfig.getId());
  77. quartzJobLog.setJobName(wlyyJobConfig.getJobName());
  78. //查找出系统全部的全科医生
  79. List<AdminTeam> adminTeams=doctorAdminTeamDao.findAllTeam();
  80. Map<String, AdminTeam> adminTeamMap = new HashMap<String, AdminTeam>();
  81. for (AdminTeam adminTeam : adminTeams) {
  82. adminTeamMap.put(adminTeam.getId()+"", adminTeam);
  83. }
  84. //查找出系统全部的机构
  85. List<Hospital> hospitals = hospitalDao.findHospital2();
  86. Map<String, Hospital> hospitalsMap = new HashMap<String, Hospital>();
  87. for (Hospital hospital : hospitals) {
  88. hospitalsMap.put(hospital.getCode(), hospital);
  89. }
  90. //查找出厦门市全部的区
  91. List<Town> towns = townDao.findByCityCode(Constant.city);
  92. Map<String, Town> townsMap = new HashMap<String, Town>();
  93. for (Town town : towns) {
  94. townsMap.put(town.getCode(), town);
  95. }
  96. //找出今天的已改簽信息
  97. List<SignFamily> signFamilys = signFamilyDao.findByJiatingChaangeSignYesterday(yesterday,now);
  98. Map<String, Long> tjTownMap = new HashMap<String, Long>();//区级的统计map key 是区行政区划350200
  99. Map<String, Long> tjOrgMap = new HashMap<String, Long>();//机构的统计map key 是机构的code
  100. Map<String, Long> tjAdminTeamMap = new HashMap<String, Long>();//团队级的统计map 目前没有团队 先用全科医生统一 key doctorCode
  101. Long cityCount = 0L; //统计到市的数目
  102. Long townCount = 0L; //统计到所有区的数目
  103. Long orgCount = 0L;//统计到所有机构的数目
  104. Long qkCount = 0L;//统计到所有全科医生的数目
  105. boolean isAll=true;//是否统计失败
  106. StringBuffer errorContent=new StringBuffer();
  107. //统计有已改簽的
  108. for (SignFamily signFamily : signFamilys) {
  109. String orgCode = signFamily.getHospital();
  110. String orgCodeTemp="";
  111. if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
  112. //站
  113. orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
  114. }else{
  115. //社区
  116. orgCodeTemp=orgCode;
  117. }
  118. Hospital hospital=hospitalsMap.get(orgCodeTemp);
  119. if(hospital == null) {
  120. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据异常");
  121. isAll=false;
  122. continue;
  123. }
  124. AdminTeam adminTeam=adminTeamMap.get(signFamily.getAdminTeamId()+"");
  125. if(adminTeam == null) {
  126. errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据异常");
  127. isAll=false;
  128. continue;
  129. }
  130. //统计市 ---------------start--------------
  131. cityCount++;
  132. //统计区 ---------------start--------------
  133. String townCode = hospital.getTown();
  134. compute(tjTownMap, townCode);
  135. townCount++;
  136. //统计机构---------------start--------------
  137. compute(tjOrgMap, orgCodeTemp);
  138. orgCount++;
  139. //统计团队 ---------------start--------------
  140. String adminTeamId = signFamily.getAdminTeamId()+"";
  141. compute(tjAdminTeamMap, adminTeamId);
  142. qkCount++;
  143. }
  144. //保存统计的结果
  145. for (Map.Entry<String, AdminTeam> entry : adminTeamMap.entrySet()) {
  146. AdminTeam adminTeam = adminTeamMap.get(entry.getKey());//得到全科医生
  147. String orgCodeTemp=getOrg(adminTeam.getOrgCode());
  148. Hospital hospital = hospitalsMap.get(orgCodeTemp);//得到全科医生的机构
  149. if(hospital == null) continue;
  150. String city=Constant.city;
  151. String cityName=Constant.cityName;
  152. String town=hospital.getTown();
  153. String townName=hospital.getTownName();
  154. String org=hospital.getCode();
  155. if(!"00".equals(hospital.getCode().substring(hospital.getCode().length()-2,hospital.getCode().length()))){
  156. //统计站
  157. org=hospital.getCode().substring(0,hospital.getCode().length()-2)+"00";
  158. }
  159. String orgName=hospital.getName();
  160. String doctorCode=adminTeam.getId()+"";
  161. String doctorName=adminTeam.getName();
  162. String doctorJob="";
  163. String level="1";
  164. String key=adminTeam.getId()+"";
  165. save(tjAdminTeamMap, key, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level);
  166. }
  167. //保存机构的改签统计
  168. for (Map.Entry<String, Hospital> entry : hospitalsMap.entrySet()) {
  169. Hospital hospital = hospitalsMap.get(entry.getKey());//得到全科医生
  170. if(hospital == null) continue;
  171. String city=Constant.city;
  172. String cityName=Constant.cityName;
  173. String town=hospital.getTown();
  174. String townName=hospital.getTownName();
  175. String org=hospital.getCode();
  176. String orgName=hospital.getName();
  177. String doctorCode="";
  178. String doctorName="";
  179. String doctorJob="";
  180. String level="2";
  181. String key=hospital.getCode();
  182. save(tjOrgMap, key, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level);
  183. }
  184. //保存区级的改签统计
  185. for (Map.Entry<String, Town> entry : townsMap.entrySet()) {
  186. Town townObj = townsMap.get(entry.getKey());//得到全科医生
  187. String city=Constant.city;
  188. String cityName=Constant.cityName;
  189. String town=townObj.getCode();
  190. String townName=townObj.getName();
  191. String org="";
  192. String orgName="";
  193. String doctorCode="";
  194. String doctorName="";
  195. String doctorJob="";
  196. String level="3";
  197. String key=townObj.getCode();
  198. save(tjTownMap, key, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level);
  199. }
  200. //保存市级的统计
  201. {
  202. WlyyQuotaResult wlyyQuotaResult = new WlyyQuotaResult();
  203. wlyyQuotaResult.setDel("1");
  204. wlyyQuotaResult.setCity(Constant.city);
  205. wlyyQuotaResult.setCityName(Constant.cityName);
  206. wlyyQuotaResult.setQuatoCode(wlyyQuota.getId());
  207. wlyyQuotaResult.setQuatoName(wlyyQuota.getName());
  208. wlyyQuotaResult.setQuotaDate(getYesterday());
  209. wlyyQuotaResult.setCreateTime(new Date());
  210. wlyyQuotaResult.setLevel1Type("4");
  211. //判断全科医生是否有改签量
  212. if (cityCount > 0) {
  213. wlyyQuotaResult.setResult(cityCount + "");
  214. } else {
  215. wlyyQuotaResult.setResult("0");
  216. }
  217. wlyyQuotaResultDao.save(wlyyQuotaResult);
  218. }
  219. quartzJobLog.setJobEndTime(new Date());
  220. quartzJobLog.setJobContent(saveContent(signFamilys,qkCount,orgCount,townCount,cityCount,isAll,errorContent));
  221. quartzJobLog.setJobType(isAll?"1":"0");
  222. quartzJobLogDao.save(quartzJobLog);
  223. }
  224. private String saveContent(List<SignFamily> signFamilys, Long qkCount, Long orgCount, Long townCount, Long cityCount, boolean isAll, StringBuffer errorContent) {
  225. StringBuffer string=new StringBuffer("统计"+getYesterday()+" 的已改簽数据完成 ,数据库查询到改签数目:"+signFamilys.size());
  226. string.append(",统计到市的数据总数:"+cityCount);
  227. string.append(",统计到区的数据总数:"+townCount);
  228. string.append(",统计到机构的数据总数:"+orgCount);
  229. string.append(",统计到团队的数据总数:"+qkCount);
  230. string.append(",是否统计成功:"+isAll);
  231. if(!isAll){
  232. string.append(",失败原因:"+errorContent);
  233. }
  234. return string.toString();
  235. }
  236. /**
  237. * 统计规则
  238. * @param tjQkdoctorMap
  239. * @param doctorCode
  240. */
  241. private void compute(Map<String, Long> tjQkdoctorMap, String doctorCode) {
  242. if (tjQkdoctorMap.containsKey(doctorCode)) {
  243. tjQkdoctorMap.put(doctorCode, tjQkdoctorMap.get(doctorCode) + 1);
  244. } else {
  245. tjQkdoctorMap.put(doctorCode, 1L);
  246. }
  247. }
  248. /**
  249. * 保存方案
  250. * @param countMap
  251. * @param key
  252. * @param city
  253. * @param cityName
  254. * @param town
  255. * @param townName
  256. * @param org
  257. * @param orgName
  258. * @param doctorCode
  259. * @param doctorName
  260. * @param doctorJob
  261. * @param level
  262. */
  263. private void save(Map<String, Long> countMap, String key, String city, String cityName, String town, String townName, String org, String orgName, String doctorCode, String doctorName, String doctorJob, String level) {
  264. WlyyQuotaResult wlyyQuotaResult = new WlyyQuotaResult();
  265. wlyyQuotaResult.setDel("1");
  266. wlyyQuotaResult.setOrgCode(org);
  267. wlyyQuotaResult.setOrgName(orgName);
  268. wlyyQuotaResult.setCity(city);
  269. wlyyQuotaResult.setCityName(cityName);
  270. wlyyQuotaResult.setQuatoCode(wlyyQuota.getId());
  271. wlyyQuotaResult.setQuatoName(wlyyQuota.getName());
  272. wlyyQuotaResult.setQuotaDate(getYesterday());
  273. wlyyQuotaResult.setCreateTime(new Date());
  274. wlyyQuotaResult.setQkdoctorJobName(doctorJob);
  275. wlyyQuotaResult.setQkdoctorName(doctorName);
  276. wlyyQuotaResult.setQkdoctorCode(doctorCode);
  277. wlyyQuotaResult.setTown(town);
  278. wlyyQuotaResult.setTownName(townName);
  279. wlyyQuotaResult.setLevel1Type(level);
  280. //判断全科医生是否有改签量
  281. if (countMap.containsKey(key)) {
  282. wlyyQuotaResult.setResult(countMap.get(key) + "");
  283. } else {
  284. wlyyQuotaResult.setResult("0");
  285. }
  286. wlyyQuotaResultDao.save(wlyyQuotaResult);
  287. }
  288. private String getOrg(String org){
  289. if(!"00".equals(org.substring(org.length()-2,org.length()))){
  290. return org.substring(0,org.length()-2)+"00";
  291. }else{
  292. return org;
  293. }
  294. }
  295. public String getYesterday() {
  296. Calendar cal = Calendar.getInstance();
  297. cal.add(Calendar.DATE, -1);
  298. String yesterday = new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
  299. return yesterday;
  300. }
  301. }