前端代碼:
<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>