Browse Source

修改数据

hongchuangyanfa 2 years ago
parent
commit
45a07b8c55

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

@@ -189,7 +189,8 @@ public class WbsTreeContract extends BaseEntity {
     /**
      * 用户端是否隐藏
      */
-    @ApiModelProperty(value = "用户端是否隐藏")
+
+    @ApiModelProperty(name = "is_buss_show", value = "is_buss_show")
     private Integer isBussShow;
 
 

+ 6 - 0
blade-service/blade-manager/src/main/java/com/mixsmart/utils/StringUtils.java

@@ -1467,6 +1467,12 @@ public class StringUtils {
 		return max;
 	}
 
+/*	public static void main(String[] args) {
+		System.out.println(getScale(5.0));
+		System.out.println(getScale(5.01));
+		System.out.println(getScale(5.2001));
+		System.out.println(getScale(5.20010));
+	}*/
 
 
 }

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

@@ -188,15 +188,31 @@ public class LinkdataInfoController extends BladeController {
 		}else{
 			// 获取元素基本信息
 			WbsFormElement wbsFormElement = wbsFormElementService.getById(linkdataInfo.getHtmlType());
-			String enName = wbsFormElement.getEName().replaceAll("[^\u4E00-\u9FA5_]", "");
+			String enName = wbsFormElement.getEName();
 			String dataInfo2 =wbsFormElement.getEKey()+"__"+linkdataInfo.getTrIndex()+"_"+linkdataInfo.getTdIndex() ;
-			element.children().get(0)
-					.removeAttr("placeholder").removeAttr("keyName").removeAttr("weighing").removeAttr("v-model").removeAttr("@focus").
-					attr("placeholder",enName)
-					.attr("keyName",dataInfo2)
-					.attr("weighing","100")
-					.attr("v-model","formData."+dataInfo2)
-					.attr("@focus","getInformation('"+enName+"',"+linkdataInfo.getTrIndex()+","+linkdataInfo.getTdIndex()+")");
+			Element element1=element1 = element.children().get(0);
+
+
+
+			if(element.html().indexOf("el-tooltip")>=0){
+				element1.removeAttr("placeholder");
+				element1.removeAttr("keyName");
+				element1.removeAttr("weighing");
+				element1.removeAttr("v-model");
+				element1.removeAttr("@focus");
+				element1 = element.children().get(0).children().get(0);
+			}
+			element1.removeAttr("placeholder");
+			element1.removeAttr("keyName");
+			element1.removeAttr("weighing");
+			element1.removeAttr("v-model");
+			element1.removeAttr("@focus");
+
+			element1.attr("placeholder",enName).attr("keyName",dataInfo2);
+			element1.attr("weighing","100");
+			element1.attr("v-model","formData."+dataInfo2);
+			element1.attr("@focus","getInformation('"+enName+"',"+linkdataInfo.getTrIndex()+","+linkdataInfo.getTdIndex()+")");
+			System.out.println(element1);
 		}
 
 		File writefile = new File(wbsTreePrivate.getHtmlUrl());

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

@@ -87,8 +87,14 @@ public class TableFileController extends BladeController {
 				.eq(WbsTreeContract::getProjectId, wbsTreeContract.getProjectId())
 				.eq(WbsTreeContract::getId, wbsTreeContract.getParentId())
 		);
-
-		excelTabService.getBussPdfs(wbsTreeContractP.getPKeyId()+"",wbsTreeContract.getTableOwner(),wbsTreeContract.getContractId(),wbsTreeContract.getProjectId());
+		String classfy ="1";
+		String dataInfo = wbsTreeContract.getTableOwner();
+		if (dataInfo.equals("1")||dataInfo.equals("2")||dataInfo.equals("3")) {
+			classfy = "1";
+		} else if (dataInfo.equals("4")||dataInfo.equals("5")||dataInfo.equals("6")) {
+			classfy = "2";
+		}
+		excelTabService.getBussPdfs(wbsTreeContractP.getPKeyId()+"",classfy,wbsTreeContract.getContractId(),wbsTreeContract.getProjectId());
 		return R.status(true);
 	}
 

