Browse Source

组卷定位优化

huangtf 1 năm trước cách đây
mục cha
commit
df9e537c7e

+ 5 - 15
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java

@@ -544,11 +544,14 @@ public class ArchivesAutoController extends BladeController {
 			if(isArchivesAuto!=-1 && isArchivesAuto!=null && isArchivesAuto!=0){
 				return R.fail("当前合同段已经在自动组卷中,请耐心等待");
 			}
-			log.info("开始刷新档号....");
+
+			Long traceId = SnowFlakeUtil.getId();
+			iTraceLogService.save(traceId,"开始刷新档号");
+			log.info("开始刷新档号...." + traceId);
 			//设置自动组卷中
 			contractClient.updateIsArchivesAutoById(contractId,1);
 
-			archivesAutoService.refreshFileNumberThread(projectId,contractId,nodeId);
+			archivesAutoService.refreshFileNumberThread(projectId,contractId,nodeId,traceId);
 			return R.success("开始刷新档号中,请耐心等待");
 		}catch (Exception e){
 			e.printStackTrace();
@@ -559,19 +562,6 @@ public class ArchivesAutoController extends BladeController {
 		}
 	}
 
-	/**
-	 * 刷新指定项目的档案
-	 * @param projectId 项目id
-	 * @return R
-	 */
-	@PostMapping("/refreshFileNumber1")
-	@ApiOperationSupport(order = 3)
-	@ApiOperation(value = "刷新项目档案", notes = "传入projectId,contractId")
-	public R<String> refreshProjectArchive1(@RequestParam Long projectId, @RequestParam Long contractId,@RequestParam Long nodeId) {
-		archivesAutoService.refreshFileNumberNoSlipt(projectId,contractId,null,false);
-		return R.data("刷新成功");
-	}
-
 
 	/**
 	 * 批量编辑

+ 3 - 3
blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java

@@ -70,7 +70,7 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 
 	void batchDestroyArchive(String ids);
 
-	void archiveAutoMethod(Long project,Long contractId,Long nodeId);
+	void archiveAutoMethod(Long project,Long contractId,Long nodeId,Long traceId);
 
 	void splitArchvies(Long project,Long contractId,Long nodeId);
 
@@ -84,7 +84,7 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 
 
 	//刷新某个项目的档号
-	void refreshFileNumberNoSlipt(Long projectId,Long contractId,Long nodeId,boolean bforce);
+	void refreshFileNumberNoSlipt(Long projectId,Long contractId,Long nodeId,boolean bforce, Long traceId);
 
 	void test();
 
@@ -92,7 +92,7 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 
 	void archiveAutoMethodThread(Long projectId, Long contractId, Long nodeId, Long traceId);
 
-	void refreshFileNumberThread(Long projectId, Long contractId, Long nodeId);
+	void refreshFileNumberThread(Long projectId, Long contractId, Long nodeId, Long traceId);
 
 	List<User> getArchiveDestroyUser(Long projectId);
 

+ 2 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/ITraceLogService.java

@@ -7,4 +7,6 @@ public interface ITraceLogService extends BaseService<TraceLog> {
     // Define methods specific to the TraceLog entity here
 
     void save(Long traceId, String format, Object... args);
+
+    void saveLog(Long traceId, String format, Object... args);
 }

+ 118 - 54
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -144,6 +144,10 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	private final ArchiveConclusionMapper conclusionMapper;
 
 	private final NewIOSSClient newIOSSClient;
+
+
+	private final ITraceLogService iTraceLogService;
+
 	//表格高度
 	private static int high = 20;
 	//表格宽度
@@ -701,7 +705,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	}
 
 	@Override
-    public void archiveAutoMethod(Long projectId, Long contractId, Long nodeId) {
+    public void archiveAutoMethod(Long projectId, Long contractId, Long nodeId, Long traceId) {
         //步骤一:把档号集合初始化
         indexMap = new HashMap<>();
         //步list = {ArrayList@18238}  size = 19骤二:查询归档树节点。存在未归档文件的节点。
@@ -747,19 +751,19 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		Map<String,List<ArchiveFile>> boxMap = new LinkedHashMap<>();
 		Map<Long,String> boxFileMap = new LinkedHashMap<>();
 
-		archiveAutoMethod3(list3,boxMap,boxFileMap);//单独组卷
+		archiveAutoMethod3(list3,boxMap,boxFileMap,traceId);//单独组卷
 		//设置完成度30%
 		projectClient.updateIsArchivesAutoById(projectId,30);
-		archiveAutoMethod2(list2,projectId,boxMap,boxFileMap);//分类组卷
+		archiveAutoMethod2(list2,projectId,boxMap,boxFileMap,traceId);//分类组卷
 		//设置完成度50%
 		projectClient.updateIsArchivesAutoById(projectId,50);
-		archiveAutoMethod1(list1,boxMap,boxFileMap);//默认组卷
+		archiveAutoMethod1(list1,boxMap,boxFileMap,traceId);//默认组卷
 
 		//分盒组卷的且节点没配置组卷类型的
 		archiveAutoMethod0(list0,boxMap,boxFileMap);//默认组卷
 		//设置完成度70%
 		projectClient.updateIsArchivesAutoById(projectId,70);
-		archiveAutoMethodBox(boxMap);//分盒组卷
+		archiveAutoMethodBox(boxMap,traceId);//分盒组卷
 	}
 
 	private void addBoxMap(ArchiveFile file,Map<String,List<ArchiveFile>> boxMap,Map<Long,String> boxFileMap){
@@ -1477,17 +1481,25 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	 * @param list
 	 * @param boxMap
 	 */
