新增器械分类页面
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
yudao-ui-admin CI / build (14.x) (push) Has been cancelled
yudao-ui-admin CI / build (16.x) (push) Has been cancelled

This commit is contained in:
2025-11-18 16:11:31 +08:00
parent 850c26e6bc
commit c5628d80e2
3 changed files with 473 additions and 0 deletions

View File

@@ -0,0 +1,52 @@
import request from '@/config/axios'
import type { Dayjs } from 'dayjs';
/** 进销存系统 - 器械分类信息 */
export interface DeviceCategory {
id: number; // 记录唯一标识,系统自动生成,用于数据关联和查询
categoryName?: string; // 分类名称(如 "01 有源手术器械"),业务核心字段,必填
categoryCode?: string; // 分类编号(如 "1-8-8.2""1-10-10.4"),业务唯一标识(页面标*必填)
deviceType?: string; // 类别(如 "一类""二类""三类"),通过下拉选择,必填
exampleNames: string; // 品名举例(如 "移动式 LED 手术照明灯、LED 手术照明灯..."),可选填
createUser?: string; // 记录创建人(如 "admin"),用于追溯操作人
updateUser: string; // 记录最后更新人,数据首次创建时可为空,修改后自动填充
status?: number; // 状态
}
// 进销存系统 - 器械分类 API
export const DeviceCategoryApi = {
// 查询进销存系统 - 器械分类分页
getDeviceCategoryPage: async (params: any) => {
return await request.get({ url: `/erp/device-category/page`, params })
},
// 查询进销存系统 - 器械分类详情
getDeviceCategory: async (id: number) => {
return await request.get({ url: `/erp/device-category/get?id=` + id })
},
// 新增进销存系统 - 器械分类
createDeviceCategory: async (data: DeviceCategory) => {
return await request.post({ url: `/erp/device-category/create`, data })
},
// 修改进销存系统 - 器械分类
updateDeviceCategory: async (data: DeviceCategory) => {
return await request.put({ url: `/erp/device-category/update`, data })
},
// 删除进销存系统 - 器械分类
deleteDeviceCategory: async (id: number) => {
return await request.delete({ url: `/erp/device-category/delete?id=` + id })
},
/** 批量删除进销存系统 - 器械分类 */
deleteDeviceCategoryList: async (ids: number[]) => {
return await request.delete({ url: `/erp/device-category/delete-list?ids=${ids.join(',')}` })
},
// 导出进销存系统 - 器械分类 Excel
exportDeviceCategory: async (params) => {
return await request.download({ url: `/erp/device-category/export-excel`, params })
}
}

View File

