duy 1 月之前
父節點
當前提交
95860de9c4
共有 3 個文件被更改,包括 209 次插入158 次删除
  1. 6 3
      src/views/formula/component/table-form-write.vue
  2. 79 75
      src/views/formula/edit-old.vue
  3. 124 80
      src/views/formula/edit.vue

+ 6 - 3
src/views/formula/component/table-form-write.vue

@@ -138,20 +138,23 @@ export default {
         // const elementId = target.id;
         const elementId = this.initTableName+':'+target.id.split('__')[0]; 
         const keyName = target.placeholder;
+        const id=target.id
         // 判断元素是否已选中
-        const index = this.selectedElements.findIndex(item => item.elementId === elementId);
+        const index = this.selectedElements.findIndex(item => item.id === id);
         if (index === -1) {
           // 添加选中效果
           target.style.backgroundColor = '#ffa500'; // 橙色背景
-          this.selectedElements.push({elementId, keyName}); // 存储选中元素的id和keyName
+          this.selectedElements.push({tableElementKey:elementId, eName:keyName,id}); // 存储选中元素的id和keyName
+           this.$emit('element-selected', {tableElementKey:elementId, eName:keyName,id},true);
         } else {  
           // 取消选中效果
           target.style.backgroundColor = ''; // 恢复默认背景
           this.selectedElements.splice(index, 1);
+             this.$emit('element-selected', {tableElementKey:elementId, eName:keyName,id},false);
         }
         
         // 触发选中元素变化事件
-        this.$emit('element-selected', this.selectedElements);
+        // this.$emit('element-selected', this.selectedElements);
 
       
     },

+ 79 - 75
src/views/formula/edit-new.vue → src/views/formula/edit-old.vue

@@ -66,16 +66,24 @@
       </div>
     </div>
     <div v-show="operationVisible" class="operation-box flex1 flex flex-d-c ov-hidden">
-      <div class="flex ">
-        <div>选择参数设置</div>
-        <div style="margin-left: 29%;font-weight: 700;">公式配置</div>
-      </div>
+      <div>选择参数设置</div>
       <div class="flex flex-d-c flex1 ov-hidden">
         <el-row :gutter="20" class="flex1 ov-hidden">
           <el-col :span="8" class="h-100p">
             <el-card shadow="never" v-loading="treeLoad" class="h-100p ov-auto">
               <el-scrollbar style="height: 100%">
-              
+                <!-- <el-tree
+                  class="filter-tree"
+                  lazy
+                  :load="loadNode"
+                  @node-click="getNodeDetail"
+                  :props="defaultProps"
+                  :expand-on-click-node="false"
+                  highlight-current
+                  node-key="id"
+                  ref="tree"
+                >
+                </el-tree> -->
                 <el-tree
                   class="filter-tree"
                   :data="treeData"
@@ -92,60 +100,70 @@
             </el-card>
           </el-col>
           <el-col :span="16" class="h-100p flex flex-d-c ov-hidden">
