ソースを参照

再次提交更改

admin 3 年 前
コミット
9c1fdcf5cc

+ 22 - 0
src/api/manager/projectinfo.js

@@ -30,6 +30,18 @@ export const getProjectDeatil = (id) => {
   })
 }
 
+export const getProjectDeatilWbsId = (id,ReferenceWbsTemplateId,ReferenceWbsTemplateType) => {
+  return request({
+    url: '/api/blade-manager/projectInfo/detail2',
+    method: 'get',
+    params: {
+      id,
+      ReferenceWbsTemplateId,
+      ReferenceWbsTemplateType
+    }
+  })
+}
+
 export const findWbsTreeList = (type) => {
   return request({
     url: '/api/blade-manager/projectInfo/findWbsTreeList',
@@ -59,3 +71,13 @@ export const submitWbsTreeInProject = (obj) => {
   })
 }
 
+export const removeProject = (ids) => {
+  return request({
+    url: '/api/blade-manager/projectInfo/remove',
+    method: 'post',
+    params: {
+      ids
+    }
+  })
+}
+

+ 1 - 1
src/api/manager/wbstree.js

@@ -53,7 +53,7 @@ export const remove = (ids) => {
     url: '/api/blade-manager/wbsTree/remove',
     method: 'post',
     params: {
-      ids,
+      id:ids,
     }
   })
 }

+ 8 - 1
src/styles/common.scss

@@ -118,4 +118,11 @@ a{
   justify-content: space-between;
   font-size: 14px;
   padding-right: 8px;
-}
+}
+
+.required:before{
+  content: "*";
+  color: #f56c6c;
+  margin-right: 4px;
+}
+

+ 70 - 14
src/views/manager/contractinfo/detail.vue

@@ -106,12 +106,15 @@
                   </el-form-item>
                 </el-col>
                 <el-col :span="12">
+                  <el-form-item label="实验室名称" prop="laboratoryName">
+                    <el-input v-model="contractForm.laboratoryName"></el-input>
+                  </el-form-item>
                 </el-col>
               </el-row>
               <el-divider></el-divider>
               <el-row :gutter="20">
                 <el-col :span="12">
-                  <div>组卷归档默认信息</div>
+                  <div class="head-font">组卷归档默认信息</div>
                     <el-row>
                       <el-col :span="12">
                         <el-form-item label="立卷人" prop="filer">
@@ -121,9 +124,7 @@
                       <el-col :span="12">
                         <el-form-item label="保管期限" prop="storagePeriod">
                           <el-select v-model="contractForm.storagePeriod" placeholder="请选择" class="w-100p">
-                            <el-option label="10年"  value="10年"></el-option>
-                            <el-option label="30年"  value="30年"></el-option>
-                            <el-option label="永久"  value="永久"></el-option>
+                            <el-option v-for="item in storagePeriodList" :key="item.id" :label="item.dictValue"  :value="item.dictKey"></el-option>
                           </el-select>
                         </el-form-item>
                       </el-col>
@@ -137,10 +138,7 @@
                       <el-col :span="12">
                         <el-form-item label="保管密级" prop="securityLevel">
                           <el-select v-model="contractForm.securityLevel" placeholder="请选择" class="w-100p">
-                            <el-option label="机密"  value="机密"></el-option>
-                            <el-option label="绝密"  value="绝密"></el-option>
-                            <el-option label="秘密"  value="秘密"></el-option>
-                            <el-option label="公开"  value="公开"></el-option>
+                            <el-option v-for="item in securityLevelList" :key="item.id" :label="item.dictValue"  :value="item.dictKey"></el-option>
                           </el-select>
                         </el-form-item>
                       </el-col>
@@ -157,7 +155,7 @@
                     </el-row>
                 </el-col>
                 <el-col :span="12">
-                  <div>附加信息</div>
+                  <div class="head-font">附加信息</div>
                     <el-form-item label="项目地址" prop="projectPlace">
                       <!-- <el-input v-model="contractForm.projectPlace" placeholder="点击后面地图选取地址">
                         <el-button slot="append" icon="el-icon-map-location" @click="mapDialogVisible = true"></el-button>
