Browse Source

新主题,先不要发版

ZaiZai 1 year ago
parent
commit
0bb45d1be7

+ 122 - 0
src/styles/page/file/collection.scss

@@ -1,3 +1,104 @@
+.flex-center{
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    height: 100%;
+    flex-direction: column;
+}
+
+.hc-moves-transfer-box {
+    position: relative;
+    display: flex;
+    height: 100%;
+    align-items: center;
+    .hc-moves-transfer-panel {
+        width: 50%;
+        position: relative;
+        height: 100%;
+        background: #ffffff;
+        display: inline-block;
+        text-align: left;
+        border: 1px solid #ebeef5;
+        border-radius: 4px;
+        .panel-header {
+            position: relative;
+            background: #f5f7fa;
+            display: flex;
+            align-items: center;
+            height: 48px;
+            padding: 0 16px;
+            border-bottom: 1px solid #ebeef5;
+            border-radius: 4px 4px 0 0;
+            .panel-header-label {
+                position: relative;
+                flex: 1;
+            }
+            .panel-header-extra {
+                color: #aaaaaa;
+            }
+        }
+        .panel-body {
+            position: relative;
+            padding: 16px;
+            height: calc(100% - 48px);
+            .hc-file-checkbox {
+                position: relative;
+            }
+            .hc-file-checkbox + .hc-file-checkbox {
+                margin-top: 16px;
+            }
+        }
+    }
+    .hc-moves-transfer-buttons {
+        display: inline-block;
+        vertical-align: middle;
+        padding: 0 16px;
+    }
+}
+.hc-table-h {
+    position: relative;
+    height: calc(100% - 44px);
+}
+.hc-card-body-flex {
+    position: relative;
+    display: flex;
+    width: 100%;
+    height: 100%;
+    .flex-table {
+        position: relative;
+        margin-right: 24px;
+        width: 40%;
+        height: 100%;
+    }
+    .flex-iframe {
+        flex: 1;
+        position: relative;
+        height: 100%;
+        border:1px solid #777;
+        overflow: hidden;
+        iframe {
+            height: 100%;
+        }
+        &.hc-no-table-form {
+            display: flex;
+            justify-content: center;
+            align-items: center;
+            .table-form-no {
+                position: relative;
+                img {
+                    width: 350px;
+                }
+                .desc {
+                    text-align: center;
+                    font-size: 20px;
+                    color: #aaa;
+                }
+            }
+        }
+    }
+}
+
+
 .hc-sorting-modal-collapse {
     position: relative;
     height: 100%;
@@ -63,7 +164,28 @@
         }
     }
 }
+.panel-body .el-checkbox{
+    height: auto;
+
+}
+.panel-body .el-radio-group{
+    width: auto ;
 
+}
+.panel-body .el-checkbox.size-xl .el-checkbox__label, .el-radio.size-xl .el-radio__label {
+    // font-size: 16px;
+    // font-weight: 400;
+    // white-space: wrap;
+}
+.panel-body .el-checkbox.size-xl .el-checkbox__label {
+    font-size: 16px;
+    font-weight: 400;
+    white-space: wrap;
+}
+.user{
+    margin-top: 10px;
+    margin-bottom: 10px;
+}
 
 html.dark {
     .hc-sorting-modal-collapse .el-collapse{

+ 0 - 91
src/styles/page/file/scoped/collection.scss

@@ -1,91 +0,0 @@
-.hc-moves-transfer-box {
-    position: relative;
-    display: flex;
-    height: 100%;
-    align-items: center;
-    .hc-moves-transfer-panel {
-        width: 50%;
-        position: relative;
-        height: 100%;
-        background: #ffffff;
-        display: inline-block;
-        text-align: left;
-        border: 1px solid #ebeef5;
-        border-radius: 4px;
-        .panel-header {
-            position: relative;
-            background: #f5f7fa;
-            display: flex;
-            align-items: center;
-            height: 48px;
-            padding: 0 16px;
-            border-bottom: 1px solid #ebeef5;
-            border-radius: 4px 4px 0 0;
-            .panel-header-label {
-                position: relative;
-                flex: 1;
-            }
-            .panel-header-extra {
-                color: #aaaaaa;
-            }
-        }
-        .panel-body {
-            position: relative;
-            padding: 16px;
-            height: calc(100% - 48px);
-            .hc-file-checkbox {
-                position: relative;
-            }
-            .hc-file-checkbox + .hc-file-checkbox {
-                margin-top: 16px;
-            }
-        }
-    }
-    .hc-moves-transfer-buttons {
-        display: inline-block;
-        vertical-align: middle;
-        padding: 0 16px;
-    }
-}
-.hc-table-h {
-    position: relative;
-    height: calc(100% - 44px);
-}
-.hc-card-body-flex {
-    position: relative;
-    display: flex;
-    width: 100%;
-    height: 100%;
-    .flex-table {
-        position: relative;
-        margin-right: 24px;
-        width: 40%;
-        height: 100%;
-    }
-    .flex-iframe {
-        flex: 1;
-        position: relative;
-        height: 100%;
-        border:1px solid #777;
-        overflow: hidden;
-        iframe {
-            height: 100%;
-        }
-        &.hc-no-table-form {
-            display: flex;
-            justify-content: center;
-            align-items: center;
-            .table-form-no {
-                position: relative;
-                img {
-                    width: 350px;
-                }
-                .desc {
-                    text-align: center;
-                    font-size: 20px;
-                    color: #aaa;
-                }
-            }
-        }
-    }
-}

+ 7 - 172
src/views/file/collection.vue

@@ -1,136 +1,5 @@
 <template>
-    <div class="hc-page-layout-box hc-file-collection">
-        <div class="hc-layout-left-box" :style="`width:${leftWidth}px;`">
-            <div class="hc-project-box">
-                <div class="hc-project-icon-box">
-                    <HcIcon name="stack" />
-                </div>
-                <div class="ml-2 project-name-box">
-                    <span class="text-xl text-cut project-alias">{{ projectInfo.projectAlias }}</span>
-                    <div class="text-xs text-cut project-name">
-                        {{ projectInfo.name }}
-                    </div>
-                </div>
-            </div>
-            <div v-loading="treeLoading" class="hc-tree-box" element-loading-text="加载中...">
-                <el-scrollbar>
-                    <HcTree
-                        ref="treeRef"
-                        :project-id="projectId"
-                        :contract-id="contractId"
-                        :auto-expand-keys="treeAutoExpandKeys"
-                        :menus="ElTreeMenu"
-                        @nodeTap="projectTreeClick"
-                        @nodeLoading="treeNodeLoading"
-                        @menuTap="ElTreeMenuClick"
-                    />
-                </el-scrollbar>
-            </div>
-            <!-- 左右拖动 -->
-            <div class="horizontal-drag-line" @mousedown="onmousedown" />
-        </div>
-        <div class="hc-page-content-box">
-            <HcCard>
-                <template #header>
-                    <HcTooltip keys="file_collection_btn_upload_scanned_files">
-                        <el-button type="primary" hc-btn @click="uploadModalClick">
-                            <HcIcon name="qr-scan" />
-                            <span>上传扫描文件</span>
-                        </el-button>
-                    </HcTooltip>
-                    <HcTooltip keys="file_collection_btn_sorting">
-                        <el-button type="primary" hc-btn @click="sortingClick">
-                            <HcIcon name="archive" />
-                            <span>分盒整理</span>
-                        </el-button>
-                    </HcTooltip>
-                    <HcTooltip keys="file_collection_btn_download">
-                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0">
-                            <HcIcon name="download" />
-                            <span>下载</span>
-                        </el-button>
-                    </HcTooltip>
-                    <HcTooltip keys="file_collection_btn_certified">
-                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" @click="certificationModalClick">
-                            <HcIcon name="vip-diamond" />
-                            <span>认证</span>
-                        </el-button>
-                    </HcTooltip>
-                    <HcTooltip keys="file_collection_btn_report">
-                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" @click="reportModalClick">
-                            <HcIcon name="send-plane-2" />
-                            <span>上报</span>
-                        </el-button>
-                    </HcTooltip>
-                    <HcTooltip keys="file_collection_btn_edit">
-                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" @click="batchEditClick">
-                            <HcIcon name="edit" />
-                            <span>编辑</span>
-                        </el-button>
-                    </HcTooltip>
-                    <HcTooltip keys="file_collection_btn_repeal">
-                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" @click="repealModalClick">
-                            <HcIcon name="delete-back-2" />
-                            <span>废除</span>
-                        </el-button>
-                    </HcTooltip>
-                    <HcTooltip keys="file_collection_btn_del">
-                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" @click="delModalClick">
-                            <HcIcon name="delete-bin" />
-                            <span>删除</span>
-                        </el-button>
-                    </HcTooltip>
-                </template>
-                <template #extra>
-                    <HcTooltip keys="file_collection_btn_moves">
-                        <el-button hc-btn @click="movesClick">
-                            <HcIcon type="primary" name="arrow-left-right" />
-                            <span>跨目录移动</span>
-                        </el-button>
-                    </HcTooltip>
-                </template>
-                <template #search>
-                    <div class="w-40">
-                        <el-select v-model="searchForm.isApprovalValue" placeholder="审批状态" clearable>
-                            <el-option v-for="item in approvalStatus" :key="item.value" :label="item.label" :value="item.value" />
-                        </el-select>
-                    </div>
-                    <div class="w-40 ml-2">
-                        <el-select v-model="searchForm.isCertificationValue" placeholder="认证状态" clearable>
-                            <el-option v-for="item in certifiedStatus" :key="item.value" :label="item.label" :value="item.value" />
-                        </el-select>
-                    </div>
-                    <div class="w-64 ml-2">
-                        <el-input v-model="searchForm.queryValue" placeholder="请输入名称关键词检索" clearable @keyup="keyUpEvent" />
-                    </div>
-                    <div class="ml-2">
-                        <el-button type="primary" @click="searchClick">
-                            <HcIcon name="search-2" />
-                            <span>搜索</span>
-                        </el-button>
-                    </div>
-                </template>
-                <HcTable ref="tableRef" :column="tableColumn" :datas="tableData" :loading="tableLoading" is-check @selection-change="tableSelection">
-                    <template #table-column-header-num>
-                        <HcTooltip keys="file_collection_btn_sort">
-                            <span class="text-link text-lg" @click="tableSortClick">
-                                <HcIcon name="arrow-up-down" />
-                            </span>
-                        </HcTooltip>
-                    </template>
-                    <template #fileName="{ row }">
-                        <span class="text-link" @click="tableRowName(row)">{{ row?.fileName }}</span>
-                    </template>
-                    <template #sourceType="{ row }">
-                        <span>{{ row?.sourceType === 1 ? '原生' : '数字化' }}</span>
-                    </template>
-                </HcTable>
-                <template #action>
-                    <HcPages :pages="searchForm" @change="pageChange" />
-                </template>
-            </HcCard>
-        </div>
-
+    <hc-body class="hc-file-collection-page">
         <!-- 预组卷整理 -->
         <HcDialog :show="sortingModal" title="预组卷整理" widths="850px" is-table is-row-footer @close="sortingModalClose">
             <div class="hc-sorting-modal-collapse">
@@ -429,7 +298,7 @@
 
         <!-- 批量编辑 -->
         <HcReport :show="isReport" :data="reportData" @finish="reportFinish" @hide="isReport = false" />
-    </div>
+    </hc-body>
 </template>
 
 <script setup>
@@ -536,7 +405,7 @@ const newHcUploadFileSuccess = (res, row) => {
     nextTick(()=>{
         HcUploadFileRef?.value.setModalShow(false)
     })
-  
+
 
 
 }
@@ -1570,7 +1439,7 @@ const certificationModalClick = () => {
         }
     }
 
- 
+
 }
 
 //认证行被点击
