|
@@ -67,9 +67,27 @@
|
|
|
</div>
|
|
|
</template>
|
|
|
</el-tree>
|
|
|
- <!-- <div style="margin-top: 10px; font-size: 12px; color: #666;">
|
|
|
- 选中的用户ID: {{ selectedUserIds.length > 0 ? selectedUserIds.join(',') : '无' }}
|
|
|
- </div> -->
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 新增:报警等级筛选下拉框 -->
|
|
|
+ <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
|
|
|
+ <el-form :inline="true" @submit.stop.prevent>
|
|
|
+ <el-form-item label="报警等级:" style="width: 100%;" prop="alarmLevel">
|
|
|
+ <el-select
|
|
|
+ v-model="Data.Filter.alarmLevel"
|
|
|
+ placeholder="请选择报警等级"
|
|
|
+ clearable
|
|
|
+ @change="handleAlarmLevelChange"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="item in alarmLevelDict"
|
|
|
+ :key="item.id"
|
|
|
+ :label="`${item.name}(${item.value})`"
|
|
|
+ :value="item.value"
|
|
|
+ ></el-option>
|
|
|
+ </el-select>
|
|
|
</el-form-item>
|
|
|
</el-form>
|
|
|
</div>
|
|
@@ -111,18 +129,26 @@
|
|
|
<div style="width: 100%;display: flex;justify-content: center;align-items: center;">
|
|
|
<el-form :inline="true" @submit.stop.prevent>
|
|
|
<el-form-item label="推送方式:" style="width: 100%;" prop="pushMethod">
|
|
|
- <el-row style="width: 100%;">
|
|
|
- 微信公众号<el-switch v-model="Data.radioValue1" style="margin-left: 3%;" @change="radioChange" />
|
|
|
- </el-row>
|
|
|
- <el-row style="width: 100%;">
|
|
|
- 邮   箱<el-switch v-model="Data.radioValue2" style="margin-left: 3%;" @change="radioChange" />
|
|
|
+ <!-- 推送总开关 -->
|
|
|
+ <el-row style="width: 100%;margin-bottom: 10px;">
|
|
|
+ 是否推送<el-switch v-model="Data.pushEnabled" style="margin-left: 3%;" />
|
|
|
</el-row>
|
|
|
+
|
|
|
+ <!-- 微信和邮箱开关(仅在总开关打开时显示) -->
|
|
|
+ <template v-if="Data.pushEnabled">
|
|
|
+ <el-row style="width: 100%;">
|
|
|
+ 微信公众号<el-switch v-model="Data.radioValue1" style="margin-left: 3%;" @change="radioChange" />
|
|
|
+ </el-row>
|
|
|
+ <el-row style="width: 100%;">
|
|
|
+ 邮   箱<el-switch v-model="Data.radioValue2" style="margin-left: 3%;" @change="radioChange" />
|
|
|
+ </el-row>
|
|
|
+ </template>
|
|
|
</el-form-item>
|
|
|
</el-form>
|
|
|
</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;" v-if="Data.pushEnabled">
|
|
|
<el-form :inline="true" @submit.stop.prevent>
|
|
|
<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">
|
|
@@ -322,6 +348,18 @@ import { TemplateFilterDto } from "/@/api/admin/AlarmService/pushTemplateDto";
|
|
|
import eventBus from "/@/utils/mitt";
|
|
|
import { ElMessage, type FormRules } from 'element-plus'
|
|
|
import { UserListItem, StationItem } from "/@/api/admin/AlarmService/alarmRulesDto";
|
|
|
+import { DictApi } from "/@/api/admin/Dict";
|
|
|
+import { PageInputDictGetPageDto } from "/@/api/admin/data-contracts";
|
|
|
+
|
|
|
+// 报警等级字典项接口定义
|
|
|
+interface DictItem {
|
|
|
+ id: number;
|
|
|
+ name: string;
|
|
|
+ code: string;
|
|
|
+ value: string;
|
|
|
+ enabled: boolean;
|
|
|
+ sort: number;
|
|
|
+}
|
|
|
|
|
|
// 状态标识:是否为编辑模式
|
|
|
const isEditing = ref(false);
|
|
@@ -358,10 +396,14 @@ const condition2Rules = reactive<FormRules>({
|
|
|
Right: [{ required: true, message: '请选择维修状态', trigger: 'change' }]
|
|
|
})
|
|
|
|
|
|
+// 报警等级字典数据
|
|
|
+const alarmLevelDict = ref<DictItem[]>([]);
|
|
|
+
|
|
|
const Data = reactive({
|
|
|
isShowDialog: false,
|
|
|
showAlarmConditions: false,
|
|
|
showRepairConditions: false,
|
|
|
+ pushEnabled: false, // 推送总开关状态
|
|
|
stationList: [] as StationItem[],
|
|
|
Filter: {
|
|
|
ruleName: '',
|
|
@@ -387,8 +429,9 @@ const Data = reactive({
|
|
|
condition2: "",
|
|
|
condition: "",
|
|
|
mode1: '',
|
|
|
- id: 0
|
|
|
- } as unknown as alarmRluesFilterModel,
|
|
|
+ id: 0,
|
|
|
+ alarmLevel: undefined, // 新增:报警等级筛选值
|
|
|
+ } as unknown as alarmRluesFilterModel & { alarmLevel?: string },
|
|
|
roleList: [] as any,
|
|
|
labelList: [] as any,
|
|
|
userList: [] as UserListItem[],
|
|
@@ -442,7 +485,7 @@ const handleNodeClick = (data: any, node: any) => {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
-// 处理用户选择 - 核心修复:确保正确提取用户ID
|
|
|
+// 处理用户选择
|
|
|
const handleUserCheck = (data: any, checkInfo: any) => {
|
|
|
// 获取所有选中的节点ID
|
|
|
const allCheckedIds = checkInfo.checkedKeys || [];
|
|
@@ -458,8 +501,6 @@ const handleUserCheck = (data: any, checkInfo: any) => {
|
|
|
const uniqueUserIds = [...new Set(userIds)];
|
|
|
selectedUserIds.value = uniqueUserIds;
|
|
|
Data.Filter.pushUserid = uniqueUserIds;
|
|
|
-
|
|
|
- console.log('过滤后的用户ID:', uniqueUserIds);
|
|
|
};
|
|
|
|
|
|
// 监听油站选择变化
|
|
@@ -467,7 +508,12 @@ const handleStationChange = (values: number[]) => {
|
|
|
Data.Filter.stationid = [...values];
|
|
|
};
|
|
|
|
|
|
-// 获取用户列表 - 确保用户ID有效
|
|
|
+// 处理报警等级变化
|
|
|
+const handleAlarmLevelChange = (value: string) => {
|
|
|
+ Data.Filter.alarmLevel = value;
|
|
|
+};
|
|
|
+
|
|
|
+// 获取用户列表
|
|
|
const getUserList = async () => {
|
|
|
try {
|
|
|
const res = await new alarmRulesApi().getWxUserRole({});
|
|
@@ -499,8 +545,6 @@ const getUserList = async () => {
|
|
|
roleName: role,
|
|
|
users: users
|
|
|
}));
|
|
|
-
|
|
|
- console.log('处理后的用户列表:', Data.userList);
|
|
|
} catch (error) {
|
|
|
console.error("获取用户列表失败:", error);
|
|
|
ElMessage.error("用户列表加载失败");
|
|
@@ -525,6 +569,34 @@ const getStationList = async () => {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+// 获取报警等级字典数据
|
|
|
+const fetchAlarmLevelDict = async () => {
|
|
|
+ try {
|
|
|
+ // 构造字典查询参数
|
|
|
+ const data: PageInputDictGetPageDto = {
|
|
|
+ CurrentPage: 1,
|
|
|
+ PageSize: 100,
|
|
|
+ Filter: {
|
|
|
+ dictTypeId: 685895581360197, // 报警等级字典类型ID
|
|
|
+ name: ""
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ // 调用字典接口
|
|
|
+ const res = await new DictApi().getPage(data);
|
|
|
+
|
|
|
+ // 处理返回数据
|
|
|
+ if (res.success && res.data) {
|
|
|
+ alarmLevelDict.value = res.data.list || [];
|
|
|
+ console.log("报警等级字典数据获取成功", alarmLevelDict.value);
|
|
|
+ } else {
|
|
|
+ console.error("获取报警等级字典数据失败", res.msg);
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error("获取报警等级字典数据异常", error);
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
// 设置油站选择
|
|
|
const setStationSelection = (ids: number[]) => {
|
|
|
if (!stationListLoaded.value) {
|
|
@@ -564,13 +636,17 @@ const templateData = reactive({
|
|
|
})
|
|
|
|
|
|
const radioChange = () => {
|
|
|
- if (Data.radioValue1) {
|
|
|
- Data.Filter.pushMethod = 'wx'
|
|
|
- if (Data.radioValue2) {
|
|
|
- Data.Filter.pushMethod += ',email'
|
|
|
+ if (Data.pushEnabled) { // 只有总开关打开时才处理推送方式
|
|
|
+ if (Data.radioValue1) {
|
|
|
+ Data.Filter.pushMethod = 'wx'
|
|
|
+ if (Data.radioValue2) {
|
|
|
+ Data.Filter.pushMethod += ',email'
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ Data.Filter.pushMethod = Data.radioValue2 ? 'email' : '';
|
|
|
}
|
|
|
} else {
|
|
|
- Data.Filter.pushMethod = Data.radioValue2 ? 'email' : '';
|
|
|
+ Data.Filter.pushMethod = ''; // 总开关关闭时清空推送方式
|
|
|
}
|
|
|
};
|
|
|
|
|
@@ -620,12 +696,12 @@ const funSelect = async () => {
|
|
|
const modeChange = () => {
|
|
|
Data.Filter.pushTemplateMappingID = [];
|
|
|
|
|
|
- if (Data.radioValue1 && Data.mode1) {
|
|
|
+ if (Data.pushEnabled && Data.radioValue1 && Data.mode1) {
|
|
|
const wxItem = templateData.wxList.find((item: any) => item.id === Data.mode1);
|
|
|
if (wxItem) Data.Filter.pushTemplateMappingID.push(Number(wxItem.id));
|
|
|
}
|
|
|
|
|
|
- if (Data.radioValue2 && Data.mode2) {
|
|
|
+ if (Data.pushEnabled && Data.radioValue2 && Data.mode2) {
|
|
|
const emailItem = templateData.emailList.find((item: any) => item.id === Data.mode2);
|
|
|
if (emailItem) Data.Filter.pushTemplateMappingID.push(Number(emailItem.id));
|
|
|
}
|
|
@@ -672,11 +748,13 @@ const resetForm = () => {
|
|
|
condition2: "",
|
|
|
condition: "",
|
|
|
mode1: '',
|
|
|
- id: 0
|
|
|
- } as unknown as alarmRluesFilterModel;
|
|
|
+ id: 0,
|
|
|
+ alarmLevel: undefined, // 重置报警等级筛选
|
|
|
+ } as unknown as alarmRluesFilterModel & { alarmLevel?: string };
|
|
|
|
|
|
Data.radioValue1 = false;
|
|
|
Data.radioValue2 = false;
|
|
|
+ Data.pushEnabled = false; // 重置总开关状态
|
|
|
Data.mode1 = '';
|
|
|
Data.mode2 = '';
|
|
|
Data.showAlarmConditions = false;
|
|
@@ -692,6 +770,7 @@ onMounted(() => {
|
|
|
funSelect();
|
|
|
getUserList();
|
|
|
getStationList();
|
|
|
+ fetchAlarmLevelDict(); // 加载报警等级字典数据
|
|
|
});
|
|
|
|
|
|
// 添加报警条件
|
|
@@ -742,7 +821,7 @@ const removeCondition2 = () => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// 提交表单 - 增强验证逻辑
|
|
|
+// 提交表单
|
|
|
const submitForm = async () => {
|
|
|
console.log('提交时选中的用户ID:', selectedUserIds.value);
|
|
|
|
|
@@ -752,7 +831,7 @@ const submitForm = async () => {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- // 验证推送用户 - 确保数组存在且有值
|
|
|
+ // 验证推送用户
|
|
|
if (!Array.isArray(selectedUserIds.value) || selectedUserIds.value.length === 0) {
|
|
|
ElMessage.warning('请选择推送用户');
|
|
|
return;
|
|
@@ -764,14 +843,21 @@ const submitForm = async () => {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- // 验证模板选择
|
|
|
- if (Data.radioValue1 && !Data.mode1) {
|
|
|
- ElMessage.warning('请选择微信模板')
|
|
|
- return
|
|
|
- }
|
|
|
- if (Data.radioValue2 && !Data.mode2) {
|
|
|
- ElMessage.warning('请选择邮箱模板')
|
|
|
- return
|
|
|
+ // 如果开启了推送,验证模板选择
|
|
|
+ if (Data.pushEnabled) {
|
|
|
+ if (Data.radioValue1 && !Data.mode1) {
|
|
|
+ ElMessage.warning('请选择微信模板')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if (Data.radioValue2 && !Data.mode2) {
|
|
|
+ ElMessage.warning('请选择邮箱模板')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 验证至少选择一种推送方式
|
|
|
+ if (!Data.radioValue1 && !Data.radioValue2) {
|
|
|
+ ElMessage.warning('请至少选择一种推送方式')
|
|
|
+ return
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// 准备提交数据
|
|
@@ -779,10 +865,11 @@ const submitForm = async () => {
|
|
|
...Data.Filter,
|
|
|
conditionsJson: Data.showAlarmConditions ? JSON.stringify(Data.condition) : null,
|
|
|
maintenanceJson: Data.showRepairConditions ? JSON.stringify(Data.condition2) : null,
|
|
|
- pushUserid: selectedUserIds.value, // 使用树形选择的用户ID
|
|
|
+ pushUserid: selectedUserIds.value,
|
|
|
stationid: selectedStationIds.value,
|
|
|
pushTemplateMappingID: Data.Filter.pushTemplateMappingID,
|
|
|
- labelId: Data.Filter.labelId || null
|
|
|
+ labelId: Data.Filter.labelId || null,
|
|
|
+ alarmLevel: Data.Filter.alarmLevel // 包含报警等级筛选值
|
|
|
}
|
|
|
|
|
|
try {
|
|
@@ -805,19 +892,18 @@ const submitForm = async () => {
|
|
|
/**
|
|
|
* 打开表单对话框
|
|
|
*/
|
|
|
-const openDialog = (row?: alarmRluesFilterModel) => {
|
|
|
+const openDialog = (row?: alarmRluesFilterModel & { alarmLevel?: string }) => {
|
|
|
try {
|
|
|
isEditing.value = !!row;
|
|
|
resetForm();
|
|
|
|
|
|
if (row) {
|
|
|
- // 处理用户ID - 确保正确转换为数字数组
|
|
|
+ // 处理用户ID
|
|
|
let pushUserIds: number[] = [];
|
|
|
if (row.pushUserid) {
|
|
|
if (Array.isArray(row.pushUserid)) {
|
|
|
pushUserIds = row.pushUserid.map(id => Number(id)).filter(id => !isNaN(id) && id > 0);
|
|
|
} else if (typeof row.pushUserid === 'string') {
|
|
|
- // 处理逗号分隔的ID字符串
|
|
|
pushUserIds = row.pushUserid
|
|
|
.split(',')
|
|
|
.map(id => Number(id))
|
|
@@ -848,13 +934,15 @@ const openDialog = (row?: alarmRluesFilterModel) => {
|
|
|
: [Number(row.pushTemplateMappingID)]) : [],
|
|
|
stationid: stationIds,
|
|
|
labelId: row.labelId?.toString() || "",
|
|
|
- id: row.id || 0
|
|
|
- } as unknown as alarmRluesFilterModel;
|
|
|
+ id: row.id || 0,
|
|
|
+ alarmLevel: row.alarmLevel // 设置报警等级
|
|
|
+ } as unknown as alarmRluesFilterModel & { alarmLevel?: string };
|
|
|
|
|
|
- // 处理推送方式
|
|
|
+ // 处理推送方式和总开关状态
|
|
|
const pushMethods = Array.isArray(row.pushMethod)
|
|
|
? row.pushMethod
|
|
|
: (row.pushMethod?.split(',') || []);
|
|
|
+ Data.pushEnabled = pushMethods.length > 0;
|
|
|
Data.radioValue1 = pushMethods.includes('wx');
|
|
|
Data.radioValue2 = pushMethods.includes('email');
|
|
|
radioChange();
|
|
@@ -946,8 +1034,6 @@ defineExpose({
|
|
|
align-items: center;
|
|
|
width: 100%;
|
|
|
padding: 2px 0;
|
|
|
-
|
|
|
-
|
|
|
}
|
|
|
|
|
|
.expand-btn {
|