fix:
1. 优化了审方pc的效果 2. 就诊人信息优化
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
<script lang="ts" setup>
|
||||
/**
|
||||
* 处方失效时间展示
|
||||
* - 剩余 ≤2 小时:标红
|
||||
* - 剩余 ≤10 分钟:额外显示倒计时(每秒刷新)
|
||||
*/
|
||||
import { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';
|
||||
|
||||
const props = defineProps<{
|
||||
/** 失效时间戳(秒)或已格式化的字符串 */
|
||||
autoExpireTime?: number | string | null;
|
||||
}>();
|
||||
|
||||
const nowTs = ref(Math.floor(Date.now() / 1000));
|
||||
let timer: ReturnType<typeof setInterval> | null = null;
|
||||
|
||||
/** 解析为秒级时间戳 */
|
||||
function resolveExpireTs(raw: number | string | null | undefined): number {
|
||||
if (raw == null || raw === '') return 0;
|
||||
if (typeof raw === 'number') {
|
||||
return raw > 1e12 ? Math.floor(raw / 1000) : raw;
|
||||
}
|
||||
const n = Number(raw);
|
||||
if (Number.isFinite(n) && n > 0) {
|
||||
return n > 1e12 ? Math.floor(n / 1000) : n;
|
||||
}
|
||||
const parsed = Date.parse(String(raw).replace(/-/g, '/'));
|
||||
return Number.isFinite(parsed) ? Math.floor(parsed / 1000) : 0;
|
||||
}
|
||||
|
||||
const expireTs = computed(() => resolveExpireTs(props.autoExpireTime));
|
||||
|
||||
const remainSec = computed(() => {
|
||||
if (!expireTs.value) return null;
|
||||
return expireTs.value - nowTs.value;
|
||||
});
|
||||
|
||||
const isUrgent = computed(() => {
|
||||
const r = remainSec.value;
|
||||
return r != null && r > 0 && r <= 2 * 3600;
|
||||
});
|
||||
|
||||
const showCountdown = computed(() => {
|
||||
const r = remainSec.value;
|
||||
return r != null && r > 0 && r <= 10 * 60;
|
||||
});
|
||||
|
||||
const displayText = computed(() => {
|
||||
if (!expireTs.value) return '—';
|
||||
const r = remainSec.value ?? 0;
|
||||
if (r <= 0) return '已过期';
|
||||
const d = new Date(expireTs.value * 1000);
|
||||
const pad = (n: number) => String(n).padStart(2, '0');
|
||||
const base = `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;
|
||||
if (showCountdown.value) {
|
||||
const m = Math.floor(r / 60);
|
||||
const s = r % 60;
|
||||
return `${base}(剩余 ${m}:${pad(s)})`;
|
||||
}
|
||||
return base;
|
||||
});
|
||||
|
||||
function startTimer() {
|
||||
stopTimer();
|
||||
timer = setInterval(() => {
|
||||
nowTs.value = Math.floor(Date.now() / 1000);
|
||||
}, 1000);
|
||||
}
|
||||
|
||||
function stopTimer() {
|
||||
if (timer) {
|
||||
clearInterval(timer);
|
||||
timer = null;
|
||||
}
|
||||
}
|
||||
|
||||
watch(
|
||||
() => props.autoExpireTime,
|
||||
() => {
|
||||
nowTs.value = Math.floor(Date.now() / 1000);
|
||||
},
|
||||
);
|
||||
|
||||
onMounted(startTimer);
|
||||
onBeforeUnmount(stopTimer);
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<span
|
||||
class="expire-time"
|
||||
:class="{
|
||||
'expire-time--urgent': isUrgent || (remainSec != null && remainSec <= 0),
|
||||
'expire-time--countdown': showCountdown,
|
||||
}"
|
||||
>
|
||||
{{ displayText }}
|
||||
</span>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.expire-time {
|
||||
font-size: 12px;
|
||||
color: inherit;
|
||||
}
|
||||
.expire-time--urgent {
|
||||
color: #cf1322;
|
||||
font-weight: 600;
|
||||
}
|
||||
.expire-time--countdown {
|
||||
font-variant-numeric: tabular-nums;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,25 @@
|
||||
<script lang="ts" setup>
|
||||
/**
|
||||
* 就诊类型标签:线下就诊 / 在线问诊 / 在线复诊
|
||||
* 对应处方、订单字段 is_online
|
||||
*/
|
||||
import { computed } from 'vue';
|
||||
|
||||
import { Tag } from 'ant-design-vue';
|
||||
|
||||
const props = defineProps<{
|
||||
/** 就诊渠道:0线下 1在线问诊 2/3在线复诊 */
|
||||
isOnline?: number | null;
|
||||
}>();
|
||||
|
||||
const label = computed(() => {
|
||||
const v = Number(props.isOnline ?? 0);
|
||||
if (v === 1) return { text: '在线问诊', color: 'blue' };
|
||||
if (v === 2 || v === 3) return { text: '在线复诊', color: 'green' };
|
||||
return { text: '线下就诊', color: 'purple' };
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<Tag :color="label.color">{{ label.text }}</Tag>
|
||||
</template>
|
||||
@@ -0,0 +1,103 @@
|
||||
<script lang="ts" setup>
|
||||
/**
|
||||
* 列表/卡片内紧凑展示:小程序用户 + 就诊人
|
||||
* 点击后由父级打开 WxUserPatientDrawer
|
||||
*/
|
||||
import { computed } from 'vue';
|
||||
|
||||
import { Avatar, Button } from 'ant-design-vue';
|
||||
|
||||
import { resolveAvatarUrl } from '#/views/system/store-input/utils/inputUser';
|
||||
|
||||
const props = defineProps<{
|
||||
/** 审方/订单行数据,需含 user、user_patient(或 patient) */
|
||||
row: Record<string, any>;
|
||||
}>();
|
||||
|
||||
const emit = defineEmits<{
|
||||
open: [payload: { upId: number; patientName: string }];
|
||||
}>();
|
||||
|
||||
const defaultAvatar = '/img/user-default-avatar.png';
|
||||
|
||||
const user = computed(() => props.row?.user ?? {});
|
||||
const patient = computed(
|
||||
() => props.row?.user_patient ?? props.row?.userPatient ?? {},
|
||||
);
|
||||
|
||||
const upId = computed(() =>
|
||||
Number(patient.value?.id ?? props.row?.up_id ?? 0),
|
||||
);
|
||||
|
||||
const patientName = computed(
|
||||
() => String(patient.value?.name ?? props.row?.patient ?? '') || '—',
|
||||
);
|
||||
|
||||
function userAvatarSrc() {
|
||||
const raw = String(user.value?.avatarurl ?? '').trim();
|
||||
if (!raw) return defaultAvatar;
|
||||
return resolveAvatarUrl(raw) || defaultAvatar;
|
||||
}
|
||||
|
||||
/** 打开就诊人档案抽屉 */
|
||||
function handleOpen() {
|
||||
if (!upId.value) return;
|
||||
emit('open', { upId: upId.value, patientName: patientName.value });
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="wx-user-patient-cell">
|
||||
<div class="wx-user-patient-cell__row">
|
||||
<Avatar :size="24" :src="userAvatarSrc()" class="shrink-0" />
|
||||
<div class="wx-user-patient-cell__text min-w-0">
|
||||
<span class="text-[11px] text-gray-400">微信用户:</span>
|
||||
<span class="truncate text-xs">{{ user?.nickname || '—' }}</span>
|
||||
<div class="text-[11px] text-gray-500">ID:{{ user?.id ?? '—' }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wx-user-patient-cell__row">
|
||||
<Avatar :size="24" :src="defaultAvatar" class="shrink-0" />
|
||||
<div class="wx-user-patient-cell__text min-w-0">
|
||||
<span class="text-[11px] text-gray-400">就诊人:</span>
|
||||
<Button
|
||||
v-if="upId"
|
||||
class="!h-auto !px-0 !py-0"
|
||||
type="link"
|
||||
@click.stop="handleOpen"
|
||||
>
|
||||
{{ patientName }}
|
||||
</Button>
|
||||
<span v-else class="text-xs">{{ patientName }}</span>
|
||||
<div
|
||||
v-if="patient?.sex || patient?.age"
|
||||
class="text-[11px] text-gray-500"
|
||||
>
|
||||
<template v-if="patient?.sex === 1">男</template>
|
||||
<template v-else-if="patient?.sex === 2">女</template>
|
||||
<template v-if="patient?.age"> · {{ patient.age }}岁</template>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.wx-user-patient-cell {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
min-width: 0;
|
||||
}
|
||||
.wx-user-patient-cell__row {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 6px;
|
||||
min-width: 0;
|
||||
}
|
||||
.wx-user-patient-cell__text {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
line-height: 1.3;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,357 @@
|
||||
<script lang="ts" setup>
|
||||
/**
|
||||
* 微信用户 + 就诊人档案抽屉
|
||||
* 展示小程序用户基础信息、就诊人信息及挂号/处方/订单记录(跨医生)
|
||||
*/
|
||||
import { h, ref } from 'vue';
|
||||
|
||||
import { useVbenDrawer, useVbenModal } from '@vben/common-ui';
|
||||
|
||||
import {
|
||||
Avatar,
|
||||
Button,
|
||||
Descriptions,
|
||||
Empty,
|
||||
Spin,
|
||||
Table,
|
||||
Tabs,
|
||||
Tag,
|
||||
message,
|
||||
} from 'ant-design-vue';
|
||||
|
||||
import SensitiveText from '#/components/sensitive-text/SensitiveText.vue';
|
||||
import { resolveAvatarUrl } from '#/views/system/store-input/utils/inputUser';
|
||||
import PrescriptionDetail from '#/views/doctor/doctor-reception/components/PrescriptionDetail.vue';
|
||||
import OrderDetail from '#/views/business/order/product-order/components/detail.vue';
|
||||
|
||||
import {
|
||||
getUserPatientOrderListApi,
|
||||
getUserPatientPrescriptionListApi,
|
||||
getUserPatientProfileDetailApi,
|
||||
getUserPatientRegisterListApi,
|
||||
} from './api';
|
||||
import VisitTypeTag from './VisitTypeTag.vue';
|
||||
|
||||
defineOptions({ name: 'WxUserPatientDrawer' });
|
||||
|
||||
const defaultAvatar = '/img/user-default-avatar.png';
|
||||
|
||||
const upId = ref(0);
|
||||
const loading = ref(false);
|
||||
const activeTab = ref('info');
|
||||
const profile = ref<Record<string, any> | null>(null);
|
||||
|
||||
const registerList = ref<any[]>([]);
|
||||
const prescriptionList = ref<any[]>([]);
|
||||
const orderList = ref<any[]>([]);
|
||||
const registerLoading = ref(false);
|
||||
const prescriptionLoading = ref(false);
|
||||
const orderLoading = ref(false);
|
||||
|
||||
const [PrescriptionDetailModal, PrescriptionDetailModalApi] = useVbenModal({
|
||||
connectedComponent: PrescriptionDetail,
|
||||
});
|
||||
|
||||
const [OrderDetailModal, OrderDetailModalApi] = useVbenModal({
|
||||
connectedComponent: OrderDetail,
|
||||
});
|
||||
|
||||
const [Drawer, drawerApi] = useVbenDrawer({
|
||||
footer: false,
|
||||
onOpenChange(isOpen: boolean) {
|
||||
if (!isOpen) {
|
||||
profile.value = null;
|
||||
registerList.value = [];
|
||||
prescriptionList.value = [];
|
||||
orderList.value = [];
|
||||
return;
|
||||
}
|
||||
const data = drawerApi.getData<{ upId?: number; patientName?: string }>();
|
||||
upId.value = Number(data?.upId || 0);
|
||||
activeTab.value = 'info';
|
||||
if (upId.value > 0) {
|
||||
void loadDetail();
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
/** 解析头像 URL */
|
||||
function avatarSrc(raw?: string) {
|
||||
const s = String(raw ?? '').trim();
|
||||
if (!s) return defaultAvatar;
|
||||
return resolveAvatarUrl(s) || defaultAvatar;
|
||||
}
|
||||
|
||||
async function loadDetail() {
|
||||
loading.value = true;
|
||||
try {
|
||||
profile.value = await getUserPatientProfileDetailApi(upId.value);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
message.error('获取用户信息失败');
|
||||
} finally {
|
||||
loading.value = false;
|
||||
}
|
||||
}
|
||||
|
||||
async function loadRegisterList() {
|
||||
registerLoading.value = true;
|
||||
try {
|
||||
const res = await getUserPatientRegisterListApi(upId.value);
|
||||
registerList.value = res?.items ?? [];
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
message.error('获取挂号记录失败');
|
||||
} finally {
|
||||
registerLoading.value = false;
|
||||
}
|
||||
}
|
||||
|
||||
async function loadPrescriptionList() {
|
||||
prescriptionLoading.value = true;
|
||||
try {
|
||||
const res = await getUserPatientPrescriptionListApi(upId.value);
|
||||
prescriptionList.value = res?.items ?? [];
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
message.error('获取处方记录失败');
|
||||
} finally {
|
||||
prescriptionLoading.value = false;
|
||||
}
|
||||
}
|
||||
|
||||
async function loadOrderList() {
|
||||
orderLoading.value = true;
|
||||
try {
|
||||
const res = await getUserPatientOrderListApi(upId.value);
|
||||
orderList.value = res?.items ?? [];
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
message.error('获取订单记录失败');
|
||||
} finally {
|
||||
orderLoading.value = false;
|
||||
}
|
||||
}
|
||||
|
||||
/** Tab 切换时懒加载对应列表 */
|
||||
function onTabChange(key: string | number) {
|
||||
const k = String(key);
|
||||
activeTab.value = k;
|
||||
if (k === 'register' && registerList.value.length === 0) {
|
||||
void loadRegisterList();
|
||||
} else if (k === 'prescription' && prescriptionList.value.length === 0) {
|
||||
void loadPrescriptionList();
|
||||
} else if (k === 'order' && orderList.value.length === 0) {
|
||||
void loadOrderList();
|
||||
}
|
||||
}
|
||||
|
||||
function openPrescription(id: number) {
|
||||
PrescriptionDetailModalApi.setData({ values: id });
|
||||
PrescriptionDetailModalApi.open();
|
||||
}
|
||||
|
||||
function openOrder(id: number) {
|
||||
OrderDetailModalApi.setData({ id });
|
||||
OrderDetailModalApi.open();
|
||||
}
|
||||
|
||||
const registerColumns = [
|
||||
{ title: '订单编号', dataIndex: 'order_no', key: 'order_no' },
|
||||
{ title: '医生', dataIndex: 'doctor', key: 'doctor' },
|
||||
{ title: '诊所', dataIndex: 'store', key: 'store' },
|
||||
{
|
||||
title: '费用',
|
||||
dataIndex: 'price',
|
||||
key: 'price',
|
||||
customRender: ({ text }: { text: number }) =>
|
||||
`¥${Number(text || 0).toFixed(2)}`,
|
||||
},
|
||||
{
|
||||
title: '支付',
|
||||
dataIndex: 'is_pay',
|
||||
key: 'is_pay',
|
||||
customRender: ({ text }: { text: number }) =>
|
||||
h(Tag, { color: text === 1 ? 'green' : 'red' }, () =>
|
||||
text === 1 ? '已支付' : '未支付',
|
||||
),
|
||||
},
|
||||
{ title: '状态', dataIndex: 'status_text', key: 'status_text' },
|
||||
{ title: '创建时间', dataIndex: 'created_at', key: 'created_at' },
|
||||
];
|
||||
|
||||
const prescriptionColumns = [
|
||||
{
|
||||
title: '处方编号',
|
||||
dataIndex: 'prescription_no',
|
||||
key: 'prescription_no',
|
||||
customRender: ({ text, record }: { text: string; record: any }) =>
|
||||
h(
|
||||
Button,
|
||||
{ type: 'link', onClick: () => openPrescription(record.id) },
|
||||
() => text,
|
||||
),
|
||||
},
|
||||
{
|
||||
title: '就诊类型',
|
||||
dataIndex: 'is_online',
|
||||
key: 'is_online',
|
||||
customRender: ({ text }: { text: number }) =>
|
||||
h(VisitTypeTag, { isOnline: text }),
|
||||
},
|
||||
{ title: '医生', dataIndex: 'doctor', key: 'doctor' },
|
||||
{ title: '诊所', dataIndex: 'store', key: 'store' },
|
||||
{ title: '诊断', dataIndex: 'clinical_diagnose', key: 'clinical_diagnose' },
|
||||
{
|
||||
title: '状态',
|
||||
dataIndex: 'status',
|
||||
key: 'status',
|
||||
customRender: ({ text }: { text: number }) => {
|
||||
const map: Record<number, string> = {
|
||||
0: '待审核',
|
||||
1: '已通过',
|
||||
2: '未通过',
|
||||
3: '无需审核',
|
||||
};
|
||||
return map[text] || '未知';
|
||||
},
|
||||
},
|
||||
{ title: '创建时间', dataIndex: 'created_at', key: 'created_at' },
|
||||
];
|
||||
|
||||
const orderColumns = [
|
||||
{
|
||||
title: '订单号',
|
||||
dataIndex: 'order_no',
|
||||
key: 'order_no',
|
||||
customRender: ({ text, record }: { text: string; record: any }) =>
|
||||
h(Button, { type: 'link', onClick: () => openOrder(record.id) }, () => text),
|
||||
},
|
||||
{
|
||||
title: '就诊类型',
|
||||
dataIndex: 'is_online',
|
||||
key: 'is_online',
|
||||
customRender: ({ text }: { text: number }) =>
|
||||
h(VisitTypeTag, { isOnline: text }),
|
||||
},
|
||||
{ title: '医生', dataIndex: 'doctor', key: 'doctor' },
|
||||
{ title: '诊所', dataIndex: 'store', key: 'store' },
|
||||
{
|
||||
title: '实付',
|
||||
dataIndex: 'total_pay_price',
|
||||
key: 'total_pay_price',
|
||||
customRender: ({ text }: { text: number }) =>
|
||||
`¥${Number(text || 0).toFixed(2)}`,
|
||||
},
|
||||
{
|
||||
title: '支付',
|
||||
dataIndex: 'is_pay',
|
||||
key: 'is_pay',
|
||||
customRender: ({ text }: { text: number }) =>
|
||||
h(Tag, { color: text === 1 ? 'green' : 'red' }, () =>
|
||||
text === 1 ? '已支付' : '未支付',
|
||||
),
|
||||
},
|
||||
{ title: '创建时间', dataIndex: 'created_at', key: 'created_at' },
|
||||
];
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<Drawer class="w-[720px]" title="微信用户 / 就诊人">
|
||||
<PrescriptionDetailModal />
|
||||
<OrderDetailModal />
|
||||
<Spin :spinning="loading">
|
||||
<template v-if="profile">
|
||||
<!-- 小程序用户 -->
|
||||
<div class="mb-4 flex items-center gap-3 rounded-lg bg-gray-50 p-3 dark:bg-slate-800">
|
||||
<Avatar :size="48" :src="avatarSrc(profile.user?.avatarurl)" />
|
||||
<div class="min-w-0">
|
||||
<div class="text-sm font-medium">
|
||||
{{ profile.user?.nickname || '—' }}
|
||||
</div>
|
||||
<div class="text-xs text-gray-500">
|
||||
用户 ID:{{ profile.user?.id ?? '—' }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<Tabs :active-key="activeTab" @change="onTabChange">
|
||||
<Tabs.TabPane key="info" tab="就诊人信息">
|
||||
<Descriptions :column="2" bordered size="small">
|
||||
<Descriptions.Item label="姓名">
|
||||
{{ profile.patient?.name || '—' }}
|
||||
</Descriptions.Item>
|
||||
<Descriptions.Item label="性别">
|
||||
{{
|
||||
profile.patient?.sex === 1
|
||||
? '男'
|
||||
: profile.patient?.sex === 2
|
||||
? '女'
|
||||
: '—'
|
||||
}}
|
||||
</Descriptions.Item>
|
||||
<Descriptions.Item label="年龄">
|
||||
{{ profile.patient?.age ? `${profile.patient.age}岁` : '—' }}
|
||||
</Descriptions.Item>
|
||||
<Descriptions.Item label="手机号">
|
||||
<SensitiveText
|
||||
v-if="profile.patient"
|
||||
:record="profile.patient"
|
||||
field="mobile"
|
||||
/>
|
||||
<span v-else>—</span>
|
||||
</Descriptions.Item>
|
||||
<Descriptions.Item label="身份证" :span="2">
|
||||
<SensitiveText
|
||||
v-if="profile.patient"
|
||||
:record="profile.patient"
|
||||
field="id_card"
|
||||
/>
|
||||
<span v-else>—</span>
|
||||
</Descriptions.Item>
|
||||
</Descriptions>
|
||||
</Tabs.TabPane>
|
||||
<Tabs.TabPane key="register" tab="挂号记录">
|
||||
<Spin :spinning="registerLoading">
|
||||
<Table
|
||||
v-if="registerList.length"
|
||||
:columns="registerColumns"
|
||||
:data-source="registerList"
|
||||
:pagination="false"
|
||||
row-key="id"
|
||||
size="small"
|
||||
/>
|
||||
<Empty v-else description="暂无挂号记录" />
|
||||
</Spin>
|
||||
</Tabs.TabPane>
|
||||
<Tabs.TabPane key="prescription" tab="处方记录">
|
||||
<Spin :spinning="prescriptionLoading">
|
||||
<Table
|
||||
v-if="prescriptionList.length"
|
||||
:columns="prescriptionColumns"
|
||||
:data-source="prescriptionList"
|
||||
:pagination="false"
|
||||
row-key="id"
|
||||
size="small"
|
||||
/>
|
||||
<Empty v-else description="暂无处方记录" />
|
||||
</Spin>
|
||||
</Tabs.TabPane>
|
||||
<Tabs.TabPane key="order" tab="订单记录">
|
||||
<Spin :spinning="orderLoading">
|
||||
<Table
|
||||
v-if="orderList.length"
|
||||
:columns="orderColumns"
|
||||
:data-source="orderList"
|
||||
:pagination="false"
|
||||
row-key="id"
|
||||
size="small"
|
||||
/>
|
||||
<Empty v-else description="暂无订单记录" />
|
||||
</Spin>
|
||||
</Tabs.TabPane>
|
||||
</Tabs>
|
||||
</template>
|
||||
<Empty v-else-if="!loading" description="暂无数据" />
|
||||
</Spin>
|
||||
</Drawer>
|
||||
</template>
|
||||
43
apps/web-antd/src/components/wx-user-patient/api.ts
Normal file
43
apps/web-antd/src/components/wx-user-patient/api.ts
Normal file
@@ -0,0 +1,43 @@
|
||||
/**
|
||||
* 就诊人档案 API(跨医生视角,供药师审方等场景)
|
||||
*/
|
||||
import { requestClient } from '#/api/request';
|
||||
|
||||
const prefix = 'user-patient-profile/';
|
||||
|
||||
/** 小程序用户 + 就诊人基础信息 */
|
||||
export async function getUserPatientProfileDetailApi(upId: number) {
|
||||
return requestClient.get<any>(`${prefix}detail`, {
|
||||
params: { up_id: upId },
|
||||
});
|
||||
}
|
||||
|
||||
/** 就诊人挂号记录 */
|
||||
export async function getUserPatientRegisterListApi(
|
||||
upId: number,
|
||||
params?: { page?: number; pageSize?: number },
|
||||
) {
|
||||
return requestClient.get<any>(`${prefix}register-list`, {
|
||||
params: { up_id: upId, ...params },
|
||||
});
|
||||
}
|
||||
|
||||
/** 就诊人处方记录 */
|
||||
export async function getUserPatientPrescriptionListApi(
|
||||
upId: number,
|
||||
params?: { page?: number; pageSize?: number },
|
||||
) {
|
||||
return requestClient.get<any>(`${prefix}prescription-list`, {
|
||||
params: { up_id: upId, ...params },
|
||||
});
|
||||
}
|
||||
|
||||
/** 就诊人商品订单记录 */
|
||||
export async function getUserPatientOrderListApi(
|
||||
upId: number,
|
||||
params?: { page?: number; pageSize?: number },
|
||||
) {
|
||||
return requestClient.get<any>(`${prefix}order-list`, {
|
||||
params: { up_id: upId, ...params },
|
||||
});
|
||||
}
|
||||
8
apps/web-antd/src/components/wx-user-patient/index.ts
Normal file
8
apps/web-antd/src/components/wx-user-patient/index.ts
Normal file
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* 微信用户/就诊人相关组件导出
|
||||
*/
|
||||
export { default as WxUserPatientCell } from './WxUserPatientCell.vue';
|
||||
export { default as WxUserPatientDrawer } from './WxUserPatientDrawer.vue';
|
||||
export { default as VisitTypeTag } from './VisitTypeTag.vue';
|
||||
export { default as PrescriptionExpireTime } from './PrescriptionExpireTime.vue';
|
||||
export * from './api';
|
||||
Reference in New Issue
Block a user