From a0e37c52980249847ac896d320ef097fda49ad3a Mon Sep 17 00:00:00 2001
From: yangys <y_ys79@sina.com>
Date: 星期二, 26 八月 2025 21:30:47 +0800
Subject: [PATCH] 调整审批表打印

---
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveTableService.java                           |  321 ++++++++++++++++++++-----------
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/entity/TaskDispatch.java                                   |    5 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeAutoCreateService.java                    |    7 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcProgramApproved.java                           |    5 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchTaskController.java                     |    1 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/NormalFinishDataHandler.java             |    7 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/producedivision/service/ProduceDivisionService.java |    4 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java                         |   22 --
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/ApproveTableInfo.java                                   |   29 ++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowProgramProperties.java                         |    9 
 blade-service/blade-mdm/src/test/java/org/springblade/mdm/flow/service/ApproveTableServiceTest.java                       |   59 +++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowCommonService.java                             |   46 ++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowTransferService.java                           |   51 ++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowMgrController.java                          |   16 
 14 files changed, 422 insertions(+), 160 deletions(-)

diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/producedivision/service/ProduceDivisionService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/producedivision/service/ProduceDivisionService.java
index 2a2be31..b4a84e7 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/producedivision/service/ProduceDivisionService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/producedivision/service/ProduceDivisionService.java
@@ -176,11 +176,11 @@
 
 		Long programmerId = tUserService.getUserIdByName(qinzheFgb.getZggy());
 		if(programmerId == null){
-			throw new ServiceException("鏍规嵁"+qinzheFgb.getZggy()+"鏈壘鍒板搴旂殑绯荤粺鐢ㄦ埛锛岃妫�鏌ョ敤鎴锋槸鍚﹀瓨鍦�");
+			throw new ServiceException("鏍规嵁["+qinzheFgb.getZggy()+"]鏈壘鍒板搴旂殑绯荤粺鐢ㄦ埛锛岃妫�鏌ョ敤鎴锋槸鍚﹀瓨鍦�");
 		}
 		ProduceDivision division = lambdaQuery().eq(ProduceDivision::getProgrammerId, programmerId).list().stream().findFirst().orElse(null);
 		if(division == null){
-			throw new ServiceException("涓诲埗鍒嗗伐琛ㄦ棤宸ヨ壓鍛�"+qinzheFgb.getZggy()+"瀵瑰簲鐨勬暟鎹�");
+			throw new ServiceException("涓诲埗鍒嗗伐琛ㄦ棤宸ヨ壓鍛榌"+qinzheFgb.getZggy()+"]瀵瑰簲鐨勬暟鎹�");
 		}
 
 		return division;
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java
index 9b50d02..e8160cb 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java
@@ -6,8 +6,6 @@
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.SerializationException;
-import org.apache.commons.lang3.StringUtils;
 import org.flowable.engine.RuntimeService;
 import org.flowable.engine.TaskService;
 import org.flowable.engine.runtime.ProcessInstance;
@@ -15,34 +13,20 @@
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
-import org.springblade.core.tool.support.Kv;
-import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.mdm.flow.constants.FlowContants;
-import org.springblade.mdm.flow.entity.ApproveRecord;
 import org.springblade.mdm.flow.entity.TaskDispatch;
 import org.springblade.mdm.flow.excution.StartDispatcher;
-import org.springblade.mdm.flow.service.ApproveRecordService;
-import org.springblade.mdm.flow.service.FlowCommonService;
 import org.springblade.mdm.flow.service.FlowProgramFileService;
 import org.springblade.mdm.flow.service.TaskDispatchService;
 import org.springblade.mdm.flow.service.execute.*;
 import org.springblade.mdm.flow.vo.BatchDispatchVO;
 import org.springblade.mdm.flow.vo.TaskAssignVO;
-import org.springblade.mdm.program.entity.ProcessProgRef;
-import org.springblade.mdm.program.service.NcNodeAutoCreateService;
-import org.springblade.mdm.program.service.ProcessProgRefService;
-import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 @Slf4j
@@ -87,11 +71,10 @@
 				return R.data(true);
 			} catch (Exception e) {
 				dispatch.setStatus(TaskDispatch.STATUS_EXCEPTION);
+				dispatch.setErrMsg(e.getMessage());
 				taskDispatchService.updateById(dispatch);
-				return R.fail("浠诲姟鍚姩寮傚父");
+				return R.fail("浠诲姟鍚姩寮傚父:"+e.getMessage());
 			}
-
-
 		}catch(Exception e){
 			return R.fail(e.getMessage());
 		}
@@ -121,7 +104,6 @@
 		try {
 			AbstractFlowCompleteService completeService = getActualService(processInstanceId);
 			completeService.completeTask(taskId, processInstanceId, comment, variables);
-
 
 			return R.success("娴佺▼鎻愪氦鎴愬姛");
 		}catch(Exception e){
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchTaskController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchTaskController.java
index 2c23788..709c4b3 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchTaskController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchTaskController.java
@@ -96,6 +96,7 @@
 			} catch (Exception e) {
 				log.error("娴佺▼鍚姩寮傚父",e);
 				dispatch.setStatus(TaskDispatch.STATUS_EXCEPTION);
+				dispatch.setErrMsg(e.getMessage());
 				taskDispatchService.updateById(dispatch);
 				return R.fail("浠诲姟鍚姩寮傚父");
 			}
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 69c095d..e7a5237 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
@@ -15,12 +15,12 @@
 import org.springblade.core.excel.util.ExcelUtil;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.utils.AuthUtil;
 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.flow.service.ApproveTableService;
