| | |
| | | </el-skeleton> |
| | | </div> |
| | | |
| | | <!-- 用印审批:展示用印申请详情 --> |
| | | <div v-if="isSealApproval" style="margin: 10px 0 18px;"> |
| | | <el-divider content-position="left">用印详情</el-divider> |
| | | <el-skeleton :loading="sealLoading" animated> |
| | | <template #template> |
| | | <el-skeleton-item variant="h3" style="width: 30%" /> |
| | | <el-skeleton-item variant="text" style="width: 100%" /> |
| | | </template> |
| | | <template #default> |
| | | <el-empty v-if="!currentSeal || !currentSeal.applicationNum" description="未查询到对应用印申请详情" /> |
| | | <template v-else> |
| | | <el-descriptions :column="2" border> |
| | | <el-descriptions-item label="申请编号">{{ currentSeal.applicationNum }}</el-descriptions-item> |
| | | <el-descriptions-item label="申请标题">{{ currentSeal.title }}</el-descriptions-item> |
| | | <el-descriptions-item label="用印类型">{{ getSealTypeText(currentSeal.sealType) }}</el-descriptions-item> |
| | | <el-descriptions-item label="紧急程度">{{ getUrgencyText(currentSeal.urgency) }}</el-descriptions-item> |
| | | <el-descriptions-item label="申请原因" :span="2">{{ currentSeal.reason }}</el-descriptions-item> |
| | | </el-descriptions> |
| | | <div v-if="currentSeal.commonFileList?.length" style="margin-top: 20px;"> |
| | | <h4>附件</h4> |
| | | <el-table :data="currentSeal.commonFileList" border style="width: 100%"> |
| | | <el-table-column label="附件名称" show-overflow-tooltip> |
| | | <template #default="scope">{{ scope.row.name }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" width="150" align="center"> |
| | | <template #default="scope"> |
| | | <el-button link type="primary" size="small" @click="previewSealFile(scope.row)">预览</el-button> |
| | | <el-button link type="primary" size="small" @click="downloadSealFile(scope.row)">下载</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | </template> |
| | | </template> |
| | | </el-skeleton> |
| | | </div> |
| | | |
| | | <el-form :model="{ activities }" ref="formRef" label-position="top"> |
| | | <el-steps :active="getActiveStep()" finish-status="success" process-status="process" align-center direction="vertical"> |
| | | <el-step |
| | |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | <filePreview ref="filePreviewRef" /> |
| | | </div> |
| | | </template> |
| | | |
| | |
| | | import { WarningFilled, Edit, Check, MoreFilled } from '@element-plus/icons-vue' |
| | | import { getQuotationList } from "@/api/salesManagement/salesQuotation.js"; |
| | | import { getPurchaseByCode } from "@/api/procurementManagement/procurementLedger.js"; |
| | | import { getSealDetail } from "@/api/collaborativeApproval/sealManagement.js"; |
| | | import FilePreview from '@/components/filePreview/index.vue' |
| | | const emit = defineEmits(['close']) |
| | | const { proxy } = getCurrentInstance() |
| | | |
| | |
| | | const currentQuotation = ref({}) |
| | | const purchaseLoading = ref(false) |
| | | const currentPurchase = ref({}) |
| | | const sealLoading = ref(false) |
| | | const currentSeal = ref({}) |
| | | const filePreviewRef = ref() |
| | | const isQuotationApproval = computed(() => Number(props.approveType) === 6) |
| | | const isPurchaseApproval = computed(() => Number(props.approveType) === 5) |
| | | const isSealApproval = computed(() => Number(props.approveType) === 9) |
| | | |
| | | const data = reactive({ |
| | | form: { |
| | |
| | | } |
| | | } |
| | | |
| | | // 用印审批:按审批流程 DB 主键(row.id)查用印申请详情 |
| | | if (isSealApproval.value) { |
| | | sealLoading.value = true |
| | | getSealDetail(row.id).then((res) => { |
| | | currentSeal.value = res.data || {} |
| | | }).catch((err) => { |
| | | console.error('查询用印详情失败:', err) |
| | | proxy.$modal.msgError('查询用印详情失败') |
| | | }).finally(() => { |
| | | sealLoading.value = false |
| | | }) |
| | | } |
| | | |
| | | approveProcessDetails(row.approveId).then((res) => { |
| | | activities.value = res.data |
| | | // 增加isApproval字段 |
| | |
| | | productOptions.value = res.data; |
| | | }); |
| | | }; |
| | | // 用印类型文本 |
| | | const getSealTypeText = (sealType) => { |
| | | const map = { official: '公章', contract: '合同专用章', finance: '财务专用章', legal: '法人章' } |
| | | return map[sealType] || sealType || '未知' |
| | | } |
| | | // 紧急程度文本 |
| | | const getUrgencyText = (urgency) => { |
| | | const map = { normal: '普通', urgent: '紧急', 'very-urgent': '特急' } |
| | | return map[urgency] || urgency || '未知' |
| | | } |
| | | // 预览附件(URL 为完整地址,原样打开,不拼 host) |
| | | const previewSealFile = (row) => { |
| | | const url = row.previewURL || row.previewUrl || row.url |
| | | if (url && filePreviewRef.value) { |
| | | filePreviewRef.value.openUrl(url) |
| | | } else { |
| | | proxy.$modal.msgWarning('文件地址无效,无法预览') |
| | | } |
| | | } |
| | | // 下载附件(锚点方式,URL 为完整地址) |
| | | const downloadSealFile = (row) => { |
| | | const url = row.downloadURL || row.downloadUrl || row.url |
| | | if (url) { |
| | | const filename = row.originalFilename || row.name || row.fileName || 'download' |
| | | const a = document.createElement('a') |
| | | a.href = url |
| | | a.download = filename |
| | | a.target = '_blank' |
| | | a.rel = 'noopener noreferrer' |
| | | document.body.appendChild(a) |
| | | a.click() |
| | | document.body.removeChild(a) |
| | | } else { |
| | | proxy.$modal.msgWarning('文件地址无效,无法下载') |
| | | } |
| | | } |
| | | // 提交审批 |
| | | const submitForm = (status) => { |
| | | const filteredActivities = activities.value.filter(activity => activity.isShen); |
| | |
| | | currentQuotation.value = {} |
| | | purchaseLoading.value = false |
| | | currentPurchase.value = {} |
| | | sealLoading.value = false |
| | | currentSeal.value = {} |
| | | emit('close') |
| | | }; |
| | | defineExpose({ |