iZaiZaiA 2 years ago
parent
commit
6aab09799b

+ 0 - 1
src/api/request/index.js

@@ -21,7 +21,6 @@ axios.interceptors.request.use(config => {
     config.headers['Authorization'] = `Basic ${Base64.encode(`${website.clientId}:${website.clientSecret}`)}`;
     //让每个请求携带token
     const token = getToken()
-    console.log(token)
     if (token && !isToken) {
         config.headers[website.tokenHeader] = 'bearer ' + token
     }

+ 0 - 1
src/store/modules/user.js

@@ -17,7 +17,6 @@ const store = useAppStore(pinia)
 export const useAppLogin = async (form) => {
     const { error, status, res } = await userLogin(form);
     if (!error && status === 200) {
-        console.log(res['access_token'])
         store.setTokenVal(res['access_token'])
         store.setRefreshTokenVal(res['refresh_token'])
         store.setTenantId(res['tenant_id'])

+ 9 - 0
src/styles/app/element.scss

@@ -347,6 +347,10 @@
         margin-top: -10px;
         margin-bottom: 20px;
     }
+
+}
+.el-dialog.hc-modal-table .el-dialog__body {
+    height: 60vh;
 }
 
 //上传文件列表
@@ -409,3 +413,8 @@
 .el-form--large.el-form--label-top .el-form-item .el-form-item__label {
     min-height: 22px;
 }
+
+//输入框验证问题
+.el-input.is-error .el-input__wrapper {
+    box-shadow: 0 0 0 1px var(--el-color-danger) inset;
+}

+ 38 - 0
src/styles/other-file/project-scanning.scss

@@ -54,3 +54,41 @@
     }
 }
 
+.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;
+                }
+            }
+        }
+    }
+}

+ 1 - 1
src/views/data-fill/query.vue

@@ -462,7 +462,7 @@ const batchPrint = async () => {
 }
 
 //废除
