Преглед на файлове

后管元素表回显、元素库必填项,质检必填项检测提示

lvy преди 1 седмица
родител
ревизия
97b07a9479
променени са 13 файла, в които са добавени 411 реда и са изтрити 59 реда
  1. 9 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsFormElement.java
  2. 1 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTreeContract.java
  3. 4 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TreeNodeVOByTabType.java
  4. 5 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsNodeTableVO.java
  5. 19 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractLazyVO.java
  6. 19 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractTreeAllVO.java
  7. 237 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  8. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.xml
  9. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeContractService.java
  10. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java
  11. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  12. 108 18
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  13. 2 35
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

+ 9 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsFormElement.java

@@ -84,4 +84,13 @@ public class WbsFormElement extends BaseEntity {
     @ApiModelProperty(value = "是否辅助(1-是,0-不是)")
     private Integer assist;
 
+    /**
+     * 是否必填,0否、1是。默认0
+     */
+    @ApiModelProperty(value = "是否必填,0否、1是。默认0")
+    private Integer required;
+
+    @ApiModelProperty(value = "是否忽略")
+    private String nodeIgnore;
+
 }

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

@@ -328,7 +328,7 @@ public class WbsTreeContract extends BaseEntity {
     @JsonProperty(value = "treePId")
     private Long treePId;
 
-    @ApiModelProperty(value = "是否完成日期填写 1是 2否")
+    @ApiModelProperty(value = "是否完成日期填写/必填。1无,2缺少日期,3缺少必要数据,4:缺少日期和必要数据")
     private Integer dateIsComplete;
 
     @ApiModelProperty(value = "导入Id")

+ 4 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TreeNodeVOByTabType.java

@@ -26,5 +26,9 @@ public class TreeNodeVOByTabType extends BaseNode<TreeNode> {
     private String tableType;
     private String tableOwner;
     private String isLinkTable;
+    /**
+     * 元素表名称
+     */
+    private String elementTableName;
 
 }

+ 5 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsNodeTableVO.java

@@ -27,6 +27,11 @@ public class WbsNodeTableVO implements Serializable {
      */
     private String tableName;
 
+    /**
+     * 元素表名称
+     */
+    private String elementTableName;
+
     /**
      * 排序
      */

+ 19 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractLazyVO.java

@@ -136,7 +136,7 @@ public class WbsTreeContractLazyVO implements Serializable {
     @ApiModelProperty(value = "关联后管节点ID")
     private Long isTypePrivatePid;
 
-    @ApiModelProperty(value = "是否完成日期填写1是2否")
+    @ApiModelProperty(value = "是否完成日期填写/必填。1无,2缺少日期,3缺少必要数据,4:缺少日期和必要数据")
     private Integer dateIsComplete;
 
     @ApiModelProperty(value = "是否最近同步节点")
@@ -144,4 +144,22 @@ public class WbsTreeContractLazyVO implements Serializable {
 
     @ApiModelProperty(value = "是否收藏")
     private Integer isCollect;
+
+    public void updateDateIsComplete(String tableOwner){
+        if (this.getDateIsComplete() != null && this.getDateIsComplete() > 1 && tableOwner != null) {
+            if (tableOwner.contains("1")) {
+                if (this.getDateIsComplete() == 2 || this.getDateIsComplete() == 4) {
+                    this.setDateIsComplete(2);
+                } else {
+                    this.setDateIsComplete(1);
+                }
+            } else if (tableOwner.contains("2")) {
+                if (this.getDateIsComplete() == 3 || this.getDateIsComplete() == 4) {
+                    this.setDateIsComplete(2);
+                } else {
+                    this.setDateIsComplete(1);
+                }
+            }
+        }
+    }
 }

+ 19 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractTreeAllVO.java

@@ -41,7 +41,7 @@ public class WbsTreeContractTreeAllVO implements INode<WbsTreeContractTreeAllVO>
     @ApiModelProperty(value = "是否为自定义新增节点 1=是")
     private Integer isCustom;
 
-    @ApiModelProperty(value = "是否完成日期填写 1是 2否")
+    @ApiModelProperty(value = "是否完成日期填写/必填。1无,2缺少日期,3缺少必要数据,4:缺少日期和必要数据")
     private Integer dateIsComplete;
 
     @ApiModelProperty(value = "是否为自定义新增节点 1=是")
@@ -74,4 +74,22 @@ public class WbsTreeContractTreeAllVO implements INode<WbsTreeContractTreeAllVO>
     public Boolean getHasChildren() {
         return hasChildren;
     }
+
+    public void updateDateIsComplete(String tableOwner){
+        if (this.getDateIsComplete() != null && this.getDateIsComplete() > 1 && tableOwner != null) {
+            if (tableOwner.contains("1")) {
+                if (this.getDateIsComplete() == 2 || this.getDateIsComplete() == 4) {
+                    this.setDateIsComplete(2);
+                } else {
+                    this.setDateIsComplete(1);
+                }
+            } else if (tableOwner.contains("2")) {
+                if (this.getDateIsComplete() == 3 || this.getDateIsComplete() == 4) {
+                    this.setDateIsComplete(2);
+                } else {
+                    this.setDateIsComplete(1);
+                }
+            }
+        }
+    }
 }

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

@@ -81,6 +81,7 @@ import org.springframework.http.MediaType;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.mock.web.MockMultipartFile;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
@@ -1016,6 +1017,7 @@ public class ExcelTabController extends BladeController {
                     keyNames.attr("placeholder", textdictInfoVO.getSigRoleName());
                 }
             }
+            setTableTips(wbsTreeContract, table);
             fileInputStream.close();
             return R.data(table + "");
         } catch (Exception e) {
@@ -1023,6 +1025,197 @@ public class ExcelTabController extends BladeController {
         }
     }
 
