edit.vue 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869
  1. <template>
  2. <basic-container>
  3. <div class="box-dashed flex">
  4. <div class="retain-box">
  5. <el-checkbox v-model="isRetain"></el-checkbox>
  6. <span>保留</span>
  7. <el-input-number
  8. v-model="retainNum"
  9. :step="1"
  10. :disabled="!isRetain"
  11. size="small"
  12. ></el-input-number>
  13. <span class="retain">位</span>
  14. </div>
  15. <div>
  16. <el-menu
  17. :default-active="activeIndex"
  18. class="el-menu-demo"
  19. mode="horizontal"
  20. @select="handleSelect"
  21. >
  22. <el-submenu v-for="(value,key,index) in formulaList" :key="key" :index="key">
  23. <template slot="title">
  24. <span>{{key}}</span>
  25. </template>
  26. <el-menu-item v-for="(item2,index2) in value" :key="index2" :index="(index+1) +'-' + (index2+1)">{{item2.name}}</el-menu-item>
  27. </el-submenu>
  28. </el-menu>
  29. </div>
  30. </div>
  31. <div class="box-dashed">
  32. <div class="mg-b-20">函数公式</div>
  33. <div class="edit-text">
  34. <span>
  35. <formula-item
  36. v-for="(item,index) in resultFormula" :key="index"
  37. :item="item" @click="obj => equationClick(obj,index,'resultFormula')"
  38. >
  39. </formula-item>
  40. </span>
  41. <span>=</span>
  42. <span>
  43. <formula-item
  44. v-for="(item,index) in processFormula" :key="index"
  45. :item="item" @click="obj => equationClick(obj,index,'processFormula')"
  46. >
  47. </formula-item>
  48. </span>
  49. </div>
  50. <div class="flex jc-sb">
  51. <div></div>
  52. <div><el-button type="info" size="small" @click="operationEdit">重置函数</el-button></div>
  53. </div>
  54. </div>
  55. <div v-show="operationVisible" class="operation-box">
  56. <div>选择参数设置</div>
  57. <div>
  58. <el-row :gutter="20">
  59. <el-col :span="8">
  60. <el-card shadow="never">
  61. <el-scrollbar style="height: 460px">
  62. <el-tree
  63. class="filter-tree"
  64. lazy
  65. :load="loadNode"
  66. @node-click="getNodeDetail"
  67. :props="defaultProps"
  68. :expand-on-click-node="false"
  69. highlight-current
  70. node-key="id"
  71. ref="tree"
  72. >
  73. </el-tree>
  74. </el-scrollbar>
  75. </el-card>
  76. </el-col>
  77. <el-col :span="16">
  78. <el-select v-model="eleTableId" @change="getTableEle" placeholder="请选择元素表" style="width:300px">
  79. <el-option v-for="item in eleTableList" :key="item.id" :label="item.tableName" :value="item.id"></el-option>
  80. </el-select>
  81. <div class="mg-t-10 no-mb-col">
  82. <el-scrollbar style="height: 210px">
  83. <el-row>
  84. <el-col :span="6" v-for="item in eleList" :key="item.id">
  85. <div class="ele-box">
  86. <span>{{item.eName}}</span>
  87. <el-checkbox v-model="item.checked" @change="value => eleChang(value,item)"></el-checkbox>
  88. </div>
  89. </el-col>
  90. </el-row>
  91. </el-scrollbar>
  92. </div>
  93. <div class="flex jc-sb">
  94. <!-- <div>定位数据位置:</div> -->
  95. <div class="icon-box">
  96. <el-link :underline="false" icon="el-icon-delete" type="danger" @click="removeSelect"></el-link>
  97. <el-link :underline="false" type="primary" @click="addOperator('+')" icon="el-icon-circle-plus-outline"></el-link>
  98. <el-link :underline="false" type="primary" @click="addOperator('-')" icon="el-icon-remove-outline"></el-link>
  99. <el-link :underline="false" type="primary" @click="addOperator('*')" icon="el-icon-circle-close"></el-link>
  100. <el-link :underline="false" type="primary" @click="addOperator('%')">÷</el-link>
  101. </div>
  102. <div>
  103. <!-- <el-link :underline="false" type="primary" class="mg-r-20" @click="eleAddFormula">元素添加到公式</el-link> -->
  104. <el-link :underline="false" type="primary" class="mg-r-10" @click="addBrackets('(',false)">(</el-link>
  105. <el-link :underline="false" type="primary" class="mg-r-10" @click="addBrackets(')',true)">)</el-link>
  106. <!-- <el-link :underline="false" type="primary" class="mg-r-10" @click="addBrackets('[',false)">【</el-link>
  107. <el-link :underline="false" type="primary" class="mg-r-10" @click="addBrackets(']',true)">】</el-link> -->
  108. <el-link :underline="false" type="primary" @click="addText">输入值</el-link>
  109. </div>
  110. </div>
  111. <div class="border-grey sele-ele-box">
  112. <div>
  113. <formula-item
  114. v-for="(item,index) in selectEleFormula" :key="index"
  115. :item="item" @click="obj => eleFormulaClick(obj,index)"
  116. >
  117. </formula-item>
  118. </div>
  119. </div>
  120. </el-col>
  121. </el-row>
  122. <div class="text-align-c">
  123. <el-button size="small" @click="operationHandle" type="primary">保存</el-button>
  124. <el-button size="small" @click="operationVisible = false">取消</el-button>
  125. </div>
  126. </div>
  127. </div>
  128. <div v-show="!operationVisible && !showFunDetail">
  129. <div class="box-dashed">
  130. <div class="mg-b-20">函数公式运算执行溯源</div>
  131. <div>
  132. <el-select
  133. v-model="projectId"
  134. @change="projectChange"
  135. placeholder="请选择项目"
  136. style="width: 380px"
  137. >
  138. <el-option
  139. v-for="item in projectList"
  140. :key="item.id"
  141. :label="item.projectName"
  142. :value="item.id"
  143. ></el-option>
  144. </el-select>
  145. <el-select v-model="contractId" placeholder="请选择合同段">
  146. <el-option
  147. v-for="item in contractList"
  148. :key="item.id"
  149. :label="item.contractName"
  150. :value="item.id"
  151. ></el-option>
  152. </el-select>
  153. <el-button type="info">查询</el-button>
  154. </div>
  155. </div>
  156. <div class="text-align-c">
  157. <el-button type="warning">取消</el-button>
  158. <el-button type="primary" @click="saveFormula">保存</el-button>
  159. </div>
  160. </div>
  161. <div v-if="!operationVisible && showFunDetail">
  162. <el-tabs v-model="actiFunIndex" closable @tab-remove="removeFun" :before-leave="funLeave">
  163. <el-tab-pane v-for="(item,index) in equationSelectEle.children" :key="index" :label="item.name" :name="index.toString()">
  164. <template v-if="!componentMap[item.name]">
  165. <formula-template ref="dynamiccomponent" :formulainfo="item" :curele="equationSelectEle" @sele-ele-handle="showChooseEle">
  166. </formula-template>
  167. </template>
  168. <template v-else>
  169. <div class="flex">
  170. <div class="flex flex-d-c">
  171. <component ref="dynamiccomponent" v-bind:is="componentMap[item.name]" :formulainfo="item" :curele="equationSelectEle" class="flex1"></component>
  172. <div v-show="item.showSelectEle">
  173. <el-select v-model="eleTableId" @change="getTableEleComp" placeholder="请选择元素表" style="width:100%">
  174. <el-option v-for="item in eleTableList" :key="item.id" :label="item.tableName" :value="item.id"></el-option>
  175. </el-select>
  176. <div class="mg-t-10 mg-b-10 no-mb-col" style="width:900px">
  177. <el-scrollbar style="max-height: 210px;min-height:100px">
  178. <el-row>
  179. <el-col :span="6" v-for="item in eleListComp" :key="item.id">
  180. <div class="ele-box">
  181. <span>{{item.eName}}</span>
  182. <el-checkbox @change="value => setComponentEle(value,item,index)"></el-checkbox>
  183. </div>
  184. </el-col>
  185. </el-row>
  186. </el-scrollbar>
  187. </div>
  188. </div>
  189. </div>
  190. <div class="flex1" v-show="item.showSelectEle">
  191. <el-scrollbar style="height: 460px">
  192. <el-tree
  193. class="filter-tree"
  194. lazy
  195. :load="loadNode"
  196. @node-click="getNodeDetail"
  197. :props="defaultProps"
  198. :expand-on-click-node="false"
  199. highlight-current
  200. node-key="id"
  201. ref="tree"
  202. >
  203. </el-tree>
  204. </el-scrollbar>
  205. </div>
  206. </div>
  207. </template>
  208. </el-tab-pane>
  209. </el-tabs>
  210. </div>
  211. <el-dialog title="输入值" :visible.sync="inputVisible" width="300px" append-to-body :close-on-click-modal="false">
  212. <el-input v-model="inputText" placeholder="请输入内容"></el-input>
  213. <div class="text-align-c mg-t-10">
  214. <el-button size="small" @click="addTextHandle" type="primary">保存</el-button>
  215. <el-button size="small" @click="inputVisible = false">取消</el-button>
  216. </div>
  217. </el-dialog>
  218. <el-dialog title="选择元素" :visible.sync="chooseEleVisible" width="800px" append-to-body :close-on-click-modal="false">
  219. <div>
  220. <el-row :gutter="20">
  221. <el-col :span="8">
  222. <el-card shadow="never">
  223. <el-scrollbar style="height: 460px">
  224. <el-tree
  225. class="filter-tree"
  226. lazy
  227. :load="loadNode"
  228. @node-click="getNodeDetail"
  229. :props="defaultProps"
  230. :expand-on-click-node="false"
  231. highlight-current
  232. node-key="id"
  233. ref="tree"
  234. >
  235. </el-tree>
  236. </el-scrollbar>
  237. </el-card>
  238. </el-col>
  239. <el-col :span="16">
  240. <el-select v-model="eleTableId" @change="getTableEle" placeholder="请选择元素表">
  241. <el-option v-for="item in eleTableList" :key="item.id" :label="item.tableName" :value="item.id"></el-option>
  242. </el-select>
  243. <div class="mg-t-10 mg-b-10 no-mb-col">
  244. <el-scrollbar style="height: 210px">
  245. <el-row>
  246. <el-col :span="6" v-for="item in eleList" :key="item.id">
  247. <div class="ele-box">
  248. <span>{{item.eName}}</span>
  249. <el-checkbox v-model="item.checked" @change="value => eleCheckHandle(value,item)"></el-checkbox>
  250. </div>
  251. </el-col>
  252. </el-row>
  253. </el-scrollbar>
  254. </div>
  255. </el-col>
  256. </el-row>
  257. <div class="text-align-c">
  258. <el-button size="small" @click="chooseEleHandle" type="primary">保存</el-button>
  259. <el-button size="small" @click="chooseEleVisible = false">取消</el-button>
  260. </div>
  261. </div>
  262. </el-dialog>
  263. </basic-container>
  264. </template>
  265. <script>
  266. import { getLazytree,selectByNodeTable,selectFormElements} from "@/api/manager/wbstree";
  267. import { getProjectList } from "@/api/manager/projectinfo";
  268. import { findContractByProjectId } from "@/api/manager/contractinfo";
  269. import { getDetail as getEleDeatil } from "@/api/manager/wbsformelement";
  270. import { getTypeMap,saveFormula,formulaDetail,updateFormula } from "@/api/formula/formula";
  271. import {mapGetters} from "vuex";
  272. import formulaItem from "./component/formulaItem"
  273. import formulaTemplate from "./component/formulaTemplate"
  274. import dateDeviation from "./component/funComponent/dateDeviation"
  275. import {formulaArrayToString} from "./formulaArrayToString"
  276. import {formulaStringToArray} from "./formulaStringToArray"
  277. export default {
  278. components: {
  279. formulaItem,
  280. formulaTemplate,
  281. dateDeviation
  282. },
  283. data() {
  284. return {
  285. wbsid: "", //从哪个wbs树过来的
  286. eleid: "", //元素id
  287. formulaid:'',
  288. isRetain: false, //是否保留小数
  289. retainNum: 2, //保留几位小数
  290. formulaList:{},
  291. formulaMap:{},
  292. activeIndex: "1-1", //当前选择的公式
  293. projectList: [], //项目备选列表
  294. projectId: "", //溯源的项目ID
  295. curProjiect: {}, //当前项目对象
  296. contractList: [], //合同段备选列表
  297. contractId: "", //合同段id
  298. operationVisible: false, //基础运算弹窗
  299. defaultProps: {
  300. children: "children",
  301. label: "title",
  302. isLeaf: function (data) {
  303. return !data.hasChildren || (data.isExistForm==1);
  304. },
  305. },
  306. eleTableId:'',//选中的元素表id
  307. eleTableList:[],
  308. eleList:[],
  309. selectEleFormula:[],
  310. curSeleEleIndex:-1,//公式文字里面选中的元素索引
  311. inputVisible:false,//输入弹窗
  312. inputText:"",//输入值
  313. resultFormula:[],//=等号左边的数组
  314. processFormula:[],//=等号右边的数组
  315. processType:'',//选中的元素在等号哪边
  316. processSelectIndex:0,//选中的索引
  317. actiFunIndex:0,//元素下挂载的计算式的索引
  318. chooseEleVisible:false,//选择元素弹窗
  319. argumenObj:{},
  320. symbolReg:/(\+|-|\*|\/)(.+)/,
  321. operatorReg : /^\+|-|\*|%/,//加减乘除
  322. startFCRegExp : /^FC\.([a-zA-Z]+)\(/,// 匹配开始的FC.xxx(
  323. componentMap:{
  324. '日期偏移':'date-deviation',
  325. },
  326. eleListComp:[],
  327. };
  328. },
  329. computed: {
  330. ...mapGetters(["userInfo"]),
  331. // selectEleFormulaText:function(){
  332. // let text = '';
  333. // this.selectEleFormula.forEach((Element)=>{
  334. // text+=Element.name;
  335. // })
  336. // return text
  337. // }
  338. //等式中选中的元素
  339. equationSelectEle:function(){
  340. if(this.processType){
  341. return this[this.processType][this.processSelectIndex];
  342. }else{
  343. return null;
  344. }
  345. },
  346. //是否显示元素下挂载的计算式信息
  347. showFunDetail:function(){
  348. if(this.equationSelectEle && this.equationSelectEle.children && this.equationSelectEle.children.length>0){
  349. return true;
  350. }else{
  351. return false;
  352. }
  353. }
  354. },
  355. created() {
  356. this.wbsid = this.$route.query.wbsid;
  357. this.eleid = this.$route.query.eleid;
  358. this.init();
  359. },
  360. methods: {
  361. async init() {
  362. this.getEleDeatil();
  363. this.getProjectList();
  364. await this.getTypeMap();
  365. this.formulaStringToArray();
  366. },
  367. //懒加载树
  368. loadNode(node, resolve) {
  369. let pid = 0;
  370. if (node.level != 0) {
  371. pid = node.data.id;
  372. }
  373. getLazytree(this.wbsid, pid, this.userInfo.tenant_id).then((res) => {
  374. let arr = [];
  375. if (Array.isArray(res.data.data)) {
  376. arr = res.data.data;
  377. }
  378. return resolve(arr);
  379. });
  380. },
  381. //获取项目列表
  382. getProjectList() {
  383. getProjectList(1, 999).then((res) => {
  384. this.projectList = res.data.data.records;
  385. });
  386. },
  387. //选择公式处理
  388. handleSelect(index,indexPath) {
  389. //console.log(index,'index')
  390. //console.log(indexPath,'indexPath')
  391. if(this.operationVisible){
  392. this.openerationSelect(index,indexPath)
  393. }else{
  394. this.equationSelect(index,indexPath)
  395. }
  396. },
  397. //在选择元素模式下点选计算式
  398. openerationSelect(index,indexPath){
  399. if(indexPath[0]!='基础运算'){
  400. this.$message({
  401. type: "warning",
  402. message: "当前只能使用基础运算"
  403. });
  404. return;
  405. }
  406. let formulaindex = Number(indexPath[1].split('-')[1])-1;
  407. this.eleAddFormulaHandle(this.formulaList[indexPath[0]][formulaindex]);
  408. },
  409. //溯源项目id切换
  410. projectChange(id) {
  411. for (let i = 0; i < this.projectList.length; i++) {
  412. if (id == this.projectList[i].id) {
  413. this.curProjiect = this.projectList[i];
  414. //根据项目id获取合同段列表
  415. findContractByProjectId(this.curProjiect.id).then((res) => {
  416. this.contractList = res.data.data;
  417. this.contractId = "";
  418. });
  419. return;
  420. }
  421. }
  422. },
  423. operationEdit(){
  424. this.selectEleFormula= JSON.parse(JSON.stringify(this.processFormula));
  425. this.operationVisible = true;
  426. },
  427. eleAddFormula(){
  428. for (let i = 0; i < this.eleList.length; i++) {
  429. if (this.eleList[i].checked) {
  430. this.eleAddFormulaHandle(this.eleList[i]);
  431. break;
  432. }
  433. }
  434. },
  435. eleChang(value,item){
  436. //console.log(value)
  437. //console.log(item)
  438. if(value){
  439. this.eleAddFormulaHandle(item);
  440. }else{
  441. let index = -1;
  442. for (let i = 0; i < this.selectEleFormula.length; i++) {
  443. if(this.selectEleFormula[i].id == item.id){
  444. index = i;
  445. break;
  446. }
  447. }
  448. if(index>-1){
  449. this.selectEleFormula.splice(index,1);
  450. }
  451. }
  452. },
  453. //快捷添加运算符号
  454. addOperator(operator){
  455. this.eleAddFormulaHandle(this.formulaMap[operator]);
  456. },
  457. //把元素加到公式里
  458. eleAddFormulaHandle(ele){
  459. if(ele.tableElementKey){
  460. //元素
  461. this.selectEleFormula.push({
  462. type:'Element',
  463. name:ele.eName,
  464. id:ele.id,
  465. selected:false,
  466. tableElementKey:ele.tableElementKey,
  467. children:[],
  468. })
  469. }else if(ele.template && ele.example){
  470. //运算符号
  471. this.selectEleFormula.push({
  472. type:'Operator',
  473. name:this.symbolReg.exec(ele.name)[1],
  474. selected:false,
  475. template:ele.template
  476. })
  477. }else if(ele.type == 'Brackets'){
  478. //括号
  479. this.selectEleFormula.splice(ele.selectIndex,0,{
  480. type:'Brackets',
  481. name:ele.name,
  482. selected:false,
  483. })
  484. }else if(ele.type == 'Text'){
  485. //输入值
  486. this.selectEleFormula.push({
  487. type:'Text',
  488. name:ele.name,
  489. selected:false,
  490. })
  491. }
  492. },
  493. //添加括号
  494. addBrackets(text,type){
  495. //type 是true 表示在元素右边插入
  496. if(this.curSeleEleIndex == Number(this.curSeleEleIndex)){
  497. this.eleAddFormulaHandle({
  498. type:'Brackets',
  499. name:text,
  500. selectIndex:type?Number(this.curSeleEleIndex)+1:this.curSeleEleIndex
  501. })
  502. //如果在左边插入index要增1
  503. if(!type){
  504. this.curSeleEleIndex = Number(this.curSeleEleIndex)+1;
  505. }
  506. }
  507. },
  508. addText(){
  509. this.inputVisible = true;
  510. },
  511. //添加输入值
  512. addTextHandle(){
  513. this.eleAddFormulaHandle({
  514. type:'Text',
  515. name:this.inputText
  516. })
  517. this.inputVisible = false;
  518. },
  519. //勾选元素
  520. eleCheckHandle(checked,item){
  521. if(checked){
  522. this.eleList.forEach((ele)=>{
  523. this.$set(ele,'checked',false);
  524. //ele.checked = false;
  525. })
  526. item.checked = true;
  527. }
  528. },
  529. //点选公式中的元素
  530. eleFormulaClick({selected,item},index){
  531. if(selected){
  532. this.selectEleFormula.forEach((ele)=>{
  533. ele.selected = false;
  534. })
  535. item.selected = true;
  536. this.curSeleEleIndex = index;
  537. }else{
  538. this.curSeleEleIndex = -1;
  539. }
  540. },
  541. //删除点选公式中的元素
  542. removeSelect(){
  543. if(this.curSeleEleIndex > -1){
  544. this.selectEleFormula.splice(this.curSeleEleIndex,1);
  545. this.curSeleEleIndex = -1;
  546. }
  547. },
  548. //赋值给等号右边的数组
  549. operationHandle(){
  550. this.processFormula = JSON.parse(JSON.stringify(this.selectEleFormula));
  551. this.operationVisible = false;
  552. },
  553. //点选等式中的元素
  554. equationClick({selected,item},index,arrName){
  555. if(selected){
  556. this.resultFormula.forEach((ele)=>{
  557. ele.selected = false;
  558. })
  559. this.processFormula.forEach((ele)=>{
  560. ele.selected = false;
  561. })
  562. this.processSelectIndex = index;
  563. this.processType = arrName;
  564. item.selected = true;
  565. }else{
  566. this.processType = '';
  567. }
  568. },
  569. //在等式模式下点选计算式
  570. equationSelect(index,indexPath){
  571. if(!this.equationSelectEle ||(this.equationSelectEle && this.equationSelectEle.type != 'Element') ){
  572. this.$message({
  573. type: "warning",
  574. message: "请先选中元素"
  575. });
  576. return;
  577. }
  578. let formulaindex = Number(indexPath[1].split('-')[1])-1;
  579. let expression = this.formulaList[indexPath[0]][formulaindex];
  580. if(expression.type ==1){
  581. return;
  582. }
  583. //console.log(JSON.parse(expression.template));
  584. let obj = Object.assign({}, expression);
  585. //obj.template = JSON.parse(obj.template);
  586. obj.arguments = new Array(obj.template.args.length);
  587. obj.arguments[0] = {
  588. id:this.equationSelectEle.id,
  589. name:this.equationSelectEle.name,
  590. selected:false,
  591. tableElementKey:this.equationSelectEle.tableElementKey,
  592. type:"Element",
  593. };
  594. this.equationSelectEle.children.push(obj);
  595. },
  596. //选择元素
  597. chooseEleHandle(){
  598. for (let i = 0; i < this.eleList.length; i++) {
  599. if (this.eleList[i].checked) {
  600. let ele = this.eleList[i]
  601. let obj = {
  602. type:'Element',
  603. name:ele.eName,
  604. id:ele.id,
  605. selected:false,
  606. tableElementKey:ele.tableElementKey,
  607. children:[],
  608. }
  609. this.$set(this.argumenObj.arguments,this.argumenObj.index,obj);
  610. this.chooseEleVisible = false;
  611. break;
  612. }
  613. }
  614. },
  615. //显示选择元素弹窗
  616. showChooseEle(argumenObj){
  617. this.argumenObj = argumenObj;
  618. this.chooseEleVisible = true;
  619. },
  620. //移除挂载的函数
  621. removeFun(name){
  622. //console.log(name)
  623. this.equationSelectEle.children.splice(Number(name), 1);
  624. },
  625. //切换公式tab标签
  626. funLeave(activeName, oldActiveName){
  627. if(oldActiveName){
  628. let formula = this.equationSelectEle.children[Number(oldActiveName)];
  629. if(formula){
  630. return this.checkFormulaLegal(formula);
  631. }
  632. }
  633. },
  634. //检测公式合法
  635. checkFormulaLegal(formula){
  636. if(!formula.arguments){
  637. return false;
  638. }
  639. //当前选中的元素
  640. let curEle = this.equationSelectEle;
  641. let isIn = false;
  642. for (let i = 0; i < formula.arguments.length; i++) {
  643. if(formula.arguments[i] && formula.arguments[i].id ==curEle.id){
  644. isIn = true;
  645. break;
  646. }
  647. }
  648. if(!isIn){
  649. this.$message({
  650. type: "warning",
  651. message: "参数必须有一个值是当前元素"
  652. });
  653. return false;
  654. }
  655. return true;
  656. },
  657. //保存公式
  658. saveFormula(){
  659. let obj = formulaArrayToString(this.processFormula,this.resultFormula);
  660. //console.log(text);
  661. if(this.formulaid){
  662. updateFormula({
  663. id:this.formulaid,
  664. formula:obj.text,
  665. remark:'',
  666. wbsId:this.wbsid,
  667. elementId:this.eleid,
  668. map:JSON.stringify(obj.eleMap)
  669. }).then(()=>{
  670. this.$message({
  671. type: "success",
  672. message: "修改成功"
  673. });
  674. })
  675. }else{
  676. saveFormula({
  677. formula:obj.text,
  678. remark:'',
  679. wbsId:this.wbsid,
  680. elementId:this.eleid,
  681. map:JSON.stringify(obj.eleMap)
  682. }).then(()=>{
  683. this.$message({
  684. type: "success",
  685. message: "保存成功"
  686. });
  687. })
  688. }
  689. },
  690. //把公式文本还原数组
  691. async formulaStringToArray(){
  692. let detail = (await formulaDetail({elementId:this.eleid})).data.data;
  693. //console.log(detail);
  694. if(detail.id){
  695. this.formulaid = detail.id;
  696. let formula = formulaStringToArray(detail.formula,detail.map,this.formulaMap);
  697. this.processFormula = formula.processFormula;
  698. formula.resultFormula[0].id = this.resultFormula[0].id;
  699. formula.resultFormula[0].name = this.resultFormula[0].name;
  700. formula.resultFormula[0].tableElementKey = this.resultFormula[0].tableElementKey;
  701. this.resultFormula[0].children = formula.resultFormula[0].children;
  702. }
  703. },
  704. //设置动态组件里面的元素
  705. setComponentEle(value,item,index){
  706. if(value){
  707. this.$refs.dynamiccomponent[index].setELe(item);
  708. }
  709. },
  710. getNodeDetail(data) {
  711. selectByNodeTable(data.id).then((res)=>{
  712. if(res.data.data.length){
  713. this.eleTableList = res.data.data;
  714. }else{
  715. this.eleTableList = [];
  716. }
  717. })
  718. },
  719. getEleDeatil(){
  720. getEleDeatil(this.eleid).then((res)=>{
  721. let ele = res.data.data;
  722. this.resultFormula = [{
  723. type:'Element',
  724. name:ele.eName,
  725. id:ele.id,
  726. selected:false,
  727. tableElementKey:ele.tableElementKey,
  728. children:[],
  729. }]
  730. })
  731. },
  732. getTableEle(tableId){
  733. selectFormElements(tableId).then((res)=>{
  734. this.eleList = res.data.data;
  735. })
  736. },
  737. getTableEleComp(tableId){
  738. selectFormElements(tableId).then((res)=>{
  739. this.eleListComp = res.data.data;
  740. })
  741. },
  742. getTypeMap(){
  743. return new Promise((resolve)=>{
  744. getTypeMap().then((res)=>{
  745. //console.log(res)
  746. this.formulaList = res.data.data;
  747. //生成map,方便查找
  748. for (let key in this.formulaList) {
  749. if(typeof(this.formulaList[key]) == 'object'){
  750. this.formulaList[key].forEach((formula)=>{
  751. formula.template = JSON.parse(formula.template);
  752. if(this.operatorReg.test(formula.template.ft)){
  753. this.formulaMap[formula.template.ft] = formula;
  754. }else if(this.startFCRegExp.test(formula.template.ft)){
  755. let regRes = formula.template.ft.match(this.startFCRegExp);
  756. this.formulaMap[regRes[0]] = formula;
  757. }
  758. })
  759. }
  760. }
  761. }).finally(() => {
  762. resolve();
  763. })
  764. })
  765. }
  766. },
  767. };
  768. </script>
  769. <style scoped lang="scss">
  770. .box-dashed {
  771. border: 1px dashed #bbbbbb;
  772. border-radius: 6px;
  773. padding: 10px;
  774. margin-bottom: 10px;
  775. }
  776. .retain-box {
  777. border-right: 1px dashed #bbbbbb;
  778. }
  779. .retain {
  780. line-height: 50px;
  781. margin-right: 10px;
  782. }
  783. .edit-text {
  784. font-size: 26px;
  785. margin-left: 20px;
  786. }
  787. .el-menu--popup .el-menu-item.is-active {
  788. background-color: #fff;
  789. }
  790. .ele-box{
  791. border: 1px solid #bbb;
  792. height: 26px;
  793. display: flex;
  794. justify-content: space-between;
  795. align-items: center;
  796. padding: 6px;
  797. }
  798. .no-mb-col .el-col{
  799. margin-bottom: 0px;
  800. }
  801. .sele-ele-box{
  802. height: 160px;
  803. padding: 20px;
  804. // margin-top: 10px;
  805. }
  806. .icon-box .el-link{
  807. font-size: 24px;
  808. margin-right: 10px;
  809. }
  810. </style>