فهرست منبع

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

yangyj 2 سال پیش
والد
کامیت
d5c6d86369
18فایلهای تغییر یافته به همراه373 افزوده شده و 92 حذف شده
  1. 7 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/SaveUserInfoByProjectClient.java
  2. 161 10
      blade-service/blade-business/src/main/java/org/springblade/business/controller/EVisaTaskCheckController.java
  3. 1 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsFormElementController.java
  4. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeController.java
  5. 10 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java
  6. 11 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/SaveUserInfoByProjectClientImpl.java
  7. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ExctabCellMapper.xml
  8. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml
  9. 20 18
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml
  10. 1 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsFormElementService.java
  11. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreePrivateService.java
  12. 14 22
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java
  13. 30 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExctabCellServiceImpl.java
  14. 6 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsFormElementServiceImpl.java
  15. 6 14
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  16. 98 7
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  17. 1 0
      blade-service/blade-system/src/main/java/org/springblade/system/mapper/DictBizMapper.xml
  18. 1 1
      blade-service/blade-system/src/main/java/org/springblade/system/mapper/DictMapper.xml

+ 7 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/SaveUserInfoByProjectClient.java

@@ -1,8 +1,11 @@
 package org.springblade.manager.feign;
 
+import com.alibaba.fastjson.JSONObject;
 import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
