From 8e60278048df6d44a81ca8626cac63e5deab2761 Mon Sep 17 00:00:00 2001
From: yangys <y_ys79@sina.com>
Date: 星期四, 28 八月 2025 15:10:05 +0800
Subject: [PATCH] 机床修改,增加文件对比

---
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveTableService.java |  316 ++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 216 insertions(+), 100 deletions(-)

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 530f8b9..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,35 @@
 
 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.task.api.Task;
-import org.springblade.core.mp.base.BizServiceImpl;
-import org.springblade.core.secure.utils.AuthUtil;
+import org.flowable.engine.HistoryService;
+import org.flowable.engine.history.HistoricProcessInstance;
+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.entity.ApproveRecord;
-import org.springblade.mdm.flow.mapper.ApproveRecordMapper;
-import org.springblade.mdm.flow.vo.ApproveRecordVO;
-import org.springblade.mdm.program.entity.NcProgram;
-import org.springblade.mdm.program.entity.ProcessProgRef;
-import org.springblade.mdm.program.service.NcProgramService;
-import org.springblade.mdm.program.service.ProcessProgRefService;
-import org.springframework.beans.BeanUtils;
+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.IUserClient;
+import org.springblade.system.pojo.entity.User;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.io.IOException;
 import java.io.OutputStream;
 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.*;
 /**
@@ -34,72 +39,104 @@
  */
 @Slf4j
 @Service
-@AllArgsConstructor
-public class ApproveTableService{
-	private final ProcessProgRefService processProgRefService;
-	private final FlowCommonService flowCommonService;
-	private final ApproveRecordService approveRecordService;
-	private final NcProgramService ncProgramService;
-	private final MachineService machineService;
+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++){
-			ApproveRecord record = records.get(i);
-			printStep(document,bfChinese,record);
-			if(i<records.size()-1){
-				document.newPage();
-			}
-		}
+		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, flag, appInfo);
+		//document.newPage();
+
+
+		//printPage(document, bfChinese, props, machine, 2, appInfo);
 
 		document.close();
 	}
 
-	void printStep(Document document,BaseFont bfChinese,ApproveRecord record) throws DocumentException, IOException {
-		NcProgram ncProgram;
-		Machine machine;
-		if(record.getNcProgramId() !=null ) {
-			ncProgram = ncProgramService.getById(record.getNcProgramId());
-			machine = machineService.getByCode(ncProgram.getMachineCode());
-		}else{
-			ncProgram = new NcProgram();
-			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();
 		// 娣诲姞琛ㄥご
@@ -107,25 +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()));
-		table.addCell(getCell(ncProgram.getDrawingNo(),ft));//闆剁粍浠跺彿
 
-		table.addCell(getCell(ncProgram.getProcessNo(),ft));//宸ュ簭鍙�
-		table.addCell(getCell(ncProgram.getCraftEdition(),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();
@@ -153,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.getTaskDefinitionId(),"programmingTask")){
-			block1 = check;
-			programDate = record.getCreateTime();
-		}else if(StringUtils.equals(record.getTaskDefinitionId(),"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);
@@ -187,38 +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(ncProgram.getCode(),ft));//鏁版帶绋嬪簭缂栧彿
+
+		//cell2.addElement(new Phrase(programPackageNode.getProgramNo(),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);
@@ -226,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);
 		}
@@ -244,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;
+	}
 
 }

--
Gitblit v1.9.3