履约验收

This commit is contained in:
吴红兵
2026-02-25 13:11:31 +08:00
parent 325ee491a9
commit 25e0772548
3 changed files with 164 additions and 1 deletions

View File

@@ -76,6 +76,20 @@ export function submitObj(obj: any) {
});
}
/**
* 分配招标代理(指定或随机),仅学校统一采购或部门自行采购且委托采购中心采购时可用
* @param applyId 采购申请ID
* @param mode random | designated
* @param agentId 指定模式时的代理ID
*/
export function assignAgent(applyId: number | string, mode: 'random' | 'designated', agentId?: string) {
return request({
url: '/purchase/purchasingapply/assign-agent',
method: 'post',
data: { id: Number(applyId), mode, agentId: agentId || undefined }
});
}
/**
* 修改采购申请
* @param obj 对象数据

View File

@@ -403,6 +403,17 @@
</el-col>
</el-row>
<!-- 查看时:招标代理(与实施采购信息同风格:分割线+标签值同行) -->
<div v-if="isViewMode && dataForm.agentName" class="implement-info-block mb20">
<el-divider content-position="left">招标代理</el-divider>
<el-row :gutter="24">
<el-col :span="12" class="mb16">
<div class="view-label">代理名称</div>
<div class="view-value">{{ dataForm.agentName }}</div>
</el-col>
</el-row>
</div>
<!-- 查看时:实施采购信息 -->
<div v-if="isViewMode && (dataForm.implementType || viewImplementPurchaseFiles.length)" class="implement-info-block mb20">
<el-divider content-position="left">实施采购信息</el-divider>
@@ -616,6 +627,8 @@ const dataForm = reactive({
implementType: '',
fileFlowInstId: '',
fileFlowStatus: '',
agentId: '',
agentName: '',
});
/** 查看时展示的采购文件列表(实施采购上传的 type=130 */
const viewImplementPurchaseFiles = ref<{ id: string; fileTitle?: string; createTime?: string; remark?: string }[]>([]);
@@ -1147,6 +1160,8 @@ async function loadDetail(applyId: string | number) {
implementType: detail.implementType ?? '',
fileFlowInstId: detail.fileFlowInstId ?? '',
fileFlowStatus: detail.fileFlowStatus ?? '',
agentId: detail.agentId ?? '',
agentName: detail.agentName ?? '',
});
setCategoryCodePath();
currentStep.value = 0;

View File