@@ -17,6 +20,10 @@ public interface SaveUserInfoByProjectClient {
      */
     String SEARCH_USER_INFO_AND_PROJECT = "/api/manager/searchUserInfoAndProject";
     String SEARCH_USER_INFO_AND_PROJECT2 = "/api/manager/searchUserInfoAndProject2";
+    String QUERY_USER_CONTRACT_ROLE = "/api/manager/queryUserContractRole";
+
+    @PostMapping(QUERY_USER_CONTRACT_ROLE)
+    List<JSONObject> queryUserContractRole(@RequestBody List<Long> userIds, @RequestParam String contractId);
 
     /**
      * 获取用户引用项目合同角色信息

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

@@ -1,6 +1,8 @@
 package org.springblade.business.controller;
 
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -9,18 +11,22 @@ import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
 import org.springblade.business.entity.FixedFlowLink;
+import org.springblade.business.entity.InformationQuery;
 import org.springblade.business.service.IFixedFlowLinkService;
+import org.springblade.business.service.IInformationQueryService;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.SignPfxFile;
-import org.springblade.manager.feign.ContractClient;
-import org.springblade.manager.feign.EVisaConfigClient;
-import org.springblade.manager.feign.SignPfxClient;
+import org.springblade.manager.entity.WbsTreeContract;
+import org.springblade.manager.entity.WbsTreePrivate;
+import org.springblade.manager.feign.*;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @RestController
@@ -37,11 +43,21 @@ public class EVisaTaskCheckController {
 
     private final SignPfxClient signPfxClient;
 
+    private final SaveUserInfoByProjectClient saveUserInfoByProjectClient;
+
+    private final WbsTreePrivateClient wbsTreePrivateClient;
+
+    private final WbsTreeContractClient wbsTreeContractClient;
+
+    private final IUserClient userClient;
+
+    private final IInformationQueryService informationQueryService;
+
     /**
      * 检查当前审批人是否存在证书
      */
     @GetMapping("/checkFlowUserIsExistPfxFile")
-    @ApiOperationSupport(order = 3)
+    @ApiOperationSupport(order = 4)
     @ApiOperation(value = "检查当前审批人是否存在证书")
     public R<Boolean> checkTaskUserIsExistPfxFile(){
         //获取当前审批人的证书
@@ -63,14 +79,99 @@ public class EVisaTaskCheckController {
     }
 
     /**
-     * 检查所选的流程环节处理人是否具有审批权限
+     * 检查所选的流程环节处理人是否具有审批权限(资料查询批量上报)
+     */
+    @PostMapping("/batchCheckFlowUserIsEVisaPermissions")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "检查所选的流程环节处理人是否具有审批权限(资料查询批量上报)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "flowId", value = "所选的流程ID", required = true),
+            @ApiImplicitParam(name = "contractId", value = "合同段ID", required = true),
+            @ApiImplicitParam(name = "queryIds", value = "资料查询列表中的记录ID,以数组的形式")
+    })
+    public R<Boolean> batchCheckFlowUserIsEVisaPermissions(@RequestBody JSONObject json){
+        if(json.containsKey("flowId")) {
+            //首先找到对应流程下的审批人组
+            List<FixedFlowLink> flowLink = this.fixedFlowLinkService.selectFixedFlowLink(json.getString("flowId"));
+
+            //获取这些人当前合同段下的权限
+            List<Long> linkUserList = flowLink.stream().map(FixedFlowLink::getFixedFlowLinkUser).distinct().collect(Collectors.toList());
+            List<JSONObject> userRoleList = this.saveUserInfoByProjectClient.queryUserContractRole(linkUserList, json.getString("contractId"));
+
+            //因为是批量的,所以需要一一校验
+            List<String> queryIds = json.getJSONArray("queryIds").toJavaList(String.class);
+            //获取所选资料记录
+            List<InformationQuery> queryList = this.informationQueryService.list(Wrappers.<InformationQuery>lambdaQuery().in(InformationQuery::getId, queryIds));
+            //获取节点
+            List<WbsTreeContract> contractTreeList = this.wbsTreeContractClient.queryContractTreeNodeByPKIds(queryList.stream().map(InformationQuery::getWbsId).distinct().collect(Collectors.toList()));
+            //做一一对应处理
+            Map<String, InformationQuery> queryMap = new HashMap<>();
+            Map<String, WbsTreeContract> queryToNodeMap = new HashMap<>();
+            for(InformationQuery query : queryList){
+                Iterator<WbsTreeContract> iterator = contractTreeList.iterator();
+                while (iterator.hasNext()){
+                    WbsTreeContract next = iterator.next();
+                    if(next.getPKeyId().equals(query.getWbsId())){
+                        queryToNodeMap.put(query.getId().toString(), next);
+                        iterator.remove();
+                        break;
+                    }
+                }
+                queryMap.put(query.getId().toString(), query);
+            }
+            //循环判断
+            Set<String> keys = queryMap.keySet();
+            for(String key : keys){
+                //获取记录
+                InformationQuery query = queryMap.get(key);
+                //获取节点
+                WbsTreeContract contractNode = queryToNodeMap.get(key);
+                if(contractNode == null){
+                    //避免未找到对应的节点
+                    contractNode = this.wbsTreeContractClient.getContractWbsTreeByPrimaryKeyId(query.getWbsId());
+                }
+
+                //根据节点及具体类型做表格区分
+                List<WbsTreeContract> tableList = this.wbsTreeContractClient.queryChildByParentId(contractNode, "queryTable", String.valueOf(query.getClassify()));
+                //获取指向ID
+                List<Long> privateTablePrimaryKeyIds = tableList.stream().map(WbsTreeContract::getIsTypePrivatePid).distinct().collect(Collectors.toList());
+
+                //获取这些表格的电签配置信息
+                List<JSONObject> jsonList = this.queryTableEVisaConfig(JSONArray.parseArray(JSONObject.toJSONString(privateTablePrimaryKeyIds), String.class));
+                if(jsonList == null){
+                    return R.data(300, false, "所选资料【" + query.getName() + "】未找到电签配置,请联系维护人员处理或暂时取消这份资料的上报");
+                }
+
+                //汇总电签配置的审批角色
+                List<String> eVisaRoleList = jsonList.stream().map(jsonObject -> jsonObject.getString("sigRoleId")).distinct().collect(Collectors.toList());
+
+                //循环审批人的角色集合,并判断电签配置中是否含有这个角色
+                for(JSONObject userRole : userRoleList){
+                    if(!eVisaRoleList.contains(userRole.getString("roleId"))){
+                        User user = this.userClient.userInfoById(userRole.getLong("userId")).getData();
+                        return R.data(300, false, "所选流程中的用户【" + user.getRealName() + "】对于所选资料【" + query.getName() + "】不具有相关审批权限,请联系维护人员处理或更换审批流程");
+                    }
+                }
+            }
+
+            return R.data(200, true, "满足上报条件");
+        }
+        return R.data(300, false, "未找到对应流程,请重新选择");
+    }
+
+
+    /**
+     * 检查所选的流程环节处理人是否具有审批权限(三大填报页、日志列表的批量上报、首件列表的批量上报)
      */
     @PostMapping("/checkFlowUserIsEVisaPermissions")
