更新
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user