-const batchAbolishClick = async () => {
+const batchAbolishClick = () => {
     const rows = tableCheckedKeys.value;
     //判断是否满足条件
     const result = rows.every(({status})=> {

+ 2 - 2
src/views/data-fill/wbs.vue

@@ -633,8 +633,8 @@ const firstItemBox = () => {
     const info = nodeDataInfo.value;
     window?.$messageBox?.alert(`<div class="text-base font-bold">
             <span>请确认将</span>
-            <span class="text-main">【${info.title}】</span>
-            <span>${info.isFirst?'取消':''}标记为首件</span>
+            <span class="text-main">【${info['title']}】</span>
+            <span>${info['isFirst']?'取消':''}标记为首件</span>
         </div>`, '标记首件制', {
         showCancelButton: true,
         dangerouslyUseHTMLString: true,

+ 350 - 41
src/views/other-file/project-scanning.vue

@@ -28,37 +28,37 @@
                         </el-button>
                     </HcTooltip>
                     <HcTooltip keys="project-scanning-download">
-                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0">
+                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" :loading="batchDownloadLoading" @click="batchDownload">
                             <HcIcon name="download"/>
                             <span>批量下载</span>
                         </el-button>
                     </HcTooltip>
                     <HcTooltip keys="project-scanning-report">
-                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0">
+                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" @click="reportModalClick">
                             <HcIcon name="send-plane-2"/>
                             <span>批量上报</span>
                         </el-button>
                     </HcTooltip>
                     <HcTooltip keys="project-scanning-attest">
-                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0">
+                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" @click="certificationModalClick">
                             <HcIcon name="vip-diamond"/>
                             <span>批量认证</span>
                         </el-button>
                     </HcTooltip>
                     <HcTooltip keys="project-scanning-del">
-                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0">
+                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" @click="batchDel">
                             <HcIcon name="delete-bin-2"/>
                             <span>批量删除</span>
                         </el-button>
                     </HcTooltip>
                     <HcTooltip keys="project-scanning-edit">
-                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0">
+                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" @click="batchEditClick">
                             <HcIcon name="draft"/>
                             <span>批量编辑</span>
                         </el-button>
                     </HcTooltip>
                     <HcTooltip keys="project-scanning-abolish">
-                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0">
+                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" @click="batchAbolishClick">
                             <HcIcon name="delete-bin-3"/>
                             <span>批量废除</span>
                         </el-button>
@@ -100,14 +100,14 @@
             </HcCard>
         </div>
 
-        <!--新增文件-->
-        <el-dialog v-model="showUploadModal" title="上传工程文件" width="80vw" class="hc-modal-border">
-            <HcTable ui="hc-form-table" :column="tableUploadColumn" :datas="tableUploadData" :loading="tableUpLoading">
+        <!--新增编辑文件-->
+        <el-dialog v-model="showUploadModal" title="上传工程文件" width="80vw" class="hc-modal-border hc-modal-table">
+            <HcTable ui="hc-form-table" :column="tableUploadColumn" :datas="tableUploadData" :loading="uploadSaveLoading">
                 <template #fileNumber="{row}">
-                    <el-input v-model="row.fileNumber"/>
+                    <el-input v-model="row.fileNumber" :class="row['isFileNumber'] ? 'is-error' : ''" @input="tableInput($event, row, 'isFileNumber')"/>
                 </template>
                 <template #fileName="{row}">
-                    <el-input v-model="row.fileName"/>
+                    <el-input v-model="row.fileName" :class="row['isFileName'] ? 'is-error' : ''" @input="tableInput($event, row, 'isFileName')"/>
                 </template>
                 <template #fileTime="{row}">
                     <el-date-picker v-model="row.fileTime" type="date" format="YYYY/MM/DD" value-format="YYYY-MM-DD" :clearable="false"/>
@@ -142,21 +142,21 @@
                     <el-input v-model="row.dutyUser"/>
                 </template>
                 <template #action="{row,index}">
-                    <el-button type="danger" plain size="small" @click="delUploadData(row,index)">删除</el-button>
+                    <el-button type="danger" plain size="small" :loading="row['delBtnLoading']" @click="delUploadData(row,index)">删除</el-button>
                 </template>
             </HcTable>
             <template #footer>
                 <div class="lr-dialog-footer">
                     <div class="left flex items-center">
                         <HcFileUpload @change="uploadsChange" @progress="uploadsProgress">
-                            <el-button type="primary" hc-btn :loading="uploadsLoading">
+                            <el-button type="primary" hc-btn :loading="uploadsLoading" :disabled="uploadSaveLoading">
                                 <HcIcon name="add-circle"/>
                                 <span>新增上传</span>
                             </el-button>
                         </HcFileUpload>
                     </div>
                     <div class="right">
-                        <el-button size="large" @click="showUploadModal = false">
+                        <el-button size="large" @click="batchUploadCancel">
                             <HcIcon name="close"/>
                             <span>取消</span>
                         </el-button>
@@ -168,6 +168,45 @@
                 </div>
             </template>
         </el-dialog>
+
+        <!--批量上报审批-->
+        <HcReportModal  title="批量上报审批" url="archiveFile/batchApproval" :show="showReportModal" :projectId="projectId" :contractId="contractId"
+                        :taskName="reportTaskName" :ids="reportIds" @hide="showReportModal = false" @finish="showReportFinish"/>
+
+        <!--批量认证-->
+        <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 class="flex-iframe" v-if="CertPdf">
+                    <iframe width='100%' height='100%' frameborder='1' :src="CertPdf"></iframe>
+                </div>
+                <div class="flex-iframe hc-no-table-form" v-else>
+                    <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>
+
     </div>
 </template>
 
@@ -179,8 +218,10 @@ import ProjectTree from "./components/ProjectTree.vue"
 import HcFileUpload from "./components/HcFileUpload.vue"
 import {getStoreData, setStoreData} from '~src/utils/storage'
 import projectScanningApi from "~api/other-file/projectScanning";
+import {downloadBlob, getArrValue, deepClone} from "vue-utils-plus"
+import notableform from '~src/assets/view/notableform.svg';
 import tasksDataApi from '~api/tasks/data';
-import {downloadBlob, getArrValue} from "vue-utils-plus"
+import ossApi from "~api/oss";
 import dayjs from "dayjs"
 
 //变量
@@ -419,11 +460,12 @@ const tablePreview = (row) => {
 }
 
 //新增文件
+const tableUploadType = ref('add')
 const showUploadModal = ref(false)
 const uploadModalClick = () => {
     if (nodeIds.value && isStorageNode.value === 1) {
+        tableUploadType.value = 'add'
         setTableUploadColumn()
-        tableUpLoading.value = false
         uploadSaveLoading.value = false
         tableUploadData.value = []
         showUploadModal.value = true
@@ -469,9 +511,6 @@ const setTableUploadColumn = () => {
         ]
     }
 }
-
-//文件数据表
-const tableUpLoading = ref(false)
 const tableUploadData = ref([])
 
 //上传的文件结果
@@ -511,38 +550,308 @@ const uploadsProgress = (val) => {
     uploadsLoading.value = val
 }
 
-//表单验证
+//表单下拉数据
 const whetherData = ref([{label: "不需要", value: 0}, {label: "需要", value: 1}])
-const uploadDataRules = ref({
-    fileNumber: {
-        required: true,
-        trigger: "input",
-        message: "请输入文件编号",
-    },
-    fileName: {
-        required: true,
-        trigger: "input",
-        message: "请输入文件名称",
-    },
-    fileTime: {
-        required: true,
-        trigger: "input",
-        message: "请选择文件时间",
-    },
-})
-
-//删除
-const delUploadData = (row,index) => {
 
+//输入框验证
+const tableInput = (val,row,isv) => {
+    if (val) {
+        row[isv] = false
+    } else {
+        row[isv] = true
+    }
 }
 
+//删除
+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 = () => {
+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 (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 projectScanningApi.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 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 projectScanningApi.batchEditSave({
+        list: rows
+    },false)
+    //判断状态
+    uploadSaveLoading.value = false
+    if (!error && code === 200) {
+        window.$message?.success('保存成功')
+        batchUploadCancel()
+        getTableData()
+    } else {
+        window.$message?.error('保存失败')
+    }
+}
+
+//批量下载
+const batchDownloadLoading = ref(false)
+const batchDownload = async () => {
+    const rows = deepClone(tableCheckedKeys.value)
+    const ids = rowsToId(rows)
+    //批量下载
+    batchDownloadLoading.value = true
+    const { error, disposition, res } = await projectScanningApi.batchDownloadFileToZip({ids: ids})
+    //处理数据
+    batchDownloadLoading.value = false
+    if (!error) {
+        if (disposition) {
+            downloadBlob(res,disposition)
+        } else {
+            window.$message?.error('数据异常')
+        }
+    }
 }
 
+//批量上报
+const reportIds = ref('')
+const reportTaskName = ref('')
+const showReportModal = ref(false)
+const reportModalClick = () => {
+    const rows = tableCheckedKeys.value;
+    const result = rows.every(({status})=> {
+        return status === 0 //isApproval !== 1 && status !== 0 || isApproval === 1 && status !== 0
+    })
+    if (result) {
+        reportIds.value = rowsToId(rows)
+        reportTaskName.value = rows.length > 1?`${rows[0].fileName}等${rows.length}个文件`:rows[0].fileName
+        showReportModal.value = true
+    } else {
+        window.$message?.warning('已上报的文件不能进行再次上报,若要重新上报,要先撤回之前的上报,再重新上报')
+    }
+}
+
+//上报完成
+const showReportFinish = () => {
+    showReportModal.value = false
+    getTableData()
+}
+
+//批量认证
+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;
+    const result = rows.every(({isCertification})=> {
+        return isCertification === 0
+    })
+    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} = await projectScanningApi.batchCertification({
+        list: CertIds.value
+    }, false)
+    //判断状态
+    CertLoading.value = false
+    if (!error && code === 200) {
+        window.$message?.success('认证成功')
+        showCertificationModal.value = false
+        getTableData()
+    } else {
+        window.$message?.error('认证失败')
+    }
+}
+
+//批量删除
+const batchDel = () => {
+    const rows = tableCheckedKeys.value;
+    const result = rows.every(({status})=> {
+        return status === 0
+    })
+    if (result) {
+        const ids = rowsToId(rows)
+        window?.$messageBox?.alert('请谨慎考虑是否要 批量删除文件?', '删除文件', {
+            type: 'error',
+            showCancelButton: true,
+            confirmButtonText: '确定删除',
+            cancelButtonText: '取消',
+            callback: (action) => {
+                if (action === 'confirm') {
+                    removeArchiveFile(ids)
+                }
+            }
+        })
+    } else {
+        window.$message?.warning('已上报的文件需要先废除,才能执行删除')
+    }
+}
+//确认批量删除
+const removeArchiveFile = async (ids) => {
+    const {error, code} = await projectScanningApi.removeArchiveFile({
+        ids: ids
+    }, false)
+    //判断状态
+    CertLoading.value = false
+    if (!error && code === 200) {
+        window.$message?.success('删除成功')
+        getTableData()
+    } else {
+        window.$message?.error('删除失败')
+    }
+}
+
+//批量废除
+const batchAbolishClick = () => {
+    const rows = tableCheckedKeys.value;
+    const result = rows.every(({status})=> {
+        return status > 0
+    })
+    if (result) {
+        const ids = rowsToId(rows)
+        window?.$messageBox?.alert('是否废除勾选的已上报文件?', '确认操作', {
+            type: 'warning',
+            showCancelButton: true,
+            confirmButtonText: '确定废除',
+            cancelButtonText: '取消',
+            callback: (action) => {
+                if (action === 'confirm') {
+                    batchAbolishSave(ids)
+                }
+            }
+        })
+    } else {
+        window.$message?.warning('未上报的文件不能废除')
+    }
+}
+//确认批量废除
+const batchAbolishSave = async (ids) => {
+    const {error, code} = await projectScanningApi.batchAbolishSave({
+        ids: ids
+    }, false)
+    //判断状态
+    if (!error && code === 200) {
+        window.$message?.success('批量废除成功')
+        getTableData()
+    } else {
+        window.$message?.error('批量废除失败')
+    }
+}
+
+//拼接ID
+const rowsToId = (rows) => {
+    return rows.map((obj) => {
+        return obj.id;
+    }).join(",")
+}
 
 //左右拖动,改变树形结构宽度
 const leftWidth = ref(382)