-import org.springblade.mdm.flow.service.FlowBusinessService;
-import org.springblade.mdm.flow.service.WIthdrawService;
+import org.springblade.core.tool.utils.UrlUtil;
+import org.springblade.mdm.flow.service.*;
 import org.springblade.mdm.flow.vo.FlowVO;
 import org.springblade.mdm.flow.vo.OvertimeTaskExcelVO;
 import org.springblade.mdm.flow.vo.TaskTraceVO;
@@ -48,7 +48,8 @@
 	private TaskService taskService;
 	@Autowired
 	private FlowBusinessService businessService;
-
+	@Autowired
+	private FlowCommonService flowCommonService;
 	@Autowired
 	private HistoryService historyService;
 	@Autowired
@@ -171,9 +172,10 @@
 	public void exportApproveTable(String processInstanceId, HttpServletResponse response) {
 
 		try {
-
-			String filename = URLEncoder.encode("鏁版帶绋嬪簭缂栧埗瀹℃壒鍗�", StandardCharsets.UTF_8)+ DateUtil.format(DateUtil.now(), "yyyyMMddHHmm")+".pdf";
-
+			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");
 			approveTableService.exportApproveTable(processInstanceId,response.getOutputStream());
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/entity/TaskDispatch.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/entity/TaskDispatch.java
index 1b03315..115429b 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/entity/TaskDispatch.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/entity/TaskDispatch.java
@@ -78,4 +78,9 @@
 	 * 鍋忕鍗曞彿
 	 */
 	private String deviation;
+
+	/**
+	 * 閿欒淇℃伅
+	 */
+	private String errMsg;
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/NormalFinishDataHandler.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/NormalFinishDataHandler.java
index e77b85f..64e1da3 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/NormalFinishDataHandler.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/NormalFinishDataHandler.java
@@ -68,7 +68,7 @@
 		}
 
 		addApproveTable(packageNode,props);
-		updateApproveRecordNodeId(instId, packageNode.getId());
+		//updateApproveRecordNodeId(instId, packageNode.getId());
 		log.info("鏅�氭祦绋嬪凡瀹屾垚in DispatchFinishListener");
 	}
 
@@ -85,15 +85,16 @@
 		approved.setNcNodeId(packageNode.getId());//绋嬪簭鍖呰妭鐐筰d
 		approved.setTitle(props.getTitle());
 		approved.setProgrammerId(props.getProgrammerId());
+		approved.setProcessInstanceId(props.getProcessInstanceId());
 		approvedService.save(approved);
 
 	}
 
-
+	/*
 	void updateApproveRecordNodeId(String processInstanceId,Long nodeId){
 		//鏇存柊瀹℃壒璁板綍鐨刵cNodeId
 		approveRecordService.lambdaUpdate()
 			.eq(ApproveRecord::getProcessInstanceId, processInstanceId)
 			.set(ApproveRecord::getNcNodeId,nodeId).update();
-	}
+	}*/
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveTableService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveTableService.java
index a14df6a..dfcccae 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveTableService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveTableService.java
@@ -1,30 +1,26 @@
 
 package org.springblade.mdm.flow.service;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.flowable.engine.HistoryService;
-import org.flowable.engine.history.HistoricActivityInstance;
 import org.flowable.engine.history.HistoricProcessInstance;
-import org.flowable.task.api.Task;
-import org.springblade.core.mp.base.BizServiceImpl;
-import org.springblade.core.secure.utils.AuthUtil;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.flowable.task.api.history.HistoricTaskInstance;
+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.MachineService;
 import org.springblade.mdm.basesetting.machine.entity.Machine;
 import org.springblade.mdm.flow.constants.FlowContants;
-import org.springblade.mdm.flow.entity.ApproveRecord;
-import org.springblade.mdm.flow.mapper.ApproveRecordMapper;
-import org.springblade.mdm.flow.vo.ApproveRecordVO;
+import org.springblade.mdm.flow.vo.ApproveTableInfo;
 import org.springblade.mdm.program.entity.NcNode;
-import org.springblade.mdm.program.entity.NcProgram;
-import org.springblade.mdm.program.entity.ProcessProgRef;
+import org.springblade.mdm.program.entity.NcProgramApproved;
 import org.springblade.mdm.program.service.NcNodeService;
-import org.springblade.mdm.program.service.NcProgramService;
-import org.springblade.mdm.program.service.ProcessProgRefService;
-import org.springframework.beans.BeanUtils;
+import org.springblade.mdm.program.service.NcProgramApprovedService;
+import org.springblade.system.feign.IUserClient;
+import org.springblade.system.pojo.entity.User;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.io.IOException;
@@ -32,6 +28,7 @@
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 
 import com.itextpdf.text.*;
 import com.itextpdf.text.pdf.*;
