feat: VIP功能绑定、VIP病历模块、字典模块、传方按钮移动到顶部导航栏

This commit is contained in:
李琦
2026-08-05 10:45:58 +08:00
parent 212b16a8ec
commit 029b45d0bb
43 changed files with 5821 additions and 153 deletions

View File

@@ -40,6 +40,13 @@ const logisticsShowWhNameClinic = ref(true);
const salespersonStoreEditEnabled = ref(false);
/** 业务端单机登录:医生/药师/诊所管理员等同一账号仅 1 手机 + 1 网页(默认否) */
const doctorSingleDeviceLogin = ref(false);
/** 字典搜索匹配度:backend 服务端 / frontend 前端 */
const dictSearchRankMode = ref<'backend' | 'frontend'>('backend');
/**
* 病历诊断/医嘱「常用|我的」展示位置
* tags=文本域下标签(默认) bubble=气泡内展示 both=两边
*/
const mrCommonDisplayMode = ref<'tags' | 'bubble' | 'both'>('tags');
/** 开票通知渠道:subscribe / sms,默认仅订阅消息 */
const invoiceNoticeChannels = ref<string[]>(['subscribe']);
@@ -53,6 +60,8 @@ function readStoredTab() {
stored === 'salesperson' ||
stored === 'invoice_notice' ||
stored === 'doctor_login' ||
stored === 'dict_search' ||
stored === 'medical_record' ||
stored === 'oa_notify'
) {
activeKey.value = stored;
@@ -121,6 +130,15 @@ async function load() {
if (row.config_key === 'doctor_single_device_login') {
doctorSingleDeviceLogin.value = parseBoolConfig(row.config_value, false);
}
if (row.config_key === 'dict_search_rank_mode') {
dictSearchRankMode.value =
String(row.config_value || '') === 'frontend' ? 'frontend' : 'backend';
}
if (row.config_key === 'mr_common_display_mode') {
const mode = String(row.config_value || 'tags');
mrCommonDisplayMode.value =
mode === 'bubble' || mode === 'both' ? mode : 'tags';
}
if (row.config_key === 'invoice_notice_channels') {
let channels: unknown = row.config_value;
if (typeof channels === 'string') {
@@ -202,6 +220,22 @@ async function handleSave() {
description: '业务端单机登录(医生/药师/诊所管理员等:1手机+1网页)',
sort: 310,
},
{
config_key: 'dict_search_rank_mode',
config_value: dictSearchRankMode.value,
value_type: 'string',
config_group: 'search',
description: '字典搜索匹配度:backend服务端 / frontend前端',
sort: 320,
},
{
config_key: 'mr_common_display_mode',
config_value: mrCommonDisplayMode.value,
value_type: 'string',
config_group: 'medical_record',
description: '病历诊断医嘱常用展示:tags标签 / bubble气泡 / both两边',
sort: 330,
},
{
config_key: 'invoice_notice_channels',
config_value: JSON.stringify(
@@ -331,6 +365,33 @@ onMounted(() => {
</div>
</Tabs.TabPane>
<Tabs.TabPane key="dict_search" tab="字典搜索">
<div class="py-4">
<div class="mb-2 font-medium">诊断 / 医嘱 / 病历词条匹配度处理端</div>
<div class="mb-2 text-sm text-gray-500">
后端:服务端计算匹配度并排序(适合疾病库等大数据量);前端:接口只返回候选,由端上打分排序(适合调试或减轻服务端 CPU)。关键字高亮始终在端上渲染。
</div>
<Radio.Group v-model:value="dictSearchRankMode">
<Radio value="backend">后端处理(推荐)</Radio>
<Radio value="frontend">前端处理</Radio>
</Radio.Group>
</div>
</Tabs.TabPane>
<Tabs.TabPane key="medical_record" tab="词条">
<div class="py-4">
<div class="mb-2 font-medium">诊断 / 医嘱「常用|我的」展示位置</div>
<div class="mb-2 text-sm text-gray-500">
控制接诊病历里诊断、医嘱的常用快捷出现在哪里。默认「标签」即文本域下方的快捷标签;「气泡卡片」则在关键字搜索气泡内默认展示常用;「两边」同时展示。
</div>
<Radio.Group v-model:value="mrCommonDisplayMode">
<Radio value="tags">标签(默认)</Radio>
<Radio value="bubble">气泡卡片默认展示</Radio>
<Radio value="both">两边都展示</Radio>
</Radio.Group>
</div>
</Tabs.TabPane>
<Tabs.TabPane key="invoice_notice" tab="开票通知">
<div class="py-4">
<div class="mb-2 font-medium">患者开票通知渠道</div>