index.vue 49 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474
  1. <template>
  2. <div class="data-fill-list-box">
  3. <el-collapse v-model="ActiveKey" accordion @change="CollapseChange">
  4. <el-collapse-item
  5. v-for="(item, index) in listDatas" :id="`item-${index}-${item?.pkeyId}`"
  6. :key="item?.pkeyId" :disabled="item.isBussShow === 2"
  7. :name="`item-${index}-${item?.pkeyId}`"
  8. >
  9. <template #title>
  10. <div class="hc-collapse-item-header">
  11. <div class="text-lg truncate item-title">
  12. {{ item.nodeName }}
  13. </div>
  14. <div class="hc-extra-text-box">
  15. <HcTooltip v-if="item.isCopeTab === 2 || item.isCopeTab === 3" keys="wbs_del_table">
  16. <el-button
  17. :disabled="item.isBussShow === 2"
  18. :loading="tableFormDelLoading"
  19. plain
  20. type="danger"
  21. @click.stop="delClick(item)"
  22. >
  23. 删除本表
  24. </el-button>
  25. </HcTooltip>
  26. <HcTooltip keys="wbs_copy_table">
  27. <el-button
  28. v-if="item.isLinkTable === 1 || item.isBussShow === 2"
  29. disabled plain
  30. type="info"
  31. >
  32. 复制本表
  33. </el-button>
  34. <el-button
  35. v-else :loading="copyClickLoading" plain type="primary"
  36. @click.stop="copyClick(item, index)"
  37. >
  38. 复制本表
  39. </el-button>
  40. </HcTooltip>
  41. <HcTooltip keys="wbs_hide_table">
  42. <el-button
  43. :loading="tableFormHideLoading" plain type="primary"
  44. @click.stop="hideClick(item, index)"
  45. >
  46. <template v-if="item.isBussShow === 1">
  47. 隐藏本表
  48. </template>
  49. <template v-else>
  50. 显示本表
  51. </template>
  52. </el-button>
  53. </HcTooltip>
  54. <HcTooltip v-if="isStatus !== 3" keys="wbs_preview_table">
  55. <el-button
  56. v-if="item.isBussShow === 2 || item.isTabPdf === 1 || item.pdfUrl === '' || item.pdfUrl === null"
  57. disabled plain
  58. type="info"
  59. >
  60. 预览
  61. </el-button>
  62. <el-button
  63. v-else :loading="tableFormPreviewLoading" plain type="primary"
  64. @click.stop="previewClick(item)"
  65. >
  66. 预览
  67. </el-button>
  68. </HcTooltip>
  69. <HcTooltip keys="wbs_upload_table">
  70. <el-button
  71. :disabled="item.isBussShow === 2"
  72. :type="item.tabFileType === 2 ? 'success' : 'primary'" plain
  73. @click.stop="uploadClick(item, index)"
  74. >
  75. <template v-if="item.tabFileType === 2">
  76. 已上传
  77. </template>
  78. <template v-else>
  79. 上传
  80. </template>
  81. </el-button>
  82. </HcTooltip>
  83. </div>
  84. </div>
  85. </template>
  86. <div
  87. :style="`height: calc(100vh - ${draw_type ? '555px' : '360px'});`"
  88. class="data-fill-list-item-content"
  89. >
  90. <div v-if="item?.isWindow" class="data-fill-table-form-box is-window">
  91. <div class="hc-window-tip">
  92. <div class="table-form-no">
  93. <img :src="NoDataSvg" alt="">
  94. <div class="desc">
  95. 当前表单处于窗口模式,关闭相关窗口后恢复
  96. </div>
  97. </div>
  98. </div>
  99. </div>
  100. <div v-else class="data-fill-table-form-box">
  101. <TableFormItem
  102. v-if="item.isTableRender"
  103. :ref="(el) => setItemRefs(el, item)"
  104. :classify="classifys"
  105. :datas="changeFormDatas(item?.pkeyId, 'collapse')"
  106. :kid="item?.pkeyId"
  107. :node-name="item.nodeName"
  108. :pid="`table-form-${item?.pkeyId}`"
  109. :tid="treeId"
  110. @excelBodyTap="excelTableFormClick($event)"
  111. @render="tableFormRender($event, item, index)"
  112. @rightTap="tableFormRightTap($event, index)"
  113. />
  114. </div>
  115. <div class="hc-window-switch-box">
  116. <el-tooltip
  117. :content="item.isWindow ? '关闭窗口并恢复' : '当前表单窗口化'" :hide-after="0"
  118. placement="top"
  119. >
  120. <div class="icon-btn-view" @click.stop="windowClick(item, index)">
  121. <template v-if="item.isWindow">
  122. <HcIcon class="icon" name="picture-in-picture-2" />
  123. <span class="ml-1">关闭窗口化</span>
  124. </template>
  125. <template v-else>
  126. <HcIcon class="icon" name="picture-in-picture-exit" />
  127. <span class="ml-1">表单窗口化</span>
  128. </template>
  129. </div>
  130. </el-tooltip>
  131. </div>
  132. <div class="data-fill-table-tip-box">
  133. <el-scrollbar>
  134. <div class="text-orange tip-title">
  135. <HcIcon fill name="information" ui="text-2xl" />
  136. <span class="ml-1">提示</span>
  137. </div>
  138. <div class="text-gray-400 tip-item">
  139. 1、灰色框代表可通过系统识别计算,公式自动引用,可通过公式计算少量数据,(表头数据及简单),也可只填写白色框数据
  140. </div>
  141. <div class="text-gray-400 tip-item">
  142. 2、系统支持键盘中,shift +
  143. tab键向上一个填报框切换,tab向下一个填报框切换。Shift + 上 ( ↑ )、下 ( ↓ )、左 ( ← )、右 ( →
  144. )键,切换填报输入框焦点。
  145. </div>
  146. <div class="text-gray-400 tip-item">
  147. 3、先点击一下表单任一区域,再键盘按住 ⌘/ctrl +
  148. 点击,选择输入框,变为绿色边框,选中成功。选择完毕后,键盘按 ⌘/ctrl + c 复制所选中的数据,
  149. 再其它表内,或同一张表内,再次按住 ⌘/ctrl + 点击,选择输入框。键盘按 ⌘/ctrl + v
  150. 依次粘贴所选的数据。(目前仅支持输入框和文本框的操作)
  151. </div>
  152. <div class="text-orange-500 tip-item">
  153. 4、完善资料填写后记得一定要保存哦
  154. </div>
  155. </el-scrollbar>
  156. <div class="table-tip-foot">
  157. <div class="tip-left-btn">
  158. <HcTooltip keys="wbs_import_table">
  159. <div class="text-gray-400 dow-text">
  160. <HcIcon name="publish" ui="text-lg" />
  161. <span class="ml-1">导入列表数据</span>
  162. </div>
  163. </HcTooltip>
  164. <HcTooltip keys="wbs_download_table">
  165. <div class="text-main dow-text">
  166. <HcIcon name="file_download" ui="text-lg" />
  167. <span class="ml-1">下载导入模板</span>
  168. </div>
  169. </HcTooltip>
  170. </div>
  171. <div class="tip-right-btn">
  172. <HcTooltip keys="wbs_save_table">
  173. <el-button
  174. :disabled="!item?.isTableForm"
  175. :loading="tableFormSaveLoading" hc-btn
  176. type="primary"
  177. @click="tableFormSaveClick(item)"
  178. >
  179. <HcIcon name="save" />
  180. <span>保存</span>
  181. </el-button>
  182. </HcTooltip>
  183. </div>
  184. </div>
  185. </div>
  186. </div>
  187. </el-collapse-item>
  188. </el-collapse>
  189. </div>
  190. <!-- 右键菜单 -->
  191. <HcContextMenu ref="contextMenuRef" :datas="tableFormMenu" @item-click="handleMenuSelect" />
  192. <!-- 上传文件 -->
  193. <HcDialog :footer="false" :show="uploadModal" title="上传文件" widths="38rem" @close="uploadModalClose">
  194. <HcUpload :datas="uploadData" :file-list="fileListData" :is-canupload="isStatus == 3" @change="uploadChange" />
  195. </HcDialog>
  196. <!-- 插入设计值/频率 -->
  197. <HcDialog
  198. :loading="designModalLoading" :show="designModal" is-to-body save-text="确认插入"
  199. title="插入设计值/频率" widths="600px"
  200. @close="closeDesignModal" @save="designModalSave"
  201. >
  202. <el-alert :closable="false" title="填写完设计值和频率,系统自动计算实测值" type="warning" />
  203. <el-form ref="formDesignRef" :model="formDesignModel" label-width="auto" size="large">
  204. <div class="form-item-div text-center mb-3">
  205. <el-radio-group v-model="formDesignModel.type" size="large">
  206. <el-radio :label="1">
  207. 公路工程
  208. </el-radio>
  209. <el-radio :label="2" class="ml-4">
  210. 水利水电
  211. </el-radio>
  212. </el-radio-group>
  213. </div>
  214. <el-form-item label="设计值">
  215. <!-- onkeyup="value = value.replace(/^\D*(\d*(?:\.\d{0,2})?).*$/g,'$1')" -->
  216. <el-input v-model="formDesignModel.design" placeholder="如果设计值存在两个,则使用 '/' 连接,例如12/23" />
  217. </el-form-item>
  218. <el-form-item v-if="formDesignModel.type === 1" label="频率">
  219. <!-- onkeyup="value = value.replace(/^(0+)|[^\d]+/g,'')" -->
  220. <el-input
  221. v-model="formDesignModel.size"
  222. placeholder="如果设计值使用 '/' 连接,则频率也是用 '/' 连接,例如5/10"
  223. />
  224. </el-form-item>
  225. <el-form-item v-if="formDesignModel.type === 2" label="容量">
  226. <!-- onkeyup="value = value.replace(/^(0+)|[^\d]+/g,'')" -->
  227. <el-input
  228. v-model="formDesignModel.capacity"
  229. placeholder="如果容量存在两个,则使用 '*',或者 '/' 连接例如2*4,5/7"
  230. />
  231. </el-form-item>
  232. <el-form-item label="合格点数">
  233. <el-input
  234. v-model="formDesignModel.pass"
  235. placeholder="如果设计值使用 '/' 连接,则合格点数也是用 '/' 连接,例如2/5"
  236. />
  237. </el-form-item>
  238. <el-form-item label="偏差范围">
  239. <el-input
  240. v-model="formDesignModel.dev"
  241. placeholder="如果设计值使用 '/' 连接,则偏差范围也是用 '/' 连接,例如±2/±3"
  242. />
  243. </el-form-item>
  244. <el-form-item label="方向">
  245. <el-radio-group v-model="formDesignModel.direction" size="large">
  246. <el-radio :label="1">
  247. 横向
  248. </el-radio>
  249. <el-radio :label="2" class="ml-4">
  250. 纵向
  251. </el-radio>
  252. </el-radio-group>
  253. </el-form-item>
  254. </el-form>
  255. </HcDialog>
  256. <!-- 插入特殊字符 -->
  257. <HcDialog
  258. :loading="specialModalLoading" :show="specialModal" is-to-body save-text="确认插入" title="插入特殊字符"
  259. widths="600px" @close="specialModalClose" @save="specialNodeClick"
  260. >
  261. <HcSpecialDiaolg v-if="specialModal" ref="specialRef" @change="specialDiaolgChange" />
  262. </HcDialog>
  263. <!-- 关联试验数据 -->
  264. <HcDialog
  265. :footer="false" :loading="testModalLoading" :show="testModal" is-table is-to-body title="关联试验数据"
  266. widths="84%" @close="testModalClose"
  267. >
  268. <HcTestDiaolg
  269. v-if="testModal" :contract-id="contract_id" :project-id="projectId" :tenant-id="tenant_id"
  270. :wbs-id="wbsTemp_id"
  271. :wbs-type="wbs_type" @change="testTableRowName"
  272. />
  273. </HcDialog>
  274. <!-- 选择要插入的数据 -->
  275. <HcDialog
  276. :loading="insertDataLoading" :show="insertDataShow" is-table is-to-body save-text="保存"
  277. title="选择需要插入的数据" widths="84%" @close="cancelinsertData"
  278. @save="submitinsertData"
  279. >
  280. <HcTestData
  281. v-if="insertDataShow" ref="insertDataRef" :contract-id="contract_id" :project-id="projectId"
  282. :table-id="itinsertTableId"
  283. :tree-id="itinsertTreeId"
  284. />
  285. </HcDialog>
  286. <!-- 关联试验文件 -->
  287. <HcDialog
  288. :loading="fileModalLoading" :show="fileModal" is-table is-to-body save-text="保存" title="关联试验文件"
  289. widths="84%" @close="fileModalClose"
  290. @save="savefileModal"
  291. >
  292. <HcTestFile
  293. v-if="fileModal" ref="testFileRefs" :contract-id="contract_id" :project-id="projectId"
  294. :tenant-id="tenant_id"
  295. :tree-id="treeId" :wbs-id="wbsTemp_id"
  296. :wbs-type="wbs_type"
  297. />
  298. </HcDialog>
  299. <!-- 公式参数配置 -->
  300. <HcDialog
  301. :loading="formulaModalLoading" :show="formulaModal" is-to-body save-text="保存" title="公式参数配置"
  302. widths="84%" @close="formulaModalClose"
  303. @save="formulaSaveClick"
  304. >
  305. <HcFormula
  306. v-if="formulaModal" ref="formulaRefs" :key-name="tableFormItemNode.KeyName" :contract-id="contract_id"
  307. :formparent-id="formparentId"
  308. :pkey-id="tableFormItemNode.pkeyId" :project-id="projectId"
  309. />
  310. </HcDialog>
  311. <!-- 查看表单 -->
  312. <template v-for="(item, index) in DragModalTableForm">
  313. <HcDragModal
  314. :close-icon-arr="closeIconArr" :eid="item.pkeyId" :height="DragModalHeight" :is-show="item.isShow"
  315. :loading="item.loading" :loading-text="item.loadingText" :title="item.title"
  316. is-sort-top
  317. @close="TableFormClose(item, index)" @closeIconTap="closeIconTap($event, item, index)"
  318. >
  319. <HcDragNode :more-menu="dragNodeMoreMenu" @menuTap="dragNodeMoreMenuTap($event, item)">
  320. <TableFormItem
  321. :ref="(el) => setItemRefs(el, item)"
  322. :classify="item.classify"
  323. :datas="changeFormDatas(item?.pkeyId, 'window')"
  324. :height="item.height"
  325. :kid="item.pkeyId"
  326. :node-name="item.title"
  327. :pid="`table-form-${item?.pkeyId}`"
  328. :scroll="false"
  329. :tid="item.treeId"
  330. :width="item.width"
  331. @excelBodyTap="excelTableFormClick($event)"
  332. @render="tableFormRender($event, item.item, item.index)"
  333. @rightTap="tableFormRightTap($event, item.index)"
  334. />
  335. </HcDragNode>
  336. </HcDragModal>
  337. </template>
  338. <!-- 复制本表 -->
  339. <HcDialog
  340. :loading="copyClickModalLoading" :show="showcopyModal" is-to-body save-text="确认复制" title="复制本表"
  341. widths="84%" @close="copyModalClose"
  342. @save="copySaveClick"
  343. >
  344. <HcCopy
  345. v-if="showcopyModal" ref="copyRefs" :contract-id="contract_id" :project-id="projectId"
  346. :classify="classifys"
  347. :tree_AutoExpandKeys="tree_AutoExpandKeys"
  348. :treenode-data-info="treenodeDataInfo"
  349. :copy-items="copyItems"
  350. :copy-modal-type="CopyModalType"
  351. />
  352. <template #footer>
  353. <div class="lr-dialog-footer">
  354. <div class="left flex items-center">
  355. <div class="mr-4">
  356. 复制方式:
  357. </div>
  358. <el-radio-group v-model="CopyModalType">
  359. <el-radio label="1">
  360. 跨节点复制
  361. </el-radio>
  362. <el-radio class="ml-4" label="2">
  363. 本节点复制
  364. </el-radio>
  365. </el-radio-group>
  366. </div>
  367. <div class="right">
  368. <el-button size="large" @click="showcopyModal = false">
  369. 取消
  370. </el-button>
  371. <el-button :loading="copyClickModalLoading" hc-btn type="primary" @click="copySaveClick">
  372. 确认复制
  373. </el-button>
  374. </div>
  375. </div>
  376. </template>
  377. </HcDialog>
  378. </template>
  379. <script setup>
  380. import { nextTick, onActivated, onDeactivated, onMounted, onUnmounted, ref, watch } from 'vue'
  381. import HTableForm from '~src/plugins/HTableForm'
  382. import { useAppStore } from '~src/store'
  383. import wbsApi from '~api/data-fill/wbs'
  384. import HcUpload from '../components/HcUpload.vue'
  385. import TableFormItem from './table-form-item.vue'
  386. import HcSpecialDiaolg from './special-diaolg.vue'
  387. import HcTestDiaolg from './test-diaolg.vue'
  388. import HcTestData from './test-data.vue'
  389. import HcTestFile from './test-file.vue'
  390. import HcFormula from './formula.vue'
  391. import HcCopy from './test-copy.vue'
  392. import NoDataSvg from '~src/assets/view/no-data.svg'
  393. import {
  394. arrIndex, deepClone, getArrValue,
  395. getObjVal, getObjValue, isNullES, setPosRange,
  396. } from 'js-fast-way'
  397. //参数
  398. const props = defineProps({
  399. datas: {
  400. type: Array,
  401. default: () => ([]),
  402. },
  403. classify: {
  404. type: [String, Number],
  405. default: '',
  406. },
  407. status: {
  408. type: [String, Number],
  409. default: '',
  410. },
  411. primaryKeyId: {
  412. type: [String, Number],
  413. default: '',
  414. },
  415. contractId: {
  416. type: [String, Number],
  417. default: '',
  418. },
  419. drawType: {
  420. type: Boolean,
  421. default: false,
  422. },
  423. wbsTempId: {
  424. type: [String, Number],
  425. default: '',
  426. },
  427. tenantId: {
  428. type: [String, Number],
  429. default: '',
  430. },
  431. wbsType: {
  432. type: [String, Number],
  433. default: '',
  434. },
  435. treeAutoExpandKeys: {
  436. type: [Array],
  437. default: () => ([]),
  438. },
  439. treenodeDataInfo: {
  440. type: [Object],
  441. default: () => ({}),
  442. },
  443. })
  444. //事件
  445. const emit = defineEmits(['renew', 'offsetTop'])
  446. //初始变量
  447. const useAppState = useAppStore()
  448. //全局变量
  449. const projectId = ref(useAppState.projectId)
  450. const contract_id = ref(props.contractId)
  451. const treeId = ref(props.primaryKeyId)
  452. const classifys = ref(props.classify)
  453. const wbsTemp_id = ref(props.wbsTempId)
  454. const tenant_id = ref(props.tenantId)
  455. const wbs_type = ref(props.wbsType)
  456. const isStatus = ref(parseInt(props.status))
  457. const listDatas = ref([])
  458. const draw_type = ref(props.drawType)
  459. const tree_AutoExpandKeys = ref(props.treeAutoExpandKeys)
  460. const treenodeDataInfo = ref(props.treenodeDataInfo)
  461. //表单变量
  462. const formDataList = ref([])
  463. const formKeyIds = ref('')
  464. const formparentId = ref('')
  465. //处理ref
  466. const itemRefs = ref([])
  467. const setItemRefs = (el, { pkeyId }) => {
  468. if (el) {
  469. let index = arrIndex(itemRefs.value, 'pkeyId', pkeyId)
  470. if (index !== -1) {
  471. itemRefs.value[index].ref = el
  472. } else {
  473. itemRefs.value.push({
  474. pkeyId: pkeyId,
  475. ref: el,
  476. })
  477. }
  478. }
  479. }
  480. //处理表单的ref
  481. const setSpliceItemRefs = async ({ pkeyId }) => {
  482. const refs = itemRefs.value
  483. let index = arrIndex(refs, 'pkeyId', pkeyId)
  484. if (index !== -1) {
  485. refs.splice(index, 1)
  486. itemRefs.value = refs
  487. }
  488. }
  489. const closeIconArr = [
  490. { key: 'reduction', icon: 'picture-in-picture-2', name: '还原到面板内,并自动展开面板' },
  491. ]
  492. //组件参数变量
  493. const apis = ref({
  494. dataInfo: wbsApi.getBussDataInfo,
  495. bussCols: wbsApi.getHtmlBussCols,
  496. excelHtml: wbsApi.getExcelHtml,
  497. })
  498. //深度监听数据
  499. watch(() => [
  500. props.datas,
  501. ], ([datas]) => {
  502. setFormDataNum(datas)
  503. }, { deep: true })
  504. //监听变量值
  505. watch(() => [
  506. useAppState.projectId,
  507. props.contractId,
  508. props.wbsTempId,
  509. props.tenantId,
  510. props.wbsType,
  511. props.status,
  512. props.classify,
  513. props.primaryKeyId,
  514. ], ([pid, cid, temp_id, tid, type, status, class_id, tree_id]) => {
  515. projectId.value = pid
  516. contract_id.value = cid
  517. wbsTemp_id.value = temp_id
  518. tenant_id.value = tid
  519. wbs_type.value = type
  520. isStatus.value = parseInt(status)
  521. classifys.value = class_id
  522. treeId.value = tree_id
  523. })
  524. //渲染完成
  525. onMounted(() => {
  526. setFormDataNum(props.datas)
  527. setTableFormMenu(useAppState.projectInfo)
  528. const { offsetHeight } = document.body
  529. DragModalHeight.value = offsetHeight - 200
  530. setMountOnEventKey()
  531. })
  532. //处理变动的数据
  533. const changeFormData = ref({
  534. window: [],
  535. collapse: [],
  536. })
  537. const changeFormDatas = (pkeyId, type) => {
  538. const changeData = changeFormData.value[type]
  539. const index = arrIndex(changeData, 'pkeyId', pkeyId)
  540. if (index !== -1) {
  541. return changeData[index]
  542. } else {
  543. return {}
  544. }
  545. }
  546. //设置变动的数据
  547. const setChangeFormDatas = async (pkeyId, type) => {
  548. const refs = await getFormRef(pkeyId)
  549. const formData = refs?.getFormData()
  550. const changeData = changeFormData.value[type]
  551. const index = arrIndex(changeData, 'pkeyId', pkeyId)
  552. if (index !== -1) {
  553. changeData[index] = formData
  554. } else {
  555. changeData.push(formData)
  556. }
  557. changeFormData.value[type] = changeData
  558. }
  559. //展开事件
  560. const ActiveKey = ref('')
  561. const CollapseChange = (name) => {
  562. ActiveKey.value = name
  563. let index = getCollapseItemIndex(name)
  564. if (index > -1) {
  565. getOffsetTop(name)
  566. const item = listDatas.value[index]
  567. formKeyIds.value = setToString(item.pkeyId)
  568. formparentId.value = setToString(item.parentId)
  569. nextTick(() => {
  570. if (!item.isTableRender) {
  571. item.isTableRender = true
  572. }
  573. })
  574. } else {
  575. getOffsetTop()
  576. formKeyIds.value = ''
  577. formparentId.value = ''
  578. }
  579. }
  580. //初始设置
  581. const setFormDataNum = (datas) => {
  582. itemRefs.value = []
  583. ActiveKey.value = ''
  584. let newArr = []
  585. for (let i = 0; i < datas.length; i++) {
  586. newArr.push({ isCollapseLoad: false })
  587. }
  588. formDataList.value = newArr
  589. listDatas.value = deepClone(datas)
  590. }
  591. //渲染完成
  592. const tableFormRender = (form, item, index) => {
  593. console.log(form)
  594. formDataList.value[index] = form
  595. formDataList.value[index].isCollapseLoad = form.isRenderForm
  596. item.isTableForm = form.isRenderForm
  597. }
  598. //菜单数据
  599. const contextMenuRef = ref(null)
  600. const tableFormMenu = ref([])
  601. const tableFormItemNode = ref({}) //临时信息
  602. //设置菜单权限数据
  603. const setTableFormMenu = (info) => {
  604. let newArr = [], infos = getObjValue(info)
  605. const isOpen = infos['isOpenRandomNumber'] ?? 0
  606. if (isOpen === 1 && isStatus.value !== 3) {
  607. newArr.push({ label: '插入设计值/频率', key: 'design' })
  608. }
  609. newArr.push({ label: '插入特殊字符', key: 'special' })
  610. newArr.push({ label: '关联试验数据', key: 'test' })
  611. newArr.push({ label: '关联试验文件', key: 'file' })
  612. newArr.push({ label: '公式参数', key: 'formula' })
  613. newArr.push({ label: '清除数据', key: 'clear' })
  614. tableFormMenu.value = newArr
  615. }
  616. //鼠标右键事件
  617. const tableFormRightTap = ({ event, KeyName, startPos, endPos, pkeyId }, index) => {
  618. //存储临时信息
  619. tableFormItemNode.value = { KeyName, index, startPos, endPos, pkeyId }
  620. contextMenuRef.value?.showMenu(event, false) //展开菜单
  621. }
  622. //鼠标右键菜单被点击
  623. const handleMenuSelect = async ({ key }) => {
  624. if (key === 'design') {
  625. setInitDesignForm()
  626. designModalLoading.value = false
  627. designModal.value = true
  628. } else if (key === 'special') {
  629. specialModalShow()
  630. } else if (key === 'test') {
  631. testModalLoading.value = false
  632. testModal.value = true
  633. } else if (key === 'file') {
  634. fileModalLoading.value = false
  635. fileModal.value = true
  636. } else if (key === 'formula') {
  637. formulaModalLoading.value = false
  638. formulaModal.value = true
  639. } else if (key === 'clear') {
  640. const { pkeyId } = tableFormItemNode.value
  641. const refs = await getFormRef(pkeyId)
  642. refs?.getTableFormInfo(0)
  643. }
  644. }
  645. //插入设计值
  646. const designModal = ref(false)
  647. const formDesignRef = ref(null)
  648. const formDesignModel = ref()
  649. //初始设计值/频率表单
  650. const setInitDesignForm = () => {
  651. formDesignModel.value = {
  652. type: 1, design: '', size: '',
  653. dev: '', key: '', capacity: '',
  654. pass: '', pkId: '', direction:1,
  655. }
  656. }
  657. //设计值频率计算
  658. const designModalLoading = ref(false)
  659. const designModalSave = async () => {
  660. const { pkeyId, KeyName } = tableFormItemNode.value
  661. if (pkeyId) {
  662. designModalLoading.value = true
  663. //const {design, size} = formDesignModel.value
  664. const { error, code, data } = await wbsApi.queryFormulaRange({
  665. ...formDesignModel.value,
  666. // dev: (!design && !size) ? '±5': '',
  667. key: KeyName,
  668. pkId: pkeyId,
  669. })
  670. //处理数据
  671. const res = getObjVal(data)
  672. if (!error && code === 200 && res) {
  673. try {
  674. const refs = await getFormRef(pkeyId)
  675. const itemFormData = refs?.getFormData()
  676. Object.keys(data).forEach(key => {
  677. itemFormData[key] = data[key]
  678. })
  679. refs?.setFormData(itemFormData)
  680. } catch {
  681. }
  682. designModalLoading.value = false
  683. designModal.value = false
  684. } else {
  685. designModalLoading.value = false
  686. }
  687. } else {
  688. window?.$message?.warning('pkeyId为空')
  689. }
  690. }
  691. //关闭设计值/频率弹窗
  692. const closeDesignModal = () => {
  693. designModal.value = false
  694. setInitDesignForm()
  695. }
  696. //插入特殊字符
  697. const specialModal = ref(false)
  698. const specialModalLoading = ref(false)
  699. const specialModalShow = () => {
  700. specialFormValue.value = ''
  701. specialModalLoading.value = false
  702. specialModal.value = true
  703. }
  704. //监听特殊符号输入框的内容
  705. const specialFormValue = ref('')
  706. const specialDiaolgChange = (val) => {
  707. specialFormValue.value = val
  708. }
  709. //确认插入
  710. const specialRef = ref(null)
  711. const specialNodeClick = async () => {
  712. specialModalLoading.value = true
  713. const itemNode = tableFormItemNode.value
  714. const { KeyName, pkeyId } = itemNode
  715. try {
  716. const refs = await getFormRef(pkeyId)
  717. const itemFormData = refs?.getFormData()
  718. const { code, val, posVal } = await specialRef.value?.getSpecialNode(itemNode, itemFormData[KeyName])
  719. if (code === 200 && val) {
  720. itemFormData[KeyName] = val
  721. refs?.setFormData(itemFormData)
  722. specialModalLoading.value = false
  723. specialModal.value = false
  724. await nextTick(() => {
  725. setPosRange(KeyName, posVal)
  726. })
  727. } else {
  728. specialModalLoading.value = false
  729. }
  730. } catch (e) {
  731. specialModalLoading.value = false
  732. }
  733. }
  734. //关闭插入特殊字符
  735. const specialModalClose = () => {
  736. specialModalLoading.value = false
  737. specialModal.value = false
  738. }
  739. //关联试验数据
  740. const testModal = ref(false)
  741. const testModalLoading = ref(false)
  742. //关联试验数据被点击
  743. const itinsertTableId = ref('')
  744. const itinsertTreeId = ref('')
  745. const testTableRowName = ({ row, treeId }) => {
  746. itinsertTableId.value = row.id
  747. itinsertTreeId.value = treeId
  748. insertDataLoading.value = false
  749. insertDataShow.value = true
  750. }
  751. //关闭弹窗
  752. const testModalClose = () => {
  753. testModal.value = false
  754. testModalLoading.value = false
  755. }
  756. //选择要插入的实验数据
  757. const insertDataShow = ref(false)
  758. const insertDataLoading = ref(false)
  759. //确定关联试验数据数据
  760. const insertDataRef = ref(null)
  761. const submitinsertData = async () => {
  762. insertDataLoading.value = true
  763. const itemNode = tableFormItemNode.value
  764. const { KeyName, pkeyId } = itemNode
  765. try {
  766. const refs = await getFormRef(pkeyId)
  767. const itemFormData = refs?.getFormData()
  768. const { code, val, posVal } = await insertDataRef.value?.submitinsertData(itemNode, itemFormData[KeyName])
  769. if (code === 200 && val) {
  770. itemFormData[KeyName] = val
  771. refs?.setFormData(itemFormData)
  772. insertDataLoading.value = false
  773. insertDataShow.value = false
  774. testModal.value = false
  775. await nextTick(() => {
  776. setPosRange(KeyName, posVal)
  777. })
  778. }
  779. } catch {
  780. insertDataLoading.value = false
  781. }
  782. }
  783. //取消关联数据
  784. const cancelinsertData = async () => {
  785. insertDataShow.value = false
  786. insertDataLoading.value = false
  787. }
  788. //关联试验文件
  789. const fileModal = ref(false)
  790. const testFileRefs = ref(null)
  791. //确认关联文件
  792. const fileModalLoading = ref(false)
  793. const savefileModal = async () => {
  794. fileModalLoading.value = true
  795. await testFileRefs.value?.savefileSubmit()
  796. fileModalLoading.value = false
  797. fileModal.value = false
  798. }
  799. //关闭弹窗
  800. const fileModalClose = () => {
  801. fileModal.value = false
  802. fileModalLoading.value = false
  803. }
  804. //公式参数配置
  805. const formulaModal = ref(false)
  806. const formulaRefs = ref(null)
  807. //保存
  808. const formulaModalLoading = ref(false)
  809. const formulaSaveClick = async () => {
  810. formulaModalLoading.value = true
  811. await formulaRefs.value?.panelSave()
  812. formulaModalLoading.value = false
  813. formulaModal.value = false
  814. }
  815. //关闭
  816. const formulaModalClose = () => {
  817. formulaModal.value = false
  818. formulaModalLoading.value = false
  819. }
  820. //窗口化
  821. const DragModalTableForm = ref([])
  822. const DragModalHeight = ref(600)
  823. const windowClick = async (item, indexs) => {
  824. const list = deepClone(DragModalTableForm.value)
  825. let index = arrIndex(list, 'pkeyId', item.pkeyId)
  826. if (!item.isWindow) {
  827. const formSize = getTableFormSize(item?.pkeyId)
  828. const newTableForm = {
  829. ...setInitDragModalTableForm(item, indexs),
  830. ...formSize,
  831. }
  832. await setChangeFormDatas(item?.pkeyId, 'window')
  833. item.isWindow = true
  834. //处理表单的ref
  835. await setSpliceItemRefs(item)
  836. //弹窗表单的排序
  837. if (index === -1) {
  838. list.push(newTableForm)
  839. } else if (index !== list.length - 1) {
  840. //检查是否在最上层,不在则置顶,可以解决多次点击时,频繁更改全局状态的问题
  841. list.splice(index, 1)
  842. list.push(newTableForm)
  843. }
  844. DragModalTableForm.value = list
  845. ActiveKey.value = ''
  846. } else {
  847. await setChangeFormDatas(item?.pkeyId, 'collapse')
  848. //处理表单的ref
  849. await setSpliceItemRefs(item)
  850. if (index !== -1) {
  851. list.splice(index, 1)
  852. DragModalTableForm.value = list
  853. }
  854. item.isWindow = false
  855. }
  856. }
  857. //初始拖动表单的内容
  858. const setInitDragModalTableForm = (item, index) => {
  859. return {
  860. projectId: projectId.value,
  861. contractId: contract_id.value,
  862. wbsTempId: wbsTemp_id.value,
  863. tenantId: tenant_id.value,
  864. wbsType: wbs_type.value,
  865. classify: classifys.value,
  866. treeId: treeId.value,
  867. pkeyId: item.pkeyId,
  868. height: '100%',
  869. width: '100%',
  870. title: item.nodeName,
  871. isShow: true,
  872. index: index,
  873. item: item,
  874. }
  875. }
  876. //关闭窗口
  877. const TableFormClose = async ({ pkeyId, index }, indexs) => {
  878. const list = deepClone(DragModalTableForm.value)
  879. //取表单的数据
  880. await setChangeFormDatas(pkeyId, 'collapse')
  881. //关闭窗口
  882. list.splice(indexs, 1)
  883. DragModalTableForm.value = list
  884. listDatas.value[index].isWindow = false
  885. }
  886. const dragNodeMoreMenu = [
  887. { key: 'save', icon: 'save-2', name: '保存' },
  888. { key: 'preview', icon: 'eye', name: '预览' },
  889. ]
  890. //还原窗口
  891. const closeIconTap = async (event, item, indexs) => {
  892. const { index, pkeyId } = item
  893. let KeyId = `item-${index}-${pkeyId}`
  894. await TableFormClose(item, indexs)
  895. ActiveKey.value = KeyId
  896. }
  897. //菜单被点击
  898. const dragNodeMoreMenuTap = ({ key }, items) => {
  899. const { item } = items
  900. if (key === 'save') {
  901. if (item?.isTableForm) {
  902. tableFormSaveClick(item, items)
  903. } else {
  904. window.$message.warning('此表单暂无数据和文件')
  905. }
  906. } else if (key === 'preview') {
  907. if (item['isBussShow'] === 2 || item['isTabPdf'] === 1 || item['pdfUrl'] === '' || item['pdfUrl'] === null) {
  908. window.$message.warning('此表单暂无可预览文件')
  909. } else {
  910. previewClick(item, items)
  911. }
  912. }
  913. }
  914. //删除本表
  915. const tableFormDelLoading = ref(false)
  916. const delClick = async ({ pkeyId }) => {
  917. if (pkeyId) {
  918. if (isStatus.value !== 3) {
  919. tableFormDelLoading.value = true
  920. const { error, code } = await wbsApi.removeBussTabInfo({
  921. pkeyid: pkeyId,
  922. classify: classifys.value,
  923. })
  924. tableFormDelLoading.value = false
  925. if (!error && code === 200) {
  926. window?.$message?.success('操作成功')
  927. //判断是否存在窗口,如果存在,就删除窗口
  928. delWindowRefs(pkeyId)
  929. renewData()
  930. }
  931. } else {
  932. window?.$message?.warning('已上报的资料,不允许删除')
  933. }
  934. } else {
  935. window?.$message?.warning('pkeyId为空')
  936. }
  937. }
  938. //复制本表相关
  939. const showcopyModal = ref(false)
  940. const copyRefs = ref(null)
  941. const copyModalClose = () => {
  942. // copyModal.value=false
  943. }
  944. const CopyModalType = ref('1')
  945. const copySaveClick = async () => {
  946. //本节点复制
  947. if (CopyModalType.value === '2') {
  948. const { pkeyId, isTableRender, isTableForm } = copyItems.value
  949. if (pkeyId) {
  950. if (isStatus.value !== 3) {
  951. if (!isTableRender) {
  952. await copeBussTab(pkeyId)
  953. } else if (!isTableForm) {
  954. window?.$message?.warning('暂无表单数据')
  955. } else if (isTableRender) {
  956. copyClickLoading.value = true
  957. const isSave = await saveExcelBussData(items, null, false)
  958. if (isSave) {
  959. await copeBussTab(pkeyId)
  960. } else {
  961. copyClickLoading.value = false
  962. window?.$message?.warning('复制本表操作失败')
  963. }
  964. } else {
  965. window?.$message?.warning(`数据异常了, isRenderTableForm: ${isTableRender}, isTableForm: ${isTableForm}, pkeyIds:${pkeyId}`)
  966. }
  967. } else {
  968. window?.$message?.warning('已上报的资料,不允许复制')
  969. }
  970. } else {
  971. window?.$message?.warning('pkeyId为空')
  972. }
  973. } else {
  974. window?.$message?.warning('暂无相关接口')
  975. }
  976. }
  977. //复制本表
  978. const copyClickModalLoading = ref(false)
  979. const copyClickLoading = ref(false)
  980. const copyClick = async (items) => {
  981. const { pkeyId, isTableRender, isTableForm } = items
  982. if (pkeyId) {
  983. if (isStatus.value !== 3) {
  984. if (!isTableRender) {
  985. await copeBussTab(pkeyId)
  986. } else if (!isTableForm) {
  987. window?.$message?.warning('暂无表单数据')
  988. } else if (isTableRender) {
  989. copyClickLoading.value = true
  990. const isSave = await saveExcelBussData(items, null, false)
  991. if (isSave) {
  992. await copeBussTab(pkeyId)
  993. } else {
  994. copyClickLoading.value = false
  995. window?.$message?.warning('复制本表操作失败')
  996. }
  997. } else {
  998. window?.$message?.warning(`数据异常了, isRenderTableForm: ${isTableRender}, isTableForm: ${isTableForm}, pkeyIds:${pkeyId}`)
  999. }
  1000. } else {
  1001. window?.$message?.warning('已上报的资料,不允许复制')
  1002. }
  1003. } else {
  1004. window?.$message?.warning('pkeyId为空')
  1005. }
  1006. }
  1007. const copyItems = ref([])
  1008. //跨节点复制弹窗
  1009. // const copyClick = (items) => {
  1010. // showcopyModal.value=true
  1011. // copyItems.value=items
  1012. // }
  1013. //复制表的请求
  1014. const copeBussTab = async (pkeyId) => {
  1015. copyClickLoading.value = true
  1016. const { error, code } = await wbsApi.copeBussTab({
  1017. pkeyId: pkeyId,
  1018. })
  1019. copyClickLoading.value = false
  1020. if (!error && code === 200) {
  1021. window?.$message?.success('操作成功')
  1022. renewData()
  1023. }
  1024. }
  1025. //隐藏本表
  1026. const tableFormHideLoading = ref(false)
  1027. const hideClick = async ({ pkeyId, isBussShow }) => {
  1028. if (pkeyId) {
  1029. if (isStatus.value !== 3) {
  1030. tableFormHideLoading.value = true
  1031. const bussShow = isBussShow === 2 ? 1 : 2 //状态(1显示 2隐藏)
  1032. const { error, code } = await wbsApi.showBussTab({
  1033. pkeyId: pkeyId,
  1034. status: bussShow,
  1035. })
  1036. tableFormHideLoading.value = false
  1037. if (!error && code === 200) {
  1038. window?.$message?.success('操作成功')
  1039. if (bussShow === 2) {
  1040. //判断是否存在窗口,如果存在,就删除窗口
  1041. delWindowRefs(pkeyId)
  1042. }
  1043. renewData()
  1044. }
  1045. } else {
  1046. window?.$message?.warning('已上报的资料,不允许隐藏')
  1047. }
  1048. } else {
  1049. window?.$message?.warning('pkeyId为空')
  1050. }
  1051. }
  1052. //预览本表
  1053. const tableFormPreviewLoading = ref(false)
  1054. const previewClick = async (item, dragItem = null) => {
  1055. tableFormPreviewLoading.value = true
  1056. await getBussPdfInfo(item, dragItem)
  1057. tableFormPreviewLoading.value = false
  1058. }
  1059. //上传变量
  1060. const uploadModal = ref(false)
  1061. const fileListData = ref([])
  1062. const uploadData = ref({})
  1063. //上传附件
  1064. const uploadClick = (items, index) => {
  1065. const { pkeyId, isTableForm, isTableRender } = items
  1066. const keyName = `item-${index}-${pkeyId}`
  1067. if (pkeyId) {
  1068. if (isTableForm) {
  1069. uploadModal.value = true
  1070. uploadData.value = {
  1071. projectId: projectId.value,
  1072. contractId: contract_id.value,
  1073. classify: classifys.value,
  1074. pkeyId: pkeyId,
  1075. nodeId: treeId.value,
  1076. }
  1077. //获取文件列表
  1078. getBussFileList(pkeyId)
  1079. } else if (!isTableRender) {
  1080. CollapseChange(keyName)
  1081. window?.$message?.warning('请再次点击上传')
  1082. } else if (!isTableForm) {
  1083. window?.$message?.warning('暂无表单数据')
  1084. }
  1085. // else {
  1086. // window?.$message?.warning('已上报的资料,不允许上传')
  1087. // }
  1088. } else {
  1089. window?.$message?.warning('pkeyId为空')
  1090. }
  1091. }
  1092. //获取文件列表
  1093. const getBussFileList = async (pkeyId) => {
  1094. const { error, code, data } = await wbsApi.getBussFileList({
  1095. pkeyid: pkeyId,
  1096. })
  1097. if (!error && code === 200) {
  1098. fileListData.value = getArrValue(data)
  1099. } else {
  1100. fileListData.value = []
  1101. }
  1102. }
  1103. //上传文件
  1104. const uploadChange = async ({ type }) => {
  1105. if (type === 'success') {
  1106. uploadModal.value = false
  1107. renewData()
  1108. } else if (type === 'del') {
  1109. renewData()
  1110. }
  1111. }
  1112. //关闭上传附件窗口
  1113. const uploadModalClose = () => {
  1114. uploadModal.value = false
  1115. }
  1116. //单个保存
  1117. const tableFormSaveLoading = ref(false)
  1118. const tableFormSaveClick = async (item, dragItem = null) => {
  1119. if (isStatus.value !== 3) {
  1120. tableFormSaveLoading.value = true
  1121. const isSave = await saveExcelBussData(item, dragItem)
  1122. if (isSave) {
  1123. await getBussPdfInfo(item, dragItem)
  1124. tableFormSaveLoading.value = false
  1125. renewData()
  1126. } else {
  1127. tableFormSaveLoading.value = false
  1128. }
  1129. } else {
  1130. window?.$message?.warning('已上报的资料,不允许保存。')
  1131. }
  1132. }
  1133. //保存表单数据
  1134. const saveExcelBussData = async ({ pkeyId }, dragItem = null, showTip = true) => {
  1135. setDragModalLoading(dragItem, '保存中...', true)
  1136. const refs = await getFormRef(pkeyId)
  1137. const isRegExp = await refs?.isFormRegExp()
  1138. if (isRegExp) {
  1139. const formData = refs?.getFormData()
  1140. const { error, code } = await wbsApi.saveExcelBussData(formData)
  1141. setDragModalLoading(dragItem)
  1142. if (!error && code === 200) {
  1143. if (showTip) {
  1144. window?.$message?.success('保存成功')
  1145. }
  1146. return true
  1147. } else {
  1148. return false
  1149. }
  1150. } else {
  1151. setDragModalLoading(dragItem)
  1152. return false
  1153. }
  1154. }
  1155. //预览PDF
  1156. const getBussPdfInfo = async ({ pkeyId }, dragItem = null, showTip = true) => {
  1157. setDragModalLoading(dragItem, '获取pdf中...', true)
  1158. const { error, code, data } = await wbsApi.getBussPdfInfo({
  1159. pkeyId: pkeyId,
  1160. }, false)
  1161. setDragModalLoading(dragItem)
  1162. if (!error && code === 200) {
  1163. if (data) {
  1164. window.open(data, '_blank')
  1165. } else if (showTip) {
  1166. window?.$message?.warning('PDF错误')
  1167. }
  1168. } else {
  1169. if (showTip) {
  1170. window?.$message?.warning(data.msg || '获取PDF失败')
  1171. }
  1172. }
  1173. }
  1174. //通知数据更新
  1175. const renewData = () => {
  1176. emit('renew')
  1177. ActiveKey.value = ''
  1178. }
  1179. //设置表单的加载状态
  1180. const setDragModalLoading = (dragItem, text = '保存中...', show = false) => {
  1181. if (dragItem && show) {
  1182. dragItem.loading = true
  1183. dragItem.loadingText = text
  1184. }
  1185. if (dragItem && !show) {
  1186. dragItem.loading = false
  1187. }
  1188. }
  1189. //获取表单的ref
  1190. const getFormRef = async (pkeyId) => {
  1191. const itemRef = itemRefs.value
  1192. const index = arrIndex(itemRef, 'pkeyId', pkeyId)
  1193. return itemRef[index].ref
  1194. }
  1195. //删除打开的窗口
  1196. const delWindowRefs = (pkeyId) => {
  1197. //判断是否存在窗口,如果存在,就删除窗口
  1198. const list = DragModalTableForm.value
  1199. const index = arrIndex(list, 'pkeyId', pkeyId)
  1200. if (index !== -1) {
  1201. list.splice(index, 1)
  1202. DragModalTableForm.value = list
  1203. }
  1204. }
  1205. //计算展开高度和滚动位置
  1206. const getOffsetTop = (key = '') => {
  1207. if (key) {
  1208. const dom = document.getElementById(key)
  1209. if (!draw_type.value) {
  1210. if (dom?.offsetTop >= 583 && key) {
  1211. emit('offsetTop', dom?.offsetTop - 583)
  1212. } else {
  1213. emit('offsetTop', dom?.offsetTop)
  1214. }
  1215. } else {
  1216. if (dom.offsetTop >= 424 && key) {
  1217. emit('offsetTop', dom?.offsetTop - 424)
  1218. } else {
  1219. emit('offsetTop', dom?.offsetTop)
  1220. }
  1221. }
  1222. } else {
  1223. emit('offsetTop', 0)
  1224. }
  1225. ActiveKey.value = key
  1226. }
  1227. //获取折叠面板的索引
  1228. const getCollapseItemIndex = (name) => {
  1229. const keys = name.split('-')
  1230. if (keys.length > 0) {
  1231. return keys[1]
  1232. } else {
  1233. return -1
  1234. }
  1235. }
  1236. //获取表单的大小
  1237. const getTableFormSize = (pkeyId) => {
  1238. let formId = `table-form-${pkeyId}`
  1239. try {
  1240. const { clientWidth, clientHeight } = document.getElementById(formId).children[0]
  1241. return {
  1242. width: (clientWidth + 40) + 'px',
  1243. height: (clientHeight + 80) + 'px',
  1244. }
  1245. } catch {
  1246. return {
  1247. width: '100%',
  1248. height: '100%',
  1249. }
  1250. }
  1251. }
  1252. //转字符串
  1253. const setToString = (val) => {
  1254. return val ? val + '' : ''
  1255. }
  1256. //表单被点击
  1257. const presentId = ref('')
  1258. const excelTableFormClick = (key) => {
  1259. presentId.value = key
  1260. }
  1261. //缓存被激活时
  1262. onActivated(() => {
  1263. setMountOnEventKey()
  1264. })
  1265. //缓存时被移除
  1266. onDeactivated(() => {
  1267. HTableForm.unmountEventKey()
  1268. })
  1269. //页面被卸载
  1270. onUnmounted(() => {
  1271. HTableForm.unmountEventKey()
  1272. })
  1273. const setMountOnEventKey = () => {
  1274. HTableForm.setOnEventKey({
  1275. //按下ctrl键 或 control 键
  1276. onCtrlDown: async () => {
  1277. //window.$HcLog('全局按键', '按下ctrl键 或 control 键')
  1278. const refs = await setOnFuncFormRef()
  1279. refs?.setIsCtrlKey(true)
  1280. },
  1281. //按下复制快捷键
  1282. onCtrlDownC: async (event) => {
  1283. //window.$HcLog('全局按键', '按下复制快捷键')
  1284. const refs = await setOnFuncFormRef()
  1285. refs?.setCopyKeyList(event)
  1286. },
  1287. //按下粘贴快捷键
  1288. onCtrlDownV: async (event) => {
  1289. //window.$HcLog('全局按键', '按下粘贴快捷键')
  1290. const refs = await setOnFuncFormRef()
  1291. await refs?.setPasteKeyList(event)
  1292. },
  1293. //放开ctrl键 或 control 键
  1294. onCtrlUp: async () => {
  1295. //window.$HcLog('全局按键', '放开ctrl键 或 control 键')
  1296. const refs = await setOnFuncFormRef()
  1297. refs?.setIsCtrlKey(false)
  1298. },
  1299. })
  1300. }
  1301. //获取表单的ref
  1302. const setOnFuncFormRef = async () => {
  1303. const pkeyId = presentId.value
  1304. if (!isNullES(pkeyId)) {
  1305. return await getFormRef(pkeyId)
  1306. } else {
  1307. return
  1308. }
  1309. }
  1310. //获取已渲染的表单
  1311. const getFilterFormData = async () => {
  1312. const formArr = formDataList.value
  1313. return formArr.filter((item) => {
  1314. return (item.pkeyId ?? '') !== '' && item.isCollapseLoad
  1315. })
  1316. }
  1317. //获取表单数据
  1318. const getFormData = async () => {
  1319. const formArr = await getFilterFormData()
  1320. //获取表单数据
  1321. let newArr = []
  1322. for (let i = 0; i < formArr.length; i++) {
  1323. const pkeyId = formArr[i].pkeyId
  1324. const refs = await getFormRef(pkeyId)
  1325. const form = refs?.getFormData()
  1326. newArr.push({ ...form })
  1327. }
  1328. console.log('表单数据', newArr)
  1329. return newArr
  1330. }
  1331. //获取表单效验数据
  1332. const getFormRegExpJson = async () => {
  1333. const formArr = await getFilterFormData()
  1334. const list = listDatas.value
  1335. //获取表单数据
  1336. let formRegExpJson = {}
  1337. for (let i = 0; i < formArr.length; i++) {
  1338. const pkeyId = formArr[i].pkeyId
  1339. const refs = await getFormRef(pkeyId)
  1340. const regExp = refs?.getRegExpJson()
  1341. const nodeName = refs?.getNodeName()
  1342. if (getObjVal(regExp)) {
  1343. const index = arrIndex(list, 'pkeyId', pkeyId)
  1344. formRegExpJson[pkeyId] = {
  1345. ...regExp,
  1346. itemId: `item-${index}-${pkeyId}`,
  1347. nodeName: nodeName,
  1348. }
  1349. }
  1350. }
  1351. return formRegExpJson
  1352. }
  1353. //获取当前展开项
  1354. const getActiveKey = () => {
  1355. return ActiveKey.value
  1356. }
  1357. //设置当前展开项
  1358. const setActiveKey = (key) => {
  1359. return ActiveKey.value = key
  1360. }
  1361. // 暴露出去
  1362. defineExpose({
  1363. getFormData,
  1364. getFormRegExpJson,
  1365. getActiveKey,
  1366. setActiveKey,
  1367. })
  1368. </script>
  1369. <style lang="scss" scoped>
  1370. @import "./index.scss";
  1371. </style>
  1372. <style lang="scss">
  1373. @import "./style.scss";
  1374. </style>