package org.springblade.mdm.flow.service; import com.alibaba.excel.EasyExcel; import jodd.util.StringUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.StringUtils; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.oss.OssTemplate; import org.springblade.core.oss.model.BladeFile; import org.springblade.mdm.basesetting.machine.entity.Machine; import org.springblade.mdm.basesetting.machine.service.MachineService; import org.springblade.mdm.basesetting.producedivision.entity.QinzheFgb; import org.springblade.mdm.basesetting.producedivision.service.QinzheFgbService; import org.springblade.mdm.flow.entity.TaskDispatch; import org.springblade.mdm.flow.excel.TaskAssignExcel; import org.springblade.mdm.flow.excel.TaskAssignImpResultExcel; import org.springblade.mdm.flow.excution.StartDispatcher; import org.springblade.mdm.flow.vo.FlowStartResult; import org.springblade.mdm.flow.vo.TaskAssignVO; import org.springblade.mdm.program.service.NcNodeService; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; /** * 固化流程服务 */ @Slf4j @Service public class TaskImportService { @Autowired private OssTemplate ossTemplate; @Autowired private QinzheFgbService qinzheFgbService; @Autowired private MachineService machineService; @Autowired private TaskDispatchService taskDispatchService; @Autowired private StartDispatcher dispatcher; /** * 启动固化流程 */ public BladeFile importTask(List importTaskList,String oriFilename) throws IOException { List resultExcelList = new ArrayList<>(); for(TaskAssignExcel taskAssignExcel:importTaskList){ resultExcelList.add(importOne(taskAssignExcel)); } Path resultPath = writeResultFile(resultExcelList); BladeFile bfile; try(InputStream ins = Files.newInputStream(resultPath);){ String baseName = FilenameUtils.getBaseName(oriFilename); String ext = FilenameUtils.getExtension(oriFilename); String filename = baseName+"-导入结果" + (StringUtils.isNotBlank(ext)?"."+ext:""); bfile = ossTemplate.putFile(filename,ins); } return bfile; } /** * 处理单条数据 * @param excelInput excel的一行数据 */ TaskAssignImpResultExcel importOne(TaskAssignExcel excelInput){ TaskAssignImpResultExcel impResult = checkData(excelInput); if(StringUtils.isNotBlank(impResult.getErrorMsg())){ impResult.setErrorMsg(impResult.getErrorMsg()); return impResult; } TaskAssignVO startVO = new TaskAssignVO(); BeanUtils.copyProperties(impResult,startVO); startVO.setTitle(NcNodeService.genProgramName(startVO.getDrawingNo(),startVO.getProcessNo(),startVO.getProcessEdition())+"-计划任务"); try { boolean isDuplicate = taskDispatchService.checkIsDuplicate(startVO); TaskDispatch dispatch = taskDispatchService.saveTask(startVO,isDuplicate); startVO.setCreateUser(dispatch.getCreateUser()); if(isDuplicate){ impResult.setErrorMsg("重复派工"); }else { try { FlowStartResult result = dispatcher.start(startVO); dispatch.setStatus(TaskDispatch.STATUS_STARTED); dispatch.setProcessInstanceId(result.getProcessInstanceId()); dispatch.setProgramNo(result.getProgramNo()); taskDispatchService.updateById(dispatch); impResult.setErrorMsg("导入成功"); } catch (Exception e) { log.error("导入任务start失败,零组件号:{}", excelInput.getDrawingNo(), e); dispatch.setStatus(TaskDispatch.STATUS_EXCEPTION); dispatch.setErrMsg(e.getMessage()); taskDispatchService.updateById(dispatch); impResult.setErrorMsg(e.getMessage()); } } }catch(Exception e){ log.error("导入失败,零组件号:{}",impResult.getDrawingNo(),e); impResult.setErrorMsg(e.getMessage()); } return impResult; } /** * 检查数据 * @param excelLine 一行excel数据 */ TaskAssignImpResultExcel checkData(TaskAssignExcel excelLine){ TaskAssignImpResultExcel resultExcel= new TaskAssignImpResultExcel(); BeanUtils.copyProperties(excelLine,resultExcel); //为空的数据检查 List errors = new ArrayList<>(); if(StringUtil.isBlank(excelLine.getDrawingNo())){ errors.add("零组件号为空"); } if(StringUtil.isBlank(excelLine.getProcessNo())){ errors.add("工序号为空"); } if(StringUtil.isBlank(excelLine.getProcessEdition())){ errors.add("工序版次为空"); } if(StringUtil.isBlank(excelLine.getProcessName())){ errors.add("工序名称为空"); } if(StringUtil.isBlank(excelLine.getMachineCode())){ errors.add("机床编号为空"); } if(!errors.isEmpty()){ resultExcel.setErrorMsg(StringUtils.joinWith(",",errors)); return resultExcel; } try { //ProduceDivision div = produceDivisionService.getByDrawingNoWithQinzhe(excelLine.getDrawingNo()); QinzheFgb fgb = qinzheFgbService.getByLjh(excelLine.getDrawingNo()); if(fgb == null){ errors.add("零组件号不存在"); }else{ resultExcel.setProductModel(fgb.getCph()); } }catch(ServiceException se){ errors.add(se.getMessage()); } Machine machine = machineService.getByCode(excelLine.getMachineCode()); if(machine == null){ errors.add("机床编号不存在"); }else{ resultExcel.setMachineMode(machine.getName()); } if(!errors.isEmpty()) { resultExcel.setErrorMsg(StringUtils.joinWith(",", errors)); } return resultExcel; } /** * 将导入结果写入临时文件 * @param importTaskList 导入任务列表 * @return 文件路径 * @throws IOException 写入文件可能倒是io异常 */ Path writeResultFile(List importTaskList) throws IOException { Path tempFilePath = Files.createTempFile("impresult",".xlsx"); String fileName = tempFilePath.toString(); EasyExcel.write(fileName, TaskAssignImpResultExcel.class).sheet("导入结果").doWrite(importTaskList); return tempFilePath; } }