1 /** 2 * 功能描述:[重算末次管理时间页面跳转] 3 * 创建者:shiyanjun 4 * 创建时间: Apr 14, 2015 5:38:43 PM 5 * @return 6 */ 7 @RequestMapping(value = "/toUpdateLastMngDate", method = RequestMethod.GET) 8 public String toUpdateLastMngDate() { 9 return "ehr/toUpdateLastMngDate"; 10 } 11 /** 12 * 功能描述:[对于没有接受过任何服务的档案,重置其末次管理时间] 13 * 14 * 创建者:shiyanjun 15 * 创建时间: Apr 10, 2015 18:05:52 PM 16 * @throws ParseException 17 */ 18 @RequestMapping(value="/getNoServiceEhr", method=RequestMethod.POST) 19 public void getNoServiceEhr(HttpServletRequest request) throws ParseException{ 20 /** 21 * 获取页面参数信息 22 */ 23 String mngOrgCode = request.getParameter("mngOrgCode"); 24 String mnOrgIncChild = request.getParameter("mnOrgIncChild"); 25 /** 26 * 判断机构码是否存在 27 */ 28 boolean bln = ehrBaseService.getOrgCode(mngOrgCode); 29 if(bln == false){ 30 System.out.println("机构码不存在!"); 31 return; 32 } 33 /** 34 * 组装查询SQL 35 */ 36 StringBuilder querySql = new StringBuilder(); 37 if(StringUtils.isNotBlank(mngOrgCode)){ 38 if("true".equals(mnOrgIncChild)){ 39 querySql.append("SELECT EB.* FROM EHR_BASE EB WHERE EB.MNG_ORG_CODE LIKE ‘"+mngOrgCode+"%‘"); 40 }else{ 41 querySql.append("SELECT EB.* FROM EHR_BASE EB WHERE EB.MNG_ORG_CODE = ‘"+mngOrgCode+"‘"); 42 } 43 /** 44 * 设置每次读取档案的条数 45 */ 46 int pageSize = 1000; 47 /** 48 * 重算档案的末次管理时间 49 */ 50 ehrBaseService.updateLastMngDate(querySql.toString(),pageSize); 51 } 52 }
1 /** 2 * 功能描述:[对于没有提供过任何服务的档案,重置其末次管理时间] 3 * 4 * 创建者:shiyanjun 5 * 创建时间: Apr 10, 2015 18:21:09 PM 6 * @param querySql 7 * @param pageSize 8 * @throws ParseException 9 */ 10 public void updateLastMngDate(String querySql,int pageSize) throws ParseException { 11 long startTime = System.currentTimeMillis(); 12 /** 13 * 将各项服务的表名称存到一个字符串数组中 14 */ 15 String[] tableNames = new String[]{"SVC_FLW_COMMON","SVC_EXAM_1","SVC_ASM_OLD_A","SVC_FIRST_SOAP","SVC_FLW_CHRONIC", 16 "SVC_ASM_YEAR","SVC_FLW_CHINA","SVC_ASM_OLD_S","SVC_FLW_MENTAL","PCF_MENTAL"}; 17 /** 18 * 定义几个字符串缓冲区用于拼装SQL 19 */ 20 StringBuilder builder = new StringBuilder(); 21 StringBuilder selectSql = new StringBuilder(); 22 StringBuilder countSql = new StringBuilder(); 23 24 selectSql.append("SELECT COUNT(1) FROM(\n"); 25 countSql.append(selectSql).append(querySql).append(")"); 26 /** 27 * 查询数据总数 28 */ 29 int dataCount = queryForInt(countSql.toString()); 30 if(dataCount <= 0){ 31 logger.info("该机构档案为空!"); 32 System.out.println("该机构档案为空!"); 33 return; 34 } 35 /** 36 * 根据数据总数dataCount和每次要查询的 37 * 数据条数pageSize来计算要查询的次数qryCount 38 */ 39 int qryCount = getQryCount(dataCount,pageSize); 40 41 /** 42 * 将所有没有接受过指定服务的档案的末次管理时间设置为1900-01-01。 43 */ 44 String dateStr = "1900-01-01"; 45 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); 46 Date date = format.parse(dateStr); 47 /** 48 * 定义变量用于记录下面的循环次数 49 */ 50 int i,j,pageListSize; 51 /** 52 * 判断档案是否接受过指定的各项服务 53 */ 54 boolean isService; 55 String ehrId = null; 56 EhrBase ehrBase = null; 57 List<EhrBase> pageList = null; 58 /** 59 * 记录档案原始的末次管理时间 60 */ 61 Date lastMngDate = null; 62 /** 63 * lastMngDateStr:转换成字符串后的末次管理时间,用于和重算之前的 64 * 末次管理时间lastMngDate作对比,如果之前的末次管理时间和现在的一样就不必重算了。 65 */ 66 String lastMngDateStr = null; 67 /** 68 * 记录每次查询并重算的数据条数。 69 */ 70 int temp; 71 /** 72 * 思路: 73 * 1.按查询次数循环,分页查询出数据; 74 * 2.遍历此页数据,获取一份档案的有关信息; 75 * 3.判断该档案是否接受过指定的各项服务; 76 * 4.如果该档案没有接受过指定的各项服务,就将其末次管理时间设置为指定的日期; 77 * 5.保存该档案,该档案末次管理时间重算完成; 78 * 6.循环判断下一份档案; 79 */ 80 for (i = 0; i < qryCount; i++) { 81 temp = 0; 82 pageList = new ArrayList<EhrBase>(); 83 System.out.println("第"+i+"/"+qryCount+"次查询"); 84 /** 85 * 如果不是最后一次查询 86 */ 87 if(i != (qryCount - 1)){ 88 /** 89 * 先查询出一页数据 90 */ 91 pageList = getPageList(querySql, i*pageSize, (i+1)*pageSize); 92 }else{ 93 /** 94 * 查询最后一页数据 95 */ 96 pageList = getPageList(querySql, i*pageSize, dataCount); 97 } 98 pageListSize = pageList.size(); 99 /** 100 * 遍历此页数据 101 */ 102 for (j = 0; j < pageListSize; j++) { 103 // System.out.println(j); 104 ehrBase = pageList.get(j); 105 ehrId = ehrBase.getEhrId(); 106 lastMngDate = ehrBase.getLastMngDate(); 107 /** 108 * 将档案的末次管理时间转换成指定的字符串格式 109 */ 110 lastMngDateStr = dateFormat(format, lastMngDate); 111 /** 112 * 判断是否接受过服务 113 */ 114 isService = isService(builder, tableNames, ehrId); 115 /** 116 * 如果该档案没有接受过指定的各项服务,并且其末次管理时间不是 117 * 指定的日期, 就重置其末次管理时间。 118 */ 119 if(isService == false && !dateStr.equals(lastMngDateStr)){ 120 ehrBase.setLastMngDate(date); 121 ehrBaseDao.save(ehrBase); 122 ++temp; 123 /*System.out.println("没有接受任何服务的档案===="+temp+"====身份证号码:"+ehrBase.getIdNumber()+",原来的末次管理时间:"+lastMngDateStr);*/ 124 } 125 } 126 System.out.println("本次查询共重算"+temp+"条数据!"); 127 } 128 long endTime = System.currentTimeMillis(); 129 long time = (endTime-startTime)/1000; 130 System.out.println("重算完成:共耗时:"+time+"秒!"); 131 } 132 /** 133 * 功能描述:[格式化日期] 134 * 创建者:shiyanjun 135 * 创建时间: Apr 13, 2015 3:27:52 PM 136 * @param format 指定的日期格式 137 * @param date 要格式化的日期 138 * @return 139 */ 140 private String dateFormat(SimpleDateFormat format, Date date) { 141 return format.format(date); 142 } 143 144 /** 145 * 功能描述:[查询数据总数] 146 * 创建者:shiyanjun 147 * 创建时间: Apr 13, 2015 3:36:34 PM 148 * @param countSql 149 * @return 150 */ 151 private int queryForInt(String countSql) { 152 return jdbcTemplate.queryForInt(countSql); 153 } 154 /** 155 * 功能描述:[根据EhrId判断档案是否接受过指定的服务] 156 * 创建者:shiyanjun 157 * 创建时间: Apr 10, 2015 14:58:24 PM 158 * @param builder 字符串缓冲区 159 * @param tableNames 数组,存有各项服务对应的表名称 160 * @param ehrId 档案标识 161 * @return 162 */ 163 public boolean isService(StringBuilder builder, String[] tableNames, String ehrId){ 164 165 for(String tableName : tableNames){ 166 builder.append("SELECT COUNT(ID) FROM ").append(tableName).append(" WHERE EHR_ID = ‘"+ehrId+"‘"); 167 int count = queryForInt(builder.toString()); 168 clearBuilder(builder);//清空缓冲区,下次循环再次使用 169 if(count > 0){ 170 return true;//只要查出一条服务记录,就说明档案被使用过 171 } 172 } 173 return false; 174 } 175 /** 176 * 功能描述:[清空字符串缓冲区,以便于复用] 177 * 创建者:shiyanjun 178 * 创建时间: Apr 14, 2015 5:11:57 PM 179 * @param builder 180 */ 181 private void clearBuilder(StringBuilder builder) { 182 builder.delete(0, builder.length()); 183 } 184 185 /** 186 * 功能描述:[计算查询次数] 187 * 188 * 创建者:shiyanjun 189 * 创建时间: Apr 10, 2015 5:36:36 PM 190 * @param dataCount 191 * @param pageSize 192 * @return 193 */ 194 public int getQryCount(int dataCount, int pageSize) { 195 int qryCount = 1; 196 if(dataCount >= pageSize){ 197 if(dataCount % pageSize == 0){ 198 qryCount = dataCount/pageSize; 199 }else{ 200 qryCount = dataCount/pageSize + 1; 201 } 202 } 203 return qryCount; 204 } 205 /** 206 * 功能描述:[分页查询数据] 207 * 208 * 创建者:shiyanjun 209 * 创建时间: Apr 10, 2015 5:27:39 PM 210 * @param querySql 211 * @param startRowIndex 212 * @param pageSize 213 * @return 214 */ 215 private List<EhrBase> getPageList(String querySql, int startRowIndex, int pageSize) { 216 String rownumSql = ""; 217 if (Config.isOracle() || Config.isKingbase()) { 218 rownumSql = "ROWNUM AS NUM"; 219 } else if (Config.isDb2()) { 220 rownumSql = "ROWNUMBER() OVER() AS NUM"; 221 } 222 StringBuilder pageSql = new StringBuilder(" SELECT * FROM ( \n"); 223 pageSql.append(" SELECT TEMP.*, ").append(rownumSql).append(" FROM ( \n"); 224 pageSql.append(querySql); 225 pageSql.append(")\n"); 226 pageSql.append("TEMP\n"); 227 pageSql.append(" ) WHERE NUM <= ").append(pageSize).append(" AND NUM > ").append(startRowIndex).append(" \n"); 228 //根据pageSql查询分页数据 229 List<EhrBase> pageList = jdbcTemplate.query(pageSql.toString(), new EhrBaseMapper()); 230 return pageList; 231 } 232 233 /** 234 * 功能描述:[判断机构是否存在] 235 * 创建者:shiyanjun 236 * 创建时间: Apr 13, 2015 3:37:16 PM 237 * @param mngOrgCode 238 * @return 239 */ 240 public boolean getOrgCode(String mngOrgCode) { 241 String querySql = "SELECT COUNT(1) FROM UMS_ORG WHERE ORG_CODE LIKE ‘"+mngOrgCode+"%‘"; 242 if(mngOrgCode.length()>2 /*&& mngOrgCode.contains("12")*/){ 243 int orgCodeCount = queryForInt(querySql); 244 if(orgCodeCount > 0){ 245 return true; 246 } 247 } 248 return false; 249 }
时间: 2024-11-05 13:48:31