前端代码:
<el-button type="primary" @click="importVisible= true">批量</el-button>
<el-dialog title="导入" v-model="importVisible" width="500px" v-if="importVisible"> <div style="text-align: center;margin-top: 20px"> <el-upload class="upload-demo" drag :action="url" :data="addParams" :on-success="uploadSuc" :on-remove="removeFile" :on-error="uploadErr"> <i class="el-icon-upload"></i> <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div> </el-upload> </div> </el-dialog> <!-- 导入分配有错误信息后的弹框 --> <el-dialog :title="errTitle" v-model="batchImportErrMsg" width="70%" @close="emptyClerkImportErrMsg"> <el-button round type="danger" style="float:right;margin-buttom: 20px" @click="exportExcel()">请及时导出数据 </el-button> <el-table :data="batchImportErrMsgList" height="565" stripe="true" id="staTable" :cell-style="{padding: '2px 0'}" border class="table" ref="multipleTable" header-cell-class-name="table-header" @selection-change="selectChangesStore"> <el-table-column prop="errMsg" label="错误信息" align="left"> <template #default="scope">{{ scope.row.errMsg }}</template> </el-table-column> </el-table> <template #footer> <span class="dialog-footer"> <el-button type="primary" @click="emptyClerkImportErrMsg">关 闭</el-button> </span> </template> </el-dialog>
data(){ return{ tableHeight: document.body.clientHeight * 0.55 + "px", importVisible:false, url:FL_SERVICE + "/qwManage/excelBatchImport", addParams:reactive({ reqTicket: sessionStorage.getItem("reqClientTicket") }), batchImportErrMsg:false, batchImportErrMsgList:[], errTitle:'', } },
methods
emptyClerkImportErrMsg(){
this.batchImportErrMsg = false;
this.batchImportErrMsgList = [];
},
exportExcel:function(){
let tables = document.querySelector("#staTable");
let xlsxParam = {raw: true};
var wb = this.$xlsx.utils.table_to_book(tables, xlsxParam);
var wbout = this.$xlsx.write(wb, { bookType: 'xlsx', bookSST: true, type: 'array' })
try {
const fileName = '批量分配-错误信息';
this.$fileSaver.saveAs(new Blob([wbout], { type: 'application/octet-stream' }), fileName + '.xlsx')
} catch (e) { if (typeof console !== 'undefined') console.log(e, wbout) }
return wbout
},
uploadSuc(response,file,fileList){
console.log(response);
if(response.retCode == REQ_SUCCESS_GET){
this.importVisible = false;
this.removeFile();
this.getData();
if(JSON.stringify(response.body).indexOf("全部上传成功") != -1){
ElMessage.success(response.body);
}else{
this.errTitle = response.body.successNum;
this.batchImportErrMsgList = response.body.errList;
this.batchImportErrMsg = true;
}
}else{
ElMessage.error(response.retMsg);
this.getData();
}
},
removeFile(file,fileList){
console.log("文件删除");
},
uploadErr(err,file,fileList){
console.log(err);
ElMessage.error("上传失败");
},
后端:controller
@RequestMapping(value = "/excelBatchImport", method = RequestMethod.POST) @ResponseBody public Result excelBatchImport(@RequestParam Map<String, String> map, @RequestParam("file") MultipartFile file) { Result result = new Result(); String fileName = file.getOriginalFilename(); if (map.get("reqTicket") == null || "".equals(String.valueOf(map.get("reqTicket")))) { return result.error("令牌信息为空,请重新登陆"); } String reqTicket = String.valueOf(map.get("reqTicket")); ServerResp<Object> resp = qwGatherManageService.excelBatchImport(fileName, file, reqTicket); return result.conversion(resp); } }
serviceImpl
@Override public ServerResp<Object> excelBatchImport(String fileName, MultipartFile file, String reqTicket) { ServerResp<Object> resp = new ServerResp<>(); try { SysTfUserInfo userInfo = commonUtils.getCurUserInfo(reqTicket); if (userInfo == null) { return resp.error("登陆失效,请重新登陆"); } Integer id = userInfo.getId(); if (!fileName.matches("^.+\\.(?i)(xls)$") && !fileName.matches("^.+\\.(?i)(xlsx)$")) { throw new RuntimeException("上传文件格式不正确"); } boolean isExcel2003 = true; if (fileName.matches("^.+\\.(?i)(xlsx)$")) { isExcel2003 = false; } InputStream is = file.getInputStream(); Workbook wb = null; if (isExcel2003) { wb = new HSSFWorkbook(is); } else { wb = new XSSFWorkbook(is); } Sheet sheet = wb.getSheetAt(0); List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); for (int r = 1; r <= sheet.getLastRowNum(); r++) { Row row = sheet.getRow(r); if (row == null) { break; } Map<String, Object> addParams = new HashMap<>(); DataFormatter formatter = new DataFormatter(); // 遇到为空的就退出循环(表格没乱来的情况下是到了最后一条数据了) if (org.apache.commons.lang3.StringUtils.isBlank(formatter.formatCellValue(row.getCell(0)))) { break; } addParams.put("focusClerkName", formatter.formatCellValue(row.getCell(0))); // 集运人员名称 addParams.put("focusClerkPhone", formatter.formatCellValue(row.getCell(1))); // 集运人员手机号 addParams.put("clerkName", formatter.formatCellValue(row.getCell(2))); // 托管员工名称 addParams.put("clerkPhone", formatter.formatCellValue(row.getCell(3))); // 托管员工手机号 list.add(addParams); } logger.log(MyLogUtil.LOG_INFO, "集运人员分配托管员工导入数据" + list.size() + "条。"); if (list.size() > 0) { int sum = 0; int i = 1; Map<String, Object> resultMap = new HashMap<>(); List<Map<String, Object>> errList = new ArrayList<>(); boolean errCode = true; for (Map<String, Object> map : list) { Map<String, Object> errMap = new HashMap<>(); StringBuffer errMsg = new StringBuffer(""); i = i + 1; // 第一条信息是excel第2行开始的 logger.log(MyLogUtil.LOG_INFO, "===第" + i + "行信息:"+map.toString()); logger.log(MyLogUtil.LOG_INFO, "查询集运人员手机号【" + String.valueOf(map.get("focusClerkPhone")) + "】是否存在"); List<Map<String,Object>> focusClerk = qwGatherManageMapper.selectFocusClerkByPhone((String) map.get("focusClerkPhone")); if (focusClerk.size() == 0) { if (errCode) { errMsg.append("*第" + i + "行信息:"); } resp.error("集运人员手机号不存在"); errMsg.append("【" + String.valueOf(map.get("focusClerkPhone")) + "】集运人员不存在,"); errCode = false; } logger.log(MyLogUtil.LOG_INFO, "查询托管员工手机号【" + String.valueOf(map.get("clerkPhone")) + "】是否存在"); TfClerkInfo clerkInfo = tfClerkInfoMapper.selectClerkInfoByPhone((String) map.get("clerkPhone")); if (clerkInfo == null) { if (errCode) { errMsg.append("*第" + i + "行信息:"); } resp.error("托管员工手机号不存在"); errMsg.append("【" + String.valueOf(map.get("clerkPhone")) + "】托管员工不存在,"); errCode = false; } // 如果基础信息填的没错,就判断是否已分配 logger.log(MyLogUtil.LOG_INFO, "查询托管员工手机号【" + String.valueOf(map.get("clerkPhone")) + "】是否分配"); if (errCode) { Map<String, Object> param = new HashMap<>(); param.put("staffIdt", clerkInfo.getId()); List<Map<String, Object>> qwStaffRelList = qwGatherManageMapper.ifDivide(param); if (qwStaffRelList.size() > 0) { if (errCode) { errMsg.append("*第" + i + "行信息:"); } resp.error("该员工已分配"); errMsg.append("【" + String.valueOf(map.get("clerkPhone")) + "】员工已分配在【"+qwStaffRelList.get(0).get("mobile")+"】下,"); errCode = false; } } // 如果以上有excel信息错误,errCode 就为 false if (!errCode) { logger.log(MyLogUtil.LOG_INFO, "第" + i + "行信息:"+map.toString()+"信息有误,下一条"); errMap.put("errMsg", errMsg); errList.add(errMap); errCode = true; continue; // 跳出循环不执行以下代码,只记录 errMsg 最终返回前端 } // 程序走到这,说明这一行信息没报错,可以插入分配对应信息表 Map<String, Object> param = new HashMap<>(); param.put("staffIdy", focusClerk.get(0).get("id")); param.put("staffIdt", clerkInfo.getId()); Integer count = qwGatherManageMapper.addQwStaffRel(param); if (count == 0) { throw new RuntimeException("集运分配员工错误,回滚"); } if (count > 0) { logger.log(MyLogUtil.LOG_INFO, "第" + i + "行信息:"+map.toString()+"分配成功"); sum++; } } if (list.size() == sum) { resp.success("全部上传成功:" + sum + "条"); } else { resultMap.put("successNum","总数量:"+list.size()+"条。分配成功数量:" + sum + "条。失败数量:" + (list.size() - sum) + "条。"); resultMap.put("errList", errList); logger.log(MyLogUtil.LOG_ERROR, "分配成功数量:" + sum + "条。分配失败名单:" + errList); resp.success(resultMap); } } else { resp.error("文件内容为空"); } } catch (Exception e) { logger.log(MyLogUtil.LOG_ERROR, "集运分配托管员工异常", e); resp.error("集运分配托管员工异常"); } return resp; }
mapper.xml
<insert id="addQwStaffRel" parameterType="java.util.Map"> INSERT qw_staff_rel (staff_id_y, staff_id_t, mobile, head_img, name, user_id, state, login_state, create_time, update_time) VALUE (#{staffIdy}, #{staffIdt}, (select phone from tf_clerk_info where id = #{staffIdt}), null, null, null, 'E', 'OFF', NOW(), NOW()) </insert>