edit.vue 77 KB

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