@@ -42,85 +39,104 @@
  */
 @Slf4j
 @Service
-@AllArgsConstructor
-public class ApproveTableService{
-	private final FlowCommonService flowCommonService;
-	private final ApproveRecordService approveRecordService;
-	private final NcNodeService ncNodeService;
-	private final MachineService machineService;
-	private final HistoryService historyService;
+public class ApproveTableService {
+	@Autowired
+	private FlowCommonService flowCommonService;
+	@Autowired
+	private NcNodeService ncNodeService;
+	@Autowired
+	private MachineService machineService;
+	@Autowired
+	private HistoryService historyService;
+	@Autowired
+	private IUserClient useClient;
+	@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)); // 甯﹀嬀鏂规
-	//static SimpleDateFormat
+
 	BaseFont getBaseFont() throws DocumentException, IOException {
 		return BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
 	}
+
 	Font getChineseFont() throws DocumentException, IOException {
 		BaseFont bfChinese = getBaseFont();
 		return new Font(bfChinese, 12, Font.NORMAL);
 	}
-	/**
-	 * 瀵煎嚭瀹℃壒纭琛�
-	 * @param processInstanceId
-	 */
+
 	public void exportApproveTable(String processInstanceId, OutputStream os) throws DocumentException, IOException {
 
-		BaseFont bfChinese =  getBaseFont();
+		BaseFont bfChinese = getBaseFont();
 
 		Document document = new Document(PageSize.B5.rotate());
-		PdfWriter.getInstance(document,os);
+		PdfWriter.getInstance(document, os);
 
 		document.open();
 
-		List<ApproveRecord> records = approveRecordService.lambdaQuery().eq(ApproveRecord::getProcessInstanceId, processInstanceId).orderByAsc(ApproveRecord::getCreateTime).list();
-		for(int i=0;i<records.size();i++){
+		FlowProgramProperties props = flowCommonService.getProgramPropertiesFromHis(processInstanceId);
 
-			ApproveRecord record = records.get(i);
-			if(record.getNcNodeId() ==null){
-				//continue;
-			}
+		ApproveTableInfo appInfo = getApproveInfo(props);
+		Machine machine;
+		String machineCode = props.getMachineCode();
+		machine = machineService.getByCode(machineCode);
 
-			HistoricProcessInstance ins = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).includeProcessVariables().singleResult();
-			List<HistoricActivityInstance> activitiys = historyService.createHistoricActivityInstanceQuery()
-				.processInstanceId(processInstanceId)
-				.list();
-			printStep(document,bfChinese,record,ins);
-			if(i<records.size()-1){
-				document.newPage();
-			}
-		}
+		int flag = props.getProcessDefinitionKey().equals(FlowContants.TRY_PROCESS_KEY)?1:2;
+		printPage(document, bfChinese, props, machine, flag, appInfo);
+		//document.newPage();
+
+
+		//printPage(document, bfChinese, props, machine, 2, appInfo);
 
 		document.close();
 	}
 