@@ -254,6 +252,7 @@
           submitWbsTreeInContract,getContractInfoTree} from "@/api/manager/contractinfo";
   import {getRoleTree} from "@/api/system/role";
   import {getDictionary} from "@/api/system/dict";
+  import {getDictionary as getDictbiz} from "@/api/system/dictbiz";
   import {remove as removeFile} from "@/api/resource/attach";
   import website from '@/config/website';
   import {Base64} from 'js-base64';
@@ -289,6 +288,12 @@
         }
         callback();
       };
+      var checkIsNumber = (rule, value, callback) => {
+        if (value != Number(value)) {
+          callback(new Error('金额必须是数字'));
+        }
+        callback();
+      };
 
       return {
         activeType:'1',
@@ -304,6 +309,8 @@
         projectInfo:{},
 
         contractTypeList:[],
+        storagePeriodList:[],//保管期限
+        securityLevelList:[],//保管密级
         fileList:[],
         headers:{},
         isBackShow:false,
@@ -330,6 +337,9 @@
           supervisionUnitName: [
             { required: true, message: '请输入监理单位名称', trigger: 'blur' },
           ],
+          laboratoryName: [
+            { required: true, message: '请输入实验室名称', trigger: 'blur' },
+          ],
           startStation: [
             { required: true, message: '请输入起始桩号', trigger: 'blur' },
           ],
@@ -344,6 +354,9 @@
           ],
           actualEndTime:[
             {validator: checkDate2,trigger: 'blur'},
+          ],
+          contractAmount:[
+            {validator: checkIsNumber,trigger: 'blur'}
           ]
         },
 
@@ -432,6 +445,8 @@
         }
 
         this.getContractTypeList();
