更新采购申请

This commit is contained in:
吴红兵
2026-03-01 23:46:32 +08:00
parent a22dcd5a46
commit 2830d95725
2 changed files with 200 additions and 63 deletions

View File

@@ -249,3 +249,15 @@ export function submitToAsset(data: any) {
data
});
}
/**
* 定稿(资产管理处)
* @param data 审核信息
*/
export function finalizeDoc(data: any) {
return request({
url: '/purchase/purchasingdoc/finalize',
method: 'post',
data
});
}

View File

@@ -2,7 +2,7 @@
<el-dialog
v-model="visible"
:title="dialogTitle"
width="900px"
width="85%"
destroy-on-close
:close-on-click-modal="false"
@close="handleClose">
@@ -94,13 +94,13 @@
<el-table-column prop="version" label="版本" width="80" align="center" />
<el-table-column prop="uploadByName" label="上传人" width="100" />
<el-table-column prop="uploadTime" label="上传时间" width="160" />
<el-table-column label="状态" width="120" align="center">
<template #default="scope">
<el-tag :type="getStatusType(scope.row.status)" size="small">
{{ getStatusLabel(scope.row.status) }}
</el-tag>
</template>
</el-table-column>
<!-- <el-table-column label="状态" width="120" align="center">-->
<!-- <template #default="scope">-->
<!-- <el-tag :type="getStatusType(scope.row.status)" size="small">-->
<!-- {{ getStatusLabel(scope.row.status) }}-->
<!-- </el-tag>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column prop="fileRemark" label="文件意见" min-width="150" show-overflow-tooltip />
<el-table-column label="操作" width="100" align="center">
<template #default="scope">
@@ -136,6 +136,7 @@
<el-button v-if="canSubmitToDept" type="primary" @click="handleSubmitToDept">提交至需求部门</el-button>
<el-button v-if="canSubmitToAudit" type="primary" @click="handleSubmitToAudit">提交至内审部门</el-button>
<el-button v-if="canSupplyUpload" type="info" @click="handleSupplyUpload">补充上传</el-button>
<el-button v-if="canFinalize" type="success" @click="handleFinalize">定稿</el-button>
<!-- 需求部门/内审部门操作按钮 -->
<el-button v-if="canSubmitToAsset" type="primary" @click="handleSubmitToAsset">提交至资产管理处</el-button>
<!-- 通用操作按钮 -->
@@ -158,11 +159,55 @@
</template>
</el-dialog>
<!-- 备注输入弹窗提交至资产处/内审部门 -->
<el-dialog v-model="remarkDialogVisible" :title="remarkDialogTitle" width="400px" append-to-body>
<el-form>
<el-form-item label="批注意见">
<el-input v-model="remarkInput" type="textarea" :rows="3" placeholder="请输入批注意见(选填)" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="remarkDialogVisible = false">取消</el-button>
<el-button type="primary" @click="submitRemarkAction">确定</el-button>
</template>
</el-dialog>
<!-- 定稿弹窗 -->
<el-dialog v-model="finalizeDialogVisible" title="定稿确认" width="400px" append-to-body>
<el-form>
<el-form-item label="批注意见">
<el-input v-model="finalizeRemark" type="textarea" :rows="3" placeholder="请输入批注意见(选填)" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="finalizeDialogVisible = false">取消</el-button>
<el-button type="primary" @click="submitFinalize">确定定稿</el-button>
</template>
</el-dialog>
<!-- 补充上传弹窗 -->
<el-dialog v-model="supplyUploadDialogVisible" title="补充上传" width="500px" append-to-body>
<el-form :model="supplyUploadForm" label-width="100px">
<el-form-item label="选择文件" required>
<el-upload
ref="supplyUploadRef"
:action="uploadAction"
:headers="uploadHeaders"
:data="uploadData"
:on-success="handleSupplyUploadSuccess"
:on-error="handleUploadError"
:before-upload="beforeUpload"
:on-change="handleSupplyFileChange"
:auto-upload="false"
:limit="1"
:file-list="supplyFileList"
:show-file-list="true"
accept=".doc,.docx,.pdf">
<el-button type="primary" icon="Upload">选择文件</el-button>
</el-upload>
</el-form-item>
<el-form-item label="文件名称">
<el-input v-model="supplyUploadForm.fileName" disabled />
<el-input v-model="supplyUploadForm.fileName" disabled placeholder="上传后自动显示" />
</el-form-item>
<el-form-item label="文件意见" required>
<el-input v-model="supplyUploadForm.fileRemark" type="textarea" :rows="3" placeholder="请输入文件意见(必填)" />
@@ -195,7 +240,8 @@ import {
supplyUpload as supplyUploadApi,
submitToDept as submitToDeptApi,
submitToAudit as submitToAuditApi,
submitToAsset as submitToAssetApi
submitToAsset as submitToAssetApi,
finalizeDoc as finalizeDocApi
} from '/@/api/purchase/docProcess'
import type { UploadInstance, UploadProps, UploadUserFile } from 'element-plus'
@@ -228,9 +274,22 @@ const uploadedFileData = ref<any>(null)
const returnDialogVisible = ref(false)
const returnRemark = ref('')
// 备注输入相关(提交至资产处/内审部门)
const remarkDialogVisible = ref(false)
const remarkDialogTitle = ref('')
const remarkInput = ref('')
const remarkActionType = ref('')
// 定稿相关
const finalizeDialogVisible = ref(false)
const finalizeRemark = ref('')
// 补充上传相关
const supplyUploadRef = ref<UploadInstance>()
const supplyUploadDialogVisible = ref(false)
const supplyUploadSubmitting = ref(false)
const supplyFileList = ref<UploadUserFile[]>([])
const supplyUploadedFileData = ref<any>(null)
const supplyUploadForm = ref({
fileName: '',
filePath: '',
@@ -267,6 +326,9 @@ const canReturn = computed(() => availableActions.value.includes('return'))
// 是否可完成
const canComplete = computed(() => availableActions.value.includes('complete'))
// 是否可定稿
const canFinalize = computed(() => availableActions.value.includes('finalize'))
// 状态快捷判断
const isReturned = computed(() => statusField.value === 'RETURNED')
const isReviewing = computed(() => ['ASSET_REVIEWING', 'DEPT_REVIEWING', 'AUDIT_REVIEWING'].includes(statusField.value))
@@ -535,24 +597,69 @@ const handleSupplyUpload = () => {
filePath: '',
fileRemark: ''
}
supplyFileList.value = []
supplyUploadedFileData.value = null
supplyUploadDialogVisible.value = true
}
// 补充上传文件选择变化
const handleSupplyFileChange: UploadProps['onChange'] = (uploadFile, uploadFiles) => {
supplyFileList.value = uploadFiles
}
// 补充上传文件上传成功回调
const handleSupplyUploadSuccess: UploadProps['onSuccess'] = (response: any, uploadFile: any) => {
if (response?.code === 0 || response?.code === 200) {
supplyUploadedFileData.value = {
fileName: response.data.fileTitle || uploadFile.name,
filePath: response.data.remark || response.data.filePath
}
supplyUploadForm.value.fileName = supplyUploadedFileData.value.fileName
supplyUploadForm.value.filePath = supplyUploadedFileData.value.filePath
supplyUploadSubmitting.value = false
} else {
useMessage().error(response?.msg || '上传失败')
supplyUploadSubmitting.value = false
}
}
// 补充上传文件上传
const startSupplyUpload = async () => {
if (supplyFileList.value.length === 0) {
useMessage().warning('请先选择文件')
return false
}
supplyUploadSubmitting.value = true
supplyUploadRef.value?.submit()
// 等待上传完成
return new Promise((resolve) => {
const checkInterval = setInterval(() => {
if (!supplyUploadSubmitting.value) {
clearInterval(checkInterval)
resolve(supplyUploadedFileData.value !== null)
}
}, 100)
})
}
const submitSupplyUpload = async () => {
if (!supplyUploadForm.value.fileRemark) {
useMessage().warning('请填写文件意见')
// 先上传文件
const uploaded = await startSupplyUpload()
if (!uploaded || !supplyUploadedFileData.value) {
useMessage().error('文件上传失败')
return
}
if (!supplyUploadForm.value.filePath) {
useMessage().warning('请先上传文件')
if (!supplyUploadForm.value.fileRemark) {
useMessage().warning('请填写文件意见')
supplyUploadSubmitting.value = false
return
}
supplyUploadSubmitting.value = true
try {
const res = await supplyUploadApi({
applyId: applyId.value,
fileName: supplyUploadForm.value.fileName,
filePath: supplyUploadForm.value.filePath,
fileName: supplyUploadedFileData.value.fileName,
filePath: supplyUploadedFileData.value.filePath,
fileRemark: supplyUploadForm.value.fileRemark
})
if (res?.code === 0 || res?.code === 200) {
@@ -574,60 +681,52 @@ const submitSupplyUpload = async () => {
}
// 提交至需求部门
const handleSubmitToDept = async () => {
try {
await useMessageBox().confirm('确定要提交至需求部门审核吗?')
} catch {
return
}
try {
await submitToDeptApi({ applyId: applyId.value })
useMessage().success('提交成功')
emit('refresh')
await loadDocList()
auditRecordListRef.value?.refresh()
const actionsRes = await getAvailableActions(applyId.value)
availableActions.value = actionsRes.data || []
} catch (e: any) {
useMessage().error(e?.msg || '提交失败')
}
const handleSubmitToDept = () => {
remarkDialogTitle.value = '提交至需求部门'
remarkInput.value = ''
remarkActionType.value = 'dept'
remarkDialogVisible.value = true
}
// 提交至内审部门
const handleSubmitToAudit = async () => {
try {
await useMessageBox().confirm('确定要提交至内审部门审核吗?')
} catch {
return
}
try {
await submitToAuditApi({ applyId: applyId.value })
useMessage().success('提交成功')
emit('refresh')
await loadDocList()
auditRecordListRef.value?.refresh()
const actionsRes = await getAvailableActions(applyId.value)
availableActions.value = actionsRes.data || []
} catch (e: any) {
useMessage().error(e?.msg || '提交失败')
}
const handleSubmitToAudit = () => {
remarkDialogTitle.value = '提交至内审部门'
remarkInput.value = ''
remarkActionType.value = 'audit'
remarkDialogVisible.value = true
}
// 提交至资产管理处
const handleSubmitToAsset = async () => {
const handleSubmitToAsset = () => {
remarkDialogTitle.value = '提交至资产管理处'
remarkInput.value = ''
remarkActionType.value = 'asset'
remarkDialogVisible.value = true
}
// 提交备注操作
const submitRemarkAction = async () => {
remarkDialogVisible.value = false
try {
await useMessageBox().confirm('确定要提交至资产管理处吗?')
} catch {
return
let res: any
const params = { applyId: applyId.value, remark: remarkInput.value }
if (remarkActionType.value === 'dept') {
res = await submitToDeptApi(params)
} else if (remarkActionType.value === 'audit') {
res = await submitToAuditApi(params)
} else if (remarkActionType.value === 'asset') {
res = await submitToAssetApi(params)
}
try {
await submitToAssetApi({ applyId: applyId.value })
if (res?.code === 0 || res?.code === 200) {
useMessage().success('提交成功')
emit('refresh')
await loadDocList()
auditRecordListRef.value?.refresh()
const actionsRes = await getAvailableActions(applyId.value)
availableActions.value = actionsRes.data || []
} else {
useMessage().error(res?.msg || '提交失败')
}
} catch (e: any) {
useMessage().error(e?.msg || '提交失败')
}
@@ -672,6 +771,32 @@ const handleComplete = async () => {
}
}
// 定稿
const handleFinalize = () => {
finalizeRemark.value = ''
finalizeDialogVisible.value = true
}
// 提交定稿
const submitFinalize = async () => {
try {
const res = await finalizeDocApi({ applyId: applyId.value, remark: finalizeRemark.value })
if (res?.code === 0 || res?.code === 200) {
useMessage().success('定稿成功')
finalizeDialogVisible.value = false
emit('refresh')
await loadDocList()
auditRecordListRef.value?.refresh()
const actionsRes = await getAvailableActions(applyId.value)
availableActions.value = actionsRes.data || []
} else {
useMessage().error(res?.msg || '定稿失败')
}
} catch (e: any) {
useMessage().error(e?.msg || '定稿失败')
}
}
const handleClose = () => {
visible.value = false
}