-	void printStep(Document document,BaseFont bfChinese,ApproveRecord record,HistoricProcessInstance ins) throws DocumentException, IOException {
-		NcNode programPackageNode;
-		Machine machine;
-		Map<String,Object> vars = ins.getProcessVariables();
-		//activitiy.stream().filter(HistoricActivityInstance::get)
-		if(record.getNcNodeId() !=null ) {
-			//programPackageNode = ncNodeService.getById(record.getNcNodeId());
-			String machineCode = String.valueOf(vars.get(FlowContants.MACHINE_CODE));
-			//machine = machineService.getByCode(programPackageNode.getMachineCode());
-			machine = machineService.getByCode(machineCode);
-		}else{
-			programPackageNode = new NcNode();
-			machine = new Machine();
-		}
 
+
+	/**
+	 * 鎵撳嵃涓�涓楠わ紙缂栧埗/鏍″锛�
+	 * @param document
+	 * @param bfChinese
+	 * @param props
+	 * @param machine
+	 * @param flag
+	 * @param approveInfo
+	 * @throws DocumentException
+	 * @throws IOException
+	 */
+	void printPage(Document document, BaseFont bfChinese, FlowProgramProperties props, Machine machine, int flag, ApproveTableInfo approveInfo) throws DocumentException, IOException {
+		Font tipFont = new Font(bfChinese, 10, Font.NORMAL);
+		Paragraph tip = new Paragraph("鑹鸿〃6", tipFont);
+		tip.setAlignment(Element.ALIGN_RIGHT);
+		tip.setSpacingAfter(-5); // 娈靛悗闂磋窛
+		tip.setIndentationRight(220f);
+
+		// 璁剧疆琛岃窛锛堣闂磋窛锛�
+		//mixedParagraph.setLeading(24f); // 缁濆琛岃窛
+		//mixedParagraph.setLeading(1.5f, 2f);
+		// 涔熷彲浠ヤ娇鐢ㄧ浉瀵硅璺濓細mixedParagraph.setLeading(1.5f, 24f);
+		// 绗竴涓弬鏁版槸鏂囨湰楂樺害鐨勫�嶆暟锛岀浜屼釜鍙傛暟鏄澶栫殑鍥哄畾琛岃窛
 
 		Font titleFont = new Font(bfChinese, 14, Font.NORMAL);
-		Paragraph title = new Paragraph("鏁版帶绋嬪簭缂栧埗瀹℃壒鍗�",titleFont);
-		title.setAlignment(Element.ALIGN_CENTER);
-
-		title.setLeading(40f, 0f);
+		Paragraph title = new Paragraph("鏁版帶绋嬪簭瀹℃壒鍗�", titleFont);
+		//title.setLeading(40f, 0f);
+		tip.setSpacingBefore(-0.5f);
 		title.setSpacingAfter(10); // 娈靛悗闂磋窛
-		document.add(title);
+		title.setAlignment(Element.ALIGN_CENTER);
+		title.setPaddingTop(-0.6f);
+
+		Paragraph mixedParagraph = new Paragraph();
+		mixedParagraph.add(tip);
+		mixedParagraph.add(title);
+		mixedParagraph.setSpacingAfter(10);
+		document.add(mixedParagraph);
+
+
+		//document.add(title);
 		// 鍒涘缓琛ㄦ牸锛�4鍒楋級
 		PdfPTable table = new PdfPTable(5);
-		table.setWidths(new float[]{2,1.2f, 1.2f, 1.2f,2});
+		table.setWidths(new float[]{1.5f, 1.4f, 1.4f, 1.4f, 1.5f});
 
 		Font ft = this.getChineseFont();
 		// 娣诲姞琛ㄥご
@@ -128,27 +144,24 @@
 		tempCell.setHorizontalAlignment(Element.ALIGN_CENTER);
 		tempCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
 
-		Phrase pt1 = new Phrase("闆剁粍浠跺彿",ft);
+		Phrase pt1 = new Phrase("闆剁粍浠跺彿", ft);
 		tempCell.setPhrase(pt1);
 		//tempCell.addElement(pt1);
 		//
 		table.addCell(tempCell);
-		table.addCell(getCell("宸ュ簭鍙�",ft));
-		table.addCell(getCell("宸ヨ壓鐗堟",ft));
-		table.addCell(getCell("鏈哄簥鍨嬪彿",ft));
-		table.addCell(getCell("宸ユ璐熻矗浜�/鍗曞厓璐焅n璐d汉娲惧嚭鏃堕棿",ft));
+		table.addCell(getCell("宸ュ簭鍙�", ft));
+		table.addCell(getCell("宸ヨ壓鐗堟", ft));
+		table.addCell(getCell("鏈哄簥鍨嬪彿", ft));
+		table.addCell(getCell("宸ユ璐熻矗浜�/鍗曞厓璐焅n璐d汉娲惧嚭鏃堕棿", ft));
 
-		//PdfPCell cell12 = new PdfPCell();
-		//cell12.setColspan(2);
-		//cell12.addElement(new Phrase(ncProgram.getDrawingNo()));
-		String drawingNo = vars.get(FlowContants.DRAWING_NO)+"";
-		table.addCell(getCell(drawingNo,ft));//闆剁粍浠跺彿
-		String processNo = vars.get(FlowContants.PROCESS_NO)+"";
-		table.addCell(getCell(processNo,ft));//宸ュ簭鍙�
-		String craftEdition = vars.get(FlowContants.CRAFT_EDITION)+"";
-		table.addCell(getCell(craftEdition,ft));//宸ヨ壓鐗堟
-		table.addCell(getCell(machine.getName(),ft));//鏈哄簥鍨嬪彿
-		table.addCell("");//璐熻矗浜猴紝宸ユ璐熻矗浜烘淳鍑烘椂闂�
+
+		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(approveInfo.getTeamLeaderName(), ft));//璐熻矗浜猴紝宸ユ璐熻矗浜烘淳鍑烘椂闂�
 
 		//涓棿澶ф牸
 		PdfPCell cell = new PdfPCell();
@@ -176,27 +189,32 @@
 
 		Font underLineFt = new Font(bfChinese, 12, Font.UNDERLINE);
 
-		String personName = record.getUserNickname();
+		//String personName = record.getUserNickname();
 		Chunk block1 = square;
-		Chunk block2 = square;
-		Date programDate = null;
-		Date checkDate = null;
-		if(StringUtils.equals(record.getTaskDefinitionKey(),"programmingTask")){
-			block1 = check;
-			programDate = record.getCreateTime();
-		}else if(StringUtils.equals(record.getTaskDefinitionKey(),"check")){
-			block2 = check;
-			checkDate = record.getCreateTime();
-		}
-		Phrase p = new Phrase("       "+personName+"        ",underLineFt);
+		Chunk block2 = check;
+		Date programDate = approveInfo.getProgrammingDate(); //TODO 鏌ヨ鏃堕棿
+		Date checkDate = approveInfo.getCheckDate();
 
+		Phrase p;
+		if (1 == flag) {
+			p = new Phrase("       " + approveInfo.getProgrammerName() + "        ", underLineFt);
+		} else {
+			p = new Phrase("       " + approveInfo.getCheckerName() + "        ", underLineFt);
+		}
 		line2Para.add(p);
 
 		Phrase p2 = new Phrase("璐熻矗鏁版帶绋嬪簭锛堢紪鍒�");
-		p2.add(block1);
-		p2.add(new Chunk("   鏍″",ft));
-		p2.add(block2);
-		p2.add(new Chunk("锛�",ft));
+		if (flag == 1) {
+			p2.add(block2);
+			p2.add(new Chunk("   鏍″", ft));
+			p2.add(block1);
+		} else {
+			p2.add(block1);
+			p2.add(new Chunk("   鏍″", ft));
+			p2.add(block2);
+		}
+
+		p2.add(new Chunk("锛�", ft));
 		line2Para.add(p2);
 
 		cell.addElement(line2Para);
@@ -210,40 +228,50 @@
 		fangzhen.setFont(ft);
 		fangzhen.setLeading(30f, 0f);
 		fangzhen.add("鏄惁闇�瑕佷豢鐪燂紙鏄�");
+		fangzhen.add(check);//鍥哄畾鏄豢鐪�
+		fangzhen.add(" 鍚�");
 		fangzhen.add(square);
-		fangzhen.add(";鍚�");
-		fangzhen.add(square);
-		fangzhen.add("锛塡n");
+		fangzhen.add("锛塡n\n");
 
 		cell.addElement(fangzhen);
 		table.addCell(cell);
 		//涓嬩竴琛�
-		PdfPCell cell21 = getCell("鏁版帶绋嬪簭缂栧彿",ft);// PdfPCell();
+		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));
+		table.addCell(getCell("缂栧埗/鏃ユ湡", ft));
+		table.addCell(getCell("鏍″/鏃ユ湡", ft));
+		table.addCell(getCell("鎵瑰噯/鏃ユ湡", ft));
 
