index.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776
  1. <template>
  2. <div class="data-fill-list-box">
  3. <el-collapse v-model="ActiveKey" accordion @change="CollapseChange">
  4. <el-collapse-item v-for="(item, index) in listDatas" :id="`item-${index}-${item?.pkeyId}`" :key="item?.pkeyId" :disabled="item.isBussShow === 2" :name="`item-${index}-${item?.pkeyId}`">
  5. <template #title>
  6. <div class="hc-collapse-item-header">
  7. <div class="real-fill-rate">
  8. <div class="tag" :class="item.realFillRate >= 80 ? 'yes' : ''">已填{{ item.realFillRate ?? 0 }}%</div>
  9. <HcTooltip v-if="isStatus !== 3" keys="wbs_preview_table">
  10. <el-link v-if="item.isBussShow === 2 || item.isTabPdf === 1 || item.pdfUrl === '' || item.pdfUrl === null" type="primary" disabled>本 表 预 览</el-link>
  11. <el-link v-else type="primary" :disabled="tableFormPreviewLoading" @click.stop="previewClick(item)">本 表 预 览</el-link>
  12. </HcTooltip>
  13. </div>
  14. <div class="text-lg truncate item-title">{{ item.nodeName }}</div>
  15. </div>
  16. </template>
  17. <div :style="`height: calc(100vh - ${draw_type ? '555px' : '222px'});`" class="data-fill-list-item-content">
  18. <div v-if="item?.isWindow" class="data-fill-table-form-box is-window">
  19. <div class="hc-window-tip">
  20. <div class="table-form-no">
  21. <img :src="NoDataSvg" alt="">
  22. <div class="desc">当前表单处于窗口模式,关闭相关窗口后恢复</div>
  23. </div>
  24. </div>
  25. </div>
  26. <div v-else class="data-fill-table-form-box">
  27. <TableFormItem
  28. v-if="item.isTableRender"
  29. :ref="(el) => setItemRefs(el, item)"
  30. :classify="classifys"
  31. :datas="changeFormDatas(item?.pkeyId, 'collapse')"
  32. :kid="item?.pkeyId"
  33. :node-name="item.nodeName"
  34. :pid="`table-form-${item?.pkeyId}`"
  35. :tid="treeId"
  36. @excel-body-tap="excelTableFormClick($event)"
  37. @render="tableFormRender($event, item, index)"
  38. @right-tap="tableFormRightTap($event, index)"
  39. />
  40. <el-tooltip :content="item.isWindow ? '关闭窗口并恢复' : '当前表单窗口化'" :hide-after="0" placement="top">
  41. <div class="form-window-icon" @click.stop="windowClick(item, index)">
  42. <template v-if="item.isWindow">
  43. <HcIcon name="fullscreen-exit" />
  44. </template>
  45. <template v-else>
  46. <HcIcon name="fullscreen" />
  47. </template>
  48. </div>
  49. </el-tooltip>
  50. </div>
  51. </div>
  52. </el-collapse-item>
  53. </el-collapse>
  54. </div>
  55. <!-- 查看表单 -->
  56. <template v-for="(item, index) in DragModalTableForm" :key="index">
  57. <HcDragModal
  58. :close-icon-arr="closeIconArr" :eid="item.pkeyId" :height="DragModalHeight" :is-show="item.isShow"
  59. :loading="item.loading" :loading-text="item.loadingText" :title="item.title" is-sort-top
  60. @close="TableFormClose(item, index)" @close-icon-tap="closeIconTap($event, item, index)"
  61. >
  62. <HcDragNode :more-menu="dragNodeMoreMenu" @menu-tap="dragNodeMoreMenuTap($event, item)">
  63. <TableFormItem
  64. :ref="(el) => setItemRefs(el, item)"
  65. :classify="item.classify"
  66. :datas="changeFormDatas(item?.pkeyId, 'window')"
  67. :height="item.height"
  68. :kid="item.pkeyId"
  69. :node-name="item.title"
  70. :pid="`table-form-${item?.pkeyId}`"
  71. :scroll="false"
  72. :tid="item.treeId"
  73. :width="item.width"
  74. @excel-body-tap="excelTableFormClick($event)"
  75. @render="tableFormRender($event, item.item, item.index)"
  76. @right-tap="tableFormRightTap($event, item.index)"
  77. />
  78. </HcDragNode>
  79. </HcDragModal>
  80. </template>
  81. </template>
  82. <script setup>
  83. import { nextTick, onActivated, onDeactivated, onMounted, onUnmounted, ref, watch } from 'vue'
  84. import { getStoreValue } from '~src/utils/storage'
  85. import HTableForm from '~src/plugins/HTableForm'
  86. import { useAppStore } from '~src/store'
  87. import wbsApi from '~api/data-fill/wbs'
  88. import TableFormItem from './table-form-item.vue'
  89. import NoDataSvg from '~src/assets/view/no-data.svg'
  90. import {
  91. arrIndex, deepClone,
  92. downloadBlob, getArrValue, getObjVal, getObjValue, isNullES, setPosRange,
  93. } from 'js-fast-way'
  94. import { toPdfPage } from '~uti/btn-auth'
  95. //参数
  96. const props = defineProps({
  97. datas: {
  98. type: Array,
  99. default: () => ([]),
  100. },
  101. classify: {
  102. type: [String, Number],
  103. default: '',
  104. },
  105. status: {
  106. type: [String, Number],
  107. default: '',
  108. },
  109. primaryKeyId: {
  110. type: [String, Number],
  111. default: '',
  112. },
  113. contractId: {
  114. type: [String, Number],
  115. default: '',
  116. },
  117. drawType: {
  118. type: Boolean,
  119. default: false,
  120. },
  121. wbsTempId: {
  122. type: [String, Number],
  123. default: '',
  124. },
  125. tenantId: {
  126. type: [String, Number],
  127. default: '',
  128. },
  129. wbsType: {
  130. type: [String, Number],
  131. default: '',
  132. },
  133. treeAutoExpandKeys: {
  134. type: [Array],
  135. default: () => ([]),
  136. },
  137. treenodeDataInfo: {
  138. type: [Object],
  139. default: () => ({}),
  140. },
  141. newlistdata:{
  142. type: [Array],
  143. default: () => ([]),
  144. },
  145. })
  146. //事件
  147. const emit = defineEmits(['renew', 'offsetTop', 'getList'])
  148. //初始变量
  149. const useAppState = useAppStore()
  150. //全局变量
  151. const projectId = ref(useAppState.projectId)
  152. const contract_id = ref(props.contractId)
  153. const treeId = ref(props.primaryKeyId)
  154. const classifys = ref(props.classify)
  155. const wbsTemp_id = ref(props.wbsTempId)
  156. const tenant_id = ref(props.tenantId)
  157. const wbs_type = ref(props.wbsType)
  158. const isStatus = ref(parseInt(props.status))
  159. const listDatas = ref([])
  160. const draw_type = ref(props.drawType)
  161. const tree_AutoExpandKeys = ref(props.treeAutoExpandKeys)
  162. const treenodeDataInfo = ref(props.treenodeDataInfo)
  163. const newlistdata = ref(props.newlistdata)
  164. //表单变量
  165. const formDataList = ref([])
  166. const formKeyIds = ref('')
  167. const formparentId = ref('')
  168. //处理ref
  169. const itemRefs = ref([])
  170. const setItemRefs = (el, { pkeyId }) => {
  171. if (el) {
  172. let index = arrIndex(itemRefs.value, 'pkeyId', pkeyId)
  173. if (index !== -1) {
  174. itemRefs.value[index].ref = el
  175. } else {
  176. itemRefs.value.push({
  177. pkeyId: pkeyId,
  178. ref: el,
  179. })
  180. }
  181. }
  182. }
  183. //处理表单的ref
  184. const setSpliceItemRefs = async ({ pkeyId }) => {
  185. const refs = itemRefs.value
  186. let index = arrIndex(refs, 'pkeyId', pkeyId)
  187. if (index !== -1) {
  188. refs.splice(index, 1)
  189. itemRefs.value = refs
  190. }
  191. }
  192. const closeIconArr = [
  193. { key: 'reduction', icon: 'picture-in-picture-2', name: '还原到面板内,并自动展开面板' },
  194. ]
  195. //组件参数变量
  196. const apis = ref({
  197. dataInfo: wbsApi.getBussDataInfo,
  198. bussCols: wbsApi.getHtmlBussCols,
  199. excelHtml: wbsApi.getExcelHtml,
  200. })
  201. //深度监听数据
  202. watch(() => [
  203. props.datas,
  204. ], ([datas]) => {
  205. setFormDataNum(datas)
  206. }, { deep: true })
  207. //监听变量值
  208. watch(() => [
  209. useAppState.projectId,
  210. props.contractId,
  211. props.wbsTempId,
  212. props.tenantId,
  213. props.wbsType,
  214. props.status,
  215. props.classify,
  216. props.primaryKeyId,
  217. props.newlistdata,
  218. props.treenodeDataInfo,
  219. ], ([pid, cid, temp_id, tid, type, status, class_id, tree_id, Newlistdata, TreenodeDataInfo]) => {
  220. projectId.value = pid
  221. contract_id.value = cid
  222. wbsTemp_id.value = temp_id
  223. tenant_id.value = tid
  224. wbs_type.value = type
  225. isStatus.value = parseInt(status)
  226. classifys.value = class_id
  227. treeId.value = tree_id
  228. newlistdata.value = Newlistdata
  229. treenodeDataInfo.value = TreenodeDataInfo
  230. })
  231. //渲染完成
  232. onMounted(() => {
  233. setFormDataNum(props.datas)
  234. // setTableFormMenu(useAppState.projectInfo)
  235. const { offsetHeight } = document.body
  236. DragModalHeight.value = offsetHeight - 200
  237. setMountOnEventKey()
  238. })
  239. //处理变动的数据
  240. const changeFormData = ref({
  241. window: [],
  242. collapse: [],
  243. })
  244. const changeFormDatas = (pkeyId, type) => {
  245. const changeData = changeFormData.value[type]
  246. const index = arrIndex(changeData, 'pkeyId', pkeyId)
  247. if (index !== -1) {
  248. return changeData[index]
  249. } else {
  250. return {}
  251. }
  252. }
  253. //设置变动的数据
  254. const setChangeFormDatas = async (pkeyId, type) => {
  255. const refs = await getFormRef(pkeyId)
  256. const formData = refs?.getFormData()
  257. const changeData = changeFormData.value[type]
  258. const index = arrIndex(changeData, 'pkeyId', pkeyId)
  259. if (index !== -1) {
  260. changeData[index] = formData
  261. } else {
  262. changeData.push(formData)
  263. }
  264. changeFormData.value[type] = changeData
  265. }
  266. //展开事件
  267. const ActiveKey = ref('')
  268. const CollapseChange = (name) => {
  269. ActiveKey.value = name
  270. let index = getCollapseItemIndex(name)
  271. if (index > -1) {
  272. getOffsetTop(name)
  273. const item = listDatas.value[index]
  274. formKeyIds.value = setToString(item.pkeyId)
  275. formparentId.value = setToString(item.parentId)
  276. nextTick(() => {
  277. if (!item.isTableRender) {
  278. item.isTableRender = true
  279. }
  280. })
  281. } else {
  282. getOffsetTop()
  283. formKeyIds.value = ''
  284. formparentId.value = ''
  285. }
  286. }
  287. const setCollapseKey = (key) => {
  288. CollapseChange(key)
  289. }
  290. //初始设置
  291. const setFormDataNum = (datas) => {
  292. itemRefs.value = []
  293. ActiveKey.value = ''
  294. let newArr = []
  295. for (let i = 0; i < datas.length; i++) {
  296. newArr.push({ isCollapseLoad: false })
  297. }
  298. formDataList.value = newArr
  299. listDatas.value = deepClone(datas)
  300. }
  301. //渲染完成
  302. const tableFormRender = (form, item, index) => {
  303. formDataList.value[index] = form
  304. formDataList.value[index].isCollapseLoad = form.isRenderForm
  305. item.isTableForm = form.isRenderForm
  306. }
  307. //菜单数据
  308. const contextMenuRef = ref(null)
  309. const tableFormItemNode = ref({}) //临时信息
  310. //鼠标右键事件
  311. const tableFormRightTap = ({ event, KeyName, startPos, endPos, pkeyId }, index) => {
  312. //存储临时信息
  313. tableFormItemNode.value = { KeyName, index, startPos, endPos, pkeyId }
  314. contextMenuRef.value?.showMenu(event, false) //展开菜单
  315. }
  316. //插入设计值
  317. const designModal = ref(false)
  318. const formDesignModel = ref()
  319. //初始设计值/频率表单
  320. const setInitDesignForm = () => {
  321. formDesignModel.value = {
  322. type: 1, design: '', size: '',
  323. dev: '', key: '', capacity: '',
  324. pass: '', pkId: '', direction:1,
  325. }
  326. }
  327. //窗口化
  328. const DragModalTableForm = ref([])
  329. const DragModalHeight = ref(600)
  330. const windowClick = async (item, indexs) => {
  331. const list = deepClone(DragModalTableForm.value)
  332. let index = arrIndex(list, 'pkeyId', item.pkeyId)
  333. if (!item.isWindow) {
  334. const formSize = getTableFormSize(item?.pkeyId)
  335. const newTableForm = {
  336. ...setInitDragModalTableForm(item, indexs),
  337. ...formSize,
  338. }
  339. await setChangeFormDatas(item?.pkeyId, 'window')
  340. item.isWindow = true
  341. //处理表单的ref
  342. await setSpliceItemRefs(item)
  343. //弹窗表单的排序
  344. if (index === -1) {
  345. list.push(newTableForm)
  346. } else if (index !== list.length - 1) {
  347. //检查是否在最上层,不在则置顶,可以解决多次点击时,频繁更改全局状态的问题
  348. list.splice(index, 1)
  349. list.push(newTableForm)
  350. }
  351. DragModalTableForm.value = list
  352. ActiveKey.value = ''
  353. } else {
  354. await setChangeFormDatas(item?.pkeyId, 'collapse')
  355. //处理表单的ref
  356. await setSpliceItemRefs(item)
  357. if (index !== -1) {
  358. list.splice(index, 1)
  359. DragModalTableForm.value = list
  360. }
  361. item.isWindow = false
  362. }
  363. }
  364. //初始拖动表单的内容
  365. const setInitDragModalTableForm = (item, index) => {
  366. return {
  367. projectId: projectId.value,
  368. contractId: contract_id.value,
  369. wbsTempId: wbsTemp_id.value,
  370. tenantId: tenant_id.value,
  371. wbsType: wbs_type.value,
  372. classify: classifys.value,
  373. treeId: treeId.value,
  374. pkeyId: item.pkeyId,
  375. height: '100%',
  376. width: '100%',
  377. title: item.nodeName,
  378. isShow: true,
  379. index: index,
  380. item: item,
  381. }
  382. }
  383. //关闭窗口
  384. const TableFormClose = async ({ pkeyId, index }, indexs) => {
  385. const list = deepClone(DragModalTableForm.value)
  386. //取表单的数据
  387. await setChangeFormDatas(pkeyId, 'collapse')
  388. //关闭窗口
  389. list.splice(indexs, 1)
  390. DragModalTableForm.value = list
  391. listDatas.value[index].isWindow = false
  392. }
  393. const dragNodeMoreMenu = [
  394. { key: 'save', icon: 'save-2', name: '保存' },
  395. { key: 'preview', icon: 'eye', name: '预览' },
  396. ]
  397. //还原窗口
  398. const closeIconTap = async (event, item, indexs) => {
  399. const { index, pkeyId } = item
  400. let KeyId = `item-${index}-${pkeyId}`
  401. await TableFormClose(item, indexs)
  402. ActiveKey.value = KeyId
  403. }
  404. //菜单被点击
  405. const dragNodeMoreMenuTap = ({ key }, items) => {
  406. const { item } = items
  407. if (key === 'save') {
  408. if (item?.isTableForm) {
  409. tableFormSaveClick(item, items)
  410. } else {
  411. window.$message.warning('此表单暂无数据和文件')
  412. }
  413. } else if (key === 'preview') {
  414. if (item['isBussShow'] === 2 || item['isTabPdf'] === 1 || item['pdfUrl'] === '' || item['pdfUrl'] === null) {
  415. window.$message.warning('此表单暂无可预览文件')
  416. } else {
  417. previewClick(item, items)
  418. }
  419. }
  420. }
  421. //跨节点复制弹窗
  422. // const copyClick = (items) => {
  423. // showcopyModal.value=true
  424. // copyItems.value=items
  425. // }
  426. //获取表单列表
  427. const getNewList = ()=>{
  428. emit('getList')
  429. setTimeout(() => {
  430. let newObj = newlistdata.value
  431. let oldObj = listDatas.value
  432. const addedObject = newObj.find(obj => !oldObj.some(oldObj => oldObj.pkeyId === obj.pkeyId))
  433. let index = arrIndex(listDatas.value, 'id', addedObject.id) // 1
  434. listDatas.value.splice(index + 1, 0, addedObject)
  435. }, 1000)
  436. }
  437. //预览本表
  438. const tableFormPreviewLoading = ref(false)
  439. const previewClick = async (item, dragItem = null) => {
  440. tableFormPreviewLoading.value = true
  441. await getBussPdfInfo(item, dragItem)
  442. tableFormPreviewLoading.value = false
  443. }
  444. //预览PDF
  445. const getBussPdfInfo = async ({ pkeyId }, dragItem = null, showTip = true) => {
  446. setDragModalLoading(dragItem, '获取pdf中...', true)
  447. const { error, code, data } = await wbsApi.getBussPdfInfo({
  448. pkeyId: pkeyId,
  449. }, false)
  450. setDragModalLoading(dragItem)
  451. if (!error && code === 200) {
  452. if (data) {
  453. toPdfPage(data)
  454. //window.open(data, '_blank')
  455. } else if (showTip) {
  456. window?.$message?.warning('PDF错误')
  457. }
  458. } else {
  459. if (showTip) {
  460. window?.$message?.warning(data.msg || '获取PDF失败')
  461. }
  462. }
  463. }
  464. //通知数据更新
  465. const renewData = () => {
  466. emit('renew', ActiveKey.value)
  467. ActiveKey.value = ''
  468. }
  469. //设置表单的加载状态
  470. const setDragModalLoading = (dragItem, text = '保存中...', show = false) => {
  471. if (dragItem && show) {
  472. dragItem.loading = true
  473. dragItem.loadingText = text
  474. }
  475. if (dragItem && !show) {
  476. dragItem.loading = false
  477. }
  478. }
  479. //获取表单的ref
  480. const getFormRef = async (pkeyId) => {
  481. const itemRef = getArrValue(itemRefs.value)
  482. if (itemRef.length <= 0) return ''
  483. const index = arrIndex(itemRef, 'pkeyId', pkeyId)
  484. if (index === -1) return ''
  485. const obj = getObjValue(itemRef[index])
  486. return obj?.ref
  487. }
  488. //删除打开的窗口
  489. const delWindowRefs = (pkeyId) => {
  490. //判断是否存在窗口,如果存在,就删除窗口
  491. const list = DragModalTableForm.value
  492. const index = arrIndex(list, 'pkeyId', pkeyId)
  493. if (index !== -1) {
  494. list.splice(index, 1)
  495. DragModalTableForm.value = list
  496. }
  497. }
  498. //计算展开高度和滚动位置
  499. const getOffsetTop = (key = '') => {
  500. if (key) {
  501. const dom = document.getElementById(key)
  502. if (!draw_type.value) {
  503. if (dom?.offsetTop >= 583 && key) {
  504. emit('offsetTop', dom?.offsetTop - 583)
  505. } else {
  506. emit('offsetTop', dom?.offsetTop)
  507. }
  508. } else {
  509. if (dom.offsetTop >= 424 && key) {
  510. emit('offsetTop', dom?.offsetTop - 424)
  511. } else {
  512. emit('offsetTop', dom?.offsetTop)
  513. }
  514. }
  515. } else {
  516. emit('offsetTop', 0)
  517. }
  518. ActiveKey.value = key
  519. }
  520. //获取折叠面板的索引
  521. const getCollapseItemIndex = (name) => {
  522. const keys = name.split('-')
  523. if (keys.length > 0) {
  524. return keys[1]
  525. } else {
  526. return -1
  527. }
  528. }
  529. //获取表单的大小
  530. const getTableFormSize = (pkeyId) => {
  531. let formId = `table-form-${pkeyId}`
  532. try {
  533. const { clientWidth, clientHeight } = document.getElementById(formId).children[0]
  534. return {
  535. width: (clientWidth + 40) + 'px',
  536. height: (clientHeight + 80) + 'px',
  537. }
  538. } catch {
  539. return {
  540. width: '100%',
  541. height: '100%',
  542. }
  543. }
  544. }
  545. //转字符串
  546. const setToString = (val) => {
  547. return val ? val + '' : ''
  548. }
  549. //表单被点击
  550. const presentId = ref('')
  551. const excelTableFormClick = (key) => {
  552. presentId.value = key
  553. }
  554. //缓存被激活时
  555. onActivated(() => {
  556. setMountOnEventKey()
  557. })
  558. //缓存时被移除
  559. onDeactivated(() => {
  560. HTableForm.unmountEventKey()
  561. })
  562. //页面被卸载
  563. onUnmounted(() => {
  564. HTableForm.unmountEventKey()
  565. })
  566. const setMountOnEventKey = () => {
  567. HTableForm.setOnEventKey({
  568. //按下ctrl键 或 control 键
  569. onCtrlDown: async () => {
  570. //window.$HcLog('全局按键', '按下ctrl键 或 control 键')
  571. const refs = await setOnFuncFormRef()
  572. refs?.setIsCtrlKey(true)
  573. },
  574. //按下复制快捷键
  575. onCtrlDownC: async (event) => {
  576. //window.$HcLog('全局按键', '按下复制快捷键')
  577. const refs = await setOnFuncFormRef()
  578. refs?.setCopyKeyList(event)
  579. },
  580. //按下粘贴快捷键
  581. onCtrlDownV: async (event) => {
  582. //window.$HcLog('全局按键', '按下粘贴快捷键')
  583. const refs = await setOnFuncFormRef()
  584. await refs?.setPasteKeyList(event)
  585. },
  586. //放开ctrl键 或 control 键
  587. onCtrlUp: async () => {
  588. //window.$HcLog('全局按键', '放开ctrl键 或 control 键')
  589. const refs = await setOnFuncFormRef()
  590. refs?.setIsCtrlKey(false)
  591. },
  592. })
  593. }
  594. //获取表单的ref
  595. const setOnFuncFormRef = async () => {
  596. const pkeyId = presentId.value
  597. if (!isNullES(pkeyId)) {
  598. return await getFormRef(pkeyId)
  599. } else {
  600. return
  601. }
  602. }
  603. //获取已渲染的表单
  604. const getFilterFormData = async () => {
  605. const formArr = formDataList.value
  606. return formArr.filter((item) => {
  607. return (item.pkeyId ?? '') !== '' && item.isCollapseLoad
  608. })
  609. }
  610. //获取表单数据
  611. const getFormData = async () => {
  612. const formArr = await getFilterFormData()
  613. //获取表单数据
  614. let newArr = []
  615. for (let i = 0; i < formArr.length; i++) {
  616. const pkeyId = formArr[i].pkeyId
  617. const refs = await getFormRef(pkeyId)
  618. const form = refs?.getFormData()
  619. newArr.push({ ...form })
  620. }
  621. console.log('表单数据', newArr)
  622. return newArr
  623. }
  624. //获取表单效验数据
  625. const getFormRegExpJson = async () => {
  626. const formArr = await getFilterFormData()
  627. const list = listDatas.value
  628. //获取表单数据
  629. let formRegExpJson = {}
  630. for (let i = 0; i < formArr.length; i++) {
  631. const pkeyId = formArr[i].pkeyId
  632. const refs = await getFormRef(pkeyId)
  633. const regExp = refs?.getRegExpJson()
  634. const nodeName = refs?.getNodeName()
  635. if (getObjVal(regExp)) {
  636. const index = arrIndex(list, 'pkeyId', pkeyId)
  637. formRegExpJson[pkeyId] = {
  638. ...regExp,
  639. itemId: `item-${index}-${pkeyId}`,
  640. nodeName: nodeName,
  641. }
  642. }
  643. }
  644. return formRegExpJson
  645. }
  646. //获取当前展开项
  647. const getActiveKey = () => {
  648. return ActiveKey.value
  649. }
  650. //设置当前展开项
  651. const setActiveKey = (key) => {
  652. return ActiveKey.value = key
  653. }
  654. // 暴露出去
  655. defineExpose({
  656. getFormData,
  657. getFormRegExpJson,
  658. getActiveKey,
  659. setActiveKey,
  660. setCollapseKey,
  661. })
  662. </script>
  663. <style lang="scss" scoped>
  664. @import "./index.scss";
  665. </style>
  666. <style lang="scss">
  667. @import "./style.scss";
  668. </style>