更新采购申请

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

@@ -248,4 +248,16 @@ export function submitToAsset(data: any) {
method: 'post', method: 'post',
data 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 <el-dialog
v-model="visible" v-model="visible"
:title="dialogTitle" :title="dialogTitle"
width="900px" width="85%"
destroy-on-close destroy-on-close
:close-on-click-modal="false" :close-on-click-modal="false"
@close="handleClose"> @close="handleClose">
@@ -94,13 +94,13 @@
<el-table-column prop="version" label="版本" width="80" align="center" /> <el-table-column prop="version" label="版本" width="80" align="center" />
<el-table-column prop="uploadByName" label="上传人" width="100" /> <el-table-column prop="uploadByName" label="上传人" width="100" />
<el-table-column prop="uploadTime" label="上传时间" width="160" /> <el-table-column prop="uploadTime" label="上传时间" width="160" />
<el-table-column label="状态" width="120" align="center"> <!-- <el-table-column label="状态" width="120" align="center">-->
<template #default="scope"> <!-- <template #default="scope">-->
<el-tag :type="getStatusType(scope.row.status)" size="small"> <!-- <el-tag :type="getStatusType(scope.row.status)" size="small">-->
{{ getStatusLabel(scope.row.status) }} <!-- {{ getStatusLabel(scope.row.status) }}-->
</el-tag> <!-- </el-tag>-->
</template> <!-- </template>-->
</el-table-column> <!-- </el-table-column>-->
<el-table-column prop="fileRemark" label="文件意见" min-width="150" show-overflow-tooltip /> <el-table-column prop="fileRemark" label="文件意见" min-width="150" show-overflow-tooltip />
<el-table-column label="操作" width="100" align="center"> <el-table-column label="操作" width="100" align="center">
<template #default="scope"> <template #default="scope">
@@ -136,6 +136,7 @@
<el-button v-if="canSubmitToDept" type="primary" @click="handleSubmitToDept">提交至需求部门</el-button> <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="canSubmitToAudit" type="primary" @click="handleSubmitToAudit">提交至内审部门</el-button>
<el-button v-if="canSupplyUpload" type="info" @click="handleSupplyUpload">补充上传</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> <el-button v-if="canSubmitToAsset" type="primary" @click="handleSubmitToAsset">提交至资产管理处</el-button>
<!-- 通用操作按钮 --> <!-- 通用操作按钮 -->
@@ -158,11 +159,55 @@
</template> </template>
</el-dialog> </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-dialog v-model="supplyUploadDialogVisible" title="补充上传" width="500px" append-to-body>
<el-form :model="supplyUploadForm" label-width="100px"> <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-form-item label="文件名称">
<el-input v-model="supplyUploadForm.fileName" disabled /> <el-input v-model="supplyUploadForm.fileName" disabled placeholder="上传后自动显示" />
</el-form-item> </el-form-item>
<el-form-item label="文件意见" required> <el-form-item label="文件意见" required>
<el-input v-model="supplyUploadForm.fileRemark" type="textarea" :rows="3" placeholder="请输入文件意见(必填)" /> <el-input v-model="supplyUploadForm.fileRemark" type="textarea" :rows="3" placeholder="请输入文件意见(必填)" />
@@ -195,7 +240,8 @@ import {
supplyUpload as supplyUploadApi, supplyUpload as supplyUploadApi,
submitToDept as submitToDeptApi, submitToDept as submitToDeptApi,
submitToAudit as submitToAuditApi, submitToAudit as submitToAuditApi,
submitToAsset as submitToAssetApi submitToAsset as submitToAssetApi,
finalizeDoc as finalizeDocApi
} from '/@/api/purchase/docProcess' } from '/@/api/purchase/docProcess'
import type { UploadInstance, UploadProps, UploadUserFile } from 'element-plus' import type { UploadInstance, UploadProps, UploadUserFile } from 'element-plus'
@@ -228,9 +274,22 @@ const uploadedFileData = ref<any>(null)
const returnDialogVisible = ref(false) const returnDialogVisible = ref(false)
const returnRemark = ref('') 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 supplyUploadDialogVisible = ref(false)
const supplyUploadSubmitting = ref(false) const supplyUploadSubmitting = ref(false)
const supplyFileList = ref<UploadUserFile[]>([])
const supplyUploadedFileData = ref<any>(null)
const supplyUploadForm = ref({ const supplyUploadForm = ref({
fileName: '', fileName: '',
filePath: '', filePath: '',
@@ -267,6 +326,9 @@ const canReturn = computed(() => availableActions.value.includes('return'))
// 是否可完成 // 是否可完成
const canComplete = computed(() => availableActions.value.includes('complete')) const canComplete = computed(() => availableActions.value.includes('complete'))
// 是否可定稿
const canFinalize = computed(() => availableActions.value.includes('finalize'))
// 状态快捷判断 // 状态快捷判断
const isReturned = computed(() => statusField.value === 'RETURNED') const isReturned = computed(() => statusField.value === 'RETURNED')
const isReviewing = computed(() => ['ASSET_REVIEWING', 'DEPT_REVIEWING', 'AUDIT_REVIEWING'].includes(statusField.value)) const isReviewing = computed(() => ['ASSET_REVIEWING', 'DEPT_REVIEWING', 'AUDIT_REVIEWING'].includes(statusField.value))
@@ -535,24 +597,69 @@ const handleSupplyUpload = () => {
filePath: '', filePath: '',
fileRemark: '' fileRemark: ''
} }
supplyFileList.value = []
supplyUploadedFileData.value = null
supplyUploadDialogVisible.value = true 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 () => { const submitSupplyUpload = async () => {
if (!supplyUploadForm.value.fileRemark) { // 先上传文件
useMessage().warning('请填写文件意见') const uploaded = await startSupplyUpload()
if (!uploaded || !supplyUploadedFileData.value) {
useMessage().error('文件上传失败')
return return
} }
if (!supplyUploadForm.value.filePath) { if (!supplyUploadForm.value.fileRemark) {
useMessage().warning('请先上传文件') useMessage().warning('请填写文件意见')
supplyUploadSubmitting.value = false
return return
} }
supplyUploadSubmitting.value = true supplyUploadSubmitting.value = true
try { try {
const res = await supplyUploadApi({ const res = await supplyUploadApi({
applyId: applyId.value, applyId: applyId.value,
fileName: supplyUploadForm.value.fileName, fileName: supplyUploadedFileData.value.fileName,
filePath: supplyUploadForm.value.filePath, filePath: supplyUploadedFileData.value.filePath,
fileRemark: supplyUploadForm.value.fileRemark fileRemark: supplyUploadForm.value.fileRemark
}) })
if (res?.code === 0 || res?.code === 200) { if (res?.code === 0 || res?.code === 200) {
@@ -574,60 +681,52 @@ const submitSupplyUpload = async () => {
} }
// 提交至需求部门 // 提交至需求部门
const handleSubmitToDept = async () => { const handleSubmitToDept = () => {
try { remarkDialogTitle.value = '提交至需求部门'
await useMessageBox().confirm('确定要提交至需求部门审核吗?') remarkInput.value = ''
} catch { remarkActionType.value = 'dept'
return remarkDialogVisible.value = true
}
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 handleSubmitToAudit = async () => { const handleSubmitToAudit = () => {
try { remarkDialogTitle.value = '提交至内审部门'
await useMessageBox().confirm('确定要提交至内审部门审核吗?') remarkInput.value = ''
} catch { remarkActionType.value = 'audit'
return remarkDialogVisible.value = true
}
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 handleSubmitToAsset = async () => { const handleSubmitToAsset = () => {
remarkDialogTitle.value = '提交至资产管理处'
remarkInput.value = ''
remarkActionType.value = 'asset'
remarkDialogVisible.value = true
}
// 提交备注操作
const submitRemarkAction = async () => {
remarkDialogVisible.value = false
try { try {
await useMessageBox().confirm('确定要提交至资产管理处吗?') let res: any
} catch { const params = { applyId: applyId.value, remark: remarkInput.value }
return if (remarkActionType.value === 'dept') {
} res = await submitToDeptApi(params)
try { } else if (remarkActionType.value === 'audit') {
await submitToAssetApi({ applyId: applyId.value }) res = await submitToAuditApi(params)
useMessage().success('提交成功') } else if (remarkActionType.value === 'asset') {
emit('refresh') res = await submitToAssetApi(params)
await loadDocList() }
auditRecordListRef.value?.refresh() if (res?.code === 0 || res?.code === 200) {
const actionsRes = await getAvailableActions(applyId.value) useMessage().success('提交成功')
availableActions.value = actionsRes.data || [] 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) { } catch (e: any) {
useMessage().error(e?.msg || '提交失败') 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 = () => { const handleClose = () => {
visible.value = false visible.value = false
} }