Bläddra i källkod

Merge branch 'test-merge' of http://219.151.181.73:3000/zhuwei/bladex into test-merge

lvy 1 vecka sedan
förälder
incheckning
04801c7d0d

+ 1 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/NameRuleDto.java

@@ -13,5 +13,6 @@ public class NameRuleDto {
     private String nodeId;
     private Long projectId;
     private Integer type;
+    private String remark;
 
 }

+ 2 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/NameRuleVo.java

@@ -15,6 +15,8 @@ public class NameRuleVo {
     private String nameVaule;
     // 1全部节点 2部分节点
     private Integer type;
+    //资料类型
+    private String remark;
     //文件题名范围
     private List<NameRuleVo1> list=new ArrayList<>();
 

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -1921,7 +1921,7 @@ public class ExcelTabController extends BladeController {
             updateWrapper.set("tab_group_id", tabGroupId);
             wbsTreeContractService.update(updateWrapper);
         }
-        return R.data("成功");
+        return R.data(wbsTreeContract);
     }
 
 

+ 30 - 9
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java

@@ -43,6 +43,7 @@ import org.springblade.manager.service.impl.ExcelTabServiceImpl;
 import org.springblade.manager.service.impl.NodeBaseInfoServiceImpl;
 import org.springblade.manager.service.impl.WbsTreeContractServiceImpl;
 import org.springblade.manager.util.DataStructureFormatUtils;
+import org.springblade.manager.utils.DuplicateSheetRecognizer;
 import org.springblade.manager.utils.FileUtils;
 import org.springblade.manager.utils.RandomNumberHolder;
 import org.springblade.manager.vo.*;