-		PdfPCell cell2 = new PdfPCell();
+		PdfPCell cell2 = getCell("00001", ft);
 		cell2.setColspan(2);
 
 		//cell2.addElement(new Phrase(programPackageNode.getProgramNo(),ft));//鏁版帶绋嬪簭缂栧彿
-		cell2.addElement(new Phrase("00001",ft));
+		//cell2.addElement(new Phrase("00001",ft));
 		table.addCell(cell2);
 
 		String pDateStr = " ";
-		if(programDate!=null){
-			pDateStr = DateUtil.format(programDate,"yyyy-MM-dd");
+		if (programDate != null) {
+			pDateStr = DateUtil.format(programDate, "yyyy-MM-dd");
 		}
 		String checkDateStr = " ";
-		if(checkDate!=null){
-			checkDateStr = DateUtil.format(programDate,"yyyy-MM-dd");
+		if (checkDate != null) {
+			checkDateStr = DateUtil.format(programDate, "yyyy-MM-dd");
 		}
-		table.addCell(getCell(pDateStr,ft));//缂栧埗鏃ユ湡
-		table.addCell(getCell(checkDateStr,ft));
-		table.addCell(getCell(" ",ft));
+
+		String approveDateStr = " ";
+		if (approveInfo.getApproveDate() != null) {
+			approveDateStr = DateUtil.format(approveInfo.getApproveDate(), "yyyy-MM-dd");
+		}
+		table.addCell(getCell(approveInfo.getProgrammerName()+" " +pDateStr, ft));//缂栧埗/鏃ユ湡
+		table.addCell(getCell(approveInfo.getCheckerName()+" " +checkDateStr, ft));
+		table.addCell(getCell(approveInfo.getSeniorName()+" " +approveDateStr, ft));
+
+		PdfPCell sendPathCell = getCell("鏁版帶绋嬪簭浼犺緭璺緞锛�" + (machine.getProgSendDir() == null ? "" : machine.getProgSendDir()), ft);// PdfPCell();
+		sendPathCell.setHorizontalAlignment(Element.ALIGN_LEFT);
+		sendPathCell.setColspan(5);
+		table.addCell(sendPathCell);
 
 		// 璁剧疆琛ㄦ牸瀹藉害鍗犻〉闈㈠搴︾殑100%
 		table.setWidthPercentage(100);
@@ -251,17 +279,17 @@
 		// 娣诲姞琛ㄦ牸鍒版枃妗�
 		document.add(table);
 
-		Phrase lastPhrase = new Phrase("娉�:宸ユ娲惧伐搴旈鍏堣鍒掋�佸悎鐞嗗畨鎺掓暟鎺х▼搴忕紪鍒躲�傜珛鍔犮�佹暟閾c�佹暟杞︾瓑鍗曢亾宸ュ簭绋嬪簭(涓よ酱绋嬪簭)闇�鎻愬墠1涓伐浣滄棩锛屽崸寮忓姞宸ヤ腑蹇冨崟閬撳伐搴�(鍚杞寸▼搴�)闇�鎻愬墠3涓伐浣滄棩銆� ",ft);
+		Phrase lastPhrase = new Phrase("娉�:宸ユ娲惧伐搴旈鍏堣鍒掋�佸悎鐞嗗畨鎺掓暟鎺х▼搴忕紪鍒躲�傜珛鍔犮�佹暟閾c�佹暟杞︾瓑鍗曢亾宸ュ簭绋嬪簭(涓よ酱绋嬪簭)闇�鎻愬墠1涓伐浣滄棩锛屽崸寮忓姞宸ヤ腑蹇冨崟閬撳伐搴�(鍚杞寸▼搴�)闇�鎻愬墠3涓伐浣滄棩銆� ", ft);
 		document.add(lastPhrase);
 	}
 
-	PdfPCell getCell(String text,Font font) throws DocumentException, IOException {
+	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);
+		if (StringUtils.isNotBlank(text)) {
+			Phrase p = new Phrase(text, font);
 			p.setLeading(25);
 			cell.setPhrase(p);
 		}
@@ -269,5 +297,68 @@
 		return cell;
 	}
 
