index.vue 56 KB

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