-    @ApiOperation(value = "检查当前合同段是否开启电签")
+    @ApiOperation(value = "检查所选的流程环节处理人是否具有审批权限(三大填报页、日志列表的批量上报、首件列表的批量上报)")
     @ApiOperationSupport(order = 2)
     @ApiImplicitParams({
             @ApiImplicitParam(name = "flowId", value = "所选的流程ID", required = true),
-            @ApiImplicitParam(name = "privatePKeyId", value = "表单列表中的isTypePrivatePid字段,集合形式", required = true)
+            @ApiImplicitParam(name = "contractId", value = "合同段ID", required = true),
+            @ApiImplicitParam(name = "privatePKeyId", value = "表单列表中的isTypePrivatePid字段,集合形式"),
+            @ApiImplicitParam(name = "theLogPrimaryKeyId", value = "日志左侧所选的填报类型ID"),
+            @ApiImplicitParam(name = "firstId", value = "首件记录ID,列表批量上报时传任意一个即可")
     })
     public R<Boolean> checkFlowUserIsEVisaPermissions(@RequestBody JSONObject json){
         if(json.containsKey("flowId")){
@@ -79,13 +180,63 @@ public class EVisaTaskCheckController {
 
             //获取这些人当前合同段下的权限
             List<Long> linkUserList = flowLink.stream().map(FixedFlowLink::getFixedFlowLinkUser).distinct().collect(Collectors.toList());
+            List<JSONObject> userRoleList = this.saveUserInfoByProjectClient.queryUserContractRole(linkUserList, json.getString("contractId"));
 
             //获取对应表格的所有电签配置
-            List<JSONObject> jsonList = this.eVisaConfigClient.queryEVisaConfigAllByTableIds(json.getJSONArray("privatePKeyId").toJavaList(String.class));
+            List<JSONObject> jsonList;
+            if(json.containsKey("theLogPrimaryKeyId") && StringUtils.isNotEmpty(json.getString("theLogPrimaryKeyId"))){
+                //日志,需要先获取对应的表格
+                jsonList = this.queryTableEVisaConfig(Func.toStrList(json.getString("theLogPrimaryKeyId")));
+
+            } else if(json.containsKey("firstId") && StringUtils.isNotEmpty(json.getString("firstId"))){
+                //首件,先获取记录
+                InformationQuery query = this.informationQueryService.getById(json.getLong("firstId"));
+                if(query != null){
+                    jsonList = this.queryTableEVisaConfig(Func.toStrList(query.getTableId()));
+                } else {
+                    jsonList = null;
+                }
+
+            } else {
+                //资料填报
+                jsonList = this.eVisaConfigClient.queryEVisaConfigAllByTableIds(json.getJSONArray("privatePKeyId").toJavaList(String.class));
+            }
+
+            if(jsonList == null){
+                return R.data(300, false, "当前表格均未配置电签关键字,请联系维护人员处理");
+            }
+            //汇总电签配置的审批角色
+            List<String> eVisaRoleList = jsonList.stream().map(jsonObject -> jsonObject.getString("sigRoleId")).distinct().collect(Collectors.toList());
+
+            //循环审批人的角色集合,并判断电签配置中是否含有这个角色
+            for(JSONObject userRole : userRoleList){
+                if(!eVisaRoleList.contains(userRole.getString("roleId"))){
+                    User user = this.userClient.userInfoById(userRole.getLong("userId")).getData();
+                    return R.data(300, false, "所选流程中的用户【" + user.getRealName() + "】不具有相关审批权限,请联系维护人员处理或更换审批流程");
+                }
+            }
+
+            return R.data(200, true, "满足上报条件");
+        }
+
+        return R.data(300, false, "未找到对应流程,请重新选择");
+    }
+
+    /**
+     * 获取表格的电签配置
+     */
+    private List<JSONObject> queryTableEVisaConfig(List<String> primaryKeyIds){
+        List<JSONObject> jsonList;
 
+        List<WbsTreePrivate> privateTreeList = this.wbsTreePrivateClient.queryExcelTableByParentId(this.wbsTreePrivateClient.queryByPKeyIds(primaryKeyIds).get(0));
+        if(privateTreeList != null && privateTreeList.size() > 0){
+            List<Long> pKeyList = privateTreeList.stream().map(WbsTreePrivate::getPKeyId).distinct().collect(Collectors.toList());
+            jsonList = this.eVisaConfigClient.queryEVisaConfigAllByTableIds(JSONArray.parseArray(JSONObject.toJSONString(pKeyList), String.class));
+        } else {
+            jsonList = null;
         }
 
-        return null;
+        return jsonList;
     }
 
     /**

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

@@ -9,7 +9,6 @@ import javax.validation.Valid;
 
 import org.springblade.core.excel.util.ExcelUtil;
 import org.springblade.core.tool.api.R;
-import org.springblade.manager.dto.FormElementDTO;
 import org.springblade.manager.dto.FormElementDTO2;
 import org.springblade.manager.dto.WbsFormElementDTO;
 import org.springblade.manager.dto.WbsFormElementDTO2;
@@ -58,10 +57,9 @@ public class WbsFormElementController extends BladeController {
     @ApiOperationSupport(order = 2)
     @ApiOperation(value = "新增", notes = "传入wbsFormElement")
     public R save(@Valid @RequestBody WbsFormElementDTO wbsFormElement) {
-        return R.status(wbsFormElementService.saveAndSyn(wbsFormElement, wbsFormElement.getInitTableName()));
+        return R.data(wbsFormElementService.saveAndSyn(wbsFormElement, wbsFormElement.getInitTableName()));
     }
 
-
     /**
      * 修改 wbs表单元素
      */
@@ -72,7 +70,6 @@ public class WbsFormElementController extends BladeController {
         return R.status(wbsFormElementService.updateById(wbsFormElement));
     }
 
-
     /**
      * 新增或修改 wbs表单元素
      * @deprecated 未使用
@@ -94,7 +91,6 @@ public class WbsFormElementController extends BladeController {
         return R.status(wbsFormElementService.submitBatch(wbsFormElementVO2));
     }
 
-
     /**
      * 删除 wbs表单元素 同步删除实体表字段
      */

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

@@ -176,12 +176,12 @@ public class WbsTreeController extends BladeController {
             if (wbsFormElements.size() > 0) {
                 throw new ServiceException("该表单中存在元素,删除失败");
             }*/
-            List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+            /*List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
                     .eq(WbsTreePrivate::getStatus, 1)
                     .eq(WbsTreePrivate::getId, id));
             if (wbsTreePrivates.size() > 0) {
                 throw new ServiceException("该表单已被项目引用,删除失败");
-            }
+            }*/
             if (wbsTreeService.removeTableById(id)) {
                 return R.success("删除成功");
             }

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

@@ -389,5 +389,15 @@ public class WbsTreePrivateController extends BladeController {
         return R.status(wbsTreePrivateService.submitFullName(pKeyId,fullNames));
     }
 
+    /**
+     * 同步项目下所有节点参数
+     */
+    @ApiOperationSupport(order = 14)
+    @ApiOperation(value = "同步项目下所有节点参数", notes = "传入项目projectId")
+    @RequestMapping(value = "/sync-node-param", method = RequestMethod.POST)
+    public R syncNodeParam(@RequestParam String projectId) {
+        return R.status(wbsTreePrivateService.syncNodeParam(projectId));
+    }
+
 
 }

+ 11 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/SaveUserInfoByProjectClientImpl.java

@@ -1,5 +1,7 @@
 package org.springblade.manager.feign;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
 import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
@@ -15,6 +17,15 @@ public class SaveUserInfoByProjectClientImpl implements SaveUserInfoByProjectCli
 
     private final SaveUserInfoByProjectService saveUserInfoByProjectService;
 
+    @Override
+    public List<JSONObject> queryUserContractRole(List<Long> userIds, String contractId) {
+        List<SaveUserInfoByProjectDTO> userContractRole = this.saveUserInfoByProjectService.list(Wrappers.<SaveUserInfoByProjectDTO>lambdaQuery().in(SaveUserInfoByProjectDTO::getUserId, userIds).eq(SaveUserInfoByProjectDTO::getContractId, contractId));
+        if(userContractRole != null && userContractRole.size() > 0){
+            return JSONArray.parseArray(JSONObject.toJSONString(userContractRole), JSONObject.class);
+        }
+        return null;
+    }
+
     @Override
     public List<SaveUserInfoByProjectDTO> searchUserInfoAndProject(String userId, String roleId) {
         return saveUserInfoByProjectService.list(

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

@@ -23,7 +23,7 @@
         select * from m_exctab_cell where is_deleted = 0
     </select>
 
-    <select id="getColSelect" resultMap="exctabCellResultMap">
+    <select id="getColSelect" resultType="org.springblade.manager.vo.ExctabCellVO">
         select * from m_exctab_cell where is_deleted = 0 and exctab_id =#{tabId}
     </select>
 

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

@@ -219,7 +219,7 @@
                (select contract_name from m_contract_info ci where ci.id = t.contract_id) AS "contractName"
         FROM m_wbs_tree_contract t
         WHERE project_id = #{projectId}
-          AND contract_type = 1
+          /*AND contract_type = 1*/
           AND status = 1
           AND parent_id = 0
           AND is_deleted = 0

+ 20 - 18
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml

@@ -56,6 +56,7 @@
         <result column="primaryKeyId" property="primaryKeyId"/>
         <result column="nodeType" property="nodeType"/>
         <result column="isExistForm" property="isExistForm"/>
+        <result column="majorDataType" property="majorDataType"/>
     </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,
@@ -268,36 +269,37 @@
 
     <select id="lazyTree" resultMap="treeNodeResultMap">
         SELECT
-        dept.p_key_id as "primaryKeyId",
-        dept.type AS "type",
-        dept.table_type,
-        dept.id,
-        dept.parent_id,
-        dept.node_name AS title,
-        dept.node_type AS "nodeType",
-        dept.id AS "value",
-        dept.id AS "key",
-        dept.is_exist_form AS "isExistForm",
+        d.p_key_id as "primaryKeyId",
+        d.type AS "type",
+        d.table_type,
+        d.id,
+        d.parent_id,
+        d.node_name AS title,
+        d.node_type AS "nodeType",
+        d.id AS "value",
+        d.id AS "key",
+        d.major_data_type AS "majorDataType",
+        d.is_exist_form AS "isExistForm",
         (
         SELECT
         CASE WHEN count(1) > 0 THEN 1 ELSE 0 END
         FROM
         m_wbs_tree_private
         WHERE
-        parent_id = dept.id and is_deleted = 0
+        parent_id = d.id and is_deleted = 0
         ) AS "has_children"
         FROM
-        m_wbs_tree_private dept
+        m_wbs_tree_private d
         WHERE
-        dept.parent_id = #{parentId} AND dept.is_deleted = 0
+        d.parent_id = #{parentId} AND d.is_deleted = 0
         <if test="tenantId!=null and tenantId!=''">
-            and dept.tenant_id = #{tenantId}
+            and d.tenant_id = #{tenantId}
         </if>
-        AND dept.project_id = #{projectId}
-        AND dept.wbs_id = #{wbsId}
-        AND dept.type = 1
+        AND d.project_id = #{projectId}
+        AND d.wbs_id = #{wbsId}
+        AND d.type = 1
         AND status = 1
-        ORDER BY dept.sort
+        ORDER BY d.sort
     </select>
 
 

+ 1 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsFormElementService.java

@@ -1,10 +1,7 @@
 package org.springblade.manager.service;
 
-
 import org.springblade.core.mp.base.BaseService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import org.springblade.core.tool.api.R;
-import org.springblade.manager.dto.FormElementDTO;
 import org.springblade.manager.dto.FormElementDTO2;
 import org.springblade.manager.dto.WbsFormElementDTO2;
 import org.springblade.manager.entity.WbsFormElement;
@@ -30,7 +27,7 @@ public interface IWbsFormElementService extends BaseService<WbsFormElement> {
 
     void importElement(List<WbsFormElementExcel> data, Boolean isCovered, String tableId);
 
-    boolean saveAndSyn(WbsFormElement wbsFormElement, String tableName);
+    WbsFormElement saveAndSyn(WbsFormElement wbsFormElement, String tableName);
 
     boolean deleteAndSyn(String ids, String elementName, String tableName);
 

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

@@ -45,4 +45,6 @@ public interface IWbsTreePrivateService extends BaseService<WbsTreePrivate> {
 
     boolean submitFullName(String pKeyId, String fullNames);
 
+    boolean syncNodeParam(String projectId);
+
 }

+ 14 - 22
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java

@@ -189,11 +189,12 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
 
             //新增合同段 监理、业主与施工wbs树信息
             if (contractInfo.getContractType().equals(2) || contractInfo.getContractType().equals(3)) {
-                List<WbsTreeContractVO3> infos = contractInfo.getIdList();
-                infos.forEach(info -> {
-                    baseMapper.insertContractRelationJLYZ(SnowFlakeUtil.getId(), contractInfo.getId(), info.getContractId());
-
-                });
+                if (contractInfo.getIdList().size() > 0) {
+                    List<WbsTreeContractVO3> infos = contractInfo.getIdList();
+                    infos.forEach(info -> {
+                        baseMapper.insertContractRelationJLYZ(SnowFlakeUtil.getId(), contractInfo.getId(), info.getContractId());
+                    });
+                }
             }
 
             return submitContractRelevantInfo(row, contractInfo);
@@ -208,38 +209,29 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
             if (contractInfos.size() > 0) {
                 throw new ServiceException("合同段名称已存在当前项目下,请重新输入");
             }
-
             //新增合同段
             boolean row = saveOrUpdate(contractInfo);
 
             //关联合同段 监理、业主与施工wbs树信息
             if (contractInfo.getContractType().equals(2) || contractInfo.getContractType().equals(3)) {
-                //获取当前入参的施工合同段IdList
                 List<WbsTreeContractVO3> idList = contractInfo.getIdList();
-                if (idList.isEmpty()) {
-                    throw new ServiceException("请先选择关联的合同段权限");
-                }
-                List<String> idList_SG = idList.stream().map(WbsTreeContractVO3::getContractId).collect(Collectors.toList());
-
-                //获取当前合同段存在的关系信息
+                //删除当前关系信息
                 List<ContractRelationJlyz> resultListJLTZ = baseMapper.selectByContractRelationJlyz(contractInfo.getId());
-
-                //全部删除当前关系信息
                 if (resultListJLTZ.size() > 0) {
                     baseMapper.deleteContractRelationJLYZ(contractInfo.getId());
                 }
 
-                //新增
-                idList_SG.forEach(ids -> {
-                    baseMapper.insertContractRelationJLYZ(SnowFlakeUtil.getId(), contractInfo.getId(), ids);
-                });
-
+                if (idList.size() > 0) {
+                    //新增关系信息
+                    List<String> idList_SG = idList.stream().map(WbsTreeContractVO3::getContractId).collect(Collectors.toList());
+                    idList_SG.forEach(ids -> {
+                        baseMapper.insertContractRelationJLYZ(SnowFlakeUtil.getId(), contractInfo.getId(), ids);
+                    });
+                }
             }
 
             return submitContractRelevantInfo(row, contractInfo);
-
         }
-
     }
 
     private boolean submitContractRelevantInfo(boolean row, ContractInfoVO contractInfo) {

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

@@ -18,6 +18,7 @@ package org.springblade.manager.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
 import org.springblade.manager.entity.ExctabCell;
 import org.springblade.manager.entity.LinkdataInfo;
 import org.springblade.manager.entity.WbsFormElement;
@@ -51,7 +52,15 @@ public class ExctabCellServiceImpl extends BaseServiceImpl<ExctabCellMapper, Exc
 
     @Override
     public List<ExctabCellVO> getColSelect(String tabId) {
-        return baseMapper.getColSelect(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;
     }
 
     @Override
@@ -79,4 +88,24 @@ public class ExctabCellServiceImpl extends BaseServiceImpl<ExctabCellMapper, Exc
         return wbsFormElementService.updateById(info) ? 1 : -1;
     }
 
+    private Integer getElementType(String name) {
+        if (StringUtils.isNotEmpty(name)) {
+            String s = name.toUpperCase();
+            if (s.contains("实测") || s.contains("偏差") || s.contains("合格率") || s.contains("平均")
+                    || s.contains("M") || s.contains("CM") || s.contains("MM") || s.contains("%") || s.contains("量")
+                    || s.contains("X") || s.contains("Y") || s.contains("H") || s.contains("MPA") || s.contains("KN")) {
+                return 5; //数值
+            }
+            if (s.contains("检测") || s.contains("检验负责人") || s.contains("记录") || s.contains("复核")
+                    || s.contains("工程师") || s.contains("监理员") || s.contains("审核") || s.contains("签字") || s.contains("签名")) {
+                return 6; //签名
+            }
+            if (s.contains("图片") || s.contains("相片") || s.contains("示意图") || s.contains("简图")) {
+                return 7; //文件
+            }
+        }
+        return -1;
+    }
+
+
 }

+ 6 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsFormElementServiceImpl.java

@@ -120,7 +120,7 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
     }
 
     @Override
-    public boolean saveAndSyn(WbsFormElement wbsFormElement, String tableName) {
+    public WbsFormElement saveAndSyn(WbsFormElement wbsFormElement, String tableName) {
         try {
             //获取当前表单下所有元素
             List<WbsFormElement> wbsFormElements = baseMapper.selectList(Wrappers.<WbsFormElement>query().lambda().eq(WbsFormElement::getFId, wbsFormElement.getFId()));
@@ -162,7 +162,7 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
                     sbr1.append(" ").append("varchar").append("(").append(DEFAULT_ELEMENT_LENGTH_VARCHAR).append(")");
                     String sql = newName + " " + sbr1;
                     baseMapper.alterAddFiled(sql, tableName);
-                    return true;
+                    return wbsFormElement;
                 }
 
             } else if ("bigint".equals(fieldType)) {
@@ -178,7 +178,7 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
                     sbr1.append(" ").append("varchar").append("(").append(DEFAULT_ELEMENT_LENGTH_VARCHAR).append(")");
                     String sql = newName + " " + sbr1;
                     baseMapper.alterAddFiled(sql, tableName);
-                    return true;
+                    return wbsFormElement;
                 }
 
             } else if ("decimal".equals(fieldType)) {
@@ -194,7 +194,7 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
                     sbr1.append(" ").append("varchar").append("(").append(DEFAULT_ELEMENT_LENGTH_VARCHAR).append(")");
                     String sql = newName + " " + sbr1;
                     baseMapper.alterAddFiled(sql, tableName);
-                    return true;
+                    return wbsFormElement;
                 }
             } else if ("datetime".equals(fieldType)) {
                 if (wbsFormElement.getELength() > 50 || wbsFormElement.getELength() < 0) {
@@ -209,7 +209,7 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
                     sbr1.append(" ").append("varchar").append("(").append(DEFAULT_ELEMENT_LENGTH_VARCHAR).append(")");
                     String sql = newName + " " + sbr1;
                     baseMapper.alterAddFiled(sql, tableName);
-                    return true;
+                    return wbsFormElement;
                 }
             }
 