+	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());
+			}
+		}
+
+		//鏌ヨ鏁版帶绋嬪簭缂栧彿
+		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());
+		}
+		return appInfo;
+	}
 
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowCommonService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowCommonService.java
index a19af2a..1354c20 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowCommonService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowCommonService.java
@@ -86,8 +86,10 @@
 		}
 		programProperties.setCureProgramUseable(String.valueOf(vars.get(FlowContants.CURE_PROGRAM_USEABLE)));
 
+		programProperties.setTeamLeaderId(Func.toLong(vars.get(FlowContants.TEAM_LEADER)));
 		programProperties.setProgrammerId(Func.toLong(vars.get(FlowContants.PROGRAMMER)));
-
+		programProperties.setCheckerId(Func.toLong(vars.get(FlowContants.CHECKER)));
+		programProperties.setSeniorId(Func.toLong(vars.get(FlowContants.SENIOR)));
 		ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
 			.processInstanceId(processInstanceId)
 			.singleResult();
@@ -95,7 +97,49 @@
 		programProperties.setProcessDefinitionKey(processDefinitionKey);
 		return programProperties;
 	}
+	public FlowProgramProperties getProgramPropertiesFromHis(String processInstanceId) {
+		HistoricProcessInstance historicInstance = historyService.createHistoricProcessInstanceQuery().includeProcessVariables()
+			.processInstanceId(processInstanceId)
+			.singleResult();
 
+		FlowProgramProperties programProperties = new FlowProgramProperties();
+		programProperties.setProcessInstanceId(processInstanceId);
+
+		Map<String, Object> vars =historicInstance.getProcessVariables();
+
+		programProperties.setTitle(String.valueOf(vars.get(FlowContants.TITLE)));
+		programProperties.setIsTempFlow(Func.toStr(vars.get(FlowContants.IS_TEMP_FLOW)));
+		programProperties.setDrawingNo(String.valueOf(vars.get(FlowContants.DRAWING_NO)));
+		programProperties.setDrawingNoEdition(String.valueOf(vars.get(FlowContants.DRAWING_NO_EDITION)));
+		programProperties.setProductModel(String.valueOf(vars.get(FlowContants.PRODUCT_MODEL)));
+
+		programProperties.setProcessNo(String.valueOf(vars.get(FlowContants.PROCESS_NO)));
+		programProperties.setProcessEdition(String.valueOf(vars.get(FlowContants.PROCESS_EDITION)));//宸ュ簭鐗堟
+		programProperties.setProcessName(String.valueOf(vars.get(FlowContants.PROCESS_NAME)));
+		programProperties.setMachineCode(String.valueOf(vars.get(FlowContants.MACHINE_CODE)));
+
+		programProperties.setMachineMode(String.valueOf(vars.get(FlowContants.MACHINE_MODE)));
+		//鏁版嵁澶勭悊鍚嶇О涓虹増娆′互鍓嶏紝闆朵欢鍙峰姞宸ュ簭鍙凤細YZL4-1100-01-50 闆剁粍浠跺彿锛歒ZL4-1100-01 宸ュ簭鍙� 50
+
+		programProperties.setCraftEdition(String.valueOf(vars.get(FlowContants.CRAFT_EDITION)));
+		programProperties.setHasCuredProgram(String.valueOf(vars.get(FlowContants.HAS_CURED_PROGRAM)));
+		programProperties.setIsProcessEditionSame(String.valueOf(vars.get(FlowContants.IS_PROCESS_EDITION_SAME)));
+		if(vars.containsKey(FlowContants.DEVIATION)) {
+			programProperties.setDeviation(String.valueOf(vars.get(FlowContants.DEVIATION)));
+		}
+		if(vars.containsKey(FlowContants.CURED_NODE_ID)){
+			programProperties.setCuredNodeId(Func.toLong(vars.get(FlowContants.CURED_NODE_ID)));
+		}
+		programProperties.setCureProgramUseable(String.valueOf(vars.get(FlowContants.CURE_PROGRAM_USEABLE)));
+
+		programProperties.setTeamLeaderId(Func.toLong(vars.get(FlowContants.TEAM_LEADER)));
+		programProperties.setProgrammerId(Func.toLong(vars.get(FlowContants.PROGRAMMER)));
+		programProperties.setCheckerId(Func.toLong(vars.get(FlowContants.CHECKER)));
+		programProperties.setSeniorId(Func.toLong(vars.get(FlowContants.SENIOR)));
+
+		programProperties.setProcessDefinitionKey(historicInstance.getProcessDefinitionKey());
+		return programProperties;
+	}
 	/**
 	 * 娴佺▼鏄惁鍦ㄨ繘琛�
 	 * @param processInstanceId 瀹炰緥id
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowProgramProperties.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowProgramProperties.java
index ba9456a..9d18bea 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowProgramProperties.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowProgramProperties.java
@@ -2,6 +2,8 @@
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.mdm.flow.constants.FlowContants;
 
 import java.time.LocalDate;
 
@@ -60,9 +62,14 @@
 	@Schema(description = "绋嬪簭鏄惁鍙敤鍒ゅ畾:Y/N")
 	private String cureProgramUseable;
 
+	@Schema(description = "涓撲笟缁勯暱id")
+	private Long teamLeaderId;
 	@Schema(description = "缂栫▼鍛榠d")
 	private Long programmerId;
-
+	@Schema(description = "鏍″鍛榠d")
+	private Long checkerId;
+	@Schema(description = "瀹℃牳楂樺笀ID")
+	private Long seniorId;
 	@Schema(description = "鏄惁涓存椂娴佺▼:Y/N")
 	private String isTempFlow;
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowTransferService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowTransferService.java
index 5a63233..8d0f7e4 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowTransferService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowTransferService.java
@@ -7,11 +7,14 @@
 import org.flowable.engine.history.HistoricProcessInstance;
 import org.flowable.engine.runtime.ProcessInstance;
 import org.flowable.task.api.Task;
+import org.flowable.task.service.impl.persistence.entity.TaskEntity;
 import org.springblade.mdm.flow.constants.FlowContants;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Date;
 import java.util.Map;
+import java.util.UUID;
 
 @AllArgsConstructor
 @Service
@@ -30,15 +33,53 @@
 	@Transactional
 	public void transferTask(String taskId, String newAssigneeId,String comment) {
 
-		Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
-		// 澧炲姞璇勮
+		Task currTask = taskService.createTaskQuery().taskId(taskId).singleResult();
 
-		taskService.addComment(taskId, task.getProcessInstanceId(), comment);
+		//if (currTask != null) {
+			//1.鐢熸垚鍘嗗彶璁板綍
+			TaskEntity subtask = this.createSubTask(currTask, currTask.getAssignee());
+			//2.娣诲姞瀹℃壒鎰忚
+			//this.addComment(subtask.getId(), turnTaskVo.getUserCode(), turnTaskVo.getProcessInstanceId(), CommentTypeEnum.ZB.toString(), turnTaskVo.getMessage());
+			taskService.addComment(subtask.getId(), currTask.getProcessInstanceId(), comment);
+			taskService.complete(subtask.getId());
+			//3.杞姙
+			//taskService.setAssignee(turnTaskVo.getTaskId(), turnTaskVo.getTurnToUserId());
+			taskService.setAssignee(taskId, newAssigneeId);
+			//taskService.setOwner(taskId, currTask.getAssignee());
+		taskService.setOwner(taskId, newAssigneeId);
+			//returnVo = new ReturnVo<>(ReturnCode.SUCCESS, "杞姙鎴愬姛");
+		//}
+
+		// 澧炲姞璇勮
+		//taskService.addComment(taskId, currTask.getProcessInstanceId(), comment);
 		// 瀹屾垚浠诲姟
-		taskService.setAssignee(taskId, newAssigneeId);
+		//taskService.setAssignee(taskId, newAssigneeId);
 
 		//鑷崘琛ㄥ鍔犺瘎璁烘暟鎹�
-		approveRecordService.saveApproveRecords(task,"Y",comment);
+		//approveRecordService.saveApproveRecords(currTask,"Y",comment);
+	}
+
+	TaskEntity createSubTask(Task ptask, String assignee) {
+		TaskEntity task = null;
+		if (ptask != null) {
+			//1.鐢熸垚瀛愪换鍔�
+			UUID uuid = UUID.randomUUID();
+			task = (TaskEntity) taskService.newTask(uuid.toString());
+			task.setCategory(ptask.getCategory());
+			task.setDescription(ptask.getDescription());
+			task.setTenantId(ptask.getTenantId());
+			task.setAssignee(assignee);
+			task.setName(ptask.getName());
+			task.setParentTaskId(ptask.getId());
+			task.setProcessDefinitionId(ptask.getProcessDefinitionId());
+			task.setProcessInstanceId(ptask.getProcessInstanceId());
+			task.setTaskDefinitionKey(ptask.getTaskDefinitionKey());
+			task.setTaskDefinitionId(ptask.getTaskDefinitionId());
+			task.setPriority(ptask.getPriority());
+			task.setCreateTime(new Date());
+			taskService.saveTask(task);
+		}
+		return task;
 	}
 }
 
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/ApproveTableInfo.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/ApproveTableInfo.java
new file mode 100644
index 0000000..0f34216
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/ApproveTableInfo.java
@@ -0,0 +1,29 @@
+package org.springblade.mdm.flow.vo;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class ApproveTableInfo {
+	private String teamLeaderName;
+	private String programmerName;
+	private String checkerName;
+	private String seniorName;
+
+
+	private Date programmingDate;
+	/**
+	 * 鏍″鏃堕棿
+	 */
+	private Date checkDate;
+	/**
+	 * 瀹℃牳鏃堕棿
+	 */
+	private Date approveDate;
+
+	/**
+	 * 鏁版帶绋嬪簭缂栧彿
+	 */
+	private String programNo;
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcProgramApproved.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcProgramApproved.java
index d23c063..140d389 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcProgramApproved.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcProgramApproved.java
@@ -41,4 +41,9 @@
 	 */
 	private Long programmerId;
 