@@ -1615,7 +1484,7 @@ const tableRowName = (row) => {
             window.open(row['eVisaFile'], '_blank')
         } else if (row['pdfFileUrl']) {
             window.open(row['pdfFileUrl'], '_blank')
-         
+
         } else {
             window.$message?.warning('文件不存在')
         }
@@ -1627,7 +1496,7 @@ const tableRowName = (row) => {
         }
     }
 
-  
+
 }
 
 //上报
@@ -1652,7 +1521,7 @@ const reportModalClick = () => {
             return false
         }
     }
-   
+
     //展示上报弹窗
     reportData.value = rows
     isReport.value = true
@@ -1681,40 +1550,6 @@ const onmousedown = () => {
 }
 </script>
 
-<style lang="scss" scoped>
-@import '~style/file/scoped/collection.scss';
-
-.flex-center{
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    height: 100%;
-    flex-direction: column;
-}
-</style>
-
 <style lang="scss">
 @import '~style/file/collection.scss';
-.panel-body .el-checkbox{
-    height: auto;
-
-}
-.panel-body .el-radio-group{
-    width: auto ;
-
-}
-.panel-body .el-checkbox.size-xl .el-checkbox__label, .el-radio.size-xl .el-radio__label {
-    // font-size: 16px;
-    // font-weight: 400;
-    // white-space: wrap;
-}
-.panel-body .el-checkbox.size-xl .el-checkbox__label {
-    font-size: 16px;
-    font-weight: 400;
-    white-space: wrap;
-}
-.user{
-    margin-top: 10px;
-    margin-bottom: 10px;
-}
 </style>

+ 1720 - 0
src/views/file/collection_aa.vue

