| | |
| | | |
| | | 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' }); |
| | | |
| | |
| | | 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, |
| | |
| | | <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 |
| | |
| | | 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), |
| | |
| | | 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), |
| | | }, |
| | | { |
| | |
| | | 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), |
| | |
| | | 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), |
| | |
| | | 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), |
| | |
| | | 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> |