+	/**
+	 * 娴佺▼瀹炰緥id
+	 */
+	private String processInstanceId;
+
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeAutoCreateService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeAutoCreateService.java
index f2ba2b4..076f094 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeAutoCreateService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeAutoCreateService.java
@@ -183,8 +183,6 @@
 			//绋嬪簭鍖呰妭鐐瑰拰绋嬪簭鏂囦欢鑺傜偣鏁版嵁
 			if(NcNode.TYPE_PROGRAM_PACKAGE.equals(nodeType) || NcNode.TYPE_PROGRAM_FILE.equals(nodeType)){
 
-				String programNo = programSeqService.generageProgramNo();
-				ncNode.setProgramNo(programNo);
 				ncNode.setProcessInstanceId(programProperties.getProcessInstanceId());
 				ncNode.setDrawingNo(programProperties.getDrawingNo());
 				ncNode.setDrawingNoEdition(programProperties.getDrawingNoEdition());
@@ -196,6 +194,11 @@
 				ncNode.setProductModel(programProperties.getProductModel());
 
 				ncNode.setDeviation(programProperties.getDeviation());
+
+				if(NcNode.TYPE_PROGRAM_PACKAGE.equals(nodeType)) {//绋嬪簭鍖呰妭鐐癸紝鍒嗛厤绋嬪簭缂栧彿
+					String programNo = programSeqService.generageProgramNo();
+					ncNode.setProgramNo(programNo);
+				}
 			}
 
 			ncNode.setIsLastEdition(1);
