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

This commit is contained in:
tianyongbao
2025-10-24 20:41:11 +08:00
parent 3b13ee1708
commit 3b39f9f3f3
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

@@ -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>

View File

@@ -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>

View File

@@ -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>

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

@@ -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>

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>