+    private void setTableTips(WbsTreeContract tableNode, Element tableHtml) {
+        if (tableNode == null || tableHtml == null) {
+            return;
+        }
+        AtomicInteger status = new AtomicInteger(1);
+        String tableName = tableNode.getInitTableName();
+        List<Map<String, Object>> valueMapList = jdbcTemplate.queryForList("select * from " + tableName + " where p_key_id = " + tableNode.getPKeyId());
+        Map<String, Object> map;
+        if (CollectionUtil.isEmpty(valueMapList) ||  CollectionUtil.isEmpty(valueMapList.get(0))) {
+            map = new HashMap<>();
+        } else {
+            map = valueMapList.get(0);
+            DataStructureFormatUtils.parseDataByKey( map);
+        }
+        List<WbsFormElement> wbsFormElementList = jdbcTemplate.query("select * from m_wbs_form_element where f_id = ( select id from m_table_info where tab_en_name in ( '" + tableName + "' ) and is_deleted = 0) and is_deleted = 0 and (required = 1 or node_ignore is not null)",
+                new BeanPropertyRowMapper<>(WbsFormElement.class));
+        if (CollectionUtil.isEmpty(wbsFormElementList)) {
+            Elements elements = tableHtml.select("el-date-picker");
+            elements.forEach(element -> {
+                String keyname = element.attr("keyname");
+                String key = keyname.split("__")[0];
+                if (map.get(key)!= null) {
+                    String value = map.get(key).toString();
+                    if (value.contains("_^_")) {
+                        String[] split = value.split("☆");
+                        for (String s : split) {
+                            if (StringUtil.hasText(s.split("_\\^_")[0])) {
+                                return;
+                            }
+                        }
+                    }
+                }
+                status.set(2);
+                Elements parents = element.parents();
+                for (Element parent : parents) {
+                    if (parent.tagName().equals("td")) {
+                        if (parent.hasAttr("style")) {
+                            parent.attr("style", parent.attr("style") + "position: relative;");
+                        } else {
+                            parent.attr("style", "position: relative;");
+                        }
+                        break;
+                    }
+                }
+                element.before("<hc-tooltip :tipsStatus=\"" + true + "\" text=\"缺少日期\" keyname=\""+keyname +"\" @leftClick=\"changeTipsStatus\" typeKey=\"" + key + "\"/>");
+            });
+            updateCheckData(tableNode,status.get());
+            return;
+        }
+        Map<String, WbsFormElement> keyMap = wbsFormElementList.stream().collect(Collectors.toMap(WbsFormElement::getEKey, item -> item, (v1, v2) -> v1));
+        Map<Long, WbsFormElement> hasMap = new HashMap<>();
+        Elements elements = tableHtml.select("el-date-picker");
+        elements.forEach(element -> {
+            String keyname = element.attr("keyname");
+            String key = keyname.split("__")[0];
+            if (map.get(key)!= null) {
+                String value = map.get(key).toString();
+                if (value.contains("_^_")) {
+                    String[] split = value.split("☆");
+                    for (String s : split) {
+                        if (StringUtil.hasText(s.split("_\\^_")[0])) {
+                            return;
+                        }
+                    }
+                }
+            }
+            boolean flag = true;
+            if (keyMap.containsKey(key)) {
+                WbsFormElement wbsFormElement = keyMap.get(key);
+                if (wbsFormElement != null && wbsFormElement.getNodeIgnore() != null && wbsFormElement.getNodeIgnore().contains(tableNode.getPId() + "")) {
+                    flag = false;
+                }
+                if (wbsFormElement != null) {
+                    hasMap.put(wbsFormElement.getId(), wbsFormElement);
+                }
+            }
+            Elements parents = element.parents();
+            for (Element parent : parents) {
+                if (parent.tagName().equals("td")) {
+                    if (parent.hasAttr("style")) {
+                        parent.attr("style", parent.attr("style") + "position: relative;");
+                    } else {
+                        parent.attr("style", "position: relative;");
+                    }
+                    break;
+                }
+            }
+            element.before("<hc-tooltip :tipsStatus=\"" + flag + "\" text=\"缺少日期\" keyname=\""+keyname +"\" @leftClick=\"changeTipsStatus\" typeKey=\"" + key + "\"/>");
+            if (flag) {
+                status.set(2);
+            }
+        });
+
+        for (WbsFormElement wbsFormElement : wbsFormElementList) {
+            if (hasMap.containsKey(wbsFormElement.getId()) || wbsFormElement.getRequired() == null || wbsFormElement.getRequired() == 0) {
+                continue;
+            }
+            Object obj = map.get(wbsFormElement.getEKey());
+            if (obj!= null) {
+                String value = obj.toString();
+                if (value.contains("_^_")) {
+                    String[] split = value.split("☆");
+                    boolean hasText = false;
+                    for (String s : split) {
+                        if (StringUtil.hasText(s.split("_\\^_")[0])) {
+                            hasText = true;
+                            break;
+                        }
+                    }
+                    if (hasText) {
+                        continue;
+                    }
+                }
+            }
+            // 查找html中标签属性 keyname中包含 wbsFormElement.getEKey()的标签
+            Elements keyNames = tableHtml.getElementsByAttributeValueContaining("keyname", wbsFormElement.getEKey() + "__");
+            if (!keyNames.isEmpty()) {
+                keyNames.forEach(element -> {
+                    if ("el-date-picker".equals(element.tagName()) || "td".equals(element.tagName()) || "hc-tooltip".equals(element.tagName())) {
+                        return;
+                    }
+                    boolean flag = true;
+                    if (wbsFormElement.getNodeIgnore() != null && wbsFormElement.getNodeIgnore().contains(tableNode.getPId() + "")) {
+                        flag = false;
+                    }
+                    Elements parents = element.parents();
+                    for (Element parent : parents) {
+                        if (parent.tagName().equals("td")) {
+                            if (parent.hasAttr("style")) {
+                                parent.attr("style", parent.attr("style") + "position: relative;");
+                            } else {
+                                parent.attr("style", "position: relative;");
+                            }
+                            break;
+                        }
+                    }
+                    String keynameAttr = element.attr("keyname");
+                    element.before("<hc-tooltip :tipsStatus=\"" + flag + "\" text=\"此项为必填项\" keyname=\""+keynameAttr +"\" @leftClick=\"changeTipsStatus\" typeKey=\"" + wbsFormElement.getEKey() + "\"/>");
+                    if (flag) {
+                        if (status.get() == 2) {
+                            status.set(4);
+                        } else if (status.get() == 1) {
+                            status.set(3);
+                        }
+                    }
+                });
+            }
+        }
+        updateCheckData(tableNode,status.get());
+    }
+    @Async
+    public void updateCheckData(WbsTreeContract tableNode, Integer status) {
+        if (status >= 1) {
+            wbsTreeContractService.update(Wrappers.<WbsTreeContract>lambdaUpdate().set(WbsTreeContract::getDateIsComplete, status).eq(WbsTreeContract::getPKeyId, tableNode.getPKeyId()));
+            WbsTreeContract parentNode = wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, tableNode.getPId()));
+            wbsTreeContractService.checkNodeAllDate(parentNode);
+        }
+    }
+    @Async
+    public void checkTableAllData(WbsTreeContract node) {
+        List<WbsTreeContract> list = wbsTreeContractService.list(new LambdaQueryWrapper<>(WbsTreeContract.class).eq(WbsTreeContract::getPId, node.getPKeyId()).apply(" (is_buss_show <> 2 or is_buss_show is null)"));
+        list.forEach(table -> {
+            WbsTreeContract wbsTreeContract = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
+                    .eq(WbsTreeContract::getPKeyId, table.getPKeyId()));
+            if (wbsTreeContract == null) {
+                return;
+            }
+            if (wbsTreeContract.getHtmlUrl() == null) {
+                return;
+            }
+            try {
+                String fileUrl = wbsTreeContract.getHtmlUrl();
+                //如果有历史html就使用历史html
+                WbsTreeContractOldHtml one = wbsTreeContractOldHtmlService.getOne(Wrappers.<WbsTreeContractOldHtml>lambdaQuery()
+                        .eq(WbsTreeContractOldHtml::getContractFormId, table.getPKeyId())
+                        .eq(WbsTreeContractOldHtml::getIsDeleted, 0)
+                        .last("limit 1"));
+                if(one != null && StringUtils.isNotEmpty(one.getOldHtmlUrl())){
+                    fileUrl = one.getOldHtmlUrl();
+                }
+                InputStream fileInputStream = FileUtils.getInputStreamByUrl(fileUrl);
+                String htmlString = IoUtil.readToString(fileInputStream);
+                Document doc = Jsoup.parse(htmlString);
+                Element tableElement = doc.select("table").first();
+                setTableTips(wbsTreeContract, tableElement);
+                fileInputStream.close();
+            } catch (Exception e) {
+            }
+        });
+    }
+
     /**
      * 后管清表生成html
      */
