feat:功能优化,设备报警信息、微信缓存用户,操作记录信息,代码提交。

This commit is contained in:
tianyongbao
2025-10-24 20:41:11 +08:00
parent 3b13ee1708
commit c4a73f1c93
30 changed files with 2264 additions and 233 deletions

View File

@@ -1,5 +1,5 @@
# 页面标题
VITE_APP_TITLE = RuoYi-Vue-Plus多租户管理系统
VITE_APP_TITLE = 水产养殖监测平台
# 生产环境配置
VITE_APP_ENV = 'production'

View File

@@ -0,0 +1,63 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { DeviceWarnCombineVO, DeviceWarnCombineForm, DeviceWarnCombineQuery } from '@/api/fishery/deviceWarnCombine/types';
/**
* 查询设备告警信息列表
* @param query
* @returns {*}
*/
export const listDeviceWarnCombine = (query?: DeviceWarnCombineQuery): AxiosPromise<DeviceWarnCombineVO[]> => {
return request({
url: '/fishery/deviceWarnCombine/list',
method: 'get',
params: query
});
};
/**
* 查询设备告警信息详细
* @param id
*/
export const getDeviceWarnCombine = (id: string | number): AxiosPromise<DeviceWarnCombineVO> => {
return request({
url: '/fishery/deviceWarnCombine/' + id,
method: 'get'
});
};
/**
* 新增设备告警信息
* @param data
*/
export const addDeviceWarnCombine = (data: DeviceWarnCombineForm) => {
return request({
url: '/fishery/deviceWarnCombine',
method: 'post',
data: data
});
};
/**
* 修改设备告警信息
* @param data
*/
export const updateDeviceWarnCombine = (data: DeviceWarnCombineForm) => {
return request({
url: '/fishery/deviceWarnCombine',
method: 'put',
data: data
});
};
/**
* 删除设备告警信息
* @param id
*/
export const delDeviceWarnCombine = (id: string | number | Array<string | number>) => {
return request({
url: '/fishery/deviceWarnCombine/' + id,
method: 'delete'
});
};

View File

@@ -0,0 +1,143 @@
export interface DeviceWarnCombineVO {
/**
* 主键id
*/
id: string | number;
/**
* 设备编号
*/
deviceSerialNum: string;
/**
* 设备类型
*/
deviceType: number;
/**
* 参数类型
*/
thresholdType: number;
/**
* 进展状态
*/
processStatus: number;
/**
* 故障类型
*/
warnType: number;
/**
* 告警总数量
*/
totalCount: number;
/**
* 处理人
*/
handlerName: string;
/**
* 处理时间
*/
processTime: string;
/**
* 创建时间
*/
createTime: string;
}
export interface DeviceWarnCombineForm extends BaseEntity {
/**
* 主键id
*/
id?: string | number;
/**
* 设备编号
*/
deviceSerialNum?: string;
/**
* 设备类型
*/
deviceType?: number;
/**
* 参数类型
*/
thresholdType?: number;
/**
* 进展状态
*/
processStatus?: number;
/**
* 故障类型
*/
warnType?: number;
/**
* 告警总数量
*/
totalCount?: number;
/**
* 备注
*/
remarkContent?: string;
/**
* 处理人
*/
handlerName?: string;
/**
* 处理时间
*/
processTime?: string;
/**
* 备注
*/
remark?: string;
}
export interface DeviceWarnCombineQuery extends PageQuery {
/**
* 设备编号
*/
deviceSerialNum?: string;
/**
* 设备类型
*/
deviceType?: number;
/**
* 参数类型
*/
thresholdType?: number;
/**
* 进展状态
*/
processStatus?: number;
/**
* 故障类型
*/
warnType?: number;
/**
* 日期范围参数
*/
params?: any;
}

View File

@@ -0,0 +1,63 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { DeviceWarnOneVO, DeviceWarnOneForm, DeviceWarnOneQuery } from '@/api/fishery/deviceWarnOne/types';
/**
* 查询设备报警明细列表
* @param query
* @returns {*}
*/
export const listDeviceWarnOne = (query?: DeviceWarnOneQuery): AxiosPromise<DeviceWarnOneVO[]> => {
return request({
url: '/fishery/deviceWarnOne/list',
method: 'get',
params: query
});
};
/**
* 查询设备报警明细详细
* @param id
*/
export const getDeviceWarnOne = (id: string | number): AxiosPromise<DeviceWarnOneVO> => {
return request({
url: '/fishery/deviceWarnOne/' + id,
method: 'get'
});
};
/**
* 新增设备报警明细
* @param data
*/
export const addDeviceWarnOne = (data: DeviceWarnOneForm) => {
return request({
url: '/fishery/deviceWarnOne',
method: 'post',
data: data
});
};
/**
* 修改设备报警明细
* @param data
*/
export const updateDeviceWarnOne = (data: DeviceWarnOneForm) => {
return request({
url: '/fishery/deviceWarnOne',
method: 'put',
data: data
});
};
/**
* 删除设备报警明细
* @param id
*/
export const delDeviceWarnOne = (id: string | number | Array<string | number>) => {
return request({
url: '/fishery/deviceWarnOne/' + id,
method: 'delete'
});
};

View File

@@ -0,0 +1,143 @@
export interface DeviceWarnOneVO {
/**
* 主键id
*/
id: string | number;
/**
* 报警主表id
*/
warnCombineId: string | number;
/**
* 用户id
*/
userId: string | number;
/**
* 告警最大值
*/
limitUpper: number;
/**
* 告警最小值
*/
limitLower: number;
/**
* 告警当前值
*/
curValue: number;
/**
* 进展状态
*/
processStatus: number;
/**
* 故障类型
*/
warnType: number;
/**
* 处理人
*/
handlerName: string;
/**
* 处理时间
*/
processTime: string;
}
export interface DeviceWarnOneForm extends BaseEntity {
/**
* 主键id
*/
id?: string | number;
/**
* 报警主表id
*/
warnCombineId?: string | number;
/**
* 用户id
*/
userId?: string | number;
/**
* 告警最大值
*/
limitUpper?: number;
/**
* 告警最小值
*/
limitLower?: number;
/**
* 告警当前值
*/
curValue?: number;
/**
* 进展状态
*/
processStatus?: number;
/**
* 故障类型
*/
warnType?: number;
/**
* 处理人
*/
handlerName?: string;
/**
* 处理时间
*/
processTime?: string;
/**
* 备注
*/
remark?: string;
}
export interface DeviceWarnOneQuery extends PageQuery {
/**
* 报警主表id
*/
warnCombineId?: string | number;
/**
* 用户id
*/
userId?: string | number;
/**
* 进展状态
*/
processStatus?: number;
/**
* 故障类型
*/
warnType?: number;
/**
* 处理人
*/
handlerName?: string;
/**
* 日期范围参数
*/
params?: any;
}

View File

@@ -0,0 +1,63 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { MessageOpRecordVO, MessageOpRecordForm, MessageOpRecordQuery } from '@/api/fishery/messageOpRecord/types';
/**
* 查询用户操作记录列表
* @param query
* @returns {*}
*/
export const listMessageOpRecord = (query?: MessageOpRecordQuery): AxiosPromise<MessageOpRecordVO[]> => {
return request({
url: '/fishery/messageOpRecord/list',
method: 'get',
params: query
});
};
/**
* 查询用户操作记录详细
* @param id
*/
export const getMessageOpRecord = (id: string | number): AxiosPromise<MessageOpRecordVO> => {
return request({
url: '/fishery/messageOpRecord/' + id,
method: 'get'
});
};
/**
* 新增用户操作记录
* @param data
*/
export const addMessageOpRecord = (data: MessageOpRecordForm) => {
return request({
url: '/fishery/messageOpRecord',
method: 'post',
data: data
});
};
/**
* 修改用户操作记录
* @param data
*/
export const updateMessageOpRecord = (data: MessageOpRecordForm) => {
return request({
url: '/fishery/messageOpRecord',
method: 'put',
data: data
});
};
/**
* 删除用户操作记录
* @param id
*/
export const delMessageOpRecord = (id: string | number | Array<string | number>) => {
return request({
url: '/fishery/messageOpRecord/' + id,
method: 'delete'
});
};

View File

