diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/controller/ProcessStandardComplianceCheckController.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/controller/ProcessStandardComplianceCheckController.java index cacd81d3..fbc09365 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/controller/ProcessStandardComplianceCheckController.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/controller/ProcessStandardComplianceCheckController.java @@ -11,17 +11,24 @@ import com.jero.modules.activiti.process.common.service.ActFlowCommonService; import com.jero.modules.activiti.process.fb.service.IProcessHandleService; import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO; import com.jero.modules.activiti.process.standardComplianceCheck.entity.ProcessStandardComplianceCheck; +import com.jero.modules.activiti.process.standardComplianceCheck.entity.vo.ModelExcelVO; import com.jero.modules.activiti.process.standardComplianceCheck.entity.vo.ProcessSccVO; import com.jero.modules.activiti.process.standardComplianceCheck.service.IProcessStandardComplianceCheckService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.formula.functions.T; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.enmus.ExcelType; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.servlet.ModelAndView; import javax.annotation.Resource; +import java.util.ArrayList; /** * 流程-测试流程(process_demo)表控制层 @@ -113,8 +120,30 @@ public class ProcessStandardComplianceCheckController extends JeroController generate(@RequestPart("scc") ProcessStandardComplianceCheck scc, - @RequestPart("file") MultipartFile file) { - return Result.OK(sccService.generate(scc, file)); + @RequestPart("modelFile") MultipartFile modelFile, + @RequestPart(name = "splitFile", required = false) MultipartFile splitFile) throws Exception { + return Result.OK(sccService.generate(scc, modelFile, splitFile)); + } + + /** + * 车型导入模板下载 + */ + @GetMapping("/modelTemplateDownload") + @ApiOperation(value = "法规符合性排查流程-车型导入模板下载", notes = "法规符合性排查流程-车型导入模板下载") + @AutoLog(value = "法规符合性排查流程-车型导入模板下载") + public ModelAndView templateDownload() { + // AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + String title = "车型批量导入模板"; + //此处设置的filename无效 ,前端会重更新设置一下 + mv.addObject(FILE_NAME, title); + mv.addObject(CLASS, ModelExcelVO.class); + ExportParams exportParams=new ExportParams(title, title); + // 导出xls + exportParams.setType(ExcelType.HSSF); + mv.addObject(PARAMS,exportParams); + mv.addObject(NormalExcelConstants.DATA_LIST, new ArrayList()); + return mv; } } diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/entity/ProcessStandardComplianceCheckDetail.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/entity/ProcessStandardComplianceCheckDetail.java index cb13559e..35021028 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/entity/ProcessStandardComplianceCheckDetail.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/entity/ProcessStandardComplianceCheckDetail.java @@ -69,6 +69,12 @@ public class ProcessStandardComplianceCheckDetail implements Serializable { @ApiModelProperty(value = "条款号") private String termNumber; + /** + * 条款标题 + */ + @ApiModelProperty(value = "条款标题") + private String termTitle; + /** * 条款内容 */ @@ -171,6 +177,12 @@ public class ProcessStandardComplianceCheckDetail implements Serializable { @ApiModelProperty(value = "设计工程师") private String designEngineer; + /** + * 主表Id + */ + @ApiModelProperty(value = "主表Id") + private String checkId; + @TableField(exist = false) private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/entity/vo/ModelExcelVO.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/entity/vo/ModelExcelVO.java index 521e217c..294765ac 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/entity/vo/ModelExcelVO.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/entity/vo/ModelExcelVO.java @@ -1,12 +1,36 @@ package com.jero.modules.activiti.process.standardComplianceCheck.entity.vo; +import com.baomidou.mybatisplus.annotation.TableField; +import com.jero.common.aspect.annotation.Dict; import lombok.Data; +import org.jeecgframework.poi.excel.annotation.Excel; + +import java.util.Arrays; +import java.util.List; @Data public class ModelExcelVO { + @Excel(name = "车型") private String model; + + @Dict(dicCode = "model_status") + @Excel(name = "车型状态", dicCode = "model_status") private String modelState; + public boolean emptyRowOrNot() { + ModelExcelVO modelExcel = this; + return modelExcel.getModel() == null && modelExcel.getModelState() == null; + } + + // 预定义的Excel头部字段 + @TableField(exist = false) + public static final List EXPECTED_EXCEL_HEADERS = Arrays.asList( + "车型", "车型状态" + ); + + public static boolean validateExcelHeaders(List headers) { + return EXPECTED_EXCEL_HEADERS.equals(headers); + } } diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/service/IProcessStandardComplianceCheckService.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/service/IProcessStandardComplianceCheckService.java index 50988f44..cb8d95b1 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/service/IProcessStandardComplianceCheckService.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/service/IProcessStandardComplianceCheckService.java @@ -7,8 +7,6 @@ import com.jero.modules.activiti.process.standardComplianceCheck.entity.vo.Proce import org.activiti.engine.delegate.DelegateTask; import org.springframework.web.multipart.MultipartFile; -import java.util.List; - /** * @author ThinkBook * @description 针对表【process_standard_compliance_check】的数据库操作Service @@ -26,5 +24,5 @@ public interface IProcessStandardComplianceCheckService extends IService processInfoVO); - List generate(ProcessStandardComplianceCheck scc, MultipartFile file); + String generate(ProcessStandardComplianceCheck scc, MultipartFile modelFile, MultipartFile splitFile) throws Exception; } diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/service/impl/ProcessStandardComplianceCheckServiceImpl.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/service/impl/ProcessStandardComplianceCheckServiceImpl.java index bfddc645..2576cd1e 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/service/impl/ProcessStandardComplianceCheckServiceImpl.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/service/impl/ProcessStandardComplianceCheckServiceImpl.java @@ -18,21 +18,27 @@ import com.jero.modules.activiti.process.fb.service.IProcessHandleService; import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO; import com.jero.modules.activiti.process.standardComplianceCheck.entity.ProcessStandardComplianceCheck; import com.jero.modules.activiti.process.standardComplianceCheck.entity.ProcessStandardComplianceCheckDetail; +import com.jero.modules.activiti.process.standardComplianceCheck.entity.vo.ModelExcelVO; import com.jero.modules.activiti.process.standardComplianceCheck.entity.vo.ProcessSccVO; import com.jero.modules.activiti.process.standardComplianceCheck.mapper.ProcessStandardComplianceCheckMapper; +import com.jero.modules.activiti.process.standardComplianceCheck.service.IProcessStandardComplianceCheckDetailService; import com.jero.modules.activiti.process.standardComplianceCheck.service.IProcessStandardComplianceCheckService; import com.jero.modules.activiti.service.ProcessAllService; import com.jero.modules.activiti.service.ProcessNodeLinkService; +import com.jero.modules.activiti.util.ExcelUtils; import com.jero.modules.sys.utils.UserUtils; import org.activiti.engine.RuntimeService; import org.activiti.engine.TaskService; import org.activiti.engine.delegate.DelegateTask; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.entity.ImportParams; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -67,6 +73,9 @@ public class ProcessStandardComplianceCheckServiceImpl extends ServiceImpl processInfoVO) { // 流程Key @@ -175,11 +184,118 @@ public class ProcessStandardComplianceCheckServiceImpl extends ServiceImpl generate(ProcessStandardComplianceCheck scc, MultipartFile file) { + public String generate(ProcessStandardComplianceCheck scc, MultipartFile modelFile, MultipartFile splitFile) throws Exception { + // 文件内容转换 + List modelExcelVOList = this.getModelExcelData(modelFile); + // 新增流程主表数据 + this.save(scc); + // 找到拆分数据 + List detailInfoList = this.getSplitData(scc, splitFile); + // 根据主表数据和车型文件生成子表数据并保存 + this.saveAllDetailData(modelExcelVOList, detailInfoList); + // 返回主键 + return scc.getId(); + } + /** + * 循环生成所有数据 + * + * @param modelExcelVOList + * @param detailInfoList + */ + private void saveAllDetailData(List modelExcelVOList, List detailInfoList) { + List result = new ArrayList<>(); + for (ProcessStandardComplianceCheckDetail detailInfo : detailInfoList) { + for (ModelExcelVO modelExcelVO : modelExcelVOList) { + ProcessStandardComplianceCheckDetail detail = new ProcessStandardComplianceCheckDetail(); + detail.setModel(modelExcelVO.getModel()); + detail.setModelState(modelExcelVO.getModelState()); + detail.setTermNumber(detailInfo.getTermNumber()); + detail.setTermTitle(detailInfo.getTermTitle()); + detail.setTermContent(detail.getTermContent()); + detail.setAuthDept(detailInfo.getAuthDept()); + detail.setCheckId(detailInfo.getCheckId()); + } + } + sccDetailService.saveBatch(result); + } + + /** + * 获取拆分数据 + * @param scc + * @param splitFile + * @return + */ + private List getSplitData(ProcessStandardComplianceCheck scc, MultipartFile splitFile) { + List result = new ArrayList<>(); + boolean newStandard = false; + if (StrUtil.isBlank(scc.getStandardId())) { + newStandard = true; + } + // 是否手动新增标准 + if (newStandard) { + // 是否上传分解单 + if (splitFile == null) { + ProcessStandardComplianceCheckDetail detail = new ProcessStandardComplianceCheckDetail(); + detail.setTermNumber(scc.getStandardNumber()); + detail.setTermTitle(scc.getStandardName()); + detail.setCheckId(scc.getId()); + result.add(detail); + } else { + // TODO 获取数据返回 + result.addAll(this.getSplitExcelData(splitFile, scc.getId())); + } + } else { + // TODO 根据标准Id获取所有拆分数据 + + } + if (result.isEmpty()) { + throw new JeroBootException("拆分单数据为空"); + } + return result; + } + + /** + * 获取分解单Excel内数据 + * @param splitFile + * @return + */ + private List getSplitExcelData(MultipartFile splitFile, String sccId) { + // TODO return null; } + private List getModelExcelData(MultipartFile file) throws Exception { + // 获取Excel的header + List headers = null; + try { + headers = ExcelUtils.getHeaderFromExcel(file.getInputStream()); + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new JeroBootException("上传模板错误,请检查后重试。"); + } + // 使用Grade的静态方法验证header + boolean isMatched = ModelExcelVO.validateExcelHeaders(headers); + if (!isMatched) { + throw new JeroBootException("上传模板错误,请检查后重试。"); + } + ImportParams params = new ImportParams(); + params.setTitleRows(1); + params.setHeadRows(1); + params.setNeedSave(true); + List modelExcelVOList = new ArrayList<>(); + try { + modelExcelVOList = ExcelImportUtil.importExcel(file.getInputStream(), ModelExcelVO.class, params); + if (modelExcelVOList.isEmpty()) { + throw new JeroBootException("文件导入失败:数据为空"); + } + } catch (Exception e) { + log.error("文件导入异常:" + e.getMessage(), e); + throw new JeroBootException("文件导入失败:" + e.getMessage()); + } + return modelExcelVOList; + } + @Override public ProcessInfoVO getHandleData(String taskId) { if (!actFlowCommonService.taskExists(taskId)) { diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/util/ExcelUtils.java b/laws-modules/src/main/java/com/jero/modules/activiti/util/ExcelUtils.java index 4710b175..16a3d681 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/util/ExcelUtils.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/util/ExcelUtils.java @@ -19,6 +19,7 @@ import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.jeecgframework.poi.excel.ExcelExportUtil; import org.jeecgframework.poi.excel.annotation.Excel; import org.jeecgframework.poi.excel.entity.ExportParams; @@ -79,6 +80,28 @@ public class ExcelUtils { return baseDate.getTime(); } + /** + * 获取HeadRow的文本内容 + * @param is 文件输入流 + * @return HeadRow的List + * @throws Exception + */ + public static List getHeaderFromExcel(InputStream is) throws Exception { + List headers = new ArrayList<>(); + + Workbook workbook = new XSSFWorkbook(is); + Sheet sheet = workbook.getSheetAt(0); + + // HeadRow在index 1 + for (int rowIndex = 1; rowIndex <= 1; rowIndex++) { + Row row = sheet.getRow(rowIndex); + for (Cell cell : row) { + headers.add(cell.getStringCellValue()); + } + } + return headers; + } + /** * 获取HeadRow的文本内容 *