Kaynağa Gözat

质检-同步合同段-后管同步合同段时,对待审批和已审批和表单历史历史数据

LHB 1 ay önce
ebeveyn
işleme
420516ad59

+ 0 - 82
blade-service/blade-business/src/main/java/org/springblade/business/utils/FileUtils.java

@@ -370,88 +370,6 @@ public class FileUtils {
         return path;
     }
 
-    /**
-     * 获取文件绝对路径并复制文件
-     * @param sourcePath 源文件路径(相对或绝对)
-     */
-    public static String copyFileWithAbsolutePath(String sourcePath) {
-        try {
-            // 1. 获取源文件的绝对路径
-            File sourceFile = new File(sourcePath);
-            if(!sourceFile.exists()){
-                String path = getNetUrl(sourcePath);
-                InputStream ossInputStream = CommonUtil.getOSSInputStream(getNetUrl(sourcePath));
-            }
-
-            String absolutePath = sourceFile.getAbsolutePath();
-            System.out.println("源文件绝对路径: " + absolutePath);
-
-            // 2. 验证文件存在且可读
-            if (!sourceFile.exists()) {
-                System.err.println("错误: 源文件不存在");
-                throw new ServiceException("错误: 源文件不存在");
-            }
-            if (!sourceFile.canRead()) {
-                System.err.println("错误: 无法读取源文件");
-
-                throw new ServiceException("错误: 源文件不存在");
-            }
-
-            // 3. 创建目标文件路径(在相同目录,文件名添加 _copy)
-            String parentDir = sourceFile.getParent();
-            String fileName = sourceFile.getName();
-
-            // 提取文件名和扩展名
-            String baseName;
-            String extension = "";
-            int dotIndex = fileName.lastIndexOf('.');
-            if (dotIndex > 0) {
-                baseName = fileName.substring(0, dotIndex);
-                extension = fileName.substring(dotIndex);
-            } else {
-                baseName = fileName;
-            }
-
-            // 生成唯一的目标文件名(避免覆盖)
-            File destFile;
-            int copyCounter = 1;
-            do {
-                String newFileName = baseName + "_copy" +
-                        (copyCounter > 1 ? "_" + copyCounter : "") +
-                        extension;
-                destFile = new File(parentDir, newFileName);
-                copyCounter++;
-            } while (destFile.exists());
-
-            System.out.println("目标文件路径: " + destFile.getAbsolutePath());
-
-            // 4. 执行文件复制(使用NIO方法)
-            Path source = sourceFile.toPath();
-            Path destination = destFile.toPath();
-
-            // 复制文件并保留属性
-            Files.copy(source, destination,
-                    StandardCopyOption.COPY_ATTRIBUTES,
-                    StandardCopyOption.REPLACE_EXISTING);
-
-            System.out.println("文件复制成功!");
-            return destFile.getAbsolutePath();
-        } catch (InvalidPathException e) {
-            System.err.println("路径无效: " + e.getMessage());
-            throw new ServiceException("路径无效");
-        } catch (FileAlreadyExistsException e) {
-            System.err.println("文件已存在: " + e.getMessage());
-            throw new ServiceException("文件已存在");
-        } catch (AccessDeniedException e) {
-            System.err.println("访问被拒绝: " + e.getMessage());
-            throw new ServiceException("访问被拒绝");
-        } catch (IOException e) {
-            System.err.println("IO错误: " + e.getMessage());
-            e.printStackTrace();
-            throw new ServiceException("IO错误");
-        }
-    }
-
     /**
      * 获取本地文件,若不存在则从URL下载
      */

+ 51 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsSynchronousEViSaServiceImpl.java

@@ -1,25 +1,32 @@
 package org.springblade.manager.service.impl;
 
 import cn.hutool.core.date.DateTime;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.tool.utils.CollectionUtil;
 import org.springblade.manager.entity.*;
+import org.springblade.manager.feign.WbsTreeContractOldHtmlClient;
 import org.springblade.manager.mapper.TextdictInfoMapper;
 import org.springblade.manager.mapper.WbsTreeContractMapper;
 import org.springblade.manager.mapper.WbsTreePrivateMapper;
 import org.springblade.manager.mapper.WbsTreeSynchronousRecordMapper;
