提交 d538c1b8 authored 作者: leon's avatar leon

手术类型管理 。角色管理编辑fix

上级 b1a859ef
......@@ -5,7 +5,11 @@
*/
import { defHttp } from '/@/utils/http/axios';
import { SurgicalType, SurgicalTypeParams, SurgicalTypePageResult } from '../model/surgicalType';
import {
SurgicalType,
SurgicalTypeParams,
SurgicalTypePageResult,
} from '../model/surgicalType';
const baseApi = '/v1/system/surgical-type';
/**
......@@ -26,14 +30,12 @@ export const remove = (id: any) => defHttp.delete<Number>({ url: `${baseApi}/${i
/**
* 分页查询
*/
export const search = (params?: SurgicalTypeParams) =>
defHttp.get<SurgicalTypePageResult>({ url: `${baseApi}/search`, params });
export const search = (params?: SurgicalTypeParams) => defHttp.get<SurgicalTypePageResult>({ url: `${baseApi}/search`, params });
/**
* 列表查询
*/
export const all = (params?: SurgicalTypeParams) =>
defHttp.get<SurgicalTypePageResult>({ url: `${baseApi}/all`, params });
export const all = (params?: SurgicalTypeParams) => defHttp.get<SurgicalTypePageResult>({ url: `${baseApi}/all`, params });
/**
* 通过主键查询
......@@ -48,22 +50,21 @@ export const getOne = (params?: SurgicalTypeParams) => defHttp.get<SurgicalType>
/**
* 批量删除
*/
export const batchRemove = (idList: Array<any>) =>
defHttp.post<boolean>({ url: `${baseApi}/batch-delete`, data: idList });
export const batchRemove = (idList: Array<any>) => defHttp.post<boolean>({ url: `${baseApi}/batch-delete`, data: idList });
/**
* 批量新增
*/
export const batchAdd = (entityList: Array<SurgicalType>) =>
defHttp.post<boolean>({ url: `${baseApi}/batch-save`, data: entityList });
export const batchAdd = (entityList: Array<SurgicalType>) => defHttp.post<boolean>({ url: `${baseApi}/batch-save`, data: entityList });
/**
* 批量更新
*/
export const batchUpdate = (entityList: Array<SurgicalType>) =>
defHttp.post<boolean>({ url: `${baseApi}/batch-update`, data: entityList });
export const batchUpdate = (entityList: Array<SurgicalType>) => defHttp.post<boolean>({ url: `${baseApi}/batch-update`, data: entityList });
/**
* 查询数量
*/
export const count = (params?: SurgicalTypeParams) => defHttp.get<Number>({ url: `${baseApi}/count`, params });
......@@ -20,7 +20,7 @@
import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
import * as ReceiverApi from '/@/api/system/receiverApi';
import { useAsyncState } from '@vueuse/core';
import { Doctor } from '/@/api/model/doctor';
import { Receiver } from '/@/api/model/receiver';
const emit = defineEmits(['success', 'register']);
const isUpdate = ref(true);
......@@ -40,7 +40,7 @@
execute,
} = useAsyncState(
() => {
return ReceiverApi.getById(entityId.value).then((res: Doctor) => res);
return ReceiverApi.getById(entityId.value).then((res: Receiver) => res);
},
null,
{
......
......@@ -18,7 +18,7 @@
<a href="#" class="text-red-500">删除</a>
</a-popconfirm>
<a-popconfirm
v-if="hasPermission('AUTH_SYSTEM_RECEIVER:PASSED')"
v-auth="'AUTH_SYSTEM_RECEIVER:PASSED'"
class="ml-4"
title="确定要全部通过审核吗?"
ok-text="是"
......@@ -165,7 +165,6 @@
width: 210,
title: '操作',
dataIndex: 'action',
fixed: 'right',
},
});
......
<template>
<BasicDrawer v-bind="$attrs" @register="registerDrawer" showFooter :title="getTitle" width="500px" @ok="handleSubmit">
<a-spin :spinning="loading">
<BasicForm @register="registerForm">
<template #menu="{ model, field }">
<BasicTree
......@@ -14,6 +15,7 @@
/>
</template>
</BasicForm>
</a-spin>
</BasicDrawer>
</template>
<script lang="ts">
......@@ -38,6 +40,8 @@
const checkName = ref('');
const loading = ref(true);
const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
labelWidth: 90,
schemas: [
......@@ -63,6 +67,7 @@
let result: any = undefined;
result = (await RoleApi.getById(entityId.value)) as any;
loading.value = false;
checkName.value = result.name;
......@@ -128,6 +133,7 @@
};
return {
loading,
registerDrawer,
registerForm,
getTitle,
......
<template>
<Card :bordered="false">
<Card :bordered="false" :loading="isLoading">
<Descriptions bordered :column="3">
<Descriptions.Item
v-for="p in displayProps"
......@@ -18,37 +18,46 @@
</Card>
</template>
<script lang="ts" setup name="DeviceDetail">
import { onMounted, computed, ref, reactive } from 'vue';
import { onMounted, computed, ref } from 'vue';
import { useRoute } from 'vue-router';
import { useAsyncState } from '@vueuse/core';
import { ComputedRef } from '@vue/reactivity';
import { Descriptions, Card } from 'ant-design-vue';
import { descriptionColumns } from './schema';
import * as SurgicalTypeApi from '/@/api/system/surgicalTypeApi';
import { Device } from '/@/api/model/device';
import { SurgicalType } from '/@/api/model/surgicalType';
const route = useRoute();
const id = ref(route.params?.id);
let data = reactive({
detail: {},
isOver: false,
});
const getDetail = () => {
SurgicalTypeApi.getById(id.value).then((res: Device) => {
data.isOver = true;
data.detail = res;
});
};
// id 查询
const {
state: detail,
isReady: isDetailReady,
isLoading,
execute,
} = useAsyncState(
() => {
return SurgicalTypeApi.getById(id.value).then((res: SurgicalType) => res);
},
null,
{
immediate: false,
},
);
onMounted(() => {
getDetail();
execute();
});
const displayProps: ComputedRef<Array<any>> = computed(() => {
if (!data.isOver) return {};
if (!isDetailReady.value) return {};
const display: any = descriptionColumns.map(({ title, dataIndex = '', customRender }) => ({
key: dataIndex,
title,
value: customRender ? customRender(data.detail[dataIndex], data.detail) : data.detail[dataIndex],
value: customRender
? customRender({ text: detail.value[dataIndex], record: detail.value })
: detail.value[dataIndex],
}));
return display;
});
......
<template>
<BasicDrawer v-bind="$attrs" @register="registerDrawer" showFooter :title="getTitle" width="600px" @ok="handleSubmit">
<BasicDrawer
v-bind="$attrs"
@register="registerDrawer"
showFooter
:confirmDisabled="getConfirmDisabled"
:title="getTitle"
width="600px"
@ok="handleSubmit"
>
<a-spin :spinning="isLoading">
<BasicForm @register="registerForm" />
</a-spin>
</BasicDrawer>
</template>
<script lang="ts" setup name="SurgicalTypeDrawer">
......@@ -8,8 +18,9 @@
import { BasicForm, useForm } from '/@/components/Form/index';
import { formSchema } from './schema';
import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
import { useAsyncState } from '@vueuse/core';
import * as SurgicalTypeApi from '/@/api/system/surgicalTypeApi';
import { SurgicalType } from '/@/api/model/surgicalType';
const emit = defineEmits(['success', 'register']);
const isUpdate = ref(true);
const entityId = ref(0);
......@@ -20,6 +31,22 @@
showActionButtonGroup: false,
});
// id 查询
const {
state: detail,
isReady: isDetailReady,
isLoading,
execute,
} = useAsyncState(
() => {
return SurgicalTypeApi.getById(entityId.value).then((res: SurgicalType) => res);
},
null,
{
immediate: false,
},
);
const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
await resetFields();
setDrawerProps({ confirmLoading: false });
......@@ -27,9 +54,21 @@
entityId.value = data?.record?.id;
if (unref(isUpdate)) {
await setFieldsValue({
...data.record,
await execute();
if (detail.value) {
const formData: any = {
...detail.value,
};
await setFieldsValue(formData);
}
}
});
const getConfirmDisabled = computed(() => {
if (unref(isUpdate)) {
return !unref(isDetailReady);
} else {
return false;
}
});
......@@ -39,15 +78,14 @@
try {
const values = await validate();
setDrawerProps({ confirmLoading: true });
const {
...rest
} = values;
const { ...rest } = values;
const action = !unref(isUpdate) ? SurgicalTypeApi.add : SurgicalTypeApi.update;
const data = !unref(isUpdate)
? {
...rest,
}
: Object.assign({},
: Object.assign(
{},
{
...rest,
id: unref(entityId),
......
......@@ -8,6 +8,7 @@
<span>已选中{{ checkedKeys.length }}条记录</span>
<a-button type="link" @click="checkedKeys = []" size="small">清空</a-button>
<a-popconfirm
v-auth="'AUTH_SYSTEM_SURGICAL_TYPE'"
class="ml-4"
title="确定要全部删除吗?"
ok-text="是"
......@@ -27,9 +28,6 @@
<a-button v-auth="'AUTH_SYSTEM_SURGICAL_TYPE:ADD'" type="primary" @click="handleCreate"> 新增</a-button>
</template>
<template #bodyCell="{ column, record, text }">
<template v-if="column.dataIndex === 'id'">
<a @click="handleView(record)"> {{ record.id }} </a>
</template>
<template v-if="[].includes(column.dataIndex)">
<img :src="text" class="photo" alt="图片" v-if="!!text" />
</template>
......@@ -42,6 +40,12 @@
onClick: handleEdit.bind(null, record),
ifShow: hasPermission('AUTH_SYSTEM_SURGICAL_TYPE:EDIT'),
},
{
tooltip: '详情',
icon: 'ant-design:eye-outlined',
onClick: handleView.bind(null, record),
ifShow: hasPermission('AUTH_SYSTEM_SURGICAL_TYPE:QUERY'),
},
{
tooltip: '删除',
icon: 'ant-design:delete-outlined',
......@@ -60,7 +64,7 @@
<SurgicalTypeDrawer @register="registerDrawer" @success="handleSuccess" />
</div>
</template>
<script lang="ts" setup name="DeviceIndex">
<script lang="ts" setup name="AUTH_SYSTEM_SURGICAL_TYPE">
import { ref } from 'vue';
import { useGo } from '/@/hooks/web/usePage';
import { usePermission } from '/@/hooks/web/usePermission';
......@@ -75,20 +79,15 @@
const { hasPermission } = usePermission();
const go = useGo();
const {
formConfig,
showTableSetting,
bordered,
showIndexColumn,
} = componentSetting.table;
const { formConfig, showTableSetting, bordered, showIndexColumn } = componentSetting.table;
const checkedKeys = ref<Array<string | number>>([]);
const onSelectChange = (selectedRowKeys: (string | number)[]) => {
checkedKeys.value = selectedRowKeys;
}
};
const [registerDrawer, { openDrawer }] = useDrawer();
const [registerTable, { reload }] = useTable({
const [registerTable, { reload, setLoading }] = useTable({
title: '手术类型',
api: (params) => SurgicalTypeApi.search(handleParams(params)),
columns,
......@@ -99,6 +98,7 @@
},
rowSelection: {
type: 'checkbox',
// @ts-ignore
selectedRowKeys: checkedKeys,
onChange: onSelectChange,
},
......@@ -109,10 +109,9 @@
canResize: false,
rowKey: (record: any) => record.id,
actionColumn: {
width: 80,
width: 120,
title: '操作',
dataIndex: 'action',
slots: { customRender: 'action' },
fixed: 'right',
},
});
......@@ -154,14 +153,24 @@
};
const handleDelete = (record: Recordable) => {
SurgicalTypeApi.remove(record.id).then((_) => {
setLoading(true);
SurgicalTypeApi.remove(record.id)
.then((_) => {
reload();
})
.catch(() => {
setLoading(false);
});
};
const handleBatchDelete = () => {
SurgicalTypeApi.batchRemove(checkedKeys.value).then((_) => {
setLoading(true);
SurgicalTypeApi.batchRemove(checkedKeys.value)
.then((_) => {
reload();
})
.catch(() => {
setLoading(false);
});
};
......@@ -170,6 +179,6 @@
};
const handleView = (record) => {
go('/system/surgical-type/' + record.id);
go('/main/system/surgical-type/' + record.id);
};
</script>
......@@ -8,7 +8,6 @@
import { BasicColumn } from '/@/components/Table';
import { FormSchema } from '/@/components/Table';
import get from 'lodash.get';
export enum YesNoEnum {
YES = '是',
......@@ -31,19 +30,18 @@ export const schema = {
properties: [
{
field: 'id',
label: 'ID系统自动生成',
label: 'ID',
defaultValue: undefined,
form: {
componentProps: {
allowClear: false,
placeholder: 'ID系统自动生成',
placeholder: 'ID',
},
colProps,
component: 'InputNumber',
rules: [{ required: true, message: '请输入ID系统自动生成!' }],
},
table: {
rules: [{ required: true, message: '请输入ID!' }],
},
table: {},
},
{
field: 'code',
......@@ -56,9 +54,9 @@ export const schema = {
},
colProps,
component: 'Input',
rules: [{ required: true, message: '请输入编码!' }],
},
table: {
},
table: {},
},
{
field: 'name',
......@@ -73,8 +71,7 @@ export const schema = {
component: 'Input',
rules: [{ required: true, message: '请输入名称!' }],
},
table: {
},
table: {},
},
{
field: 'editorId',
......@@ -89,8 +86,7 @@ export const schema = {
component: 'InputNumber',
rules: [{ required: true, message: '请输入操作人Id!' }],
},
table: {
},
table: {},
},
{
field: 'editorName',
......@@ -105,12 +101,11 @@ export const schema = {
component: 'Input',
rules: [{ required: true, message: '请输入操作人!' }],
},
table: {
},
table: {},
},
{
field: 'createTime',
label: 'CreateTime',
label: '创建时间',
defaultValue: undefined,
form: {
colProps,
......@@ -121,14 +116,13 @@ export const schema = {
showTime: false,
},
component: 'RangePicker',
rules: [{ required: true, message: '请输入CreateTime!' }],
},
table: {
rules: [{ required: true, message: '请输入创建时间!' }],
},
table: {},
},
{
field: 'updateTime',
label: 'UpdateTime',
label: '开始时间',
defaultValue: undefined,
form: {
colProps,
......@@ -139,10 +133,9 @@ export const schema = {
showTime: false,
},
component: 'RangePicker',
rules: [{ required: true, message: '请输入UpdateTime!' }],
},
table: {
rules: [{ required: true, message: '请输入开始时间!' }],
},
table: {},
},
{
field: 'status',
......@@ -160,7 +153,7 @@ export const schema = {
},
table: {
customRender: ({ text }) => {
const option = YesNoEnumOptions.find((item) => item.value === text)
const option = YesNoEnumOptions.find((item) => item.value === text);
return option ? option.label : text;
},
},
......@@ -168,12 +161,13 @@ export const schema = {
],
};
const queryFields = ['id','code','name','editorId','editorName','createTime','updateTime','status'];
const editFields = ['code','name','status'];
const tableFields = ['id','code','name','editorId','editorName','createTime','updateTime','status'];
const descriptionFields = ['id','code','name','editorId','editorName','createTime','updateTime','status'];
const queryFields = ['code', 'name', 'editorName', 'createTime', 'updateTime', 'status'];
const editFields = ['code', 'name', 'status'];
const tableFields = ['id', 'code', 'name', 'editorName', 'createTime', 'updateTime', 'status'];
const descriptionFields = ['id', 'code', 'name', 'editorId', 'editorName', 'createTime', 'updateTime', 'status'];
export const searchFormSchema: FormSchema[] = schema.properties.filter(item => queryFields.includes(item.field))
export const searchFormSchema: FormSchema[] = schema.properties
.filter((item) => queryFields.includes(item.field))
.map(
({ field, label, form: { rules = [], ...formProps } }) =>
({
......@@ -185,7 +179,8 @@ export const searchFormSchema: FormSchema[] = schema.properties.filter(item => q
} as FormSchema),
);
export const formSchema: FormSchema[] = schema.properties.filter(item => editFields.includes(item.field))
export const formSchema: FormSchema[] = schema.properties
.filter((item) => editFields.includes(item.field))
.map(
({ field, label, defaultValue, form }) =>
({
......@@ -197,17 +192,19 @@ export const formSchema: FormSchema[] = schema.properties.filter(item => editFie
} as FormSchema),
);
export const columns: BasicColumn[] = schema.properties.filter(item => tableFields.includes(item.field))
export const columns: BasicColumn[] = schema.properties
.filter((item) => tableFields.includes(item.field))
.map(
({ field, label, table }) =>
({
dataIndex: field,
title: label,
...table,
} as BasicColumn)
} as BasicColumn),
);
export const descriptionColumns: BasicColumn[] = schema.properties.filter(item => descriptionFields.includes(item.field))
export const descriptionColumns: BasicColumn[] = schema.properties
.filter((item) => descriptionFields.includes(item.field))
.map(
({ field, label, table }) =>
({
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论