-            <div class="operation-box">
-              <!-- 运算符选择区域 -->
-                  <div class="flex jc-sb operation-symbol-box">
-                    
-                    <div class="icon-box ">
-                        <span class="text-sm" >插入运算符:</span>
-                    
-                      <el-link :underline="false" type="primary" @click="addOperator('+')" icon="el-icon-circle-plus-outline"></el-link>
-                      <el-link :underline="false" type="primary" @click="addOperator('-')" icon="el-icon-remove-outline"></el-link>
-                      <el-link :underline="false" type="primary" @click="addOperator('*')" icon="el-icon-circle-close"></el-link>
-                      <el-link :underline="false" type="primary" @click="addOperator('%')">÷</el-link>
-                       <el-link :underline="false" type="primary" class="mg-r-10" @click="addBrackets('(',false)">(</el-link>
-                      <el-link :underline="false" type="primary" class="mg-r-10" @click="addBrackets(')',true)">)</el-link>
-                        <el-link :underline="false" type="primary" @click="addText">固定值</el-link>
-                    </div>
-                    <div>
-                      操作
-                    <el-link :underline="false" icon="el-icon-delete" type="danger" @click="removeSelect"></el-link>
-                    </div>
-                  </div>
-      
-                  
-                <div class="border-grey sele-ele-box1" >
-                    <draggable v-model="selectEleFormula">
-                      <formula-item
-                        v-for="(item,index) in selectEleFormula" :key="index"
-                        :item="item" @click="obj => eleFormulaClick(obj,index)"
-                      >
-                      </formula-item>
-                    </draggable>
-                  </div>
-                  <div class="flex mg-t-10" style="justify-content: space-between;width:100%;">
-                    <el-select v-model="eleTableId" @change="getTableEle" placeholder="请选择元素表1" style="width:45%">
-                      <el-option v-if="paramDataList.length" label="选择节点参数2" value="选择节点参数"></el-option>
-                      <el-option  v-for="item in eleTableList" :key="item.id" :label="item.tableName" :value="(item.pkeyId!==null&&item.pkeyId!==-1)?item.pkeyId:item.id"></el-option>
-                    </el-select>
-
-                     <div class="text-align-c">
-                      <el-button size="small" @click="canceloperationVisible ">取消</el-button>
-                      <el-button size="small" @click="operationHandle" type="primary">保存</el-button>
-                    </div>
-                  </div>
+            <div class="flex" style="justify-content: space-between;width:100%">
+               <el-select v-model="eleTableId" @change="getTableEle" placeholder="请选择元素表1" style="width:45%">
+                <el-option v-if="paramDataList.length" label="选择节点参数2" value="选择节点参数"></el-option>
+                <el-option  v-for="item in eleTableList" :key="item.id" :label="item.tableName" :value="(item.pkeyId!==null&&item.pkeyId!==-1)?item.pkeyId:item.id"></el-option>
+              </el-select>
+              <!-- 搜索元素下拉框 -->
+              <el-select v-model="input3" filterable clearable placeholder="搜索元素字段"  @change="getInput" style="width:45%">
+              <el-option
+                v-for="item in eleList1"
+                :key="item.id"
+                :label="item.eName"
+                :value="item.eName">
+              </el-option>
+              </el-select>
+            </div>
            
-                <div class="mg-t-10 no-mb-col flex1" >
-                  <el-scrollbar style="height: 450px">
-        
-                     <tableFormWrite :pkeyId="eleTableId" @element-selected="handleElementSelected" :initTableName="initTableName"></tableFormWrite>
-                  </el-scrollbar>
-                </div>
-         
+            <div class="mg-t-10 no-mb-col flex1 ov-hidden">
+              <el-scrollbar style="height: 100%">
+                <el-row v-loading="eleListable"  v-if="eleList.length>0">
+                  <el-col :span="6" v-for="item in eleList" :key="item.id" >
+                    <div class="ele-box">
+                      <span v-if="item.k">{{item.name}}</span>
+                      <span v-else>{{item.eName}}</span>
+                      <el-checkbox v-model="item.checked" @change="value => eleChang(value,item)"></el-checkbox>
+                    </div>
+                    
+                  </el-col>
+                </el-row>
+                <el-row v-else style="text-align: center;line-height: 328px;border:1px solid #bbb">暂无数据</el-row>
+              </el-scrollbar>
+            </div>
+            <div class="flex jc-sb">
+              <!-- <div>定位数据位置:</div> -->
+              <div class="icon-box">
+                <el-link :underline="false" icon="el-icon-delete" type="danger" @click="removeSelect"></el-link>
+                <el-link :underline="false" type="primary" @click="addOperator('+')" icon="el-icon-circle-plus-outline"></el-link>
+                <el-link :underline="false" type="primary" @click="addOperator('-')" icon="el-icon-remove-outline"></el-link>
+                <el-link :underline="false" type="primary" @click="addOperator('*')" icon="el-icon-circle-close"></el-link>
+                <el-link :underline="false" type="primary" @click="addOperator('%')">÷</el-link>
+              </div>
+              <div>
+                <!-- <el-link :underline="false" type="primary" class="mg-r-20" @click="eleAddFormula">元素添加到公式</el-link> -->
+                <el-link :underline="false" type="primary" class="mg-r-10" @click="addBrackets('(',false)">(</el-link>
+                <el-link :underline="false" type="primary" class="mg-r-10" @click="addBrackets(')',true)">)</el-link>
+                <!-- <el-link :underline="false" type="primary" class="mg-r-10" @click="addBrackets('[',false)">【</el-link>
+                <el-link :underline="false" type="primary" class="mg-r-10" @click="addBrackets(']',true)">】</el-link> -->
+                <el-link :underline="false" type="primary" @click="addText">输入值</el-link>
+              </div>
+            </div>
+            <div class="border-grey sele-ele-box" style="height:50px">
+              <draggable v-model="selectEleFormula">
+                <formula-item
+                  v-for="(item,index) in selectEleFormula" :key="index"
+                  :item="item" @click="obj => eleFormulaClick(obj,index)"
+                >
+                </formula-item>
+              </draggable>
             </div>
           </el-col>
         </el-row>