+ 71 - 38
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TextdictInfoController.java

@@ -27,6 +27,7 @@ import lombok.AllArgsConstructor;
 
 import javax.validation.Valid;
 
+import org.apache.commons.lang.StringUtils;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
@@ -57,6 +58,7 @@ import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -147,8 +149,32 @@ public class TextdictInfoController extends BladeController {
 	@PostMapping("/remove")
 	@ApiOperationSupport(order = 7)
 	@ApiOperation(value = "逻辑删除", notes = "传入ids")
-	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String id) {
-        textdictInfoService.deleDataInfoById(id);
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) throws FileNotFoundException {
+
+         TextdictInfo textdictInfo = textdictInfoService.getById(ids);
+        if(textdictInfo.getType()==5){
+            // 获取 节点信息
+            WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.getByPKeyId(Long.parseLong(textdictInfo.getTabId()));
+
+            // 读取html页面信息
+            File file1 = ResourceUtil.getFile(wbsTreePrivate.getHtmlUrl());
+            String htmlString = IoUtil.readToString(new FileInputStream(file1));
+            // 样式集合
+            Document doc = Jsoup.parse(htmlString);
+            //解析
+            Element table = doc.select("table").first();
+            Elements trs = table.select("tr");
+            String trtd[] = textdictInfo.getColKey().split("__");
+            Element element = trs.get(Integer.parseInt(trtd[1].split("_")[0])).select("td").get(Integer.parseInt(trtd[1].split("_")[1]));
+            if(element.html().indexOf("el-tooltip")>=0){
+                Element newele = element.children().get(0).children().get(0);
+                element.empty().append(newele+"");
+                File writefile = new File(wbsTreePrivate.getHtmlUrl());
+                FileUtil.writeToFile(writefile, doc.html(), Boolean.parseBoolean("UTF-8"));
+            }
+        }
+
+        textdictInfoService.deleDataInfoById(ids);
 		return R.success("成功");
 	}
 
