collection.vue 49 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423
  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" :autoExpandKeys="treeAutoExpandKeys" @menuTap="ElTreeMenuClick"/>
  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.isApprovalValue" 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.isCertificationValue" 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 @close="sortingNoneModalClose">
  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. <HcIcon type="primary" name="arrow-right-double" style="font-size: 22px;"/>
  204. </div>
  205. <div class="hc-moves-transfer-panel">
  206. <div class="panel-header">选择移动目录</div>
  207. <div class="panel-body" v-loading="treePanelLoading">
  208. <el-scrollbar>
  209. <HcTree idPrefix="hc-tree-moves-" :projectId="projectId" :contractId="contractId" isRadio @radioChange="radioChange" :showRadioFun="showRadioFun" @nodeLoading="panelTreeLoading" :isShowMenu="false"/>
  210. </el-scrollbar>
  211. </div>
  212. </div>
  213. </div>
  214. </HcDialog>
  215. <!--调整排序-->
  216. <HcDialog :show="sortModal" title="调整排序" widths="980px" isTable isRowFooter @close="sortModalClose">
  217. <el-alert title="可拖动排序,也可在后面点击图标,切换排序" type="error" :closable="false"/>
  218. <div class="hc-table-h">
  219. <HcTable ui="hc-table-row-drop" :column="sortTableColumn" :datas="sortTableData" :loading="sortTableLoading" isRowDrop @row-drop="sortTableRowDrop">
  220. <template #key2="{row}">
  221. <span class="text-link">{{row?.key2}}</span>
  222. </template>
  223. <template #action="{index}">
  224. <span class="text-link text-xl" @click="upSortClick(index)">
  225. <HcIcon name="arrow-up" fill/>
  226. </span>
  227. <span class="text-link text-xl ml-2" @click="downSortClick(index)">
  228. <HcIcon name="arrow-down" fill/>
  229. </span>
  230. </template>
  231. </HcTable>
  232. </div>
  233. <template #leftRowFooter>
  234. <el-button hc-btn @click="sortModalClose">
  235. <HcIcon name="close"/>
  236. <span>取消</span>
  237. </el-button>
  238. <el-button type="primary" hc-btn :loading="sortModalLoading" @click="sortModalSave">
  239. <HcIcon name="check"/>
  240. <span>确认</span>
  241. </el-button>
  242. </template>
  243. <template #rightRowFooter>
  244. <HcPages :pages="sortSearchForm" :sizes="[10, 20, 50, 100, 200, 300, 400, 500, 600]" @change="sortPageChange"/>
  245. </template>
  246. </HcDialog>
  247. <!--新增编辑文件-->
  248. <el-dialog v-model="showUploadModal" title="上传工程文件" width="80vw" class="hc-modal-border hc-modal-table" @close="uploadModalClose" :close-on-click-modal="false">
  249. <HcTable ui="hc-form-table" isSort :column="tableUploadColumn" :datas="tableUploadData" :loading="uploadSaveLoading" @row-sort="tableUploadRowSort">
  250. <template #fileNumber="{row}">
  251. <!-- <el-input v-model="row.fileNumber" :class="row['isFileNumber'] ? 'is-error' : ''" @input="tableIsInput($event, row, 'isFileNumber')"/> -->
  252. <el-input v-model="row.fileNumber"/>
  253. </template>
  254. <template #fileName="{row}">
  255. <el-input v-model="row.fileName" :class="row['isFileName'] ? 'is-error' : ''" @input="tableIsInput($event, row, 'isFileName')"/>
  256. </template>
  257. <template #fileTime="{row}">
  258. <el-date-picker v-model="row.fileTime" type="date" format="YYYYMMDD" value-format="YYYYMMDD" :clearable="false"/>
  259. <!-- <el-input v-model="row.fileTime" :class="row['isFileTime'] ? 'is-error' : ''" @input="tableIsInput($event, row, 'isFileTime')"/> -->
  260. </template>
  261. <template #sheetType="{row}" v-if="isBuiltDrawing === 2">
  262. <el-select v-model="row.sheetType">
  263. <el-option v-for="item in sheetType" :key="item['dictKey']" :label="item['dictValue']" :value="item['dictKey']"/>
  264. </el-select>
  265. </template>
  266. <template #sheetSource="{row}" v-if="isBuiltDrawing === 2">
  267. <el-select v-model="row.sheetSource">
  268. <el-option v-for="item in sheetSourceType" :key="item['dictKey']" :label="item['dictValue']" :value="item['dictKey']"/>
  269. </el-select>
  270. </template>
  271. <template #drawingNo="{row}" v-if="isBuiltDrawing === 2">
  272. <el-input v-model="row.drawingNo"/>
  273. </template>
  274. <template #citeChangeNumber="{row}" v-if="isBuiltDrawing === 2">
  275. <el-input v-model="row.citeChangeNumber"/>
  276. </template>
  277. <template #isApproval="{row}">
  278. <el-select v-model="row.isApproval">
  279. <el-option v-for="item in whetherData" :key="item.value" :label="item.label" :value="item.value"/>
  280. </el-select>
  281. </template>
  282. <template #isNeedCertification="{row}">
  283. <el-select v-model="row.isNeedCertification">
  284. <el-option v-for="item in whetherData" :key="item.value" :label="item.label" :value="item.value"/>
  285. </el-select>
  286. </template>
  287. <template #dutyUser="{row}">
  288. <el-input v-model="row.dutyUser"/>
  289. </template>
  290. <template #isElement="{row}">
  291. <el-select v-model="row.isElement">
  292. <el-option label="是" :value="1"/>
  293. <el-option label="否" :value="0"/>
  294. </el-select>
  295. </template>
  296. <template #action="{row,index}">
  297. <el-button type="danger" plain size="small" :loading="row['delBtnLoading']" @click="delUploadData(row,index)">删除</el-button>
  298. </template>
  299. </HcTable>
  300. <template #footer>
  301. <div class="lr-dialog-footer">
  302. <div class="left flex items-center">
  303. <el-button type="primary" hc-btn @click="uploadFileClick">
  304. <HcIcon name="add-circle"/>
  305. <span>新增上传</span>
  306. </el-button>
  307. </div>
  308. <div class="right">
  309. <el-button size="large" @click="batchUploadCancel" :disabled="uploadsLoading">
  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. <HcUploadFile ref="HcUploadFileRef"
  355. @fileProgress="HcUploadFileProgress"
  356. @fileSuccess="HcUploadFileSuccess"
  357. @filesChange="HcUploadFileChange"/>
  358. </div>
  359. </template>
  360. <script setup>
  361. import {useAppStore} from "~src/store";
  362. import {getStoreValue, setStoreValue} from '~src/utils/storage'
  363. import {ref, watch, onMounted, nextTick } from "vue";
  364. import HcTree from "~src/components/tree/hc-tree.vue"
  365. import notableform from '~src/assets/view/notableform.svg';
  366. import {delMessage, rowsToId, rowsToIdNumArr} from "~uti/tools";
  367. import archiveFileApi from "~api/archiveFile/archiveFile";
  368. import {getArrValue, deepClone, getObjVal, arrToId} from "js-fast-way"
  369. import tasksApi from '~api/tasks/data';
  370. import ossApi from "~api/oss";
  371. //变量
  372. const useAppState = useAppStore()
  373. const projectId = ref(useAppState.getProjectId);
  374. const contractId = ref(useAppState.getContractId);
  375. const projectInfo = ref(useAppState.getProjectInfo);
  376. const contractInfo = ref(useAppState.getContractInfo);
  377. const isCollapse = ref(useAppState.getCollapse)
  378. const HcUploadFileRef = ref(null)
  379. //上传进度
  380. const uploadsLoading = ref(false)
  381. //监听
  382. watch(() => [
  383. useAppState.getCollapse
  384. ], ([Collapse]) => {
  385. isCollapse.value = Collapse
  386. })
  387. //渲染完成
  388. onMounted(() => {
  389. treeLoading.value = true
  390. setTableColumns()
  391. })
  392. const {contractType} = contractInfo.value;
  393. const dutyUser=ref('')
  394. //设置责任者
  395. const setdutyUser=async()=>{
  396. const { error, code, data,msg } = await archiveFileApi.getDutyUser({
  397. contractId: treecontractId.value,
  398. })
  399. if (!error && code === 200) {
  400. if(data?.contractType===1){
  401. dutyUser.value=data?.constructionUnitName||''
  402. }else if(data?.ontractType===2){
  403. dutyUser.value=data?.supervisionUnitName||''
  404. }else if(data?.contractType===3){
  405. dutyUser.value=data?.contractorUnitName||''
  406. }
  407. }
  408. }
  409. //打开文件选择框
  410. const uploadFileClick = () => {
  411. HcUploadFileRef?.value.btnUpload()
  412. }
  413. // 文件上传进度
  414. const HcUploadFileProgress = (res) => {
  415. uploadsLoading.value = res
  416. }
  417. // 文件上传成功的回调
  418. const HcUploadFileSuccess = (res) => {
  419. console.log('文件上传成功', res)
  420. uploadsChange(res)
  421. }
  422. // 文件全部上传成功
  423. const HcUploadFileChange = () => {
  424. console.log('文件全部上传成功')
  425. HcUploadFileRef?.value.close()
  426. }
  427. //树加载
  428. const treeLoading = ref(false)
  429. const treeNodeLoading = () => {
  430. treeLoading.value = false
  431. }
  432. const treePanelLoading = ref(false)
  433. const panelTreeLoading = () => {
  434. treePanelLoading.value = false
  435. }
  436. //审批状态
  437. const approvalStatus = ref([
  438. {label: '未上报', value: '0'},
  439. {label: '待审批', value: '1'},
  440. {label: '已审批', value: '2'}
  441. ])
  442. //认证状态
  443. const certifiedStatus = ref([
  444. {label: '已认证', value: '1'},
  445. {label: '未认证', value: '2'}
  446. ])
  447. //搜索表单
  448. const searchForm = ref({
  449. nodeIds:'',
  450. approval: null, certified: null, queryValue: null,
  451. current: 1, size: 20, total: 0
  452. })
  453. //树相关的变量
  454. const primaryKeyId = ref('')
  455. const isBuiltDrawing = ref(0)
  456. const isStorageNode = ref(0)
  457. const nodeIds = ref('')
  458. const treecontractId=ref('')
  459. //自动展开缓存
  460. const treeAutoExpandKeys = ref(getStoreValue('wbsTreeExpandKeys') || [])
  461. const projectTreeClick = ({node, data, keys, key}) => {
  462. setStoreValue('wbsTreeExpandKeys', keys)
  463. treeAutoExpandKeys.value = keys || []
  464. nodeIds.value = data.id || '';
  465. isStorageNode.value = data['isStorageNode'] || 0;
  466. treecontractId.value=data?.contractId||''
  467. //设置搜索数据
  468. searchForm.value.current = 1;
  469. searchForm.value.nodeIds = data.id || '';
  470. sortSearchForm.value.nodeIds = data.id || '';
  471. isBuiltDrawing.value=data.storageType
  472. getTableData()
  473. }
  474. //树菜单被点击
  475. const ElTreeMenuClick = async ({key, node, data, keys}) => {
  476. setStoreValue('wbsTreeExpandKeys', keys)
  477. treeAutoExpandKeys.value = keys || []
  478. }
  479. //回车搜索
  480. const keyUpEvent = (e) => {
  481. if (e.key === "Enter") {
  482. searchForm.value.current = 1;
  483. getTableData()
  484. }
  485. }
  486. //搜索
  487. const searchClick = () => {
  488. searchForm.value.current = 1;
  489. getTableData()
  490. }
  491. //分页被点击
  492. const pageChange = ({current, size}) => {
  493. searchForm.value.current = current
  494. searchForm.value.size = size
  495. getTableData()
  496. }
  497. //表格数据
  498. const tableRef = ref(null)
  499. const tableColumn = ref([])
  500. //设置表头
  501. const setTableColumns = () => {
  502. if (isBuiltDrawing.value === 1) {
  503. tableColumn.value = [
  504. {key:'fileNumber', name: '文件编号', width: 160},
  505. {key:'fileName', name: '文件名称'},
  506. {key:'filePage', name: '文件页数', width: 120},
  507. {key:'sheetType', name: '图幅'},
  508. {key:'sheetSourceValue', name: '图表来源'},
  509. {key:'drawingNo', name: '图号'},
  510. {key:'citeChangeNumber', name: '引用变更令编号'},
  511. {key:'isCertificationValue', name: '认证状态', width: 160},
  512. {key:'isApprovalValue', name: '状态', width: 160},
  513. {key:'fileTime', name: '文件时间', width: 160},
  514. {key:'dutyUser', name: '责任者', width: 160}
  515. ]
  516. sheetTypeStatus()
  517. sheetSourceStatus()
  518. } else {
  519. tableColumn.value = [
  520. {key:'fileNumber', name: '文件编号', width: 160},
  521. {key:'fileName', name: '文件名称'},
  522. {key:'filePage', name: '文件页数', width: 100},
  523. {key:'isCertificationValue', name: '认证状态', width: 120},
  524. {key:'isApprovalValue', name: '状态', width: 120},
  525. {key:'fileTime', name: '文件时间', width: 180},
  526. {key:'dutyUser', name: '责任者', width: 180}
  527. ]
  528. }
  529. }
  530. const tableData = ref([])
  531. //获取数据
  532. const tableLoading = ref(false)
  533. const getTableData = async () => {
  534. tableLoading.value = true
  535. const { error, code, data } = await archiveFileApi.getarchiveFilePage({
  536. ...searchForm.value,
  537. projectId: projectId.value,
  538. contractId: contractId.value
  539. })
  540. tableLoading.value = false
  541. if (!error && code === 200) {
  542. tableData.value = getArrValue(data['records'])
  543. searchForm.value.total = data['total'] || 0
  544. } else {
  545. tableData.value = []
  546. searchForm.value.total = 0
  547. }
  548. }
  549. //多选
  550. const tableCheckedKeys = ref([]);
  551. const tableSelection = (rows) => {
  552. tableCheckedKeys.value = rows
  553. }
  554. //分盒整理
  555. const sortingModal = ref(false)
  556. const sortingClick = async() => {
  557. if (nodeIds.value && isStorageNode.value === 1) {
  558. const { error, code, data } = await archiveFileApi.getBoxNameAndBoxNumber({
  559. nodeId:nodeIds.value
  560. })
  561. if (!error && code === 200) {
  562. if(data.length > 0){
  563. sortingActiveKey.value = [];
  564. sortingModal.value = true
  565. sortingItemData.value = getArrValue(data)
  566. sortingOldData.value = deepClone(sortingItemData.value)
  567. }else{
  568. console.log(1111111);
  569. sortingNoneModal.value = true
  570. }
  571. }
  572. } else {
  573. window?.$message?.warning('请先选择一个子节点')
  574. }
  575. }
  576. const sortingNoneModal = ref(false)//无数据显示的弹窗
  577. const toSortingModal = ()=>{
  578. sortingNoneModal.value = false;
  579. sortingActiveKey.value = [];
  580. sortingItemData.value=[]
  581. sortingModal.value = true
  582. }
  583. const sortingNoneModalClose=()=>{
  584. sortingNoneModal.value=false
  585. }
  586. const sortingItemData = ref([])
  587. const sortingOldData = ref([])//旧数据,用来对比是否修改名字
  588. //获取数据
  589. const sortingItemLoading = ref(false)
  590. const getSortingItemData = () => {
  591. }
  592. //校验
  593. const tableIsInput = (val, row, key) => {
  594. //console.log(!val);
  595. //检测是否改过案卷名字
  596. if(key == 'isName'){
  597. row.isChange = true;
  598. }
  599. row[key] = !val;
  600. }
  601. //选择文件
  602. // const sortingActiveKey = ref('')
  603. // const sortingSelectFile = (row, index) => {
  604. // //取当前展开组的key
  605. // const key = sortingActiveKey.value;
  606. // const keys = key ? key.split('-') : [];
  607. // const active = keys.length > 0 ? keys[1]: -1;
  608. // if (Number(active) === index) {
  609. // sortingActiveKey.value = null;
  610. // } else {
  611. // sortingActiveKey.value = `item-${index}`;
  612. // }
  613. // }
  614. const sortingActiveKey = ref([])
  615. const sortingSelectFile = (row, index) => {
  616. const key = `item-${index}`;
  617. const indexNum = sortingActiveKey.value.indexOf(key);
  618. if(indexNum > -1){
  619. sortingActiveKey.value.splice(indexNum,1);
  620. }else{
  621. sortingActiveKey.value.push(key);
  622. if(!(row.list && row.list.length > 0)){
  623. getSortingTableData(row, index)
  624. }
  625. }
  626. }
  627. //表格
  628. const sortingTableColumn = [
  629. {key:'name', name: '文件名称'},
  630. ];
  631. const sortingTableData = ref([])
  632. //获取数据
  633. const sortingTableLoading = ref(false)
  634. const getSortingTableData = async(row, index) => {
  635. sortingTableLoading.value = true
  636. const { error, code, data } = await archiveFileApi.pageByBoxName({
  637. size: 99999,
  638. current: 1,
  639. projectId: projectId.value,
  640. contractId: contractId.value,
  641. nodeIds:nodeIds.value,
  642. boxName:row.boxName?row.boxName:''
  643. })
  644. sortingTableLoading.value = false
  645. if (!error && code === 200) {
  646. row.list = getArrValue(data['records'])
  647. setTableCheck(row, index)
  648. } else {
  649. row.list = []
  650. }
  651. }
  652. //表格ref
  653. const sorTableRef = ref([]);
  654. //回显勾选
  655. const setTableCheck = async(row, index) => {
  656. //console.log(row)
  657. if(row.ids){
  658. const keys = row.ids.split(',');
  659. row.list.forEach(async (item)=>{
  660. if(keys.indexOf(item.id) > -1){
  661. item.checked = true;
  662. await nextTick();
  663. sorTableRef.value[index].toggleRowSelection(item,true);
  664. }
  665. })
  666. }
  667. }
  668. //多选
  669. const sortingTableKeys = ref([]);
  670. const sortingTableSelection = (rows,list,event) => {
  671. //console.log(event)
  672. list.forEach(element => {
  673. element.checked = false;
  674. });
  675. rows.forEach((element)=>{
  676. element.checked = true;
  677. })
  678. }
  679. //删除
  680. const sortingDelData = (row,index) => {
  681. sortingItemData.value.splice(index,1);
  682. if(row.boxNumber){
  683. delMessage(async () => {
  684. const { error, code } = await archiveFileApi.removeAllocation({
  685. boxName: row.boxName,
  686. boxNumber:row.boxNumber
  687. })
  688. if (!error && code === 200) {
  689. window.$message?.success('删除成功!')
  690. // searchClick()
  691. sortingClick()
  692. }
  693. })
  694. }
  695. }
  696. //添加分盒
  697. const addSortingModalClick = () => {
  698. sortingItemData.value.push({
  699. boxName: ''
  700. })
  701. }
  702. //确认保存
  703. const sortingModalLoading = ref(false)
  704. const sortingModalSave = async() => {
  705. sortingModalLoading.value = true
  706. //检测案卷名是否重复
  707. let nameRes = await checkNames();
  708. //console.log(nameRes)
  709. //return;
  710. for (let i = 0; i < nameRes.length; i++) {
  711. if(typeof nameRes[i].data == 'string'){
  712. window.$message?.error(nameRes[i].data+',案卷名重复')
  713. sortingModalLoading.value = false
  714. return;
  715. }
  716. }
  717. //组装数据
  718. let rows = [];
  719. sortingItemData.value.forEach((item,index)=>{
  720. let obj = {
  721. ids:'',
  722. boxName:item.boxName,
  723. boxNumber:index+1,
  724. };
  725. let list = [];
  726. if(item.list){
  727. item.list.forEach((item2)=>{
  728. if(item2.checked){
  729. list.push(item2.id)
  730. }
  731. })
  732. obj.ids = list.join(',');
  733. }else{
  734. obj.ids = item.ids;
  735. }
  736. rows.push(obj)
  737. })
  738. console.log(rows,'rows');
  739. if(rows[0]?.ids){
  740. const { error, code, data } = await archiveFileApi.allocation({
  741. list: rows
  742. })
  743. if (!error && code === 200) {
  744. window.$message?.success('保存成功')
  745. sortingModal.value = false
  746. } else {
  747. window.$message?.error('保存失败')
  748. }
  749. }else{
  750. window.$message?.warning('空数据不能提交')
  751. }
  752. sortingModalLoading.value = false
  753. }
  754. const checkNames =() =>{
  755. const arr = [];
  756. sortingItemData.value.forEach((item)=>{
  757. if(item.boxNumber){
  758. if(item.isChange){
  759. //是否修改过
  760. //对比旧的数据,是否相同
  761. for (let i = 0; i < sortingOldData.value.length; i++) {
  762. if(sortingOldData.value[i].boxNumber == item.boxNumber){
  763. if(sortingOldData.value[i].boxName != item.boxName){
  764. arr.push(
  765. archiveFileApi.getIsBoxName({
  766. boxName:item.boxName
  767. })
  768. )
  769. }
  770. return;
  771. }
  772. }
  773. }
  774. }else{
  775. arr.push(
  776. archiveFileApi.getIsBoxName({
  777. boxName:item.boxName
  778. })
  779. )
  780. }
  781. })
  782. return Promise.all(arr);
  783. }
  784. //关闭
  785. const sortingModalClose = () => {
  786. sortingModal.value = false
  787. }
  788. //删除
  789. const delModalClick = async () => {
  790. const rows = tableCheckedKeys.value
  791. if(rows.length <= 0){
  792. window.$message?.error('请选择需要删除的数据')
  793. } else {
  794. delMessage(async () => {
  795. const keys = arrToId(rows);
  796. const { error, code } = await archiveFileApi.removeFile({
  797. ids: keys
  798. })
  799. if (!error && code === 200) {
  800. window.$message?.success('删除成功!')
  801. searchClick()
  802. }
  803. })
  804. }
  805. }
  806. //跨目录移动
  807. const movesModal = ref(false)
  808. const movesClick = async() => {
  809. movesModal.value = true
  810. treePanelLoading.value = true
  811. const { error, code, data } = await archiveFileApi.getarchiveFilePage({
  812. ...searchForm.value,
  813. size:9999,
  814. projectId: projectId.value,
  815. contractId: contractId.value
  816. })
  817. if (!error && code === 200) {
  818. fileDatasList.value = getArrValue(data['records'])
  819. } else {
  820. fileDatasList.value = []
  821. }
  822. }
  823. //选择需要迁移的文件
  824. const movesCheckAll = ref(false)
  825. const isIndeterminate = ref(true)
  826. const checkedMoves = ref([])
  827. //左侧待迁移文件
  828. const fileDatasList = ref([])
  829. //全选
  830. const handleCheckAllChange = (val) => {
  831. const checked = fileDatasList.value
  832. const keys = rowsToIdNumArr(checked);
  833. checkedMoves.value = val ? keys : []
  834. isIndeterminate.value = false
  835. }
  836. //勾选
  837. const handleCheckedMovesChange = (value) => {
  838. const keys = fileDatasList.value
  839. const checkedCount = value.length
  840. movesCheckAll.value = checkedCount === keys.length
  841. isIndeterminate.value = checkedCount > 0 && checkedCount < keys.length
  842. }
  843. //右侧radio
  844. let radioNodeId = ''
  845. const radioChange = (id)=>{
  846. //console.log(id)
  847. radioNodeId = id;
  848. }
  849. //只显示储存节点的单选
  850. const showRadioFun = (data)=>{
  851. if(data.isStorageNode == 1){
  852. return true;
  853. }else{
  854. return false;
  855. }
  856. }
  857. //保存
  858. const movesModalLoading = ref(false)
  859. const movesModalSave = async() => {
  860. let ids = checkedMoves.value.join(',')
  861. if(checkedMoves.value.length < 1){
  862. window.$message?.warning('请勾选需要迁移的文件')
  863. return;
  864. }
  865. if(radioNodeId == ''){
  866. window.$message?.warning('请选择要移动到的节点')
  867. return;
  868. }
  869. movesModalLoading.value = true;
  870. const { error, code, data } = await archiveFileApi.migrateFile({
  871. ids:ids,
  872. nodeId:radioNodeId
  873. })
  874. movesModalLoading.value = false
  875. if (!error && code === 200) {
  876. window.$message?.success('保存成功')
  877. movesModal.value = false
  878. getTableData()
  879. } else {
  880. window.$message?.error('保存失败')
  881. }
  882. }
  883. //关闭
  884. const movesModalClose = () => {
  885. movesModal.value = false
  886. }
  887. //表格排序
  888. const sortModal = ref(false)
  889. //显示
  890. const tableSortClick = () => {
  891. sortModal.value = true
  892. getSortTableData()
  893. }
  894. //搜索表单
  895. const sortSearchForm = ref({
  896. nodeIds:'',
  897. current: 1, size: 20, total: 0
  898. })
  899. //分页被点击
  900. const sortPageChange = ({current, size}) => {
  901. sortSearchForm.value.current = current
  902. sortSearchForm.value.size = size
  903. getSortTableData()
  904. }
  905. //表格数据
  906. const sortTableColumn = ref([
  907. {key:'fileNumber', name: '文件编号', width: 160},
  908. {key:'fileName', name: '文件名称'},
  909. {key:'action', name: '排序', width: 90},
  910. ])
  911. const sortTableData = ref([])
  912. const sortTableLoading = ref(false)
  913. const getSortTableData = async () => {
  914. sortTableLoading.value = true
  915. const { error, code, data } = await archiveFileApi.getarchiveFilePage({
  916. ...sortSearchForm.value,
  917. projectId: projectId.value,
  918. contractId: contractId.value
  919. })
  920. sortTableLoading.value = false
  921. if (!error && code === 200) {
  922. sortTableData.value = getArrValue(data['records'])
  923. sortSearchForm.value.total = data['total'] || 0
  924. } else {
  925. sortTableData.value = []
  926. sortSearchForm.value.total = 0
  927. }
  928. }
  929. //拖动完成
  930. const sortTableRowDrop = (rows) => {
  931. sortTableData.value = rows
  932. }
  933. //向下
  934. const downSortClick = (index) => {
  935. const indexs = index + 1
  936. const data = sortTableData.value
  937. if(indexs !== data.length) {
  938. const tmp = data.splice(indexs,1);
  939. sortTableData.value.splice(index,0,tmp[0]);
  940. } else {
  941. window?.$message?.warning('已经处于置底,无法下移')
  942. }
  943. }
  944. //向上
  945. const upSortClick = (index) => {
  946. const data = sortTableData.value || []
  947. if(index !== 0) {
  948. const tmp = data.splice(index - 1,1);
  949. sortTableData.value.splice(index,0,tmp[0]);
  950. } else {
  951. window?.$message?.warning('已经处于置顶,无法上移')
  952. }
  953. }
  954. //保存
  955. const sortModalLoading = ref(false)
  956. const sortModalSave = async() => {
  957. await batchEditSaveApi(sortTableData.value)
  958. sortModal.value = false
  959. }
  960. //关闭
  961. const sortModalClose = () => {
  962. sortModal.value = false
  963. }
  964. //获取认证状态
  965. const certificationType = ref([])
  966. const certificationStatus = async () => {
  967. const { error, code, data } = await tasksApi.queryTaskTypeStatus({
  968. typeOrStatus: 'certification_status'
  969. })
  970. //处理数据
  971. if (!error && code === 200) {
  972. certificationType.value = getArrValue(data)
  973. } else {
  974. certificationType.value = []
  975. }
  976. }
  977. //获取图幅类型
  978. const sheetType = ref([])
  979. const sheetTypeStatus = async () => {
  980. console.log(1111111);
  981. const { error, code, data } = await tasksApi.queryTaskTypeStatus({
  982. typeOrStatus: 'sheet_type'
  983. })
  984. //处理数据
  985. if (!error && code === 200) {
  986. sheetType.value = getArrValue(data)
  987. } else {
  988. sheetType.value = []
  989. }
  990. }
  991. //获取图表来源
  992. const sheetSourceType = ref([])
  993. const sheetSourceStatus = async () => {
  994. const { error, code, data } = await tasksApi.queryTaskTypeStatus({
  995. typeOrStatus: 'sheet_source'
  996. })
  997. //处理数据
  998. if (!error && code === 200) {
  999. sheetSourceType.value = getArrValue(data)
  1000. } else {
  1001. sheetSourceType.value = []
  1002. }
  1003. }
  1004. //新增文件
  1005. const tableUploadType = ref('add')
  1006. const showUploadModal = ref(false)
  1007. const uploadModalClick = () => {
  1008. if (nodeIds.value && isStorageNode.value === 1) {
  1009. tableUploadType.value = 'add'
  1010. setTableUploadColumn()
  1011. uploadSaveLoading.value = false
  1012. tableUploadData.value = []
  1013. showUploadModal.value = true
  1014. setdutyUser()
  1015. } else {
  1016. window?.$message?.warning('请先选择一个子节点')
  1017. }
  1018. }
  1019. const uploadModalClose=()=>{
  1020. batchUploadCancel()
  1021. HcUploadFileRef?.value.cancel()
  1022. HcUploadFileRef?.value.isShow(false)
  1023. }
  1024. //设置文件表头
  1025. const tableUploadColumn = ref([
  1026. {key:'fileNumber', name: '文件编号'},
  1027. {key:'fileName', name: '文件名称'},
  1028. {key:'fileTime', name: '文件时间'},
  1029. {key:'isApproval', name: '是否需要审批'},
  1030. {key:'isNeedCertification', name: '是否需要认证'},
  1031. {key:'dutyUser', name: '责任者'},
  1032. {key:'isElement', name: '是否四要素'},
  1033. {key:'action', name: '操作', width: 100}
  1034. ])
  1035. const setTableUploadColumn = () => {
  1036. if (isBuiltDrawing.value === 2) {
  1037. tableUploadColumn.value = [
  1038. {key:'fileNumber', name: '文件编号'},
  1039. {key:'fileName', name: '文件名称'},
  1040. {key:'fileTime', name: '文件时间'},
  1041. {key:'sheetType', name: '图幅'},
  1042. {key:'sheetSource', name: '图表来源'},
  1043. {key:'drawingNo', name: '图号'},
  1044. {key:'citeChangeNumber', name: '引用变更令编号'},
  1045. {key:'isApproval', name: '是否需要审批'},
  1046. {key:'isNeedCertification', name: '是否需要认证'},
  1047. {key:'dutyUser', name: '责任者'},
  1048. {key:'isElement', name: '是否四要素'},
  1049. {key:'action', name: '操作', width: 100}
  1050. ]
  1051. sheetTypeStatus()
  1052. sheetSourceStatus()
  1053. } else {
  1054. tableUploadColumn.value = [
  1055. {key:'fileNumber', name: '文件编号'},
  1056. {key:'fileName', name: '文件名称'},
  1057. {key:'fileTime', name: '文件时间'},
  1058. {key:'isApproval', name: '是否需要审批'},
  1059. {key:'isNeedCertification', name: '是否需要认证'},
  1060. {key:'dutyUser', name: '责任者'},
  1061. {key:'isElement', name: '是否四要素'},
  1062. {key:'action', name: '操作', width: 100}
  1063. ]
  1064. }
  1065. }
  1066. const tableUploadData = ref([])
  1067. //上传的文件结果
  1068. const uploadsChange = (item) => {
  1069. if (getObjVal(item)) {
  1070. let newArr = tableUploadData.value
  1071. const sheet = sheetType.value, source = sheetSourceType.value
  1072. let name = item['originalName'] || ''
  1073. let fileName = name.substring(0, name.lastIndexOf("."))
  1074. newArr.push({
  1075. projectId: projectId.value,
  1076. contractId: contractId.value,
  1077. nodeId: nodeIds.value,
  1078. fileNumber: '',
  1079. fileName: fileName,
  1080. ossFileName: item?.name || '',
  1081. fileTime: null,
  1082. fileUrl: item?.link || '',
  1083. sheetType: sheet.length > 0 ? sheet[0]['dictKey'] || '': '',
  1084. sheetSource: source.length > 0 ? source[0]['dictKey'] || '': '',
  1085. drawingNo: '',
  1086. citeChangeNumber: '',
  1087. isApproval: 1,
  1088. isNeedCertification: 1,
  1089. dutyUser: dutyUser.value,
  1090. pdfFileUrl: item?.pdfUrl || '',
  1091. filePage: item?.page || '',
  1092. isElement: 0
  1093. })
  1094. tableUploadData.value = newArr
  1095. } else {
  1096. console.log(item)
  1097. }
  1098. }
  1099. //表单下拉数据
  1100. const whetherData = ref([
  1101. {label: "不需要", value: 0},
  1102. {label: "需要", value: 1}
  1103. ])
  1104. //表格数据排序
  1105. const tableUploadRowSort = (arr) => {
  1106. tableUploadData.value = arr
  1107. }
  1108. //删除
  1109. const delUploadData = async (row,index) => {
  1110. if (row['ossFileName']) {
  1111. row['delBtnLoading'] = true
  1112. await ossApi.removeFile({fileName: row['ossFileName']})
  1113. row['delBtnLoading'] = false
  1114. tableUploadData.value.splice(index,1);
  1115. } else {
  1116. tableUploadData.value.splice(index,1);
  1117. }
  1118. }
  1119. //批量上传保存
  1120. const uploadSaveLoading = ref(false)
  1121. const batchUploadSave = async () => {
  1122. const rows = tableUploadData.value
  1123. if (rows.length > 0) {
  1124. //验证表单数据
  1125. uploadSaveLoading.value = true
  1126. let isTableRows = false;
  1127. for (let i = 0; i < rows.length; i++) {
  1128. // if (!rows[i]['fileNumber']) {
  1129. // rows[i]['isFileNumber'] = true
  1130. // isTableRows = true
  1131. // } else if (!rows[i]['fileName']) {
  1132. // rows[i]['isFileName'] = true
  1133. // isTableRows = true
  1134. // }
  1135. // if (!rows[i]['fileTime']) {
  1136. // rows[i]['isFileTime'] = true
  1137. // isTableRows = true
  1138. // }
  1139. // else
  1140. if (!rows[i]['fileName']) {
  1141. rows[i]['isFileName'] = true
  1142. isTableRows = true
  1143. }
  1144. }
  1145. //判断数据
  1146. if (isTableRows) {
  1147. uploadSaveLoading.value = false
  1148. window.$message?.warning('请先完善表单信息')
  1149. } else {
  1150. if (tableUploadType.value === 'add') {
  1151. await batchUploadSaveApi(rows)
  1152. } else {
  1153. await batchEditSaveApi(rows)
  1154. }
  1155. }
  1156. } else {
  1157. window.$message?.warning('请先上传文件')
  1158. }
  1159. }
  1160. //确认上传保存
  1161. const batchUploadSaveApi = async (rows) => {
  1162. uploadSaveLoading.value = true
  1163. const {error, code} = await archiveFileApi.batchUploadSave({
  1164. list: rows
  1165. },false)
  1166. //判断状态
  1167. uploadSaveLoading.value = false
  1168. if (!error && code === 200) {
  1169. window.$message?.success('保存成功')
  1170. batchUploadCancel()
  1171. getTableData()
  1172. } else {
  1173. window.$message?.error('保存失败')
  1174. }
  1175. }
  1176. //取消上传
  1177. const batchUploadCancel = () => {
  1178. tableUploadData.value = []
  1179. uploadSaveLoading.value = false
  1180. uploadsLoading.value = false
  1181. showUploadModal.value = false
  1182. }
  1183. //批量编辑
  1184. const batchEditClick = () => {
  1185. const rows = deepClone(tableCheckedKeys.value)
  1186. //判断是否满足条件
  1187. const result = rows.every(({status})=> {
  1188. return status !== 1 && status !== 2
  1189. })
  1190. //判断状态
  1191. if (result) {
  1192. tableUploadType.value = 'edit'
  1193. setTableUploadColumn()
  1194. uploadSaveLoading.value = false
  1195. tableUploadData.value = rows
  1196. showUploadModal.value = true
  1197. } else {
  1198. window.$message?.warning('已上报或已审批的文件不能编辑')
  1199. }
  1200. }
  1201. //确认编辑上传保存
  1202. const batchEditSaveApi = async (rows) => {
  1203. uploadSaveLoading.value = true
  1204. const {error, code} = await archiveFileApi.batchUpdateSort({
  1205. list: rows
  1206. },false)
  1207. //判断状态
  1208. uploadSaveLoading.value = false
  1209. if (!error && code === 200) {
  1210. window.$message?.success('保存成功')
  1211. batchUploadCancel()
  1212. getTableData()
  1213. } else {
  1214. window.$message?.error('保存失败')
  1215. }
  1216. }
  1217. //批量认证
  1218. const CertData = ref([])
  1219. const CertIds = ref([])
  1220. const CertPdf = ref('')
  1221. const CertColumns = [
  1222. {key:'fileName', name: '文件名称'},
  1223. {key:'action', name: '操作', width: 100}
  1224. ]
  1225. //批量认证弹窗
  1226. const showCertificationModal = ref(false)
  1227. const certificationModalClick = () => {
  1228. const rows = tableCheckedKeys.value;
  1229. CertData.value = rows
  1230. CertIds.value = rowsToId(rows)
  1231. CertPdf.value = rows[0]?.pdfFileUrl || ''
  1232. showCertificationModal.value = true
  1233. /*const result = rows.every(({isCertification})=> {
  1234. return isCertification === 0
  1235. })
  1236. if (result) {
  1237. CertData.value = rows
  1238. CertIds.value = rowsToId(rows)
  1239. CertPdf.value = rows[0]?.pdfFileUrl || ''
  1240. showCertificationModal.value = true
  1241. } else {
  1242. window.$message?.warning('已认证的文件不能再认证')
  1243. }*/
  1244. }
  1245. //认证行被点击
  1246. const CertRowClick = ({row}) => {
  1247. const pdfFileUrl = row?.pdfFileUrl || ''
  1248. if (CertPdf.value !== pdfFileUrl) {
  1249. CertPdf.value = pdfFileUrl
  1250. }
  1251. }
  1252. //认证预览被点击
  1253. const CertRowClick2 = ({pdfFileUrl}) => {
  1254. const pdfUrl = pdfFileUrl || ''
  1255. if (CertPdf.value !== pdfUrl) {
  1256. CertPdf.value = pdfUrl
  1257. }
  1258. }
  1259. //确认认证
  1260. const CertLoading = ref(false)
  1261. const CertClick = async () => {
  1262. /*CertLoading.value = true
  1263. const {error, code} = await projectScanningApi.batchCertification({
  1264. ids: CertIds.value
  1265. }, false)
  1266. //判断状态
  1267. CertLoading.value = false
  1268. if (!error && code === 200) {
  1269. window.$message?.success('认证成功')
  1270. showCertificationModal.value = false
  1271. getTableData()
  1272. } else {
  1273. window.$message?.error('认证失败')
  1274. }*/
  1275. }
  1276. //名称被点击
  1277. const tableRowName = (row) => {
  1278. if (row['pdfFileUrl']) {
  1279. window.open(row['pdfFileUrl'], '_blank')
  1280. } else {
  1281. window.$message?.warning('文件不存在')
  1282. }
  1283. }
  1284. //左右拖动,改变树形结构宽度
  1285. const leftWidth = ref(382);
  1286. const onmousedown = () => {
  1287. const leftNum = isCollapse.value ? 142 : 272
  1288. document.onmousemove = (ve) => {
  1289. let diffVal = ve.clientX - leftNum;
  1290. if(diffVal >= 310 && diffVal <= 900) {
  1291. leftWidth.value = diffVal;
  1292. }
  1293. }
  1294. document.onmouseup = () => {
  1295. document.onmousemove = null;
  1296. document.onmouseup = null;
  1297. }
  1298. }
  1299. </script>
  1300. <style lang="scss" scoped>
  1301. @import '~style/file/scoped/collection.scss';
  1302. .flex-center{
  1303. display: flex;
  1304. align-items: center;
  1305. justify-content: center;
  1306. height: 100%;
  1307. flex-direction: column;
  1308. }
  1309. </style>
  1310. <style lang="scss">
  1311. @import '~style/file/collection.scss';
  1312. </style>