|
@@ -26,9 +26,14 @@
|
|
|
<!-- 标签选择 -->
|
|
<!-- 标签选择 -->
|
|
|
<div style="width: 100%;display: flex;justify-content: center;align-items: center;">
|
|
<div style="width: 100%;display: flex;justify-content: center;align-items: center;">
|
|
|
<el-form :inline="true" @submit.stop.prevent>
|
|
<el-form :inline="true" @submit.stop.prevent>
|
|
|
- <el-form-item label="标签:" style="width: 100%;" prop="labelId">
|
|
|
|
|
- <el-select v-model="Data.Filter.labelId" placeholder="请选择标签">
|
|
|
|
|
- <el-option v-for="item in Data.labelList" :key="item.id" :label="item.name" :value="item.id.toString()" />
|
|
|
|
|
|
|
+ <el-form-item label="标签:" style="width: 100%;" prop="tag">
|
|
|
|
|
+ <el-select v-model="Data.Filter.tag" placeholder="请选择标签">
|
|
|
|
|
+ <el-option
|
|
|
|
|
+ v-for="item in Data.labelList"
|
|
|
|
|
+ :key="item.id"
|
|
|
|
|
+ :label="item.name"
|
|
|
|
|
+ :value="item.code"
|
|
|
|
|
+ />
|
|
|
</el-select>
|
|
</el-select>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-form>
|
|
</el-form>
|
|
@@ -54,7 +59,6 @@
|
|
|
<template #default="{ node, data }">
|
|
<template #default="{ node, data }">
|
|
|
<div class="tree-node-content">
|
|
<div class="tree-node-content">
|
|
|
<span :class="{'role-node': data.isRole}">{{ data.label }}</span>
|
|
<span :class="{'role-node': data.isRole}">{{ data.label }}</span>
|
|
|
- <!-- 角色节点显示展开/折叠按钮 -->
|
|
|
|
|
<el-button
|
|
<el-button
|
|
|
v-if="data.isRole"
|
|
v-if="data.isRole"
|
|
|
type="text"
|
|
type="text"
|
|
@@ -62,7 +66,6 @@
|
|
|
@click.stop="toggleRoleExpand(node)"
|
|
@click.stop="toggleRoleExpand(node)"
|
|
|
class="expand-btn"
|
|
class="expand-btn"
|
|
|
>
|
|
>
|
|
|
- <!-- {{ node.expanded ? '折叠' : '展开' }} -->
|
|
|
|
|
</el-button>
|
|
</el-button>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
@@ -71,7 +74,7 @@
|
|
|
</el-form>
|
|
</el-form>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- <!-- 新增:报警等级筛选下拉框 -->
|
|
|
|
|
|
|
+ <!-- 报警等级筛选下拉框 -->
|
|
|
<div style="width: 100%;display: flex;justify-content: center;align-items: center;">
|
|
<div style="width: 100%;display: flex;justify-content: center;align-items: center;">
|
|
|
<el-form :inline="true" @submit.stop.prevent>
|
|
<el-form :inline="true" @submit.stop.prevent>
|
|
|
<el-form-item label="报警等级:" style="width: 100%;" prop="alarmLevel">
|
|
<el-form-item label="报警等级:" style="width: 100%;" prop="alarmLevel">
|
|
@@ -85,7 +88,7 @@
|
|
|
v-for="item in alarmLevelDict"
|
|
v-for="item in alarmLevelDict"
|
|
|
:key="item.id"
|
|
:key="item.id"
|
|
|
:label="`${item.name}(${item.value})`"
|
|
:label="`${item.name}(${item.value})`"
|
|
|
- :value="item.value"
|
|
|
|
|
|
|
+ :value="item.code"
|
|
|
></el-option>
|
|
></el-option>
|
|
|
</el-select>
|
|
</el-select>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
@@ -125,17 +128,17 @@
|
|
|
</el-form>
|
|
</el-form>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- <!-- 推送方式选择 -->
|
|
|
|
|
|
|
+ <!-- 推送方式选择(包含总开关isPush) -->
|
|
|
<div style="width: 100%;display: flex;justify-content: center;align-items: center;">
|
|
<div style="width: 100%;display: flex;justify-content: center;align-items: center;">
|
|
|
<el-form :inline="true" @submit.stop.prevent>
|
|
<el-form :inline="true" @submit.stop.prevent>
|
|
|
<el-form-item label="推送方式:" style="width: 100%;" prop="pushMethod">
|
|
<el-form-item label="推送方式:" style="width: 100%;" prop="pushMethod">
|
|
|
- <!-- 推送总开关 -->
|
|
|
|
|
|
|
+ <!-- 推送总开关(对应isPush参数) -->
|
|
|
<el-row style="width: 100%;margin-bottom: 10px;">
|
|
<el-row style="width: 100%;margin-bottom: 10px;">
|
|
|
- 是否推送<el-switch v-model="Data.pushEnabled" style="margin-left: 3%;" />
|
|
|
|
|
|
|
+ 是否推送<el-switch v-model="Data.isPush" style="margin-left: 3%;" />
|
|
|
</el-row>
|
|
</el-row>
|
|
|
|
|
|
|
|
<!-- 微信和邮箱开关(仅在总开关打开时显示) -->
|
|
<!-- 微信和邮箱开关(仅在总开关打开时显示) -->
|
|
|
- <template v-if="Data.pushEnabled">
|
|
|
|
|
|
|
+ <template v-if="Data.isPush">
|
|
|
<el-row style="width: 100%;">
|
|
<el-row style="width: 100%;">
|
|
|
微信公众号<el-switch v-model="Data.radioValue1" style="margin-left: 3%;" @change="radioChange" />
|
|
微信公众号<el-switch v-model="Data.radioValue1" style="margin-left: 3%;" @change="radioChange" />
|
|
|
</el-row>
|
|
</el-row>
|
|
@@ -148,7 +151,7 @@
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<!-- 模板选择(受总开关控制) -->
|
|
<!-- 模板选择(受总开关控制) -->
|
|
|
- <div style="width: 100%;display: flex;justify-content: center;align-items: center;" v-if="Data.pushEnabled">
|
|
|
|
|
|
|
+ <div style="width: 100%;display: flex;justify-content: center;align-items: center;" v-if="Data.isPush">
|
|
|
<el-form :inline="true" @submit.stop.prevent>
|
|
<el-form :inline="true" @submit.stop.prevent>
|
|
|
<el-form-item label="模  板:" style="width: 50%;" prop="mode1">
|
|
<el-form-item label="模  板:" style="width: 50%;" prop="mode1">
|
|
|
<el-select v-model="Data.mode1" class="m-2" placeholder="微信模板" v-if="Data.radioValue1" @change="modeChange">
|
|
<el-select v-model="Data.mode1" class="m-2" placeholder="微信模板" v-if="Data.radioValue1" @change="modeChange">
|
|
@@ -339,7 +342,7 @@
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script setup lang="ts" name="AlarmRuleDialog">
|
|
<script setup lang="ts" name="AlarmRuleDialog">
|
|
|
-import { onMounted, reactive, ref, nextTick, watch, computed } from 'vue';
|
|
|
|
|
|
|
+import { onMounted, reactive, ref, nextTick, computed, watch } from 'vue';
|
|
|
import { alarmRluesFilterModel } from "/@/api/admin/AlarmService/alarmRulesDto";
|
|
import { alarmRluesFilterModel } from "/@/api/admin/AlarmService/alarmRulesDto";
|
|
|
import { alarmRulesApi, stationApi } from "/@/api/admin/AlarmService/alarmRulesApi";
|
|
import { alarmRulesApi, stationApi } from "/@/api/admin/AlarmService/alarmRulesApi";
|
|
|
import { RoleApi } from '/@/api/admin/Role'
|
|
import { RoleApi } from '/@/api/admin/Role'
|
|
@@ -355,7 +358,7 @@ import { PageInputDictGetPageDto } from "/@/api/admin/data-contracts";
|
|
|
interface DictItem {
|
|
interface DictItem {
|
|
|
id: number;
|
|
id: number;
|
|
|
name: string;
|
|
name: string;
|
|
|
- code: string;
|
|
|
|
|
|
|
+ code: string; // 数据字典编码
|
|
|
value: string;
|
|
value: string;
|
|
|
enabled: boolean;
|
|
enabled: boolean;
|
|
|
sort: number;
|
|
sort: number;
|
|
@@ -403,12 +406,12 @@ const Data = reactive({
|
|
|
isShowDialog: false,
|
|
isShowDialog: false,
|
|
|
showAlarmConditions: false,
|
|
showAlarmConditions: false,
|
|
|
showRepairConditions: false,
|
|
showRepairConditions: false,
|
|
|
- pushEnabled: false, // 推送总开关状态
|
|
|
|
|
|
|
+ isPush: false, // 是否推送(总开关,对应isPush参数)
|
|
|
stationList: [] as StationItem[],
|
|
stationList: [] as StationItem[],
|
|
|
Filter: {
|
|
Filter: {
|
|
|
ruleName: '',
|
|
ruleName: '',
|
|
|
roleMappingId: [] as number[],
|
|
roleMappingId: [] as number[],
|
|
|
- labelId: "",
|
|
|
|
|
|
|
+ tag: "", // 标签参数(存储编码code)
|
|
|
remark: '',
|
|
remark: '',
|
|
|
pushMethod: '',
|
|
pushMethod: '',
|
|
|
pushTemplateMappingID: [] as number[],
|
|
pushTemplateMappingID: [] as number[],
|
|
@@ -430,17 +433,17 @@ const Data = reactive({
|
|
|
condition: "",
|
|
condition: "",
|
|
|
mode1: '',
|
|
mode1: '',
|
|
|
id: 0,
|
|
id: 0,
|
|
|
- alarmLevel: undefined, // 新增:报警等级筛选值
|
|
|
|
|
|
|
+ alarmLevel: undefined, // 报警等级参数(存储编码code)
|
|
|
} as unknown as alarmRluesFilterModel & { alarmLevel?: string },
|
|
} as unknown as alarmRluesFilterModel & { alarmLevel?: string },
|
|
|
roleList: [] as any,
|
|
roleList: [] as any,
|
|
|
- labelList: [] as any,
|
|
|
|
|
|
|
+ labelList: [] as Array<{ id: string; name: string; code: string }>, // 标签列表(包含code)
|
|
|
userList: [] as UserListItem[],
|
|
userList: [] as UserListItem[],
|
|
|
- radioValue1: false,
|
|
|
|
|
- radioValue2: false,
|
|
|
|
|
- mode1: '',
|
|
|
|
|
- mode2: '',
|
|
|
|
|
- condition: [{ Left: '', inthe: '', Right: '' }],
|
|
|
|
|
- condition2: [{ Right: '', Left: '' }],
|
|
|
|
|
|
|
+ radioValue1: false, // 微信推送开关
|
|
|
|
|
+ radioValue2: false, // 邮箱推送开关
|
|
|
|
|
+ mode1: '', // 微信模板ID
|
|
|
|
|
+ mode2: '', // 邮箱模板ID
|
|
|
|
|
+ condition: [{ Left: '', inthe: '', Right: '' }], // 报警条件
|
|
|
|
|
+ condition2: [{ Left: '', Right: '' }], // 维修条件
|
|
|
alarmEquipment: ["安全装置","编码器","计控主板","监控微处理器","智能型控制阀","油气回收控制板","显示屏","计量器","加油机","油枪"],
|
|
alarmEquipment: ["安全装置","编码器","计控主板","监控微处理器","智能型控制阀","油气回收控制板","显示屏","计量器","加油机","油枪"],
|
|
|
alarmType: ["加油机离线","通信异常","非法部件","厂商不符","绑定错误","监控微处理器报警","安全装置报警","加油机报警","检定"],
|
|
alarmType: ["加油机离线","通信异常","非法部件","厂商不符","绑定错误","监控微处理器报警","安全装置报警","加油机报警","检定"],
|
|
|
alarmSource: ['云平台', '安全装置'],
|
|
alarmSource: ['云平台', '安全装置'],
|
|
@@ -448,17 +451,16 @@ const Data = reactive({
|
|
|
alarmproStatus: ["正在维修","结束维修"]
|
|
alarmproStatus: ["正在维修","结束维修"]
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
-// 转换用户列表为树形结构数据 - 确保用户ID为数字,角色ID为字符串
|
|
|
|
|
|
|
+// 转换用户列表为树形结构数据
|
|
|
const treeUserData = computed(() => {
|
|
const treeUserData = computed(() => {
|
|
|
return Data.userList.map((group: any) => {
|
|
return Data.userList.map((group: any) => {
|
|
|
- // 为角色生成唯一ID(字符串类型,带前缀)
|
|
|
|
|
const roleId = `role_${group.roleName.replace(/\s+/g, '_')}`;
|
|
const roleId = `role_${group.roleName.replace(/\s+/g, '_')}`;
|
|
|
return {
|
|
return {
|
|
|
id: roleId,
|
|
id: roleId,
|
|
|
label: `角色:${group.roleName}`,
|
|
label: `角色:${group.roleName}`,
|
|
|
isRole: true,
|
|
isRole: true,
|
|
|
children: group.users.map((user: any) => ({
|
|
children: group.users.map((user: any) => ({
|
|
|
- id: Number(user.id), // 强制转换为数字类型
|
|
|
|
|
|
|
+ id: Number(user.id),
|
|
|
label: user.name || `用户${user.id}`,
|
|
label: user.name || `用户${user.id}`,
|
|
|
phone: user.phone || '',
|
|
phone: user.phone || '',
|
|
|
isRole: false,
|
|
isRole: false,
|
|
@@ -487,17 +489,9 @@ const handleNodeClick = (data: any, node: any) => {
|
|
|
|
|
|
|
|
// 处理用户选择
|
|
// 处理用户选择
|
|
|
const handleUserCheck = (data: any, checkInfo: any) => {
|
|
const handleUserCheck = (data: any, checkInfo: any) => {
|
|
|
- // 获取所有选中的节点ID
|
|
|
|
|
const allCheckedIds = checkInfo.checkedKeys || [];
|
|
const allCheckedIds = checkInfo.checkedKeys || [];
|
|
|
-
|
|
|
|
|
- // 过滤出用户ID(仅保留数字类型,排除角色ID)
|
|
|
|
|
const userIds = allCheckedIds
|
|
const userIds = allCheckedIds
|
|
|
- .filter((id: any) => {
|
|
|
|
|
- // 角色ID是带前缀的字符串,用户ID是数字
|
|
|
|
|
- return typeof id === 'number' && !isNaN(id);
|
|
|
|
|
- });
|
|
|
|
|
-
|
|
|
|
|
- // 去重并更新选中的用户ID
|
|
|
|
|
|
|
+ .filter((id: any) => typeof id === 'number' && !isNaN(id));
|
|
|
const uniqueUserIds = [...new Set(userIds)];
|
|
const uniqueUserIds = [...new Set(userIds)];
|
|
|
selectedUserIds.value = uniqueUserIds;
|
|
selectedUserIds.value = uniqueUserIds;
|
|
|
Data.Filter.pushUserid = uniqueUserIds;
|
|
Data.Filter.pushUserid = uniqueUserIds;
|
|
@@ -522,7 +516,6 @@ const getUserList = async () => {
|
|
|
|
|
|
|
|
userDataArray.forEach((roleObj: any) => {
|
|
userDataArray.forEach((roleObj: any) => {
|
|
|
const roleName = roleObj.roleName || '未知角色';
|
|
const roleName = roleObj.roleName || '未知角色';
|
|
|
- // 过滤出有效用户(确保ID存在且可转换为数字)
|
|
|
|
|
const validUsers = (roleObj.users || []).filter((user: any) => {
|
|
const validUsers = (roleObj.users || []).filter((user: any) => {
|
|
|
const id = Number(user.id);
|
|
const id = Number(user.id);
|
|
|
return !isNaN(id) && id > 0;
|
|
return !isNaN(id) && id > 0;
|
|
@@ -533,7 +526,7 @@ const getUserList = async () => {
|
|
|
userMap.set(roleName, []);
|
|
userMap.set(roleName, []);
|
|
|
}
|
|
}
|
|
|
userMap.get(roleName)!.push({
|
|
userMap.get(roleName)!.push({
|
|
|
- id: Number(userObj.id), // 确保ID是数字
|
|
|
|
|
|
|
+ id: Number(userObj.id),
|
|
|
name: userObj.name || `用户${userObj.id}`,
|
|
name: userObj.name || `用户${userObj.id}`,
|
|
|
phone: userObj.phone || '',
|
|
phone: userObj.phone || '',
|
|
|
roleName: roleName
|
|
roleName: roleName
|
|
@@ -563,16 +556,16 @@ const getStationList = async () => {
|
|
|
};
|
|
};
|
|
|
const res = await new stationApi().getStationList(requestData);
|
|
const res = await new stationApi().getStationList(requestData);
|
|
|
Data.stationList = res.data?.list || [];
|
|
Data.stationList = res.data?.list || [];
|
|
|
- stationListLoaded = ref(true);
|
|
|
|
|
|
|
+ stationListLoaded.value = true;
|
|
|
} catch (error) {
|
|
} catch (error) {
|
|
|
- stationListLoaded = ref(true);
|
|
|
|
|
|
|
+ console.error("获取油站列表失败:", error);
|
|
|
|
|
+ stationListLoaded.value = true;
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
// 获取报警等级字典数据
|
|
// 获取报警等级字典数据
|
|
|
const fetchAlarmLevelDict = async () => {
|
|
const fetchAlarmLevelDict = async () => {
|
|
|
try {
|
|
try {
|
|
|
- // 构造字典查询参数
|
|
|
|
|
const data: PageInputDictGetPageDto = {
|
|
const data: PageInputDictGetPageDto = {
|
|
|
CurrentPage: 1,
|
|
CurrentPage: 1,
|
|
|
PageSize: 100,
|
|
PageSize: 100,
|
|
@@ -582,13 +575,16 @@ const fetchAlarmLevelDict = async () => {
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
- // 调用字典接口
|
|
|
|
|
const res = await new DictApi().getPage(data);
|
|
const res = await new DictApi().getPage(data);
|
|
|
-
|
|
|
|
|
- // 处理返回数据
|
|
|
|
|
if (res.success && res.data) {
|
|
if (res.success && res.data) {
|
|
|
- alarmLevelDict.value = res.data.list || [];
|
|
|
|
|
- console.log("报警等级字典数据获取成功", alarmLevelDict.value);
|
|
|
|
|
|
|
+ alarmLevelDict.value = res.data.list.map((item: any) => ({
|
|
|
|
|
+ id: item.id,
|
|
|
|
|
+ name: item.name,
|
|
|
|
|
+ code: item.code,
|
|
|
|
|
+ value: item.value,
|
|
|
|
|
+ enabled: item.enabled,
|
|
|
|
|
+ sort: item.sort
|
|
|
|
|
+ })) as DictItem[];
|
|
|
} else {
|
|
} else {
|
|
|
console.error("获取报警等级字典数据失败", res.msg);
|
|
console.error("获取报警等级字典数据失败", res.msg);
|
|
|
}
|
|
}
|
|
@@ -597,9 +593,10 @@ const fetchAlarmLevelDict = async () => {
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-// 设置油站选择
|
|
|
|
|
|
|
+// 设置油站选择 - 修复油站信息不回显问题
|
|
|
const setStationSelection = (ids: number[]) => {
|
|
const setStationSelection = (ids: number[]) => {
|
|
|
if (!stationListLoaded.value) {
|
|
if (!stationListLoaded.value) {
|
|
|
|
|
+ // 确保油站数据加载完成后再设置选中状态
|
|
|
const checkLoaded = setInterval(() => {
|
|
const checkLoaded = setInterval(() => {
|
|
|
if (stationListLoaded.value) {
|
|
if (stationListLoaded.value) {
|
|
|
clearInterval(checkLoaded);
|
|
clearInterval(checkLoaded);
|
|
@@ -616,6 +613,7 @@ const setStationSelection = (ids: number[]) => {
|
|
|
nextTick(() => {
|
|
nextTick(() => {
|
|
|
selectedStationIds.value = [...validIds];
|
|
selectedStationIds.value = [...validIds];
|
|
|
Data.Filter.stationid = [...validIds];
|
|
Data.Filter.stationid = [...validIds];
|
|
|
|
|
+ // 强制刷新选择器
|
|
|
stationSelectKey.value++;
|
|
stationSelectKey.value++;
|
|
|
});
|
|
});
|
|
|
};
|
|
};
|
|
@@ -635,8 +633,9 @@ const templateData = reactive({
|
|
|
emailList: [] as any
|
|
emailList: [] as any
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
+// 推送方式变化处理
|
|
|
const radioChange = () => {
|
|
const radioChange = () => {
|
|
|
- if (Data.pushEnabled) { // 只有总开关打开时才处理推送方式
|
|
|
|
|
|
|
+ if (Data.isPush) { // 仅当总开关打开时处理
|
|
|
if (Data.radioValue1) {
|
|
if (Data.radioValue1) {
|
|
|
Data.Filter.pushMethod = 'wx'
|
|
Data.Filter.pushMethod = 'wx'
|
|
|
if (Data.radioValue2) {
|
|
if (Data.radioValue2) {
|
|
@@ -646,11 +645,11 @@ const radioChange = () => {
|
|
|
Data.Filter.pushMethod = Data.radioValue2 ? 'email' : '';
|
|
Data.Filter.pushMethod = Data.radioValue2 ? 'email' : '';
|
|
|
}
|
|
}
|
|
|
} else {
|
|
} else {
|
|
|
- Data.Filter.pushMethod = ''; // 总开关关闭时清空推送方式
|
|
|
|
|
|
|
+ Data.Filter.pushMethod = ''; // 总开关关闭时清空
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-// 获取报警标签
|
|
|
|
|
|
|
+// 获取标签列表
|
|
|
const getLabel = async () => {
|
|
const getLabel = async () => {
|
|
|
try {
|
|
try {
|
|
|
const res = await new RoleApi().getLabel({
|
|
const res = await new RoleApi().getLabel({
|
|
@@ -662,7 +661,8 @@ const getLabel = async () => {
|
|
|
})
|
|
})
|
|
|
Data.labelList = res.data?.list?.map((item: any) => ({
|
|
Data.labelList = res.data?.list?.map((item: any) => ({
|
|
|
id: item.id.toString(),
|
|
id: item.id.toString(),
|
|
|
- name: item.name
|
|
|
|
|
|
|
+ name: item.name,
|
|
|
|
|
+ code: item.code // 存储标签编码
|
|
|
})) || []
|
|
})) || []
|
|
|
} catch (error) {
|
|
} catch (error) {
|
|
|
console.error('获取标签失败:', error)
|
|
console.error('获取标签失败:', error)
|
|
@@ -693,15 +693,16 @@ const funSelect = async () => {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// 模板变化处理
|
|
|
const modeChange = () => {
|
|
const modeChange = () => {
|
|
|
Data.Filter.pushTemplateMappingID = [];
|
|
Data.Filter.pushTemplateMappingID = [];
|
|
|
|
|
|
|
|
- if (Data.pushEnabled && Data.radioValue1 && Data.mode1) {
|
|
|
|
|
|
|
+ if (Data.isPush && Data.radioValue1 && Data.mode1) {
|
|
|
const wxItem = templateData.wxList.find((item: any) => item.id === Data.mode1);
|
|
const wxItem = templateData.wxList.find((item: any) => item.id === Data.mode1);
|
|
|
if (wxItem) Data.Filter.pushTemplateMappingID.push(Number(wxItem.id));
|
|
if (wxItem) Data.Filter.pushTemplateMappingID.push(Number(wxItem.id));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if (Data.pushEnabled && Data.radioValue2 && Data.mode2) {
|
|
|
|
|
|
|
+ if (Data.isPush && Data.radioValue2 && Data.mode2) {
|
|
|
const emailItem = templateData.emailList.find((item: any) => item.id === Data.mode2);
|
|
const emailItem = templateData.emailList.find((item: any) => item.id === Data.mode2);
|
|
|
if (emailItem) Data.Filter.pushTemplateMappingID.push(Number(emailItem.id));
|
|
if (emailItem) Data.Filter.pushTemplateMappingID.push(Number(emailItem.id));
|
|
|
}
|
|
}
|
|
@@ -721,13 +722,15 @@ const handleDialogOpen = () => {
|
|
|
|
|
|
|
|
// 重置表单
|
|
// 重置表单
|
|
|
const resetForm = () => {
|
|
const resetForm = () => {
|
|
|
|
|
+ // 重置用户选择
|
|
|
selectedUserIds.value = [];
|
|
selectedUserIds.value = [];
|
|
|
expandedKeys.value = [];
|
|
expandedKeys.value = [];
|
|
|
|
|
|
|
|
|
|
+ // 重置表单数据
|
|
|
Data.Filter = {
|
|
Data.Filter = {
|
|
|
ruleName: '',
|
|
ruleName: '',
|
|
|
roleMappingId: [],
|
|
roleMappingId: [],
|
|
|
- labelId: "",
|
|
|
|
|
|
|
+ tag: "",
|
|
|
remark: '',
|
|
remark: '',
|
|
|
pushMethod: '',
|
|
pushMethod: '',
|
|
|
pushTemplateMappingID: [],
|
|
pushTemplateMappingID: [],
|
|
@@ -749,28 +752,52 @@ const resetForm = () => {
|
|
|
condition: "",
|
|
condition: "",
|
|
|
mode1: '',
|
|
mode1: '',
|
|
|
id: 0,
|
|
id: 0,
|
|
|
- alarmLevel: undefined, // 重置报警等级筛选
|
|
|
|
|
|
|
+ alarmLevel: undefined,
|
|
|
} as unknown as alarmRluesFilterModel & { alarmLevel?: string };
|
|
} as unknown as alarmRluesFilterModel & { alarmLevel?: string };
|
|
|
|
|
|
|
|
|
|
+ // 重置推送相关状态
|
|
|
|
|
+ Data.isPush = false;
|
|
|
Data.radioValue1 = false;
|
|
Data.radioValue1 = false;
|
|
|
Data.radioValue2 = false;
|
|
Data.radioValue2 = false;
|
|
|
- Data.pushEnabled = false; // 重置总开关状态
|
|
|
|
|
Data.mode1 = '';
|
|
Data.mode1 = '';
|
|
|
Data.mode2 = '';
|
|
Data.mode2 = '';
|
|
|
|
|
+
|
|
|
|
|
+ // 重置条件配置
|
|
|
Data.showAlarmConditions = false;
|
|
Data.showAlarmConditions = false;
|
|
|
Data.showRepairConditions = false;
|
|
Data.showRepairConditions = false;
|
|
|
Data.condition = [{ Left: '', inthe: '', Right: '' }];
|
|
Data.condition = [{ Left: '', inthe: '', Right: '' }];
|
|
|
Data.condition2 = [{ Left: '', Right: '' }];
|
|
Data.condition2 = [{ Left: '', Right: '' }];
|
|
|
|
|
+
|
|
|
|
|
+ // 重置油站选择
|
|
|
selectedStationIds.value = [];
|
|
selectedStationIds.value = [];
|
|
|
|
|
+
|
|
|
|
|
+ // 确保树形组件重置
|
|
|
|
|
+ nextTick(() => {
|
|
|
|
|
+ if (userTreeRef.value) {
|
|
|
|
|
+ userTreeRef.value.setCheckedKeys([]);
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
+// 监听用户数据加载完成后,更新树形组件选中状态
|
|
|
|
|
+watch(
|
|
|
|
|
+ () => Data.userList.length,
|
|
|
|
|
+ (newVal) => {
|
|
|
|
|
+ if (newVal > 0 && selectedUserIds.value.length > 0 && userTreeRef.value) {
|
|
|
|
|
+ nextTick(() => {
|
|
|
|
|
+ userTreeRef.value.setCheckedKeys(selectedUserIds.value);
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+);
|
|
|
|
|
+
|
|
|
onMounted(() => {
|
|
onMounted(() => {
|
|
|
getLabel();
|
|
getLabel();
|
|
|
getRole();
|
|
getRole();
|
|
|
funSelect();
|
|
funSelect();
|
|
|
getUserList();
|
|
getUserList();
|
|
|
getStationList();
|
|
getStationList();
|
|
|
- fetchAlarmLevelDict(); // 加载报警等级字典数据
|
|
|
|
|
|
|
+ fetchAlarmLevelDict();
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
// 添加报警条件
|
|
// 添加报警条件
|
|
@@ -823,8 +850,6 @@ const removeCondition2 = () => {
|
|
|
|
|
|
|
|
// 提交表单
|
|
// 提交表单
|
|
|
const submitForm = async () => {
|
|
const submitForm = async () => {
|
|
|
- console.log('提交时选中的用户ID:', selectedUserIds.value);
|
|
|
|
|
-
|
|
|
|
|
// 验证规则名称
|
|
// 验证规则名称
|
|
|
if (!Data.Filter.ruleName) {
|
|
if (!Data.Filter.ruleName) {
|
|
|
ElMessage.warning('请输入规则名称')
|
|
ElMessage.warning('请输入规则名称')
|
|
@@ -843,8 +868,8 @@ const submitForm = async () => {
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 如果开启了推送,验证模板选择
|
|
|
|
|
- if (Data.pushEnabled) {
|
|
|
|
|
|
|
+ // 验证推送配置(当isPush为true时)
|
|
|
|
|
+ if (Data.isPush) {
|
|
|
if (Data.radioValue1 && !Data.mode1) {
|
|
if (Data.radioValue1 && !Data.mode1) {
|
|
|
ElMessage.warning('请选择微信模板')
|
|
ElMessage.warning('请选择微信模板')
|
|
|
return
|
|
return
|
|
@@ -853,7 +878,6 @@ const submitForm = async () => {
|
|
|
ElMessage.warning('请选择邮箱模板')
|
|
ElMessage.warning('请选择邮箱模板')
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
- // 验证至少选择一种推送方式
|
|
|
|
|
if (!Data.radioValue1 && !Data.radioValue2) {
|
|
if (!Data.radioValue1 && !Data.radioValue2) {
|
|
|
ElMessage.warning('请至少选择一种推送方式')
|
|
ElMessage.warning('请至少选择一种推送方式')
|
|
|
return
|
|
return
|
|
@@ -868,8 +892,9 @@ const submitForm = async () => {
|
|
|
pushUserid: selectedUserIds.value,
|
|
pushUserid: selectedUserIds.value,
|
|
|
stationid: selectedStationIds.value,
|
|
stationid: selectedStationIds.value,
|
|
|
pushTemplateMappingID: Data.Filter.pushTemplateMappingID,
|
|
pushTemplateMappingID: Data.Filter.pushTemplateMappingID,
|
|
|
- labelId: Data.Filter.labelId || null,
|
|
|
|
|
- alarmLevel: Data.Filter.alarmLevel // 包含报警等级筛选值
|
|
|
|
|
|
|
+ tag: Data.Filter.tag || null,
|
|
|
|
|
+ isPush: Data.isPush,
|
|
|
|
|
+ alarmLevel: Data.Filter.alarmLevel
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
@@ -883,6 +908,8 @@ const submitForm = async () => {
|
|
|
}
|
|
}
|
|
|
eventBus.emit('refreshView');
|
|
eventBus.emit('refreshView');
|
|
|
Data.isShowDialog = false;
|
|
Data.isShowDialog = false;
|
|
|
|
|
+ // 提交成功后重置表单
|
|
|
|
|
+ resetForm();
|
|
|
} catch (error) {
|
|
} catch (error) {
|
|
|
console.error(`${isEditing.value ? '更新' : '保存'}失败:`, error);
|
|
console.error(`${isEditing.value ? '更新' : '保存'}失败:`, error);
|
|
|
ElMessage.error(`${isEditing.value ? '更新' : '保存'}失败,请稍后重试`);
|
|
ElMessage.error(`${isEditing.value ? '更新' : '保存'}失败,请稍后重试`);
|
|
@@ -890,15 +917,15 @@ const submitForm = async () => {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 打开表单对话框
|
|
|
|
|
|
|
+ * 打开表单对话框 - 修复编辑时推送用户和油站信息被清空的问题
|
|
|
*/
|
|
*/
|
|
|
-const openDialog = (row?: alarmRluesFilterModel & { alarmLevel?: string }) => {
|
|
|
|
|
|
|
+const openDialog = (row?: any) => {
|
|
|
try {
|
|
try {
|
|
|
isEditing.value = !!row;
|
|
isEditing.value = !!row;
|
|
|
resetForm();
|
|
resetForm();
|
|
|
|
|
|
|
|
if (row) {
|
|
if (row) {
|
|
|
- // 处理用户ID
|
|
|
|
|
|
|
+ // 处理用户ID - 修复推送用户不回显问题
|
|
|
let pushUserIds: number[] = [];
|
|
let pushUserIds: number[] = [];
|
|
|
if (row.pushUserid) {
|
|
if (row.pushUserid) {
|
|
|
if (Array.isArray(row.pushUserid)) {
|
|
if (Array.isArray(row.pushUserid)) {
|
|
@@ -913,11 +940,11 @@ const openDialog = (row?: alarmRluesFilterModel & { alarmLevel?: string }) => {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 设置用户选择
|
|
|
|
|
|
|
+ // 立即设置选中的用户ID
|
|
|
selectedUserIds.value = pushUserIds;
|
|
selectedUserIds.value = pushUserIds;
|
|
|
Data.Filter.pushUserid = pushUserIds;
|
|
Data.Filter.pushUserid = pushUserIds;
|
|
|
|
|
|
|
|
- // 处理油站ID
|
|
|
|
|
|
|
+ // 处理油站ID - 修复油站信息不回显问题
|
|
|
const stationIds = row.stationid
|
|
const stationIds = row.stationid
|
|
|
? (Array.isArray(row.stationid)
|
|
? (Array.isArray(row.stationid)
|
|
|
? row.stationid.map(Number)
|
|
? row.stationid.map(Number)
|
|
@@ -933,21 +960,39 @@ const openDialog = (row?: alarmRluesFilterModel & { alarmLevel?: string }) => {
|
|
|
? row.pushTemplateMappingID.map(Number)
|
|
? row.pushTemplateMappingID.map(Number)
|
|
|
: [Number(row.pushTemplateMappingID)]) : [],
|
|
: [Number(row.pushTemplateMappingID)]) : [],
|
|
|
stationid: stationIds,
|
|
stationid: stationIds,
|
|
|
- labelId: row.labelId?.toString() || "",
|
|
|
|
|
id: row.id || 0,
|
|
id: row.id || 0,
|
|
|
- alarmLevel: row.alarmLevel // 设置报警等级
|
|
|
|
|
|
|
+ tag: row.tag || "",
|
|
|
|
|
+ alarmLevel: row.alarmLevel || ""
|
|
|
} as unknown as alarmRluesFilterModel & { alarmLevel?: string };
|
|
} as unknown as alarmRluesFilterModel & { alarmLevel?: string };
|
|
|
|
|
|
|
|
- // 处理推送方式和总开关状态
|
|
|
|
|
|
|
+ // 处理标签编码回显
|
|
|
|
|
+ if (row.tag) {
|
|
|
|
|
+ let tagItem = Data.labelList.find((item: any) => item.code === row.tag);
|
|
|
|
|
+ if (!tagItem && typeof row.tag === 'string') {
|
|
|
|
|
+ tagItem = Data.labelList.find((item: any) => item.id === row.tag);
|
|
|
|
|
+ }
|
|
|
|
|
+ Data.Filter.tag = tagItem?.code || row.tag;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 处理报警等级编码回显
|
|
|
|
|
+ if (row.alarmLevel) {
|
|
|
|
|
+ let levelItem = alarmLevelDict.value.find((item: any) => item.code === row.alarmLevel);
|
|
|
|
|
+ if (!levelItem) {
|
|
|
|
|
+ levelItem = alarmLevelDict.value.find((item: any) => item.value === row.alarmLevel);
|
|
|
|
|
+ }
|
|
|
|
|
+ Data.Filter.alarmLevel = levelItem?.code || row.alarmLevel;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 处理推送开关和方式
|
|
|
|
|
+ Data.isPush = row.isPush !== undefined ? row.isPush : false;
|
|
|
const pushMethods = Array.isArray(row.pushMethod)
|
|
const pushMethods = Array.isArray(row.pushMethod)
|
|
|
? row.pushMethod
|
|
? row.pushMethod
|
|
|
: (row.pushMethod?.split(',') || []);
|
|
: (row.pushMethod?.split(',') || []);
|
|
|
- Data.pushEnabled = pushMethods.length > 0;
|
|
|
|
|
Data.radioValue1 = pushMethods.includes('wx');
|
|
Data.radioValue1 = pushMethods.includes('wx');
|
|
|
Data.radioValue2 = pushMethods.includes('email');
|
|
Data.radioValue2 = pushMethods.includes('email');
|
|
|
radioChange();
|
|
radioChange();
|
|
|
|
|
|
|
|
- // 处理油站数据
|
|
|
|
|
|
|
+ // 处理油站数据 - 确保油站选择正确设置
|
|
|
setStationSelection(stationIds);
|
|
setStationSelection(stationIds);
|
|
|
|
|
|
|
|
// 处理模板
|
|
// 处理模板
|
|
@@ -960,6 +1005,53 @@ const openDialog = (row?: alarmRluesFilterModel & { alarmLevel?: string }) => {
|
|
|
const emailItem = templateData.emailList.find((item: any) => item.id === strId);
|
|
const emailItem = templateData.emailList.find((item: any) => item.id === strId);
|
|
|
if (emailItem) Data.mode2 = strId;
|
|
if (emailItem) Data.mode2 = strId;
|
|
|
});
|
|
});
|
|
|
|
|
+
|
|
|
|
|
+ // 处理报警条件
|
|
|
|
|
+ if (row.conditionsJson) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ const conditions = JSON.parse(row.conditionsJson);
|
|
|
|
|
+ if (Array.isArray(conditions) && conditions.length > 0) {
|
|
|
|
|
+ Data.condition = conditions;
|
|
|
|
|
+ Data.showAlarmConditions = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ console.error('解析报警条件失败:', e);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 处理维修条件
|
|
|
|
|
+ if (row.maintenanceJson) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ const maintenanceConditions = JSON.parse(row.maintenanceJson);
|
|
|
|
|
+ if (Array.isArray(maintenanceConditions) && maintenanceConditions.length > 0) {
|
|
|
|
|
+ Data.condition2 = maintenanceConditions;
|
|
|
|
|
+ Data.showRepairConditions = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ console.error('解析维修条件失败:', e);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 确保用户数据加载完成后设置树形组件选中状态
|
|
|
|
|
+ if (Data.userList.length > 0) {
|
|
|
|
|
+ nextTick(() => {
|
|
|
|
|
+ if (userTreeRef.value) {
|
|
|
|
|
+ userTreeRef.value.setCheckedKeys(selectedUserIds.value);
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 如果用户数据尚未加载,等待加载完成后再设置
|
|
|
|
|
+ const checkUserLoaded = setInterval(() => {
|
|
|
|
|
+ if (Data.userList.length > 0) {
|
|
|
|
|
+ clearInterval(checkUserLoaded);
|
|
|
|
|
+ nextTick(() => {
|
|
|
|
|
+ if (userTreeRef.value) {
|
|
|
|
|
+ userTreeRef.value.setCheckedKeys(selectedUserIds.value);
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ }, 100);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
Data.isShowDialog = true;
|
|
Data.isShowDialog = true;
|
|
@@ -970,25 +1062,6 @@ const openDialog = (row?: alarmRluesFilterModel & { alarmLevel?: string }) => {
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-// 监听模板列表加载完成
|
|
|
|
|
-watch(
|
|
|
|
|
- () => [templateData.wxList.length, templateData.emailList.length],
|
|
|
|
|
- () => {
|
|
|
|
|
- if (isEditing.value && Data.Filter.pushTemplateMappingID.length > 0) {
|
|
|
|
|
- const templateIds = Data.Filter.pushTemplateMappingID.map(id => id.toString());
|
|
|
|
|
- Data.mode1 = '';
|
|
|
|
|
- Data.mode2 = '';
|
|
|
|
|
- templateIds.forEach(strId => {
|
|
|
|
|
- const wxItem = templateData.wxList.find((item: any) => item.id === strId);
|
|
|
|
|
- if (wxItem) Data.mode1 = strId;
|
|
|
|
|
- const emailItem = templateData.emailList.find((item: any) => item.id === strId);
|
|
|
|
|
- if (emailItem) Data.mode2 = strId;
|
|
|
|
|
- });
|
|
|
|
|
- modeChange();
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-);
|
|
|
|
|
-
|
|
|
|
|
defineExpose({
|
|
defineExpose({
|
|
|
openDialog,
|
|
openDialog,
|
|
|
})
|
|
})
|
|
@@ -1057,4 +1130,4 @@ defineExpose({
|
|
|
::v-deep .el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content {
|
|
::v-deep .el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content {
|
|
|
background-color: #f5f7fa;
|
|
background-color: #f5f7fa;
|
|
|
}
|
|
}
|
|
|
-</style>
|
|
|
|
|
|
|
+</style>
|