@@ -217,7 +217,7 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
             baseMapper.deleteElement(wbsFormElement);
             throw new ServiceException("未获取到对应实体表信息,新增失败");
         }
-        return false;
+        return wbsFormElement;
     }
 
     @Override

+ 6 - 14
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -46,7 +46,6 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
     private final ConstructionLedgerFeignClient constructionLedgerFeign;
     private final WbsTreePrivateMapper wbsTreePrivateMapper;
     private final ContractInfoMapper contractInfoMapper;
-    private final ContractInfoServiceImpl contractInfoService;
 
     @Override
     public List<WbsTreeContract> selectQueryCurrentNodeByAncestors(List<String> ids, String contractId) {
@@ -417,11 +416,10 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 .eq(WbsTreeContract::getStatus, 1)
                 .or()
                 .eq(WbsTreeContract::getAncestors, wbsTreeContract.getId())
-
         );
 
         for (WbsTreeContract treeContract : wbsTreeContracts) {
-            //设置主键
+            //主键
             treeContract.setPKeyId(SnowFlakeUtil.getId());
         }
 
@@ -453,7 +451,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         //获取当前合同段树
         List<WbsTreeContractVO> wbsTreeContractVOS = contractInfoMapper.tree2(null, null, contractId, null, null);
         if (wbsTreeContractVOS.size() <= 0) {
-            throw new ServiceException("未查询到当前合同段的wbs树,请先配该合同的合同段wsb树");
+            throw new ServiceException("未查询到当前合同段的wbs树,请先配该合同的合同段wsb树");
         }
 
         //构造resultList
