edit.vue 80 KB

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