Merge branch '20260604-long'

This commit is contained in:
2026-06-09 10:13:49 +08:00
9 changed files with 313 additions and 70 deletions
@@ -1096,6 +1096,11 @@
<el-tag v-if="row.is_exempt === 1" type="warning" size="small" class="ml-1">豁免</el-tag>
</template>
</el-table-column>
<el-table-column label="方式" min-width="120" show-overflow-tooltip>
<template #default="{ row }">
{{ formatPayOrderSource(row) }}
</template>
</el-table-column>
<el-table-column prop="creator_name" label="创建人" width="80" show-overflow-tooltip />
<el-table-column label="创建时间" min-width="136">
<template #default="{ row }">
@@ -1154,6 +1159,11 @@
<el-tag v-if="row.is_exempt === 1" type="warning" size="small" class="ml-1">豁免</el-tag>
</template>
</el-table-column>
<el-table-column label="方式" min-width="120" show-overflow-tooltip>
<template #default="{ row }">
{{ formatPayOrderSource(row) }}
</template>
</el-table-column>
<el-table-column prop="creator_name" label="创建人" width="80" show-overflow-tooltip />
<el-table-column label="创建时间" min-width="136">
<template #default="{ row }">
@@ -1783,7 +1793,7 @@
<el-option
v-for="o in editPaidOrders"
:key="o.id"
:label="`${o.order_no} · ¥${o.amount} · ${formatPoCategory(o.order_type)}`"
:label="`${o.order_no} · ¥${o.amount} · ${formatPoCategory(o.order_type)} · ${formatPayOrderSource(o)}`"
:value="o.id"
class="!h-auto py-1.5"
>
@@ -1793,7 +1803,7 @@
<span class="text-orange-500 font-medium ml-4">¥{{ o.amount }}</span>
</div>
<div class="flex items-center justify-between text-xs text-gray-400 mt-1">
<span class="truncate pr-2">{{ formatPoCategory(o.order_type) }}<template v-if="o.remark"> · {{ o.remark }}</template></span>
<span class="truncate pr-2">{{ formatPoCategory(o.order_type) }} · {{ formatPayOrderSource(o) }}<template v-if="o.remark"> · {{ o.remark }}</template></span>
<span class="shrink-0">{{ String(o.create_time || '').substring(0, 16) }}</span>
</div>
</div>
@@ -2287,13 +2297,13 @@
>
<el-form-item label="添加方式" prop="add_mode">
<el-radio-group v-model="addPayOrderForm.add_mode">
<el-radio value="create">手动创建</el-radio>
<el-radio value="create">付呗</el-radio>
<el-radio value="link">关联已有</el-radio>
<el-radio value="completion_only">直接完单申请</el-radio>
</el-radio-group>
</el-form-item>
<!-- 手动创建模式 -->
<!-- 付呗手动创建支付单 -->
<template v-if="addPayOrderForm.add_mode === 'create'">
<el-form-item label="费用类别" prop="order_type">
<el-select v-model="addPayOrderForm.order_type" class="w-full">
@@ -2358,12 +2368,17 @@
<el-option
v-for="o in addPayOrderAvailableList"
:key="o.id"
:label="`${o.order_no} · ¥${o.amount} · ${formatPoCategory(o.order_type)}`"
:label="`${o.order_no} · ¥${o.amount} · ${formatPoCategory(o.order_type)} · ${formatPayOrderSource(o)}`"
:value="o.id"
>
<div class="flex items-center justify-between">
<span class="text-sm">{{ o.order_no }}</span>
<span class="text-orange-500 font-medium ml-4">¥{{ o.amount }}</span>
<div class="flex flex-col gap-0.5 py-0.5">
<div class="flex items-center justify-between">
<span class="text-sm">{{ o.order_no }}</span>
<span class="text-orange-500 font-medium ml-4">¥{{ o.amount }}</span>
</div>
<div class="text-xs text-gray-400">
{{ formatPoCategory(o.order_type) }} · {{ formatPayOrderSource(o) }}
</div>
</div>
</el-option>
</el-select>
@@ -3980,10 +3995,14 @@ const detailLinkedPayOrders = computed(() => {
return Array.isArray(arr) ? arr : []
})
/** 需代收:业务订单总金额 关联已付总额 */
/** 需代收:优先用关联时记录的固定快照值;历史单(无快照)回退实时计算 总金额 关联已付总额 */
const detailAgencyToCollect = computed(() => {
const d = detailData.value
if (!d) return 0
const snap = d.agency_collect_amount
if (snap !== null && snap !== undefined && snap !== '') {
return Number(snap) || 0
}
const total = Number(d.amount) || 0
const paid = Number(d.linked_pay_paid_total) || 0
return Math.round((total - paid) * 100) / 100
@@ -4692,7 +4711,7 @@ const editDiagnosisCreatorDeptBreadcrumbs = computed(() => {
.filter((segs) => segs.length > 0)
})
const editPaidOrders = ref<Array<{ id: number; order_no?: string; amount?: number | string; order_type?: number | string; remark?: string; create_time?: string }>>([])
const editPaidOrders = ref<Array<{ id: number; order_no?: string; amount?: number | string; order_type?: number | string; remark?: string; create_time?: string; payment_method?: string; create_type?: string }>>([])
const editPaidOrdersLoading = ref(false)
const editDepositMin = ref(0)
@@ -4708,6 +4727,24 @@ function formatPoCategory(t: unknown) {
return m[Number(t)] || '未知'
}
function formatPayOrderSource(row: { payment_method?: unknown; create_type?: unknown }) {
const createType = String(row?.create_type || '')
if (createType === 'wechat_work') return '企业微信对外收款'
if (createType === 'fubei') return '付呗'
const paymentMethod = String(row?.payment_method || '')
const methodMap: Record<string, string> = {
alipay: '支付宝',
wechat: '微信',
wechat_work: '企业微信',
fubei: '付呗',
manual: '手动确认到账'
}
if (paymentMethod && methodMap[paymentMethod]) {
return methodMap[paymentMethod]
}
return '普通订单'
}
const editLinkedPaidTotal = computed(() => {
const ids = new Set(editForm.pay_order_ids.map((x) => Number(x)))
let s = 0
@@ -5701,7 +5738,7 @@ const addPayOrderAlertTitle = computed(() => {
if (addPayOrderForm.add_mode === 'completion_only') {
return '不创建或关联支付单,仅提交完单申请,由审核人员在支付审核时处理。'
}
return '可以手动创建新支付单,或关联已存在但未绑定的支付单。'
return '可以通过付呗创建新支付单,或关联已存在但未绑定的支付单。'
})
const addPayOrderForm = reactive({
@@ -962,6 +962,11 @@
<el-tag v-if="row.is_exempt === 1" type="warning" size="small" class="ml-1">豁免</el-tag>
</template>
</el-table-column>
<el-table-column label="方式" min-width="120" show-overflow-tooltip>
<template #default="{ row }">
{{ formatPayOrderSource(row) }}
</template>
</el-table-column>
<el-table-column prop="creator_name" label="创建人" width="80" show-overflow-tooltip />
<el-table-column label="创建时间" min-width="136">
<template #default="{ row }">
@@ -1020,6 +1025,11 @@
<el-tag v-if="row.is_exempt === 1" type="warning" size="small" class="ml-1">豁免</el-tag>
</template>
</el-table-column>
<el-table-column label="方式" min-width="120" show-overflow-tooltip>
<template #default="{ row }">
{{ formatPayOrderSource(row) }}
</template>
</el-table-column>
<el-table-column prop="creator_name" label="创建人" width="80" show-overflow-tooltip />
<el-table-column label="创建时间" min-width="136">
<template #default="{ row }">
@@ -1555,7 +1565,7 @@
<el-option
v-for="o in editPaidOrders"
:key="o.id"
:label="`${o.order_no} · ¥${o.amount} · ${formatPoCategory(o.order_type)}`"
:label="`${o.order_no} · ¥${o.amount} · ${formatPoCategory(o.order_type)} · ${formatPayOrderSource(o)}`"
:value="o.id"
class="!h-auto py-1.5"
>
@@ -1565,7 +1575,7 @@
<span class="text-orange-500 font-medium ml-4">¥{{ o.amount }}</span>
</div>
<div class="flex items-center justify-between text-xs text-gray-400 mt-1">
<span class="truncate pr-2">{{ formatPoCategory(o.order_type) }}<template v-if="o.remark"> · {{ o.remark }}</template></span>
<span class="truncate pr-2">{{ formatPoCategory(o.order_type) }} · {{ formatPayOrderSource(o) }}<template v-if="o.remark"> · {{ o.remark }}</template></span>
<span class="shrink-0">{{ String(o.create_time || '').substring(0, 16) }}</span>
</div>
</div>
@@ -1971,7 +1981,7 @@
@closed="addPayOrderFormRef?.clearValidate()"
>
<el-alert
title="可以手动创建新支付单,或关联已存在但未绑定的支付单。"
:title="addPayOrderAlertTitle"
type="info"
:closable="false"
show-icon
@@ -1987,12 +1997,13 @@
>
<el-form-item label="添加方式" prop="add_mode">
<el-radio-group v-model="addPayOrderForm.add_mode">
<el-radio value="create">手动创建</el-radio>
<el-radio value="create">付呗</el-radio>
<el-radio value="link">关联已有</el-radio>
<el-radio value="completion_only">直接完单申请</el-radio>
</el-radio-group>
</el-form-item>
<!-- 手动创建模式 -->
<!-- 付呗手动创建支付单 -->
<template v-if="addPayOrderForm.add_mode === 'create'">
<el-form-item label="费用类别" prop="order_type">
<el-select v-model="addPayOrderForm.order_type" class="w-full">
@@ -2028,6 +2039,20 @@
</el-form-item>
</template>
<!-- 直接完单申请不创建/关联支付单 -->
<template v-else-if="addPayOrderForm.add_mode === 'completion_only'">
<el-alert
type="warning"
:closable="false"
show-icon
class="!mb-0"
>
<template #title>
不新增或关联支付单仅向审核人员提交完成订单申请提交后支付审核将变为待审核审核通过后将自动结案
</template>
</el-alert>
</template>
<!-- 关联已有模式 -->
<template v-else>
<el-form-item label="选择支付单" prop="link_pay_order_id">
@@ -2043,12 +2068,17 @@
<el-option
v-for="o in addPayOrderAvailableList"
:key="o.id"
:label="`${o.order_no} · ¥${o.amount} · ${formatPoCategory(o.order_type)}`"
:label="`${o.order_no} · ¥${o.amount} · ${formatPoCategory(o.order_type)} · ${formatPayOrderSource(o)}`"
:value="o.id"
>
<div class="flex items-center justify-between">
<span class="text-sm">{{ o.order_no }}</span>
<span class="text-orange-500 font-medium ml-4">¥{{ o.amount }}</span>
<div class="flex flex-col gap-0.5 py-0.5">
<div class="flex items-center justify-between">
<span class="text-sm">{{ o.order_no }}</span>
<span class="text-orange-500 font-medium ml-4">¥{{ o.amount }}</span>
</div>
<div class="text-xs text-gray-400">
{{ formatPoCategory(o.order_type) }} · {{ formatPayOrderSource(o) }}
</div>
</div>
</el-option>
</el-select>
@@ -2059,7 +2089,7 @@
</template>
<!-- 完单申请选项 -->
<el-form-item label="完单申请">
<el-form-item v-if="addPayOrderForm.add_mode !== 'completion_only'" label="完单申请">
<el-radio-group v-model="addPayOrderForm.completion_request">
<el-radio :value="0">不申请</el-radio>
<el-radio :value="1">申请完成订单</el-radio>
@@ -2531,6 +2561,7 @@ import {
prescriptionOrderRevokePayAudit,
prescriptionOrderPatchPrescriptionPatient,
prescriptionOrderLinkPayOrder,
prescriptionOrderRequestCompletion,
prescriptionOrderSubmitGancaoRecipel,
prescriptionOrderPreviewGancaoRecipel,
prescriptionDetail,
@@ -3495,10 +3526,14 @@ const detailLinkedPayOrders = computed(() => {
return Array.isArray(arr) ? arr : []
})
/** 需代收:业务订单总金额 关联已付总额 */
/** 需代收:优先用关联时记录的固定快照值;历史单(无快照)回退实时计算 总金额 关联已付总额 */
const detailAgencyToCollect = computed(() => {
const d = detailData.value
if (!d) return 0
const snap = d.agency_collect_amount
if (snap !== null && snap !== undefined && snap !== '') {
return Number(snap) || 0
}
const total = Number(d.amount) || 0
const paid = Number(d.linked_pay_paid_total) || 0
return Math.round((total - paid) * 100) / 100
@@ -4041,7 +4076,7 @@ const editDiagnosisCreatorDeptBreadcrumbs = computed(() => {
.filter((segs) => segs.length > 0)
})
const editPaidOrders = ref<Array<{ id: number; order_no?: string; amount?: number | string; order_type?: number | string; remark?: string; create_time?: string }>>([])
const editPaidOrders = ref<Array<{ id: number; order_no?: string; amount?: number | string; order_type?: number | string; remark?: string; create_time?: string; payment_method?: string; create_type?: string }>>([])
const editPaidOrdersLoading = ref(false)
const editDepositMin = ref(0)
@@ -4057,6 +4092,24 @@ function formatPoCategory(t: unknown) {
return m[Number(t)] || '未知'
}
function formatPayOrderSource(row: { payment_method?: unknown; create_type?: unknown }) {
const createType = String(row?.create_type || '')
if (createType === 'wechat_work') return '企业微信对外收款'
if (createType === 'fubei') return '付呗'
const paymentMethod = String(row?.payment_method || '')
const methodMap: Record<string, string> = {
alipay: '支付宝',
wechat: '微信',
wechat_work: '企业微信',
fubei: '付呗',
manual: '手动确认到账'
}
if (paymentMethod && methodMap[paymentMethod]) {
return methodMap[paymentMethod]
}
return '普通订单'
}
const editLinkedPaidTotal = computed(() => {
const ids = new Set(editForm.pay_order_ids.map((x) => Number(x)))
let s = 0
@@ -4898,8 +4951,14 @@ const addPayOrderRowId = ref(0)
const addPayOrderFormRef = ref<FormInstance>()
const addPayOrderAvailableLoading = ref(false)
const addPayOrderAvailableList = ref<any[]>([])
const addPayOrderAlertTitle = computed(() => {
if (addPayOrderForm.add_mode === 'completion_only') {
return '不创建或关联支付单,仅提交完单申请,由审核人员在支付审核时处理。'
}
return '可以通过付呗创建新支付单,或关联已存在但未绑定的支付单。'
})
const addPayOrderForm = reactive({
add_mode: 'create' as 'create' | 'link',
add_mode: 'create' as 'create' | 'link' | 'completion_only',
order_type: 3,
pay_amount: undefined as number | undefined,
pay_remark: '',
@@ -4907,38 +4966,44 @@ const addPayOrderForm = reactive({
completion_request: 0
})
const addPayOrderRules: FormRules = {
add_mode: [{ required: true, message: '请选择添加方式', trigger: 'change' }],
order_type: [{ required: true, message: '请选择费用类别', trigger: 'change' }],
pay_amount: [
{ required: true, message: '请输入支付金额', trigger: 'blur' },
{
validator: (_rule, v, cb) => {
const n = Number(v)
if (!Number.isFinite(n) || n <= 0) {
cb(new Error('金额须大于 0'))
} else {
cb()
}
},
trigger: 'blur'
}
],
link_pay_order_ids: [
{
required: true,
message: '请至少选择一个支付单',
trigger: 'change',
validator: (_rule, v, cb) => {
if (!Array.isArray(v) || v.length === 0) {
cb(new Error('请至少选择一个支付单'))
} else {
cb()
const addPayOrderRules = computed<FormRules>(() => {
const rules: FormRules = {
add_mode: [{ required: true, message: '请选择添加方式', trigger: 'change' }]
}
if (addPayOrderForm.add_mode === 'create') {
rules.order_type = [{ required: true, message: '请选择费用类别', trigger: 'change' }]
rules.pay_amount = [
{ required: true, message: '请输入支付金额', trigger: 'blur' },
{
validator: (_rule, v, cb) => {
const n = Number(v)
if (!Number.isFinite(n) || n <= 0) {
cb(new Error('金额须大于 0'))
} else {
cb()
}
},
trigger: 'blur'
}
]
} else if (addPayOrderForm.add_mode === 'link') {
rules.link_pay_order_ids = [
{
required: true,
message: '请至少选择一个支付单',
trigger: 'change',
validator: (_rule, v, cb) => {
if (!Array.isArray(v) || v.length === 0) {
cb(new Error('请至少选择一个支付单'))
} else {
cb()
}
}
}
}
]
}
]
}
return rules
})
async function loadAddPayOrderAvailable(diagnosisId: number, currentLinkedIds: number[] = []) {
if (!diagnosisId) {
@@ -4986,7 +5051,10 @@ async function submitAddPayOrder() {
await addPayOrderFormRef.value.validate()
addPayOrderSaving.value = true
try {
if (addPayOrderForm.add_mode === 'create') {
if (addPayOrderForm.add_mode === 'completion_only') {
await prescriptionOrderRequestCompletion({ id: addPayOrderRowId.value })
feedback.msgSuccess('完单申请已提交,请等待支付审核')
} else if (addPayOrderForm.add_mode === 'create') {
//
await prescriptionOrderAddPayOrder({
id: addPayOrderRowId.value,
+27 -5
View File
@@ -174,9 +174,9 @@
</template>
</el-table-column>
<el-table-column label="支付方式" width="100">
<el-table-column label="支付方式" width="120">
<template #default="{ row }">
{{ getPaymentMethodText(row.payment_method) }}
{{ getCreateTypeText(row) }}
</template>
</el-table-column>
@@ -327,7 +327,7 @@
<span class="text-red-500 font-semibold">¥{{ detailData.amount }}</span>
</el-descriptions-item>
<el-descriptions-item label="支付方式">
{{ getPaymentMethodText(detailData.payment_method) }}
{{ getCreateTypeText(detailData) }}
</el-descriptions-item>
<el-descriptions-item label="支付时间">
{{ detailData.payment_time || '-' }}
@@ -1148,7 +1148,8 @@ const submitCreateOrder = async () => {
patient_id: createForm.patient_id,
order_type: createForm.order_type,
amount: createForm.amount,
remark: createForm.remark
remark: createForm.remark,
create_type: 'wechat_work'
}
const res: any = await orderCreateForWechatWork(params)
const orderNo = res?.order_no ?? res?.data?.order_no
@@ -1160,7 +1161,8 @@ const submitCreateOrder = async () => {
patient_id: createForm.patient_id,
order_type: createForm.order_type,
amount: createForm.amount,
remark: createForm.remark
remark: createForm.remark,
create_type: createForm.createType
}
if (createForm.createType === 'fubei') {
params.payment_channel = 'fubei'
@@ -1247,6 +1249,26 @@ const getPaymentMethodText = (method: string | null) => {
return methodMap[method] || '未知'
}
// 支付方式展示:优先按「创建方式」三值显示;历史单/无 create_type 时回退真实支付渠道文案
const getCreateTypeText = (row: any) => {
const createTypeMap: Record<string, string> = {
normal: '普通订单',
wechat_work: '企业微信对外收款',
fubei: '付呗'
}
const ct = row?.create_type
if (ct === 'wechat_work' || ct === 'fubei') {
return createTypeMap[ct]
}
if (ct === 'normal' && row?.payment_method) {
return getPaymentMethodText(row.payment_method)
}
if (ct && createTypeMap[ct]) {
return createTypeMap[ct]
}
return getPaymentMethodText(row?.payment_method)
}
// 编辑订单
const handleEditOrder = (row: any) => {
editOrderForm.value = {
@@ -415,6 +415,10 @@ const detailLinkedPayOrders = computed(() => {
const detailAgencyToCollect = computed(() => {
const d = detailData.value
if (!d) return 0
const snap = d.agency_collect_amount
if (snap !== null && snap !== undefined && snap !== '') {
return Number(snap) || 0
}
const total = Number(d.amount) || 0
const paid = Number(d.linked_pay_paid_total) || 0
return Math.round((total - paid) * 100) / 100