This commit is contained in:
Your Name
2026-06-04 09:25:00 +08:00
parent 6b528c34c8
commit 5ab3be1fdd
7 changed files with 361 additions and 64 deletions
+2 -2
View File
@@ -487,8 +487,8 @@ export function prescriptionOrderComplete(params: { id: number; fulfillment_stat
return request.post({ url: '/tcm.prescriptionOrder/complete', params })
}
/** 业务订单退款(须填写原因;关联收款单标记已退款、已付总额清零 */
export function prescriptionOrderRefund(params: { id: number; reason: string }) {
/** 业务订单退款(须填写原因;refund_amount 可选,不传则退满可退上限 */
export function prescriptionOrderRefund(params: { id: number; reason: string; refund_amount?: number }) {
return request.post({ url: '/tcm.prescriptionOrder/refund', params })
}
@@ -2163,6 +2163,20 @@
label-width="88px"
class="mt-3"
>
<el-form-item label="退款金额" prop="refund_amount">
<el-input-number
v-model="completeRefundForm.refund_amount"
:min="0.01"
:max="completeOrderRefundMax > 0 ? completeOrderRefundMax : undefined"
:step="0.01"
:precision="2"
class="w-full"
controls-position="right"
/>
<div class="text-xs text-gray-500 mt-1">
可退上限 ¥{{ formatMoney(completeOrderRefundMax) }}
</div>
</el-form-item>
<el-form-item label="退款原因" prop="reason">
<el-input
v-model="completeRefundForm.reason"
@@ -2201,9 +2215,23 @@
:closable="false"
show-icon
class="mb-4 !items-start"
title="确认退款后,关联收款记录将全部标记为「已退款」,已付总额清零,且不可撤销。"
:title="refundOrderAlertTitle"
/>
<el-form ref="refundOrderFormRef" :model="refundOrderForm" :rules="refundOrderRules" label-width="88px">
<el-form-item label="退款金额" prop="refund_amount">
<el-input-number
v-model="refundOrderForm.refund_amount"
:min="0.01"
:max="refundOrderMaxAmount > 0 ? refundOrderMaxAmount : undefined"
:step="0.01"
:precision="2"
class="w-full"
controls-position="right"
/>
<div class="text-xs text-gray-500 mt-1">
可退上限 ¥{{ formatMoney(refundOrderMaxAmount) }}默认全额部分退款时按金额从关联收款单依次标记已退款并扣减本单已付
</div>
</el-form-item>
<el-form-item label="退款原因" prop="reason">
<el-input
v-model="refundOrderForm.reason"
@@ -5332,20 +5360,31 @@ 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
const completeRefundForm = reactive({ reason: '', refund_amount: undefined as number | undefined })
const completeOrderRefundMax = ref(0)
const completeOrderRefundTotal = computed(() => calcRefundableFromLinkedPays(completeOrderLinkedPays.value))
const completeRefundRules = computed<FormRules>(() => ({
refund_amount: [
{ required: true, message: '请输入退款金额', trigger: 'change' },
{
validator: (_rule, v, cb) => {
const n = Number(v)
const cap = completeOrderRefundMax.value
if (!Number.isFinite(n) || n <= 0) {
cb(new Error('退款金额须大于 0'))
return
}
if (cap > 0 && n > cap + 0.009) {
cb(new Error(`不能超过可退上限 ¥${formatMoney(cap)}`))
return
}
cb()
},
trigger: 'change'
}
}
return Math.round(sum * 100) / 100
})
],
reason: [{ required: true, message: '请填写退款原因', trigger: 'blur' }]
}))
let completeOrderLogisticsRequestSeq = 0
function onCompleteOrderDialogClosed() {
@@ -5353,6 +5392,8 @@ function onCompleteOrderDialogClosed() {
completeOrderLinkedPays.value = []
completeOrderPayLoading.value = false
completeRefundForm.reason = ''
completeRefundForm.refund_amount = undefined
completeOrderRefundMax.value = 0
completeRefundFormRef.value?.clearValidate()
completeOrderLogisticsRequestSeq += 1
completeOrderLogisticsPayload.value = null
@@ -5370,8 +5411,13 @@ async function loadCompleteOrderPayContext(orderId: number) {
const d = r?.data ?? r ?? null
const arr = d?.linked_pay_orders
completeOrderLinkedPays.value = Array.isArray(arr) ? arr : []
const linkedMax = calcRefundableFromLinkedPays(completeOrderLinkedPays.value)
const paid = Number(d?.paid) || 0
completeOrderRefundMax.value = linkedMax > 0 ? linkedMax : paid
completeRefundForm.refund_amount = completeOrderRefundMax.value
} catch {
completeOrderLinkedPays.value = []
completeOrderRefundMax.value = 0
} finally {
completeOrderPayLoading.value = false
}
@@ -5421,7 +5467,11 @@ async function submitCompleteOrder() {
if (!valid) return
completeOrderSubmitting.value = true
try {
await prescriptionOrderRefund({ id, reason: completeRefundForm.reason.trim() })
await prescriptionOrderRefund({
id,
reason: completeRefundForm.reason.trim(),
refund_amount: Number(completeRefundForm.refund_amount)
})
feedback.msgSuccess('退款成功')
completeOrderDialogVisible.value = false
getLists()
@@ -5462,25 +5512,79 @@ async function submitCompleteOrder() {
}
// 退/ +
function calcRefundableFromLinkedPays(list: any[]) {
let sum = 0
for (const o of list || []) {
const st = Number(o?.status)
if (st === 2 || st === 5) {
sum += Number(o?.amount) || 0
}
}
return Math.round(sum * 100) / 100
}
const refundOrderDialogVisible = ref(false)
const refundOrderId = ref(0)
const refundOrderSubmitting = ref(false)
const refundOrderFormRef = ref<FormInstance>()
const refundOrderForm = reactive({ reason: '' })
const refundOrderRules: FormRules = {
const refundOrderMaxAmount = ref(0)
const refundOrderForm = reactive({ reason: '', refund_amount: undefined as number | undefined })
const refundOrderAlertTitle = computed(() => {
const cap = formatMoney(refundOrderMaxAmount.value)
const amt = formatMoney(refundOrderForm.refund_amount)
if (Number(refundOrderForm.refund_amount) >= refundOrderMaxAmount.value - 0.009) {
return `确认全额退款 ¥${cap}:关联收款将标记已退款,本单已付清零,且不可撤销。`
}
return `确认部分退款 ¥${amt}(可退上限 ¥${cap}):将扣减本单已付,并按金额依次标记关联收款已退款。`
})
const refundOrderRules = computed<FormRules>(() => ({
refund_amount: [
{ required: true, message: '请输入退款金额', trigger: 'change' },
{
validator: (_rule, v, cb) => {
const n = Number(v)
const cap = refundOrderMaxAmount.value
if (!Number.isFinite(n) || n <= 0) {
cb(new Error('退款金额须大于 0'))
return
}
if (cap > 0 && n > cap + 0.009) {
cb(new Error(`不能超过可退上限 ¥${formatMoney(cap)}`))
return
}
cb()
},
trigger: 'change'
}
],
reason: [{ required: true, message: '请填写退款原因', trigger: 'blur' }]
}
}))
function onRefundOrderDialogClosed() {
refundOrderId.value = 0
refundOrderForm.reason = ''
refundOrderForm.refund_amount = undefined
refundOrderMaxAmount.value = 0
refundOrderFormRef.value?.clearValidate()
}
function openRefundOrder(row: { id: number }) {
async function openRefundOrder(row: { id: number }) {
refundOrderId.value = row.id
refundOrderForm.reason = ''
refundOrderForm.refund_amount = undefined
refundOrderMaxAmount.value = 0
refundOrderDialogVisible.value = true
try {
const r: any = await prescriptionOrderDetail({ id: row.id })
const d = r?.data ?? r ?? null
const linked = Array.isArray(d?.linked_pay_orders) ? d.linked_pay_orders : []
const linkedMax = calcRefundableFromLinkedPays(linked)
const paid = Number(d?.paid) || 0
refundOrderMaxAmount.value = linkedMax > 0 ? linkedMax : paid
refundOrderForm.refund_amount = refundOrderMaxAmount.value
} catch {
refundOrderMaxAmount.value = 0
}
}
async function submitRefundOrder() {
@@ -5490,7 +5594,11 @@ async function submitRefundOrder() {
if (!valid) return
refundOrderSubmitting.value = true
try {
await prescriptionOrderRefund({ id, reason: refundOrderForm.reason.trim() })
await prescriptionOrderRefund({
id,
reason: refundOrderForm.reason.trim(),
refund_amount: Number(refundOrderForm.refund_amount)
})
feedback.msgSuccess('退款成功')
refundOrderDialogVisible.value = false
getLists()
@@ -5676,6 +5784,7 @@ function confirmComplete(row: {
completeOrderId.value = row.id
completeFulfillmentStatus.value = 3
completeRefundForm.reason = ''
completeRefundForm.refund_amount = undefined
completeOrderLinkedPays.value = []
completeOrderLogisticsPayload.value = null
completeOrderDialogVisible.value = true
@@ -1880,6 +1880,17 @@
label-width="80px"
class="mt-2"
>
<el-form-item label="退款金额" prop="refund_amount">
<el-input-number
v-model="completeRefundForm.refund_amount"
:min="0.01"
:max="completeOrderRefundMax > 0 ? completeOrderRefundMax : undefined"
:step="0.01"
:precision="2"
class="w-full"
/>
<div class="text-xs text-gray-500 mt-1">可退上限 ¥{{ formatMoney(completeOrderRefundMax) }}</div>
</el-form-item>
<el-form-item label="退款原因" prop="reason">
<el-input
v-model="completeRefundForm.reason"
@@ -1917,9 +1928,20 @@
:closable="false"
show-icon
class="mb-4 !items-start"
title="确认退款后,关联收款记录将全部标记为「已退款」,已付总额清零,且不可撤销。"
:title="refundOrderAlertTitle"
/>
<el-form ref="refundOrderFormRef" :model="refundOrderForm" :rules="refundOrderRules" label-width="88px">
<el-form-item label="退款金额" prop="refund_amount">
<el-input-number
v-model="refundOrderForm.refund_amount"
:min="0.01"
:max="refundOrderMaxAmount > 0 ? refundOrderMaxAmount : undefined"
:step="0.01"
:precision="2"
class="w-full"
/>
<div class="text-xs text-gray-500 mt-1">可退上限 ¥{{ formatMoney(refundOrderMaxAmount) }}</div>
</el-form-item>
<el-form-item label="退款原因" prop="reason">
<el-input
v-model="refundOrderForm.reason"
@@ -4656,23 +4678,41 @@ 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(() => {
function calcRefundableFromLinkedPays(list: any[]) {
let sum = 0
for (const o of completeOrderLinkedPays.value) {
for (const o of list || []) {
const st = Number(o?.status)
if (st === 2 || st === 5) sum += Number(o?.amount) || 0
}
return Math.round(sum * 100) / 100
})
}
const completeRefundForm = reactive({ reason: '', refund_amount: undefined as number | undefined })
const completeOrderRefundMax = ref(0)
const completeOrderRefundTotal = computed(() => calcRefundableFromLinkedPays(completeOrderLinkedPays.value))
const completeRefundRules = computed<FormRules>(() => ({
refund_amount: [
{ required: true, message: '请输入退款金额', trigger: 'change' },
{
validator: (_r, v, cb) => {
const n = Number(v)
const cap = completeOrderRefundMax.value
if (!Number.isFinite(n) || n <= 0) return cb(new Error('退款金额须大于 0'))
if (cap > 0 && n > cap + 0.009) return cb(new Error(`不能超过 ¥${formatMoney(cap)}`))
cb()
},
trigger: 'change'
}
],
reason: [{ required: true, message: '请填写退款原因', trigger: 'blur' }]
}))
function onCompleteOrderDialogClosed() {
completeOrderId.value = 0
completeOrderLinkedPays.value = []
completeRefundForm.reason = ''
completeRefundForm.refund_amount = undefined
completeOrderRefundMax.value = 0
completeRefundFormRef.value?.clearValidate()
}
@@ -4685,8 +4725,13 @@ async function loadCompleteOrderPayContext(orderId: number) {
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 : []
const linkedMax = calcRefundableFromLinkedPays(completeOrderLinkedPays.value)
const paid = Number(d?.paid) || 0
completeOrderRefundMax.value = linkedMax > 0 ? linkedMax : paid
completeRefundForm.refund_amount = completeOrderRefundMax.value
} catch {
completeOrderLinkedPays.value = []
completeOrderRefundMax.value = 0
}
}
@@ -4699,7 +4744,11 @@ async function submitCompleteOrder() {
if (!valid) return
completeOrderSubmitting.value = true
try {
await prescriptionOrderRefund({ id, reason: completeRefundForm.reason.trim() })
await prescriptionOrderRefund({
id,
reason: completeRefundForm.reason.trim(),
refund_amount: Number(completeRefundForm.refund_amount)
})
feedback.msgSuccess('退款成功')
completeOrderDialogVisible.value = false
getLists()
@@ -4743,21 +4792,57 @@ const refundOrderDialogVisible = ref(false)
const refundOrderId = ref(0)
const refundOrderSubmitting = ref(false)
const refundOrderFormRef = ref<FormInstance>()
const refundOrderForm = reactive({ reason: '' })
const refundOrderRules: FormRules = {
const refundOrderMaxAmount = ref(0)
const refundOrderForm = reactive({ reason: '', refund_amount: undefined as number | undefined })
const refundOrderAlertTitle = computed(() => {
const cap = formatMoney(refundOrderMaxAmount.value)
const amt = formatMoney(refundOrderForm.refund_amount)
if (Number(refundOrderForm.refund_amount) >= refundOrderMaxAmount.value - 0.009) {
return `全额退款 ¥${cap}:关联收款标记已退款,已付清零。`
}
return `部分退款 ¥${amt}(上限 ¥${cap}`
})
const refundOrderRules = computed<FormRules>(() => ({
refund_amount: [
{ required: true, message: '请输入退款金额', trigger: 'change' },
{
validator: (_r, v, cb) => {
const n = Number(v)
const cap = refundOrderMaxAmount.value
if (!Number.isFinite(n) || n <= 0) return cb(new Error('退款金额须大于 0'))
if (cap > 0 && n > cap + 0.009) return cb(new Error(`不能超过 ¥${formatMoney(cap)}`))
cb()
},
trigger: 'change'
}
],
reason: [{ required: true, message: '请填写退款原因', trigger: 'blur' }]
}
}))
function onRefundOrderDialogClosed() {
refundOrderId.value = 0
refundOrderForm.reason = ''
refundOrderForm.refund_amount = undefined
refundOrderMaxAmount.value = 0
refundOrderFormRef.value?.clearValidate()
}
function openRefundOrder(row: { id: number }) {
async function openRefundOrder(row: { id: number }) {
refundOrderId.value = row.id
refundOrderForm.reason = ''
refundOrderMaxAmount.value = 0
refundOrderDialogVisible.value = true
try {
const r: any = await prescriptionOrderDetail({ id: row.id })
const d = r?.data ?? r ?? null
const linked = Array.isArray(d?.linked_pay_orders) ? d.linked_pay_orders : []
const linkedMax = calcRefundableFromLinkedPays(linked)
const paid = Number(d?.paid) || 0
refundOrderMaxAmount.value = linkedMax > 0 ? linkedMax : paid
refundOrderForm.refund_amount = refundOrderMaxAmount.value
} catch {
refundOrderMaxAmount.value = 0
}
}
async function submitRefundOrder() {
@@ -4767,7 +4852,11 @@ async function submitRefundOrder() {
if (!valid) return
refundOrderSubmitting.value = true
try {
await prescriptionOrderRefund({ id, reason: refundOrderForm.reason.trim() })
await prescriptionOrderRefund({
id,
reason: refundOrderForm.reason.trim(),
refund_amount: Number(refundOrderForm.refund_amount)
})
feedback.msgSuccess('退款成功')
refundOrderDialogVisible.value = false
getLists()