Ver Fonte

Merge remote-tracking branch 'origin/master' into master

yangyj há 2 anos atrás
pai
commit
29ce4e4dc2
20 ficheiros alterados com 598 adições e 344 exclusões
  1. 5 1
      blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetailsServiceImpl.java
  2. 5 4
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/ConstructionLedger.java
  3. 6 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ContractLogClient.java
  4. 1 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ExctabCell.java
  5. 15 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ImportContractNodeVO.java
  6. 16 12
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ConstructionLedgerController.java
  7. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/EVisaTaskCheckController.java
  8. 81 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/OtherController.java
  9. 27 8
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  10. 23 1
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ContractLogClientImpl.java
  11. 0 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/ManagerApplication.java
  12. 157 93
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  13. 52 16
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExpaileHtml.java
  14. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/LinkdataInfoController.java
  15. 3 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.xml
  16. 14 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml
  17. 95 25
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  18. 0 7
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExctabCellServiceImpl.java
  19. 92 163
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  20. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/DiffListUtil.java

+ 5 - 1
blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetailsServiceImpl.java

@@ -241,11 +241,15 @@ public class BladeUserDetailsServiceImpl implements UserDetailsService {
                     result = 2; //APP=APP端
                     break;
                 case "saber":
-                    result = 3; //OTHER=后管
+                    result = 3; //ALL=后管
                     break;
             }
         }
         if (!result.equals(user.getUserType())) {
+            if ((result == 1 && user.getUserType().equals(2)) || (result == 2 && user.getUserType().equals(1))) {
+                //客户端与APP端均可登陆
+                return;
+            }
             throw new UserDeniedAuthorizationException(TokenUtil.USER_ACCOUNT_NO_PERMISSION);
         }
     }

+ 5 - 4
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/ConstructionLedger.java

@@ -20,6 +20,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 
 import java.io.Serializable;
 import java.time.LocalDateTime;
+import java.util.Date;
 
 import io.swagger.annotations.ApiModelProperty;
 import org.springblade.core.mp.base.BaseEntity;
@@ -53,22 +54,22 @@ public class ConstructionLedger extends BaseEntity {
      * 施工开始时间
      */
 	@ApiModelProperty("施工开始时间")
-    private LocalDateTime siteStartTime;
+    private Date siteStartTime;
     /**
      * 施工结束时间
      */
 	@ApiModelProperty("施工结束时间")
-    private LocalDateTime siteEndTime;
+    private Date siteEndTime;
     /**
      * 检测开始时间
      */
 	@ApiModelProperty("检测开始时间")
-    private LocalDateTime detectionStartTime;
+    private Date detectionStartTime;
     /**
      * 检测结束时间
      */
 	@ApiModelProperty("检测结束时间")
-    private LocalDateTime detectionEndTime;
+    private Date detectionEndTime;
     /**
      * 设计方量
      */

+ 6 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ContractLogClient.java

@@ -18,6 +18,9 @@ public interface ContractLogClient {
 
     String API_PREFIX = "/contractLog";
 
+    @PostMapping(API_PREFIX + "/queryContractLogWbsByBusinessId")
+    List<JSONObject> queryContractLogWbsByBusinessId(@RequestParam String businessId);
+
     @PostMapping(API_PREFIX + "/removeContractLogWbsByTheLogId")
     void removeContractLogWbsByTheLogId(@RequestParam String theLogId);
 
@@ -33,6 +36,9 @@ public interface ContractLogClient {
     @GetMapping(API_PREFIX + "/queryContractLogById")
     JSONObject queryContractLogById(@RequestParam String theLogId);
 
+    @PostMapping(API_PREFIX + "/queryContractLogByIdList")
+    List<JSONObject> queryContractLogByIds(@RequestBody List<String> theLogIds);
+
     /**
      * 保存日志信息
      */

+ 1 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ExctabCell.java

@@ -72,6 +72,7 @@ public class ExctabCell extends BaseEntity {
     /**
      * 元素类型
      */
+    @ApiModelProperty(name = "text_element_type", value = "text_element_type")
     private Integer textElementType;
 
     /**

+ 15 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ImportContractNodeVO.java

@@ -0,0 +1,15 @@
+package org.springblade.manager.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class ImportContractNodeVO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private Integer nodeType;
+    private String nodeName;
+    private String partitionCode;
+
+}

+ 16 - 12
blade-service/blade-business/src/main/java/org/springblade/business/controller/ConstructionLedgerController.java

@@ -1,6 +1,7 @@
 package org.springblade.business.controller;
 
 import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSONObject;
 import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
@@ -144,7 +145,7 @@ public class ConstructionLedgerController extends BladeController {
 					//校验两个时间,看看哪个时间更早
 					Duration duration = org.springblade.core.tool.utils.DateUtil.between(
 							org.springblade.core.tool.utils.DateUtil.parse(recordTime, "yyyy-MM-dd HH:mm:ss"),
-							org.springblade.core.tool.utils.DateUtil.toDate(vos.getSiteStartTime())
+							vos.getSiteStartTime()
 					);
 					if(duration.getSeconds() > 0){
 						//说明施工日志最早的填报时间比自定义填写的时间要晚,取客户填写的时间
@@ -192,22 +193,25 @@ public class ConstructionLedgerController extends BladeController {
 	@PostMapping("/update")
 	@ApiOperationSupport(order = 5)
 	@ApiOperation(value = "修改", notes = "传入constructionLedger")
-	public R<Boolean> update(@Valid @RequestBody ConstructionLedgerVO constructionLedger) {
+	public R<Boolean> update(@RequestBody JSONObject json) {
+		ConstructionLedgerVO voLedger = JSONObject.parseObject(JSONObject.toJSONString(json), ConstructionLedgerVO.class);
+		ConstructionLedger ledger = JSONObject.parseObject(JSONObject.toJSONString(json), ConstructionLedger.class);
+
 		//施工起止时间
-		if(StringUtils.isNotEmpty(constructionLedger.getSiteTimeStr()) && constructionLedger.getSiteTimeStr().contains("~")){
-			String[] time = constructionLedger.getSiteTimeStr().split("~");
-			constructionLedger.setSiteStartTime(DateUtil.toLocalDateTime(org.springblade.core.tool.utils.DateUtil.parse(time[0], "yyyy-MM-dd")));
-			constructionLedger.setSiteEndTime(DateUtil.toLocalDateTime(org.springblade.core.tool.utils.DateUtil.parse(time[1], "yyyy-MM-dd")));
+		if(StringUtils.isNotEmpty(voLedger.getSiteTimeStr()) && voLedger.getSiteTimeStr().contains("~")){
+			String[] time = voLedger.getSiteTimeStr().split("~");
+			ledger.setSiteStartTime(org.springblade.core.tool.utils.DateUtil.parse(time[0], "yyyy-MM-dd"));
+			ledger.setSiteEndTime(org.springblade.core.tool.utils.DateUtil.parse(time[1], "yyyy-MM-dd"));
 		}
 
 		//检测起止时间
-		if(StringUtils.isNotEmpty(constructionLedger.getDetectionTimeStr()) && constructionLedger.getDetectionTimeStr().contains("~")){
-			String[] time = constructionLedger.getDetectionTimeStr().split("~");
-			constructionLedger.setDetectionStartTime(DateUtil.toLocalDateTime(org.springblade.core.tool.utils.DateUtil.parse(time[0], "yyyy-MM-dd")));
-			constructionLedger.setDetectionEndTime(DateUtil.toLocalDateTime(org.springblade.core.tool.utils.DateUtil.parse(time[1], "yyyy-MM-dd")));
+		if(StringUtils.isNotEmpty(voLedger.getDetectionTimeStr()) && voLedger.getDetectionTimeStr().contains("~")){
+			String[] time = voLedger.getDetectionTimeStr().split("~");
+			ledger.setDetectionStartTime(org.springblade.core.tool.utils.DateUtil.parse(time[0], "yyyy-MM-dd"));
+			ledger.setDetectionEndTime(org.springblade.core.tool.utils.DateUtil.parse(time[1], "yyyy-MM-dd"));
 		}
-		setUserData(constructionLedger, false);
-		return R.status(this.constructionLedgerService.updateById(constructionLedger));
+		setUserData(ledger, false);
+		return R.status(this.constructionLedgerService.updateById(ledger));
 	}
 
 	/**

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/controller/EVisaTaskCheckController.java

@@ -131,7 +131,7 @@ public class EVisaTaskCheckController {
         List<JSONObject> jsonList = this.queryTableEVisaConfig(json);
 
         if(jsonList == null){
-            return R.data(300, null, "未找到符合电签配置的相关流程,请联系服务人员处理");
+            return R.fail(300, "未找到符合电签配置的相关流程,请联系服务人员处理");
         }
 
         //汇总电签配置的审批角色

+ 81 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/OtherController.java

@@ -0,0 +1,81 @@
+package org.springblade.business.controller;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.business.entity.MessageWarning;
+import org.springblade.business.entity.Task;
+import org.springblade.business.entity.TaskParallel;
+import org.springblade.business.service.IMessageWarningService;
+import org.springblade.business.service.ITaskParallelService;
+import org.springblade.business.service.ITaskService;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/other")
+@Api(value = "其它接口", tags = "其它接口")
+public class OtherController extends BladeController {
+
+    private final ITaskParallelService taskParallelService;
+
+    private final ITaskService taskService;
+
+    private final IMessageWarningService messageWarningService;
+
+    /**
+     * 统计当前用户当前合同段下的所有未读通知及待办任务
+     */
+    @GetMapping("/countUserMessageAndTask")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "统计当前用户当前合同段下的所有未读通知及待办任务")
+    public R<Long> countUserMessageAndTask(@RequestParam String contractId){
+        //待办任务
+        long taskLong = this.countToDoUserTask(contractId).getData();
+        //未读通知
+        long messageLong = this.countUserMessage(contractId).getData();
+
+        return R.data((taskLong + messageLong));
+    }
+
+    /**
+     * 统计当前用户的所有未读通知
+     */
+    @GetMapping("/countUserMessage")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "统计当前用户当前合同段下的所有未读通知")
+    public R<Long> countUserMessage(@RequestParam String contractId){
+        return R.data(this.messageWarningService.count(Wrappers.<MessageWarning>lambdaQuery()
+                .eq(MessageWarning::getContractId, contractId)
+                .ne(MessageWarning::getIsRead, "1")
+                .eq(MessageWarning::getPushUser, AuthUtil.getUserId())));
+    }
+
+    /**
+     * 统计当前用户当前合同段下的待办数量
+     */
+    @GetMapping("/countToDoUserTask")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "统计当前用户当前合同段下的待办数量")
+    public R<Long> countToDoUserTask(@RequestParam String contractId){
+        List<Task> taskList = this.taskService.list(Wrappers.<Task>lambdaQuery().eq(Task::getContractId, contractId));
+        long result = 0;
+        if(taskList != null && taskList.size() > 0){
+            result = this.taskParallelService.count(Wrappers.<TaskParallel>lambdaQuery()
+                    .eq(TaskParallel::getTaskUser, AuthUtil.getUserId())
+                    .eq(TaskParallel::getStatus, "1")
+                    .in(TaskParallel::getProcessInstanceId, taskList.stream().map(Task::getProcessInstanceId).distinct().collect(Collectors.toList()))
+                    .groupBy(TaskParallel::getProcessInstanceId));
+        }
+        return R.data(result);
+    }
+
+}

