index.vue 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091
  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. </div>
  16. </div>
  17. </template>
  18. <div class="data-fill-list-item-content">
  19. <TableFormItem
  20. v-if="item.isTableRender"
  21. :ref="(el) => setItemRefs(el, item)"
  22. :classify="classifys"
  23. :datas="changeFormDatas(item?.id, 'collapse')"
  24. :kid="item?.id"
  25. :node-name="item.nodeName"
  26. :node-type="item.nodeType"
  27. :pid="`table-form-${item?.id}`"
  28. :area-id="areaId"
  29. :table-id="item.tableId"
  30. :agreement-id="agreementId"
  31. style="width: 100%;"
  32. @excelBodyTap="excelTableFormClick($event)"
  33. @render="tableFormRender($event, item, index)"
  34. @rightTap="tableFormRightTap($event, index)"
  35. />
  36. </div>
  37. </el-collapse-item>
  38. </template>
  39. </el-collapse>
  40. </div>
  41. </template>
  42. <script setup>
  43. import { nextTick, onActivated, onDeactivated, onMounted, onUnmounted, ref, watch } from 'vue'
  44. import HTableForm from '~src/plugins/HTableForm'
  45. import { useAppStore } from '~src/store'
  46. import landApi from '~api/agree/land.js'
  47. import TableFormItem from './form-item.vue'
  48. import {
  49. arrIndex, deepClone, getArrValue,
  50. getObjVal, getObjValue, isNullES, setPosRange,
  51. } from 'js-fast-way'
  52. //参数
  53. const props = defineProps({
  54. datas: {
  55. type: Array,
  56. default: () => ([]),
  57. },
  58. classify: {
  59. type: [String, Number],
  60. default: '',
  61. },
  62. status: {
  63. type: [String, Number],
  64. default: '',
  65. },
  66. primaryKeyId: {
  67. type: [String, Number],
  68. default: '',
  69. },
  70. contractId: {
  71. type: [String, Number],
  72. default: '',
  73. },
  74. drawType: {
  75. type: Boolean,
  76. default: false,
  77. },
  78. wbsTempId: {
  79. type: [String, Number],
  80. default: '',
  81. },
  82. tenantId: {
  83. type: [String, Number],
  84. default: '',
  85. },
  86. wbsType: {
  87. type: [String, Number],
  88. default: '',
  89. },
  90. areaId:{
  91. type: String,
  92. default: '',
  93. }, //当前树节点
  94. agreementId:{
  95. type: [String, Number],
  96. default: '',
  97. },
  98. })
  99. //事件
  100. const emit = defineEmits(['renew', 'offsetTop'])
  101. //初始变量
  102. const useAppState = useAppStore()
  103. //全局变量
  104. const projectId = ref(useAppState.projectId)
  105. const contract_id = ref(props.contractId)
  106. const treeId = ref(props.primaryKeyId)
  107. const classifys = ref(props.classify)
  108. const wbsTemp_id = ref(props.wbsTempId)
  109. const tenant_id = ref(props.tenantId)
  110. const wbs_type = ref(props.wbsType)
  111. const isStatus = ref(parseInt(props.status))
  112. const listDatas = ref([])
  113. const draw_type = ref(props.drawType)
  114. const areaId = ref(props.areaId)
  115. const agreementId = ref(props.agreementId)
  116. //表单变量
  117. const formDataList = ref([])
  118. const formKeyIds = ref('')
  119. const formparentId = ref('')
  120. //处理ref
  121. const itemRefs = ref([])
  122. const setItemRefs = (el, { id }) => {
  123. if (el) {
  124. let index = arrIndex(itemRefs.value, 'pKeyId', id)
  125. if (index !== -1) {
  126. itemRefs.value[index].ref = el
  127. } else {
  128. itemRefs.value.push({
  129. pKeyId: id,
  130. ref: el,
  131. })
  132. }
  133. }
  134. }
  135. //处理表单的ref
  136. const setSpliceItemRefs = async ({ pKeyId }) => {
  137. const refs = itemRefs.value
  138. let index = arrIndex(refs, 'pKeyId', pKeyId)
  139. if (index !== -1) {
  140. refs.splice(index, 1)
  141. itemRefs.value = refs
  142. }
  143. }
  144. const closeIconArr = [
  145. { key: 'reduction', icon: 'picture-in-picture-2', name: '还原到面板内,并自动展开面板' },
  146. ]
  147. //组件参数变量
  148. // const apis = ref({
  149. // dataInfo: wbsApi.getBussDataInfo,
  150. // bussCols: wbsApi.getHtmlBussCols,
  151. // excelHtml: wbsApi.getExcelHtml,
  152. // })
  153. //深度监听数据
  154. watch(() => [
  155. props.datas,
  156. ], ([datas]) => {
  157. setFormDataNum(datas)
  158. }, { deep: true })
  159. //监听变量值
  160. watch(() => [
  161. useAppState.projectId,
  162. props.contractId,
  163. props.wbsTempId,
  164. props.tenantId,
  165. props.wbsType,
  166. props.status,
  167. props.classify,
  168. props.primaryKeyId,
  169. props.areaId,
  170. props.agreementId,
  171. ], ([pid, cid, temp_id, tid, type, status, class_id, tree_id, area_id, agreement_id]) => {
  172. projectId.value = pid
  173. contract_id.value = cid
  174. wbsTemp_id.value = temp_id
  175. tenant_id.value = tid
  176. wbs_type.value = type
  177. isStatus.value = parseInt(status)
  178. classifys.value = class_id
  179. treeId.value = tree_id
  180. areaId.value = area_id
  181. agreementId.value = agreement_id
  182. })
  183. //渲染完成
  184. onMounted(() => {
  185. setFormDataNum(props.datas)
  186. setTableFormMenu(useAppState.projectInfo)
  187. const { offsetHeight } = document.body
  188. DragModalHeight.value = offsetHeight - 200
  189. setMountOnEventKey()
  190. })
  191. //处理变动的数据
  192. const changeFormData = ref({
  193. window: [],
  194. collapse: [],
  195. })
  196. const changeFormDatas = (pKeyId, type) => {
  197. const changeData = changeFormData.value[type]
  198. const index = arrIndex(changeData, 'pKeyId', pKeyId)
  199. if (index !== -1) {
  200. return changeData[index]
  201. } else {
  202. return {}
  203. }
  204. }
  205. //设置变动的数据
  206. const setChangeFormDatas = async (pKeyId, type) => {
  207. const refs = await getFormRef(pKeyId)
  208. const formData = refs?.getFormData()
  209. const changeData = changeFormData.value[type]
  210. const index = arrIndex(changeData, 'pKeyId', pKeyId)
  211. if (index !== -1) {
  212. changeData[index] = formData
  213. } else {
  214. changeData.push(formData)
  215. }
  216. changeFormData.value[type] = changeData
  217. }
  218. //展开事件
  219. const ActiveKey = ref('')
  220. const CollapseChange = (name) => {
  221. ActiveKey.value = name
  222. let index = getCollapseItemIndex(name)
  223. if (index > -1) {
  224. getOffsetTop(name)
  225. const item = listDatas.value[index]
  226. formKeyIds.value = setToString(item.id)
  227. formparentId.value = setToString(item.parentId)
  228. nextTick(() => {
  229. if (!item.isTableRender) {
  230. item.isTableRender = true
  231. }
  232. })
  233. } else {
  234. getOffsetTop()
  235. formKeyIds.value = ''
  236. formparentId.value = ''
  237. }
  238. }
  239. //初始设置
  240. const setFormDataNum = (datas) => {
  241. itemRefs.value = []
  242. ActiveKey.value = ''
  243. let newArr = []
  244. for (let i = 0; i < datas.length; i++) {
  245. newArr.push({ isCollapseLoad: false })
  246. }
  247. formDataList.value = newArr
  248. listDatas.value = deepClone(datas)
  249. }
  250. //渲染完成
  251. const tableFormRender = (form, item, index) => {
  252. console.log(form)
  253. formDataList.value[index] = form
  254. formDataList.value[index].isCollapseLoad = form.isRenderForm
  255. item.isTableForm = form.isRenderForm
  256. }
  257. //菜单数据
  258. const contextMenuRef = ref(null)
  259. const tableFormMenu = ref([])
  260. const tableFormItemNode = ref({}) //临时信息
  261. //设置菜单权限数据
  262. const setTableFormMenu = (info) => {
  263. let newArr = [], infos = getObjValue(info)
  264. const isOpen = infos['isOpenRandomNumber'] ?? 0
  265. if (isOpen === 1 && isStatus.value !== 3) {
  266. newArr.push({ label: '插入设计值/频率', key: 'design' })
  267. }
  268. newArr.push({ label: '插入特殊字符', key: 'special' })
  269. newArr.push({ label: '关联试验数据', key: 'test' })
  270. newArr.push({ label: '关联试验文件', key: 'file' })
  271. newArr.push({ label: '公式参数', key: 'formula' })
  272. tableFormMenu.value = newArr
  273. }
  274. //鼠标右键事件
  275. const tableFormRightTap = ({ event, KeyName, startPos, endPos, pkeyId }, index) => {
  276. //存储临时信息
  277. tableFormItemNode.value = { KeyName, index, startPos, endPos, pkeyId }
  278. contextMenuRef.value?.showMenu(event, false) //展开菜单
  279. }
  280. //鼠标右键菜单被点击
  281. const handleMenuSelect = ({ key }) => {
  282. if (key === 'design') {
  283. setInitDesignForm()
  284. designModalLoading.value = false
  285. designModal.value = true
  286. } else if (key === 'special') {
  287. specialModalShow()
  288. } else if (key === 'test') {
  289. testModalLoading.value = false
  290. testModal.value = true
  291. } else if (key === 'file') {
  292. fileModalLoading.value = false
  293. fileModal.value = true
  294. } else if (key === 'formula') {
  295. formulaModalLoading.value = false
  296. formulaModal.value = true
  297. }
  298. }
  299. //插入设计值
  300. const designModal = ref(false)
  301. const formDesignRef = ref(null)
  302. const formDesignModel = ref()
  303. //初始设计值/频率表单
  304. const setInitDesignForm = () => {
  305. formDesignModel.value = {
  306. type: 1, design: '', size: '',
  307. dev: '', key: '', capacity: '',
  308. pass: '', pkId: '',
  309. }
  310. }
  311. //设计值频率计算
  312. const designModalLoading = ref(false)
  313. const designModalSave = async () => {
  314. const { pkeyId, KeyName } = tableFormItemNode.value
  315. if (pkeyId) {
  316. designModalLoading.value = true
  317. //const {design, size} = formDesignModel.value
  318. const { error, code, data } = await wbsApi.queryFormulaRange({
  319. ...formDesignModel.value,
  320. // dev: (!design && !size) ? '±5': '',
  321. key: KeyName,
  322. pkId: pkeyId,
  323. })
  324. //处理数据
  325. const res = getObjVal(data)
  326. if (!error && code === 200 && res) {
  327. try {
  328. const refs = await getFormRef(pkeyId)
  329. const itemFormData = refs?.getFormData()
  330. Object.keys(data).forEach(key => {
  331. itemFormData[key] = data[key]
  332. })
  333. refs?.setFormData(itemFormData)
  334. } catch {
  335. }
  336. designModalLoading.value = false
  337. designModal.value = false
  338. } else {
  339. designModalLoading.value = false
  340. }
  341. } else {
  342. window?.$message?.warning('pkeyId为空')
  343. }
  344. }
  345. //关闭设计值/频率弹窗
  346. const closeDesignModal = () => {
  347. designModal.value = false
  348. setInitDesignForm()
  349. }
  350. //插入特殊字符
  351. const specialModal = ref(false)
  352. const specialModalLoading = ref(false)
  353. const specialModalShow = () => {
  354. specialFormValue.value = ''
  355. specialModalLoading.value = false
  356. specialModal.value = true
  357. }
  358. //监听特殊符号输入框的内容
  359. const specialFormValue = ref('')
  360. const specialDiaolgChange = (val) => {
  361. specialFormValue.value = val
  362. }
  363. //确认插入
  364. const specialRef = ref(null)
  365. const specialNodeClick = async () => {
  366. specialModalLoading.value = true
  367. const itemNode = tableFormItemNode.value
  368. const { KeyName, pkeyId } = itemNode
  369. try {
  370. const refs = await getFormRef(pkeyId)
  371. const itemFormData = refs?.getFormData()
  372. const { code, val, posVal } = await specialRef.value?.getSpecialNode(itemNode, itemFormData[KeyName])
  373. if (code === 200 && val) {
  374. itemFormData[KeyName] = val
  375. refs?.setFormData(itemFormData)
  376. specialModalLoading.value = false
  377. specialModal.value = false
  378. await nextTick(() => {
  379. setPosRange(KeyName, posVal)
  380. })
  381. } else {
  382. specialModalLoading.value = false
  383. }
  384. } catch (e) {
  385. specialModalLoading.value = false
  386. }
  387. }
  388. //关闭插入特殊字符
  389. const specialModalClose = () => {
  390. specialModalLoading.value = false
  391. specialModal.value = false
  392. }
  393. //关联试验数据
  394. const testModal = ref(false)
  395. const testModalLoading = ref(false)
  396. //关联试验数据被点击
  397. const itinsertTableId = ref('')
  398. const itinsertTreeId = ref('')
  399. const testTableRowName = ({ row, treeId }) => {
  400. itinsertTableId.value = row.id
  401. itinsertTreeId.value = treeId
  402. insertDataLoading.value = false
  403. insertDataShow.value = true
  404. }
  405. //关闭弹窗
  406. const testModalClose = () => {
  407. testModal.value = false
  408. testModalLoading.value = false
  409. }
  410. //选择要插入的实验数据
  411. const insertDataShow = ref(false)
  412. const insertDataLoading = ref(false)
  413. //确定关联试验数据数据
  414. const insertDataRef = ref(null)
  415. const submitinsertData = async () => {
  416. insertDataLoading.value = true
  417. const itemNode = tableFormItemNode.value
  418. const { KeyName, pkeyId } = itemNode
  419. try {
  420. const refs = await getFormRef(pkeyId)
  421. const itemFormData = refs?.getFormData()
  422. const { code, val, posVal } = await insertDataRef.value?.submitinsertData(itemNode, itemFormData[KeyName])
  423. if (code === 200 && val) {
  424. itemFormData[KeyName] = val
  425. refs?.setFormData(itemFormData)
  426. insertDataLoading.value = false
  427. insertDataShow.value = false
  428. testModal.value = false
  429. await nextTick(() => {
  430. setPosRange(KeyName, posVal)
  431. })
  432. }
  433. } catch {
  434. insertDataLoading.value = false
  435. }
  436. }
  437. //取消关联数据
  438. const cancelinsertData = async () => {
  439. insertDataShow.value = false
  440. insertDataLoading.value = false
  441. }
  442. //关联试验文件
  443. const fileModal = ref(false)
  444. const testFileRefs = ref(null)
  445. //确认关联文件
  446. const fileModalLoading = ref(false)
  447. const savefileModal = async () => {
  448. fileModalLoading.value = true
  449. await testFileRefs.value?.savefileSubmit()
  450. fileModalLoading.value = false
  451. fileModal.value = false
  452. }
  453. //关闭弹窗
  454. const fileModalClose = () => {
  455. fileModal.value = false
  456. fileModalLoading.value = false
  457. }
  458. //公式参数配置
  459. const formulaModal = ref(false)
  460. const formulaRefs = ref(null)
  461. //保存
  462. const formulaModalLoading = ref(false)
  463. const formulaSaveClick = async () => {
  464. formulaModalLoading.value = true
  465. await formulaRefs.value?.panelSave()
  466. formulaModalLoading.value = false
  467. formulaModal.value = false
  468. }
  469. //关闭
  470. const formulaModalClose = () => {
  471. formulaModal.value = false
  472. formulaModalLoading.value = false
  473. }
  474. //窗口化
  475. const DragModalTableForm = ref([])
  476. const DragModalHeight = ref(600)
  477. const windowClick = async (item, indexs) => {
  478. const list = deepClone(DragModalTableForm.value)
  479. let index = arrIndex(list, 'pkeyId', item.pkeyId)
  480. if (!item.isWindow) {
  481. const formSize = getTableFormSize(item?.pkeyId)
  482. const newTableForm = {
  483. ...setInitDragModalTableForm(item, indexs),
  484. ...formSize,
  485. }
  486. await setChangeFormDatas(item?.pkeyId, 'window')
  487. item.isWindow = true
  488. //处理表单的ref
  489. await setSpliceItemRefs(item)
  490. //弹窗表单的排序
  491. if (index === -1) {
  492. list.push(newTableForm)
  493. } else if (index !== list.length - 1) {
  494. //检查是否在最上层,不在则置顶,可以解决多次点击时,频繁更改全局状态的问题
  495. list.splice(index, 1)
  496. list.push(newTableForm)
  497. }
  498. DragModalTableForm.value = list
  499. ActiveKey.value = ''
  500. } else {
  501. await setChangeFormDatas(item?.pkeyId, 'collapse')
  502. //处理表单的ref
  503. await setSpliceItemRefs(item)
  504. if (index !== -1) {
  505. list.splice(index, 1)
  506. DragModalTableForm.value = list
  507. }
  508. item.isWindow = false
  509. }
  510. }
  511. //初始拖动表单的内容
  512. const setInitDragModalTableForm = (item, index) => {
  513. return {
  514. projectId: projectId.value,
  515. contractId: contract_id.value,
  516. wbsTempId: wbsTemp_id.value,
  517. tenantId: tenant_id.value,
  518. wbsType: wbs_type.value,
  519. classify: classifys.value,
  520. treeId: treeId.value,
  521. pkeyId: item.pkeyId,
  522. height: '100%',
  523. width: '100%',
  524. title: item.nodeName,
  525. isShow: true,
  526. index: index,
  527. item: item,
  528. }
  529. }
  530. //关闭窗口
  531. const TableFormClose = async ({ pkeyId, index }, indexs) => {
  532. const list = deepClone(DragModalTableForm.value)
  533. //取表单的数据
  534. await setChangeFormDatas(pkeyId, 'collapse')
  535. //关闭窗口
  536. list.splice(indexs, 1)
  537. DragModalTableForm.value = list
  538. listDatas.value[index].isWindow = false
  539. }
  540. const dragNodeMoreMenu = [
  541. { key: 'save', icon: 'save-2', name: '保存' },
  542. { key: 'preview', icon: 'eye', name: '预览' },
  543. ]
  544. //还原窗口
  545. const closeIconTap = async (event, item, indexs) => {
  546. const { index, pkeyId } = item
  547. let KeyId = `item-${index}-${pkeyId}`
  548. await TableFormClose(item, indexs)
  549. ActiveKey.value = KeyId
  550. }
  551. //菜单被点击
  552. const dragNodeMoreMenuTap = ({ key }, items) => {
  553. const { item } = items
  554. if (key === 'save') {
  555. if (item?.isTableForm) {
  556. tableFormSaveClick(item, items)
  557. } else {
  558. window.$message.warning('此表单暂无数据和文件')
  559. }
  560. } else if (key === 'preview') {
  561. if (item['isBussShow'] === 2 || item['isTabPdf'] === 1 || item['pdfUrl'] === '') {
  562. window.$message.warning('此表单暂无可预览文件')
  563. } else {
  564. previewClick(item, items)
  565. }
  566. }
  567. }
  568. //删除本表
  569. const tableFormDelLoading = ref(false)
  570. const delClick = async ({ pkeyId }) => {
  571. if (pkeyId) {
  572. if (isStatus.value !== 3) {
  573. tableFormDelLoading.value = true
  574. const { error, code } = await wbsApi.removeBussTabInfo({
  575. pkeyid: pkeyId,
  576. classify: classifys.value,
  577. })
  578. tableFormDelLoading.value = false
  579. if (!error && code === 200) {
  580. window?.$message?.success('操作成功')
  581. //判断是否存在窗口,如果存在,就删除窗口
  582. delWindowRefs(pkeyId)
  583. renewData()
  584. }
  585. } else {
  586. window?.$message?.warning('已上报的资料,不允许删除')
  587. }
  588. } else {
  589. window?.$message?.warning('pkeyId为空')
  590. }
  591. }
  592. //复制本表相关
  593. const showcopyModal = ref(false)
  594. const copyRefs = ref(null)
  595. const copyModalClose = ()=>{
  596. // copyModal.value=false
  597. }
  598. const CopyModalType = ref('1')
  599. const copySaveClick = async ()=>{
  600. //本节点复制
  601. if (CopyModalType.value === '2') {
  602. const { pkeyId, isTableRender, isTableForm } = copyItems.value
  603. if (pkeyId) {
  604. if (isStatus.value !== 3) {
  605. if (!isTableRender) {
  606. await copeBussTab(pkeyId)
  607. } else if (!isTableForm) {
  608. window?.$message?.warning('暂无表单数据')
  609. } else if (isTableRender) {
  610. copyClickLoading.value = true
  611. const isSave = await saveExcelBussData(items, null, false)
  612. if (isSave) {
  613. await copeBussTab(pkeyId)
  614. } else {
  615. copyClickLoading.value = false
  616. window?.$message?.warning('复制本表操作失败')
  617. }
  618. } else {
  619. window?.$message?.warning(`数据异常了, isRenderTableForm: ${isTableRender}, isTableForm: ${isTableForm}, pkeyIds:${pkeyId}`)
  620. }
  621. } else {
  622. window?.$message?.warning('已上报的资料,不允许复制')
  623. }
  624. } else {
  625. window?.$message?.warning('pkeyId为空')
  626. }
  627. } else {
  628. window?.$message?.warning('暂无相关接口')
  629. }
  630. }
  631. //复制本表
  632. const copyClickModalLoading = ref(false)
  633. const copyClickLoading = ref(false)
  634. const copyClick = async (items) => {
  635. const { id, isTableRender, isTableForm } = items
  636. if (id) {
  637. if (isStatus.value !== 3) {
  638. if (!isTableRender) {
  639. await copeBussTab(id)
  640. } else if (!isTableForm) {
  641. window?.$message?.warning('暂无表单数据')
  642. } else if (isTableRender) {
  643. copyClickLoading.value = true
  644. const isSave = await saveExcelBussData(items, null, false)
  645. if (isSave) {
  646. await copeBussTab(id)
  647. } else {
  648. copyClickLoading.value = false
  649. window?.$message?.warning('复制本表操作失败')
  650. }
  651. } else {
  652. window?.$message?.warning(`数据异常了, isRenderTableForm: ${isTableRender}, isTableForm: ${isTableForm}, pkeyIds:${id}`)
  653. }
  654. } else {
  655. window?.$message?.warning('已上报的资料,不允许复制')
  656. }
  657. } else {
  658. window?.$message?.warning('pkeyId为空')
  659. }
  660. }
  661. const copyItems = ref([])
  662. //跨节点复制弹窗
  663. // const copyClick = (items) => {
  664. // showcopyModal.value=true
  665. // copyItems.value=items
  666. // }
  667. //复制表的请求
  668. const copeBussTab = async (pkeyId) => {
  669. copyClickLoading.value = true
  670. const { error, code } = await landApi.copeTab({
  671. id: pkeyId,
  672. })
  673. copyClickLoading.value = false
  674. if (!error && code === 200) {
  675. window?.$message?.success('操作成功')
  676. renewData()
  677. }
  678. }
  679. //预览本表
  680. const tableFormPreviewLoading = ref(false)
  681. const previewClick = async (item, dragItem = null) => {
  682. tableFormPreviewLoading.value = true
  683. await getBussPdfInfo(item, dragItem)
  684. tableFormPreviewLoading.value = false
  685. }
  686. //上传变量
  687. const uploadModal = ref(false)
  688. const fileListData = ref([])
  689. const uploadData = ref({})
  690. //上传附件
  691. const uploadClick = (items, index) => {
  692. const { pkeyId, isTableForm, isTableRender } = items
  693. const keyName = `item-${index}-${pkeyId}`
  694. if (pkeyId) {
  695. if (isStatus.value !== 3 && isTableForm) {
  696. uploadModal.value = true
  697. uploadData.value = {
  698. projectId: projectId.value,
  699. contractId: contract_id.value,
  700. classify: classifys.value,
  701. pkeyId: pkeyId,
  702. nodeId: treeId.value,
  703. }
  704. //获取文件列表
  705. getBussFileList(pkeyId)
  706. } else if (!isTableRender) {
  707. CollapseChange(keyName)
  708. window?.$message?.warning('请再次点击上传')
  709. } else if (!isTableForm) {
  710. window?.$message?.warning('暂无表单数据')
  711. } else {
  712. window?.$message?.warning('已上报的资料,不允许上传')
  713. }
  714. } else {
  715. window?.$message?.warning('pkeyId为空')
  716. }
  717. }
  718. //获取文件列表
  719. const getBussFileList = async (pkeyId) => {
  720. const { error, code, data } = await wbsApi.getBussFileList({
  721. pkeyid: pkeyId,
  722. })
  723. if (!error && code === 200) {
  724. fileListData.value = getArrValue(data)
  725. } else {
  726. fileListData.value = []
  727. }
  728. }
  729. //上传文件
  730. const uploadChange = async ({ type }) => {
  731. if (type === 'success') {
  732. uploadModal.value = false
  733. renewData()
  734. } else if (type === 'del') {
  735. renewData()
  736. }
  737. }
  738. //关闭上传附件窗口
  739. const uploadModalClose = () => {
  740. uploadModal.value = false
  741. }
  742. //单个保存
  743. const tableFormSaveLoading = ref(false)
  744. const tableFormSaveClick = async (item, dragItem = null) => {
  745. if (isStatus.value !== 3) {
  746. tableFormSaveLoading.value = true
  747. const isSave = await saveExcelBussData(item, dragItem)
  748. if (isSave) {
  749. await getBussPdfInfo(item, dragItem)
  750. tableFormSaveLoading.value = false
  751. renewData()
  752. } else {
  753. tableFormSaveLoading.value = false
  754. }
  755. } else {
  756. window?.$message?.warning('已上报的资料,不允许保存。')
  757. }
  758. }
  759. //保存表单数据
  760. const saveExcelBussData = async ({ id }, dragItem = null, showTip = true) => {
  761. setDragModalLoading(dragItem, '保存中...', true)
  762. const refs = await getFormRef(id)
  763. const isRegExp = await refs?.isFormRegExp()
  764. if (isRegExp) {
  765. const formData = refs?.getFormData()
  766. const { error, code } = await landApi.saveBussData(formData)
  767. setDragModalLoading(dragItem)
  768. if (!error && code === 200) {
  769. if (showTip) {
  770. window?.$message?.success('保存成功')
  771. }
  772. return true
  773. } else {
  774. return false
  775. }
  776. } else {
  777. setDragModalLoading(dragItem)
  778. return false
  779. }
  780. }
  781. //预览PDF
  782. const getBussPdfInfo = async ({ id }, dragItem = null, showTip = true) => {
  783. setDragModalLoading(dragItem, '获取pdf中...', true)
  784. const { error, code, data } = await landApi.getBussPdfInfo({
  785. id: id,
  786. }, false)
  787. setDragModalLoading(dragItem)
  788. if (!error && code === 200) {
  789. if (data) {
  790. window.open(data, '_blank')
  791. } else if (showTip) {
  792. window?.$message?.warning('PDF错误')
  793. }
  794. } else {
  795. if (showTip) {
  796. window?.$message?.warning(data.msg || '获取PDF失败')
  797. }
  798. }
  799. }
  800. //通知数据更新
  801. const renewData = () => {
  802. emit('renew')
  803. ActiveKey.value = ''
  804. }
  805. //设置表单的加载状态
  806. const setDragModalLoading = (dragItem, text = '保存中...', show = false) => {
  807. if (dragItem && show) {
  808. dragItem.loading = true
  809. dragItem.loadingText = text
  810. }
  811. if (dragItem && !show) {
  812. dragItem.loading = false
  813. }
  814. }
  815. //获取表单的ref
  816. const getFormRef = async (pkeyId) => {
  817. const itemRef = itemRefs.value
  818. const index = arrIndex(itemRef, 'pKeyId', pkeyId)
  819. return itemRef[index].ref
  820. }
  821. //删除打开的窗口
  822. const delWindowRefs = (pkeyId) => {
  823. //判断是否存在窗口,如果存在,就删除窗口
  824. const list = DragModalTableForm.value
  825. const index = arrIndex(list, 'pkeyId', pkeyId)
  826. if (index !== -1) {
  827. list.splice(index, 1)
  828. DragModalTableForm.value = list
  829. }
  830. }
  831. //计算展开高度和滚动位置
  832. const getOffsetTop = (key = '') => {
  833. if (key) {
  834. const dom = document.getElementById(key)
  835. if (!draw_type.value) {
  836. if (dom?.offsetTop >= 583 && key) {
  837. emit('offsetTop', dom?.offsetTop - 583)
  838. } else {
  839. emit('offsetTop', dom?.offsetTop)
  840. }
  841. } else {
  842. if (dom.offsetTop >= 424 && key) {
  843. emit('offsetTop', dom?.offsetTop - 424)
  844. } else {
  845. emit('offsetTop', dom?.offsetTop)
  846. }
  847. }
  848. } else {
  849. emit('offsetTop', 0)
  850. }
  851. ActiveKey.value = key
  852. }
  853. //获取折叠面板的索引
  854. const getCollapseItemIndex = (name) => {
  855. const keys = name.split('-')
  856. if (keys.length > 0) {
  857. return keys[1]
  858. } else {
  859. return -1
  860. }
  861. }
  862. //获取表单的大小
  863. const getTableFormSize = (pkeyId) => {
  864. let formId = `table-form-${pkeyId}`
  865. try {
  866. const { clientWidth, clientHeight } = document.getElementById(formId).children[0]
  867. return {
  868. width: (clientWidth + 40) + 'px',
  869. height: (clientHeight + 80) + 'px',
  870. }
  871. } catch {
  872. return {
  873. width: '100%',
  874. height: '100%',
  875. }
  876. }
  877. }
  878. //转字符串
  879. const setToString = (val) => {
  880. return val ? val + '' : ''
  881. }
  882. //表单被点击
  883. const presentId = ref('')
  884. const excelTableFormClick = (key) => {
  885. presentId.value = key
  886. }
  887. //缓存被激活时
  888. onActivated(() => {
  889. setMountOnEventKey()
  890. })
  891. //缓存时被移除
  892. onDeactivated(() => {
  893. HTableForm.unmountEventKey()
  894. })
  895. //页面被卸载
  896. onUnmounted(() => {
  897. HTableForm.unmountEventKey()
  898. })
  899. const setMountOnEventKey = () => {
  900. HTableForm.setOnEventKey({
  901. //按下ctrl键 或 control 键
  902. onCtrlDown: async () => {
  903. //window.$HcLog('全局按键', '按下ctrl键 或 control 键')
  904. const refs = await setOnFuncFormRef()
  905. refs?.setIsCtrlKey(true)
  906. },
  907. //按下复制快捷键
  908. onCtrlDownC: async (event) => {
  909. //window.$HcLog('全局按键', '按下复制快捷键')
  910. const refs = await setOnFuncFormRef()
  911. refs?.setCopyKeyList(event)
  912. },
  913. //按下粘贴快捷键
  914. onCtrlDownV: async (event) => {
  915. //window.$HcLog('全局按键', '按下粘贴快捷键')
  916. const refs = await setOnFuncFormRef()
  917. await refs?.setPasteKeyList(event)
  918. },
  919. //放开ctrl键 或 control 键
  920. onCtrlUp: async () => {
  921. //window.$HcLog('全局按键', '放开ctrl键 或 control 键')
  922. const refs = await setOnFuncFormRef()
  923. refs?.setIsCtrlKey(false)
  924. },
  925. })
  926. }
  927. //获取表单的ref
  928. const setOnFuncFormRef = async () => {
  929. const pkeyId = presentId.value
  930. if (!isNullES(pkeyId)) {
  931. return await getFormRef(pkeyId)
  932. } else {
  933. return
  934. }
  935. }
  936. //获取已渲染的表单
  937. const getFilterFormData = async () => {
  938. const formArr = formDataList.value
  939. return formArr.filter((item) => {
  940. return (item.linkId ?? '') !== '' && item.isCollapseLoad
  941. })
  942. }
  943. //获取表单数据
  944. const getFormData = async () => {
  945. const formArr = await getFilterFormData()
  946. //获取表单数据
  947. let newArr = []
  948. for (let i = 0; i < formArr.length; i++) {
  949. const pkeyId = formArr[i].linkId
  950. const refs = await getFormRef(pkeyId)
  951. const form = refs?.getFormData()
  952. newArr.push({ ...form })
  953. }
  954. console.log('表单数据1111', newArr)
  955. return newArr
  956. }
  957. //获取表单效验数据
  958. const getFormRegExpJson = async () => {
  959. const formArr = await getFilterFormData()
  960. const list = listDatas.value
  961. //获取表单数据
  962. let formRegExpJson = {}
  963. for (let i = 0; i < formArr.length; i++) {
  964. const pKeyId = formArr[i].linkId
  965. const refs = await getFormRef(pKeyId)
  966. const regExp = refs?.getRegExpJson()
  967. const nodeName = refs?.getNodeName()
  968. if (getObjVal(regExp)) {
  969. const index = arrIndex(list, 'pKeyId', pKeyId)
  970. formRegExpJson[pKeyId] = {
  971. ...regExp,
  972. itemId: `item-${index}-${pKeyId}`,
  973. nodeName: nodeName,
  974. }
  975. }
  976. }
  977. return formRegExpJson
  978. }
  979. //获取当前展开项
  980. const getActiveKey = () => {
  981. return ActiveKey.value
  982. }
  983. //设置当前展开项
  984. const setActiveKey = (key) => {
  985. return ActiveKey.value = key
  986. }
  987. // 暴露出去
  988. defineExpose({
  989. getFormData,
  990. getFormRegExpJson,
  991. getActiveKey,
  992. setActiveKey,
  993. })
  994. </script>
  995. <style lang="scss" scoped>
  996. @import "../../components/collapse-form.scoped.scss";
  997. </style>
  998. <style lang="scss">
  999. @import "../../components/collapse-form.scss";
  1000. </style>