-	private void archiveAutoMethod3(List<ArchiveTreeContract> list,Map<String,List<ArchiveFile>> boxMap,Map<Long,String> boxFileMap){
+	private void archiveAutoMethod3(List<ArchiveTreeContract> list,Map<String,List<ArchiveFile>> boxMap,Map<Long,String> boxFileMap, Long traceId){
 		//步骤1:遍历节点集合
 		for(ArchiveTreeContract node:list){
 			//步骤2:查询节点下的未组卷文件
 			List<ArchiveFile> archiveFiles = archiveFileClient.getListByNodeID(node.getId().toString());
+
 			//步骤3:遍历未归档文件
 			//待组卷文件集合
 			List<ArchiveFile> waitArchiveFiles = new ArrayList<>();
 			//待组卷文件总页数
 			int archivesSize=0;
 			if(archiveFiles!=null){
+
+				if (archiveFiles.size() > 0) {
+					String completeMsg = "[自动组卷] 单独组卷:"+"-traceId:"+traceId + "节点:" + node.getNodeName() + " 文件数量:" + archiveFiles.size();
+					iTraceLogService.saveLog(traceId, completeMsg);
+					//log.info("[自动组卷]{}","单独组卷:"+"-traceId:"+traceId + "节点:" + node.getNodeName() + " 文件数量:" + archiveFiles.size());
+				}
+
 				for(ArchiveFile file:archiveFiles){
 					//步骤4:断文件是否存在分盒设置
 					if(file.getBoxNumber()!=null && file.getBoxNumber()!=-1){
@@ -1515,7 +1527,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	 * 分类并卷组卷  设置分类的节点下只有一个案卷,节点下的所有文件都组成这个案卷。如果设置分类节点(select=1的)多个,案卷归属排序第一个节点。
 	 */
 	private void archiveAutoMethod2(List<ArchiveTreeContract> list,Long projectId,
-									Map<String,List<ArchiveFile>> boxMap,Map<Long,String> boxFileMap){
+									Map<String,List<ArchiveFile>> boxMap,Map<Long,String> boxFileMap, Long traceId){
 
 		//分类并卷集合<groupId,List<文件>>
 		Map<Long,List<ArchiveFile>> archiveMap = new HashMap<>();
@@ -1531,6 +1543,11 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			//步骤3:遍历未归档文件
 			if(archiveFiles!=null){
 				for(ArchiveFile file:archiveFiles){
+
+					if (archiveFiles.size() > 0) {
+						String completeMsg = "[自动组卷] 分类组卷:"+"-traceId:"+traceId + "节点:" + node.getNodeName() + " 文件数量:" + archiveFiles.size();
+						iTraceLogService.saveLog(traceId, completeMsg);
+					}
 					//步骤4:判断文件是否存在分盒设置
 					if(file.getBoxNumber()!=null && file.getBoxNumber()!=-1){
 						//添加到分盒文件集合
@@ -1567,7 +1584,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	 * 默认组卷流程 文件可以跨节点组卷,受最高并卷节点限制范围,跨节点文件组卷时,案卷规格按照第一个文件所在的节点规格 组卷。
 	 */
 	private void archiveAutoMethod1(List<ArchiveTreeContract> list,Map<String,List<ArchiveFile>> boxMap,
-									Map<Long,String> boxFileMap){
+									Map<Long,String> boxFileMap, Long traceId){
 		//最高并卷节点
 		Long archiveAutoNodeId=null;
 
@@ -1617,6 +1634,11 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			//步骤3.3:遍历未组卷文件
 			int archiveFilesSize=0;
 			for(ArchiveFile file:archiveFiles){
+
+				if (archiveFiles.size() > 0) {
+					String completeMsg = "[自动组卷] 最高组卷:"+"-traceId:"+traceId + "节点:" + node.getNodeName() + " 文件数量:" + archiveFiles.size();
+					iTraceLogService.saveLog(traceId, completeMsg);
+				}
 				archiveFilesSize++;
 				//步骤3.4:判断文件是否存在分盒设置
 				if(file.getBoxNumber()!=null && file.getBoxNumber()!=-1) {
@@ -1730,10 +1752,12 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	 * 分盒组卷流程
 	 * @param boxMap
 	 */
-	private void archiveAutoMethodBox(Map<String,List<ArchiveFile>> boxMap){
+	private void archiveAutoMethodBox(Map<String,List<ArchiveFile>> boxMap, Long traceId){
 		Set<Map.Entry<String, List<ArchiveFile>>> entries = boxMap.entrySet();
 		for (Map.Entry<String, List<ArchiveFile>> entry:entries){
 			//一个分盒一个案卷 归属第一个文件所在节点
+			String completeMsg = "[自动组卷] 分盒组卷:"+"-traceId:"+traceId + "box:" + entry.getKey() + " 文件数量:" + entry.getValue().size();
+			iTraceLogService.saveLog(traceId, completeMsg);
 			createArchiveBox(entry.getKey(),entry.getValue());
 		}
 	}
@@ -1743,7 +1767,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	 * @param ids
 	 * @return
 	 */
-	public List<ArchivesAuto> findArchivesAutosByIds(List<Long> ids) {
+	public List<ArchivesAuto> findArchivesAutosByIds(List<Long> ids,Long traceId) {
 		QueryWrapper<ArchivesAuto> queryWrapper = new QueryWrapper<>();
 		queryWrapper.in("node_id", ids)
 				.eq("is_deleted",0)
@@ -1769,11 +1793,11 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	 * @param contractId
 	 * @param nodeId
 	 */
-	public void refreshFileNumberNoSlipt(Long projectId,Long contractId,Long nodeId,boolean bforce) {
+	public void refreshFileNumberNoSlipt(Long projectId,Long contractId,Long nodeId,boolean bforce, Long traceId) {
 		List<ArchiveTreeContract> list = archiveTreeContractClient.getListByProjectId(projectId);
 		if (nodeId!= null) {
 			ArchiveTreeContract node = archiveTreeContractClient.getArchiveTreeContractById(nodeId);
-			if (node!= null && node.getContractId() != null) {
+			if (node!= null && node.getContractId() != null && node.getContractId() != -1) {
 				contractId = node.getContractId();
 			}
 		}
@@ -1781,7 +1805,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		Integer indexType = 0;
 		ArchiveProjectConfig config = archiveProjectConfigService.getByProjectIdOrNew(projectId);
 
-		this.refreshFileNumberNoSlipt(list,contractId,nodeId,bforce,config.getIndexType(),config.getDirType(),config.getIndexNum());
+		this.refreshFileNumberNoSlipt(list,contractId,nodeId,bforce,config.getIndexType(),config.getDirType(),config.getIndexNum(),traceId);
 	}
 
 	/**
@@ -1791,7 +1815,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	 * @param nodeId
 	 */
 	public void refreshFileNumberNoSlipt(List<ArchiveTreeContract> archiveTreeContracts,Long contractId,Long nodeId,
-										 boolean bforce,Integer indexType, Integer dirType,Integer indexNum) {
+										 boolean bforce,Integer indexType, Integer dirType,Integer indexNum,Long traceId) {
 
 		List<ArchiveTreeContractVO2> subTreeList = new ArrayList<>();
 		List<List<ArchiveTreeContract>>  subGroupedList = new ArrayList<>();
@@ -1820,7 +1844,13 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			if(ids.size()==0){
 				continue;
 			}
-			List<ArchivesAuto> archivesAutos = findArchivesAutosByIds(ids);
+
+			for(ArchiveTreeContract node:subList){
+				String fileMessage = "[自动组卷] 刷新档号:节点名0 "+ subList.get(0).getNodeName()+ "-节点列表:"+node.getNodeName()+ "-traceId:"+traceId;
+				log.info(fileMessage);
+			}
+
+			List<ArchivesAuto> archivesAutos = findArchivesAutosByIds(ids,traceId);
 			if (archivesAutos == null || archivesAutos.size() == 0) {
 				continue;
 			}
@@ -1830,6 +1860,13 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 				node_fileNumberPrefixMap.put(node.getId().toString(),node.getFileNumberPrefix());
 			}
 
+			if (archivesAutos.size() > 0) {
+				String startLogMessage = "[自动组卷] 刷新档号:节点名0 "+ subList.get(0).getNodeName()+"-案卷0 :"+archivesAutos.get(0).getName()
+						+"-案卷数量:"+archivesAutos.size()+"-traceId:"+traceId;
+				iTraceLogService.saveLog(traceId, startLogMessage);
+			}
+
+
 			for (ArchivesAuto archivesAuto: archivesAutos) {
 				String nodeId1 = archivesAuto.getNodeId().toString();
 				String fileNumberPrefix ="";
@@ -1869,6 +1906,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 					}
 				}
 
+				String fileMessage = "[自动组卷] 刷新档号:"+archivesAuto.getName()+"-fileNumber:"+fileNumber+"-index:"+index+"-traceId:"+traceId;
+				log.info(fileMessage);
 				index++;
 			}
 		}
@@ -2329,74 +2368,99 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		return autoMapper.getCarrierTypeByDict();
 	}
 
+
+
 	@Override
 	public void archiveAutoMethodThread(Long projectId, Long contractId, Long nodeId, Long traceId) {
-		executorService.execute(()->{
-			try{
-				//将项目未锁定案卷拆卷
-				log.info("[自动组卷]{}","开始对未锁定案卷拆卷。projectId:"+projectId+"-contractId:"+contractId+"-nodeId:"+nodeId+"-traceId:"+traceId);
+		executorService.execute(() -> {
+			try {
+				// 将项目未锁定案卷拆卷
+				String startSplitMsg = "[自动组卷] 开始对未锁定案卷拆卷。projectId:" + projectId + "-contractId:" + contractId + "-nodeId:" + nodeId + "-traceId:" + traceId;
+				//log.info(startSplitMsg);
+				iTraceLogService.saveLog(traceId, startSplitMsg);
 
-				//todo 有项目上传几百G文件,点组卷会产生大量费用,等改完文件下载走内网再打开此开关。
-//				if (true) {
-//					return;
-//				}
+				// TODO: 有项目上传几百G文件,点组卷会产生大量费用,等改完文件下载走内网再打开此开关。
+				// if (true) {
+				//     return;
+				// }
 
-				splitArchvies(projectId,contractId,nodeId);
-				//设置完成度10%
-				contractClient.updateIsArchivesAutoById(contractId,10);
+				splitArchvies(projectId, contractId, nodeId);
+				// 设置完成度10%
+				contractClient.updateIsArchivesAutoById(contractId, 10);
 
-				//项目自动组卷入口
-				log.info("[自动组卷]{}","开始自动组卷。projectId:"+projectId+"-contractId:"+contractId+"-nodeId:"+nodeId+"-traceId:"+traceId);
-				archiveAutoMethod(projectId,contractId,nodeId);
-				//设置完成度80%
-				contractClient.updateIsArchivesAutoById(contractId,80);
+				// 项目自动组卷入口
+				String startAutoArchiveMsg = "[自动组卷] 开始自动组卷。projectId:" + projectId + "-contractId:" + contractId + "-nodeId:" + nodeId + "-traceId:" + traceId;
+				//log.info(startAutoArchiveMsg);
+				iTraceLogService.saveLog(traceId, startAutoArchiveMsg);
 
-				//刷新项目档号
-				log.info("[自动组卷]{}","开始刷新组卷档号。projectId:"+projectId+"-contractId:"+contractId+"-nodeId:"+nodeId+"-traceId:"+traceId);
-				refreshFileNumberNoSlipt(projectId,contractId,nodeId,true);
+				archiveAutoMethod(projectId, contractId, nodeId, traceId);
+				// 设置完成度80%
+				contractClient.updateIsArchivesAutoById(contractId, 80);
 
+				// 刷新项目档号
+				String startRefreshMsg = "[自动组卷] 开始刷新组卷档号。projectId:" + projectId + "-contractId:" + contractId + "-nodeId:" + nodeId + "-traceId:" + traceId;
+				//log.info(startRefreshMsg);
+				iTraceLogService.saveLog(traceId, startRefreshMsg);
 
-				//设置自动组卷结束
-				contractClient.updateIsArchivesAutoById(contractId,0);
-				log.info("[自动组卷]{}","自动组卷完成。projectId:"+projectId+"-contractId:"+contractId+"-nodeId:"+nodeId+"-traceId:"+traceId);
-			}catch (Exception e){
+				refreshFileNumberNoSlipt(projectId, contractId, nodeId, true,traceId);
+
+				// 设置自动组卷结束
+				contractClient.updateIsArchivesAutoById(contractId, 0);
+				String completeMsg = "[自动组卷] 自动组卷完成。projectId:" + projectId + "-contractId:" + contractId + "-nodeId:" + nodeId + "-traceId:" + traceId;
+				//log.info(completeMsg);
+				iTraceLogService.saveLog(traceId, completeMsg);
+
+			} catch (Exception e) {
 				e.printStackTrace();
-				log.error("[自动组卷] 报错。"+e.getMessage()+"--projectId:"+projectId+"-contractId:"+contractId+"-nodeId:"+nodeId+"-traceId:"+traceId);
-				//设置自动组卷结束
+				String errorMsg = "[自动组卷] 报错。" + e.getMessage() + "--projectId:" + projectId + "-contractId:" + contractId + "-nodeId:" + nodeId + "-traceId:" + traceId;
+				//log.error(errorMsg);
+				iTraceLogService.saveLog(traceId, errorMsg);
+
+				// 设置自动组卷结束
 				contractClient.updateIsArchivesAutoById(contractId, 0);
-			}finally {
+
+			} finally {
 				contractClient.updateIsArchivesAutoById(contractId, 0);
-				log.error("[自动组卷] 流程结束--projectId:"+projectId+"-contractId:"+contractId+"-nodeId:"+nodeId+"-traceId:"+traceId);
+				String endMsg = "[自动组卷] 流程结束--projectId:" + projectId + "-contractId:" + contractId + "-nodeId:" + nodeId + "-traceId:" + traceId;
+				//log.error(endMsg);
+				iTraceLogService.saveLog(traceId, endMsg);
 			}
 		});
 	}
 
 
 	@Override
-	public void refreshFileNumberThread(Long projectId, Long contractId, Long nodeId) {
+	public void refreshFileNumberThread(Long projectId, Long contractId, Long nodeId, Long traceId) {
 		executorService.execute(()->{
-			try{
-				//将项目未锁定案卷拆卷
-				log.info("[自动组卷]{}","开始对未锁定案卷拆卷。projectId:"+projectId+"-contractId:"+contractId+"-nodeId:"+nodeId);
+			try {
+				// 将项目未锁定案卷拆卷
+				String startLogMessage = "[刷新档号] 开始对未锁定案卷拆卷。projectId:"+projectId+"-contractId:"+contractId+"-nodeId:"+nodeId+"-traceId:"+traceId;
+				iTraceLogService.saveLog(traceId, startLogMessage);
 
-				//设置完成度10%
+				// 设置完成度10%
 				contractClient.updateIsArchivesAutoById(contractId,10);
 
-				//项目自动组卷入口
-				this.refreshFileNumberNoSlipt(projectId,contractId,null,false);
+				// 项目自动组卷入口
+				this.refreshFileNumberNoSlipt(projectId, contractId, null, false,traceId);
 
-				//设置自动组卷结束
+				// 设置自动组卷结束
 				contractClient.updateIsArchivesAutoById(contractId,0);
-				log.info("[自动组卷]{}","自动组卷完成。projectId:"+projectId+"-contractId:"+contractId+"-nodeId:"+nodeId);
-			}catch (Exception e){
+
+				String endLogMessage = "[刷新档号] 自动组卷完成。projectId:"+projectId+"-contractId:"+contractId+"-nodeId:"+nodeId+"-traceId:"+traceId;
+				iTraceLogService.saveLog(traceId, endLogMessage);
+
+			} catch (Exception e) {
 				e.printStackTrace();
-				log.error("自动组卷报错。"+e.getMessage()+"--projectId:"+projectId+"-contractId:"+contractId+"-nodeId:"+nodeId);
-				//设置自动组卷结束
+				String errorLogMessage = "刷新档号报错。" + e.getMessage() + "--projectId:"+projectId+"-contractId:"+contractId+"-nodeId:"+nodeId+"-traceId:"+traceId;
+				iTraceLogService.saveLog(traceId, errorLogMessage);
+
+				// 设置自动组卷结束
 				contractClient.updateIsArchivesAutoById(contractId, 0);
 			}
 		});
 	}
 
+
 	@Override
 	public List<User> getArchiveDestroyUser(Long projectId) {
 		return autoMapper.getArchiveDestroyUser(projectId);

+ 29 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/TraceLogServiceImpl.java

@@ -1,11 +1,13 @@
 package org.springblade.archive.service.impl;
 
+import lombok.extern.slf4j.Slf4j;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.archive.entity.TraceLog;
 import org.springblade.archive.mapper.TraceLogMapper;
 import org.springblade.archive.service.ITraceLogService;
 import org.springframework.stereotype.Service;
 
+@Slf4j
 @Service
 public class TraceLogServiceImpl extends BaseServiceImpl<TraceLogMapper, TraceLog> implements ITraceLogService {
     // Implementations of methods defined in ITraceLogService
@@ -40,4 +42,31 @@ public class TraceLogServiceImpl extends BaseServiceImpl<TraceLogMapper, TraceLo
         }
     }
 
+    @Override
+    public void saveLog(Long traceId, String format, Object... args) {
+        try {
+            // 使用String.format来格式化字符串
+            String content = String.format(format, args);
+
+            // 截取content,确保长度不超过400字符
+            if (content.length() > 400) {
+                content = content.substring(0, 400);
+            }
+
+            log.info(content);
+
+            // 创建TraceLog对象
+            TraceLog traceLog = new TraceLog();
+            traceLog.setTraceId(traceId);
+            traceLog.setContent(content);
+            save(traceLog);
+
+        } catch (Exception e) {
+            // 异常处理逻辑,比如打印日志
+            System.err.println("Error saving trace log: " + e.getMessage());
+        }
+    }
+
+
+
 }