From 635484199a46e9f825eeb39ce7f037822ab02dc9 Mon Sep 17 00:00:00 2001 From: dxfeng Date: Mon, 29 Jan 2024 14:01:02 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=94=E8=AF=95=E7=BB=93=E6=9E=9C=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=8A=9F=E8=83=BD=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../recruit/conn/ApplicantCommonInfo.java | 35 ++++ .../controller/WrittenResultsController.java | 12 +- .../recruit/entity/common/ImportLog.java | 23 +++ .../service/WrittenResultsService.java | 8 + .../impl/WrittenResultsServiceImpl.java | 186 +++++++++++++++--- src/com/engine/recruit/util/ExcelUtil.java | 54 +++++ .../wrapper/WrittenResultsWrapper.java | 4 + 7 files changed, 297 insertions(+), 25 deletions(-) create mode 100644 src/com/engine/recruit/entity/common/ImportLog.java create mode 100644 src/com/engine/recruit/util/ExcelUtil.java diff --git a/src/com/engine/recruit/conn/ApplicantCommonInfo.java b/src/com/engine/recruit/conn/ApplicantCommonInfo.java index 6fb5475..ed91d39 100644 --- a/src/com/engine/recruit/conn/ApplicantCommonInfo.java +++ b/src/com/engine/recruit/conn/ApplicantCommonInfo.java @@ -63,6 +63,41 @@ public class ApplicantCommonInfo { return cancelReason; } + /** + * 获取表单下拉框值 + * + * @param formId 表单ID + * @param fieldName 字段明湖曾 + * @param selectName 下拉框展示内容 + * @return + */ + public static String getSelectValue(String formId, String fieldName, String selectName) { + String selectValue = ""; + RecordSet rs = new RecordSet(); + rs.executeQuery("select selectvalue from workflow_selectitem where fieldid =( select id from workflow_billfield where billid = ? and fieldname = ? ) and selectname = ?", formId, fieldName, selectName); + if (rs.next()) { + selectValue = rs.getString("selectvalue"); + } + return selectValue; + } + + /** + * 获取表单下拉框展示文本 + * + * @param formId 表单ID + * @param fieldName 字段明湖曾 + * @return + */ + public static Map getSelectMap(String formId, String fieldName) { + Map selectMap = new HashMap<>(); + RecordSet rs = new RecordSet(); + rs.executeQuery("select selectvalue,selectname from workflow_selectitem where fieldid =( select id from workflow_billfield where billid = ? and fieldname = ? ) ", formId, fieldName); + while (rs.next()) { + selectMap.put(rs.getString("selectvalue"), rs.getString("selectname")); + } + return selectMap; + } + /** * 获取招聘通用浏览按钮展示内容 diff --git a/src/com/engine/recruit/controller/WrittenResultsController.java b/src/com/engine/recruit/controller/WrittenResultsController.java index d722c6b..f27e411 100644 --- a/src/com/engine/recruit/controller/WrittenResultsController.java +++ b/src/com/engine/recruit/controller/WrittenResultsController.java @@ -10,6 +10,7 @@ import weaver.hrm.User; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.GET; +import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; @@ -32,6 +33,15 @@ public class WrittenResultsController { public String getFormCondition(@Context HttpServletRequest request, @Context HttpServletResponse response) { User user = HrmUserVarify.getUser(request, response); Map params = ParamUtil.request2Map(request); - return new ResponseResult, Map>(user).run(getWrittenResultsWrapper(user)::getFormCondition,params); + return new ResponseResult, Map>(user).run(getWrittenResultsWrapper(user)::getFormCondition, params); + } + + @POST + @Path("/importExcel") + @Produces(MediaType.APPLICATION_JSON) + public String importExcel(@Context HttpServletRequest request, @Context HttpServletResponse response) { + User user = HrmUserVarify.getUser(request, response); + Map params = ParamUtil.request2Map(request); + return new ResponseResult, Map>(user).run(getWrittenResultsWrapper(user)::importExcel, params); } } diff --git a/src/com/engine/recruit/entity/common/ImportLog.java b/src/com/engine/recruit/entity/common/ImportLog.java new file mode 100644 index 0000000..ce97487 --- /dev/null +++ b/src/com/engine/recruit/entity/common/ImportLog.java @@ -0,0 +1,23 @@ +package com.engine.recruit.entity.common; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author:dxfeng + * @createTime: 2024/01/26 + * @version: 1.0 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ImportLog { + private Integer rowIndex; + private String status; + private String description; + + +} diff --git a/src/com/engine/recruit/service/WrittenResultsService.java b/src/com/engine/recruit/service/WrittenResultsService.java index 250ddab..b44b89c 100644 --- a/src/com/engine/recruit/service/WrittenResultsService.java +++ b/src/com/engine/recruit/service/WrittenResultsService.java @@ -15,4 +15,12 @@ public interface WrittenResultsService { * @return */ Map getFormCondition(); + + /** + * 导入Excel + * + * @param params + * @return + */ + Map importExcel(Map params); } diff --git a/src/com/engine/recruit/service/impl/WrittenResultsServiceImpl.java b/src/com/engine/recruit/service/impl/WrittenResultsServiceImpl.java index e9d890b..163b8e8 100644 --- a/src/com/engine/recruit/service/impl/WrittenResultsServiceImpl.java +++ b/src/com/engine/recruit/service/impl/WrittenResultsServiceImpl.java @@ -1,15 +1,22 @@ package com.engine.recruit.service.impl; -import com.api.browser.bean.SearchConditionGroup; -import com.api.browser.bean.SearchConditionItem; +import cn.hutool.core.convert.Convert; import com.engine.core.impl.Service; +import com.engine.recruit.conn.ApplicantCommonInfo; +import com.engine.recruit.entity.common.ImportLog; +import com.engine.recruit.exception.CustomizeRunTimeException; import com.engine.recruit.service.WrittenResultsService; -import com.engine.recruit.util.RecruitFormItemUtil; +import com.engine.recruit.util.ExcelUtil; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.xssf.usermodel.XSSFCell; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import weaver.conn.RecordSet; +import weaver.file.ImageFileManager; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.io.IOException; +import java.util.*; /** * @author:dxfeng @@ -19,24 +26,155 @@ import java.util.Map; public class WrittenResultsServiceImpl extends Service implements WrittenResultsService { @Override public Map getFormCondition() { - Map apiDatas = new HashMap<>(); - List selectItems = new ArrayList<>(); - List addGroups = new ArrayList<>(); - SearchConditionItem schemeNameCondition = RecruitFormItemUtil.inputItem(user, 2, 17, 1, 50, "导入类型", "importType"); - schemeNameCondition.setRules("required|string"); - schemeNameCondition.setValue("更新"); - SearchConditionItem schemeNoCondition = RecruitFormItemUtil.uploadItem(user, 2, 17, 3, 50, "Excel文件", "excelFile", 5, 1, "xls,xlsx"); - SearchConditionItem subCompanyIdItem = RecruitFormItemUtil.browserItem(user, 2, 17, 1, false, "所属分部", "164", "subCompanyId", ""); - SearchConditionItem textareaItem = RecruitFormItemUtil.textareaItem(user, 2, 17, true, 1, 200, "方案说明", "schemeDescription"); + return null; + } - selectItems.add(schemeNameCondition); - selectItems.add(schemeNoCondition); - selectItems.add(subCompanyIdItem); - selectItems.add(textareaItem); - addGroups.add(new SearchConditionGroup("基本信息", true, selectItems, "")); - apiDatas.put("condition", addGroups); - apiDatas.put("hasRight", true); - return apiDatas; + @Override + public Map importExcel(Map params) { + Integer excelId = Convert.toInt(params.get("excel")); + ImageFileManager manager = new ImageFileManager(); + manager.getImageFileInfoById(excelId); + XSSFWorkbook workbook; + try { + workbook = new XSSFWorkbook(manager.getInputStream()); + } catch (IOException e) { + throw new CustomizeRunTimeException(e); + } + // 当前sheet + XSSFSheet sheetAt = workbook.getSheetAt(0); + // 最后一行 + int lastRowNum = sheetAt.getLastRowNum(); + if (lastRowNum < 1) { + throw new CustomizeRunTimeException("导入数据为空"); + } + // 最后一列 + short lastCellNum = sheetAt.getRow(0).getLastCellNum(); + Map keyMap = new HashMap<>(16); + // 标题行 + for (int cellIndex = 0; cellIndex < lastCellNum; cellIndex++) { + XSSFRow row = sheetAt.getRow(0); + if (row == null) { + throw new CustomizeRunTimeException("表单字段名称获取失败,请检查Excel文件"); + } + XSSFCell cell = row.getCell((short) cellIndex); + String cellValue = ExcelUtil.getCellValue(cell).trim(); + keyMap.put(cellValue, cellIndex); + } + // 校验必填列 + checkRequiredFields(keyMap, "ID", "笔试成绩", "笔试结果"); + + Integer idCellNum = keyMap.get("ID"); + Integer scoreCellNum = keyMap.get("笔试成绩"); + Integer resultCellNum = keyMap.get("笔试结果"); + + return updateWrittenResult(sheetAt, lastRowNum, idCellNum, scoreCellNum, resultCellNum); + } + + + /** + * 更新笔试结果 + * + * @param sheetAt + * @param lastRowNum + * @param idCellNum + * @param scoreCellNum + * @param resultCellNum + * @return + */ + private Map updateWrittenResult(XSSFSheet sheetAt, int lastRowNum, Integer idCellNum, Integer scoreCellNum, Integer resultCellNum) { + Map resultMap = new HashMap<>(4); + Integer allCount = 0; + Integer successCount = 0; + Integer failCount = 0; + List logList = new ArrayList<>(); + RecordSet rs = new RecordSet(); + for (int rowIndex = 1; rowIndex <= lastRowNum; rowIndex++) { + allCount++; + XSSFRow row = sheetAt.getRow(rowIndex); + if (null == row) { + continue; + } + List descriptionList = new ArrayList<>(); + boolean success = true; + XSSFCell idCell = row.getCell(idCellNum); + String ideCellValue = ExcelUtil.getCellValue(idCell).trim(); + if (StringUtils.isBlank(ideCellValue)) { + descriptionList.add("[ID]为空"); + success = false; + } + XSSFCell scoreCell = row.getCell(scoreCellNum); + String scoreCellValue = ExcelUtil.getCellValue(scoreCell).trim(); + if (StringUtils.isBlank(scoreCellValue)) { + descriptionList.add("[笔试成绩]为空"); + success = false; + } + XSSFCell resultCell = row.getCell(resultCellNum); + String resultCellValue = ExcelUtil.getCellValue(resultCell).trim(); + if (StringUtils.isBlank(resultCellValue)) { + descriptionList.add("[笔试结果]为空"); + success = false; + } + resultCellValue = convertResultValue(resultCellValue); + if (StringUtils.isBlank(resultCellValue)) { + descriptionList.add("[笔试结果]转换失败"); + success = false; + } + + // 更新笔试成绩 + if (success) { + rs.executeUpdate("update uf_jcl_bs set bscj = ? ,bsjg = ? where id = ? ", scoreCellValue, resultCellValue, ideCellValue); + String exceptionMsg = rs.getExceptionMsg(); + if (StringUtils.isNotBlank(exceptionMsg)) { + descriptionList.add(exceptionMsg); + success = false; + } + } + if (success) { + successCount++; + } else { + failCount++; + } + + ImportLog importLog = ImportLog.builder(). + rowIndex(rowIndex + 1) // 对应Excel的行,从1开始累加 + .description(success ? "导入成功" : StringUtils.join(descriptionList, ",")) + .status(String.valueOf(success)) + .build(); + logList.add(importLog); + } + resultMap.put("log", logList); + resultMap.put("allCount", allCount); + resultMap.put("successCount", successCount); + resultMap.put("failCount", failCount); + return resultMap; + } + + + /** + * 标题行、校验必填列 + * + * @param keyMap 字段集合 + * @param requiredFields 必填字段 + */ + private void checkRequiredFields(Map keyMap, String... requiredFields) { + // 校验必填列 + Set keySet = keyMap.keySet(); + for (String field : requiredFields) { + if (!keySet.contains(field)) { + throw new CustomizeRunTimeException("未获取到必填列[" + field + "]"); + } + } + } + + /** + * 转化笔试结果的值 + * + * @param resultCellValue + * @return + */ + private String convertResultValue(String resultCellValue) { + int formId = ApplicantCommonInfo.getFormIdByTableName("uf_jcl_bs"); + return ApplicantCommonInfo.getSelectValue(String.valueOf(formId), "bsjg", resultCellValue); } } diff --git a/src/com/engine/recruit/util/ExcelUtil.java b/src/com/engine/recruit/util/ExcelUtil.java new file mode 100644 index 0000000..7291d5d --- /dev/null +++ b/src/com/engine/recruit/util/ExcelUtil.java @@ -0,0 +1,54 @@ +package com.engine.recruit.util; + +import org.apache.poi.hssf.usermodel.HSSFDateUtil; +import org.apache.poi.xssf.usermodel.XSSFCell; +import weaver.general.Util; + +import java.text.SimpleDateFormat; + +/** + * @author:dxfeng + * @createTime: 2024/01/26 + * @version: 1.0 + */ +public class ExcelUtil { + /** + * 获取单元格内容 + * + * @param cell + * @return + */ + public static String getCellValue(XSSFCell cell) { + String cellValue = ""; + if (cell == null) { + return ""; + } + switch (cell.getCellType()) { + case BOOLEAN: + cellValue = String.valueOf(cell.getBooleanCellValue()); + break; + case NUMERIC: + if (HSSFDateUtil.isCellDateFormatted(cell)) { + // 先看是否是日期格式 读取日期格式 + SimpleDateFormat sft = new SimpleDateFormat("yyyy-MM-dd"); + cellValue = sft.format(cell.getDateCellValue()); + } else { + // 读取数字 + cellValue = String.valueOf(new Double(cell.getNumericCellValue())); + } + break; + case FORMULA: + // 读取公式 + cellValue = cell.getCellFormula(); + break; + case STRING: + // 读取String + cellValue = cell.getStringCellValue(); + break; + default: + break; + } + cellValue = Util.toHtmlForHrm(cellValue); + return cellValue; + } +} diff --git a/src/com/engine/recruit/wrapper/WrittenResultsWrapper.java b/src/com/engine/recruit/wrapper/WrittenResultsWrapper.java index 31814d9..c284933 100644 --- a/src/com/engine/recruit/wrapper/WrittenResultsWrapper.java +++ b/src/com/engine/recruit/wrapper/WrittenResultsWrapper.java @@ -21,4 +21,8 @@ public class WrittenResultsWrapper extends Service { public Map getFormCondition(Map params) { return getWrittenResultsService(user).getFormCondition(); } + + public Map importExcel(Map params) { + return getWrittenResultsService(user).importExcel(params); + } }