Browse Source

代码优化

master
lizhi 3 years ago
parent
commit
e307877d2f
  1. 10
      src/api/platform/system/controller/doctor.ts
  2. 56
      src/api/platform/system/controller/hospital.ts
  3. 55
      src/api/platform/system/controller/institution.ts
  4. 58
      src/api/platform/system/controller/office.ts
  5. 8
      src/views/institution/address/AddressModal.vue
  6. 15
      src/views/institution/address/address.data.ts
  7. 44
      src/views/institution/doctor/doctor.data.ts
  8. 92
      src/views/institution/hospital/HospitalModal.vue
  9. 51
      src/views/institution/hospital/hospital.data.ts
  10. 142
      src/views/institution/hospital/index.vue
  11. 82
      src/views/institution/institution/InstitutionModal.vue
  12. 142
      src/views/institution/institution/index.vue
  13. 14
      src/views/institution/institution/institution.data.ts
  14. 83
      src/views/institution/office/OfficeModal.vue
  15. 145
      src/views/institution/office/index.vue
  16. 39
      src/views/institution/office/office.data.ts

10
src/api/platform/system/controller/doctor.ts

@ -17,17 +17,17 @@ enum Api { @@ -17,17 +17,17 @@ enum Api {
export const queryById = (params: { id: String }) =>
defHttp.get<DoctorItem>({url: Api.QueryById + `/${params.id}`});
/** 查询客户端列表 */
/** 查询医生列表 */
export const listDoctor = (params?: Partial<DoctorItem>) => defHttp.get<DoctorItemListResult>({ url: Api.list, params }, { isReturnResultResponse: true });
/** 新增客户端 */
/** 新增医生*/
export const addDoctor = (params: Partial<DoctorParams>) => defHttp.post({ url: Api.add, data: params });
/** 修改客户端 */
/** 修改医生 */
export const editDoctor = (params: Partial<DoctorParams>) => defHttp.put({ url: Api.edit, data: params });
/** 查询客户端详细 */
/** 查询医生详细 */
export const getDoctor = (id: string) => defHttp.get<DoctorItem>({ url: `${Api.get}/${id}` });
/** 删除客户端 */
/** 删除医生 */
export const delDoctor = (id: string) => defHttp.delete({ url: `${Api.del}/${id}` });

56
src/api/platform/system/controller/hospital.ts

@ -2,29 +2,45 @@ import {HospitalParams,HospitalItem,HospitalItemListResult} from '/@/api/platfor @@ -2,29 +2,45 @@ import {HospitalParams,HospitalItem,HospitalItemListResult} from '/@/api/platfor
import { defHttp } from '/@/utils/http/axios';
import {isDef} from '/@/utils/is';
const prefix = '/system_proxy/system';
enum Api {
QueryById = '/hospital/query',
List = '/hospital/list',
Add = '/hospital/add',
Update = '/hospital/update',
Remove = '/hospital/remove'
QueryById = '/system_proxy/system/hospital/query',
list = '/system_proxy/system/hospital/list',
add = '/system_proxy/system/hospital/add',
edit = '/system_proxy/system/hospital/update',
del = '/system_proxy/system/hospital/remove',
get = '/system_proxy/system/hospital'
}
export const queryById = (params: { id: String }) =>
defHttp.get<HospitalItem>({url: prefix + Api.QueryById, params});
// export const queryById = (params: { id: String }) =>
// defHttp.get<HospitalItem>({url: Api.QueryById, params});
//
// export const list = (params: HospitalParams) =>
// defHttp.get<HospitalItemListResult>({url: Api.list, params});
//
// export const set = (params: HospitalItem) => {
// if (isDef(params.id)){
// defHttp.put<HospitalItem>({url: Api.edit, params});
// }else {
// defHttp.post<HospitalItem>({url: Api.add, params});
// }
// };
// export const remove = (params: {ids: String}) =>
// defHttp.delete<boolean>({url: Api.Remove + `/${params.ids}`});
// export const remove = (id: string) => defHttp.delete({ url: `${Api.del}/${id}` });
export const queryById = (params: { id: String }) =>
defHttp.get<HospitalItem>({url: Api.QueryById, params});
/** 查询医院列表*/
export const list = (params: HospitalParams) =>
defHttp.get<HospitalItemListResult>({url: prefix + Api.List, params});
export const set = (params: HospitalItem) => {
if (isDef(params.id)){
defHttp.put<HospitalItem>({url: prefix + Api.Update, params});
}else {
defHttp.post<HospitalItem>({url: prefix + Api.Add, params});
}
};
export const remove = (params: {ids: String}) =>
defHttp.delete<boolean>({url: prefix + Api.Remove + `/${params.ids}`});
defHttp.get<HospitalItemListResult>({url: Api.list, params});
// export const list = (params?:Partial<HospitalItem>) =>defHttp.get<HospitalItemListResult>({url: Api.list, params},{isReturnResultResponse: true});
/** 新增医院*/
export const addHospital = (params: Partial<HospitalParams>)=> defHttp.post({url: Api.add ,data: params});
/** 修改医院*/
export const editHospital = (params: Partial<HospitalParams>) => defHttp.put({url: Api.edit, data: params});
/** 查询医院详细*/
export const getHospital = (id: string) => defHttp.get<HospitalItem>({url: `${Api.get}/${id}` });
/** 删除项目 */
export const delHospital = (id: string) => defHttp.delete({ url: `${Api.del}/${id}` });

55
src/api/platform/system/controller/institution.ts

@ -3,29 +3,50 @@ import {InstitutionParams,InstitutionItem,InstitutionItemListResult} from '/@/ap @@ -3,29 +3,50 @@ import {InstitutionParams,InstitutionItem,InstitutionItemListResult} from '/@/ap
import { defHttp } from '/@/utils/http/axios';
import {isDef} from '/@/utils/is';
const prefix = '/system_proxy/system';
enum Api {
QueryById = '/institution/query',
List = '/institution/list',
Add = '/institution/add',
Update = '/institution/update',
Remove = '/institution/remove'
QueryById = '/system_proxy/system/institution/query',
list = '/system_proxy/system/institution/list',
add = '/system_proxy/system/institution/add',
edit = '/system_proxy/system/institution/update',
del = '/system_proxy/system/institution/remove',
get = '/system_proxy/system/institution'
}
// export const queryById = (params: { id: String }) =>
// defHttp.get<InstitutionItem>({url: prefix + Api.QueryById, params});
//
// export const list = (params: InstitutionParams) =>
// defHttp.get<InstitutionItemListResult>({url: prefix + Api.List, params});
//
// export const set = (params: InstitutionItem) => {
// if (isDef(params.id)){
// defHttp.put<InstitutionItem>({url: prefix + Api.Update, params});
// }else {
// defHttp.post<InstitutionItem>({url: prefix + Api.Add, params});
// }
// };
//
// export const remove = (params: {ids: String}) =>
// defHttp.delete<boolean>({url: prefix + Api.Remove + `/${params.ids}`});
export const queryById = (params: { id: String }) =>
defHttp.get<InstitutionItem>({url: prefix + Api.QueryById, params});
defHttp.get<InstitutionItem>({url: Api.QueryById + `/${params.id}`});
/** 查询机构列表 */
// export const list = (params?: Partial<InstitutionItem>) => defHttp.get<InstitutionItemListResult>({ url: Api.list, params }, { isReturnResultResponse: true });
export const list = (params: InstitutionParams) =>
defHttp.get<InstitutionItemListResult>({url: prefix + Api.List, params});
defHttp.get<InstitutionItemListResult>({url: Api.list, params});
/** 新增机构*/
export const addInstitution = (params: Partial<InstitutionParams>) => defHttp.post({ url: Api.add, data: params });
export const set = (params: InstitutionItem) => {
if (isDef(params.id)){
defHttp.put<InstitutionItem>({url: prefix + Api.Update, params});
}else {
defHttp.post<InstitutionItem>({url: prefix + Api.Add, params});
}
};
/** 修改机构 */
export const editInstitution = (params: Partial<InstitutionParams>) => defHttp.put({ url: Api.edit, data: params });
/** 查询机构详细 */
export const getInstitution = (id: string) => defHttp.get<InstitutionItem>({ url: `${Api.get}/${id}` });
export const remove = (params: {ids: String}) =>
defHttp.delete<boolean>({url: prefix + Api.Remove + `/${params.ids}`});
/** 删除机构 */
export const delInstitution= (id: string) => defHttp.delete({ url: `${Api.del}/${id}` });

58
src/api/platform/system/controller/office.ts

@ -1,30 +1,50 @@ @@ -1,30 +1,50 @@
import {OfficeParams,OfficeItem,OfficeItemListResult} from '/@/api/platform/system/entity/officeModel';
import { defHttp } from '/@/utils/http/axios';
import {isDef} from '/@/utils/is';
import {HospitalItemListResult, HospitalParams} from "/@/api/platform/system/entity/hospitalModel";
const prefix = '/system_proxy/system';
enum Api {
QueryById = '/office/getById',
List = '/office/list',
Add = '/office/add',
Update = '/office/update',
Remove = '/office/remove'
QueryById = '/system_proxy/system/office/getById',
list = '/system_proxy/system/office/list',
add = '/system_proxy/system/office/add',
edit = '/system_proxy/system/office/update',
del = '/system_proxy/system/office/remove',
get = '/system_proxy/system/office'
}
//
// export const queryById = (params: { id: String }) =>
// defHttp.get<OfficeItem>({url:Api.QueryById, params});
//
// export const list = (params: OfficeParams) =>
// defHttp.get<OfficeItemListResult>({url: Api.List, params});
//
// export const set = (params: OfficeItem) => {
// if (isDef(params.id)){
// defHttp.put<OfficeItem>({url:Api.Update, params});
// }else {
// defHttp.post<OfficeItem>({url: Api.Add, params});
// }
// };
//
// export const remove = (params: {ids: String}) =>
// defHttp.delete<boolean>({url:Api.Remove + `/${params.ids}`});
export const queryById = (params: { id: String }) =>
defHttp.get<OfficeItem>({url: prefix + Api.QueryById, params});
defHttp.get<OfficeItem>({url: Api.QueryById + `/${params.id}`});
export const list = (params: OfficeParams) =>
defHttp.get<OfficeItemListResult>({url: prefix + Api.List, params});
/** 查询科室列表 */
// export const listOffice = (params?: Partial<OfficeItem>) => defHttp.get<OfficeItemListResult>({ url: Api.list, params }, { isReturnResultResponse: true });
export const listOffice = (params: OfficeItem) =>
defHttp.get<OfficeItemListResult>({url: Api.list, params});
/** 新增科室*/
export const addOffice = (params: Partial<OfficeParams>) => defHttp.post({ url: Api.add, data: params });
export const set = (params: OfficeItem) => {
if (isDef(params.id)){
defHttp.put<OfficeItem>({url: prefix + Api.Update, params});
}else {
defHttp.post<OfficeItem>({url: prefix + Api.Add, params});
}
};
/** 修改科室 */
export const editOffice = (params: Partial<OfficeParams>) => defHttp.put({ url: Api.edit, data: params });
/** 查询科室详细 */
export const getOffice = (id: string) => defHttp.get<OfficeItem>({ url: `${Api.get}/${id}` });
export const remove = (params: {ids: String}) =>
defHttp.delete<boolean>({url: prefix + Api.Remove + `/${params.ids}`});
/** 删除科室 */
export const delOffice = (id: string) => defHttp.delete({ url: `${Api.del}/${id}` });

8
src/views/institution/address/AddressModal.vue

@ -20,6 +20,7 @@ @@ -20,6 +20,7 @@
import { BasicModal, ModalProps, useModalInner } from '/@/components/Modal';
import { listAddr, addAddr, editAddr, getAddr} from '/@/api/platform/system/controller/address';
import { listToTree } from '/@/utils/helper/treeHelper';
import {isEmpty} from '/@/utils/is';
/** 通用变量统一声明区域 */
const tag = ref<Nullable<string>>('');
@ -45,6 +46,13 @@ @@ -45,6 +46,13 @@
treeData: [topAddr]
}
});
await updateSchema({
field: 'id',
componentProps: {
disabled: tag.value == 'edit'
},
});
const addrId = data.record?.id;
const props: Partial<ModalProps> = { confirmLoading: false };
// tag