+        this.getStoragePeriodList();
+        this.getSecurityLevelList();
         this.setHeaders();
       },
       beforeLeave(activeName, oldActiveName){
@@ -472,7 +487,8 @@
                   break;
               }
             }).catch(()=>{
-              reject();
+              this.typeChang[oldActiveName] = false;
+              resolve();
             })
           }else{
             resolve();
@@ -501,6 +517,9 @@
             if(this.contractForm.projectPlace){
               this.flageData = ['','',this.contractForm.projectPlace]
             }
+            if(Number(this.contractForm.contractAmount) < 0){
+              this.contractForm.contractAmount = 0;
+            }
             this.$nextTick(()=>{
               this.typeChang['1'] = false;
             })
@@ -512,11 +531,17 @@
 
       async saveQuit(){
         this.btnLoad = true;
-        if(this.activeType == '1'){
-          await this.savecontract();
-        }else if(this.activeType == '2'){
-          await this.saveWbsTree();
+        try {
+          if(this.activeType == '1'){
+            await this.savecontract();
+          }else if(this.activeType == '2'){
+            await this.saveWbsTree();
+          }
+        } catch (error) {
+          this.btnLoad = false;
+          return;
         }
+
         this.$message({
           type: "success",
           message: "保存成功!"
@@ -796,6 +821,33 @@
 
     mapChange(){
       this.$refs['contractForm'].validateField('projectPlace');
+    },
+
+    getStoragePeriodList(){
+      if(this.storagePeriodList.length >1){
+        return;
+      }
+      getDictbiz({
+        code:'storage_period'
+      }).then((res)=>{
+        res.data.data.forEach(element => {
+          element.dictKey = Number(element.dictKey)
+        });
+        this.storagePeriodList = res.data.data;
+      })
+    },
+    getSecurityLevelList(){
+      if(this.securityLevelList.length >1){
+        return;
+      }
+      getDictbiz({
+        code:'security_level'
+      }).then((res)=>{
+        res.data.data.forEach(element => {
+          element.dictKey = Number(element.dictKey)
+        });
+        this.securityLevelList = res.data.data;
+      })
     }
 
     }
@@ -807,4 +859,8 @@
     width: 100%;
     height: 300px;
   }
+  .head-font{
+    font-size: 20px;
+    font-weight:bold;
+  }
 </style>

+ 121 - 30
src/views/manager/projectinfo/detail.vue

@@ -37,7 +37,7 @@
                   <el-form-item label="项目概况" prop="projectGist">
                     <el-input v-model="projectForm.projectGist" type="textarea" :rows="7"></el-input>
                   </el-form-item>
-                  <el-form-item label="内置里程">
+                  <el-form-item label="内置里程" prop="projectAllMileage">
                     <el-radio-group v-model="radioType">
                       <el-radio-button label="总里程"></el-radio-button>
                       <el-radio-button label="路面"></el-radio-button>
@@ -146,7 +146,8 @@
 </template>
 
 <script>
-  import {submitProject,getProjectDeatil,findWbsTreeList,findProjectTree,submitWbsTreeInProject} from "@/api/manager/projectinfo";
+  import {submitProject,getProjectDeatil,findWbsTreeList,findProjectTree,
+          submitWbsTreeInProject,getProjectDeatilWbsId} from "@/api/manager/projectinfo";
   import {findContractByProjectId,saveUserInfoByProject,findUserListByCondition,
           findUserByName,removeUsersByIds} from "@/api/manager/contractinfo";
   import {getRoleTree} from "@/api/system/role";
@@ -176,6 +177,34 @@
         }
         callback();
       };
+      var checkIsNumber = (rule, value, callback) => {
+        if (value != Number(value)) {
+          callback(new Error('金额必须是数字'));
+        }
+        if (value && 999999999999999999 < Number(value)) {
+          callback(new Error('数字过大'));
+        }
+        callback();
+      };
+      var checkMileage = (rule, value, callback) => {
+        if (this.projectForm.projectPavement || this.projectForm.projectSubgrade) {
+          if(this.projectForm.projectPavement){
+            if(this.projectForm.projectPavement > value){
+              callback(new Error('总里程必须是最大的'));
+            }
+          }else if(this.projectForm.projectSubgrade){
+            if(this.projectForm.projectSubgrade > value){
+              callback(new Error('总里程必须是最大的'));
+            }
+          }
+          if(this.projectForm.projectPavement && this.projectForm.projectSubgrade){
+            if((this.projectForm.projectPavement + this.projectForm.projectSubgrade) > value){
+              callback(new Error('总里程必须大于两项总和'));
+            }
+          }
+        }
+        callback();
+      };
 
       return {
         activeType:'1',
@@ -205,6 +234,12 @@
           ],
           actualEndTime:[
             {validator: checkDate2,trigger: 'blur'}
+          ],
+          estimatedAmount:[
+            {validator: checkIsNumber,trigger: 'blur'}
+          ],
+          projectAllMileage:[
+            {validator: checkMileage,trigger: 'blur'}
           ]
         },
 
@@ -238,32 +273,14 @@
         },
         deep: true
       },
-      activeType: async function (newValue) {
+      activeType: function (newValue) {
         if(newValue == '3'){
           this.getContractList();
           this.getRoleList();
           this.getUserByCondition();
           this.getUserByName();
         }else if(newValue == '2'){
-          let refId = this.projectForm.referenceWbsTemplateId;
-          if(refId && refId>0){
-            //有引用id,回显
-            this.wbsId = refId;
-            this.selected = true;
-            let projectTree = await findProjectTree(this.projectForm.id,refId)
-            if(Array.isArray(projectTree.data.data)){
-              this.templateType = projectTree.data.data[0].wbsType;
-              let leftData = await getAlltree(this.userInfo.tenant_id,'1',refId)
-              if(Array.isArray(leftData.data.data)){
-                this.leftTreeData = leftData.data.data;
-              }else{
-                this.leftTreeData = [];
-              }
-              this.$refs.treetotree.setRightTree(projectTree.data.data);
-            }
-          }
-
-          this.getTreeList();
+          this.treeInit();
         }
       }
     },
