package org.springblade.mdm.statreport.service; import com.baomidou.mybatisplus.core.metadata.IPage; import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.flowable.engine.HistoryService; import org.flowable.engine.RuntimeService; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.history.HistoricProcessInstanceQuery; import org.springblade.core.oss.OssTemplate; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.Func; 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.commons.contants.DictBizConstants; import org.springblade.mdm.commons.service.ParamService; import org.springblade.mdm.flow.constants.FlowContants; import org.springblade.mdm.flow.constants.FlowVariableContants; import org.springblade.mdm.flow.entity.FlowProgramFile; import org.springblade.mdm.flow.entity.TaskDispatch; import org.springblade.mdm.flow.service.ApproveInfoQueryService; import org.springblade.mdm.flow.service.FlowProgramFileService; import org.springblade.mdm.flow.service.FlowProgramProperties; import org.springblade.mdm.flow.service.TaskDispatchService; import org.springblade.mdm.flow.vo.ApproveTableInfo; import org.springblade.mdm.flow.vo.FlowVO; import org.springblade.mdm.program.entity.NcNode; import org.springblade.mdm.program.service.NcNodeService; import org.springblade.mdm.statreport.utils.WordReplaceUtil; import org.springblade.system.feign.IDictBizClient; import org.springframework.stereotype.Service; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.time.LocalDateTime; import java.util.*; /** * 流程业务实现类 * * @author Chill */ @Service @AllArgsConstructor public class ConfirmTablePrintService { private final RuntimeService runtimeService; private final IDictBizClient dictBizClient; private final HistoryService historyService; private final FlowProgramFileService flowProgramFileService; private ApproveInfoQueryService approveInfoQueryService; private final MachineService machineService; private final NcNodeService nodeService; private final ParamService paramService; private final TaskDispatchService taskDispatchService; private final OssTemplate ossTemplate; private final QinzheFgbService qinzheFgbService; private static final String DATE_PATTERN = "yyyy-M-d"; /** * 导出word岸本 * @param dispatch 任务分派 * @param props 流程属性 */ public ByteArrayOutputStream exportConfirmTableDoc(FlowProgramProperties props) throws IOException { ByteArrayOutputStream os= new ByteArrayOutputStream(); String tplOssName = paramService.confirmTableTemplateOssFileName(); try(InputStream tplInputStream = ossTemplate.statFileStream(tplOssName);) { WordReplaceUtil.convert(getData( props), tplInputStream, os); } return os; } /** * 获取填充数据 */ Map getData(FlowProgramProperties props) { ApproveTableInfo approveInfo = approveInfoQueryService.getApproveInfo(props); Machine machine; String machineCode = props.getMachineCode(); machine = machineService.getByCode(machineCode); Map dataMap = new HashMap<>(); NcNode node = this.nodeService.getById(props.getNodeId()); TaskDispatch dispatch = taskDispatchService.getByProgramNo(node.getProgramNo()); if(dispatch == null){ //防止老数据报错 dispatch = new TaskDispatch(); } dataMap.put("bh",props.getProgramNo());//编号,就是数控程序编号 dataMap.put("drawingNo", props.getDrawingNo()); dataMap.put("processNo", props.getProcessNo()); dataMap.put("craftEdition", props.getCraftEdition()); dataMap.put("processEdition", props.getProcessEdition()); dataMap.put("machineMode", machine.getName()); dataMap.put("drawingEdition", props.getDrawingNoEdition());//word内不能跟drawingNo有相同字符 QinzheFgb qzfgb = qinzheFgbService.getByLjh(props.getDrawingNo()); dataMap.put("drawingName",qzfgb.getLjmc()); dataMap.put("productModel", props.getProductModel()); //页数,页号 dataMap.put("tp", "1"); dataMap.put("pg", "1"); dataMap.put("processName", dispatch.getProcessName()); dataMap.put("processCard", dispatch.getProcessCard()); String ctlSystem = ""; R ctmR = dictBizClient.getValue(DictBizConstants.CONTROL_SYSTEM, machine.getControlSystem()); if (ctmR.isSuccess()) { ctlSystem = ctmR.getData(); } dataMap.put("deviation", props.getDeviation() == null ? "" : props.getDeviation()); dataMap.put("controlSystem", ctlSystem); if (StringUtils.isNotBlank(dispatch.getOperator())){ dataMap.put("czz", dispatch.getOperator()+"/"+formatTimeForTable(dispatch.getOperateTime()));//操作员,时间 }else{ dataMap.put("czz", ""); } dataMap.put("programNo",props.getProgramNo()); if(StringUtils.isNotBlank(dispatch.getInspector())) { dataMap.put("jyy",dispatch.getInspector()+"/"+formatTimeForTable(dispatch.getCheckTime()));//实际检验员和检验时间 //有检验员,即 符合该工序工艺卡片尺寸特性要求 dataMap.put("fuhey", WordReplaceUtil.CHECKED); dataMap.put("fuhen", WordReplaceUtil.UNCHECKED); dataMap.put("jly",WordReplaceUtil.CHECKED); dataMap.put("jln",WordReplaceUtil.UNCHECKED); }else { dataMap.put("jyy",""); //填充空检验员 dataMap.put("fuhey", WordReplaceUtil.UNCHECKED); dataMap.put("fuhen", WordReplaceUtil.CHECKED); dataMap.put("jly",WordReplaceUtil.UNCHECKED); dataMap.put("jln",WordReplaceUtil.CHECKED); } dataMap.put("bianzhi",approveInfo.getProgrammerName()+"/"+formatTimeForTable(approveInfo.getProgrammingDate()));//编程人员 //approveInfo.getDispatchDate() dataMap.put("jiaodui",approveInfo.getTeamLeaderName()+"/"+formatTimeForTable(approveInfo.getCheckDate()));//校对:专业组长 dataMap.put("shenhe",approveInfo.getSeniorName()+"/"+formatTimeForTable(approveInfo.getApproveDate())); dataMap.put("sendPath",machine.getProgSendDir()!=null?machine.getProgSendDir():""); return dataMap; } /** * 已完结的流程分页列表 * @param page 分页信息 * @param createTimeBegin * @param createTimeEnd * @param keyword 关键字 * @return */ public IPage confirmTablePage(IPage page, String drawingNo, String keyword,LocalDateTime createTimeBegin, LocalDateTime createTimeEnd) { //固化里路村官 HistoricProcessInstanceQuery query = this.historyService.createHistoricProcessInstanceQuery().finished().processDefinitionKey(FlowContants.CURE_PROCESS_KEY).includeProcessVariables(); //.finished() // 只查询已完成的流程.unfinished() // 查询未完成的流程 query.variableNotExists(FlowVariableContants.EXCEPTION);//非异常流程 if(createTimeBegin!=null) { query.startedAfter(DateUtil.toDate(createTimeBegin)); } if(createTimeEnd!=null) { query.startedBefore(DateUtil.toDate(createTimeEnd)); } if(Func.isNotEmpty(drawingNo)) { String likeVal = "%" + drawingNo + "%"; query.variableValueLike(FlowVariableContants.DRAWING_NO,likeVal); } query.orderByProcessInstanceEndTime().desc(); // 按结束时间降序排列 page.setTotal(query.count()); long firstResult = (page.getCurrent()-1) * page.getSize(); List processes = query .listPage((int)firstResult, (int)page.getSize()); List records = new LinkedList<>(); for(HistoricProcessInstance processInstance : processes) { FlowVO vo = new FlowVO(); vo.setProcessDefinitionKey(processInstance.getProcessDefinitionKey()); vo.setProcessInstanceId(processInstance.getId()); vo.setProcessDefinitionName(processInstance.getProcessDefinitionName()); vo.setVariables(processInstance.getProcessVariables()); vo.setProcessCreateTime(processInstance.getStartTime()); vo.setHistoryTaskEndTime(processInstance.getEndTime()); //vo.setFile(getFileString(processInstance.getId())); records.add(vo); } page.setRecords(records); return page; } String formatTimeForTable(Date date){ if(date==null){ return ""; } return DateUtil.format(date, DATE_PATTERN); } /** 获取列表中的文件名 */ String getFileString(String processInstanceId){ String result = ""; List fileList = flowProgramFileService.lambdaQuery().eq(FlowProgramFile::getProcessInstanceId, processInstanceId).list(); result = String.join(",",fileList.stream().map(FlowProgramFile::getName).toList()); return result; } }