addWarningDialog.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730
  1. <template>
  2. <ele-modal
  3. :title="dialogType == 'add' ? '新增' : 'edit' ? '修改' : '详情'"
  4. :visible.sync="addWarningDialog"
  5. width="60%"
  6. :close-on-click-modal="true"
  7. :close-on-press-escape="false"
  8. :before-close="handleClose"
  9. :maxable="true"
  10. >
  11. <el-tabs
  12. type="border-card"
  13. v-model="tabActiveName"
  14. v-loading="saveLoading"
  15. @tab-click="handleTabClick"
  16. >
  17. <el-tab-pane label="基本信息" name="baseInfo">
  18. <el-form
  19. :model="baseInfoForm"
  20. :rules="baseInfoFormRules"
  21. ref="baseInfoFormRef"
  22. label-width="120px"
  23. :disabled="dialogType == 'view'"
  24. >
  25. <el-row>
  26. <el-col :span="12">
  27. <el-form-item label="告警级别:" prop="level">
  28. <el-select filterable v-model="baseInfoForm.level" size="small">
  29. <el-option label="提示" :value="1"></el-option>
  30. <el-option label="一般" :value="2"></el-option>
  31. <el-option label="严重" :value="3"></el-option>
  32. <el-option label="紧急" :value="4"></el-option>
  33. <el-option label="致命" :value="5"></el-option>
  34. </el-select>
  35. </el-form-item>
  36. </el-col>
  37. <el-col :span="12">
  38. <el-form-item
  39. label="告警设备:"
  40. prop="deviceName"
  41. style="width: 90%"
  42. >
  43. <el-input
  44. v-model="baseInfoForm.deviceName"
  45. style="width: 80%"
  46. placeholder="请选择"
  47. readonly
  48. @click.native="
  49. $refs.materialAddRef.open(
  50. null,
  51. null,
  52. false,
  53. null,
  54. null,
  55. true
  56. )
  57. "
  58. ></el-input>
  59. </el-form-item>
  60. </el-col>
  61. </el-row>
  62. <el-row>
  63. <el-col :span="12">
  64. <el-form-item label="告警名称:" prop="name">
  65. <el-input
  66. v-model="baseInfoForm.name"
  67. style="width: 80%"
  68. placeholder="请输入告警名称"
  69. size="small"
  70. ></el-input>
  71. </el-form-item>
  72. </el-col>
  73. <el-col :span="12">
  74. <el-form-item label="选择生成单据:">
  75. <el-radio-group
  76. v-model="baseInfoForm.generateDocumentType"
  77. @change="isCreateChange"
  78. >
  79. <el-radio :label="3">维修</el-radio>
  80. <el-radio :label="1">巡点检</el-radio>
  81. <el-radio :label="2">保养</el-radio>
  82. <el-radio :label="5">量具送检</el-radio>
  83. </el-radio-group>
  84. </el-form-item>
  85. </el-col>
  86. </el-row>
  87. <el-row>
  88. <el-col :span="24">
  89. <el-form-item label="告警描述:">
  90. <el-input
  91. type="textarea"
  92. :rows="3"
  93. resize="none"
  94. size="small"
  95. v-model="baseInfoForm.description"
  96. placeholder="请输入告警描述"
  97. style="width: 85%"
  98. ></el-input>
  99. </el-form-item>
  100. </el-col>
  101. </el-row>
  102. <el-row>
  103. <el-col :span="12">
  104. <el-form-item label="触发条件:" prop="triggerLogic">
  105. <el-select
  106. filterable
  107. v-model="baseInfoForm.triggerLogic"
  108. size="small"
  109. >
  110. <el-option
  111. label="当满足以下所有条件时"
  112. :value="1"
  113. ></el-option>
  114. <el-option
  115. label="当满足以下任一条件时"
  116. :value="2"
  117. ></el-option>
  118. </el-select>
  119. </el-form-item>
  120. </el-col>
  121. <el-col :span="24" class="table_wrapper">
  122. <el-table :data="baseInfoForm.conditions" style="width: 100%">
  123. <el-table-column label="">
  124. <template slot-scope="scope">
  125. <el-select
  126. filterable
  127. v-model="scope.row.attributeCode"
  128. size="small"
  129. style="width: 100%"
  130. placeholder="请选择"
  131. >
  132. <el-option
  133. v-for="item in temperatureList"
  134. :key="item.identifier"
  135. :value="item.identifier"
  136. :label="item.name"
  137. @click.native="attributeChange(item, scope.$index)"
  138. ></el-option>
  139. </el-select>
  140. </template>
  141. </el-table-column>
  142. <el-table-column label="">
  143. <template slot-scope="scope">
  144. <DictSelection
  145. dictName="告警触发条件"
  146. clearable
  147. v-model="scope.row.operator"
  148. >
  149. </DictSelection>
  150. </template>
  151. </el-table-column>
  152. <el-table-column label="">
  153. <template slot-scope="scope">
  154. <el-input
  155. v-model="scope.row.thresholdValue"
  156. oninput="value=value.replace(/[^\d.]/g,'')"
  157. size="small"
  158. placeholder="请输入值"
  159. ></el-input>
  160. </template>
  161. </el-table-column>
  162. <el-table-column label="" width="70">
  163. <template slot-scope="scope">
  164. <div class="alarm_trigger_handler">
  165. <div
  166. v-if="scope.$index < baseInfoForm.conditions.length - 1"
  167. >
  168. <span v-if="baseInfoForm.triggerLogic === 1">且</span>
  169. <span v-if="baseInfoForm.triggerLogic === 2">或</span>
  170. </div>
  171. <el-button
  172. v-if="scope.$index > 0"
  173. type="text"
  174. @click="handleDeleteTriggerCondition(scope.$index)"
  175. >删除</el-button
  176. >
  177. </div>
  178. </template>
  179. </el-table-column>
  180. </el-table>
  181. <el-button
  182. type="text"
  183. icon="el-icon-plus"
  184. @click="handleAddTriggerCondition"
  185. >增加条件</el-button
  186. >
  187. </el-col>
  188. </el-row>
  189. </el-form>
  190. <el-button
  191. v-if="[1, 2, 5].includes(baseInfoForm.generateDocumentType)"
  192. type="primary"
  193. size="small"
  194. style="margin-bottom: 10px"
  195. @click="handleAddTab"
  196. >添加规则</el-button
  197. >
  198. <div
  199. class="el-tab_box"
  200. v-if="[1, 2, 5].includes(baseInfoForm.generateDocumentType)"
  201. >
  202. <div class="ruleMatters_box">
  203. <header-title title="规则事项">
  204. <div>
  205. <el-button
  206. size="small"
  207. icon="el-icon-plus"
  208. class="ele-btn-icon"
  209. type="primary"
  210. @click="addPostscript"
  211. >新增</el-button
  212. >
  213. </div>
  214. </header-title>
  215. <el-table :data="baseInfoForm.workItems" border>
  216. <el-table-column label="序号" width="50">
  217. <template slot-scope="scope">
  218. <span>{{ scope.$index + 1 }}</span>
  219. </template>
  220. </el-table-column>
  221. <el-table-column
  222. label="零部件编码"
  223. prop="categoryCode"
  224. width="100"
  225. >
  226. <template slot-scope="scope">
  227. <div>
  228. <el-input
  229. v-model="scope.row.categoryCode"
  230. placeholder="请输入零部件编码"
  231. ></el-input>
  232. </div>
  233. </template>
  234. </el-table-column>
  235. <el-table-column
  236. label="零部件名称"
  237. prop="categoryName"
  238. width="100"
  239. >
  240. <template slot-scope="scope">
  241. <div>
  242. <el-input
  243. v-model="scope.row.categoryName"
  244. placeholder="请输入零部件名称"
  245. ></el-input>
  246. </div>
  247. </template>
  248. </el-table-column>
  249. <el-table-column label="事项" prop="name" width="100">
  250. <template slot-scope="scope">
  251. <div>
  252. <el-input
  253. v-model="scope.row.name"
  254. placeholder="请输入内容"
  255. ></el-input>
  256. </div>
  257. </template>
  258. </el-table-column>
  259. <el-table-column label="内容" prop="content" width="200">
  260. <template slot-scope="scope">
  261. <div>
  262. <el-input
  263. v-model="scope.row.content"
  264. placeholder="请输入内容"
  265. ></el-input>
  266. </div>
  267. </template>
  268. </el-table-column>
  269. <el-table-column label="操作指导" prop="operationGuide">
  270. <template slot-scope="scope">
  271. <div
  272. class="operationGuide_box"
  273. @click="
  274. openOperationGuideDialogDialog(
  275. scope.row.operationGuide,
  276. scope.$index
  277. )
  278. "
  279. >
  280. <div class="left_content">
  281. <template v-if="scope.row.operationGuide">
  282. <div
  283. v-for="(item, index) in scope.row.operationGuide
  284. .toolList"
  285. :key="item.id"
  286. >{{ index + 1 }}.{{ item.name }}</div
  287. >
  288. </template>
  289. </div>
  290. <div class="right_content">
  291. <template v-if="scope.row.operationGuide">
  292. <div
  293. v-for="(item, index) in scope.row.operationGuide
  294. .procedureList"
  295. :key="item.id"
  296. >{{ index + 1 }}.{{ item.content }}</div
  297. >
  298. </template>
  299. </div>
  300. </div>
  301. </template>
  302. </el-table-column>
  303. <el-table-column label="标准" prop="norm" width="100">
  304. <template slot-scope="scope">
  305. <div>
  306. <el-input
  307. v-model="scope.row.norm"
  308. placeholder="请输入内容"
  309. ></el-input>
  310. </div>
  311. </template>
  312. </el-table-column>
  313. <el-table-column label="操作" width="100">
  314. <template slot-scope="scope">
  315. <el-button type="text" @click="deleteItem(scope.$index)"
  316. >删除</el-button
  317. >
  318. </template>
  319. </el-table-column>
  320. </el-table>
  321. </div>
  322. </div>
  323. </el-tab-pane>
  324. <!-- <el-tab-pane label="短信设置" name="shortMessage" disabled
  325. >短信设置</el-tab-pane
  326. >
  327. <el-tab-pane label="邮箱设置" name="email" disabled>邮箱设置</el-tab-pane> -->
  328. <el-tab-pane label="通知设置" name="notice">
  329. <div class="add_notice_table_row">
  330. <el-button type="primary" size="small" @click="handleAddNoticeRow"
  331. >添加</el-button
  332. >
  333. </div>
  334. <el-table :data="baseInfoForm.notices" style="width: 100%" border>
  335. <el-table-column label="" align="center" width="60">
  336. <template slot-scope="scope">
  337. <span>{{ scope.$index + 1 }}</span>
  338. </template>
  339. </el-table-column>
  340. <el-table-column label="通知人" align="center">
  341. <template slot-scope="scope">
  342. <el-select
  343. filterable
  344. v-model="scope.row.receiverIds"
  345. size="small"
  346. >
  347. <el-option
  348. v-for="item in alarmNotifierList"
  349. :key="item.id"
  350. :value="item.id"
  351. :label="item.name"
  352. @click.native="receiver(item, scope.$index)"
  353. ></el-option>
  354. </el-select>
  355. </template>
  356. </el-table-column>
  357. <!-- <el-table-column label="手机号码" align="center">
  358. <template slot-scope="scope">
  359. <el-input
  360. v-model="scope.row.alarmNotifierPhone"
  361. size="small"
  362. placeholder="请输入手机号码"
  363. @blur="checkPhone(scope.$index, scope.row.alarmNotifierPhone)"
  364. ></el-input>
  365. </template>
  366. </el-table-column> -->
  367. <!-- <el-table-column label="邮箱" align="center">
  368. <template slot-scope="scope">
  369. <el-input
  370. v-model="scope.row.alarmNotifierMailbox"
  371. size="small"
  372. placeholder="请输入邮箱"
  373. @blur="checkMailbox(scope.$index, scope.row.mailbox)"
  374. ></el-input>
  375. </template>
  376. </el-table-column> -->
  377. <!-- <el-table-column label="通知方式" width="260px" align="center">
  378. <template slot-scope="scope">
  379. <el-checkbox v-model="scope.row.shortMessage">短信</el-checkbox>
  380. <el-checkbox v-model="scope.row.mail">邮件</el-checkbox>
  381. <el-checkbox v-model="scope.row.system">系统</el-checkbox>
  382. </template>
  383. </el-table-column> -->
  384. <el-table-column label="操作" width="70px" align="center">
  385. <template slot-scope="scope">
  386. <el-button
  387. type="text"
  388. @click="handleDeleteNoticeRow(scope.$index)"
  389. >删除</el-button
  390. >
  391. </template>
  392. </el-table-column>
  393. </el-table>
  394. </el-tab-pane>
  395. </el-tabs>
  396. <span slot="footer" class="dialog-footer">
  397. <el-button size="small" @click="handleClose">取 消</el-button>
  398. <el-button
  399. size="small"
  400. type="primary"
  401. @click="saveWarningSetting"
  402. v-if="dialogType != 'view'"
  403. >确 定</el-button
  404. >
  405. </span>
  406. <MaterialAdd ref="materialAddRef" @chooseEquipment="chooseEquipment">
  407. </MaterialAdd>
  408. <!-- 添加规则 -->
  409. <ele-modal
  410. width="800px"
  411. :visible="addDialog"
  412. :append-to-body="true"
  413. title="规则配置"
  414. :close-on-click-modal="true"
  415. :maxable="true"
  416. >
  417. <el-select v-model="ruleId" size="small" style="width: 100%" filterable>
  418. <el-option
  419. v-for="item in ruleNameList"
  420. :key="item.id"
  421. :value="item.id"
  422. :label="item.code + '-' + item.name"
  423. ></el-option>
  424. </el-select>
  425. <template v-slot:footer>
  426. <el-button @click="addDialog = false">取消</el-button>
  427. <el-button type="primary" @click="addRule"> 添加 </el-button>
  428. </template>
  429. </ele-modal>
  430. </ele-modal>
  431. </template>
  432. <script>
  433. import MaterialAdd from '@/views/maintenance/components/MaterialAdd.vue';
  434. import { getDetail } from '@/api/ruleManagement/matter';
  435. import { getRule } from '@/api/ruleManagement/plan';
  436. import { getUserPage } from '@/api/system/organization';
  437. import { getPhysicalModel } from '@/api/ledgerAssets/equipment';
  438. import { save, update, getById } from '@/api/warning/index.js';
  439. const defaultForm = {
  440. level: '', // 告警级别
  441. deviceId: '',
  442. deviceName: '',
  443. deviceCode: '',
  444. iotId: '',
  445. ruleId: '',
  446. name: '', // 告警名称
  447. generateDocumentType: null, // 是否生成保修工单
  448. description: '', // 告警描述
  449. triggerLogic: 1, // 告警触发条件类型选择
  450. alarmMode: '', // 告警方式
  451. conditions: [
  452. // {
  453. // attributeCode: 'identifier',
  454. // attributeName: '温度'
  455. // }
  456. {}
  457. ], // 基本信息触发条件表格
  458. notices: [
  459. {
  460. receiverIds: '', // 告警通知人id
  461. receiverName: '', // 告警通知人name
  462. noticeTypes: '3'
  463. }
  464. ] // 通知设置表格
  465. };
  466. export default {
  467. components: { MaterialAdd },
  468. props: {},
  469. data() {
  470. return {
  471. addWarningDialog: false,
  472. dialogType: 'add',
  473. addDialog: false,
  474. tabActiveName: 'baseInfo',
  475. ruleNameList: [],
  476. workItems: [],
  477. ruleId: '',
  478. saveLoading: false,
  479. baseInfoForm: { ...defaultForm },
  480. baseInfoFormRules: {
  481. level: [
  482. { required: true, message: '请选择告警级别', trigger: 'change' }
  483. ],
  484. deviceName: [
  485. { required: true, message: '请选择告警名称', trigger: 'blur' },
  486. { required: true, message: '请选择告警名称', trigger: 'change' }
  487. ],
  488. name: [
  489. { required: true, message: '请输入告警名称', trigger: 'blur' }
  490. ],
  491. triggerLogic: [
  492. { required: true, message: '请选择触发条件', trigger: 'change' }
  493. ]
  494. },
  495. alarmNotifierList: [], // 通知人用户列表
  496. temperatureList: []
  497. };
  498. },
  499. watch: {},
  500. methods: {
  501. async chooseEquipment(data) {
  502. this.baseInfoForm.deviceId = data.id;
  503. this.baseInfoForm.deviceName = data.name;
  504. this.baseInfoForm.deviceCode = data.code;
  505. this.baseInfoForm.deviceCode = data.code;
  506. this.baseInfoForm.iotId = data.iotId;
  507. this.baseInfoForm.conditions = [];
  508. getPhysicalModel(data.id).then((res) => {
  509. this.temperatureList = res.properties;
  510. });
  511. },
  512. // 获取通知人列表数据
  513. async getUserList() {
  514. try {
  515. let data = { pageNum: 1, size: -1 };
  516. const res = await getUserPage(data);
  517. this.alarmNotifierList = res.list;
  518. } catch (error) {}
  519. },
  520. async isCreateChange(val) {
  521. const res = await getRule({
  522. status: 1,
  523. type: val,
  524. pageNum: 1,
  525. size: -1
  526. });
  527. if (res.list) {
  528. this.ruleNameList = res.list || [];
  529. }
  530. },
  531. // tab栏切换
  532. handleTabClick(tab) {
  533. // 获取通知人下拉数据
  534. if (tab.name === 'notice') {
  535. this.getUserList();
  536. }
  537. },
  538. handleAddTab() {
  539. this.ruleId = '';
  540. this.addDialog = true;
  541. },
  542. async addRule() {
  543. const data = await getDetail(this.ruleId);
  544. this.baseInfoForm.ruleId = this.ruleId;
  545. this.baseInfoForm.workItems = data.ruleItems;
  546. this.addDialog = false;
  547. },
  548. /* 打开操作手册编辑款 */
  549. openOperationGuideDialogDialog(row, index) {
  550. if (this.dialogTitle !== '派单') {
  551. this.$refs.operationGuideDialog.open(row, index);
  552. }
  553. },
  554. attributeChange(item, index) {
  555. this.$set(
  556. this.baseInfoForm.conditions[index],
  557. 'attributeName',
  558. item.name
  559. );
  560. },
  561. receiver(item, index) {
  562. console.log(index, 'index');
  563. this.$set(this.baseInfoForm.notices[index], 'receiverName', item.name);
  564. },
  565. deleteItem(index) {
  566. if (this.baseInfoForm.workItems.length > 1) {
  567. this.baseInfoForm.workItems.splice(index, 1);
  568. } else {
  569. this.$message.error('至少要有一个规则事项!');
  570. }
  571. },
  572. addPostscript() {
  573. if (!this.baseInfoForm?.workItems?.length) {
  574. this.$message.error('请先添加规则!');
  575. return;
  576. }
  577. this.baseInfoForm.workItems.push({
  578. sort: null,
  579. name: '',
  580. content: '',
  581. norm: '',
  582. isNew: true,
  583. operationGuide: {
  584. procedureList: [],
  585. toolList: []
  586. }
  587. });
  588. },
  589. // 关闭新增弹窗
  590. handleClose() {
  591. this.addWarningDialog = false;
  592. this._resetDialogInfo();
  593. },
  594. async open(type, row) {
  595. this.tabActiveName = 'baseInfo';
  596. this.addWarningDialog = true;
  597. this.dialogType = type;
  598. if (row) {
  599. this.baseInfoForm = await getById(row.id);
  600. if (this.baseInfoForm.deviceId) {
  601. getPhysicalModel(this.baseInfoForm.deviceId).then((res) => {
  602. this.temperatureList = res.properties;
  603. });
  604. }
  605. }
  606. },
  607. // 增加触发条件
  608. handleAddTriggerCondition() {
  609. this.baseInfoForm.conditions.push({});
  610. },
  611. // 删除触发条件
  612. handleDeleteTriggerCondition(index) {
  613. this.baseInfoForm.conditions.splice(index, 1);
  614. },
  615. // 通知设置 - 添加表格一行
  616. handleAddNoticeRow() {
  617. this.baseInfoForm.notices.push({
  618. receiverIds: '', // 告警通知人id
  619. receiverName: '', // 告警通知人name
  620. noticeTypes: '3'
  621. });
  622. },
  623. // 通知设置 - 删除表格一行
  624. handleDeleteNoticeRow(index) {
  625. this.baseInfoForm.notices.splice(index, 1);
  626. },
  627. // 验证手机号
  628. checkPhone(index, phone) {
  629. const phoneReg = /^1[345789]\d{9}$/;
  630. if (phone && !phoneReg.test(phone)) {
  631. this.baseInfoForm.notices[index].alarmNotifierPhone = '';
  632. return this.$message.error('手机号码格式错误,请重新输入!');
  633. }
  634. },
  635. // 验证邮箱
  636. checkMailbox(index, mailbox) {
  637. const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/;
  638. if (mailbox && !mailReg.test(mailbox)) {
  639. this.baseInfoForm.notices[index].alarmNotifierMailbox = '';
  640. return this.$message.error('邮箱格式错误,请重新输入!');
  641. }
  642. },
  643. // 保存
  644. async saveWarningSetting() {
  645. let is = false;
  646. if (
  647. [1, 2, 5].includes(this.baseInfoForm.generateDocumentType) &&
  648. !this.baseInfoForm?.workItems?.length
  649. ) {
  650. this.$message.error('规则不能为空!');
  651. return;
  652. }
  653. if (!this.baseInfoForm?.conditions?.length) {
  654. this.$message.error('触发条件不能为空');
  655. return;
  656. } else {
  657. this.baseInfoForm?.conditions.forEach((item, index) => {
  658. console.log(item, 'item');
  659. if (!item.attributeCode || !item.operator || !item.thresholdValue) {
  660. is = true;
  661. }
  662. });
  663. }
  664. if (is) {
  665. this.$message.error('触发条件内容没填写完整,前检查!');
  666. return;
  667. }
  668. this.$refs.baseInfoFormRef.validate(async (valid) => {
  669. if (valid) {
  670. this.saveLoading = true;
  671. let api = this.baseInfoForm.id ? update : save;
  672. api(this.baseInfoForm)
  673. .then((res) => {
  674. this._resetDialogInfo();
  675. this.saveLoading = false;
  676. this.addWarningDialog = false;
  677. this.$emit('refreshList');
  678. this.$message.success('操作成功!');
  679. })
  680. .finally(() => {
  681. this.saveLoading = false;
  682. });
  683. }
  684. });
  685. },
  686. // 重置弹窗信息
  687. _resetDialogInfo() {
  688. this.baseInfoForm = {
  689. ...defaultForm
  690. };
  691. this.tabActiveName = 'baseInfo';
  692. this.$refs.baseInfoFormRef.resetFields();
  693. }
  694. }
  695. };
  696. </script>
  697. <style lang="scss" scoped>
  698. .table_wrapper {
  699. padding-left: 120px;
  700. padding-right: 8vw;
  701. ::v-deep .el-table__header-wrapper {
  702. display: none;
  703. }
  704. ::v-deep .el-table .cell {
  705. padding-left: 0;
  706. }
  707. }
  708. .add_notice_table_row {
  709. text-align: right;
  710. padding-bottom: 8px;
  711. }
  712. .alarm_trigger_handler {
  713. display: flex;
  714. align-items: center;
  715. justify-content: space-between;
  716. }
  717. ::v-deep .el-form-item {
  718. margin-bottom: 14px;
  719. }
  720. ::v-deep .el-form-item__error {
  721. padding-top: 0;
  722. }
  723. </style>