This commit is contained in:
Your Name
2026-06-03 14:42:48 +08:00
parent ec4e0b9f29
commit 37df208706
6 changed files with 917 additions and 15 deletions
+1 -1
View File
@@ -482,7 +482,7 @@ export function prescriptionOrderRequestCompletion(params: { id: number }) {
return request.post({ url: '/tcm.prescriptionOrder/requestCompletion', params })
}
/** 将「已发货/已签收」且支付审核通过的订单结案(3=已完成 或 7-12 业务状态,不含退款 */
/** 将「已发货/已签收」且支付审核通过的订单结案(3=已完成 或 7-12 业务状态;退款请走 refund 或完成弹窗选「退款」 */
export function prescriptionOrderComplete(params: { id: number; fulfillment_status: number }) {
return request.post({ url: '/tcm.prescriptionOrder/complete', params })
}
@@ -2099,7 +2099,9 @@
</div>
</template>
</el-alert>
<p class="text-sm text-gray-600 mb-3">请选择本单结案状态选择已完成实付将按已关联的支付单金额汇总</p>
<p class="text-sm text-gray-600 mb-3">
请选择本单结案状态选择已完成实付将按已关联的支付单金额汇总选择退款时将关联收款单标记为已退款并清零本单已付
</p>
<el-select
v-model="completeFulfillmentStatus"
class="w-full"
@@ -2112,11 +2114,76 @@
:value="opt.value"
/>
</el-select>
<template v-if="completeFulfillmentStatus === 10">
<el-alert
type="warning"
:closable="false"
show-icon
class="mt-3 !items-start"
title="退款将处理本单全部关联收款单,已付总额清零,且不可撤销。"
/>
<div v-loading="completeOrderPayLoading" class="mt-3">
<div
v-if="completeOrderLinkedPays.length"
class="rounded-lg border border-amber-200/80 bg-amber-50/50 p-3"
>
<div class="text-xs font-semibold text-amber-900 mb-2">
将退款的关联收款{{ completeOrderLinkedPays.length }} · 合计 ¥{{ formatMoney(completeOrderRefundTotal) }}
</div>
<el-table :data="completeOrderLinkedPays" size="small" border stripe max-height="200">
<el-table-column prop="order_no" label="单号" min-width="120" show-overflow-tooltip />
<el-table-column label="类型" width="88">
<template #default="{ row }">
{{ row.order_type_desc || feeTypeText(row.order_type) }}
</template>
</el-table-column>
<el-table-column label="金额" width="88" align="right">
<template #default="{ row }">
<span class="text-red-500">¥{{ row.amount }}</span>
</template>
</el-table-column>
<el-table-column label="状态" width="92" align="center">
<template #default="{ row }">
<el-tag :type="payOrderStatusTag(row.status)" size="small">
{{ row.status_desc || orderStatusText(row.status) }}
</el-tag>
</template>
</el-table-column>
</el-table>
</div>
<p v-else-if="!completeOrderPayLoading" class="text-xs text-gray-500 mt-2">
当前无已关联的收款单提交后仍将本单标记为退款并清零已付
</p>
</div>
<el-form
ref="completeRefundFormRef"
:model="completeRefundForm"
:rules="completeRefundRules"
label-width="88px"
class="mt-3"
>
<el-form-item label="退款原因" prop="reason">
<el-input
v-model="completeRefundForm.reason"
type="textarea"
:rows="3"
maxlength="500"
show-word-limit
placeholder="请填写退款原因(必填)"
/>
</el-form-item>
</el-form>
</template>
</div>
<template #footer>
<el-button @click="completeOrderDialogVisible = false">取消</el-button>
<el-button type="primary" :loading="completeOrderSubmitting" @click="submitCompleteOrder">
确定
<el-button
:type="completeFulfillmentStatus === 10 ? 'danger' : 'primary'"
:loading="completeOrderSubmitting"
@click="submitCompleteOrder"
>
{{ completeFulfillmentStatus === 10 ? '确认退款' : '确定' }}
</el-button>
</template>
</el-dialog>
@@ -3740,7 +3807,9 @@ function canCompleteRow(row: { fulfillment_status?: number; payment_slip_audit_s
}
function canRefundRow(row: { fulfillment_status?: number; payment_slip_audit_status?: number }) {
return canCompleteRow(row)
// (5) / (6) / (3)(1) 退
const fs = Number(row.fulfillment_status)
return (fs === 5 || fs === 6 || fs === 3) && Number(row.payment_slip_audit_status) === 1
}
function canQuickTrackRow(row: { fulfillment_status?: number }) {
@@ -5251,6 +5320,7 @@ const completeOrderStatusOptions = [
{ value: 7, label: '进行中' },
{ value: 8, label: '暂不制药' },
{ value: 9, label: '拒收' },
{ value: 10, label: '退款' },
{ value: 11, label: '保留药方' },
{ value: 12, label: '制药缓发' }
] as const
@@ -5259,15 +5329,54 @@ const completeOrderDialogVisible = ref(false)
const completeOrderId = ref(0)
const completeFulfillmentStatus = ref<number>(3)
const completeOrderSubmitting = ref(false)
const completeOrderPayLoading = ref(false)
const completeOrderLinkedPays = ref<any[]>([])
const completeRefundFormRef = ref<FormInstance>()
const completeRefundForm = reactive({ reason: '' })
const completeRefundRules: FormRules = {
reason: [{ required: true, message: '请填写退款原因', trigger: 'blur' }]
}
const completeOrderRefundTotal = computed(() => {
let sum = 0
for (const o of completeOrderLinkedPays.value) {
const st = Number(o?.status)
if (st === 2 || st === 5) {
sum += Number(o?.amount) || 0
}
}
return Math.round(sum * 100) / 100
})
let completeOrderLogisticsRequestSeq = 0
function onCompleteOrderDialogClosed() {
completeOrderId.value = 0
completeOrderLinkedPays.value = []
completeOrderPayLoading.value = false
completeRefundForm.reason = ''
completeRefundFormRef.value?.clearValidate()
completeOrderLogisticsRequestSeq += 1
completeOrderLogisticsPayload.value = null
completeOrderLogisticsLoading.value = false
}
async function loadCompleteOrderPayContext(orderId: number) {
if (!orderId) {
completeOrderLinkedPays.value = []
return
}
completeOrderPayLoading.value = true
try {
const r: any = await prescriptionOrderDetail({ id: orderId })
const d = r?.data ?? r ?? null
const arr = d?.linked_pay_orders
completeOrderLinkedPays.value = Array.isArray(arr) ? arr : []
} catch {
completeOrderLinkedPays.value = []
} finally {
completeOrderPayLoading.value = false
}
}
async function fetchCompleteOrderLogisticsForDialog(row: {
id: number
tracking_number?: unknown
@@ -5306,6 +5415,32 @@ async function fetchCompleteOrderLogisticsForDialog(row: {
async function submitCompleteOrder() {
const id = completeOrderId.value
if (!id) return
if (completeFulfillmentStatus.value === 10) {
const valid = await completeRefundFormRef.value?.validate().catch(() => false)
if (!valid) return
completeOrderSubmitting.value = true
try {
await prescriptionOrderRefund({ id, reason: completeRefundForm.reason.trim() })
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
await fetchLogs(id)
} catch { /* 静默 */ }
}
} catch {
/* 拦截器已提示 */
} finally {
completeOrderSubmitting.value = false
}
return
}
completeOrderSubmitting.value = true
try {
await prescriptionOrderComplete({ id, fulfillment_status: completeFulfillmentStatus.value })
@@ -5540,8 +5675,11 @@ function confirmComplete(row: {
}) {
completeOrderId.value = row.id
completeFulfillmentStatus.value = 3
completeRefundForm.reason = ''
completeOrderLinkedPays.value = []
completeOrderLogisticsPayload.value = null
completeOrderDialogVisible.value = true
void loadCompleteOrderPayContext(row.id)
if (String(row.tracking_number || '').trim()) {
void fetchCompleteOrderLogisticsForDialog(row)
}
@@ -1845,9 +1845,11 @@
:close-on-click-modal="false"
destroy-on-close
class="po-h5-dialog"
@closed="completeOrderId = 0"
@closed="onCompleteOrderDialogClosed"
>
<p class="text-sm text-gray-600 mb-3">请选择本单结案状态选择已完成实付将按已关联的支付单金额汇总</p>
<p class="text-sm text-gray-600 mb-3">
选择已完成按关联收款汇总实付选择退款将关联收款标记已退款并清零已付
</p>
<el-select
v-model="completeFulfillmentStatus"
class="w-full"
@@ -1860,10 +1862,43 @@
:value="opt.value"
/>
</el-select>
<template v-if="completeFulfillmentStatus === 10">
<el-alert
type="warning"
:closable="false"
show-icon
class="mt-3"
title="关联收款将标记已退款,本单已付清零,不可撤销。"
/>
<p v-if="completeOrderLinkedPays.length" class="text-xs text-amber-800 mt-2">
将退款 {{ completeOrderLinkedPays.length }} 笔关联收款合计 ¥{{ formatMoney(completeOrderRefundTotal) }}
</p>
<el-form
ref="completeRefundFormRef"
:model="completeRefundForm"
:rules="completeRefundRules"
label-width="80px"
class="mt-2"
>
<el-form-item label="退款原因" prop="reason">
<el-input
v-model="completeRefundForm.reason"
type="textarea"
:rows="3"
maxlength="500"
placeholder="必填"
/>
</el-form-item>
</el-form>
</template>
<template #footer>
<el-button @click="completeOrderDialogVisible = false">取消</el-button>
<el-button type="primary" :loading="completeOrderSubmitting" @click="submitCompleteOrder">
确定
<el-button
:type="completeFulfillmentStatus === 10 ? 'danger' : 'primary'"
:loading="completeOrderSubmitting"
@click="submitCompleteOrder"
>
{{ completeFulfillmentStatus === 10 ? '确认退款' : '确定' }}
</el-button>
</template>
</el-dialog>
@@ -3288,7 +3323,8 @@ function canCompleteRow(row: { fulfillment_status?: number; payment_slip_audit_s
}
function canRefundRow(row: { fulfillment_status?: number; payment_slip_audit_status?: number }) {
return canCompleteRow(row)
const fs = Number(row.fulfillment_status)
return (fs === 5 || fs === 6 || fs === 3) && Number(row.payment_slip_audit_status) === 1
}
function canQuickTrackRow(row: { fulfillment_status?: number }) {
@@ -4609,6 +4645,7 @@ const completeOrderStatusOptions = [
{ value: 7, label: '进行中' },
{ value: 8, label: '暂不制药' },
{ value: 9, label: '拒收' },
{ value: 10, label: '退款' },
{ value: 11, label: '保留药方' },
{ value: 12, label: '制药缓发' }
] as const
@@ -4617,10 +4654,71 @@ const completeOrderDialogVisible = ref(false)
const completeOrderId = ref(0)
const completeFulfillmentStatus = ref<number>(3)
const completeOrderSubmitting = ref(false)
const completeOrderLinkedPays = ref<any[]>([])
const completeRefundFormRef = ref<FormInstance>()
const completeRefundForm = reactive({ reason: '' })
const completeRefundRules: FormRules = {
reason: [{ required: true, message: '请填写退款原因', trigger: 'blur' }]
}
const completeOrderRefundTotal = computed(() => {
let sum = 0
for (const o of completeOrderLinkedPays.value) {
const st = Number(o?.status)
if (st === 2 || st === 5) sum += Number(o?.amount) || 0
}
return Math.round(sum * 100) / 100
})
function onCompleteOrderDialogClosed() {
completeOrderId.value = 0
completeOrderLinkedPays.value = []
completeRefundForm.reason = ''
completeRefundFormRef.value?.clearValidate()
}
async function loadCompleteOrderPayContext(orderId: number) {
if (!orderId) {
completeOrderLinkedPays.value = []
return
}
try {
const r: any = await prescriptionOrderDetail({ id: orderId })
const d = r?.data ?? r ?? null
completeOrderLinkedPays.value = Array.isArray(d?.linked_pay_orders) ? d.linked_pay_orders : []
} catch {
completeOrderLinkedPays.value = []
}
}
async function submitCompleteOrder() {
const id = completeOrderId.value
if (!id) return
if (completeFulfillmentStatus.value === 10) {
const valid = await completeRefundFormRef.value?.validate().catch(() => false)
if (!valid) return
completeOrderSubmitting.value = true
try {
await prescriptionOrderRefund({ id, reason: completeRefundForm.reason.trim() })
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
await fetchLogs(id)
} catch { /* 静默 */ }
}
} catch {
/* 拦截器已提示 */
} finally {
completeOrderSubmitting.value = false
}
return
}
completeOrderSubmitting.value = true
try {
await prescriptionOrderComplete({ id, fulfillment_status: completeFulfillmentStatus.value })
@@ -4830,7 +4928,10 @@ async function submitAddPayOrder() {
function confirmComplete(row: { id: number }) {
completeOrderId.value = row.id
completeFulfillmentStatus.value = 3
completeRefundForm.reason = ''
completeOrderLinkedPays.value = []
completeOrderDialogVisible.value = true
void loadCompleteOrderPayContext(row.id)
}
//