更新
This commit is contained in:
@@ -84,3 +84,18 @@ export function orderExport(params: any) {
|
||||
export function searchPatients(params: any) {
|
||||
return request.get({ url: '/tcm.diagnosis/searchPatient', params })
|
||||
}
|
||||
|
||||
/** 单条订单操作日志(分页) */
|
||||
export function orderActionLogs(params: { order_id: number; page_no?: number; page_size?: number }) {
|
||||
return request.get({ url: '/order.order/actionLogs', params })
|
||||
}
|
||||
|
||||
/** 按管理员统计操作次数(时间范围,未传时默认近 7 天) */
|
||||
export function orderActionLogStats(params?: { start_time?: string; end_time?: string; limit?: number }) {
|
||||
return request.get({ url: '/order.order/actionLogStats', params })
|
||||
}
|
||||
|
||||
/** 批量将支付单指派给医助 */
|
||||
export function orderBatchAssignAssistant(params: { order_ids: number[]; assistant_id: number }) {
|
||||
return request.post({ url: '/order.order/assignAssistant', params })
|
||||
}
|
||||
|
||||
@@ -388,8 +388,8 @@ export function prescriptionOrderLinkPayOrder(params: {
|
||||
return request.post({ url: '/tcm.prescriptionOrder/linkPayOrder', params })
|
||||
}
|
||||
|
||||
/** 将「已发货」且支付审核通过的订单标记为「已完成」 */
|
||||
export function prescriptionOrderComplete(params: { id: number }) {
|
||||
/** 将「已发货/已签收」且支付审核通过的订单结案(3=已完成 或 7-12 业务状态) */
|
||||
export function prescriptionOrderComplete(params: { id: number; fulfillment_status: number }) {
|
||||
return request.post({ url: '/tcm.prescriptionOrder/complete', params })
|
||||
}
|
||||
|
||||
|
||||
@@ -784,8 +784,8 @@ const formData = reactive<PrescriptionForm>({
|
||||
dose_unit: '剂',
|
||||
usage_days: 7,
|
||||
times_per_day: 2,
|
||||
usage_instruction: '水煎服,一日二次',
|
||||
usage_time: '饭前',
|
||||
usage_instruction: '',
|
||||
usage_time: '饭后',
|
||||
usage_way: '温水送服',
|
||||
dietary_taboo: [],
|
||||
usage_notes: '',
|
||||
|
||||
@@ -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
|
||||
|
||||
+344
-22
@@ -40,15 +40,21 @@
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item class="w-[280px]" label="订单类型">
|
||||
<el-select v-model="queryParams.order_type" placeholder="请选择" clearable>
|
||||
<el-select v-model="queryParams.order_type" class="w-full" placeholder="全部">
|
||||
<el-option label="全部" value="" />
|
||||
<el-option label="挂号费" :value="1" />
|
||||
<el-option label="问诊费" :value="2" />
|
||||
<el-option label="药品费用" :value="3" />
|
||||
<el-option label="首付费用" :value="4" />
|
||||
<el-option label="尾款费用" :value="5" />
|
||||
<el-option label="其他费用" :value="6" />
|
||||
<el-option label="全部费用" :value="7" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item class="w-[280px]" label="订单状态">
|
||||
<el-select v-model="queryParams.status" placeholder="请选择" clearable>
|
||||
<el-select v-model="queryParams.status" class="w-full" placeholder="全部">
|
||||
<el-option label="全部" value="" />
|
||||
<el-option label="待支付" :value="1" />
|
||||
<el-option label="已支付" :value="2" />
|
||||
<el-option label="已取消" :value="3" />
|
||||
@@ -67,6 +73,12 @@
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="handleSearch">查询</el-button>
|
||||
<el-button @click="handleReset">重置</el-button>
|
||||
<el-button
|
||||
v-perms="['order.order/lists']"
|
||||
@click="statsDialogVisible = true"
|
||||
>
|
||||
操作统计
|
||||
</el-button>
|
||||
<export-data
|
||||
v-perms="['order.order/export']"
|
||||
class="ml-2.5"
|
||||
@@ -113,11 +125,23 @@
|
||||
|
||||
<!-- 数据表格 -->
|
||||
<el-card class="!border-none mt-4" shadow="never">
|
||||
<div v-perms="['order.order/zhipai']" class="mb-3 flex items-center gap-3">
|
||||
<el-button type="primary" :disabled="!selectedOrderIds.length" @click="openAssignDialog">
|
||||
将创建人指给医助
|
||||
</el-button>
|
||||
<span v-if="selectedOrderIds.length" class="text-sm text-gray-500"
|
||||
>已选 {{ selectedOrderIds.length }} 条</span
|
||||
>
|
||||
</div>
|
||||
<el-table
|
||||
ref="orderTableRef"
|
||||
v-loading="pager.loading"
|
||||
:data="pager.lists"
|
||||
row-key="id"
|
||||
size="large"
|
||||
@selection-change="handleOrderSelectionChange"
|
||||
>
|
||||
<el-table-column type="selection" width="48" />
|
||||
<el-table-column label="订单号" prop="order_no" min-width="150" />
|
||||
|
||||
<el-table-column label="患者信息" min-width="150">
|
||||
@@ -202,7 +226,7 @@
|
||||
小程序码
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="row.status === 1"
|
||||
v-if="row.status === 1 || (row.status === 5 && row.payment_method === 'fubei')"
|
||||
v-perms="['order.order/pay']"
|
||||
type="success"
|
||||
link
|
||||
@@ -220,7 +244,7 @@
|
||||
退款
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="row.status === 1"
|
||||
v-if="row.status === 1 || (row.status === 5 && row.payment_method === 'fubei')"
|
||||
v-perms="['order.order/cancel']"
|
||||
type="danger"
|
||||
link
|
||||
@@ -249,7 +273,7 @@
|
||||
<el-dialog
|
||||
v-model="detailVisible"
|
||||
title="订单详情"
|
||||
width="700px"
|
||||
width="820px"
|
||||
>
|
||||
<el-descriptions :column="2" border v-if="detailData">
|
||||
<el-descriptions-item label="订单号">
|
||||
@@ -296,6 +320,87 @@
|
||||
{{ detailData.remark || '无' }}
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
<el-divider content-position="left" v-if="detailData">操作记录</el-divider>
|
||||
<p v-if="detailData" class="text-xs text-gray-500 mb-2">谁在什么时间对本单做了哪些操作(数据来自服务器记录)。</p>
|
||||
<el-table
|
||||
v-if="detailData"
|
||||
v-loading="actionLogLoading"
|
||||
:data="actionLogList"
|
||||
size="small"
|
||||
max-height="320"
|
||||
>
|
||||
<el-table-column label="操作" prop="action_label" min-width="120" show-overflow-tooltip />
|
||||
<el-table-column label="操作人" prop="admin_name" min-width="100" />
|
||||
<el-table-column label="操作时间" prop="create_time_text" min-width="160" />
|
||||
<el-table-column label="说明" prop="summary" min-width="140" show-overflow-tooltip />
|
||||
</el-table>
|
||||
<div v-if="detailData" class="flex justify-end mt-3">
|
||||
<el-pagination
|
||||
v-model:current-page="actionLogPage"
|
||||
v-model:page-size="actionLogPageSize"
|
||||
:total="actionLogTotal"
|
||||
:page-sizes="[10, 20, 50]"
|
||||
layout="total, sizes, prev, pager, next"
|
||||
small
|
||||
@size-change="onActionLogSizeChange"
|
||||
@current-change="loadOrderActionLogs"
|
||||
/>
|
||||
</div>
|
||||
</el-dialog>
|
||||
|
||||
<!-- 按人操作统计(时间范围内) -->
|
||||
<el-dialog
|
||||
v-model="statsDialogVisible"
|
||||
title="支付单操作统计"
|
||||
width="520px"
|
||||
@opened="onStatsDialogOpen"
|
||||
>
|
||||
<p v-if="statsRangeText" class="text-xs text-gray-500 mb-3">统计范围:{{ statsRangeText }}</p>
|
||||
<el-form class="mb-3" :inline="true" @submit.prevent>
|
||||
<el-form-item label="时间范围">
|
||||
<el-date-picker
|
||||
v-model="statsDateRange"
|
||||
type="daterange"
|
||||
value-format="YYYY-MM-DD"
|
||||
range-separator="至"
|
||||
start-placeholder="开始"
|
||||
end-placeholder="结束"
|
||||
class="!w-[260px]"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" :loading="statsLoading" @click="fetchActionLogStats">查询</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-table v-loading="statsLoading" :data="statsList" size="small" max-height="400">
|
||||
<el-table-column label="操作人" prop="admin_name" min-width="120" show-overflow-tooltip />
|
||||
<el-table-column label="操作次数" prop="cnt" width="100" align="right" />
|
||||
</el-table>
|
||||
</el-dialog>
|
||||
|
||||
<el-dialog v-model="assignDialogVisible" title="变更创建人(医助)" width="440px" destroy-on-close>
|
||||
<p class="text-sm text-gray-600 mb-3">
|
||||
将 {{ selectedOrderIds.length }} 条支付单的「创建人」改为所选医助,并写入各单操作日志。
|
||||
</p>
|
||||
<el-select
|
||||
v-model="assignForm.assistant_id"
|
||||
filterable
|
||||
placeholder="选择医助"
|
||||
class="w-full"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in assistantOptions"
|
||||
:key="item.id"
|
||||
:label="
|
||||
item.dept_names ? `${item.name}(${item.dept_names})` : item.name
|
||||
"
|
||||
:value="Number(item.id)"
|
||||
/>
|
||||
</el-select>
|
||||
<template #footer>
|
||||
<el-button @click="assignDialogVisible = false">取消</el-button>
|
||||
<el-button type="primary" :loading="assignLoading" @click="submitBatchAssign">确定</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
|
||||
<!-- 支付弹窗 -->
|
||||
@@ -305,7 +410,14 @@
|
||||
width="500px"
|
||||
>
|
||||
<el-form :model="payForm" label-width="100px">
|
||||
<el-form-item label="支付类型" required>
|
||||
<el-alert
|
||||
v-if="payForm.fubeiPendingAudit"
|
||||
type="warning"
|
||||
:closable="false"
|
||||
class="mb-3"
|
||||
title="该单为付呗·待审核,请选择实际到账方式后确认「已支付」"
|
||||
/>
|
||||
<el-form-item v-if="!payForm.fubeiPendingAudit" label="支付类型" required>
|
||||
<el-radio-group v-model="payForm.payType">
|
||||
<!-- <el-radio label="normal">正常支付</el-radio> -->
|
||||
<el-radio label="supplement">补单支付</el-radio>
|
||||
@@ -321,7 +433,7 @@
|
||||
</el-form-item>
|
||||
</template>
|
||||
|
||||
<template v-if="payForm.payType === 'supplement'">
|
||||
<template v-if="!payForm.fubeiPendingAudit && payForm.payType === 'supplement'">
|
||||
<el-form-item label="支付订单号" required>
|
||||
<el-input
|
||||
v-model="payForm.supplement_order_no"
|
||||
@@ -329,9 +441,18 @@
|
||||
/>
|
||||
</el-form-item>
|
||||
</template>
|
||||
<template v-if="payForm.fubeiPendingAudit">
|
||||
<el-form-item label="订单号">
|
||||
<span>{{ payForm.order_no }}</span>
|
||||
</el-form-item>
|
||||
<el-form-item label="金额">
|
||||
<span class="text-red-500 font-semibold">¥{{ payForm.amount }}</span>
|
||||
</el-form-item>
|
||||
</template>
|
||||
|
||||
<el-form-item label="支付方式" required>
|
||||
<el-radio-group v-model="payForm.payment_method">
|
||||
<el-radio v-if="payForm.fubeiPendingAudit" label="manual">手动确认到账</el-radio>
|
||||
<el-radio label="alipay">支付宝</el-radio>
|
||||
<el-radio label="wechat">微信</el-radio>
|
||||
<el-radio label="wechat_work">企业微信</el-radio>
|
||||
@@ -361,6 +482,7 @@
|
||||
<el-radio-group v-model="createForm.createType">
|
||||
<el-radio label="normal">普通订单</el-radio>
|
||||
<el-radio label="wechat_work">企业微信对外收款</el-radio>
|
||||
<el-radio label="fubei">付呗</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-alert
|
||||
@@ -373,6 +495,26 @@
|
||||
<template #title>企业微信对外收款</template>
|
||||
创建后将生成订单号,请在企业微信发起收款时将该订单号填写为「商户订单号」,收款成功后系统将自动更新订单状态。
|
||||
</el-alert>
|
||||
<el-alert
|
||||
v-if="createForm.createType === 'fubei'"
|
||||
type="info"
|
||||
:closable="false"
|
||||
show-icon
|
||||
class="mb-4"
|
||||
>
|
||||
<template #title>付呗</template>
|
||||
通过付呗收款的支付单,创建后请按实际对账/审核流程在列表中处理。
|
||||
</el-alert>
|
||||
<el-form-item v-if="createForm.createType === 'fubei'" label="支付单审核">
|
||||
<el-switch
|
||||
v-model="createForm.requirePaymentSlipAudit"
|
||||
active-text="申请审核"
|
||||
inactive-text="不申请"
|
||||
/>
|
||||
<div class="text-xs text-gray-500 mt-1">
|
||||
开启后,新订单的支付状态为「待审核」;未开启则为「待支付」。
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="患者" prop="patient_id">
|
||||
<el-select
|
||||
v-model="createForm.patient_id"
|
||||
@@ -396,6 +538,10 @@
|
||||
<el-option label="挂号费" :value="1" />
|
||||
<el-option label="问诊费" :value="2" />
|
||||
<el-option label="药品费用" :value="3" />
|
||||
<el-option label="首付费用" :value="4" />
|
||||
<el-option label="尾款费用" :value="5" />
|
||||
<el-option label="其他费用" :value="6" />
|
||||
<el-option label="全部费用" :value="7" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
@@ -538,8 +684,29 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="orderList">
|
||||
import { computed } from 'vue'
|
||||
import { usePaging } from '@/hooks/usePaging'
|
||||
import { orderLists, orderDetail, orderPay, orderCancel, orderDelete, orderRefund, orderExport, orderCreate, orderCreateForWechatWork, orderEdit, orderTodayRevenue, syncWechatWorkBills, syncWechatWorkBillsDebug, searchPatients as searchPatientsAPI, alipayPay, wechatPay } from '@/api/order'
|
||||
import {
|
||||
orderLists,
|
||||
orderDetail,
|
||||
orderPay,
|
||||
orderCancel,
|
||||
orderDelete,
|
||||
orderRefund,
|
||||
orderExport,
|
||||
orderCreate,
|
||||
orderCreateForWechatWork,
|
||||
orderEdit,
|
||||
orderTodayRevenue,
|
||||
syncWechatWorkBills,
|
||||
syncWechatWorkBillsDebug,
|
||||
searchPatients as searchPatientsAPI,
|
||||
alipayPay,
|
||||
wechatPay,
|
||||
orderActionLogs,
|
||||
orderActionLogStats,
|
||||
orderBatchAssignAssistant
|
||||
} from '@/api/order'
|
||||
import { getAssistants } from '@/api/tcm'
|
||||
import { generateOrderQrcode } from '@/api/tcm'
|
||||
import { Loading } from '@element-plus/icons-vue'
|
||||
@@ -556,7 +723,18 @@ const queryParams = reactive({
|
||||
create_time_end: ''
|
||||
})
|
||||
|
||||
const assistantOptions = ref<Array<{ id: number; name: string }>>([])
|
||||
const assistantOptions = ref<
|
||||
Array<{ id: number; name: string; account?: string; dept_names?: string; dept_ids?: number[] }>
|
||||
>([])
|
||||
|
||||
const orderTableRef = ref<any>(null)
|
||||
const selectedOrderRows = ref<any[]>([])
|
||||
const selectedOrderIds = computed(() => selectedOrderRows.value.map((r) => r.id as number).filter((id) => id > 0))
|
||||
const assignDialogVisible = ref(false)
|
||||
const assignLoading = ref(false)
|
||||
const assignForm = reactive({
|
||||
assistant_id: undefined as number | undefined
|
||||
})
|
||||
|
||||
const patientAssociationTab = ref<'' | 'pending' | 'associated'>('')
|
||||
const todayRevenue = ref({ amount: '0.00', count: 0 })
|
||||
@@ -566,6 +744,42 @@ const { pager, getLists, resetPage, resetParams } = usePaging({
|
||||
params: queryParams
|
||||
})
|
||||
|
||||
const handleOrderSelectionChange = (rows: any[]) => {
|
||||
selectedOrderRows.value = rows || []
|
||||
}
|
||||
|
||||
const openAssignDialog = () => {
|
||||
if (!selectedOrderIds.value.length) {
|
||||
feedback.msgWarning('请先勾选要指派的支付单')
|
||||
return
|
||||
}
|
||||
assignForm.assistant_id = undefined
|
||||
assignDialogVisible.value = true
|
||||
}
|
||||
|
||||
const submitBatchAssign = async () => {
|
||||
if (assignForm.assistant_id == null) {
|
||||
feedback.msgWarning('请选择医助')
|
||||
return
|
||||
}
|
||||
assignLoading.value = true
|
||||
try {
|
||||
await orderBatchAssignAssistant({
|
||||
order_ids: [...selectedOrderIds.value],
|
||||
assistant_id: assignForm.assistant_id
|
||||
})
|
||||
feedback.msgSuccess('指派成功')
|
||||
assignDialogVisible.value = false
|
||||
orderTableRef.value?.clearSelection()
|
||||
getLists()
|
||||
fetchTodayRevenue()
|
||||
} catch (e: any) {
|
||||
if (e?.msg) feedback.msgError(e.msg)
|
||||
} finally {
|
||||
assignLoading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
// 搜索
|
||||
const handleSearch = () => {
|
||||
resetPage()
|
||||
@@ -595,14 +809,82 @@ const handleReset = () => {
|
||||
|
||||
const detailVisible = ref(false)
|
||||
const detailData = ref<any>(null)
|
||||
const currentOrderIdForLog = ref(0)
|
||||
const actionLogLoading = ref(false)
|
||||
const actionLogList = ref<any[]>([])
|
||||
const actionLogTotal = ref(0)
|
||||
const actionLogPage = ref(1)
|
||||
const actionLogPageSize = ref(10)
|
||||
|
||||
const statsDialogVisible = ref(false)
|
||||
const statsLoading = ref(false)
|
||||
const statsList = ref<any[]>([])
|
||||
const statsDateRange = ref<[string, string] | null>(null)
|
||||
const statsRangeText = ref('')
|
||||
|
||||
const loadOrderActionLogs = async () => {
|
||||
if (!currentOrderIdForLog.value) {
|
||||
return
|
||||
}
|
||||
actionLogLoading.value = true
|
||||
try {
|
||||
const res: any = await orderActionLogs({
|
||||
order_id: currentOrderIdForLog.value,
|
||||
page_no: actionLogPage.value,
|
||||
page_size: actionLogPageSize.value
|
||||
})
|
||||
actionLogList.value = res?.lists || []
|
||||
actionLogTotal.value = res?.count ?? 0
|
||||
} catch {
|
||||
actionLogList.value = []
|
||||
actionLogTotal.value = 0
|
||||
} finally {
|
||||
actionLogLoading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
const onActionLogSizeChange = () => {
|
||||
actionLogPage.value = 1
|
||||
loadOrderActionLogs()
|
||||
}
|
||||
|
||||
const onStatsDialogOpen = () => {
|
||||
statsDateRange.value = null
|
||||
fetchActionLogStats()
|
||||
}
|
||||
|
||||
const fetchActionLogStats = async () => {
|
||||
statsLoading.value = true
|
||||
try {
|
||||
const params: { start_time?: string; end_time?: string } = {}
|
||||
if (statsDateRange.value && statsDateRange.value.length === 2) {
|
||||
params.start_time = statsDateRange.value[0]
|
||||
params.end_time = statsDateRange.value[1]
|
||||
}
|
||||
const res: any = await orderActionLogStats(Object.keys(params).length ? params : undefined)
|
||||
statsList.value = res?.list || []
|
||||
if (res?.start_time && res?.end_time) {
|
||||
statsRangeText.value = `${res.start_time} ~ ${res.end_time}`
|
||||
} else {
|
||||
statsRangeText.value = ''
|
||||
}
|
||||
} catch {
|
||||
statsList.value = []
|
||||
statsRangeText.value = ''
|
||||
} finally {
|
||||
statsLoading.value = false
|
||||
}
|
||||
}
|
||||
const payDialogVisible = ref(false)
|
||||
const payLoading = ref(false)
|
||||
const payForm = ref({
|
||||
order_id: 0,
|
||||
order_no: '',
|
||||
amount: 0,
|
||||
payment_method: 'alipay',
|
||||
payType: 'supplement',
|
||||
/** 付呗+待审核:简化弹窗,确认后标已付 */
|
||||
fubeiPendingAudit: false,
|
||||
payment_method: 'alipay' as 'alipay' | 'wechat' | 'wechat_work' | 'manual',
|
||||
payType: 'supplement' as 'supplement',
|
||||
supplement_order_no: ''
|
||||
})
|
||||
|
||||
@@ -614,7 +896,9 @@ const patientLoading = ref(false)
|
||||
const patientList = ref<any[]>([])
|
||||
|
||||
const createForm = reactive({
|
||||
createType: 'normal' as 'normal' | 'wechat_work',
|
||||
createType: 'normal' as 'normal' | 'wechat_work' | 'fubei',
|
||||
/** 仅「付呗」:开启后订单为待审核(5) */
|
||||
requirePaymentSlipAudit: false,
|
||||
patient_id: '',
|
||||
order_type: '',
|
||||
amount: 0,
|
||||
@@ -662,6 +946,7 @@ const searchPatients = async (query: string) => {
|
||||
// 重置创建表单
|
||||
const resetCreateForm = () => {
|
||||
createForm.createType = 'normal'
|
||||
createForm.requirePaymentSlipAudit = false
|
||||
createForm.patient_id = ''
|
||||
createForm.order_type = ''
|
||||
createForm.amount = 0
|
||||
@@ -774,22 +1059,38 @@ const submitCreateOrder = async () => {
|
||||
|
||||
createLoading.value = true
|
||||
|
||||
const params = {
|
||||
patient_id: createForm.patient_id,
|
||||
order_type: createForm.order_type,
|
||||
amount: createForm.amount,
|
||||
remark: createForm.remark
|
||||
}
|
||||
|
||||
if (createForm.createType === 'wechat_work') {
|
||||
const params = {
|
||||
patient_id: createForm.patient_id,
|
||||
order_type: createForm.order_type,
|
||||
amount: createForm.amount,
|
||||
remark: createForm.remark
|
||||
}
|
||||
const res: any = await orderCreateForWechatWork(params)
|
||||
const orderNo = res?.order_no ?? res?.data?.order_no
|
||||
createDialogVisible.value = false
|
||||
getLists()
|
||||
feedback.msgSuccess(orderNo ? `订单创建成功,请在企业微信收款时使用订单号:${orderNo}` : '订单创建成功')
|
||||
} else {
|
||||
const params: Record<string, unknown> = {
|
||||
patient_id: createForm.patient_id,
|
||||
order_type: createForm.order_type,
|
||||
amount: createForm.amount,
|
||||
remark: createForm.remark
|
||||
}
|
||||
if (createForm.createType === 'fubei') {
|
||||
params.payment_channel = 'fubei'
|
||||
params.require_payment_slip_audit = createForm.requirePaymentSlipAudit ? 1 : 0
|
||||
} else {
|
||||
params.payment_channel = 'normal'
|
||||
params.require_payment_slip_audit = 0
|
||||
}
|
||||
await orderCreate(params)
|
||||
feedback.msgSuccess('订单创建成功')
|
||||
const tip =
|
||||
createForm.createType === 'fubei' && createForm.requirePaymentSlipAudit
|
||||
? '订单已创建,支付状态为「待审核」'
|
||||
: '订单创建成功'
|
||||
feedback.msgSuccess(tip)
|
||||
createDialogVisible.value = false
|
||||
getLists()
|
||||
}
|
||||
@@ -854,7 +1155,9 @@ const getPaymentMethodText = (method: string | null) => {
|
||||
const methodMap: Record<string, string> = {
|
||||
alipay: '支付宝',
|
||||
wechat: '微信',
|
||||
wechat_work: '企业微信'
|
||||
wechat_work: '企业微信',
|
||||
fubei: '付呗',
|
||||
manual: '手动确认'
|
||||
}
|
||||
return methodMap[method] || '未知'
|
||||
}
|
||||
@@ -912,7 +1215,10 @@ const handleDetail = async (row: any) => {
|
||||
try {
|
||||
const res = await orderDetail({ id: row.id })
|
||||
detailData.value = res
|
||||
currentOrderIdForLog.value = row.id
|
||||
actionLogPage.value = 1
|
||||
detailVisible.value = true
|
||||
loadOrderActionLogs()
|
||||
} catch (error) {
|
||||
console.error('获取详情失败:', error)
|
||||
}
|
||||
@@ -920,11 +1226,13 @@ const handleDetail = async (row: any) => {
|
||||
|
||||
// 支付订单
|
||||
const handlePay = (row: any) => {
|
||||
const fubeiPending = row.status === 5 && row.payment_method === 'fubei'
|
||||
payForm.value = {
|
||||
order_id: row.id,
|
||||
order_no: row.order_no,
|
||||
amount: row.amount,
|
||||
payment_method: 'alipay',
|
||||
fubeiPendingAudit: fubeiPending,
|
||||
payment_method: fubeiPending ? 'manual' : 'alipay',
|
||||
payType: 'supplement',
|
||||
supplement_order_no: ''
|
||||
}
|
||||
@@ -934,6 +1242,20 @@ const handlePay = (row: any) => {
|
||||
// 确认支付
|
||||
const confirmPay = async () => {
|
||||
try {
|
||||
// 付呗待审核:直接标记已支付
|
||||
if (payForm.value.fubeiPendingAudit) {
|
||||
payLoading.value = true
|
||||
await orderPay({
|
||||
id: payForm.value.order_id,
|
||||
payment_method: payForm.value.payment_method
|
||||
})
|
||||
feedback.msgSuccess('已更新为已支付')
|
||||
payDialogVisible.value = false
|
||||
getLists()
|
||||
fetchTodayRevenue()
|
||||
return
|
||||
}
|
||||
|
||||
// 验证补单支付的订单号
|
||||
if (payForm.value.payType === 'supplement' && !payForm.value.supplement_order_no) {
|
||||
feedback.msgWarning('请输入支付订单号')
|
||||
|
||||
@@ -12,8 +12,7 @@
|
||||
{
|
||||
active:
|
||||
formData.pending_assign !== '1' &&
|
||||
formData.pending_booking !== '1' &&
|
||||
formData.completed_appointment !== '1' &&
|
||||
formData.pending_unscheduled !== '1' &&
|
||||
formData.appointment_date === tab.value
|
||||
}
|
||||
]"
|
||||
@@ -23,18 +22,11 @@
|
||||
<em v-if="tab.value && dateCounts[tab.value] !== undefined">{{ dateCounts[tab.value] }}</em>
|
||||
</span>
|
||||
<span
|
||||
:class="['chip', 'chip-pending-booking', { active: formData.pending_booking === '1' }]"
|
||||
@click="handlePendingBookingTabClick"
|
||||
:class="['chip', 'chip-unscheduled', { active: formData.pending_unscheduled === '1' }]"
|
||||
@click="handlePendingUnscheduledTabClick"
|
||||
>
|
||||
待预约
|
||||
<em v-if="pendingBookingCount !== undefined">{{ pendingBookingCount }}</em>
|
||||
</span>
|
||||
<span
|
||||
:class="['chip', 'chip-completed-visit', { active: formData.completed_appointment === '1' }]"
|
||||
@click="handleCompletedVisitTabClick"
|
||||
>
|
||||
已完成
|
||||
<em v-if="completedVisitCount !== undefined">{{ completedVisitCount }}</em>
|
||||
<em v-if="pendingUnscheduledCount !== undefined">{{ pendingUnscheduledCount }}</em>
|
||||
</span>
|
||||
<span
|
||||
:class="['chip', 'chip-pending', { active: formData.pending_assign === '1' }]"
|
||||
@@ -607,11 +599,7 @@ const formData = reactive({
|
||||
diagnosis_confirmed: '' as '' | '0' | '1',
|
||||
appointment_date: '' as string,
|
||||
has_appointment: '' as '' | '0' | '1',
|
||||
pending_assign: '' as '' | '1',
|
||||
/** 顶部「待预约」Tab:仅展示已建诊单且尚未挂号(无有效预约) */
|
||||
pending_booking: '' as '' | '1',
|
||||
/** 顶部「已完成」Tab:至少有一条挂号记录为已完成 status=3 */
|
||||
completed_appointment: '' as '' | '1'
|
||||
pending_assign: '' as '' | '1'
|
||||
})
|
||||
|
||||
const activeTab = ref('all')
|
||||
@@ -630,8 +618,6 @@ const confirmedOptions = [
|
||||
|
||||
const setHasAppointment = (v: string) => {
|
||||
formData.has_appointment = v as '' | '0' | '1'
|
||||
formData.pending_booking = ''
|
||||
formData.completed_appointment = ''
|
||||
pager.page = 1
|
||||
getLists()
|
||||
fetchDateCounts()
|
||||
@@ -639,8 +625,6 @@ const setHasAppointment = (v: string) => {
|
||||
|
||||
const setConfirmed = (v: string) => {
|
||||
formData.diagnosis_confirmed = v as '' | '0' | '1'
|
||||
formData.pending_booking = ''
|
||||
formData.completed_appointment = ''
|
||||
pager.page = 1
|
||||
getLists()
|
||||
fetchDateCounts()
|
||||
@@ -661,65 +645,31 @@ const dateTabs = computed(() => [
|
||||
])
|
||||
|
||||
const dateCounts = ref<Record<string, number>>({})
|
||||
const pendingBookingCount = ref<number | undefined>(undefined)
|
||||
const completedVisitCount = ref<number | undefined>(undefined)
|
||||
const pendingAssignCount = ref<number | undefined>(undefined)
|
||||
|
||||
const handleDateTabClick = async (value: string) => {
|
||||
formData.pending_assign = ''
|
||||
formData.pending_booking = ''
|
||||
formData.completed_appointment = ''
|
||||
formData.has_appointment = ''
|
||||
formData.appointment_date = value
|
||||
pager.page = 1
|
||||
await getLists()
|
||||
fetchDateCounts()
|
||||
}
|
||||
|
||||
/** 已创建诊单、尚未挂号的记录(与第二行「未挂号」同条件,便于从 Tab 一键进入) */
|
||||
const handlePendingBookingTabClick = async () => {
|
||||
formData.pending_assign = ''
|
||||
formData.pending_booking = '1'
|
||||
formData.completed_appointment = ''
|
||||
formData.appointment_date = ''
|
||||
formData.has_appointment = '0'
|
||||
pager.page = 1
|
||||
await getLists()
|
||||
fetchDateCounts()
|
||||
}
|
||||
|
||||
/** 至少有一条挂号为「已完成」(后端 appointment.status=3) */
|
||||
const handleCompletedVisitTabClick = async () => {
|
||||
formData.pending_assign = ''
|
||||
formData.pending_booking = ''
|
||||
formData.completed_appointment = '1'
|
||||
formData.has_appointment = ''
|
||||
formData.appointment_date = ''
|
||||
pager.page = 1
|
||||
await getLists()
|
||||
fetchDateCounts()
|
||||
}
|
||||
|
||||
const handlePendingAssignTabClick = async () => {
|
||||
formData.pending_assign = '1'
|
||||
formData.pending_booking = ''
|
||||
formData.completed_appointment = ''
|
||||
formData.has_appointment = ''
|
||||
formData.appointment_date = ''
|
||||
pager.page = 1
|
||||
await getLists()
|
||||
fetchDateCounts()
|
||||
}
|
||||
|
||||
// 获取各日期挂号数量 + 待预约 + 已完成 + 待分配医助数量
|
||||
// 获取各日期挂号数量 + 待分配医助数量
|
||||
const fetchDateCounts = async () => {
|
||||
try {
|
||||
const [today, tomorrow, dayAfter, noApt, doneVisit, pending] = await Promise.all([
|
||||
const [today, tomorrow, dayAfter, pending] = await Promise.all([
|
||||
tcmDiagnosisLists({ appointment_date: todayStr.value, page_no: 1, page_size: 1 }),
|
||||
tcmDiagnosisLists({ appointment_date: tomorrowStr.value, page_no: 1, page_size: 1 }),
|
||||
tcmDiagnosisLists({ appointment_date: dayAfterStr.value, page_no: 1, page_size: 1 }),
|
||||
tcmDiagnosisLists({ has_appointment: 0, page_no: 1, page_size: 1 }),
|
||||
tcmDiagnosisLists({ completed_appointment: 1, page_no: 1, page_size: 1 }),
|
||||
tcmDiagnosisLists({ pending_assign: 1, page_no: 1, page_size: 1 })
|
||||
])
|
||||
dateCounts.value = {
|
||||
@@ -727,8 +677,6 @@ const fetchDateCounts = async () => {
|
||||
[tomorrowStr.value]: tomorrow?.count ?? 0,
|
||||
[dayAfterStr.value]: dayAfter?.count ?? 0
|
||||
}
|
||||
pendingBookingCount.value = noApt?.count ?? 0
|
||||
completedVisitCount.value = doneVisit?.count ?? 0
|
||||
pendingAssignCount.value = pending?.count ?? 0
|
||||
} catch (e) {
|
||||
console.error('获取日期数量失败', e)
|
||||
@@ -777,8 +725,6 @@ const handleTabChange = (tabName: string | number) => {
|
||||
formData.diagnosis_confirmed = ''
|
||||
formData.has_appointment = ''
|
||||
formData.appointment_date = ''
|
||||
formData.pending_booking = ''
|
||||
formData.completed_appointment = ''
|
||||
if (tabName === 'unconfirmed') {
|
||||
formData.diagnosis_confirmed = '0'
|
||||
} else if (tabName === 'confirmed') {
|
||||
@@ -859,8 +805,6 @@ const handleReset = () => {
|
||||
formData.appointment_date = ''
|
||||
formData.has_appointment = ''
|
||||
formData.pending_assign = ''
|
||||
formData.pending_booking = ''
|
||||
formData.completed_appointment = ''
|
||||
pager.page = 1
|
||||
getLists()
|
||||
fetchDateCounts()
|
||||
@@ -1588,36 +1532,6 @@ onUnmounted(() => {
|
||||
}
|
||||
}
|
||||
|
||||
.chip-pending-booking {
|
||||
margin-left: 8px;
|
||||
color: var(--el-color-info);
|
||||
background: var(--el-color-info-light-9);
|
||||
|
||||
&:hover {
|
||||
background: var(--el-color-info-light-8);
|
||||
}
|
||||
|
||||
&.active {
|
||||
color: #fff;
|
||||
background: var(--el-color-info);
|
||||
}
|
||||
}
|
||||
|
||||
.chip-completed-visit {
|
||||
margin-left: 8px;
|
||||
color: var(--el-color-success);
|
||||
background: var(--el-color-success-light-9);
|
||||
|
||||
&:hover {
|
||||
background: var(--el-color-success-light-8);
|
||||
}
|
||||
|
||||
&.active {
|
||||
color: #fff;
|
||||
background: var(--el-color-success);
|
||||
}
|
||||
}
|
||||
|
||||
.chip-pending {
|
||||
margin-left: 8px;
|
||||
color: var(--el-color-warning);
|
||||
|
||||
Reference in New Issue
Block a user