index.vue 25 KB

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