@@ -326,7 +343,8 @@
                   break;
               }
             }).catch(()=>{
-              reject();
+              this.typeChang[oldActiveName] = false;
+              resolve();
             })
           }else{
               resolve();
@@ -337,19 +355,35 @@
      getProjectDeatil(){
         getProjectDeatil(this.id).then((res)=>{
           this.projectForm = res.data.data;
+          if(Number(this.projectForm.estimatedAmount) < 0){
+            this.projectForm.estimatedAmount = 0
+          }
           this.$nextTick(()=>{
             this.typeChang['1'] = false;
           })
+          let templateType = 'public';
+          if(this.projectForm.referenceWbsTemplateType){
+            templateType = this.projectForm.referenceWbsTemplateType;
+          }
+          getProjectDeatilWbsId(this.id,this.projectForm.referenceWbsTemplateId,templateType).then((res)=>{
+            this.projectForm.wbsType = res.data.data.wbsType;
+          })
         })
       },
 
      async saveQuit(){
        this.btnLoad = true;
-       if(this.activeType == '1'){
+       try {
+        if(this.activeType == '1'){
           await this.saveProject();
         }else if(this.activeType == '2'){
           await this.saveWbsTree();
         }
+       } catch (error) {
+         this.btnLoad = false;
+          return;
+       }
+
        this.$message({
           type: "success",
           message: "保存成功!"
@@ -359,12 +393,18 @@
      },
      async saveNext(type){
         this.btnLoad = true;
-        if(this.activeType == '1'){
-          let res = await this.saveProject();
-          this.projectForm.id = res.data.data.id;
-        }else if(this.activeType == '2'){
-          await this.saveWbsTree();
+        try {
+          if(this.activeType == '1'){
+            let res = await this.saveProject();
+            this.projectForm.id = res.data.data.id;
+          }else if(this.activeType == '2'){
+            await this.saveWbsTree();
+          }
+        } catch (error) {
+          this.btnLoad = false;
+          return;
         }
+        
         this.$message({
           type: "success",
           message: "保存成功!"
@@ -399,6 +439,7 @@
       obj = {
         wbsId:this.wbsId,
         projectId:this.projectForm.id,
+        wbsType:this.templateType,
         wbsTreeIds:ids
       }
       if(this.wbsId.toString().indexOf(',') >= 0){
@@ -407,7 +448,7 @@
           let ids = this.wbsId.toString().split(',');
           obj.wbsId = ids[0];
           obj.referencePrivateWbsProjectId = ids[1];
-          // obj.primaryKeyId = this.leftTreeData[0].primaryKeyId;
+          obj.primaryKeyId = this.leftTreeData[0].primaryKeyId;
         }else{
           //公有库
           obj.referenceType =  "public";
@@ -620,6 +661,56 @@
 
         this.wbsId = '';
         this.leftTreeData = [];
+      },
+      async treeInit(){
+        let refId = this.projectForm.referenceWbsTemplateId;
+          if(refId && refId>0){
+            //有引用id,回显
+            //this.selected = true;
+            this.templateType = this.projectForm.wbsType;
+            await this.getTreeList();
+            let priv={};
+            if(this.projectForm.referenceWbsTemplateType=='private'){
+              //私有
+              let list = this.treeList[1].options;
+              for (let i = 0; i < list.length; i++) {
+                if(list[i].pkeyId == refId){
+                  this.wbsId = list[i].wbsId +','+ list[i].projectId;
+                  priv.wbsId = list[i].wbsId;
+                  priv.projectId = list[i].projectId;
+                  break;
+                }
+              }
+            }else{
+              //公有
+              this.wbsId = refId;
+            }
+                     
+            let projectTree = await findProjectTree(this.projectForm.id,refId)
+            if(Array.isArray(projectTree.data.data)){
+              if(this.projectForm.referenceWbsTemplateType=='private'){
+                //私有
+                let leftData = await findProjectTree(priv.projectId,priv.wbsId)
+                if(Array.isArray(leftData.data.data)){
+                  this.leftTreeData = leftData.data.data;
+                }else{
+                  this.leftTreeData = [];
+                }
+              }else{
+                //公有
+                let leftData = await getAlltree(this.userInfo.tenant_id,'1',refId)
+                if(Array.isArray(leftData.data.data)){
+                  this.leftTreeData = leftData.data.data;
+                }else{
+                  this.leftTreeData = [];
+                }
+              }
+              
+              this.$refs.treetotree.setRightTree(projectTree.data.data);
+            }
+          }else{
+            this.getTreeList();
+          }
       }
 
     }

+ 29 - 4
src/views/manager/projectinfo/list.vue

@@ -58,11 +58,12 @@
       append-to-body
     >
       <div class="flex jc-sb pd-b-10">
-        <span>{{curProjiect.projectName}}</span>
+        <span class="flex1 mg-r-20">{{curProjiect.projectName}}</span>
         <div>
           <el-button size="small" @click="editTree" type="success">WBS树管理</el-button>
           <el-button size="small" @click="editProject" type="primary">编辑项目信息</el-button>
           <el-button size="small" @click="addContract" type="info">创建新合同段</el-button>
+          <el-button size="small" @click="dellProject" type="danger">删除项目</el-button>
           <el-button size="small" @click="projectVisible = false">返回</el-button>
         </div>
       </div>
@@ -76,12 +77,12 @@
           :key="item.id"
         >
           <div class="flex jc-sb">
-            <div class="flex jc-al-c">
+            <div class="flex jc-al-c flex1">
               <el-avatar
                 :size="50"
                 :class="getAvatarBg(item.contractType)"
               >{{getFont(item.contractType)}}</el-avatar>
-              <span class="mg-l-10">{{item.contractName}}</span>
+              <span class="mg-l-10 flex1 mg-r-10">{{item.contractName}}</span>
             </div>
             <div class="flex jc-al-c">
               <el-link
@@ -118,7 +119,7 @@
 </template>
 
 <script>
-import { getProjectList } from "@/api/manager/projectinfo";
+import { getProjectList,removeProject } from "@/api/manager/projectinfo";
 import { findContractByProjectId, removeContractInfo } from "@/api/manager/contractinfo";
 // import {getDictionary} from "@/api/system/dict";
 import { mapGetters } from "vuex";
@@ -249,6 +250,30 @@ export default {
         })
       })
     },
+    dellProject(){
+      if(this.contractList.length){
+        this.$message({
+          type: "warning",
+          message: "只能删除下面无合同段的项目!"
+        });
+        return;
+      }
+
+      this.$confirm('是否删除【' + this.curProjiect.projectName + '】?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        removeProject(this.curProjiect.id).then(()=>{
+          this.$message({
+            type: "success",
+            message: "删除成功!"
+          });
+          this.init();
+          this.projectVisible = false;
+        })
+      })
+    },
 
     getFont (type) {
       if (type == 1) {

+ 2 - 2
src/views/manager/projectinfo/tree.vue

@@ -336,7 +336,7 @@
             placeholder="请输入需要选择的内容"
           ></el-input>
           <el-tree
-            :filter-node-method="filterNode222"
+            :filter-node-method="filterNode"
             ref="tree"
             class="filter-tree"
             style="margin-top:10px;"
@@ -2017,7 +2017,7 @@ export default {
         this.GLExcelMD()
       }
     },
-    filterNode222 (value, data) {
+    filterNod (value, data) {
       if (!value) return true;
       return data.name.indexOf(value) !== -1;
     },

+ 140 - 11
src/views/manager/wbsinfo/edit.vue

@@ -5,7 +5,7 @@
       <div class="box">
         <p>工程节点信息</p>
         <div class="flex">
-          <el-input placeholder="输入关键字进行过滤" v-model="filterText" @input="filterChange"></el-input>
+          <el-input placeholder="输入关键字进行过滤" v-model="filterText" @input="filterChange" clearable></el-input>
           <!-- <el-button type="info" class="mg-l-20">导入划分</el-button> -->
         </div>
         <el-scrollbar>
@@ -25,9 +25,10 @@
                         type="text" icon="el-icon-more" class="normal-black">
                       </el-button>
                       <el-dropdown-menu slot="dropdown">
-                        <el-dropdown-item @click.native="setLeftType(1,data,node)" icon="el-icon-circle-plus-outline">新增子级</el-dropdown-item>
+                        <el-dropdown-item @click.native="setLeftType(1,data,node)" icon="el-icon-circle-plus-outline" v-if="data.deptCategory != 6">新增子级</el-dropdown-item>
                         <el-dropdown-item @click.native="setLeftType(2,data,node)" icon="el-icon-edit">编辑节点</el-dropdown-item>
                         <el-dropdown-item @click.native="setLeftType(3,data,node)" icon="el-icon-document-copy">复制节点</el-dropdown-item>
+                        <el-dropdown-item @click.native="deleNode(data,node)" icon="el-icon-close" v-if="node.level !=1">删除节点</el-dropdown-item>
                         <el-dropdown-item @click.native="setLeftType(4,data,node)" icon="iconfont hcicon-danganziliao-biaogetianxie" class="font-s-12">元素公式</el-dropdown-item>
                         <el-dropdown-item @click.native="setLeftType(5,data,node)" icon="el-icon-coin">元素设置</el-dropdown-item>
                         <el-dropdown-item @click.native="nodeInfo(data,node)" icon="el-icon-help">节点参数</el-dropdown-item>
@@ -52,9 +53,10 @@
                         type="text" icon="el-icon-more" class="normal-black">
                       </el-button>
                       <el-dropdown-menu slot="dropdown">
-                        <el-dropdown-item @click.native="setLeftType(1,data,node)" icon="el-icon-circle-plus-outline">新增子级</el-dropdown-item>
+                        <el-dropdown-item @click.native="setLeftType(1,data,node)" icon="el-icon-circle-plus-outline" v-if="data.deptCategory != 6">新增子级</el-dropdown-item>
                         <el-dropdown-item @click.native="setLeftType(2,data,node)" icon="el-icon-edit">编辑节点</el-dropdown-item>
                         <el-dropdown-item @click.native="setLeftType(3,data,node)" icon="el-icon-document-copy">复制节点</el-dropdown-item>
+                        <el-dropdown-item @click.native="deleNode(data,node)" icon="el-icon-close" v-if="node.level !=1">删除节点</el-dropdown-item>
                         <el-dropdown-item @click.native="setLeftType(4,data,node)" icon="iconfont hcicon-danganziliao-biaogetianxie" class="font-s-12">元素公式</el-dropdown-item>
                         <el-dropdown-item @click.native="setLeftType(5,data,node)" icon="el-icon-coin">元素设置</el-dropdown-item>
                         <el-dropdown-item @click.native="nodeInfo(data,node)" icon="el-icon-help">节点参数</el-dropdown-item>
@@ -200,11 +202,19 @@
         <el-table :data="eleForm.elementList" border style="width: 100%" height="400px">
             <el-table-column align="center" type="index" width="50"></el-table-column>
             <el-table-column align="center" prop="eName" label="元素名称" >
+              <template slot="header">
+                <i class="required"></i>
+                <span>元素名称</span>
+              </template>
               <template slot-scope="scope">
                 <el-input v-model="scope.row.eName" size="small" placeholder="请输入内容"></el-input>
               </template>
             </el-table-column>
             <el-table-column align="center" prop="eType" label="数据类型" width="120">
+              <template slot="header">
+                <i class="required"></i>
+                <span>数据类型</span>
+              </template>
               <template slot-scope="scope">
                 <el-select v-model="scope.row.eType" size="small" placeholder="请选择">
                   <el-option v-for="item in dataTypeList" :key="item.id" :label="item.dictValue"  :value="item.dictKey"></el-option>
@@ -212,6 +222,10 @@
               </template>
             </el-table-column>
             <el-table-column align="center" prop="eLength" label="长度" width="120">
+              <template slot="header">
+                <i class="required"></i>
+                <span>长度</span>
+              </template>
               <template slot-scope="scope">
                 <el-input v-model="scope.row.eLength" size="small" placeholder="请输入内容" :disabled="scope.row.eType == 4" ></el-input>
               </template>
@@ -220,6 +234,8 @@
               <template slot-scope="scope">
                 <div class="flex">
                   <el-select v-model="scope.row.allow" size="small" placeholder="请选择" style="width:120px">
+                    <el-option :key="5" label=">" value=">"></el-option>
+                    <el-option :key="6" label="<" value="<"></el-option>
                     <el-option :key="1" label="≥" value="≥"></el-option>
                     <el-option :key="2" label="≤" value="≤"></el-option>
                     <el-option :key="3" label="±" value="±"></el-option>
@@ -278,12 +294,20 @@
       <p class="font-c-warning">编辑元素信息(请谨慎操作)</p>
         <el-table :data="editEleList" border style="width: 100%" height="400px">
           <el-table-column align="center" type="index" width="50"></el-table-column>
-          <el-table-column align="center" prop="eName" label="元素名称" >
+          <el-table-column align="center" prop="eName" label="元素名称">
+            <template slot="header">
+              <i class="required"></i>
+              <span>元素名称</span>
+            </template>
             <template slot-scope="scope">
               <el-input v-model="scope.row.eName" size="small" placeholder="请输入内容"></el-input>
             </template>
           </el-table-column>
           <el-table-column align="center" prop="eType" label="数据类型" width="120">
+            <template slot="header">
+              <i class="required"></i>
+              <span>数据类型</span>
+            </template>
             <template slot-scope="scope">
               <el-select v-model="scope.row.eType" size="small" placeholder="请选择">
                 <el-option v-for="item in dataTypeList" :key="item.id" :label="item.dictValue"  :value="item.dictKey"></el-option>
@@ -291,6 +315,10 @@
             </template>
           </el-table-column>
           <el-table-column align="center" prop="eLength" label="长度" width="120">
+            <template slot="header">
+              <i class="required"></i>
+              <span>长度</span>
+            </template>
             <template slot-scope="scope">
               <el-input v-model="scope.row.eLength" size="small" placeholder="请输入内容" :disabled="scope.row.eType == 4"></el-input>
             </template>
@@ -299,6 +327,8 @@
             <template slot-scope="scope">
               <div class="flex">
                 <el-select v-model="scope.row.allow" size="small" placeholder="请选择" style="width:120px">
+                  <el-option :key="5" label=">" value=">"></el-option>
+                  <el-option :key="6" label="<" value="<"></el-option>
                   <el-option :key="1" label="≥" value="≥"></el-option>
                   <el-option :key="2" label="≤" value="≤"></el-option>
                   <el-option :key="3" label="±" value="±"></el-option>
@@ -342,7 +372,7 @@
           </el-table-column>
           <el-table-column align="center" label="操作" width="200">
             <template slot-scope="scope">
-              <el-link type="primary" >公式配置</el-link>
+              <el-link type="primary" @click="toFormulaEdit">公式配置</el-link>
               <el-link class="mg-l-10" type="danger" @click="delEleRowHandle(scope.$index,editEleList)">删除</el-link>
             </template>
           </el-table-column>
@@ -483,7 +513,7 @@
 <script>
   import {getLazytree,getDetail,update,selectByNodeTable,getAlltree,
             saveFormAndElement,selectFormElements,removeTableById,
-            importWbsTree,exportTemplate} from "@/api/manager/wbstree";
+            importWbsTree,exportTemplate,remove as removeTreeNode} from "@/api/manager/wbstree";
   import {saveElement,remove as removeElement,updateBatchElements,getTemplate,
           importWbsElement} from "@/api/manager/wbsformelement";
   import {getDictionary} from "@/api/system/dict";
@@ -547,7 +577,7 @@
         curEleTable:{},
         editEleVisible:false,
         editEleList:[],
-        eleReg:/(≥|≤|±|【】)?([^≥≤±【】]*)/,
+        eleReg:/(>|<|≥|≤|±|【】)?([^≥≤±【】]*)/,
 
         editEleFormulaVisible:false,
         formulaInput:'',
@@ -701,6 +731,24 @@
 
       },
 