@@ -0,0 +1,108 @@
export interface MessageOpRecordVO {
/**
* 主键id
*/
id: string | number;
/**
* 用户id
*/
userId: string | number;
/**
* 操作用户id
*/
opUserId: string | number;
/**
* 操作标题
*/
title: string;
/**
* 操作内容
*/
message: string;
/**
* 操作方式
*/
opType: number;
/**
* 备注
*/
remark: string;
}
export interface MessageOpRecordForm extends BaseEntity {
/**
* 主键id
*/
id?: string | number;
/**
* 用户id
*/
userId?: string | number;
/**
* 操作用户id
*/
opUserId?: string | number;
/**
* 操作标题
*/
title?: string;
/**
* 操作内容
*/
message?: string;
/**
* 操作方式
*/
opType?: number;
/**
* 备注
*/
remark?: string;
}
export interface MessageOpRecordQuery extends PageQuery {
/**
* 用户id
*/
userId?: string | number;
/**
* 操作用户id
*/
opUserId?: string | number;
/**
* 操作标题
*/
title?: string;
/**
* 操作内容
*/
message?: string;
/**
* 操作方式
*/
opType?: number;
/**
* 日期范围参数
*/
params?: any;
}

View File

@@ -0,0 +1,63 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { TecentUserCacheVO, TecentUserCacheForm, TecentUserCacheQuery } from '@/api/fishery/tecentUserCache/types';
/**
* 查询公众号用户缓存列表
* @param query
* @returns {*}
*/
export const listTecentUserCache = (query?: TecentUserCacheQuery): AxiosPromise<TecentUserCacheVO[]> => {
return request({
url: '/fishery/tecentUserCache/list',
method: 'get',
params: query
});
};
/**
* 查询公众号用户缓存详细
* @param id
*/
export const getTecentUserCache = (id: string | number): AxiosPromise<TecentUserCacheVO> => {
return request({
url: '/fishery/tecentUserCache/' + id,
method: 'get'
});
};
/**
* 新增公众号用户缓存
* @param data
*/
export const addTecentUserCache = (data: TecentUserCacheForm) => {
return request({
url: '/fishery/tecentUserCache',
method: 'post',
data: data
});
};
/**
* 修改公众号用户缓存
* @param data
*/
export const updateTecentUserCache = (data: TecentUserCacheForm) => {
return request({
url: '/fishery/tecentUserCache',
method: 'put',
data: data
});
};
/**
* 删除公众号用户缓存
* @param id
*/
export const delTecentUserCache = (id: string | number | Array<string | number>) => {
return request({
url: '/fishery/tecentUserCache/' + id,
method: 'delete'
});
};

View File

@@ -0,0 +1,53 @@
export interface TecentUserCacheVO {
/**
* 主键id
*/
id: string | number;
/**
* openId
*/
openId: string | number;
/**
* unionId
*/
unionId: string | number;
/**
* 备注
*/
remark: string;
}
export interface TecentUserCacheForm extends BaseEntity {
/**
* 主键id
*/
id?: string | number;
/**
* openId
*/
openId?: string | number;
/**
* unionId
*/
unionId?: string | number;
/**
* 备注
*/
remark?: string;
}
export interface TecentUserCacheQuery extends PageQuery {
/**
* 日期范围参数
*/
params?: any;
}

View File

