数据导入


	/**
	 * 数据导入
	 */
	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;
	}
}


猜你喜欢

转载自blog.csdn.net/tane_1018/article/details/78270817