@@ -336,6 +336,61 @@
<!-- 实施采购iframe 嵌入 implement.vue供列表与流程页面使用 -->
<ImplementForm ref="implementFormRef" @refresh="getDataList" />
<!-- 分配代理弹窗 -->
<el-dialog
v-model="assignAgentDialogVisible"
title="分配代理"
width="420px"
destroy-on-close
@close="assignAgentForm.agentId = ''; assignAgentForm.mode = 'designated'"
>
<el-form label-width="90px">
<el-form-item label="分配方式">
<el-radio-group v-model="assignAgentForm.mode">
<el-radio label="designated">指定</el-radio>
<el-radio label="random">随机</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="assignAgentForm.mode === 'designated'" label="招标代理">
<el-select
v-model="assignAgentForm.agentId"
placeholder="请选择招标代理"
clearable
filterable
style="width: 100%"
:loading="agentListLoading"
>
<el-option v-for="item in agentList" :key="item.id" :label="item.agentName" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item v-if="assignAgentCurrentRow?.agentName" label="当前代理">
<span>{{ assignAgentCurrentRow.agentName }}</span>
</el-form-item>
</el-form>
<template #footer>
<span>
<el-button @click="assignAgentDialogVisible = false">取消</el-button>
<el-button
v-if="assignAgentForm.mode === 'random'"
type="primary"
:loading="assignAgentSubmitting"
@click="handleAssignAgentRandom"
>
随机分配
</el-button>
<el-button
v-else
type="primary"
:loading="assignAgentSubmitting"
:disabled="!assignAgentForm.agentId"
@click="handleAssignAgentDesignated"
>
确定
</el-button>
</span>
</template>
</el-dialog>
</div>
</template>
@@ -343,7 +398,8 @@
import { ref, reactive, defineAsyncComponent, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import { BasicTableProps, useTable } from "/@/hooks/table";
import { getPage, delObj, submitObj, getArchiveDownloadUrl, getApplyTemplateDownloadUrl, getFileApplyTemplateDownloadUrl } from "/@/api/finance/purchasingrequisition";
import { getPage, delObj, submitObj, getArchiveDownloadUrl, getApplyTemplateDownloadUrl, getFileApplyTemplateDownloadUrl, assignAgent } from "/@/api/finance/purchasingrequisition";
import { getPage as getAgentPage } from '/@/api/finance/purchaseagent';
import { useMessage, useMessageBox } from "/@/hooks/message";
import { getDicts } from '/@/api/admin/dict';
import { getTree } from '/@/api/finance/purchasingcategory';
@@ -382,6 +438,75 @@ const currFlowCommentType = ref<'apply' | 'file'>('apply')
const implementFormRef = ref()
/** 分配代理弹窗 */
const assignAgentDialogVisible = ref(false)
const assignAgentCurrentRow = ref<any>(null)
const assignAgentForm = reactive({ mode: 'designated' as 'designated' | 'random', agentId: '' })
const agentList = ref<any[]>([])
const agentListLoading = ref(false)
const assignAgentSubmitting = ref(false)
const openAssignAgentDialog = async (row: any) => {
assignAgentCurrentRow.value = row
assignAgentForm.mode = 'designated'
assignAgentForm.agentId = ''
assignAgentDialogVisible.value = true
agentListLoading.value = true
try {
const res = await getAgentPage({ size: 500, current: 1 })
const records = res?.data?.records ?? res?.records ?? []
agentList.value = Array.isArray(records) ? records : []
} catch (_) {
agentList.value = []
} finally {
agentListLoading.value = false
}
}
const handleAssignAgentRandom = async () => {
const row = assignAgentCurrentRow.value
const id = row?.id ?? row?.purchaseId
if (id == null || id === '') {
useMessage().warning('无法获取申请单ID')
return
}
assignAgentSubmitting.value = true
try {
await assignAgent(Number(id), 'random')
useMessage().success('随机分配代理成功')
assignAgentDialogVisible.value = false
getDataList()
} catch (e: any) {
useMessage().error(e?.msg || '随机分配代理失败')
} finally {
assignAgentSubmitting.value = false
}
}
const handleAssignAgentDesignated = async () => {
const row = assignAgentCurrentRow.value
const id = row?.id ?? row?.purchaseId
if (id == null || id === '') {
useMessage().warning('无法获取申请单ID')
return
}
if (!assignAgentForm.agentId) {
useMessage().warning('请选择招标代理')
return
}
assignAgentSubmitting.value = true
try {
await assignAgent(Number(id), 'designated', assignAgentForm.agentId)
useMessage().success('指定代理成功')
assignAgentDialogVisible.value = false
getDataList()
} catch (e: any) {
useMessage().error(e?.msg || '指定代理失败')
} finally {
assignAgentSubmitting.value = false
}
}
/**
* 定义响应式表格数据
*/
@@ -561,6 +686,12 @@ const getActionMenuItems = (row: any) => {
icon: Download,
visible: () => true,
},
{
command: 'assignAgent',
label: '分配代理',
icon: Collection,
visible: () => row?.purchaseMode === '2' || (row?.purchaseMode === '0' && row?.purchaseType === '4'),
},
];
};
@@ -591,6 +722,9 @@ const handleMoreCommand = (command: string, row: any) => {
case 'downloadFileApply':
handleDownloadFileApply(row);
break;
case 'assignAgent':
openAssignAgentDialog(row);
break;
}
};