@@ -2472,7 +2665,8 @@ public class ExcelTabController extends BladeController {
         //检查当前节点下所有的未隐藏的表单日期是否填写完整
         WbsTreeContract contract = wbsTreeContractService.getById(Long.parseLong(nodeId));
         if(contract!=null){
-            wbsTreeContractService.checkNodeAllDate(contract);
+//            wbsTreeContractService.checkNodeAllDate(contract);
+            checkTableAllData(contract);
         }
         executionTime.info("----数据保存完毕 ----");
         //发生异常后直接返回,不进行合并
@@ -5362,4 +5556,46 @@ public class ExcelTabController extends BladeController {
         return R.data(excelTabService.getWbsTreeExcelTab(id,nodeId));
     }
 
+
+    @GetMapping("/ignoreTips")
+    @ApiOperationSupport(order = 30)
+    @ApiOperation(value = "忽略必填提示", notes = "忽略必填提示")
+    public R<Boolean> ignoreTips(@RequestParam Long pkeyId, @RequestParam String key) {
+        if (key == null) {
+            throw new ServiceException("参数错误");
+        }
+        WbsTreeContract table = wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, pkeyId));
+        if (table == null) {
+            throw new ServiceException("没有找到表单");
+        }
+        List<org.springblade.manager.entity.TableInfo> tableInfos = tableInfoService.list(Wrappers.<org.springblade.manager.entity.TableInfo>lambdaQuery().eq(org.springblade.manager.entity.TableInfo::getTabEnName, table.getInitTableName()));
+        if (tableInfos == null || tableInfos.isEmpty()) {
+            return R.fail("没有找到关联元素");
+        }
+        org.springblade.manager.entity.TableInfo tableInfo = tableInfos.get(0);
+        if (key.contains("__")) {
+            key = key.split("__")[0];
+        }
+        List<WbsFormElement> list = wbsFormElementService.list(Wrappers.<WbsFormElement>lambdaQuery().eq(WbsFormElement::getFId, tableInfo.getId()).eq(WbsFormElement::getEKey, key));
+        if (list == null || list.isEmpty()) {
+            return R.fail("没有找到关联元素");
+        }
+        WbsFormElement element = list.get(0);
+        String sql= "";
+        if (element.getNodeIgnore() == null || !element.getNodeIgnore().contains(table.getPId() + "")) {
+            element.setNodeIgnore(element.getNodeIgnore() == null ? table.getPId() + "" : element.getNodeIgnore() + "," + table.getPId());
+            sql = " node_ignore = CONCAT(if(node_ignore is null,'',node_ignore), " + "'," + table.getPId() + "')";
+        } else {
+            element.setNodeIgnore(element.getNodeIgnore().replace(table.getPId() + "", ""));
+            sql = " node_ignore = REPLACE(node_ignore, " + "'," + table.getPId() + "', '')";
+        }
+        wbsFormElementService.update(Wrappers.<WbsFormElement>lambdaUpdate().eq(WbsFormElement::getId, element.getId()).setSql( sql));
+        asyncUpdateCheckStatus(pkeyId);
+        return R.data(true);
+    }
+
+    @Async
+    public void asyncUpdateCheckStatus(Long pkeyId) {
+        this.getExcelHtmlByBuss(pkeyId);
+    }
 }

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

