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 @@ + + +