gaoluyang
2026-08-07 a3057955f855b8a266c017df00645845e7471410
src/views/srm/tender/index.vue
@@ -4,24 +4,28 @@
import { Page, useVbenModal } from '@vben/common-ui';
import { message } from 'ant-design-vue';
import { message, Select } from 'ant-design-vue';
import { ref } from 'vue';
import { useRouter } from 'vue-router';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import {
  closeTender,
  confirmTenderProject,
  deleteTenderProject,
  generatePurchaseOrder,
  getBidListByProject,
  getTenderProjectPage,
  publishTender,
  startBidding,
  startEvaluation,
  startPriceComparing,
} from '#/api/srm/tender';
import { $t } from '#/locales';
import { useGridColumns, useGridFormSchema } from './data';
import TenderForm from './modules/form.vue';
import { TENDER_STATUS } from '../enums';
import { BIDDING_MODE, TENDER_STATUS } from '../enums';
defineOptions({ name: 'SrmTender' });
@@ -88,6 +92,64 @@
  handleRefresh();
}
async function handleStartPriceComparing(row: SrmTenderApi.TenderProjectVO) {
  await startPriceComparing(row.id!);
  message.success('已开始比价');
  handleRefresh();
}
// 确认中标相关
const confirmTarget = ref<SrmTenderApi.TenderProjectVO | null>(null);
const confirmBidId = ref<number>();
const confirmBidOptions = ref<{ label: string; value: number }[]>([]);
const confirmLoading = ref(false);
async function openConfirmModal(row: SrmTenderApi.TenderProjectVO) {
  confirmTarget.value = row;
  confirmBidId.value = undefined;
  confirmLoading.value = true;
  try {
    const bids = await getBidListByProject(row.id!);
    confirmBidOptions.value = (bids || []).map((b: any) => ({
      label: `${b.supplierName} - ${b.bidNo} (¥${b.bidTotalAmount ?? 0})`,
      value: b.id!,
    }));
  } finally {
    confirmLoading.value = false;
  }
  confirmModalApi.open();
}
async function handleConfirmBid() {
  if (!confirmTarget.value || !confirmBidId.value) {
    message.warning('请选择中标供应商的投标记录');
    return;
  }
  confirmLoading.value = true;
  try {
    await confirmTenderProject({
      id: confirmTarget.value.id!,
      bidId: confirmBidId.value,
    });
    message.success('确认中标成功,采购订单已自动生成');
    confirmModalApi.close();
    handleRefresh();
  } finally {
    confirmLoading.value = false;
  }
}
const [ConfirmModal, confirmModalApi] = useVbenModal({
  title: '确认中标',
  onConfirm: handleConfirmBid,
  onOpenChange(isOpen: boolean) {
    if (!isOpen) {
      confirmTarget.value = null;
      confirmBidId.value = undefined;
    }
  },
});
const [FormModal, formModalApi] = useVbenModal({
  connectedComponent: TenderForm,
  destroyOnClose: true,
@@ -121,6 +183,18 @@
<template>
  <Page auto-content-height>
    <FormModal @success="handleRefresh" />
    <ConfirmModal>
      <div class="flex items-center gap-2">
        <span class="font-medium whitespace-nowrap">中标投标记录:</span>
        <Select
          v-model:value="confirmBidId"
          :options="confirmBidOptions"
          :loading="confirmLoading"
          placeholder="请选择中标的投标记录"
          class="flex-1"
        />
      </div>
    </ConfirmModal>
    <Grid table-title="招标项目列表">
      <template #toolbar-tools>
        <TableAction
@@ -148,7 +222,7 @@
              label: '发布',
              type: 'link',
              auth: ['srm:tender-project:update'],
              ifShow: row.tenderStatus === TENDER_STATUS.DRAFT,
              ifShow: row.tenderStatus === TENDER_STATUS.DRAFT && row.biddingMode !== BIDDING_MODE.SIMPLE,
              popConfirm: {
                title: '确认要发布该项目吗?发布后无法修改。',
                confirm: handlePublish.bind(null, row),
@@ -167,7 +241,7 @@
              type: 'link',
              icon: ACTION_ICON.EDIT,
              auth: ['srm:tender-project:update'],
              ifShow: row.tenderStatus === TENDER_STATUS.PUBLISHED || row.tenderStatus === TENDER_STATUS.BIDDING,
              ifShow: (row.tenderStatus === TENDER_STATUS.PUBLISHED || row.tenderStatus === TENDER_STATUS.BIDDING) && row.biddingMode !== BIDDING_MODE.SIMPLE,
              onClick: handleEdit.bind(null, row),
            },
            {
@@ -186,7 +260,7 @@
              label: '开始投标',
              type: 'link',
              auth: ['srm:tender-project:update'],
              ifShow: row.tenderStatus === TENDER_STATUS.PUBLISHED,
              ifShow: row.tenderStatus === TENDER_STATUS.PUBLISHED && row.biddingMode !== BIDDING_MODE.SIMPLE,
              popConfirm: {
                title: '确认要开始投标吗?',
                confirm: handleStartBidding.bind(null, row),
@@ -197,7 +271,7 @@
              type: 'link',
              danger: true,
              auth: ['srm:tender-project:update'],
              ifShow: row.tenderStatus === TENDER_STATUS.PUBLISHED || row.tenderStatus === TENDER_STATUS.BIDDING || row.tenderStatus === TENDER_STATUS.EVALUATING,
              ifShow: row.tenderStatus === TENDER_STATUS.PUBLISHED || row.tenderStatus === TENDER_STATUS.BIDDING || row.tenderStatus === TENDER_STATUS.EVALUATING || row.tenderStatus === TENDER_STATUS.PRICE_COMPARING,
              popConfirm: {
                title: '确认要关闭该项目吗?',
                confirm: handleClose.bind(null, row),
@@ -207,7 +281,7 @@
              label: '开始评标',
              type: 'link',
              auth: ['srm:tender-project:update'],
              ifShow: row.tenderStatus === TENDER_STATUS.BIDDING,
              ifShow: row.tenderStatus === TENDER_STATUS.BIDDING && row.biddingMode !== BIDDING_MODE.SIMPLE,
              popConfirm: {
                title: '确认要开始评标吗?',
                confirm: handleStartEvaluation.bind(null, row),
@@ -217,12 +291,29 @@
              label: '生成采购订单',
              type: 'link',
              auth: ['srm:bid-award:update'],
              ifShow: !!row.awardId && !row.purchaseOrderNo,
              ifShow: !!row.awardId && !row.purchaseOrderNo && row.biddingMode !== BIDDING_MODE.SIMPLE,
              popConfirm: {
                title: '确认要生成采购订单吗?',
                confirm: handleGeneratePurchaseOrder.bind(null, row),
              },
            },
            {
              label: '开始比价',
              type: 'link',
              auth: ['srm:tender-project:update'],
              ifShow: row.biddingMode === BIDDING_MODE.SIMPLE && row.tenderStatus === TENDER_STATUS.DRAFT,
              popConfirm: {
                title: '确认要开始比价吗?',
                confirm: handleStartPriceComparing.bind(null, row),
              },
            },
            {
              label: '确认中标',
              type: 'link',
              auth: ['srm:tender-project:update'],
              ifShow: row.biddingMode === BIDDING_MODE.SIMPLE && row.tenderStatus === TENDER_STATUS.PRICE_COMPARING,
              onClick: openConfirmModal.bind(null, row),
            },
          ]"
        />
      </template>