+      deleNode(data,node){
+        this.$confirm('此操作将删除节点【'+data.title+'】, 是否继续?', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          removeTreeNode(data.id).then(()=>{
+            this.$refs.tree.remove(node);
+            this.$message({
+              type: "success",
+              message: "删除成功!"
+            });
+          })
+        }).catch(() => {
+    
+        });
+      },
+
       showFormElement(){
         if(!this.nodeDetail.id){
           this.$message({
@@ -709,6 +757,9 @@
           });
           return;
         }
+        this.eleForm = {
+          elementList:[]
+        };
         this.eleVisible = true;
       },
 
@@ -726,15 +777,39 @@
             this.eleForm.deptCategory = -1;
             this.eleForm.type = 2;//	'1'节点 '2'表单
             this.eleForm.parentId = this.nodeDetail.id;
+            for (let i = 0; i < this.eleForm.elementList.length; i++) {
+              if(!this.eleForm.elementList[i].eName){
+                this.$message({
+                  type: "warning",
+                  message: "请填写第"+(i+1)+"条元素名称"
+                });
+                return;
+              }
+              if(!this.eleForm.elementList[i].eType){
+                this.$message({
+                  type: "warning",
+                  message: "请选择第"+(i+1)+"条数据类型"
+                });
+                return;
+              }
+              if(this.eleForm.elementList[i].eType != 4 && !this.eleForm.elementList[i].eLength){
+                this.$message({
+                  type: "warning",
+                  message: "请填写第"+(i+1)+"条长度"
+                });
+                return;
+              }
+            }
             this.eleForm.elementList.forEach((element)=>{
               element.eAllowDeviation = (element.allow?element.allow:'') + (element.deviation?element.deviation:'');
               if(element.eType == 4){
-                element.eLength = 0;
+                this.$set(element,'eLength',0);
+                //element.eLength = 0;
               }
             })
             saveFormAndElement(this.eleForm).then(()=>{
               //console.log(res)
-              this.updateTreeNewNode();
+              //this.updateTreeNewNode();
               this.updateNodeTable();
               this.eleVisible = false;
               this.$message({
@@ -814,12 +889,35 @@
       },
 
       saveNewEle(row){
+        if(!row.eName){
+          this.$message({
+            type: "warning",
+            message: "请填写元素名称"
+          });
+          return;
+        }
+        if(!row.eType){
+          this.$message({
+            type: "warning",
+            message: "请选择数据类型"
+          });
+          return;
+        }
+        
         row.eAllowDeviation = (row.allow?row.allow:'') + (row.deviation?row.deviation:'');
         row.fId = this.curEleTable.id;
         row.initTableName = this.curEleTable.initTableName;
         if(row.eType == 4){
-          row.eLength = 0;
+          this.$set(row,'eLength',0);
+          //row.eLength = 0;
+        }else if(!row.eLength){
+          this.$message({
+            type: "warning",
+            message: "请填写长度"
+          });
+          return;
         }
+
         saveElement(row).then((res)=>{
           if(res.data.data){
             this.$set(row,'id',res.data.data.id);
@@ -857,12 +955,34 @@
             });
             return;
           }
+          if(!this.editEleList[i].eName){
+            this.$message({
+              type: "warning",
+              message: "请填写第"+(i+1)+"条元素名称"
+            });
+            return;
+          }
+          if(!this.editEleList[i].eType){
+            this.$message({
+              type: "warning",
+              message: "请选择第"+(i+1)+"条数据类型"
+            });
+            return;
+          }
+          if(this.editEleList[i].eType != 4 && !this.editEleList[i].eLength){
+            this.$message({
+              type: "warning",
+              message: "请填写第"+(i+1)+"条长度"
+            });
+            return;
+          }
         }
         if(this.editEleList.length > 0){
           this.editEleList.forEach((element)=>{
             element.eAllowDeviation = (element.allow?element.allow:'') + (element.deviation?element.deviation:'');
             if(element.eType == 4){
-              element.eLength = 0;
+              this.$set(element,'eLength',0);
+              //element.eLength = 0;
             }
           })
           updateBatchElements(this.editEleList,this.curEleTable.initTableName).then(()=>{
@@ -1034,6 +1154,15 @@
           }
       },
 
+      toFormulaEdit(){
+        this.$router.push({
+          path:'/formula/edit',
+          query:{
+            wbsid:this.id,
+          }
+        });
+      },
+
       getDeptCategorylist(){
         if(this.deptCategorylist.length >1){
           return;