add-alarmRules.vue 29 KB

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