edit1.vue 78 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354
  1. <template>
  2. <basic-container>
  3. <div class="flex flex-d-c h-100p">
  4. <div class="box-dashed flex jc-sb">
  5. <div class="flex">
  6. <div class="retain-box">
  7. <el-checkbox v-model="isRetain"></el-checkbox>
  8. <span>保留</span>
  9. <el-input-number
  10. v-model="retainNum"
  11. :step="1"
  12. :min="0" :max="5"
  13. :disabled="!isRetain"
  14. size="small"
  15. ></el-input-number>
  16. <span class="retain">位</span>
  17. </div>
  18. <div class="retain-box">
  19. <el-button size="mini" style="margin:10px;margin-top:16px;" @click="deviationRange.show = !deviationRange.show">允许偏差值范围</el-button>
  20. </div>
  21. <div>
  22. <el-menu
  23. :default-active="activeIndex"
  24. class="el-menu-demo"
  25. mode="horizontal"
  26. @select="handleSelect"
  27. >
  28. <el-submenu v-for="(value,key,index) in formulaList" :key="key" :index="key">
  29. <template slot="title">
  30. <span>{{key}}</span>
  31. </template>
  32. <el-menu-item v-for="(item2,index2) in value" :key="index2" :index="(index+1) +'-' + (index2+1)">{{item2.name}}</el-menu-item>
  33. </el-submenu>
  34. </el-menu>
  35. </div>
  36. </div>
  37. <div>
  38. <el-button size="small" @click="handwrit">手写模式</el-button>
  39. </div>
  40. </div>
  41. <div class="box-dashed">
  42. <div class="mg-b-20">函数公式.</div>
  43. <div class="edit-text">
  44. <span>
  45. <formula-item
  46. v-for="(item,index) in resultFormula" :key="index"
  47. :item="item" @click="obj => equationClick(obj,index,'resultFormula')"
  48. >
  49. </formula-item>
  50. </span>
  51. <span>=</span>
  52. <span v-for="(item,index) in processFormula" :key="index">
  53. <el-tooltip class="item" effect="light" placement="top-start" :disabled="item.type!=='Element'">
  54. <div slot="content">{{item.tableName }}</div>
  55. <formula-item
  56. :getname="getItemTableName(item)"
  57. :item="item" @click="obj => equationClick(obj,index,'processFormula')" :isShowCursor="false"
  58. >
  59. </formula-item>
  60. </el-tooltip>
  61. </span>
  62. </div>
  63. <div class="flex jc-sb">
  64. <div></div>
  65. <div><el-button type="info" size="small" @click="operationEdit">重置函数</el-button></div>
  66. </div>
  67. </div>
  68. <div v-show="operationVisible" class="operation-box flex1 flex flex-d-c ov-hidden">
  69. <div>选择参数设置</div>
  70. <div class="flex flex-d-c flex1 ov-hidden">
  71. <el-row :gutter="20" class="flex1 ov-hidden">
  72. <el-col :span="8" class="h-100p">
  73. <el-card shadow="never" v-loading="treeLoad" class="h-100p ov-auto">
  74. <div style="overflow: auto;flex:1;max-height:601px">
  75. <div class="flex">
  76. <el-input
  77. size="small"
  78. placeholder="输入关键字搜索"
  79. clearable
  80. @clear="clearfiltertext"
  81. v-model="filterText">
  82. </el-input>
  83. <el-button size="small" class="mg-l-10" @click="treeFilter">搜索</el-button>
  84. </div>
  85. <el-tree
  86. style="display: inline-block;min-width: 100%;"
  87. class="filter-tree"
  88. :data="treeData"
  89. :default-expanded-keys="defaultExpanded"
  90. @node-click="getNodeDetail"
  91. :props="defaultProps"
  92. :expand-on-click-node="false"
  93. highlight-current
  94. node-key="id"
  95. ref="tree"
  96. lazy
  97. :load="treeLoadNode"
  98. v-show="!allTreeShow"
  99. >
  100. </el-tree>
  101. <el-tree
  102. style="width: 100%"
  103. ref="treeall"
  104. v-loading="treeloading"
  105. :data="allTreeData"
  106. :props="defaultProps"
  107. @node-click="getNodeDetail"
  108. node-key="id"
  109. :expand-on-click-node="false"
  110. :filter-node-method="filterNode"
  111. v-show="allTreeShow"
  112. >
  113. </el-tree>
  114. </div>
  115. </el-card>
  116. </el-col>
  117. <el-col :span="16" class="h-100p flex flex-d-c ov-hidden">
  118. <!-- <div style="display:flex">
  119. <el-input placeholder="请输入你想搜索的元素字段" v-model="inputele" clearable @clear="clearinput" > </el-input>
  120. <el-button type="primary" icon="el-icon-search" size="small" @click="searchChange">搜索</el-button>
  121. </div>
  122. <div class="mg-t-10 no-mb-col flex1 ov-hidden" style="height: 360px; overflow-y: auto; max-height: 360px;">
  123. <el-scrollbar style="height: 100%">
  124. <el-row v-loading="eleListable">
  125. <el-col :span="6" v-for="item in eleList" :key="item.id">
  126. <div class="ele-box">
  127. <span v-if="item.k">{{item.name}}</span>
  128. <span v-else>{{item.eName}}</span>
  129. <el-checkbox v-model="item.checked" @change="value => eleChang(value,item)"></el-checkbox>
  130. </div>
  131. </el-col>
  132. </el-row>
  133. </el-scrollbar>
  134. </div>
  135. <div class="flex jc-sb">
  136. <div class="icon-box">
  137. <el-link :underline="false" icon="el-icon-delete" type="danger" @click="removeSelect"></el-link>
  138. <el-link :underline="false" type="primary" @click="addOperator('+')" icon="el-icon-circle-plus-outline"></el-link>
  139. <el-link :underline="false" type="primary" @click="addOperator('-')" icon="el-icon-remove-outline"></el-link>
  140. <el-link :underline="false" type="primary" @click="addOperator('*')" icon="el-icon-circle-close"></el-link>
  141. <el-link :underline="false" type="primary" @click="addOperator('%')">÷</el-link>
  142. </div>
  143. <div>
  144. <el-link :underline="false" type="primary" class="mg-r-10" @click="addBrackets('(',false)">(</el-link>
  145. <el-link :underline="false" type="primary" class="mg-r-10" @click="addBrackets(')',true)">)</el-link>
  146. <el-link :underline="false" type="primary" @click="addText">输入值</el-link>
  147. </div>
  148. </div>
  149. <div class="border-grey sele-ele-box" >
  150. <draggable v-model="selectEleFormula">
  151. <formula-item
  152. v-for="(item,index) in selectEleFormula" :key="index"
  153. :item="item" @click="obj => eleFormulaClick(obj,index)"
  154. >
  155. </formula-item>
  156. </draggable>
  157. </div> -->
  158. <div class="operation-box">
  159. <!-- 运算符选择区域 -->
  160. <div class="flex jc-sb operation-symbol-box">
  161. <div class="icon-box ">
  162. <span class="text-sm" >插入运算符:</span>
  163. <el-link type="primary" @click="addOperator('+')" icon="el-icon-circle-plus-outline" size="mini"></el-link>
  164. <el-link type="primary" @click="addOperator('-')" icon="el-icon-remove-outline"></el-link>
  165. <el-link type="primary" @click="addOperator('*')" icon="el-icon-circle-close"></el-link>
  166. <el-link type="primary" @click="addOperator('%')">÷</el-link>
  167. <el-link type="primary" class="mg-r-10" @click="addBrackets('(',false)">(</el-link>
  168. <el-link type="primary" class="mg-r-10" @click="addBrackets(')',true)">)</el-link>
  169. <el-link type="primary" @click="addText">固定值</el-link>
  170. </div>
  171. <div>
  172. 操作
  173. <el-link icon="el-icon-delete" type="danger" @click="removeSelect"></el-link>
  174. </div>
  175. </div>
  176. <div
  177. class="border-grey sele-ele-box1"
  178. tabindex="0"
  179. @keydown.left="handleLeftArrow"
  180. @keydown.right="handleRightArrow"
  181. @keydown.delete="handleDelete"
  182. @keydown.shift.189="addOperator('-')"
  183. @keydown.shift.191="addOperator('/')"
  184. @keydown.shift.57="addBrackets('(')"
  185. @keydown.shift.48="addBrackets(')')"
  186. @keydown.shift.187="addOperator('+')"
  187. @keydown.shift.56="addOperator('*')"
  188. @focus="containerFocused = true"
  189. @blur="containerFocused = false"
  190. >
  191. <draggable v-model="selectEleFormula">
  192. <formula-item
  193. v-for="(item,index) in selectEleFormula"
  194. :key="index"
  195. :item="item"
  196. @click="obj => eleFormulaClick(obj,index)"
  197. >
  198. </formula-item>
  199. </draggable>
  200. </div>
  201. <div class="flex mg-t-10" style="justify-content: space-between;width:100%;">
  202. <el-select v-model="eleTableId" @change="getTableEle" placeholder="请选择元素表1" style="width:45%" size="small">
  203. <el-option v-if="paramDataList.length" label="选择节点参数2" value="选择节点参数"></el-option>
  204. <el-option v-for="item in eleTableList" :key="item.id" :label="item.title" :value="(item.pkeyId!==null&&item.pkeyId!==-1)?item.pkeyId:item.id"></el-option>
  205. </el-select>
  206. <div class="text-align-c">
  207. <el-button size="small" @click="canceloperationVisible ">取消</el-button>
  208. <el-button size="small" @click="operationHandle" type="primary">保存</el-button>
  209. </div>
  210. </div>
  211. <div class="mg-t-10 no-mb-col flex1" >
  212. <el-scrollbar style="height: 450px">
  213. <tableFormWrite :pkeyId="eleTableId" @element-selected="handleElementSelected" :initTableName="initTableName" :selectedTableKey="selectedTableKey" :key="1" :container-id="'excel-container-1'" ></tableFormWrite>
  214. </el-scrollbar>
  215. </div>
  216. </div>
  217. </el-col>
  218. </el-row>
  219. <div class="text-align-c">
  220. <el-button size="small" @click="canceloperationVisible ">取消</el-button>
  221. <el-button size="small" @click="operationHandle" type="primary">保存</el-button>
  222. </div>
  223. </div>
  224. </div>
  225. <div v-show="!operationVisible && !showFunDetail && !deviationRange.show">
  226. <div class="box-dashed">
  227. <div class="mg-b-20">函数公式运算执行溯源</div>
  228. <div>
  229. <el-select
  230. v-model="projectId"
  231. @change="projectChange"
  232. placeholder="请选择项目"
  233. style="width: 380px"
  234. >
  235. <el-option
  236. v-for="item in projectList"
  237. :key="item.id"
  238. :label="item.projectName"
  239. :value="item.id"
  240. ></el-option>
  241. </el-select>
  242. <el-select v-model="contractId" placeholder="请选择合同段">
  243. <el-option
  244. v-for="item in contractList"
  245. :key="item.id"
  246. :label="item.contractName"
  247. :value="item.id"
  248. ></el-option>
  249. </el-select>
  250. <el-button type="info">查询</el-button>
  251. </div>
  252. </div>
  253. </div>
  254. <div v-if="!operationVisible && showFunDetail" class="flex1">
  255. <el-tabs v-model="actiFunIndex" closable @tab-remove="removeFun" :before-leave="funLeave">
  256. <el-tab-pane v-for="(item,index) in equationSelectEle.children" :key="index" :label="item.name" :name="index.toString()">
  257. <template v-if="!componentMap[item.name]">
  258. <formula-template ref="dynamiccomponent" :formulainfo="item" :curele="equationSelectEle" @sele-ele-handle="showChooseEle">
  259. </formula-template>
  260. </template>
  261. <template v-else>
  262. <div class="flex" >
  263. <div class=" flex-d-c" style="width:40%">
  264. <component
  265. ref="dynamiccomponent"
  266. v-bind:is="componentMap[item.name]"
  267. :formulainfo="item" :curele="equationSelectEle"
  268. :formulamap="formulaMap"
  269. :map="formulaDetailMap"
  270. @uncheck="unCheckEleComp"
  271. class="flex1"
  272. :moreConditions="moreConditions"
  273. :isMore="isMore"
  274. :isGetData="isGetData"
  275. :dataListGet="dataListGet"
  276. :isDataChange="isDataChange"
  277. :dataForm="dataForm"
  278. :remark="remark"
  279. >
  280. </component>
  281. <div class="flex1" v-show="item.showSelectEle" style="margin-top:10px;margin-bottom:30px">
  282. <div class="flex">
  283. <el-input
  284. size="small"
  285. placeholder="输入关键字搜索"
  286. clearable
  287. @clear="clearfiltertext"
  288. v-model="filterText">
  289. </el-input>
  290. <el-button size="small" class="mg-l-10" @click="treeFilter">搜索</el-button>
  291. </div>
  292. <el-scrollbar style="height: 520px">
  293. <el-tree
  294. class="filter-tree"
  295. :data="treeData"
  296. :default-expanded-keys="defaultExpanded"
  297. @node-click="getNodeDetailComp"
  298. :props="defaultProps"
  299. :expand-on-click-node="false"
  300. highlight-current
  301. node-key="id"
  302. ref="tree"
  303. lazy
  304. :load="treeLoadNode"
  305. v-show="!allTreeShow"
  306. >
  307. </el-tree>
  308. <el-tree
  309. style="width: 100%"
  310. ref="treeall"
  311. v-loading="treeloading"
  312. :data="allTreeData"
  313. :props="defaultProps"
  314. @node-click="getNodeDetailComp"
  315. node-key="id"
  316. :expand-on-click-node="false"
  317. :filter-node-method="filterNode"
  318. v-show="allTreeShow"
  319. >
  320. </el-tree>
  321. </el-scrollbar>
  322. </div>
  323. </div>
  324. <div v-show="item.showSelectEle" style="width:60%">
  325. <div style="display:flex">
  326. <el-input placeholder="请输入你想搜索的元素字段" v-model="inputelejudge" clearable @clear="clearinputjudge" > </el-input>
  327. <el-button type="primary" icon="el-icon-search" size="small" @click="searchChangejudge">搜索</el-button>
  328. </div>
  329. <div class="mg-t-10 mg-b-10 no-mb-col" style="width:100%">
  330. <el-scrollbar style="height:600px;">
  331. <el-row v-loading="eleListjudge">
  332. <el-col :span="6" v-for="item in eleListComp" :key="item.id">
  333. <div class="ele-box">
  334. <span v-if="item.k">{{item.name}}</span>
  335. <span v-else>{{item.eName}}</span>
  336. <el-checkbox v-model="item.checked" @change="value => setComponentEle(value,item,index)"></el-checkbox>
  337. </div>
  338. </el-col>
  339. </el-row>
  340. </el-scrollbar>
  341. </div>
  342. </div>
  343. </div>
  344. </template>
  345. </el-tab-pane>
  346. </el-tabs>
  347. </div>
  348. <!-- 允许偏差值范围 -->
  349. <div v-if="!operationVisible && !showFunDetail && deviationRange.show" class="flex1">
  350. <div class="flex">
  351. <div class=" flex-d-c" style="width:40%">
  352. <deviation-range ref="deviationrange" :formulainfo="deviationRange" :formulamap="formulaMap" @uncheck="unCheckEleComp" class="flex1"></deviation-range>
  353. <div class="flex1" v-show="deviationRange.showSelectEle" style="margin-top:10px;margin-bottom:30px">
  354. <div class="flex">
  355. <el-input
  356. size="small"
  357. placeholder="输入关键字搜索"
  358. clearable
  359. @clear="clearfiltertext"
  360. v-model="filterText">
  361. </el-input>
  362. <el-button size="small" class="mg-l-10" @click="treeFilter">搜索</el-button>
  363. </div>
  364. <el-scrollbar style="height: 520px">
  365. <el-tree
  366. class="filter-tree"
  367. :data="treeData"
  368. :default-expanded-keys="defaultExpanded"
  369. @node-click="getNodeDetailComp"
  370. :props="defaultProps"
  371. :expand-on-click-node="false"
  372. highlight-current
  373. node-key="id"
  374. ref="tree"
  375. lazy
  376. :load="treeLoadNode"
  377. v-show="!allTreeShow"
  378. >
  379. </el-tree>
  380. <el-tree
  381. style="width: 100%"
  382. ref="treeall"
  383. v-loading="treeloading"
  384. :data="allTreeData"
  385. :props="defaultProps"
  386. @node-click="getNodeDetailComp"
  387. node-key="id"
  388. :expand-on-click-node="false"
  389. :filter-node-method="filterNode"
  390. v-show="allTreeShow"
  391. >
  392. </el-tree>
  393. </el-scrollbar>
  394. </div>
  395. </div>
  396. <div v-show="deviationRange.showSelectEle" style="width:60%">
  397. <div style="display:flex">
  398. <el-input placeholder="请输入你想搜索的元素字段" v-model="inputelepian" clearable @clear="clearinputpian" > </el-input>
  399. <el-button type="primary" icon="el-icon-search" size="small" @click="searchChangepian">搜索</el-button>
  400. </div>
  401. <div class="mg-t-10 mg-b-10 no-mb-col" style="width:100%">
  402. <el-scrollbar style="height:520px;">
  403. <el-row v-loading="eleListComploading">
  404. <el-col :span="6" v-for="item in eleListComp" :key="item.id">
  405. <div class="ele-box">
  406. <span v-if="item.k">{{item.name}}</span>
  407. <span v-else>{{item.eName}}</span>
  408. <el-checkbox v-model="item.checked" @change="value => setDeviationRangeEle(value,item)"></el-checkbox>
  409. </div>
  410. </el-col>
  411. </el-row>
  412. </el-scrollbar>
  413. </div>
  414. </div>
  415. </div>
  416. </div>
  417. <div class="text-align-c" v-show="!operationVisible">
  418. <el-button type="warning" @click="$emit('hideDialog')">取消</el-button>
  419. <el-button type="primary" @click="saveFormula">保存</el-button>
  420. </div>
  421. </div>
  422. <el-dialog title="输入值" :visible.sync="inputVisible" width="300px" append-to-body :close-on-click-modal="false">
  423. <el-input v-model="inputText" placeholder="请输入内容"></el-input>
  424. <div class="text-align-c mg-t-10">
  425. <el-button size="small" @click="addTextHandle" type="primary">保存</el-button>
  426. <el-button size="small" @click="inputVisible = false">取消</el-button>
  427. </div>
  428. </el-dialog>
  429. <el-dialog title="选择元素" :visible.sync="chooseEleVisible" width="70%" append-to-body :close-on-click-modal="false">
  430. <div>
  431. <el-row :gutter="20">
  432. <el-col :span="8">
  433. <el-card shadow="never">
  434. <div class="flex">
  435. <el-input
  436. size="small"
  437. placeholder="输入关键字搜索表单"
  438. clearable
  439. @clear="clearfiltertext"
  440. v-model="filterText">
  441. </el-input>
  442. <el-button size="small" class="mg-l-10" @click="treeFilter">搜索</el-button>
  443. </div>
  444. <el-scrollbar style="height: 460px">
  445. <el-tree
  446. class="filter-tree"
  447. :data="treeData"
  448. :default-expanded-keys="defaultExpanded"
  449. @node-click="getNodeDetail"
  450. :props="defaultProps"
  451. :expand-on-click-node="false"
  452. highlight-current
  453. node-key="id"
  454. ref="tree"
  455. lazy
  456. :load="treeLoadNode"
  457. v-show="!allTreeShow"
  458. >
  459. </el-tree>
  460. <el-tree
  461. style="width: 100%"
  462. ref="treeall"
  463. v-loading="treeloading"
  464. :data="allTreeData"
  465. :props="defaultProps"
  466. @node-click="getNodeDetail"
  467. node-key="id"
  468. :expand-on-click-node="false"
  469. :filter-node-method="filterNode"
  470. v-show="allTreeShow"
  471. >
  472. </el-tree>
  473. </el-scrollbar>
  474. </el-card>
  475. </el-col>
  476. <el-col :span="16">
  477. <div style="display:flex">
  478. <el-input placeholder="请输入你想搜索的元素字段" v-model="inputele" clearable @clear="clearinput" > </el-input>
  479. <el-button type="primary" icon="el-icon-search" size="small" @click="searchChange">搜索</el-button>
  480. </div>
  481. <div class="mg-t-10 mg-b-10 no-mb-col">
  482. <el-scrollbar style="height: 460px;">
  483. <el-row >
  484. <el-col :span="6" v-for="item in eleList" :key="item.id">
  485. <div class="ele-box">
  486. <span v-if="item.k">{{item.name}}</span>
  487. <span v-else>{{item.eName}}</span>
  488. <el-checkbox v-model="item.checked" @change="value => eleCheckHandle(value,item)"></el-checkbox>
  489. </div>
  490. </el-col>
  491. </el-row>
  492. </el-scrollbar>
  493. </div>
  494. </el-col>
  495. </el-row>
  496. <div class="text-align-c">
  497. <el-button size="small" @click="chooseEleHandle" type="primary">保存</el-button>
  498. <el-button size="small" @click="chooseEleVisible = false">取消</el-button>
  499. </div>
  500. </div>
  501. </el-dialog>
  502. <el-dialog title="手写模式" :visible.sync="handwritVisible" width="900px" append-to-body :close-on-click-modal="false">
  503. <div class="font-c-warning">tips:手写模式不保证能转换成配置模式!!即使能转换也不保证正确!!!</div>
  504. <div class="mg-b-20 font-c-warning">无法在手写模式手写加入新的元素!新的节点参数!</div>
  505. <editor v-model="handwritText" @init="editorInit" lang="javascript" theme="github" width="100%" height="200"></editor>
  506. <!-- <el-input
  507. type="textarea"
  508. :autosize="{ minRows: 5,}"
  509. placeholder="请输入内容"
  510. v-model="handwritText">
  511. </el-input> -->
  512. <span slot="footer" class="dialog-footer">
  513. <el-button @click="handwritVisible = false">取 消</el-button>
  514. <el-button type="primary" @click="handwritTransform">转 换</el-button>
  515. </span>
  516. </el-dialog>
  517. </basic-container>
  518. </template>
  519. <script>
  520. import { getLazytree,selectFormElements,getAlltree,getNodeTabAndParam} from "@/api/manager/wbstree";
  521. import { getProjectList,findProjectTree } from "@/api/manager/projectinfo";
  522. import { findContractByProjectId } from "@/api/manager/contractinfo";
  523. import { getDetail as getEleDeatil } from "@/api/manager/wbsformelement";
  524. import { getTypeMap,saveFormula,formulaDetail,updateFormula } from "@/api/formula/formula";
  525. import { getNodeTabAndParam as wbsPrivateGetNodeTabAndParam} from "@/api/manager/wbsprivate";
  526. import {tabTypeLazyTreeAll} from "@/api/manager/wbsprivate";
  527. import {tabTypeLazyTree} from "@/api/manager/wbsprivate";
  528. import {getTableElments} from "@/api/manager/wbstree";
  529. import {mapGetters} from "vuex";
  530. import formulaItem from "./component/formulaItem"
  531. import formulaTemplate from "./component/formulaTemplate"
  532. import dateDeviation from "./component/funComponent/dateDeviation"
  533. import dateFormat from "./component/funComponent/dateFormat"
  534. import datasRepeat from "./component/funComponent/datasRepeat"
  535. import datasReme from "./component/funComponent/datasReme"
  536. import datasGetlist from "./component/funComponent/datasGetlist"
  537. import datasJoin from "./component/funComponent/datasJoin"
  538. import ifelse from "./component/funComponent/ifelse"
  539. import deviationRange from "./component/deviationRange/deviationRange"
  540. import {rangeToString} from "./component/deviationRange/rangeToString"
  541. import {formulaArrayToString} from "./formulaArrayToString"
  542. import {formulaStringToArray} from "./formulaStringToArray"
  543. import draggable from 'vuedraggable'
  544. import tableFormWrite from "./component/table-form-write.vue";
  545. import {formatArrayMore,restoreArrayMore,generateResult} from './component/funComponent/multiIfElseTools'
  546. export default {
  547. components: {
  548. draggable,
  549. formulaItem,
  550. formulaTemplate,
  551. editor: require('vue2-ace-editor'),
  552. dateDeviation,
  553. dateFormat,
  554. datasRepeat,
  555. datasReme,
  556. datasGetlist,
  557. datasJoin,
  558. ifelse,
  559. deviationRange,
  560. tableFormWrite
  561. },
  562. props: {
  563. wbsid:{
  564. type:String,
  565. default:''
  566. },
  567. eleid:{
  568. type:String,
  569. default:''
  570. },
  571. globaltype:{
  572. type:Number,
  573. default:10
  574. },
  575. elementType:{
  576. type:Boolean,//公有还是私有
  577. },
  578. nodeid:{
  579. type:String,
  580. default:''
  581. },
  582. pid:{
  583. type:String,
  584. default:''
  585. },
  586. projectid:{
  587. type:String,
  588. default:''
  589. },
  590. fromcurNode:{
  591. type:Object,
  592. default:''
  593. },
  594. tableType:{
  595. type:Boolean,
  596. default:false
  597. }
  598. },
  599. data() {
  600. return {
  601. // wbsid: "", //从哪个wbs树过来的
  602. // eleid: "", //元素id
  603. // nodeid:'',//所在树节点id
  604. // pid:'',//项目id 私有树才有
  605. filterText:'',//树形控件搜索文字
  606. allTreeShow:'',//搜索树显示
  607. formulaid:'',
  608. treeloading:false,//搜索树加载效果
  609. allTreeData:[],//过滤树
  610. treeData:[],//树节点
  611. treeLoad:false,
  612. defaultExpanded:[],//默认展开节点
  613. isRetain: false, //是否保留小数
  614. retainNum: 2, //保留几位小数
  615. formulaList:{},
  616. formulaMap:{},
  617. activeIndex: "1-1", //当前选择的公式
  618. projectList: [], //项目备选列表
  619. projectId: "", //溯源的项目ID
  620. curProjiect: {}, //当前项目对象
  621. contractList: [], //合同段备选列表
  622. contractId: "", //合同段id
  623. operationVisible: false, //基础运算弹窗
  624. defaultProps: {
  625. children: "children",
  626. label: "title",
  627. isLeaf: function (data) {
  628. return !data.hasChildren;
  629. },
  630. },
  631. eleTableId:'',//选中的元素表id
  632. eleTableList:[],
  633. eleList:[],
  634. selectEleFormula:[],
  635. curSeleEleIndex:-1,//公式文字里面选中的元素索引
  636. inputVisible:false,//输入弹窗
  637. inputText:"",//输入值
  638. deleEleIndex:-1,//删除元素的位置,如果下次添加元素,先加到这个位置
  639. resultFormula:[],//=等号左边的数组
  640. processFormula:[],//=等号右边的数组
  641. checkGsId:'',//选中的公式id
  642. rightDict:[],//等号右边元素的字典
  643. processType:'',//选中的元素在等号哪边
  644. processSelectIndex:0,//选中的索引
  645. actiFunIndex:0,//元素下挂载的计算式的索引
  646. chooseEleVisible:false,//选择元素弹窗
  647. argumenObj:{},
  648. symbolReg:/(\+|-|\*|\/)(.+)/,
  649. operatorReg : /^\+|-|\*|%/,//加减乘除
  650. startFCRegExp : /^FC\.([a-zA-Z\d]+)\(/,// 匹配开始的FC.xxx(
  651. componentMap:{
  652. '日期偏移':'date-deviation',
  653. '日期格式化':'date-format',
  654. // '去重':'datas-repeat',
  655. // '去空':'datas-reme',
  656. '下标取数':'datas-getlist',
  657. // '数组转字符串':"datas-join",
  658. '判断':'ifelse',
  659. },
  660. eleListComp:[],//方法下面元素列表
  661. eleTableListComp:[],//方法下面元素表列表
  662. eleTableIdComp:'',//方法下面元素表id
  663. handwritVisible:false,//手写弹框
  664. handwritText:'',//文本
  665. handwritEleMap:'',//元素map
  666. paramDataList:[],//节点参数数组
  667. deviationRange:{
  668. show:false,//显示
  669. showSelectEle:false,//显示选择元素
  670. datas:{
  671. symbol:'【min,max】',
  672. model:'1',
  673. arguments1:'',
  674. arguments2:'',
  675. },
  676. },//允许偏差值范围
  677. version:1,//版本号,以后可能会有不兼容旧公式的改动,留作以后可能用来判断
  678. curData:{},
  679. curNode:{},
  680. treeId:'',
  681. page: {
  682. size: 10,
  683. current: 1,
  684. total: 2
  685. },
  686. eleListable:false,
  687. eleListComploading:false,
  688. eleListjudge:false,
  689. input3:'',
  690. rootNodeData: [],
  691. nodeZero: null,
  692. resolveZero: null,
  693. loading: false,
  694. itemList:[],
  695. inputele:'',
  696. inputelepian:'',
  697. inputelejudge:'',
  698. moreConditions:[],//多条件判断数组
  699. isMore:false,//是否多条件
  700. isGetData:false,//是否获取数据
  701. dataListGet:[],//获取的数据列表
  702. isDataChange:false,//数据是否变化
  703. dataForm:'',
  704. remark:'',
  705. formulaDetailMap:{},//公式详情map
  706. containerFocused:false,//公式编辑区域是否聚焦
  707. };
  708. },
  709. computed: {
  710. ...mapGetters(["userInfo"]),
  711. // selectEleFormulaText:function(){
  712. // let text = '';
  713. // this.selectEleFormula.forEach((Element)=>{
  714. // text+=Element.name;
  715. // })
  716. // return text
  717. // }
  718. //等式中选中的元素
  719. equationSelectEle:function(){
  720. if(this.processType){
  721. return this[this.processType][this.processSelectIndex];
  722. }else{
  723. return null;
  724. }
  725. },
  726. //是否显示元素下挂载的计算式信息
  727. showFunDetail:function(){
  728. if(this.equationSelectEle && this.equationSelectEle.children && this.equationSelectEle.children.length>0){
  729. return true;
  730. }else{
  731. return false;
  732. }
  733. },
  734. },
  735. watch: {
  736. selectEleFormula: {
  737. handler() {
  738. this.checkDefaultSelection();
  739. this.$nextTick(() => {
  740. this.$el.querySelector('.sele-ele-box1').focus();
  741. });
  742. },
  743. deep: true
  744. },
  745. },
  746. created() {
  747. // this.wbsid = this.$route.query.wbsid;
  748. // this.eleid = this.$route.query.eleid;
  749. // this.nodeid = this.$route.query.nodeid;
  750. this.pid = this.$route.query.pid;//项目id 私有树才有
  751. console.log(this.pid,'this.pid');
  752. console.log(this.globaltype,'this.globaltype');
  753. this.init();
  754. },
  755. methods: {
  756. async init() {
  757. this.getEleDeatil();
  758. this.getProjectList();
  759. // this.geTreeData();
  760. await this.getTypeMap();
  761. this.formulaStringToArray();
  762. },
  763. //#region 接口
  764. async tabTypeLazyTree (parentId, projectId,current,size,titleName) {//清表树
  765. const { data: res } = await tabTypeLazyTree({ parentId, projectId,current,size,titleName })
  766. if (res.code === 200) {
  767. return res.data;
  768. }
  769. },
  770. treeLoadNode(node, resolve){
  771. let parentId = 12345678910;
  772. console.log(node.level, "node.level")
  773. if (node.level != 0) {
  774. parentId = node.data.id;
  775. }
  776. // 开启 “加载中” 动画
  777. if(node.level == 0) this.loading = true
  778. if(!this.elementType) {
  779. tabTypeLazyTreeAll({parentId,current:1,size:1000,hasPartFormula:this.fromcurNode.hasPartFormula}).then(res => {
  780. // 请求接口,返回数据
  781. let data = res.data.data.records;
  782. this.loading=false
  783. resolve(data);
  784. this.$nextTick(() => {
  785. let expandid = this.tableType ? Number(this.fromcurNode.tableType)-1 : Number(this.fromcurNode.parentId)-1;
  786. node.childNodes[expandid].expand();
  787. let paramsId = this.fromcurNode.initTableId
  788. let isArray = Array.isArray(this.$refs.tree)
  789. console.log(isArray, "isArray")
  790. if (isArray) {
  791. // 根据 id 获取节点信息
  792. this.$refs.tree[0].setCurrentKey(paramsId);
  793. } else {
  794. this.$refs.tree.setCurrentKey(paramsId);
  795. }
  796. this.getNodeDetail(this.fromcurNode)
  797. this.getNodeDetailComp(this.fromcurNode)
  798. })
  799. })
  800. } else if(this.elementType) {
  801. tabTypeLazyTree({parentId,projectId:this.projectid,pcurrent:1,size:1000}).then(res => {
  802. // 请求接口,返回数据
  803. let data = res.data.data.records;
  804. this.loading=false
  805. resolve(data);
  806. this.$nextTick(() => {
  807. let expandid=Number(this.fromcurNode.parentId)-1
  808. node.childNodes[expandid].expand();
  809. let paramsId = this.fromcurNode.id
  810. console.log(this.nodeid,'this.initTableId');
  811. let isArray = Array.isArray(this.$refs.tree)
  812. if (isArray) {
  813. // 根据 id 获取节点信息
  814. this.$refs.tree[0].setCurrentKey(paramsId);
  815. } else {
  816. this.$refs.tree.setCurrentKey(paramsId);
  817. }
  818. this.getNodeDetail(this.fromcurNode)
  819. this.getNodeDetailComp(this.fromcurNode)
  820. })
  821. })
  822. }
  823. },
  824. //搜索树
  825. treeFilter() {
  826. console.log('搜索');
  827. this.eleTableList=[];
  828. this.eleList=[];
  829. this.eleListComp=[];
  830. this.eleTableListComp =[];
  831. this.eleTableId='';
  832. this.eleTableIdComp=''
  833. if (this.filterText) {
  834. this.allTreeShow = true;
  835. this.allTreeData=[]
  836. if (!this.allTreeData.length) {
  837. this.treeloading = true;
  838. if(!this.elementType){
  839. let parentId=''
  840. if(this.curData.hasChildren){
  841. parentId=this.curData.id
  842. }else{
  843. // parentId=this.curData.parentId
  844. parentId=''
  845. }
  846. tabTypeLazyTreeAll({parentId:parentId,current:1,size:1000,titleName:this.filterText}).then((res) => {
  847. this.treeloading = false;
  848. this.allTreeData = res.data.data.records;
  849. this.$nextTick(() => {
  850. console.log("过滤");
  851. this.$refs.treeall.filter(this.filterText);
  852. });
  853. })
  854. }else if(this.elementType){
  855. let parentId=''
  856. if(this.curData.hasChildren){
  857. parentId=this.curData.id
  858. }else{
  859. // parentId=this.curData.parentId
  860. parentId=''
  861. }
  862. console.log(parentId,'parentId');
  863. tabTypeLazyTree({parentId:parentId,projectId:this.projectid,pcurrent:1,size:1000,titleName:this.filterText}).then((res) => {
  864. this.treeloading = false;
  865. this.allTreeData = res.data.data.records;
  866. });
  867. this.$nextTick(() => {
  868. console.log("过滤");
  869. this.$refs.treeall.filter(this.filterText);
  870. });
  871. }
  872. } else {
  873. this.$refs.treeall.filter(this.filterText);
  874. }
  875. } else {
  876. this.$message.warning('请先输入文字')
  877. this.allTreeShow = false;
  878. }
  879. },
  880. clearfiltertext(){
  881. this.allTreeShow=false;
  882. this.eleTableList=[];
  883. this.eleList=[];
  884. this.eleListComp=[];
  885. this.eleTableListComp =[];
  886. this.eleTableId='';
  887. this.eleTableIdComp=''
  888. },
  889. filterNode(value, data) {
  890. if (!value) return true;
  891. return data.title.indexOf(value) !== -1;
  892. },
  893. //获取项目列表
  894. getProjectList() {
  895. getProjectList(1, 999).then((res) => {
  896. this.projectList = res.data.data.records;
  897. });
  898. },
  899. //选择公式处理
  900. handleSelect(index,indexPath) {
  901. //console.log(index,'index')
  902. //console.log(indexPath,'indexPath')
  903. if(this.operationVisible){
  904. this.openerationSelect(index,indexPath)
  905. }else{
  906. this.equationSelect(index,indexPath)
  907. }
  908. },
  909. //在选择元素模式下点选计算式
  910. openerationSelect(index,indexPath){
  911. if(indexPath[0]!='基础运算'){
  912. this.$message({
  913. type: "warning",
  914. message: "当前只能使用基础运算"
  915. });
  916. return;
  917. }
  918. let formulaindex = Number(indexPath[1].split('-')[1])-1;
  919. this.eleAddFormulaHandle(this.formulaList[indexPath[0]][formulaindex]);
  920. },
  921. //溯源项目id切换
  922. projectChange(id) {
  923. for (let i = 0; i < this.projectList.length; i++) {
  924. if (id == this.projectList[i].id) {
  925. this.curProjiect = this.projectList[i];
  926. //根据项目id获取合同段列表
  927. findContractByProjectId(this.curProjiect.id).then((res) => {
  928. this.contractList = res.data.data;
  929. this.contractId = "";
  930. });
  931. return;
  932. }
  933. }
  934. },
  935. operationEdit(){
  936. this.selectEleFormula= JSON.parse(JSON.stringify(this.processFormula));
  937. this.operationVisible = true;
  938. // 确保容器获得焦点
  939. this.$nextTick(() => {
  940. this.$el.querySelector('.sele-ele-box1').focus();
  941. });
  942. },
  943. eleAddFormula(){
  944. for (let i = 0; i < this.eleList.length; i++) {
  945. if (this.eleList[i].checked) {
  946. this.eleAddFormulaHandle(this.eleList[i]);
  947. break;
  948. }
  949. }
  950. },
  951. eleChang(value,item){
  952. if(value){
  953. //简单语法判断
  954. if(this.itemList.length != 0 && this.deleEleIndex < 0){
  955. let lastEle = this.itemList[this.itemList.length-1];
  956. if(lastEle.type == 'Text'){
  957. this.$message({
  958. type: "warning",
  959. message: "元素无法连续出现在输入值后面"
  960. });
  961. item.checked = false;
  962. return;
  963. }
  964. if(lastEle.type == 'Brackets' && lastEle.name == ')'){
  965. this.$message({
  966. type: "warning",
  967. message: "元素无法连续出现在右括号后面"
  968. });
  969. item.checked = false;
  970. return;
  971. }
  972. }
  973. let lastEle = this.selectEleFormula[this.selectEleFormula.length-1];
  974. if(this.selectEleFormula.length == 0 || lastEle.type == 'Operator' || lastEle.type == 'Brackets' || lastEle.name == '('){ /* 存在运算符 */
  975. this.eleAddFormulaHandle(item);
  976. } else {
  977. this.itemList.push(item);
  978. }
  979. }else{
  980. let index = -1;
  981. for (let i = 0; i < this.itemList.length; i++) {
  982. if(this.itemList[i].id == item.id){
  983. index = i;
  984. break;
  985. }
  986. }
  987. if(index>-1){
  988. this.itemList.splice(index,1);
  989. }
  990. }
  991. },
  992. //快捷添加运算符号
  993. addOperator(operator){
  994. if( this.itemList.length>0){
  995. this.itemList.forEach(e => {
  996. let lastEle = this.selectEleFormula[this.selectEleFormula.length-1];
  997. if(this.selectEleFormula.length != 0 && lastEle.type != 'Operator' && lastEle.type != 'Brackets' && lastEle.name != '('){ /* 不存在运算符 */
  998. this.eleAddFormulaHandle(this.formulaMap[operator]);
  999. }
  1000. this.eleAddFormulaHandle(e);
  1001. })
  1002. }else{
  1003. if(this.curSeleEleIndex===-1 || this.curSeleEleIndex === this.selectEleFormula.length - 1){ /* 没选择值或者选择最后一个的时候直接添加符号 */
  1004. this.eleAddFormulaHandle(this.formulaMap[operator]);
  1005. }else{ /* 选择中间的值,如果下一个是符号这替换,反之则在指定的位置添加 */
  1006. this.randomaddOperator(this.formulaMap[operator])
  1007. }
  1008. }
  1009. this.itemList=[];
  1010. },
  1011. //随机插入运算符
  1012. randomaddOperator(ele){
  1013. //type 是true 表示在元素右边插入
  1014. let item={
  1015. type:'Operator',
  1016. name:this.symbolReg.exec(ele.name)[1],
  1017. selected:false,
  1018. template:ele.template
  1019. }
  1020. let index = Number(this.curSeleEleIndex);
  1021. let currentName = this.selectEleFormula[index]
  1022. if (currentName.type === 'Operator') { /* 选择的符号的时候,直接替换 */
  1023. this.selectEleFormula.splice(index,1, item)
  1024. }
  1025. else { /* 选择元素的时候,如果下一个是符号则替换,如果下一个是元素则添加 */
  1026. let size = index + 1;
  1027. let lastName = this.selectEleFormula[size]
  1028. if (lastName.type === 'Operator') { /* 是符号,替换 */
  1029. this.selectEleFormula.splice(size,1, item)
  1030. }
  1031. else { /* 是元素,添加 */
  1032. this.selectEleFormula.splice(size,0, item)
  1033. }
  1034. }
  1035. },
  1036. //把元素加到公式里
  1037. eleAddFormulaHandle(ele){
  1038. if(ele.tableElementKey){
  1039. //元素
  1040. if(this.deleEleIndex > -1 && this.selectEleFormula.length-1 >= this.deleEleIndex){
  1041. //删除元素的位置,如果下次添加元素,先加到这个位置
  1042. this.selectEleFormula.splice(this.deleEleIndex,0,{
  1043. type:'Element',
  1044. name:ele.eName,
  1045. id:ele.id,
  1046. selected:false,
  1047. tableElementKey:ele.tableElementKey,
  1048. children:[],
  1049. })
  1050. this.deleEleIndex = -1;
  1051. }else{
  1052. this.selectEleFormula.push({
  1053. type:'Element',
  1054. name:ele.eName,
  1055. id:ele.id,
  1056. selected:false,
  1057. tableElementKey:ele.tableElementKey,
  1058. children:[],
  1059. })
  1060. this.deleEleIndex = -1;
  1061. }
  1062. }else if(ele.template && ele.example){
  1063. //简单语法判断
  1064. if(this.selectEleFormula.length == 0){
  1065. this.$message({
  1066. type: "warning",
  1067. message: "公式开头不能是运算符号"
  1068. });
  1069. return;
  1070. }else{
  1071. let lastEle = this.selectEleFormula[this.selectEleFormula.length-1];
  1072. if(lastEle.type == 'Operator'){
  1073. this.$message({
  1074. type: "warning",
  1075. message: "运算符号无法连续出现在运算符号后面"
  1076. });
  1077. return;
  1078. }
  1079. if(lastEle.type == 'Brackets' && lastEle.name == '('){
  1080. this.$message({
  1081. type: "warning",
  1082. message: "运算符号无法连续出现在左括号后面"
  1083. });
  1084. return;
  1085. }
  1086. }
  1087. //运算符号
  1088. this.selectEleFormula.push({
  1089. type:'Operator',
  1090. name:this.symbolReg.exec(ele.name)[1],
  1091. selected:false,
  1092. template:ele.template
  1093. })
  1094. }else if(ele.type == 'Brackets'){
  1095. //括号
  1096. this.selectEleFormula.splice(ele.selectIndex,0,{
  1097. type:'Brackets',
  1098. name:ele.name,
  1099. selected:false,
  1100. })
  1101. }else if(ele.type == 'Text'){
  1102. //输入值
  1103. this.selectEleFormula.push({
  1104. type:'Text',
  1105. name:ele.name,
  1106. selected:false,
  1107. })
  1108. }else if(ele.k){
  1109. //节点参数
  1110. this.selectEleFormula.push({
  1111. type:'ParamData',
  1112. name:ele.name,
  1113. selected:false,
  1114. id:ele.id,
  1115. v:ele.v,
  1116. k:ele.k,
  1117. children:[],
  1118. })
  1119. }
  1120. },
  1121. //添加括号
  1122. addBrackets(text,type){
  1123. //type 是true 表示在元素右边插入
  1124. if(this.curSeleEleIndex == Number(this.curSeleEleIndex)){
  1125. this.eleAddFormulaHandle({
  1126. type:'Brackets',
  1127. name:text,
  1128. selectIndex:type?Number(this.curSeleEleIndex)+1:this.curSeleEleIndex
  1129. })
  1130. //如果在左边插入index要增1
  1131. if(!type){
  1132. this.curSeleEleIndex = Number(this.curSeleEleIndex)+1;
  1133. }
  1134. }
  1135. },
  1136. addText(){
  1137. this.inputVisible = true;
  1138. },
  1139. //添加输入值
  1140. addTextHandle(){
  1141. //简单语法判断
  1142. if(this.selectEleFormula.length != 0){
  1143. let lastEle = this.selectEleFormula[this.selectEleFormula.length-1];
  1144. if(lastEle.type == 'Element'){
  1145. this.$message({
  1146. type: "warning",
  1147. message: "输入值无法连续出现在元素后面"
  1148. });
  1149. return;
  1150. }
  1151. if(lastEle.type == 'Text'){
  1152. this.$message({
  1153. type: "warning",
  1154. message: "输入值无法连续出现在输入值后面"
  1155. });
  1156. return;
  1157. }
  1158. if(lastEle.type == 'Brackets' && lastEle.name == ')'){
  1159. this.$message({
  1160. type: "warning",
  1161. message: "输入值无法连续出现在右括号后面"
  1162. });
  1163. return;
  1164. }
  1165. }
  1166. this.eleAddFormulaHandle({
  1167. type:'Text',
  1168. name:this.inputText
  1169. })
  1170. this.inputVisible = false;
  1171. },
  1172. //勾选元素
  1173. eleCheckHandle(checked,item){
  1174. if(checked){
  1175. this.eleList.forEach((ele)=>{
  1176. this.$set(ele,'checked',false);
  1177. //ele.checked = false;
  1178. })
  1179. item.checked = true;
  1180. }
  1181. },
  1182. //点选公式中的元素
  1183. eleFormulaClick(obj, index) {
  1184. // 先取消所有选中状态
  1185. this.selectEleFormula.forEach(item => {
  1186. item.selected = false;
  1187. });
  1188. // 设置当前选中项
  1189. obj.item.selected = obj.selected;
  1190. this.curSeleEleIndex = index;
  1191. // 确保容器获得焦点以接收键盘事件
  1192. this.$el.querySelector('.sele-ele-box1').focus();
  1193. // 处理类型为ELEMENT的元素,提取tableElementKey
  1194. console.log(obj.item,'obj.item.');
  1195. if (obj.item.type === 'Element' && obj.item.tableElementKey) {
  1196. // 从类似"m_20220928142210_1575007943793836032:key_1"的格式中提取key部分
  1197. const keyParts = obj.item.tableElementKey.split('key');
  1198. this.selectedTableKey = keyParts.length > 1 ? 'key'+keyParts[1] : null;
  1199. } else {
  1200. // 非ELEMENT类型清空选中状态
  1201. this.selectedTableKey = null;
  1202. }
  1203. },
  1204. //取消勾选
  1205. unCheckEleFormulac(eleId){
  1206. for (let i = 0; i < this.eleList.length; i++) {
  1207. if(this.eleList[i].id == eleId){
  1208. this.eleList[i].checked = false;
  1209. }
  1210. }
  1211. },
  1212. //删除点选公式中的元素
  1213. removeSelect(){
  1214. if(this.curSeleEleIndex > -1 && this.curSeleEleIndex <= this.selectEleFormula.length-1){
  1215. if(this.selectEleFormula[this.curSeleEleIndex].type == 'Element'){
  1216. //删除元素的位置,如果下次添加元素,先加到这个位置
  1217. this.deleEleIndex = this.curSeleEleIndex;
  1218. this.unCheckEleFormulac(this.selectEleFormula[this.curSeleEleIndex].id)
  1219. }
  1220. this.selectEleFormula.splice(this.curSeleEleIndex,1);
  1221. //this.curSeleEleIndex = -1;
  1222. }
  1223. },
  1224. //赋值给等号右边的数组
  1225. operationHandle(){
  1226. //检测左右括号数量是否相等
  1227. let lBracketNum = 0;
  1228. let rBracketNum = 0;
  1229. this.selectEleFormula.forEach((ele)=>{
  1230. if(ele.type == 'Brackets'){
  1231. if(ele.name == '('){
  1232. lBracketNum++;
  1233. }else if(ele.name == ')'){
  1234. rBracketNum++;
  1235. }
  1236. }
  1237. })
  1238. if(lBracketNum != rBracketNum){
  1239. this.$message({
  1240. type: "warning",
  1241. message: "左右括号数量不相等,请先检查是否正确"
  1242. });
  1243. return;
  1244. }
  1245. this.processFormula = JSON.parse(JSON.stringify(this.selectEleFormula));
  1246. this.operationVisible = false;
  1247. this.allTreeShow=false;
  1248. this.filterText=''
  1249. },
  1250. canceloperationVisible(){
  1251. this.operationVisible=false;
  1252. this.allTreeShow=false;
  1253. this.filterText=''
  1254. this.treeId=''
  1255. this.itemList=[];
  1256. this.eleList.forEach((ele)=>{
  1257. this.$set(ele,'checked',false);
  1258. //ele.checked = false;
  1259. })
  1260. console.log('取消');
  1261. },
  1262. //点选等式中的元素
  1263. equationClick({selected,item},index,arrName){
  1264. this.checkGsId=item.id
  1265. if(selected){
  1266. this.resultFormula.forEach((ele)=>{
  1267. ele.selected = false;
  1268. })
  1269. this.processFormula.forEach((ele)=>{
  1270. ele.selected = false;
  1271. })
  1272. this.processSelectIndex = index;
  1273. this.processType = arrName;
  1274. item.selected = true;
  1275. if(this.showFunDetail){
  1276. //切到第一个
  1277. this.actiFunIndex = '0';
  1278. }
  1279. }else{
  1280. this.processType = '';
  1281. }
  1282. },
  1283. //获取当前元素的表名
  1284. getItemTableName(item){
  1285. if(item.type==="Element"){
  1286. this.rightDict.forEach((ele)=>{
  1287. if(ele.ekey===item.tableElementKey){
  1288. item.tableName= ele.tableName
  1289. }
  1290. })
  1291. }
  1292. },
  1293. //在等式模式下点选计算式
  1294. equationSelect(index,indexPath){
  1295. debugger
  1296. if(!this.equationSelectEle ||(this.equationSelectEle && !(this.equationSelectEle.type == 'Element' || this.equationSelectEle.type == 'ParamData')) ){
  1297. this.$message({
  1298. type: "warning",
  1299. message: "请先选中元素"
  1300. });
  1301. return;
  1302. }
  1303. let formulaindex = Number(indexPath[1].split('-')[1])-1;
  1304. let expression = this.formulaList[indexPath[0]][formulaindex];
  1305. if(expression.type ==1){
  1306. return;
  1307. }
  1308. //alert(JSON.stringify(expression.template))
  1309. //debugger
  1310. let obj = Object.assign({}, expression);
  1311. //obj.template = JSON.parse(obj.template);
  1312. obj.arguments = new Array(obj.template.args.length);
  1313. let ele = {};
  1314. if(this.equationSelectEle.type == 'ParamData'){
  1315. ele = {
  1316. type:'ParamData',
  1317. name:this.equationSelectEle.name,
  1318. id:this.equationSelectEle.id,
  1319. selected:false,
  1320. v:this.equationSelectEle.v,
  1321. k:this.equationSelectEle.k,
  1322. }
  1323. }else{
  1324. ele = {
  1325. id:this.equationSelectEle.id,
  1326. name:this.equationSelectEle.name,
  1327. selected:false,
  1328. tableElementKey:this.equationSelectEle.tableElementKey,
  1329. type:"Element",
  1330. };
  1331. }
  1332. let tg=obj.template.args.findIndex(x=>x.m!=='常量');
  1333. obj.arguments[tg] = ele;
  1334. this.equationSelectEle.children.push(obj);
  1335. //跳转到最新的标签
  1336. this.actiFunIndex = (this.equationSelectEle.children.length-1).toString();
  1337. },
  1338. //选择元素
  1339. chooseEleHandle(){
  1340. for (let i = 0; i < this.eleList.length; i++) {
  1341. if (this.eleList[i].checked) {
  1342. let ele = this.eleList[i];
  1343. let obj = {};
  1344. if(ele.k){
  1345. obj = {
  1346. type:'ParamData',
  1347. name:ele.name,
  1348. id:ele.id,
  1349. selected:false,
  1350. v:ele.v,
  1351. k:ele.k,
  1352. children:[],
  1353. }
  1354. }else{
  1355. obj = {
  1356. type:'Element',
  1357. name:ele.eName,
  1358. id:ele.id,
  1359. selected:false,
  1360. tableElementKey:ele.tableElementKey,
  1361. children:[],
  1362. }
  1363. }
  1364. this.$set(this.argumenObj.arguments,this.argumenObj.index,obj);
  1365. this.chooseEleVisible = false;
  1366. break;
  1367. }
  1368. }
  1369. },
  1370. //显示选择元素弹窗
  1371. showChooseEle(argumenObj){
  1372. this.argumenObj = argumenObj;
  1373. this.chooseEleVisible = true;
  1374. // this.eleList=[];
  1375. // this.eleTableList=[];
  1376. this.eleTableId='';
  1377. this.allTreeShow=false;
  1378. this.filterText=''
  1379. this.eleList.forEach((ele)=>{
  1380. this.$set(ele,'checked',false);
  1381. //ele.checked = false;
  1382. })
  1383. // this.treeId=''
  1384. },
  1385. //移除挂载的函数
  1386. removeFun(name){
  1387. //console.log(name)
  1388. this.equationSelectEle.children.splice(Number(name), 1);
  1389. },
  1390. //切换公式tab标签
  1391. funLeave(activeName, oldActiveName){
  1392. if(oldActiveName){
  1393. let formula = this.equationSelectEle.children[Number(oldActiveName)];
  1394. if(formula){
  1395. return this.checkFormulaLegal(formula);
  1396. }
  1397. }
  1398. },
  1399. //检测公式合法
  1400. checkFormulaLegal(formula){
  1401. if(!formula.arguments){
  1402. return false;
  1403. }
  1404. //当前选中的元素
  1405. let curEle = this.equationSelectEle;
  1406. let isIn = false;
  1407. for (let i = 0; i < formula.arguments.length; i++) {
  1408. if(Array.isArray(formula.arguments[i])){
  1409. for(let j=0;j<formula.arguments[i].length;j++){
  1410. if(formula.arguments[i][j] && formula.arguments[i][j].id ==curEle.id){
  1411. isIn = true;
  1412. break;
  1413. }
  1414. }
  1415. if(isIn){
  1416. break;
  1417. }
  1418. }else if(formula.arguments[i] && formula.arguments[i].id ==curEle.id){
  1419. isIn = true;
  1420. break;
  1421. }
  1422. }
  1423. if(!isIn){
  1424. this.$message({
  1425. type: "warning",
  1426. message: "参数必须有一个值是当前元素"
  1427. });
  1428. return false;
  1429. }
  1430. return true;
  1431. },
  1432. //保存公式
  1433. saveFormula(){
  1434. console.log('保存1',this.pid);
  1435. // let obj = formulaArrayToString(this.processFormula,this.resultFormula);
  1436. if(this.$refs.dynamiccomponent&&this.$refs.dynamiccomponent.length>0&&this.$refs.dynamiccomponent[0]&& this.$refs.dynamiccomponent[0].symbol=='more'){
  1437. //多条件保存公式
  1438. console.log('this.$refs.conditionList[0]',this.$refs.dynamiccomponent[0].conditionList);
  1439. let resMore=formatArrayMore(this.$refs.dynamiccomponent[0].conditionList);
  1440. const resJson=generateResult(this.$refs.dynamiccomponent[0].conditionList);
  1441. let remark=this.$refs.dynamiccomponent[0].remark;
  1442. console.log(remark,'remark');
  1443. console.log(resJson,'resJson');
  1444. if(this.formulaid){
  1445. updateFormula({
  1446. id:this.formulaid,
  1447. formula:'',
  1448. formulas:resMore,
  1449. remark:remark,
  1450. nodeId:this.nodeid,
  1451. elementId:this.eleid,
  1452. scale:this.isRetain?this.retainNum:'',
  1453. number:number,
  1454. map:JSON.stringify(resJson),
  1455. scope:this.globaltype,
  1456. // projectId:this.curProjiect.id||this.projectId,
  1457. projectId:this.curProjiect.id||this.pid,
  1458. dev:deviationRangeText
  1459. }).then(()=>{
  1460. this.formulaStringToArray();
  1461. this.$message({
  1462. type: "success",
  1463. message: "修改成功"
  1464. });
  1465. })
  1466. }else{
  1467. saveFormula({
  1468. formula:'',
  1469. formulas:resMore,
  1470. remark:remark,
  1471. nodeId:this.nodeid,
  1472. elementId:this.eleid,
  1473. scale:this.isRetain?this.retainNum:'',
  1474. number:number,
  1475. map:JSON.stringify(resJson),
  1476. scope:this.globaltype,
  1477. dev:deviationRangeText,
  1478. projectId:this.curProjiect.id||this.pid,
  1479. ver:this.version
  1480. }).then((res)=>{
  1481. if(res.data.data){
  1482. this.formulaid = res.data.data;
  1483. }
  1484. this.formulaStringToArray();
  1485. this.$message({
  1486. type: "success",
  1487. message: "保存成功"
  1488. });
  1489. })
  1490. }
  1491. return;
  1492. }else if(this.$refs.dynamiccomponent&&this.$refs.dynamiccomponent.length>0&&this.$refs.dynamiccomponent[0]&& this.$refs.dynamiccomponent[0].symbol=='getData'){
  1493. //数据获取保存公式
  1494. const dataRes = this.$refs.dynamiccomponent[0].getDataConditionData();
  1495. console.log(dataRes,'dataRes');
  1496. const result =dataRes.result;
  1497. const mapEle = JSON.stringify(dataRes.mapEle);
  1498. console.log(mapEle,'mapEle');
  1499. if(this.formulaid){
  1500. updateFormula({
  1501. id:this.formulaid,
  1502. formula:"FC.switchCase"+'('+result+')',
  1503. remark:'',
  1504. nodeId:this.nodeid,
  1505. elementId:this.eleid,
  1506. scale:this.isRetain?this.retainNum:'',
  1507. number:number,
  1508. map:mapEle,
  1509. scope:this.globaltype,
  1510. // projectId:this.curProjiect.id||this.projectId,
  1511. projectId:this.curProjiect.id||this.pid,
  1512. dev:deviationRangeText
  1513. }).then(()=>{
  1514. this.formulaStringToArray();
  1515. this.$message({
  1516. type: "success",
  1517. message: "修改成功"
  1518. });
  1519. })
  1520. }else{
  1521. saveFormula({
  1522. formula:"FC.switchCase" +'('+result+')',
  1523. remark:'',
  1524. nodeId:this.nodeid,
  1525. elementId:this.eleid,
  1526. scale:this.isRetain?this.retainNum:'',
  1527. number:number,
  1528. map:mapEle,
  1529. scope:this.globaltype,
  1530. dev:deviationRangeText,
  1531. // projectId:this.curProjiect.id||this.projectId,
  1532. projectId:this.curProjiect.id||this.pid,
  1533. ver:this.version
  1534. }).then((res)=>{
  1535. if(res.data.data){
  1536. this.formulaid = res.data.data;
  1537. }
  1538. this.formulaStringToArray();
  1539. this.$message({
  1540. type: "success",
  1541. message: "保存成功"
  1542. });
  1543. })
  1544. }
  1545. return;
  1546. }else if(this.$refs.dynamiccomponent&&this.$refs.dynamiccomponent.length>0&&this.$refs.dynamiccomponent[0]&& this.$refs.dynamiccomponent[0].formData){
  1547. console.log(this.$refs.dynamiccomponent[0],'this.$refs.dynamiccomponent[0');
  1548. const resForm=this.$refs.dynamiccomponent[0].getDataChangeList();
  1549. console.log(resForm,'resForm');
  1550. //数据自变保存
  1551. if(this.formulaid){
  1552. updateFormula({
  1553. id:this.formulaid,
  1554. formula:resForm.test,
  1555. remark:'',
  1556. nodeId:this.nodeid,
  1557. elementId:this.eleid,
  1558. scale:this.isRetain?this.retainNum:'',
  1559. number:number,
  1560. map:JSON.stringify(resForm.map),
  1561. scope:this.globaltype,
  1562. // projectId:this.curProjiect.id||this.projectId,
  1563. projectId:this.curProjiect.id||this.pid,
  1564. dev:deviationRangeText
  1565. }).then(()=>{
  1566. this.formulaStringToArray();
  1567. this.$message({
  1568. type: "success",
  1569. message: "修改成功"
  1570. });
  1571. })
  1572. }else{
  1573. saveFormula({
  1574. formula:resForm.test,
  1575. remark:'',
  1576. nodeId:this.nodeid,
  1577. elementId:this.eleid,
  1578. scale:this.isRetain?this.retainNum:'',
  1579. number:number,
  1580. map:JSON.stringify(resForm.map),
  1581. scope:this.globaltype,
  1582. dev:deviationRangeText,
  1583. // projectId:this.curProjiect.id||this.projectId,
  1584. projectId:this.curProjiect.id||this.pid,
  1585. ver:this.version
  1586. }).then((res)=>{
  1587. if(res.data.data){
  1588. this.formulaid = res.data.data;
  1589. }
  1590. this.formulaStringToArray();
  1591. this.$message({
  1592. type: "success",
  1593. message: "保存成功"
  1594. });
  1595. })
  1596. }
  1597. return
  1598. }
  1599. let arr=JSON.parse(JSON.stringify(this.processFormula));
  1600. let filteredArr = arr.filter(item => item.id ===this.checkGsId);
  1601. // let obj = formulaArrayToString(filteredArr,this.resultFormula);
  1602. let obj
  1603. let obj2
  1604. obj = formulaArrayToString(this.processFormula,this.resultFormula);
  1605. obj2 = formulaArrayToString(filteredArr,this.resultFormula);
  1606. // 判断 obj2.text 是否包含 FC.ifelse
  1607. if (obj2.text && obj2.text.includes('FC.ifelse')) {
  1608. obj = obj2; // 如果包含 FC.ifelse,使用 obj2
  1609. }
  1610. let deviationRangeText = rangeToString(this.deviationRange.datas,obj.eleMap);
  1611. obj.eleMap.deviationRangeJson = JSON.stringify(this.deviationRange.datas);
  1612. //console.log(obj.eleMap)
  1613. //return;
  1614. //特殊公式会有number
  1615. let number = '';
  1616. for (let i = 0; i < this.processFormula.length; i++) {
  1617. if(this.processFormula[i].children){
  1618. for (let j = 0; j < this.processFormula[i].children.length; j++) {
  1619. if(this.processFormula[i].children[j].number){
  1620. number = this.processFormula[i].children[j].number;
  1621. break;
  1622. }
  1623. }
  1624. }
  1625. if(number){
  1626. break;
  1627. }
  1628. }
  1629. if(number === ''){
  1630. for (let i = 0; i < this.resultFormula.length; i++) {
  1631. if(this.resultFormula[i].children){
  1632. for (let j = 0; j < this.resultFormula[i].children.length; j++) {
  1633. if(this.resultFormula[i].children[j].number){
  1634. number = this.resultFormula[i].children[j].number;
  1635. break;
  1636. }
  1637. }
  1638. }
  1639. if(number){
  1640. break;
  1641. }
  1642. }
  1643. }
  1644. //console.log(obj)
  1645. //console.log(text);
  1646. if(this.formulaid){
  1647. updateFormula({
  1648. id:this.formulaid,
  1649. formula:obj.text,
  1650. remark:'',
  1651. nodeId:this.nodeid,
  1652. elementId:this.eleid,
  1653. scale:this.isRetain?this.retainNum:'',
  1654. number:number,
  1655. map:JSON.stringify(obj.eleMap),
  1656. scope:this.globaltype,
  1657. // projectId:this.curProjiect.id||this.projectId,
  1658. projectId:this.curProjiect.id||this.pid,
  1659. dev:deviationRangeText
  1660. }).then((result)=>{
  1661. let msg='修改成功';
  1662. if(result.data.msg=='公式已删除'){this.formulaid='';msg=result.data.msg;}
  1663. this.formulaStringToArray();
  1664. this.$message({
  1665. type: "success",
  1666. message: msg
  1667. });
  1668. })
  1669. }else{
  1670. saveFormula({
  1671. formula:obj.text,
  1672. remark:'',
  1673. nodeId:this.nodeid,
  1674. elementId:this.eleid,
  1675. scale:this.isRetain?this.retainNum:'',
  1676. number:number,
  1677. map:JSON.stringify(obj.eleMap),
  1678. scope:this.globaltype,
  1679. // projectId:this.curProjiect.id||this.projectId,
  1680. projectId:this.curProjiect.id||this.pid,
  1681. dev:deviationRangeText,
  1682. ver:this.version
  1683. }).then((res)=>{
  1684. if(res.data.data){
  1685. this.formulaid = res.data.data;
  1686. }
  1687. this.formulaStringToArray();
  1688. this.$message({
  1689. type: "success",
  1690. message: "保存成功"
  1691. });
  1692. })
  1693. }
  1694. },
  1695. //把公式文本还原数组
  1696. async formulaStringToArray(){
  1697. let detail = (await formulaDetail({elementId:this.eleid,scope:this.globaltype,nodeId:this.nodeid,projectId:this.curProjiect.id||this.pid})).data.data;
  1698. console.log(detail);
  1699. this.remark== detail.remark;
  1700. //判断公式特殊处理
  1701. if(detail&&detail.formula.includes('FC.ifelseMulti')){
  1702. detail.formula = detail.formula.replace('FC.ifelseMulti','FC.ifelse');
  1703. this.isMore = true;
  1704. this.formulaDetailMap = detail.map;
  1705. this.moreConditions = restoreArrayMore(detail.formulas,this.formulaDetailMap)
  1706. }else if(detail&&detail.formula.includes('FC.switchCase')){
  1707. //数据获取
  1708. this.formulaDetailMap = detail.map;
  1709. detail.formula = detail.formula.replace('FC.switchCase','FC.ifelse');
  1710. this.isGetData = true;
  1711. this.dataListGet=detail.formula
  1712. console.log( this.dataListGet,' this.dataListGet');
  1713. }else if(detail&&detail.formula.includes('FC.dataChange')){
  1714. //数据自变
  1715. this.formulaDetailMap = detail.map;
  1716. this.isDataChange = true;
  1717. this.dataForm=detail.formula
  1718. console.log( this.dataForm,' this.dataListGet');
  1719. }
  1720. else{
  1721. this.isMore = false;
  1722. this.moreConditions = []
  1723. this.formulaDetailMap ={}
  1724. this.isGetData = false;
  1725. this.dataListGet=''
  1726. this.isDataChange = false;
  1727. this.dataForm='';
  1728. }
  1729. if(detail&&detail.id){
  1730. //获取右边元素的字典
  1731. let dictMap=detail.dict
  1732. let dictArr=[]
  1733. //遍历:
  1734. for(let i in dictMap){
  1735. dictArr.push(dictMap[i])
  1736. }
  1737. this.rightDict=dictArr
  1738. this.formulaid = detail.id;
  1739. let formula = formulaStringToArray(detail.formula,detail.map,this.formulaMap);
  1740. this.processFormula = formula.processFormula;
  1741. formula.resultFormula[0].id = this.resultFormula[0].id;
  1742. formula.resultFormula[0].name = this.resultFormula[0].name;
  1743. formula.resultFormula[0].tableElementKey = this.resultFormula[0].tableElementKey;
  1744. this.resultFormula[0].children = formula.resultFormula[0].children;
  1745. //允许偏差值范围
  1746. let mapObj = JSON.parse(detail.map);
  1747. if(mapObj.deviationRangeJson){
  1748. this.deviationRange.datas = JSON.parse(mapObj.deviationRangeJson);
  1749. }
  1750. }
  1751. if(detail&&detail.scale!=null&&detail.scale>=0){
  1752. this.isRetain = true;
  1753. this.retainNum = detail.scale;
  1754. }else{
  1755. this.isRetain = false;
  1756. this.retainNum=2
  1757. }
  1758. },
  1759. //设置动态组件里面的元素
  1760. setComponentEle(value,item,index){
  1761. if(value){
  1762. //console.log(this.$refs.dynamiccomponent[index])
  1763. this.$refs.dynamiccomponent[index].setELe(item);
  1764. }
  1765. },
  1766. //设置动态组件里面的元素
  1767. setDeviationRangeEle(value,item){
  1768. if(value){
  1769. //console.log(this.$refs.dynamiccomponent[index])
  1770. this.$refs.deviationrange.setELe(item);
  1771. }
  1772. },
  1773. async tabTypeLazyTreeAll ( parentId,current,size,titleName) {//清表树
  1774. console.log(parentId);
  1775. const { data: res } = await tabTypeLazyTreeAll({parentId,current,size,titleName} )
  1776. if (res.code === 200) {
  1777. return res.data
  1778. }
  1779. },
  1780. getNodeDetail(data,node){
  1781. console.log(data,node,'getNodeDetail');
  1782. this.curNode=node;
  1783. this.curData=data;
  1784. this.treeId=data.initTableId;
  1785. this.page.current=1;
  1786. this.page.currentPage=1;
  1787. this.input3=''
  1788. if(data.hasChildren===false||data.isLinkTable===2){
  1789. this.eleListable=true;
  1790. // getTableElments(data.initTableId ).then((res)=>{
  1791. // if(res.data.code == 200){
  1792. // this.eleList=res.data.data;
  1793. // this.eleTableList =res.data.data;
  1794. // this.eleListable=false;
  1795. // }
  1796. // })
  1797. this.eleTableList=[this.curData]||[]
  1798. this.eleTableId=this.eleTableList[0].id;
  1799. }
  1800. else{
  1801. this.eleListable=true;
  1802. this.eleList=[]
  1803. this.page.total=0
  1804. setTimeout(() => {
  1805. this.eleListable=false
  1806. }, 1000);
  1807. }
  1808. },
  1809. getEleDeatil(){
  1810. getEleDeatil(this.eleid).then((res)=>{
  1811. let ele = res.data.data;
  1812. this.resultFormula = [{
  1813. type:'Element',
  1814. name:ele.eName,
  1815. id:ele.id,
  1816. selected:false,
  1817. tableElementKey:ele.tableElementKey,
  1818. children:[],
  1819. }]
  1820. })
  1821. },
  1822. searchChange(){
  1823. this.eleListable=true;
  1824. getTableElments( this.treeId,this.inputele ).then((res)=>{
  1825. this.eleList=res.data.data;
  1826. this.eleListable=false;
  1827. })
  1828. },
  1829. searchChangepian(){
  1830. this.eleListComploading=true;
  1831. getTableElments( this.treeId,this.inputelepian ).then((res)=>{
  1832. this.eleListComp=res.data.data;
  1833. this.eleListComploading=false;
  1834. })
  1835. },
  1836. searchChangejudge(){
  1837. this.eleListjudge=true;
  1838. getTableElments( this.treeId,this.inputelejudge ).then((res)=>{
  1839. this.eleListComp=res.data.data;
  1840. this.eleListjudge=false;
  1841. })
  1842. },
  1843. clearinput(){
  1844. this.eleListable=true;
  1845. getTableElments( this.treeId ).then((res)=>{
  1846. this.eleList=res.data.data;
  1847. this.eleListable=false;
  1848. })
  1849. },
  1850. clearinputpian(){
  1851. // eleListComp
  1852. this.eleListComploading=true;
  1853. getTableElments( this.treeId ).then((res)=>{
  1854. this.eleListComp=res.data.data;
  1855. this.eleListComploading=false
  1856. })
  1857. },
  1858. clearinputjudge(){
  1859. this.eleListjudge=true;
  1860. getTableElments( this.treeId ).then((res)=>{
  1861. this.eleListComp=res.data.data;
  1862. })
  1863. this.eleListjudge=false;
  1864. },
  1865. getNodeDetailComp(data,node) {
  1866. this.treeId=data.initTableId;
  1867. this.curNode=node;
  1868. this.curData=data;
  1869. this.input3=''
  1870. if(data.hasChildren===false){
  1871. getTableElments(data.initTableId ).then((res)=>{
  1872. if(res.data.code==200){
  1873. if(res.data.data.length){
  1874. this.eleListComp=res.data.data;
  1875. this.eleTableListComp =res.data.data;
  1876. console.log( this.eleTableListComp,' this.eleTableListComp');
  1877. this.eleTableIdComp = this.eleTableListComp[0].id;
  1878. }
  1879. }
  1880. })
  1881. }
  1882. else{
  1883. this.eleListComp=[]
  1884. this.page.total=0
  1885. }
  1886. },
  1887. //取消方法下面 元素勾选
  1888. unCheckEleComp(eleId){
  1889. //console.log(eleId)
  1890. for (let i = 0; i < this.eleListComp.length; i++) {
  1891. if(this.eleListComp[i].id == eleId){
  1892. this.eleListComp[i].checked = false;
  1893. }
  1894. }
  1895. },
  1896. //手写模式
  1897. handwrit(){
  1898. try {
  1899. let obj = formulaArrayToString(this.processFormula,this.resultFormula);
  1900. this.handwritText = obj.text;
  1901. this.handwritEleMap = JSON.stringify(obj.eleMap);
  1902. this.handwritVisible = true;
  1903. } catch (error) {
  1904. console.error(error)
  1905. this.$message({
  1906. type: "error",
  1907. message: "生成公式文本失败,"+error
  1908. });
  1909. }
  1910. },
  1911. //转成配置用的数组
  1912. handwritTransform(){
  1913. try {
  1914. let formula = formulaStringToArray(this.handwritText,this.handwritEleMap,this.formulaMap);
  1915. this.processFormula = formula.processFormula;
  1916. formula.resultFormula[0].id = this.resultFormula[0].id;
  1917. formula.resultFormula[0].name = this.resultFormula[0].name;
  1918. formula.resultFormula[0].tableElementKey = this.resultFormula[0].tableElementKey;
  1919. this.resultFormula[0].children = formula.resultFormula[0].children;
  1920. this.handwritVisible = false;
  1921. } catch (error) {
  1922. console.error(error)
  1923. this.$message({
  1924. type: "error",
  1925. message: "转成配置用的数组失败,"+error
  1926. });
  1927. }
  1928. },
  1929. editorInit: function (editor) {
  1930. console.log('editorInit')
  1931. require('brace/ext/searchbox') //添加搜索功能
  1932. require('brace/ext/language_tools') //language extension prerequsite...
  1933. require('brace/mode/javascript') //language
  1934. require('brace/theme/github')
  1935. require('brace/snippets/javascript') //snippet
  1936. editor.session.setUseWrapMode(true);//切换自动换行
  1937. editor.setHighlightActiveLine(false);//设置行高亮显示
  1938. editor.setShowPrintMargin(false);
  1939. editor.setOptions({
  1940. enableLiveAutocompletion:true,//语法提示和补全
  1941. showInvisibles:true,//显示隐藏,空格,回车等
  1942. fontSize:'16px'
  1943. })
  1944. },
  1945. getTypeMap(){
  1946. return new Promise((resolve)=>{
  1947. getTypeMap().then((res)=>{
  1948. //console.log(res)
  1949. this.formulaList = res.data.data;
  1950. //生成map,方便查找
  1951. for (let key in this.formulaList) {
  1952. if(typeof(this.formulaList[key]) == 'object'){
  1953. this.formulaList[key].forEach((formula)=>{
  1954. formula.template = JSON.parse(formula.template);
  1955. if(this.operatorReg.test(formula.template.ft)){
  1956. this.formulaMap[formula.template.ft] = formula;
  1957. }else if(this.startFCRegExp.test(formula.template.ft)){
  1958. let regRes = formula.template.ft.match(this.startFCRegExp);
  1959. this.formulaMap[regRes[0]] = formula;
  1960. }
  1961. })
  1962. }
  1963. }
  1964. }).finally(() => {
  1965. resolve();
  1966. })
  1967. })
  1968. },
  1969. // 左箭头导航
  1970. handleLeftArrow(e) {
  1971. e.preventDefault(); // 阻止默认行为
  1972. if (this.curSeleEleIndex > 0) {
  1973. // 取消当前选中项
  1974. if (this.selectEleFormula[this.curSeleEleIndex]) {
  1975. this.selectEleFormula[this.curSeleEleIndex].selected = false;
  1976. }
  1977. // 选中左侧项
  1978. this.curSeleEleIndex--;
  1979. this.selectEleFormula[this.curSeleEleIndex].selected = true;
  1980. // this.selectedTableKey = this.selectEleFormula[this.curSeleEleIndex].tableElementKey;
  1981. const keyParts = this.selectEleFormula[this.curSeleEleIndex].tableElementKey.split('key');
  1982. this.selectedTableKey = keyParts.length > 1 ? 'key'+keyParts[1] : null;
  1983. }
  1984. },
  1985. // 右箭头导航
  1986. handleRightArrow(e) {
  1987. e.preventDefault(); // 阻止默认行为
  1988. if (this.curSeleEleIndex < this.selectEleFormula.length - 1) {
  1989. // 取消当前选中项
  1990. if (this.selectEleFormula[this.curSeleEleIndex]) {
  1991. this.selectEleFormula[this.curSeleEleIndex].selected = false;
  1992. }
  1993. // 选中右侧项
  1994. this.curSeleEleIndex++;
  1995. this.selectEleFormula[this.curSeleEleIndex].selected = true;
  1996. // this.selectedTableKey = this.selectEleFormula[this.curSeleEleIndex].tableElementKey;
  1997. const keyParts = this.selectEleFormula[this.curSeleEleIndex].tableElementKey.split('key');
  1998. this.selectedTableKey = keyParts.length > 1 ? 'key'+keyParts[1] : null;
  1999. }
  2000. },
  2001. // 处理删除操作
  2002. handleDelete(e) {
  2003. e.preventDefault();
  2004. // 增加更严格的索引检查
  2005. if (
  2006. this.curSeleEleIndex === null ||
  2007. this.curSeleEleIndex === undefined ||
  2008. this.curSeleEleIndex < 0 ||
  2009. this.curSeleEleIndex >= this.selectEleFormula.length
  2010. ) {
  2011. return;
  2012. }
  2013. // 保存当前要删除的元素索引(避免后续操作影响)
  2014. const indexToDelete = this.curSeleEleIndex;
  2015. const itemToDelete = this.selectEleFormula[indexToDelete];
  2016. // 处理元素取消勾选
  2017. if (itemToDelete && itemToDelete.type === 'Element') {
  2018. this.deleEleIndex = indexToDelete;
  2019. this.unCheckEleFormulac(itemToDelete.id);
  2020. }
  2021. // 执行删除(只删除指定索引的1个元素)
  2022. const deletedItems = this.selectEleFormula.splice(indexToDelete, 1);
  2023. // 正确更新当前选中索引
  2024. if (this.selectEleFormula.length > 0) {
  2025. // 如果删除的是最后一个元素,选中前一个
  2026. this.curSeleEleIndex = Math.min(
  2027. indexToDelete,
  2028. this.selectEleFormula.length - 1
  2029. );
  2030. const keyParts = this.selectEleFormula[this.curSeleEleIndex].tableElementKey.split('key');
  2031. this.selectedTableKey = keyParts.length > 1 ? 'key'+keyParts[1] : null;
  2032. // 确保选中状态正确
  2033. this.selectEleFormula.forEach((item, idx) => {
  2034. item.selected = idx === this.curSeleEleIndex;
  2035. });
  2036. } else {
  2037. this.curSeleEleIndex = -1;
  2038. this.selectedTableKey = null;
  2039. }
  2040. },
  2041. checkDefaultSelection() {
  2042. const hasSelected = this.selectEleFormula.some(item => item.selected);
  2043. if (!hasSelected && this.selectEleFormula.length > 0) {
  2044. // 取消所有选中
  2045. this.selectEleFormula.forEach(item => {
  2046. item.selected = false;
  2047. });
  2048. // 选中最后一个元素
  2049. const lastIndex = this.selectEleFormula.length - 1;
  2050. this.selectEleFormula[lastIndex].selected = true;
  2051. this.curSeleEleIndex = lastIndex;
  2052. }
  2053. },
  2054. },
  2055. };
  2056. </script>
  2057. <style scoped lang="scss">
  2058. .box-dashed {
  2059. border: 1px dashed #bbbbbb;
  2060. border-radius: 6px;
  2061. padding: 10px;
  2062. margin-bottom: 10px;
  2063. }
  2064. .retain-box {
  2065. border-right: 1px dashed #bbbbbb;
  2066. }
  2067. .retain {
  2068. line-height: 50px;
  2069. margin-right: 10px;
  2070. }
  2071. .edit-text {
  2072. font-size: 26px;
  2073. margin-left: 20px;
  2074. }
  2075. .el-menu--popup .el-menu-item.is-active {
  2076. background-color: #fff;
  2077. }
  2078. .ele-box{
  2079. //border: 1px solid #bbb;
  2080. //height: 26px;
  2081. display: flex;
  2082. justify-content: space-between;
  2083. align-items: center;
  2084. padding: 6px;
  2085. height: 100%;
  2086. box-sizing: border-box;
  2087. overflow: hidden;
  2088. }
  2089. .no-mb-col .el-col{
  2090. margin-bottom: 0px;
  2091. border: 1px solid #bbb;
  2092. height: 100px;
  2093. }
  2094. .sele-ele-box{
  2095. height: 160px;
  2096. padding: 20px;
  2097. overflow-y: auto;
  2098. // margin-top: 10px;
  2099. }
  2100. .icon-box .el-link{
  2101. font-size: 14px;
  2102. margin-right: 10px;
  2103. }
  2104. </style>
  2105. <style lang="scss">
  2106. .basic-container.h-basic-full {
  2107. height: calc(100% - 30px);
  2108. overflow: auto;
  2109. .el-card, .el-card .el-card__body {
  2110. height: 100%;
  2111. }
  2112. }
  2113. .el-select-dropdown{
  2114. max-width:600px ;
  2115. }
  2116. //.el-select-dropdown__item{
  2117. // display: inline-block;
  2118. //}
  2119. .el-select-dropdown__item span {
  2120. // min-width: 300px;
  2121. display: inline-block;
  2122. }
  2123. </style>
  2124. <style scoped>
  2125. .operation-symbol-box{
  2126. display: flex;
  2127. align-items: center;
  2128. border: 1px solid rgb(229, 231, 235);
  2129. background-color: #F9FAFB;
  2130. padding: 10px 10px;
  2131. border-radius: 5px 5px 0px 0px;
  2132. margin-top: 10px;
  2133. }
  2134. .sele-ele-box1{
  2135. padding: 10px;
  2136. border: 1px solid rgb(229, 231, 235);
  2137. border-radius: 0px 0px 5px 5px;
  2138. height: 50px;
  2139. }
  2140. .text-sm{
  2141. font-size: 14px;
  2142. margin-right: 10px;
  2143. }
  2144. .icon-box .el-icon {
  2145. font-size: 12px !important; /* 更小的尺寸,按需修改 */
  2146. }
  2147. </style>