This commit is contained in:
Your Name
2026-04-22 12:14:39 +08:00
parent a1a0b74596
commit 4872e4d2e6
21 changed files with 1131 additions and 235 deletions
@@ -406,12 +406,21 @@
</el-step>
<el-step title="发货与履约" :status="workflowFulfillStatus">
<template #description>
<span v-if="workflowFulfillStatus === 'process'" class="text-primary font-medium">等待发货/补充单号</span>
<span
v-if="workflowFulfillStatus === 'process' && Number(detailData?.fulfillment_status) === 7"
class="text-amber-600 font-medium"
>进行中</span>
<span v-else-if="workflowFulfillStatus === 'process'" class="text-primary font-medium">等待发货/补充单号</span>
<span v-else-if="workflowFulfillStatus === 'wait'">待转入履约</span>
<span v-else-if="workflowFulfillStatus === 'success'" class="text-green-600">
{{ Number(detailData?.fulfillment_status) === 6 ? '已签收' : '已发货' }}
{{ fulfillmentText(detailData?.fulfillment_status) }}
</span>
<span
v-else-if="workflowFulfillStatus === 'error'"
class="text-red-500 font-medium"
>
{{ fulfillmentText(detailData?.fulfillment_status) }}
</span>
<span v-else-if="workflowFulfillStatus === 'error'" class="text-red-500 font-medium">订单已取消</span>
</template>
</el-step>
<el-step title="订单完成" />
@@ -802,7 +811,11 @@
</el-card>
<!-- 操作日志 -->
<el-card shadow="never" class="po-panel border-gray-100 mt-4">
<el-card
v-perms="['tcm.prescriptionOrder/logs']"
shadow="never"
class="po-panel border-gray-100 mt-4"
>
<template #header>
<span class="font-medium text-[15px]">操作日志</span>
</template>
@@ -1314,6 +1327,35 @@
</el-button>
</template>
</el-dialog>
<!-- 完成订单选择履约结案状态 -->
<el-dialog
v-model="completeOrderDialogVisible"
title="完成订单"
width="480px"
:close-on-click-modal="false"
destroy-on-close
@closed="completeOrderId = 0"
>
<p class="text-sm text-gray-600 mb-3">请选择本单结案状态选择已完成实付将按已关联的支付单金额汇总</p>
<el-select
v-model="completeFulfillmentStatus"
class="w-full"
placeholder="请选择"
>
<el-option
v-for="opt in completeOrderStatusOptions"
:key="opt.value"
:label="opt.label"
:value="opt.value"
/>
</el-select>
<template #footer>
<el-button @click="completeOrderDialogVisible = false">取消</el-button>
<el-button type="primary" :loading="completeOrderSubmitting" @click="submitCompleteOrder">
确定
</el-button>
</template>
</el-dialog>
<!-- 补齐支付单 Dialog -->
<el-dialog
v-model="addPayOrderVisible"
@@ -1549,8 +1591,11 @@
<span class="cf-slip-inline-gap" />
服用方式: {{ prescriptionViewData.usage_way ? ' ' + prescriptionViewData.usage_way : '' }}
</div>
<div v-if="slipChuwanVisible">
出丸{{ slipPillGrams === null ? '' : slipPillGrams }}
<div v-if="slipChuwanVisible" class="space-y-0.5">
<div>每次用量约{{ slipPerBagDosageText }}</div>
<div>
出丸{{ slipPillGrams === null ? '—' : slipPillGrams }}
</div>
</div>
<div v-if="slipDietaryText" class="cf-slip-dietary">忌口{{ slipDietaryText }}</div>
<div v-if="prescriptionViewData.usage_notes" class="cf-slip-notes">{{ prescriptionViewData.usage_notes }}</div>
@@ -1878,7 +1923,13 @@ const fulfillmentStatusTabs = [
{ label: '已发货', value: 5 },
{ label: '已签收', value: 6 },
{ label: '已完成', value: 3 },
{ label: '已取消', value: 4 }
{ label: '已取消', value: 4 },
{ label: '进行中', value: 7 },
{ label: '暂不制药', value: 8 },
{ label: '拒收', value: 9 },
{ label: '退款', value: 10 },
{ label: '保留药方', value: 11 },
{ label: '制药缓发', value: 12 }
]
function handleFulfillmentStatusTabClick(value: number | '') {
@@ -2035,7 +2086,13 @@ function fulfillmentText(s: number | undefined) {
3: '已完成',
4: '已取消',
5: '已发货',
6: '已签收'
6: '已签收',
7: '进行中',
8: '暂不制药',
9: '拒收',
10: '退款',
11: '保留药方',
12: '制药缓发'
}
return m[Number(s)] ?? '—'
}
@@ -2047,6 +2104,9 @@ function fulfillmentTagType(s: number | undefined): 'success' | 'warning' | 'dan
if (n === 5) return 'primary'
if (n === 4) return 'danger'
if (n === 2) return 'warning'
if (n === 7) return 'warning'
if (n === 8 || n === 11 || n === 12) return 'info'
if (n === 9 || n === 10) return 'danger'
return 'info'
}
@@ -2182,9 +2242,10 @@ const workflowActiveStep = computed(() => {
const rx = Number(detailData.value.prescription_audit_status)
const pay = Number(detailData.value.payment_slip_audit_status)
if (fs === 3) return 5 // 订单完成
if (fs === 3 || [8, 9, 10, 11, 12].includes(fs)) return 5 // 订单完成 / 业务结案
if (fs === 6) return 4 // 已签收(仍停留在"已发货/送达"环节)
if (fs === 5) return 4 // 已发货
if (fs === 7) return 4 // 进行中
if (fs === 4) { // 已取消
if (rx === 2) return 1
@@ -2218,8 +2279,9 @@ const workflowPayStatus = computed(() => {
const workflowFulfillStatus = computed(() => {
const fs = Number(detailData.value?.fulfillment_status)
if (fs === 3 || fs === 5 || fs === 6) return 'success'
if (fs === 4) return 'error'
if (fs === 3 || fs === 5 || fs === 6 || fs === 8 || fs === 11 || fs === 12) return 'success'
if (fs === 4 || fs === 9 || fs === 10) return 'error'
if (fs === 7) return 'process'
if (workflowActiveStep.value === 3) return 'process'
return 'wait'
})
@@ -2329,7 +2391,16 @@ const logisticsTracePayload = ref<Record<string, any> | null>(null)
const detailLogs = ref<any[]>([])
function canViewPrescriptionOrderLogs() {
const p = userStore.perms || []
return p.includes('*') || p.includes('tcm.prescriptionOrder/logs')
}
async function fetchLogs(id: number) {
if (!canViewPrescriptionOrderLogs()) {
detailLogs.value = []
return
}
try {
const res: any = await prescriptionOrderLogs({ id })
detailLogs.value = res?.data ?? res ?? []
@@ -3082,6 +3153,44 @@ async function submitShip() {
}
}
const completeOrderStatusOptions = [
{ value: 3, label: '已完成' },
{ value: 7, label: '进行中' },
{ value: 8, label: '暂不制药' },
{ value: 9, label: '拒收' },
{ value: 10, label: '退款' },
{ value: 11, label: '保留药方' },
{ value: 12, label: '制药缓发' }
] as const
const completeOrderDialogVisible = ref(false)
const completeOrderId = ref(0)
const completeFulfillmentStatus = ref<number>(3)
const completeOrderSubmitting = ref(false)
async function submitCompleteOrder() {
const id = completeOrderId.value
if (!id) return
completeOrderSubmitting.value = true
try {
await prescriptionOrderComplete({ id, fulfillment_status: completeFulfillmentStatus.value })
feedback.msgSuccess('订单状态已更新')
completeOrderDialogVisible.value = false
getLists()
if (detailVisible.value && detailData.value?.id === id) {
try {
const r: any = await prescriptionOrderDetail({ id })
const nd = r?.data ?? r ?? null
if (nd) detailData.value = nd
} catch { /* 静默 */ }
}
} catch {
/* 拦截器已提示 */
} finally {
completeOrderSubmitting.value = false
}
}
// ─── 补齐支付单(已发货状态)────────────────────────────────────────────
const addPayOrderVisible = ref(false)
const addPayOrderSaving = ref(false)
@@ -3221,29 +3330,11 @@ async function submitAddPayOrder() {
}
}
// ─── 完成订单(已发货 + 支付审核通过)────────────────────────────────────────────
async function confirmComplete(row: { id: number }) {
try {
await ElMessageBox.confirm(
'确认将该订单标记为「已完成」?此操作不可撤销。',
'完成订单',
{ type: 'success', confirmButtonText: '确认完成', cancelButtonText: '暂不处理' }
)
await prescriptionOrderComplete({ id: row.id })
feedback.msgSuccess('订单已标记为「已完成」')
getLists()
if (detailVisible.value && detailData.value?.id === row.id) {
try {
const r: any = await prescriptionOrderDetail({ id: row.id })
const nd = r?.data ?? r ?? null
if (nd) detailData.value = nd
} catch { /* 静默 */ }
}
} catch (e: any) {
if (e !== 'cancel' && e !== 'close') {
/* 拦截器已提示 */
}
}
// ─── 完成订单(已发货/已签收 + 支付审核通过)────────────────────────────────────────────
function confirmComplete(row: { id: number }) {
completeOrderId.value = row.id
completeFulfillmentStatus.value = 3
completeOrderDialogVisible.value = true
}
// ─── 撤回处方审核 ────────────────────────────────────────────
@@ -3327,6 +3418,14 @@ const slipChuwanVisible = computed(() => {
return (d.prescription_type || '浓缩水丸') === '浓缩水丸'
})
/** 与详情「用量」、开方时「用量」同一字段:浓缩水丸为每袋 g 数 */
const slipPerBagDosageText = computed(() => {
const d = prescriptionViewData.value
if (!d || (d.prescription_type || '浓缩水丸') !== '浓缩水丸') return '—'
if (d.dosage_amount == null || d.dosage_amount === '') return '—'
return `${d.dosage_amount}${d.dosage_unit || 'g'}`
})
const slipPillGrams = computed(() => {
const d = prescriptionViewData.value
if (!d || (d.prescription_type || '浓缩水丸') !== '浓缩水丸') return null