优化
This commit is contained in:
@@ -12,7 +12,7 @@ import ProcurementDetailPanel from '../components/ProcurementDetailPanel.vue'
|
||||
import ProcurementDecisionDialog from '../components/ProcurementDecisionDialog.vue'
|
||||
import { createProcurement, getProcurement, getProcurementWorkflow, listProcurements, type ProcurementDetail, type ProcurementSummary, type ProcurementWorkflow } from '../api/procurement'
|
||||
import { procurementDirections, directionLabel, regionText, buildProcurementCreate, dateTime, draftBudgetTotal, emptyProcurementDraft, money, procurementStatuses, statusLabel, statusTone } from '../procurementPresentation'
|
||||
import { requireOrderBudget } from '../api/orderBudgets'
|
||||
import OrderFundingStatus from '../components/OrderFundingStatus.vue'
|
||||
import { procurementRequestKey } from '../procurementSubmission'
|
||||
|
||||
const props = withDefaults(defineProps<{ createPage?: boolean; detailPage?: boolean }>(), { createPage: false, detailPage: false })
|
||||
@@ -66,7 +66,7 @@ const columns: DataTableColumn[] = [
|
||||
{ prop: 'purchaseCategory', label: '采购品类', width: 120 }, { prop: 'productName', label: '商品名称', minWidth: 200 },
|
||||
{ prop: 'productSpecification', label: '商品规格', minWidth: 160 }, { prop: 'purchaseQuantity', label: '采购数量(件)', width: 135 },
|
||||
{ prop: 'budgetUnitPrice', label: '预算单价', width: 155, slotName: 'budget' },
|
||||
{ prop: 'status', label: '履约进度', width: 180, slotName: 'status' }, { prop: 'reviewRemark', label: '拒绝原因', minWidth: 220, slotName: 'reviewRemark' }, { prop: 'createdAt', label: '下单时间', width: 185, slotName: 'createdAt' },
|
||||
{ prop: 'status', label: '履约进度', width: 180, slotName: 'status' }, { prop: 'reviewRemark', label: '失败 / 拒绝原因', minWidth: 220, slotName: 'reviewRemark' }, { prop: 'createdAt', label: '下单时间', width: 185, slotName: 'createdAt' },
|
||||
]
|
||||
function rowActions(row: object): TableAction[] {
|
||||
const order = row as ProcurementSummary
|
||||
@@ -120,13 +120,16 @@ async function submit() {
|
||||
const payload = buildProcurementCreate(form, companyName.value, '')
|
||||
const fingerprint = JSON.stringify([owner, payload])
|
||||
if (createAttempt?.fingerprint !== fingerprint) createAttempt = { fingerprint, key: procurementRequestKey() }
|
||||
await requireOrderBudget('procurement', createAttempt.key, Number((payload.budgetUnitPrice * payload.purchaseQuantity).toFixed(2)), payload.currency)
|
||||
if (!active || owner !== identity.value) return
|
||||
const result = await createProcurement({ ...payload, idempotencyKey: createAttempt.key })
|
||||
if (!active || owner !== identity.value) return
|
||||
createAttempt = null; submittedOrder.value = result.order.orderNo; ElMessage.success('采购订单已提交')
|
||||
createAttempt = null; submittedOrder.value = result.order.orderNo
|
||||
ElMessage.success(result.order.status === 'FUNDING_PENDING' ? '采购订单已受理,资金校验完成后进入平台审核' : '采购订单已提交')
|
||||
if (canList.value) await router.push({ name: 'cross-border-procurement' })
|
||||
} catch (cause) { if (/已释放|已过期/.test(message(cause))) createAttempt = null; if (active && owner === identity.value) submitError.value = message(cause) }
|
||||
} catch (cause) {
|
||||
if (/已释放|已过期/.test(message(cause))) createAttempt = null
|
||||
if (active && owner === identity.value) submitError.value = message(cause)
|
||||
}
|
||||
finally { submitting.value = false }
|
||||
}
|
||||
watch(() => [mode.value, orderNo.value, query.page, query.size, identity.value], (values, previous) => {
|
||||
@@ -152,13 +155,14 @@ onBeforeUnmount(() => { active = false; ++requestSequence })
|
||||
<template #budget="{ row }">{{ money((row as ProcurementSummary).budgetUnitPrice, (row as ProcurementSummary).currency) }}</template>
|
||||
<template #direction="{ row }">{{ directionLabel((row as ProcurementSummary).procurementDirection) }}</template>
|
||||
<template #status="{ row }"><el-tag :type="statusTone((row as ProcurementSummary).status)" size="small">{{ statusLabel((row as ProcurementSummary).status, (row as ProcurementSummary).procurementDirection) }}</el-tag></template>
|
||||
<template #reviewRemark="{ row }"><span v-if="(row as ProcurementSummary).status === 'REJECTED'">{{ (row as ProcurementSummary).reviewRemark || '未填写原因' }}</span><span v-else>—</span></template>
|
||||
<template #reviewRemark="{ row }"><OrderFundingStatus v-if="(row as ProcurementSummary).status === 'FUNDING_FAILED'" kind="procurement" :order-no="(row as ProcurementSummary).orderNo" :status="(row as ProcurementSummary).status" :can-retry="false" compact /><span v-else-if="(row as ProcurementSummary).status === 'REJECTED'">{{ (row as ProcurementSummary).reviewRemark || '未填写原因' }}</span><span v-else>—</span></template>
|
||||
<template #createdAt="{ row }">{{ dateTime((row as ProcurementSummary).createdAt) }}</template>
|
||||
</DataTable>
|
||||
</div>
|
||||
</template>
|
||||
<section v-else-if="mode === 'detail'" v-loading="loading" class="procurement-detail" aria-label="采购订单详情">
|
||||
<header class="procurement-heading"><div><el-button link type="primary" @click="returnToList">← 返回列表</el-button><h2>{{ detail?.order.orderNo || '采购订单详情' }}</h2></div><div><el-tag v-if="detail" :type="statusTone(workflow?.status || detail.order.status)">{{ statusLabel(workflow?.status || detail.order.status, detail.order.procurementDirection) }}</el-tag><el-button :disabled="loading" @click="loadDetail">刷新</el-button></div></header>
|
||||
<OrderFundingStatus v-if="detail" kind="procurement" :order-no="detail.order.orderNo" :status="detail.order.status" :can-retry="canCreate" @changed="loadDetail" />
|
||||
<div v-if="error" class="procurement-error" role="alert"><span>{{ error }}</span><el-button :disabled="loading" @click="loadDetail">重新加载</el-button></div>
|
||||
<template v-else-if="detail && workflow"><el-alert v-if="workflow.rejectionReason" title="采购结果驳回原因" :description="workflow.rejectionReason" type="warning" :closable="false" /><ProcurementDetailPanel :detail="detail" :workflow="workflow" /></template><el-skeleton v-else :rows="8" animated />
|
||||
</section>
|
||||
@@ -224,7 +228,7 @@ onBeforeUnmount(() => { active = false; ++requestSequence })
|
||||
</div>
|
||||
</section>
|
||||
</el-form>
|
||||
<footer class="procurement-form-actions"><el-button v-if="canList" :disabled="submitting" @click="returnToList">返回列表</el-button><el-button type="primary" :loading="submitting" :disabled="!companyName || !identity" @click="submit">提交采购订单</el-button></footer>
|
||||
<footer class="procurement-form-actions"><el-button type="primary" :loading="submitting" :disabled="!companyName || !identity" @click="submit">提交采购订单</el-button></footer>
|
||||
</template>
|
||||
</section>
|
||||
<ProcurementDecisionDialog v-if="decisionTarget" :key="`${identity}:${decisionTarget.orderNo}:${decision}`" :order="decisionTarget" :decision="decision" @close="decisionTarget = null" @changed="decisionChanged" />
|
||||
|
||||
Reference in New Issue
Block a user