@@ -703,14 +704,6 @@ public class WbsTreeContractController extends BladeController {
         if (wbsTreeContracts.isEmpty()) {
             return R.fail("该节点下没有找到对应的表单数据");
         }
-
-        // 处理表单名称(与下载时的sheet名处理逻辑一致,确保匹配)
-        Map<String, WbsTreeContract> nodeNameToContractMap = new HashMap<>();
-        for (WbsTreeContract contract : wbsTreeContracts) {
-            String processedNodeName = contract.getNodeName().replaceAll("[\\\\/:*?\"<>|]", "_");
-            nodeNameToContractMap.put(processedNodeName, contract);
-        }
-
         // 2. 加载上传的多sheet Excel文件
         com.spire.xls.Workbook mainWorkbook = new com.spire.xls.Workbook();
         try {
@@ -722,11 +715,39 @@ public class WbsTreeContractController extends BladeController {
 
         // 3. 遍历所有sheet,逐个处理
         int sheetCount = mainWorkbook.getWorksheets().getCount();
+        // 处理表单名称(与下载时的sheet名处理逻辑一致,确保匹配)
+        Map<String, WbsTreeContract> nodeNameToContractMap = new HashMap<>();
+        for (WbsTreeContract contract : wbsTreeContracts) {
+            String processedNodeName = contract.getNodeName().replaceAll("[\\\\/:*?\"<>|]", "_").trim();
+            nodeNameToContractMap.put(processedNodeName, contract);
+        }
+        if(wbsTreeContracts.size()<sheetCount){
+            for (int i = 0; i < sheetCount; i++) {
+                com.spire.xls.Worksheet sheet = mainWorkbook.getWorksheets().get(i);
+                String sheetName = sheet.getName();
+                String processedSheetName = sheetName.replaceAll("[\\\\/:*?\"<>|]", "_").trim(); // 处理sheet名特殊字符
+                // 1. 识别当前sheet是否为复制表
+                DuplicateSheetRecognizer.DuplicateSheetResult result =
+                        DuplicateSheetRecognizer.recognize(processedSheetName);
+                if (result.isDuplicate()) {
+                    String originalName = result.getOriginalName();
+                    if(nodeNameToContractMap.containsKey(originalName)){
+                        WbsTreeContract contract = nodeNameToContractMap.get(originalName);
+                        R r = excelTabController.copeBussTab(contract.getPKeyId());
+                        if(r.isSuccess()){
+                            WbsTreeContract data = (WbsTreeContract) r.getData();
+                            nodeNameToContractMap.put(data.getNodeName(), data);
+                            sheet.setName(data.getNodeName());
+                        }
+                    }
 
+                }
+            }
+        }
         for (int i = 0; i < sheetCount; i++) {
             com.spire.xls.Worksheet sheet = mainWorkbook.getWorksheets().get(i);
             String sheetName = sheet.getName();
-            String processedSheetName = sheetName.replaceAll("[\\\\/:*?\"<>|]", "_"); // 处理sheet名特殊字符
+            String processedSheetName = sheetName.replaceAll("[\\\\/:*?\"<>|]", "_").trim(); // 处理sheet名特殊字符
 
             // 匹配对应的表单
             WbsTreeContract matchedContract = nodeNameToContractMap.get(processedSheetName);

+ 2 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java

@@ -960,6 +960,7 @@ public class WbsTreePrivateController extends BladeController {
                 vo.setNameVaule(entry.getValue().get(0).getV());
                 vo.setNameRule(getNameRuleV1(entry.getValue().get(0).getV()));
                 vo.setType(entry.getValue().get(0).getNameType());
+                vo.setRemark(entry.getValue().get(0).getRemark());
                 List<NameRuleVo1>vo1s=new ArrayList<>();
                 for (WbsParamVo2 param : entry.getValue()) {
                     vo1s.add(new NameRuleVo1(param.getNodeId(),param.getNodeName()));
@@ -1030,6 +1031,7 @@ public class WbsTreePrivateController extends BladeController {
                 param.setProjectId(dto.getProjectId());
                 param.setNameId(SnowFlakeUtil.getId());
                 param.setNameType(dto.getType());
+                param.setRemark(dto.getRemark());
                 //如果nameID不为空,先删除在保存
                 if(dto.getNameId()!=null){
                     iWbsParamService.getBaseMapper().delete(new QueryWrapper<WbsParam>().eq("name_id",dto.getNameId()));

+ 2 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsParamMapper.xml

@@ -24,7 +24,8 @@
             a.node_id,
             a.name_id,
             a.name_type,
-            (SELECT node_name FROM m_wbs_tree_private WHERE id = a.node_id LIMIT 1) AS nodeName
+            (SELECT node_name FROM m_wbs_tree_private WHERE id = a.node_id LIMIT 1) AS nodeName,
+            a.remark
         FROM m_wbs_param a
         WHERE a.project_id = #{projectId}
           AND a.is_deleted = 0

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -1421,7 +1421,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 //                    sqlInfo = sqlInfo + keyStr + ") VALUES (" + valStr + ")";
 
                     WbsTreeContract wbsTreeContractByP = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
-                            .eq(WbsTreeContract::getId, wbsTreeContract.getParentId()).eq(WbsTreeContract::getContractId, tableInfo.getContractId()));
+                            .eq(WbsTreeContract::getPKeyId, wbsTreeContract.getPId()).eq(WbsTreeContract::getContractId, wbsTreeContract.getContractId()));
                     if (wbsTreeContractByP != null) {
                         //处理文件提名
                         String fileName = this.wbsParamService.createFileTitle(wbsTreeContractByP);

+ 101 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsParamServiceImpl.java

@@ -79,13 +79,16 @@ public class WbsParamServiceImpl extends BaseServiceImpl<WbsParamMapper, WbsPara
                     RandomNumberHolder.setRandomTemplateType(1);
                     WbsTreePrivate wtp = this.wtpId(wtc.getPKeyId());
                     if(wtp!=null){
-                        /*优先取私有*/
-                        WbsParam wp = this.getOne(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getNodeId, wtp.getPKeyId()).eq(WbsParam::getK, FILE_TITLE).last(" limit 1"));
+                        //优先使用文件题名全局配置里面的规则
+                        WbsParam wp=this.getPrivateNameRuleByPkeyId(wtc);
                         if (wp == null) {
-                            WbsTreePrivate publicWtp = this.getOriginWtp(wtp.getPKeyId());
-                            wp = this.getOne(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getNodeId, publicWtp.getId()).eq(WbsParam::getK, FILE_TITLE).last(" limit 1 "));
+                            wp = this.getOne(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getNodeId, wtp.getPKeyId()).eq(WbsParam::getK, FILE_TITLE).last(" limit 1"));
                             if(wp==null){
-                                wp = this.getOne(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getNodeId, publicWtp.getTreePId()).eq(WbsParam::getK, FILE_TITLE).last(" limit 1 "));
+                                WbsTreePrivate publicWtp = this.getOriginWtp(wtp.getPKeyId());
+                                wp = this.getOne(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getNodeId, publicWtp.getId()).eq(WbsParam::getK, FILE_TITLE).last(" limit 1 "));
+                                if(wp==null){
+                                    wp = this.getOne(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getNodeId, publicWtp.getTreePId()).eq(WbsParam::getK, FILE_TITLE).last(" limit 1 "));
+                                }
                             }
                         }
                         if (Func.isNotEmpty(wp)) {
@@ -106,6 +109,9 @@ public class WbsParamServiceImpl extends BaseServiceImpl<WbsParamMapper, WbsPara
         }
         return "找不到节点";
     }
+
+
+
     //根据选择的文件题名规则,返回文件题名;
     @Override
     public String createFileTitle1(WbsTreeContract wtc,String wp) {
@@ -270,6 +276,96 @@ public class WbsParamServiceImpl extends BaseServiceImpl<WbsParamMapper, WbsPara
         return R.success("暂无数据");
     }
 
+    private WbsParam getPrivateNameRuleByPkeyId(WbsTreeContract wtc) {
+        WbsParam wp=null;
+        List<WbsParam> wbsParams = baseMapper.selectList(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getProjectId, wtc.getProjectId()).eq(WbsParam::getK, FILE_TITLE));
+        String sql1="select * from m_wbs_tree_private where p_key_id="+wtc.getIsTypePrivatePid();
+        WbsTreePrivate wbsTreePrivate = jdbcTemplate.queryForObject(sql1,new BeanPropertyRowMapper<>(WbsTreePrivate.class));
+        if(wbsTreePrivate==null){
+            return null;
+        }
+        //拿到引用项目级节点的祖级节点
+        String ancestor=wbsTreePrivate.getAncestorsPId()+","+wbsTreePrivate.getPKeyId();
+        String[] ancestors = ancestor.split(",");
+        List<Long> list2 = Arrays.stream(ancestors)
+                .map(Long::parseLong)
+                .collect(Collectors.toList());
+        String join = String.join(",", list2.stream().map(String::valueOf).collect(Collectors.toList()));
+        String sql11 = "SELECT * FROM m_wbs_tree_private WHERE node_type=1  AND project_id="+wtc.getProjectId()+"  AND parent_id!=0 AND p_key_id IN (" + join + ")";
+        List<WbsTreePrivate> nodeList = jdbcTemplate.query(sql11, new BeanPropertyRowMapper<>(WbsTreePrivate.class));
+        //祖级节点的Id
+        List<Long> list3 = nodeList.stream().map(o -> o.getId()).collect(Collectors.toList());
+        List<WbsParam> result=new ArrayList<>();
+        if(list3.size()<0){
+            return null;
+        }
+        if(!wbsParams.isEmpty()){
+            for (WbsParam param : wbsParams) {
+                //祖级节点里有文件题名配置就加进去
+                if(list3.contains(param.getNodeId())){
+                    result.add(param);
+                }
+                //如果是所有的也加进去
+                if(param.getNameType()!=null&&param.getNameType()==1){
+                    result.add(param);
+                }
+            }
+            if(result.size()>0){
+                //如果有部分节点优先部分
+                List<WbsParam> collect1 = result.stream().filter(o -> o.getNameType() == 2).collect(Collectors.toList());
+                if(collect1.size()>0){
+                    //如果节点的资料类型不为null
+                    if(wtc.getMajorDataType()!=null){
+                        //如果与配置的文件题名资料类型一致
+                        List<WbsParam> data = collect1.stream().filter(o -> StringUtils.isNotEmpty(o.getRemark()) && o.getRemark().contains(wtc.getMajorDataType() + "")).collect(Collectors.toList());
+                        if(data.size()>0){
+                            return data.get(0);
+                        }else {
+                            //与配置的文件题名类型不一致,就使用全部类型的文件题名规则
+                            List<WbsParam> data1 = collect1.stream().filter(o -> o.getRemark() != null && o.getRemark().equals("0")).collect(Collectors.toList());
+                            if(data1.size()>0){
+                                return data1.get(0);
+                            }
+                        }
+                    }else {
+                        //如果节点的资料类型为null
+                        List<WbsParam> data1 = collect1.stream().filter(o -> o.getRemark() != null && o.getRemark().equals("0")).collect(Collectors.toList());
+                        //使用全部类型的文件题名规则
+                        if(data1.size()>0){
+                            return data1.get(0);
+                        }
+                    }
+                }
+                //没有部分节点用所有节点
+                List<WbsParam> collect2 = result.stream().filter(o -> o.getNameType() == 1).collect(Collectors.toList());
+                if(collect2.size()>0){
+                    //如果节点的资料类型不为null
+                    if(wtc.getMajorDataType()!=null){
+                        //如果与配置的文件题名资料类型一致
+                        List<WbsParam> data = collect2.stream().filter(o -> StringUtils.isNotEmpty(o.getRemark()) && o.getRemark().contains(wtc.getMajorDataType() + "")).collect(Collectors.toList());
+                        if(data.size()>0){
+                            return data.get(0);
+                        }else {
+                            //与配置的文件题名类型不一致,就使用全部类型的文件题名规则
+                            List<WbsParam> data1 = collect2.stream().filter(o -> o.getRemark() != null && o.getRemark().equals("0")).collect(Collectors.toList());
+                            if(data1.size()>0){
+                                return data1.get(0);
+                            }
+                        }
+                    }else {
+                        //如果节点的资料类型为null
+                        List<WbsParam> data1 = collect2.stream().filter(o -> o.getRemark() != null && o.getRemark().equals("0")).collect(Collectors.toList());
+                        //使用全部类型的文件题名规则
+                        if(data1.size()>0){
+                            return data1.get(0);
+                        }
+                    }
+                }
+            }
+        }
+        return wp;
+    }
+
 
     @Override
     public List<WbsTreeContract> tracing(@NotNull Long pkeyId){

+ 59 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/DuplicateSheetRecognizer.java

@@ -0,0 +1,59 @@
+package org.springblade.manager.utils;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * 识别复制的sheet(格式:原表名(数字),数字≥2)
+ */
+public class DuplicateSheetRecognizer {
+
+    // 正则表达式:匹配"原表名(数字)",数字从2开始(支持多位数如2、10、100等)
+    // 分组1:原表名(去除末尾空格);分组2:复制序号(数字)
+    private static final Pattern DUPLICATE_SHEET_PATTERN = Pattern.compile(
+            "^(.*?)\\(\\s*([2-9]\\d*)\\s*\\)$"
+    );
+
+    /**
+     * 识别sheet是否为复制表
+     * @param sheetName 待识别的sheet名称
+     * @return 识别结果(包含是否为复制表、原表名、复制序号)
+     */
+    public static DuplicateSheetResult recognize(String sheetName) {
+        if (sheetName == null || sheetName.trim().isEmpty()) {
+            return new DuplicateSheetResult(false, null, null);
+        }
+
+        Matcher matcher = DUPLICATE_SHEET_PATTERN.matcher(sheetName.trim());
+        if (matcher.matches()) {
+            // 提取原表名(去除可能的末尾空格)
+            String originalName = matcher.group(1).trim();
+            // 提取复制序号(转换为数字)
+            Integer sequence = Integer.parseInt(matcher.group(2).trim());
+            return new DuplicateSheetResult(true, originalName, sequence);
+        } else {
+            // 非复制表
+            return new DuplicateSheetResult(false, null, null);
+        }
+    }
+
+    /**
+     * 识别结果封装类
+     */
+    public static class DuplicateSheetResult {
+        private boolean isDuplicate; // 是否为复制表
+        private String originalName; // 原表名(仅当isDuplicate为true时有效)
+        private Integer sequence;    // 复制序号(仅当isDuplicate为true时有效,≥2)
+
+        public DuplicateSheetResult(boolean isDuplicate, String originalName, Integer sequence) {
+            this.isDuplicate = isDuplicate;
+            this.originalName = originalName;
+            this.sequence = sequence;
+        }
+
+        // getter方法
+        public boolean isDuplicate() { return isDuplicate; }
+        public String getOriginalName() { return originalName; }
+        public Integer getSequence() { return sequence; }
+    }
+}