package org.springblade.mdm.flow.service; import com.itextpdf.text.*; import com.itextpdf.text.pdf.*; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.flowable.engine.HistoryService; import org.flowable.task.api.history.HistoricTaskInstance; import org.springblade.core.oss.OssTemplate; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.DateUtil; import org.springblade.mdm.basesetting.machine.MachineService; import org.springblade.mdm.basesetting.machine.entity.Machine; 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.vo.ApproveTableInfo; import org.springblade.mdm.program.entity.NcNode; import org.springblade.mdm.program.entity.NcProgramApproved; import org.springblade.mdm.program.service.NcNodeService; import org.springblade.mdm.program.service.NcProgramApprovedService; import org.springblade.system.feign.IDictBizClient; import org.springblade.system.feign.IUserClient; import org.springblade.system.pojo.entity.DictBiz; import org.springblade.system.pojo.entity.User; import org.springblade.system.pojo.entity.UserInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.*; import java.util.*; import java.util.List; /** * 数控程序确认表输出服务 * * @author yangys */ @Slf4j @Service public class ProgramConfirmTableService { @Autowired private QinzheFgbService qinzheFgbService; @Autowired private IDictBizClient dictBizClient; @Autowired private NcNodeService ncNodeService; @Autowired private MachineService machineService; @Autowired private OssTemplate ossTemplate; @Autowired private IUserClient userClient; @Autowired private ParamService paramService; public void exportConfirmTable(FlowProgramProperties props, OutputStream os) throws IOException, DocumentException { byte[] tplBytes = getTemplateBytes(); generateTempPDF(tplBytes,props,os); } void generateTempPDF(byte[] bytes,FlowProgramProperties props,OutputStream outputStream) throws DocumentException, IOException { PdfReader reader = null; PdfStamper pdfStamper = null; reader = new PdfReader(bytes); pdfStamper = new PdfStamper(reader, outputStream); // 使用中文字体 BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); ArrayList fontList = new ArrayList<>(); fontList.add(bf); AcroFields fields = pdfStamper.getAcroFields(); fields.setSubstitutionFonts(fontList); fillData(fields, getData(props));//染 //必须要调用这个,否则文档不会生成的 pdfStamper.setFormFlattening(true); pdfStamper.close(); } void fillData(AcroFields fields, Map data) throws DocumentException, IOException { for (String key : data.keySet()) { String value = data.get(key); // 为字段赋值,注意字段名称是区分大小写的fields.setField(key,value); fields.setField(key,value,true); //form.setFieldProperty("fieldName", "clrflags", PdfAnnotation.FLAGS_HIDDEN, null); //fields.setFieldRichValue() } } /** * 获取模板字节数组 * @return */ private byte[] getTemplateBytes() throws IOException { String tplOssName = paramService.confirmTableTemplateOssFileName(); try (InputStream inputStream = this.ossTemplate.statFileStream(tplOssName)) { return inputStream.readAllBytes(); } } /** * 获取打印表格的数据 * @param props 流程属性 * @return 数据map */ Map getData(FlowProgramProperties props){ Map data = new HashMap<>(); data.put("pageTotal","1"); data.put("pageNo","1"); data.put("processNo",props.getProcessNo()); data.put("drawingNo",props.getDrawingNo()); data.put("drawingNoEdition",props.getDrawingNoEdition()); data.put("processName",props.getProcessName()); data.put("processEdition",props.getProcessEdition()); data.put("machineCode",props.getMachineCode()); data.put("productModel",props.getProductModel()); data.put("craftEdition",props.getCraftEdition()); //零组件名称 data.put("drawingName",getDrawingName(props.getDrawingNo())); data.put("deviation",props.getDeviation()); data.put("programNo",queryProgramNo(props.getNodeId())); data.put("fuheY","Y"); data.put("keyongY","Y"); Machine machine = this.machineService.getByCode(props.getMachineCode()); data.put("machineMode",machine.getName()); R dictSystemResult = dictBizClient.getValue(DictBizConstants.CONTROL_SYSTEM,machine.getControlSystem()); if(dictSystemResult.isSuccess()){ data.put("controlSystem",dictSystemResult.getData()); } data.put("operator","不明确/2025-1-1"); data.put("jjy","不明确/2025-1-1"); data.put("programmerName",getNameByUserId(props.getProgrammerId())); data.put("checkerName",getNameByUserId(props.getCheckerId())); data.put("seniorName",getNameByUserId(props.getSeniorId())); return data; } /** * 查询程序编号 * @param nodeId * @return */ private String queryProgramNo(Long nodeId) { if(nodeId ==null) { return StringUtils.EMPTY; } NcNode programPkdNode = this.ncNodeService.getById(nodeId); if (programPkdNode != null) { return programPkdNode.getProgramNo(); }else{ return StringUtils.EMPTY; } } /** * 获取零组件名称 * @param drawingNo 零件编号 * @return 零组件名称 */ String getDrawingName(String drawingNo){ QinzheFgb fgb = qinzheFgbService.getByLjh(drawingNo); if(fgb!= null){ return fgb.getLjmc(); }else{ return StringUtils.EMPTY; } } String getNameByUserId(Long userId){ if(userId == null){ return StringUtils.EMPTY; } String name = StringUtils.EMPTY; R useInfoResult = userClient.userInfoById(userId); if(useInfoResult.isSuccess()){ name = useInfoResult.getData().getName(); } return name; } }