diff --git a/apps/web-antd/src/api/request.ts b/apps/web-antd/src/api/request.ts index 92670b87..5edad1c5 100644 --- a/apps/web-antd/src/api/request.ts +++ b/apps/web-antd/src/api/request.ts @@ -24,6 +24,7 @@ import {downloadByData} from "#/util/tool"; const { apiURL } = useAppConfig(import.meta.env, import.meta.env.PROD); const arr = new Set([ + 'account', 'accept_tel', 'doctor', 'express_mobile', @@ -36,7 +37,18 @@ const arr = new Set([ ]); // 敏感数据 -const sensitiveData = new Set(['id_card', 'idcard']); +const sensitiveData = new Set([ + 'account', + 'accept_tel', + 'doctor', + 'express_mobile', + 'id_card', + 'idcard', + 'mobile', + 'password', + 'patient_mobile', + 'phone', +]); function createRequestClient(baseURL: string) { const client = new RequestClient({ @@ -199,36 +211,37 @@ function getRes(obj: any, isDecode = true) { } if (isDecode && sensitiveData.has(key)) { // 数据脱敏,自动匹配姓名、手机号、身份证 - switch (key) { - // case 'accept_name': - // case 'express_name': - // case 'express_region': - // case 'patient': { - // // 保留前两个字符,其余用星号代替 - // aseFile = aseFile.slice(0, 1).padEnd(aseFile.length, '*'); - // break; - // } - // case 'express_mobile': - // case 'mobile': { - // // 保留前三位和后四位,中间用星号代替 - // aseFile = - // aseFile.slice(0, 3).padEnd(aseFile.length - 4, '*') + - // aseFile.slice(-4); - // break; - // } - case 'id_card': - case 'idcard': { - // 保留前六位和后四位,中间用星号代替 - aseFile = - aseFile.slice(0, 6).padEnd(aseFile.length - 4, '*') + - aseFile.slice(-4); - break; - } - default: { - // 默认情况下,全部用星号代替 - break; - } - } + // switch (key) { + // case 'accept_name': + // case 'express_name': + // case 'express_region': + // case 'patient': { + // // 保留前两个字符,其余用星号代替 + // aseFile = aseFile.slice(0, 1).padEnd(aseFile.length, '*'); + // break; + // } + // case 'express_mobile': + // case 'mobile': + // case 'phone': { + // // 保留前三位和后四位,中间用星号代替 + // aseFile = + // aseFile.slice(0, 3).padEnd(aseFile.length - 4, '*') + + // aseFile.slice(-4); + // break; + // } + // case 'id_card': + // case 'idcard': { + // // 保留前六位和后四位,中间用星号代替 + // aseFile = + // aseFile.slice(0, 6).padEnd(aseFile.length - 4, '*') + + // aseFile.slice(-4); + // break; + // } + // default: { + // // 默认情况下,全部用星号代替 + // break; + // } + // } } obj[key] = aseFile; } diff --git a/apps/web-antd/src/components/form/components/upload-image-sortable.vue b/apps/web-antd/src/components/form/components/upload-image-sortable.vue index b63db127..f196f4b9 100644 --- a/apps/web-antd/src/components/form/components/upload-image-sortable.vue +++ b/apps/web-antd/src/components/form/components/upload-image-sortable.vue @@ -4,7 +4,7 @@ import { computed, nextTick, onMounted, ref, watch } from 'vue'; import { Modal, Upload } from 'ant-design-vue'; import type { UploadFile } from 'ant-design-vue'; -// 导入上传相关API和工具函数 +import GalleryPickLink from '#/components/form/components/gallery-pick-link.vue'; import { uploadFile } from '#/api/core/upload'; import { uploadToOss } from '#/utils/oss-upload'; import { @@ -279,6 +279,29 @@ const handlePreview = async (file: UploadFile) => { previewTitle.value = file.name || file.url?.split('/').pop() || ''; }; +function onGallerySelect(urls: string[]) { + const remain = props.maxCount - fileList.value.length; + const picked = props.multiple ? urls.slice(0, remain) : urls.slice(0, 1); + for (const url of picked) { + if (fileList.value.some((f) => f.url === url)) { + continue; + } + fileList.value = [ + ...fileList.value, + { + uid: `gallery-${url}`, + name: url.split('/').pop() || 'file', + status: 'done' as const, + url, + }, + ]; + } + updateModelValue(); + nextTick(() => { + initSortable(); + }); +} + // 计算是否显示上传按钮(与upload-image.vue保持一致) const showUploadButton = computed(() => props.multiple @@ -286,6 +309,8 @@ const showUploadButton = computed(() => : fileList.value.length === 0, ); +const galleryRemainCount = computed(() => Math.max(props.maxCount - fileList.value.length, 0)); + onMounted(() => { nextTick(() => { initSortable(); @@ -294,7 +319,7 @@ onMounted(() => { diff --git a/apps/web-antd/src/views/business/order/register/api/index.ts b/apps/web-antd/src/views/business/order/register/api/index.ts index 89a9b404..b4fe5121 100644 --- a/apps/web-antd/src/views/business/order/register/api/index.ts +++ b/apps/web-antd/src/views/business/order/register/api/index.ts @@ -10,6 +10,8 @@ export interface RegisterOrderItem { is_pay: 0 | 1; type: number; status: number; + refund_status?: number; + refund_time?: string; created_at: string; doctor_info?: { name: string; depart?: { name: string } }; user_patient?: { name: string }; @@ -25,3 +27,7 @@ export async function getRegisterListApi(data: Record) { { params: data }, ); } + +export async function refundRegisterApi(data: Record) { + return requestClient.post(`${prefix}refund`, data); +} diff --git a/apps/web-antd/src/views/business/order/register/components/refund.vue b/apps/web-antd/src/views/business/order/register/components/refund.vue new file mode 100644 index 00000000..00709e40 --- /dev/null +++ b/apps/web-antd/src/views/business/order/register/components/refund.vue @@ -0,0 +1,61 @@ + + diff --git a/apps/web-antd/src/views/business/order/register/config/form.ts b/apps/web-antd/src/views/business/order/register/config/form.ts index b8a42df7..14b5d071 100644 --- a/apps/web-antd/src/views/business/order/register/config/form.ts +++ b/apps/web-antd/src/views/business/order/register/config/form.ts @@ -1,51 +1,32 @@ import type { VbenFormProps } from '#/adapter/form'; -export const modalFormProps: VbenFormProps = { - wrapperClass: 'grid-cols-12', // 24栅格, +export const modalRefundFormProps: VbenFormProps = { + wrapperClass: 'grid-cols-12', commonConfig: { formItemClass: 'col-span-12', - // 所有表单项 componentProps: { class: 'w-full', }, }, - // handleSubmit: onSubmit, layout: 'horizontal', schema: [ { component: 'VbenInput', - fieldName: 'id', + fieldName: 'register_id', label: 'ID', + formItemClass: 'col-span-6', dependencies: { show: false, - triggerFields: ['id'], + triggerFields: ['register_id'], }, }, { - component: 'VbenInput', + component: 'Textarea', componentProps: { - placeholder: '请输入角色昵称', + placeholder: '请输入退款备注', }, - fieldName: 'name', - label: '昵称', - rules: 'required', - }, - { - component: 'VbenInput', - componentProps: { - placeholder: '请输入角色代码', - }, - fieldName: 'value', - label: '角色代码', - rules: 'required', - }, - { - component: 'VbenInput', - componentProps: { - placeholder: '请输入角色说明', - }, - fieldName: 'desc', - label: '角色说明', + fieldName: 'refund_reason', + label: '退款备注', rules: 'required', }, ], diff --git a/apps/web-antd/src/views/business/order/register/config/table.ts b/apps/web-antd/src/views/business/order/register/config/table.ts index e83f1d88..6fa8e9dd 100644 --- a/apps/web-antd/src/views/business/order/register/config/table.ts +++ b/apps/web-antd/src/views/business/order/register/config/table.ts @@ -21,15 +21,16 @@ export const gridOptions: VxeGridProps = { { field: 'prescription', title: '处方', width: 240, slots: { default: 'prescription'} }, { field: 'price', title: '挂号价格', width: 110, slots: { default: 'price' } }, { field: 'is_pay', title: '是否支付', width: 100, slots: { default: 'is_pay' } }, + { field: 'refund_status', title: '退款状态', width: 100, slots: { default: 'refund_status' } }, { field: 'status', title: '状态', slots: { default: 'status' } }, { field: 'created_at', title: '创建时间' }, - // { - // type: 'html', - // title: '操作', - // align: 'right', - // slots: { default: 'action' }, - // width: 200, - // }, + { + type: 'html', + title: '操作', + align: 'right', + slots: { default: 'action' }, + width: 200, + }, ], keepSource: true, pagerConfig: {}, diff --git a/apps/web-antd/src/views/business/order/register/index.vue b/apps/web-antd/src/views/business/order/register/index.vue index 2d825eea..84d042b5 100644 --- a/apps/web-antd/src/views/business/order/register/index.vue +++ b/apps/web-antd/src/views/business/order/register/index.vue @@ -1,20 +1,21 @@ + diff --git a/apps/web-antd/src/views/business/special-prescription-category/components/sort-modal.vue b/apps/web-antd/src/views/business/special-prescription-category/components/sort-modal.vue new file mode 100644 index 00000000..952720b0 --- /dev/null +++ b/apps/web-antd/src/views/business/special-prescription-category/components/sort-modal.vue @@ -0,0 +1,156 @@ + + + diff --git a/apps/web-antd/src/views/business/special-prescription-category/config/form.ts b/apps/web-antd/src/views/business/special-prescription-category/config/form.ts new file mode 100644 index 00000000..9b1c0054 --- /dev/null +++ b/apps/web-antd/src/views/business/special-prescription-category/config/form.ts @@ -0,0 +1,50 @@ +import type { VbenFormProps } from '#/adapter/form'; + +export const modalFormProps: VbenFormProps = { + wrapperClass: 'grid-cols-12', + commonConfig: { + formItemClass: 'col-span-12', + componentProps: { + class: 'w-full', + }, + }, + layout: 'horizontal', + schema: [ + { + component: 'VbenInput', + fieldName: 'id', + label: 'ID', + formItemClass: 'col-span-6', + defaultValue: '', + dependencies: { + show: false, + triggerFields: ['id'], + }, + }, + { + component: 'VbenInput', + componentProps: { + placeholder: '请输入分类名称', + }, + fieldName: 'name', + label: '分类名称', + rules: 'required', + defaultValue: '', + }, + { + component: 'VbenSelect', + componentProps: { + placeholder: '请选择状态', + options: [ + { label: '启用', value: 1 }, + { label: '禁用', value: 0 }, + ], + }, + fieldName: 'status', + label: '状态', + formItemClass: 'col-span-6', + defaultValue: 1, + }, + ], + showDefaultActions: false, +}; diff --git a/apps/web-antd/src/views/business/special-prescription-category/config/search.ts b/apps/web-antd/src/views/business/special-prescription-category/config/search.ts new file mode 100644 index 00000000..708e09d7 --- /dev/null +++ b/apps/web-antd/src/views/business/special-prescription-category/config/search.ts @@ -0,0 +1,31 @@ +import type { VbenFormProps } from '@vben/common-ui'; + +export const formOptions: VbenFormProps = { + layout: 'inline', + showResetButton: true, + showSubmitButton: true, + schemas: [ + { + fieldName: 'name', + component: 'Input', + label: '分类名称', + componentProps: { + placeholder: '请输入分类名称', + allowClear: true, + }, + }, + { + fieldName: 'status', + component: 'Select', + label: '状态', + componentProps: { + placeholder: '请选择状态', + allowClear: true, + options: [ + { label: '启用', value: 1 }, + { label: '禁用', value: 0 }, + ], + }, + }, + ], +}; diff --git a/apps/web-antd/src/views/business/special-prescription-category/config/table.ts b/apps/web-antd/src/views/business/special-prescription-category/config/table.ts new file mode 100644 index 00000000..0c2a4c3f --- /dev/null +++ b/apps/web-antd/src/views/business/special-prescription-category/config/table.ts @@ -0,0 +1,65 @@ +import type { VxeGridProps } from '#/adapter/vxe-table'; + +import { getSpecialPrescriptionCategoryList } from '../api'; + +interface RowType { + id: number; + name: string; + sort: number; + status: number; + status_txt: string; + created_at: string; + updated_at: string; +} + +export const gridOptions: VxeGridProps = { + checkboxConfig: { + highlight: true, + labelField: '', + }, + columnConfig: { + useKey: true, + }, + rowConfig: { + useKey: true, + isHover: true, + isCurrent: true, + }, + columns: [ + { type: 'checkbox', width: 60 }, + { field: 'id', align: 'left', title: 'ID', width: 80 }, + { field: 'name', align: 'left', title: '分类名称', minWidth: 160 }, + { field: 'sort', align: 'left', title: '排序', width: 100 }, + { field: 'status_txt', align: 'left', title: '状态', width: 100 }, + { field: 'created_at', title: '创建时间', width: 180 }, + { type: 'html', title: '操作', slots: { default: 'action' }, width: 160 }, + ], + keepSource: true, + pagerConfig: {}, + proxyConfig: { + ajax: { + query: async ({ page }, formValues) => { + return await getSpecialPrescriptionCategoryList({ + page: page.currentPage, + pageSize: page.pageSize, + ...formValues, + }); + }, + }, + }, + border: false, + toolbarConfig: { + search: true, + refresh: true, + print: false, + export: false, + zoom: true, + slots: { + buttons: 'toolbar-buttons', + }, + custom: { + icon: 'vxe-icon-menu', + }, + }, + showOverflow: false, +}; diff --git a/apps/web-antd/src/views/business/special-prescription-category/index.vue b/apps/web-antd/src/views/business/special-prescription-category/index.vue new file mode 100644 index 00000000..c399dd1e --- /dev/null +++ b/apps/web-antd/src/views/business/special-prescription-category/index.vue @@ -0,0 +1,129 @@ + + + diff --git a/apps/web-antd/src/views/business/special-prescription-display-config/index.vue b/apps/web-antd/src/views/business/special-prescription-display-config/index.vue new file mode 100644 index 00000000..d6e6064f --- /dev/null +++ b/apps/web-antd/src/views/business/special-prescription-display-config/index.vue @@ -0,0 +1,248 @@ + + + diff --git a/apps/web-antd/src/views/business/special-prescription/api/index.ts b/apps/web-antd/src/views/business/special-prescription/api/index.ts new file mode 100644 index 00000000..a7d15583 --- /dev/null +++ b/apps/web-antd/src/views/business/special-prescription/api/index.ts @@ -0,0 +1,27 @@ +import { requestClient } from '#/api/request'; + +const prefix = 'special-prescription/'; + +export async function getSpecialPrescriptionList(data: any) { + return requestClient.get(`${prefix}list`, { params: data }); +} + +export async function getSpecialPrescriptionInfo(id: number) { + return requestClient.get(`${prefix}detail`, { params: { id } }); +} + +export async function createSpecialPrescription(data: Record) { + return requestClient.post(`${prefix}create`, data); +} + +export async function updateSpecialPrescription(data: Record) { + return requestClient.post(`${prefix}update`, data); +} + +export async function deleteSpecialPrescription(data: Record) { + return requestClient.post(`${prefix}delete`, data); +} + +export async function applySpecialPrescriptionApi(data: { register_id: number }) { + return requestClient.post(`${prefix}apply`, data); +} diff --git a/apps/web-antd/src/views/business/special-prescription/components/ChineseDrugEditor.vue b/apps/web-antd/src/views/business/special-prescription/components/ChineseDrugEditor.vue new file mode 100644 index 00000000..15a6e84d --- /dev/null +++ b/apps/web-antd/src/views/business/special-prescription/components/ChineseDrugEditor.vue @@ -0,0 +1,451 @@ + + + + + diff --git a/apps/web-antd/src/views/business/special-prescription/components/modal.vue b/apps/web-antd/src/views/business/special-prescription/components/modal.vue new file mode 100644 index 00000000..f8086f7b --- /dev/null +++ b/apps/web-antd/src/views/business/special-prescription/components/modal.vue @@ -0,0 +1,184 @@ + + + diff --git a/apps/web-antd/src/views/business/special-prescription/config/form.ts b/apps/web-antd/src/views/business/special-prescription/config/form.ts new file mode 100644 index 00000000..4461f6da --- /dev/null +++ b/apps/web-antd/src/views/business/special-prescription/config/form.ts @@ -0,0 +1,145 @@ +import type { VbenFormProps } from '#/adapter/form'; + +import { getSpecialPrescriptionCategoryOption } from '#/views/business/special-prescription-category/api'; + +export const modalFormProps: VbenFormProps = { + wrapperClass: 'grid-cols-12', + commonConfig: { + formItemClass: 'col-span-12', + componentProps: { + class: 'w-full', + }, + }, + layout: 'horizontal', + schema: [ + { + component: 'VbenInput', + fieldName: 'id', + label: 'ID', + dependencies: { + show: false, + triggerFields: ['id'], + }, + }, + { + component: 'VbenInput', + componentProps: { + placeholder: '请输入特色方名称', + }, + fieldName: 'name', + label: '名称', + rules: 'required', + defaultValue: '', + }, + { + component: 'ApiSelect', + componentProps: { + placeholder: '请选择分类', + api: getSpecialPrescriptionCategoryOption, + allowClear: true, + showSearch: true, + filterOption: (input: string, option: any) => + option?.label?.toLowerCase().includes(input.toLowerCase()), + afterFetch: (data: { id: number; name: string }[]) => + data.map((item) => ({ + label: item.name, + value: item.id, + })), + }, + fieldName: 'category_id', + label: '分类', + rules: 'required', + }, + { + component: 'Avatar', + fieldName: 'cover_image', + label: '封面', + defaultValue: '', + }, + { + component: 'Select', + componentProps: { + mode: 'tags', + placeholder: '输入标签后回车', + }, + fieldName: 'tags', + label: '标签', + rules: 'required', + defaultValue: [], + }, + { + component: 'InputNumber', + componentProps: { + placeholder: '每剂价格', + min: 0, + precision: 2, + style: { width: '100%' }, + }, + fieldName: 'price_per_dose', + label: '每剂价格', + formItemClass: 'col-span-6', + defaultValue: 0, + }, + { + component: 'InputNumber', + componentProps: { + placeholder: '销量', + min: 0, + style: { width: '100%' }, + }, + fieldName: 'sales_count', + label: '销量', + formItemClass: 'col-span-6', + defaultValue: 0, + }, + { + component: 'VbenSelect', + componentProps: { + placeholder: '请选择状态', + options: [ + { label: '上架', value: 1 }, + { label: '下架', value: 0 }, + ], + }, + fieldName: 'status', + label: '状态', + formItemClass: 'col-span-6', + defaultValue: 1, + }, + { + component: 'VbenSelect', + componentProps: { + placeholder: '请选择处方类型', + options: [ + { label: '中药', value: 'chinese' }, + { label: '西药', value: 'west' }, + { label: '颗粒药', value: 'granular' }, + ], + }, + fieldName: 'prescription_type', + label: '处方类型', + rules: 'required', + defaultValue: 'chinese', + }, + { + component: 'Editor', + componentProps: { + placeholder: '请输入介绍文案', + }, + fieldName: 'intro_text', + label: '介绍文案', + defaultValue: '', + }, + { + component: 'UploadImageSortable', + fieldName: 'introduction_images', + label: '介绍图', + formItemClass: 'col-span-12', + componentProps: { + maxCount: 20, + multiple: true, + }, + }, + ], + showDefaultActions: false, +}; diff --git a/apps/web-antd/src/views/business/special-prescription/config/search.ts b/apps/web-antd/src/views/business/special-prescription/config/search.ts new file mode 100644 index 00000000..d68d76bf --- /dev/null +++ b/apps/web-antd/src/views/business/special-prescription/config/search.ts @@ -0,0 +1,41 @@ +import type { VbenFormProps } from '@vben/common-ui'; + +export const formOptions: VbenFormProps = { + layout: 'inline', + showResetButton: true, + showSubmitButton: true, + schemas: [ + { + fieldName: 'name', + component: 'Input', + label: '名称', + componentProps: { + placeholder: '请输入特色方名称', + allowClear: true, + }, + }, + { + fieldName: 'category_id', + component: 'InputNumber', + label: '分类ID', + componentProps: { + placeholder: '分类ID', + allowClear: true, + min: 1, + }, + }, + { + fieldName: 'status', + component: 'Select', + label: '状态', + componentProps: { + placeholder: '请选择状态', + allowClear: true, + options: [ + { label: '上架', value: 1 }, + { label: '下架', value: 0 }, + ], + }, + }, + ], +}; diff --git a/apps/web-antd/src/views/business/special-prescription/config/table.ts b/apps/web-antd/src/views/business/special-prescription/config/table.ts new file mode 100644 index 00000000..67a02276 --- /dev/null +++ b/apps/web-antd/src/views/business/special-prescription/config/table.ts @@ -0,0 +1,101 @@ +import type { VxeGridProps } from '#/adapter/vxe-table'; + +import { getSpecialPrescriptionList } from '../api'; + +interface RowType { + id: number; + name: string; + category_id: number; + category_name: string; + cover_image: string; + tags: string[]; + price_per_dose: number; + sales_count: number; + sort: number; + status: number; + status_txt: string; + prescription_sub_type: number; + created_at: string; +} + +const prescriptionTypeMap: Record = { + 1: '中药', + 2: '西药', + 3: '颗粒药', +}; + +export const gridOptions: VxeGridProps = { + checkboxConfig: { + highlight: true, + labelField: '', + }, + columnConfig: { + useKey: true, + }, + rowConfig: { + useKey: true, + isHover: true, + isCurrent: true, + }, + columns: [ + { type: 'checkbox', width: 60 }, + { field: 'id', align: 'left', title: 'ID', width: 80 }, + { field: 'name', align: 'left', title: '名称', minWidth: 160 }, + { field: 'category_name', align: 'left', title: '分类', width: 120 }, + { + field: 'cover_image', + align: 'left', + title: '封面', + width: 100, + slots: { default: 'cover' }, + }, + { + field: 'tags', + align: 'left', + title: '标签', + minWidth: 160, + slots: { default: 'tags' }, + }, + { + field: 'prescription_sub_type', + align: 'left', + title: '处方类型', + width: 100, + formatter: ({ cellValue }) => prescriptionTypeMap[cellValue] || '-', + }, + { field: 'price_per_dose', align: 'left', title: '每剂价格', width: 100 }, + { field: 'sales_count', align: 'left', title: '销量', width: 80 }, + { field: 'sort', align: 'left', title: '排序', width: 80 }, + { field: 'status_txt', align: 'left', title: '状态', width: 80 }, + { field: 'created_at', title: '创建时间', width: 180 }, + { type: 'html', title: '操作', slots: { default: 'action' }, width: 160 }, + ], + keepSource: true, + pagerConfig: {}, + proxyConfig: { + ajax: { + query: async ({ page }, formValues) => { + return await getSpecialPrescriptionList({ + page: page.currentPage, + pageSize: page.pageSize, + ...formValues, + }); + }, + }, + }, + border: false, + toolbarConfig: { + search: true, + refresh: true, + print: false, + export: false, + zoom: true, + slots: { + buttons: 'toolbar-buttons', + }, + custom: { + icon: 'vxe-icon-menu', + }, + }, + showOverflow: false, +}; diff --git a/apps/web-antd/src/views/business/special-prescription/index.vue b/apps/web-antd/src/views/business/special-prescription/index.vue new file mode 100644 index 00000000..794b9644 --- /dev/null +++ b/apps/web-antd/src/views/business/special-prescription/index.vue @@ -0,0 +1,129 @@ + + + diff --git a/apps/web-antd/src/views/business/store/settings/index.vue b/apps/web-antd/src/views/business/store/settings/index.vue index 25a748f0..3d4b3d86 100644 --- a/apps/web-antd/src/views/business/store/settings/index.vue +++ b/apps/web-antd/src/views/business/store/settings/index.vue @@ -23,6 +23,7 @@ import { import html2canvas from 'html2canvas'; import DoctorQrCodePreview from '#/components/modal/DoctorQrCodePreview.vue'; +import DoctorCardModal from '#/views/doctor/doctor/components/DoctorCardModal.vue'; import { deleteNavApi, getStoreInfoApi, @@ -67,6 +68,10 @@ const [DoctorQrCodePreviewModal, DoctorQrCodePreviewModalApi] = useVbenModal({ connectedComponent: DoctorQrCodePreview, }); +const [DoctorCardModals, DoctorCardModalApi] = useVbenModal({ + connectedComponent: DoctorCardModal, +}); + const [UploadModals, UploadModalApi] = useVbenModal({ connectedComponent: UploadModal, }); @@ -89,6 +94,16 @@ const openDoctorQrCode = (doctorId: number, isNotQr = false) => { DoctorQrCodePreviewModalApi.open(); }; +/** 打开医生档案卡片(诊所团队场景隐藏关联诊所 Tab) */ +const openDoctorCard = (doctor: any) => { + DoctorCardModalApi.setData({ + id: doctor.doctor?.id, + su_id: doctor.doctor?.su_id, + hideStoresTab: true, + }); + DoctorCardModalApi.open(); +}; + // 诊所/药店数据 const data = ref(null); @@ -341,6 +356,7 @@ const handleSwitchClinicType = () => {