collection.vue 57 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630
  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="110"
  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" @finish="HcUploadFileFinish" />
  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 { delMessageV2 } from '~com/message/index.js'
  421. import archiveFileApi from '~api/archiveFile/archiveFile'
  422. import { arrKeySort, arrToId, deepClone, getArrValue, getObjVal } from 'js-fast-way'
  423. import { getTokenHeader } from '~src/api/request/header'
  424. import tasksApi from '~api/tasks/data'
  425. import ossApi from '~api/oss'
  426. //变量
  427. const useAppState = useAppStore()
  428. const projectId = ref(useAppState.getProjectId)
  429. const contractId = ref(useAppState.getContractId)
  430. const projectInfo = ref(useAppState.getProjectInfo)
  431. const contractInfo = ref(useAppState.getContractInfo)
  432. const isCollapse = ref(useAppState.getCollapse)
  433. const HcUploadFileRef = ref(null)
  434. //上传进度
  435. const uploadsLoading = ref(false)
  436. //监听
  437. watch(() => [
  438. useAppState.getCollapse,
  439. ], ([Collapse]) => {
  440. isCollapse.value = Collapse
  441. })
  442. //渲染完成
  443. onMounted(() => {
  444. treeLoading.value = true
  445. setTableColumns()
  446. })
  447. //上传配置
  448. const UploadFileOptions = {
  449. headers: getTokenHeader(),
  450. }
  451. const { contractType } = contractInfo.value
  452. const dutyUser = ref('')
  453. //设置责任者
  454. const setdutyUser = async ()=>{
  455. const { error, code, data, msg } = await archiveFileApi.getDutyUser({
  456. contractId: treecontractId.value,
  457. projectId:projectId.value,
  458. })
  459. if (!error && code === 200) {
  460. if (data?.contractType === 1) {
  461. dutyUser.value = data?.constructionUnitName || ''
  462. } else if (data?.contractType === 2) {
  463. dutyUser.value = data?.supervisionUnitName || ''
  464. } else if (data?.contractType === 3) {
  465. dutyUser.value = data?.contractorUnitName || ''
  466. }
  467. }
  468. }
  469. //打开文件选择框
  470. const uploadFileClick = () => {
  471. HcUploadFileRef?.value?.cancelUpload()
  472. HcUploadFileRef?.value.selectFile()
  473. }
  474. // 文件上传进度
  475. const HcUploadFileProgress = ({ file, status }) => {
  476. uploadsLoading.value = true
  477. }
  478. // 文件上传成功的回调
  479. const HcUploadFileSuccess = (res) => {
  480. console.log('文件上传成功', res)
  481. uploadsLoading.value = false
  482. uploadsChange(res.id, res.resData)
  483. }
  484. //替换文件
  485. const newHcUploadFileSuccess = (res, row) => {
  486. let item = res.resData
  487. //更新数据
  488. row.fileName = item?.originalName
  489. row.ossFileName = item?.name || ''
  490. row.fileUrl = item?.link || ''
  491. row.pdfFileUrl = item?.pdfUrl || ''
  492. row.filePage = item?.page || ''
  493. row.isUpdateUrl = 1
  494. //uploadsLoading.value = false
  495. // uploadsChange(res.resData)
  496. }
  497. // 文件全部上传成功
  498. const HcUploadFileFinish = () => {
  499. uploadsLoading.value = false
  500. HcUploadFileRef?.value.setModalShow(false)
  501. }
  502. //树加载
  503. const treeLoading = ref(false)
  504. const treeNodeLoading = () => {
  505. treeLoading.value = false
  506. }
  507. const treePanelLoading = ref(false)
  508. const panelTreeLoading = () => {
  509. treePanelLoading.value = false
  510. }
  511. //审批状态
  512. const approvalStatus = ref([
  513. { label: '未上报', value: '0' },
  514. { label: '待审批', value: '1' },
  515. { label: '已审批', value: '2' },
  516. ])
  517. //认证状态
  518. const certifiedStatus = ref([
  519. { label: '已认证', value: '1' },
  520. { label: '未认证', value: '0' },
  521. ])
  522. //搜索表单
  523. const searchForm = ref({
  524. nodeIds:'',
  525. approval: null, certified: null, queryValue: null,
  526. current: 1, size: 20, total: 0,
  527. })
  528. //树相关的变量
  529. const primaryKeyId = ref('')
  530. const isBuiltDrawing = ref(0)
  531. const isStorageNode = ref(0)
  532. const nodeIds = ref('')
  533. const treecontractId = ref('')
  534. //自动展开缓存
  535. const treeAutoExpandKeys = ref(getStoreValue('wbsTreeExpandKeys') || [])
  536. const projectTreeClick = ({ node, data, keys, key }) => {
  537. setStoreValue('wbsTreeExpandKeys', keys)
  538. treeAutoExpandKeys.value = keys || []
  539. nodeIds.value = data.id || ''
  540. isStorageNode.value = data['isStorageNode'] || 0
  541. treecontractId.value = data?.contractId || ''
  542. //设置搜索数据
  543. searchForm.value.current = 1
  544. searchForm.value.nodeIds = data.id || ''
  545. sortSearchForm.value.nodeIds = data.id || ''
  546. isBuiltDrawing.value = data.storageType
  547. getTableData()
  548. }
  549. //树菜单被点击
  550. const ElTreeMenuClick = async ({ key, node, data, keys }) => {
  551. setStoreValue('wbsTreeExpandKeys', keys)
  552. treeAutoExpandKeys.value = keys || []
  553. }
  554. //回车搜索
  555. const keyUpEvent = (e) => {
  556. if (e.key === 'Enter') {
  557. searchForm.value.current = 1
  558. getTableData()
  559. }
  560. }
  561. //搜索
  562. const searchClick = () => {
  563. searchForm.value.current = 1
  564. getTableData()
  565. }
  566. //分页被点击
  567. const pageChange = ({ current, size }) => {
  568. searchForm.value.current = current
  569. searchForm.value.size = size
  570. getTableData()
  571. }
  572. //表格数据
  573. const tableRef = ref(null)
  574. const tableColumn = ref([])
  575. //设置表头
  576. const setTableColumns = () => {
  577. if (isBuiltDrawing.value === 1) {
  578. tableColumn.value = [
  579. { key:'fileNumber', name: '文件编号', width: 100, autoWidth: true },
  580. { key:'fileName', name: '文件名称' },
  581. { key:'filePage', name: '文件页数', width: 120 },
  582. { key:'sheetType', name: '图幅', width: 110 },
  583. { key:'sheetSourceValue', name: '图表来源', width: 110 },
  584. { key:'drawingNo', name: '图号', width: 110 },
  585. { key:'citeChangeNumber', name: '引用变更令编号', width: 110 },
  586. { key:'isCertificationValue', name: '认证状态', width: 100 },
  587. { key:'isApprovalValue', name: '状态', width: 100 },
  588. { key:'fileTime', name: '文件时间', width: 120, autoWidth: true },
  589. { key:'dutyUser', name: '责任者', width: 140 },
  590. ]
  591. sheetTypeStatus()
  592. sheetSourceStatus()
  593. } else {
  594. tableColumn.value = [
  595. { key:'fileNumber', name: '文件编号', width: 100, autoWidth: true },
  596. { key:'fileName', name: '文件名称' },
  597. { key:'filePage', name: '文件页数', width: 100 },
  598. { key:'isCertificationValue', name: '认证状态', width: 100 },
  599. { key:'isApprovalValue', name: '状态', width: 100 },
  600. { key:'fileTime', name: '文件时间', width: 120, autoWidth: true },
  601. { key:'dutyUser', name: '责任者', width: 140 },
  602. ]
  603. }
  604. }
  605. const tableData = ref([])
  606. //获取数据
  607. const tableLoading = ref(false)
  608. const getTableData = async () => {
  609. tableLoading.value = true
  610. const { error, code, data } = await archiveFileApi.getarchiveFilePage({
  611. ...searchForm.value,
  612. projectId: projectId.value,
  613. contractId: contractId.value,
  614. })
  615. tableLoading.value = false
  616. if (!error && code === 200) {
  617. tableData.value = getArrValue(data['records'])
  618. searchForm.value.total = data['total'] || 0
  619. } else {
  620. tableData.value = []
  621. searchForm.value.total = 0
  622. }
  623. }
  624. //多选
  625. const tableCheckedKeys = ref([])
  626. const tableSelection = (rows) => {
  627. tableCheckedKeys.value = rows
  628. }
  629. //分盒整理
  630. const sortingModal = ref(false)
  631. const sortingClick = async () => {
  632. if (nodeIds.value && isStorageNode.value === 1) {
  633. const { error, code, data } = await archiveFileApi.getBoxNameAndBoxNumber({
  634. nodeId:nodeIds.value,
  635. })
  636. if (!error && code === 200) {
  637. if (data.length > 0) {
  638. sortingActiveKey.value = []
  639. sortingModal.value = true
  640. sortingItemData.value = getArrValue(data)
  641. sortingOldData.value = deepClone(sortingItemData.value)
  642. } else {
  643. console.log(1111111)
  644. sortingNoneModal.value = true
  645. }
  646. }
  647. } else {
  648. window?.$message?.warning('请先选择一个子节点')
  649. }
  650. }
  651. const sortingNoneModal = ref(false)//无数据显示的弹窗
  652. const toSortingModal = ()=>{
  653. sortingNoneModal.value = false
  654. sortingActiveKey.value = []
  655. sortingItemData.value = []
  656. sortingModal.value = true
  657. }
  658. const sortingNoneModalClose = ()=>{
  659. sortingNoneModal.value = false
  660. }
  661. const sortingItemData = ref([])
  662. const sortingOldData = ref([])//旧数据,用来对比是否修改名字
  663. //获取数据
  664. const sortingItemLoading = ref(false)
  665. const getSortingItemData = () => {
  666. }
  667. //校验
  668. const tableIsInput = (val, row, key) => {
  669. //console.log(!val);
  670. //检测是否改过案卷名字
  671. if (key == 'isName') {
  672. row.isChange = true
  673. }
  674. row[key] = !val
  675. }
  676. //选择文件
  677. // const sortingActiveKey = ref('')
  678. // const sortingSelectFile = (row, index) => {
  679. // //取当前展开组的key
  680. // const key = sortingActiveKey.value;
  681. // const keys = key ? key.split('-') : [];
  682. // const active = keys.length > 0 ? keys[1]: -1;
  683. // if (Number(active) === index) {
  684. // sortingActiveKey.value = null;
  685. // } else {
  686. // sortingActiveKey.value = `item-${index}`;
  687. // }
  688. // }
  689. const sortingActiveKey = ref([])
  690. const tableIndex = ref('')
  691. const sortingSelectFile = (row, index) => {
  692. tableIndex.value = index
  693. const key = `item-${index}`
  694. const indexNum = sortingActiveKey.value.indexOf(key)
  695. if (indexNum > -1) {
  696. sortingActiveKey.value.splice(indexNum, 1)
  697. } else {
  698. sortingActiveKey.value.push(key)
  699. if (!(row.list && row.list.length > 0)) {
  700. getSortingTableData(row, index)
  701. }
  702. }
  703. }
  704. //表格
  705. const sortingTableColumn = [
  706. { key:'name', name: '文件名称' },
  707. ]
  708. const sortingTableData = ref([])
  709. //获取数据
  710. const sortingTableLoading = ref(false)
  711. const getSortingTableData = async (row, index) => {
  712. sortingTableLoading.value = true
  713. tableindex.value = index
  714. const { error, code, data } = await archiveFileApi.pageByBoxName({
  715. size: 99999,
  716. current: 1,
  717. projectId: projectId.value,
  718. contractId: contractId.value,
  719. nodeIds:nodeIds.value,
  720. boxName:row.boxName ? row.boxName : '',
  721. })
  722. sortingTableLoading.value = false
  723. if (!error && code === 200) {
  724. row.list = getArrValue(data['records'])
  725. setTableCheck(row, index)
  726. } else {
  727. row.list = []
  728. }
  729. }
  730. //表格ref
  731. const sorTableRef = ref([])
  732. const tableindex = ref('')
  733. //回显勾选
  734. const setTableCheck = async (row, index) => {
  735. //console.log(row)
  736. if (row.ids) {
  737. const keys = row.ids.split(',')
  738. row.list.forEach(async (item)=>{
  739. if (keys.indexOf(item.id) > -1) {
  740. item.checked = true
  741. await nextTick()
  742. sorTableRef.value[index].toggleRowSelection(item, true)
  743. }
  744. })
  745. }
  746. }
  747. //多选
  748. const sortingTableKeys = ref([])
  749. const checkList = ref([])
  750. const arrfliter = ref([])
  751. const singleCheck = async ({ row })=>{
  752. let isCheck = false
  753. let checkrow = JSON.parse(JSON.stringify(row))
  754. if (checkrow.checked === false || checkrow.checked === undefined) {
  755. if ( checkList.value.length > 0) {
  756. let arr = checkList.value.filter(e => e.id === checkrow.id)
  757. if (arr.length > 0) {
  758. window.$message.warning('多个盒子不能选择同一份文件')
  759. await nextTick()
  760. sorTableRef.value[tableindex.value].toggleRowSelection(row, false)
  761. isCheck = true
  762. } else {
  763. isCheck = false
  764. row.tableindex = tableindex.value
  765. checkList.value.push(row)
  766. }
  767. } else {
  768. row.tableindex = tableindex.value
  769. checkList.value.push(row)
  770. }
  771. } else {
  772. let arr = checkList.value.filter(e => e.id === checkrow.id)
  773. if (isCheck === false && arr[0]?.checked === true || isCheck) {
  774. arrfliter.value = checkList.value.filter(e => e.id !== checkrow.id)
  775. } else {
  776. arrfliter.value = checkList.value
  777. }
  778. let newarr = []
  779. arrfliter.value.forEach((item)=>{
  780. newarr.push(JSON.parse(JSON.stringify(item)))
  781. })
  782. checkList.value = newarr
  783. }
  784. }
  785. const sortingTableSelection = (rows, list, index) => {
  786. tableindex.value = index
  787. if (list) {
  788. list.forEach(element => {
  789. element.checked = false
  790. })
  791. }
  792. rows.forEach((element)=>{
  793. element.checked = true
  794. })
  795. }
  796. //删除
  797. const sortingDelData = (row, index) => {
  798. sortingItemData.value.splice(index, 1)
  799. console.log(checkList.value, 'checkList.value')
  800. // checkList.value=[]
  801. //过滤掉当前选择的文件
  802. checkList.value = checkList.value.filter(e => e.tableindex !== index)
  803. if (row.boxNumber) {
  804. delMessageV2(async (action, instance, done) => {
  805. if (action === 'confirm') {
  806. instance.confirmButtonLoading = true
  807. const { error, code } = await archiveFileApi.removeAllocation({
  808. boxName: row.boxName,
  809. boxNumber:row.boxNumber,
  810. })
  811. if (!error && code === 200) {
  812. window.$message?.success('删除成功!')
  813. sortingClick()
  814. }
  815. instance.confirmButtonLoading = false
  816. done()
  817. } else {
  818. done()
  819. }
  820. })
  821. }
  822. }
  823. //添加分盒
  824. const addSortingModalClick = () => {
  825. console.log('添加分盒')
  826. sortingItemData.value.push({
  827. boxName: '',
  828. })
  829. }
  830. //确认保存
  831. const sortingModalLoading = ref(false)
  832. const sortingModalSave = async () => {
  833. sortingModalLoading.value = true
  834. //检测案卷名是否重复
  835. let nameRes = await checkNames()
  836. //console.log(nameRes)
  837. //return;
  838. for (let i = 0; i < nameRes.length; i++) {
  839. if (typeof nameRes[i].data == 'string') {
  840. window.$message?.error(nameRes[i].data + ',案卷名重复')
  841. sortingModalLoading.value = false
  842. return
  843. }
  844. }
  845. //组装数据
  846. let rows = []
  847. sortingItemData.value.forEach((item, index)=>{
  848. let obj = {
  849. ids:'',
  850. boxName:item.boxName,
  851. boxNumber:index + 1,
  852. }
  853. let list = []
  854. if (item.list) {
  855. item.list.forEach((item2)=>{
  856. if (item2.checked) {
  857. list.push(item2.id)
  858. }
  859. })
  860. obj.ids = list.join(',')
  861. } else {
  862. obj.ids = item.ids
  863. }
  864. rows.push(obj)
  865. })
  866. console.log(rows, 'rows')
  867. if (rows[0]?.ids) {
  868. const { error, code, data } = await archiveFileApi.allocation({
  869. list: rows,
  870. })
  871. if (!error && code === 200) {
  872. window.$message?.success('保存成功')
  873. sortingModal.value = false
  874. } else {
  875. window.$message?.error('保存失败')
  876. }
  877. } else {
  878. window.$message?.warning('空数据不能提交')
  879. }
  880. sortingModalLoading.value = false
  881. }
  882. const checkNames = () =>{
  883. const arr = []
  884. sortingItemData.value.forEach((item)=>{
  885. if (item.boxNumber) {
  886. if (item.isChange) {
  887. //是否修改过
  888. //对比旧的数据,是否相同
  889. for (let i = 0; i < sortingOldData.value.length; i++) {
  890. if (sortingOldData.value[i].boxNumber == item.boxNumber) {
  891. if (sortingOldData.value[i].boxName != item.boxName) {
  892. arr.push(
  893. archiveFileApi.getIsBoxName({
  894. boxName:item.boxName,
  895. }),
  896. )
  897. }
  898. return
  899. }
  900. }
  901. }
  902. } else {
  903. arr.push(
  904. archiveFileApi.getIsBoxName({
  905. boxName:item.boxName,
  906. }),
  907. )
  908. }
  909. })
  910. return Promise.all(arr)
  911. }
  912. //关闭
  913. const sortingModalClose = () => {
  914. sortingModal.value = false
  915. }
  916. //删除
  917. const delModalClick = async () => {
  918. const rows = tableCheckedKeys.value
  919. if (rows.length <= 0) {
  920. window.$message?.error('请选择需要删除的数据')
  921. } else {
  922. delMessageV2(async (action, instance, done) => {
  923. if (action === 'confirm') {
  924. instance.confirmButtonLoading = true
  925. const keys = arrToId(rows)
  926. const { error, code } = await archiveFileApi.removeFile({
  927. ids: keys,
  928. })
  929. if (!error && code === 200) {
  930. window.$message?.success('删除成功!')
  931. searchClick()
  932. }
  933. instance.confirmButtonLoading = false
  934. done()
  935. } else {
  936. done()
  937. }
  938. })
  939. }
  940. }
  941. //跨目录移动
  942. const movesModal = ref(false)
  943. const movesClick = async () => {
  944. movesModal.value = true
  945. checkedMoves.value = []
  946. movesCheckAll.value = false
  947. treePanelLoading.value = true
  948. fileDatasListLoading.value = true
  949. const { error, code, data } = await archiveFileApi.getarchiveFilePage({
  950. ...searchForm.value,
  951. size:9999,
  952. projectId: projectId.value,
  953. contractId: contractId.value,
  954. })
  955. fileDatasListLoading.value = false
  956. if (!error && code === 200) {
  957. fileDatasList.value = getArrValue(data['records'])
  958. } else {
  959. fileDatasList.value = []
  960. }
  961. }
  962. //选择需要迁移的文件
  963. const movesCheckAll = ref(false)
  964. const isIndeterminate = ref(true)
  965. const checkedMoves = ref([])
  966. //左侧待迁移文件
  967. const fileDatasList = ref([])
  968. const fileDatasListLoading = ref(false)
  969. //全选
  970. const handleCheckAllChange = (val) => {
  971. console.log(val, 'val')
  972. const checked = fileDatasList.value
  973. checkedMoves.value = val ? checked : []
  974. isIndeterminate.value = false
  975. }
  976. //勾选
  977. const handleCheckedMovesChange = (value) => {
  978. const keys = fileDatasList.value
  979. const checkedCount = value.length
  980. movesCheckAll.value = checkedCount === keys.length
  981. isIndeterminate.value = checkedCount > 0 && checkedCount < keys.length
  982. }
  983. //右侧radio
  984. let radioNodeId = ''
  985. const radioChange = (id)=>{
  986. //console.log(id)
  987. radioNodeId = id
  988. }
  989. //只显示储存节点的单选
  990. const showRadioFun = (data)=>{
  991. if (data.isStorageNode == 1) {
  992. return true
  993. } else {
  994. return false
  995. }
  996. }
  997. //保存
  998. const movesModalLoading = ref(false)
  999. const movesModalSave = async () => {
  1000. const keys = rowsToId(checkedMoves.value)
  1001. let ids = keys
  1002. if (checkedMoves.value.length < 1) {
  1003. window.$message?.warning('请勾选需要迁移的文件')
  1004. return
  1005. }
  1006. if (radioNodeId == '') {
  1007. window.$message?.warning('请选择要移动到的节点')
  1008. return
  1009. }
  1010. movesModalLoading.value = true
  1011. const { error, code, data } = await archiveFileApi.migrateFile({
  1012. ids:ids,
  1013. nodeId:radioNodeId,
  1014. })
  1015. movesModalLoading.value = false
  1016. if (!error && code === 200) {
  1017. window.$message?.success('保存成功')
  1018. movesModal.value = false
  1019. getTableData()
  1020. } else {
  1021. window.$message?.error('保存失败')
  1022. }
  1023. }
  1024. //关闭
  1025. const movesModalClose = () => {
  1026. movesModal.value = false
  1027. }
  1028. //表格排序
  1029. const sortModal = ref(false)
  1030. //显示
  1031. const tableSortClick = () => {
  1032. sortModal.value = true
  1033. getSortTableData()
  1034. }
  1035. //搜索表单
  1036. const sortSearchForm = ref({
  1037. nodeIds:'',
  1038. current: 1, size: 20, total: 0,
  1039. })
  1040. //分页被点击
  1041. const sortPageChange = ({ current, size }) => {
  1042. sortSearchForm.value.current = current
  1043. sortSearchForm.value.size = size
  1044. getSortTableData()
  1045. }
  1046. //表格数据
  1047. const sortTableColumn = ref([
  1048. { key:'fileNumber', name: '文件编号', width: 160 },
  1049. { key:'fileName', name: '文件名称' },
  1050. { key:'action', name: '排序', width: 90 },
  1051. ])
  1052. const sortTableData = ref([])
  1053. const sortTableLoading = ref(false)
  1054. const getSortTableData = async () => {
  1055. sortTableLoading.value = true
  1056. const { error, code, data } = await archiveFileApi.getarchiveFilePage({
  1057. ...sortSearchForm.value,
  1058. projectId: projectId.value,
  1059. contractId: contractId.value,
  1060. })
  1061. sortTableLoading.value = false
  1062. if (!error && code === 200) {
  1063. sortTableData.value = getArrValue(data['records'])
  1064. sortSearchForm.value.total = data['total'] || 0
  1065. } else {
  1066. sortTableData.value = []
  1067. sortSearchForm.value.total = 0
  1068. }
  1069. }
  1070. //拖动完成
  1071. const sortTableRowDrop = (rows) => {
  1072. sortTableData.value = [] // 先清空,否则排序会异常
  1073. nextTick(() => {
  1074. sortTableData.value = rows
  1075. })
  1076. }
  1077. //向下
  1078. const downSortClick = (index) => {
  1079. const indexs = index + 1
  1080. const data = sortTableData.value
  1081. if (indexs !== data.length) {
  1082. const tmp = data.splice(indexs, 1)
  1083. sortTableData.value.splice(index, 0, tmp[0])
  1084. } else {
  1085. window?.$message?.warning('已经处于置底,无法下移')
  1086. }
  1087. }
  1088. //向上
  1089. const upSortClick = (index) => {
  1090. const data = sortTableData.value || []
  1091. if (index !== 0) {
  1092. const tmp = data.splice(index - 1, 1)
  1093. sortTableData.value.splice(index, 0, tmp[0])
  1094. } else {
  1095. window?.$message?.warning('已经处于置顶,无法上移')
  1096. }
  1097. }
  1098. //保存
  1099. const sortModalLoading = ref(false)
  1100. const sortModalSave = async () => {
  1101. await batchEditSaveApi(sortTableData.value)
  1102. sortModal.value = false
  1103. }
  1104. //关闭
  1105. const sortModalClose = () => {
  1106. sortModal.value = false
  1107. }
  1108. //获取认证状态
  1109. const certificationType = ref([])
  1110. const certificationStatus = async () => {
  1111. const { error, code, data } = await tasksApi.queryTaskTypeStatus({
  1112. typeOrStatus: 'certification_status',
  1113. })
  1114. //处理数据
  1115. if (!error && code === 200) {
  1116. certificationType.value = getArrValue(data)
  1117. } else {
  1118. certificationType.value = []
  1119. }
  1120. }
  1121. //获取图幅类型
  1122. const sheetType = ref([])
  1123. const sheetTypeStatus = async () => {
  1124. console.log(1111111)
  1125. const { error, code, data } = await tasksApi.queryTaskTypeStatus({
  1126. typeOrStatus: 'sheet_type',
  1127. })
  1128. //处理数据
  1129. if (!error && code === 200) {
  1130. sheetType.value = getArrValue(data)
  1131. } else {
  1132. sheetType.value = []
  1133. }
  1134. }
  1135. //获取图表来源
  1136. const sheetSourceType = ref([])
  1137. const sheetSourceStatus = async () => {
  1138. const { error, code, data } = await tasksApi.queryTaskTypeStatus({
  1139. typeOrStatus: 'sheet_source',
  1140. })
  1141. //处理数据
  1142. if (!error && code === 200) {
  1143. sheetSourceType.value = getArrValue(data)
  1144. } else {
  1145. sheetSourceType.value = []
  1146. }
  1147. }
  1148. //新增文件
  1149. const tableUploadType = ref('add')
  1150. const showUploadModal = ref(false)
  1151. const uploadModalClick = () => {
  1152. if (nodeIds.value && isStorageNode.value === 1) {
  1153. tableUploadType.value = 'add'
  1154. setTableUploadColumn()
  1155. uploadSaveLoading.value = false
  1156. tableUploadData.value = []
  1157. showUploadModal.value = true
  1158. setdutyUser()
  1159. } else {
  1160. window?.$message?.warning('请先选择一个子节点')
  1161. }
  1162. }
  1163. const uploadModalClose = ()=>{
  1164. batchUploadCancel()
  1165. //HcUploadFileRef?.value.cancel()
  1166. HcUploadFileRef?.value.setModalShow(false)
  1167. }
  1168. //设置文件表头
  1169. const tableUploadColumn = ref([
  1170. { key:'fileNumber', name: '文件编号' },
  1171. { key:'fileName', name: '文件名称' },
  1172. { key:'fileTime', name: '文件时间' },
  1173. { key:'isApproval', name: '是否需要审批' },
  1174. { key:'isNeedCertification', name: '是否需要认证' },
  1175. { key:'dutyUser', name: '责任者' },
  1176. { key:'isElement', name: '是否四要素' },
  1177. { key:'action', name: '操作', width: 180 },
  1178. ])
  1179. const setTableUploadColumn = () => {
  1180. if (isBuiltDrawing.value === 2) {
  1181. tableUploadColumn.value = [
  1182. { key:'fileNumber', name: '文件编号' },
  1183. { key:'fileName', name: '文件名称' },
  1184. { key:'fileTime', name: '文件时间' },
  1185. { key:'sheetType', name: '图幅' },
  1186. { key:'sheetSource', name: '图表来源' },
  1187. { key:'drawingNo', name: '图号' },
  1188. { key:'citeChangeNumber', name: '引用变更令编号' },
  1189. { key:'isApproval', name: '是否需要审批' },
  1190. { key:'isNeedCertification', name: '是否需要认证' },
  1191. { key:'dutyUser', name: '责任者' },
  1192. { key:'isElement', name: '是否四要素' },
  1193. { key:'action', name: '操作', width: 180 },
  1194. ]
  1195. sheetTypeStatus()
  1196. sheetSourceStatus()
  1197. } else {
  1198. tableUploadColumn.value = [
  1199. { key:'fileNumber', name: '文件编号' },
  1200. { key:'fileName', name: '文件名称' },
  1201. { key:'fileTime', name: '文件时间' },
  1202. { key:'isApproval', name: '是否需要审批' },
  1203. { key:'isNeedCertification', name: '是否需要认证' },
  1204. { key:'dutyUser', name: '责任者' },
  1205. { key:'isElement', name: '是否四要素' },
  1206. { key:'action', name: '操作', width: 180 },
  1207. ]
  1208. }
  1209. }
  1210. const tableUploadData = ref([])
  1211. //上传的文件结果
  1212. const uploadsChange = (fileId, item) => {
  1213. if (getObjVal(item)) {
  1214. let newArr = tableUploadData.value
  1215. const sheet = sheetType.value, source = sheetSourceType.value
  1216. let name = item['originalName'] || ''
  1217. let fileName = name.substring(0, name.lastIndexOf('.'))
  1218. newArr.push({
  1219. fileUploadId: fileId,
  1220. projectId: projectId.value,
  1221. contractId: contractId.value,
  1222. nodeId: nodeIds.value,
  1223. fileNumber: '',
  1224. fileName: fileName,
  1225. ossFileName: item?.name || '',
  1226. fileTime: null,
  1227. fileUrl: item?.link || '',
  1228. sheetType: sheet.length > 0 ? sheet[0]['dictKey'] || '' : '',
  1229. sheetSource: source.length > 0 ? source[0]['dictKey'] || '' : '',
  1230. drawingNo: '',
  1231. citeChangeNumber: '',
  1232. isApproval: 1,
  1233. isNeedCertification: 1,
  1234. dutyUser: dutyUser.value,
  1235. pdfFileUrl: item?.pdfUrl || '',
  1236. filePage: item?.page || '',
  1237. isElement: 0,
  1238. isUpdateUrl:0,
  1239. fileSize:item?.fileSize,
  1240. })
  1241. //tableUploadData.value = newArr
  1242. tableUploadData.value = arrKeySort(newArr, 'fileUploadId')
  1243. } else {
  1244. console.log(item)
  1245. }
  1246. }
  1247. //表单下拉数据
  1248. const whetherData = ref([
  1249. { label: '不需要', value: 0 },
  1250. { label: '需要', value: 1 },
  1251. ])
  1252. //表格数据排序
  1253. const tableUploadRowSort = (arr) => {
  1254. tableUploadData.value = arr
  1255. }
  1256. //删除
  1257. const delUploadData = async (row, index) => {
  1258. if (row['ossFileName']) {
  1259. row['delBtnLoading'] = true
  1260. await ossApi.removeFile({ fileName: row['ossFileName'] })
  1261. row['delBtnLoading'] = false
  1262. tableUploadData.value.splice(index, 1)
  1263. } else {
  1264. tableUploadData.value.splice(index, 1)
  1265. }
  1266. }
  1267. //批量上传保存
  1268. const uploadSaveLoading = ref(false)
  1269. const batchUploadSave = async () => {
  1270. const rows = tableUploadData.value
  1271. if (rows.length > 0) {
  1272. //验证表单数据
  1273. uploadSaveLoading.value = true
  1274. let isTableRows = false
  1275. for (let i = 0; i < rows.length; i++) {
  1276. // if (!rows[i]['fileNumber']) {
  1277. // rows[i]['isFileNumber'] = true
  1278. // isTableRows = true
  1279. // } else if (!rows[i]['fileName']) {
  1280. // rows[i]['isFileName'] = true
  1281. // isTableRows = true
  1282. // }
  1283. // if (!rows[i]['fileTime']) {
  1284. // rows[i]['isFileTime'] = true
  1285. // isTableRows = true
  1286. // }
  1287. // else
  1288. if (!rows[i]['fileName']) {
  1289. rows[i]['isFileName'] = true
  1290. isTableRows = true
  1291. }
  1292. }
  1293. //判断数据
  1294. if (isTableRows) {
  1295. uploadSaveLoading.value = false
  1296. window.$message?.warning('请先完善表单信息')
  1297. } else {
  1298. if (tableUploadType.value === 'add') {
  1299. await batchUploadSaveApi(rows)
  1300. } else {
  1301. await batchEditSaveApi(rows)
  1302. }
  1303. }
  1304. } else {
  1305. window.$message?.warning('请先上传文件')
  1306. }
  1307. }
  1308. //确认上传保存
  1309. const batchUploadSaveApi = async (rows) => {
  1310. uploadSaveLoading.value = true
  1311. const { error, code } = await archiveFileApi.batchUploadSave({
  1312. list: rows,
  1313. }, false)
  1314. //判断状态
  1315. uploadSaveLoading.value = false
  1316. if (!error && code === 200) {
  1317. window.$message?.success('保存成功')
  1318. batchUploadCancel()
  1319. getTableData()
  1320. } else {
  1321. window.$message?.error('保存失败')
  1322. }
  1323. }
  1324. //取消上传
  1325. const batchUploadCancel = () => {
  1326. tableUploadData.value = []
  1327. uploadSaveLoading.value = false
  1328. uploadsLoading.value = false
  1329. showUploadModal.value = false
  1330. }
  1331. //上传新文件
  1332. // const newUploadsChange = ({fileList}, row) => {
  1333. // if (fileList.length > 0) {
  1334. // tableUploadType.value = 'edit'
  1335. // const item = fileList[0]
  1336. // const name = item['originalName'] || ''
  1337. // const fileName = name.substring(0, name.lastIndexOf("."))
  1338. // //更新数据
  1339. // row.fileName = fileName;
  1340. // row.ossFileName = item?.name || ''
  1341. // row.fileUrl = item?.link || ''
  1342. // row.pdfFileUrl = item?.pdfUrl || ''
  1343. // row.filePage = item?.page || ''
  1344. // row.isUpdateUrl=1
  1345. // }
  1346. // }
  1347. // const newUploadsProgress = (val, row) => {
  1348. // row.newBtnLoading = val
  1349. // }
  1350. //批量编辑
  1351. const batchEditClick = () => {
  1352. const rows = deepClone(tableCheckedKeys.value)
  1353. //判断是否满足条件
  1354. const result = rows.every(({ status })=> {
  1355. return status !== 1 && status !== 2
  1356. })
  1357. //判断状态
  1358. if (result) {
  1359. tableUploadType.value = 'edit'
  1360. setTableUploadColumn()
  1361. uploadSaveLoading.value = false
  1362. tableUploadData.value = rows
  1363. showUploadModal.value = true
  1364. } else {
  1365. window.$message?.warning('已上报或已审批的文件不能编辑')
  1366. }
  1367. }
  1368. //确认编辑上传保存
  1369. const batchEditSaveApi = async (rows) => {
  1370. uploadSaveLoading.value = true
  1371. const { error, code } = await archiveFileApi.batchUpdateSort({
  1372. list: rows,
  1373. }, false)
  1374. //判断状态
  1375. uploadSaveLoading.value = false
  1376. if (!error && code === 200) {
  1377. window.$message?.success('保存成功')
  1378. batchUploadCancel()
  1379. getTableData()
  1380. } else {
  1381. window.$message?.error('保存失败')
  1382. }
  1383. }
  1384. //批量认证
  1385. const CertData = ref([])
  1386. const CertIds = ref([])
  1387. const CertPdf = ref('')
  1388. const CertColumns = [
  1389. { key:'fileName', name: '文件名称' },
  1390. { key:'action', name: '操作', width: 100 },
  1391. ]
  1392. //批量认证弹窗
  1393. const showCertificationModal = ref(false)
  1394. const certificationModalClick = () => {
  1395. const rows = tableCheckedKeys.value
  1396. CertData.value = rows
  1397. CertIds.value = rowsToId(rows)
  1398. CertPdf.value = rows[0]?.pdfFileUrl || ''
  1399. showCertificationModal.value = true
  1400. /*const result = rows.every(({isCertification})=> {
  1401. return isCertification === 0
  1402. })
  1403. if (result) {
  1404. CertData.value = rows
  1405. CertIds.value = rowsToId(rows)
  1406. CertPdf.value = rows[0]?.pdfFileUrl || ''
  1407. showCertificationModal.value = true
  1408. } else {
  1409. window.$message?.warning('已认证的文件不能再认证')
  1410. }*/
  1411. }
  1412. //认证行被点击
  1413. const CertRowClick = ({ row }) => {
  1414. const pdfFileUrl = row?.pdfFileUrl || ''
  1415. if (CertPdf.value !== pdfFileUrl) {
  1416. CertPdf.value = pdfFileUrl
  1417. }
  1418. }
  1419. //认证预览被点击
  1420. const CertRowClick2 = ({ pdfFileUrl }) => {
  1421. const pdfUrl = pdfFileUrl || ''
  1422. if (CertPdf.value !== pdfUrl) {
  1423. CertPdf.value = pdfUrl
  1424. }
  1425. }
  1426. //确认认证
  1427. const CertLoading = ref(false)
  1428. const CertClick = async () => {
  1429. /*CertLoading.value = true
  1430. const {error, code} = await projectScanningApi.batchCertification({
  1431. ids: CertIds.value
  1432. }, false)
  1433. //判断状态
  1434. CertLoading.value = false
  1435. if (!error && code === 200) {
  1436. window.$message?.success('认证成功')
  1437. showCertificationModal.value = false
  1438. getTableData()
  1439. } else {
  1440. window.$message?.error('认证失败')
  1441. }*/
  1442. }
  1443. //名称被点击
  1444. const tableRowName = (row) => {
  1445. if (row['pdfFileUrl']) {
  1446. window.open(row['pdfFileUrl'], '_blank')
  1447. } else {
  1448. window.$message?.warning('文件不存在')
  1449. }
  1450. }
  1451. //左右拖动,改变树形结构宽度
  1452. const leftWidth = ref(382)
  1453. const onmousedown = () => {
  1454. const leftNum = isCollapse.value ? 142 : 272
  1455. document.onmousemove = (ve) => {
  1456. let diffVal = ve.clientX - leftNum
  1457. if (diffVal >= 310 && diffVal <= 900) {
  1458. leftWidth.value = diffVal
  1459. }
  1460. }
  1461. document.onmouseup = () => {
  1462. document.onmousemove = null
  1463. document.onmouseup = null
  1464. }
  1465. }
  1466. </script>
  1467. <style lang="scss" scoped>
  1468. @import '~style/file/scoped/collection.scss';
  1469. .flex-center{
  1470. display: flex;
  1471. align-items: center;
  1472. justify-content: center;
  1473. height: 100%;
  1474. flex-direction: column;
  1475. }
  1476. </style>
  1477. <style lang="scss">
  1478. @import '~style/file/collection.scss';
  1479. .panel-body .el-checkbox{
  1480. height: auto;
  1481. }
  1482. .panel-body .el-radio-group{
  1483. width: auto ;
  1484. }
  1485. .panel-body .el-checkbox.size-xl .el-checkbox__label, .el-radio.size-xl .el-radio__label {
  1486. // font-size: 16px;
  1487. // font-weight: 400;
  1488. // white-space: wrap;
  1489. }
  1490. .panel-body .el-checkbox.size-xl .el-checkbox__label {
  1491. font-size: 16px;
  1492. font-weight: 400;
  1493. white-space: wrap;
  1494. }
  1495. .user{
  1496. margin-top: 10px;
  1497. margin-bottom: 10px;
  1498. }
  1499. </style>