+ 27 - 8
blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java

@@ -2,7 +2,9 @@ package org.springblade.business.controller;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -72,6 +74,31 @@ public class TaskController extends BladeController {
 
 	private final ITaskBatchService taskBatchService;
 
+	/**
+	 * 记录短信验证码超时时间
+	 */
+	@GetMapping("/save-sms-timeout")
+	@ApiOperationSupport(order = 13)
+	@ApiOperation(value = "记录短信验证码超时时间")
+	public void saveSmsTimeout(@RequestParam String code){
+		//获取账户记录
+		DefaultConfig config = this.defaultConfigService.getOne(Wrappers.<DefaultConfig>lambdaQuery().eq(DefaultConfig::getCreateUser, AuthUtil.getUserId()));
+		if(config != null){
+			//获取当前时间
+			Date now = DateUtil.now();
+			//默认16小时后超时
+			now = DateUtil.plusHours(now, 16);
+
+			LambdaUpdateWrapper<DefaultConfig> wrapper = new LambdaUpdateWrapper<>();
+			wrapper.set(DefaultConfig::getSmsTimeOut, DateUtil.format(now, "yyyy-MM-dd HH:mm:ss"));
+			if(!StringUtils.equals(config.getSmsCode(), code)){
+				wrapper.set(DefaultConfig::getSmsCode, code);
+			}
+			//生成超时时间
+			this.defaultConfigService.update(wrapper.eq(DefaultConfig::getCreateUser, AuthUtil.getUserId()));
+		}
+	}
+
 	/**
 	 * 校验电签短信验证码
 	 */
@@ -131,22 +158,14 @@ public class TaskController extends BladeController {
 		if(result.getData().isSuccess()){
 			//记录当前验证码
 			DefaultConfig config = this.defaultConfigService.getOne(Wrappers.<DefaultConfig>lambdaQuery().eq(DefaultConfig::getCreateUser, AuthUtil.getUserId()));
-
-			//获取当前时间
-			Date now = DateUtil.now();
-			//默认16小时后超时
-			now = DateUtil.plusHours(now, 16);
-
 			if(config != null){
 				//修改
 				config.setSmsCode(code);
-				config.setSmsTimeOut(DateUtil.format(now, "yyyy-MM-dd HH:mm:ss"));
 				this.defaultConfigService.updateById(config);
 			} else {
 				//新增
 				config = new DefaultConfig();
 				config.setSmsCode(code);
-				config.setSmsTimeOut(DateUtil.format(now, "yyyy-MM-dd HH:mm:ss"));
 				config.setCreateUser(AuthUtil.getUserId());
 				config.setCreateTime(new Date());
 				this.defaultConfigService.save(config);

+ 23 - 1
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ContractLogClientImpl.java

@@ -1,5 +1,6 @@
 package org.springblade.business.feignClient;
 
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
@@ -14,7 +15,6 @@ import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tenant.annotation.NonDS;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.entity.WbsTreePrivate;
-import org.springblade.manager.feign.WbsTreeContractClient;
 import org.springblade.manager.feign.WbsTreePrivateClient;
 import org.springframework.beans.BeanUtils;
 import org.springframework.web.bind.annotation.RestController;
@@ -34,6 +34,22 @@ public class ContractLogClientImpl implements ContractLogClient {
 
     private final WbsTreePrivateClient wbsTreePrivateClient;
 
+    @Override
+    public List<JSONObject> queryContractLogWbsByBusinessId(String businessId) {
+        List<JSONObject> wbsJsonList = new ArrayList<>();
+        List<ContractLogWbs> wbsList = this.contractLogWbsService.list(Wrappers.<ContractLogWbs>lambdaQuery().eq(ContractLogWbs::getBusinessId, businessId));
+        if(wbsList != null && wbsList.size() > 0){
+            for(ContractLogWbs logWbs : wbsList){
+                JSONObject json = new JSONObject();
+                json.put("path", logWbs.getTitle());
+                json.put("primaryKeyId", logWbs.getTreePrimaryKeyId());
+                wbsJsonList.add(json);
+            }
+        }
+
+        return wbsJsonList;
+    }
+
     @Override
     public void removeContractLogWbsByTheLogId(String theLogId) {
         try{
@@ -81,6 +97,12 @@ public class ContractLogClientImpl implements ContractLogClient {
         return log != null ? JSONObject.parseObject(JSONObject.toJSONString(log)) : null;
     }
 
+    @Override
+    public List<JSONObject> queryContractLogByIds(List<String> theLogIds) {
+        List<ContractLog> logList = this.contractLogService.list(Wrappers.<ContractLog>lambdaQuery().in(ContractLog::getId, theLogIds));
+        return logList != null && logList.size() > 0 ? JSONArray.parseArray(JSONObject.toJSONString(logList), JSONObject.class) : null;
+    }
+
     @Override
     public String saveContractLog(SaveContractLogVO saveContractLogVO) {
         ContractLog contractLog = new ContractLog();

+ 0 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/ManagerApplication.java

@@ -14,5 +14,4 @@ public class ManagerApplication {
 	public static void main(String[] args) {
 		BladeApplication.run(LauncherConstant.APPLICATION_MANAGER_NAME, ManagerApplication.class, args);
 	}
-
 }

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

@@ -18,6 +18,7 @@ import com.spire.xls.core.spreadsheet.HTMLOptions;
 import io.swagger.annotations.*;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
+import org.apache.commons.codec.Charsets;
 import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.lang.StringUtils;
 import org.jsoup.Jsoup;
@@ -32,6 +33,7 @@ import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.MathUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.excel.util.ExcelUtil;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.secure.BladeUser;
@@ -41,6 +43,7 @@ import org.springblade.core.tool.constant.BladeConstant;
 import org.springblade.core.tool.utils.*;
 import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.entity.*;
+import org.springblade.manager.excel.WbsFormElementBatchExcel;
 import org.springblade.manager.mapper.WbsTreePrivateMapper;
 import org.springblade.manager.service.*;
 import org.springblade.manager.utils.FileUtils;
@@ -60,10 +63,12 @@ import org.springblade.core.log.exception.ServiceException;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.imageio.ImageIO;
+import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.awt.*;
 import java.awt.image.BufferedImage;
 import java.io.*;
+import java.net.URLEncoder;
 import java.util.*;
 import java.util.List;
 import java.util.regex.Matcher;
@@ -124,6 +129,9 @@ public class ExcelTabController extends BladeController {
 
     private final InformationQueryClient informationQueryClient;
 
+    // 项目信息
+    private final IProjectInfoService projectInfoService;
+
     /**
      * 详情
      */
@@ -442,13 +450,16 @@ public class ExcelTabController extends BladeController {
         WbsTreePrivate aPrivate = wbsTreePrivateService.getOne(Condition.getQueryWrapper(wbsTree));
         aPrivate.setExcelId(exceTabId);
 
+        // 获取excel 基本信息
+        ExcelTab excelTab = excelTabService.getById(exceTabId);
+
         UpdateWrapper<WbsTreePrivate> updateWrapper = new UpdateWrapper<>();
         updateWrapper.in("p_key_id", tabId);
         updateWrapper.set("is_link_table", 2);
+        updateWrapper.set("node_name", excelTab.getName()); //关联清表后 表单名和清表一样
         updateWrapper.set("excel_id", exceTabId);
 
-        // 获取excel 基本信息
-        ExcelTab excelTab = excelTabService.getById(exceTabId);
+
 
         // 复制模版htmlURL
         File file_in = ResourceUtil.getFile(excelTab.getHtmlUrl());
@@ -475,7 +486,7 @@ public class ExcelTabController extends BladeController {
             Elements tds = tr.select("td");
             for (int j = 0; j < tds.size(); j++) {
                 Element element = tds.get(j);
-                if (element.html().indexOf("el-input") >= 0) {
+                if (element.html().indexOf("el-input") >= 0 || element.html().indexOf("el-date-picker") >= 0) {
 
                     boolean is_true = false;
                     String titleName = element.attr("title");
@@ -513,16 +524,16 @@ public class ExcelTabController extends BladeController {
                     String regularExpression = "$event" + "," + "'" + RegularExpressionUtil.getRegularExpression(filedType) + "','" + (StringUtils.isNotEmpty(filedType) ? WbsElementUtil.getTypeTips(filedType) : null) + "'," + i + "," + j;
 
                     if (is_true) {
-                        element.children().get(0).attr("placeholder", lastName).attr("@focus", "getInformation(" + oncklickText + ")")
+                        element.children().get(0).attr("placeholder", lastName)
                                 .attr("weighing", maxScore + "").attr("id", attrInfo).attr("keyName", attrInfo)
                                 .attr("@blur", "getRegularExpression(" + regularExpression + ")")
                                 .attr("v-model", "formData." + attrInfo);
                     } else {
-                        element.children().get(0).attr("placeholder", lastName).attr("@focus", "getInformation(" + oncklickText + ")")
+                        element.children().get(0).attr("placeholder", lastName)
                                 .attr("weighing", maxScore + "").attr("id", attrInfo).attr("keyName", attrInfo)
                                 .attr("@blur", "getRegularExpression(" + regularExpression + ")");
                     }
-
+                    element.attr("@click", "getInformation(" + oncklickText + ")");
                 }
             }
         }
@@ -576,10 +587,37 @@ public class ExcelTabController extends BladeController {
 
         String htmlString = IoUtil.readToString(fileInputStream);
         htmlString = htmlString.replaceAll("placeholder", "placeholderxx");
-        //   htmlString = htmlString.replaceAll("@focu","@focu212");
+        htmlString = htmlString.replaceAll("title", "titlexx");
+
+
+
         // 解析 style
         Document doc = Jsoup.parse(htmlString);
         Element table = doc.select("table").first();
+        Elements hc = doc.select("hc-form-select-search");
+        if(hc.size()>=1){
+           for(int i =0;i<hc.size();i++){
+               Element datax = hc.get(i);
+               datax.removeAttr("pkeyId");
+               datax.removeAttr("contractId");
+               datax.attr("pkeyId",pkeyId+"");
+               datax.attr("contractId",wbsTreeContract.getContractId());
+           }
+        }
+
+         ProjectInfo projectInfo = projectInfoService.getById(wbsTreeContract.getProjectId());
+        // 添加标题显示
+        Elements dwtitle = doc.getElementsByAttributeValueMatching("style","18.0pt");
+        if(dwtitle.size()==1){
+
+        }else if(dwtitle.size()>=2){
+            for (int i = 0;i<dwtitle.size();i++){
+                Element dw = dwtitle.get(i);
+                if(StringUtils.isEmpty(dw.text())){
+                    dw.text(projectInfo.getProjectName());
+                };
+            }
+        }
         doc.select("Col").remove();
         fileInputStream.close();
         return R.data(table + "");
@@ -669,43 +707,7 @@ public class ExcelTabController extends BladeController {
         // expailHtmlInfo(thmlUrl,1L);
     }
 
-    /**
-     * 首件表单获取 html页面
-     */
-    @GetMapping("/getDataInfoinfoxxxxx")
-    @ApiOperationSupport(order = 33)
-    @ApiOperation(value = "初始化实际", notes = "初始化实际")
-
-    public R getFirstExcelHtml() throws Exception {
-        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
-        List<Map<String, Object>> dataInof = jdbcTemplate.queryForList("SELECT * from m_excel_tab where parent_id ='1542056853226622977' and is_deleted=0");
-        System.out.println(dataInof.size());
-        for (int i = 0; i < dataInof.size(); i++) {
-
-            String html = dataInof.get(i).get("html_url") + "";
-            String fileUrl = dataInof.get(i).get("file_url") + "";
-            Long id = Long.parseLong(dataInof.get(i).get("id") + "");
-
-            String thmlUrl = file_path + id + ".html";
-            ExcelTab detail = excelTabService.getById(id);
-            Workbook wb = new Workbook();
-            InputStream da = CommonUtil.getOSSInputStream(fileUrl);
-            wb.loadFromMHtml(da);
-            //获取工作表
-            Worksheet sheet = wb.getWorksheets().get(0);
-            sheet.saveToHtml(thmlUrl);
-
-            detail.setHtmlUrl(thmlUrl);
-            excelTabService.saveOrUpdate(detail);
-            System.out.println(i);
-            if (thmlUrl != null) {
-                this.expailHtmlInfo(thmlUrl, id);
-            }
-            da.close();
-        }
 
-        return R.data("");
-    }
 
 
     // 上传解析 html
@@ -1863,65 +1865,80 @@ public class ExcelTabController extends BladeController {
     })
     public R<List<Map<String, Object>>> copyTheLogBusinessData(@RequestParam String theLogId, @RequestParam String nodePrimaryKeyId, @RequestParam String currentTime, @RequestParam String contractId) {
         if (StringUtils.isNotEmpty(theLogId) && StringUtils.isNotEmpty(currentTime)) {
-            //获取目标的数据
-            JSONObject targetJson = this.contractLogClient.queryContractLogById(theLogId);
-            if (targetJson == null) {
-                return R.fail("目标日期下未找到当前用户填报的数据,请重新选择");
-            }
-            //查询是否存在关联工序的数据
-            List<JSONObject> wbsJsonList = this.contractLogClient.queryContractLogWbsByTheLogId(targetJson.getString("id"));
-
-            //获取目标数据所在数据表
-            WbsTreePrivate table = this.wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, targetJson.getString("tableId")));
-
-            //获取目标数据
-            String queryTargetDataSql = "SELECT * FROM " + table.getInitTableName() + " WHERE group_id = " + targetJson.getString("dataId");
-            List<Map<String, Object>> targetDatas = this.jdbcTemplate.queryForList(queryTargetDataSql);
 
             //检查当前日期下是否存在数据
             JSONObject currentJson = this.contractLogClient.queryContractLogByPrimaryKeyIdAndRecordTime(nodePrimaryKeyId, currentTime, contractId);
             String businessId = SnowFlakeUtil.getId().toString();
             boolean isNew = true;
             if (currentJson != null) {
-                //有记录,需要删除掉原本记录填写的数据
-                String removeOldSql = "DELETE FROM " + table.getInitTableName() + " WHERE group_id = " + currentJson.getString("dataId");
-                this.jdbcTemplate.execute(removeOldSql);
-
-                //删除掉原本关联的工序节点
-                this.contractLogClient.removeContractLogWbsByTheLogId(currentJson.getString("id"));
-
                 //使用原本的数据ID
                 businessId = currentJson.getString("dataId");
                 isNew = false;
             }
+
             //新增的SQL集合
             List<String> insertSqlList = new ArrayList<>();
+            //关联集合
+            List<JSONObject> logWbsList = new ArrayList<>();
+            //记录第一组
+            List<JSONObject> oneGroupLogWbsList = new ArrayList<>();
 
-            //只需要替换group_id和id即可
-            for (Map<String, Object> dataMap : targetDatas) {
-                StringBuilder insertSql = new StringBuilder("INSERT INTO " + table.getInitTableName()), keySql = new StringBuilder(), valueSql = new StringBuilder();
-                for (Map.Entry<String, Object> mapEntry : dataMap.entrySet()) {
-                    String key = mapEntry.getKey();
-                    Object value = mapEntry.getValue();
-
-                    if ("id".equals(key)) {
-                        value = SnowFlakeUtil.getId();
-                    } else if ("group_id".equals(key)) {
-                        value = businessId;
-                    }
-                    //设置参数
-                    keySql.append(",").append(key);
-                    if (value != null && StringUtils.isNotEmpty(String.valueOf(value))) {
-                        valueSql.append(",").append("'").append(value).append("'");
-                    } else {
-                        valueSql.append(",").append(value);
+            List<JSONObject> targetJsonList = this.contractLogClient.queryContractLogByIds(Func.toStrList(theLogId));
+            if (targetJsonList == null || targetJsonList.size() <= 0) {
+                return R.fail("目标日期下未找到当前用户填报的数据,请重新选择");
+            }
+
+            for(JSONObject targetJson : targetJsonList){
+
+                //获取目标数据所在数据表
+                WbsTreePrivate table = this.wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, targetJson.getString("tableId")));
+
+                //获取目标数据
+                String queryTargetDataSql = "SELECT * FROM " + table.getInitTableName() + " WHERE group_id = " + targetJson.getString("dataId");
+                List<Map<String, Object>> targetDatas = this.jdbcTemplate.queryForList(queryTargetDataSql);
+
+                //只需要替换group_id和id即可
+                for (Map<String, Object> dataMap : targetDatas) {
+                    StringBuilder insertSql = new StringBuilder("INSERT INTO " + table.getInitTableName()), keySql = new StringBuilder(), valueSql = new StringBuilder();
+                    for (Map.Entry<String, Object> mapEntry : dataMap.entrySet()) {
+                        String key = mapEntry.getKey();
+                        Object value = mapEntry.getValue();
+
+                        if ("id".equals(key)) {
+                            //查询是否有关联记录
+                            //查询是否存在关联工序的数据
+                            List<JSONObject> wbsJsonList = this.contractLogClient.queryContractLogWbsByBusinessId(value.toString());
+                            //重置业务ID
+                            value = SnowFlakeUtil.getId();
+                            if(wbsJsonList != null && wbsJsonList.size() > 0){
+                                if(oneGroupLogWbsList.size() == 0){
+                                    oneGroupLogWbsList.addAll(wbsJsonList);
+                                }
+                            } else {
+                                wbsJsonList = new ArrayList<>(oneGroupLogWbsList);
+                            }
+                            for(JSONObject json : wbsJsonList){
+                                json.put("businessId", value);
+                            }
+
+                            logWbsList.addAll(wbsJsonList);
+                        } else if ("group_id".equals(key)) {
+                            value = businessId;
+                        }
+                        //设置参数
+                        keySql.append(",").append(key);
+                        if (value != null && StringUtils.isNotEmpty(String.valueOf(value))) {
+                            valueSql.append(",").append("'").append(value).append("'");
+                        } else {
+                            valueSql.append(",").append(value);
+                        }
                     }
-                }
-                //组装SQL
-                insertSql.append(" (").append(keySql.toString().substring(1)).append(") ");
-                insertSql.append(" VALUES(").append(valueSql.toString().substring(1)).append(")");
+                    //组装SQL
+                    insertSql.append(" (").append(keySql.toString().substring(1)).append(") ");
+                    insertSql.append(" VALUES(").append(valueSql.toString().substring(1)).append(")");
 
-                insertSqlList.add(insertSql.toString());
+                    insertSqlList.add(insertSql.toString());
+                }
             }
 
             if (insertSqlList.size() > 0) {
@@ -1933,13 +1950,13 @@ public class ExcelTabController extends BladeController {
             //处理数据
             this.contractLogClient.saveContractLog(new SaveContractLogVO(
                     Long.parseLong(businessId),
-                    targetJson.getString("projectId"),
-                    targetJson.getString("contractId"),
-                    Long.parseLong(targetJson.getString("wbsNodeId")),
-                    Long.parseLong(targetJson.getString("tableId")),
-                    Integer.parseInt(targetJson.getString("wbsNodeType")),
+                    targetJsonList.get(0).getString("projectId"),
+                    targetJsonList.get(0).getString("contractId"),
+                    Long.parseLong(targetJsonList.get(0).getString("wbsNodeId")),
+                    Long.parseLong(targetJsonList.get(0).getString("tableId")),
+                    Integer.parseInt(targetJsonList.get(0).getString("wbsNodeType")),
                     currentTime,
-                    wbsJsonList
+                    logWbsList
             ));
 
             //返回当前的新数据
@@ -2260,4 +2277,51 @@ public class ExcelTabController extends BladeController {
         }
     }
 
+
+    /**
+     * excel 模版下载
+     */
+    @GetMapping("/down-Excel-file")
+    @ApiOperationSupport(order = 31)
+    @ApiOperation(value = "下载excel数据")
+    @ApiImplicitParam(name = "fileId", value = "fileId")
+    public void downExcelFile(HttpServletResponse response,String fileId) throws Exception {
+        ExcelTab excelTab = excelTabService.getById(fileId);
+
+        String fileName = URLEncoder.encode(excelTab.getName(), Charsets.UTF_8.name());
+
+        InputStream redio = CommonUtil.getOSSInputStream(excelTab.getFileUrl());
+        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页面
+     */
+    @GetMapping("/getDataInfoinfoxxxxx")
+    @ApiOperationSupport(order = 100)
+    @ApiOperation(value = "初始化实际", notes = "初始化实际")
+
+    public R getFirstExcelHtml() throws Exception {
+        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        String sql ="SELECT n.p_key_id,excelId from (SELECT p_key_id,(SELECT id from m_excel_tab x where x.alias like '%1542045893564796930%' and x.name =m.full_name) as excelId  from m_wbs_tree_private m where m.project_id = '1578599210897772545' and m.type='2'  and m.p_key_id!='1578599432939634723' ) n where excelId is not null ";
+        List<Map<String, Object>> dataInof = jdbcTemplate.queryForList(sql);
+        System.out.println(dataInof.size());
+        for (int i = 0; i < dataInof.size(); i++) {
+            String p_key_id = dataInof.get(i).get("p_key_id") + "";
+            Long excelId = Long.parseLong(dataInof.get(i).get("excelId") + "");
+            this.saveLinkeTab(excelId, Long.valueOf(p_key_id));
+            System.out.println(i);
+        }
+
+        return R.data("");
+    }
 }

+ 52 - 16
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExpaileHtml.java

@@ -1,30 +1,19 @@
 package org.springblade.manager.controller;
 
-import com.alibaba.fastjson.JSON;
-import com.spire.pdf.graphics.PdfMargins;
-import com.spire.pdf.htmlconverter.LoadHtmlType;
-import com.spire.pdf.htmlconverter.qt.HtmlConverter;
-import com.spire.pdf.htmlconverter.qt.Size;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.spire.xls.CellRange;
-import com.spire.xls.ExcelVersion;
 import com.spire.xls.Workbook;
 import com.spire.xls.Worksheet;
-import com.spire.xls.core.spreadsheet.HTMLOptions;
-import io.swagger.models.auth.In;
-import org.apache.commons.lang.ArrayUtils;
-import org.apache.commons.lang.StringUtils;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
 import org.springblade.core.tool.utils.*;
-import org.springblade.manager.service.IExctabCellService;
 
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.time.LocalDateTime;
 import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -33,9 +22,56 @@ public class ExpaileHtml {
 
     // private final IExctabCellService exctabCellService;
 
-    public static void main11(String[] args) throws IOException {
+    public static void main11(String[] args) throws Exception {
 
-        List<String> data = new ArrayList<>();
+ /*       Workbook wb = new Workbook();
+        File file1 = ResourceUtil.getFile("/Users/hongchuangyanfa/Downloads/C14.4.xlsx");
+        wb.loadFromMHtml(new FileInputStream(file1));
+        //获取工作表
+        Worksheet sheet = wb.getWorksheets().get(0);
+
+         CellRange[] columns = sheet.getMergedCells();
+         for (int i = 0; i< columns.length; i++){
+             if(columns[i].getStyle().getFont().getSize()>=17){
+                 System.out.println("哈哈");
+                 break;
+             }
+
+         }*/
+
+        String data = "__";
+        System.out.println(data.length());
+/*
+        System.out.println("xcc");
+        File file1 = ResourceUtil.getFile("/Users/hongchuangyanfa/Desktop/privateUrl/1572868137710256128.html");
+        String htmlString = IoUtil.readToString(new FileInputStream(file1));
+        Document doc = Jsoup.parse(htmlString);
+
+        //解析
+        Element table = doc.select("table").first();
+        Elements trs = table.select("tr");
+        Element element = trs.get(4).select("td").get(1);
+        JSONArray objs = new JSONArray();
+        Integer [] data= new Integer[2];
+        data[0]=1;
+        data[1]=2;
+
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("key",1);
+        jsonObject.put("name","小明");
+        objs.add(jsonObject);
+        String checkbox = "<hc-form-checkbox-group :datas='"+Arrays.asList(data)+"' :objs="+objs+" > </hc-form-checkbox-group>";
+       // element.empty().append(checkbox);
+
+        System.out.println(Arrays.asList(data));
+        System.out.println(objs);
+        System.out.println(checkbox);
+        element.empty().append(checkbox);
+        File writefile = new File("/Users/hongchuangyanfa/Desktop/123654.html");
+        FileUtil.writeToFile(writefile, doc.html(), Boolean.parseBoolean("UTF-8"));
+*/
+
+/*        List<String> data = new ArrayList<>();
         List<String> data2 = new ArrayList<>();
         data.add("1:2");
 
@@ -64,7 +100,7 @@ public class ExpaileHtml {
         System.out.println("开始");
         for (String s : data2) {
             System.out.println(s);
-        }
+        }*/
 
 
        /* String  thmlUrl = "/Users/hongchuangyanfa/Desktop/C10.1.xlsx" ;

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

@@ -189,11 +189,11 @@ public class LinkdataInfoController extends BladeController {
 			// 获取元素基本信息
 			WbsFormElement wbsFormElement = wbsFormElementService.getById(linkdataInfo.getHtmlType());
 			String enName = wbsFormElement.getEName();
+			element.removeAttr("title");
+			element.attr("title",enName);
 			String dataInfo2 =wbsFormElement.getEKey()+"__"+linkdataInfo.getTrIndex()+"_"+linkdataInfo.getTdIndex() ;
 			Element element1=element1 = element.children().get(0);
 
-
-
 			if(element.html().indexOf("el-tooltip")>=0){
 				element1.removeAttr("placeholder");
 				element1.removeAttr("keyName");

+ 3 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.xml

@@ -378,10 +378,9 @@
 
     <select id="tree4" resultType="org.springblade.manager.vo.WbsTreeContractVO">
         SELECT
-        d.*,
-        /*IFNULL(if(length(trim(full_name)) > 0, full_name, node_name),node_name) AS title,*/
-        (select CASE WHEN count(1) > 0 THEN 1 ELSE 0 END from m_wbs_tree_contract c where c.parent_id = d.id and
-        c.contract_id = d.contract_id and c.is_deleted = 0 ) AS "has_children"
+        d.*
+        /*,(select CASE WHEN count(1) > 0 THEN 1 ELSE 0 END from m_wbs_tree_contract c where c.parent_id = d.id and
+        c.contract_id = d.contract_id and c.is_deleted = 0 ) AS "has_children"*/
         FROM m_wbs_tree_contract d
         WHERE
         d.is_deleted = 0

+ 14 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml

@@ -58,6 +58,14 @@
         <result column="isExistForm" property="isExistForm"/>
         <result column="majorDataType" property="majorDataType"/>
     </resultMap>
+
+    <resultMap id="treeNodeResultMap2" type="org.springblade.manager.vo.TreeNodeVO">
+        <id column="id" property="id"/>
+        <result column="parent_id" property="parentId"/>
+        <result column="title" property="title"/>
+        <result column="has_children" property="hasChildren"/>
+        <result column="primaryKeyId" property="primaryKeyId"/>
+    </resultMap>
     <insert id="insertCombination1">
         INSERT INTO m_wbs_tree_private(p_key_id, id, wbs_id, wbs_type, project_id, tenant_id, parent_id, ancestors,
                                        node_type, node_name, full_name, sort, remark, `type`,
@@ -514,8 +522,8 @@
     </select>
 
     <!-- 项目级 表单类型分类 wbs树 -->
-    <select id="tabTypeLazyTree" resultMap="treeNodeResultMap">
-        SELECT *,
+    <select id="tabTypeLazyTree" resultMap="treeNodeResultMap2">
+        SELECT p_key_id as id,p_key_id as primaryKeyId,title,parent_id,
                (
                    SELECT
                        CASE WHEN count(1) > 0 THEN 1 ELSE 0 END
@@ -528,15 +536,15 @@
                            SELECT p_key_id,node_name,table_type as  parent_id from m_wbs_tree_private WHERE project_id=#{projectId} and is_deleted=0 and type=2 and table_type is not NULL GROUP BY node_name
                        ) b
                    WHERE
-                       b.parent_id = a.id
+                       b.parent_id = a.p_key_id
                ) AS "has_children"
 
                from (
-            SELECT  '12345678910' as p_key_id , '表单类型' as node_name, 0 as parent_id
+            SELECT  '12345678910' as p_key_id , '表单类型' as title, 0 as parent_id
                  union all
-            SELECT dict_key as p_key_id ,dict_value as node_name,'12345678910' as parent_id from blade_dict where code='table_type' and dict_key not in(-1,0)
+            SELECT dict_key as p_key_id ,dict_value as title,'12345678910' as parent_id from blade_dict where code='table_type' and dict_key not in(-1,0)
                  union all
-            SELECT p_key_id,node_name,table_type as  parent_id from m_wbs_tree_private WHERE project_id=#{projectId} and is_deleted=0 and type=2 and table_type is not NULL GROUP BY node_name
+            SELECT p_key_id,node_name as title,table_type as  parent_id from m_wbs_tree_private WHERE project_id=#{projectId} and is_deleted=0 and type=2 and table_type is not NULL GROUP BY node_name
            ) a where a.parent_id = #{parentId}
     </select>
 

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

@@ -88,7 +88,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
     private final InformationQueryClient informationQueryClient;
     // 元素信息表-
     private final IWbsTreeContractService wbsTreeContractService;
-    private final IWbsTreeService wbsTreeService;
+
     private final IFormulaService formulaService;
     private final JdbcTemplate jdbcTemplate;
 
@@ -109,6 +109,9 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
     // 合同端信息
     private final IContractInfoService contractInfoService;
 
+    private final IProjectInfoService projectInfoService;
+
+
     @Override
     public IPage<ExcelTabVO> selectExcelTabPage(IPage<ExcelTabVO> page, ExcelTabVO excelTab) {
         return page.setRecords(baseMapper.selectExcelTabPage(page, excelTab));
@@ -668,7 +671,17 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         wb.loadFromMHtml(CommonUtil.getOSSInputStream(excelTab.getFileUrl()));
         //获取工作表
         Worksheet sheet = wb.getWorksheets().get(0);
-
+        // 标题添加
+        ProjectInfo projectInfo = projectInfoService.getById(wbsTreeContract.getProjectId());
+        CellRange[] columns = sheet.getMergedCells();
+        for (int i = 0; i< columns.length; i++){
+            CellRange cellRange = columns[i];
+            if(cellRange.getStyle().getFont().getSize()>=17){
+                cellRange.setText(projectInfo.getProjectName());
+                cellRange.getStyle().getFont().setSize(20);
+                break;
+            }
+        }
 
         // 数据不为空 &&
         if (StringUtils.isNotEmpty(wbsTreeContract.getHtmlUrl())) {
@@ -685,6 +698,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                         if (val.indexOf("__") >= 0) {
                             String DataVal[] = val.split("__");
                             String[] xy = DataVal[1].split("_");
+
                             Element data = trs.get(Integer.parseInt(xy[0])).select("td").get(Integer.parseInt(xy[1]));
 
                             if (data.html().indexOf("x1") >= 0 && data.html().indexOf("y1") >= 0) {
@@ -702,9 +716,14 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                     x1 = 1;
                                 }
                                 String myData = DataInfo.get(val) + "";
+
+                                if(myData.equals("30.72")){
+                                    System.out.println("");
+                                }
+
                                 if (myData.indexOf("T") >= 0 && myData.indexOf("-") >= 0) {
                                     if (myData.indexOf(",") >= 0 && myData.indexOf("]") >= 0) {
-                                        myData = myData.replace("[", "").replace("]", "");
+                                        myData = myData.replace("[", "").replace("]", "").replaceAll("'", "");
                                         String[] dataVal = myData.split(",");
                                         String Start_dataStr[] = dataVal[0].split("T")[0].split("-");
                                         String StartDate = StringUtil.format("{}年{}月{}日", new Object[]{Start_dataStr[0], Start_dataStr[1], Integer.parseInt(Start_dataStr[2]) + 1});
@@ -727,18 +746,34 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 
                                     BufferedImage image = ImageIO.read(CommonUtil.getOSSInputStream(myData));
 
-                                    int colspan = Integer.parseInt(data.attr("colspan"));
-                                    int rowspan = Integer.parseInt(data.attr("rowspan"));
+                                    int colspan = data.attr("COLSPAN").equals("") ? 0 : Integer.parseInt(data.attr("COLSPAN"));
+                                    int rowspan = data.attr("ROWSPAN").equals("") ? 0 : Integer.parseInt(data.attr("ROWSPAN"));
                                     int picHeight = 0;
                                     int picWidth = 0;
-                                    for (int i = y1; i <= (y1 + rowspan); i++) { // 跨列处理
-                                        String dataInfo = trs.get(i).attr("height");
-                                        if (StringUtils.isNotEmpty(dataInfo)) {
-                                            picHeight += Integer.parseInt(dataInfo);
+
+                                    if(rowspan==0){
+                                        String dataInfo = trs.get(y1).attr("height");
+                                        if(StringUtils.isEmpty(dataInfo)){
+                                             Element firstTd = trs.get(y1).children().get(0);
+                                            String heg[] =firstTd.attr("style").split(";");
+                                            for (String str:heg){
+                                                if(str.indexOf("height:")>=0){
+                                                    picHeight = Integer.parseInt(str.split(":")[1].replaceAll("px",""));
+                                                }
+                                            }
+                                        }else{
+                                            picHeight = Integer.parseInt(dataInfo);
+                                        }
+                                    }else{
+                                        for (int i = y1; i <= (y1 + rowspan); i++) { // 跨列处理
+                                            String dataInfo = trs.get(i).attr("height");
+                                            if (StringUtils.isNotEmpty(dataInfo)) {
+                                                picHeight += Integer.parseInt(dataInfo);
+                                            }
                                         }
                                     }
 
-                                    if (colspan >= 1) { //框行处理
+                                    if (colspan >=1) {
                                         for (int i = x1 - 1; i < x1 + colspan - 1; i++) {
                                             String dataInfo = cols.get(i).attr("width").replaceAll("px", "");
                                             if (StringUtils.isNotEmpty(dataInfo)) {
@@ -752,7 +787,8 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                     pic.setHeight(picHeight);
                                     pic.setLeft(5);
                                 } else {
-                                    final CellRange cellRange = sheet.getCellRange(y1, x1);
+                                    CellRange cellRange = sheet.getCellRange(y1, x1);
+                                    System.out.println(cellRange.getText());
                                     cellRange.setText(myData);
                                 }
                             }
@@ -765,9 +801,9 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 queryWrapper.eq("type", 2);
                 queryWrapper.eq("tab_id", wbsTreeContract.getIsTypePrivatePid());
 
-                final List<TextdictInfo> textdictInfos = textdictInfoService.getBaseMapper().selectList(queryWrapper);
+                List<TextdictInfo> textdictInfos = textdictInfoService.getBaseMapper().selectList(queryWrapper);
                 if (textdictInfos != null && !textdictInfos.isEmpty()) {
-                    textdictInfos.forEach(e -> {
+                    for(TextdictInfo e : textdictInfos){
                         String key = e.getColKey();
                         String keys[] = key.split("__");
                         String[] trtd = keys[1].split("_");
@@ -782,12 +818,13 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                         cellRange.setText(e.getId() + "");
                         cellRange.getCellStyle().getFont().setColor(Color.white);
 
-                    });
+                    };
                 }
             }
         }
 
 
+
         sheet.saveToPdf(pdfPath);
 
         BladeFile bladeFile = newIOSSClient.uploadFile(pkeyId + ".pdf", pdfPath);
@@ -843,7 +880,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         if (wbsTreeContractList != null && wbsTreeContractList.size() >= 1) {
             for (WbsTreeContract wbsInfo : wbsTreeContractList) {
                 // 隐藏的不生成pdf
-                if (wbsInfo.getIsBussShow() != 2) { //
+                if ( wbsInfo.getIsBussShow()==null || wbsInfo.getIsBussShow() != 2  ) { //
                     if (StringUtils.isNotEmpty(wbsInfo.getPdfUrl())) {
                         data.add(wbsInfo.getPdfUrl());
                     } else {
@@ -907,16 +944,40 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             Document doc = Jsoup.parse(htmlString);
             //解析
             Elements dwtitle = doc.select("el-input[placeholder~=^承包单位]");
+            Elements sgtitle = doc.select("el-input[placeholder~=^施工单位]");
             Elements htdtitle = doc.select("el-input[placeholder~=^合同段]");
             Elements jltitle = doc.select("el-input[placeholder~=^监理单位]");
             Elements bhtitle = doc.select("el-input[placeholder~=^编号]");
+
+            Elements title = doc.select("el-input[placeholder~=^编号]");
+
+            /**
+             * 承包单位、施工单位:引用施工单位名称
+             * 监理单位:引用监理单位名称
+             * 合同段、所属建设项目(合同段):引用合同段编号
+             */
+
             ContractInfo contractInfo = contractInfoService.getById(wbsTreeContract.getContractId());
-            //
-            reData.put(dwtitle.attr("keyName"),contractInfo.getConstructionUnitName());
-            reData.put(htdtitle.attr("keyName"),contractInfo.getContractName());
-            reData.put(jltitle.attr("keyName"),contractInfo.getSupervisionUnitName());
-            reData.put(bhtitle.attr("keyName"),contractInfo.getContractNumber());
+            // 施工单位名称
+            if(dwtitle.size()>=1 ){
+                reData.put(dwtitle.attr("keyName"),contractInfo.getConstructionUnitName());
+            }
+            if(sgtitle.size()>=1){
+                reData.put(sgtitle.attr("keyName"),contractInfo.getConstructionUnitName());
+            }
 
+            // 合同段编号
+            if(htdtitle.size()>=1){
+                reData.put(htdtitle.attr("keyName"),contractInfo.getContractNumber());
+            }
+            // 监理单位名称
+            if(jltitle.size()>=1) {
+                reData.put(jltitle.attr("keyName"), contractInfo.getSupervisionUnitName());
+            }
+            // 编号
+            if(bhtitle.size()>=1 && contractInfo.getIsReferenceNumber()==1) {
+                reData.put(bhtitle.attr("keyName"), contractInfo.getConstructionUnitName());
+            }
 
         } catch (FileNotFoundException e) {
             e.printStackTrace();
@@ -944,22 +1005,31 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                         sql = sql.replaceAll("]", "\']");
                         sql = sql.replaceAll("000Z,", "000Z\',");
                         sql = sql.replaceAll(", 20", ", \'20");
-                        sql = sql.replaceAll("'", "");
-                        reData.put(key + "__" + tabData[1], sql);
+                     //   sql = sql.replaceAll("'", "");
+                        if(StringUtils.isNotEmpty(tabData[0])) {
+                            reData.put(key + "__" + tabData[1], sql);
+                        }
                     } else if (tabVal.indexOf("T") >= 0 && tabVal.indexOf(".000Z") >= 0) { //时间
 
                         String tabData[] = tabVal.split("_\\^_");
-                        reData.put(key + "__" + tabData[1], tabData[0]);
+                        if(StringUtils.isNotEmpty(tabData[0])) {
+                            reData.put(key + "__" + tabData[1], tabData[0]);
+                        }
 
                     } else if (tabVal.indexOf("☆") >= 0) {
                         String mysql[] = tabVal.split("☆");
                         for (String data : mysql) {
                             String tabData[] = data.split("_\\^_");
-                            reData.put(key + "__" + tabData[1], tabData[0]);
+                            if(StringUtils.isNotEmpty(tabData[0])){
+                                reData.put(key + "__" + tabData[1], tabData[0]);
+                            }
                         }
                     } else if (tabVal.indexOf("_^_") >= 0) {
                         String tabData[] = tabVal.split("_\\^_");
-                        reData.put(key + "__" + tabData[1], tabData[0]);
+                        if(StringUtils.isNotEmpty(tabData[0])){
+                            reData.put(key + "__" + tabData[1], tabData[0]);
+                        }
+
                     } else {
                         reData.put(key, tabVal);
                     }

+ 0 - 7
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExctabCellServiceImpl.java

@@ -53,13 +53,6 @@ public class ExctabCellServiceImpl extends BaseServiceImpl<ExctabCellMapper, Exc
     @Override
     public List<ExctabCellVO> getColSelect(String tabId) {
         List<ExctabCellVO> colSelect = baseMapper.getColSelect(tabId);
-        for (ExctabCellVO exctabCellVO : colSelect) {
-            Integer elementType = this.getElementType(exctabCellVO.getTextInfo());
-            if (elementType == -1) {
-                continue;
-            }
-            exctabCellVO.setTextElementType(elementType);
-        }
         return colSelect;
     }
 

+ 92 - 163
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -27,14 +27,12 @@ import org.springblade.manager.mapper.WbsTreeContractMapper;
 import org.springblade.manager.mapper.WbsTreePrivateMapper;
 import org.springblade.manager.service.IWbsTreeContractService;
 import org.springblade.manager.utils.DiffListUtil;
-import org.springblade.manager.vo.WbsTreeContractTreeVO;
-import org.springblade.manager.vo.WbsTreeContractTreeVO3;
-import org.springblade.manager.vo.WbsTreeContractVO;
-import org.springblade.manager.vo.WbsTreeContractVO4;
+import org.springblade.manager.vo.*;
 import org.springframework.context.annotation.Bean;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
+import springfox.documentation.spring.web.json.Json;
 
 import java.io.File;
 import java.io.IOException;
@@ -222,6 +220,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                         wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
                         wbsTreeContract.setWbsId(pawDTO.getWbsId());
                         wbsTreeContract.setWbsType(Integer.valueOf(wbsTreePrivate.getWbsType()));
+                        wbsTreeContract.setIsBussShow(1);
                         wbsTreeContract.setProjectId(pawDTO.getProjectId());
                         wbsTreeContract.setContractId(pawDTO.getContractId());
                         if (wbsTreePrivate.getType() == 2) {
@@ -440,7 +439,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 WbsExcelUtil excelUtil = new WbsExcelUtil();
                 ArrayList<Map<String, String>> result = excelUtil.readExcelToObjContract(canonicalPath);
                 //匹配对应工程类别修改对应合同段节点名称
-                return this.importSubmitWbsContractNodes(result, primaryKeyId, isSplicingNumber);
+                return this.importSubmitWbsContractNodes(result, primaryKeyId, 1); //TODO 1=默认拼接
             }
         } catch (Exception e) {
             e.printStackTrace();
@@ -549,7 +548,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
 
         //解析resultList
         List<WbsTreeContractVO> successData = new ArrayList<>();
-        List<WbsTreeContractVO> failData = new ArrayList<>();
+        Set<ImportContractNodeVO> sets = new HashSet<>();
         for (Map<Integer, String> map : resultList) {//行
             for (Map.Entry<Integer, String> entry : map.entrySet()) {//列
                 Integer k = entry.getKey();
@@ -561,7 +560,13 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 String nodeName = split[0];
                 String partitionCode = split[1];
 
-                int count = 0;
+                //excel中所有节点信息
+                ImportContractNodeVO obj = new ImportContractNodeVO();
+                obj.setNodeType(k);
+                obj.setNodeName(nodeName);
+                obj.setPartitionCode(partitionCode);
+                sets.add(obj);
+
                 for (WbsTreeContractVO nodeOld : wbsTreeContractVOS) {
                     if (nodeOld.getNodeType().equals(k)) {
                         String nodeNameOld = nodeOld.getNodeName();
@@ -597,7 +602,6 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                     successData.add(wbsTreeContractVO2);
                                     //重新赋值用于下方条件判断
                                     nodeOld.setFullName(wbsTreeContractVO2.getFullName());
-                                    count = 1;
                                     break;
                                 }
                             }
@@ -609,7 +613,6 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                         && !f.getPartitionCode().equals(partitionCode)).collect(Collectors.toList());
                         if (collect1.size() > 0) {
                             if (nodeName.equals(nodeOld.getFullName())) {
-                                count = 1;
                                 break;
                             } else {
                                 if ((nodeName.contains(nodeOld.getFullName()) && DiffListUtil.getSimilarityRatio(nodeName, nodeOld.getFullName()) != 100)
@@ -628,31 +631,31 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                     baseMapper.insert(wbsTreeContract);
                                     WbsTreeContractVO wbsTreeContractVO = BeanUtil.copyProperties(wbsTreeContract, WbsTreeContractVO.class);
                                     successData.add(wbsTreeContractVO);
-                                    count = 1;
                                     break;
                                 }
                             }
                         }
                     }
                 }
-                if (count == 1) {
-                    continue;
-                }
-
-                List<WbsTreeContractVO> collect = successData.stream().filter(f -> f.getFullName().contains(nodeName)).collect(Collectors.toList());
-                List<WbsTreeContractVO> collect1 = failData.stream().filter(f -> f.getFullName().contains(nodeName)).collect(Collectors.toList());
+            }
+        }
 
-                if (collect.size() == 0 && collect1.size() == 0) {
-                    //未匹配成功 构建参数
-                    WbsTreeContract wbsTreeContract = this.buildFailData(k, nodeName, partitionCode);
-                    WbsTreeContractVO wbsTreeContractVO = BeanUtil.copyProperties(wbsTreeContract, WbsTreeContractVO.class);
-                    failData.add(wbsTreeContractVO);
+        //所有失败节点
+        Iterator<ImportContractNodeVO> iterator = sets.iterator();
+        while (iterator.hasNext()) {
+            ImportContractNodeVO next = iterator.next();
+            for (WbsTreeContractVO successDatum : successData) {
+                if (successDatum.getFullName().equals(next.getNodeName())
+                        && successDatum.getPartitionCode().equals(next.getPartitionCode())
+                        && successDatum.getNodeType().equals(next.getNodeType())) {
+                    iterator.remove();
                 }
             }
         }
+        List<WbsTreeContractVO> failData = this.buildFailData(sets);
 
-        Set<WbsTreeContractVO> listSet = new HashSet<>();
         //把successData的节点的上级节点都添加进去
+        Set<WbsTreeContractVO> set = new HashSet<>();
         if (successData.size() > 0) {
             //通过ancestors获取所有上级节点
             for (WbsTreeContractVO successDatum : successData) {
@@ -661,25 +664,20 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 for (Long parentId : parentIds) {
                     for (WbsTreeContractVO wbsTreeContractVO : wbsTreeContractVOS) {
                         if (parentId.equals(wbsTreeContractVO.getId())) {
-                            listSet.add(wbsTreeContractVO);
+                            wbsTreeContractVO.setIsImportIdentificationNode(0);
+                            set.add(wbsTreeContractVO);
                         }
                     }
                 }
             }
         }
+        set.addAll(successData);
 
+        //构造数据
         WbsTreeContractVO4 res = new WbsTreeContractVO4();
         try {
-            //重复导入时删除多余节点信息
-            List<WbsTreeContract> wbsTreeContractDel = baseMapper.selectList(Wrappers.<WbsTreeContract>query().lambda().eq(WbsTreeContract::getContractId, wbsTreeContractRoot.getContractId()));
-            List<Long> delIds = wbsTreeContractDel.stream().filter(f -> f.getNodeName().contains(("_copy_copy")) && f.getId().equals(f.getPKeyId())).collect(Collectors.toList())
-                    .stream().map(WbsTreeContract::getPKeyId).collect(Collectors.toList());
-            if (delIds.size() > 0) {
-                baseMapper.deleteByIds(delIds);
-            }
-
             //构建成功树
-            List<WbsTreeContractVO> collect1 = listSet.stream().collect(
+            List<WbsTreeContractVO> collect1 = set.stream().collect(
                     Collectors.collectingAndThen(
                             Collectors.toCollection(() -> new TreeSet<>(
                                     Comparator.comparing(o -> o.getId() + ";" + o.getFullName()))), ArrayList::new));
@@ -687,9 +685,9 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
             List<WbsTreeContractVO> collect2 = successWbsTreeContractVOS.stream().sorted(Comparator.comparing(WbsTreeContract::getCreateTime, Comparator.reverseOrder())).collect(Collectors.toList());
             res.setMatchedData(collect2);
 
-            List<WbsTreeContractVO> successDataCopyToFail = WbsExcelBatchUtil.deepCopy(collect1);
             //构建失败树
-            List<WbsTreeContractVO> failDataTree = this.buildFailDataTree(resultList, failData, successDataCopyToFail, wbsTreeContractRoot.getParentId());
+            List<WbsTreeContractVO> successDataCopyToFail = WbsExcelBatchUtil.deepCopy(successData);
+            List<WbsTreeContractVO> failDataTree = this.buildFailDataTree(failData, successDataCopyToFail, wbsTreeContractRoot.getParentId());
             List<WbsTreeContractVO> collect3 = failDataTree.stream().collect(
                     Collectors.collectingAndThen(
                             Collectors.toCollection(() -> new TreeSet<>(
@@ -698,6 +696,14 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
             List<WbsTreeContractVO> collect4 = failWbsTreeContractVOS.stream().sorted(Comparator.comparing(WbsTreeContract::getCreateTime, Comparator.reverseOrder())).collect(Collectors.toList());
             res.setUnmatchedData(collect4);
 
+            //重复导入时删除多余节点信息
+            List<WbsTreeContract> wbsTreeContractDel = baseMapper.selectList(Wrappers.<WbsTreeContract>query().lambda().eq(WbsTreeContract::getContractId, wbsTreeContractRoot.getContractId()));
+            List<Long> delIds = wbsTreeContractDel.stream().filter(f -> f.getNodeName().contains(("_copy_copy")) && f.getId().equals(f.getPKeyId())).collect(Collectors.toList())
+                    .stream().map(WbsTreeContract::getPKeyId).collect(Collectors.toList());
+            if (delIds.size() > 0) {
+                baseMapper.deleteByIds(delIds);
+            }
+
             return res;
         } catch (IOException | ClassNotFoundException e) {
             e.printStackTrace();
@@ -705,147 +711,70 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         return res;
     }
 
-    private List<WbsTreeContractVO> buildFailDataTree(List<Map<Integer, String>> resultList, List<WbsTreeContractVO> failData, List<WbsTreeContractVO> successData, Long id) {
-        if (id == null) {
-            id = 0L;
-        }
+    private List<WbsTreeContractVO> buildFailDataTree(List<WbsTreeContractVO> failData, List<WbsTreeContractVO> successData, Long parentIdRoot) {
         List<WbsTreeContractVO> resultData = new ArrayList<>();
-        for (Map<Integer, String> map : resultList) {//行
-            Long nodeParentIdLv1 = id;
-            Long nodeParentIdLv2 = id;
-            Long nodeParentIdLv3 = id;
-            Long nodeParentIdLv4 = id;
-            //当前行,失败节点
-            List<WbsTreeContractVO> failList = new ArrayList<>();
-            //当前行,成功节点
-            List<WbsTreeContractVO> successList = new ArrayList<>();
-
-            for (Map.Entry<Integer, String> entry : map.entrySet()) {//每行的列
-                Integer k = entry.getKey();
-                String v = entry.getValue();
-                if (StringUtil.isEmpty(v.replaceAll(":::", ""))) {
-                    continue;
+        resultData.addAll(successData);
+        resultData.addAll(failData);
+
+        for (WbsTreeContractVO resultDatum : resultData) {
+            //根据划分id确定上级节点
+            List<String> codeParents = new ArrayList<>();
+            if (resultDatum.getNodeType() == 1) {
+                //根节点
+                resultDatum.setParentId(parentIdRoot);
+                codeParents.add(resultDatum.getPartitionCode());
+            } else {
+                if (resultDatum.getNodeType() > 1) {
+                    String[] split = resultDatum.getPartitionCode().split("-");
+                    codeParents.addAll(Arrays.asList(split).subList(0, split.length - 1));
                 }
-                String[] split = v.split(":::");
-                String nodeName = split[0];
-                if (failData.size() > 0) {
-                    for (WbsTreeContractVO failDatum : failData) {
-                        if (k.equals(failDatum.getNodeType()) && nodeName.equals(failDatum.getFullName())) {
-                            failList.add(failDatum);
-                        }
-                    }
-                }
-                if (successData.size() > 0) {
-                    for (WbsTreeContractVO successDatum : successData) {
-                        if (k.equals(successDatum.getNodeType()) && nodeName.equals(successDatum.getFullName())) {
-                            successList.add(successDatum);
-                        }
-                    }
-                }
-            }
 
-            //如果没有匹配成功的节点,那么就用excel所有节点参数构建新的失败树的上级id
-            if (successList.size() == 0 && failList.size() > 0) {
-                for (WbsTreeContractVO wbsTreeContractVO : failList) {
-                    if (wbsTreeContractVO.getNodeType() == 1) {
-                        nodeParentIdLv1 = wbsTreeContractVO.getId();
-                    } else if (wbsTreeContractVO.getNodeType() == 2) {
-                        nodeParentIdLv2 = wbsTreeContractVO.getId();
-                    } else if (wbsTreeContractVO.getNodeType() == 3) {
-                        nodeParentIdLv3 = wbsTreeContractVO.getId();
-                    } else if (wbsTreeContractVO.getNodeType() == 4) {
-                        nodeParentIdLv4 = wbsTreeContractVO.getId();
-                    }
+                String codeParent;
+                if (codeParents.size() > 1) {
+                    //非第一级
+                    codeParent = codeParents.stream().map(String::valueOf).collect(Collectors.joining("-"));
+                } else {
+                    //第一级
+                    codeParent = StringUtils.join(codeParents, "");
                 }
-            }
 
-            //如果有匹配成功的节点,那么就是要该节点作为构建失败树的上级id
-            if (successList.size() > 0) {
-                for (WbsTreeContractVO successDatum : successList) {
-                    if (successDatum.getNodeType() == 1) {
-                        nodeParentIdLv1 = successDatum.getId();
-                    } else if (successDatum.getNodeType() == 2) {
-                        nodeParentIdLv2 = successDatum.getId();
-                    } else if (successDatum.getNodeType() == 3) {
-                        nodeParentIdLv3 = successDatum.getId();
-                    } else if (successDatum.getNodeType() == 4) {
-                        nodeParentIdLv4 = successDatum.getId();
-                    }
+                //获取上级id,设置为parentId
+                String finalCodeParent = codeParent;
+                WbsTreeContractVO wbsTreeContractVO = resultData.stream().filter(f -> f.getPartitionCode().equals(finalCodeParent)).findAny().orElse(null);
+                if (wbsTreeContractVO != null) {
+                    resultDatum.setParentId(wbsTreeContractVO.getId());
+                } else {
+                    resultDatum.setParentId(parentIdRoot);
                 }
             }
-
-            //构建未成功节点的父级id
-            if (failList.size() > 0) {
-                for (WbsTreeContractVO failDatum : failList) {
-                    if (failDatum.getNodeType() == 1) {
-                        failDatum.setParentId(id);
-
-                    } else if (failDatum.getNodeType() == 2) {
-                        failDatum.setParentId(nodeParentIdLv1);
-                        nodeParentIdLv2 = failDatum.getId();
-
-                    } else if (failDatum.getNodeType() == 3) {
-                        if (nodeParentIdLv2.equals(id)) {
-                            failDatum.setParentId(id);
-                        } else {
-                            failDatum.setParentId(nodeParentIdLv2);
-                            nodeParentIdLv3 = failDatum.getId();
-                        }
-
-                    } else if (failDatum.getNodeType() == 4) {
-                        if (nodeParentIdLv3.equals(id)) {
-                            if (nodeParentIdLv2.equals(id)) {
-                                failDatum.setParentId(id);
-                            } else {
-                                failDatum.setParentId(nodeParentIdLv2);
-                                nodeParentIdLv4 = failDatum.getId();
-                            }
-                        } else {
-                            failDatum.setParentId(nodeParentIdLv3);
-                            nodeParentIdLv4 = failDatum.getId();
-                        }
-
-                    } else if (failDatum.getNodeType() == 5) {
-                        if (nodeParentIdLv4.equals(id)) {
-                            if (nodeParentIdLv3.equals(id)) {
-                                if (nodeParentIdLv2.equals(id)) {
-                                    failDatum.setParentId(id);
-                                } else {
-                                    failDatum.setParentId(nodeParentIdLv2);
-                                }
-                            } else {
-                                failDatum.setParentId(nodeParentIdLv3);
-                            }
-                        } else {
-                            failDatum.setParentId(nodeParentIdLv4);
-                        }
-                    }
-                }
-            }
-
-            //添加构建成功节点
-            resultData.addAll(failList);
-            if (failList.size() > 0) {
-                resultData.addAll(successList);
-            }
         }
 
         return resultData;
     }
 
-    private WbsTreeContract buildFailData(Integer nodeType, String nodeName, String partitionCode) {
-        WbsTreeContract wbsTreeContract = new WbsTreeContract();
-        Long id = SnowFlakeUtil.getId();
-        wbsTreeContract.setPKeyId(id);
-        wbsTreeContract.setId(id);
-        wbsTreeContract.setNodeName(nodeName);
-        wbsTreeContract.setFullName(nodeName);
-        wbsTreeContract.setImportMatchingInfo(nodeName);
-        wbsTreeContract.setPartitionCode(partitionCode);
-        wbsTreeContract.setType(1);
-        wbsTreeContract.setNodeType(nodeType);
-        wbsTreeContract.setIsImportIdentificationNode(0);  //识别失败
-        return wbsTreeContract;
+    private List<WbsTreeContractVO> buildFailData(Set<ImportContractNodeVO> sets) {
+        List<WbsTreeContractVO> list = new ArrayList<>();
+        Iterator<ImportContractNodeVO> iterator = sets.iterator();
+        while (iterator.hasNext()) {
+            ImportContractNodeVO next = iterator.next();
+            String nodeName = next.getNodeName();
+            String partitionCode = next.getPartitionCode();
+            Integer nodeType = next.getNodeType();
+
+            WbsTreeContractVO wbsTreeContract = new WbsTreeContractVO();
+            Long id = SnowFlakeUtil.getId();
+            wbsTreeContract.setPKeyId(id);
+            wbsTreeContract.setId(id);
+            wbsTreeContract.setNodeName(nodeName);
+            wbsTreeContract.setFullName(nodeName);
+            wbsTreeContract.setImportMatchingInfo(nodeName);
+            wbsTreeContract.setPartitionCode(partitionCode);
+            wbsTreeContract.setType(1);
+            wbsTreeContract.setNodeType(nodeType);
+            wbsTreeContract.setIsImportIdentificationNode(0);  //识别失败
+            list.add(wbsTreeContract);
+        }
+        return list;
     }
 
     private List<WbsTreeContractVO> buildWbsTreeByStream(List<WbsTreeContractVO> wbsTreeVO2s, Long id) {

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

@@ -1,9 +1,12 @@
 package org.springblade.manager.utils;
 
+
 import java.util.*;
 
+
 public class DiffListUtil {
 
+
     public static List<String> getDiffRent(List<String> list1, List<String> list2) {
         List<String> diff = new ArrayList<String>();
         List<String> maxList = list1;