editnew.vue 69 KB

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