/** * 数据导入 */ public String doImport(){ TbUserInfo userinfo = (TbUserInfo)getSession().get(GlobalConstants.SESSION_USER_INFO); File file=ybBusinessImportVO.getFdata(); String fileName=ybBusinessImportVO.getFdataFileName(); String contentType = fileName.substring(fileName.lastIndexOf(".") + 1); String path=this.getServletRequest().getSession().getServletContext().getRealPath("/") + "temp" + File.separator; File upfile=ybBusinessImportService.saveUploadFile(file,fileName,path); String plid = commonService.getLsh("5004"); String lsh = commonService.getLsh("5005"); String bxny=ybBusinessImportVO.getJsny(); //insert 数据 TbYbPldrTj tbYbPldrTj=new TbYbPldrTj(); tbYbPldrTj.setLsh(lsh); tbYbPldrTj.setPlid(plid); tbYbPldrTj.setCbd_dm(ybBusinessImportVO.getCbd_dm()); tbYbPldrTj.setKsny(ybBusinessImportVO.getKsny()); tbYbPldrTj.setJsny(ybBusinessImportVO.getJsny()); tbYbPldrTj.setBxnd(Long.parseLong(ybBusinessImportVO.getBxnd())); tbYbPldrTj.setCzrid(userinfo.getLogon_name()); tbYbPldrTj.setXzsj(new Date()); tbYbPldrTj.setClzt("00"); tbYbPldrTj.setYxbz("0"); tbYbPldrTj.setDrlx(ybBusinessImportVO.getDrlx()); // 查找统计表是否有本参保地未确认的信息 List<TbYbPldrTj> qrxx1 = ybBusinessImportService.checkDr(ybBusinessImportVO, userinfo.getLogon_name()); if (qrxx1.size() > 0) { ybBusinessImportService.modifyTbYbPldrTjInvalid(qrxx1); } try{ if(StringUtils.equals("xls", contentType)||StringUtils.equals("xlsx", contentType)){ //读取 ExcelProcess ep = new ExcelProcess(); Map<Integer, List<List<Object>>> values = null; try { values = ep.processSheets(upfile); } catch (Exception e) { e.printStackTrace(); } // 迭代sheet的每一行 int error_rownum = 0; String error_sheet = ""; boolean isNull=true; List<List<Object>> setters = new LinkedList<List<Object>>(); for(Map.Entry<Integer, List<List<Object>>> value : values.entrySet()){ error_sheet = value.getKey().toString(); // sheet number List<List<Object>> vl = value.getValue(); // sheet value for(int i = 0; i < vl.size(); i++){ if(i == 0){ continue; } isNull=false; error_rownum = i + 1; List<Object> v = vl.get(i); // 校验v的值是否都为空 boolean isOk = false; int n=1; for(Object o : v){ boolean isNotBlak = true; if(n++!=8) if(o == null || o.toString().trim().equals("")){ isNotBlak = false; String err="{\"success\":false,result:[],errors:[{msg:\"sheet:"+error_sheet+"---第"+error_rownum+"行,有数据为空\"}]}"; this.writeHtmlData(err); return null; } isOk = isOk || isNotBlak; } //检验是否符合格式 if(v.size()!=43){ String err="{\"success\":false,result:[],errors:[{msg:\"文件不符合批量导入接口格式,请检查!\"}]}"; this.writeHtmlData(err); return null; } if(isOk){ List<Object> data = new LinkedList<Object>(); data.add(plid); for(int j = 0; j < v.size(); j++){ String jv = (v.get(j) == null) ? "" : v.get(j).toString().trim(); if(j == 4){ int jsny_dr = Integer.valueOf(jv.substring(0, 6)); if("2".equals(ybBusinessImportVO.getDrlx())){ if(jsny_dr != Integer.valueOf(ybBusinessImportVO.getJsny())){ String err="{\"success\":false,result:[],errors:[{msg:\"sheet:"+error_sheet+"第"+error_rownum+"行导入批次年月不等于结算年月,导入数据失败!\"}]}"; this.writeHtmlData(err); return null; } } if(!(jsny_dr >= Integer.valueOf(ybBusinessImportVO.getKsny()) && jsny_dr <= Integer.valueOf(ybBusinessImportVO.getJsny()))){ String err="{\"success\":false,result:[],errors:[{msg:\"sheet:"+error_sheet+"第"+error_rownum+"行医保数据已导入过,导入数据失败!\"}]}"; this.writeHtmlData(err); return null; } } data.add(jv); } if(((String)data.get(2)).length()!=15&&((String)data.get(2)).length()!=18){ String err="{\"success\":false,result:[],errors:[{msg:\"sheet:"+error_sheet+"---第"+error_rownum+"行,身份证号有误,请导入15位或者18位身份证号!\"}]}"; this.writeHtmlData(err); return null; } // 就诊开始日期 > 就诊结束日期 if(((String)data.get(6)).compareTo((String)data.get(7)) > 0){ String err="{\"success\":false,result:[],errors:[{msg:\"sheet:"+error_sheet+"---第"+error_rownum+"行,就诊开始日期要早于就诊结束日期,导入数据失败!\"}]}"; this.writeHtmlData(err); return null; } // 门诊 if(format2Double2(Math.abs(Double.parseDouble(data.get(9).toString()))) < (format2Double2(Math.abs( Double.parseDouble(data.get(10).toString())+Double.parseDouble(data.get(11).toString())+ Double.parseDouble(data.get(12).toString()) )))){ String err="{\"success\":false,result:[],errors:[{msg:\"sheet:"+error_sheet+"---第"+error_rownum+"行,门诊费用总额不能小于现金+账户,导入数据失败!\"}]}"; this.writeHtmlData(err); return null; } setters.add(data); } } } if(isNull){ String err="{\"success\":false,result:[],errors:[{msg:\"导入文件无数据,请检查!\"}]}"; this.writeHtmlData(err); return null; } ybBusinessImportService.batchUpdate(setters); tbYbPldrTj.setGxsj(new Date()); ybBusinessImportService.saveYbPldrTj(tbYbPldrTj); } }catch(NumberFormatException ne){ ne.printStackTrace(); String err="{\"success\":false,result:[],errors:[{msg:\"导入文件数据有误!请检查单元格格式是否正确!\"}]}"; this.writeHtmlData(err); return null; }catch(NullPointerException ne){ ne.printStackTrace(); String err="{\"success\":false,result:[],errors:[{msg:\"导入文件数据有误!请检查数据列是否复核规定!是否存在空的单元格\"}]}"; this.writeHtmlData(err); return null; }catch(Exception ne){ ne.printStackTrace(); String err="{\"success\":false,result:[],errors:[{msg:\"导入文件数据有误!\"}]}"; this.writeHtmlData(err); return null; } String jsonData="{\"success\":true,\"plid\":\""+plid+"\"}"; this.writeHtmlData(jsonData); return null; } // private double format2Double2(double d){ DecimalFormat f = new DecimalFormat(".##"); return Double.parseDouble(f.format(d)); } public void writeHtmlData(String htmlData){ PrintWriter out = null ; try { HttpServletResponse response = this.getServletResponse(); response.setContentType("text/html; charset=utf-8"); response.setHeader("cache-control", "no-cache"); out = response.getWriter(); out.write(htmlData); out.flush(); } catch (IOException e) { e.printStackTrace(); }finally{ if(out != null){ out.close(); } } }
//批量插入数据 public void batchUpdate(List<List<Object>> setters) { String sql = " "; logger.info("==========================批处理开始======================"); logger.info("============本次需处理数据:"+ setters.size() +"条==========="); int[] s = new int[setters.size()]; int defaultNum = 5 * 10000; // 一次批处理5W条数据 int times = setters.size() / defaultNum + 1; int n = 0; for(int i = 0; i < times; i++){ int h = setters.size() - defaultNum * (i + 1); int ds = h > 0 ? defaultNum : h + defaultNum; List<List<Object>> buffer = new ArrayList<List<Object>>(); logger.info("==========第"+ (i + 1) +"次处理,处理:"+ ds +"条=============="); for(int j = 0; j < ds; j++){ buffer.add(setters.get(n)); n++; } int[] r = CommonJdbcDaoUtils.batchUpdate(sql, buffer); for(int a = 0; a < r.length; a++){ s[i * defaultNum + a] = r[a]; } buffer = null; System.gc(); } logger.info("==========================批处理结束=========================="); }
/** * 批量更新。执行的sql相同,参数不同时,选择此方法。 * * @param sql * 执行的sql * @param setters * 设置参数的值。 */ public int[] batchUpdate(String sql, final List<List<Object>> setters) { String sql2 = sql; int[] count = getJdbcTemplate().batchUpdate(sql2, new BatchPreparedStatementSetter() { public void setValues(PreparedStatement statement, int index) throws SQLException { List<Object> setter = setters.get(index); for (int i = 0; i < setter.size(); i++) { int parameterIndex = i + 1; statement.setObject(parameterIndex, setter.get(i)); } } public int getBatchSize() { return setters.size(); } }); return count; } }