@@ -0,0 +1,130 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="分类名称(如 "01 有源手术器械"业务核心字段必填" prop="categoryName">
<el-input v-model="formData.categoryName" placeholder="请输入分类名称(如 "01 有源手术器械"),业务核心字段,必填" />
</el-form-item>
<el-form-item label="分类编号(如 "1-8-8.2""1-10-10.4"业务唯一标识页面标*必填" prop="categoryCode">
<el-input v-model="formData.categoryCode" placeholder="请输入分类编号(如 "1-8-8.2""1-10-10.4"),业务唯一标识(页面标*必填)" />
</el-form-item>
<el-form-item label="类别(如 "一类""二类""三类"通过下拉选择必填" prop="deviceType">
<el-select v-model="formData.deviceType" placeholder="请选择类别(如 "一类""二类""三类"),通过下拉选择,必填">
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="品名举例(如 "移动式 LED 手术照明灯LED 手术照明灯..."可选填" prop="exampleNames">
<el-input v-model="formData.exampleNames" placeholder="请输入品名举例(如 "移动式 LED 手术照明灯、LED 手术照明灯..."),可选填" />
</el-form-item>
<el-form-item label="记录创建人(如 "admin"用于追溯操作人" prop="createUser">
<el-input v-model="formData.createUser" placeholder="请输入记录创建人(如 "admin"),用于追溯操作人" />
</el-form-item>
<el-form-item label="记录最后更新人,数据首次创建时可为空,修改后自动填充" prop="updateUser">
<el-input v-model="formData.updateUser" placeholder="请输入记录最后更新人,数据首次创建时可为空,修改后自动填充" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="formData.status">
<el-radio value="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { DeviceCategoryApi, DeviceCategory } from '@/api/erp/devicecategory'
/** 进销存系统 - 器械分类 表单 */
defineOptions({ name: 'DeviceCategoryForm' })
const { t } = useI18n() // 国际化
const message = useMessage() // 消息弹窗
const dialogVisible = ref(false) // 弹窗的是否展示
const dialogTitle = ref('') // 弹窗的标题
const formLoading = ref(false) // 表单的加载中1修改时的数据加载2提交的按钮禁用
const formType = ref('') // 表单的类型create - 新增update - 修改
const formData = ref({
id: undefined,
categoryName: undefined,
categoryCode: undefined,
deviceType: undefined,
exampleNames: undefined,
createUser: undefined,
updateUser: undefined,
status: undefined
})
const formRules = reactive({
categoryName: [{ required: true, message: '分类名称(如 "01 有源手术器械"),业务核心字段,必填不能为空', trigger: 'blur' }],
categoryCode: [{ required: true, message: '分类编号(如 "1-8-8.2""1-10-10.4"),业务唯一标识(页面标*必填)不能为空', trigger: 'blur' }],
deviceType: [{ required: true, message: '类别(如 "一类""二类""三类"),通过下拉选择,必填不能为空', trigger: 'change' }],
createUser: [{ required: true, message: '记录创建人(如 "admin"),用于追溯操作人不能为空', trigger: 'blur' }],
status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]
})
const formRef = ref() // 表单 Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
// 修改时,设置数据
if (id) {
formLoading.value = true
try {
formData.value = await DeviceCategoryApi.getDeviceCategory(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
/** 提交表单 */
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
const submitForm = async () => {
// 校验表单
await formRef.value.validate()
// 提交请求
formLoading.value = true
try {
const data = formData.value as unknown as DeviceCategory
if (formType.value === 'create') {
await DeviceCategoryApi.createDeviceCategory(data)
message.success(t('common.createSuccess'))
} else {
await DeviceCategoryApi.updateDeviceCategory(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
// 发送操作成功的事件
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
categoryName: undefined,
categoryCode: undefined,
deviceType: undefined,
exampleNames: undefined,
createUser: undefined,
updateUser: undefined,
status: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@@ -0,0 +1,291 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="分类名称(如 "01 有源手术器械"业务核心字段必填" prop="categoryName">
<el-input
v-model="queryParams.categoryName"
placeholder="请输入分类名称(如 "01 有源手术器械"业务核心字段必填"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="分类编号(如 "1-8-8.2""1-10-10.4"业务唯一标识页面标*必填" prop="categoryCode">
<el-input
v-model="queryParams.categoryCode"
placeholder="请输入分类编号(如 "1-8-8.2""1-10-10.4"业务唯一标识页面标*必填"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="类别(如 "一类""二类""三类"通过下拉选择必填" prop="deviceType">
<el-select
v-model="queryParams.deviceType"
placeholder="请选择类别(如 "一类""二类""三类"通过下拉选择必填"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="品名举例(如 "移动式 LED 手术照明灯LED 手术照明灯..."可选填" prop="exampleNames">
<el-input
v-model="queryParams.exampleNames"
placeholder="请输入品名举例(如 "移动式 LED 手术照明灯LED 手术照明灯..."可选填"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="记录创建时间,自动生成,用于数据审计" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="记录创建人(如 "admin"用于追溯操作人" prop="createUser">
<el-input
v-model="queryParams.createUser"
placeholder="请输入记录创建人(如 "admin"用于追溯操作人"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="记录最后更新人,数据首次创建时可为空,修改后自动填充" prop="updateUser">
<el-input
v-model="queryParams.updateUser"
placeholder="请输入记录最后更新人,数据首次创建时可为空,修改后自动填充"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select
v-model="queryParams.status"
placeholder="请选择状态"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['erp:device-category:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['erp:device-category:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
<el-button
type="danger"
plain
:disabled="isEmpty(checkedIds)"
@click="handleDeleteBatch"
v-hasPermi="['erp:device-category:delete']"
>
<Icon icon="ep:delete" class="mr-5px" /> 批量删除
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table
row-key="id"
v-loading="loading"
:data="list"
:stripe="true"
:show-overflow-tooltip="true"
@selection-change="handleRowCheckboxChange"
>
<el-table-column type="selection" width="55" />
<el-table-column label="记录唯一标识,系统自动生成,用于数据关联和查询" align="center" prop="id" />
<el-table-column label="分类名称(如 "01 有源手术器械"业务核心字段必填" align="center" prop="categoryName" />
<el-table-column label="分类编号(如 "1-8-8.2""1-10-10.4"业务唯一标识页面标*必填" align="center" prop="categoryCode" />
<el-table-column label="类别(如 "一类""二类""三类"通过下拉选择必填" align="center" prop="deviceType" />
<el-table-column label="品名举例(如 "移动式 LED 手术照明灯LED 手术照明灯..."可选填" align="center" prop="exampleNames" />
<el-table-column
label="记录创建时间,自动生成,用于数据审计"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="记录创建人(如 "admin"用于追溯操作人" align="center" prop="createUser" />
<el-table-column label="记录最后更新人,数据首次创建时可为空,修改后自动填充" align="center" prop="updateUser" />
<el-table-column label="状态" align="center" prop="status" />
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['erp:device-category:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['erp:device-category:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<DeviceCategoryForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { isEmpty } from '@/utils/is'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { DeviceCategoryApi, DeviceCategory } from '@/api/erp/devicecategory'
import DeviceCategoryForm from './DeviceCategoryForm.vue'
/** 进销存系统 - 器械分类 列表 */
defineOptions({ name: 'DeviceCategory' })
const message = useMessage() // 消息弹窗
const { t } = useI18n() // 国际化
const loading = ref(true) // 列表的加载中
const list = ref<DeviceCategory[]>([]) // 列表的数据
const total = ref(0) // 列表的总页数
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
categoryName: undefined,
categoryCode: undefined,
deviceType: undefined,
exampleNames: undefined,
createTime: [],
createUser: undefined,
updateUser: undefined,
status: undefined
})
const queryFormRef = ref() // 搜索的表单
const exportLoading = ref(false) // 导出的加载中
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await DeviceCategoryApi.getDeviceCategoryPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
// 删除的二次确认
await message.delConfirm()
// 发起删除
await DeviceCategoryApi.deleteDeviceCategory(id)
message.success(t('common.delSuccess'))
currentRow.value = {}
// 刷新列表
await getList()
} catch {}
}
/** 批量删除进销存系统 - 器械分类 */
const handleDeleteBatch = async () => {
try {
// 删除的二次确认
await message.delConfirm()
await DeviceCategoryApi.deleteDeviceCategoryList(checkedIds.value);
checkedIds.value = [];
message.success(t('common.delSuccess'))
await getList();
} catch {}
}
const checkedIds = ref<number[]>([])
const handleRowCheckboxChange = (records: DeviceCategory[]) => {
checkedIds.value = records.map((item) => item.id!);
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
// 导出的二次确认
await message.exportConfirm()
// 发起导出
exportLoading.value = true
const data = await DeviceCategoryApi.exportDeviceCategory(queryParams)
download.excel(data, '进销存系统 - 器械分类.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>