| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733 |
- <template>
- <div class="ifelse-box">
- <div class="flex jc-al-c">
- <span v-if="symbol!=='|'">IF条件执行</span>
- <el-select v-model="symbol" @change="setCondition()" size="medium" placeholder="请选择" >
- <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 label="等于" value="="></el-option>
- <el-option label="小于且大于" value="<&&<"></el-option>
- <el-option label="小于等于且大于等于" value="<=&&<="></el-option>
- <el-option label="试验判断" value="|"></el-option>
- </el-select>
- <span class="mg-l-20 mg-r-10" v-if="symbol!=='|'">执行结果</span>
- <el-select v-model="result" @change="setTF()" size="medium" placeholder="请选择" v-if="symbol!=='|'">
- <el-option label="真假值" value="1"></el-option>
- <el-option label="运算" value="2"></el-option>
- </el-select>
- <el-button class="mg-l-10" size="small" type="info" @click="showSelectEle">选择参数</el-button>
- </div>
- <div class="mg-t-20 flex jc-al-c">
- <span class="textblod mg-r-20" v-if="symbol!=='|'">IF</span>
- <div class="flex jc-al-c" v-if="symbol == '<&&<' || symbol == '<=&&<='">
- <vue-tags-input v-model="tag1" :tags="tags1" @focus="curFocusIndex = 1" @blur="inputBlur(1)" placeholder="输入/参数" @before-adding-tag="beforeAddingTag"/>
- <span v-if="symbol == '<&&<'" class="mg-l-20 mg-r-20"><</span>
- <span v-if="symbol == '<=&&<='" class="mg-l-20 mg-r-20">≤</span>
- </div>
- <vue-tags-input v-model="tag2" :tags="tags2" @focus="curFocusIndex = 2" @blur="inputBlur(2)" placeholder="输入/参数" @before-adding-tag="beforeAddingTag"/>
- <span class="mg-l-20 mg-r-20">
- <span v-if="symbol == '>='">≥</span>
- <span v-if="symbol == '<='">≤</span>
- <span v-if="symbol == '>'">></span>
- <span v-if="symbol == '<'"><</span>
- <span v-if="symbol == '='">=</span>
- <span v-if="symbol == '<&&<'"><</span>
- <span v-if="symbol == '|'">|</span>
- </span>
- <vue-tags-input v-model="tag3" :tags="tags3" @focus="curFocusIndex = 3" @blur="inputBlur(3)" placeholder="输入/参数" @before-adding-tag="beforeAddingTag"/>
- </div>
- <div class="flex jc-al-c mg-t-20" v-if="result == 1">
- <span class="textblod mg-r-10">真值</span>
- <vue-tags-input v-model="tag4" :tags="tags4" @focus="curFocusIndex = 4" @blur="inputBlur(4)" placeholder="输入/参数" @before-adding-tag="beforeAddingTag" @keyup.native="btKeyUp"/>
- <span class="textblod mg-r-10 mg-l-20">假值</span>
- <vue-tags-input v-model="tag5" :tags="tags5" @focus="curFocusIndex = 5" @blur="inputBlur(5)" placeholder="输入/参数" @before-adding-tag="beforeAddingTag" @keyup.native="btKeyUp"/>
- </div>
- <div class="mg-t-20" v-if="result == 2">
- <div class="flex">
- <span class="textblod mg-r-10">真值</span>
- <div class="border-grey sele-ele-box flex1" :class="{'border-green':curFocusIndex == 6}" @click="curFocusIndex = 6">
- <div class="flex jc-sb mg-b-20">
- <!-- <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>
- <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>
- <div class="flex mg-t-10">
- <span class="textblod mg-r-10">假值</span>
- <div class="border-grey sele-ele-box flex1" :class="{'border-green':curFocusIndex == 7}" @click="curFocusIndex = 7">
- <div class="flex jc-sb mg-b-20">
- <!-- <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>
- <draggable v-model="selectEleFormula2">
- <formula-item
- v-for="(item,index) in selectEleFormula2" :key="index"
- :item="item" @click="obj => eleFormulaClick(obj,index)"
- >
- </formula-item>
- </draggable>
- </div>
- </div>
- </div>
- <el-dialog title="输入值" :visible.sync="inputVisible" width="300px" append-to-body :close-on-click-modal="false">
- <el-input v-model="inputText" placeholder="请输入内容"></el-input>
- <div class="text-align-c mg-t-10">
- <el-button size="small" @click="addTextHandle" type="primary">保存</el-button>
- <el-button size="small" @click="inputVisible = false">取消</el-button>
- </div>
- </el-dialog>
- </div>
- </template>
- <script>
- import VueTagsInput from '@johmun/vue-tags-input';
- import formulaItem from "../formulaItem";
- import draggable from 'vuedraggable';
- export default {
- name: "ifelse",
- components: {
- draggable,
- VueTagsInput,
- formulaItem,
- },
- props: {
- formulainfo: {
- type: Object,
- default: function () {
- return {};
- }
- },
- curele: {
- type: Object,
- default: function () {
- return {};
- }
- },
- formulamap:{
- type: Object,
- default: function () {
- return {};
- }
- }
- },
- data(){
- return{
- symbol:'>=',
- result:'1',
- selectEleFormula:[],
- selectEleFormula2:[],
- curFocusIndex:0,//当前在哪个输入框
- curSeleEleIndex:-1,//公式文字里面选中的元素索引
- symbolReg:/(\+|-|\*|\/)(.+)/,
- inputVisible:false,
- inputText:'',
- tag1: '',
- tags1: [],
- tag2: '',
- tags2: [],
- tag3: '',
- tags3: [],
- tag4: '',
- tags4: [],
- tag5: '',
- tags5: [],
- }
- },
- mounted(){
- //console.log(this.formulainfo.arguments[0])
- //console.log(this.formulainfo.arguments[1])
- let args0 = this.formulainfo.arguments[0];
- let args1 = this.formulainfo.arguments[1];
- let args2 = this.formulainfo.arguments[2];
- this.initCondition(args0);
- if((typeof args1 == 'string' || (typeof args1 == 'object' && (args1.type == 'Element' || args1.type == 'ParamData'))) &&
- (typeof args2 == 'string' || (typeof args2 == 'object' && (args2.type == 'Element' || args2.type == 'ParamData')))
- ){
- this.initTFInput(args1,args2);
- }else if(Array.isArray(args1) || Array.isArray(args2)){
- this.result = '2';
- this.initTFFormula(args1,args2)
- }
- },
- methods:{
- showSelectEle(){
- this.$set(this.formulainfo,'showSelectEle',!this.formulainfo.showSelectEle);
- },
- beforeAddingTag(){
- },
- btKeyUp(e) {
- //把中文标点符号转换成英文的
- e.target.value = e.target.value.replace(/“/g,'"');
- e.target.value = e.target.value.replace(/”/g,'"');
- e.target.value = e.target.value.replace(/’/g,"'");
- e.target.value = e.target.value.replace(/‘/g,"'");
- },
- inputHook(){
- console.log(111)
- },
- inputBlur(num){
- if(this['tag'+num]){
- if(this['tags'+num] && this['tags'+num][0]){
- this.$emit('uncheck',this['tags'+num][0].id)
- }
- this['tags'+num] = [];
- }
- if(num>=1&&num<=3){
- this.setCondition();
- }else if(num>=4&&num<=5){
- this.setTF();
- }
- },
- addText(){
- this.inputVisible = true;
- },
- //把元素加到公式里
- eleAddFormulaHandle(ele){
- let eleFormula;
- if(this.curFocusIndex == 6){
- eleFormula = this.selectEleFormula;
- }else if(this.curFocusIndex == 7){
- eleFormula = this.selectEleFormula2;
- }else{
- return;
- }
- 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,
- id:ele.id,
- selected:false,
- tableElementKey:ele.tableElementKey,
- children:[],
- })
- }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],
- selected:false,
- template:ele.template
- })
- }else if(ele.type == 'Brackets'){
- //括号
- eleFormula.splice(ele.selectIndex,0,{
- type:'Brackets',
- name:ele.name,
- selected:false,
- })
- }else if(ele.type == 'Text'){
- //输入值
- eleFormula.push({
- type:'Text',
- name:ele.name,
- selected:false,
- })
- }else if(ele.k){
- //节点参数
- eleFormula.push({
- type:'ParamData',
- name:ele.name,
- selected:false,
- id:ele.id,
- v:ele.v,
- k:ele.k,
- })
- }
- this.setTF();
- },
- //点选公式中的元素
- eleFormulaClick({selected,item},index){
- let eleFormula;
- if(this.curFocusIndex == 6){
- eleFormula = this.selectEleFormula;
- }else if(this.curFocusIndex == 7){
- eleFormula = this.selectEleFormula2;
- }else{
- return;
- }
- if(selected){
- eleFormula.forEach((ele)=>{
- ele.selected = false;
- })
- item.selected = true;
- this.curSeleEleIndex = index;
- }else{
- this.curSeleEleIndex = -1;
- }
- },
- //快捷添加运算符号
- addOperator(operator){
- this.eleAddFormulaHandle(this.formulamap[operator]);
- },
- //删除点选公式中的元素
- removeSelect(){
- let eleFormula;
- if(this.curFocusIndex == 6){
- eleFormula = this.selectEleFormula;
- }else if(this.curFocusIndex == 7){
- eleFormula = this.selectEleFormula2;
- }else{
- return;
- }
- if(this.curSeleEleIndex > -1){
- eleFormula.splice(this.curSeleEleIndex,1);
- this.curSeleEleIndex = -1;
- }
- this.setTF();
- },
- //添加括号
- addBrackets(text,type){
- //type 是true 表示在元素右边插入
- if(this.curSeleEleIndex == Number(this.curSeleEleIndex)){
- this.eleAddFormulaHandle({
- type:'Brackets',
- name:text,
- selectIndex:type?Number(this.curSeleEleIndex)+1:this.curSeleEleIndex
- })
- //如果在左边插入index要增1
- if(!type){
- this.curSeleEleIndex = Number(this.curSeleEleIndex)+1;
- }
- }
- },
- //添加输入值
- 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
- })
- this.inputVisible = false;
- },
- setELe(ele){
- if(this.curFocusIndex){
- let obj = {};
- if(ele.k){
- obj = {
- type:'ParamData',
- name:ele.name,
- id:ele.id,
- selected:false,
- v:ele.v,
- k:ele.k,
- children:[],
- }
- }else{
- obj = {
- type:'Element',
- name:ele.eName,
- id:ele.id,
- selected:false,
- tableElementKey:ele.tableElementKey,
- children:[],
- }
- }
- if(this.curFocusIndex == 6 || this.curFocusIndex ==7){
- this.eleAddFormulaHandle(ele)
- }else{
- if(this['tags'+this.curFocusIndex] && this['tags'+this.curFocusIndex][0]){
- this.$emit('uncheck',this['tags'+this.curFocusIndex][0].id)
- }
- obj.text = obj.name;
- obj.style = 'background-color: #409EFF';
- this['tags'+this.curFocusIndex] = [obj];
- this['tag'+this.curFocusIndex] = '';
- if(this.curFocusIndex == 4 || this.curFocusIndex == 5){
- this.setTF();
- }else{
- this.setCondition();
- }
- //this.curFocusIndex = 0;
- }
- }
- },
- //初始化真假值判断if(xxx)部分
- initCondition(args0){
- if(args0){
- if(args0.length == 3){
- //运算符号
- this.symbol = args0[1];
- //第二个空
- if((typeof args0[0]) == 'object' && (args0[0].type == 'Element' || args0[0].type == 'ParamData')){
- let ele = args0[0];
- this.tags2 = [
- Object.assign({
- text:ele.name,
- style:'background-color: #409EFF',
- },ele)]
- }else if((typeof args0[0]) == 'string'){
- this.tag2 = args0[0];
- }
- //第三个空
- if((typeof args0[2]) == 'object' && (args0[2].type == 'Element' || args0[2].type == 'ParamData')){
- let ele = args0[2];
- this.tags3 = [
- Object.assign({
- text:ele.name,
- style:'background-color: #409EFF',
- },ele)]
- }else if((typeof args0[2]) == 'string'){
- this.tag3 = args0[2];
- }
- }else if(args0.length == 7){
- //运算符号
- this.symbol = args0[1]+args0[3]+args0[5];
- //第一个空
- if((typeof args0[0]) == 'object' && (args0[0].type == 'Element' || args0[0].type == 'ParamData')){
- let ele = args0[0];
- this.tags1 = [
- Object.assign({
- text:ele.name,
- style:'background-color: #409EFF',
- },ele)]
- }else if((typeof args0[0]) == 'string'){
- this.tag1 = args0[0];
- }
- //第二个空
- if((typeof args0[2]) == 'object' && (args0[2].type == 'Element' || args0[2].type == 'ParamData')){
- let ele = args0[2];
- this.tags2 = [
- Object.assign({
- text:ele.name,
- style:'background-color: #409EFF',
- },ele)]
- }else if((typeof args0[2]) == 'string'){
- this.tag2 = args0[2];
- }
- //第三个空
- if((typeof args0[6]) == 'object' && (args0[6].type == 'Element' || args0[6].type == 'ParamData')){
- let ele = args0[6];
- this.tags3 = [
- Object.assign({
- text:ele.name,
- style:'background-color: #409EFF',
- },ele)]
- }else if((typeof args0[6]) == 'string'){
- this.tag3 = args0[6];
- }
- }else if(typeof args0 == 'object' && (args0.type == 'Element' || args0.type == 'ParamData')){
- let ele = args0;
- this.tags2 = [
- Object.assign({
- text:ele.name,
- style:'background-color: #409EFF',
- },ele)]
- }
- }
- },
- //写入参数真假值判断if(xxx)部分
- setCondition(){
- if(this.symbol == '<&&<' || this.symbol == '<=&&<='){
- let arr = new Array(7).fill('');
- let symbolArr = this.symbol.split('&&');
- if(this.tags1.length == 0){
- arr[0] = this.tag1;
- }else{
- arr[0] = this.tags1[0];
- }
- arr[1] = symbolArr[0];
- if(this.tags2.length == 0){
- arr[2] = this.tag2;
- arr[4] = this.tag2;
- }else{
- arr[2] = this.tags2[0];
- arr[4] = this.tags2[0];
- }
- arr[3] = '&&';
- arr[5] = symbolArr[1];
- if(this.tags3.length == 0){
- arr[6] = this.tag3;
- }else{
- arr[6] = this.tags3[0];
- }
- this.formulainfo.arguments[0] = arr;
- }else{
- let arr = new Array(3).fill('');
- if(this.tags2.length == 0){
- arr[0] = this.tag2;
- }else{
- arr[0] = this.tags2[0];
- }
- arr[1] = this.symbol;
- if(this.tags3.length == 0){
- arr[2] = this.tag3;
- }else{
- arr[2] = this.tags3[0];
- }
- this.formulainfo.arguments[0] = arr;
- }
- //console.log(this.formulainfo.arguments[0])
- },
- //初始化输入框的真假值
- initTFInput(args1,args2){
- if((typeof args1) == 'object' && (args1.type == 'Element' || args1.type == 'ParamData')){
- let ele = args1;
- this.tags4 = [
- Object.assign({
- text:ele.name,
- style:'background-color: #409EFF',
- },ele)]
- }else if((typeof args1) == 'string'){
- this.tag4 = args1;
- }
- if((typeof args2) == 'object' && (args2.type == 'Element' || args2.type == 'ParamData')){
- let ele = args2;
- this.tags5 = [
- Object.assign({
- text:ele.name,
- style:'background-color: #409EFF',
- },ele)]
- }else if((typeof args2) == 'string'){
- this.tag5 = args2;
- }
- },
- //初始化运算的真假值
- initTFFormula(args1,args2){
- if(Array.isArray(args1)){
- args1.forEach((a,index)=>{
- if(typeof a == 'string'){
- this.$set(args1,index,{
- type:'Text',
- name:a,
- selected:false,
- })
- }
- })
- this.selectEleFormula = args1;
- }else if(typeof args1 == 'object' && (args1.type == 'Element' || args1.type == 'ParamData')){
- this.selectEleFormula = [Object.assign({},args1)];
- }else if(typeof args1 == 'string'){
- this.selectEleFormula = [{
- type:'Text',
- name:args1,
- selected:false,
- }]
- }
- if(Array.isArray(args2)){
- args2.forEach((a,index)=>{
- if(typeof a == 'string'){
- this.$set(args2,index,{
- type:'Text',
- name:a,
- selected:false,
- })
- }
- })
- this.selectEleFormula2 = args2;
- }else if(typeof args2 == 'object' && (args2.type == 'Element' || args2.type == 'ParamData')){
- this.selectEleFormula2 = [Object.assign({},args2)];
- }else if(typeof args2 == 'string'){
- this.selectEleFormula2 = [{
- type:'Text',
- name:args2,
- selected:false,
- }]
- }
- },
- //写入参数真假值
- setTF(){
- if(this.result == 1){
- if(this.tags4.length == 0){
- this.formulainfo.arguments[1] = this.tag4;
- }else{
- this.formulainfo.arguments[1] = this.tags4[0];
- }
- if(this.tags5.length == 0){
- this.formulainfo.arguments[2] = this.tag5;
- }else{
- this.formulainfo.arguments[2] = this.tags5[0];
- }
- }else if(this.result == 2){
- this.formulainfo.arguments[1] = this.selectEleFormula;
- this.formulainfo.arguments[2] = this.selectEleFormula2;
- }
- },
- }
- }
- </script>
- <style scoped lang="scss">
- .textblod{
- font-weight: bold;
- font-size: 18px;
- }
- .sele-ele-box{
- height: 100px;
- padding: 10px;
- // margin-top: 10px;
- }
- .icon-box .el-link{
- font-size: 20px;
- margin-right: 10px;
- }
- </style>
|