index.vue 24 KB

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