From f10158b4542161833552f63536348e7c648a902a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=90=A6?= Date: Wed, 23 Sep 2026 16:22:14 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=AF=AD=E9=9F=B3=E5=BC=80=E6=96=B9?= =?UTF-8?q?=E3=80=81=E4=BF=AE=E5=A4=8D=E5=88=86=E8=B4=A6=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E3=80=81=E8=AF=86=E5=9B=BE=E6=88=90=E6=96=B9=E3=80=81=E8=AF=86?= =?UTF-8?q?=E5=9B=BE=E4=BC=A0=E6=96=B9=E3=80=81=E4=BC=98=E5=8C=96=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E5=8D=A1=E7=89=87=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store-card/StoreFinancePanel.vue | 34 +- .../src/constants/sensitive-fields.ts | 8 +- apps/web-antd/src/utils/processRuleCascade.ts | 57 ++ .../chat/components/PrescriptionModal.vue | 67 +- .../order/components/order-trace-drawer.vue | 363 +++++-- .../components/ProductOrderCardList.vue | 336 +++---- .../order/product-order/config/table.ts | 1 + .../business/order/product-order/index.vue | 20 +- .../store/settings/components/uploadModal.vue | 48 +- .../views/business/store/settings/index.vue | 6 +- .../doctor/doctor-reception/api/index.ts | 32 + .../components/ChineseMedicineConfig.vue | 214 +++-- .../views/doctor/doctor-reception/index.vue | 886 +++++++++++++++--- .../components/CommonDxOrderChips.vue | 55 +- .../views/finance/fund-water/config/search.ts | 18 + .../views/finance/fund-water/config/table.ts | 7 + .../src/views/finance/fund-water/index.vue | 294 ++++-- .../components/daily-upload-form.vue | 40 +- .../components/daily-upload-modal.vue | 21 +- .../public-account-pay/utils/daily-upload.ts | 52 +- .../src/views/finance/withdrawal/api/index.ts | 5 + .../components/account-info-card.vue | 2 + .../withdrawal/components/statistics.vue | 11 + .../src/views/finance/withdrawal/index.vue | 2 +- .../src/views/log/api-log/api/index.ts | 7 + .../views/log/api-log/components/modal.vue | 44 +- .../ai/generation/components/detail-modal.vue | 388 +++++++- .../system/ai/generation/config/constants.ts | 2 + .../config/form.ts | 6 +- .../system/store-bank-card/config/form.ts | 2 +- .../src/views/system/store/api/index.ts | 24 + .../cells/StoreConfigTogglesCell.vue | 28 + .../src/views/system/store/config/form.ts | 33 + .../src/views/system/store/config/table.ts | 8 + .../web-antd/src/views/system/store/index.vue | 59 ++ .../src/views/system/system-config/index.vue | 18 + apps/web-antd/vite.config.ts | 5 + 37 files changed, 2561 insertions(+), 642 deletions(-) diff --git a/apps/web-antd/src/components/store-card/StoreFinancePanel.vue b/apps/web-antd/src/components/store-card/StoreFinancePanel.vue index 7f8b013f..02e8c143 100644 --- a/apps/web-antd/src/components/store-card/StoreFinancePanel.vue +++ b/apps/web-antd/src/components/store-card/StoreFinancePanel.vue @@ -2,6 +2,7 @@ /** * 门店详情 - 资金账户面板(余额 + 资金流水 + 账户变动) * 仅超管/系统管理员在 StoreCardModal 中可见,数据按门店 ID 查询 + * 口径说明:资金流水按履约店 store_id;账户变动/余额按分账利润归属店 user_id */ import type { Dayjs } from 'dayjs'; @@ -65,6 +66,9 @@ const fundWaterColumns = [ { title: '金额', dataIndex: 'price', key: 'price', width: 110 }, { title: '流水类型', dataIndex: 'type', key: 'type', width: 110 }, { title: '订单类型', dataIndex: 'order_type', key: 'order_type', width: 110 }, + // store_id 便于核对是否本店履约(委托复诊时流水店与利润店可能不同) + { title: '门店ID', dataIndex: 'store_id', key: 'store_id', width: 90 }, + { title: '诊所', dataIndex: 'store_name', key: 'store_name', width: 120, ellipsis: true }, { title: '订单号', dataIndex: 'order_no', key: 'order_no', ellipsis: true }, { title: '医生', dataIndex: 'doctor_name', key: 'doctor_name', width: 100 }, { title: '时间', dataIndex: 'created_at', key: 'created_at', width: 170 }, @@ -77,6 +81,7 @@ const changeLogColumns = [ { title: '变动前', dataIndex: 'before_amount', key: 'before_amount', width: 100 }, { title: '变动后', dataIndex: 'after_amount', key: 'after_amount', width: 100 }, { title: '变动值', dataIndex: 'change_amount', key: 'change_amount', width: 100 }, + { title: '主体ID', dataIndex: 'user_id', key: 'user_id', width: 90 }, { title: '订单号', dataIndex: 'order_no', key: 'order_no', ellipsis: true }, { title: '来源表', dataIndex: 'source_table_txt', key: 'source_table_txt', width: 110 }, { title: '备注', dataIndex: 'remark', key: 'remark', ellipsis: true }, @@ -123,6 +128,7 @@ async function loadFundWater(page = fundWaterPage.value) { fundWaterList.value = (res?.items || []).map((item: any) => ({ ...item, doctor_name: item?.doctor_info?.name || '-', + store_name: item?.store?.name || '-', })); fundWaterTotal.value = Number(res?.total || 0); } catch (e: any) { @@ -237,6 +243,9 @@ function orderTypeTag(orderType: number) {
+

+ 资金流水按订单履约店;账户变动/余额按分账利润归属店。委托复诊等场景两边主体可能不同,属业务口径而非串店。 +

+ > + +
@@ -354,6 +375,13 @@ function orderTypeTag(orderType: number) { min-width: 0; } +.finance-hint { + margin: 0 0 8px; + font-size: 12px; + line-height: 1.5; + color: hsl(var(--muted-foreground)); +} + .finance-list-segment { margin-bottom: 4px; } diff --git a/apps/web-antd/src/constants/sensitive-fields.ts b/apps/web-antd/src/constants/sensitive-fields.ts index a97fd17e..32def40b 100644 --- a/apps/web-antd/src/constants/sensitive-fields.ts +++ b/apps/web-antd/src/constants/sensitive-fields.ts @@ -19,6 +19,7 @@ export const ENCRYPT_FIELDS = new Set([ 'phone', 'open_api_key', 'api_key', + 'app_secret', ]); /** 需要生成 _tm_text 并默认脱敏展示的字段(encrypt_only) */ @@ -98,7 +99,12 @@ export function maskSensitiveField(field: string, plainText: unknown): string { return ''; } const str = String(plainText); - if (field === 'password' || field === 'api_key' || field === 'open_api_key') { + if ( + field === 'password' || + field === 'api_key' || + field === 'open_api_key' || + field === 'app_secret' + ) { return '*'.repeat(Math.max(str.length, 6)); } if (PHONE_FIELDS.has(field)) { diff --git a/apps/web-antd/src/utils/processRuleCascade.ts b/apps/web-antd/src/utils/processRuleCascade.ts index 5d33f6c9..99ff22db 100644 --- a/apps/web-antd/src/utils/processRuleCascade.ts +++ b/apps/web-antd/src/utils/processRuleCascade.ts @@ -1,5 +1,62 @@ export type ProcessRuleListItem = { id?: number | string }; +/** 代煎+用量必填校验入参(对齐小程序 validateChineseConfigRequired) */ +export type ChineseConfigRequiredInput = { + ruleType?: number | null; + packageMethodId?: number | null; + processRuleId?: number | null; + childProcessRuleId?: number | null; + processRuleNoteId?: number | null; + dosage?: number | null; + dayDosage?: number | null; +}; + +/** + * 中药制剂方式 / 代煎 / 用量必填校验 + * 返回 keys 供 ChineseMedicineConfig 标红,message 供 toast + */ +export function validateChineseConfigRequired(config: ChineseConfigRequiredInput) { + const keys: string[] = []; + const messages: string[] = []; + const ruleType = Number(config?.ruleType || 0); + if (ruleType !== 1 && ruleType !== 2) { + keys.push('ruleType'); + messages.push('请选择制剂方式'); + } + if (ruleType === 1) { + if (!Number(config?.packageMethodId)) { + keys.push('packageMethodId'); + messages.push('请选择包法'); + } + } else if (ruleType === 2) { + if (!Number(config?.processRuleId)) { + keys.push('processRuleId'); + messages.push('请选择制剂要求'); + } + if (!Number(config?.childProcessRuleId)) { + keys.push('childProcessRuleId'); + messages.push('请选择煎法说明'); + } + if (!Number(config?.processRuleNoteId)) { + keys.push('processRuleNoteId'); + messages.push('请选择附加备注'); + } + } + if (!(Number(config?.dosage) >= 1)) { + keys.push('dosage'); + messages.push('请填写剂数'); + } + if (!(Number(config?.dayDosage) >= 1)) { + keys.push('dayDosage'); + messages.push('请填写用药频次'); + } + return { + valid: keys.length === 0, + keys, + message: messages[0] || '', + }; +} + export type ProcessRuleLoadedLevel = 'root' | 'child' | 'note'; /** diff --git a/apps/web-antd/src/views/business/chat/components/PrescriptionModal.vue b/apps/web-antd/src/views/business/chat/components/PrescriptionModal.vue index 03b72ded..239dc5a4 100644 --- a/apps/web-antd/src/views/business/chat/components/PrescriptionModal.vue +++ b/apps/web-antd/src/views/business/chat/components/PrescriptionModal.vue @@ -78,6 +78,7 @@ import { ChineseDrugNameBubble } from '#/components/chinese-drug-name-bubble'; import { formatPriceDisplay } from '#/utils/formatPrice'; import ChineseMedicineConfig from '#/views/doctor/doctor-reception/components/ChineseMedicineConfig.vue'; import { getDeliveryWarehouseOptionsByDrugs, getPrescriptionInfoApi } from '#/views/doctor/doctor-reception/api'; +import { alignChineseDrugsToLatestPrice } from '#/views/doctor/doctor-reception/utils/alignChineseDrugPrice'; import WarehouseSelectModal from './WarehouseSelectModal.vue'; import { detailDoctorOrderToText } from '#/utils/prescriptionDoctorOrder'; @@ -1008,20 +1009,25 @@ async function reusePrescriptionFromList(prescriptionId: number) { message.error('解析中药处方失败'); return; } - prescriptionStore.updateCurrentDrugs( - (rows || []).map((d: any) => { - const drugId = Number(d.drug_id ?? d.id); - return { - index_id: d.id ?? drugId, - id: drugId, - drug_name: d.name || d.drug_name || '', - number: Number(d.number ?? d.amount ?? 0), - way_id: d.way_id ?? d.use_way?.id ?? d.order, - price: Number(d.price ?? d.sell_price ?? 0), - unit: d.unit, - }; - }), - ); + const mappedChinese = (rows || []).map((d: any) => { + const drugId = Number(d.drug_id ?? d.id); + return { + index_id: d.id ?? drugId, + id: drugId, + drug_name: d.name || d.drug_name || '', + number: Number(d.number ?? d.amount ?? 0), + way_id: d.way_id ?? d.use_way?.id ?? d.order, + price: Number(d.price ?? d.sell_price ?? 0), + buy_price: d.buy_price ?? null, + unit: d.unit, + }; + }); + await alignChineseDrugsToLatestPrice({ + registerId: medicalRecordRegisterId.value, + storeId: medicalRecordStoreId.value, + drugs: mappedChinese, + }); + prescriptionStore.updateCurrentDrugs(mappedChinese); if (rep0?.dosage != null) prescriptionStore.dosage = Number(rep0.dosage) || prescriptionStore.dosage; if (rep0?.day_dosage != null) { prescriptionStore.dayDosage = Number(rep0.day_dosage) || prescriptionStore.dayDosage; @@ -1297,19 +1303,26 @@ async function handleSelectCommonPrescription(data: any, type: number) { }); } else { // 中药/颗粒药处方 - recipes.forEach((recipe: any) => { - const newProduct = { - index_id: recipe.drug_id || recipe.id, - id: recipe.drug_id || recipe.id, - drug_name: recipe.drug_name || recipe.name, - number: recipe.number || 1, - price: recipe.price || 0, - buy_price: recipe.buy_price, - way_id: recipe.way_id || 0, - specification: recipe.specification || recipe.drug?.specification || '', - select_number: 1, - }; - // 检查是否已存在 + const chineseRows = recipes.map((recipe: any) => ({ + index_id: recipe.drug_id || recipe.id, + id: recipe.drug_id || recipe.id, + drug_name: recipe.drug_name || recipe.name, + number: recipe.number || 1, + price: recipe.price || 0, + buy_price: recipe.buy_price, + way_id: recipe.way_id || 0, + specification: recipe.specification || recipe.drug?.specification || '', + select_number: 1, + })); + // 颗粒药不走供货比例,只核对中药常用方 + if (type === 2) { + await alignChineseDrugsToLatestPrice({ + registerId: medicalRecordRegisterId.value, + storeId: medicalRecordStoreId.value, + drugs: chineseRows, + }); + } + chineseRows.forEach((newProduct) => { const existItem = prescriptionStore.currentDrugs.find( (item: any) => item.id === newProduct.id, ); diff --git a/apps/web-antd/src/views/business/order/components/order-trace-drawer.vue b/apps/web-antd/src/views/business/order/components/order-trace-drawer.vue index 4e97d712..1f9404f2 100644 --- a/apps/web-antd/src/views/business/order/components/order-trace-drawer.vue +++ b/apps/web-antd/src/views/business/order/components/order-trace-drawer.vue @@ -14,7 +14,6 @@ import { Table, Tabs, Tag, - Timeline, } from 'ant-design-vue'; import { @@ -45,6 +44,10 @@ const reconciliationLoading = ref(false); const activeTab = ref('timeline'); const ledgerScope = ref('all'); const ledgerSubTab = ref<'product' | 'register'>('product'); +/** 商品订单分账:真实入账行 / 下单时冻结的快照 */ +const productLedgerView = ref<'actual' | 'snapshot'>('actual'); +/** 时间线一行放几个节点,奇数行从右往左折返 */ +const TIMELINE_PER_ROW = 4; const traceData = ref | null>(null); const ledgerProduct = ref | null>(null); const ledgerRegister = ref | null>(null); @@ -73,6 +76,61 @@ const currentLedgerData = computed(() => ledgerSubTab.value === 'product' ? ledgerProduct.value : ledgerRegister.value, ); +/** 商品订单分账快照(无快照时为 null) */ +const productLedgerSnapshot = computed( + () => ledgerProduct.value?.ledger_split ?? null, +); + +/** + * 节点状态色:完成类用主题色,驳回/退款用警告色,纯记录用弱色。 + * 只根据已有文案归类,不改时间线数据。 + */ +function timelineStatusTone(status: string) { + if (/驳回|拒|退|失败|取消/.test(status)) { + return 'warn'; + } + if (!status || status === '记录') { + return 'muted'; + } + return 'ok'; +} + +/** + * 把时间线拆成固定四列的折返行。 + * 偶数行从左到右占第 1~4 列;奇数行从右往左,第 1 个节点落在最右列,和上一行末尾对齐。 + */ +const timelineRows = computed(() => { + const nodes = (traceData.value?.timeline ?? []).map((node: any, index: number) => ({ + ...node, + seq: index + 1, + tone: timelineStatusTone(String(node.status ?? '')), + })); + const rows: Array<{ + nodes: Array; + rtl: boolean; + showTurn: boolean; + turnColumn: number; + }> = []; + for (let i = 0; i < nodes.length; i += TIMELINE_PER_ROW) { + const chunk = nodes.slice(i, i + TIMELINE_PER_ROW); + const rowIndex = rows.length; + const rtl = rowIndex % 2 === 1; + const placed = chunk.map((node, index) => { + const column = rtl ? TIMELINE_PER_ROW - index : index + 1; + const hasNext = index < chunk.length - 1; + return { ...node, column, hasNext, pointLeft: rtl }; + }); + const lastIndex = chunk.length - 1; + rows.push({ + nodes: placed, + rtl, + showTurn: i + TIMELINE_PER_ROW < nodes.length, + turnColumn: rtl ? TIMELINE_PER_ROW - lastIndex : lastIndex + 1, + }); + } + return rows; +}); + function formatDrugCell(value?: string) { return value?.trim() ? value : '-'; } @@ -86,6 +144,7 @@ function resetDrawerState() { activeTab.value = 'timeline'; ledgerScope.value = isPlatformAdmin.value ? 'all' : 'store'; ledgerSubTab.value = 'product'; + productLedgerView.value = 'actual'; } const [Drawer, drawerApi] = useVbenDrawer({ @@ -356,22 +415,44 @@ watch(isPlatformAdmin, (val) => { - - +
-
{{ node.title }}
-
{{ node.time }}
-
- {{ node.status }} +
+
+
+ {{ node.seq }} + {{ node.title }} +
+ {{ node.status }} +
{{ node.time }}
+
{{ node.extra }}
+
-
- {{ node.extra }} -
- - -
暂无溯源记录
+
+
+
+
暂无溯源记录
@@ -392,46 +473,76 @@ watch(isPlatformAdmin, (val) => { -
- 合计分账:{{ ledgerProduct?.sum_money ?? '0' }} - (不含已取消) -
- - + + diff --git a/apps/web-antd/src/views/business/order/product-order/components/ProductOrderCardList.vue b/apps/web-antd/src/views/business/order/product-order/components/ProductOrderCardList.vue index 998e78c7..94504468 100644 --- a/apps/web-antd/src/views/business/order/product-order/components/ProductOrderCardList.vue +++ b/apps/web-antd/src/views/business/order/product-order/components/ProductOrderCardList.vue @@ -1,19 +1,17 @@ @@ -313,8 +268,6 @@ onBeforeUnmount(() => {
- -
-
-
- 加载中… -
-
- 没有更多了 +
+
diff --git a/apps/web-antd/src/views/business/order/product-order/config/table.ts b/apps/web-antd/src/views/business/order/product-order/config/table.ts index 2becbe5f..58e22c58 100644 --- a/apps/web-antd/src/views/business/order/product-order/config/table.ts +++ b/apps/web-antd/src/views/business/order/product-order/config/table.ts @@ -102,6 +102,7 @@ export const gridOptions: VxeGridProps = { ], keepSource: true, pagerConfig: {}, + height: 'auto', columnConfig: { useKey: true, }, diff --git a/apps/web-antd/src/views/business/order/product-order/index.vue b/apps/web-antd/src/views/business/order/product-order/index.vue index 6fbe90ac..b65bcec2 100644 --- a/apps/web-antd/src/views/business/order/product-order/index.vue +++ b/apps/web-antd/src/views/business/order/product-order/index.vue @@ -1184,20 +1184,21 @@ function buildRowActions(row: Record): { - - + +
+ -
+
-
+
- + -
+
): { @reverse-salesperson="handleReverseSalesperson" />
+
): { .tcm-drug-chip { box-shadow: 0 1px 2px rgb(0 0 0 / 4%); } - -/* 卡片看板容器:撑满剩余高度,内部滚动(统计岛 + 收起态搜索一行 + 切换行约 220px,min-height 兜底) */ -.po-card-wrap { - height: calc(100% - 220px); - min-height: 420px; -} diff --git a/apps/web-antd/src/views/business/store/settings/components/uploadModal.vue b/apps/web-antd/src/views/business/store/settings/components/uploadModal.vue index 7bee0874..9fea0837 100644 --- a/apps/web-antd/src/views/business/store/settings/components/uploadModal.vue +++ b/apps/web-antd/src/views/business/store/settings/components/uploadModal.vue @@ -13,6 +13,7 @@ import { modalFormProps } from '../config/form'; const isUpdate = ref(false); const gridApi = ref(); const getMyInfoApi = ref(); +const existingUrls = ref([]); const [Form, formApi] = useVbenForm(modalFormProps); @@ -25,30 +26,47 @@ const [Modal, modalApi] = useVbenModal({ onConfirm: async () => { const e = await formApi.validate(); if (!e.valid) return; - const values = await formApi.getValues(); - modalApi.setState({ loading: true, confirmLoading: true }); - const submitApi = saveNavUrlApi; - submitApi(values) - .then(() => { - message.success('保存成功'); - gridApi.value?.reload(); - getMyInfoApi.value(); - modalApi.close(); - }) - .finally(() => { - modalApi.setState({ loading: false, confirmLoading: false }); - }); - + const values = await formApi.getValues(); + modalApi.setState({ loading: true, confirmLoading: true }); + try { + // 新图拼在旧图后面,避免 uploadNav 全量同步时误删已有轮播 + const nextUrls = Array.isArray(values.url) ? values.url : []; + const merged = [...existingUrls.value]; + for (const u of nextUrls) { + const pic = String(u || '').trim(); + if (pic && !merged.includes(pic)) { + merged.push(pic); + } + } + await saveNavUrlApi({ url: merged }); + message.success('保存成功'); + gridApi.value?.reload?.(); + getMyInfoApi.value?.(); + modalApi.close(); + } catch (err) { + console.error(err); + } finally { + modalApi.setState({ loading: false, confirmLoading: false }); + } }, onOpenChange(isOpen: boolean) { gridApi.value = isOpen ? modalApi.getData()?.gridApi : null; if (isOpen) { getMyInfoApi.value = isOpen ? modalApi.getData()?.getMyInfo : null; - const { values, update } = modalApi.getData>(); + const payload = modalApi.getData>() || {}; + existingUrls.value = Array.isArray(payload.existingUrls) + ? payload.existingUrls.map(String).filter(Boolean) + : []; + const { values, update } = payload; if (values) { isUpdate.value = update; formApi.setValues(values); + } else { + isUpdate.value = false; + formApi.reset?.(); } + } else { + existingUrls.value = []; } }, }); 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 5db5258c..e0fa342b 100644 --- a/apps/web-antd/src/views/business/store/settings/index.vue +++ b/apps/web-antd/src/views/business/store/settings/index.vue @@ -85,9 +85,13 @@ const [UploadModals, UploadModalApi] = useVbenModal({ }); const openUpload = () => { + // uploadNav 是全量同步:必须把已有图一并带上,否则「只传新图」会把旧轮播软删掉 + const existingUrls = (data.value?.nav || []) + .map((item) => String(item?.pic || '').trim()) + .filter(Boolean); UploadModalApi.setData({ - // doctorId, getMyInfo, + existingUrls, }); UploadModalApi.open(); }; diff --git a/apps/web-antd/src/views/doctor/doctor-reception/api/index.ts b/apps/web-antd/src/views/doctor/doctor-reception/api/index.ts index cd3fcfad..0d5748d8 100644 --- a/apps/web-antd/src/views/doctor/doctor-reception/api/index.ts +++ b/apps/web-antd/src/views/doctor/doctor-reception/api/index.ts @@ -45,6 +45,18 @@ export async function getProductListDoctorReception(data: any) { return requestClient.get(`${prefix}product-list`, { params: data }); } +/** + * 复用/常用方填方前对比中药快照价与当前门店价 + * 为什么:供货比例变更后关系表已更新,快照价不一致时要让医生确认是否按最新价计算 + */ +export async function compareChineseDrugPricesApi(data: { + register_id?: number; + store_id?: number; + drugs: Array>; +}) { + return requestClient.post(`${prefix}compare-chinese-drug-prices`, data); +} + /** * 获取中药规格 * @param data @@ -670,3 +682,23 @@ export async function getProxyPayQrcodeApi(orderId: number) { order_id: orderId, }); } + +/** 处方图 OCR(DeepSeek) */ +export async function ocrPrescriptionImageApi(data: { + image_urls: string[]; + mode: 'reception' | 'transfer'; + register_id?: number; + store_id?: number; +}) { + return requestClient.post(`${prefix}ocr-prescription-image`, data); +} + +/** 确认识图传方:建患者/挂号 + 待导入传方单 */ +export async function confirmTransferImageOcrApi(data: Record) { + return requestClient.post<{ + transfer_id: number; + register_id: number; + user_patient_id: number; + patient_action: string; + }>(`${prefix}confirm-transfer-image-ocr`, data); +} diff --git a/apps/web-antd/src/views/doctor/doctor-reception/components/ChineseMedicineConfig.vue b/apps/web-antd/src/views/doctor/doctor-reception/components/ChineseMedicineConfig.vue index cf3899d0..7760b649 100644 --- a/apps/web-antd/src/views/doctor/doctor-reception/components/ChineseMedicineConfig.vue +++ b/apps/web-antd/src/views/doctor/doctor-reception/components/ChineseMedicineConfig.vue @@ -1,4 +1,10 @@ @@ -759,6 +795,13 @@ const handleSwitchClinicType = (row: any) => {
+