瀏覽代碼

修改不展示施工单位送审金额

chenr 6 月之前
父節點
當前提交
5f47e395ad
共有 15 個文件被更改,包括 839 次插入214 次删除
  1. 8 8
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java
  2. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/WeatherInfoServiceImpl.java
  3. 21 4
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java
  4. 25 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  5. 55 7
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java
  6. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java
  7. 9 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorMeter.java
  8. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.xml
  9. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IExcelTabService.java
  10. 13 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  11. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsParamServiceImpl.java
  12. 640 164
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  13. 53 8
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  14. 3 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/PdfAddimgUtil.java
  15. 5 1
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

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

@@ -118,7 +118,7 @@ public class ArchivesAutoController extends BladeController {
 	}
 
 	/**
-	 * 分页 
+	 * 分页
 	 */
 	@GetMapping("/list")
 	@ApiOperationSupport(order = 2)
@@ -130,7 +130,7 @@ public class ArchivesAutoController extends BladeController {
 
 
 	/**
-	 * 自定义分页 
+	 * 自定义分页
 	 */
 	@GetMapping("/page")
 	@ApiOperationSupport(order = 3)
@@ -264,7 +264,7 @@ public class ArchivesAutoController extends BladeController {
 	}
 
 	/**
-	 * 新增 
+	 * 新增
 	 */
 	@PostMapping("/save")
 	@ApiOperationSupport(order = 4)
@@ -274,7 +274,7 @@ public class ArchivesAutoController extends BladeController {
 	}
 
 	/**
-	 * 修改 
+	 * 修改
 	 */
 	@PostMapping("/update")
 	@ApiOperationSupport(order = 5)
@@ -284,7 +284,7 @@ public class ArchivesAutoController extends BladeController {
 	}
 
 	/**
-	 * 新增或修改 
+	 * 新增或修改
 	 */
 	@PostMapping("/submit")
 	@ApiOperationSupport(order = 6)
@@ -343,9 +343,9 @@ public class ArchivesAutoController extends BladeController {
 
 
 
-	
+
 	/**
-	 * 删除 
+	 * 删除
 	 */
 	@PostMapping("/remove")
 	@ApiOperationSupport(order = 7)
@@ -635,7 +635,7 @@ public class ArchivesAutoController extends BladeController {
 	public R getModelview(@RequestParam String compareId,@RequestParam String fileId,@RequestParam String integrateId){
 		List<BasicNameValuePair> list = new ArrayList<BasicNameValuePair>();
 
-		
+
 		if(StringUtils.isNotEmpty(compareId)){
 			list.add(new BasicNameValuePair("compareId", compareId));
 		}

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/WeatherInfoServiceImpl.java

@@ -110,7 +110,7 @@ public class WeatherInfoServiceImpl extends ServiceImpl<WeatherInfoMapper, Weath
     /**
      * 获取当前系统所有项目下所有合同段的当天天气
      */
-    @Scheduled(cron = "0 0 7 * * ?")
+    @Scheduled(cron = "0 18 10 * * ?")
     public void syncWeatherInfo() {
         //获取所有合同段的定位信息
         List<ProjectContractArea> areaList = this.projectContractAreaClient.queryAllContractArea();

+ 21 - 4
blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java

@@ -13,6 +13,7 @@ import org.apache.commons.collections4.MapUtils;
 import org.springblade.common.utils.BaseUtils;
 import org.springblade.core.tool.utils.*;
 import org.springblade.manager.dto.ParamElements;
+import org.springblade.manager.entity.WbsTreeContract;
 
 import java.math.BigDecimal;
 import java.text.ParseException;
@@ -1605,16 +1606,32 @@ public class CustomFunction {
         return r;
     }
 
-    public static Object tree(List<String> treeNodes, String param) {
+    public static Object tree(List<WbsTreeContract> treeNodes, String param) {
         if (CollectionUtil.isNotEmpty(treeNodes) && Func.isNotBlank(param)&&RegexUtil.match(ParamElements.LEVEL_REG, param.trim())) {
-            List<String> nodes = new ArrayList<>(treeNodes);
+            List<WbsTreeContract> nodes = new ArrayList<>(treeNodes);
+            Map<Integer, String> map = nodes.stream()
+                .collect(Collectors.toMap(
+                    WbsTreeContract::getNodeType,
+                    WbsTreeContract::getNodeName
+                ));
             List<String> result = new ArrayList<>();
             param = param.trim().replaceAll("(?i:c)", "");
             List<String> list = Arrays.asList(param.split("[^.\\d]"));
             List<Integer> index = list.stream().map(Integer::parseInt).collect(Collectors.toList());
             for (Integer i : index) {
-                if (i < nodes.size()) {
-                    result.add(nodes.get(i));
+                if(i==0){
+                    if(map.containsKey(1)){
+                        result.add(map.get(1));
+                    }
+                }
+                 else if(i==1){
+                    if(map.containsKey(18)){
+                        result.add(map.get(18));
+                    }
+                }else {
+                    if(map.containsKey(i)){
+                        result.add(map.get(i));
+                    }
                 }
             }
             return String.join("", result);

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

@@ -136,6 +136,8 @@ public class ExcelTabController extends BladeController {
     // 元素信息表-
     private final IWbsTreeContractService wbsTreeContractService;
 
+    private final INodeBaseInfoService nodeBaseInfoService;
+
     private final WbsTreePrivateMapper wbsTreePrivateMapper;
 
     private final JdbcTemplate jdbcTemplate;
@@ -558,6 +560,9 @@ public class ExcelTabController extends BladeController {
         String filecode = SnowFlakeUtil.getId() + "";
         String thmlUrl = file_path + "/privateUrlCopy/" + aPrivate.getProjectId()+"/"+filecode + ".html";
         File file_out = ResourceUtil.getFile(thmlUrl);
+        if(!file_out.exists()){
+            new File(thmlUrl).createNewFile();
+        }
         FileUtil.copy(file_in, file_out);
         updateWrapper.set("html_url", thmlUrl);
 
@@ -1597,7 +1602,7 @@ public class ExcelTabController extends BladeController {
     @ApiImplicitParams(value = {
             @ApiImplicitParam(name = "pkeyId", value = "pkeyId", required = true)
     })
-    public R getBussDataInfo(Long pkeyId) throws FileNotFoundException {
+    public R getBussDataInfo(Long pkeyId) throws Exception {
         return R.data(excelTabService.getBussDataInfo(pkeyId, 0, true));
     }
 
@@ -3516,6 +3521,23 @@ public class ExcelTabController extends BladeController {
         toClient.close();
 
     }
+    @GetMapping("/downloadGongChengExcel")
+    @ApiOperationSupport(order = 31)
+    @ApiOperation(value = "下载excel数据")
+    @ApiImplicitParam(name = "fileId", value = "fileId")
+    public void downGongChengExcelFile(HttpServletResponse response) throws Exception {
+        String fileName = URLEncoder.encode("工程划分导入模版", Charsets.UTF_8.name());
+        String filePath="https://blade-oss-chongqing.oss-cn-shenzhen.aliyuncs.com//upload/20250327/a012e20cdf78a078d2db0e04d05bacd1.xlsx";
+        InputStream redio = CommonUtil.getOSSInputStream(filePath);
+        byte[] buffer = IoUtil.readToByteArray(redio);
+        OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding(org.apache.commons.codec.Charsets.UTF_8.name());
+        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+        toClient.write(buffer);
+        toClient.flush();
+        toClient.close();
+    }
 
     /**
      * 首件表单获取 html页面
@@ -4614,7 +4636,7 @@ public class ExcelTabController extends BladeController {
         Set<String>placeholderValues=new HashSet<>();
         for (Element element : placeholders) {
             String value = element.attr("placeholder");
-            if(value.isEmpty()) {
+            if(!value.isEmpty()) {
                 placeholderValues.add(value);
             }
         }
@@ -4624,7 +4646,7 @@ public class ExcelTabController extends BladeController {
         String sql = "SELECT a.element_name, b.param_name " +
             "FROM m_parameter_element a " +
             "LEFT JOIN m_parameter b ON a.parameter_id = b.id " +
-            "WHERE a.element_name IN (" + inClause + ")";
+            "WHERE a.element_name IN (" + inClause + ") and a.is_deleted=0 and b.is_deleted=0";
         List<ParameterElementVO2> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ParameterElementVO2.class));
         return R.data(query);
     }

+ 55 - 7
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java

@@ -4,6 +4,7 @@ import com.aspose.cells.LoadFormat;
 import com.aspose.cells.LoadOptions;
 import com.aspose.cells.SaveFormat;
 import com.aspose.cells.Workbook;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.google.common.collect.Lists;
@@ -30,23 +31,25 @@ import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.IoUtil;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.core.tool.utils.ResourceUtil;
 import org.springblade.manager.dto.TableSortDTO;
 import org.springblade.manager.dto.WbsTreeContractDTO2;
-import org.springblade.manager.entity.ContractInfo;
-import org.springblade.manager.entity.WbsParam;
-import org.springblade.manager.entity.WbsTreeContract;
-import org.springblade.manager.entity.WbsTreePrivate;
+import org.springblade.manager.entity.*;
 import org.springblade.manager.feign.ContractClient;
 import org.springblade.manager.service.IWbsParamService;
 import org.springblade.manager.service.IWbsTreeContractService;
+import org.springblade.manager.service.IWbsTreePrivateService;
 import org.springblade.manager.service.impl.WbsTreeContractServiceImpl;
 import org.springblade.manager.utils.FileUtils;
 import org.springblade.manager.vo.*;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.SingleColumnRowMapper;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -75,11 +78,13 @@ public class WbsTreeContractController extends BladeController {
 
     private final JdbcTemplate jdbcTemplate;
     private final IWbsTreeContractService iWbsTreeContractService;
+    private final IWbsTreePrivateService iWbsTreePrivateService;
     private final WbsTreeContractServiceImpl wbsTreeContractServiceImpl;
     private final ContractClient contractClient;
     private final IWbsParamService iWbsParamService;
     private static Logger logger = LoggerFactory.getLogger(WbsTreeContractController.class);
 
+
     private final ExcelTabController excelTabController;
 
 
@@ -150,14 +155,58 @@ public class WbsTreeContractController extends BladeController {
     @GetMapping("/getNameRuleByPkeyId")
     @ApiOperationSupport(order = 31)
     @ApiOperation(value = "根据节点PkeyId获取节点配置")
-    public R getNameRuleByPkeyId(@RequestParam Long pKeyId){
+    public R getNameRuleByPkeyId(@RequestParam Long pKeyId,@RequestParam Long projectId){
+        //先查询合同段级的
         NameRuleVo vo = iWbsParamService.getNameRuleByPkeyId(pKeyId);
         if(vo!=null){
             List<String> list = Arrays.asList(vo.getNameVaule().split("-"));
             return R.data(list);
         }else {
-            return R.data(null);
+            //合同段没有 在查项目级的
+            String sql="select * from m_wbs_tree_contract where p_key_id="+pKeyId;
+            WbsTreeContract contract = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(WbsTreeContract.class));
+            String sql1="select * from m_wbs_tree_private where p_key_id="+contract.getIsTypePrivatePid();
+            WbsTreePrivate wbsTreePrivate = jdbcTemplate.queryForObject(sql1,new BeanPropertyRowMapper<>(WbsTreePrivate.class));
+            if(wbsTreePrivate==null){
+                return R.success("暂无数据");
+            }
+            String ancestor=wbsTreePrivate.getAncestors();
+            String[] ancestors = ancestor.split(",");
+            List<Long> list2 = Arrays.stream(ancestors)
+                .map(Long::parseLong)
+                .collect(Collectors.toList());
+            List<WbsTreePrivate> nodeList = iWbsTreePrivateService.getBaseMapper().selectList(new LambdaQueryWrapper<>(WbsTreePrivate.class).select(WbsTreePrivate::getId).eq(WbsTreePrivate::getNodeType, 1).ne(WbsTreePrivate::getParentId, 0).in(WbsTreePrivate::getPKeyId, list2));
+            List<Long> list3 = nodeList.stream().map(o -> o.getId()).collect(Collectors.toList());
+            if(list3.size()<0){
+                return R.success("暂无数据");
+            }
+            List<WbsParam> wbsParamList = iWbsParamService.getBaseMapper().selectList(new LambdaQueryWrapper<>(WbsParam.class).eq(WbsParam::getProjectId, projectId).eq(WbsParam::getK, "FILE_TITLE"));
+            List<WbsParam> result=new ArrayList<>();
+            if(wbsParamList.size()>0){
+                //筛选出包含当前单位工程节点的
+                for (WbsParam param : wbsParamList) {
+                    if(list3.contains(param.getNodeId())){
+                        result.add(param);
+                    }
+                }
+                if(result.size()>0){
+                    //如果有部分节点优先部分
+                    List<WbsParam> collect1 = result.stream().filter(o -> o.getNameType() == 2).collect(Collectors.toList());
+                    if(collect1.size()>0){
+                        WbsParam param = collect1.get(0);
+                        return R.data(Arrays.asList(param.getV().split("-")));
+                    }
+                    //没有部分节点用所有节点
+                    List<WbsParam> collect2 = result.stream().filter(o -> o.getNameType() == 1).collect(Collectors.toList());
+                    if(collect2.size()>0){
+                        WbsParam param = collect2.get(0);
+                        return R.data(Arrays.asList(param.getV().split("-")));
+                    }
+                }
+            }
+
         }
+        return R.success("暂无数据");
     }
 
     @GetMapping("/getNameRuleByRule")
@@ -869,5 +918,4 @@ public class WbsTreeContractController extends BladeController {
         return R.success("成功");
     }
 
-
 }

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

@@ -864,7 +864,7 @@ public class WbsTreePrivateController extends BladeController {
         List<WbsTreePrivate>list=wbsTreeService.getTitleRange(projectId);
         List<WbsParam> list1 = iWbsParamService.getBaseMapper().selectList(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getK, "FILE_TITLE").eq(WbsParam::getProjectId, projectId));
         if(list1.size()>0){
-            List<Long> longs = list1.stream().map(l -> l.getNodeId()).collect(Collectors.toList());
+            List<Long> longs = list1.stream().filter(o->o.getNameType()!=null&&o.getNameType()==2).map(l -> l.getNodeId()).collect(Collectors.toList());
             //判断是否已经被选中
             for (WbsTreePrivate wbsTreePrivate : list) {
                 if(longs.contains(wbsTreePrivate.getId())){

+ 9 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorMeter.java

@@ -1221,7 +1221,7 @@ public class ExecutorMeter extends FormulaExecutor {
                      InterimPaymentCertificate wyje = new InterimPaymentCertificate("违约罚金",MINUS_ONE);
                      wyje.setNoApply(1);
                      payItemZj.add(wyje);
-                    // payItemZj.add(new InterimPaymentCertificate("违约罚金",MINUS_ONE));
+                    //payItemZj.add(new InterimPaymentCertificate("违约罚金",MINUS_ONE));
                      payItemZj.add(new InterimPaymentCertificate("迟付款利息"));
                      InterimPaymentCertificate startPay =new InterimPaymentCertificate("动员预付款");
                      /*startPay.setContractAmount(StringUtils.handleNull(tec.meterInfo.getBaseInfo().getDyTotalAmount()));*/
@@ -1424,11 +1424,16 @@ public class ExecutorMeter extends FormulaExecutor {
                          }
                          finalBlj.setCurrentPeriodEndPay(addFc.apply(finalBlj.getCurrentPeriodPay(),finalBlj.getPreviousPeriodEndPay()));
                          dataList.stream().filter(e-> "实际支付".equals(e.getChapterSeq())).findFirst().ifPresent(w->{
-                             w.setCurrentPeriodPay(StringUtils.number2String(subtractFc.apply(w.getCurrentPeriodPay(),finalBlj.getCurrentPeriodPay()),0));
+                             //实际支付(本期支付金额)=实际支付(本期支付金额)-保留金(本期支付金额)
+                             String currentPeriodPay = StringUtils.number2String(subtractFc.apply(w.getCurrentPeriodPay(), finalBlj.getCurrentPeriodPay()), 0);
+                             w.setCurrentPeriodPay(currentPeriodPay);
+                             //如果合计(上期末支付金额)>0
                              if(BaseUtils.obj2DoubleZero(t.getPreviousPeriodEndPay())>0) {
-                                 w.setPreviousPeriodEndPay(StringUtils.number2String(subtractFc.apply(w.getPreviousPeriodEndPay(), finalBlj.getPreviousPeriodEndPay()),0));
+                                 //实际支付(上期末支付金额)=实际支付(上期末支付金额)-保留金(上期末支付金额)
+                                 w.setPreviousPeriodEndPay(StringUtils.number2String(subtractFc.apply(w.getPreviousPeriodEndPay(), finalBlj.getCurrentPeriodEndPay()),0));
                              }
-                             w.setCurrentPeriodEndPay(StringUtils.number2String(subtractFc.apply(w.getCurrentPeriodEndPay(),finalBlj.getCurrentPeriodEndPay()),0));
+                             //实际支付(本期末支付金额)=实际支付(本期末支付金额)-保留金(本期末支付金额)
+                             w.setCurrentPeriodEndPay(StringUtils.number2String(subtractFc.apply(w.getCurrentPeriodEndPay(),finalBlj.getPreviousPeriodEndPay()),0));
                          });
                          itemList.stream().filter(item->"保留金".equals(item.getChapterSeq())).findFirst().ifPresent(w->{
                              w.setPreviousPeriodEndPay(finalBlj.getPreviousPeriodEndPay());
@@ -1487,8 +1492,6 @@ public class ExecutorMeter extends FormulaExecutor {
             });
             /*内容输出*/
             putOut();
-
-
         }
 
         public void periodCount(InterimPaymentCertificate last){

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

@@ -563,7 +563,7 @@
 
     <select id="getTitleRange" resultType="org.springblade.manager.entity.WbsTreePrivate">
         SELECT id,node_name,status From m_wbs_tree_private where project_id = #{projectId} and node_type=1 and is_deleted=0
-        and parent_id=(select id from m_wbs_tree_private where project_id= #{projectId} and parent_id=0 and is_deleted=0)
+        and parent_id in (select id from m_wbs_tree_private where project_id= #{projectId} and parent_id=0 and is_deleted=0)
     </select>
 
 </mapper>

+ 2 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IExcelTabService.java

@@ -111,9 +111,9 @@ public interface IExcelTabService extends BaseService<ExcelTab> {
     Map<String, String> getTablbCols(String pkeyid, String colkey) throws FileNotFoundException;
 
     // 获取用户端 单个表单接口数据
-    Map<String,Object> getBussDataInfo(Long pkeyId, int type);
+    Map<String,Object> getBussDataInfo(Long pkeyId, int type) throws Exception;
     // 获取用户端 单个表单接口数据
-    Map<String,Object> getBussDataInfo(Long pkeyId, int type,Boolean isFormLoading);
+    Map<String,Object> getBussDataInfo(Long pkeyId, int type,Boolean isFormLoading) throws Exception;
     // 获取用户端 多个表单接口数据
     Map<String,Object> getBussDataInfoMulti(Long pkeyId, int type, Boolean isFormLoading, ConcurrentHashMap<String,String> htmlStrCache);
     // 单个pdf 生成

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

@@ -121,6 +121,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
     private final IProjectInfoService projectInfoService;
     private final OperationLogClient operationLogClient;
     private final TableInfoServiceImpl tableInfoService;
+    private final INodeBaseInfoService nodeBaseInfoService;
     private final TrialSelfInspectionRecordClient trialSelfInspectionRecordClient;
 
 
@@ -1369,19 +1370,22 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
     }
 
     @Override
-    public Map<String, Object> getBussDataInfo(Long pkeyId, int type) {
+    public Map<String, Object> getBussDataInfo(Long pkeyId, int type) throws Exception {
         /*只有默认不执行表单公式isFormLoading==false*/
         return this.getBussDataInfo(pkeyId, type, false);
     }
 
     @Override
-    public Map<String, Object> getBussDataInfo(Long pkeyId, int type, Boolean isFormLoading) {
+    public Map<String, Object> getBussDataInfo(Long pkeyId, int type, Boolean isFormLoading) throws Exception {
         /*需要加载表单公式的时候isFormLoading==true*/
         Document document = null;
         Map<String, Object> reData = new HashMap<>();
 
         WbsTreeContract wbsTreeContract = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
                 .eq(WbsTreeContract::getPKeyId, pkeyId));
+        WbsTreeContract wbsTreeContract1=wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
+         .eq(WbsTreeContract::getId, wbsTreeContract.getParentId()).eq(WbsTreeContract::getContractId,wbsTreeContract.getContractId()).eq(WbsTreeContract::getWbsId,wbsTreeContract.getWbsId()));
+         Long  nodeId=wbsTreeContract1.getPKeyId();
         if (wbsTreeContract == null) {
             return reData;
         }
@@ -1672,6 +1676,11 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         if (isFormLoading) {
             this.formulaService.paramFormula(wbsTreeContract, reData, document);
         }
+        /*获取参数库数据*/
+        Map<String, Object> nodeBaseInfo = nodeBaseInfoService.getAllNodeBaseInfoByPkeyId(pkeyId, nodeId);
+        for (Map.Entry<String, Object> entry : nodeBaseInfo.entrySet()) {
+            reData.putIfAbsent(entry.getKey(), entry.getValue());
+        }
         return reData;
     }
 
@@ -3128,6 +3137,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         }
 
         if (ObjectUtil.isNotEmpty(DataInfo)) {
+            DataInfo.remove("key_46__26_1");
             for (String val : Objects.requireNonNull(DataInfo).keySet()) {
                 if (val.contains("__")) {
                     String[] DataVal = val.split("__");
@@ -3249,7 +3259,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                                 }
                                             }
                                         } else {
-                                            Row row = sheet.getRow(y1 - 1);
+                                            Row row = sheet.getRow(y1);
                                             if (row != null) {
                                                 Cell cell = row.getCell(x1 - 1);
                                                 if (cell != null) {

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

@@ -68,7 +68,7 @@ public class WbsParamServiceImpl extends BaseServiceImpl<WbsParamMapper, WbsPara
                         }
                     }
                     if (Func.isNotEmpty(wp)) {
-                        return CustomFunction.tree(nodes.stream().map(w->StringUtils.isNotEmpty(w.getFullName())?w.getFullName():w.getNodeName()).collect(Collectors.toList()), wp.getV()).toString();
+                        return CustomFunction.tree(nodes, wp.getV()).toString();
                     }else{
                         return wtp.getNodeName()+"找不到文件题名配置";
                     }
@@ -93,7 +93,7 @@ public class WbsParamServiceImpl extends BaseServiceImpl<WbsParamMapper, WbsPara
                 WbsTreePrivate wtp = this.wtpId(wtc.getPKeyId());
                 if(wtp!=null){
                     if (Func.isNotEmpty(wp)) {
-                        return CustomFunction.tree(nodes.stream().map(w->StringUtils.isNotEmpty(w.getFullName())?w.getFullName():w.getNodeName()).collect(Collectors.toList()), wp).toString();
+                        return CustomFunction.tree(nodes, wp).toString();
                     }else{
                         return wtp.getNodeName()+"找不到文件题名配置";
                     }

+ 640 - 164
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -11,7 +11,9 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.google.common.collect.Lists;
 import com.mixsmart.utils.CustomFunction;
+import com.sun.org.apache.xpath.internal.operations.Bool;
 import lombok.AllArgsConstructor;
+import lombok.Data;
 import org.apache.commons.lang.StringUtils;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.Row;
@@ -63,7 +65,9 @@ import org.springframework.jdbc.BadSqlGrammarException;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.SingleColumnRowMapper;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.LinkedCaseInsensitiveMap;
 import org.springframework.web.multipart.MultipartFile;
@@ -571,12 +575,73 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
 //            //表单排序
 //            if (resultTabs.size() > 0) {
 //               List<AppWbsTreeContractVO> resultTabsToCopy = this.sortTabs(resultTabs, "__"); //复制表排序
-//                return this.sortTabs(resultTabs, "_PL_"); //频率表排序
+//                return this.sortTabs(resultTabsToCopy, "_PL_"); //频率表排序
 //            }
 //        }
+        // 使用自定义 Comparator 进行排序
+        resultTabs.sort(new WbsTreeContractComparator());
         return resultTabs;
     }
 
+
+    public static class WbsTreeContractComparator implements Comparator<AppWbsTreeContractVO> {
+
+        @Override
+        public int compare(AppWbsTreeContractVO o1, AppWbsTreeContractVO o2) {
+            // 先比较 sort 属性
+            Integer sort1 = o1.getSort();
+            Integer sort2 = o2.getSort();
+            if (sort1 == null && sort2 == null) {
+                // 两个 sort 都为空,认为相等
+                return 0;
+            } else if (sort1 == null) {
+                // 第一个 sort 为空,排在后面
+                return 1;
+            } else if (sort2 == null) {
+                // 第二个 sort 为空,排在前面
+                return -1;
+            } else {
+                // 两个 sort 都不为空,按 sort 排序
+                int sortComparison = Integer.compare(sort1, sort2);
+                if (sortComparison != 0) {
+                    return sortComparison;
+                }
+            }
+
+            // 如果 sort 相同,比较 nodeName
+            String name1 = o1.getNodeName();
+            String name2 = o2.getNodeName();
+
+            boolean hasUnderscore1 = name1.contains("__");
+            boolean hasUnderscore2 = name2.contains("__");
+
+            if (!hasUnderscore1 && !hasUnderscore2) {
+                // 两个都不包含 __,按字母顺序排序
+                return name1.compareTo(name2);
+            } else if (!hasUnderscore1) {
+                // 第一个不包含 __,排在前面
+                return -1;
+            } else if (!hasUnderscore2) {
+                // 第二个不包含 __,排在前面
+                return 1;
+            } else {
+                // 两个都包含 __,按 __ 后面的数字排序
+                int number1 = getNumberAfterUnderscore(name1);
+                int number2 = getNumberAfterUnderscore(name2);
+                return Integer.compare(number1, number2);
+            }
+        }
+
+        private int getNumberAfterUnderscore(String name) {
+            String[] parts = name.split("__");
+            if (parts.length > 1) {
+                return Integer.parseInt(parts[1]);
+            }
+            return Integer.MAX_VALUE;
+        }
+    }
+
+
     /**
      * 元素表排序
      *
@@ -2183,7 +2248,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         return null;
     }
     @Override
-    @Transactional
+    @Transactional(isolation = Isolation.READ_COMMITTED)
     public R importTree(MultipartFile file, Long pkeyId) throws IOException {
         InputStream inputStream = file.getInputStream();
         org.apache.poi.ss.usermodel.Workbook workbook = new XSSFWorkbook(inputStream);
@@ -2205,16 +2270,22 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
             String itemCode = getCellValue(row.getCell(9)); // J列:分项工程编号
             String subItemName = getCellValue(row.getCell(10)); // K列:子分项工程名称
             String subItemCode = getCellValue(row.getCell(11));// L列:子分项工程编号
-            ImportTreeDto dto=new ImportTreeDto(unitName,unitCode,1,unitName==null,subUnitName,subUnitCode,18,subUnitName==null,divisionName,divisionCode,2,divisionName==null, subDivisionName,subDivisionCode,3,subDivisionName==null,itemName,itemCode,4,itemName==null,subItemName,subItemCode,5,subItemName==null);
+            ImportTreeDto dto=new ImportTreeDto(unitName,unitCode,1,StringUtils.isEmpty(unitName) ,subUnitName,subUnitCode,18,StringUtils.isEmpty(subUnitName),divisionName,divisionCode,2,StringUtils.isEmpty(divisionName), subDivisionName,subDivisionCode,3,StringUtils.isEmpty(subDivisionName),itemName,itemCode,4,StringUtils.isEmpty(itemName),subItemName,subItemCode,5,StringUtils.isEmpty(subItemName));
                 list.add(dto);
         }
         if(list.isEmpty()){
             throw new ServiceException("导入模版为空,请先填写数据");
         }
+        //过滤出空节点
+        list=list.stream().filter(o->!o.getIsUnit()||!o.getIsSubUnit()||!o.getIsDivision()||!o.getIsSubDivision()||!o.getIsItem()||!o.getIsSubItem()).collect(Collectors.toList());
+        //过滤出相同节点但是编号不同的情况
+        if(hasConflictingCodes(list)){
+            throw new ServiceException("导入模版存在相同节点但不同编号,请修改");
+        }
         //最高节点
         WbsTreeContract wbsTreeContractRoot = baseMapper.selectOne(Wrappers.<WbsTreeContract>query().lambda().eq(WbsTreeContract::getPKeyId, pkeyId));
         //获取当前节点下所有子节点
-        List<WbsTreeContractVO> wbsTreeContractVOS = contractInfoMapper.tree4(wbsTreeContractRoot.getContractId(), String.valueOf(wbsTreeContractRoot.getId()));
+        List<WbsTreeContractVO> wbsTreeContractVOS = contractInfoMapper.tree4(wbsTreeContractRoot.getContractId(), String.valueOf(wbsTreeContractRoot.getPKeyId()));
         // 定义 nodeType 的优先级顺序 18是子单位工程,后期加上去的,不敢动原本的顺序
         List<Integer> priorityOrder = Arrays.asList(1, 18, 2, 3, 4, 5);
         // 自定义 Comparator
@@ -2238,7 +2309,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
             for (WbsTreeContractVO vo : wbsTreeContractVOS) {
                 //wbs节点和单位工程的名称类型能对应上,并且编号不一样,就修改编号
                 if(vo.getNodeName().equals(dto.getUnitName())&&vo.getNodeType()==1){
-                    if(vo.getPartitionCode().equals(dto.getUnitCode())){
+                    if(vo.getPartitionCode()==null||!vo.getPartitionCode().equals(dto.getUnitCode())){
                         baseMapper.update(null,Wrappers.<WbsTreeContract>lambdaUpdate().set(WbsTreeContract::getPartitionCode,dto.getUnitCode()).eq(WbsTreeContract::getPKeyId,vo.getPrimaryKeyId()));
                         updateList.add(vo.getNodeName());
                     }
@@ -2248,7 +2319,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 //wbs节点和子单位工程的名称类型能对应上,并且编号不一样,并且祖级节点也都能对应上,就修改编号
                 if(vo.getNodeName().equals(dto.getSubUnitName())&&vo.getNodeType()==18){
                     if(isTrueNode(Arrays.asList(dto.getUnitName(),dto.getSubUnitName()),vo)){
-                        if(!vo.getPartitionCode().equals(dto.getSubUnitCode())){
+                        if(vo.getPartitionCode()==null||!vo.getPartitionCode().equals(dto.getSubUnitCode())){
                             baseMapper.update(null,Wrappers.<WbsTreeContract>lambdaUpdate().set(WbsTreeContract::getPartitionCode,dto.getSubUnitCode()).eq(WbsTreeContract::getPKeyId,vo.getPrimaryKeyId()));
                             updateList.add(vo.getNodeName());
                         }
@@ -2266,7 +2337,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                     continue;
                 }
                 //wbs节点和子分部工程的名称类型能对应上,并且编号不一样,并且祖级节点也都能对应上,就修改编号
-                if(vo.getNodeName().equals(dto.getSubDivisionName())&&vo.getNodeType()==3&&!vo.getPartitionCode().equals(dto.getSubDivisionName())){
+                if(vo.getNodeName().equals(dto.getSubDivisionName())&&vo.getNodeType()==3&&(vo.getPartitionCode()==null||!vo.getPartitionCode().equals(dto.getSubDivisionName()))){
                     if(isTrueNode(Arrays.asList(dto.getUnitName(),dto.getSubUnitName(),dto.getDivisionName(),dto.getSubDivisionName()),vo)){
                         baseMapper.update(null,Wrappers.<WbsTreeContract>lambdaUpdate().set(WbsTreeContract::getPartitionCode,dto.getSubDivisionCode()).eq(WbsTreeContract::getPKeyId,vo.getPrimaryKeyId()));
                         updateList.add(vo.getNodeName());
@@ -2275,7 +2346,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                     continue;
                 }
                 //wbs节点和分项工程的名称类型能对应上,并且编号不一样,并且祖级节点也都能对应上,就修改编号
-                if(vo.getNodeName().equals(dto.getItemName())&&vo.getNodeType()==4&&!vo.getPartitionCode().equals(dto.getItemName())){
+                if(vo.getNodeName().equals(dto.getItemName())&&vo.getNodeType()==4&&(vo.getPartitionCode()==null||!vo.getPartitionCode().equals(dto.getItemName()))){
                     if(isTrueNode(Arrays.asList(dto.getUnitName(),dto.getSubUnitName(),dto.getDivisionName(),dto.getSubDivisionName(),dto.getItemName()),vo)){
                         baseMapper.update(null,Wrappers.<WbsTreeContract>lambdaUpdate().set(WbsTreeContract::getPartitionCode,dto.getItemCode()).eq(WbsTreeContract::getPKeyId,vo.getPrimaryKeyId()));
                         updateList.add(vo.getNodeName());
@@ -2284,7 +2355,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                     continue;
                 }
                 //wbs节点和子分项工程的名称类型能对应上,并且编号不一样,并且祖级节点也都能对应上,就修改编号
-                if(vo.getNodeName().equals(dto.getSubItemName())&&vo.getNodeType()==5&&!vo.getPartitionCode().equals(dto.getSubItemName())){
+                if(vo.getNodeName().equals(dto.getSubItemName())&&vo.getNodeType()==5&&(vo.getPartitionCode()==null||!vo.getPartitionCode().equals(dto.getSubItemName()))){
                     if(isTrueNode(Arrays.asList(dto.getUnitName(),dto.getSubUnitName(),dto.getDivisionName(),dto.getSubDivisionName(),dto.getItemName(),dto.getSubItemName()),vo)){
                         baseMapper.update(null,Wrappers.<WbsTreeContract>lambdaUpdate().set(WbsTreeContract::getPartitionCode,dto.getSubItemCode()).eq(WbsTreeContract::getPKeyId,vo.getPrimaryKeyId()));
                         updateList.add(vo.getNodeName());
@@ -2297,72 +2368,520 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         //新增
         for (ImportTreeDto dto : list) {
             //单位工程:如果没有被处理过,说明需要新增
+            String sqlList="Select * from m_wbs_tree_contract where contract_id="+wbsTreeContractRoot.getContractId()+" and wbs_id="+wbsTreeContractRoot.getWbsId()+" and is_deleted=0";
+            List<WbsTreeContract> WbsTreeContractList = jdbcTemplate.query(sqlList, new BeanPropertyRowMapper<>(WbsTreeContract.class));
             if (!dto.getIsUnit()){
-                WbsTreeContract unit = new WbsTreeContract();
-                BeanUtil.copy(wbsTreeContractRoot,unit);
-                unit.setPKeyId(SnowFlakeUtil.getId());
-                unit.setId(SnowFlakeUtil.getId());
-                unit.setParentId(wbsTreeContractRoot.getId());
-                unit.setAncestors(wbsTreeContractRoot.getAncestors()+","+unit.getId());
-                unit.setIsCustom(1);
-                unit.setIsTypePrivatePid(null);
-                unit.setNodeType(1);
-                insertList.add(unit);
+                //检测是否已经存在,如果存在,就不需要新增了
+                Boolean exist = this.isExist(dto, WbsTreeContractList, 1, Long.valueOf(wbsTreeContractRoot.getContractId()));
+                if(!exist){
+                    WbsTreeContract unit = new WbsTreeContract();
+                    BeanUtil.copy(wbsTreeContractRoot,unit);
+                    unit.setPKeyId(SnowFlakeUtil.getId());
+                    unit.setId(SnowFlakeUtil.getId());
+                    unit.setParentId(wbsTreeContractRoot.getId());
+                    unit.setAncestors("0,"+wbsTreeContractRoot.getPKeyId()+","+unit.getPKeyId());
+                    unit.setIsCustom(1);
+                    unit.setPartitionCode(dto.getUnitCode());
+                    unit.setNodeType(1);
+                    unit.setNodeName(dto.getUnitName());
+                    unit.setFullName(dto.getUnitName());
+                    baseMapper.insert(unit);
+                    insertList.add(unit);
+                }
+
             }
             //子单位工程:如果没有被处理过,说明需要新增,最重要是需要找到父节点。单位工程不会有相同的,所以直接根据名称查找
             if(!dto.getIsSubUnit()){
-                WbsTreeContract fatherNode = baseMapper.selectOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getNodeName, dto.getUnitName()).eq(WbsTreeContract::getProjectId, wbsTreeContractRoot.getProjectId())
-                    .eq(WbsTreeContract::getContractId, wbsTreeContractRoot.getContractId()).eq(WbsTreeContract::getIsDeleted, 0));
-                WbsTreeContract subUnit = new WbsTreeContract();
-                BeanUtil.copy(fatherNode,subUnit);
-                subUnit.setPKeyId(SnowFlakeUtil.getId());
-                subUnit.setId(SnowFlakeUtil.getId());
-                subUnit.setParentId(fatherNode.getId());
-                subUnit.setAncestors(fatherNode.getAncestors()+","+subUnit.getId());
-                subUnit.setIsCustom(1);
-                subUnit.setIsTypePrivatePid(null);
-                subUnit.setNodeType(18);
-                insertList.add(subUnit);
+                Boolean exist = this.isExist(dto, WbsTreeContractList, 2, Long.valueOf(wbsTreeContractRoot.getContractId()));
+                if(!exist){
+                    WbsTreeContract fatherNode = baseMapper.selectOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getNodeName, dto.getUnitName()).eq(WbsTreeContract::getProjectId, wbsTreeContractRoot.getProjectId())
+                        .eq(WbsTreeContract::getContractId, wbsTreeContractRoot.getContractId()).eq(WbsTreeContract::getIsDeleted, 0).last("LIMIT 1"));
+                    WbsTreeContract subUnit = new WbsTreeContract();
+                    BeanUtil.copy(fatherNode,subUnit);
+                    subUnit.setPKeyId(SnowFlakeUtil.getId());
+                    subUnit.setId(SnowFlakeUtil.getId());
+                    subUnit.setParentId(fatherNode.getId());
+                    subUnit.setAncestors(fatherNode.getAncestors()+","+subUnit.getPKeyId());
+                    subUnit.setIsCustom(1);
+                    subUnit.setPartitionCode(dto.getSubUnitCode());
+                    subUnit.setNodeType(18);
+                    subUnit.setNodeName(dto.getSubUnitName());
+                    subUnit.setFullName(dto.getSubUnitName());
+                    baseMapper.insert(subUnit);
+                    insertList.add(subUnit);
+                }
+
             }
             //分部工程:如果没有被处理过,说明需要新增,最重要是需要找到父节点。现在的办法是(通过祖级节点名称拼接的方式来判断)。
             if(!dto.getIsDivision()){
-                String fatherNodeName="";
-                if(dto.getSubUnitName()!=null&&!dto.getSubUnitName().equals("")){
-                    fatherNodeName=dto.getSubUnitName();
-                }else if(dto.getUnitName()!=null&&!dto.getUnitName().equals("")){
-                    fatherNodeName=dto.getUnitName();
-                }
-                List<WbsTreeContract> list1 = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getNodeName, fatherNodeName).eq(WbsTreeContract::getProjectId, wbsTreeContractRoot.getProjectId())
-                    .eq(WbsTreeContract::getContractId, wbsTreeContractRoot.getContractId()).eq(WbsTreeContract::getIsDeleted, 0));
-                if(list1.size()>0){
-                    for (WbsTreeContract contract : list1) {
-                        String[] ids = contract.getAncestors().split(",");
-                        ids=Arrays.stream(ids)
-                            .filter(id -> !id.equals("0")) // 过滤掉值为 "0" 的元素
-                            .toArray(String[]::new);
-                        String sql="Select node_name from m_wbs_tree_contract where id in("+String.join("','", ids)+")";
-                        List<String> nodeNames = jdbcTemplate.query(sql, new SingleColumnRowMapper<>(String.class));
-                        String result = String.join("",nodeNames);
-                        String ancestorsName=dto.getUnitName()!=null?dto.getUnitName():""+dto.getSubUnitName()!=null?dto.getSubUnitName():"";
-                        if(result.equals(ancestorsName)){
-                            WbsTreeContract division = new WbsTreeContract();
-                            BeanUtil.copy(contract,division);
-                            division.setPKeyId(SnowFlakeUtil.getId());
-                            division.setId(SnowFlakeUtil.getId());
-                            division.setParentId(contract.getId());
-                            division.setAncestors(contract.getAncestors()+","+division.getId());
-                            division.setIsCustom(1);
-                            division.setIsTypePrivatePid(null);
-                            division.setNodeType(2);
-                            insertList.add(division);
-                            break;
+                Boolean exist = this.isExist(dto, WbsTreeContractList, 3, Long.valueOf(wbsTreeContractRoot.getContractId()));
+                if(!exist){
+                    String fatherNodeName="";
+                    if(dto.getSubUnitName()!=null&&!dto.getSubUnitName().equals("")){
+                        fatherNodeName=dto.getSubUnitName();
+                    }else if(dto.getUnitName()!=null&&!dto.getUnitName().equals("")){
+                        fatherNodeName=dto.getUnitName();
+                    }
+                    List<WbsTreeContract> list1 = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getNodeName, fatherNodeName).eq(WbsTreeContract::getProjectId, wbsTreeContractRoot.getProjectId())
+                        .eq(WbsTreeContract::getContractId, wbsTreeContractRoot.getContractId()).eq(WbsTreeContract::getIsDeleted, 0));
+                    if(list1.size()>0){
+                        for (WbsTreeContract contract : list1) {
+                            String[] ids = contract.getAncestors().split(",");
+                            ids=Arrays.stream(ids)
+                                .filter(id -> !id.equals("0")) // 过滤掉值为 "0" 的元素
+                                .toArray(String[]::new);
+                            String sql="Select node_name from m_wbs_tree_contract where p_key_id in("+String.join(",", ids)+")";
+                            List<String> nodeNames = jdbcTemplate.query(sql, new SingleColumnRowMapper<>(String.class));
+                            String result = String.join("",nodeNames);
+                            String ancestorsName= wbsTreeContractRoot.getNodeName()+StringUtils.defaultString(dto.getUnitName())
+                                + StringUtils.defaultString(dto.getSubUnitName());
+                            if(result.equals(ancestorsName)){
+                                WbsTreeContract division = new WbsTreeContract();
+                                BeanUtil.copy(contract,division);
+                                division.setPKeyId(SnowFlakeUtil.getId());
+                                division.setId(SnowFlakeUtil.getId());
+                                division.setParentId(contract.getId());
+                                division.setAncestors(contract.getAncestors()+","+division.getPKeyId());
+                                division.setIsCustom(1);
+                                division.setPartitionCode(dto.getDivisionCode());
+                                division.setNodeType(2);
+                                division.setNodeName(dto.getDivisionName());
+                                division.setFullName(dto.getDivisionName());
+                                baseMapper.insert(division);
+                                insertList.add(division);
+                                break;
+                            }
                         }
                     }
                 }
+
             }
             //子分部工程:如果没有被处理过,说明需要新增,最重要是需要找到父节点。现在的办法是(通过祖级节点名称拼接的方式来判断)。
             if(!dto.getIsSubDivision()){
-                String fatherNodeName="";
+                Boolean exist = this.isExist(dto, WbsTreeContractList, 4, Long.valueOf(wbsTreeContractRoot.getContractId()));
+                if(!exist){
+                    String fatherNodeName="";
+                    if(dto.getDivisionName()!=null&&!dto.getDivisionName().equals("")){
+                        fatherNodeName=dto.getDivisionName();
+                    } else if(dto.getSubUnitName()!=null&&!dto.getSubUnitName().equals("")){
+                        fatherNodeName=dto.getSubUnitName();
+                    }else if(dto.getUnitName()!=null&&!dto.getUnitName().equals("")){
+                        fatherNodeName=dto.getUnitName();
+                    }
+                    List<WbsTreeContract> list1 = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getNodeName, fatherNodeName).eq(WbsTreeContract::getProjectId, wbsTreeContractRoot.getProjectId())
+                        .eq(WbsTreeContract::getContractId, wbsTreeContractRoot.getContractId()).eq(WbsTreeContract::getIsDeleted, 0));
+                    if(list1.size()>0){
+                        for (WbsTreeContract contract : list1) {
+                            String[] ids = contract.getAncestors().split(",");
+                            ids=Arrays.stream(ids)
+                                .filter(id -> !id.equals("0")) // 过滤掉值为 "0" 的元素
+                                .toArray(String[]::new);
+                            String sql="Select node_name from m_wbs_tree_contract where p_key_id in("+String.join(",", ids)+")";
+                            List<String> nodeNames = jdbcTemplate.query(sql, new SingleColumnRowMapper<>(String.class));
+                            String result = String.join("",nodeNames);
+                            String ancestorsName= wbsTreeContractRoot.getNodeName()+StringUtils.defaultString(dto.getUnitName())
+                                + StringUtils.defaultString(dto.getSubUnitName())
+                                +StringUtils.defaultString(dto.getDivisionName());
+                            if(result.equals(ancestorsName)){
+                                WbsTreeContract subDivision = new WbsTreeContract();
+                                BeanUtil.copy(contract,subDivision);
+                                subDivision.setPKeyId(SnowFlakeUtil.getId());
+                                subDivision.setId(SnowFlakeUtil.getId());
+                                subDivision.setParentId(contract.getId());
+                                subDivision.setAncestors(contract.getAncestors()+","+subDivision.getPKeyId());
+                                subDivision.setIsCustom(1);
+                                subDivision.setPartitionCode(dto.getDivisionCode());
+                                subDivision.setNodeType(3);
+                                subDivision.setNodeName(dto.getSubDivisionName());
+                                subDivision.setFullName(dto.getSubDivisionName());
+                                baseMapper.insert(subDivision);
+                                insertList.add(subDivision);
+                                break;
+                            }
+                        }
+                    }
+                }
+
+            }
+            //分项节点:如果没有被处理过,说明需要新增,最重要是需要找到父节点。现在的办法是(通过祖级节点名称拼接的方式来判断)。
+            if(!dto.getIsItem()){
+                Boolean exist = this.isExist(dto, WbsTreeContractList, 5, Long.valueOf(wbsTreeContractRoot.getContractId()));
+                if(!exist){
+                    String fatherNodeName="";
+                    if(dto.getSubDivisionName()!=null&&!dto.getSubDivisionName().equals("")){
+                        fatherNodeName=dto.getSubDivisionName();
+                    }
+                    else if(dto.getDivisionName()!=null&&!dto.getDivisionName().equals("")){
+                        fatherNodeName=dto.getDivisionName();
+                    } else if(dto.getSubUnitName()!=null&&!dto.getSubUnitName().equals("")){
+                        fatherNodeName=dto.getSubUnitName();
+                    }else if(dto.getUnitName()!=null&&!dto.getUnitName().equals("")){
+                        fatherNodeName=dto.getUnitName();
+                    }
+                    List<WbsTreeContract> list1 = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getNodeName, fatherNodeName).eq(WbsTreeContract::getProjectId, wbsTreeContractRoot.getProjectId())
+                        .eq(WbsTreeContract::getContractId, wbsTreeContractRoot.getContractId()).eq(WbsTreeContract::getIsDeleted, 0));
+                    if(list1.size()>0){
+                        for (WbsTreeContract contract : list1) {
+                            String[] ids = contract.getAncestors().split(",");
+                            ids=Arrays.stream(ids)
+                                .filter(id -> !id.equals("0")) // 过滤掉值为 "0" 的元素
+                                .toArray(String[]::new);
+                            String sql="Select node_name from m_wbs_tree_contract where p_key_id in("+String.join(",", ids)+")";
+                            List<String> nodeNames = jdbcTemplate.query(sql, new SingleColumnRowMapper<>(String.class));
+                            String result = String.join("",nodeNames);
+                            String ancestorsName= wbsTreeContractRoot.getNodeName()+StringUtils.defaultString(dto.getUnitName())
+                                + StringUtils.defaultString(dto.getSubUnitName())
+                                +StringUtils.defaultString(dto.getDivisionName())
+                                +StringUtils.defaultString(dto.getSubDivisionName());
+                            if(result.equals(ancestorsName)){
+                                WbsTreeContract item = new WbsTreeContract();
+                                BeanUtil.copy(contract,item);
+                                item.setPKeyId(SnowFlakeUtil.getId());
+                                item.setId(SnowFlakeUtil.getId());
+                                item.setParentId(contract.getId());
+                                item.setAncestors(contract.getAncestors()+","+item.getPKeyId());
+                                item.setIsCustom(1);
+                                item.setPartitionCode(dto.getItemCode());
+                                item.setNodeType(4);
+                                item.setNodeName(dto.getItemName());
+                                item.setFullName(dto.getItemName());
+                                baseMapper.insert(item);
+                                insertList.add(item);
+                                break;
+                            }
+                        }
+                    }
+                }
+
+            }
+            //子分项节点:如果没有被处理过,说明需要新增,最重要是需要找到父节点。现在的办法是(通过祖级节点名称拼接的方式来判断)。
+            if(!dto.getIsSubItem()){
+                Boolean exist = this.isExist(dto, WbsTreeContractList, 6, Long.valueOf(wbsTreeContractRoot.getContractId()));
+                if(!exist){
+                    String fatherNodeName="";
+                    if(dto.getItemName()!=null&&!dto.getItemName().equals("")){
+                        fatherNodeName=dto.getItemName();
+                    } else  if(dto.getSubDivisionName()!=null&&!dto.getSubDivisionName().equals("")){
+                        fatherNodeName=dto.getSubDivisionName();
+                    }
+                    else if(dto.getDivisionName()!=null&&!dto.getDivisionName().equals("")){
+                        fatherNodeName=dto.getDivisionName();
+                    } else if(dto.getSubUnitName()!=null&&!dto.getSubUnitName().equals("")){
+                        fatherNodeName=dto.getSubUnitName();
+                    }else if(dto.getUnitName()!=null&&!dto.getUnitName().equals("")){
+                        fatherNodeName=dto.getUnitName();
+                    }
+                    List<WbsTreeContract> list1 = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getNodeName, fatherNodeName).eq(WbsTreeContract::getProjectId, wbsTreeContractRoot.getProjectId())
+                        .eq(WbsTreeContract::getContractId, wbsTreeContractRoot.getContractId()).eq(WbsTreeContract::getIsDeleted, 0));
+                    if(list1.size()>0){
+                        for (WbsTreeContract contract : list1) {
+                            String[] ids = contract.getAncestors().split(",");
+                            ids=Arrays.stream(ids)
+                                .filter(id -> !id.equals("0")) // 过滤掉值为 "0" 的元素
+                                .toArray(String[]::new);
+                            String sql="Select node_name from m_wbs_tree_contract where p_key_id in("+String.join(",", ids)+")";
+                            List<String> nodeNames = jdbcTemplate.query(sql, new SingleColumnRowMapper<>(String.class));
+                            String result = String.join("",nodeNames);
+                            String ancestorsName= wbsTreeContractRoot.getNodeName()+StringUtils.defaultString(dto.getUnitName())
+                                + StringUtils.defaultString(dto.getSubUnitName())
+                                +StringUtils.defaultString(dto.getDivisionName())
+                                +StringUtils.defaultString(dto.getSubDivisionName())
+                                +StringUtils.defaultString(dto.getItemName());
+                            if(result.equals(ancestorsName)){
+                                WbsTreeContract subItem = new WbsTreeContract();
+                                BeanUtil.copy(contract,subItem);
+                                subItem.setPKeyId(SnowFlakeUtil.getId());
+                                subItem.setId(SnowFlakeUtil.getId());
+                                subItem.setParentId(contract.getId());
+                                subItem.setAncestors(contract.getAncestors()+","+subItem.getPKeyId());
+                                subItem.setIsCustom(1);
+                                subItem.setPartitionCode(dto.getSubItemCode());
+                                subItem.setNodeType(5);
+                                subItem.setNodeName(dto.getSubItemName());
+                                subItem.setFullName(dto.getSubItemName());
+                                baseMapper.insert(subItem);
+                                insertList.add(subItem);
+                                break;
+                            }
+                        }
+                    }
+                }
+
+            }
+        }
+//        if(insertList.size()>0){
+//            baseMapper.insertBatchSomeColumn(insertList);
+//        }
+        return R.success("新增了"+insertList.size()+"个节点"+","+String.join(",",updateList)+"节点编号已被修改");
+    }
+
+
+//    public class NodeInfo {
+//        private String nodeName;
+//        private Long parentId;
+//
+//        public NodeInfo(String nodeName, Long parentId) {
+//            this.nodeName=nodeName;
+//            this.parentId=parentId;
+//        }
+//
+//        // 构造器、getter和setter
+//
+//    }
+public static boolean hasConflictingCodes(List<ImportTreeDto> list) {
+    for (int i = 0; i < list.size(); i++) {
+        for (int j = i + 1; j < list.size(); j++) {
+            ImportTreeDto dto1 = list.get(i);
+            ImportTreeDto dto2 = list.get(j);
+
+            // 检查单位工程层级
+            if (checkUnitLevelConflict(dto1, dto2)) {
+                return true;
+            }
+
+            // 检查子单位工程层级
+            if (checkSubUnitLevelConflict(dto1, dto2)) {
+                return true;
+            }
+
+            // 检查分部工程层级
+            if (checkDivisionLevelConflict(dto1, dto2)) {
+                return true;
+            }
+
+            // 检查子分部工程层级
+            if (checkSubDivisionLevelConflict(dto1, dto2)) {
+                return true;
+            }
+
+            // 检查分项工程层级
+            if (checkItemLevelConflict(dto1, dto2)) {
+                return true;
+            }
+
+            // 检查子分项工程层级
+            if (checkSubItemLevelConflict(dto1, dto2)) {
+                return true;
+            }
+        }
+    }
+    return false;
+}
+    private static boolean checkUnitLevelConflict(ImportTreeDto dto1, ImportTreeDto dto2) {
+        return Objects.equals(dto1.getUnitName(), dto2.getUnitName()) &&
+            Objects.equals(dto1.getUnitType(), dto2.getUnitType()) &&
+            !Objects.equals(dto1.getUnitCode(), dto2.getUnitCode());
+    }
+
+    private static boolean checkSubUnitLevelConflict(ImportTreeDto dto1, ImportTreeDto dto2) {
+        String fatherNodeName1=dto1.getUnitName();
+        Integer fatherNodeType1=dto1.getUnitType();
+        String fatherNodeName2=dto2.getUnitName();
+        Integer fatherNodeType2=dto2.getUnitType();
+        return Objects.equals(dto1.getSubUnitName(), dto2.getSubUnitName()) &&
+            Objects.equals(dto1.getSubUnitType(), dto2.getSubUnitType()) &&
+            Objects.equals(fatherNodeName1, fatherNodeName2) &&
+            Objects.equals(fatherNodeType1, fatherNodeType2) &&
+            !Objects.equals(dto1.getSubUnitCode(), dto2.getSubUnitCode());
+    }
+
+    private static boolean checkDivisionLevelConflict(ImportTreeDto dto1, ImportTreeDto dto2) {
+        String fatherNodeName1="";
+        Integer fatherNodeType1=0;
+        String fatherNodeName2="";
+        Integer fatherNodeType2=0;
+        if(dto1.getSubUnitName()!=null){
+            fatherNodeName1=dto1.getSubUnitName();
+            fatherNodeType1=dto1.getSubUnitType();
+        }else {
+            fatherNodeName1=dto1.getUnitName();
+            fatherNodeType1=dto1.getUnitType();
+        }
+        if(dto2.getSubUnitName()!=null){
+            fatherNodeName2=dto2.getSubUnitName();
+            fatherNodeType2=dto2.getSubUnitType();
+        }else {
+            fatherNodeName2=dto2.getUnitName();
+            fatherNodeType2=dto2.getUnitType();
+        }
+        return Objects.equals(dto1.getDivisionName(), dto2.getDivisionName()) &&
+            Objects.equals(dto1.getDivisionType(), dto2.getDivisionType()) &&
+            Objects.equals(fatherNodeName1, fatherNodeName2) &&
+            Objects.equals(fatherNodeType1, fatherNodeType2) &&
+            !Objects.equals(dto1.getDivisionCode(), dto2.getDivisionCode());
+    }
+
+    private static boolean checkSubDivisionLevelConflict(ImportTreeDto dto1, ImportTreeDto dto2) {
+        String fatherNodeName1="";
+        Integer fatherNodeType1=0;
+        String fatherNodeName2="";
+        Integer fatherNodeType2=0;
+        if(dto1.getDivisionName()!=null){
+            fatherNodeName1=dto1.getDivisionName();
+            fatherNodeType1=dto1.getDivisionType();
+        }
+       else if(dto1.getSubUnitName()!=null){
+            fatherNodeName1=dto1.getSubUnitName();
+            fatherNodeType1=dto1.getSubUnitType();
+        }else {
+            fatherNodeName1=dto1.getUnitName();
+            fatherNodeType1=dto1.getUnitType();
+        }
+        if(dto2.getDivisionName()!=null){
+            fatherNodeName2=dto2.getDivisionName();
+            fatherNodeType2=dto2.getDivisionType();
+        }
+        else if(dto2.getSubUnitName()!=null){
+            fatherNodeName2=dto2.getSubUnitName();
+            fatherNodeType2=dto2.getSubUnitType();
+        }else {
+            fatherNodeName2=dto2.getUnitName();
+            fatherNodeType2=dto2.getUnitType();
+        }
+        return Objects.equals(dto1.getSubDivisionName(), dto2.getSubDivisionName()) &&
+            Objects.equals(dto1.getSubDivisionType(), dto2.getSubDivisionType()) &&
+            Objects.equals(fatherNodeName1, fatherNodeName2) &&
+            Objects.equals(fatherNodeType1, fatherNodeType2) &&
+            !Objects.equals(dto1.getSubDivisionCode(), dto2.getSubDivisionCode());
+    }
+
+    private static boolean checkItemLevelConflict(ImportTreeDto dto1, ImportTreeDto dto2) {
+        String fatherNodeName1="";
+        Integer fatherNodeType1=0;
+        String fatherNodeName2="";
+        Integer fatherNodeType2=0;
+        if(dto1.getSubDivisionName()!=null){
+            fatherNodeName1=dto1.getSubDivisionName();
+            fatherNodeType1=dto1.getSubDivisionType();
+        }
+       else if(dto1.getDivisionName()!=null){
+            fatherNodeName1=dto1.getDivisionName();
+            fatherNodeType1=dto1.getDivisionType();
+        }
+        else if(dto1.getSubUnitName()!=null){
+            fatherNodeName1=dto1.getSubUnitName();
+            fatherNodeType1=dto1.getSubUnitType();
+        }else {
+            fatherNodeName1=dto1.getUnitName();
+            fatherNodeType1=dto1.getUnitType();
+        }
+        if(dto2.getSubDivisionName()!=null){
+            fatherNodeName2=dto2.getSubDivisionName();
+            fatherNodeType2=dto2.getSubDivisionType();
+        }
+        else  if(dto2.getDivisionName()!=null){
+            fatherNodeName2=dto2.getDivisionName();
+            fatherNodeType2=dto2.getDivisionType();
+        }
+        else if(dto2.getSubUnitName()!=null){
+            fatherNodeName2=dto2.getSubUnitName();
+            fatherNodeType2=dto2.getSubUnitType();
+        }else {
+            fatherNodeName2=dto2.getUnitName();
+            fatherNodeType2=dto2.getUnitType();
+        }
+        return Objects.equals(dto1.getItemName(), dto2.getItemName()) &&
+            Objects.equals(dto1.getItemType(), dto2.getItemType()) &&
+            Objects.equals(fatherNodeName1, fatherNodeName2) &&
+            Objects.equals(fatherNodeType1, fatherNodeType2) &&
+            !Objects.equals(dto1.getItemCode(), dto2.getItemCode());
+    }
+
+    private static boolean checkSubItemLevelConflict(ImportTreeDto dto1, ImportTreeDto dto2) {
+        String fatherNodeName1="";
+        Integer fatherNodeType1=0;
+        String fatherNodeName2="";
+        Integer fatherNodeType2=0;
+        if(dto1.getItemName()!=null){
+            fatherNodeName1=dto1.getItemName();
+            fatherNodeType1=dto1.getItemType();
+        }
+       else  if(dto1.getSubDivisionName()!=null){
+            fatherNodeName1=dto1.getSubDivisionName();
+            fatherNodeType1=dto1.getSubDivisionType();
+        }
+        else if(dto1.getDivisionName()!=null){
+            fatherNodeName1=dto1.getDivisionName();
+            fatherNodeType1=dto1.getDivisionType();
+        }
+        else if(dto1.getSubUnitName()!=null){
+            fatherNodeName1=dto1.getSubUnitName();
+            fatherNodeType1=dto1.getSubUnitType();
+        }else {
+            fatherNodeName1=dto1.getUnitName();
+            fatherNodeType1=dto1.getUnitType();
+        }
+        if(dto2.getItemName()!=null){
+            fatherNodeName2=dto2.getItemName();
+            fatherNodeType2=dto2.getItemType();
+        }
+        else if(dto2.getSubDivisionName()!=null){
+            fatherNodeName2=dto2.getSubDivisionName();
+            fatherNodeType2=dto2.getSubDivisionType();
+        }
+        else  if(dto2.getDivisionName()!=null){
+            fatherNodeName2=dto2.getDivisionName();
+            fatherNodeType2=dto2.getDivisionType();
+        }
+        else if(dto2.getSubUnitName()!=null){
+            fatherNodeName2=dto2.getSubUnitName();
+            fatherNodeType2=dto2.getSubUnitType();
+        }else {
+            fatherNodeName2=dto2.getUnitName();
+            fatherNodeType2=dto2.getUnitType();
+        }
+        return Objects.equals(dto1.getSubItemName(), dto2.getSubItemName()) &&
+            Objects.equals(dto1.getSubItemType(), dto2.getSubItemType()) &&
+            Objects.equals(fatherNodeName1, fatherNodeName2) &&
+            Objects.equals(fatherNodeType1, fatherNodeType2) &&
+            !Objects.equals(dto1.getSubItemCode(), dto2.getSubItemCode());
+    }
+    private Boolean isExist(ImportTreeDto dto, List<WbsTreeContract> wbsTreeContractList, int type,Long contractId) {
+        String nodeName="";
+        if(type==1){
+            nodeName=dto.getUnitName();
+        }
+        else if(type==2){
+            nodeName=dto.getSubUnitName();
+        }
+        else if(type==3){
+            nodeName=dto.getDivisionName();
+        }
+        else if(type==4){
+            nodeName=dto.getSubDivisionName();
+        }
+        else  if(type==5){
+            nodeName=dto.getItemName();
+        }
+        else  if(type==6){
+            nodeName=dto.getSubItemName();
+        }
+        String finalNodeName = nodeName;
+        List<Long> list = wbsTreeContractList.stream()
+            .filter(item -> finalNodeName.equals(item.getNodeName()))
+            .map(item -> item.getParentId())
+            .collect(Collectors.toList());
+        if(list.size()==0){
+            return false;
+        }else {
+            if(type==1){
+                return true;
+            }
+            //如果数据库中存在名称相同的节点,查询该节点的祖级节点
+            String sql="select node_name from m_wbs_tree_contract where is_deleted=0 and contract_id="+contractId+" and id in ("+String.join(",", list.stream().map(String::valueOf).collect(Collectors.toList()))+")";
+            List<String> nodeNames = jdbcTemplate.query(sql, new SingleColumnRowMapper<>(String.class));
+            String  fatherNodeName="";
+            if(type==2){
+                fatherNodeName=dto.getUnitName();
+            }
+           else if(type==3){
+                if(dto.getSubUnitName()!=null&&!dto.getSubUnitName().equals("")){
+                    fatherNodeName=dto.getSubUnitName();
+                }else if(dto.getUnitName()!=null&&!dto.getUnitName().equals("")){
+                    fatherNodeName=dto.getUnitName();
+                }
+            }
+            else if(type==4){
                 if(dto.getDivisionName()!=null&&!dto.getDivisionName().equals("")){
                     fatherNodeName=dto.getDivisionName();
                 } else if(dto.getSubUnitName()!=null&&!dto.getSubUnitName().equals("")){
@@ -2370,129 +2889,44 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 }else if(dto.getUnitName()!=null&&!dto.getUnitName().equals("")){
                     fatherNodeName=dto.getUnitName();
                 }
-                List<WbsTreeContract> list1 = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getNodeName, fatherNodeName).eq(WbsTreeContract::getProjectId, wbsTreeContractRoot.getProjectId())
-                    .eq(WbsTreeContract::getContractId, wbsTreeContractRoot.getContractId()).eq(WbsTreeContract::getIsDeleted, 0));
-                if(list1.size()>0){
-                    for (WbsTreeContract contract : list1) {
-                        String[] ids = contract.getAncestors().split(",");
-                        ids=Arrays.stream(ids)
-                            .filter(id -> !id.equals("0")) // 过滤掉值为 "0" 的元素
-                            .toArray(String[]::new);
-                        String sql="Select node_name from m_wbs_tree_contract where id in("+String.join("','", ids)+")";
-                        List<String> nodeNames = jdbcTemplate.query(sql, new SingleColumnRowMapper<>(String.class));
-                        String result = String.join("",nodeNames);
-                        String ancestorsName=dto.getUnitName()!=null?dto.getUnitName():""+dto.getSubUnitName()!=null?dto.getSubUnitName():""+dto.getDivisionName()!=null?dto.getDivisionName():"";
-                        if(result.equals(ancestorsName)){
-                            WbsTreeContract subDivision = new WbsTreeContract();
-                            BeanUtil.copy(contract,subDivision);
-                            subDivision.setPKeyId(SnowFlakeUtil.getId());
-                            subDivision.setId(SnowFlakeUtil.getId());
-                            subDivision.setParentId(contract.getId());
-                            subDivision.setAncestors(contract.getAncestors()+","+subDivision.getId());
-                            subDivision.setIsCustom(1);
-                            subDivision.setIsTypePrivatePid(null);
-                            subDivision.setNodeType(3);
-                            insertList.add(subDivision);
-                            break;
-                        }
-                    }
-                }
             }
-            //分项节点:如果没有被处理过,说明需要新增,最重要是需要找到父节点。现在的办法是(通过祖级节点名称拼接的方式来判断)。
-            if(!dto.getIsItem()){
-                String fatherNodeName="";
-                if(dto.getItemName()!=null&&!dto.getItemName().equals("")){
-                    fatherNodeName=dto.getItemName();
-                } else if(dto.getDivisionName()!=null&&!dto.getDivisionName().equals("")){
+            else if(type==5){
+                if(dto.getSubDivisionName()!=null&&!dto.getSubDivisionName().equals("")){
+                    fatherNodeName=dto.getSubDivisionName();
+                }
+                else if(dto.getDivisionName()!=null&&!dto.getDivisionName().equals("")){
                     fatherNodeName=dto.getDivisionName();
                 } else if(dto.getSubUnitName()!=null&&!dto.getSubUnitName().equals("")){
                     fatherNodeName=dto.getSubUnitName();
                 }else if(dto.getUnitName()!=null&&!dto.getUnitName().equals("")){
                     fatherNodeName=dto.getUnitName();
                 }
-                List<WbsTreeContract> list1 = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getNodeName, fatherNodeName).eq(WbsTreeContract::getProjectId, wbsTreeContractRoot.getProjectId())
-                    .eq(WbsTreeContract::getContractId, wbsTreeContractRoot.getContractId()).eq(WbsTreeContract::getIsDeleted, 0));
-                if(list1.size()>0){
-                    for (WbsTreeContract contract : list1) {
-                        String[] ids = contract.getAncestors().split(",");
-                        ids=Arrays.stream(ids)
-                            .filter(id -> !id.equals("0")) // 过滤掉值为 "0" 的元素
-                            .toArray(String[]::new);
-                        String sql="Select node_name from m_wbs_tree_contract where id in("+String.join("','", ids)+")";
-                        List<String> nodeNames = jdbcTemplate.query(sql, new SingleColumnRowMapper<>(String.class));
-                        String result = String.join("",nodeNames);
-                        String ancestorsName=dto.getUnitName()!=null?dto.getUnitName():""+dto.getSubUnitName()!=null?dto.getSubUnitName():""+dto.getDivisionName()!=null?dto.getDivisionName():""+dto.getSubUnitName()!=null?dto.getSubUnitName():"";
-                        if(result.equals(ancestorsName)){
-                            WbsTreeContract item = new WbsTreeContract();
-                            BeanUtil.copy(contract,item);
-                            item.setPKeyId(SnowFlakeUtil.getId());
-                            item.setId(SnowFlakeUtil.getId());
-                            item.setParentId(contract.getId());
-                            item.setAncestors(contract.getAncestors()+","+item.getId());
-                            item.setIsCustom(1);
-                            item.setIsTypePrivatePid(null);
-                            item.setNodeType(4);
-                            insertList.add(item);
-                            break;
-                        }
-                    }
-                }
             }
-            //子分项节点:如果没有被处理过,说明需要新增,最重要是需要找到父节点。现在的办法是(通过祖级节点名称拼接的方式来判断)。
-            if(!dto.getIsSubItem()){
-                String fatherNodeName="";
-                if(dto.getSubItemName()!=null&&!dto.getSubItemName().equals("")){
-                    fatherNodeName=dto.getSubItemName();
-                }else if(dto.getItemName()!=null&&!dto.getItemName().equals("")){
-                    fatherNodeName=dto.getItemName();
-                } else if(dto.getDivisionName()!=null&&!dto.getDivisionName().equals("")){
+            else  if(type==6){
+                if(dto.getItemName()!=null&&!dto.getItemName().equals("")){
+                } else  if(dto.getSubDivisionName()!=null&&!dto.getSubDivisionName().equals("")){
+                    fatherNodeName=dto.getSubDivisionName();
+                }
+                else if(dto.getDivisionName()!=null&&!dto.getDivisionName().equals("")){
                     fatherNodeName=dto.getDivisionName();
                 } else if(dto.getSubUnitName()!=null&&!dto.getSubUnitName().equals("")){
                     fatherNodeName=dto.getSubUnitName();
                 }else if(dto.getUnitName()!=null&&!dto.getUnitName().equals("")){
                     fatherNodeName=dto.getUnitName();
                 }
-                List<WbsTreeContract> list1 = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getNodeName, fatherNodeName).eq(WbsTreeContract::getProjectId, wbsTreeContractRoot.getProjectId())
-                    .eq(WbsTreeContract::getContractId, wbsTreeContractRoot.getContractId()).eq(WbsTreeContract::getIsDeleted, 0));
-                if(list1.size()>0){
-                    for (WbsTreeContract contract : list1) {
-                        String[] ids = contract.getAncestors().split(",");
-                        ids=Arrays.stream(ids)
-                            .filter(id -> !id.equals("0")) // 过滤掉值为 "0" 的元素
-                            .toArray(String[]::new);
-                        String sql="Select node_name from m_wbs_tree_contract where id in("+String.join("','", ids)+")";
-                        List<String> nodeNames = jdbcTemplate.query(sql, new SingleColumnRowMapper<>(String.class));
-                        String result = String.join("",nodeNames);
-                        String ancestorsName=dto.getUnitName()!=null?dto.getUnitName():""+dto.getSubUnitName()!=null?dto.getSubUnitName():""+dto.getDivisionName()!=null?dto.getDivisionName():""+dto.getSubUnitName()!=null?dto.getSubUnitName():""+dto.getItemName()!=null?dto.getItemName():"";
-                        if(result.equals(ancestorsName)){
-                            WbsTreeContract subItem = new WbsTreeContract();
-                            BeanUtil.copy(contract,subItem);
-                            subItem.setPKeyId(SnowFlakeUtil.getId());
-                            subItem.setId(SnowFlakeUtil.getId());
-                            subItem.setParentId(contract.getId());
-                            subItem.setAncestors(contract.getAncestors()+","+subItem.getId());
-                            subItem.setIsCustom(1);
-                            subItem.setIsTypePrivatePid(null);
-                            subItem.setNodeType(5);
-                            insertList.add(subItem);
-                            break;
-                        }
-                    }
-                }
             }
+
+            if(nodeNames.size()>0&&nodeNames.contains(fatherNodeName)){
+                return true;
+            }
+            return false;
         }
-        if(insertList.size()>0){
-            baseMapper.insertBatchSomeColumn(insertList);
-        }
-        return R.success("新增了"+insertList.size()+"个节点"+","+String.join(",",updateList)+"节点编号已被修改");
     }
 
 
-
-
     //判断名称是否都在wbs的祖级节点里面
     private Boolean isTrueNode(List<String> list, WbsTreeContractVO vo){
-        String sql="select node_name from m_wbs_tree_contract where id in ("+String.join("','", vo.getAncestors().split(","))+")";
+        String sql="select node_name from m_wbs_tree_contract where p_key_id in ("+String.join(",", vo.getAncestors().split(","))+")";
         List<String> ancestorNames = jdbcTemplate.query(sql, new SingleColumnRowMapper<>(String.class));
         list.removeIf(Objects::isNull);
         if(!ancestorNames.isEmpty()){
@@ -3111,4 +3545,46 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
             }
         }
     }
+    public void updateAncestors() {
+        // 获取所有节点
+        List<WbsTreeContract> allNodes = baseMapper.selectList(new LambdaQueryWrapper<>(WbsTreeContract.class).eq(WbsTreeContract::getProjectId,1630011899725201410L));
+
+        // 构建父子关系映射
+        Map<Long, List<WbsTreeContract>> parentChildMap = new HashMap<>();
+        Map<Long, WbsTreeContract> nodeMap = new HashMap<>();
+
+        for (WbsTreeContract node : allNodes) {
+            nodeMap.put(node.getId(), node);
+            parentChildMap.computeIfAbsent(node.getParentId(), k -> new ArrayList<>()).add(node);
+        }
+
+        // 从根节点开始递归设置 ancestors
+        List<WbsTreeContract> rootNodes = parentChildMap.getOrDefault(0L, Collections.emptyList());
+        for (WbsTreeContract rootNode : rootNodes) {
+            setAncestors(rootNode, parentChildMap, nodeMap);
+        }
+        System.out.println("完成");
+    }
+
+    private void setAncestors(WbsTreeContract node, Map<Long, List<WbsTreeContract>> parentChildMap, Map<Long, WbsTreeContract> nodeMap) {
+        if (node.getParentId() == 0) {
+            node.setAncestors("");
+        } else {
+            WbsTreeContract parentNode = nodeMap.get(node.getParentId());
+            if (parentNode != null) {
+                node.setAncestors(parentNode.getAncestors() + (parentNode.getAncestors().isEmpty() ? "" : ",") + parentNode.getPKeyId());
+            }
+        }
+
+        // 更新数据库
+        UpdateWrapper<WbsTreeContract> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.eq("id", node.getId()).eq("project_id",node.getProjectId()).set("ancestors", node.getAncestors());
+        baseMapper.update(null, updateWrapper);
+
+        // 递归处理子节点
+        List<WbsTreeContract> children = parentChildMap.getOrDefault(node.getId(), Collections.emptyList());
+        for (WbsTreeContract child : children) {
+            setAncestors(child, parentChildMap, nodeMap);
+        }
+    }
 }

+ 53 - 8
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -88,12 +88,12 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     @Override
     public List<WbsTreePrivateVO> tree(String wbsId, String projectId) {
         WbsInfo wbsInfo = wbsInfoMapper.selectOne(Wrappers.<WbsInfo>query().lambda().eq(WbsInfo::getId, wbsId));
-        String sql="select * from m_project_info where id="+projectId;
-        ProjectInfo projectInfo = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(ProjectInfo.class));
+//        String sql="select * from m_project_info where id="+projectId;
+//        ProjectInfo projectInfo = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(ProjectInfo.class));
         Integer parentId = null;
-        if(projectInfo.getTemplateType()!=null&&projectInfo.getTemplateType()==2){
-            parentId=1;
-        }
+//        if(projectInfo.getTemplateType()!=null&&projectInfo.getTemplateType()==2){
+//            parentId=1;
+//        }
         if (wbsInfo != null) {
             List<WbsTreePrivateVO> tree = baseMapper.tree(wbsId, projectId, wbsInfo.getWbsType(),parentId);
             //公有引用
@@ -1633,12 +1633,12 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                                 .select(WbsTreePrivate::getId, WbsTreePrivate::getParentId, WbsTreePrivate::getPKeyId)
                                 .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId()).eq(WbsTreePrivate::getType, 2)
                                 /*.eq(WbsTreePrivate::getStatus, 1)*/
-                                .like(WbsTreePrivate::getAncestors, wbsTreePrivate.getId()));
+                                .like(WbsTreePrivate::getAncestors, wbsTreePrivateRoot.getId()));
                     }
 
                     //获取当前项目选择的节点下的所有元素表 节点
                     List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
-                                    .select(WbsTreePrivate::getType, WbsTreePrivate::getId, WbsTreePrivate::getAncestors)
+                                    .select(WbsTreePrivate::getType, WbsTreePrivate::getId, WbsTreePrivate::getAncestors,WbsTreePrivate::getPKeyId)
                                     .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
                             /*.eq(WbsTreePrivate::getStatus, 1)*/
                     );
@@ -1659,7 +1659,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     //判断当前新增的表在私有wbs中是否存在上级节点,存在表示可以新增,不存在表示不新增
                     List<WbsTreePrivate> addPrivateTables = addPrivateTable.stream().filter(node ->
                             wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
-
                     //构造
                     List<Long> ids = addPrivateTables.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
                     if (ids.size() > 0) {
@@ -3121,4 +3120,50 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         }
     }
 
+
+    public void updateAncestors() {
+        // 获取所有节点
+        List<WbsTreePrivate> allNodes = baseMapper.selectList(new LambdaQueryWrapper<>(WbsTreePrivate.class).eq(WbsTreePrivate::getProjectId,1630011899725201410L));
+
+        // 构建父子关系映射
+        Map<Long, List<WbsTreePrivate>> parentChildMap = new HashMap<>();
+        Map<Long, WbsTreePrivate> nodeMap = new HashMap<>();
+
+        for (WbsTreePrivate node : allNodes) {
+            nodeMap.put(node.getId(), node);
+            parentChildMap.computeIfAbsent(node.getParentId(), k -> new ArrayList<>()).add(node);
+        }
+
+        // 从根节点开始递归设置 ancestors
+        List<WbsTreePrivate> rootNodes = parentChildMap.getOrDefault(0L, Collections.emptyList());
+        for (WbsTreePrivate rootNode : rootNodes) {
+            setAncestors(rootNode, parentChildMap, nodeMap);
+        }
+        System.out.println("完成");
+    }
+
+    private void setAncestors(WbsTreePrivate node, Map<Long, List<WbsTreePrivate>> parentChildMap, Map<Long, WbsTreePrivate> nodeMap) {
+        if (node.getParentId() == 0) {
+            node.setAncestors("");
+        } else {
+            WbsTreePrivate parentNode = nodeMap.get(node.getParentId());
+            if (parentNode != null) {
+                node.setAncestors(parentNode.getAncestors() + (parentNode.getAncestors().isEmpty() ? "" : ",") + parentNode.getPKeyId());
+            }
+        }
+
+        // 更新数据库
+        UpdateWrapper<WbsTreePrivate> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.eq("id", node.getId()).eq("project_id",node.getProjectId()).set("ancestors", node.getAncestors());
+        baseMapper.update(null, updateWrapper);
+
+        // 递归处理子节点
+        List<WbsTreePrivate> children = parentChildMap.getOrDefault(node.getId(), Collections.emptyList());
+        for (WbsTreePrivate child : children) {
+            setAncestors(child, parentChildMap, nodeMap);
+        }
+    }
+
+
+
 }

+ 3 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/PdfAddimgUtil.java

@@ -122,7 +122,7 @@ public class PdfAddimgUtil {
         if(type.equals("6")){
             x = width * x - 27+pyzbx;
             y = height - height * y - 30+pyzby;
-            imagePath = "/Users/hongchuangyanfa/Desktop/print/ht1234567890.png";
+            imagePath = FileUtils.getSysLocalFileUrl()+"print/ht1234567890.png";
         }else{
             x = width * x - 20+pyzbx;
             y = height - height * y - 8+pyzby;
@@ -203,7 +203,7 @@ public class PdfAddimgUtil {
         if(type.equals("6")){
             x = width * x - 27+pyzbx;
             y = height - height * y - 30+pyzby;
-            imagePath = "/Users/hongchuangyanfa/Desktop/print/ht1234567890.png";
+            imagePath = FileUtils.getSysLocalFileUrl()+"print/ht1234567890.png";
         }else{
             x = width * x - 20+pyzbx;
             y = height - height * y - 8+pyzby;
@@ -508,4 +508,4 @@ public class PdfAddimgUtil {
         String path = sys_file_net_url + fileUrl.replaceAll("//", "/").replaceAll(file_path, "");
         return path;
     }
-}
+}

+ 5 - 1
blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

@@ -1714,9 +1714,13 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                         .collect(Collectors.toList());
                 }
             }
+            StringBuilder sb = new StringBuilder();
+            for (InformationQueryVO queryVO : voResult) {
+                sb=sb.append(queryVO.getId()+",");
+            }
+            System.out.println(sb);
             if (ObjectUtil.isEmpty(voResult)) {
                 return page.setRecords(null);
-
             }
             else if (voResult.size() == 1) {
                 page.setRecords(voResult);