@@ -0,0 +1,1720 @@
+<template>
+    <div class="hc-page-layout-box hc-file-collection">
+        <div class="hc-layout-left-box" :style="`width:${leftWidth}px;`">
+            <div class="hc-project-box">
+                <div class="hc-project-icon-box">
+                    <HcIcon name="stack" />
+                </div>
+                <div class="ml-2 project-name-box">
+                    <span class="text-xl text-cut project-alias">{{ projectInfo.projectAlias }}</span>
+                    <div class="text-xs text-cut project-name">
+                        {{ projectInfo.name }}
+                    </div>
+                </div>
+            </div>
+            <div v-loading="treeLoading" class="hc-tree-box" element-loading-text="加载中...">
+                <el-scrollbar>
+                    <HcTree
+                        ref="treeRef"
+                        :project-id="projectId"
+                        :contract-id="contractId"
+                        :auto-expand-keys="treeAutoExpandKeys"
+                        :menus="ElTreeMenu"
+                        @nodeTap="projectTreeClick"
+                        @nodeLoading="treeNodeLoading"
+                        @menuTap="ElTreeMenuClick"
+                    />
+                </el-scrollbar>
+            </div>
+            <!-- 左右拖动 -->
+            <div class="horizontal-drag-line" @mousedown="onmousedown" />
+        </div>
+        <div class="hc-page-content-box">
+            <HcCard>
+                <template #header>
+                    <HcTooltip keys="file_collection_btn_upload_scanned_files">
+                        <el-button type="primary" hc-btn @click="uploadModalClick">
+                            <HcIcon name="qr-scan" />
+                            <span>上传扫描文件</span>
+                        </el-button>
+                    </HcTooltip>
+                    <HcTooltip keys="file_collection_btn_sorting">
+                        <el-button type="primary" hc-btn @click="sortingClick">
+                            <HcIcon name="archive" />
+                            <span>分盒整理</span>
+                        </el-button>
+                    </HcTooltip>
+                    <HcTooltip keys="file_collection_btn_download">
+                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0">
+                            <HcIcon name="download" />
+                            <span>下载</span>
+                        </el-button>
+                    </HcTooltip>
+                    <HcTooltip keys="file_collection_btn_certified">
+                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" @click="certificationModalClick">
+                            <HcIcon name="vip-diamond" />
+                            <span>认证</span>
+                        </el-button>
+                    </HcTooltip>
+                    <HcTooltip keys="file_collection_btn_report">
+                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" @click="reportModalClick">
+                            <HcIcon name="send-plane-2" />
+                            <span>上报</span>
+                        </el-button>
+                    </HcTooltip>
+                    <HcTooltip keys="file_collection_btn_edit">
+                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" @click="batchEditClick">
+                            <HcIcon name="edit" />
+                            <span>编辑</span>
+                        </el-button>
+                    </HcTooltip>
+                    <HcTooltip keys="file_collection_btn_repeal">
+                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" @click="repealModalClick">
+                            <HcIcon name="delete-back-2" />
+                            <span>废除</span>
+                        </el-button>
+                    </HcTooltip>
+                    <HcTooltip keys="file_collection_btn_del">
+                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" @click="delModalClick">
+                            <HcIcon name="delete-bin" />
+                            <span>删除</span>
+                        </el-button>
+                    </HcTooltip>
+                </template>
+                <template #extra>
+                    <HcTooltip keys="file_collection_btn_moves">
+                        <el-button hc-btn @click="movesClick">
+                            <HcIcon type="primary" name="arrow-left-right" />
+                            <span>跨目录移动</span>
+                        </el-button>
+                    </HcTooltip>
+                </template>
+                <template #search>
+                    <div class="w-40">
+                        <el-select v-model="searchForm.isApprovalValue" placeholder="审批状态" clearable>
+                            <el-option v-for="item in approvalStatus" :key="item.value" :label="item.label" :value="item.value" />
+                        </el-select>
+                    </div>
+                    <div class="w-40 ml-2">
+                        <el-select v-model="searchForm.isCertificationValue" placeholder="认证状态" clearable>
+                            <el-option v-for="item in certifiedStatus" :key="item.value" :label="item.label" :value="item.value" />
+                        </el-select>
+                    </div>
+                    <div class="w-64 ml-2">
+                        <el-input v-model="searchForm.queryValue" placeholder="请输入名称关键词检索" clearable @keyup="keyUpEvent" />
+                    </div>
+                    <div class="ml-2">
+                        <el-button type="primary" @click="searchClick">
+                            <HcIcon name="search-2" />
+                            <span>搜索</span>
+                        </el-button>
+                    </div>
+                </template>
+                <HcTable ref="tableRef" :column="tableColumn" :datas="tableData" :loading="tableLoading" is-check @selection-change="tableSelection">
+                    <template #table-column-header-num>
+                        <HcTooltip keys="file_collection_btn_sort">
+                            <span class="text-link text-lg" @click="tableSortClick">
+                                <HcIcon name="arrow-up-down" />
+                            </span>
+                        </HcTooltip>
+                    </template>
+                    <template #fileName="{ row }">
+                        <span class="text-link" @click="tableRowName(row)">{{ row?.fileName }}</span>
+                    </template>
+                    <template #sourceType="{ row }">
+                        <span>{{ row?.sourceType === 1 ? '原生' : '数字化' }}</span>
+                    </template>
+                </HcTable>
+                <template #action>
+                    <HcPages :pages="searchForm" @change="pageChange" />
+                </template>
+            </HcCard>
+        </div>
+
+        <!-- 预组卷整理 -->
+        <HcDialog :show="sortingModal" title="预组卷整理" widths="850px" is-table is-row-footer @close="sortingModalClose">
+            <div class="hc-sorting-modal-collapse">
+                <el-collapse v-model="sortingActiveKey">
+                    <template v-for="(item, index) in sortingItemData" :key="index">
+                        <el-collapse-item :id="`item-${index}`" :name="`item-${index}`" disabled>
+                            <template #title>
+                                <div class="hc-collapse-item-header">
+                                    <div class="item-index">
+                                        盒{{ index + 1 }}
+                                    </div>
+                                    <el-divider direction="vertical" />
+                                    <div class="item-input">
+                                        <el-input
+                                            v-model="item.boxName"
+                                            :class="item.isName ? 'is-error' : ''"
+                                            placeholder="请输入案卷题名"
+                                            @input="tableIsInput($event, item, 'isName')"
+                                            @change="tableIsInput($event, item, 'isName')"
+                                        />
+                                    </div>
+                                    <el-divider direction="vertical" />
+                                    <div class="item-action">
+                                        <el-button type="primary" @click="sortingSelectFile(item, index)">
+                                            选择文件
+                                        </el-button>
+                                        <el-button type="danger" @click="sortingDelData(item, index)">
+                                            删除
+                                        </el-button>
+                                    </div>
+                                </div>
+                            </template>
+                            <HcTable
+                                ref="sorTableRef" :column="sortingTableColumn" :datas="item.list" :loading="sortingTableLoading" is-check @selection-change="rows => sortingTableSelection(rows, item.list, index)"
+                                @single-select="singleCheck"
+                            >
+                                <template #name="{ row }">
+                                    <span class="text-link">{{ row?.fileName }}</span>
+                                </template>
+                            </HcTable>
+                        </el-collapse-item>
+                    </template>
+                </el-collapse>
+            </div>
+            <template #leftRowFooter>
+                <el-button type="primary" hc-btn @click="addSortingModalClick">
+                    <HcIcon name="add" />
+                    <span>添加分盒</span>
+                </el-button>
+            </template>
+            <template #rightRowFooter>
+                <el-button hc-btn @click="sortingModalClose">
+                    <HcIcon name="close" />
+                    <span>取消</span>
+                </el-button>
+                <el-button type="primary" hc-btn :loading="sortingModalLoading" @click="sortingModalSave">
+                    <HcIcon name="check" />
+                    <span>确认</span>
+                </el-button>
+            </template>
+        </HcDialog>
+
+        <!-- 预组卷整理 无数据 -->
+        <HcDialog :show="sortingNoneModal" title="预组卷整理" widths="850px" is-table is-row-footer @close="sortingNoneModalClose">
+            <div class="flex-center">
+                <i class="el-icon" data-v-029747aa="" style="font-size: 200px;color:#81b337;cursor: pointer;" @click="toSortingModal">
+                    <svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" data-v-029747aa="">
+                        <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" />
+                    </svg>
+                </i>
+                <span>添加分盒</span>
+            </div>
+        </HcDialog>
+
+        <!-- 跨目录移动 -->
+        <HcDialog :show="movesModal" title="跨目录移动" widths="990px" is-table :loading="movesModalLoading" @close="movesModalClose" @save="movesModalSave">
+            <div class="hc-moves-transfer-box">
+                <div class="hc-moves-transfer-panel">
+                    <div class="panel-header">
+                        <div class="panel-header-label">
+                            <el-checkbox v-model="movesCheckAll" class="size-xl space" :indeterminate="isIndeterminate" @change="handleCheckAllChange">
+                                选择需要迁移的文件
+                            </el-checkbox>
+                        </div>
+                        <div class="panel-header-extra">
+                            {{ checkedMoves.length }}/{{ fileDatasList.length }}
+                        </div>
+                    </div>
+                    <div class="panel-body">
+                        <el-scrollbar v-loading="fileDatasListLoading">
+                            <el-checkbox-group v-model="checkedMoves" @change="handleCheckedMovesChange">
+                                <!-- <div v-for="item in fileDatasList" :key="item.id" class="hc-file-checkbox">
+                                    <el-checkbox class="size-xl space" :label="item">
+                                        {{ item.fileName }}
+                                    </el-checkbox>
+                                </div> -->
+                                <recycle-scroller
+                                    class="virtual-list"
+                                    :buffer="1000"
+                                    :prerender="200"
+                                    style="height: 900px"
+                                    :item-size="110"
+                                    key-field="id"
+                                    :items="fileDatasList"
+                                >
+                                    <template #default="{ item, index }">
+                                        <div :key="index">
+                                            <el-checkbox class="size-xl space mt-5 " :label="item">
+                                                {{ item.fileName }}
+                                            </el-checkbox>
+                                        </div>
+                                    </template>
+                                </recycle-scroller>
+                            </el-checkbox-group>
+                        </el-scrollbar>
+                    </div>
+                </div>
+                <div class="hc-moves-transfer-buttons">
+                    <HcIcon type="primary" name="arrow-right-double" style="font-size: 22px;" />
+                </div>
+                <div class="hc-moves-transfer-panel">
+                    <div class="panel-header">
+                        选择移动目录
+                    </div>
+                    <div v-loading="treePanelLoading" class="panel-body">
+                        <el-scrollbar>
+                            <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" />
+                        </el-scrollbar>
+                    </div>
+                </div>
+            </div>
+        </HcDialog>
+
+        <!-- 调整排序 -->
+        <HcDialog :show="sortModal" title="调整排序" widths="80vw" is-table is-row-footer @close="sortModalClose">
+            <el-alert title="可拖动排序,也可在后面点击图标,切换排序" type="error" :closable="false" />
+            <div class="hc-table-h">
+                <HcTable
+                    ui="hc-table-row-drop" is-row-drop quick-sort
+                    :column="sortTableColumn" :datas="sortTableData" :loading="sortTableLoading"
+                    @row-drop="sortTableRowDrop" @row-sort="sortTableRowDrop"
+                >
+                    <template #key2="{ row }">
+                        <span class="text-link">{{ row?.key2 }}</span>
+                    </template>
+                    <template #action="{ index }">
+                        <span class="text-link text-xl" @click="upSortClick(index)">
+                            <HcIcon name="arrow-up" fill />
+                        </span>
+                        <span class="text-link text-xl ml-2" @click="downSortClick(index)">
+                            <HcIcon name="arrow-down" fill />
+                        </span>
+                    </template>
+                </HcTable>
+            </div>
+            <template #leftRowFooter>
+                <el-button hc-btn @click="sortModalClose">
+                    <HcIcon name="close" />
+                    <span>取消</span>
+                </el-button>
+                <el-button type="primary" hc-btn :loading="sortModalLoading" @click="sortModalSave">
+                    <HcIcon name="check" />
+                    <span>确认</span>
+                </el-button>
+            </template>
+            <template #rightRowFooter>
+                <HcPages :pages="sortSearchForm" :sizes="[10, 20, 50, 100, 200, 300, 400, 500, 600]" @change="sortPageChange" />
+            </template>
+        </HcDialog>
+
+        <!-- 新增编辑文件 -->
+        <HcDialog :show="showUploadModal" title="上传工程文件" widths="90vw" is-table @close="uploadModalClose">
+            <HcTable ui="hc-form-table" is-sort :column="tableUploadColumn" :datas="tableUploadData" :loading="uploadSaveLoading" @row-sort="tableUploadRowSort">
+                <template #fileNumber="{ row }">
+                    <!-- <el-input v-model="row.fileNumber" :class="row['isFileNumber'] ? 'is-error' : ''" @input="tableIsInput($event, row, 'isFileNumber')"/> -->
+                    <el-input v-model="row.fileNumber" />
+                </template>
+                <template #fileName="{ row }">
+                    <el-input v-model="row.fileName" :class="row.isFileName ? 'is-error' : ''" @input="tableIsInput($event, row, 'isFileName')" />
+                </template>
+                <template #fileTime="{ row }">
+                    <el-date-picker v-model="row.fileTime" type="date" format="YYYYMMDD" value-format="YYYYMMDD" :clearable="false" />
+                    <!-- <el-input v-model="row.fileTime" :class="row['isFileTime'] ? 'is-error' : ''" @input="tableIsInput($event, row, 'isFileTime')"/> -->
+                </template>
+                <template v-if="isBuiltDrawing === 2" #sheetType="{ row }">
+                    <el-select v-model="row.sheetType">
+                        <el-option v-for="item in sheetType" :key="item.dictKey" :label="item.dictValue" :value="item.dictKey" />
+                    </el-select>
+                </template>
+                <template v-if="isBuiltDrawing === 2" #sheetSource="{ row }">
+                    <el-select v-model="row.sheetSource">
+                        <el-option v-for="item in sheetSourceType" :key="item.dictKey" :label="item.dictValue" :value="item.dictKey" />
+                    </el-select>
+                </template>
+                <template v-if="isBuiltDrawing === 2" #drawingNo="{ row }">
+                    <el-input v-model="row.drawingNo" />
+                </template>
+                <template v-if="isBuiltDrawing === 2" #citeChangeNumber="{ row }">
+                    <el-input v-model="row.citeChangeNumber" />
+                </template>
+                <template #isApproval="{ row }">
+                    <el-select v-model="row.isApproval">
+                        <el-option v-for="item in whetherData" :key="item.value" :label="item.label" :value="item.value" />
+                    </el-select>
+                </template>
+                <template #isNeedCertification="{ row }">
+                    <el-select v-model="row.isNeedCertification">
+                        <el-option v-for="item in whetherData" :key="item.value" :label="item.label" :value="item.value" />
+                    </el-select>
+                </template>
+                <template #dutyUser="{ row }">
+                    <el-input v-model="row.dutyUser" />
+                </template>
+                <template #isElement="{ row }">
+                    <el-select v-model="row.isElement">
+                        <el-option label="是" :value="1" />
+                        <el-option label="否" :value="0" />
+                    </el-select>
+                </template>
+                <template #action="{ row, index }">
+                    <!-- <HcFileUpload1 v-if="tableUploadType== 'edit'" @change="newUploadsChange($event, row)" style="display:inline-block"
+                                   @progress="newUploadsProgress($event, row)">
+                            <el-button :loading="row['newBtnLoading']" plain size="small" type="primary">替换</el-button>
+                    </HcFileUpload1> -->
+                    <HcUploadFile v-if="tableUploadType == 'edit'" ref="HcUploadFileRef" :options="UploadFileOptions" style="display:inline-block" @progress="HcUploadFileProgress" @success="newHcUploadFileSuccess($event, row)">
+                        <el-button :loading="row.newBtnLoading" plain size="small" type="primary">
+                            替换
+                        </el-button>
+                    </HcUploadFile>
+                    <el-button type="danger" plain size="small" :loading="row.delBtnLoading" class="ml-2" @click="delUploadData(row, index)">
+                        删除
+                    </el-button>
+                </template>
+            </HcTable>
+            <template #footer>
+                <div class="lr-dialog-footer">
+                    <div class="left flex items-center">
+                        <el-button v-if="tableUploadType == 'add'" type="primary" hc-btn @click="uploadFileClick">
+                            <HcIcon name="add-circle" />
+                            <span>新增上传</span>
+                        </el-button>
+                    </div>
+                    <div class="right">
+                        <el-button size="large" :disabled="uploadsLoading" @click="batchUploadCancel">
+                            <HcIcon name="close" />
+                            <span>取消</span>
+                        </el-button>
+                        <el-button type="primary" hc-btn :disabled="uploadsLoading" :loading="uploadSaveLoading" @click="batchUploadSave">
+                            <HcIcon name="save" />
+                            <span>提交保存</span>
+                        </el-button>
+                    </div>
+                </div>
+            </template>
+        </HcDialog>
+
+        <!-- 批量认证 -->
+        <el-dialog v-model="showCertificationModal" title="批量认证" width="80vw" class="hc-modal-border hc-modal-table">
+            <div class="hc-card-body-flex">
+                <div class="flex-table">
+                    <HcTable ui="hc-form-table" :column="CertColumns" :datas="CertData" @row-click="CertRowClick">
+                        <template #action="{ row, index }">
+                            <el-button type="primary" plain size="small" @click.stop="CertRowClick2(row)">
+                                预览
+                            </el-button>
+                        </template>
+                    </HcTable>
+                </div>
+                <div v-if="CertPdf" class="flex-iframe">
+                    <iframe allow="display-capture" width="100%" height="100%" frameborder="1" :src="CertPdf" />
+                </div>
+                <div v-else class="flex-iframe hc-no-table-form">
+                    <div class="table-form-no">
+                        <img :src="notableform" alt="">
+                        <div class="desc">
+                            暂无 PDF 数据
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <template #footer>
+                <div class="dialog-footer">
+                    <el-button size="large" @click="showCertificationModal = false">
+                        <HcIcon name="close" />
+                        <span>取消</span>
+                    </el-button>
+                    <el-button type="primary" hc-btn :loading="CertLoading" @click="CertClick">
+                        <HcIcon name="save" />
+                        <span>确认认证</span>
+                    </el-button>
+                </div>
+            </template>
+        </el-dialog>
+
+        <HcUploadFile ref="HcUploadFileRef" :options="UploadFileOptions" @progress="HcUploadFileProgress" @success="HcUploadFileSuccess" @finish="HcUploadFileFinish" />
+
+        <!-- 批量编辑 -->
+        <HcReport :show="isReport" :data="reportData" @finish="reportFinish" @hide="isReport = false" />
+    </div>
+</template>
+
+<script setup>
+import { useAppStore } from '~src/store'
+import { getStoreValue, setStoreValue } from '~src/utils/storage'
+import { nextTick, onMounted, ref, watch } from 'vue'
+import HcTree from '~src/components/tree/hc-tree.vue'
+import HcReport from './components/HcReport.vue'
+import notableform from '~src/assets/view/notableform.svg'
+import { rowsToId } from '~uti/tools'
+import { delMessageV2 } from '~com/message/index.js'
+import archiveFileApi from '~api/archiveFile/archiveFile'
+import tasksFlowApi from '~api/tasks/flow'
+import { arrKeySort, arrToId, deepClone, getArrValue, getObjVal } from 'js-fast-way'
+import { getTokenHeader } from '~src/api/request/header'
+import tasksApi from '~api/tasks/data'
+import ossApi from '~api/oss'
+
+//变量
+const useAppState = useAppStore()
+const projectId = ref(useAppState.getProjectId)
+const contractId = ref(useAppState.getContractId)
+const projectInfo = ref(useAppState.getProjectInfo)
+
+const isCollapse = ref(useAppState.getCollapse)
+const HcUploadFileRef = ref(null)
+
+//上传进度
+const uploadsLoading = ref(false)
+
+const treeRef = ref(null)
+
+//监听
+watch(() => [
+    useAppState.getCollapse,
+], ([Collapse]) => {
+    isCollapse.value = Collapse
+})
+
+//渲染完成
+onMounted(() => {
+    treeLoading.value = true
+    setTableColumns()
+})
+//设置树菜单数据
+const ElTreeMenu = ref([
+    { icon: 'add-circle', label: '新增', key: 'add' },
+    { icon: 'draft', label: '编辑', key: 'edit' },
+    { icon: 'delete-bin', label: '删除', key: 'del' },
+    { icon: 'refresh', label: '目录同步', key: 'sync' },
+    { icon: 'sort-asc', label: '排序', key: 'sort' },
+])
+//上传配置
+const UploadFileOptions = {
+    headers: getTokenHeader(),
+}
+
+const dutyUser = ref('')
+//设置责任者
+const setdutyUser = async ()=>{
+    const { error, code, data } = await archiveFileApi.getDutyUser({
+        contractId: treecontractId.value,
+        projectId:projectId.value,
+    })
+    if (!error && code === 200) {
+        if (data?.contractType === 1) {
+            dutyUser.value = data?.constructionUnitName || ''
+        } else if (data?.contractType === 2) {
+            dutyUser.value = data?.supervisionUnitName || ''
+        } else if (data?.contractType === 3) {
+            dutyUser.value = data?.contractorUnitName || ''
+        }
+    }
+}
+
+//打开文件选择框
+const uploadFileClick = () => {
+    HcUploadFileRef?.value?.cancelUpload()
+    HcUploadFileRef?.value.selectFile()
+}
+
+// 文件上传进度
+const HcUploadFileProgress = () => {
+    uploadsLoading.value = true
+}
+// 文件上传成功的回调
+const HcUploadFileSuccess = (res) => {
+    console.log('文件上传成功', res)
+    uploadsLoading.value = false
+    uploadsChange(res.id, res.resData)
+
+}
+//替换文件
+const newHcUploadFileSuccess = (res, row) => {
+    let item = res.resData
+    //更新数据
+    row.fileName = item?.originalName
+    row.ossFileName = item?.name || ''
+    row.fileUrl = item?.link || ''
+    row.pdfFileUrl = item?.pdfUrl || ''
+    row.filePage = item?.page || ''
+    row.isUpdateUrl = 1
+    uploadsLoading.value = false
+    nextTick(()=>{
+        HcUploadFileRef?.value.setModalShow(false)
+    })
+  
+
+
+}
+
+// 文件全部上传成功
+const HcUploadFileFinish = () => {
+    uploadsLoading.value = false
+    HcUploadFileRef?.value.setModalShow(false)
+}
+
+//树加载
+const treeLoading = ref(false)
+const treeNodeLoading = () => {
+    treeLoading.value = false
+}
+
+const treePanelLoading = ref(false)
+const panelTreeLoading = () => {
+    treePanelLoading.value = false
+}
+
+//审批状态
+const approvalStatus = ref([
+    { label: '未上报', value: '0' },
+    { label: '待审批', value: '1' },
+    { label: '已审批', value: '2' },
+])
+
+//认证状态
+const certifiedStatus = ref([
+    { label: '已认证', value: '1' },
+    { label: '未认证', value: '0' },
+])
+
+//搜索表单
+const searchForm = ref({
+    nodeIds:'',
+    approval: null, certified: null, queryValue: null,
+    current: 1, size: 20, total: 0,
+})
+
+//树相关的变量
+const isBuiltDrawing = ref(0)
+const isStorageNode = ref(0)
+const nodeIds = ref('')
+const treecontractId = ref('')
+//自动展开缓存
+const treeAutoExpandKeys = ref(getStoreValue('wbsTreeExpandKeys') || [])
+const projectTreeClick = ({ data, keys }) => {
+    setStoreValue('wbsTreeExpandKeys', keys)
+    treeAutoExpandKeys.value = keys || []
+    nodeIds.value = data.id || ''
+    isStorageNode.value = data['isStorageNode'] || 0
+    treecontractId.value = data?.contractId || ''
+
+    //设置搜索数据
+    searchForm.value.current = 1
+    searchForm.value.nodeIds = data.id || ''
+
+    sortSearchForm.value.nodeIds = data.id || ''
+    isBuiltDrawing.value = data.storageType
+    getTableData()
+}
+//树菜单被点击
+const ElTreeMenuClick = async ({ data, keys }) => {
+    setStoreValue('wbsTreeExpandKeys', keys)
+    treeAutoExpandKeys.value = keys || []
+    if (data?.extType === 2) {
+        ElTreeMenu.value = [
+            { icon: 'add-circle', label: '新增', key: 'add' },
+            { icon: 'draft', label: '编辑', key: 'edit' },
+            { icon: 'delete-bin', label: '删除', key: 'del' },
+            { icon: 'refresh', label: '目录同步', key: 'sync' },
+            { icon: 'refresh', label: '文件同步', key: 'fileSync' },
+            { icon: 'sort-asc', label: '排序', key: 'sort' },
+        ]
+    } else {
+        ElTreeMenu.value = [
+            { icon: 'add-circle', label: '新增', key: 'add' },
+            { icon: 'draft', label: '编辑', key: 'edit' },
+            { icon: 'delete-bin', label: '删除', key: 'del' },
+            { icon: 'refresh', label: '目录同步', key: 'sync' },
+            { icon: 'sort-asc', label: '排序', key: 'sort' },
+        ]
+    }
+}
+//回车搜索
+const keyUpEvent = (e) => {
+    if (e.key === 'Enter') {
+        searchForm.value.current = 1
+        getTableData()
+    }
+}
+
+//搜索
+const searchClick = () => {
+    searchForm.value.current = 1
+    getTableData()
+}
+
+//分页被点击
+const pageChange = ({ current, size }) => {
+    searchForm.value.current = current
+    searchForm.value.size = size
+    getTableData()
+}
+
+//表格数据
+const tableRef = ref(null)
+const tableColumn = ref([])
+//设置表头
+const setTableColumns = () => {
+    if (isBuiltDrawing.value === 1) {
+        tableColumn.value = [
+            { key:'sourceType', name: '文件来源', width: 100 },
+            { key:'fileNumber', name: '文件编号', width: 100, autoWidth: true },
+            { key:'fileName', name: '文件名称' },
+            { key:'filePage', name: '文件页数', width: 120 },
+            { key:'sheetType', name: '图幅', width: 110 },
+            { key:'sheetSourceValue', name: '图表来源', width: 110 },
+            { key:'drawingNo', name: '图号', width: 110 },
+            { key:'citeChangeNumber', name: '引用变更令编号', width: 110 },
+            { key:'isCertificationValue', name: '认证状态', width: 100 },
+            { key:'isApprovalValue', name: '状态', width: 100 },
+            { key:'fileTime', name: '文件时间', width: 120, autoWidth: true },
+            { key:'dutyUser', name: '责任者', width: 140 },
+        ]
+        sheetTypeStatus()
+        sheetSourceStatus()
+    } else {
+        tableColumn.value = [
+            { key:'sourceType', name: '文件来源', width: 100 },
+            { key:'fileNumber', name: '文件编号', width: 100, autoWidth: true },
+            { key:'fileName', name: '文件名称' },
+            { key:'filePage', name: '文件页数', width: 100 },
+            { key:'isCertificationValue', name: '认证状态', width: 100 },
+            { key:'isApprovalValue', name: '状态', width: 100 },
+            { key:'fileTime', name: '文件时间', width: 120, autoWidth: true },
+            { key:'dutyUser', name: '责任者', width: 140 },
+        ]
+    }
+}
+const tableData = ref([])
+
+//获取数据
+const tableLoading = ref(false)
+const getTableData = async () => {
+    tableLoading.value = true
+    const { error, code, data } = await archiveFileApi.getarchiveFilePage({
+        ...searchForm.value,
+        projectId: projectId.value,
+        contractId: contractId.value,
+    })
+    tableLoading.value = false
+    if (!error && code === 200) {
+        tableData.value = getArrValue(data['records'])
+        searchForm.value.total = data['total'] || 0
+    } else {
+        tableData.value = []
+        searchForm.value.total = 0
+    }
+}
+
+//多选
+const tableCheckedKeys = ref([])
+const tableSelection = (rows) => {
+    tableCheckedKeys.value = rows
+}
+
+//分盒整理
+const sortingModal = ref(false)
+const sortingClick = async () => {
+    if (nodeIds.value && isStorageNode.value === 1) {
+        const { error, code, data } = await archiveFileApi.getBoxNameAndBoxNumber({
+            nodeId:nodeIds.value,
+        })
+        if (!error && code === 200) {
+            if (data.length > 0) {
+                sortingActiveKey.value = []
+                sortingModal.value = true
+                sortingItemData.value = getArrValue(data)
+                sortingOldData.value = deepClone(sortingItemData.value)
+            } else {
+                console.log(1111111)
+                sortingNoneModal.value = true
+            }
+        }
+
+    } else {
+        window?.$message?.warning('请先选择一个子节点')
+    }
+}
+
+const sortingNoneModal = ref(false)//无数据显示的弹窗
+const toSortingModal = ()=>{
+    sortingNoneModal.value = false
+    sortingActiveKey.value = []
+    sortingItemData.value = []
+    sortingModal.value = true
+}
+const sortingNoneModalClose = ()=>{
+    sortingNoneModal.value = false
+}
+
+const sortingItemData = ref([])
+const sortingOldData = ref([])//旧数据,用来对比是否修改名字
+
+//校验
+const tableIsInput = (val, row, key) => {
+    //检测是否改过案卷名字
+    if (key === 'isName') {
+        row.isChange = true
+    }
+    row[key] = !val
+}
+
+const sortingActiveKey = ref([])
+const tableIndex = ref('')
+const sortingSelectFile = (row, index) => {
+    tableIndex.value = index
+    const key = `item-${index}`
+    const indexNum = sortingActiveKey.value.indexOf(key)
+    if (indexNum > -1) {
+        sortingActiveKey.value.splice(indexNum, 1)
+    } else {
+        sortingActiveKey.value.push(key)
+        if (!(row.list && row.list.length > 0)) {
+            getSortingTableData(row, index)
+        }
+    }
+}
+
+//表格
+const sortingTableColumn = [
+    { key:'name', name: '文件名称' },
+]
+
+//获取数据
+const sortingTableLoading = ref(false)
+const getSortingTableData = async (row, index) => {
+    sortingTableLoading.value = true
+    tableindex.value = index
+    const { error, code, data } = await archiveFileApi.pageByBoxName({
+        size: 99999,
+        current: 1,
+        projectId: projectId.value,
+        contractId: contractId.value,
+        nodeIds:nodeIds.value,
+        boxName:row.boxName ? row.boxName : '',
+    })
+    sortingTableLoading.value = false
+    if (!error && code === 200) {
+        row.list = getArrValue(data['records'])
+        setTableCheck(row, index).then()
+    } else {
+        row.list = []
+    }
+}
+
+//表格ref
+const sorTableRef = ref([])
+const tableindex = ref('')
+//回显勾选
+const setTableCheck = async (row, index) => {
+    if (row.ids) {
+        const keys = row.ids.split(','), list = row.list
+        for (let i = 0; i < list.length; i++) {
+            const item = list[i]
+            if (keys.indexOf(item.id) > -1) {
+                item.checked = true
+                await nextTick()
+                console.log(sorTableRef.value[index], 'sorTableRef.value[index]')
+                sorTableRef.value[index].toggleRowSelection(item, true)
+            }
+        }
+    }
+}
+
+//多选
+const checkList = ref([])
+const arrfliter = ref([])
+const singleCheck = async ({ row })=>{
+  let isCheck = false
+    let checkrow = JSON.parse(JSON.stringify(row))
+    if (checkrow.checked === false || checkrow.checked === undefined) {
+        if ( checkList.value.length > 0) {
+            let arr = checkList.value.filter(e => e.id === checkrow.id)
+            if (arr.length > 0) {
+                window.$message.warning('多个盒子不能选择同一份文件')
+                await nextTick()
+                sorTableRef.value[tableindex.value].toggleRowSelection(row, false)
+                isCheck = true
+            } else {
+              isCheck = false
+                row.tableindex = tableindex.value
+                checkList.value.push(row)
+            }
+        } else {
+            row.tableindex = tableindex.value
+            checkList.value.push(row)
+        }
+    } else {
+        let arr = checkList.value.filter(e => e.id === checkrow.id)
+        if (isCheck === false && arr[0]?.checked === true || isCheck) {
+            arrfliter.value = checkList.value.filter(e => e.id !== checkrow.id)
+        } else {
+            arrfliter.value = checkList.value
+        }
+        let newarr = []
+        arrfliter.value.forEach((item)=>{
+            newarr.push(JSON.parse(JSON.stringify(item)))
+        })
+        checkList.value = newarr
+    }
+}
+
+const sortingTableSelection = (rows, list, index) => {
+    tableindex.value = index
+    if (list) {
+        list.forEach(element => {
+            element.checked = false
+        })
+    }
+    rows.forEach((element)=>{
+        element.checked = true
+    })
+}
+
+//删除
+const sortingDelData = (row, index) => {
+    sortingItemData.value.splice(index, 1)
+    console.log(checkList.value, 'checkList.value')
+    // checkList.value=[]
+    //过滤掉当前选择的文件
+    checkList.value = checkList.value.filter(e => e.tableindex !== index)
+    if (row.boxNumber) {
+        delMessageV2(async (action, instance, done) => {
+            if (action === 'confirm') {
+                instance.confirmButtonLoading = true
+                    const { error, code } = await archiveFileApi.removeAllocation({
+                        boxName: row.boxName,
+                        boxNumber:row.boxNumber,
+                    })
+                    if (!error && code === 200) {
+                        window.$message?.success('删除成功!')
+                        sortingClick()
+                    }
+                instance.confirmButtonLoading = false
+                done()
+            } else {
+                done()
+            }
+        })
+    }
+}
+
+//添加分盒
+const addSortingModalClick = () => {
+    console.log('添加分盒')
+    sortingItemData.value.push({
+        boxName: '',
+    })
+}
+
+//确认保存
+const sortingModalLoading = ref(false)
+const sortingModalSave = async () => {
+    sortingModalLoading.value = true
+    //检测案卷名是否重复
+    let nameRes = await checkNames()
+    //console.log(nameRes)
+    //return;
+    for (let i = 0; i < nameRes.length; i++) {
+        if (typeof nameRes[i].data == 'string') {
+            window.$message?.error(nameRes[i].data + ',案卷名重复')
+            sortingModalLoading.value = false
+            return
+        }
+    }
+
+    //组装数据
+    let rows = []
+    sortingItemData.value.forEach((item, index)=>{
+        let obj = {
+            ids:'',
+            boxName:item.boxName,
+            boxNumber:index + 1,
+        }
+        let list = []
+        if (item.list) {
+            item.list.forEach((item2)=>{
+                if (item2.checked) {
+                    list.push(item2.id)
+                }
+            })
+            obj.ids = list.join(',')
+        } else {
+            obj.ids = item.ids
+        }
+
+        rows.push(obj)
+    })
+    console.log(rows, 'rows')
+    if (rows[0]?.ids) {
+        const { error, code, data } = await archiveFileApi.allocation({
+            list: rows,
+        })
+        if (!error && code === 200) {
+            window.$message?.success('保存成功')
+            sortingModal.value = false
+        } else {
+            window.$message?.error('保存失败')
+        }
+    } else {
+        window.$message?.warning('空数据不能提交')
+
+    }
+    sortingModalLoading.value = false
+}
+
+const checkNames = () =>{
+    const arr = []
+    sortingItemData.value.forEach((item)=>{
+        if (item.boxNumber) {
+            if (item.isChange) {
+                //是否修改过
+                //对比旧的数据,是否相同
+                for (let i = 0; i < sortingOldData.value.length; i++) {
+                    if (sortingOldData.value[i].boxNumber == item.boxNumber) {
+                        if (sortingOldData.value[i].boxName != item.boxName) {
+                            arr.push(
+                                archiveFileApi.getIsBoxName({
+                                    boxName:item.boxName,
+                                }),
+                            )
+                        }
+                        return
+                    }
+                }
+            }
+        } else {
+            arr.push(
+                archiveFileApi.getIsBoxName({
+                    boxName:item.boxName,
+                }),
+            )
+        }
+    })
+    return Promise.all(arr)
+}
+
+//关闭
+const sortingModalClose = () => {
+    sortingModal.value = false
+}
+
+//删除
+const delModalClick = async () => {
+    const rows = tableCheckedKeys.value
+    if (rows.length <= 0) {
+        window.$message?.error('请选择需要删除的数据')
+    } else {
+        delMessageV2(async (action, instance, done) => {
+            if (action === 'confirm') {
+                instance.confirmButtonLoading = true
+                const keys = arrToId(rows)
+                const { error, code } = await archiveFileApi.removeFile({
+                    ids: keys,
+                })
+                if (!error && code === 200) {
+                    window.$message?.success('删除成功!')
+                    searchClick()
+                }
+                instance.confirmButtonLoading = false
+                done()
+            } else {
+                done()
+            }
+        })
+    }
+}
+//废除
+const repealModalClick = async () => {
+    const rows = tableCheckedKeys.value
+    if (rows.length <= 0) {
+        window.$message?.error('请选择需要废除的数据')
+    } else {
+        window?.$messageBox?.alert('请谨慎考虑后,确认是否需要废除?', '废除提醒', {
+            showCancelButton: true,
+            confirmButtonText: '确认废除',
+            cancelButtonText: '取消',
+            type: 'warning',
+            callback: async (action, instance, done) => {
+                if (action === 'confirm') {
+                    instance.confirmButtonLoading = true
+                    const keys = arrToId(rows)
+                    const { error, code } = await tasksFlowApi.batchRepealTaskArchive({
+                        ids: keys,
+                        type:1,
+                    })
+                    if (!error && code === 200) {
+                        window.$message?.success('废除成功!')
+                        searchClick()
+                    }
+                    instance.confirmButtonLoading = false
+                    done()
+                } else {
+                done()
+                }
+            },
+        })
+    }
+}
+
+
+//跨目录移动
+const movesModal = ref(false)
+const movesClick = async () => {
+    movesModal.value = true
+    checkedMoves.value = []
+    movesCheckAll.value = false
+    treePanelLoading.value = true
+    fileDatasListLoading.value = true
+    const { error, code, data } = await archiveFileApi.getarchiveFilePage({
+        ...searchForm.value,
+        size:9999,
+        projectId: projectId.value,
+        contractId: contractId.value,
+    })
+    fileDatasListLoading.value = false
+    if (!error && code === 200) {
+        fileDatasList.value = getArrValue(data['records'])
+    } else {
+        fileDatasList.value = []
+    }
+}
+
+//选择需要迁移的文件
+const movesCheckAll = ref(false)
+const isIndeterminate = ref(true)
+const checkedMoves = ref([])
+
+//左侧待迁移文件
+const fileDatasList = ref([])
+const fileDatasListLoading = ref(false)
+//全选
+const handleCheckAllChange = (val) => {
+    console.log(val, 'val')
+    const checked = fileDatasList.value
+    checkedMoves.value = val ? checked : []
+    isIndeterminate.value = false
+}
+
+//勾选
+const handleCheckedMovesChange = (value) => {
+    const keys = fileDatasList.value
+    const checkedCount = value.length
+    movesCheckAll.value = checkedCount === keys.length
+    isIndeterminate.value = checkedCount > 0 && checkedCount < keys.length
+}
+
+//右侧radio
+let radioNodeId = ''
+const radioChange = (id)=>{
+    //console.log(id)
+    radioNodeId = id
+}
+
+//只显示储存节点的单选
+const showRadioFun = (data)=>{
+    if (data.isStorageNode == 1) {
+        return true
+    } else {
+        return false
+    }
+}
+
+//保存
+const movesModalLoading = ref(false)
+const movesModalSave = async () => {
+    const keys = rowsToId(checkedMoves.value)
+    let ids = keys
+    if (checkedMoves.value.length < 1) {
+        window.$message?.warning('请勾选需要迁移的文件')
+        return
+    }
+    if (radioNodeId == '') {
+        window.$message?.warning('请选择要移动到的节点')
+        return
+    }
+    movesModalLoading.value = true
+    const { error, code, data } = await archiveFileApi.migrateFile({
+        ids:ids,
+        nodeId:radioNodeId,
+    })
+    movesModalLoading.value = false
+    if (!error && code === 200) {
+        window.$message?.success('保存成功')
+        movesModal.value = false
+        getTableData()
+    } else {
+        window.$message?.error('保存失败')
+    }
+
+}
+
+//关闭
+const movesModalClose = () => {
+    movesModal.value = false
+}
+
+
+//表格排序
+const sortModal = ref(false)
+//显示
+const tableSortClick = () => {
+    sortModal.value = true
+    getSortTableData()
+}
+
+//搜索表单
+const sortSearchForm = ref({
+    nodeIds:'',
+    current: 1, size: 20, total: 0,
+})
+
+//分页被点击
+const sortPageChange = ({ current, size }) => {
+    sortSearchForm.value.current = current
+    sortSearchForm.value.size = size
+    getSortTableData()
+}
+
+//表格数据
+const sortTableColumn = ref([
+    { key:'fileNumber', name: '文件编号', width: 160 },
+    { key:'fileName', name: '文件名称' },
+    { key:'action', name: '排序', width: 90 },
+])
+const sortTableData = ref([])
+
+const sortTableLoading = ref(false)
+const getSortTableData = async () => {
+    sortTableLoading.value = true
+    const { error, code, data } = await archiveFileApi.getarchiveFilePage({
+        ...sortSearchForm.value,
+        projectId: projectId.value,
+        contractId: contractId.value,
+    })
+    sortTableLoading.value = false
+    if (!error && code === 200) {
+        sortTableData.value = getArrValue(data['records'])
+        sortSearchForm.value.total = data['total'] || 0
+    } else {
+        sortTableData.value = []
+        sortSearchForm.value.total = 0
+    }
+}
+
+//拖动完成
+const sortTableRowDrop = (rows) => {
+    sortTableData.value = [] // 先清空,否则排序会异常
+    nextTick(() => {
+        sortTableData.value = rows
+    })
+}
+
+//向下
+const downSortClick = (index) => {
+    const indexs = index + 1
+    const data = sortTableData.value
+    if (indexs !== data.length) {
+        const tmp = data.splice(indexs, 1)
+        sortTableData.value.splice(index, 0, tmp[0])
+    } else {
+        window?.$message?.warning('已经处于置底,无法下移')
+    }
+}
+
+//向上
+const upSortClick = (index) => {
+    const data = sortTableData.value || []
+    if (index !== 0) {
+        const tmp = data.splice(index - 1, 1)
+        sortTableData.value.splice(index, 0, tmp[0])
+    } else {
+        window?.$message?.warning('已经处于置顶,无法上移')
+    }
+}
+
+//保存
+const sortModalLoading = ref(false)
+const sortModalSave = async () => {
+    await batchEditSaveApi(sortTableData.value)
+
+    sortModal.value = false
+}
+
+//关闭
+const sortModalClose = () => {
+    sortModal.value = false
+}
+
+
+//获取认证状态
+const certificationType = ref([])
+const certificationStatus = async () => {
+    const { error, code, data } = await tasksApi.queryTaskTypeStatus({
+        typeOrStatus: 'certification_status',
+    })
+    //处理数据
+    if (!error && code === 200) {
+        certificationType.value = getArrValue(data)
+    } else {
+        certificationType.value = []
+    }
+}
+
+//获取图幅类型
+const sheetType = ref([])
+const sheetTypeStatus = async () => {
+    console.log(1111111)
+    const { error, code, data } = await tasksApi.queryTaskTypeStatus({
+        typeOrStatus: 'sheet_type',
+    })
+    //处理数据
+    if (!error && code === 200) {
+        sheetType.value = getArrValue(data)
+    } else {
+        sheetType.value = []
+    }
+}
+
+//获取图表来源
+const sheetSourceType = ref([])
+const sheetSourceStatus = async () => {
+    const { error, code, data } = await tasksApi.queryTaskTypeStatus({
+        typeOrStatus: 'sheet_source',
+    })
+    //处理数据
+    if (!error && code === 200) {
+        sheetSourceType.value = getArrValue(data)
+    } else {
+        sheetSourceType.value = []
+    }
+}
+
+//新增文件
+const tableUploadType = ref('add')
+const showUploadModal = ref(false)
+const uploadModalClick = () => {
+    if (nodeIds.value && isStorageNode.value === 1) {
+        tableUploadType.value = 'add'
+        setTableUploadColumn()
+        uploadSaveLoading.value = false
+        tableUploadData.value = []
+        showUploadModal.value = true
+        setdutyUser()
+    } else {
+        window?.$message?.warning('请先选择一个子节点')
+    }
+}
+const uploadModalClose = ()=>{
+    batchUploadCancel()
+    //HcUploadFileRef?.value.cancel()
+    HcUploadFileRef?.value.setModalShow(false)
+}
+//设置文件表头
+const tableUploadColumn = ref([
+    { key:'fileNumber', name: '文件编号' },
+    { key:'fileName', name: '文件名称' },
+    { key:'fileTime', name: '文件时间' },
+    { key:'isApproval', name: '是否需要审批' },
+    { key:'isNeedCertification', name: '是否需要认证' },
+    { key:'dutyUser', name: '责任者' },
+    { key:'isElement', name: '是否四要素' },
+    { key:'action', name: '操作', width: 180 },
+])
+const setTableUploadColumn = () => {
+    if (isBuiltDrawing.value === 2) {
+        tableUploadColumn.value = [
+            { key:'fileNumber', name: '文件编号' },
+            { key:'fileName', name: '文件名称' },
+            { key:'fileTime', name: '文件时间' },
+            { key:'sheetType', name: '图幅' },
+            { key:'sheetSource', name: '图表来源' },
+            { key:'drawingNo', name: '图号' },
+            { key:'citeChangeNumber', name: '引用变更令编号' },
+            { key:'isApproval', name: '是否需要审批' },
+            { key:'isNeedCertification', name: '是否需要认证' },
+            { key:'dutyUser', name: '责任者' },
+            { key:'isElement', name: '是否四要素' },
+            { key:'action', name: '操作', width: 180 },
+        ]
+        sheetTypeStatus()
+        sheetSourceStatus()
+    } else {
+        tableUploadColumn.value = [
+            { key:'fileNumber', name: '文件编号' },
+            { key:'fileName', name: '文件名称' },
+            { key:'fileTime', name: '文件时间' },
+            { key:'isApproval', name: '是否需要审批' },
+            { key:'isNeedCertification', name: '是否需要认证' },
+            { key:'dutyUser', name: '责任者' },
+            { key:'isElement', name: '是否四要素' },
+            { key:'action', name: '操作', width: 180 },
+        ]
+    }
+}
+const tableUploadData = ref([])
+
+//上传的文件结果
+const uploadsChange = (fileId, item) => {
+    if (getObjVal(item)) {
+        let newArr = tableUploadData.value
+        const sheet = sheetType.value, source = sheetSourceType.value
+        let name = item['originalName'] || ''
+        let fileName = name.substring(0, name.lastIndexOf('.'))
+        newArr.push({
+            fileUploadId: fileId,
+            projectId: projectId.value,
+            contractId: contractId.value,
+            nodeId: nodeIds.value,
+            fileNumber: '',
+            fileName: fileName,
+            ossFileName: item?.name || '',
+            fileTime: null,
+            fileUrl: item?.link || '',
+            sheetType: sheet.length > 0 ? sheet[0]['dictKey'] || '' : '',
+            sheetSource: source.length > 0 ? source[0]['dictKey'] || '' : '',
+            drawingNo: '',
+            citeChangeNumber: '',
+            isApproval: 1,
+            isNeedCertification: 1,
+            dutyUser: dutyUser.value,
+            pdfFileUrl: item?.pdfUrl || '',
+            filePage: item?.page || '',
+            isElement: 0,
+            isUpdateUrl:0,
+            fileSize:item?.fileSize,
+        })
+        //tableUploadData.value = newArr
+        tableUploadData.value = arrKeySort(newArr, 'fileUploadId')
+    } else {
+        console.log(item)
+    }
+}
+
+//表单下拉数据
+const whetherData = ref([
+    { label: '不需要', value: 0 },
+    { label: '需要', value: 1 },
+])
+
+//表格数据排序
+const tableUploadRowSort = (arr) => {
+    tableUploadData.value = arr
+}
+
+//删除
+const delUploadData = async (row, index) => {
+    if (row['ossFileName']) {
+        row['delBtnLoading'] = true
+        await ossApi.removeFile({ fileName: row['ossFileName'] })
+        row['delBtnLoading'] = false
+        tableUploadData.value.splice(index, 1)
+    } else {
+        tableUploadData.value.splice(index, 1)
+    }
+}
+
+//批量上传保存
+const uploadSaveLoading = ref(false)
+const batchUploadSave = async () => {
+    const rows = tableUploadData.value
+    if (rows.length > 0) {
+        //验证表单数据
+        uploadSaveLoading.value = true
+        let isTableRows = false
+        for (let i = 0; i < rows.length; i++) {
+            // if (!rows[i]['fileNumber']) {
+            //     rows[i]['isFileNumber'] = true
+            //     isTableRows = true
+            // } else if (!rows[i]['fileName']) {
+            //     rows[i]['isFileName'] = true
+            //     isTableRows = true
+            // }
+
+            // if (!rows[i]['fileTime']) {
+            //     rows[i]['isFileTime'] = true
+            //     isTableRows = true
+            // }
+            // else
+            if (!rows[i]['fileName']) {
+                rows[i]['isFileName'] = true
+                isTableRows = true
+            }
+        }
+        //判断数据
+        if (isTableRows) {
+            uploadSaveLoading.value = false
+            window.$message?.warning('请先完善表单信息')
+        } else {
+            if (tableUploadType.value === 'add') {
+                await batchUploadSaveApi(rows)
+            } else {
+                await batchEditSaveApi(rows)
+            }
+        }
+    } else {
+        window.$message?.warning('请先上传文件')
+    }
+}
+
+//确认上传保存
+const batchUploadSaveApi = async (rows) => {
+    uploadSaveLoading.value = true
+    const { error, code } = await archiveFileApi.batchUploadSave({
+        list: rows,
+    }, false)
+    //判断状态
+    uploadSaveLoading.value = false
+    if (!error && code === 200) {
+        window.$message?.success('保存成功')
+        batchUploadCancel()
+        getTableData()
+    } else {
+        window.$message?.error('保存失败')
+    }
+}
+
+//取消上传
+const batchUploadCancel = () => {
+    tableUploadData.value = []
+    uploadSaveLoading.value = false
+    uploadsLoading.value = false
+    showUploadModal.value = false
+
+
+}
+//上传新文件
+// const newUploadsChange = ({fileList}, row) => {
+//     if (fileList.length > 0) {
+//         tableUploadType.value = 'edit'
+//         const item = fileList[0]
+//         const name = item['originalName'] || ''
+//         const fileName = name.substring(0, name.lastIndexOf("."))
+//         //更新数据
+//         row.fileName = fileName;
+//         row.ossFileName = item?.name || ''
+//         row.fileUrl = item?.link || ''
+//         row.pdfFileUrl = item?.pdfUrl || ''
+//         row.filePage = item?.page || ''
+//         row.isUpdateUrl=1
+//     }
+// }
+
+// const newUploadsProgress = (val, row) => {
+//     row.newBtnLoading = val
+// }
+//批量编辑
+const batchEditClick = () => {
+    const rows = deepClone(tableCheckedKeys.value)
+    //判断是否满足条件
+    const result = rows.every(({ status })=> {
+        return status !== 1 && status !== 2
+    })
+    //判断状态
+    if (result) {
+        tableUploadType.value = 'edit'
+        setTableUploadColumn()
+        uploadSaveLoading.value = false
+        tableUploadData.value = rows
+        showUploadModal.value = true
+    } else {
+        window.$message?.warning('已上报或已审批的文件不能编辑')
+    }
+}
+
+//确认编辑上传保存
+const batchEditSaveApi = async (rows) => {
+    uploadSaveLoading.value = true
+    const { error, code } = await archiveFileApi.batchUpdateSort({
+        list: rows,
+    }, false)
+    //判断状态
+    uploadSaveLoading.value = false
+    if (!error && code === 200) {
+        window.$message?.success('保存成功')
+        batchUploadCancel()
+        getTableData()
+    } else {
+        window.$message?.error('保存失败')
+    }
+}
+
+
+//批量认证
+const CertData = ref([])
+const CertIds = ref([])
+const CertPdf = ref('')
+const CertColumns = [
+    { key:'fileName', name: '文件名称' },
+    { key:'action', name: '操作', width: 100 },
+]
+
+//批量认证弹窗
+const showCertificationModal = ref(false)
+const certificationModalClick = () => {
+    const rows = tableCheckedKeys.value
+    CertData.value = rows
+    CertIds.value = rowsToId(rows)
+    CertPdf.value = rows[0]?.pdfFileUrl || ''
+    const result = rows.every(({ isCertification })=> {
+        return isCertification === 0
+    })
+    const result1 = rows.every(({ status })=> {
+        return status === 0 || status === 3
+    })//已上报不能认证
+    if (!result1) {
+        window.$message.warning('已上报的文件不能进行认证')
+    } else {
+        if (result) {
+            CertData.value = rows
+            CertIds.value = rowsToId(rows)
+            CertPdf.value = rows[0]?.pdfFileUrl || ''
+
+            showCertificationModal.value = true
+        } else {
+            window.$message?.warning('已认证的文件不能再认证')
+        }
+    }
+
+ 
+}
+
+//认证行被点击
+const CertRowClick = ({ row }) => {
+    const pdfFileUrl = row?.pdfFileUrl || ''
+    if (CertPdf.value !== pdfFileUrl) {
+        CertPdf.value = pdfFileUrl
+    }
+}
+
+//认证预览被点击
+const CertRowClick2 = ({ pdfFileUrl }) => {
+    const pdfUrl = pdfFileUrl || ''
+    if (CertPdf.value !== pdfUrl) {
+        CertPdf.value = pdfUrl
+    }
+}
+
+//确认认证
+const CertLoading = ref(false)
+const CertClick = async () => {
+    CertLoading.value = true
+    const { error, code, msg } = await tasksFlowApi.batchCertification({
+        ids: CertIds.value,
+    }, false)
+    //判断状态
+    CertLoading.value = false
+    if (!error && code === 200) {
+        window.$message?.success('认证成功')
+        showCertificationModal.value = false
+        searchClick()
+    } else {
+        window.$message?.error(msg)
+    }
+}
+
+//名称被点击
+const tableRowName = (row) => {
+    console.log(row, 'row')
+    if (row?.isCertificationValue === '已认证' || row?.isApprovalValue === '已审批') {
+        if (row['eVisaFile']) {
+            window.open(row['eVisaFile'], '_blank')
+        } else if (row['pdfFileUrl']) {
+            window.open(row['pdfFileUrl'], '_blank')
+         
+        } else {
+            window.$message?.warning('文件不存在')
+        }
+    } else {
+        if (row['pdfFileUrl']) {
+            window.open(row['pdfFileUrl'], '_blank')
+        } else {
+            window.$message?.warning('文件不存在')
+        }
+    }
+
+  
+}
+
+//上报
+const isReport = ref(false)
+const reportData = ref([])
+const reportModalClick = () => {
+    reportData.value = []
+    const rows = tableCheckedKeys.value
+    //判断是否满足条件
+    const result = rows.every(({ status }) => {
+        return status === 0 || status === 3
+    })
+    const result1 = rows.every(({ isCertification }) => {
+        return isCertification === 1
+    })
+    if (result1) {
+        window.$message?.warning('已认证的文件不能进行上报')
+        return false
+    } else {
+        if (!result) {
+            window.$message?.warning('已上报的文件不能进行再次上报')
+            return false
+        }
+    }
+   
+    //展示上报弹窗
+    reportData.value = rows
+    isReport.value = true
+}
+
+//上报完成
+const reportFinish = () => {
+    searchClick()
+}
+
+
+//左右拖动,改变树形结构宽度
+const leftWidth = ref(382)
+const onmousedown = () => {
+    const leftNum = isCollapse.value ? 142 : 272
+    document.onmousemove = (ve) => {
+        let diffVal = ve.clientX - leftNum
+        if (diffVal >= 310 && diffVal <= 900) {
+            leftWidth.value = diffVal
+        }
+    }
+    document.onmouseup = () => {
+        document.onmousemove = null
+        document.onmouseup = null
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+@import '~style/file/scoped/collection.scss';
+
+.flex-center{
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    height: 100%;
+    flex-direction: column;
+}
+</style>
+
+<style lang="scss">
+@import '~style/file/collection.scss';
+.panel-body .el-checkbox{
+    height: auto;
+
+}
+.panel-body .el-radio-group{
+    width: auto ;
+
+}
+.panel-body .el-checkbox.size-xl .el-checkbox__label, .el-radio.size-xl .el-radio__label {
+    // font-size: 16px;
+    // font-weight: 400;
+    // white-space: wrap;
+}
+.panel-body .el-checkbox.size-xl .el-checkbox__label {
+    font-size: 16px;
+    font-weight: 400;
+    white-space: wrap;
+}
+.user{
+    margin-top: 10px;
+    margin-bottom: 10px;
+}
+</style>