add-alarmRules.vue 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835
  1. <!-- 报警规则添加列表 -->
  2. <template>
  3. <div class="layout-pd">
  4. <el-dialog v-model="Data.isShowDialog" style="width: 75%;">
  5. <!--操作-->
  6. <div style="width: 100%;display: flex;justify-content: left;align-items: center;">
  7. <h1 style="margin-bottom: 10px;font-size: 30px;">报警推送规则</h1>
  8. </div>
  9. <div style="margin-bottom: 10px ;">
  10. <hr />
  11. </div>
  12. <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
  13. <el-form :inline="true" @submit.stop.prevent>
  14. <el-form-item label="规则名称:" style="width: 100%;" prop="ruleName">
  15. <el-input v-model="Data.Filter.ruleName" style="width: 100%;" placeholder="请输入" />
  16. </el-form-item>
  17. </el-form>
  18. </div>
  19. <!-- <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
  20. <el-form :inline="true" @submit.stop.prevent>
  21. <el-form-item label="标签:" style="width: 100%;" prop="labelId">
  22. <el-select v-model="Data.Filter.labelId" placeholder="请选择标签">
  23. <el-option v-for="item in Data.labelList" :key="item.id" :label="item.name" :value="item.id" />
  24. </el-select>
  25. </el-form-item>
  26. </el-form>
  27. </div> -->
  28. <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
  29. <el-form :inline="true" @submit.stop.prevent>
  30. <el-form-item label="推送用户:" style="width: 100%;" prop="pushUserid">
  31. <el-select
  32. v-model="Data.Filter.pushUserid"
  33. placeholder="请选择用户"
  34. multiple
  35. style="width: 100%;"
  36. >
  37. <el-option-group
  38. v-for="(group, index) in Data.userList"
  39. :key="index"
  40. :label="`角色:${group.roleName}`"
  41. >
  42. <el-option
  43. v-for="user in group.users"
  44. :key="user.id"
  45. :label="`${user.name}`"
  46. :value="user.id"
  47. >
  48. </el-option>
  49. </el-option-group>
  50. </el-select>
  51. </el-form-item>
  52. </el-form>
  53. </div>
  54. <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
  55. <el-form :inline="true" @submit.stop.prevent>
  56. <el-form-item label="备&#8195;&#8195;注:" style="width: 100%;">
  57. <el-input type="textarea" rows="5" v-model="Data.Filter.remark" style="width: 100%;" placeholder="请输入" />
  58. </el-form-item>
  59. </el-form>
  60. </div>
  61. <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
  62. <el-form :inline="true" @submit.stop.prevent>
  63. <el-form-item label="推送方式:" style="width: 100%;" prop="pushMethod">
  64. <el-row style="width: 100%;">
  65. 微信公众号<el-switch v-model="Data.radioValue1" style="margin-left: 3%;" @change="radioChange" />
  66. </el-row>
  67. <el-row style="width: 100%;">
  68. 邮&#8195;&#8195;&#8195;箱<el-switch v-model="Data.radioValue2" style="margin-left: 3%;" @change="radioChange" />
  69. </el-row>
  70. </el-form-item>
  71. </el-form>
  72. </div>
  73. <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
  74. <el-form :inline="true" @submit.stop.prevent>
  75. <el-form-item label="模&#8195;&#8195;板:" style="width: 50%;" prop="mode1">
  76. <el-select v-model="Data.mode1" class="m-2" placeholder="微信模板" v-if="Data.radioValue1" @change="modeChange">
  77. <el-option v-for="item in templateData.wxList" :key="item.id" :label="item.templateName" :value="item.templateName" />
  78. </el-select>
  79. </el-form-item>
  80. <el-form-item label="&#8195;&#8195;&#8195;&#8195;" style="width: 100%;" prop="mode2">
  81. <el-select v-model="Data.mode2" class="m-2" placeholder="邮箱模板" v-if="Data.radioValue2" @change="modeChange">
  82. <el-option v-for="item in templateData.emailList" :key="item.id" :label="item.name" :value="item.templateName" />
  83. </el-select>
  84. </el-form-item>
  85. </el-form>
  86. </div>
  87. <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
  88. <el-form :inline="true" @submit.stop.prevent>
  89. <el-form-item label="关键字匹配:" style="width: 100%;">
  90. <el-input type="textarea" rows="5" v-model="Data.Filter.regular" style="width: 100%;" placeholder="请输入" />
  91. </el-form-item>
  92. </el-form>
  93. </div>
  94. <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
  95. <el-form :inline="true" @submit.stop.prevent>
  96. <el-form-item label="&#8195;优先级:" style="width: 100%;" prop="taskPriority">
  97. <el-input-number v-model="Data.Filter.taskPriority" :controls="false" :min=1 :max=9 />
  98. </el-form-item>
  99. </el-form>
  100. </div>
  101. <!-- 报警条件配置 -->
  102. <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
  103. <el-form :inline="true" @submit.stop.prevent>
  104. <el-form-item label="报警条件配置" style="width: 100%;">
  105. </el-form-item>
  106. </el-form>
  107. </div>
  108. <!-- <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
  109. <el-form :inline="true" @submit.stop.prevent>
  110. <el-form-item label="触发方式:" style="width: 100%;" prop="triggerMethod">
  111. <el-radio-group v-model="Data.Filter.triggerMethod">
  112. <el-radio label="0">其中之一条件满足即触发</el-radio>
  113. <el-radio label="1">全部满足时触发</el-radio>
  114. </el-radio-group>
  115. </el-form-item>
  116. </el-form>
  117. </div>
  118. <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
  119. <el-form :inline="true" @submit.stop.prevent>
  120. <el-form-item label="互&#8195;&#8195;斥:" style="width: 100%;">
  121. <el-switch v-model="Data.Filter.isExclusive" />
  122. </el-form-item>
  123. </el-form>
  124. </div> -->
  125. <!-- 条件部分 - 初始不显示,点击添加按钮后才显示 -->
  126. <div v-if="Data.showAlarmConditions">
  127. <div v-for="(condition, index) in Data.condition" :key="index"
  128. style="width: 100%;display: flex;justify-content: center;align-items: center; margin-top: 10px;">
  129. <el-form :inline="true" @submit.stop.prevent :model="condition" :rules="conditionRules">
  130. <el-form-item :label="index === 0 ? '条&#8195;&#8195;件:' : '附加条件:'" style="width: 130%; ">
  131. <el-row :gutter="20" style="width: 100%;">
  132. <!-- 报警设备 -->
  133. <el-col :span="8">
  134. <div style="flex:1;">
  135. <!-- style="display: flex; align-items: center;" -->
  136. <span style="margin-right: 13px;">报警设备:</span>
  137. <el-form-item prop="Left" style="display:flex">
  138. <el-select v-model="condition.Left" placeholder="请选择" >
  139. <el-option
  140. v-for="item in Data.alarmEquipment"
  141. :key="item"
  142. :label="item"
  143. :value="item"
  144. />
  145. </el-select>
  146. </el-form-item>
  147. </div>
  148. </el-col>
  149. <!-- 报警类型 -->
  150. <el-col :span="8">
  151. <div style="flex:1;">
  152. <span style="margin-right: 13px;">报警类型:</span>
  153. <el-form-item prop="inthe" style="display:flex">
  154. <el-select v-model="condition.inthe" placeholder="请选择" >
  155. <el-option
  156. v-for="item in Data.alarmType"
  157. :key="item"
  158. :label="item"
  159. :value="item"
  160. />
  161. </el-select>
  162. </el-form-item>
  163. </div>
  164. </el-col>
  165. <!-- 报警来源 -->
  166. <el-col :span="8">
  167. <div style="flex:1;">
  168. <span style="margin-right: 13px;">报警来源:</span>
  169. <el-form-item prop="Right" style="display:flex">
  170. <el-select v-model="condition.Right" placeholder="请选择">
  171. <el-option
  172. v-for="item in Data.alarmSource"
  173. :key="item"
  174. :label="item"
  175. :value="item"
  176. />
  177. </el-select>
  178. </el-form-item>
  179. </div>
  180. </el-col>
  181. </el-row>
  182. </el-form-item>
  183. </el-form>
  184. </div>
  185. </div>
  186. <!-- 添加按钮 -->
  187. <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
  188. <el-button type="primary" icon="ele-Plus" style="font-size: large" @click="addCondition" />
  189. <el-button v-if="Data.condition.length > 1" type="primary" icon="ele-Minus" style="font-size: large" @click="removeCondition" />
  190. </div>
  191. <!-- 维修条件配置 -->
  192. <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
  193. <el-form :inline="true" @submit.stop.prevent>
  194. <el-form-item label="维修条件配置" style="width: 100%;">
  195. </el-form-item>
  196. </el-form>
  197. </div>
  198. <!-- <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
  199. <el-form :inline="true" @submit.stop.prevent>
  200. <el-form-item label="触发方式:" style="width: 100%;" prop="maintenanceTriggerMethod">
  201. <el-radio-group v-model="Data.Filter.maintenanceTriggerMethod">
  202. <el-radio label="0">其中之一条件满足即触发</el-radio>
  203. <el-radio label="1">全部满足时触发</el-radio>
  204. </el-radio-group>
  205. </el-form-item>
  206. </el-form>
  207. </div>
  208. <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
  209. <el-form :inline="true" @submit.stop.prevent>
  210. <el-form-item label="互&#8195;&#8195;斥:" style="width: 100%;">
  211. <el-switch v-model="Data.Filter.isExclusiveMaintenance" />
  212. </el-form-item>
  213. </el-form>
  214. </div> -->
  215. <!-- 维修条件部分 - 初始不显示,点击添加按钮后才显示 -->
  216. <div v-if="Data.showRepairConditions">
  217. <div v-for="(condition2, index) in Data.condition2" :key="index"
  218. style="width: 100%;display: flex;justify-content: center;align-items: center; margin-top: 10px;">
  219. <el-form :inline="true" @submit.stop.prevent :model="condition2" :rules="condition2Rules">
  220. <el-form-item :label="index === 0 ? '条&#8195;&#8195;件:' : '附加条件:'" style="width: 130%;">
  221. <el-row :gutter="20" style="width: 100%;">
  222. <el-col :span="8">
  223. <div style="flex:1;">
  224. <span style="margin-right: 13px;">维修类型:</span>
  225. <el-form-item prop="Left" style="display:flex">
  226. <el-select v-model="condition2.Left" placeholder="请选择">
  227. <el-option
  228. v-for="item in Data.alarmproType"
  229. :key="item"
  230. :label="item"
  231. :value="item"
  232. />
  233. </el-select>
  234. </el-form-item>
  235. </div>
  236. </el-col>
  237. <el-col :span="8">
  238. <div style="flex:1;">
  239. <span style="margin-right: 13px;">维修状态:</span>
  240. <el-form-item prop="Right" style="display:flex">
  241. <el-select v-model="condition2.Right" placeholder="请选择" >
  242. <el-option
  243. v-for="item in Data.alarmproStatus"
  244. :key="item"
  245. :label="item"
  246. :value="item"
  247. />
  248. </el-select>
  249. </el-form-item>
  250. </div>
  251. </el-col>
  252. </el-row>
  253. </el-form-item>
  254. </el-form>
  255. </div>
  256. </div>
  257. <!-- 添加按钮 -->
  258. <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
  259. <el-button type="primary" icon="ele-Plus" style="font-size: large" @click="addRepairCondition" />
  260. <el-button v-if="Data.condition2.length > 1" type="primary" icon="ele-Minus" style="font-size: large" @click="removeCondition2" />
  261. </div>
  262. <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
  263. <el-form :inline="true" @submit.stop.prevent style="width: 60%;">
  264. <el-row justify="end" style="margin-top: 30px;">
  265. <el-button type="primary" @click="submitForm">保存</el-button>
  266. </el-row>
  267. </el-form>
  268. </div>
  269. </el-dialog>
  270. </div>
  271. </template>
  272. <script setup lang="ts" name="">
  273. import { onMounted, reactive, ref, watch } from 'vue';
  274. import { CirclePlusFilled } from '@element-plus/icons-vue'
  275. import { alarmRluesFilterModel } from "/@/api/admin/AlarmService/alarmRulesDto";
  276. import { alarmRulesApi } from "/@/api/admin/AlarmService/alarmRulesApi";
  277. import { RoleApi } from '/@/api/admin/Role'
  278. import { pushTemplateApi } from "/@/api/admin/AlarmService/pushTemplateApi";
  279. import { TemplateFilterDto } from "/@/api/admin/AlarmService/pushTemplateDto";
  280. import eventBus from "/@/utils/mitt";
  281. import { ElMessage, type FormRules } from 'element-plus'
  282. import { UserListItem } from "/@/api/admin/AlarmService/alarmRulesDto"; // 用户数据类型
  283. import { URLSearchParams } from 'url';
  284. // 条件验证规则
  285. const conditionRules = reactive<FormRules>({
  286. Left: [{ required: true, message: '请选择报警设备', trigger: 'change' }],
  287. inthe: [{ required: true, message: '请选择报警类型', trigger: 'change' }],
  288. Right: [{ required: true, message: '请选择报警来源', trigger: 'change' }]
  289. })
  290. const condition2Rules = reactive<FormRules>({
  291. Left: [{ required: true, message: '请选择维修类型', trigger: 'change' }],
  292. Right: [{ required: true, message: '请选择维修状态', trigger: 'change' }]
  293. })
  294. const Data = reactive({
  295. isShowDialog: false,
  296. showAlarmConditions: false, // 控制报警条件显示
  297. showRepairConditions: false, // 控制维修条件显示
  298. Filter: {
  299. ruleName: '',
  300. roleMappingId: [],
  301. labelId: "",
  302. remark: '',
  303. pushMethod: '',
  304. pushTemplateMappingID: [],
  305. regular: '',
  306. isExclusive: false,
  307. isExclusiveMaintenance: false,
  308. taskPriority: 1,
  309. triggerMethod: null, // 这里应根据实际情况设置默认值,比如0表示其中之一条件满足即触发
  310. maintenanceTriggerMethod:null,
  311. conditionsJson: '' as any,
  312. maintenanceJson: '' as any,
  313. pushUserid: [] as number[], // 选中的用户ID数组
  314. userName:"",
  315. userPhone:"",
  316. userId:"",
  317. condition2:"",
  318. condition:"",
  319. mode1:''
  320. } as unknown as alarmRluesFilterModel,
  321. /** 角色列表 */
  322. roleList: [] as any,
  323. // 标签列表
  324. labelList: [] as any,
  325. userList: [] as UserListItem[], // 用户列表
  326. /** 推送方式绑定数据 */
  327. radioValue1: false,
  328. radioValue2: false,
  329. /** 模板绑定数据 */
  330. mode1: '',
  331. mode2: '',
  332. /** 条件选择 */
  333. condition: [{
  334. Left: '',
  335. inthe: '',
  336. Right: ''
  337. }],
  338. condition2: [{
  339. Right: '',
  340. Left: ''
  341. }],
  342. alarmEquipment: ["安全装置","编码器","计控主板","监控微处理器","智能型控制阀","油气回收控制板","显示屏","计量器","加油机","油枪"],
  343. alarmType: ["加油机离线","通信异常","非法部件","厂商不符","绑定错误","监控微处理器报警","安全装置报警","加油机报警","检定"],
  344. alarmSource: ['云平台', '安全装置'],
  345. alarmproType: ["油机维修","装置维修"],
  346. alarmproStatus: ["正在维修","结束维修"]
  347. })
  348. const getUserList = async () => {
  349. try {
  350. const res = await new alarmRulesApi().getWxUserRole({});
  351. console.log('getWxUserRole接口返回数据:', res);
  352. const userDataArray = res.data || [];
  353. const userMap = new Map<string, UserListItem[]>();
  354. userDataArray.forEach((roleObj) => {
  355. const roleName = roleObj.roleName;
  356. roleObj.users.forEach((userObj) => {
  357. if (!userMap.has(roleName)) {
  358. userMap.set(roleName, []);
  359. }
  360. userMap.get(roleName).push({
  361. id: userObj.id,
  362. name: userObj.name,
  363. roleName: roleName
  364. });
  365. });
  366. });
  367. const groupedUsers = Array.from(userMap.entries()).map(([role, users]) => ({
  368. roleName: role,
  369. users: users
  370. }));
  371. Data.userList = groupedUsers;
  372. console.log('处理后的用户列表:', Data.userList);
  373. } catch (error) {
  374. console.error("获取用户列表失败:", error);
  375. ElMessage.error("用户列表加载失败");
  376. }
  377. };
  378. const templateData = reactive({
  379. Filter: {
  380. currentPage: 0,
  381. pageSize: 0,
  382. filter: {
  383. templateName: "",
  384. templateType: "",
  385. templateContent: "",
  386. id: 0
  387. }
  388. } as TemplateFilterDto,
  389. wxList: [] as any,
  390. emailList: [] as any
  391. })
  392. const radioChange = (() => {
  393. if (Data.radioValue1 == true) {
  394. Data.Filter.pushMethod = 'wx'
  395. if (Data.radioValue2 == true) {
  396. Data.Filter.pushMethod += ',email'
  397. }
  398. } else {
  399. if (Data.radioValue2 == true) {
  400. Data.Filter.pushMethod = 'email'
  401. } else {
  402. Data.Filter.pushMethod = ''
  403. }
  404. }
  405. })
  406. // 获取报警标签
  407. const getLabel = async () => {
  408. try {
  409. const res = await new RoleApi().getLabel({
  410. currentPage: 1,
  411. pageSize: 100,
  412. filter: {
  413. dictTypeId: 677693042573381 // 报警标签的字典类型ID
  414. }
  415. })
  416. Data.labelList = res.data?.list?.map((item: any) => ({
  417. id: item.id,
  418. name: item.name
  419. })) || []
  420. } catch (error) {
  421. console.error('获取标签失败:', error)
  422. Data.labelList = []
  423. }
  424. }
  425. // 获取角色列表
  426. const getRole = async () => {
  427. const res = await new RoleApi().getList()
  428. Data.roleList = res.data?.map(item => {
  429. return { 'id': item.id, 'name': item.name }
  430. })
  431. }
  432. // 查询模板信息
  433. const funSelect = async () => {
  434. const res = await new pushTemplateApi().getData(templateData.Filter)
  435. const data = res?.data
  436. templateData.wxList = (data as any)?.filter((item: any) => {
  437. if (item.templateType == "微信") {
  438. return { 'id': item.id, 'name': item.templateName }
  439. }
  440. })
  441. templateData.emailList = (data as any)?.filter((item: any) => {
  442. if (item.templateType == "邮箱") {
  443. return { 'id': item.id, 'name': item.templateName }
  444. }
  445. })
  446. }
  447. // 获取模板元素id
  448. const modeChange = (() => {
  449. const wxItem = templateData.wxList.filter(item => item.templateName === Data.mode1)
  450. const emailItem = templateData.emailList.filter(item => item.templateName === Data.mode1)
  451. console.log(Data.mode1,wxItem,emailItem,templateData.wxList,templateData.emailList)
  452. Data.Filter.pushTemplateMappingID = []
  453. if (!Data.Filter.pushTemplateMappingID.includes(Number(wxItem[0].id))) {
  454. Data.Filter.pushTemplateMappingID?.push(Number(wxItem[0].id))
  455. }
  456. if (!Data.Filter.pushTemplateMappingID.includes(Number(emailItem[0].id))) {
  457. Data.Filter.pushTemplateMappingID?.push(Number(emailItem[0].id))
  458. }
  459. })
  460. onMounted(() => {
  461. getLabel();
  462. getRole();
  463. funSelect();
  464. getUserList(); // 初始化时获取用户列表
  465. });
  466. // 添加报警条件
  467. const addCondition = () => {
  468. // 第一次点击添加按钮时显示条件区域
  469. if (!Data.showAlarmConditions) {
  470. Data.showAlarmConditions = true
  471. } else {
  472. // 验证当前条件是否已填写
  473. const lastCondition = Data.condition[Data.condition.length - 1]
  474. if (!lastCondition.Left || !lastCondition.inthe || !lastCondition.Right) {
  475. ElMessage.warning('请先填写当前条件的所有字段')
  476. return
  477. }
  478. // 添加新条件
  479. Data.condition.push({
  480. Left: '',
  481. inthe: '',
  482. Right: ''
  483. })
  484. }
  485. }
  486. // 添加维修条件
  487. const addRepairCondition = () => {
  488. // 第一次点击添加按钮时显示条件区域
  489. if (!Data.showRepairConditions) {
  490. Data.showRepairConditions = true
  491. } else {
  492. // 验证当前条件是否已填写
  493. const lastCondition = Data.condition2[Data.condition2.length - 1]
  494. if (!lastCondition.Left || !lastCondition.Right) {
  495. ElMessage.warning('请先填写当前条件的所有字段')
  496. return
  497. }
  498. // 添加新条件
  499. Data.condition2.push({
  500. Left: '',
  501. Right: ''
  502. })
  503. }
  504. }
  505. // 删除报警条件
  506. const removeCondition = () => {
  507. if (Data.condition.length > 1) {
  508. Data.condition.pop()
  509. } else {
  510. Data.showAlarmConditions = false
  511. Data.condition = [{
  512. Left: '',
  513. inthe: '',
  514. Right: ''
  515. }]
  516. }
  517. }
  518. // 删除维修条件
  519. const removeCondition2 = () => {
  520. if (Data.condition2.length > 1) {
  521. Data.condition2.pop()
  522. } else {
  523. Data.showRepairConditions = false
  524. Data.condition2 = [{
  525. Left: '',
  526. Right: ''
  527. }]
  528. }
  529. }
  530. // 提交表单
  531. const submitForm = async () => {
  532. // 验证必填字段
  533. if (!Data.Filter.ruleName) {
  534. ElMessage.warning('请输入规则名称')
  535. return
  536. }
  537. // if (!Data.Filter.labelId) {
  538. // ElMessage.warning('请选择标签')
  539. // return
  540. // }
  541. if (!Data.Filter.pushUserid || Data.Filter.pushUserid.length === 0) {
  542. ElMessage.warning('请选择推送用户')
  543. return
  544. }
  545. if (Data.radioValue1 && !Data.mode1) {
  546. ElMessage.warning('请选择微信模板')
  547. return
  548. }
  549. if (Data.radioValue2 && !Data.mode2) {
  550. ElMessage.warning('请选择邮箱模板')
  551. return
  552. }
  553. // if (Data.Filter.taskPriority < 1 || Data.Filter.taskPriority > 9) {
  554. // ElMessage.warning('请设置有效的优先级(1-9)')
  555. // return
  556. // }
  557. // if (Data.Filter.triggerMethod === null) {
  558. // ElMessage.warning('请选择报警触发方式')
  559. // return
  560. // }
  561. // if (Data.Filter.triggerMethod2 === null) {
  562. // ElMessage.warning('请选择维修触发方式')
  563. // return
  564. // }
  565. // 验证条件
  566. if (Data.showAlarmConditions) {
  567. for (const cond of Data.condition) {
  568. if (!cond.Left || !cond.inthe || !cond.Right) {
  569. ElMessage.warning('请填写所有报警条件字段')
  570. return
  571. }
  572. }
  573. }
  574. if (!Data.Filter.pushUserid || Data.Filter.pushUserid.length === 0) {
  575. ElMessage.warning('请选择推送用户');
  576. return;
  577. }
  578. let pushUserIds = Data.Filter.pushUserid;
  579. if (!Array.isArray(pushUserIds)) {
  580. pushUserIds = [pushUserIds]; // 转换为数组
  581. }
  582. if (Data.showRepairConditions) {
  583. for (const cond of Data.condition2) {
  584. if (!cond.Left || !cond.Right) {
  585. ElMessage.warning('请填写所有维修条件字段')
  586. return
  587. }
  588. }
  589. }
  590. // // 如果没有添加任何条件
  591. // if (!Data.showAlarmConditions && !Data.showRepairConditions) {
  592. // ElMessage.warning('请至少添加一种条件')
  593. // return
  594. // }
  595. // 准备提交数据
  596. const submitData = {
  597. ...Data.Filter,
  598. conditionsJson: Data.showAlarmConditions ? JSON.stringify(Data.condition) : null,
  599. maintenanceJson: Data.showRepairConditions ? JSON.stringify(Data.condition2) : null,
  600. pushUserid: pushUserIds,
  601. }
  602. console.log('提交数据', submitData)
  603. try {
  604. await new alarmRulesApi().addForm(submitData)
  605. ElMessage.success('保存成功')
  606. eventBus.emit('refreshView')
  607. Data.isShowDialog = false
  608. } catch (error) {
  609. console.error('保存失败:', error)
  610. ElMessage.error('保存失败')
  611. }
  612. }
  613. /**
  614. * 根据参数 打开表单
  615. * @param row
  616. */
  617. const openDialog = (row: alarmRluesFilterModel) => {
  618. console.log(row)
  619. if(row){
  620. console.log(Data.Filter)
  621. const { triggerMethod, maintenanceTriggerMethod, ruleName, roleMappingId, labelId,pushUserid,condition,condition2,isExclusive,isExclusiveMaintenance,regular,...rest } = Data.Filter;
  622. Data.Filter = { ...rest, ...row };
  623. Data.Filter.triggerMethod = triggerMethod || Data.Filter.triggerMethod;
  624. Data.Filter.maintenanceTriggerMethod = maintenanceTriggerMethod || Data.Filter.maintenanceTriggerMethod;
  625. Data.Filter.roleMappingId = roleMappingId || Data.Filter.roleMappingId;
  626. Data.Filter.condition2 = condition2 || Data.Filter.condition2;
  627. Data.Filter.condition = condition || Data.Filter.condition;
  628. Data.Filter.labelId = labelId || Data.Filter.labelId;
  629. Data.Filter.ruleName = ruleName || Data.Filter.ruleName;
  630. Data.Filter.pushUserid = pushUserid || Data.Filter.pushUserid;
  631. Data.Filter.regular = regular || Data.Filter.regular;
  632. Data.Filter.isExclusive = Boolean(row.isExclusive);
  633. Data.Filter.isExclusiveMaintenance = Boolean(row.isExclusiveMaintenance);
  634. Data.Filter.pushUserid = Array.isArray(row.pushUserid)
  635. ? row.pushUserid
  636. : [row.pushUserid || 0]; // 处理可能的非数组情况
  637. if(row.pushTemplateMappingID != undefined && row.pushTemplateMappingID.length > 0) {
  638. const id = row.pushTemplateMappingID[0]
  639. const wxItem = templateData.wxList.filter(item => item.id === id);
  640. const emailItem = templateData.emailList.filter(item => item.id === id);
  641. if(wxItem != undefined) {
  642. Data.mode1 = wxItem[0].templateName
  643. } else {
  644. Data.mode1 = emailItem[0].templateName
  645. }
  646. }
  647. const temp = <string[]>Data.Filter.pushMethod?.split(',');
  648. for (var i = 0; i < temp.length; i++) {
  649. if (temp[i] == '微信') {
  650. Data.radioValue1 = true;
  651. } else if (temp[i] == '电子邮箱') {
  652. Data.radioValue2 = true;
  653. }
  654. }
  655. // 如果有条件数据,解析并显示
  656. // 解析报警条件
  657. if (row.conditionsJson) {
  658. try {
  659. const alarmConditions = JSON.parse(row.conditionsJson);
  660. if (alarmConditions && alarmConditions.length > 0) {
  661. Data.condition = alarmConditions;
  662. Data.showAlarmConditions = true;
  663. }
  664. } catch (e) {
  665. console.error('解析报警条件JSON失败:', e);
  666. }
  667. }
  668. // 解析维修条件
  669. if (row.maintenanceJson) {
  670. try {
  671. const repairConditions = JSON.parse(row.maintenanceJson);
  672. if (repairConditions && repairConditions.length > 0) {
  673. Data.condition2 = repairConditions;
  674. Data.showRepairConditions = true;
  675. }
  676. } catch (e) {
  677. console.error('解析维修条件JSON失败:', e);
  678. }
  679. }
  680. console.log(Data.Filter,Data.mode1)
  681. } else {
  682. Data.Filter = {
  683. ruleName: '',
  684. roleMappingId: [],
  685. labelId: null,
  686. remark: '',
  687. pushMethod: '',
  688. pushTemplateMappingID: [],
  689. regular: '',
  690. isExclusive: false,
  691. isExclusiveMaintenance: false,
  692. taskPriority: 1,
  693. triggerMethod: null,
  694. conditionsJson: null,
  695. maintenanceJson: null,
  696. maintenanceTriggerMethod:null,
  697. pushUserid: []
  698. } as unknown as alarmRluesFilterModel;
  699. Data.mode1 = "",
  700. Data.condition = [{
  701. Left: '',
  702. inthe: '',
  703. Right: ''
  704. }]
  705. Data.showAlarmConditions = false
  706. Data.condition2 = [{
  707. Left: '',
  708. inthe: '',
  709. Right: ''
  710. }]
  711. Data.showRepairConditions = false
  712. }
  713. Data.isShowDialog = true;
  714. };
  715. defineExpose({
  716. openDialog,
  717. })
  718. </script>
  719. <style scoped lang="scss">
  720. .my-el-link {
  721. font-size: 12px;
  722. }
  723. .el-form {
  724. width: 60%;
  725. }
  726. .el-form .el-col{
  727. margin: 0 !important;
  728. }
  729. /* 输入框标签固定四个字符宽度 */
  730. ::v-deep .el-form-item__label {
  731. width: 100px;
  732. justify-content: start;
  733. }
  734. .el-input {
  735. width: 240px;
  736. }
  737. .el-select .el-input {
  738. width: 500px;
  739. }
  740. .sign {
  741. border: 0;
  742. }
  743. :deep(.sign .el-input__wrapper) {
  744. box-shadow: none !important;
  745. }
  746. .el-select-dropdown__item {
  747. text-align: center;
  748. }
  749. .el-row {
  750. margin-bottom: 20px;
  751. }
  752. .el-col {
  753. padding: 0 10px;
  754. }
  755. .condition-label {
  756. min-width: 80px;
  757. text-align: right;
  758. margin-right: 10px;
  759. }
  760. .dynamic-condition {
  761. margin-top: 15px;
  762. padding: 10px;
  763. border: 1px solid #ebeef5;
  764. border-radius: 4px;
  765. background-color: #fafafa;
  766. }
  767. </style>