ifelse.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550
  1. <template>
  2. <div class="ifelse-box">
  3. <div class="flex jc-al-c">
  4. <span>IF条件执行</span>
  5. <el-select v-model="symbol" @change="setCondition()" size="medium" placeholder="请选择">
  6. <el-option label="大于等于" value=">="></el-option>
  7. <el-option label="小于等于" value="<="></el-option>
  8. <el-option label="大于" value=">"></el-option>
  9. <el-option label="小于" value="<"></el-option>
  10. <el-option label="等于" value="="></el-option>
  11. <el-option label="小于且大于" value="<&&<"></el-option>
  12. <el-option label="小于等于且大于等于" value="<=&&<="></el-option>
  13. </el-select>
  14. <span class="mg-l-20 mg-r-10">执行结果</span>
  15. <el-select v-model="result" @change="setTF()" size="medium" placeholder="请选择">
  16. <el-option label="真假值" value="1"></el-option>
  17. <el-option label="运算" value="2"></el-option>
  18. </el-select>
  19. <el-button class="mg-l-10" size="small" type="info" @click="showSelectEle">选择参数</el-button>
  20. </div>
  21. <div class="mg-t-20 flex jc-al-c">
  22. <span class="textblod mg-r-20">IF</span>
  23. <div class="flex jc-al-c" v-if="symbol == '<&&<' || symbol == '<=&&<='">
  24. <vue-tags-input v-model="tag1" :tags="tags1" @focus="curFocusIndex = 1" @blur="tags1 = [];setCondition()" placeholder="输入/参数" @before-adding-tag="beforeAddingTag"/>
  25. <span v-if="symbol == '<&&<'" class="mg-l-20 mg-r-20">&lt;</span>
  26. <span v-if="symbol == '<=&&<='" class="mg-l-20 mg-r-20">≤</span>
  27. </div>
  28. <vue-tags-input v-model="tag2" :tags="tags2" @focus="curFocusIndex = 2" @blur="tags2 = [];setCondition()" placeholder="输入/参数" @before-adding-tag="beforeAddingTag"/>
  29. <span class="mg-l-20 mg-r-20">
  30. <span v-if="symbol == '>='">≥</span>
  31. <span v-if="symbol == '<='">≤</span>
  32. <span v-if="symbol == '>'">&gt;</span>
  33. <span v-if="symbol == '<'">&lt;</span>
  34. <span v-if="symbol == '='">=</span>
  35. <span v-if="symbol == '<&&<'">&lt;</span>
  36. <span v-if="symbol == '<=&&<='">≤</span>
  37. </span>
  38. <vue-tags-input v-model="tag3" :tags="tags3" @focus="curFocusIndex = 3" @blur="tags3 = [];setCondition()" placeholder="输入/参数" @before-adding-tag="beforeAddingTag"/>
  39. </div>
  40. <div class="flex jc-al-c mg-t-20" v-if="result == 1">
  41. <span class="textblod mg-r-10">真值</span>
  42. <vue-tags-input v-model="tag4" :tags="tags4" @focus="curFocusIndex = 4" @blur="tags4 = [];setTF()" placeholder="输入/参数" @before-adding-tag="beforeAddingTag"/>
  43. <span class="textblod mg-r-10 mg-l-20">假值</span>
  44. <vue-tags-input v-model="tag5" :tags="tags5" @focus="curFocusIndex = 5" @blur="tags5 = [];setTF()" placeholder="输入/参数" @before-adding-tag="beforeAddingTag"/>
  45. </div>
  46. <div class="mg-t-20" v-if="result == 2">
  47. <div class="flex">
  48. <span class="textblod mg-r-10">真值</span>
  49. <div class="border-grey sele-ele-box flex1" :class="{'border-green':curFocusIndex == 6}" @click="curFocusIndex = 6">
  50. <div class="flex jc-sb mg-b-20">
  51. <!-- <div>定位数据位置:</div> -->
  52. <div class="icon-box">
  53. <el-link :underline="false" icon="el-icon-delete" type="danger" @click="removeSelect"></el-link>
  54. <el-link :underline="false" type="primary" @click="addOperator('+')" icon="el-icon-circle-plus-outline"></el-link>
  55. <el-link :underline="false" type="primary" @click="addOperator('-')" icon="el-icon-remove-outline"></el-link>
  56. <el-link :underline="false" type="primary" @click="addOperator('*')" icon="el-icon-circle-close"></el-link>
  57. <el-link :underline="false" type="primary" @click="addOperator('%')">÷</el-link>
  58. </div>
  59. <div>
  60. <!-- <el-link :underline="false" type="primary" class="mg-r-20" @click="eleAddFormula">元素添加到公式</el-link> -->
  61. <el-link :underline="false" type="primary" class="mg-r-10" @click="addBrackets('(',false)">(</el-link>
  62. <el-link :underline="false" type="primary" class="mg-r-10" @click="addBrackets(')',true)">)</el-link>
  63. <!-- <el-link :underline="false" type="primary" class="mg-r-10" @click="addBrackets('[',false)">【</el-link>
  64. <el-link :underline="false" type="primary" class="mg-r-10" @click="addBrackets(']',true)">】</el-link> -->
  65. <el-link :underline="false" type="primary" @click="addText">输入值</el-link>
  66. </div>
  67. </div>
  68. <div>
  69. <formula-item
  70. v-for="(item,index) in selectEleFormula" :key="index"
  71. :item="item" @click="obj => eleFormulaClick(obj,index)"
  72. >
  73. </formula-item>
  74. </div>
  75. </div>
  76. </div>
  77. <div class="flex mg-t-10">
  78. <span class="textblod mg-r-10">假值</span>
  79. <div class="border-grey sele-ele-box flex1" :class="{'border-green':curFocusIndex == 7}" @click="curFocusIndex = 7">
  80. <div class="flex jc-sb mg-b-20">
  81. <!-- <div>定位数据位置:</div> -->
  82. <div class="icon-box">
  83. <el-link :underline="false" icon="el-icon-delete" type="danger" @click="removeSelect"></el-link>
  84. <el-link :underline="false" type="primary" @click="addOperator('+')" icon="el-icon-circle-plus-outline"></el-link>
  85. <el-link :underline="false" type="primary" @click="addOperator('-')" icon="el-icon-remove-outline"></el-link>
  86. <el-link :underline="false" type="primary" @click="addOperator('*')" icon="el-icon-circle-close"></el-link>
  87. <el-link :underline="false" type="primary" @click="addOperator('%')">÷</el-link>
  88. </div>
  89. <div>
  90. <!-- <el-link :underline="false" type="primary" class="mg-r-20" @click="eleAddFormula">元素添加到公式</el-link> -->
  91. <el-link :underline="false" type="primary" class="mg-r-10" @click="addBrackets('(',false)">(</el-link>
  92. <el-link :underline="false" type="primary" class="mg-r-10" @click="addBrackets(')',true)">)</el-link>
  93. <!-- <el-link :underline="false" type="primary" class="mg-r-10" @click="addBrackets('[',false)">【</el-link>
  94. <el-link :underline="false" type="primary" class="mg-r-10" @click="addBrackets(']',true)">】</el-link> -->
  95. <el-link :underline="false" type="primary" @click="addText">输入值</el-link>
  96. </div>
  97. </div>
  98. <div>
  99. <formula-item
  100. v-for="(item,index) in selectEleFormula2" :key="index"
  101. :item="item" @click="obj => eleFormulaClick(obj,index)"
  102. >
  103. </formula-item>
  104. </div>
  105. </div>
  106. </div>
  107. </div>
  108. <el-dialog title="输入值" :visible.sync="inputVisible" width="300px" append-to-body :close-on-click-modal="false">
  109. <el-input v-model="inputText" placeholder="请输入内容"></el-input>
  110. <div class="text-align-c mg-t-10">
  111. <el-button size="small" @click="addTextHandle" type="primary">保存</el-button>
  112. <el-button size="small" @click="inputVisible = false">取消</el-button>
  113. </div>
  114. </el-dialog>
  115. </div>
  116. </template>
  117. <script>
  118. import VueTagsInput from '@johmun/vue-tags-input';
  119. import formulaItem from "../formulaItem"
  120. export default {
  121. name: "dateFormat",
  122. components: {
  123. VueTagsInput,
  124. formulaItem,
  125. },
  126. props: {
  127. formulainfo: {
  128. type: Object,
  129. default: function () {
  130. return {};
  131. }
  132. },
  133. curele: {
  134. type: Object,
  135. default: function () {
  136. return {};
  137. }
  138. },
  139. formulamap:{
  140. type: Object,
  141. default: function () {
  142. return {};
  143. }
  144. }
  145. },
  146. data(){
  147. return{
  148. symbol:'>=',
  149. result:'1',
  150. selectEleFormula:[],
  151. selectEleFormula2:[],
  152. curFocusIndex:0,//当前在哪个输入框
  153. curSeleEleIndex:-1,//公式文字里面选中的元素索引
  154. symbolReg:/(\+|-|\*|\/)(.+)/,
  155. inputVisible:false,
  156. inputText:'',
  157. tag1: '',
  158. tags1: [],
  159. tag2: '',
  160. tags2: [],
  161. tag3: '',
  162. tags3: [],
  163. tag4: '',
  164. tags4: [],
  165. tag5: '',
  166. tags5: [],
  167. }
  168. },
  169. mounted(){
  170. //console.log(this.formulainfo.arguments[0])
  171. //console.log(this.formulainfo.arguments[1])
  172. let args0 = this.formulainfo.arguments[0];
  173. let args1 = this.formulainfo.arguments[1];
  174. let args2 = this.formulainfo.arguments[2];
  175. this.initCondition(args0);
  176. if((typeof args1 == 'string' || (typeof args1 == 'object' && args1.type == 'Element')) &&
  177. (typeof args2 == 'string' || (typeof args2 == 'object' && args2.type == 'Element'))
  178. ){
  179. this.initTFInput(args1,args2);
  180. }else if(Array.isArray(args1) || Array.isArray(args2)){
  181. this.result = '2';
  182. this.initTFFormula(args1,args2)
  183. }
  184. },
  185. methods:{
  186. showSelectEle(){
  187. this.$set(this.formulainfo,'showSelectEle',!this.formulainfo.showSelectEle);
  188. },
  189. beforeAddingTag(){
  190. },
  191. inputHook(){
  192. console.log(111)
  193. },
  194. addText(){
  195. this.inputVisible = true;
  196. },
  197. //把元素加到公式里
  198. eleAddFormulaHandle(ele){
  199. let eleFormula;
  200. if(this.curFocusIndex == 6){
  201. eleFormula = this.selectEleFormula;
  202. }else if(this.curFocusIndex == 7){
  203. eleFormula = this.selectEleFormula2;
  204. }else{
  205. return;
  206. }
  207. if(ele.tableElementKey){
  208. //元素
  209. eleFormula.push({
  210. type:'Element',
  211. name:ele.eName,
  212. id:ele.id,
  213. selected:false,
  214. tableElementKey:ele.tableElementKey,
  215. children:[],
  216. })
  217. }else if(ele.template && ele.example){
  218. //运算符号
  219. eleFormula.push({
  220. type:'Operator',
  221. name:this.symbolReg.exec(ele.name)[1],
  222. selected:false,
  223. template:ele.template
  224. })
  225. }else if(ele.type == 'Brackets'){
  226. //括号
  227. eleFormula.splice(ele.selectIndex,0,{
  228. type:'Brackets',
  229. name:ele.name,
  230. selected:false,
  231. })
  232. }else if(ele.type == 'Text'){
  233. //输入值
  234. eleFormula.push({
  235. type:'Text',
  236. name:ele.name,
  237. selected:false,
  238. })
  239. }
  240. this.setTF();
  241. },
  242. //点选公式中的元素
  243. eleFormulaClick({selected,item},index){
  244. let eleFormula;
  245. if(this.curFocusIndex == 6){
  246. eleFormula = this.selectEleFormula;
  247. }else if(this.curFocusIndex == 7){
  248. eleFormula = this.selectEleFormula2;
  249. }else{
  250. return;
  251. }
  252. if(selected){
  253. eleFormula.forEach((ele)=>{
  254. ele.selected = false;
  255. })
  256. item.selected = true;
  257. this.curSeleEleIndex = index;
  258. }else{
  259. this.curSeleEleIndex = -1;
  260. }
  261. },
  262. //快捷添加运算符号
  263. addOperator(operator){
  264. this.eleAddFormulaHandle(this.formulamap[operator]);
  265. },
  266. //删除点选公式中的元素
  267. removeSelect(){
  268. let eleFormula;
  269. if(this.curFocusIndex == 6){
  270. eleFormula = this.selectEleFormula;
  271. }else if(this.curFocusIndex == 7){
  272. eleFormula = this.selectEleFormula2;
  273. }else{
  274. return;
  275. }
  276. if(this.curSeleEleIndex > -1){
  277. eleFormula.splice(this.curSeleEleIndex,1);
  278. this.curSeleEleIndex = -1;
  279. }
  280. this.setTF();
  281. },
  282. //添加括号
  283. addBrackets(text,type){
  284. //type 是true 表示在元素右边插入
  285. if(this.curSeleEleIndex == Number(this.curSeleEleIndex)){
  286. this.eleAddFormulaHandle({
  287. type:'Brackets',
  288. name:text,
  289. selectIndex:type?Number(this.curSeleEleIndex)+1:this.curSeleEleIndex
  290. })
  291. //如果在左边插入index要增1
  292. if(!type){
  293. this.curSeleEleIndex = Number(this.curSeleEleIndex)+1;
  294. }
  295. }
  296. },
  297. //添加输入值
  298. addTextHandle(){
  299. this.eleAddFormulaHandle({
  300. type:'Text',
  301. name:this.inputText
  302. })
  303. this.inputVisible = false;
  304. },
  305. setELe(ele){
  306. if(this.curFocusIndex){
  307. let obj = {
  308. type:'Element',
  309. name:ele.eName,
  310. id:ele.id,
  311. selected:false,
  312. tableElementKey:ele.tableElementKey,
  313. children:[],
  314. }
  315. if(this.curFocusIndex == 6 || this.curFocusIndex ==7){
  316. this.eleAddFormulaHandle(ele)
  317. }else{
  318. obj.text = ele.eName;
  319. obj.style = 'background-color: #409EFF';
  320. this['tags'+this.curFocusIndex] = [obj];
  321. this['tag'+this.curFocusIndex] = '';
  322. this.curFocusIndex = 0;
  323. this.setCondition();
  324. }
  325. }
  326. },
  327. //初始化真假值判断if(xxx)部分
  328. initCondition(args0){
  329. if(args0){
  330. if(args0.length == 3){
  331. //运算符号
  332. this.symbol = args0[1];
  333. //第二个空
  334. if((typeof args0[0]) == 'object' && args0[0].type == 'Element'){
  335. let ele = args0[0];
  336. this.tags2 = [
  337. Object.assign({
  338. text:ele.name,
  339. style:'background-color: #409EFF',
  340. },ele)]
  341. }else if((typeof args0[0]) == 'string'){
  342. this.tag2 = args0[0];
  343. }
  344. //第三个空
  345. if((typeof args0[2]) == 'object' && args0[2].type == 'Element'){
  346. let ele = args0[2];
  347. this.tags3 = [
  348. Object.assign({
  349. text:ele.name,
  350. style:'background-color: #409EFF',
  351. },ele)]
  352. }else if((typeof args0[2]) == 'string'){
  353. this.tag3 = args0[2];
  354. }
  355. }else if(args0.length == 7){
  356. //运算符号
  357. this.symbol = args0[1]+args0[3]+args0[5];
  358. //第一个空
  359. if((typeof args0[0]) == 'object' && args0[0].type == 'Element'){
  360. let ele = args0[0];
  361. this.tags1 = [
  362. Object.assign({
  363. text:ele.name,
  364. style:'background-color: #409EFF',
  365. },ele)]
  366. }else if((typeof args0[0]) == 'string'){
  367. this.tag1 = args0[0];
  368. }
  369. //第二个空
  370. if((typeof args0[2]) == 'object' && args0[2].type == 'Element'){
  371. let ele = args0[2];
  372. this.tags2 = [
  373. Object.assign({
  374. text:ele.name,
  375. style:'background-color: #409EFF',
  376. },ele)]
  377. }else if((typeof args0[2]) == 'string'){
  378. this.tag2 = args0[2];
  379. }
  380. //第三个空
  381. if((typeof args0[6]) == 'object' && args0[6].type == 'Element'){
  382. let ele = args0[6];
  383. this.tags3 = [
  384. Object.assign({
  385. text:ele.name,
  386. style:'background-color: #409EFF',
  387. },ele)]
  388. }else if((typeof args0[6]) == 'string'){
  389. this.tag3 = args0[6];
  390. }
  391. }
  392. }
  393. },
  394. //写入参数真假值判断if(xxx)部分
  395. setCondition(){
  396. if(this.symbol == '<&&<' || this.symbol == '<=&&<='){
  397. let arr = new Array(7).fill('');
  398. let symbolArr = this.symbol.split('&&');
  399. if(this.tags1.length == 0){
  400. arr[0] = this.tag1;
  401. }else{
  402. arr[0] = this.tags1[0];
  403. }
  404. arr[1] = symbolArr[0];
  405. if(this.tags2.length == 0){
  406. arr[2] = this.tag2;
  407. arr[4] = this.tag2;
  408. }else{
  409. arr[2] = this.tags2[0];
  410. arr[4] = this.tags2[0];
  411. }
  412. arr[3] = '&&';
  413. arr[5] = symbolArr[1];
  414. if(this.tags3.length == 0){
  415. arr[6] = this.tag3;
  416. }else{
  417. arr[6] = this.tags3[0];
  418. }
  419. this.formulainfo.arguments[0] = arr;
  420. }else{
  421. let arr = new Array(3).fill('');
  422. if(this.tags1.length == 0){
  423. arr[0] = this.tag1;
  424. }else{
  425. arr[0] = this.tags1[0];
  426. }
  427. arr[1] = this.symbol;
  428. if(this.tags2.length == 0){
  429. arr[2] = this.tag2;
  430. }else{
  431. arr[2] = this.tags2[0];
  432. }
  433. this.formulainfo.arguments[0] = arr;
  434. }
  435. //console.log(this.formulainfo.arguments[0])
  436. },
  437. //初始化输入框的真假值
  438. initTFInput(args1,args2){
  439. if((typeof args1) == 'object' && args1.type == 'Element'){
  440. let ele = args1;
  441. this.tags4 = [
  442. Object.assign({
  443. text:ele.name,
  444. style:'background-color: #409EFF',
  445. },ele)]
  446. }else if((typeof args1) == 'string'){
  447. this.tag4 = args1;
  448. }
  449. if((typeof args2) == 'object' && args2.type == 'Element'){
  450. let ele = args2;
  451. this.tags5 = [
  452. Object.assign({
  453. text:ele.name,
  454. style:'background-color: #409EFF',
  455. },ele)]
  456. }else if((typeof args2) == 'string'){
  457. this.tag5 = args2;
  458. }
  459. },
  460. //初始化运算的真假值
  461. initTFFormula(args1,args2){
  462. if(Array.isArray(args1)){
  463. this.selectEleFormula = args1;
  464. }else if(typeof args1 == 'object' && args1.type == 'Element'){
  465. this.selectEleFormula = [Object.assign({},args1)];
  466. }
  467. if(Array.isArray(args2)){
  468. this.selectEleFormula2 = args1;
  469. }else if(typeof args2 == 'object' && args2.type == 'Element'){
  470. this.selectEleFormula2 = [Object.assign({},args2)];
  471. }
  472. },
  473. //写入参数真假值
  474. setTF(){
  475. if(this.result == 1){
  476. if(this.tags4.length == 0){
  477. this.formulainfo.arguments[1] = this.tag4;
  478. }else{
  479. this.formulainfo.arguments[1] = this.tags4[0];
  480. }
  481. if(this.tags5.length == 0){
  482. this.formulainfo.arguments[2] = this.tag5;
  483. }else{
  484. this.formulainfo.arguments[2] = this.tags5[0];
  485. }
  486. }else if(this.result == 2){
  487. this.formulainfo.arguments[1] = this.selectEleFormula;
  488. this.formulainfo.arguments[2] = this.selectEleFormula2;
  489. }
  490. },
  491. }
  492. }
  493. </script>
  494. <style scoped lang="scss">
  495. .textblod{
  496. font-weight: bold;
  497. font-size: 18px;
  498. }
  499. .sele-ele-box{
  500. height: 100px;
  501. padding: 10px;
  502. // margin-top: 10px;
  503. }
  504. .icon-box .el-link{
  505. font-size: 20px;
  506. margin-right: 10px;
  507. }
  508. </style>