@@ -419,6 +419,7 @@
                                as tableElementKey,
                init_table_name as initTableName,
                b.parent_id     as nodeId
+               ,a.required
         from m_wbs_form_element a
                  inner join m_wbs_tree b on a.f_id = b.init_table_id
         where b.id = #{id}
@@ -438,6 +439,7 @@
                                as tableElementKey,
                init_table_name as initTableName,
                b.parent_id     as nodeId
+                ,a.required
         from m_wbs_form_element a
                  inner join m_wbs_tree_private b on a.f_id = b.init_table_id
         where b.p_key_id = #{id}
@@ -452,6 +454,7 @@
              , e_length
              , e_allow_deviation
              , e_Inspection_method
+             ,b.required
              , CONCAT(a.tab_en_name, ':', e_key) as
                                                     tableElementKey
              , a.tab_en_name                     as initTableName,

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

@@ -93,7 +93,7 @@ public interface IWbsTreeContractService extends BaseService<WbsTreeContract> {
 
     EKeyDto getEKey(String contractId, Long pKeyId, String wbsId);
 
-    boolean checkNodeAllDate(WbsTreeContract contract);
+    Boolean checkNodeAllDate(WbsTreeContract contract);
 
     Integer findIsExistTreeNode(List<String> ids);
 

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

@@ -556,6 +556,7 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
                                             } else {
                                                 vo.setIsCollect(0);
                                             }