@@ -554,7 +552,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 String partitionCode = split[1];
 
                 int count = 0;
-                if (successData.size() > 0) {
+                if (successData.size() > 0) {   //todo 此处未解决类似名称问题
                     for (WbsTreeContractVO successDatum : successData) {
                         //同类型、名称相似、且划分编码不一样
                         if (successDatum.getNodeType().equals(k)
@@ -626,7 +624,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 this.saveOrUpdateBatch(wbsTreeContracts, 1000);
             }
 
-            //导入识别匹配成功树
+            //构建成功树
             ArrayList<WbsTreeContractVO> collect = successData.stream().collect(
                     Collectors.collectingAndThen(
                             Collectors.toCollection(() -> new TreeSet<>(
@@ -636,7 +634,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
             res.setMatchedData(successWbsTreeContractVOS);
 
             List<WbsTreeContractVO> successDataCopyToFail = WbsExcelBatchUtil.deepCopy(collect);
-            //构建导入识别匹配失败树failDataTree
+            //构建失败树
             List<WbsTreeContractVO> failDataTree = this.buildFailDataTree(resultList, failData, successDataCopyToFail);
             List<WbsTreeContractVO> collect1 = failDataTree.stream().collect(
                     Collectors.collectingAndThen(
@@ -729,7 +727,6 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                         failDatum.setParentId(nodeParentIdLv1);
                         nodeParentIdLv2 = failDatum.getId();
 
-
                     } else if (failDatum.getNodeType() == 3) {
                         if (nodeParentIdLv2 == 0L) {
                             failDatum.setParentId(0L);
@@ -808,21 +805,16 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
             List<WbsTreeContractVO> childrenList = map.get(wbsTreeContractVO.getId());
             wbsTreeContractVO.setChildren(childrenList);
             if (childrenList != null && childrenList.size() > 0) {
-                //存在子级
                 wbsTreeContractVO.setHasChildren(true);
-                //递归查询
                 recursionFnTree(childrenList, map);
             }
         }
     }
 
-    private List<WbsTreeContract> findAllNodeList(String wbsTreeIds, String projectId, String contractId, String
-            wbsId) {
+    private List<WbsTreeContract> findAllNodeList(String wbsTreeIds, String projectId, String contractId, String wbsId) {
         String[] ids = wbsTreeIds.split(",");
-        List<Long> idList = new ArrayList<>();
         List<WbsTreeContract> list = new ArrayList<>();
         for (String id : ids) {
-            idList.add(Long.valueOf(id));
             WbsTreeContract contract = baseMapper.selectByCondition(id, projectId, contractId, wbsId);
             list.add(contract);
         }

+ 98 - 7
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -12,6 +12,7 @@ import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.StringPool;
+import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.manager.dto.WbsTreePrivateDTO2;
 import org.springblade.manager.dto.WbsTreePrivateDTO3;
 import org.springblade.manager.entity.*;
@@ -24,10 +25,7 @@ import org.springblade.manager.vo.WbsTreePrivateVO;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Optional;
+import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -36,9 +34,11 @@ import java.util.stream.Stream;
 public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMapper, WbsTreePrivate> implements IWbsTreePrivateService {
 
     private final WbsTreeContractMapper wbsTreeContractMapper;
+    private final WbsTreeMapper wbsTreeMapper;
     private final ContractInfoMapper contractInfoMapper;
     private final WbsInfoMapper wbsInfoMapper;
     private final WbsParamServiceImpl wbsParamServiceImpl;
+    private final WbsParamMapper wbsParamMapper;
 
     @Override
     public List<WbsTreePrivateVO> tree(String wbsId, String projectId) {
@@ -433,9 +433,9 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
             List<Long> contractIds = contractInfos.stream().map(ContractInfo::getId).collect(Collectors.toList());
             for (Long cId : contractIds) {
                 LambdaUpdateWrapper<WbsTreeContract> updateWrapper1 = new LambdaUpdateWrapper<>();
-                updateWrapper1.eq(WbsTreeContract::getId,wbsTreePrivate.getId());
-                updateWrapper1.eq(WbsTreeContract::getContractId,cId);
-                updateWrapper1.set(WbsTreeContract::getImportMatchingInfo,fullNames);
+                updateWrapper1.eq(WbsTreeContract::getId, wbsTreePrivate.getId());
+                updateWrapper1.eq(WbsTreeContract::getContractId, cId);
+                updateWrapper1.set(WbsTreeContract::getImportMatchingInfo, fullNames);
                 wbsTreeContractMapper.update(null, updateWrapper1);
             }
             return true;
@@ -443,4 +443,95 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         return false;
     }
 
+    @Override
+    public boolean syncNodeParam(String projectId) {
+        if (StringUtils.isNotEmpty(projectId)) {
+            //获取项目节点树
+            List<WbsTreePrivate> wbsTreePrivateAllNow = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                    .eq(WbsTreePrivate::getProjectId, projectId)
+                    .eq(WbsTreePrivate::getStatus, 1)
+                    .eq(WbsTreePrivate::getType, 1)
+            );
+            String wbsId = "";
+            for (WbsTreePrivate wbsTreePrivate : wbsTreePrivateAllNow) {
+                wbsId = wbsTreePrivate.getWbsId();
+                break;
+            }
+            if (StringUtils.isNotEmpty(wbsId)) {
+
+                List<WbsParam> paramListData = new ArrayList<>();
+
+                //获取公有树
+                List<WbsTree> treePublicNodeAll = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
+                        .eq(WbsTree::getWbsId, wbsId)
+                        .eq(WbsTree::getStatus, 1)
+                        .eq(WbsTree::getType, 1)
+                );
+                if (treePublicNodeAll.size() > 0) {
+                    //公有引用
+                    for (WbsTreePrivate wbsTreePrivate : wbsTreePrivateAllNow) {
+                        for (WbsTree wbsTree : treePublicNodeAll) {
+                            if (wbsTree.getId().equals(wbsTreePrivate.getId())) {
+                                //获取公有节点参数
+                                List<WbsParam> paramList = wbsParamServiceImpl.findByNodeId(wbsTree.getId());
+                                for (WbsParam wbsParam : paramList) {
+                                    wbsParam.setWbsId(wbsTreePrivate.getPKeyId());
+                                    wbsParam.setId(SnowFlakeUtil.getId());
+                                    paramListData.add(wbsParam);
+                                }
+                            }
+                        }
+                    }
+
+                } else {
+                    //私有引用 - 获取私有树
+                    WbsTreePrivate treePrivateRootNode = baseMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda()
+                            .eq(WbsTreePrivate::getPKeyId, wbsId)
+                            .eq(WbsTreePrivate::getParentId, 0L)
+                            .eq(WbsTreePrivate::getStatus, 1)
+                            .eq(WbsTreePrivate::getType, 1)
+                    );
+
+                    List<WbsTreePrivate> treePrivateNodeAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                            .eq(WbsTreePrivate::getWbsId, treePrivateRootNode.getWbsId())
+                            .eq(WbsTreePrivate::getStatus, 1)
+                            .eq(WbsTreePrivate::getType, 1)
+                    );
+
+                    for (WbsTreePrivate wbsTreePrivate : wbsTreePrivateAllNow) {
+                        for (WbsTreePrivate wbsTreePrivateYS : treePrivateNodeAll) {
+                            if (wbsTreePrivateYS.getId().equals(wbsTreePrivate.getId())) {
+                                //获取公有节点参数
+                                List<WbsParam> paramList = wbsParamServiceImpl.findByNodeId(wbsTreePrivateYS.getPKeyId());
+                                for (WbsParam wbsParam : paramList) {
+                                    wbsParam.setWbsId(wbsTreePrivate.getPKeyId());
+                                    wbsParam.setId(SnowFlakeUtil.getId());
+                                    paramListData.add(wbsParam);
+                                }
+                            }
+                        }
+                    }
+                }
+
+                //去重
+                Iterator<WbsParam> iterator = paramListData.iterator();
+                while (iterator.hasNext()) {
+                    WbsParam next = iterator.next();
+                    WbsParam wbsParam = wbsParamMapper.selectOne(Wrappers.<WbsParam>query().lambda()
+                            .eq(WbsParam::getK, next.getK())
+                            .eq(WbsParam::getV, next.getV())
+                            .eq(WbsParam::getName, next.getName())
+                            .eq(WbsParam::getWbsId, next.getWbsId())
+                    );
+                    if (wbsParam != null) {
+                        iterator.remove();
+                    }
+                }
+                wbsParamServiceImpl.saveBatch(paramListData, 1000);
+                return true;
+            }
+        }
+        return false;
+    }
+
 }

+ 1 - 0
blade-service/blade-system/src/main/java/org/springblade/system/mapper/DictBizMapper.xml

@@ -42,6 +42,7 @@
             and parent_id > 0
         </if>
         and is_sealed = 0 and is_deleted = 0
+        order by sort
     </select>
 
     <select id="tree" resultMap="treeNodeResultMap">

+ 1 - 1
blade-service/blade-system/src/main/java/org/springblade/system/mapper/DictMapper.xml

@@ -40,7 +40,7 @@
     </select>-->
 
     <select id="getList" resultMap="dictResultMap">
-        select id, parent_id, code, dict_key, dict_value, sort, remark from blade_dict where code = #{param1} and parent_id > 0 and is_sealed = 0 and is_deleted = 0
+        select id, parent_id, code, dict_key, dict_value, sort, remark from blade_dict where code = #{param1} and parent_id > 0 and is_sealed = 0 and is_deleted = 0 order by sort
     </select>
 
     <select id="tree" resultMap="treeNodeResultMap">