@@ -184,29 +210,25 @@ public class TextdictInfoController extends BladeController {
         String placeholder = element.children().get(0).attr("placeholder").replaceAll("[^(\u4E00-\u9FA5_)]", "");
         String keyname = element.children().get(0).attr("keyname");
         String weighing = element.children().get(0).attr("weighing");
-
+        System.out.println(y2);
         String parm = trindex + "," + tdindex + "," + x1 + "," + x2 + "," + y1 + "," + y2 + ",$event";
         String oncklickText = "'" + placeholder + "'," + trindex + "," + tdindex;
 
         String vmode = "formData." + keyname;
         if (textdictInfo.getTextId().equals("input")) { // 单选框
             element.empty().append("<el-input type='text' v-model=" + vmode + " placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%' > </el-input>");
-            element.children().get(0).attr("@focus", "getInformation(" + oncklickText + ")");
         } else if (textdictInfo.getTextId().equals("textarea")) { // 文本域
             int rowspan = element.attr("ROWSPAN").equals("") ? 0 : Integer.parseInt(element.attr("ROWSPAN"));
-            //@focus='getInformation("+oncklickText+")'
             element.empty().append("<el-input :rows=" + rowspan * 2 + "  type='textarea' placeholder=" + placeholder + " v-model=" + vmode + "    keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'  > </el-input>");
-            element.children().get(0).attr("@focus", "getInformation(" + oncklickText + ")");
         } else if (textdictInfo.getTextId().equals("select")) { // 下拉框
             String selectText = " <el-select v-model=" + vmode + " keyname=" + keyname + " weighing=" + weighing + " placeholder=" + placeholder + " trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">"; //v-model="+keyname+"
             List<TextdictInfo_vo> optionList = textdictInfo.getTextInfo();
             if (optionList != null && optionList.size() >= 1) {
                 for (int i = 0; i < optionList.size(); i++)
-                    selectText += "<el-option  :key='" + i + "' :label='" + optionList.get(i).getDictValue() + "'   :value='" + i + "' > </el-option>";
+                    selectText += "<el-option  key='" + i + "' label='" + optionList.get(i).getDictValue() + "'   value='" + i + "' > </el-option>";
             }
             selectText += "</el-select>";
             element.empty().append(selectText);
-            element.children().get(0).attr("@focus", "getInformation(" + oncklickText + ")");
         } else if (textdictInfo.getTextId().equals("radio")) { // 单选按钮
 
             String radioText = "<template v-model=" + vmode + " keyname=" + keyname + " weighing=" + weighing + " placeholder=" + placeholder + " trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">";
@@ -217,40 +239,33 @@ public class TextdictInfoController extends BladeController {
             }
             radioText += "</template>";
             element.empty().append(radioText);
-            element.children().get(0).attr("v-on:click", "getInformation(" + oncklickText + ")");
-            element.attr("tabindex", "-1");
         } else if (textdictInfo.getTextId().equals("checkbox")) { // 多选框
-
-            String checkbox = "<template v-model=" + vmode + " keyname=" + keyname + " weighing=" + weighing + " placeholder=" + placeholder + " trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">";
             List<TextdictInfo_vo> optionList = textdictInfo.getTextInfo();
             if (optionList != null && optionList.size() >= 1) {
-                for (int i = 0; i < optionList.size(); i++)
-                    checkbox += "<el-checkbox>" + optionList.get(i).getDictValue() + "</el-checkbox>";
+                Integer[] data = new Integer[optionList.size()];
+                JSONArray objs = new JSONArray();
+
+                for (int i = 0; i < optionList.size(); i++){
+                    data[i]=i+1;
+                    JSONObject jsonObject = new JSONObject();
+                    jsonObject.put("key",i+1);
+                    jsonObject.put("name",optionList.get(i).getDictValue());
+                    objs.add(jsonObject);
+                }
+                String checkbox = "<hc-form-checkbox-group :objs="+objs+"  @change='checkboxGroupChange' :val=" + vmode + " v-model=" + vmode + " keyname=" + keyname + " weighing=" + weighing + " placeholder=" + placeholder + " trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + "> </hc-form-checkbox-group>";
+                element.empty().append(checkbox);
             }
-            checkbox += "</template>";
-            element.empty().append(checkbox);
-            element.children().get(0).attr("@focus", "getInformation(" + oncklickText + ")");
-            element.attr("tabindex", "-1");
         } else if (textdictInfo.getTextId().equals("date")) { // 日期
-
             element.empty().append("<el-date-picker v-model=" + vmode + " type='date' format='YYYY年MM月DD日' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-date-picker>");
-            element.children().get(0).attr("@focus", "getInformation(" + oncklickText + ")");
-
         } else if (textdictInfo.getTextId().equals("daterange")) { // 时间段
             element.empty().append("<el-date-picker  v-model=" + vmode + " type='datetimerange' placeholder=" + placeholder + "  start-placeholder='开始日期'  end-placeholder='结束日期' format='YYYY年MM月DD日' trIndex=" + trindex + " keyname=" + keyname + " weighing=" + weighing + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">");
-            element.children().get(0).attr("@focus", "getInformation(" + oncklickText + ")");
             element.children().get(0).attr("@change", "datePickerChange($event,'" + keyname + "')");
         } else if (textdictInfo.getTextId().equals("img")) {
-			/*element.empty().append("<el-upload :disabled='formUploadLoading' v-loading='formUploadLoading' element-loading-text='上传中...' :on-progress='uploadprogress' @exceed='formUploadExceed' :on-error='formUploadError' placeholder="+placeholder+" v-model="+vmode+" keyname="+keyname+" weighing="+weighing+"  class='hc-upload-table-form' action='/api/blade-resource/oss/endpoint/put-file' trIndex="+trindex+" tdIndex="+tdindex+"  x1="+x1+" x2="+x2+" y1="+y1+" y2="+y2+"  accept='image/png,image/jpg,image/jpeg' :headers='getTokenHeader' :show-file-list='false' > <img v-if='"+vmode+"' :src="+vmode+" class='hc-table-form-img' /> <div class='hc-table-form-icon' v-else> 点此选择文件并上传 </div> <div v-if="+vmode+" class='hc-table-form-del' >" +
-					"        <el-button type='danger'"+ " plain @click.stop=delTableFormFile('"+keyname+"')>删除当前文件</el-button> " +
-					"    </div></el-upload>");*/
-
-            element.empty().append("<hc-table-form-upload :src='" + vmode + "' placeholder=" + placeholder + " v-model=" + vmode + "  keyName=" + keyname + " weighing=" + weighing + "  @success='formUploadSuccess' @del='delTableFormFile' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + "/> ");
-
-            //element.children().get(0);
-            element.attr("@focus", "getInformation(" + oncklickText + ")");
-            element.attr("tabindex", "-1");
+            element.empty().append("<hc-table-form-upload :src='" + vmode + "' placeholder=" + placeholder + " v-model=" + vmode + "  keyName=" + keyname + " weighing=" + weighing + "  @success='formUploadSuccess' @del='delTableFormFile' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" +y2+"></hc-table-form-upload> ");
+        }else if (textdictInfo.getTextId().equals("searchSelect")) { //搜索框
+            element.empty().append("<hc-form-select-search type='dap_site_data' :val=" + vmode + " contractId=''  pkeyId='' @change='formRemoteChange' v-model=" + vmode + " placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%' > </hc-form-select-search>");
         }
+        element.attr("@click", "getInformation(" + oncklickText + ")");
         File writefile = new File(wbsTreePrivate.getHtmlUrl());
         FileUtil.writeToFile(writefile, doc.html(), Boolean.parseBoolean("UTF-8"));
         Thread.sleep(300);
@@ -263,6 +278,9 @@ public class TextdictInfoController extends BladeController {
             String clarSql = "update  " + tabName + " set " + keyname.split("__")[0] + "=null where p_key_id in(SELECT p_key_id FROM m_wbs_tree_contract WHERE id ='" + wbsTreePrivate.getId() + "' and project_id='" + wbsTreePrivate.getProjectId() + "' )";
             jdbcTemplate.execute(clarSql);
         }
+
+        //
+
         return R.success("操作成功");
     }
 
@@ -275,25 +293,40 @@ public class TextdictInfoController extends BladeController {
     public R<String> saveSigInfo(@Valid @RequestBody JSONObject dataInfo) throws IOException {
 
         JSONArray jsonArray = dataInfo.getJSONArray("dataInfo");
-        if(jsonArray==null || jsonArray.size()==0){
-            return R.fail("保存列表无任何数据");
-        }
-        Long tableId = jsonArray.getJSONObject(0).getLong("tabId");
-
+        Long tableId = dataInfo.getLong("tabId");
         // 删除
         textdictInfoService.getBaseMapper().delete(Wrappers.<TextdictInfo>query().lambda()
                 .eq(TextdictInfo::getTabId, tableId));
+        if(jsonArray==null || jsonArray.size()==0 ){
+            return R.fail("保存列表无任何数据");
+        }
 
         WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.getByPKeyId(tableId);
         // 读取html页面信息
         File file1 = ResourceUtil.getFile(wbsTreePrivate.getHtmlUrl());
         String htmlString = IoUtil.readToString(new FileInputStream(file1));
+
         // 样式集合
         Document doc = Jsoup.parse(htmlString);
+
         //解析
         Element table = doc.select("table").first();
         Elements trs = table.select("tr");
 
+        Elements onlyInfo = doc.select("el-input[readonly]");
+        if(onlyInfo!=null && onlyInfo.size()>=1){
+            for(Element element :onlyInfo ){
+                 element.removeAttr("readonly");
+             }
+        }
+
+        Elements tryInfo = doc.select("td[dqid]");
+        if(tryInfo!=null && tryInfo.size()>=1){
+            for(Element element :tryInfo ){
+                element.removeAttr("dqid");
+            }
+        }
+
         List<TextdictInfo> textdictInfos = new ArrayList<>();
 
         for (int i = 0; i < jsonArray.size(); i++) {
@@ -304,7 +337,7 @@ public class TextdictInfoController extends BladeController {
 
             String id = element.children().get(0).attr("keyname");
             textdictInfo.setName("电签位置配置");
-            textdictInfo.setType(2);
+            textdictInfo.setType(jsonObject.getInteger("type"));
             textdictInfo.setColKey(id);
             textdictInfo.setSigRoleId(jsonObject.getString("sigRoleId"));
             textdictInfo.setTabId(jsonObject.getString("tabId"));
@@ -316,7 +349,7 @@ public class TextdictInfoController extends BladeController {
             textdictInfoService.saveOrUpdate(textdictInfo);
             element.removeAttr("dqId");
             element.attr("dqId", textdictInfo.getId() + "");
-            element.children().get(0).attr("readonly", true);
+            element.children().get(0).attr("readonly","true");
         }
 
         // 写入 excel

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

@@ -114,6 +114,7 @@ public class WbsFormElementController extends BladeController {
     public void exportWbsTree(HttpServletResponse response) {
         List<WbsFormElementExcel> list = new ArrayList<>();
         ExcelUtil.export(response, "WBS元素模板", "WBS元素模板", list, WbsFormElementExcel.class);
+
     }
 
     /**

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

@@ -291,6 +291,7 @@ public class WbsTreePrivateController extends BladeController {
         return R.fail(200, "未查询到信息");
     }
 
+
     /**
      * 获取当前节点详情
      */
@@ -409,4 +410,23 @@ public class WbsTreePrivateController extends BladeController {
         return R.status(wbsTreePrivateService.syncNodeTable(primaryKeyId));
     }
 
+
+    /**
+     * wbs私有树懒加载获取项目私有节点树形结构--(表单类型划分树)
+     */
+    @GetMapping("/tab_Type_lazy-tree")
+    @ApiOperationSupport(order = 16)
+    @ApiOperation(value = "项目级懒加载节点树形结构-表单类型划分树", notes = "传入项目Id和父Id")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "parentId", value = "父级id", required = true),
+            @ApiImplicitParam(name = "projectId", value = "项目id", required = true),
+    })
+    public R<List<WbsTreePrivateVO>> tabTypeLazyTree(Long parentId, String projectId, BladeUser bladeUser, String tenantId) {
+        List<WbsTreePrivateVO> tree = wbsTreePrivateService.tabTypeLazyTree(parentId, projectId);
+        if (tree != null && tree.size() > 0) {
+            return R.data(tree);
+        }
+        return R.fail(200, "未查询到信息");
+    }
+
 }

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

@@ -19,7 +19,13 @@
     </resultMap>
 
     <select id="selectTextdictInfoPage" resultMap="textdictInfoResultMap">
-        select * from m_textdict_info where is_deleted = 0 and type =#{param2.type} and tab_id=#{param2.tabId}
+        select * from m_textdict_info where is_deleted = 0 and tab_id=#{param2.tabId}
+        <if test="param2.type== 2 ">
+          and type in('2','6')
+        </if>
+        <if test="param2.type!= 2 ">
+         and type =#{param2.type}
+        </if>
     </select>
 
 </mapper>

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

@@ -40,6 +40,8 @@ public interface WbsTreePrivateMapper extends EasyBaseMapper<WbsTreePrivate> {
 
     List<WbsTreePrivateVO> lazyTree(String wbsId, String tenantId, Long parentId, String projectId);
 
+    List<WbsTreePrivateVO> tabTypeLazyTree(Long parentId, String projectId);
+
     int updateByPKeyId(@Param("pKeyId") Long pKeyId, @Param("wbsTP") WbsTreePrivate wbsTP);
 
     WbsTreePrivate getByCondition(Long parentId, String projectId, String wbsId);

+ 28 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml

@@ -513,4 +513,32 @@
         ORDER BY wt.sort, wt.node_name, wt.create_time
     </select>
 
+    <!-- 项目级 表单类型分类 wbs树 -->
+    <select id="tabTypeLazyTree" resultMap="treeNodeResultMap">
+        SELECT *,
+               (
+                   SELECT
+                       CASE WHEN count(1) > 0 THEN 1 ELSE 0 END
+                   FROM
+                       (
+                           SELECT  '12345678910' as p_key_id , '表单类型' as node_name, 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)
+                           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
+                       ) b
+                   WHERE
+                       b.parent_id = a.id
+               ) AS "has_children"
+
+               from (
+            SELECT  '12345678910' as p_key_id , '表单类型' as node_name, 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)
+                 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
+           ) a where a.parent_id = #{parentId}
+    </select>
+
+
 </mapper>

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

@@ -23,6 +23,9 @@ public interface IWbsTreePrivateService extends BaseService<WbsTreePrivate> {
 
     List<WbsTreePrivateVO> lazyTree(String wbsId, String tenantId, Long parentId, String projectId);
 
+    // 项目级 表单类型划分
+    List<WbsTreePrivateVO> tabTypeLazyTree(Long parentId, String projectId);
+
     List<WbsTreePrivateDTO2> findWbsTreePrivateSameLevel(String projectId, String parentId, String wbsId);
 
     boolean wbsTreePrivateSort(List<WbsTreePrivateDTO2> wbsTreeDTO);

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

@@ -148,6 +148,12 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         return ForestNodeMerger.merge(baseMapper.lazyTree(wbsId, tenantId, parentId, projectId));
     }
 
+    @Override
+    public List<WbsTreePrivateVO> tabTypeLazyTree( Long parentId, String projectId) {
+        return ForestNodeMerger.merge(baseMapper.tabTypeLazyTree(parentId, projectId));
+    }
+
+
     @Override
     public List<WbsTreePrivateDTO2> findWbsTreePrivateSameLevel(String projectId, String parentId, String wbsId) {
         return baseMapper.selectNodeListByCondition(projectId, parentId, wbsId);

+ 43 - 0
blade-service/blade-manager/src/test/java/org/springblade/flow/test/launch/LauncherTestServiceImpl.java

@@ -0,0 +1,43 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.flow.test.launch;
+
+import org.springblade.common.constant.LauncherConstant;
+import org.springblade.core.auto.service.AutoService;
+import org.springblade.core.launch.service.LauncherService;
+import org.springblade.core.launch.utils.PropsUtil;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+
+import java.util.Properties;
+
+/**
+ * 启动参数拓展
+ *
+ * @author smallchil
+ */
+@AutoService(LauncherService.class)
+public class LauncherTestServiceImpl implements LauncherService {
+
+	@Override
+	public void launcher(SpringApplicationBuilder builder, String appName, String profile, boolean isLocalDev) {
+		Properties props = System.getProperties();
+		PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.server-addr", LauncherConstant.nacosAddr(profile));
+		PropsUtil.setProperty(props, "spring.cloud.nacos.config.server-addr", LauncherConstant.nacosAddr(profile));
+		PropsUtil.setProperty(props, "spring.datasource.dynamic.enabled", "false");
+	}
+
+}