-
{{ patient.user_patient.name }}
+
+ {{ patient.user_patient.name }}
+
+ 特色方{{
+ patient.special_prescription_patient_record.status === 0
+ ? '·待导入'
+ : ''
+ }}
+
+
{{ patient.user_patient.mobile }}
推广员:{{ patient.salesperson?.nick_name || '无' }}
@@ -2183,6 +2279,52 @@ watch(
}}
+
+
+
+
+
+ {{ specialPrescriptionRecord.special_prescription?.name || '特色方' }}
+
+
+ 剂量:{{ specialPrescriptionRecord.dose_count }} 剂
+
+
+ 待导入
+
+
+ 已应用
+
+
已完成
+
+
+
+
选择常用方
+
+
+
+
+
+
+
+
+
+ {{ record.prescription_no }}
+
+
+
+ 查看
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ record.id }}
+
+
+
+
+ {{ record.is_pay ? '已支付' : '待支付' }}
+
+
+
+ ¥ {{ record.total_price }}
+
+
+ 查看
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-antd/src/views/doctor/doctor/config/form.ts b/apps/web-antd/src/views/doctor/doctor/config/form.ts
index b0523848..c0ffb9d0 100644
--- a/apps/web-antd/src/views/doctor/doctor/config/form.ts
+++ b/apps/web-antd/src/views/doctor/doctor/config/form.ts
@@ -208,12 +208,6 @@ export const infoModalFormProps: VbenFormProps = {
},
fieldName: 'mobile',
formItemClass: 'col-span-6',
- dependencies: {
- show: (values) => {
- return values.id == null;
- },
- triggerFields: ['id'],
- },
label: '手机号码',
rules: 'required',
},
diff --git a/apps/web-antd/src/views/doctor/doctor/config/table.ts b/apps/web-antd/src/views/doctor/doctor/config/table.ts
index 0b778eda..ed9ac576 100644
--- a/apps/web-antd/src/views/doctor/doctor/config/table.ts
+++ b/apps/web-antd/src/views/doctor/doctor/config/table.ts
@@ -30,7 +30,7 @@ export const gridOptions: VxeGridProps = {
columns: [
{ type: 'checkbox', width: 60 },
{ field: 'id', align: 'left', title: 'ID', width: 100 },
- { field: 'name', align: 'left', title: '名称' },
+ { field: 'name', align: 'left', title: '名称', slots: { default: 'name' } },
{ field: 'mobile', align: 'left', title: '手机号' },
{
field: 'avatar',
diff --git a/apps/web-antd/src/views/doctor/doctor/index.vue b/apps/web-antd/src/views/doctor/doctor/index.vue
index 610ca401..2a2f1085 100644
--- a/apps/web-antd/src/views/doctor/doctor/index.vue
+++ b/apps/web-antd/src/views/doctor/doctor/index.vue
@@ -14,6 +14,7 @@ import { auditApi, openPcWindowsApi, refuseApi } from './api';
import BindStore from './components/BindStoreModal.vue';
import BindSubjects from './components/BindSubjectsModal.vue';
import FormModalDemo from './components/modal.vue';
+import DoctorCardModal from './components/DoctorCardModal.vue';
import { formOptions } from './config/search';
import { gridOptions } from './config/table';
@@ -50,6 +51,10 @@ const [BindSubjectsModal, BindSubjectsModalApi] = useVbenModal({
connectedComponent: BindSubjects,
});
+const [DoctorCardModals, DoctorCardModalApi] = useVbenModal({
+ connectedComponent: DoctorCardModal,
+});
+
const showModal = (data = {}, isUpdate = false) => {
formModalApi.setData({
// 表单值
@@ -77,6 +82,15 @@ const showBindSubjectsModal = (row: Record) => {
BindSubjectsModalApi.open();
};
+const showDoctorCard = (row: Record) => {
+ DoctorCardModalApi.setData({
+ id: row.id,
+ su_id: row.su_id,
+ gridApi,
+ });
+ DoctorCardModalApi.open();
+};
+
const openPcWindows = (id: number) => {
openPcWindowsApi(id).then(() => {
message.success('开通成功!');
@@ -104,6 +118,7 @@ const refuse = (id: number) => {
+
{
+
+
+ {{ row.name }}
+
+
{{ item?.store?.name }}
@@ -167,6 +187,13 @@ const refuse = (id: number) => {
+
+
+ {{ row.nick_name }}
+
+ {{ row.nick_name }}
+
{{ formatAdminRegion(row) }}
diff --git a/apps/web-antd/src/views/system/admin/_shared/table-config.ts b/apps/web-antd/src/views/system/admin/_shared/table-config.ts
index 01bbfb40..ceee3034 100644
--- a/apps/web-antd/src/views/system/admin/_shared/table-config.ts
+++ b/apps/web-antd/src/views/system/admin/_shared/table-config.ts
@@ -26,7 +26,7 @@ function buildColumns(formType: AdminFormType) {
const cols: VxeGridProps['columns'] = [
{ type: 'checkbox', width: 60 },
{ field: 'id', align: 'left', title: 'ID', width: 100 },
- { field: 'nick_name', align: 'left', title: '名称' },
+ { field: 'nick_name', align: 'left', title: '名称', ...(formType === 'doctor' ? { slots: { default: 'nick_name' } } : {}) },
{
field: 'avatar',
align: 'left',
diff --git a/apps/web-antd/src/views/system/pharmacy/components/modal.vue b/apps/web-antd/src/views/system/pharmacy/components/modal.vue
index c811ce26..e6c2c8b7 100644
--- a/apps/web-antd/src/views/system/pharmacy/components/modal.vue
+++ b/apps/web-antd/src/views/system/pharmacy/components/modal.vue
@@ -77,6 +77,7 @@ const [Modal, modalApi] = useVbenModal({
end_time: dayjs(values.end_time || '20:00', 'HH:mm'),
// 确保订阅状态有值,如果后端没有返回则默认为0(订阅)
subscribe_price_change: values.subscribe_price_change ?? 0,
+ sync_admin_phone: false,
});
} else {
formApi.setValues({
diff --git a/apps/web-antd/src/views/system/pharmacy/config/form.ts b/apps/web-antd/src/views/system/pharmacy/config/form.ts
index 8f477b4c..387cb9b6 100644
--- a/apps/web-antd/src/views/system/pharmacy/config/form.ts
+++ b/apps/web-antd/src/views/system/pharmacy/config/form.ts
@@ -154,6 +154,23 @@ export const modalFormProps: VbenFormProps = {
label: '联系人手机号',
rules: 'required',
},
+ {
+ // 编辑时可选:同步修改药店管理员后台登录手机号
+ component: 'Switch',
+ formItemClass: 'col-span-12',
+ fieldName: 'sync_admin_phone',
+ label: '同步管理员登录号',
+ defaultValue: false,
+ componentProps: {
+ checkedChildren: '是',
+ unCheckedChildren: '否',
+ },
+ help: '勾选后,保存时将同步修改药店管理员后台登录手机号(需已开通后台)',
+ dependencies: {
+ show: (values) => values.id != null,
+ triggerFields: ['id'],
+ },
+ },
{
component: 'PromoterPicker',
formItemClass: 'col-span-6',
diff --git a/apps/web-antd/src/views/system/store/api/index.ts b/apps/web-antd/src/views/system/store/api/index.ts
index f8233cb2..d929e9a3 100644
--- a/apps/web-antd/src/views/system/store/api/index.ts
+++ b/apps/web-antd/src/views/system/store/api/index.ts
@@ -31,6 +31,16 @@ export async function bindOnlineConsultationApi(data: {
}) {
return requestClient.post(`${prefix}bind-online-consultation`, data);
}
+
+/**
+ * 绑定特色方默认挂号医生
+ */
+export async function updateSpecialPrescriptionDoctorApi(data: {
+ id: number;
+ special_prescription_doctor_id?: number | null;
+}) {
+ return requestClient.post(`${prefix}update-special-prescription-doctor`, data);
+}
/**
* 分页查询用户列表
* @param data
diff --git a/apps/web-antd/src/views/system/store/components/BindSpecialPrescriptionDoctorModal.vue b/apps/web-antd/src/views/system/store/components/BindSpecialPrescriptionDoctorModal.vue
new file mode 100644
index 00000000..16b0283d
--- /dev/null
+++ b/apps/web-antd/src/views/system/store/components/BindSpecialPrescriptionDoctorModal.vue
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
diff --git a/apps/web-antd/src/views/system/store/components/modal.vue b/apps/web-antd/src/views/system/store/components/modal.vue
index a3faad46..541f280d 100644
--- a/apps/web-antd/src/views/system/store/components/modal.vue
+++ b/apps/web-antd/src/views/system/store/components/modal.vue
@@ -56,6 +56,7 @@ const [Modal, modalApi] = useVbenModal({
end_time: dayjs(values.end_time || '20:00', 'HH:mm'),
// 确保订阅状态有值,如果后端没有返回则默认为0(订阅)
subscribe_price_change: values.subscribe_price_change ?? 0,
+ sync_admin_phone: false,
});
}
}
diff --git a/apps/web-antd/src/views/system/store/config/form.ts b/apps/web-antd/src/views/system/store/config/form.ts
index 587364f9..241ae8fa 100644
--- a/apps/web-antd/src/views/system/store/config/form.ts
+++ b/apps/web-antd/src/views/system/store/config/form.ts
@@ -179,6 +179,23 @@ export const modalFormProps: VbenFormProps = {
label: '联系人手机号',
rules: 'required',
},
+ {
+ // 编辑时可选:同步修改诊所管理员后台登录手机号
+ component: 'Switch',
+ formItemClass: 'col-span-12',
+ fieldName: 'sync_admin_phone',
+ label: '同步管理员登录号',
+ defaultValue: false,
+ componentProps: {
+ checkedChildren: '是',
+ unCheckedChildren: '否',
+ },
+ help: '勾选后,保存时将同步修改诊所管理员后台登录手机号(需已开通后台)',
+ dependencies: {
+ show: (values) => values.id != null,
+ triggerFields: ['id'],
+ },
+ },
{
component: 'PromoterPicker',
formItemClass: 'col-span-6',
diff --git a/apps/web-antd/src/views/system/store/config/table.ts b/apps/web-antd/src/views/system/store/config/table.ts
index e5af637c..94b88ebd 100644
--- a/apps/web-antd/src/views/system/store/config/table.ts
+++ b/apps/web-antd/src/views/system/store/config/table.ts
@@ -37,6 +37,13 @@ export const gridOptions: VxeGridProps = {
width: 160,
slots: { default: 'online_consultation_config' },
},
+ {
+ field: 'special_prescription_config',
+ align: 'left',
+ title: '特色方配置',
+ width: 140,
+ slots: { default: 'special_prescription_config' },
+ },
{
field: 'store_config_1',
align: 'left',
diff --git a/apps/web-antd/src/views/system/store/index.vue b/apps/web-antd/src/views/system/store/index.vue
index d2f650b9..4121907e 100644
--- a/apps/web-antd/src/views/system/store/index.vue
+++ b/apps/web-antd/src/views/system/store/index.vue
@@ -34,6 +34,7 @@ import StoreBasicInfoCell from './components/cells/StoreBasicInfoCell.vue';
import StoreConfigTogglesCell from './components/cells/StoreConfigTogglesCell.vue';
import DrugPriceModal from './components/DrugPriceModal.vue';
import BindConsultationModal from './components/BindConsultationModal.vue';
+import BindSpecialPrescriptionDoctorModal from './components/BindSpecialPrescriptionDoctorModal.vue';
import StoreExternalFieldModal from './components/StoreExternalFieldModal.vue';
import SalespersonCommissionDrawer from './components/SalespersonCommissionDrawer.vue';
import BankCardReportModal from '#/views/system/store-bank-card/components/BankCardReportModal.vue';
@@ -102,6 +103,11 @@ const [BindConsultationModalComponent, bindConsultationModalApi] = useVbenModal(
connectedComponent: BindConsultationModal,
});
+const [BindSpecialPrescriptionDoctorModalComponent, bindSpecialPrescriptionDoctorModalApi] =
+ useVbenModal({
+ connectedComponent: BindSpecialPrescriptionDoctorModal,
+ });
+
const [StoreExternalFieldModalComponent, storeExternalFieldModalApi] = useVbenModal({
connectedComponent: StoreExternalFieldModal,
});
@@ -216,6 +222,14 @@ const showBindConsultationModal = (row: any) => {
bindConsultationModalApi.open();
};
+const showBindSpecialPrescriptionDoctorModal = (row: any) => {
+ bindSpecialPrescriptionDoctorModalApi.setData({
+ values: row,
+ gridApi,
+ });
+ bindSpecialPrescriptionDoctorModalApi.open();
+};
+
const deleteApi = (row: any) => {
let ids = [];
if (row) {
@@ -369,6 +383,7 @@ const handleSwitchClinicType = (row: any) => {
+
@@ -512,6 +527,23 @@ const handleSwitchClinicType = (row: any) => {
绑定
+
+
+
医生ID:{{ row.special_prescription_doctor_id }}
+
+
+ 绑定
+
+
早:{{ row.start_time }}
@@ -595,6 +627,14 @@ const handleSwitchClinicType = (row: any) => {
ifShow: isPlatformAdmin,
onClick: showDrugPriceModal.bind(null, row),
},
+ {
+ label: '绑定特色方医生',
+ type: 'link',
+ icon: 'ant-design:user-add-outlined',
+ size: 'small',
+ auth: ['Super Admin', 'Admin'],
+ onClick: () => showBindSpecialPrescriptionDoctorModal(row),
+ },
{
label: '查看卡状态',
type: 'link',
diff --git a/apps/web-antd/src/views/system/system-config/index.vue b/apps/web-antd/src/views/system/system-config/index.vue
index e3a30628..9f4a89c4 100644
--- a/apps/web-antd/src/views/system/system-config/index.vue
+++ b/apps/web-antd/src/views/system/system-config/index.vue
@@ -3,16 +3,21 @@ import { onMounted, ref } from 'vue';
import { Page } from '@vben/common-ui';
-import { Button, Card, Input, InputNumber, message, Radio, Space, Switch, Tag } from 'ant-design-vue';
+import { Button, Card, Input, InputNumber, message, Radio, Space, Switch, Tabs, Tag } from 'ant-design-vue';
import type { QuickDiscountOption } from '#/utils/pricePercentAdjust';
+import FormAvatar from '#/components/form/components/avatar.vue';
+
import { getSystemConfigList, saveSystemConfig } from './api';
defineOptions({ name: 'SystemConfig' });
+const TAB_STORAGE_KEY = 'system_config_active_tab';
+
const loading = ref(false);
const saving = ref(false);
+const activeKey = ref('price_adjust');
const scope = ref<'both' | 'sale_only'>('sale_only');
const quickOptions = ref([
{ name: '九五折', value: 95 },
@@ -25,6 +30,19 @@ const quickOptions = ref([
const newQuickName = ref('');
const newQuickValue = ref(null);
const inputAutoAuditPass = ref(true);
+const miniprogramEmptyImage = ref('');
+
+function readStoredTab() {
+ const stored = localStorage.getItem(TAB_STORAGE_KEY);
+ if (stored === 'price_adjust' || stored === 'input_audit' || stored === 'miniprogram') {
+ activeKey.value = stored;
+ }
+}
+
+function handleTabChange(key: string | number) {
+ activeKey.value = String(key);
+ localStorage.setItem(TAB_STORAGE_KEY, String(key));
+}
function parseQuickOptions(raw: unknown): QuickDiscountOption[] {
if (typeof raw === 'string') {
@@ -63,6 +81,9 @@ async function load() {
if (row.config_key === 'input_auto_audit_pass') {
inputAutoAuditPass.value = row.config_value === '1' || row.config_value === true || row.config_value === 'true';
}
+ if (row.config_key === 'miniprogram_empty_image') {
+ miniprogramEmptyImage.value = String(row.config_value || '');
+ }
}
} finally {
loading.value = false;
@@ -100,6 +121,10 @@ async function handleSave() {
config_key: 'input_auto_audit_pass',
config_value: inputAutoAuditPass.value ? '1' : '0',
},
+ {
+ config_key: 'miniprogram_empty_image',
+ config_value: miniprogramEmptyImage.value,
+ },
]);
message.success('保存成功');
} finally {
@@ -107,46 +132,64 @@ async function handleSave() {
}
}
-onMounted(load);
+onMounted(() => {
+ readStoredTab();
+ load();
+});
-
-
-
订单打折时价格浮动范围
-
- 仅售价浮动
- 供货价与售价一起浮动
-
-
+
+
+
+
+
+
订单打折时价格浮动范围
+
+ 仅售价浮动
+ 供货价与售价一起浮动
+
+
-
-
调价快捷选项(name 展示名,value 比例:100=原价,90=九折,120=涨20%)
-
-
- {{ item.name }}({{ item.value }}%)
-
-
-
-
-
- 添加快捷项
-
-
+
+
调价快捷选项(name 展示名,value 比例:100=原价,90=九折,120=涨20%)
+
+
+ {{ item.name }}({{ item.value }}%)
+
+
+
+
+
+ 添加快捷项
+
+
+
+
- 保存配置
-
+
+
+
诊所/医生信息预填录入后是否自动通过审核
+
+
+
+
+
+
+
空状态图片
+
用于小程序列表等无数据时的占位图
+
+
+
+
-
- 诊所/医生信息预填录入后是否自动通过审核
-
保存配置