gangyj 3 лет назад
Родитель
Сommit
7e982495cf

+ 88 - 0
src/views/formula/component/funComponent/ifelse.vue

@@ -235,6 +235,33 @@ export default {
 
       if(ele.tableElementKey){
         //元素
+
+        //简单语法判断
+        if(eleFormula.length != 0){
+        let lastEle = eleFormula[eleFormula.length-1];
+        if(lastEle.type == 'Element'){
+          this.$message({
+            type: "warning",
+            message: "元素无法连续出现在元素后面"
+          });
+          return;
+        }
+        if(lastEle.type == 'Text'){
+          this.$message({
+            type: "warning",
+            message: "元素无法连续出现在输入值后面"
+          });
+          return;
+        }
+        if(lastEle.type == 'Brackets' && lastEle.name == ')'){
+          this.$message({
+            type: "warning",
+            message: "元素无法连续出现在右括号后面"
+          });
+          return;
+        }
+      }
+
         eleFormula.push({
           type:'Element',
           name:ele.eName,
@@ -245,6 +272,32 @@ export default {
         })
       }else if(ele.template && ele.example){
         //运算符号
+
+        //简单语法判断
+        if(eleFormula.length == 0){
+          this.$message({
+            type: "warning",
+            message: "公式开头不能是运算符号"
+          });
+          return;
+        }else{
+          let lastEle = eleFormula[eleFormula.length-1];
+          if(lastEle.type == 'Operator'){
+            this.$message({
+              type: "warning",
+              message: "运算符号无法连续出现在运算符号后面"
+            });
+            return;
+          }
+          if(lastEle.type == 'Brackets' && lastEle.name == '('){
+            this.$message({
+              type: "warning",
+              message: "运算符号无法连续出现在左括号后面"
+            });
+            return;
+          }
+        }
+
         eleFormula.push({
           type:'Operator',
           name:this.symbolReg.exec(ele.name)[1],
@@ -335,6 +388,41 @@ export default {
 
     //添加输入值
     addTextHandle(){
+      let eleFormula;
+      if(this.curFocusIndex == 6){
+        eleFormula = this.selectEleFormula;
+      }else if(this.curFocusIndex == 7){
+        eleFormula = this.selectEleFormula2;
+      }else{
+        return;
+      }
+
+      //简单语法判断
+      if(eleFormula.length != 0){
+        let lastEle = eleFormula[eleFormula.length-1];
+        if(lastEle.type == 'Element'){
+          this.$message({
+            type: "warning",
+            message: "输入值无法连续出现在元素后面"
+          });
+          return;
+        }
+        if(lastEle.type == 'Text'){
+          this.$message({
+            type: "warning",
+            message: "输入值无法连续出现在输入值后面"
+          });
+          return;
+        }
+        if(lastEle.type == 'Brackets' && lastEle.name == ')'){
+          this.$message({
+            type: "warning",
+            message: "输入值无法连续出现在右括号后面"
+          });
+          return;
+        }
+      }
+
       this.eleAddFormulaHandle({
         type:'Text',
         name:this.inputText

+ 213 - 20
src/views/formula/edit.vue

@@ -59,7 +59,7 @@
           <el-col :span="8">
             <el-card shadow="never">
               <el-scrollbar style="height: 460px">
-                <el-tree
+                <!-- <el-tree
                   class="filter-tree"
                   lazy
                   :load="loadNode"
@@ -70,6 +70,18 @@
                   node-key="id"
                   ref="tree"
                 >
+                </el-tree> -->
+                <el-tree
+                  class="filter-tree"
+                  :data="treeData"
+                  :default-expanded-keys="defaultExpanded"
+                  @node-click="getNodeDetail"
+                  :props="defaultProps"
+                  :expand-on-click-node="false"
+                  highlight-current
+                  node-key="id"
+                  ref="tree"
+                >
                 </el-tree>
               </el-scrollbar>
             </el-card>
@@ -154,7 +166,7 @@
         </div>
       </div>
       <div class="text-align-c">
-        <el-button type="warning">取消</el-button>
+        <el-button type="warning" @click="$router.back()">取消</el-button>
         <el-button type="primary" @click="saveFormula">保存</el-button>
       </div>
     </div>
@@ -170,8 +182,8 @@
               <div class="flex flex-d-c">
                 <component ref="dynamiccomponent" v-bind:is="componentMap[item.name]" :formulainfo="item" :curele="equationSelectEle" :formulamap="formulaMap" class="flex1"></component>
                 <div v-show="item.showSelectEle">
-                  <el-select v-model="eleTableId" @change="getTableEleComp" placeholder="请选择元素表" style="width:100%">
-                    <el-option  v-for="item in eleTableList" :key="item.id" :label="item.tableName" :value="item.id"></el-option>
+                  <el-select v-model="eleTableIdComp" @change="getTableEleComp" placeholder="请选择元素表" style="width:100%">
+                    <el-option  v-for="item in eleTableListComp" :key="item.id" :label="item.tableName" :value="item.id"></el-option>
                   </el-select>
                   <div class="mg-t-10 mg-b-10 no-mb-col" style="width:900px">
                     <el-scrollbar style="max-height: 210px;min-height:100px">
@@ -191,9 +203,9 @@
                 <el-scrollbar style="height: 460px">
                   <el-tree
                     class="filter-tree"
-                    lazy
-                    :load="loadNode"
-                    @node-click="getNodeDetail"
+                    :data="treeData"
+                    :default-expanded-keys="defaultExpanded"
+                    @node-click="getNodeDetailComp"
                     :props="defaultProps"
                     :expand-on-click-node="false"
                     highlight-current
@@ -217,7 +229,7 @@
       </div>
     </el-dialog>
 
-    <el-dialog title="选择元素" :visible.sync="chooseEleVisible" width="800px" append-to-body :close-on-click-modal="false">
+    <el-dialog title="选择元素" :visible.sync="chooseEleVisible" width="70%" append-to-body :close-on-click-modal="false">
       <div>
         <el-row :gutter="20">
           <el-col :span="8">
@@ -225,8 +237,8 @@
               <el-scrollbar style="height: 460px">
                 <el-tree
                   class="filter-tree"
-                  lazy
-                  :load="loadNode"
+                  :data="treeData"
+                  :default-expanded-keys="defaultExpanded"
                   @node-click="getNodeDetail"
                   :props="defaultProps"
                   :expand-on-click-node="false"
@@ -266,11 +278,12 @@
 </template>
 
 <script>
-import { getLazytree,selectByNodeTable,selectFormElements} from "@/api/manager/wbstree";
-import { getProjectList } from "@/api/manager/projectinfo";
+import { getLazytree,selectByNodeTable,selectFormElements,getAlltree} from "@/api/manager/wbstree";
+import { getProjectList,findProjectTree } from "@/api/manager/projectinfo";
 import { findContractByProjectId } from "@/api/manager/contractinfo";
 import { getDetail as getEleDeatil } from "@/api/manager/wbsformelement";
 import { getTypeMap,saveFormula,formulaDetail,updateFormula } from "@/api/formula/formula";
+import { findNodeTableByCondition } from "@/api/manager/wbsprivate";
 import {mapGetters} from "vuex";
 
 import formulaItem from "./component/formulaItem"
@@ -303,8 +316,13 @@ export default {
     return {
       wbsid: "", //从哪个wbs树过来的
       eleid: "", //元素id
+      nodeid:'',//所在树节点id
+      pid:'',//项目id 私有树才有
       formulaid:'',
 
+      treeData:[],//树节点
+      defaultExpanded:[],//默认展开节点
+
       isRetain: false, //是否保留小数
       retainNum: 2, //保留几位小数
       formulaList:{},
@@ -354,7 +372,10 @@ export default {
         '数组转字符串':"datas-join",
         '判断':'ifelse'
       },
-      eleListComp:[],
+
+      eleListComp:[],//方法下面元素列表
+      eleTableListComp:[],//方法下面元素表列表
+      eleTableIdComp:'',//方法下面元素表id
     };
   },
   computed: {
@@ -389,17 +410,34 @@ export default {
   created() {
     this.wbsid = this.$route.query.wbsid;
     this.eleid = this.$route.query.eleid;
+    this.nodeid = this.$route.query.nodeid;
+    this.pid = this.$route.query.projectid;//项目id 私有树才有
     this.init();
   },
   methods: {
     async init() {
       this.getEleDeatil();
       this.getProjectList();
+      this.geTreeData();
       await this.getTypeMap();
 
       this.formulaStringToArray();
     },
 
+    geTreeData(){
+      if(this.pid){
+        findProjectTree(this.pid, this.wbsid).then((res) => {
+          this.treeData = res.data.data;
+          this.defaultExpanded = [this.nodeid];
+        })
+      }else{
+        getAlltree(this.userInfo.tenant_id, 1, this.wbsid).then((res) => {
+          this.treeData = res.data.data;
+          this.defaultExpanded = [this.nodeid];
+        })
+      }
+    },
+
     //懒加载树
     loadNode(node, resolve) {
       let pid = 0;
@@ -479,6 +517,35 @@ export default {
       //console.log(value)
       //console.log(item)
       if(value){
+        //简单语法判断
+        if(this.selectEleFormula.length != 0){
+          let lastEle = this.selectEleFormula[this.selectEleFormula.length-1];
+          if(lastEle.type == 'Element'){
+            this.$message({
+              type: "warning",
+              message: "元素无法连续出现在元素后面"
+            });
+            item.checked = false;
+            return;
+          }
+          if(lastEle.type == 'Text'){
+            this.$message({
+              type: "warning",
+              message: "元素无法连续出现在输入值后面"
+            });
+            item.checked = false;
+            return;
+          }
+          if(lastEle.type == 'Brackets' && lastEle.name == ')'){
+            this.$message({
+              type: "warning",
+              message: "元素无法连续出现在右括号后面"
+            });
+            item.checked = false;
+            return;
+          }
+        }
+
         this.eleAddFormulaHandle(item);
       }else{
         let index = -1;
@@ -512,6 +579,32 @@ export default {
           children:[],
         })
       }else if(ele.template && ele.example){
+
+        //简单语法判断
+        if(this.selectEleFormula.length == 0){
+          this.$message({
+            type: "warning",
+            message: "公式开头不能是运算符号"
+          });
+          return;
+        }else{
+          let lastEle = this.selectEleFormula[this.selectEleFormula.length-1];
+          if(lastEle.type == 'Operator'){
+            this.$message({
+              type: "warning",
+              message: "运算符号无法连续出现在运算符号后面"
+            });
+            return;
+          }
+          if(lastEle.type == 'Brackets' && lastEle.name == '('){
+            this.$message({
+              type: "warning",
+              message: "运算符号无法连续出现在左括号后面"
+            });
+            return;
+          }
+        }
+
         //运算符号
         this.selectEleFormula.push({
           type:'Operator',
@@ -558,6 +651,32 @@ export default {
     },
     //添加输入值
     addTextHandle(){
+      //简单语法判断
+      if(this.selectEleFormula.length != 0){
+        let lastEle = this.selectEleFormula[this.selectEleFormula.length-1];
+        if(lastEle.type == 'Element'){
+          this.$message({
+            type: "warning",
+            message: "输入值无法连续出现在元素后面"
+          });
+          return;
+        }
+        if(lastEle.type == 'Text'){
+          this.$message({
+            type: "warning",
+            message: "输入值无法连续出现在输入值后面"
+          });
+          return;
+        }
+        if(lastEle.type == 'Brackets' && lastEle.name == ')'){
+          this.$message({
+            type: "warning",
+            message: "输入值无法连续出现在右括号后面"
+          });
+          return;
+        }
+      }
+
       this.eleAddFormulaHandle({
         type:'Text',
         name:this.inputText
@@ -599,6 +718,27 @@ export default {
 
     //赋值给等号右边的数组
     operationHandle(){
+      //检测左右括号数量是否相等
+      let lBracketNum = 0;
+      let rBracketNum = 0;
+      this.selectEleFormula.forEach((ele)=>{
+        if(ele.type == 'Brackets'){
+          if(ele.name == '('){
+            lBracketNum++;
+          }else if(ele.name == ')'){
+            rBracketNum++;
+          }
+        }
+      })
+      if(lBracketNum != rBracketNum){
+        this.$message({
+          type: "warning",
+          message: "左右括号数量不相等,请先检查是否正确"
+        });
+        return;
+      }
+
+
       this.processFormula = JSON.parse(JSON.stringify(this.selectEleFormula));
       this.operationVisible = false;
     },
@@ -785,18 +925,39 @@ export default {
     //设置动态组件里面的元素
     setComponentEle(value,item,index){
       if(value){
+        //console.log(this.$refs.dynamiccomponent[index])
         this.$refs.dynamiccomponent[index].setELe(item);
       }
     },
 
     getNodeDetail(data) {
-      selectByNodeTable(data.id).then((res)=>{
-        if(res.data.data.length){
-          this.eleTableList = res.data.data;
-        }else{
-          this.eleTableList = [];
-        }
-      })
+      if(this.pid){
+        findNodeTableByCondition(data.id, this.pid, this.wbsid).then((res) => {
+          if(res.data.data.length){
+            this.eleTableList = res.data.data;
+
+            this.eleTableId = this.eleTableList[0].id;
+            this.getTableEle(this.eleTableId);
+          }else{
+            this.eleTableList = [];
+            this.eleTableId = '';
+            this.eleList = [];
+          }
+        })
+      }else{
+        selectByNodeTable(data.id).then((res)=>{
+          if(res.data.data.length){
+            this.eleTableList = res.data.data;
+
+            this.eleTableId = this.eleTableList[0].id;
+            this.getTableEle(this.eleTableId);
+          }else{
+            this.eleTableList = [];
+            this.eleTableId = '';
+            this.eleList = [];
+          }
+        })
+      }
     },
 
     getEleDeatil(){
@@ -818,7 +979,39 @@ export default {
         this.eleList = res.data.data;
       })
     },
+    
+    //方法下面的点击树节点
+    getNodeDetailComp(data) {
+      if(this.pid){
+        findNodeTableByCondition(data.id, this.pid, this.wbsid).then((res) => {
+          if(res.data.data.length){
+            this.eleTableListComp = res.data.data;
+  
+            this.eleTableIdComp = this.eleTableListComp[0].id;
+            this.getTableEleComp(this.eleTableIdComp);
+          }else{
+            this.eleTableListComp = [];
+            this.eleTableIdComp = '';
+            this.eleListComp = [];
+          }
+        })
+      }else{
+        selectByNodeTable(data.id).then((res)=>{
+          if(res.data.data.length){
+            this.eleTableListComp = res.data.data;
+  
+            this.eleTableIdComp = this.eleTableListComp[0].id;
+            this.getTableEleComp(this.eleTableIdComp);
+          }else{
+            this.eleTableListComp = [];
+            this.eleTableIdComp = '';
+            this.eleListComp = [];
+          }
+        })
+      }
+    },
 
+    //方法下面的查询元素
     getTableEleComp(tableId){
       selectFormElements(tableId).then((res)=>{
         this.eleListComp = res.data.data;

+ 35 - 18
src/views/formula/formulaStringToArray.js

@@ -119,11 +119,13 @@ function ifFunArgumentsHandle(argArr){
     if(Element.type == 'Text' || Element.type == 'Logical'){
       arr.push(Element.tag)
     }else{
-      // let rootObj = {root:null};
-      // getRootElement(Element,rootObj)
-      // arr.push(rootObj.root)
-
-      arr.push(Element)
+      if(Element.type == 'Function'){
+                let rootObj = {root:null};
+        getRootElement(Element.children,rootObj)
+        arr.push(rootObj.root)
+      }else{
+        arr.push(Element);
+      }
     }
   })
 
@@ -131,17 +133,22 @@ function ifFunArgumentsHandle(argArr){
 }
 
 //获取嵌套里面根节点元素,认为是if显示的元素
-// function getRootElement(Element,rootObj){
-//   if(Element.children.length == 0){
-//     rootObj.root = Element;
-//   }else{
-//     Element.children.forEach((ele)=>{
-//       if(ele && ele.type == 'Function'){
-//         getRootElement(ele,rootObj)
-//       }
-//     })
-//   }
-// }
+function getRootElement(children,rootObj){
+  let inFun = false;//是不是有Function
+  let endEle = null;//认为最下面一层第一个元素是显示的元素
+  children.forEach((Element)=>{
+    if(Element.type == 'Function'){
+      getRootElement(Element.children,rootObj);
+      inFun = true;
+    }else if(Element.type == "Element" && !endEle){
+      endEle = Element;
+    }
+  })
+  if(!inFun){
+    //把临时的属性改为最终找到的
+    rootObj.root = Object.assign({},endEle);
+  }
+}
 
 export const formulaStringToArray = (text,elemap,formulaMap) => {
 
@@ -327,10 +334,20 @@ export const formulaStringToArray = (text,elemap,formulaMap) => {
         word = "";
       }
 
-      contentStack[contentStack.length - 1].children.push({
+      let obj = {
         type:'Text',
         tag:word
-      });
+      };
+
+      let content =contentStack[contentStack.length - 1];
+      if(content){
+        content.children.push(obj);
+      }else{
+        //如果没有,那就是在最上层
+        obj.name = word;
+        obj.selected = false;
+        resArr.push(obj);
+      }
 
       strIndex += word.length?word.length:2;//索引移动
     }

+ 24 - 6
src/views/manager/projectinfo/tree.vue

@@ -317,11 +317,16 @@
             ></el-table-column>
             <el-table-column
               label="操作"
-              width="350"
+              width="400"
               align="center"
             >
               <template slot-scope="scope">
                 <el-link
+                  type="primary"
+                  @click="handleEditFormula(scope.$index, scope.row)"
+                >编辑元素公式</el-link>
+                <el-link
+                  class="mg-l-10"
                   type="primary"
                   :disabled='scope.row.isLinkTable==-1'
                   @click="rightClick(scope.row.pkeyId,scope.row.excelId,scope.row.id,scope.row.initTableName)"
@@ -342,9 +347,6 @@
                   type="danger"
                   @click="handleDelete(scope.$index, scope.row)"
                 >删除表单</el-link>
-                <!-- <el-button
-                size="mini"
-                @click="handleEditFormula(scope.$index, scope.row)">编辑元素公式</el-button> -->
               </template>
             </el-table-column>
           </el-table>
@@ -1059,12 +1061,15 @@
           width="200"
         >
           <template slot-scope="scope">
-            <el-link type="primary">公式配置</el-link>
             <el-link
+              :type="scope.row.isSaveFormula == 1?'warning':'primary'"
+              @click="toFormulaEdit(scope.row)"
+            >公式配置</el-link>
+            <!-- <el-link
               class="mg-l-10"
               type="danger"
               @click="delEleRowHandle(scope.$index,editEleList)"
-            >删除</el-link>
+            >删除</el-link> -->
           </template>
         </el-table-column>
       </el-table>
@@ -1996,6 +2001,19 @@ export default {
       return text;
     },
 
+    //跳转到公式配置页面
+    toFormulaEdit (row) {
+      this.$router.push({
+        path: '/formula/edit',
+        query: {
+          wbsid: this.id,
+          eleid: row.id,
+          nodeid:this.curTreeData.id,
+          projectid:this.projectid
+        }
+      });
+    },
+
     getDeptCategorylist () {
       if (this.deptCategorylist.length > 1) {
         return;

+ 3 - 2
src/views/manager/wbsinfo/edit.vue

@@ -1173,7 +1173,7 @@
         >
           <template slot-scope="scope">
             <el-link
-              type="primary"
+              :type="scope.row.isSaveFormula == 1?'warning':'primary'"
               @click="toFormulaEdit(scope.row)"
             >公式配置</el-link>
             <el-link
@@ -2159,7 +2159,8 @@ export default {
         path: '/formula/edit',
         query: {
           wbsid: this.id,
-          eleid: row.id
+          eleid: row.id,
+          nodeid:this.curTreeData.id
         }
       });
     },