@@ -19,6 +19,7 @@ declare module 'vue' {
ElButton: typeof import('element-plus/es')['ElButton']
ElCard: typeof import('element-plus/es')['ElCard']
ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup']
ElCol: typeof import('element-plus/es')['ElCol']
ElColorPicker: typeof import('element-plus/es')['ElColorPicker']
ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
@@ -35,6 +36,7 @@ declare module 'vue' {
ElForm: typeof import('element-plus/es')['ElForm']
ElFormItem: typeof import('element-plus/es')['ElFormItem']
ElIcon: typeof import('element-plus/es')['ElIcon']
ElImage: typeof import('element-plus/es')['ElImage']
ElInput: typeof import('element-plus/es')['ElInput']
ElInputNumber: typeof import('element-plus/es')['ElInputNumber']
ElLink: typeof import('element-plus/es')['ElLink']
@@ -55,6 +57,7 @@ declare module 'vue' {
ElTabPane: typeof import('element-plus/es')['ElTabPane']
ElTabs: typeof import('element-plus/es')['ElTabs']
ElTag: typeof import('element-plus/es')['ElTag']
ElText: typeof import('element-plus/es')['ElText']
ElTooltip: typeof import('element-plus/es')['ElTooltip']
ElTree: typeof import('element-plus/es')['ElTree']
ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect']

View File

@@ -64,7 +64,7 @@
<el-table-column label="区县" align="center" prop="district" /> -->
<!-- <el-table-column label="展示标题" align="center" prop="title" /> -->
<el-table-column label="创建时间" align="center" prop="createTime" />
<el-table-column label="修改时间" align="center" prop="updateTime" />
<el-table-column label="更新时间" align="center" prop="updateTime" />
<el-table-column label="操作" align="center" fixed="right" width="240" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="子账号" placement="top">

View File

@@ -86,10 +86,10 @@
</el-select>
</el-form-item>
<el-form-item label="设备编号" prop="serialNum">
<el-input
:value="selectedDevice ? `${selectedDevice.serialNum} (${selectedDevice.deviceName})` : ''"
placeholder="请选择设备"
readonly
<el-input
:value="selectedDevice ? `${selectedDevice.serialNum} (${selectedDevice.deviceName})` : ''"
placeholder="请选择设备"
readonly
@click="openDeviceSelect"
style="cursor: pointer;"
:disabled="!form.deviceType"
@@ -100,10 +100,10 @@
</el-input>
</el-form-item>
<el-form-item label="用户" prop="userId">
<el-input
:value="selectedUser ? `${selectedUser.userName} (${selectedUser.mobilePhone})` : ''"
placeholder="请选择用户"
readonly
<el-input
:value="selectedUser ? `${selectedUser.userName} (${selectedUser.mobilePhone})` : ''"
placeholder="请选择用户"
readonly
@click="openUserSelect"
style="cursor: pointer;"
>
@@ -122,7 +122,7 @@
<el-input v-model="form.valueSaturability" placeholder="请输入饱和度" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
@@ -132,42 +132,42 @@
</div>
</template>
</el-dialog>
<!-- 设备选择对话框 -->
<el-dialog title="选择设备" v-model="deviceSelectVisible" width="1200px" append-to-body>
<!-- 搜索条件 -->
<el-form :model="deviceQueryParams" :inline="true" class="mb-4">
<el-form-item label="用户信息">
<el-input
v-model="deviceQueryParams.params.userKeyword"
placeholder="请输入用户名或手机号"
clearable
<el-input
v-model="deviceQueryParams.params.userKeyword"
placeholder="请输入用户名或手机号"
clearable
style="width: 200px"
@keyup.enter="handleDeviceQuery"
/>
</el-form-item>
<el-form-item label="设备编号">
<el-input
v-model="deviceQueryParams.serialNum"
placeholder="请输入设备编号"
clearable
<el-input
v-model="deviceQueryParams.serialNum"
placeholder="请输入设备编号"
clearable
style="width: 180px"
@keyup.enter="handleDeviceQuery"
/>
</el-form-item>
<el-form-item label="设备名称">
<el-input
v-model="deviceQueryParams.deviceName"
placeholder="请输入设备名称"
clearable
<el-input
v-model="deviceQueryParams.deviceName"
placeholder="请输入设备名称"
clearable
style="width: 180px"
@keyup.enter="handleDeviceQuery"
/>
</el-form-item>
<el-form-item label="设备类型">
<el-select
v-model="deviceQueryParams.deviceType"
placeholder="请选择设备类型"
<el-select
v-model="deviceQueryParams.deviceType"
placeholder="请选择设备类型"
disabled
style="width: 150px"
>
@@ -184,10 +184,10 @@
<el-button icon="Refresh" @click="resetDeviceQuery">重置</el-button>
</el-form-item>
</el-form>
<!-- 设备表格 -->
<el-table
:data="deviceList"
<el-table
:data="deviceList"
highlight-current-row
height="400px"
border
@@ -213,9 +213,9 @@
</el-table-column>
<el-table-column label="操作" align="center" width="100">
<template #default="scope">
<el-button
type="primary"
size="small"
<el-button
type="primary"
size="small"
@click="handleDeviceSelect(scope.row)"
>
选择
@@ -223,42 +223,42 @@
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<pagination
v-show="deviceTotal > 0"
:total="deviceTotal"
v-model:page="deviceQueryParams.pageNum"
v-model:limit="deviceQueryParams.pageSize"
<pagination
v-show="deviceTotal > 0"
:total="deviceTotal"
v-model:page="deviceQueryParams.pageNum"
v-model:limit="deviceQueryParams.pageSize"
@pagination="handleDevicePaginationChange"
class="mt-4"
/>
<template #footer>
<div class="dialog-footer">
<el-button @click="cancelDeviceSelect"> </el-button>
</div>
</template>
</el-dialog>
<!-- 用户选择对话框 -->
<el-dialog title="选择用户" v-model="userSelectVisible" width="900px" append-to-body>
<!-- 搜索条件 -->
<el-form :model="userQueryParams" :inline="true" class="mb-4">
<el-form-item label="用户名">
<el-input
v-model="userQueryParams.userName"
placeholder="请输入用户名"
clearable
<el-input
v-model="userQueryParams.userName"
placeholder="请输入用户名"
clearable
style="width: 180px"
@keyup.enter="handleUserQuery"
/>
</el-form-item>
<el-form-item label="手机号">
<el-input
v-model="userQueryParams.mobilePhone"
placeholder="请输入手机号"
clearable
<el-input
v-model="userQueryParams.mobilePhone"
placeholder="请输入手机号"
clearable
style="width: 180px"
@keyup.enter="handleUserQuery"
/>
@@ -268,10 +268,10 @@
<el-button icon="Refresh" @click="resetUserQuery">重置</el-button>
</el-form-item>
</el-form>
<!-- 用户表格 -->
<el-table
:data="aquUserList"
<el-table
:data="aquUserList"
highlight-current-row
height="400px"
border
@@ -283,9 +283,9 @@
<el-table-column label="区县" align="center" prop="district" />
<el-table-column label="操作" align="center" width="100">
<template #default="scope">
<el-button
type="primary"
size="small"
<el-button
type="primary"
size="small"
@click="handleUserSelect(scope.row)"
>
选择
@@ -293,17 +293,17 @@
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<pagination
v-show="userTotal > 0"
:total="userTotal"
v-model:page="userQueryParams.pageNum"
v-model:limit="userQueryParams.pageSize"
<pagination
v-show="userTotal > 0"
:total="userTotal"
v-model:page="userQueryParams.pageNum"
v-model:limit="userQueryParams.pageSize"
@pagination="handleUserPaginationChange"
class="mt-4"
/>
<template #footer>
<div class="dialog-footer">
<el-button @click="cancelUserSelect"> </el-button>
@@ -636,7 +636,7 @@ const handleUpdate = async (row?: DeviceCorrectRecordVO) => {
const _id = row?.id || ids.value[0]
const res = await getDeviceCorrectRecord(_id);
Object.assign(form.value, res.data);
// 回显用户信息
if (form.value.userId) {
try {
@@ -657,7 +657,7 @@ const handleUpdate = async (row?: DeviceCorrectRecordVO) => {
} else {
selectedUser.value = null;
}
// 回显设备信息
if (form.value.serialNum) {
try {
@@ -680,7 +680,7 @@ const handleUpdate = async (row?: DeviceCorrectRecordVO) => {
} else {
selectedDevice.value = null;
}
dialog.visible = true;
dialog.title = "修改设备校准记录";
}

View File

@@ -72,10 +72,10 @@
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="deviceErrorCodeFormRef" :model="form" :rules="rules" label-width="100px">
<el-form-item label="设备" prop="deviceId">
<el-input
:value="selectedDevice ? `${selectedDevice.serialNum} (${selectedDevice.deviceName})` : ''"
placeholder="请选择设备"
readonly
<el-input
:value="selectedDevice ? `${selectedDevice.serialNum} (${selectedDevice.deviceName})` : ''"
placeholder="请选择设备"
readonly
@click="openDeviceSelect"
style="cursor: pointer;"
>
@@ -87,10 +87,10 @@
<el-form-item label="开关序号" prop="switchIndex">
<el-select v-model="form.switchIndex" placeholder="请选择开关序号" clearable :disabled="!form.deviceId">
<el-option label="设备自身" :value="0" />
<el-option
v-for="switchItem in deviceSwitchList"
:key="switchItem.index"
:label="`${switchItem.index} - ${switchItem.switchName}`"
<el-option
v-for="switchItem in deviceSwitchList"
:key="switchItem.index"
:label="`${switchItem.index} - ${switchItem.switchName}`"
:value="switchItem.index"
/>
</el-select>
@@ -99,7 +99,7 @@
<el-input v-model="form.errorCode" placeholder="请输入故障码" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
@@ -109,42 +109,42 @@
</div>
</template>
</el-dialog>
<!-- 设备选择对话框 -->
<el-dialog title="选择设备" v-model="deviceSelectVisible" width="1200px" append-to-body>
<!-- 搜索条件 -->
<el-form :model="deviceQueryParams" :inline="true" class="mb-4">
<el-form-item label="用户信息">
<el-input
v-model="deviceQueryParams.params.userKeyword"
placeholder="请输入用户名或手机号"
clearable
<el-input
v-model="deviceQueryParams.params.userKeyword"
placeholder="请输入用户名或手机号"
clearable
style="width: 200px"
@keyup.enter="handleDeviceQuery"
/>
</el-form-item>
<el-form-item label="设备编号">
<el-input
v-model="deviceQueryParams.serialNum"
placeholder="请输入设备编号"
clearable
<el-input
v-model="deviceQueryParams.serialNum"
placeholder="请输入设备编号"
clearable
style="width: 180px"
@keyup.enter="handleDeviceQuery"
/>
</el-form-item>
<!-- <el-form-item label="设备名称">
<el-input
v-model="deviceQueryParams.deviceName"
placeholder="请输入设备名称"
clearable
<el-input
v-model="deviceQueryParams.deviceName"
placeholder="请输入设备名称"
clearable
style="width: 180px"
@keyup.enter="handleDeviceQuery"
/>
</el-form-item> -->
<el-form-item label="设备类型">
<el-select
v-model="deviceQueryParams.deviceType"
placeholder="请选择设备类型"
<el-select
v-model="deviceQueryParams.deviceType"
placeholder="请选择设备类型"
clearable
style="width: 150px"
>
@@ -161,10 +161,10 @@
<el-button icon="Refresh" @click="resetDeviceQuery">重置</el-button>
</el-form-item>
</el-form>
<!-- 设备表格 -->
<el-table
:data="deviceList"
<el-table
:data="deviceList"
highlight-current-row
height="400px"
border
@@ -190,9 +190,9 @@
</el-table-column>
<el-table-column label="操作" align="center" width="100">
<template #default="scope">
<el-button
type="primary"
size="small"
<el-button
type="primary"
size="small"
@click="handleDeviceSelect(scope.row)"
>
选择
@@ -200,17 +200,17 @@
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<pagination
v-show="deviceTotal > 0"
:total="deviceTotal"
v-model:page="deviceQueryParams.pageNum"
v-model:limit="deviceQueryParams.pageSize"
<pagination
v-show="deviceTotal > 0"
:total="deviceTotal"
v-model:page="deviceQueryParams.pageNum"
v-model:limit="deviceQueryParams.pageSize"
@pagination="handleDevicePaginationChange"
class="mt-4"
/>
<template #footer>
<div class="dialog-footer">
<el-button @click="cancelDeviceSelect"> </el-button>
@@ -446,7 +446,7 @@ const handleUpdate = async (row?: DeviceErrorCodeVO) => {
const _id = row?.id || ids.value[0]
const res = await getDeviceErrorCode(_id);
Object.assign(form.value, res.data);
// 回显设备信息
if (form.value.deviceId) {
try {
@@ -472,7 +472,7 @@ const handleUpdate = async (row?: DeviceErrorCodeVO) => {
selectedDevice.value = null;
deviceSwitchList.value = [];
}
dialog.visible = true;
dialog.title = "修改设备故障码";
}

View File

@@ -62,7 +62,7 @@
</template>
</el-table-column>
<el-table-column label="额定电流设置" align="center" prop="rateElectricValue" />
<el-table-column label="电流告警开关" align="center" prop="electricWarnOpen">
<template #default="scope">
<dict-tag :options="open_close" :value="scope.row.electricWarnOpen"/>
@@ -75,7 +75,7 @@
</el-table-column>
<el-table-column label="上次操作开关时间" align="center" prop="lastTurnTime" width="160"> </el-table-column>
<el-table-column label="定时控制数量" align="center" prop="timingCtrlCount" width="110"/>
<el-table-column label="操作" align="center" fixed="right" width="160" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="定时控制" placement="top">
@@ -97,10 +97,10 @@
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="deviceSwitchFormRef" :model="form" :rules="rules" label-width="120px">
<el-form-item label="设备" prop="deviceId">
<el-input
:value="selectedDevice ? `${selectedDevice.deviceName} (${selectedDevice.serialNum})` : ''"
placeholder="请选择设备"
readonly
<el-input
:value="selectedDevice ? `${selectedDevice.deviceName} (${selectedDevice.serialNum})` : ''"
placeholder="请选择设备"
readonly
@click="openDeviceSelect"
style="cursor: pointer;"
>
@@ -127,10 +127,10 @@
</el-select>
</el-form-item>
<el-form-item label="塘口" prop="pondId">
<el-input
:value="selectedPondName"
placeholder="请选择设备(塘口将自动关联)"
readonly
<el-input
:value="selectedPondName"
placeholder="请选择设备(塘口将自动关联)"
readonly
disabled
/>
</el-form-item>
@@ -148,7 +148,7 @@
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
@@ -158,42 +158,42 @@
</div>
</template>
</el-dialog>
<!-- 设备选择对话框 -->
<el-dialog title="选择设备" v-model="deviceSelectVisible" width="1200px" append-to-body>
<!-- 搜索条件 -->
<el-form :model="deviceQueryParams" :inline="true" class="mb-4">
<el-form-item label="用户信息">
<el-input
v-model="deviceQueryParams.params.userKeyword"
placeholder="请输入用户名或手机号"
clearable
<el-input
v-model="deviceQueryParams.params.userKeyword"
placeholder="请输入用户名或手机号"
clearable
style="width: 200px"
@keyup.enter="handleDeviceQuery"
/>
</el-form-item>
<el-form-item label="设备编号">
<el-input
v-model="deviceQueryParams.serialNum"
placeholder="请输入设备编号"
clearable
<el-input
v-model="deviceQueryParams.serialNum"
placeholder="请输入设备编号"
clearable
style="width: 180px"
@keyup.enter="handleDeviceQuery"
/>
</el-form-item>
<el-form-item label="设备名称">
<el-input
v-model="deviceQueryParams.deviceName"
placeholder="请输入设备名称"
clearable
<el-input
v-model="deviceQueryParams.deviceName"
placeholder="请输入设备名称"
clearable
style="width: 180px"
@keyup.enter="handleDeviceQuery"
/>
</el-form-item>
<el-form-item label="设备类型">
<el-select
v-model="deviceQueryParams.deviceType"
placeholder="请选择设备类型"
<el-select
v-model="deviceQueryParams.deviceType"
placeholder="请选择设备类型"
disabled
style="width: 150px"
>
@@ -210,10 +210,10 @@
<el-button icon="Refresh" @click="resetDeviceQuery">重置</el-button>
</el-form-item>
</el-form>
<!-- 设备表格 -->
<el-table
:data="deviceList"
<el-table
:data="deviceList"
highlight-current-row
height="400px"
border
@@ -240,9 +240,9 @@
</el-table-column>
<el-table-column label="操作" align="center" width="100">
<template #default="scope">
<el-button
type="primary"
size="small"
<el-button
type="primary"
size="small"
@click="handleDeviceSelect(scope.row)"
>
选择
@@ -250,17 +250,17 @@
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<pagination
v-show="deviceTotal > 0"
:total="deviceTotal"
v-model:page="deviceQueryParams.pageNum"
v-model:limit="deviceQueryParams.pageSize"
<pagination
v-show="deviceTotal > 0"
:total="deviceTotal"
v-model:page="deviceQueryParams.pageNum"
v-model:limit="deviceQueryParams.pageSize"
@pagination="handleDevicePaginationChange"
class="mt-4"
/>
<template #footer>
<div class="dialog-footer">
<el-button @click="cancelDeviceSelect"> </el-button>
@@ -268,16 +268,16 @@
</template>
</el-dialog>
<!-- 定时控制对话框 -->
<el-dialog
:title="`定时控制 - ${currentSwitch?.switchName || ''} (序号:${currentSwitch?.index || ''})`"
v-model="timingCtrlDialogVisible"
width="800px"
<el-dialog
:title="`定时控制 - ${currentSwitch?.switchName || ''} (序号:${currentSwitch?.index || ''})`"
v-model="timingCtrlDialogVisible"
width="800px"
append-to-body
@close="closeTimingCtrlDialog"
>
<el-table
v-loading="timingCtrlLoading"
:data="timingCtrlList"
<el-table
v-loading="timingCtrlLoading"
:data="timingCtrlList"
border
height="400px"
>
@@ -294,7 +294,7 @@
</template>
</el-table-column>
</el-table>
<template #footer>
<div class="dialog-footer">
<el-button @click="closeTimingCtrlDialog"> </el-button>
@@ -480,7 +480,7 @@ const handleUpdate = async (row?: DeviceSwitchVO) => {
const _id = row?.id || ids.value[0]
const res = await getDeviceSwitch(_id);
Object.assign(form.value, res.data);
// 回显设备信息
if (form.value.deviceId) {
try {
@@ -510,7 +510,7 @@ const handleUpdate = async (row?: DeviceSwitchVO) => {
selectedDevice.value = null;
selectedPondName.value = '';
}
dialog.visible = true;
dialog.title = "修改测控一体机开关";
}

View File

@@ -49,7 +49,7 @@
<el-table-column label="最大值" align="center" prop="limitUpper" />
<el-table-column label="最小值" align="center" prop="limitLower" />
<el-table-column label="创建时间" align="center" prop="createTime" />
<el-table-column label="修改时间" align="center" prop="updateTime" />
<el-table-column label="更新时间" align="center" prop="updateTime" />
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">

View File

@@ -0,0 +1,521 @@
<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="设备编号" prop="deviceSerialNum">
<el-input v-model="queryParams.deviceSerialNum" placeholder="请输入设备编号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="设备类型" prop="deviceType">
<el-select v-model="queryParams.deviceType" placeholder="请选择设备类型" clearable >
<el-option v-for="dict in aqu_device_type" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<el-form-item label="参数类型" prop="thresholdType">
<el-select v-model="queryParams.thresholdType" placeholder="请选择参数类型" clearable >
<el-option v-for="dict in threshold_type" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<el-form-item label="进展状态" prop="processStatus">
<el-select v-model="queryParams.processStatus" placeholder="请选择进展状态" clearable >
<el-option v-for="dict in process_status" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<el-form-item label="故障类型" prop="warnType">
<el-select v-model="queryParams.warnType" placeholder="请选择故障类型" clearable >
<el-option v-for="dict in risk_type" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<!-- <el-col :span="1.5">-->
<!-- <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['fishery:deviceWarnCombine:add']">新增</el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="success" plain icon="Edit" :disabled="single" @click="handleProcess()" v-hasPermi="['fishery:deviceWarnCombine:edit']">处理</el-button>-->
<!-- </el-col>-->
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['fishery:deviceWarnCombine:remove']">删除</el-button>
</el-col>
<!-- <el-col :span="1.5">-->
<!-- <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['fishery:deviceWarnCombine:export']">导出</el-button>-->
<!-- </el-col>-->
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" border :data="deviceWarnCombineList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="设备编号" align="center" prop="deviceSerialNum" />
<el-table-column label="设备类型" align="center" prop="deviceType">
<template #default="scope">
<dict-tag :options="aqu_device_type" :value="scope.row.deviceType"/>
</template>
</el-table-column>
<el-table-column label="参数类型" align="center" prop="thresholdType">
<template #default="scope">
<dict-tag :options="threshold_type" :value="scope.row.thresholdType"/>
</template>
</el-table-column>
<el-table-column label="进展状态" align="center" prop="processStatus">
<template #default="scope">
<dict-tag :options="process_status" :value="scope.row.processStatus"/>
</template>
</el-table-column>
<el-table-column label="故障类型" align="center" prop="warnType">
<template #default="scope">
<dict-tag :options="risk_type" :value="scope.row.warnType"/>
</template>
</el-table-column>
<el-table-column label="告警总数量" align="center" prop="totalCount" />
<el-table-column label="处理人" align="center" prop="handlerName" />
<el-table-column label="处理时间" align="center" prop="processTime" width="160">
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updateTime" width="160">
</el-table-column>
<el-table-column label="操作" align="center" fixed="right" width="150" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="报警明细" placement="top">
<el-button link type="primary" icon="Document" @click="handleViewDetails(scope.row)" v-hasPermi="['fishery:deviceWarnOne:list']"></el-button>
</el-tooltip>
<el-tooltip content="批量处理" placement="top">
<el-button link type="primary" icon="Edit" @click="handleProcess(scope.row)" v-hasPermi="['fishery:deviceWarnCombine:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['fishery:deviceWarnCombine:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改设备告警信息对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="deviceWarnCombineFormRef" :model="form" :rules="rules" label-width="100px">
<el-form-item label="进展状态" prop="processStatus">
<el-select v-model="form.processStatus" placeholder="请选择进展状态">
<el-option
v-for="dict in process_status"
:key="dict.value"
:label="dict.label"
:value="parseInt(dict.value)"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="故障类型" prop="warnType">
<el-select v-model="form.warnType" placeholder="请选择故障类型">
<el-option
v-for="dict in risk_type"
:key="dict.value"
:label="dict.label"
:value="parseInt(dict.value)"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remarkContent">
<el-input v-model="form.remarkContent" type="textarea" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
<!-- 报警明细对话框 -->
<el-dialog title="报警明细" v-model="detailDialog.visible" width="1200px" append-to-body>
<el-table v-loading="detailDialog.loading" border :data="detailList" max-height="500">
<el-table-column label="设备编号" align="center" prop="deviceSerialNum" width="150"/>
<el-table-column label="设备类型" align="center" prop="deviceType" width="100">
<template #default="scope">
<dict-tag :options="aqu_device_type" :value="scope.row.deviceType"/>
</template>
</el-table-column>
<el-table-column label="参数类型" align="center" prop="thresholdType">
<template #default="scope">
<dict-tag :options="threshold_type" :value="scope.row.thresholdType"/>
</template>
</el-table-column>
<el-table-column label="告警最大值" align="center" prop="limitUpper" />
<el-table-column label="告警最小值" align="center" prop="limitLower" />
<el-table-column label="告警当前值" align="center" prop="curValue" />
<el-table-column label="进展状态" align="center" prop="processStatus">
<template #default="scope">
<dict-tag :options="process_status" :value="scope.row.processStatus"/>
</template>
</el-table-column>
<el-table-column label="故障类型" align="center" prop="warnType">
<template #default="scope">
<dict-tag :options="risk_type" :value="scope.row.warnType"/>
</template>
</el-table-column>
<el-table-column label="处理人" align="center" prop="handlerName" />
<el-table-column label="处理时间" align="center" prop="processTime" width="160" />
<el-table-column label="操作" align="center" fixed="right" width="60">
<template #default="scope">
<el-tooltip content="处理" placement="top">
<el-button link type="primary" icon="Edit" @click="handleProcessDetail(scope.row)" v-hasPermi="['fishery:deviceWarnOne:edit']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination
v-show="detailTotal > 0"
:total="detailTotal"
v-model:page="detailQueryParams.pageNum"
v-model:limit="detailQueryParams.pageSize"
@pagination="getDetailList"
/>
<template #footer>
<div class="dialog-footer">
<el-button @click="detailDialog.visible = false"> </el-button>
</div>
</template>
</el-dialog>
<!-- 明细处理对话框 -->
<el-dialog :title="detailProcessDialog.title" v-model="detailProcessDialog.visible" width="500px" append-to-body>
<el-form ref="detailFormRef" :model="detailForm" :rules="detailRules" label-width="100px">
<el-form-item label="进展状态" prop="processStatus">
<el-select v-model="detailForm.processStatus" placeholder="请选择进展状态">
<el-option
v-for="dict in process_status"
:key="dict.value"
:label="dict.label"
:value="parseInt(dict.value)"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="故障类型" prop="warnType">
<el-select v-model="detailForm.warnType" placeholder="请选择故障类型">
<el-option
v-for="dict in risk_type"
:key="dict.value"
:label="dict.label"
:value="parseInt(dict.value)"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="detailForm.remark" type="textarea" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="detailButtonLoading" type="primary" @click="submitDetailForm"> </el-button>
<el-button @click="cancelDetailProcess"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="DeviceWarnCombine" lang="ts">
import { listDeviceWarnCombine, getDeviceWarnCombine, delDeviceWarnCombine, addDeviceWarnCombine, updateDeviceWarnCombine } from '@/api/fishery/deviceWarnCombine';
import { DeviceWarnCombineVO, DeviceWarnCombineQuery, DeviceWarnCombineForm } from '@/api/fishery/deviceWarnCombine/types';
import { listDeviceWarnOne, getDeviceWarnOne, updateDeviceWarnOne } from '@/api/fishery/deviceWarnOne';
import { DeviceWarnOneVO, DeviceWarnOneForm } from '@/api/fishery/deviceWarnOne/types';
import { useUserStore } from '@/store/modules/user';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const userStore = useUserStore();
const { threshold_type, process_status, risk_type, aqu_device_type } = toRefs<any>(proxy?.useDict('threshold_type', 'process_status', 'risk_type', 'aqu_device_type'));
const deviceWarnCombineList = ref<DeviceWarnCombineVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const deviceWarnCombineFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const detailDialog = reactive({
visible: false,
loading: false
});
const detailList = ref<DeviceWarnOneVO[]>([]);
const detailTotal = ref(0);
const detailQueryParams = reactive({
pageNum: 1,
pageSize: 10,
warnCombineId: undefined as string | number | undefined
});
// 明细处理对话框
const detailProcessDialog = reactive<DialogOption>({
visible: false,
title: ''
});
const detailFormRef = ref<ElFormInstance>();
const detailButtonLoading = ref(false);
const initDetailFormData: DeviceWarnOneForm = {
id: undefined,
processStatus: undefined,
warnType: undefined,
remark: undefined
}
const detailForm = ref<DeviceWarnOneForm>({...initDetailFormData});
const detailRules = ref({
processStatus: [
{ required: true, message: "进展状态不能为空", trigger: "change" }
],
warnType: [
{ required: true, message: "故障类型不能为空", trigger: "change" }
]
});
const initFormData: DeviceWarnCombineForm = {
id: undefined,
deviceSerialNum: undefined,
deviceType: undefined,
thresholdType: undefined,
processStatus: undefined,
warnType: undefined,
totalCount: undefined,
remarkContent: undefined,
handlerName: undefined,
processTime: undefined,
remark: undefined
}
const data = reactive<PageData<DeviceWarnCombineForm, DeviceWarnCombineQuery>>({
form: {...initFormData},
queryParams: {
pageNum: 1,
pageSize: 10,
deviceSerialNum: undefined,
deviceType: undefined,
thresholdType: undefined,
processStatus: undefined,
warnType: undefined,
params: {
}
},
rules: {
deviceSerialNum: [
{ required: true, message: "设备编号不能为空", trigger: "blur" }
],
deviceType: [
{ required: true, message: "设备类型不能为空", trigger: "change" }
],
thresholdType: [
{ required: true, message: "参数类型不能为空", trigger: "change" }
],
processStatus: [
{ required: true, message: "进展状态不能为空", trigger: "change" }
],
warnType: [
{ required: true, message: "故障类型不能为空", trigger: "change" }
]
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询设备告警信息列表 */
const getList = async () => {
loading.value = true;
const res = await listDeviceWarnCombine(queryParams.value);
deviceWarnCombineList.value = res.rows;
total.value = res.total;
loading.value = false;
}
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
}
/** 表单重置 */
const reset = () => {
form.value = {...initFormData};
deviceWarnCombineFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: DeviceWarnCombineVO[]) => {
ids.value = selection.map(item => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = "添加设备告警信息";
}
/** 修改按钮操作 */
const handleUpdate = async (row?: DeviceWarnCombineVO) => {
reset();
const _id = row?.id || ids.value[0]
const res = await getDeviceWarnCombine(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = "修改设备告警信息";
}
/** 处理按钮操作 */
const handleProcess = async (row?: DeviceWarnCombineVO) => {
reset();
const _id = row?.id || ids.value[0]
const res = await getDeviceWarnCombine(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = "处理设备报警信息";
}
/** 查看报警明细 */
const handleViewDetails = async (row: DeviceWarnCombineVO) => {
detailQueryParams.warnCombineId = row.id;
detailQueryParams.pageNum = 1;
detailDialog.visible = true;
await getDetailList();
}
/** 获取明细列表 */
const getDetailList = async () => {
detailDialog.loading = true;
try {
const res = await listDeviceWarnOne(detailQueryParams);
detailList.value = res.rows;
detailTotal.value = res.total;
} finally {
detailDialog.loading = false;
}
}
/** 处理明细按钮操作 */
const handleProcessDetail = async (row: DeviceWarnOneVO) => {
detailForm.value = {...initDetailFormData};
const res = await getDeviceWarnOne(row.id);
Object.assign(detailForm.value, res.data);
detailProcessDialog.visible = true;
detailProcessDialog.title = "处理报警明细";
}
/** 取消明细处理 */
const cancelDetailProcess = () => {
detailForm.value = {...initDetailFormData};
detailFormRef.value?.resetFields();
detailProcessDialog.visible = false;
}
/** 提交明细处理 */
const submitDetailForm = () => {
detailFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
try {
await proxy?.$modal.confirm('确认要处理此报警明细吗?');
} catch {
return;
}
detailButtonLoading.value = true;
try {
// 设置处理人和处理时间
detailForm.value.handlerName = userStore.nickname;
detailForm.value.processTime = new Date().toISOString().slice(0, 19).replace('T', ' ');
await updateDeviceWarnOne(detailForm.value);
proxy?.$modal.msgSuccess("处理成功");
detailProcessDialog.visible = false;
await getDetailList(); // 刷新明细列表
} finally {
detailButtonLoading.value = false;
}
}
});
}
/** 提交按钮 */
const submitForm = () => {
deviceWarnCombineFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
// 如果是处理操作,给出二次确认提示
if (form.value.id) {
try {
await proxy?.$modal.confirm('是否确认批量处理该报警下的所有明细数据?');
} catch {
return; // 用户取消操作
}
}
buttonLoading.value = true;
if (form.value.id) {
// 设置处理人和处理时间
form.value.handlerName = userStore.nickname;
form.value.processTime = new Date().toISOString().slice(0, 19).replace('T', ' ');
await updateDeviceWarnCombine(form.value).finally(() => buttonLoading.value = false);
} else {
await addDeviceWarnCombine(form.value).finally(() => buttonLoading.value = false);
}
proxy?.$modal.msgSuccess("操作成功");
dialog.visible = false;
await getList();
}
});
}
/** 删除按钮操作 */
const handleDelete = async (row?: DeviceWarnCombineVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除该设备报警及其所有明细的数据?').finally(() => loading.value = false);
await delDeviceWarnCombine(_ids);
proxy?.$modal.msgSuccess("删除成功");
await getList();
}
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download('fishery/deviceWarnCombine/export', {
...queryParams.value
}, `deviceWarnCombine_${new Date().getTime()}.xlsx`)
}
onMounted(() => {
getList();
});
</script>

View File

@@ -0,0 +1,310 @@
<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="设备编号" prop="params.deviceSerialNum">
<el-input v-model="queryParams.params.deviceSerialNum" placeholder="请输入设备编号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="设备类型" prop="params.deviceType">
<el-select v-model="queryParams.params.deviceType" placeholder="请选择设备类型" clearable >
<el-option v-for="dict in aqu_device_type" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<el-form-item label="参数类型" prop="thresholdType">
<el-select v-model="queryParams.params.thresholdType" placeholder="请选择参数类型" clearable >
<el-option v-for="dict in threshold_type" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<el-form-item label="进展状态" prop="processStatus">
<el-select v-model="queryParams.processStatus" placeholder="请选择进展状态" clearable >
<el-option v-for="dict in process_status" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<el-form-item label="故障类型" prop="warnType">
<el-select v-model="queryParams.warnType" placeholder="请选择故障类型" clearable >
<el-option v-for="dict in risk_type" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<!-- <el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['fishery:deviceWarnOne:add']">新增</el-button>
</el-col> -->
<!-- <el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleProcess()" v-hasPermi="['fishery:deviceWarnOne:edit']">处理</el-button>
</el-col> -->
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['fishery:deviceWarnOne:remove']">删除</el-button>
</el-col>
<!-- <el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['fishery:deviceWarnOne:export']">导出</el-button>
</el-col> -->
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" border :data="deviceWarnOneList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="设备编号" align="center" prop="deviceSerialNum" width="150"/>
<el-table-column label="设备类型" align="center" prop="deviceType">
<template #default="scope">
<dict-tag :options="aqu_device_type" :value="scope.row.deviceType"/>
</template>
</el-table-column>
<el-table-column label="参数类型" align="center" prop="thresholdType">
<template #default="scope">
<dict-tag :options="threshold_type" :value="scope.row.thresholdType"/>
</template>
</el-table-column>
<el-table-column label="告警最大值" align="center" prop="limitUpper" />
<el-table-column label="告警最小值" align="center" prop="limitLower" />
<el-table-column label="告警当前值" align="center" prop="curValue" />
<el-table-column label="进展状态" align="center" prop="processStatus">
<template #default="scope">
<dict-tag :options="process_status" :value="scope.row.processStatus"/>
</template>
</el-table-column>
<el-table-column label="故障类型" align="center" prop="warnType">
<template #default="scope">
<dict-tag :options="risk_type" :value="scope.row.warnType"/>
</template>
</el-table-column>
<el-table-column label="处理人" align="center" prop="handlerName" />
<el-table-column label="处理时间" align="center" prop="processTime" width="160">
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updateTime" width="160"></el-table-column>
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="处理" placement="top">
<el-button link type="primary" icon="Edit" @click="handleProcess(scope.row)" v-hasPermi="['fishery:deviceWarnOne:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['fishery:deviceWarnOne:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改设备报警明细对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="deviceWarnOneFormRef" :model="form" :rules="rules" label-width="100px">
<el-form-item label="进展状态" prop="processStatus">
<el-select v-model="form.processStatus" placeholder="请选择进展状态">
<el-option
v-for="dict in process_status"
:key="dict.value"
:label="dict.label"
:value="parseInt(dict.value)"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="故障类型" prop="warnType">
<el-select v-model="form.warnType" placeholder="请选择故障类型">
<el-option
v-for="dict in risk_type"
:key="dict.value"
:label="dict.label"
:value="parseInt(dict.value)"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="DeviceWarnOne" lang="ts">
import { listDeviceWarnOne, getDeviceWarnOne, delDeviceWarnOne, addDeviceWarnOne, updateDeviceWarnOne } from '@/api/fishery/deviceWarnOne';
import { DeviceWarnOneVO, DeviceWarnOneQuery, DeviceWarnOneForm } from '@/api/fishery/deviceWarnOne/types';
import { useUserStore } from '@/store/modules/user';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const userStore = useUserStore();
const { threshold_type, process_status, risk_type, aqu_device_type } = toRefs<any>(proxy?.useDict('threshold_type', 'process_status', 'risk_type', 'aqu_device_type'));
const deviceWarnOneList = ref<DeviceWarnOneVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const deviceWarnOneFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: DeviceWarnOneForm = {
id: undefined,
warnCombineId: undefined,
userId: undefined,
limitUpper: undefined,
limitLower: undefined,
curValue: undefined,
processStatus: undefined,
warnType: undefined,
handlerName: undefined,
processTime: undefined,
remark: undefined
}
const data = reactive<PageData<DeviceWarnOneForm, DeviceWarnOneQuery>>({
form: {...initFormData},
queryParams: {
pageNum: 1,
pageSize: 10,
warnCombineId: undefined,
userId: undefined,
processStatus: undefined,
warnType: undefined,
handlerName: undefined,
params: {
}
},
rules: {
processStatus: [
{ required: true, message: "进展状态不能为空", trigger: "change" }
],
warnType: [
{ required: true, message: "故障类型不能为空", trigger: "change" }
]
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询设备报警明细列表 */
const getList = async () => {
loading.value = true;
const res = await listDeviceWarnOne(queryParams.value);
deviceWarnOneList.value = res.rows;
total.value = res.total;
loading.value = false;
}
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
}
/** 表单重置 */
const reset = () => {
form.value = {...initFormData};
deviceWarnOneFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: DeviceWarnOneVO[]) => {
ids.value = selection.map(item => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = "添加设备报警明细";
}
/** 修改按钮操作 */
const handleUpdate = async (row?: DeviceWarnOneVO) => {
reset();
const _id = row?.id || ids.value[0]
const res = await getDeviceWarnOne(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = "修改设备报警明细";
}
/** 处理按钮操作 */
const handleProcess = async (row?: DeviceWarnOneVO) => {
reset();
const _id = row?.id || ids.value[0]
const res = await getDeviceWarnOne(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = "处理设备报警明细";
}
/** 提交按钮 */
const submitForm = () => {
deviceWarnOneFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
// 设置处理人和处理时间
form.value.handlerName = userStore.nickname;
form.value.processTime = new Date().toISOString().slice(0, 19).replace('T', ' ');
await updateDeviceWarnOne(form.value).finally(() => buttonLoading.value = false);
} else {
await addDeviceWarnOne(form.value).finally(() => buttonLoading.value = false);
}
proxy?.$modal.msgSuccess("操作成功");
dialog.visible = false;
await getList();
}
});
}
/** 删除按钮操作 */
const handleDelete = async (row?: DeviceWarnOneVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除设备报警明细编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
await delDeviceWarnOne(_ids);
proxy?.$modal.msgSuccess("删除成功");
await getList();
}
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download('fishery/deviceWarnOne/export', {
...queryParams.value
}, `deviceWarnOne_${new Date().getTime()}.xlsx`)
}
onMounted(() => {
getList();
});
</script>

View File

@@ -150,7 +150,7 @@
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>

View File

@@ -0,0 +1,274 @@
<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="用户信息" prop="params.userKeyword">
<el-input v-model="queryParams.params.userKeyword" placeholder="请输入用户名或手机号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="操作标题" prop="title">
<el-input v-model="queryParams.title" placeholder="请输入操作标题" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="操作内容" prop="message">
<el-input v-model="queryParams.message" placeholder="请输入操作内容" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="操作方式" prop="opType">
<el-select v-model="queryParams.opType" placeholder="请选择操作方式" clearable >
<el-option v-for="dict in op_type" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<!-- <el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['fishery:messageOpRecord:add']">新增</el-button>
</el-col> -->
<!-- <el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['fishery:messageOpRecord:edit']">修改</el-button>
</el-col> -->
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['fishery:messageOpRecord:remove']">删除</el-button>
</el-col>
<!-- <el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['fishery:messageOpRecord:export']">导出</el-button>
</el-col> -->
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" border :data="messageOpRecordList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="用户名" align="center" prop="userName" fixed="left" width="150"/>
<el-table-column label="手机号" align="center" prop="userPhonenumber" fixed="left" width="150"/>
<el-table-column label="操作标题" align="center" prop="title" width="150"/>
<el-table-column label="操作方式" align="center" prop="opType" width="150">
<template #default="scope">
<dict-tag :options="op_type" :value="scope.row.opType"/>
</template>
</el-table-column>
<el-table-column label="操作内容" align="center" prop="message" />
<el-table-column label="操作时间" align="center" prop="createTime" width="180"/>
<el-table-column label="操作" align="center" fixed="right" width="100" class-name="small-padding fixed-width">
<template #default="scope">
<!-- <el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['fishery:messageOpRecord:edit']"></el-button>
</el-tooltip> -->
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['fishery:messageOpRecord:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改用户操作记录对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="messageOpRecordFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="用户id" prop="userId">
<el-input v-model="form.userId" placeholder="请输入用户id" />
</el-form-item>
<el-form-item label="操作用户id" prop="opUserId">
<el-input v-model="form.opUserId" placeholder="请输入操作用户id" />
</el-form-item>
<el-form-item label="操作标题" prop="title">
<el-input v-model="form.title" placeholder="请输入操作标题" />
</el-form-item>
<el-form-item label="操作内容" prop="message">
<el-input v-model="form.message" placeholder="请输入操作内容" />
</el-form-item>
<el-form-item label="操作方式" prop="opType">
<el-select v-model="form.opType" placeholder="请选择操作方式">
<el-option
v-for="dict in op_type"
:key="dict.value"
:label="dict.label"
:value="parseInt(dict.value)"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="MessageOpRecord" lang="ts">
import { listMessageOpRecord, getMessageOpRecord, delMessageOpRecord, addMessageOpRecord, updateMessageOpRecord } from '@/api/fishery/messageOpRecord';
import { MessageOpRecordVO, MessageOpRecordQuery, MessageOpRecordForm } from '@/api/fishery/messageOpRecord/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { op_type } = toRefs<any>(proxy?.useDict('op_type'));
const messageOpRecordList = ref<MessageOpRecordVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const messageOpRecordFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: MessageOpRecordForm = {
id: undefined,
userId: undefined,
opUserId: undefined,
title: undefined,
message: undefined,
opType: undefined,
remark: undefined
}
const data = reactive<PageData<MessageOpRecordForm, MessageOpRecordQuery>>({
form: {...initFormData},
queryParams: {
pageNum: 1,
pageSize: 10,
userId: undefined,
opUserId: undefined,
title: undefined,
message: undefined,
opType: undefined,
params: {
}
},
rules: {
id: [
{ required: true, message: "主键id不能为空", trigger: "blur" }
],
userId: [
{ required: true, message: "用户id不能为空", trigger: "blur" }
],
title: [
{ required: true, message: "操作标题不能为空", trigger: "blur" }
],
message: [
{ required: true, message: "操作内容不能为空", trigger: "blur" }
],
opType: [
{ required: true, message: "操作方式不能为空", trigger: "change" }
],
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询用户操作记录列表 */
const getList = async () => {
loading.value = true;
const res = await listMessageOpRecord(queryParams.value);
messageOpRecordList.value = res.rows;
total.value = res.total;
loading.value = false;
}
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
}
/** 表单重置 */
const reset = () => {
form.value = {...initFormData};
messageOpRecordFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: MessageOpRecordVO[]) => {
ids.value = selection.map(item => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = "添加用户操作记录";
}
/** 修改按钮操作 */
const handleUpdate = async (row?: MessageOpRecordVO) => {
reset();
const _id = row?.id || ids.value[0]
const res = await getMessageOpRecord(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = "修改用户操作记录";
}
/** 提交按钮 */
const submitForm = () => {
messageOpRecordFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateMessageOpRecord(form.value).finally(() => buttonLoading.value = false);
} else {
await addMessageOpRecord(form.value).finally(() => buttonLoading.value = false);
}
proxy?.$modal.msgSuccess("操作成功");
dialog.visible = false;
await getList();
}
});
}
/** 删除按钮操作 */
const handleDelete = async (row?: MessageOpRecordVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除用户操作记录编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
await delMessageOpRecord(_ids);
proxy?.$modal.msgSuccess("删除成功");
await getList();
}
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download('fishery/messageOpRecord/export', {
...queryParams.value
}, `messageOpRecord_${new Date().getTime()}.xlsx`)
}
onMounted(() => {
getList();
});
</script>

View File

@@ -97,7 +97,7 @@
<!-- 添加或修改设备充值记录对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="payDeviceFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="设备类型" prop="deviceType">
<el-select v-model="form.deviceType" placeholder="请选择设备类型">
<el-option
@@ -108,12 +108,12 @@
></el-option>
</el-select>
</el-form-item>
<el-form-item label="设备编号" prop="serialNum">
<el-input
:value="selectedDevice ? `${selectedDevice.serialNum} (${selectedDevice.deviceName})` : ''"
placeholder="请选择设备"
readonly
<el-input
:value="selectedDevice ? `${selectedDevice.serialNum} (${selectedDevice.deviceName})` : ''"
placeholder="请选择设备"
readonly
@click="openDeviceSelect"
style="cursor: pointer;"
:disabled="!form.deviceType"
@@ -124,10 +124,10 @@
</el-input>
</el-form-item>
<el-form-item label="用户" prop="userId">
<el-input
:value="selectedUser ? `${selectedUser.userName} (${selectedUser.mobilePhone})` : ''"
placeholder="请选择用户"
readonly
<el-input
:value="selectedUser ? `${selectedUser.userName} (${selectedUser.mobilePhone})` : ''"
placeholder="请选择用户"
readonly
@click="openUserSelect"
style="cursor: pointer;"
>
@@ -174,7 +174,7 @@
</el-select>
</el-form-item> -->
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
@@ -184,42 +184,42 @@
</div>
</template>
</el-dialog>
<!-- 设备选择对话框 -->
<el-dialog title="选择设备" v-model="deviceSelectVisible" width="1200px" append-to-body>
<!-- 搜索条件 -->
<el-form :model="deviceQueryParams" :inline="true" class="mb-4">
<el-form-item label="用户信息">
<el-input
v-model="deviceQueryParams.params.userKeyword"
placeholder="请输入用户名或手机号"
clearable
<el-input
v-model="deviceQueryParams.params.userKeyword"
placeholder="请输入用户名或手机号"
clearable
style="width: 200px"
@keyup.enter="handleDeviceQuery"
/>
</el-form-item>
<el-form-item label="设备编号">
<el-input
v-model="deviceQueryParams.serialNum"
placeholder="请输入设备编号"
clearable
<el-input
v-model="deviceQueryParams.serialNum"
placeholder="请输入设备编号"
clearable
style="width: 180px"
@keyup.enter="handleDeviceQuery"
/>
</el-form-item>
<el-form-item label="设备名称">
<el-input
v-model="deviceQueryParams.deviceName"
placeholder="请输入设备名称"
clearable
<el-input
v-model="deviceQueryParams.deviceName"
placeholder="请输入设备名称"
clearable
style="width: 180px"
@keyup.enter="handleDeviceQuery"
/>
</el-form-item>
<el-form-item label="设备类型">
<el-select
v-model="deviceQueryParams.deviceType"
placeholder="请选择设备类型"
<el-select
v-model="deviceQueryParams.deviceType"
placeholder="请选择设备类型"
disabled
style="width: 150px"
>
@@ -236,10 +236,10 @@
<el-button icon="Refresh" @click="resetDeviceQuery">重置</el-button>
</el-form-item>
</el-form>
<!-- 设备表格 -->
<el-table
:data="deviceList"
<el-table
:data="deviceList"
highlight-current-row
height="400px"
border
@@ -266,9 +266,9 @@
</el-table-column>
<el-table-column label="操作" align="center" width="100">
<template #default="scope">
<el-button
type="primary"
size="small"
<el-button
type="primary"
size="small"
@click="handleDeviceSelect(scope.row)"
>
选择
@@ -276,42 +276,42 @@
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<pagination
v-show="deviceTotal > 0"
:total="deviceTotal"
v-model:page="deviceQueryParams.pageNum"
v-model:limit="deviceQueryParams.pageSize"
<pagination
v-show="deviceTotal > 0"
:total="deviceTotal"
v-model:page="deviceQueryParams.pageNum"
v-model:limit="deviceQueryParams.pageSize"
@pagination="handleDevicePaginationChange"
class="mt-4"
/>
<template #footer>
<div class="dialog-footer">
<el-button @click="cancelDeviceSelect"> </el-button>
</div>
</template>
</el-dialog>
<!-- 用户选择对话框 -->
<el-dialog title="选择用户" v-model="userSelectVisible" width="900px" append-to-body>
<!-- 搜索条件 -->
<el-form :model="userQueryParams" :inline="true" class="mb-4">
<el-form-item label="用户名">
<el-input
v-model="userQueryParams.userName"
placeholder="请输入用户名"
clearable
<el-input
v-model="userQueryParams.userName"
placeholder="请输入用户名"
clearable
style="width: 180px"
@keyup.enter="handleUserQuery"
/>
</el-form-item>
<el-form-item label="手机号">
<el-input
v-model="userQueryParams.mobilePhone"
placeholder="请输入手机号"
clearable
<el-input
v-model="userQueryParams.mobilePhone"
placeholder="请输入手机号"
clearable
style="width: 180px"
@keyup.enter="handleUserQuery"
/>
@@ -321,10 +321,10 @@
<el-button icon="Refresh" @click="resetUserQuery">重置</el-button>
</el-form-item>
</el-form>
<!-- 用户表格 -->
<el-table
:data="aquUserList"
<el-table
:data="aquUserList"
highlight-current-row
height="400px"
border
@@ -336,9 +336,9 @@
<el-table-column label="区县" align="center" prop="district" />
<el-table-column label="操作" align="center" width="100">
<template #default="scope">
<el-button
type="primary"
size="small"
<el-button
type="primary"
size="small"
@click="handleUserSelect(scope.row)"
>
选择
@@ -346,24 +346,24 @@
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<pagination
v-show="userTotal > 0"
:total="userTotal"
v-model:page="userQueryParams.pageNum"
v-model:limit="userQueryParams.pageSize"
<pagination
v-show="userTotal > 0"
:total="userTotal"
v-model:page="userQueryParams.pageNum"
v-model:limit="userQueryParams.pageSize"
@pagination="handleUserPaginationChange"
class="mt-4"
/>
<template #footer>
<div class="dialog-footer">
<el-button @click="cancelUserSelect"> </el-button>
</div>
</template>
</el-dialog>
<!-- 订单详情对话框 -->
<el-dialog title="订单详情" v-model="orderDetailVisible" width="800px" append-to-body>
<el-descriptions v-if="orderDetail" :column="2" border>
@@ -583,7 +583,7 @@ const handleUpdate = async (row?: PayDeviceVO) => {
const _id = row?.id || ids.value[0]
const res = await getPayDevice(_id);
Object.assign(form.value, res.data);
// 回显用户信息
if (form.value.userId) {
try {
@@ -604,7 +604,7 @@ const handleUpdate = async (row?: PayDeviceVO) => {
} else {
selectedUser.value = null;
}
// 回显设备信息
if (form.value.serialNum) {
try {
@@ -627,7 +627,7 @@ const handleUpdate = async (row?: PayDeviceVO) => {
} else {
selectedDevice.value = null;
}
dialog.visible = true;
dialog.title = "修改设备充值记录";
}
@@ -815,7 +815,7 @@ const handleViewOrder = async (row: PayDeviceVO) => {
proxy?.$modal.msgWarning('该记录没有关联订单');
return;
}
try {
const res = await getPayOrder(row.orderId);
orderDetail.value = res.data;

View File

@@ -72,7 +72,7 @@
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" width="160"/>
<el-table-column label="修改时间" align="center" prop="updateTime" width="160"/>
<el-table-column label="更新时间" align="center" prop="updateTime" width="160"/>
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">

View File

@@ -0,0 +1,224 @@
<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<!-- <el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card> -->
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<!-- <el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['fishery:tecentUserCache:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['fishery:tecentUserCache:edit']">修改</el-button>
</el-col> -->
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['fishery:tecentUserCache:remove']">删除</el-button>
</el-col>
<!-- <el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['fishery:tecentUserCache:export']">导出</el-button>
</el-col> -->
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" border :data="tecentUserCacheList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column label="主键id" align="center" prop="id" v-if="true" /> -->
<el-table-column label="openId" align="center" prop="openId" />
<el-table-column label="unionId" align="center" prop="unionId" />
<el-table-column label="创建时间" align="center" prop="createTime" width="180"/>
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
<template #default="scope">
<!-- <el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['fishery:tecentUserCache:edit']"></el-button>
</el-tooltip> -->
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['fishery:tecentUserCache:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改公众号用户缓存对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="tecentUserCacheFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="openId" prop="openId">
<el-input v-model="form.openId" placeholder="请输入openId" />
</el-form-item>
<el-form-item label="unionId" prop="unionId">
<el-input v-model="form.unionId" placeholder="请输入unionId" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="TecentUserCache" lang="ts">
import { listTecentUserCache, getTecentUserCache, delTecentUserCache, addTecentUserCache, updateTecentUserCache } from '@/api/fishery/tecentUserCache';
import { TecentUserCacheVO, TecentUserCacheQuery, TecentUserCacheForm } from '@/api/fishery/tecentUserCache/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const tecentUserCacheList = ref<TecentUserCacheVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const tecentUserCacheFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: TecentUserCacheForm = {
id: undefined,
openId: undefined,
unionId: undefined,
remark: undefined
}
const data = reactive<PageData<TecentUserCacheForm, TecentUserCacheQuery>>({
form: {...initFormData},
queryParams: {
pageNum: 1,
pageSize: 10,
params: {
}
},
rules: {
id: [
{ required: true, message: "主键id不能为空", trigger: "blur" }
],
openId: [
{ required: true, message: "openId不能为空", trigger: "blur" }
],
unionId: [
{ required: true, message: "unionId不能为空", trigger: "blur" }
],
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询公众号用户缓存列表 */
const getList = async () => {
loading.value = true;
const res = await listTecentUserCache(queryParams.value);
tecentUserCacheList.value = res.rows;
total.value = res.total;
loading.value = false;
}
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
}
/** 表单重置 */
const reset = () => {
form.value = {...initFormData};
tecentUserCacheFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: TecentUserCacheVO[]) => {
ids.value = selection.map(item => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = "添加公众号用户缓存";
}
/** 修改按钮操作 */
const handleUpdate = async (row?: TecentUserCacheVO) => {
reset();
const _id = row?.id || ids.value[0]
const res = await getTecentUserCache(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = "修改公众号用户缓存";
}
/** 提交按钮 */
const submitForm = () => {
tecentUserCacheFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateTecentUserCache(form.value).finally(() => buttonLoading.value = false);
} else {
await addTecentUserCache(form.value).finally(() => buttonLoading.value = false);
}
proxy?.$modal.msgSuccess("操作成功");
dialog.visible = false;
await getList();
}
});
}
/** 删除按钮操作 */
const handleDelete = async (row?: TecentUserCacheVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除公众号用户缓存编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
await delTecentUserCache(_ids);
proxy?.$modal.msgSuccess("删除成功");
await getList();
}
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download('fishery/tecentUserCache/export', {
...queryParams.value
}, `tecentUserCache_${new Date().getTime()}.xlsx`)
}
onMounted(() => {
getList();
});
</script>

View File

@@ -68,7 +68,7 @@
<el-input v-model="form.childUserId" placeholder="请输入子账号id" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>

View File

@@ -109,7 +109,7 @@
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>

View File

@@ -112,7 +112,7 @@
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注"></el-input>
</el-form-item>
</el-form>
<template #footer>

View File

@@ -94,7 +94,7 @@
<el-input v-model="form.dictType" placeholder="请输入字典类型" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注"></el-input>
</el-form-item>
</el-form>
<template #footer>

View File

@@ -128,7 +128,7 @@
<el-input v-model="form.region" placeholder="请输入域" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>

View File

@@ -154,7 +154,7 @@
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>

View File

@@ -139,7 +139,7 @@
></el-tree>
</el-form-item>
<el-form-item label="备注">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注"></el-input>
</el-form-item>
</el-form>
<template #footer>

View File

@@ -239,7 +239,7 @@
<el-row>
<el-col :span="24">
<el-form-item label="备注">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注"></el-input>
</el-form-item>
</el-col>
</el-row>