diff --git a/blade-service/blade-mdm/src/test/java/org/springblade/mdm/flow/service/ApproveTableServiceTest.java b/blade-service/blade-mdm/src/test/java/org/springblade/mdm/flow/service/ApproveTableServiceTest.java
index beb3b56..a3d042d 100644
--- a/blade-service/blade-mdm/src/test/java/org/springblade/mdm/flow/service/ApproveTableServiceTest.java
+++ b/blade-service/blade-mdm/src/test/java/org/springblade/mdm/flow/service/ApproveTableServiceTest.java
@@ -1,19 +1,70 @@
 package org.springblade.mdm.flow.service;
 
-import com.google.common.io.FileBackedOutputStream;
+import com.itextpdf.text.Document;
 import com.itextpdf.text.DocumentException;
+import com.itextpdf.text.PageSize;
+import com.itextpdf.text.pdf.BaseFont;
+import com.itextpdf.text.pdf.PdfWriter;
 import org.junit.jupiter.api.Test;
+import org.springblade.mdm.basesetting.machine.entity.Machine;
+import org.springblade.mdm.flow.vo.ApproveTableInfo;
 
-import java.io.FileNotFoundException;
+import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.util.Calendar;
+import java.util.Date;
 
 public class ApproveTableServiceTest {
 	@Test
 	public void test(){
-		ApproveTableService s = new ApproveTableService(null,null,null,null,null);
+		ApproveTableService s = new ApproveTableService();
 		try {
-			//s.exportApproveTable("1",new FileOutputStream("d:/t.pdf"));
+			BaseFont bfChinese =  s.getBaseFont();
+
+			Document document = new Document(PageSize.B5.rotate());
+
+			String filename = "d:/t"+System.currentTimeMillis()+".pdf";
+			File pdf = new File(filename);
+			if(pdf.exists()){
+				pdf.delete();
+			}
+			PdfWriter.getInstance(document,new FileOutputStream(pdf));
+
+			document.open();
+
+			FlowProgramProperties props = new FlowProgramProperties();
+			props.setDrawingNo("CP3-1");
+			props.setProcessNo("A");
+			props.setProcessEdition("93");
+			props.setCraftEdition("宸ヨ壓鐗堟");
+			props.setProductModel("CP3");
+			//缂栧埗
+
+			Machine machine = new Machine();
+			machine.setName("1075");
+			machine.setProgSendDir("d:\\mdm\\send");
+
+			ApproveTableInfo appInfo = new ApproveTableInfo();
+			appInfo.setTeamLeaderName("缁勯暱1");
+			appInfo.setProgrammerName("缂栧埗1");
+			appInfo.setCheckerName("鏍″1");
+			appInfo.setSeniorName("瀹℃牳1");
+
+
+			Calendar startCal = Calendar.getInstance();
+			startCal.add(Calendar.DAY_OF_MONTH, -5);
+			appInfo.setProgrammingDate(startCal.getTime());
+
+			startCal.add(Calendar.DAY_OF_MONTH, 2);
+			appInfo.setCheckDate(startCal.getTime());
+
+
+			startCal.add(Calendar.DAY_OF_MONTH, 2);
+			appInfo.setApproveDate(startCal.getTime());
+			s.printPage(document,bfChinese,props,machine,1,appInfo);
+
+			document.close();
 		} catch (Exception e) {
 			throw new RuntimeException(e);
 		}

--
Gitblit v1.9.3