15
src/views/institution/address/address.data.ts

@ -7,7 +7,7 @@ import {Tag} from 'ant-design-vue'; @@ -7,7 +7,7 @@ import {Tag} from 'ant-design-vue';
export const columns: BasicColumn[] = [
{
title: '区域ID',
title: '区域编码',
dataIndex: 'code',
width: 50,
},
@ -41,10 +41,10 @@ export const searchFormSchema: FormSchema[] = [ @@ -41,10 +41,10 @@ export const searchFormSchema: FormSchema[] = [
},
{
field:'code',
label:'区域ID',
label:'区域编码',
component:'Input',
componentProps:{
placeholder:'请输入区域ID',
placeholder:'请输入区域编码',
},
colProps:{span:5}
},
@ -100,12 +100,19 @@ export const addressFormSchema: FormSchema[] = [ @@ -100,12 +100,19 @@ export const addressFormSchema: FormSchema[] = [
}
},
{
field: 'code',
field: 'id',
label: '区域ID',
component: 'Input',
helpMessage: ['区域ID'],
required: true
},
{
field: 'code',
label: '区域代码',
component: 'Input',
required: true,
},
{
field:'sort',
label:'排序',

44
src/views/institution/doctor/doctor.data.ts

@ -3,9 +3,9 @@ import { FormSchema } from '/@/components/Table'; @@ -3,9 +3,9 @@ import { FormSchema } from '/@/components/Table';
import {h, watch, watchEffect, watchSyncEffect} from 'vue';
import {Tag} from 'ant-design-vue';
import { list as hospitalList } from '/@/api/platform/system/controller/hospital';
import {list as institutionList, list as institutalList} from '/@/api/platform/system/controller/institution';
import { list as officeList } from '/@/api/platform/system/controller/office';
import {deepMerge} from "/@/utils";
import {list as institutionList} from '/@/api/platform/system/controller/institution';
import { listOffice as officeList } from '/@/api/platform/system/controller/office';
import {deepMerge} from '/@/utils';
export const columns: BasicColumn[] = [
@ -118,17 +118,16 @@ export const searchFormSchema: FormSchema[] = [ @@ -118,17 +118,16 @@ export const searchFormSchema: FormSchema[] = [
colProps: { span: 5 },
},
{
field: 'beginTime',
label: '起始时间',
component: 'DatePicker',
colProps: { span: 5 },
},
{
field: 'endTime',
label: '截止时间',
component: 'DatePicker',
colProps: { span: 5 },
field: 'dateRange',
label: '创建时间',
component: 'RangePicker',
componentProps: {
style: { width:'100%' },
valueFormat: 'YYYY-MM-DD',
placeholder: ['开始日期','结束日期']
},
colProps: { span: 8 }
}
];
export const doctorFormSchema: FormSchema[] = [
@ -148,7 +147,7 @@ export const doctorFormSchema: FormSchema[] = [ @@ -148,7 +147,7 @@ export const doctorFormSchema: FormSchema[] = [
field: 'title',
label: '医生职称',
component: 'Input',
required: false,
required: true,
},
{
field: 'sex',
@ -167,7 +166,14 @@ export const doctorFormSchema: FormSchema[] = [ @@ -167,7 +166,14 @@ export const doctorFormSchema: FormSchema[] = [
field: 'phone',
label: '医生电话',
component: 'Input',
required: false,
rules: [
{
pattern: new RegExp('^1[3|4|5|6|7|8|9][0-9]\\d{8}$'),
message: '请输入正确的手机号',
validateTrigger: 'change',
required: true
}
],
},
{
field: 'email',
@ -220,7 +226,13 @@ export const doctorFormSchema: FormSchema[] = [ @@ -220,7 +226,13 @@ export const doctorFormSchema: FormSchema[] = [
// field: 'officeId',
// label: '所属科室',
// component: 'ApiSelect',
// required: true,
// componentProps: {
// mode: 'multiple',
// resultField: 'list',
// labelField: 'name',
// valueField: 'id',
// api: officeList,
// },
// },
{
field: 'status',

92
src/views/institution/hospital/HospitalModal.vue

@ -1,61 +1,75 @@ @@ -1,61 +1,75 @@
<template>
<BasicModal v-bind="$attrs"
:title="getTitle"
width="720px"
@register="registerModal"
@ok="handleSubmit"
>
<BasicForm @register="registerForm"/>
</BasicModal>
</template>
<script lang="ts" setup>
import {ref, computed, unref, toRaw} from 'vue';
import {BasicModal, useModalInner} from '/@/components/Modal';
import {hospitalFormSchema} from './hospital.data';
import {BasicForm, useForm} from '/@/components/Form';
import {set} from '/@/api/platform/system/controller/hospital';
import {HospitalItem} from '/@/api/platform/system/entity/hospitalModel';
const isUpdate = ref(true);
// emit
const emit = defineEmits(['success', 'register']);
/**
* 表单
* 提供模板规范代码参考,请尽量保证编写代码风格跟模板规范代码一致
* 采用vben-动态表格表单封装组件编写,采用 setup 写法
* Copyright © 2020-2022 <a href="http://www.entfrm.com/">entfrm</a> All rights reserved.
* author entfrm开发团队-王翔
*/
const [registerForm, {resetFields, setFieldsValue, validate}] = useForm({
labelWidth: 120,
import { ref, unref } from 'vue';
import { BasicForm, useForm } from '/@/components/Form/index';
import { hospitalFormSchema } from './hospital.data';
import {addHospital, delHospital,getHospital,editHospital} from '/@/api/platform/system/controller/hospital';
import { BasicModal, ModalProps, useModalInner } from '/@/components/Modal';
import { isEmpty } from '/@/utils/is';
/** 通用变量统一声明区域 */
const tag = ref<Nullable<string>>('');
/** https://v3.cn.vuejs.org/api/options-data.html#emits */
const emit = defineEmits(['success', 'register']);
const [registerForm, { resetFields, setFieldsValue, validate, clearValidate, updateSchema }] = useForm({
labelWidth: 100,
schemas: hospitalFormSchema,
showActionButtonGroup: false,
actionColOptions: {
span: 23,
},
});
/**
* 表单参数
*/
const [registerModal, {setModalProps, closeModal}] = useModalInner( (data) => {
resetFields();
setModalProps({confirmLoading: false});
isUpdate.value = !!data?.isUpdate;
if (unref(isUpdate)) {
if(typeof data.record.addressIds == 'string'){
let addressIdsStr: string = data.record.addressIds;
const addressIds:String[] = addressIdsStr.split(',');
data.record.addressIds = addressIds;
}
setFieldsValue({
...data.record,
baseColProps: { span: 24 }
});
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data: WindowInnerData = { _tag: '' }) => {
//
await resetFields();
await clearValidate();
//
tag.value = data._tag;
const id = data.record?.id;
const props: Partial<ModalProps> = { confirmLoading: false };
// tag
switch (unref(tag)) {
case 'add':
props.title = '新增医院';
break;
case 'edit':
props.title = '编辑医院';
await setFieldsValue(await getHospital(id));
break;
}
// :
setModalProps(props);
});
//
const getTitle = computed(() => (!unref(isUpdate) ? '新增医院' : '编辑医院'));
/** 处理弹出框提交 */
async function handleSubmit() {
try {
const values = await validate();
//
const formData = await validate();
//
setModalProps({ confirmLoading: true });
let val = toRaw<HospitalItem>(values);
values.addressIds = toRaw(val.addressIds);
await set(values);
// tag
switch (unref(tag)) {
case 'add':
await addHospital(formData);
break;
case 'edit':
await editHospital(formData);
break;
}
//
closeModal();
emit('success');
} finally {

51
src/views/institution/hospital/hospital.data.ts

@ -111,17 +111,41 @@ export const searchFormSchema: FormSchema[] = [ @@ -111,17 +111,41 @@ export const searchFormSchema: FormSchema[] = [
colProps: { span: 5 },
},
{
field: 'beginTime',
label: '起始时间',
component: 'DatePicker',
colProps: { span: 5 },
field: 'type',
label: '医院类型',
component: 'Select',
componentProps: {
options: [
{label: '合作医院',value: '1'},
{label: '其他医院',value: '0'},
]
},
colProps: {span: 7}
},
{
field: 'endTime',
label: '截止时间',
component: 'DatePicker',
colProps: { span: 5 },
field: 'dateRange',
label: '创建时间',
component: 'RangePicker',
componentProps: {
style: { width:'100%' },
valueFormat: 'YYYY-MM-DD',
placeholder: ['开始日期','结束日期']
},
colProps: { span: 8 }
}
// {
// field: 'beginTime',
// label: '起始时间',
// component: 'DatePicker',
// colProps: { span: 5 },
// },
// {
// field: 'endTime',
// label: '截止时间',
// component: 'DatePicker',
// colProps: { span: 5 },
// },
];
export const hospitalFormSchema: FormSchema[] = [
@ -160,7 +184,14 @@ export const hospitalFormSchema: FormSchema[] = [ @@ -160,7 +184,14 @@ export const hospitalFormSchema: FormSchema[] = [
field: 'contactsTel',
label: '联系人电话',
component: 'Input',
rules: [
{
pattern: new RegExp('^1[3|4|5|6|7|8|9][0-9]\\d{8}$'),
message: '请输入正确的手机号',
validateTrigger: 'change',
required: true
}
],
},
{
field: 'contactsTitle',
@ -219,8 +250,10 @@ export const hospitalFormSchema: FormSchema[] = [ @@ -219,8 +250,10 @@ export const hospitalFormSchema: FormSchema[] = [
labelField: 'name',
valueField: 'id',
api: institutionList,
}
},
required:true
},
{
label: '备注',
field: 'remarks',

142
src/views/institution/hospital/index.vue

@ -1,94 +1,136 @@ @@ -1,94 +1,136 @@
<template>
<div>
<BasicTable @register="registerTable">
<BasicTable @register="registerTable"
@selection-change="handleSelectionChange"
>
<template #toolbar>
<a-button type="primary" @click="handleCreate">新增医院</a-button>
<a-button
type="primary"
@click="handleAdd()"
>新增医院</a-button>
<a-button type="primary"
:disabled="state.single"
@click="handleEdit()"
>修改医院</a-button>
<a-button type="primary"
:disabled="state.multiple"
@click="handleDel()"
>删除医院</a-button>
</template>
<template #action="{ record }">
<TableAction
:actions="[
<TableAction :actions="[
{
icon: 'clarity:note-edit-line',
onClick: handleEdit.bind(null, record),
label: '编辑',
icon: 'fa6-regular:pen-to-square',
onClick: handleEdit.bind(null, record)
},
{
label: '删除',
icon: 'ant-design:delete-outlined',
color: 'error',
popConfirm: {
title: '是否确认删除',
confirm: handleDelete.bind(null, record),
},
},
]"
onClick: handleDel.bind(null, record)
}]"
/>
</template>
</BasicTable>
<HospitalModal @register="registerModal" @success="handleSuccess"/>
<!--弹出窗体区域-->
<HospitalModal @register="registerModal" @success="handleRefreshTable"/>
</div>
</template>
<script lang="ts" setup>
/**
* 提供模板规范代码参考,请尽量保证编写代码风格跟模板规范代码一致
* 采用vben-动态表格表单封装组件编写,采用 setup 写法
* Copyright © 2020-2022 <a href="http://www.entfrm.com/">entfrm</a> All rights reserved.
* author entfrm开发团队-王翔
*/
import { reactive, toRaw } from 'vue';
import { BasicTable, useTable, TableAction } from '/@/components/Table';
import {list, delHospital} from '/@/api/platform/system/controller/hospital';
import { useModal } from '/@/components/Modal';
import HospitalModal from './HospitalModal.vue';
import { columns, searchFormSchema } from './hospital.data';
import { useMessage } from '/@/hooks/web/useMessage';
import {list, remove} from '/@/api/platform/system/controller/hospital';
const {createMessage} = useMessage();
import HospitalModal from './HospitalModal.vue';
/** 类型规范统一声明定义区域 */
interface TableState {
single: boolean;
multiple: boolean;
}
/** 通用变量统一声明区域 */
const state = reactive<TableState>({
//
single: true,
//
multiple: true
});
const { createConfirm, createMessage } = useMessage();
const [registerModal, { openModal }] = useModal();
const [registerTable, {reload}] = useTable({
title: '医院列表',
const [registerTable, { reload, clearSelectedRowKeys, getSelectRowKeys }] = useTable({
title: '医院',
api: list,
rowKey: 'id',
columns,
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
autoSubmitOnEnter: true,
fieldMapToTime: [['dateRange', ['beginTime', 'endTime'], 'YYYY-MM-DD']]
},
pagination: true,
striped: true,
rowSelection: { type: 'checkbox' },
useSearchForm: true,
showTableSetting: true,
bordered: true,
showIndexColumn: true,
canResize: false,
clickToRowSelect: false,
showIndexColumn: false,
actionColumn: {
width: 80,
width: 220,
title: '操作',
dataIndex: 'action',
slots: { customRender: 'action' },
fixed: undefined,
fixed: false
},
handleSearchInfoFn: () => clearSelectedRowKeys()
});
/**
* 创建菜单
*/
function handleCreate() {
openModal(true, {
isUpdate: false,
});
/** 处理多选框选中数据 */
function handleSelectionChange(selection?: Recordable) {
const rowSelection = toRaw(selection?.keys) || [];
state.single = rowSelection.length != 1;
state.multiple = !rowSelection.length;
}
/**
* 编辑菜单
*/
function handleEdit(record: Recordable) {
openModal(true, {
record,
isUpdate: true,
});
/** 新增按钮操作,行内新增与工具栏局域新增通用 */
function handleAdd() {
openModal(true,{ _tag: 'add' });
}
/**
* 删除菜单
*/
async function handleDelete(record: Recordable) {
await remove({ids: record.id});
/** 编辑按钮操作,行内编辑 */
function handleEdit(record?: Recordable) {
record = record || { id: getSelectRowKeys() };
openModal(true, { _tag: 'edit', record });
}
/** 删除按钮操作,行内删除 */
async function handleDel(record?: Recordable) {
const id = record?.id || getSelectRowKeys();
createConfirm({
iconType: 'warning',
title: '警告',
content: `是否确认删除医院编号为${id}医院吗?`,
onOk: async () => {
await delHospital(id);
createMessage.success('删除成功!');
handleSuccess();
handleRefreshTable();
}
/**
* 成功后重载表格
*/
function handleSuccess() {
});
}
/** 处理表格刷新 */
function handleRefreshTable() {
clearSelectedRowKeys();
reload();
}
</script>

82
src/views/institution/institution/InstitutionModal.vue

@ -1,53 +1,75 @@ @@ -1,53 +1,75 @@
<template>
<BasicModal v-bind="$attrs"
:title="getTitle"
width="720px"
@register="registerModal"
@ok="handleSubmit"
>
<BasicForm @register="registerForm"/>
</BasicModal>
</template>
<script lang="ts" setup>
import {ref, computed, unref} from 'vue';
import {BasicModal, useModalInner} from '/@/components/Modal';
import {institutionFormSchema} from './institution.data';
import {BasicForm, useForm} from '/@/components/Form';
import {set} from '/@/api/platform/system/controller/institution';
const isUpdate = ref(true);
// emit
const emit = defineEmits(['success', 'register']);
/**
* 表单
* 提供模板规范代码参考,请尽量保证编写代码风格跟模板规范代码一致
* 采用vben-动态表格表单封装组件编写,采用 setup 写法
* Copyright © 2020-2022 <a href="http://www.entfrm.com/">entfrm</a> All rights reserved.
* author entfrm开发团队-王翔
*/
const [registerForm, {resetFields, setFieldsValue, validate}] = useForm({
import { ref, unref } from 'vue';
import { BasicForm, useForm } from '/@/components/Form/index';
import { institutionFormSchema } from './institution.data';
import {addInstitution, delInstitution,getInstitution,editInstitution} from '/@/api/platform/system/controller/institution';
import { BasicModal, ModalProps, useModalInner } from '/@/components/Modal';
import { isEmpty } from '/@/utils/is';
/** 通用变量统一声明区域 */
const tag = ref<Nullable<string>>('');
/** https://v3.cn.vuejs.org/api/options-data.html#emits */
const emit = defineEmits(['success', 'register']);
const [registerForm, { resetFields, setFieldsValue, validate, clearValidate, updateSchema }] = useForm({
labelWidth: 100,
schemas: institutionFormSchema,
showActionButtonGroup: false,
actionColOptions: {
span: 23,
},
});
/**
* 表单参数
*/
const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {
resetFields();
setModalProps({confirmLoading: false});
isUpdate.value = !!data?.isUpdate;
if (unref(isUpdate)) {
setFieldsValue({
...data.record,
baseColProps: { span: 24 }
});
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data: WindowInnerData = { _tag: '' }) => {
//
await resetFields();
await clearValidate();
//
tag.value = data._tag;
const id = data.record?.id;
const props: Partial<ModalProps> = { confirmLoading: false };
// tag
switch (unref(tag)) {
case 'add':
props.title = '新增机构';
break;
case 'edit':
props.title = '编辑机构';
await setFieldsValue(await getInstitution(id));
break;
}
// :
setModalProps(props);
});
//
const getTitle = computed(() => (!unref(isUpdate) ? '新增机构' : '编辑机构'));
/** 处理弹出框提交 */
async function handleSubmit() {
try {
const values = await validate();
//
const formData = await validate();
//
setModalProps({ confirmLoading: true });
await set(values);
// tag
switch (unref(tag)) {
case 'add':
await addInstitution(formData);
break;
case 'edit':
await editInstitution(formData);
break;
}
//
closeModal();
emit('success');
} finally {

142
src/views/institution/institution/index.vue

@ -1,94 +1,136 @@ @@ -1,94 +1,136 @@
<template>
<div>
<BasicTable @register="registerTable">
<BasicTable @register="registerTable"
@selection-change="handleSelectionChange"
>
<template #toolbar>
<a-button type="primary" @click="handleCreate">新增医检机构</a-button>
<a-button
type="primary"
@click="handleAdd()"
>新增机构</a-button>
<a-button type="primary"
:disabled="state.single"
@click="handleEdit()"
>修改机构</a-button>
<a-button type="primary"
:disabled="state.multiple"
@click="handleDel()"
>删除机构</a-button>
</template>
<template #action="{ record }">
<TableAction
:actions="[
<TableAction :actions="[
{
icon: 'clarity:note-edit-line',
onClick: handleEdit.bind(null, record),
label: '编辑',
icon: 'fa6-regular:pen-to-square',
onClick: handleEdit.bind(null, record)
},
{
label: '删除',
icon: 'ant-design:delete-outlined',
color: 'error',
popConfirm: {
title: '是否确认删除',
confirm: handleDelete.bind(null, record),
},
},
]"
onClick: handleDel.bind(null, record)
}]"
/>
</template>
</BasicTable>
<BoxCardModal @register="registerModal" @success="handleSuccess"/>
<!--弹出窗体区域-->
<InstitutionModal @register="registerModal" @success="handleRefreshTable"/>
</div>
</template>
<script lang="ts" setup>
/**
* 提供模板规范代码参考,请尽量保证编写代码风格跟模板规范代码一致
* 采用vben-动态表格表单封装组件编写,采用 setup 写法
* Copyright © 2020-2022 <a href="http://www.entfrm.com/">entfrm</a> All rights reserved.
* author entfrm开发团队-王翔
*/
import { reactive, toRaw } from 'vue';
import { BasicTable, useTable, TableAction } from '/@/components/Table';
import {list, delInstitution} from '/@/api/platform/system/controller/institution';
import { useModal } from '/@/components/Modal';
import BoxCardModal from './InstitutionModal.vue';
import { columns, searchFormSchema } from './institution.data';
import { useMessage } from '/@/hooks/web/useMessage';
import {list, remove} from '/@/api/platform/system/controller/institution';
const {createMessage} = useMessage();
import InstitutionModal from './InstitutionModal.vue';
/** 类型规范统一声明定义区域 */
interface TableState {
single: boolean;
multiple: boolean;
}
/** 通用变量统一声明区域 */
const state = reactive<TableState>({
//
single: true,
//
multiple: true
});
const { createConfirm, createMessage } = useMessage();
const [registerModal, { openModal }] = useModal();
const [registerTable, {reload}] = useTable({
title: '医检列表',
const [registerTable, { reload, clearSelectedRowKeys, getSelectRowKeys }] = useTable({
title: '医列表',
api: list,
rowKey: 'id',
columns,
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
autoSubmitOnEnter: true,
fieldMapToTime: [['dateRange', ['beginTime', 'endTime'], 'YYYY-MM-DD']]
},
pagination: true,
striped: true,
rowSelection: { type: 'checkbox' },
useSearchForm: true,
showTableSetting: true,
bordered: true,
showIndexColumn: true,
canResize: false,
clickToRowSelect: false,
showIndexColumn: false,
actionColumn: {
width: 80,
width: 220,
title: '操作',
dataIndex: 'action',
slots: { customRender: 'action' },
fixed: undefined,
fixed: false
},
handleSearchInfoFn: () => clearSelectedRowKeys()
});
/**
* 创建菜单
*/
function handleCreate() {
openModal(true, {
isUpdate: false,
});
/** 处理多选框选中数据 */
function handleSelectionChange(selection?: Recordable) {
const rowSelection = toRaw(selection?.keys) || [];
state.single = rowSelection.length != 1;
state.multiple = !rowSelection.length;
}
/**
* 编辑菜单
*/
function handleEdit(record: Recordable) {
openModal(true, {
record,
isUpdate: true,
});
/** 新增按钮操作,行内新增与工具栏局域新增通用 */
function handleAdd() {
openModal(true,{ _tag: 'add' });
}
/**
* 删除菜单
*/
async function handleDelete(record: Recordable) {
await remove({ids: record.id});
/** 编辑按钮操作,行内编辑 */
function handleEdit(record?: Recordable) {
record = record || { id: getSelectRowKeys() };
openModal(true, { _tag: 'edit', record });
}
/** 删除按钮操作,行内删除 */
async function handleDel(record?: Recordable) {
const id = record?.id || getSelectRowKeys();
createConfirm({
iconType: 'warning',
title: '警告',
content: `是否确认删除机构编号为${id}机构吗?`,
onOk: async () => {
await delInstitution(id);
createMessage.success('删除成功!');
handleSuccess();
handleRefreshTable();
}
/**
* 成功后重载表格
*/
function handleSuccess() {
});
}
/** 处理表格刷新 */
function handleRefreshTable() {
clearSelectedRowKeys();
reload();
}
</script>

14
src/views/institution/institution/institution.data.ts

@ -100,6 +100,20 @@ export const searchFormSchema: FormSchema[] = [ @@ -100,6 +100,20 @@ export const searchFormSchema: FormSchema[] = [
},
colProps: { span: 5 },
},
{
field: 'type',
label: '机构类型',
component: 'Select',
componentProps: {
options: [
{label: '医检机构',value: '1'},
{label: '三甲机构',value: '2'},
{label: '其他机构',value: '0'},
]
},
colProps: {span: 5}
},
{
field: 'dateRange',
label: '创建时间',

83
src/views/institution/office/OfficeModal.vue

@ -1,54 +1,75 @@ @@ -1,54 +1,75 @@
<template>
<BasicModal v-bind="$attrs"
:title="getTitle"
width="720px"
@register="registerModal"
@ok="handleSubmit"
>
<BasicForm @register="registerForm"/>
</BasicModal>
</template>
<script lang="ts" setup>
import {ref, computed, unref} from 'vue';
import {BasicModal, useModalInner} from '/@/components/Modal';
import {officeFormSchema} from './office.data';
import {BasicForm, useForm} from '/@/components/Form';
import {set} from '/@/api/platform/system/controller/office';
const isUpdate = ref(true);
// emit
const emit = defineEmits(['success', 'register']);
/**
* 表单
* 提供模板规范代码参考,请尽量保证编写代码风格跟模板规范代码一致
* 采用vben-动态表格表单封装组件编写,采用 setup 写法
* Copyright © 2020-2022 <a href="http://www.entfrm.com/">entfrm</a> All rights reserved.
* author entfrm开发团队-王翔
*/
const [registerForm, {resetFields, setFieldsValue, validate}] = useForm({
import { ref, unref } from 'vue';
import { BasicForm, useForm } from '/@/components/Form/index';
import { officeFormSchema } from './office.data';
import {addOffice, delOffice,getOffice,editOffice} from '/@/api/platform/system/controller/office';
import { BasicModal, ModalProps, useModalInner } from '/@/components/Modal';
import { isEmpty } from '/@/utils/is';
/** 通用变量统一声明区域 */
const tag = ref<Nullable<string>>('');
/** https://v3.cn.vuejs.org/api/options-data.html#emits */
const emit = defineEmits(['success', 'register']);
const [registerForm, { resetFields, setFieldsValue, validate, clearValidate, updateSchema }] = useForm({
labelWidth: 100,
schemas: officeFormSchema,
showActionButtonGroup: false,
actionColOptions: {
span: 23,
},
});
/**
* 表单参数
*/
const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {
resetFields();
setModalProps({confirmLoading: false});
isUpdate.value = !!data?.isUpdate;
if (unref(isUpdate)) {
setFieldsValue({
...data.record,
baseColProps: { span: 24 }
});
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data: WindowInnerData = { _tag: '' }) => {
//
await resetFields();
await clearValidate();
//
tag.value = data._tag;
const id = data.record?.id;
const props: Partial<ModalProps> = { confirmLoading: false };
// tag
switch (unref(tag)) {
case 'add':
props.title = '新增科室';
break;
case 'edit':
props.title = '编辑科室';
await setFieldsValue(await getOffice(id));
break;
}
// :
setModalProps(props);
});
//
const getTitle = computed(() => (!unref(isUpdate) ? '新增科室' : '编辑科室'));
/** 处理弹出框提交 */
async function handleSubmit() {
try {
const values = await validate();
//
const formData = await validate();
//
setModalProps({ confirmLoading: true });
await set(values);
// tag
switch (unref(tag)) {
case 'add':
await addOffice(formData);
break;
case 'edit':
await editOffice(formData);
break;
}
//
closeModal();
emit('success');
} finally {

145
src/views/institution/office/index.vue

@ -1,95 +1,136 @@ @@ -1,95 +1,136 @@
<template>
<div>
<BasicTable @register="registerTable">
<BasicTable @register="registerTable"
@selection-change="handleSelectionChange"
>
<template #toolbar>
<a-button type="primary" @click="handleCreate">新增科室</a-button>
<a-button
type="primary"
@click="handleAdd()"
>新增科室</a-button>
<a-button type="primary"
:disabled="state.single"
@click="handleEdit()"
>修改科室</a-button>
<a-button type="primary"
:disabled="state.multiple"
@click="handleDel()"
>删除科室</a-button>
</template>
<template #action="{ record }">
<TableAction
:actions="[
<TableAction :actions="[
{
icon: 'clarity:note-edit-line',
onClick: handleEdit.bind(null, record),
label: '编辑',
icon: 'fa6-regular:pen-to-square',
onClick: handleEdit.bind(null, record)
},
{
label: '删除',
icon: 'ant-design:delete-outlined',
color: 'error',
popConfirm: {
title: '是否确认删除',
confirm: handleDelete.bind(null, record),
},
},
]"
onClick: handleDel.bind(null, record)
}]"
/>
</template>
</BasicTable>
<OfficeModal @register="registerModal" @success="handleSuccess"/>
<!--弹出窗体区域-->
<OfficeModal @register="registerModal" @success="handleRefreshTable"/>
</div>
</template>
<script lang="ts" setup>
/**
* 提供模板规范代码参考,请尽量保证编写代码风格跟模板规范代码一致
* 采用vben-动态表格表单封装组件编写,采用 setup 写法
* Copyright © 2020-2022 <a href="http://www.entfrm.com/">entfrm</a> All rights reserved.
* author entfrm开发团队-王翔
*/
import { reactive, toRaw } from 'vue';
import { BasicTable, useTable, TableAction } from '/@/components/Table';
import {listOffice, delOffice} from '/@/api/platform/system/controller/office';
import { useModal } from '/@/components/Modal';
import OfficeModal from './OfficeModal.vue';
import { columns, searchFormSchema } from './office.data';
import { useMessage } from '/@/hooks/web/useMessage';
import {list, remove} from '/@/api/platform/system/controller/office';
const {createMessage} = useMessage();
import OfficeModal from './OfficeModal.vue';
/** 类型规范统一声明定义区域 */
interface TableState {
single: boolean;
multiple: boolean;
}
/** 通用变量统一声明区域 */
const state = reactive<TableState>({
//
single: true,
//
multiple: true
});
const { createConfirm, createMessage } = useMessage();
const [registerModal, { openModal }] = useModal();
const [registerTable, {reload}] = useTable({
title: '科室列表',
api: list,
const [registerTable, { reload, clearSelectedRowKeys, getSelectRowKeys }] = useTable({
title: '医生列表',
api: listOffice,
rowKey: 'id',
columns,
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
autoSubmitOnEnter: true,
fieldMapToTime: [['dateRange', ['beginTime', 'endTime'], 'YYYY-MM-DD']]
},
pagination: true,
striped: true,
rowSelection: { type: 'checkbox' },
useSearchForm: true,
showTableSetting: true,
bordered: true,
showIndexColumn: true,
canResize: false,
clickToRowSelect: false,
showIndexColumn: false,
actionColumn: {
width: 80,
width: 220,
title: '操作',
dataIndex: 'action',
slots: { customRender: 'action' },
fixed: undefined,
fixed: false
},
handleSearchInfoFn: () => clearSelectedRowKeys()
});
/**
* 创建菜单
*/
function handleCreate() {
debugger;
openModal(true, {
isUpdate: false,
});
/** 处理多选框选中数据 */
function handleSelectionChange(selection?: Recordable) {
const rowSelection = toRaw(selection?.keys) || [];
state.single = rowSelection.length != 1;
state.multiple = !rowSelection.length;
}
/**
* 编辑菜单
*/
function handleEdit(record: Recordable) {
openModal(true, {
record,
isUpdate: true,
});
/** 新增按钮操作,行内新增与工具栏局域新增通用 */
function handleAdd() {
openModal(true,{ _tag: 'add' });
}
/**
* 删除菜单
*/
async function handleDelete(record: Recordable) {
await remove({ids: record.id});
/** 编辑按钮操作,行内编辑 */
function handleEdit(record?: Recordable) {
record = record || { id: getSelectRowKeys() };
openModal(true, { _tag: 'edit', record });
}
/** 删除按钮操作,行内删除 */
async function handleDel(record?: Recordable) {
const id = record?.id || getSelectRowKeys();
createConfirm({
iconType: 'warning',
title: '警告',
content: `是否确认删除科室编号为${id}科室吗?`,
onOk: async () => {
await delOffice(id);
createMessage.success('删除成功!');
handleSuccess();
handleRefreshTable();
}
/**
* 成功后重载表格
*/
function handleSuccess() {
});
}
/** 处理表格刷新 */
function handleRefreshTable() {
clearSelectedRowKeys();
reload();
}
</script>

39
src/views/institution/office/office.data.ts

@ -4,7 +4,7 @@ import {h, watch} from 'vue'; @@ -4,7 +4,7 @@ import {h, watch} from 'vue';
import {Tag} from 'ant-design-vue';
import { list as hospitalList } from '/@/api/platform/system/controller/hospital';
import { list as institutionList } from '/@/api/platform/system/controller/institution';
import {deepMerge} from "/@/utils";
import {deepMerge} from '/@/utils';
export const columns: BasicColumn[] = [
@ -98,17 +98,16 @@ export const searchFormSchema: FormSchema[] = [ @@ -98,17 +98,16 @@ export const searchFormSchema: FormSchema[] = [
colProps: { span: 5 },
},
{
field: 'beginTime',
label: '起始时间',
component: 'DatePicker',
colProps: { span: 5 },
},
{
field: 'endTime',
label: '截止时间',
component: 'DatePicker',
colProps: { span: 5 },
field: 'dateRange',
label: '创建时间',
component: 'RangePicker',
componentProps: {
style: { width:'100%' },
valueFormat: 'YYYY-MM-DD',
placeholder: ['开始日期','结束日期']
},
colProps: { span: 8 }
}
];
export const officeFormSchema: FormSchema[] = [
@ -160,17 +159,25 @@ export const officeFormSchema: FormSchema[] = [ @@ -160,17 +159,25 @@ export const officeFormSchema: FormSchema[] = [
},
},
{
field: 'directorName',
label: '主任名称',
field: 'directorTel',
label: '主任电话',
component: 'Input',
required: false
rules: [
{
pattern: new RegExp('^1[3|4|5|6|7|8|9][0-9]\\d{8}$'),
message: '请输入正确的手机号',
validateTrigger: 'change',
required: true
}
],
},
{
field: 'directorTel',
label: '主任电话',
field: 'directorName',
label: '主任名称',
component: 'Input',
required: false
},
{
field: 'detailAddress',
label: '科室地址',

Loading…
Cancel
Save