+                                            vo.updateDateIsComplete(tableOwner);
                                         }
                                         return vo;
                                     }).collect(Collectors.toList());
@@ -731,6 +732,7 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
                                                 } else {
                                                     vo.setIsCollect(0);
                                                 }
+                                                vo.updateDateIsComplete(tableOwner);
                                             }
                                             return vo;
                                         }).collect(Collectors.toList());

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

@@ -3226,7 +3226,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         updateWrapper.in("p_key_id", pkeyId + "");
         updateWrapper.set("pdf_url", fileUrl);
         updateWrapper.set("real_fill_rate", realFillRate);
-        updateWrapper.set("date_is_complete", dateFlag?1:2);
+//        updateWrapper.set("date_is_complete", dateFlag?1:2);
         wbsTreeContractService.update(updateWrapper);
         //
         String sql="SELECT parent.* FROM m_wbs_tree_contract child JOIN m_wbs_tree_contract parent ON child.p_id = parent.p_key_id WHERE child.p_key_id ="+pkeyId+" AND child.contract_id = parent.contract_id AND child.project_id = parent.project_id";

+ 108 - 18
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -3543,24 +3543,26 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
     }
 
     @Override
-    public boolean checkNodeAllDate(WbsTreeContract contract) {
-        List<Integer> tableOwners = new ArrayList<>();
-        if (StringUtils.isEmpty(contract.getTableOwner())) {
-            tableOwners.add(1);
-            tableOwners.add(2);
-            tableOwners.add(3);
-        } else if (contract.getTableOwner().contains("1") || contract.getTableOwner().contains("2") || contract.getTableOwner().contains("3")) {
-            tableOwners.add(1);
-            tableOwners.add(2);
-            tableOwners.add(3);
-        } else {
-            tableOwners.add(4);
-            tableOwners.add(5);
-            tableOwners.add(6);
-        }
-        List<WbsTreeContract> list = baseMapper.selectList(new LambdaQueryWrapper<>(WbsTreeContract.class).eq(WbsTreeContract::getPId, contract.getPKeyId()).in(WbsTreeContract::getTableOwner, tableOwners).ne(WbsTreeContract::getIsBussShow, 2));
+    @Async
+    public Boolean checkNodeAllDate(WbsTreeContract contract) {
+//        List<Integer> tableOwners = new ArrayList<>();
+//        if (StringUtils.isEmpty(contract.getTableOwner())) {
+//            tableOwners.add(1);
+//            tableOwners.add(2);
+//            tableOwners.add(3);
+//        } else if (contract.getTableOwner().contains("1") || contract.getTableOwner().contains("2") || contract.getTableOwner().contains("3")) {
+//            tableOwners.add(1);
+//            tableOwners.add(2);
+//            tableOwners.add(3);
+//        } else {
+//            tableOwners.add(4);
+//            tableOwners.add(5);
+//            tableOwners.add(6);
+//        }
+                checkTableRequired(contract);
+        List<WbsTreeContract> list = baseMapper.selectList(new LambdaQueryWrapper<>(WbsTreeContract.class).eq(WbsTreeContract::getPId, contract.getPKeyId()).apply(" (is_buss_show <> 2 or is_buss_show is null)"));//.in(WbsTreeContract::getTableOwner, tableOwners);
         if (!list.isEmpty()) {
-            boolean b = list.stream().anyMatch(w -> w.getDateIsComplete() != null && w.getDateIsComplete() == 2);
+            boolean b = list.stream().anyMatch(w -> w.getDateIsComplete() != null && w.getDateIsComplete() > 1);
             String ancestorsPId = contract.getAncestorsPId();
             if (ancestorsPId.startsWith("0,")) {
                 ancestorsPId = ancestorsPId.substring(2);
@@ -3572,7 +3574,23 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
             UpdateWrapper<WbsTreeContract> updateWrapper = new UpdateWrapper<>();
             updateWrapper.in("p_key_id", longList);
             if (b) {
-                updateWrapper.set("date_is_complete", 2);
+                List<Integer> collect = list.stream().filter(item -> item.getDateIsComplete() != null && item.getDateIsComplete() > 1 && (item.getStatus() == null || item.getStatus() == 1)).map(item -> {
+                    String tableOwner = item.getTableOwner();
+                    if (tableOwner != null && (tableOwner.contains("1") || tableOwner.contains("2") || tableOwner.contains("3"))) {
+                        return 1;
+                    }
+                    if (tableOwner != null && (tableOwner.contains("4") || tableOwner.contains("5") || tableOwner.contains("6"))) {
+                        return 2;
+                    }
+                    return 0;
+                }).collect(Collectors.toList());
+                if (collect.contains(1) && collect.contains(2)) {
+                    updateWrapper.set("date_is_complete", 4);
+                } else if (collect.contains(2)) {
+                    updateWrapper.set("date_is_complete", 3);
+                } else {
+                    updateWrapper.set("date_is_complete", 2);
+                }
             } else {
                 updateWrapper.set("date_is_complete", 1);
             }
@@ -3580,6 +3598,78 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         }
         return true;
     }
+    private void checkTableRequired(WbsTreeContract parentNode){
+        List<WbsTreeContract> list = this.list(Wrappers.<WbsTreeContract>lambdaUpdate().eq(WbsTreeContract::getPId, parentNode.getPKeyId())
+                .ne(WbsTreeContract::getIsBussShow, 2));
+        if (!list.isEmpty()) {
+            // 获取元素信息
+            Set<String> tableNames = list.stream().map(WbsTreeContract::getInitTableName).filter(StringUtil::hasText).collect(Collectors.toSet());
+            List<TableInfo> tableInfoList = tableInfoMapper.selectList(Wrappers.<TableInfo>lambdaQuery().in(TableInfo::getTabEnName, tableNames).eq(TableInfo::getIsDeleted, 0));
+            if (tableInfoList == null || tableInfoList.isEmpty()) {
+                return;
+            }
+            Set<Long> fIds = tableInfoList.stream().map(TableInfo::getId).collect(Collectors.toSet());
+            List<WbsFormElement> elements = wbsFormElementMapper.selectList(Wrappers.<WbsFormElement>lambdaQuery().in(WbsFormElement::getFId, fIds).eq(WbsFormElement::getRequired, 1).eq(WbsFormElement::getIsDeleted, 0));
+            if (elements.isEmpty()) {
+                return;
+            }
+            Map<String, Long> tableMap = tableInfoList.stream().collect(Collectors.toMap(TableInfo::getTabEnName, TableInfo::getId, (k1, k2) -> k1));
+            Map<String, List<WbsFormElement>> map = elements.stream().collect(Collectors.groupingBy(WbsFormElement::getFId));
+            for (WbsTreeContract node : list) {
+                String tableName = node.getInitTableName();
+                if (!StringUtil.hasText(tableName)) {
+                    continue;
+                }
+                Long fId = tableMap.get(tableName);
+                if (fId == null) {
+                    continue;
+                }
+                List<WbsFormElement> elements1 = map.get(fId.toString());
+                if (elements1 == null || elements1.isEmpty()) {
+                    continue;
+                }
+                List<Map<String, Object>> valueMapList = jdbcTemplate.queryForList("select * from " + tableName + " where p_key_id = " + node.getPKeyId() + " order by id desc limit 1");
+                if (valueMapList.isEmpty()) {
+                    return;
+                }
+                Map<String, Object> valueMap = valueMapList.get(0);
+                if (valueMap == null || valueMap.isEmpty()) {
+                    return;
+                }
+                DataStructureFormatUtils.parseDataByKey(valueMap);
+                boolean flag = true;
+                for (WbsFormElement element : elements1) {
+                    if (element.getNodeIgnore() != null && element.getNodeIgnore().contains(parentNode.getPKeyId() + "")) {
+                        continue;
+                    }
+                    Object o = valueMap.get(element.getEKey());
+                    if (o == null) {
+                        flag = false;
+                        break;
+                    }
+                    String value = o.toString();
+                    if (!StringUtil.hasText( value) || !value.contains("_^_")) {
+                        flag = false;
+                        break;
+                    }
+                    String[] split = value.split("☆");
+                    for (String s : split) {
+                        if (!StringUtil.hasText(s.split("_\\^_")[0])) {
+                            flag = false;
+                            break;
+                        }
+                    }
+                    if (!flag) {
+                        break;
+                    }
+                }
+                if (!flag) {
+                    this.update(Wrappers.<WbsTreeContract>lambdaUpdate().eq(WbsTreeContract::getPKeyId, node.getPKeyId())
+                            .setSql("date_is_complete = ifnull(date_is_complete,1) + 2").apply(" (date_is_complete is null or date_is_complete <= 2)"));
+                }
+            }
+        }
+    }
 
     @Override
     public Integer findIsExistTreeNode(List<String> ids) {

+ 2 - 35
blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

@@ -944,24 +944,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                                 } else {
                                     lazyNodeVO.setIsCollect(0);
                                 }
-//                                lazyNodeVO.setSubmitCounts(cn.hutool.core.util.ObjectUtil.isNotEmpty(countMap.get(lazyNodeVO.getPKeyId())) ? countMap.get(lazyNodeVO.getPKeyId()) : (cn.hutool.core.util.ObjectUtil.isNotEmpty(queryInfoMaps.get(lazyNodeVO.getPKeyId())) ? 1 : 0));
-
-//                                if (lazyNodeVO.getSubmitCounts().equals(0)) {
-//                                    lazyNodeVO.setColorStatus(1);
-//                                    continue;
-//                                }
-//
-//                                Integer parentColorStatus = nodeColorStatusMap.get(lazyNodeVO.getPKeyId());
-//                                if (parentColorStatus != null) {
-//                                    lazyNodeVO.setColorStatus(parentColorStatus);
-//                                } else {
-//                                    WbsTreeContractLazyVO lowestNode = lowestNodesMap.get(lazyNodeVO.getPKeyId());
-//                                    if (lowestNode != null) {
-//                                        lazyNodeVO.setColorStatus(lowestNode.getColorStatus());
-//                                    }
-//                                }
-
-//                            }
+                            lazyNodeVO.updateDateIsComplete(tableOwner);
                         }
                         if(CollectionUtil.isNotEmpty(ids)){
                             lazyNodes.forEach(f -> f.setIsSync(ids.contains(f.getPKeyId().toString()) ? 1 : 0));
@@ -1090,23 +1073,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                                         } else {
                                             lazyNodeVO.setIsCollect(0);
                                         }
-//                                        lazyNodeVO.setSubmitCounts(cn.hutool.core.util.ObjectUtil.isNotEmpty(countMap.get(lazyNodeVO.getPKeyId())) ? countMap.get(lazyNodeVO.getPKeyId()) : (cn.hutool.core.util.ObjectUtil.isNotEmpty(queryInfoMaps.get(lazyNodeVO.getPKeyId())) ? 1 : 0));
-//                                        if (lazyNodeVO.getSubmitCounts().equals(0)) {
-//                                            lazyNodeVO.setColorStatus(1);
-//                                            continue;
-//                                        }
-//
-//                                        Integer parentColorStatus = nodeColorStatusMap.get(lazyNodeVO.getPKeyId());
-//                                        if (parentColorStatus != null) {
-//                                            lazyNodeVO.setColorStatus(parentColorStatus);
-//                                        } else {
-//                                            WbsTreeContractLazyVO lowestNode = lowestNodesMap.get(lazyNodeVO.getPKeyId());
-//                                            if (lowestNode != null) {
-//                                                lazyNodeVO.setColorStatus(lowestNode.getColorStatus());
-//                                            }
-//                                        }
-
-//                                    }
+                                        lazyNodeVO.updateDateIsComplete(tableOwner);
                                 }
                                 lazyNodesAll.addAll(lazyNodes);
                             }