diff --git a/apps/web-antd/src/views/doctor/doctor-reception/components/PrescrtionDetail.vue b/apps/web-antd/src/views/doctor/doctor-reception/components/PrescrtionDetail.vue
index 59d9cc36..5bd08cc9 100644
--- a/apps/web-antd/src/views/doctor/doctor-reception/components/PrescrtionDetail.vue
+++ b/apps/web-antd/src/views/doctor/doctor-reception/components/PrescrtionDetail.vue
@@ -214,6 +214,7 @@ const decrypt = (str: string) => str; // 简单base64解码示例
总价: ¥{{ item.total_pay_price }}
处方有效期: {{ item.valid_hours }}小时
+ 处方有效期2: {{ item.auto_expire_time }}小时
diff --git a/apps/web-antd/src/views/doctor/doctor-reception/index.vue b/apps/web-antd/src/views/doctor/doctor-reception/index.vue
index 180db3fd..9acd88b2 100644
--- a/apps/web-antd/src/views/doctor/doctor-reception/index.vue
+++ b/apps/web-antd/src/views/doctor/doctor-reception/index.vue
@@ -427,14 +427,14 @@ const sendPrescription = () => {
}).then(() => {
message.success('处方已发送');
// 清空当前数据
- currentDrugs.value = [];
- diagnosis.value = '';
- medicalAdvice.value = '';
- packageMethodId.value = 2;
- processRulePrice.value = '';
- dosage.value = 1;
- dayDosage.value = 1;
- updateLocalStorage();
+ // currentDrugs.value = [];
+ // diagnosis.value = '';
+ // medicalAdvice.value = '';
+ // packageMethodId.value = 2;
+ // processRulePrice.value = '';
+ // dosage.value = 1;
+ // dayDosage.value = 1;
+ // updateLocalStorage();
});
};
@@ -770,6 +770,9 @@ function addProducts(data) {
+
当前
历史
diff --git a/apps/web-antd/src/views/doctor/doctor/api/index.ts b/apps/web-antd/src/views/doctor/doctor/api/index.ts
new file mode 100644
index 00000000..ddf3a860
--- /dev/null
+++ b/apps/web-antd/src/views/doctor/doctor/api/index.ts
@@ -0,0 +1,82 @@
+import { requestClient } from '#/api/request';
+
+const prefix = 'doctor/';
+/**
+ * 分页查询用户列表
+ * @param data
+ */
+export async function getDoctorList(data: any) {
+ return requestClient.get(`${prefix}list`, { params: data });
+}
+/**
+ * 分页查询用户列表
+ * @param data
+ */
+export async function getDoctorAccountBalance(data: any = {}) {
+ return requestClient.get(`${prefix}my-balance`, { params: data });
+}
+
+/**
+ * 获取医生详情
+ * @param id
+ */
+export async function getDoctorInfo(id: number) {
+ return requestClient.get(`${prefix}detail`, { params: { id } });
+}
+
+/**
+ * 新增医生
+ * @param data
+ */
+export async function createDoctor(data: Record) {
+ return requestClient.post(`${prefix}create`, data);
+}
+
+/**
+ * 编辑医生
+ * @param data
+ */
+export async function updateDoctor(data: Record) {
+ return requestClient.post(`${prefix}update`, data);
+}
+
+/**
+ * 删除医生
+ * @param data
+ */
+export async function deleteDoctor(data: Record) {
+ return requestClient.post(`${prefix}delete`, data);
+}
+
+/**
+ * 修改密码
+ * @param data
+ */
+export async function updatePassword(data: Record) {
+ return requestClient.post(`${prefix}update-password`, data);
+}
+
+/**
+ * 删除医生
+ * @param id
+ */
+export async function openPcWindowsApi(id: number) {
+ return requestClient.post(`${prefix}open-pc-windows`, {
+ id,
+ });
+}
+
+/**
+ * 获取我绑定的银行卡
+ */
+export async function getMyCard() {
+ return requestClient.get(`${prefix}my-card`);
+}
+
+/**
+ * 编辑账户绑定银行卡
+ * @param data
+ */
+export async function saveCard(data: Record) {
+ return requestClient.post(`${prefix}save-card`, data);
+}
diff --git a/apps/web-antd/src/views/doctor/doctor/components/modal.vue b/apps/web-antd/src/views/doctor/doctor/components/modal.vue
new file mode 100644
index 00000000..63606f38
--- /dev/null
+++ b/apps/web-antd/src/views/doctor/doctor/components/modal.vue
@@ -0,0 +1,65 @@
+
+
+
+
+
+
diff --git a/apps/web-antd/src/views/doctor/doctor/config/form.ts b/apps/web-antd/src/views/doctor/doctor/config/form.ts
new file mode 100644
index 00000000..fcc9cdb0
--- /dev/null
+++ b/apps/web-antd/src/views/doctor/doctor/config/form.ts
@@ -0,0 +1,172 @@
+import type { VbenFormProps } from '#/adapter/form';
+
+import { z } from '#/adapter/form';
+import { getRoleOption } from '#/views/system/role/api';
+import { getSupplierOption } from '#/views/system/supplier/api';
+
+const defaultPassword = 'Xk123456@';
+
+const supplierId = 7;
+export const modalFormProps: VbenFormProps = {
+ wrapperClass: 'grid-cols-12', // 24栅格,
+ commonConfig: {
+ formItemClass: 'col-span-12',
+ // 所有表单项
+ componentProps: {
+ class: 'w-full',
+ },
+ },
+ // handleSubmit: onSubmit,
+ layout: 'horizontal',
+ schema: [
+ {
+ component: 'VbenInput',
+ fieldName: 'id',
+ label: 'ID',
+ formItemClass: 'col-span-6',
+ dependencies: {
+ show: false,
+ triggerFields: ['id'],
+ },
+ },
+ {
+ component: 'VbenInput',
+ componentProps: {
+ placeholder: '请输入医生昵称',
+ },
+ fieldName: 'nick_name',
+ label: '昵称',
+ rules: 'required',
+ formItemClass: 'col-span-6',
+ },
+ {
+ component: 'Avatar',
+ fieldName: 'avatar',
+ label: '头像',
+ rules: 'required',
+ formItemClass: 'col-span-6',
+ },
+ {
+ component: 'VbenInput',
+ componentProps: {
+ placeholder: '请输入医生手机号码',
+ },
+ fieldName: 'phone',
+ label: '手机号',
+ rules: 'required',
+ formItemClass: 'col-span-6',
+ },
+ {
+ component: 'ApiSelect',
+ componentProps: {
+ allowClear: true,
+ filterOption: (input: string, option: any) => {
+ // 自定义过滤逻辑,确保可以根据 name 进行搜索
+ return option?.label.toLowerCase().indexOf(input.toLowerCase()) >= 0;
+ },
+ showSearch: true,
+ // 菜单接口转options格式
+ afterFetch: (data: { id: number; name: string }[]) => {
+ return data.map((item: any) => ({
+ label: item.name,
+ value: item.id,
+ }));
+ },
+ api: getRoleOption,
+ placeholder: '请选择',
+ },
+ fieldName: 'role_id',
+ formItemClass: 'col-span-6',
+ label: '角色',
+ rules: 'required',
+ },
+ {
+ component: 'ApiSelect',
+ componentProps: {
+ allowClear: true,
+ filterOption: true,
+ showSearch: true,
+ // 菜单接口转options格式
+ afterFetch: (data: { id: number; name: string }[]) => {
+ return data.map((item: any) => ({
+ label: item.name,
+ value: item.id,
+ }));
+ },
+ api: getSupplierOption,
+ placeholder: '请选择',
+ },
+ dependencies: {
+ show: (values) => {
+ return values.role_id === supplierId;
+ },
+ triggerFields: ['role_id'],
+ },
+ fieldName: 'supplier_id',
+ formItemClass: 'col-span-6',
+ label: '所属供应商',
+ rules: 'required',
+ },
+ {
+ fieldName: 'password',
+ label: '密码',
+ component: 'InputPassword',
+ help: '5-18位数字、字母、特殊字符组成。',
+ componentProps: {
+ placeholder: '请输入密码',
+ allowClear: true,
+ },
+ defaultValue: defaultPassword,
+ rules: z
+ .string()
+ .regex(
+ /^(?=.*[A-Z0-9])(?=.*[!@#$%^&*])[A-Z0-9!@#$%^&*]{5,18}$/i,
+ '密码由5-18位数字、字母、特殊字符组成。',
+ ),
+ dependencies: {
+ if({ id }) {
+ return !id;
+ },
+ triggerFields: ['id'],
+ },
+ formItemClass: 'col-span-6',
+ },
+ {
+ fieldName: 'confirmPassword',
+ label: '确认密码',
+ component: 'InputPassword',
+ componentProps: {
+ placeholder: '请输入确认密码',
+ allowClear: true,
+ },
+ defaultValue: defaultPassword,
+ rules: z
+ .string()
+ .regex(/[\w!@#$%^&*]{5,18}/, '密码由5-18位数字、字母、特殊字符组成。'),
+ dependencies: {
+ if({ id }) {
+ return !id;
+ },
+ triggerFields: ['id', 'confirmPassword'],
+ rules: (values) => {
+ return z
+ .string()
+ .regex(
+ /[\w!@#$%^&*]{5,18}/,
+ '密码由5-18位数字、字母、特殊字符组成。',
+ )
+ .refine(
+ (confirmPassword) => {
+ return confirmPassword === values.password;
+ },
+ {
+ message: '确认密码必须与密码一致',
+ },
+ );
+ },
+ },
+ formItemClass: 'col-span-6',
+ },
+ ],
+ showDefaultActions: false,
+};
diff --git a/apps/web-antd/src/views/doctor/doctor/config/search.ts b/apps/web-antd/src/views/doctor/doctor/config/search.ts
new file mode 100644
index 00000000..ab1ca191
--- /dev/null
+++ b/apps/web-antd/src/views/doctor/doctor/config/search.ts
@@ -0,0 +1,56 @@
+import type { VbenFormProps } from '#/adapter/form';
+
+import { getRoleOption } from '#/views/system/role/api';
+
+export const formOptions: VbenFormProps = {
+ // 默认展开
+ collapsed: false,
+ schema: [
+ {
+ component: 'VbenInput',
+ componentProps: {
+ placeholder: '输入名称',
+ },
+ defaultValue: '',
+ fieldName: 'name',
+ label: '医生名称',
+ },
+ // {
+ // component: 'VbenInput',
+ // componentProps: {
+ // placeholder: '输入手机号码',
+ // },
+ // defaultValue: '',
+ // fieldName: 'phone',
+ // label: '手机号码',
+ // },
+ // {
+ // component: 'ApiSelect',
+ // componentProps: {
+ // allowClear: true,
+ // filterOption: true,
+ // showSearch: true,
+ // // 菜单接口转options格式
+ // afterFetch: (data: { id: number; name: string }[]) => {
+ // return data.map((item: any) => ({
+ // label: item.name,
+ // value: item.id,
+ // }));
+ // },
+ // api: getRoleOption,
+ // placeholder: '请选择',
+ // },
+ // fieldName: 'role_id',
+ // label: '角色',
+ // },
+ ],
+ // 控制表单是否显示折叠按钮
+ showCollapseButton: true,
+ submitButtonOptions: {
+ content: '查询',
+ },
+ // 是否在字段值改变时提交表单
+ submitOnChange: true,
+ // 按下回车时是否提交表单
+ submitOnEnter: false,
+};
diff --git a/apps/web-antd/src/views/doctor/doctor/config/table.ts b/apps/web-antd/src/views/doctor/doctor/config/table.ts
new file mode 100644
index 00000000..ce3b6bc8
--- /dev/null
+++ b/apps/web-antd/src/views/doctor/doctor/config/table.ts
@@ -0,0 +1,81 @@
+import type { VxeGridProps } from '#/adapter/vxe-table';
+
+import { getDoctorList } from '../api';
+
+interface RowType {
+ id: string;
+ nick_name: string;
+ email: string;
+ avatar: string;
+ roles: { name: string }[];
+ open_id: string;
+ code: string;
+ platform_id: string;
+ phone: string;
+ desc: string;
+ created_at: string;
+}
+
+export const gridOptions: VxeGridProps = {
+ checkboxConfig: {
+ highlight: true,
+ labelField: '',
+ },
+ columnConfig: {
+ useKey: true,
+ },
+ rowConfig: {
+ useKey: true,
+ },
+ columns: [
+ { type: 'checkbox', width: 60 },
+ { field: 'id', align: 'left', title: 'ID', width: 100 },
+ { field: 'name', align: 'left', title: '名称' },
+ { field: 'mobile', align: 'left', title: '手机号' },
+ {
+ field: 'avatar',
+ align: 'left',
+ title: '头像',
+ slots: { default: 'avatar' },
+ width: 130,
+ },
+ { field: 'su_id', title: 'wxID' },
+ { field: 'stores', title: '所属诊所', slots: { default: 'stores' } },
+ { field: 'created_at', title: '注册时间' },
+ { type: 'html', title: '操作', width: 200, slots: { default: 'action' } },
+ ],
+ keepSource: true,
+ pagerConfig: {},
+ proxyConfig: {
+ ajax: {
+ // 请求后端接口方法
+ query: async ({ page }, formValues) => {
+ return await getDoctorList({
+ page: page.currentPage,
+ pageSize: page.pageSize,
+ ...formValues,
+ });
+ },
+ },
+ },
+ height: 'auto',
+ border: false,
+ toolbarConfig: {
+ // 是否显示搜索表单控制按钮
+ // @ts-ignore 正式环境时有完整的类型声明
+ search: true,
+ refresh: true, // 刷新
+ print: false, // 打印
+ export: false, // 导出
+ // custom: true, // 自定义列
+ zoom: true, // 最大化最小化
+ slots: {
+ buttons: 'toolbar-buttons',
+ },
+ custom: {
+ // 自定义列-图标
+ icon: 'vxe-icon-menu',
+ },
+ },
+ showOverflow: false,
+};
diff --git a/apps/web-antd/src/views/doctor/doctor/index.vue b/apps/web-antd/src/views/doctor/doctor/index.vue
new file mode 100644
index 00000000..86da8d3f
--- /dev/null
+++ b/apps/web-antd/src/views/doctor/doctor/index.vue
@@ -0,0 +1,140 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item?.store?.name }}
+
+
+
+
+
+
+
+