collection.vue 56 KB

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