+import org.springblade.manager.service.WbsTreeContractOldHtmlService;
+import org.springblade.manager.utils.FileUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardCopyOption;
+import java.util.*;
 import java.util.stream.Collectors;
 
+import static org.springblade.core.secure.utils.AuthUtil.getUser;
+
 /**
  * @author LHB
  */
@@ -40,6 +47,9 @@ public class WbsSynchronousEViSaServiceImpl {
     @Autowired
     private ElementFormulaMappingServiceImpl elementFormulaMappingService;
 
+    @Autowired
+    private WbsTreeContractOldHtmlService wbsTreeContractOldHtmlService;
+
     @Transactional(rollbackFor = Exception.class)
     public void updateTextDictInfo(Long projectId, List<Long> editPrivateIds, List<TextdictInfo> addData) {
         //删除 需要新增的节点的电签和默认值
@@ -150,7 +160,7 @@ public class WbsSynchronousEViSaServiceImpl {
     }
 
     @Transactional(rollbackFor = Exception.class)
-    public void updateContract(String type, Long pId, Long createUserId, List<WbsTreeContract> list) {
+    public void updateContract(String type, Long pId, Long createUserId, List<WbsTreeContract> list, List<WbsTreeContract> wbsTreeContracts) {
         //排序调整
         if (type.contains("7")) {
             list.sort(Comparator.comparingInt(WbsTreeContract::getSort));
@@ -198,6 +208,42 @@ public class WbsSynchronousEViSaServiceImpl {
                 wbsTreeContractMapper.updateSortBatchByPKeyId(resourceData);
             }
         }
+
+        //处理html 复制之后记录在新表中w
+        if (CollectionUtils.isNotEmpty(wbsTreeContracts)) {
+            List<WbsTreeContractOldHtml> data = new ArrayList<>();
+            try {
+                for (WbsTreeContract wbsTreeContract : wbsTreeContracts) {
+                    //如果有历史记录 并且状态为0 则不记录当前历史记录
+                    long count = wbsTreeContractOldHtmlService.count(Wrappers.<WbsTreeContractOldHtml>lambdaQuery()
+                            .eq(WbsTreeContractOldHtml::getContractFormId, wbsTreeContract.getPKeyId())
+                            .eq(WbsTreeContractOldHtml::getIsDeleted, 0));
+                    if(count > 0){
+                        continue;
+                    }
+
+
+                    WbsTreeContractOldHtml oldHtml = new WbsTreeContractOldHtml();
+                    oldHtml.setId(SnowFlakeUtil.getId());
+                    oldHtml.setCreateUser(getUser().getUserId());
+                    String htmlUrl = wbsTreeContract.getHtmlUrl();
+                    // 获取或下载文件
+                    Path sourcePath = FileUtils.getOrDownloadFile(htmlUrl);
+                    // 生成副本路径
+                    Path copyPath = FileUtils.generateCopyPath(sourcePath);
+                    // 执行复制操作(覆盖已存在的文件)
+                    Files.copy(sourcePath, copyPath, StandardCopyOption.REPLACE_EXISTING);
+
+                    oldHtml.setContractFormId(wbsTreeContract.getPKeyId());
+                    oldHtml.setOldHtmlUrl(copyPath.toFile().getAbsolutePath());
+                    data.add(oldHtml);
+                }
+                wbsTreeContractOldHtmlService.saveBatch(data);
+            } catch (Exception e) {
+                e.printStackTrace();
+                throw new ServiceException(e.getMessage());
+            }
+        }
     }
 
     @Transactional(rollbackFor = Exception.class)

+ 23 - 7
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsSynchronousServiceImpl.java

@@ -140,7 +140,7 @@ public class WbsSynchronousServiceImpl {
                 .ne(WbsTree::getId, wbsTree.getId())
                 .eq(WbsTree::getInitTableName, wbsTree.getInitTableName())
                 .eq(WbsTree::getIsDeleted, 0));
-        if(CollectionUtil.isEmpty(wbsTrees)){
+        if (CollectionUtil.isEmpty(wbsTrees)) {
             throw new ServiceException("当前项目没有相同实体表的其他表单");
         }
 
@@ -166,11 +166,11 @@ public class WbsSynchronousServiceImpl {
                 Objects.equals(f.getExcelId(), wbsTreePrivate.getExcelId())
         ).collect(Collectors.toList());
 
-        if(CollectionUtil.isNotEmpty(collect1)){
+        if (CollectionUtil.isNotEmpty(collect1)) {
             collect.addAll(collect1);
         }
         //清表不同的数据
-        List<WbsTreePrivate> noExcelIdEq = wbsTreePrivates.stream().filter(f -> f.getExcelId()!=null && !Objects.equals(f.getExcelId(), wbsTreePrivate.getExcelId())).collect(Collectors.toList());
+        List<WbsTreePrivate> noExcelIdEq = wbsTreePrivates.stream().filter(f -> f.getExcelId() != null && !Objects.equals(f.getExcelId(), wbsTreePrivate.getExcelId())).collect(Collectors.toList());
         StringBuilder sb = new StringBuilder();
         if (CollectionUtil.isNotEmpty(noExcelIdEq)) {
             for (WbsTreePrivate treePrivate : noExcelIdEq) {
@@ -183,7 +183,7 @@ public class WbsSynchronousServiceImpl {
         }
 
         //修改数据
-        wbsSynchronousEViSaService.updateSyncPrivateForm(wbsTreePrivate, collect, wbsTreeSynchronousRecord.getId(),sb.toString());
+        wbsSynchronousEViSaService.updateSyncPrivateForm(wbsTreePrivate, collect, wbsTreeSynchronousRecord.getId(), sb.toString());
     }
 
     /**
@@ -598,6 +598,7 @@ public class WbsSynchronousServiceImpl {
         List<ContractInfo> contractInfos = contractInfoMapper.selectContractIdByProjectId(String.valueOf(wbsTreeSynchronousRecord.getProjectId()));
 
         List<WbsTreeContract> editData = new ArrayList<>();
+        List<WbsTreeContract> oldHtml = new ArrayList<>();
         for (String primaryKeyId : nodeIds) {
 
             //获取当前节点对应节点信息
@@ -687,6 +688,10 @@ public class WbsSynchronousServiceImpl {
                                 if (templateNode.getType() == 2) {
                                     //同步范围 当前节点是否允许修改
                                     Boolean isSync = false;
+
+                                    //是否记录历史html
+                                    Boolean isOldHtml = false;
+
                                     if (CollectionUtil.isNotEmpty(contractRanges)) {
                                         switch (Integer.valueOf(wbsTreePrivate.getWbsType())) {
                                             //质检
@@ -706,9 +711,11 @@ public class WbsSynchronousServiceImpl {
                                                     } else if (submit == 1 && contractRanges.contains(WbsSyncTypeEnum.PENDING_APPROVAL.code)) {
                                                         //待审批 104
                                                         isSync = true;
+                                                        isOldHtml = true;
                                                     } else if (submit == 2 && contractRanges.contains(WbsSyncTypeEnum.APPROVED.code)) {
                                                         //已审批 105
                                                         isSync = true;
+                                                        isOldHtml = true;
                                                     }
                                                 }
                                                 break;
@@ -761,6 +768,11 @@ public class WbsSynchronousServiceImpl {
                                             if (isSync) {
                                                 editContractNodes.add(editContractNode);
                                             }
+                                            //记录历史html
+                                            if (isOldHtml) {
+                                                oldHtml.add(editContractNode);
+                                            }
+
                                         }
                                     }
                                     //找到了某个选中节点下与项目节点想同的节点了  提前结束循环,节省资源
@@ -818,17 +830,21 @@ public class WbsSynchronousServiceImpl {
         Set<Long> pIds = collect1.keySet();
         Integer nodeNumEnd = 0;
 
+        Map<Long, List<WbsTreeContract>> collect2 = oldHtml.stream().collect(Collectors.groupingBy(WbsTreeContract::getPId));
+
         for (Long pId : pIds) {
             nodeNumEnd++;
             List<WbsTreeContract> list = collect1.get(pId);
+            List<WbsTreeContract> oldHtmlPId = collect2.get(pId);
 
-            wbsSynchronousEViSaService.updateContract(wbsTreeSynchronousRecord.getType(), pId, wbsTreeSynchronousRecord.getCreateUserId(), list);
+            wbsSynchronousEViSaService.updateContract(wbsTreeSynchronousRecord.getType(), pId, wbsTreeSynchronousRecord.getCreateUserId(), list, oldHtmlPId);
             synchronousRecordMapper.update(null, Wrappers.<WbsTreeSynchronousRecord>lambdaUpdate()
                     .set(WbsTreeSynchronousRecord::getNodeNumEnd, nodeNumEnd)
                     .set(WbsTreeSynchronousRecord::getUpdateTime, DateTime.now())
                     .eq(WbsTreeSynchronousRecord::getId, wbsTreeSynchronousRecord.getId()));
         }
 
+
         synchronousRecordMapper.update(null, Wrappers.<WbsTreeSynchronousRecord>lambdaUpdate()
                 .set(WbsTreeSynchronousRecord::getStatus, 2)
                 .set(WbsTreeSynchronousRecord::getErrorMsg, null)
@@ -982,7 +998,7 @@ public class WbsSynchronousServiceImpl {
                         List<Long> collect1 = addData.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
                         //这里可以保存到数据库指定错误日志表
                         throw new ServiceException("添加失败:" + StringUtil.join(collect1, ","));
-                    }else{
+                    } else {
                         //排序调整-连续排序
                         if (wbsTreeSynchronousRecord.getType().contains("7")) {
                             //获取节点下的当前表单
@@ -1128,7 +1144,7 @@ public class WbsSynchronousServiceImpl {
                     //这里可以保存到数据库指定错误日志表
                     //这里可以保存到数据库指定错误日志表
                     throw new ServiceException("添加失败:" + StringUtil.join(collect1, ","));
-                }else{
+                } else {
                     //排序调整
                     if (wbsTreeSynchronousRecord.getType().contains("7")) {
                         //获取节点下的当前表单

+ 41 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/FileUtils.java

@@ -29,6 +29,7 @@ import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.common.utils.SystemUtils;
 import org.springblade.common.vo.DataVO;
+import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.tool.utils.FileUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.IoUtil;
@@ -42,6 +43,7 @@ import java.awt.*;
 import java.awt.image.BufferedImage;
 import java.io.*;
 import java.net.URLEncoder;
+import java.nio.file.*;
 import java.util.List;
 import java.util.*;
 import java.util.regex.Matcher;
@@ -1052,6 +1054,45 @@ public class FileUtils {
     }
 
 
+    /**
+     * 获取本地文件,若不存在则从URL下载
+     */
+    public static Path getOrDownloadFile(String localPath) throws IOException {
+        Path path = Paths.get(localPath);
+
+        // 如果本地文件不存在,则从URL下载
+        if (!Files.exists(path)) {
+            System.out.println("本地文件不存在,开始下载...");
+            // 确保父目录存在
+            Path parentDir = path.getParent();
+            if (parentDir != null && !Files.exists(parentDir)) {
+                Files.createDirectories(parentDir);
+            }
+
+            // 从URL下载文件
+            try (InputStream in = CommonUtil.getOSSInputStream(getNetUrl(localPath))) {
+                Files.copy(in, path);
+                System.out.println("文件下载成功: " + path);
+            } catch (IOException e) {
+                throw new IOException("下载文件失败: " + e.getMessage(), e);
+            }
+        }
+        return path;
+    }
+
+    /**
+     * 生成带后缀的副本路径
+     */
+    public static Path generateCopyPath(Path originalPath) {
+        String suffix = "_copy";
+        String fileName = originalPath.getFileName().toString();
+        int dotIndex = fileName.lastIndexOf('.');
 
+        // 处理带扩展名和不带扩展名的文件
+        String newName = (dotIndex > 0)
+                ? fileName.substring(0, dotIndex) + suffix + fileName.substring(dotIndex)
+                : fileName + suffix;
 
+        return originalPath.resolveSibling(newName);
+    }
 }