From 4187bc6d6f6595958cac264eb49455bf4d716800 Mon Sep 17 00:00:00 2001
From: yangys <y_ys79@sina.com>
Date: 星期五, 29 八月 2025 22:36:05 +0800
Subject: [PATCH] 加入确认表导出

---
 doc/mdm/qrb.docx                                                                                           |    0 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/contants/DictBizConstants.java           |   10 +
 doc/sql/mdm/mdm.mysql.all.create.sql                                                                       |   22 ++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/ParamService.java                |    6 
 doc/mdm/confirtabletpl.pdf                                                                                 |    0 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowMgrController.java           |    3 
 blade-service/blade-mdm/src/test/java/org/springblade/mdm/flow/service/ProgramConfirmTableServiceTest.java |   18 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ProgramConfirmTableService.java     |  379 +++++++++++-----------------------------------
 8 files changed, 142 insertions(+), 296 deletions(-)

diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/contants/DictBizConstants.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/contants/DictBizConstants.java
new file mode 100644
index 0000000..4862e00
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/contants/DictBizConstants.java
@@ -0,0 +1,10 @@
+package org.springblade.mdm.commons.contants;
+
+public class DictBizConstants {
+	/**
+	 * 鎺у埗绯荤粺瀛楀吀key
+	 */
+	public static final String CONTROL_SYSTEM = "machine_control_system";
+
+
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/ParamService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/ParamService.java
index 48e96d3..a9dbfce 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/ParamService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/ParamService.java
@@ -48,6 +48,8 @@
 	 * 榛樿娑夊瘑缃�
 	 */
 	public static String NETWORK_TYPE_SHEMI= "0";
+
+	public static String CONFIRM_TABLE_TEMPLATE= "confirmTableTemplate";
 	private final ISysClient sysClient;
 
 	public String getParamValue(String paramKey,String defaultValue){
@@ -92,4 +94,8 @@
 			TASK_EXPIRE_DAYS,"30");
 	}
 
