collection.vue 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309
  1. <template>
  2. <div class="hc-page-layout-box">
  3. <div class="hc-layout-left-box" :style="'width:' + leftWidth + 'px;'">
  4. <div class="hc-project-box">
  5. <div class="hc-project-icon-box">
  6. <HcIcon name="stack"/>
  7. </div>
  8. <div class="ml-2 project-name-box">
  9. <span class="text-xl text-cut project-alias">{{projectInfo['projectAlias']}}</span>
  10. <div class="text-xs text-cut project-name">{{projectInfo['name']}}</div>
  11. </div>
  12. </div>
  13. <div class="hc-tree-box" v-loading="treeLoading" element-loading-text="加载中...">
  14. <el-scrollbar>
  15. <HcTree :projectId="projectId" :contractId="contractId" @nodeTap="projectTreeClick" @nodeLoading="treeNodeLoading" ref="treeRef"/>
  16. </el-scrollbar>
  17. </div>
  18. <!--左右拖动-->
  19. <div class="horizontal-drag-line" @mousedown="onmousedown"/>
  20. </div>
  21. <div class="hc-page-content-box">
  22. <HcCard>
  23. <template #header>
  24. <HcTooltip keys="file_collection_btn_upload_scanned_files">
  25. <el-button type="primary" hc-btn @click="uploadModalClick">
  26. <HcIcon name="qr-scan"/>
  27. <span>上传扫描文件</span>
  28. </el-button>
  29. </HcTooltip>
  30. <HcTooltip keys="file_collection_btn_sorting">
  31. <el-button type="primary" hc-btn @click="sortingClick">
  32. <HcIcon name="archive"/>
  33. <span>分盒整理</span>
  34. </el-button>
  35. </HcTooltip>
  36. <HcTooltip keys="file_collection_btn_download">
  37. <el-button hc-btn :disabled="tableCheckedKeys.length <= 0">
  38. <HcIcon name="download"/>
  39. <span>下载</span>
  40. </el-button>
  41. </HcTooltip>
  42. <HcTooltip keys="file_collection_btn_certified">
  43. <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" @click="certificationModalClick">
  44. <HcIcon name="vip-diamond"/>
  45. <span>认证</span>
  46. </el-button>
  47. </HcTooltip>
  48. <HcTooltip keys="file_collection_btn_report">
  49. <el-button hc-btn :disabled="tableCheckedKeys.length <= 0">
  50. <HcIcon name="send-plane-2"/>
  51. <span>上报</span>
  52. </el-button>
  53. </HcTooltip>
  54. <HcTooltip keys="file_collection_btn_edit">
  55. <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" @click="batchEditClick">
  56. <HcIcon name="edit"/>
  57. <span>编辑</span>
  58. </el-button>
  59. </HcTooltip>
  60. <HcTooltip keys="file_collection_btn_repeal">
  61. <el-button hc-btn :disabled="tableCheckedKeys.length <= 0">
  62. <HcIcon name="delete-back-2"/>
  63. <span>废除</span>
  64. </el-button>
  65. </HcTooltip>
  66. <HcTooltip keys="file_collection_btn_del">
  67. <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" @click="delModalClick">
  68. <HcIcon name="delete-bin"/>
  69. <span>删除</span>
  70. </el-button>
  71. </HcTooltip>
  72. </template>
  73. <template #extra>
  74. <HcTooltip keys="file_collection_btn_moves">
  75. <el-button hc-btn @click="movesClick">
  76. <HcIcon type="primary" name="arrow-left-right"/>
  77. <span>跨目录移动</span>
  78. </el-button>
  79. </HcTooltip>
  80. </template>
  81. <template #search>
  82. <div class="w-40">
  83. <el-select v-model="searchForm.approval" placeholder="审批状态" clearable>
  84. <el-option v-for="item in approvalStatus" :key="item.value" :label="item['label']" :value="item['value']"/>
  85. </el-select>
  86. </div>
  87. <div class="w-40 ml-2">
  88. <el-select v-model="searchForm.certified" placeholder="认证状态" clearable>
  89. <el-option v-for="item in certifiedStatus" :key="item.value" :label="item['label']" :value="item['value']"/>
  90. </el-select>
  91. </div>
  92. <div class="w-64 ml-2">
  93. <el-input v-model="searchForm.queryValue" placeholder="请输入名称关键词检索" clearable @keyup="keyUpEvent"/>
  94. </div>
  95. <div class="ml-2">
  96. <el-button type="primary" @click="searchClick">
  97. <HcIcon name="search-2"/>
  98. <span>搜索</span>
  99. </el-button>
  100. </div>
  101. </template>
  102. <HcTable ref="tableRef" :column="tableColumn" :datas="tableData" :loading="tableLoading" isCheck @selection-change="tableSelection">
  103. <template #table-column-header-num>
  104. <HcTooltip keys="file_collection_btn_sort">
  105. <span class="text-link text-lg" @click="tableSortClick">
  106. <HcIcon name="arrow-up-down"/>
  107. </span>
  108. </HcTooltip>
  109. </template>
  110. <template #fileName="{row}">
  111. <span class="text-link" @click="tableRowName(row)">{{row?.fileName}}</span>
  112. </template>
  113. </HcTable>
  114. <template #action>
  115. <HcPages :pages="searchForm" @change="pageChange"/>
  116. </template>
  117. </HcCard>
  118. </div>
  119. <!--预组卷整理-->
  120. <HcDialog :show="sortingModal" title="预组卷整理" widths="850px" isTable isRowFooter @close="sortingModalClose">
  121. <div class="hc-sorting-modal-collapse">
  122. <el-collapse v-model="sortingActiveKey">
  123. <template v-for="(item,index) in sortingItemData" :key="index">
  124. <el-collapse-item :name="`item-${index}`" disabled :id="`item-${index}`">
  125. <template #title>
  126. <div class="hc-collapse-item-header">
  127. <div class="item-index">盒{{index+1}}</div>
  128. <el-divider direction="vertical" />
  129. <div class="item-input">
  130. <el-input
  131. v-model="item.boxName"
  132. :class="item['isName'] ? 'is-error' : ''"
  133. placeholder="请输入案卷题名"
  134. @input="tableIsInput($event, item, 'isName')"
  135. @change="tableIsInput($event, item, 'isName')"
  136. />
  137. </div>
  138. <el-divider direction="vertical" />
  139. <div class="item-action">
  140. <el-button type="primary" @click="sortingSelectFile(item,index)">选择文件</el-button>
  141. <el-button type="danger" @click="sortingDelData(item,index)">删除</el-button>
  142. </div>
  143. </div>
  144. </template>
  145. <HcTable :column="sortingTableColumn" :datas="item.list" :loading="sortingTableLoading" isCheck @selection-change="rows => sortingTableSelection(rows,item.list)" ref="sorTableRef">
  146. <template #name="{row}">
  147. <span class="text-link">{{row?.fileName}}</span>
  148. </template>
  149. </HcTable>
  150. </el-collapse-item>
  151. </template>
  152. </el-collapse>
  153. </div>
  154. <template #leftRowFooter>
  155. <el-button type="primary" hc-btn @click="addSortingModalClick">
  156. <HcIcon name="add"/>
  157. <span>添加分盒</span>
  158. </el-button>
  159. </template>
  160. <template #rightRowFooter>
  161. <el-button hc-btn @click="sortingModalClose">
  162. <HcIcon name="close"/>
  163. <span>取消</span>
  164. </el-button>
  165. <el-button type="primary" hc-btn :loading="sortingModalLoading" @click="sortingModalSave">
  166. <HcIcon name="check"/>
  167. <span>确认</span>
  168. </el-button>
  169. </template>
  170. </HcDialog>
  171. <!--预组卷整理 无数据-->
  172. <HcDialog :show="sortingNoneModal" title="预组卷整理" widths="850px" isTable isRowFooter>
  173. <div class="flex-center">
  174. <i class="el-icon" data-v-029747aa="" style="font-size: 200px;color:#81b337;cursor: pointer;" @click="toSortingModal">
  175. <svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" data-v-029747aa="">
  176. <path fill="currentColor" d="M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896zm-38.4 409.6H326.4a38.4 38.4 0 1 0 0 76.8h147.2v147.2a38.4 38.4 0 0 0 76.8 0V550.4h147.2a38.4 38.4 0 0 0 0-76.8H550.4V326.4a38.4 38.4 0 1 0-76.8 0v147.2z"></path>
  177. </svg>
  178. </i>
  179. <span>添加分盒</span>
  180. </div>
  181. </HcDialog>
  182. <!--跨目录移动-->
  183. <HcDialog :show="movesModal" title="跨目录移动" widths="990px" isTable @close="movesModalClose" @save="movesModalSave" :loading="movesModalLoading">
  184. <div class="hc-moves-transfer-box">
  185. <div class="hc-moves-transfer-panel">
  186. <div class="panel-header">
  187. <div class="panel-header-label">
  188. <el-checkbox class="size-xl space" v-model="movesCheckAll" :indeterminate="isIndeterminate" @change="handleCheckAllChange">选择需要迁移的文件</el-checkbox>
  189. </div>
  190. <div class="panel-header-extra">{{checkedMoves.length}}/{{fileDatasList.length}}</div>
  191. </div>
  192. <div class="panel-body">
  193. <el-scrollbar>
  194. <el-checkbox-group v-model="checkedMoves" @change="handleCheckedMovesChange">
  195. <div class="hc-file-checkbox" v-for="item in fileDatasList" :key="item.id">
  196. <el-checkbox class="size-xl space" :label="item.id">{{item.fileName}}</el-checkbox>
  197. </div>
  198. </el-checkbox-group>
  199. </el-scrollbar>
  200. </div>
  201. </div>
  202. <div class="hc-moves-transfer-buttons">
  203. <el-button hc-btn _icon size="small"
  204. :type="fileDatasList.length <= 0 || checkedMoves.length <= 0 ? '' : 'primary'"
  205. :disabled="fileDatasList.length <= 0 || checkedMoves.length <= 0">
  206. <HcIcon name="arrow-right"/>
  207. </el-button>
  208. </div>
  209. <div class="hc-moves-transfer-panel">
  210. <div class="panel-header">选择移动目录</div>
  211. <div class="panel-body" v-loading="treePanelLoading">
  212. <el-scrollbar>
  213. <HcTree idPrefix="hc-tree-moves-" :projectId="projectId" :contractId="contractId" isRadio @radioChange="radioChange" :showRadioFun="showRadioFun" @nodeLoading="panelTreeLoading"/>
  214. </el-scrollbar>
  215. </div>
  216. </div>
  217. </div>
  218. </HcDialog>
  219. <!--调整排序-->
  220. <HcDialog :show="sortModal" title="调整排序" widths="980px" isTable isRowFooter @close="sortModalClose">
  221. <el-alert title="可拖动排序,也可在后面点击图标,切换排序" type="error" :closable="false"/>
  222. <div class="hc-table-h">
  223. <HcTable ui="hc-table-row-drop" :column="sortTableColumn" :datas="sortTableData" :loading="sortTableLoading" isRowDrop @row-drop="sortTableRowDrop">
  224. <template #key2="{row}">
  225. <span class="text-link">{{row?.key2}}</span>
  226. </template>
  227. <template #action="{index}">
  228. <span class="text-link text-xl" @click="upSortClick(index)">
  229. <HcIcon name="arrow-up" fill/>
  230. </span>
  231. <span class="text-link text-xl ml-2" @click="downSortClick(index)">
  232. <HcIcon name="arrow-down" fill/>
  233. </span>
  234. </template>
  235. </HcTable>
  236. </div>
  237. <template #leftRowFooter>
  238. <el-button hc-btn @click="sortModalClose">
  239. <HcIcon name="close"/>
  240. <span>取消</span>
  241. </el-button>
  242. <el-button type="primary" hc-btn :loading="sortModalLoading" @click="sortModalSave">
  243. <HcIcon name="check"/>
  244. <span>确认</span>
  245. </el-button>
  246. </template>
  247. <template #rightRowFooter>
  248. <HcPages :pages="sortSearchForm" :sizes="[10, 20, 50, 100, 200, 300, 400, 500, 600]" @change="sortPageChange"/>
  249. </template>
  250. </HcDialog>
  251. <!--新增编辑文件-->
  252. <el-dialog v-model="showUploadModal" title="上传工程文件" width="80vw" class="hc-modal-border hc-modal-table">
  253. <HcTable ui="hc-form-table" :column="tableUploadColumn" :datas="tableUploadData" :loading="uploadSaveLoading">
  254. <template #fileNumber="{row}">
  255. <!-- <el-input v-model="row.fileNumber" :class="row['isFileNumber'] ? 'is-error' : ''" @input="tableIsInput($event, row, 'isFileNumber')"/> -->
  256. <el-input v-model="row.fileNumber"/>
  257. </template>
  258. <template #fileName="{row}">
  259. <el-input v-model="row.fileName" :class="row['isFileName'] ? 'is-error' : ''" @input="tableIsInput($event, row, 'isFileName')"/>
  260. </template>
  261. <template #fileTime="{row}">
  262. <el-date-picker v-model="row.fileTime" type="date" format="YYYYMMDD" value-format="YYYYMMDD" :clearable="false"/>
  263. <!-- <el-input v-model="row.fileTime" :class="row['isFileTime'] ? 'is-error' : ''" @input="tableIsInput($event, row, 'isFileTime')"/> -->
  264. </template>
  265. <template #sheetType="{row}" v-if="isBuiltDrawing === 1">
  266. <el-select v-model="row.sheetType">
  267. <el-option v-for="item in sheetType" :key="item['dictKey']" :label="item['dictValue']" :value="item['dictKey']"/>
  268. </el-select>
  269. </template>
  270. <template #sheetSource="{row}" v-if="isBuiltDrawing === 1">
  271. <el-select v-model="row.sheetSource">
  272. <el-option v-for="item in sheetSourceType" :key="item['dictKey']" :label="item['dictValue']" :value="item['dictKey']"/>
  273. </el-select>
  274. </template>
  275. <template #drawingNo="{row}" v-if="isBuiltDrawing === 1">
  276. <el-input v-model="row.drawingNo"/>
  277. </template>
  278. <template #citeChangeNumber="{row}" v-if="isBuiltDrawing === 1">
  279. <el-input v-model="row.citeChangeNumber"/>
  280. </template>
  281. <template #isApproval="{row}">
  282. <el-select v-model="row.isApproval">
  283. <el-option v-for="item in whetherData" :key="item.value" :label="item.label" :value="item.value"/>
  284. </el-select>
  285. </template>
  286. <template #isNeedCertification="{row}">
  287. <el-select v-model="row.isNeedCertification">
  288. <el-option v-for="item in whetherData" :key="item.value" :label="item.label" :value="item.value"/>
  289. </el-select>
  290. </template>
  291. <template #dutyUser="{row}">
  292. <el-input v-model="row.dutyUser"/>
  293. </template>
  294. <template #action="{row,index}">
  295. <el-button type="danger" plain size="small" :loading="row['delBtnLoading']" @click="delUploadData(row,index)">删除</el-button>
  296. </template>
  297. </HcTable>
  298. <template #footer>
  299. <div class="lr-dialog-footer">
  300. <div class="left flex items-center">
  301. <HcFileUpload @change="uploadsChange" @progress="uploadsProgress">
  302. <el-button type="primary" hc-btn :loading="uploadsLoading" :disabled="uploadSaveLoading">
  303. <HcIcon name="add-circle"/>
  304. <span>新增上传</span>
  305. </el-button>
  306. </HcFileUpload>
  307. </div>
  308. <div class="right">
  309. <el-button size="large" @click="batchUploadCancel">
  310. <HcIcon name="close"/>
  311. <span>取消</span>
  312. </el-button>
  313. <el-button type="primary" hc-btn :disabled="uploadsLoading" :loading="uploadSaveLoading" @click="batchUploadSave">
  314. <HcIcon name="save"/>
  315. <span>提交保存</span>
  316. </el-button>
  317. </div>
  318. </div>
  319. </template>
  320. </el-dialog>
  321. <!--批量认证-->
  322. <el-dialog v-model="showCertificationModal" title="批量认证" width="80vw" class="hc-modal-border hc-modal-table">
  323. <div class="hc-card-body-flex">
  324. <div class="flex-table">
  325. <HcTable ui="hc-form-table" :column="CertColumns" :datas="CertData" @row-click="CertRowClick">
  326. <template #action="{row,index}">
  327. <el-button type="primary" plain size="small" @click.stop="CertRowClick2(row)">预览</el-button>
  328. </template>
  329. </HcTable>
  330. </div>
  331. <div class="flex-iframe" v-if="CertPdf">
  332. <iframe allow="display-capture" width='100%' height='100%' frameborder='1' :src="CertPdf"></iframe>
  333. </div>
  334. <div class="flex-iframe hc-no-table-form" v-else>
  335. <div class="table-form-no">
  336. <img :src="notableform" alt=""/>
  337. <div class="desc">暂无 PDF 数据</div>
  338. </div>
  339. </div>
  340. </div>
  341. <template #footer>
  342. <div class="dialog-footer">
  343. <el-button size="large" @click="showCertificationModal = false">
  344. <HcIcon name="close"/>
  345. <span>取消</span>
  346. </el-button>
  347. <el-button type="primary" hc-btn :loading="CertLoading" @click="CertClick">
  348. <HcIcon name="save"/>
  349. <span>确认认证</span>
  350. </el-button>
  351. </div>
  352. </template>
  353. </el-dialog>
  354. </div>
  355. </template>
  356. <script setup>
  357. import {ref, watch, onMounted,nextTick } from "vue";
  358. import {useAppStore} from "~src/store";
  359. import HcTree from "~src/components/tree/hc-tree.vue"
  360. import HcFileUpload from "./components/HcFileUpload.vue"
  361. import notableform from '~src/assets/view/notableform.svg';
  362. import {delMessage, rowsToId, rowsToIdNumArr} from "~uti/tools";
  363. import {getArrValue, deepClone} from "vue-utils-plus"
  364. import tasksApi from '~api/tasks/data';
  365. import ossApi from "~api/oss";
  366. import archiveFileApi from "~api/archiveFile/archiveFile.js";
  367. //变量
  368. const useAppState = useAppStore()
  369. const projectId = ref(useAppState.getProjectId);
  370. const contractId = ref(useAppState.getContractId);
  371. const projectInfo = ref(useAppState.getProjectInfo);
  372. const isCollapse = ref(useAppState.getCollapse)
  373. //监听
  374. watch(() => [
  375. useAppState.getCollapse
  376. ], ([Collapse]) => {
  377. isCollapse.value = Collapse
  378. })
  379. //渲染完成
  380. onMounted(() => {
  381. treeLoading.value = true
  382. setTableColumns()
  383. })
  384. //树加载
  385. const treeLoading = ref(false)
  386. const treeNodeLoading = () => {
  387. treeLoading.value = false
  388. }
  389. const treePanelLoading = ref(false)
  390. const panelTreeLoading = () => {
  391. treePanelLoading.value = false
  392. }
  393. //审批状态
  394. const approvalStatus = ref([
  395. {label: '未上报', value: '1'},
  396. {label: '待审批', value: '2'},
  397. {label: '已审批', value: '3'}
  398. ])
  399. //认证状态
  400. const certifiedStatus = ref([
  401. {label: '已认证', value: '1'},
  402. {label: '未认证', value: '2'}
  403. ])
  404. //搜索表单
  405. const searchForm = ref({
  406. nodeIds:'',
  407. approval: null, certified: null, queryValue: null,
  408. current: 1, size: 20, total: 0
  409. })
  410. //树相关的变量
  411. const primaryKeyId = ref('')
  412. const isBuiltDrawing = ref(0)
  413. const isStorageNode = ref(0)
  414. const nodeIds = ref('')
  415. const projectTreeClick = ({node, data, keys, key}) => {
  416. nodeIds.value = data.id || '';
  417. isStorageNode.value = data['isStorageNode'] || 0;
  418. //设置搜索数据
  419. searchForm.value.current = 1;
  420. searchForm.value.nodeIds = data.id || '';
  421. sortSearchForm.value.nodeIds = data.id || '';
  422. getTableData()
  423. }
  424. //回车搜索
  425. const keyUpEvent = (e) => {
  426. if (e.key === "Enter") {
  427. searchForm.value.current = 1;
  428. getTableData()
  429. }
  430. }
  431. //搜索
  432. const searchClick = () => {
  433. searchForm.value.current = 1;
  434. getTableData()
  435. }
  436. //分页被点击
  437. const pageChange = ({current, size}) => {
  438. searchForm.value.current = current
  439. searchForm.value.size = size
  440. getTableData()
  441. }
  442. //表格数据
  443. const tableRef = ref(null)
  444. const tableColumn = ref([])
  445. //设置表头
  446. const setTableColumns = () => {
  447. if (isBuiltDrawing.value === 1) {
  448. tableColumn.value = [
  449. {key:'fileNumber', name: '文件编号', width: 160},
  450. {key:'fileName', name: '文件名称'},
  451. {key:'filePage', name: '文件页数', width: 120},
  452. {key:'sheetType', name: '图幅'},
  453. {key:'sheetSourceValue', name: '图表来源'},
  454. {key:'drawingNo', name: '图号'},
  455. {key:'citeChangeNumber', name: '引用变更令编号'},
  456. {key:'isCertificationValue', name: '认证状态', width: 160},
  457. {key:'isApprovalValue', name: '状态', width: 160},
  458. {key:'fileTime', name: '文件时间', width: 160},
  459. {key:'dutyUser', name: '责任者', width: 160}
  460. ]
  461. sheetTypeStatus()
  462. sheetSourceStatus()
  463. } else {
  464. tableColumn.value = [
  465. {key:'fileNumber', name: '文件编号', width: 160},
  466. {key:'fileName', name: '文件名称'},
  467. {key:'filePage', name: '文件页数', width: 100},
  468. {key:'isCertificationValue', name: '认证状态', width: 120},
  469. {key:'isApprovalValue', name: '状态', width: 120},
  470. {key:'fileTime', name: '文件时间', width: 180},
  471. {key:'dutyUser', name: '责任者', width: 180}
  472. ]
  473. }
  474. }
  475. const tableData = ref([])
  476. //获取数据
  477. const tableLoading = ref(false)
  478. const getTableData = async () => {
  479. tableLoading.value = true
  480. const { error, code, data } = await archiveFileApi.getarchiveFilePage({
  481. ...searchForm.value,
  482. projectId: projectId.value,
  483. contractId: contractId.value
  484. })
  485. tableLoading.value = false
  486. if (!error && code === 200) {
  487. tableData.value = getArrValue(data['records'])
  488. searchForm.value.total = data['total'] || 0
  489. } else {
  490. tableData.value = []
  491. searchForm.value.total = 0
  492. }
  493. }
  494. //多选
  495. const tableCheckedKeys = ref([]);
  496. const tableSelection = (rows) => {
  497. tableCheckedKeys.value = rows
  498. }
  499. //分盒整理
  500. const sortingModal = ref(false)
  501. const sortingClick = async() => {
  502. if (nodeIds.value && isStorageNode.value === 1) {
  503. const { error, code, data } = await archiveFileApi.getBoxNameAndBoxNumber({
  504. nodeId:nodeIds.value
  505. })
  506. if (!error && code === 200) {
  507. if(data.length > 0){
  508. sortingActiveKey.value = [];
  509. sortingModal.value = true
  510. sortingItemData.value = getArrValue(data)
  511. sortingOldData.value = deepClone(sortingItemData.value)
  512. }else{
  513. sortingNoneModal.value = true
  514. }
  515. }
  516. } else {
  517. window?.$message?.warning('请先选择一个子节点')
  518. }
  519. }
  520. const sortingNoneModal = ref(false)//无数据显示的弹窗
  521. const toSortingModal = ()=>{
  522. sortingNoneModal.value = false;
  523. sortingActiveKey.value = [];
  524. sortingModal.value = true
  525. }
  526. const sortingItemData = ref([])
  527. const sortingOldData = ref([])//旧数据,用来对比是否修改名字
  528. //获取数据
  529. const sortingItemLoading = ref(false)
  530. const getSortingItemData = () => {
  531. }
  532. //校验
  533. const tableIsInput = (val, row, key) => {
  534. //console.log(!val);
  535. //检测是否改过案卷名字
  536. if(key == 'isName'){
  537. row.isChange = true;
  538. }
  539. row[key] = !val;
  540. }
  541. //选择文件
  542. // const sortingActiveKey = ref('')
  543. // const sortingSelectFile = (row, index) => {
  544. // //取当前展开组的key
  545. // const key = sortingActiveKey.value;
  546. // const keys = key ? key.split('-') : [];
  547. // const active = keys.length > 0 ? keys[1]: -1;
  548. // if (Number(active) === index) {
  549. // sortingActiveKey.value = null;
  550. // } else {
  551. // sortingActiveKey.value = `item-${index}`;
  552. // }
  553. // }
  554. const sortingActiveKey = ref([])
  555. const sortingSelectFile = (row, index) => {
  556. const key = `item-${index}`;
  557. const indexNum = sortingActiveKey.value.indexOf(key);
  558. if(indexNum > -1){
  559. sortingActiveKey.value.splice(indexNum,1);
  560. }else{
  561. sortingActiveKey.value.push(key);
  562. if(!(row.list && row.list.length > 0)){
  563. getSortingTableData(row, index)
  564. }
  565. }
  566. }
  567. //表格
  568. const sortingTableColumn = [
  569. {key:'name', name: '文件名称'},
  570. ];
  571. const sortingTableData = ref([])
  572. //获取数据
  573. const sortingTableLoading = ref(false)
  574. const getSortingTableData = async(row, index) => {
  575. sortingTableLoading.value = true
  576. const { error, code, data } = await archiveFileApi.pageByBoxName({
  577. size: 99999,
  578. current: 1,
  579. projectId: projectId.value,
  580. contractId: contractId.value,
  581. nodeIds:nodeIds.value,
  582. boxName:row.boxName?row.boxName:''
  583. })
  584. sortingTableLoading.value = false
  585. if (!error && code === 200) {
  586. row.list = getArrValue(data['records'])
  587. setTableCheck(row, index)
  588. } else {
  589. row.list = []
  590. }
  591. }
  592. //表格ref
  593. const sorTableRef = ref([]);
  594. //回显勾选
  595. const setTableCheck = async(row, index) => {
  596. //console.log(row)
  597. if(row.ids){
  598. const keys = row.ids.split(',');
  599. row.list.forEach(async (item)=>{
  600. if(keys.indexOf(item.id) > -1){
  601. item.checked = true;
  602. await nextTick();
  603. sorTableRef.value[index].toggleRowSelection(item,true);
  604. }
  605. })
  606. }
  607. }
  608. //多选
  609. const sortingTableKeys = ref([]);
  610. const sortingTableSelection = (rows,list,event) => {
  611. //console.log(event)
  612. list.forEach(element => {
  613. element.checked = false;
  614. });
  615. rows.forEach((element)=>{
  616. element.checked = true;
  617. })
  618. }
  619. //删除
  620. const sortingDelData = (row,index) => {
  621. sortingItemData.value.splice(index,1);
  622. }
  623. //添加分盒
  624. const addSortingModalClick = () => {
  625. sortingItemData.value.push({
  626. boxName: ''
  627. })
  628. }
  629. //确认保存
  630. const sortingModalLoading = ref(false)
  631. const sortingModalSave = async() => {
  632. sortingModalLoading.value = true
  633. //检测案卷名是否重复
  634. let nameRes = await checkNames();
  635. //console.log(nameRes)
  636. //return;
  637. for (let i = 0; i < nameRes.length; i++) {
  638. if(typeof nameRes[i].data == 'string'){
  639. window.$message?.error(nameRes[i].data+',案卷名重复')
  640. sortingModalLoading.value = false
  641. return;
  642. }
  643. }
  644. //组装数据
  645. let rows = [];
  646. sortingItemData.value.forEach((item,index)=>{
  647. let obj = {
  648. ids:'',
  649. boxName:item.boxName,
  650. boxNumber:index+1,
  651. };
  652. let list = [];
  653. if(item.list){
  654. item.list.forEach((item2)=>{
  655. if(item2.checked){
  656. list.push(item2.id)
  657. }
  658. })
  659. obj.ids = list.join(',');
  660. }else{
  661. obj.ids = item.ids;
  662. }
  663. rows.push(obj)
  664. })
  665. const { error, code, data } = await archiveFileApi.allocation({
  666. list: rows
  667. })
  668. if (!error && code === 200) {
  669. window.$message?.success('保存成功')
  670. sortingModal.value = false
  671. } else {
  672. window.$message?.error('保存失败')
  673. }
  674. sortingModalLoading.value = false
  675. }
  676. const checkNames =() =>{
  677. const arr = [];
  678. sortingItemData.value.forEach((item)=>{
  679. if(item.boxNumber){
  680. if(item.isChange){
  681. //是否修改过
  682. //对比旧的数据,是否相同
  683. for (let i = 0; i < sortingOldData.value.length; i++) {
  684. if(sortingOldData.value[i].boxNumber == item.boxNumber){
  685. if(sortingOldData.value[i].boxName != item.boxName){
  686. arr.push(
  687. archiveFileApi.getIsBoxName({
  688. boxName:item.boxName
  689. })
  690. )
  691. }
  692. return;
  693. }
  694. }
  695. }
  696. }else{
  697. arr.push(
  698. archiveFileApi.getIsBoxName({
  699. boxName:item.boxName
  700. })
  701. )
  702. }
  703. })
  704. return Promise.all(arr);
  705. }
  706. //关闭
  707. const sortingModalClose = () => {
  708. sortingModal.value = false
  709. }
  710. //删除
  711. const delModalClick = () => {
  712. delMessage(() => {
  713. })
  714. }
  715. //跨目录移动
  716. const movesModal = ref(false)
  717. const movesClick = async() => {
  718. movesModal.value = true
  719. treePanelLoading.value = true
  720. const { error, code, data } = await archiveFileApi.getarchiveFilePage({
  721. ...searchForm.value,
  722. size:9999,
  723. projectId: projectId.value,
  724. contractId: contractId.value
  725. })
  726. if (!error && code === 200) {
  727. fileDatasList.value = getArrValue(data['records'])
  728. } else {
  729. fileDatasList.value = []
  730. }
  731. }
  732. //选择需要迁移的文件
  733. const movesCheckAll = ref(false)
  734. const isIndeterminate = ref(true)
  735. const checkedMoves = ref([])
  736. //左侧待迁移文件
  737. const fileDatasList = ref([])
  738. //全选
  739. const handleCheckAllChange = (val) => {
  740. const checked = fileDatasList.value
  741. const keys = rowsToIdNumArr(checked);
  742. checkedMoves.value = val ? keys : []
  743. isIndeterminate.value = false
  744. }
  745. //勾选
  746. const handleCheckedMovesChange = (value) => {
  747. const keys = fileDatasList.value
  748. const checkedCount = value.length
  749. movesCheckAll.value = checkedCount === keys.length
  750. isIndeterminate.value = checkedCount > 0 && checkedCount < keys.length
  751. }
  752. //右侧radio
  753. let radioNodeId = ''
  754. const radioChange = (id)=>{
  755. //console.log(id)
  756. radioNodeId = id;
  757. }
  758. //只显示储存节点的单选
  759. const showRadioFun = (data)=>{
  760. if(data.isStorageNode == 1){
  761. return true;
  762. }else{
  763. return false;
  764. }
  765. }
  766. //保存
  767. const movesModalLoading = ref(false)
  768. const movesModalSave = async() => {
  769. let ids = checkedMoves.value.join(',')
  770. if(checkedMoves.value.length < 1){
  771. window.$message?.warning('请勾选需要迁移的文件')
  772. return;
  773. }
  774. if(radioNodeId == ''){
  775. window.$message?.warning('请选择要移动到的节点')
  776. return;
  777. }
  778. movesModalLoading.value = true;
  779. const { error, code, data } = await archiveFileApi.migrateFile({
  780. ids:ids,
  781. nodeId:radioNodeId
  782. })
  783. movesModalLoading.value = false
  784. if (!error && code === 200) {
  785. window.$message?.success('保存成功')
  786. movesModal.value = false
  787. getTableData()
  788. } else {
  789. window.$message?.error('保存失败')
  790. }
  791. }
  792. //关闭
  793. const movesModalClose = () => {
  794. movesModal.value = false
  795. }
  796. //表格排序
  797. const sortModal = ref(false)
  798. //显示
  799. const tableSortClick = () => {
  800. sortModal.value = true
  801. getSortTableData()
  802. }
  803. //搜索表单
  804. const sortSearchForm = ref({
  805. nodeIds:'',
  806. current: 1, size: 20, total: 0
  807. })
  808. //分页被点击
  809. const sortPageChange = ({current, size}) => {
  810. sortSearchForm.value.current = current
  811. sortSearchForm.value.size = size
  812. getSortTableData()
  813. }
  814. //表格数据
  815. const sortTableColumn = ref([
  816. {key:'fileNumber', name: '文件编号', width: 160},
  817. {key:'fileName', name: '文件名称'},
  818. {key:'action', name: '排序', width: 90},
  819. ])
  820. const sortTableData = ref([])
  821. const sortTableLoading = ref(false)
  822. const getSortTableData = async () => {
  823. sortTableLoading.value = true
  824. const { error, code, data } = await archiveFileApi.getarchiveFilePage({
  825. ...sortSearchForm.value,
  826. projectId: projectId.value,
  827. contractId: contractId.value
  828. })
  829. sortTableLoading.value = false
  830. if (!error && code === 200) {
  831. sortTableData.value = getArrValue(data['records'])
  832. sortSearchForm.value.total = data['total'] || 0
  833. } else {
  834. sortTableData.value = []
  835. sortSearchForm.value.total = 0
  836. }
  837. }
  838. //拖动完成
  839. const sortTableRowDrop = (rows) => {
  840. sortTableData.value = rows
  841. }
  842. //向下
  843. const downSortClick = (index) => {
  844. const indexs = index + 1
  845. const data = sortTableData.value
  846. if(indexs !== data.length) {
  847. const tmp = data.splice(indexs,1);
  848. sortTableData.value.splice(index,0,tmp[0]);
  849. } else {
  850. window?.$message?.warning('已经处于置底,无法下移')
  851. }
  852. }
  853. //向上
  854. const upSortClick = (index) => {
  855. const data = sortTableData.value || []
  856. if(index !== 0) {
  857. const tmp = data.splice(index - 1,1);
  858. sortTableData.value.splice(index,0,tmp[0]);
  859. } else {
  860. window?.$message?.warning('已经处于置顶,无法上移')
  861. }
  862. }
  863. //保存
  864. const sortModalLoading = ref(false)
  865. const sortModalSave = async() => {
  866. await batchEditSaveApi(sortTableData.value)
  867. sortModal.value = false
  868. }
  869. //关闭
  870. const sortModalClose = () => {
  871. sortModal.value = false
  872. }
  873. //获取认证状态
  874. const certificationType = ref([])
  875. const certificationStatus = async () => {
  876. const { error, code, data } = await tasksApi.queryTaskTypeStatus({
  877. typeOrStatus: 'certification_status'
  878. })
  879. //处理数据
  880. if (!error && code === 200) {
  881. certificationType.value = getArrValue(data)
  882. } else {
  883. certificationType.value = []
  884. }
  885. }
  886. //获取图幅类型
  887. const sheetType = ref([])
  888. const sheetTypeStatus = async () => {
  889. const { error, code, data } = await tasksApi.queryTaskTypeStatus({
  890. typeOrStatus: 'sheet_type'
  891. })
  892. //处理数据
  893. if (!error && code === 200) {
  894. sheetType.value = getArrValue(data)
  895. } else {
  896. sheetType.value = []
  897. }
  898. }
  899. //获取图表来源
  900. const sheetSourceType = ref([])
  901. const sheetSourceStatus = async () => {
  902. const { error, code, data } = await tasksApi.queryTaskTypeStatus({
  903. typeOrStatus: 'sheet_source'
  904. })
  905. //处理数据
  906. if (!error && code === 200) {
  907. sheetSourceType.value = getArrValue(data)
  908. } else {
  909. sheetSourceType.value = []
  910. }
  911. }
  912. //新增文件
  913. const tableUploadType = ref('add')
  914. const showUploadModal = ref(false)
  915. const uploadModalClick = () => {
  916. if (nodeIds.value && isStorageNode.value === 1) {
  917. tableUploadType.value = 'add'
  918. setTableUploadColumn()
  919. uploadSaveLoading.value = false
  920. tableUploadData.value = []
  921. showUploadModal.value = true
  922. } else {
  923. window?.$message?.warning('请先选择一个子节点')
  924. }
  925. }
  926. //设置文件表头
  927. const tableUploadColumn = ref([
  928. {key:'fileNumber', name: '文件编号'},
  929. {key:'fileName', name: '文件名称'},
  930. {key:'fileTime', name: '文件时间'},
  931. {key:'isApproval', name: '是否需要审批'},
  932. {key:'isNeedCertification', name: '是否需要认证'},
  933. {key:'dutyUser', name: '责任者'},
  934. {key:'action', name: '操作', width: 100}
  935. ])
  936. const setTableUploadColumn = () => {
  937. if (isBuiltDrawing.value === 1) {
  938. tableUploadColumn.value = [
  939. {key:'fileNumber', name: '文件编号'},
  940. {key:'fileName', name: '文件名称'},
  941. {key:'fileTime', name: '文件时间'},
  942. {key:'sheetType', name: '图幅'},
  943. {key:'sheetSource', name: '图表来源'},
  944. {key:'drawingNo', name: '图号'},
  945. {key:'citeChangeNumber', name: '引用变更令编号'},
  946. {key:'isApproval', name: '是否需要审批'},
  947. {key:'isNeedCertification', name: '是否需要认证'},
  948. {key:'dutyUser', name: '责任者'},
  949. {key:'action', name: '操作', width: 100}
  950. ]
  951. } else {
  952. tableUploadColumn.value = [
  953. {key:'fileNumber', name: '文件编号'},
  954. {key:'fileName', name: '文件名称'},
  955. {key:'fileTime', name: '文件时间'},
  956. {key:'isApproval', name: '是否需要审批'},
  957. {key:'isNeedCertification', name: '是否需要认证'},
  958. {key:'dutyUser', name: '责任者'},
  959. {key:'action', name: '操作', width: 100}
  960. ]
  961. }
  962. }
  963. const tableUploadData = ref([])
  964. //上传的文件结果
  965. const uploadsChange = ({fileList}) => {
  966. let newArr = []
  967. const sheet = sheetType.value, source = sheetSourceType.value
  968. for (let i = 0; i < fileList.length; i++) {
  969. const item = fileList[i]
  970. let name = item['originalName'] || ''
  971. let fileName = name.substring(0, name.lastIndexOf("."))
  972. newArr.push({
  973. projectId: projectId.value,
  974. contractId: contractId.value,
  975. nodeId: nodeIds.value,
  976. fileNumber: '',
  977. fileName: fileName,
  978. ossFileName: item?.name || '',
  979. fileTime: null,
  980. fileUrl: item?.link || '',
  981. sheetType: sheet.length > 0 ? sheet[0]['dictKey'] || '': '',
  982. sheetSource: source.length > 0 ? source[0]['dictKey'] || '': '',
  983. drawingNo: '',
  984. citeChangeNumber: '',
  985. isApproval: 0,
  986. isNeedCertification: 0,
  987. dutyUser: '',
  988. pdfFileUrl: item?.pdfUrl || '',
  989. filePage: item?.page || '',
  990. })
  991. }
  992. tableUploadData.value = newArr
  993. }
  994. //上传进度
  995. const uploadsLoading = ref(false)
  996. const uploadsProgress = (val) => {
  997. uploadsLoading.value = val
  998. }
  999. //表单下拉数据
  1000. const whetherData = ref([
  1001. {label: "不需要", value: 0},
  1002. {label: "需要", value: 1}
  1003. ])
  1004. //删除
  1005. const delUploadData = async (row,index) => {
  1006. if (row['ossFileName']) {
  1007. row['delBtnLoading'] = true
  1008. await ossApi.removeFile({fileName: row['ossFileName']})
  1009. row['delBtnLoading'] = false
  1010. tableUploadData.value.splice(index,1);
  1011. } else {
  1012. tableUploadData.value.splice(index,1);
  1013. }
  1014. }
  1015. //批量上传保存
  1016. const uploadSaveLoading = ref(false)
  1017. const batchUploadSave = async () => {
  1018. const rows = tableUploadData.value
  1019. if (rows.length > 0) {
  1020. //验证表单数据
  1021. uploadSaveLoading.value = true
  1022. let isTableRows = false;
  1023. for (let i = 0; i < rows.length; i++) {
  1024. // if (!rows[i]['fileNumber']) {
  1025. // rows[i]['isFileNumber'] = true
  1026. // isTableRows = true
  1027. // } else if (!rows[i]['fileName']) {
  1028. // rows[i]['isFileName'] = true
  1029. // isTableRows = true
  1030. // }
  1031. if (!rows[i]['fileTime']) {
  1032. rows[i]['isFileTime'] = true
  1033. isTableRows = true
  1034. } else if (!rows[i]['fileName']) {
  1035. rows[i]['isFileName'] = true
  1036. isTableRows = true
  1037. }
  1038. }
  1039. //判断数据
  1040. if (isTableRows) {
  1041. uploadSaveLoading.value = false
  1042. window.$message?.warning('请先完善表单信息')
  1043. } else {
  1044. if (tableUploadType.value === 'add') {
  1045. await batchUploadSaveApi(rows)
  1046. } else {
  1047. await batchEditSaveApi(rows)
  1048. }
  1049. }
  1050. } else {
  1051. window.$message?.warning('请先上传文件')
  1052. }
  1053. }
  1054. //确认上传保存
  1055. const batchUploadSaveApi = async (rows) => {
  1056. uploadSaveLoading.value = true
  1057. const {error, code} = await archiveFileApi.batchUploadSave({
  1058. list: rows
  1059. },false)
  1060. //判断状态
  1061. uploadSaveLoading.value = false
  1062. if (!error && code === 200) {
  1063. window.$message?.success('保存成功')
  1064. batchUploadCancel()
  1065. getTableData()
  1066. } else {
  1067. window.$message?.error('保存失败')
  1068. }
  1069. }
  1070. //取消上传
  1071. const batchUploadCancel = () => {
  1072. tableUploadData.value = []
  1073. uploadSaveLoading.value = false
  1074. uploadsLoading.value = false
  1075. showUploadModal.value = false
  1076. }
  1077. //批量编辑
  1078. const batchEditClick = () => {
  1079. const rows = deepClone(tableCheckedKeys.value)
  1080. //判断是否满足条件
  1081. const result = rows.every(({status})=> {
  1082. return status !== 1 && status !== 2
  1083. })
  1084. //判断状态
  1085. if (result) {
  1086. tableUploadType.value = 'edit'
  1087. setTableUploadColumn()
  1088. uploadSaveLoading.value = false
  1089. tableUploadData.value = rows
  1090. showUploadModal.value = true
  1091. } else {
  1092. window.$message?.warning('已上报或已审批的文件不能编辑')
  1093. }
  1094. }
  1095. //确认编辑上传保存
  1096. const batchEditSaveApi = async (rows) => {
  1097. uploadSaveLoading.value = true
  1098. const {error, code} = await archiveFileApi.batchUpdateSort({
  1099. list: rows
  1100. },false)
  1101. //判断状态
  1102. uploadSaveLoading.value = false
  1103. if (!error && code === 200) {
  1104. window.$message?.success('保存成功')
  1105. batchUploadCancel()
  1106. getTableData()
  1107. } else {
  1108. window.$message?.error('保存失败')
  1109. }
  1110. }
  1111. //批量认证
  1112. const CertData = ref([])
  1113. const CertIds = ref([])
  1114. const CertPdf = ref('')
  1115. const CertColumns = [
  1116. {key:'fileName', name: '文件名称'},
  1117. {key:'action', name: '操作', width: 100}
  1118. ]
  1119. //批量认证弹窗
  1120. const showCertificationModal = ref(false)
  1121. const certificationModalClick = () => {
  1122. const rows = tableCheckedKeys.value;
  1123. CertData.value = rows
  1124. CertIds.value = rowsToId(rows)
  1125. CertPdf.value = rows[0]?.pdfFileUrl || ''
  1126. showCertificationModal.value = true
  1127. /*const result = rows.every(({isCertification})=> {
  1128. return isCertification === 0
  1129. })
  1130. if (result) {
  1131. CertData.value = rows
  1132. CertIds.value = rowsToId(rows)
  1133. CertPdf.value = rows[0]?.pdfFileUrl || ''
  1134. showCertificationModal.value = true
  1135. } else {
  1136. window.$message?.warning('已认证的文件不能再认证')
  1137. }*/
  1138. }
  1139. //认证行被点击
  1140. const CertRowClick = ({row}) => {
  1141. const pdfFileUrl = row?.pdfFileUrl || ''
  1142. if (CertPdf.value !== pdfFileUrl) {
  1143. CertPdf.value = pdfFileUrl
  1144. }
  1145. }
  1146. //认证预览被点击
  1147. const CertRowClick2 = ({pdfFileUrl}) => {
  1148. const pdfUrl = pdfFileUrl || ''
  1149. if (CertPdf.value !== pdfUrl) {
  1150. CertPdf.value = pdfUrl
  1151. }
  1152. }
  1153. //确认认证
  1154. const CertLoading = ref(false)
  1155. const CertClick = async () => {
  1156. /*CertLoading.value = true
  1157. const {error, code} = await projectScanningApi.batchCertification({
  1158. ids: CertIds.value
  1159. }, false)
  1160. //判断状态
  1161. CertLoading.value = false
  1162. if (!error && code === 200) {
  1163. window.$message?.success('认证成功')
  1164. showCertificationModal.value = false
  1165. getTableData()
  1166. } else {
  1167. window.$message?.error('认证失败')
  1168. }*/
  1169. }
  1170. //名称被点击
  1171. const tableRowName = (row) => {
  1172. if (row['pdfFileUrl']) {
  1173. window.open(row['pdfFileUrl'], '_blank')
  1174. } else {
  1175. window.$message?.warning('文件不存在')
  1176. }
  1177. }
  1178. //左右拖动,改变树形结构宽度
  1179. const leftWidth = ref(382);
  1180. const onmousedown = () => {
  1181. const leftNum = isCollapse.value ? 142 : 272
  1182. document.onmousemove = (ve) => {
  1183. let diffVal = ve.clientX - leftNum;
  1184. if(diffVal >= 310 && diffVal <= 900) {
  1185. leftWidth.value = diffVal;
  1186. }
  1187. }
  1188. document.onmouseup = () => {
  1189. document.onmousemove = null;
  1190. document.onmouseup = null;
  1191. }
  1192. }
  1193. </script>
  1194. <style lang="scss" scoped>
  1195. @import '~style/file/scoped/collection.scss';
  1196. .flex-center{
  1197. display: flex;
  1198. align-items: center;
  1199. justify-content: center;
  1200. height: 100%;
  1201. flex-direction: column;
  1202. }
  1203. </style>
  1204. <style lang="scss">
  1205. @import '~style/file/collection.scss';
  1206. </style>