-       
+        <div class="text-align-c">
+          <el-button size="small" @click="operationHandle" type="primary">保存</el-button>
+          <el-button size="small" @click="canceloperationVisible ">取消</el-button>
+        </div>
       </div>
     </div>
     <div v-show="!operationVisible && !showFunDetail && !deviationRange.show">
@@ -447,7 +465,6 @@ import {formulaStringToArray} from "./formulaStringToArray"
 import draggable from 'vuedraggable'
 import {formatArrayMore,restoreArrayMore,generateResult} from './component/funComponent/multiIfElseTools'
 import dataChange from "./component/funComponent/dataChange"
-import tableFormWrite from "./component/table-form-write.vue";
 
 export default {
   components: {
@@ -467,8 +484,7 @@ export default {
     ifelse,
  
     deviationRange,
-    dataChange,
-    tableFormWrite
+    dataChange
   },
   props: {
     wbsid:{
@@ -600,7 +616,7 @@ export default {
       isDataChange:false,//是否数据自变
       dataForm:'',
       remark:'',//备注
-      initTableName:'',//初始表名
+
 
     };
   },
@@ -815,6 +831,8 @@ export default {
     //   }
     // },
     eleChang(value,item){
+      console.log(value,'value');
+        console.log(item,'item');
       if(value){
         //简单语法判断
         if(this.itemList.length != 0 && this.deleEleIndex < 0){
@@ -1390,7 +1408,7 @@ export default {
         console.log('this.$refs.conditionList[0]',this.$refs.dynamiccomponent[0].conditionList);
         let resMore=formatArrayMore(this.$refs.dynamiccomponent[0].conditionList);
         const resJson=generateResult(this.$refs.dynamiccomponent[0].conditionList);
-        let remark=this.$refs.dynamiccomponent[0].remark;
+        let remark=this.$refs.dynamiccomponent[0].result;
 console.log(remark,'remark');
 
         console.log(resJson,'resJson');
@@ -1672,7 +1690,7 @@ console.log(remark,'remark');
         detail.formula = detail.formula.replace('FC.ifelseMulti','FC.ifelse');
         this.isMore = true;
             this.formulaDetailMap = detail.map;
-        this.moreConditions =  restoreArrayMore(detail.formulas,this.formulaDetailMap)
+        this.moreConditions =  restoreArrayMore(detail.formulas,this.formulaDetailMap,detail.remark||'1')
     
       }else if(detail&&detail.formula.includes('FC.switchCase')){
         //数据获取
@@ -1839,16 +1857,6 @@ console.log(remark,'remark');
 
     getTableEle(tableId){
       console.log("getTableEle",tableId);
-      this.initTableName=''
-
-      
-      this.eleTableList.forEach((item)=>{
-        if(item.pkeyId===tableId){
-          this.initTableName=item.initTableName
-        }
-        
-      })
-
       this.input3=''
       if(tableId === '选择节点参数'){
         this.eleList = this.paramDataList;
@@ -2039,10 +2047,6 @@ console.log(remark,'remark');
           resolve();
         })
       })
-    },
-    handleElementSelected(val){
-      console.log(val,'选中的元素');
-      
     }
   },
 };

+ 124 - 80
src/views/formula/edit.vue

@@ -66,24 +66,16 @@
       </div>
     </div>
     <div v-show="operationVisible" class="operation-box flex1 flex flex-d-c ov-hidden">
-      <div>选择参数设置</div>
+      <div class="flex ">
+        <div>选择参数设置</div>
+        <div style="margin-left: 29%;font-weight: 700;">公式配置</div>
+      </div>
       <div class="flex flex-d-c flex1 ov-hidden">
         <el-row :gutter="20" class="flex1 ov-hidden">
           <el-col :span="8" class="h-100p">
             <el-card shadow="never" v-loading="treeLoad" class="h-100p ov-auto">
               <el-scrollbar style="height: 100%">
-                <!-- <el-tree
-                  class="filter-tree"
-                  lazy
-                  :load="loadNode"
-                  @node-click="getNodeDetail"
-                  :props="defaultProps"
-                  :expand-on-click-node="false"
-                  highlight-current
-                  node-key="id"
-                  ref="tree"
-                >
-                </el-tree> -->
+              
                 <el-tree
                   class="filter-tree"
                   :data="treeData"
@@ -100,70 +92,60 @@
             </el-card>
           </el-col>
           <el-col :span="16" class="h-100p flex flex-d-c ov-hidden">
-            <div class="flex" style="justify-content: space-between;width:100%">
-               <el-select v-model="eleTableId" @change="getTableEle" placeholder="请选择元素表1" style="width:45%">
-                <el-option v-if="paramDataList.length" label="选择节点参数2" value="选择节点参数"></el-option>
-                <el-option  v-for="item in eleTableList" :key="item.id" :label="item.tableName" :value="(item.pkeyId!==null&&item.pkeyId!==-1)?item.pkeyId:item.id"></el-option>
-              </el-select>
-              <!-- 搜索元素下拉框 -->
-              <el-select v-model="input3" filterable clearable placeholder="搜索元素字段"  @change="getInput" style="width:45%">
-              <el-option
-                v-for="item in eleList1"
-                :key="item.id"
-                :label="item.eName"
-                :value="item.eName">
-              </el-option>
-              </el-select>
-            </div>
-           
-            <div class="mg-t-10 no-mb-col flex1 ov-hidden">
-              <el-scrollbar style="height: 100%">
-                <el-row v-loading="eleListable"  v-if="eleList.length>0">
-                  <el-col :span="6" v-for="item in eleList" :key="item.id" >
-                    <div class="ele-box">
-                      <span v-if="item.k">{{item.name}}</span>
-                      <span v-else>{{item.eName}}</span>
-                      <el-checkbox v-model="item.checked" @change="value => eleChang(value,item)"></el-checkbox>
-                    </div>
+            <div class="operation-box">
+              <!-- 运算符选择区域 -->
+                  <div class="flex jc-sb operation-symbol-box">
                     
-                  </el-col>
-                </el-row>
-                <el-row v-else style="text-align: center;line-height: 328px;border:1px solid #bbb">暂无数据</el-row>
-              </el-scrollbar>
-            </div>
-            <div class="flex jc-sb">
-              <!-- <div>定位数据位置:</div> -->
-              <div class="icon-box">
-                <el-link :underline="false" icon="el-icon-delete" type="danger" @click="removeSelect"></el-link>
-                <el-link :underline="false" type="primary" @click="addOperator('+')" icon="el-icon-circle-plus-outline"></el-link>
-                <el-link :underline="false" type="primary" @click="addOperator('-')" icon="el-icon-remove-outline"></el-link>
-                <el-link :underline="false" type="primary" @click="addOperator('*')" icon="el-icon-circle-close"></el-link>
-                <el-link :underline="false" type="primary" @click="addOperator('%')">÷</el-link>
-              </div>
-              <div>
-                <!-- <el-link :underline="false" type="primary" class="mg-r-20" @click="eleAddFormula">元素添加到公式</el-link> -->
-                <el-link :underline="false" type="primary" class="mg-r-10" @click="addBrackets('(',false)">(</el-link>
-                <el-link :underline="false" type="primary" class="mg-r-10" @click="addBrackets(')',true)">)</el-link>
-                <!-- <el-link :underline="false" type="primary" class="mg-r-10" @click="addBrackets('[',false)">【</el-link>
-                <el-link :underline="false" type="primary" class="mg-r-10" @click="addBrackets(']',true)">】</el-link> -->
-                <el-link :underline="false" type="primary" @click="addText">输入值</el-link>
-              </div>
-            </div>
-            <div class="border-grey sele-ele-box" style="height:50px">
-              <draggable v-model="selectEleFormula">
-                <formula-item
-                  v-for="(item,index) in selectEleFormula" :key="index"
-                  :item="item" @click="obj => eleFormulaClick(obj,index)"
-                >
-                </formula-item>
-              </draggable>
+                    <div class="icon-box ">
+                        <span class="text-sm" >插入运算符:</span>
+                    
+                      <el-link type="primary" @click="addOperator('+')" icon="el-icon-circle-plus-outline"></el-link>
+                      <el-link  type="primary" @click="addOperator('-')" icon="el-icon-remove-outline"></el-link>
+                      <el-link type="primary" @click="addOperator('*')" icon="el-icon-circle-close"></el-link>
+                      <el-link  type="primary" @click="addOperator('%')">÷</el-link>
+                       <el-link type="primary" class="mg-r-10" @click="addBrackets('(',false)">(</el-link>
+                      <el-link  type="primary" class="mg-r-10" @click="addBrackets(')',true)">)</el-link>
+                        <el-link type="primary" @click="addText">固定值</el-link>
+                    </div>
+                    <div>
+                      操作
+                    <el-link  icon="el-icon-delete" type="danger" @click="removeSelect"></el-link>
+                    </div>
+                  </div>
+      
+                  
+                <div class="border-grey sele-ele-box1"  @keydown.shift.187="handleShiftPlus" tabindex="0">
+                    <draggable v-model="selectEleFormula">
+                      <formula-item
+                        v-for="(item,index) in selectEleFormula" :key="index"
+                        :item="item" @click="obj => eleFormulaClick(obj,index)"  
+                      >
+                      </formula-item>
+                    </draggable>
+                  </div>
+                  <div class="flex mg-t-10" style="justify-content: space-between;width:100%;">
+                    <el-select v-model="eleTableId" @change="getTableEle" placeholder="请选择元素表1" style="width:45%">
+                      <el-option v-if="paramDataList.length" label="选择节点参数2" value="选择节点参数"></el-option>
+                      <el-option  v-for="item in eleTableList" :key="item.id" :label="item.tableName" :value="(item.pkeyId!==null&&item.pkeyId!==-1)?item.pkeyId:item.id"></el-option>
+                    </el-select>
+
+                     <div class="text-align-c">
+                      <el-button size="small" @click="canceloperationVisible ">取消</el-button>
+                      <el-button size="small" @click="operationHandle" type="primary">保存</el-button>
+                    </div>
+                  </div>
+           
+                <div class="mg-t-10 no-mb-col flex1" >
+                  <el-scrollbar style="height: 450px">
+        
+                     <tableFormWrite :pkeyId="eleTableId" @element-selected="handleElementSelected" :initTableName="initTableName"></tableFormWrite>
+                  </el-scrollbar>
+                </div>
+         
             </div>
           </el-col>
         </el-row>
-        <div class="text-align-c">
-          <el-button size="small" @click="operationHandle" type="primary">保存</el-button>
-          <el-button size="small" @click="canceloperationVisible ">取消</el-button>
-        </div>
+       
       </div>
     </div>
     <div v-show="!operationVisible && !showFunDetail && !deviationRange.show">
@@ -465,6 +447,7 @@ import {formulaStringToArray} from "./formulaStringToArray"
 import draggable from 'vuedraggable'
 import {formatArrayMore,restoreArrayMore,generateResult} from './component/funComponent/multiIfElseTools'
 import dataChange from "./component/funComponent/dataChange"
+import tableFormWrite from "./component/table-form-write.vue";
 
 export default {
   components: {
@@ -484,7 +467,8 @@ export default {
     ifelse,
  
     deviationRange,
-    dataChange
+    dataChange,
+    tableFormWrite
   },
   props: {
     wbsid:{
@@ -616,7 +600,7 @@ export default {
       isDataChange:false,//是否数据自变
       dataForm:'',
       remark:'',//备注
-
+      initTableName:'',//初始表名
 
     };
   },
@@ -831,8 +815,6 @@ export default {
     //   }
     // },
     eleChang(value,item){
-      console.log(value,'value');
-        console.log(item,'item');
       if(value){
         //简单语法判断
         if(this.itemList.length != 0 && this.deleEleIndex < 0){
@@ -1408,7 +1390,7 @@ export default {
         console.log('this.$refs.conditionList[0]',this.$refs.dynamiccomponent[0].conditionList);
         let resMore=formatArrayMore(this.$refs.dynamiccomponent[0].conditionList);
         const resJson=generateResult(this.$refs.dynamiccomponent[0].conditionList);
-        let remark=this.$refs.dynamiccomponent[0].result;
+        let remark=this.$refs.dynamiccomponent[0].remark;
 console.log(remark,'remark');
 
         console.log(resJson,'resJson');
@@ -1690,7 +1672,7 @@ console.log(remark,'remark');
         detail.formula = detail.formula.replace('FC.ifelseMulti','FC.ifelse');
         this.isMore = true;
             this.formulaDetailMap = detail.map;
-        this.moreConditions =  restoreArrayMore(detail.formulas,this.formulaDetailMap,detail.remark||'1')
+        this.moreConditions =  restoreArrayMore(detail.formulas,this.formulaDetailMap)
     
       }else if(detail&&detail.formula.includes('FC.switchCase')){
         //数据获取
@@ -1857,6 +1839,16 @@ console.log(remark,'remark');
 
     getTableEle(tableId){
       console.log("getTableEle",tableId);
+      this.initTableName=''
+
+      
+      this.eleTableList.forEach((item)=>{
+        if(item.pkeyId===tableId){
+          this.initTableName=item.initTableName
+        }
+        
+      })
+
       this.input3=''
       if(tableId === '选择节点参数'){
         this.eleList = this.paramDataList;
@@ -2047,7 +2039,59 @@ console.log(remark,'remark');
           resolve();
         })
       })
-    }
+    },
+    handleElementSelected(item,value){
+      console.log(item,'选中的元素');
+      console.log(this.itemList,'this.itemList');
+     if(value){
+        //简单语法判断
+        if(this.itemList.length != 0 && this.deleEleIndex < 0){
+                let lastEle = this.itemList[this.itemList.length-1];
+                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;
+            }
+        }
+        let lastEle = this.selectEleFormula[this.selectEleFormula.length-1];
+        if(this.selectEleFormula.length == 0 || lastEle.type == 'Operator' || lastEle.type == 'Brackets' || lastEle.name == '('){ /* 存在运算符 */
+          this.eleAddFormulaHandle(item);
+        } else {
+          this.itemList.push(item);
+        }
+
+      }else{
+           let index = -1;
+            for (let i = 0; i < this.itemList.length; i++) {
+            if(this.itemList[i].id == item.id){
+              index = i;
+              break;
+            }
+          }
+          if(index>-1){
+            this.itemList.splice(index,1);
+          }
+      }
+
+
+      
+    },
+    handleShiftPlus(event) {
+      event.preventDefault();
+      console.log('Shift + + 被按下');
+      // this.yourMethod();
+    },
   },
 };
 </script>