feat 反应器页面
This commit is contained in:
parent
49cb6bb23d
commit
48971c9dc7
84
src/api/admin/reactor.ts
Normal file
84
src/api/admin/reactor.ts
Normal file
@ -0,0 +1,84 @@
|
||||
import { ReactorPageInput, ReactorPageResponse, ReactorOutput, ReactorAddInput, ReactorUpdateInput, ReactorTypeEnumListOutput } from '/@/api/types/ReactorType'
|
||||
import { RequestParams } from './http-client'
|
||||
import { ContentType, HttpClient } from './http-client'
|
||||
|
||||
export class ReactorApi extends HttpClient {
|
||||
/**
|
||||
* 获取分页列表
|
||||
*/
|
||||
getPage = (data: ReactorPageInput, params: RequestParams = {}) =>
|
||||
this.request<ReactorPageResponse>({
|
||||
path: `/api/admin/equ-reactor/get-page`,
|
||||
method: 'POST',
|
||||
body: data,
|
||||
type: ContentType.Json,
|
||||
...params,
|
||||
})
|
||||
|
||||
/**
|
||||
* 获取单条数据
|
||||
*/
|
||||
get = (params: { id: number }, requestParams: RequestParams = {}) =>
|
||||
this.request<ReactorOutput>({
|
||||
path: `/api/admin/equ-reactor/get`,
|
||||
method: 'GET',
|
||||
query: params,
|
||||
...requestParams,
|
||||
})
|
||||
|
||||
/**
|
||||
* 新增
|
||||
*/
|
||||
add = (data: ReactorAddInput, params: RequestParams = {}) =>
|
||||
this.request<any>({
|
||||
path: `/api/admin/equ-reactor/add`,
|
||||
method: 'POST',
|
||||
body: data,
|
||||
type: ContentType.Json,
|
||||
...params,
|
||||
})
|
||||
|
||||
/**
|
||||
* 更新
|
||||
*/
|
||||
update = (data: ReactorUpdateInput, params: RequestParams = {}) =>
|
||||
this.request<any>({
|
||||
path: `/api/admin/equ-reactor/update`,
|
||||
method: 'PUT',
|
||||
body: data,
|
||||
type: ContentType.Json,
|
||||
...params,
|
||||
})
|
||||
|
||||
/**
|
||||
* 软删除
|
||||
*/
|
||||
softDelete = (params: { id: number }, requestParams: RequestParams = {}) =>
|
||||
this.request<any>({
|
||||
path: `/api/admin/equ-reactor/soft-delete`,
|
||||
method: 'DELETE',
|
||||
query: params,
|
||||
...requestParams,
|
||||
})
|
||||
|
||||
/**
|
||||
* 获取反应器类型枚举列表
|
||||
*/
|
||||
getReactorTypeEnumList = (params: RequestParams = {}) =>
|
||||
this.request<ReactorTypeEnumListOutput>({
|
||||
path: `/api/admin/equ-reactor/get-reactor-type-enum-list`,
|
||||
method: 'GET',
|
||||
...params,
|
||||
})
|
||||
|
||||
/**
|
||||
* 获取设备状态枚举列表
|
||||
*/
|
||||
getDeviceStatusEnumList = (params: RequestParams = {}) =>
|
||||
this.request<ReactorTypeEnumListOutput>({
|
||||
path: `/api/admin/equ-reactor/get-device-status-enum-list`,
|
||||
method: 'GET',
|
||||
...params,
|
||||
})
|
||||
|
||||
}
|
114
src/api/types/ReactorType.ts
Normal file
114
src/api/types/ReactorType.ts
Normal file
@ -0,0 +1,114 @@
|
||||
import { ServiceResponse } from './response';
|
||||
import { ServiceRequstPage } from './pageInput'
|
||||
import { PageResponse } from './pageResponse'
|
||||
|
||||
// 设备状态枚举
|
||||
export enum DeviceStatusEnum {
|
||||
Normal = 0, // 正常
|
||||
Fault = 1, // 故障
|
||||
Offline = 2, // 离线
|
||||
Maintenance = 3 // 维护中
|
||||
}
|
||||
|
||||
// 维护标志枚举
|
||||
export enum MaintenanceFlagEnum {
|
||||
None = 0, // 无
|
||||
Regular = 1, // 定期维护
|
||||
Emergency = 2 // 紧急维护
|
||||
}
|
||||
|
||||
// 过滤条件
|
||||
export interface ReactorFilter {
|
||||
/** 设备编号 */
|
||||
deviceNo?: string | null
|
||||
/** 资产编号 */
|
||||
assetNo?: string | null
|
||||
/** 产品ID */
|
||||
productID?: string | null
|
||||
/** 型号 */
|
||||
model?: string | null
|
||||
/** 规格 */
|
||||
specification?: string | null
|
||||
/** 房间ID */
|
||||
roomID?: number | null
|
||||
/** 负责人ID */
|
||||
principalId?: number | null
|
||||
/** 设备状态 */
|
||||
deviceStatus?: DeviceStatusEnum | null
|
||||
/** 维护标志 */
|
||||
maintenanceFlag?: MaintenanceFlagEnum | null
|
||||
/** 状态 */
|
||||
status?: boolean | null
|
||||
/** 是否维护中 */
|
||||
isMaintenance?: boolean | null
|
||||
/** 开始时间 */
|
||||
startTime?: string | null
|
||||
/** 结束时间 */
|
||||
endTime?: string | null
|
||||
}
|
||||
|
||||
// 反应器DTO
|
||||
export interface ReactorDto {
|
||||
/** 设备反应器ID */
|
||||
id?: number
|
||||
/** 排序 */
|
||||
sort?: number
|
||||
/** 设备编号 */
|
||||
deviceNo?: string | null
|
||||
/** 资产编号 */
|
||||
assetNo?: string | null
|
||||
/** 产品ID */
|
||||
productID?: string | null
|
||||
/** 型号 */
|
||||
model?: string | null
|
||||
/** 规格 */
|
||||
specification?: string | null
|
||||
/** 容量(g) */
|
||||
capacity?: number
|
||||
/** 房间ID */
|
||||
roomID?: number
|
||||
/** 房间名称 */
|
||||
roomName?: string | null
|
||||
/** 负责人ID */
|
||||
principalId?: number
|
||||
/** 负责人姓名 */
|
||||
principalName?: string | null
|
||||
/** 设备状态 */
|
||||
deviceStatus?: DeviceStatusEnum
|
||||
/** 设备状态描述 */
|
||||
deviceStatusDesc?: string | null
|
||||
/** 维护标志 */
|
||||
maintenanceFlag?: MaintenanceFlagEnum
|
||||
/** 维护标志描述 */
|
||||
maintenanceFlagDesc?: string | null
|
||||
/** 错误码 */
|
||||
errorCode?: string | null
|
||||
/** 状态(启用禁用) */
|
||||
status?: boolean
|
||||
/** 是否维护中 */
|
||||
isMaintenance?: boolean
|
||||
/** 维护时间 */
|
||||
maintenanceTime?: string | null
|
||||
/** 创建时间 */
|
||||
createdTime?: string | null
|
||||
/** 修改时间 */
|
||||
modifiedTime?: string | null
|
||||
}
|
||||
|
||||
// 反应器类型枚举项
|
||||
export interface ReactorTypeEnumItem {
|
||||
/** 枚举值 */
|
||||
value: number
|
||||
/** 枚举名称 */
|
||||
name: string
|
||||
/** 显示名称/描述 */
|
||||
label: string
|
||||
}
|
||||
|
||||
// API 类型定义
|
||||
export type ReactorPageInput = ServiceRequstPage<ReactorFilter>;
|
||||
export type ReactorPageResponse = ServiceResponse<PageResponse<ReactorDto>>;
|
||||
export type ReactorOutput = ServiceResponse<ReactorDto[]>;
|
||||
export type ReactorAddInput = ReactorDto;
|
||||
export type ReactorUpdateInput = ReactorDto;
|
||||
export type ReactorTypeEnumListOutput = ServiceResponse<ReactorTypeEnumItem[]>;
|
467
src/views/admin/reactor/components/reactor-form.vue
Normal file
467
src/views/admin/reactor/components/reactor-form.vue
Normal file
@ -0,0 +1,467 @@
|
||||
<template>
|
||||
<el-dialog
|
||||
v-model="dialogVisible"
|
||||
:title="form.id ? '编辑反应器' : '新增反应器'"
|
||||
width="900px"
|
||||
:close-on-click-modal="false"
|
||||
:close-on-press-escape="false"
|
||||
destroy-on-close
|
||||
class="reactor-form-dialog"
|
||||
>
|
||||
<el-form
|
||||
ref="formRef"
|
||||
:model="form"
|
||||
:rules="rules"
|
||||
label-width="100px"
|
||||
class="reactor-form"
|
||||
>
|
||||
<el-tabs v-model="activeTab" class="reactor-tabs">
|
||||
<el-tab-pane label="基本信息" name="basic">
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="设备编号" prop="deviceNo">
|
||||
<el-input v-model="form.deviceNo" placeholder="请输入设备编号" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="资产编号" prop="assetNo">
|
||||
<el-input v-model="form.assetNo" placeholder="请输入资产编号" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="产品编号" prop="productID">
|
||||
<el-input v-model="form.productID" placeholder="请输入产品编号" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="设备型号" prop="model">
|
||||
<el-input v-model="form.model" placeholder="请输入设备型号" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="规格" prop="specification">
|
||||
<el-input v-model="form.specification" placeholder="请输入规格" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="容量" prop="capacity">
|
||||
<el-input-number v-model="form.capacity" :min="0" :step="1" style="width: 100%" placeholder="请输入容量" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="房间" prop="roomID">
|
||||
<el-select v-model="form.roomID" placeholder="请选择房间" style="width: 100%">
|
||||
<el-option
|
||||
v-for="item in roomOptions"
|
||||
:key="item.id"
|
||||
:label="item.name"
|
||||
:value="item.id"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="负责人" prop="principalId">
|
||||
<el-select v-model="form.principalId" placeholder="请选择负责人" style="width: 100%">
|
||||
<el-option
|
||||
v-for="item in principalOptions"
|
||||
:key="item.id"
|
||||
:label="item.name"
|
||||
:value="item.id"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="设备状态" prop="deviceStatus">
|
||||
<el-select v-model="form.deviceStatus" placeholder="请选择设备状态" style="width: 100%">
|
||||
<el-option
|
||||
v-for="item in deviceStatusOptions"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="维护标志" prop="maintenanceFlag">
|
||||
<el-select v-model="form.maintenanceFlag" placeholder="请选择维护标志" style="width: 100%">
|
||||
<el-option
|
||||
v-for="item in maintenanceFlagOptions"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="排序" prop="sort">
|
||||
<el-input-number v-model="form.sort" :min="0" :step="1" style="width: 100%" placeholder="请输入排序" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="是否维护中" prop="isMaintenance">
|
||||
<el-switch v-model="form.isMaintenance" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="设备配置" name="config">
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="地秤ID" prop="equScaleId">
|
||||
<el-input-number v-model="form.equScaleId" :min="0" :step="1" style="width: 100%" placeholder="请输入地秤ID" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="补料秤ID" prop="feedingScaleId">
|
||||
<el-input-number v-model="form.feedingScaleId" :min="0" :step="1" style="width: 100%" placeholder="请输入补料秤ID" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="继电器ID" prop="relayID">
|
||||
<el-input-number v-model="form.relayID" :min="0" :step="1" style="width: 100%" placeholder="请输入继电器ID" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="报警器ID" prop="equAlarmId">
|
||||
<el-input-number v-model="form.equAlarmId" :min="0" :step="1" style="width: 100%" placeholder="请输入报警器ID" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="警告下限" prop="warningLowerLimit">
|
||||
<el-input-number v-model="form.warningLowerLimit" :min="0" :step="1" style="width: 100%" placeholder="请输入警告下限" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="警告上限" prop="warningUpperLimit">
|
||||
<el-input-number v-model="form.warningUpperLimit" :min="0" :step="1" style="width: 100%" placeholder="请输入警告上限" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="是否外置泵" prop="isExternalPump">
|
||||
<el-switch v-model="form.isExternalPump" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="OPC IP" prop="opcip">
|
||||
<el-input v-model="form.opcip" placeholder="请输入OPC IP" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="OPC 端口" prop="opcPort">
|
||||
<el-input v-model="form.opcPort" placeholder="请输入OPC 端口" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||
<el-button type="primary" :loading="loading" @click="handleSubmit">确 定</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import type { FormInstance, FormRules } from 'element-plus'
|
||||
import { ReactorApi } from '/@/api/admin/reactor'
|
||||
import { RoomApi } from '/@/api/admin/Room'
|
||||
import { UserApi } from '/@/api/admin/User'
|
||||
import type { ReactorDto } from '/@/api/types/ReactorType'
|
||||
import { DeviceStatusEnum, MaintenanceFlagEnum } from '/@/api/types/ReactorType'
|
||||
import type { ReactorTypeEnumItem } from '/@/api/types/ReactorType'
|
||||
|
||||
const props = defineProps<{
|
||||
title: string
|
||||
}>()
|
||||
|
||||
const emit = defineEmits(['ok'])
|
||||
|
||||
const dialogVisible = ref(false)
|
||||
const formRef = ref<FormInstance>()
|
||||
const activeTab = ref('basic')
|
||||
const activePumpTab = ref('pump1')
|
||||
const deviceStatusOptions = ref<ReactorTypeEnumItem[]>([])
|
||||
|
||||
// 模拟数据,实际项目中应该从API获取
|
||||
const roomOptions = ref([
|
||||
{ id: 1, name: '实验室1' },
|
||||
{ id: 2, name: '实验室2' }
|
||||
])
|
||||
|
||||
const principalOptions = ref([
|
||||
{ id: 1, name: '张三' },
|
||||
{ id: 2, name: '李四' }
|
||||
])
|
||||
|
||||
const defaultPumpConfig = {
|
||||
speed: 0,
|
||||
timeout: 0,
|
||||
exception: '',
|
||||
errorCode: '',
|
||||
isFeeding: true,
|
||||
speedOffset: 0,
|
||||
configId: 0
|
||||
}
|
||||
|
||||
const form = reactive<ReactorDto>({
|
||||
sort: 0,
|
||||
deviceNo: '',
|
||||
assetNo: '',
|
||||
productID: '',
|
||||
model: '',
|
||||
specification: '',
|
||||
capacity: 0,
|
||||
roomID: undefined,
|
||||
principalId: undefined,
|
||||
deviceStatus: undefined ,
|
||||
maintenanceFlag: undefined,
|
||||
equScaleId: 0,
|
||||
feedingScaleId: 0,
|
||||
relayID: 0,
|
||||
warningLowerLimit: 0,
|
||||
warningUpperLimit: 0,
|
||||
errorCode: '',
|
||||
pump1: { ...defaultPumpConfig },
|
||||
pump2: { ...defaultPumpConfig },
|
||||
pump3: { ...defaultPumpConfig },
|
||||
pump4: { ...defaultPumpConfig },
|
||||
pump5: { ...defaultPumpConfig },
|
||||
pump6: { ...defaultPumpConfig },
|
||||
pump7: { ...defaultPumpConfig },
|
||||
pump8: { ...defaultPumpConfig },
|
||||
isExternalPump: true,
|
||||
opcip: '',
|
||||
opcPort: '',
|
||||
equAlarmId: 0,
|
||||
status: true,
|
||||
isMaintenance: false,
|
||||
maintenanceTime: '',
|
||||
id: 0
|
||||
})
|
||||
|
||||
const rules = reactive<FormRules>({
|
||||
deviceNo: [{ required: true, message: '请输入设备编号', trigger: 'blur' }],
|
||||
assetNo: [{ required: true, message: '请输入资产编号', trigger: 'blur' }],
|
||||
productID: [{ required: true, message: '请输入产品编号', trigger: 'blur' }],
|
||||
model: [{ required: true, message: '请输入设备型号', trigger: 'blur' }],
|
||||
specification: [{ required: true, message: '请输入规格', trigger: 'blur' }],
|
||||
capacity: [{ required: true, message: '请输入容量', trigger: 'blur' }],
|
||||
roomID: [{ required: true, message: '请选择房间', trigger: 'change' }],
|
||||
principalId: [{ required: true, message: '请选择负责人', trigger: 'change' }],
|
||||
deviceStatus: [{ required: true, message: '请选择设备状态', trigger: 'change' }],
|
||||
maintenanceFlag: [{ required: true, message: '请选择维护标志', trigger: 'change' }],
|
||||
status: [{ required: true, message: '请选择状态', trigger: 'change' }],
|
||||
isMaintenance: [{ required: true, message: '请选择是否维护中', trigger: 'change' }],
|
||||
maintenanceTime: [{ required: true, message: '请选择维护时间', trigger: 'change' }],
|
||||
sort: [{ required: true, message: '请输入排序', trigger: 'blur' }],
|
||||
equScaleId: [{ required: true, message: '请输入地秤ID', trigger: 'blur' }],
|
||||
feedingScaleId: [{ required: true, message: '请输入补料秤ID', trigger: 'blur' }],
|
||||
relayID: [{ required: true, message: '请输入继电器ID', trigger: 'blur' }],
|
||||
warningLowerLimit: [{ required: true, message: '请输入警告下限', trigger: 'blur' }],
|
||||
warningUpperLimit: [{ required: true, message: '请输入警告上限', trigger: 'blur' }],
|
||||
opcip: [{ required: true, message: '请输入OPC IP', trigger: 'blur' }],
|
||||
opcPort: [{ required: true, message: '请输入OPC 端口', trigger: 'blur' }],
|
||||
equAlarmId: [{ required: true, message: '请输入报警器ID', trigger: 'blur' }]
|
||||
})
|
||||
|
||||
/** 获取设备状态枚举列表 */
|
||||
const getDeviceStatusOptions = async () => {
|
||||
try {
|
||||
const res = await new ReactorApi().getDeviceStatusEnumList()
|
||||
deviceStatusOptions.value = res.data ?? []
|
||||
} catch (error) {
|
||||
console.error('获取设备状态枚举列表失败:', error)
|
||||
}
|
||||
}
|
||||
|
||||
/** 获取设备状态描述 */
|
||||
const getDeviceStatusDesc = (status: DeviceStatusEnum) => {
|
||||
const statusMap = {
|
||||
[DeviceStatusEnum.Normal]: '正常',
|
||||
[DeviceStatusEnum.Fault]: '故障',
|
||||
[DeviceStatusEnum.Offline]: '离线',
|
||||
[DeviceStatusEnum.Maintenance]: '维护中'
|
||||
}
|
||||
return statusMap[status] || '未知'
|
||||
}
|
||||
|
||||
/** 获取维护标志描述 */
|
||||
const getMaintenanceFlagDesc = (flag: MaintenanceFlagEnum) => {
|
||||
const flagMap = {
|
||||
[MaintenanceFlagEnum.None]: '无',
|
||||
[MaintenanceFlagEnum.Regular]: '定期维护',
|
||||
[MaintenanceFlagEnum.Emergency]: '紧急维护'
|
||||
}
|
||||
return flagMap[flag] || '未知'
|
||||
}
|
||||
|
||||
/** 获取房间列表 */
|
||||
const getRoomOptions = async () => {
|
||||
try {
|
||||
const res = await new RoomApi().getPage({
|
||||
currentPage: 1,
|
||||
pageSize: 1000,
|
||||
filter: {}
|
||||
})
|
||||
roomOptions.value = res.data?.list?.map((item: any) => ({
|
||||
id: item.id,
|
||||
name: item.roomName
|
||||
})) || []
|
||||
} catch (error) {
|
||||
console.error('获取房间列表失败:', error)
|
||||
}
|
||||
}
|
||||
|
||||
/** 获取负责人列表 */
|
||||
const getPrincipalOptions = async () => {
|
||||
try {
|
||||
const res = await new UserApi().getPage({
|
||||
currentPage: 1,
|
||||
pageSize: 1000,
|
||||
filter: {}
|
||||
})
|
||||
principalOptions.value = res.data?.list?.map((item: any) => ({
|
||||
id: item.id,
|
||||
name: item.name
|
||||
})) || []
|
||||
} catch (error) {
|
||||
console.error('获取负责人列表失败:', error)
|
||||
}
|
||||
}
|
||||
|
||||
/** 打开弹窗 */
|
||||
const open = (row?: ReactorDto) => {
|
||||
dialogVisible.value = true
|
||||
if (row) {
|
||||
Object.assign(form, row)
|
||||
}
|
||||
getDeviceStatusOptions()
|
||||
getRoomOptions()
|
||||
getPrincipalOptions()
|
||||
}
|
||||
|
||||
/** 提交表单 */
|
||||
const submitForm = async () => {
|
||||
if (!formRef.value) return
|
||||
await formRef.value.validate(async (valid) => {
|
||||
if (valid) {
|
||||
try {
|
||||
const api = new ReactorApi()
|
||||
const res = form.id ? await api.update(form) : await api.add(form)
|
||||
if (res.success) {
|
||||
ElMessage.success(form.id ? '修改成功' : '新增成功')
|
||||
dialogVisible.value = false
|
||||
emit('ok')
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('提交失败:', error)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/** 取消 */
|
||||
const cancel = () => {
|
||||
dialogVisible.value = false
|
||||
reset()
|
||||
}
|
||||
|
||||
/** 重置表单 */
|
||||
const reset = () => {
|
||||
if (!formRef.value) return
|
||||
formRef.value.resetFields()
|
||||
Object.assign(form, {
|
||||
sort: 0,
|
||||
deviceNo: '',
|
||||
assetNo: '',
|
||||
productID: '',
|
||||
model: '',
|
||||
specification: '',
|
||||
capacity: 0,
|
||||
roomID: 0,
|
||||
principalId: 0,
|
||||
deviceStatus: DeviceStatusEnum.Normal,
|
||||
maintenanceFlag: MaintenanceFlagEnum.None,
|
||||
equScaleId: 0,
|
||||
feedingScaleId: 0,
|
||||
relayID: 0,
|
||||
warningLowerLimit: 0,
|
||||
warningUpperLimit: 0,
|
||||
errorCode: '',
|
||||
pump1: { ...defaultPumpConfig },
|
||||
pump2: { ...defaultPumpConfig },
|
||||
pump3: { ...defaultPumpConfig },
|
||||
pump4: { ...defaultPumpConfig },
|
||||
pump5: { ...defaultPumpConfig },
|
||||
pump6: { ...defaultPumpConfig },
|
||||
pump7: { ...defaultPumpConfig },
|
||||
pump8: { ...defaultPumpConfig },
|
||||
isExternalPump: true,
|
||||
opcip: '',
|
||||
opcPort: '',
|
||||
equAlarmId: 0,
|
||||
status: true,
|
||||
isMaintenance: false,
|
||||
maintenanceTime: '',
|
||||
id: 0
|
||||
})
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
getDeviceStatusOptions()
|
||||
getRoomOptions()
|
||||
getPrincipalOptions()
|
||||
})
|
||||
|
||||
defineExpose({
|
||||
open
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.reactor-form-dialog {
|
||||
:deep(.el-dialog__body) {
|
||||
padding: 20px 30px;
|
||||
}
|
||||
}
|
||||
|
||||
.reactor-form {
|
||||
.el-form-item {
|
||||
margin-bottom: 22px;
|
||||
}
|
||||
}
|
||||
|
||||
.reactor-tabs {
|
||||
:deep(.el-tabs__content) {
|
||||
padding: 20px 0;
|
||||
}
|
||||
|
||||
:deep(.el-tabs__nav) {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
:deep(.el-input-number) {
|
||||
width: 100%;
|
||||
|
||||
.el-input__wrapper {
|
||||
padding-left: 11px;
|
||||
padding-right: 11px;
|
||||
}
|
||||
}
|
||||
|
||||
:deep(.el-select) {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
:deep(.el-switch) {
|
||||
margin-top: 8px;
|
||||
}
|
||||
</style>
|
311
src/views/admin/reactor/index.vue
Normal file
311
src/views/admin/reactor/index.vue
Normal file
@ -0,0 +1,311 @@
|
||||
<template>
|
||||
<my-layout>
|
||||
<el-card class="my-query-box mt8" shadow="never" :body-style="{ paddingBottom: '0' }">
|
||||
<el-form :inline="true" label-width="auto" :label-position="'left'" @submit.stop.prevent>
|
||||
<el-form-item label="关键字" prop="keyWord">
|
||||
<el-input v-model="state.filter.keyWord" placeholder="请输入设备编号/资产编号/产品ID/型号" clearable style="width: 300px" @keyup.enter="handleQuery" />
|
||||
</el-form-item>
|
||||
<el-form-item label="房间" prop="roomID">
|
||||
<el-select v-model="state.filter.roomID" placeholder="请选择房间" clearable style="width: 200px">
|
||||
<el-option v-for="item in state.roomOptions" :key="item.id" :label="item.name" :value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="开始时间">
|
||||
<el-date-picker v-model="state.filter.stDate" type="datetime" placeholder="选择开始时间"
|
||||
format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" style="width: 180px" />
|
||||
</el-form-item>
|
||||
<el-form-item label="结束时间">
|
||||
<el-date-picker v-model="state.filter.edDate" type="datetime" placeholder="选择结束时间"
|
||||
format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" style="width: 180px" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="ele-Search" @click="handleQuery">查询</el-button>
|
||||
<el-button v-auth="'api:admin:equ-reactor:add'" type="primary" icon="ele-Plus" @click="handleAdd">新增</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
|
||||
<el-card class="my-fill mt8" shadow="never">
|
||||
<el-table v-loading="loading" :data="state.reactorList" row-key="id" style="width: 100%" border>
|
||||
<el-table-column prop="deviceNo" label="设备编号" min-width="120" show-overflow-tooltip />
|
||||
<el-table-column prop="assetNo" label="资产编号" min-width="120" show-overflow-tooltip />
|
||||
<el-table-column prop="productID" label="产品ID" min-width="120" show-overflow-tooltip />
|
||||
<el-table-column prop="model" label="型号" min-width="120" show-overflow-tooltip />
|
||||
<el-table-column prop="specification" label="规格" min-width="120" show-overflow-tooltip />
|
||||
<el-table-column prop="capacity" label="容量(g)" min-width="100" show-overflow-tooltip />
|
||||
<el-table-column prop="roomName" label="房间名称" min-width="120" show-overflow-tooltip />
|
||||
<el-table-column prop="principalName" label="负责人" min-width="100" show-overflow-tooltip />
|
||||
<el-table-column prop="deviceStatus" label="设备状态" width="100">
|
||||
<template #default="{ row }">
|
||||
<el-tag :type="getDeviceStatusType(row.deviceStatus)">
|
||||
{{ getDeviceStatusDesc(row.deviceStatus) }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="维护标志" width="100" align="center">
|
||||
<template #default="{ row }">
|
||||
<el-tag :type="getMaintenanceFlagType(row.maintenanceFlag)">
|
||||
{{ row.maintenanceFlagDesc }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="是否维护中" width="100" align="center">
|
||||
<template #default="{ row }">
|
||||
<el-tag :type="row.isMaintenance ? 'warning' : 'info'">
|
||||
{{ row.isMaintenance ? '是' : '否' }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="createdTime" label="创建时间" min-width="160" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="180" fixed="right" header-align="center" align="center">
|
||||
<template #default="{ row }">
|
||||
<el-button v-auth="'api:admin:equ-reactor:update'" icon="ele-EditPen" size="small" text type="primary"
|
||||
@click="handleEdit(row)">编辑</el-button>
|
||||
<el-button v-auth="'api:admin:equ-reactor:soft-delete'" icon="ele-Delete" size="small" text type="danger"
|
||||
@click="handleDelete(row)">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<div class="my-flex my-flex-end" style="margin-top: 10px">
|
||||
<el-pagination v-model:current-page="state.pageInput.currentPage" v-model:page-size="state.pageInput.pageSize"
|
||||
:total="state.total" :page-sizes="[10, 20, 50, 100]" size="small" background @size-change="handleSizeChange"
|
||||
@current-change="handleCurrentChange" layout="total, sizes, prev, pager, next, jumper" />
|
||||
</div>
|
||||
</el-card>
|
||||
|
||||
<reactor-form ref="formRef" :title="state.formTitle" @ok="getList" />
|
||||
</my-layout>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, onMounted, onBeforeMount } from 'vue'
|
||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||
import { ReactorApi } from '/@/api/admin/reactor'
|
||||
import { RoomApi } from '/@/api/admin/Room'
|
||||
import eventBus from '/@/utils/mitt'
|
||||
import type {
|
||||
ReactorPageInput,
|
||||
ReactorDto,
|
||||
ReactorTypeEnumItem
|
||||
} from '/@/api/types/ReactorType'
|
||||
import { DeviceStatusEnum, MaintenanceFlagEnum } from '/@/api/types/ReactorType'
|
||||
|
||||
import ReactorForm from './components/reactor-form.vue'
|
||||
|
||||
const loading = ref(false)
|
||||
const formRef = ref()
|
||||
|
||||
const state = reactive({
|
||||
loading: false,
|
||||
formTitle: '',
|
||||
total: 0,
|
||||
filter: {
|
||||
keyWord: '',
|
||||
stDate: '',
|
||||
edDate: '',
|
||||
deviceStatus: undefined as number | undefined,
|
||||
maintenanceFlag: undefined as number | undefined,
|
||||
principalId: undefined as number | undefined,
|
||||
roomID: undefined as number | undefined,
|
||||
status: undefined as number | undefined,
|
||||
isMaintenance: undefined as boolean | undefined,
|
||||
pageIndex: 1,
|
||||
pageSize: 10
|
||||
},
|
||||
pageInput: {
|
||||
currentPage: 1,
|
||||
pageSize: 20,
|
||||
} as ReactorPageInput,
|
||||
reactorList: [] as Array<ReactorDto>,
|
||||
roomOptions: [] as Array<{ id: number; name: string }>,
|
||||
principalOptions: [] as Array<{ id: number; name: string }>,
|
||||
deviceStatusOptions: [] as ReactorTypeEnumItem[]
|
||||
})
|
||||
|
||||
/** 获取设备状态枚举列表 */
|
||||
const getDeviceStatusOptions = async () => {
|
||||
try {
|
||||
const res = await new ReactorApi().getDeviceStatusEnumList()
|
||||
state.deviceStatusOptions = res.data ?? []
|
||||
} catch (error) {
|
||||
console.error('获取设备状态枚举列表失败:', error)
|
||||
}
|
||||
}
|
||||
|
||||
/** 获取设备状态描述 */
|
||||
const getDeviceStatusDesc = (value: number) => {
|
||||
const item = state.deviceStatusOptions.find(item => item.value === value)
|
||||
return item?.label || '未知'
|
||||
}
|
||||
|
||||
/** 获取设备状态类型 */
|
||||
const getDeviceStatusType = (value: number) => {
|
||||
switch (value) {
|
||||
case DeviceStatusEnum.Normal:
|
||||
return 'success'
|
||||
case DeviceStatusEnum.Fault:
|
||||
return 'danger'
|
||||
case DeviceStatusEnum.Maintenance:
|
||||
return 'warning'
|
||||
default:
|
||||
return 'info'
|
||||
}
|
||||
}
|
||||
|
||||
/** 获取维护标志描述 */
|
||||
const getMaintenanceFlagDesc = (flag: MaintenanceFlagEnum) => {
|
||||
const flagMap = {
|
||||
[MaintenanceFlagEnum.None]: '无',
|
||||
[MaintenanceFlagEnum.Regular]: '定期维护',
|
||||
[MaintenanceFlagEnum.Emergency]: '紧急维护'
|
||||
}
|
||||
return flagMap[flag] || '未知'
|
||||
}
|
||||
|
||||
/** 获取维护标志标签类型 */
|
||||
const getMaintenanceFlagType = (flag: MaintenanceFlagEnum) => {
|
||||
const typeMap = {
|
||||
[MaintenanceFlagEnum.None]: 'info',
|
||||
[MaintenanceFlagEnum.Regular]: 'warning',
|
||||
[MaintenanceFlagEnum.Emergency]: 'danger'
|
||||
}
|
||||
return typeMap[flag] || 'info'
|
||||
}
|
||||
|
||||
/** 查询列表 */
|
||||
const getList = async () => {
|
||||
loading.value = true
|
||||
state.filter.pageIndex = state.pageInput.currentPage ?? 1
|
||||
state.filter.pageSize = state.pageInput.pageSize ?? 20
|
||||
try {
|
||||
const res = await new ReactorApi().getPage(state.filter)
|
||||
state.reactorList = res.data?.list || []
|
||||
state.total = res.data?.total || 0
|
||||
} catch (error) {
|
||||
console.error('获取列表失败:', error)
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
/** 搜索按钮操作 */
|
||||
const handleQuery = () => {
|
||||
state.pageInput.currentPage = 1
|
||||
getList()
|
||||
}
|
||||
|
||||
/** 新增按钮操作 */
|
||||
const handleAdd = () => {
|
||||
state.formTitle = '新增反应器'
|
||||
formRef.value?.open()
|
||||
}
|
||||
|
||||
/** 修改按钮操作 */
|
||||
const handleEdit = (row: ReactorDto) => {
|
||||
state.formTitle = '编辑反应器'
|
||||
formRef.value?.open(row)
|
||||
}
|
||||
|
||||
/** 删除按钮操作 */
|
||||
const handleDelete = (row: ReactorDto) => {
|
||||
ElMessageBox.confirm('确认要删除该记录吗?', '警告', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then(async () => {
|
||||
try {
|
||||
const res = await new ReactorApi().softDelete({ id: row.id! })
|
||||
if (res.success) {
|
||||
ElMessage.success('删除成功')
|
||||
getList()
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('删除失败:', error)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/** 每页条数改变 */
|
||||
const handleSizeChange = (val: number) => {
|
||||
state.pageInput.pageSize = val
|
||||
getList()
|
||||
}
|
||||
|
||||
/** 当前页改变 */
|
||||
const handleCurrentChange = (val: number) => {
|
||||
state.pageInput.currentPage = val
|
||||
getList()
|
||||
}
|
||||
|
||||
/** 获取房间列表 */
|
||||
const getRoomOptions = async () => {
|
||||
try {
|
||||
const res = await new RoomApi().getPage({
|
||||
currentPage: 1,
|
||||
pageSize: 1000,
|
||||
filter: {}
|
||||
})
|
||||
state.roomOptions = res.data?.list?.map((item: any) => ({
|
||||
id: item.id,
|
||||
name: item.roomName
|
||||
})) || []
|
||||
} catch (error) {
|
||||
console.error('获取房间列表失败:', error)
|
||||
}
|
||||
}
|
||||
|
||||
/** 获取负责人列表 */
|
||||
const getPrincipalOptions = async () => {
|
||||
try {
|
||||
// TODO: 调用获取负责人列表API
|
||||
state.principalOptions = [
|
||||
{ id: 1, name: '张三' },
|
||||
{ id: 2, name: '李四' }
|
||||
]
|
||||
} catch (error) {
|
||||
console.error('获取负责人列表失败:', error)
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
getList()
|
||||
getRoomOptions()
|
||||
getPrincipalOptions()
|
||||
getDeviceStatusOptions()
|
||||
eventBus.on('refreshReactor', getList)
|
||||
})
|
||||
|
||||
onBeforeMount(() => {
|
||||
eventBus.off('refreshReactor')
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.my-query-box {
|
||||
:deep(.el-form-item) {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
}
|
||||
|
||||
.my-fill {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.my-flex {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.my-flex-end {
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.mt8 {
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.mb8 {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
</style>
|
137
src/views/admin/uspsreactor/components/reactor-form.vue
Normal file
137
src/views/admin/uspsreactor/components/reactor-form.vue
Normal file
@ -0,0 +1,137 @@
|
||||
<template>
|
||||
<el-dialog v-model="visible" :title="title" width="500px" append-to-body destroy-on-close>
|
||||
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
|
||||
<el-form-item label="反应器名称" prop="reactorName">
|
||||
<el-input v-model="form.reactorName" placeholder="请输入反应器名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="反应器类型" prop="reactorType">
|
||||
<el-select v-model="form.reactorType" placeholder="请选择反应器类型" style="width: 100%">
|
||||
<el-option v-for="item in reactorTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态" prop="status">
|
||||
<el-radio-group v-model="form.status">
|
||||
<el-radio :label="true">启用</el-radio>
|
||||
<el-radio :label="false">禁用</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button type="primary" @click="submitForm">确 定</el-button>
|
||||
<el-button @click="cancel">取 消</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { ReactorApi } from '/@/api/admin/reactor'
|
||||
import type { ReactorDto, ReactorTypeEnumItem } from '/@/api/types/ReactorType'
|
||||
|
||||
const props = defineProps<{
|
||||
title: string
|
||||
}>()
|
||||
|
||||
const emit = defineEmits<{
|
||||
(e: 'ok'): void
|
||||
}>()
|
||||
|
||||
const visible = ref(false)
|
||||
const formRef = ref()
|
||||
const reactorTypeOptions = ref<ReactorTypeEnumItem[]>([])
|
||||
|
||||
const form = reactive<ReactorDto>({
|
||||
reactorName: '',
|
||||
reactorType: '',
|
||||
status: true
|
||||
})
|
||||
|
||||
const rules = {
|
||||
reactorName: [
|
||||
{ required: true, message: '请输入反应器名称', trigger: 'blur' },
|
||||
{ min: 2, max: 50, message: '长度在 2 到 50 个字符', trigger: 'blur' }
|
||||
],
|
||||
reactorType: [
|
||||
{ required: true, message: '请选择反应器类型', trigger: 'change' }
|
||||
],
|
||||
status: [
|
||||
{ required: true, message: '请选择状态', trigger: 'change' }
|
||||
]
|
||||
}
|
||||
|
||||
/** 获取反应器类型枚举列表 */
|
||||
const getReactorTypeOptions = async () => {
|
||||
try {
|
||||
const res = await new ReactorApi().getReactorTypeEnumList()
|
||||
reactorTypeOptions.value = res.data ?? []
|
||||
} catch (error) {
|
||||
console.error('获取反应器类型枚举列表失败:', error)
|
||||
}
|
||||
}
|
||||
|
||||
/** 打开弹窗 */
|
||||
const open = (row?: ReactorDto) => {
|
||||
visible.value = true
|
||||
if (row) {
|
||||
Object.assign(form, row)
|
||||
}
|
||||
}
|
||||
|
||||
/** 提交表单 */
|
||||
const submitForm = async () => {
|
||||
if (!formRef.value) return
|
||||
await formRef.value.validate(async (valid: boolean) => {
|
||||
if (valid) {
|
||||
try {
|
||||
const api = new ReactorApi()
|
||||
const res = form.id
|
||||
? await api.update(form)
|
||||
: await api.add(form)
|
||||
if (res.success) {
|
||||
ElMessage.success(form.id ? '修改成功' : '新增成功')
|
||||
visible.value = false
|
||||
emit('ok')
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(form.id ? '修改失败:' : '新增失败:', error)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/** 取消按钮 */
|
||||
const cancel = () => {
|
||||
visible.value = false
|
||||
reset()
|
||||
}
|
||||
|
||||
/** 重置表单 */
|
||||
const reset = () => {
|
||||
if (formRef.value) {
|
||||
formRef.value.resetFields()
|
||||
}
|
||||
Object.assign(form, {
|
||||
id: undefined,
|
||||
reactorName: '',
|
||||
reactorType: '',
|
||||
status: true
|
||||
})
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
getReactorTypeOptions()
|
||||
})
|
||||
|
||||
defineExpose({
|
||||
open
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.dialog-footer {
|
||||
text-align: right;
|
||||
}
|
||||
</style>
|
224
src/views/admin/uspsreactor/index.vue
Normal file
224
src/views/admin/uspsreactor/index.vue
Normal file
@ -0,0 +1,224 @@
|
||||
<template>
|
||||
<my-layout>
|
||||
<el-card class="my-query-box mt8" shadow="never" :body-style="{ paddingBottom: '0' }">
|
||||
<el-form :inline="true" label-width="auto" :label-position="'left'" @submit.stop.prevent>
|
||||
<el-form-item label="反应器名称" prop="reactorName">
|
||||
<el-input v-model="state.filter.keyWord" placeholder="请输入反应器名称" clearable @keyup.enter="handleQuery" />
|
||||
</el-form-item>
|
||||
<el-form-item label="反应器类型" prop="reactorType">
|
||||
<el-select v-model="state.filter.reactorType" placeholder="请选择反应器类型" clearable style="width: 200px">
|
||||
<el-option v-for="item in state.reactorTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态" prop="status">
|
||||
<el-select v-model="state.filter.status" placeholder="请选择状态" clearable style="width: 200px">
|
||||
<el-option label="启用" :value="true" />
|
||||
<el-option label="禁用" :value="false" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="开始时间">
|
||||
<el-date-picker v-model="state.filter.startTime" type="datetime" placeholder="选择开始时间"
|
||||
format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" style="width: 180px" />
|
||||
</el-form-item>
|
||||
<el-form-item label="结束时间">
|
||||
<el-date-picker v-model="state.filter.endTime" type="datetime" placeholder="选择结束时间"
|
||||
format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" style="width: 180px" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="ele-Search" @click="handleQuery">查询</el-button>
|
||||
<el-button v-auth="'api:admin:reactor:add'" type="primary" icon="ele-Plus" @click="handleAdd">新增</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
|
||||
<el-card class="my-fill mt8" shadow="never">
|
||||
<el-table v-loading="loading" :data="state.reactorList" row-key="id" style="width: 100%" border>
|
||||
<el-table-column prop="reactorName" label="反应器名称" min-width="120" show-overflow-tooltip />
|
||||
<el-table-column label="反应器类型" min-width="120" show-overflow-tooltip>
|
||||
<template #default="{ row }">
|
||||
{{ getReactorTypeName(row.reactorType) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="状态" width="100" align="center">
|
||||
<template #default="{ row }">
|
||||
<el-tag :type="row.status ? 'success' : 'danger'">
|
||||
{{ row.status ? '启用' : '禁用' }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="createdUserName" label="创建者" min-width="100" show-overflow-tooltip />
|
||||
<el-table-column prop="createdTime" label="创建时间" min-width="160" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="180" fixed="right" header-align="center" align="center">
|
||||
<template #default="{ row }">
|
||||
<el-button v-auth="'api:admin:reactor:update'" icon="ele-EditPen" size="small" text type="primary"
|
||||
@click="handleEdit(row)">编辑</el-button>
|
||||
<el-button v-auth="'api:admin:reactor:soft-delete'" icon="ele-Delete" size="small" text type="danger"
|
||||
@click="handleDelete(row)">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<div class="my-flex my-flex-end" style="margin-top: 10px">
|
||||
<el-pagination v-model:current-page="state.pageInput.currentPage" v-model:page-size="state.pageInput.pageSize"
|
||||
:total="state.total" :page-sizes="[10, 20, 50, 100]" size="small" background @size-change="handleSizeChange"
|
||||
@current-change="handleCurrentChange" layout="total, sizes, prev, pager, next, jumper" />
|
||||
</div>
|
||||
</el-card>
|
||||
|
||||
<reactor-form ref="formRef" :title="state.formTitle" @ok="getList" />
|
||||
</my-layout>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, onMounted, onBeforeMount } from 'vue'
|
||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||
import { ReactorApi } from '/@/api/admin/reactor'
|
||||
import eventBus from '/@/utils/mitt'
|
||||
import type {
|
||||
ReactorPageInput,
|
||||
ReactorDto,
|
||||
ReactorTypeEnumItem
|
||||
} from '/@/api/types/ReactorType'
|
||||
|
||||
import ReactorForm from './components/reactor-form.vue'
|
||||
|
||||
const loading = ref(false)
|
||||
const formRef = ref()
|
||||
|
||||
const state = reactive({
|
||||
loading: false,
|
||||
formTitle: '',
|
||||
total: 0,
|
||||
filter: {
|
||||
keyWord: "",
|
||||
reactorType: "",
|
||||
status: null,
|
||||
startTime: "",
|
||||
endTime: ""
|
||||
},
|
||||
pageInput: {
|
||||
currentPage: 1,
|
||||
pageSize: 20,
|
||||
} as ReactorPageInput,
|
||||
reactorList: [] as Array<ReactorDto>,
|
||||
reactorTypeOptions: [] as ReactorTypeEnumItem[]
|
||||
})
|
||||
|
||||
/** 查询列表 */
|
||||
const getList = async () => {
|
||||
loading.value = true
|
||||
state.pageInput.filter = state.filter
|
||||
try {
|
||||
const res = await new ReactorApi().getPage(state.pageInput)
|
||||
state.reactorList = res.data?.list || []
|
||||
state.total = res.data?.total || 0
|
||||
} catch (error) {
|
||||
console.error('获取列表失败:', error)
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
/** 获取反应器类型枚举列表 */
|
||||
const getReactorTypeOptions = async () => {
|
||||
try {
|
||||
const res = await new ReactorApi().getReactorTypeEnumList()
|
||||
state.reactorTypeOptions = res.data ?? []
|
||||
} catch (error) {
|
||||
console.error('获取反应器类型枚举列表失败:', error)
|
||||
}
|
||||
}
|
||||
|
||||
const getReactorTypeName = (reactorType: string) => {
|
||||
const item = state.reactorTypeOptions.find(item => item.value === Number(reactorType))
|
||||
return item?.label || ''
|
||||
}
|
||||
|
||||
/** 搜索按钮操作 */
|
||||
const handleQuery = () => {
|
||||
state.pageInput.currentPage = 1
|
||||
getList()
|
||||
}
|
||||
|
||||
/** 新增按钮操作 */
|
||||
const handleAdd = () => {
|
||||
state.formTitle = '新增反应器'
|
||||
formRef.value?.open()
|
||||
}
|
||||
|
||||
/** 修改按钮操作 */
|
||||
const handleEdit = (row: ReactorDto) => {
|
||||
state.formTitle = '编辑反应器'
|
||||
formRef.value?.open(row)
|
||||
}
|
||||
|
||||
/** 删除按钮操作 */
|
||||
const handleDelete = (row: ReactorDto) => {
|
||||
ElMessageBox.confirm('确认要删除该记录吗?', '警告', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then(async () => {
|
||||
try {
|
||||
const res = await new ReactorApi().softDelete({ id: row.id! })
|
||||
if (res.success) {
|
||||
ElMessage.success('删除成功')
|
||||
getList()
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('删除失败:', error)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/** 每页条数改变 */
|
||||
const handleSizeChange = (val: number) => {
|
||||
state.pageInput.pageSize = val
|
||||
getList()
|
||||
}
|
||||
|
||||
/** 当前页改变 */
|
||||
const handleCurrentChange = (val: number) => {
|
||||
state.pageInput.currentPage = val
|
||||
getList()
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
getReactorTypeOptions()
|
||||
getList()
|
||||
eventBus.on('refreshReactor', getList)
|
||||
})
|
||||
|
||||
onBeforeMount(() => {
|
||||
eventBus.off('refreshReactor')
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.my-query-box {
|
||||
:deep(.el-form-item) {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
}
|
||||
|
||||
.my-fill {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.my-flex {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.my-flex-end {
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.mt8 {
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.mb8 {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
</style>
|
Loading…
x
Reference in New Issue
Block a user