+    public String confirmTableTemplateOssFileName() {
+		return getParamValue(
+			CONFIRM_TABLE_TEMPLATE,"");
+    }
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowMgrController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowMgrController.java
index ae9ad8b..c729b8e 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowMgrController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowMgrController.java
@@ -195,11 +195,10 @@
 		try {
 			FlowProgramProperties props = flowCommonService.getProgramPropertiesFromHis(processInstanceId);
 			String progName = props.getDrawingNo()+"-"+props.getProcessNo()+"-"+props.getProcessEdition();
-			//String filename = URLEncoder.encode("鏁版帶绋嬪簭缂栧埗瀹℃壒鍗�", StandardCharsets.UTF_8)+ DateUtil.format(DateUtil.now(), "yyyyMMddHHmm")+".pdf";
 			String filename = UrlUtil.encode("鏁版帶绋嬪簭纭琛�"+progName)+".pdf";
 			response.setHeader("Content-Disposition", "attachment; filename="+filename);
 			response.setContentType("application/octet-stream");
-			programConfirmTableService.exportConfirmTable(processInstanceId,response.getOutputStream());
+			programConfirmTableService.exportConfirmTable(props,response.getOutputStream());
 		} catch (Exception e) {
 			log.error("瀵煎嚭鏁版帶绋嬪簭纭琛╬df寮傚父", e);
 			throw new RuntimeException(e);
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ProgramConfirmTableService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ProgramConfirmTableService.java
index 5d5b936..8dbb37f 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ProgramConfirmTableService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ProgramConfirmTableService.java
@@ -7,25 +7,28 @@
 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.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.ByteArrayOutputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
+import java.io.*;
 import java.util.*;
 import java.util.List;
 
@@ -40,315 +43,119 @@
 	@Autowired
 	private FlowCommonService flowCommonService;
 	@Autowired
+	private IDictBizClient dictBizClient;
+	@Autowired
 	private NcNodeService ncNodeService;
 	@Autowired
 	private MachineService machineService;
 	@Autowired
-	private HistoryService historyService;
+	private OssTemplate ossTemplate;
 	@Autowired
-	private IUserClient useClient;
+	private IUserClient userClient;
 	@Autowired
-	private NcProgramApprovedService programApprovedService;
-	private static final String UNCHECK_BOX = "鈽�";
-	private static final String CHECKED_BOX = "鈽�";
-	static Chunk square = new Chunk("o", new Font(Font.FontFamily.ZAPFDINGBATS, 12)); // 绌烘柟妗�
-	static Chunk check = new Chunk("4", new Font(Font.FontFamily.ZAPFDINGBATS, 12)); // 甯﹀嬀鏂规
+	private ParamService paramService;
 
-	BaseFont getBaseFont() throws DocumentException, IOException {
-		return BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
+	public void exportConfirmTable(FlowProgramProperties props, OutputStream os) throws IOException, DocumentException {
+
+		byte[] tplBytes = getTemplateBytes();
+		generateTempPDF(tplBytes,props,os);
 	}
 
-	Font getChineseFont() throws DocumentException, IOException {
-		BaseFont bfChinese = getBaseFont();
-		return new Font(bfChinese, 12, Font.NORMAL);
-	}
-	public void generateTempPDF()throws Exception {
+	void generateTempPDF(byte[] bytes,FlowProgramProperties props,OutputStream outputStream) throws DocumentException, IOException {
 		PdfReader reader = null;
-		PdfStamper ps = null;
-		OutputStream fos = null;
-		ByteArrayOutputStream bos = null;
-		try {
-			String fileName = "d:/qrb.pdf";//妯℃澘缁濆璺緞
-			reader = new PdfReader(fileName);
-			bos = new ByteArrayOutputStream();
-			ps = new PdfStamper(reader, bos);
-			// 浣跨敤涓枃瀛椾綋
-			//BaseFont bf = BaseFont.createFont("sTsong-Light", "uniGB-Ucs2-H", BaseFont.NOT_EMBEDDED);
-			BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
-			ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();
-			fontList.add(bf);
-			AcroFields fields = ps.getAcroFields();
-			fields.setSubstitutionFonts(fontList);
-			fillData(fields, data());//鏌�
-			//蹇呴』瑕佽皟鐢ㄨ繖涓紝鍚﹀垯鏂囨。涓嶄細鐢熸垚鐨�
-			ps.setFormFlattening(true);
-			if (ps != null) {
-				ps.close();
-			}
+		PdfStamper pdfStamper = null;
 
-			//鐢熸垚pdf璺緞瀛樻斁鐨勮矾寰�
-			fos = new FileOutputStream("d:/bb2.pdf");
-			fos.write(bos.toByteArray());
-		} catch (Exception e) {
-			e.printStackTrace();
-		} finally {
-			if (fos != null) {
-				fos.flush();
-				fos.close();
-				if (bos != null) {
-					bos.close();
-				}
-				if (reader != null) {
-					reader.close();
-				}
-			}
+		reader = new PdfReader(bytes);
+		pdfStamper =  new PdfStamper(reader, outputStream);
+		// 浣跨敤涓枃瀛椾綋
+		BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
+		ArrayList<BaseFont> 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<String, String> data) throws DocumentException, IOException {
+
+		for (String key : data.keySet()) {
+			String value = data.get(key);
+			// 涓哄瓧娈佃祴鍊�,娉ㄦ剰瀛楁鍚嶇О鏄尯鍒嗗ぇ灏忓啓鐨刦ields.setField(key,value);
+			fields.setField(key,value,true);
+
+			//form.setFieldProperty("fieldName", "clrflags", PdfAnnotation.FLAGS_HIDDEN, null);
+			//fields.setFieldRichValue()
 		}
-	}
 
-	public void fillData(AcroFields fields, Map<String, String> data) {
-		try {
-			for (String key : data.keySet()) {
-				String value = data.get(key);
-				// 涓哄瓧娈佃祴鍊�,娉ㄦ剰瀛楁鍚嶇О鏄尯鍒嗗ぇ灏忓啓鐨刦ields.setField(key,value);
-				fields.setField(key,value);
-			}
-		}catch(Exception e){
-			e.printStackTrace();
-
-		}
-	}
-	Map<String,String> data(){
-		Map<String,String> ret = new HashMap<>();
-		ret.put("drawingName","涓枃鍥惧悕");
-
-		ret.put("craftEdition","TH0001");
-		return ret;
-	}
-	public void exportConfirmTable(String processInstanceId, OutputStream os) throws DocumentException, IOException {
-
-		BaseFont bfChinese = getBaseFont();
-
-		Document document = new Document(PageSize.B5.rotate());
-		PdfWriter.getInstance(document, os);
-
-		document.open();
-
-		FlowProgramProperties props = flowCommonService.getProgramPropertiesFromHis(processInstanceId);
-
-		ApproveTableInfo appInfo = getApproveInfo(props);
-		Machine machine;
-		String machineCode = props.getMachineCode();
-		machine = machineService.getByCode(machineCode);
-
-		int flag = props.getProcessDefinitionKey().equals(FlowContants.TRY_PROCESS_KEY)?1:2;
-		printPage(document, bfChinese, props, machine);
-		//document.newPage();
-
-
-		//printPage(document, bfChinese, props, machine, 2, appInfo);
-
-		document.close();
 	}
 
 
 
-	void printPage(Document document, BaseFont bfChinese, FlowProgramProperties props, Machine machine) throws DocumentException, IOException {
-
-		Font tableFont = new Font(bfChinese, 12, Font.NORMAL);
-
-
-		PdfPTable titleTable = new PdfPTable(2);
-		titleTable.setWidthPercentage(100);
-		titleTable.setSpacingBefore(10f);
-		titleTable.setSpacingAfter(10f);
-
-		PdfPCell celBh = this.getCell("缂栧彿:",tableFont);
-		titleTable.addCell(celBh);
-		PdfPCell celYb = this.getCell("鑹鸿〃8",tableFont);
-
-		titleTable.addCell(celYb);
-
-		document.add(titleTable);
-
-
-		//document.add(title);
-		// 鍒涘缓琛ㄦ牸锛�4鍒楋級
-		PdfPTable table = new PdfPTable(6);
-		table.setWidths(new float[]{1, 1.3f, 1f, 1.3f,1, 1.5f});
-
-		Font ft = this.getChineseFont();
-		// 娣诲姞琛ㄥご
-		PdfPCell tempCell = getCell("涓�涓�鍥涘巶",tableFont);
-
-		//
-		table.addCell(tempCell);
-
-		tempCell = getCell("鏁版帶绋嬪簭纭琛�",tableFont);
-		table.addCell(tempCell);
-		table.addCell(getCell("宸ュ簭鍙�", ft));
-		table.addCell(getCell("宸ヨ壓鐗堟", ft));
-		table.addCell(getCell("鏈哄簥鍨嬪彿", ft));
-		table.addCell(getCell("宸ユ璐熻矗浜�/鍗曞厓璐焅n璐d汉娲惧嚭鏃堕棿", ft));
-
-
-		table.addCell(getCell(props.getDrawingNo(), ft));//闆剁粍浠跺彿
-
-		table.addCell(getCell(props.getProcessNo(), ft));//宸ュ簭鍙�
-
-		table.addCell(getCell(props.getCraftEdition(), ft));//宸ヨ壓鐗堟
-		table.addCell(getCell(machine.getName(), ft));//鏈哄簥鍨嬪彿
-		table.addCell(getCell("", ft));//璐熻矗浜猴紝宸ユ璐熻矗浜烘淳鍑烘椂闂�
-
-		//涓棿澶ф牸
-		PdfPCell cell = new PdfPCell();
-		cell.setColspan(5);
-		cell.setCalculatedHeight(400);
-		Paragraph mainPara1 = new Paragraph();
-		mainPara1.setLeading(30f, 0f);
-		mainPara1.setFont(ft);
-		mainPara1.setAlignment(Element.ALIGN_LEFT); // 瀵归綈鏂瑰紡
-		mainPara1.setIndentationLeft(20); // 宸︾缉杩�(鍍忕礌)
-		mainPara1.setIndentationRight(20); // 鍙崇缉杩�
-		mainPara1.setSpacingBefore(10); // 娈靛墠闂磋窛
-		mainPara1.setSpacingAfter(10); // 娈靛悗闂磋窛
-
-
-		mainPara1.add("鏁版帶绋嬪簭缂栧埗浠诲姟瀹夋帓:\n");
-		cell.addElement(mainPara1);
-
-		Paragraph line2Para = new Paragraph();
-		line2Para.setLeading(30f, 0f);
-		line2Para.setFont(ft);
-		line2Para.setAlignment(Element.ALIGN_LEFT); // 瀵归綈鏂瑰紡
-		line2Para.setIndentationLeft(40); // 宸︾缉杩�(鍍忕礌)
-		line2Para.add("璇�");
-
-		Font underLineFt = new Font(bfChinese, 12, Font.UNDERLINE);
-
-		//String personName = record.getUserNickname();
-		Chunk block1 = square;
-		Chunk block2 = check;
-
-		cell.addElement(line2Para);
-
-		Paragraph fangzhen = new Paragraph();
-		fangzhen.setAlignment(Element.ALIGN_LEFT); // 瀵归綈鏂瑰紡
-		fangzhen.setIndentationLeft(20); // 宸︾缉杩�(鍍忕礌)
-		fangzhen.setIndentationRight(20); // 鍙崇缉杩�
-		fangzhen.setSpacingBefore(10); // 娈靛墠闂磋窛
-		fangzhen.setSpacingAfter(10); // 娈靛悗闂磋窛
-		fangzhen.setFont(ft);
-		fangzhen.setLeading(30f, 0f);
-		fangzhen.add("鏄惁闇�瑕佷豢鐪燂紙鏄�");
-		fangzhen.add(check);//鍥哄畾鏄豢鐪�
-		fangzhen.add(" 鍚�");
-		fangzhen.add(square);
-		fangzhen.add("锛塡n\n");
-
-		cell.addElement(fangzhen);
-		table.addCell(cell);
-		//涓嬩竴琛�
-		PdfPCell cell21 = getCell("鏁版帶绋嬪簭缂栧彿", ft);// PdfPCell();
-		cell21.setColspan(2);
-		//cell21.setPhrase(new Phrase("鏁版帶绋嬪簭缂栧彿",ft));
-		table.addCell(cell21);
-		table.addCell(getCell("缂栧埗/鏃ユ湡", ft));
-		table.addCell(getCell("鏍″/鏃ユ湡", ft));
-		table.addCell(getCell("鎵瑰噯/鏃ユ湡", ft));
-
-		PdfPCell cell2 = getCell("00001", ft);
-		cell2.setColspan(2);
-
-		//cell2.addElement(new Phrase(programPackageNode.getProgramNo(),ft));//鏁版帶绋嬪簭缂栧彿
-		//cell2.addElement(new Phrase("00001",ft));
-		table.addCell(cell2);
-
-		// 璁剧疆琛ㄦ牸瀹藉害鍗犻〉闈㈠搴︾殑100%
-		table.setWidthPercentage(100);
-
-		// 娣诲姞琛ㄦ牸鍒版枃妗�
-		document.add(table);
-
-		Phrase lastPhrase = new Phrase("娉�:宸ユ娲惧伐搴旈鍏堣鍒掋�佸悎鐞嗗畨鎺掓暟鎺х▼搴忕紪鍒躲�傜珛鍔犮�佹暟閾c�佹暟杞︾瓑鍗曢亾宸ュ簭绋嬪簭(涓よ酱绋嬪簭)闇�鎻愬墠1涓伐浣滄棩锛屽崸寮忓姞宸ヤ腑蹇冨崟閬撳伐搴�(鍚杞寸▼搴�)闇�鎻愬墠3涓伐浣滄棩銆� ", ft);
-		document.add(lastPhrase);
+	/**
+	 * 鑾峰彇妯℃澘瀛楄妭鏁扮粍
+	 * @return
+	 */
+	private byte[] getTemplateBytes() throws IOException {
+		String tplOssName = paramService.confirmTableTemplateOssFileName();
+		try (InputStream inputStream = this.ossTemplate.statFileStream(tplOssName)) {
+			return inputStream.readAllBytes();
+		}
 	}
 
-	PdfPCell getCell(String text, Font font) throws DocumentException, IOException {
-		PdfPCell cell = new PdfPCell();
-		cell.setPadding(10);
-		cell.setHorizontalAlignment(Element.ALIGN_CENTER);
-		cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
-		if (StringUtils.isNotBlank(text)) {
-			Phrase p = new Phrase(text, font);
-			p.setLeading(25);
-			cell.setPhrase(p);
+	/**
+	 * 鑾峰彇鎵撳嵃琛ㄦ牸鐨勬暟鎹�
+	 * @param props 娴佺▼灞炴��
+	 * @return 鏁版嵁map
+	 */
+	Map<String,String> getData(FlowProgramProperties props){
+		Map<String,String> 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("fuheY","Y");
+		data.put("keyongY","Y");
+		Machine machine = this.machineService.getByCode(props.getMachineCode());
+		data.put("machineMode",machine.getName());
+		R<String> dictSystemResult = dictBizClient.getValue(DictBizConstants.CONTROL_SYSTEM,machine.getControlSystem());
+		if(dictSystemResult.isSuccess()){
+			data.put("controlSystem",dictSystemResult.getData());
 		}
 
-		return cell;
+		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;
 	}
 
-	ApproveTableInfo getApproveInfo(FlowProgramProperties props){
-		//缂栧埗
-		R<User> leaderR = useClient.userInfoById(props.getTeamLeaderId());
-		String leaderName = "";
-		if (leaderR.isSuccess()) {
-			leaderName = leaderR.getData().getName();
-		}
-		//缂栧埗
-		R<User> programmerR = useClient.userInfoById(props.getProgrammerId());
-		String programmerName = "";
-		if (programmerR.isSuccess()) {
-			programmerName = programmerR.getData().getName();
-		}
-		Machine machine;
-		String machineCode = props.getMachineCode();
-		machine = machineService.getByCode(machineCode);
 
-		//鏍″
-		R<User> checkerR = useClient.userInfoById(props.getCheckerId());
-		String checkerName = "";
-		if (checkerR.isSuccess()) {
-			checkerName = checkerR.getData().getName();
-		}
-		//瀹℃牳
-		R<User> seniorR = useClient.userInfoById(props.getCheckerId());
-		String senioirName = "";
-		if (seniorR.isSuccess()) {
-			senioirName = seniorR.getData().getName();
-		}
-		ApproveTableInfo appInfo = new ApproveTableInfo();
-		appInfo.setTeamLeaderName(leaderName);
-		appInfo.setProgrammerName(programmerName);
-		appInfo.setCheckerName(checkerName);
-		appInfo.setSeniorName(senioirName);
-
-		//鑾峰彇鏃堕棿淇℃伅
-		List<HistoricTaskInstance> hisTasks = historyService.createHistoricTaskInstanceQuery()
-			.processInstanceId(props.getProcessInstanceId()).orderByTaskCreateTime().desc().list();
-
-		for(HistoricTaskInstance task : hisTasks){
-			if(appInfo.getProgrammingDate()== null && task.getTaskDefinitionKey().contains("program")){
-				appInfo.setProgrammingDate(task.getEndTime());
-			}
-
-			if(appInfo.getCheckDate()== null && task.getTaskDefinitionKey().contains("check")){
-				appInfo.setCheckDate(task.getEndTime());
-			}
-
-			if(appInfo.getApproveDate()== null && task.getTaskDefinitionKey().contains("approve")){
-				appInfo.setApproveDate(task.getEndTime());
-			}
+	String getNameByUserId(Long userId){
+		if(userId == null){
+			return StringUtils.EMPTY;
 		}
 
-		//鏌ヨ鏁版帶绋嬪簭缂栧彿
-		Optional<NcProgramApproved> appOpt = programApprovedService.lambdaQuery().eq(NcProgramApproved::getProcessInstanceId, props.getProcessInstanceId()).oneOpt();
-		if(appOpt.isEmpty()){
-			appInfo.setProgramNo("锛堟湭鐢熸垚锛�");
-		}else{
-			NcNode programPkgNameNode = this.ncNodeService.getById(appOpt.get().getNcNodeId());
-			appInfo.setProgramNo(programPkgNameNode.getProgramNo());
+		String name = StringUtils.EMPTY;
+		R<User> useInfoResult =  userClient.userInfoById(userId);
+		if(useInfoResult.isSuccess()){
+			name = useInfoResult.getData().getName();
 		}
-		return appInfo;
+
+		return name;
 	}
 
 }
diff --git a/blade-service/blade-mdm/src/test/java/org/springblade/mdm/flow/service/ProgramConfirmTableServiceTest.java b/blade-service/blade-mdm/src/test/java/org/springblade/mdm/flow/service/ProgramConfirmTableServiceTest.java
index c6a78ba..9ba28bb 100644
--- a/blade-service/blade-mdm/src/test/java/org/springblade/mdm/flow/service/ProgramConfirmTableServiceTest.java
+++ b/blade-service/blade-mdm/src/test/java/org/springblade/mdm/flow/service/ProgramConfirmTableServiceTest.java
@@ -8,21 +8,27 @@
 import org.springblade.mdm.basesetting.machine.entity.Machine;
 import org.springblade.mdm.flow.vo.ApproveTableInfo;
 
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.OutputStream;
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.HashMap;
 import java.util.Map;
 
 public class ProgramConfirmTableServiceTest {
-	@Test
+	//@Test
 	public void test(){
 		ProgramConfirmTableService s = new ProgramConfirmTableService();
 		try {
-			s.generateTempPDF();
+			String fileName = "d:/confirtabletpl.pdf";//妯℃澘缁濆璺緞
+			String outfile = "D:/q"+System.currentTimeMillis()+".pdf";
+			try(InputStream ins = Files.newInputStream(Paths.get(fileName));OutputStream fos = Files.newOutputStream(Paths.get(outfile));) {
+				//ByteArrayInputStream bais;
+
+				//s.generateTempPDF(ins.readAllBytes(),fos);
+			}
+
 			Assertions.assertTrue(true);
 		} catch (Exception e) {
 			throw new RuntimeException(e);
diff --git a/doc/mdm/confirtabletpl.pdf b/doc/mdm/confirtabletpl.pdf
new file mode 100644
index 0000000..feeebe6
--- /dev/null
+++ b/doc/mdm/confirtabletpl.pdf
Binary files differ
diff --git a/doc/mdm/qrb.docx b/doc/mdm/qrb.docx
new file mode 100644
index 0000000..8470040
--- /dev/null
+++ b/doc/mdm/qrb.docx
Binary files differ
diff --git a/doc/sql/mdm/mdm.mysql.all.create.sql b/doc/sql/mdm/mdm.mysql.all.create.sql
index e72829f..5bd7528 100644
--- a/doc/sql/mdm/mdm.mysql.all.create.sql
+++ b/doc/sql/mdm/mdm.mysql.all.create.sql
@@ -23,7 +23,7 @@
   `name` varchar(100) NOT NULL COMMENT '鏈哄簥鎻忚堪/鍨嬪彿',
   `avatar` varchar(400) DEFAULT NULL COMMENT '鍥剧墖鍦板潃',
   `machine_group_code` varchar(255) NOT NULL COMMENT '鎵�灞炴満搴婄粍浠g爜锛�,鍦ㄤ笟鍔″瓧鍏搁厤缃紙key=machine_group锛�',
-  `machine_spec` varchar(20) DEFAULT NULL COMMENT '鏈哄櫒瑙勬牸:01杞﹀簥/02閾e簥,鍦ㄤ笟鍔″瓧鍏搁厤缃紙key=machine_spec锛�',
+  `machine_spec` varchar(40) DEFAULT NULL COMMENT '鏈哄櫒瑙勬牸:01杞﹀簥/02閾e簥,鍦ㄤ笟鍔″瓧鍏搁厤缃紙key=machine_spec锛�',
   `operator` varchar(100)  COMMENT '鎿嶄綔鍛橈紝鏂囨湰褰曞叆',
   `owner_dept` bigint DEFAULT NULL COMMENT '鎵�灞炲崟浣�/缁勭粐',
   `manufacturer` varchar(100)  COMMENT '鐢熶骇鍟�',
@@ -169,7 +169,7 @@
    `product_model` varchar(100) NULL COMMENT '浜у搧鍨嬪彿',
    `deviation` varchar(100) NULL COMMENT '鍋忕鍗曞彿',
 
-   `err_msg` varchar(100) NULL COMMENT '閿欒鎴栬�呮彁绀轰俊鎭�',
+   `err_msg` varchar(200) NULL COMMENT '閿欒鎴栬�呮彁绀轰俊鎭�',
    `process_instance_id` varchar(64) NULL COMMENT '鍏宠仈鐨勬祦绋嬪疄渚媔d锛屾祦绋嬪彂璧峰悗濉厖',
    `status` int DEFAULT NULL COMMENT '涓氬姟鐘舵�侊紝1锛氬垵濮嬪寲锛�2:娴佺▼宸插惎鍔� 3:閲嶅娲惧伐;4锛岄獙璇佸け璐�,5锛氬惎鍔ㄥ紓甯�',
    `create_dept` bigint DEFAULT NULL COMMENT '鍒涘缓鍗曚綅',
@@ -457,3 +457,21 @@
     PRIMARY KEY (`id`) USING BTREE
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='宸ユ帶缃戞満搴婃枃浠�';
 
+
+DROP TABLE IF EXISTS `mdm_machine_file_change_his`;
+CREATE TABLE `mdm_machine_file_change_his` (
+    `id` bigint NOT NULL,
+    `tenant_id` varchar(6) DEFAULT NULL COMMENT '鎵�灞炵鎴�',
+    `oss_name` varchar(100) NOT NULL COMMENT '淇敼鍓峯ss鏂囦欢鍚嶇О锛堟枃浠跺浠斤級',
+    `oss_name_after` varchar(100) NOT NULL COMMENT '淇敼鍚庣殑oss鏂囦欢鍚嶇О',
+    `machine_file_id` bigint DEFAULT NULL COMMENT '淇敼鏂囦欢鐨刬d(mdm_machine_file.id)',
+    `status` int DEFAULT NULL COMMENT '涓氬姟鐘舵��',
+    `create_dept` bigint DEFAULT NULL COMMENT '鍒涘缓鍗曚綅',
+    `is_deleted` int DEFAULT NULL,
+    `create_time` datetime DEFAULT NULL COMMENT '鍒涘缓鏃堕棿',
+    `create_user` bigint DEFAULT NULL COMMENT '鍒涘缓浜�',
+    `update_time` datetime DEFAULT NULL COMMENT '鏇存柊鏃堕棿',
+    `update_user` bigint DEFAULT NULL COMMENT '鏇存柊浜�',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='宸ユ帶缃戞満搴婃枃浠朵慨鏀瑰巻鍙�';
+

--
Gitblit v1.9.3