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