|
@@ -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)
|