warnRule.vue 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666
  1. <template>
  2. <fullscreen :fullscreen.sync="fullscreen" class="container">
  3. <div class="container-box">
  4. <toolList @iconCli='iconCli' :tooltit='tooltit'></toolList>
  5. <div class="search">
  6. <mySearch :searchList="searchList" @searchInfo="searchInfo"></mySearch>
  7. <el-button class="btn-check" size="medium" type="primary" @click="dialogCheck(1)">添加
  8. </el-button>
  9. </div>
  10. <div class="tabbox">
  11. <el-table height="calc(100% - 40px)" class="com-table" ref="multipleTable" :data="tableData"
  12. tooltip-effect="dark" size="small" border style="width: 100%" :row-class-name="tableRowClassName">
  13. <el-table-column prop="ruleName" label="规则名称">
  14. </el-table-column>
  15. <el-table-column prop="preCata1" label="1级路径">
  16. </el-table-column>
  17. <el-table-column prop="preCata2" label="2级路径">
  18. </el-table-column>
  19. <el-table-column prop="preCata3" label="3级路径">
  20. </el-table-column>
  21. <el-table-column prop="preCata4" label="4级路径">
  22. </el-table-column>
  23. <el-table-column prop="preCata5" label="5级路径">
  24. </el-table-column>
  25. <el-table-column prop="preCata6" label="6级路径">
  26. </el-table-column>
  27. <el-table-column prop="preCata7" label="7级路径">
  28. </el-table-column>
  29. <el-table-column prop="keyWords" label="投诉关键字" width="100">
  30. </el-table-column>
  31. <el-table-column prop="compalineCnt" label="投诉数量">
  32. </el-table-column>
  33. <el-table-column prop="opNo" label="配置工号">
  34. </el-table-column>
  35. <el-table-column prop="opName" label="配置姓名">
  36. <template slot-scope="scope">
  37. <span>{{$desensitization(scope.row.opName,1)}}</span>
  38. </template>
  39. </el-table-column>
  40. <el-table-column prop="opTime" label="配置时间" width="140">
  41. </el-table-column>
  42. <el-table-column prop="overTimeFlag" label="是否生效">
  43. <template slot-scope="scope">
  44. <span>{{scope.row.overTimeFlag == '1'?'是':'否'}}</span>
  45. </template>
  46. </el-table-column>
  47. <el-table-column prop="alarmNum" label="已预警次数" width="100">
  48. </el-table-column>
  49. <el-table-column label="操作" width="160px" align="center" fixed="right">
  50. <template slot-scope="scope">
  51. <el-button size="mini" type="primary" @click="dialogCheck(2,scope.row)">查看</el-button>
  52. <el-button size="mini" type="primary" @click="dialogCheck(3,scope.row)">修改</el-button>
  53. <el-button size="mini" type="danger" @click="delLine(scope.row)">删除</el-button>
  54. </template>
  55. </el-table-column>
  56. </el-table>
  57. <el-pagination class="pageBox" @current-change="currchange" layout="prev, pager, next" background
  58. :total="total">
  59. </el-pagination>
  60. </div>
  61. <el-dialog :title="titname + '规则配置'" :visible.sync="dialogStatus" width="70%" :close-on-press-escape="false"
  62. :before-close="closedia" :show-close="true" :destroy-on-close="true" :modal-append-to-body="false"
  63. :close-on-click-modal="false" :fullscreen="true">
  64. <el-form :model="infolist" ref="infolist" :rules="rules"
  65. style="height: calc(100vh - 180px);overflow-y: scroll;">
  66. <div class="info-line" v-if="disableStatus">
  67. <el-form-item>
  68. <span>配置工号</span>
  69. <el-input v-model="infolist.opNo" placeholder="配置工号" disabled></el-input>
  70. </el-form-item>
  71. <el-form-item>
  72. <span>配置姓名</span>
  73. <el-input v-model="infolist.opName" placeholder="" disabled></el-input>
  74. </el-form-item>
  75. </div>
  76. <div class="info-line" v-if="disableStatus">
  77. <el-form-item>
  78. <span>配置时间</span>
  79. <el-input v-model="infolist.opTime" placeholder="配置时间" disabled></el-input>
  80. </el-form-item>
  81. <el-form-item>
  82. <span>规则状态</span>
  83. <el-input v-model="infolist.stsDesc" placeholder="规则状态" disabled></el-input>
  84. </el-form-item>
  85. </div>
  86. <div class="info-line">
  87. <el-form-item prop="ruleName">
  88. <span>规则名称</span>
  89. <el-input v-model="infolist.ruleName" placeholder="规则名称" :disabled="disableStatus">
  90. </el-input>
  91. </el-form-item>
  92. <el-form-item>
  93. <span>有效期</span>
  94. <el-date-picker v-model="infolist.validTime" type="date" placeholder="有效期"
  95. :disabled="disableStatus" value-format="yyyy-MM-dd hh:mm:ss">
  96. </el-date-picker>
  97. </el-form-item>
  98. </div>
  99. <el-form-item class="info-line online">
  100. <span>接收人</span>
  101. <deptTree v-if="!disableStatus" :closeList="closeList" class="tree" @treeCheck="treeCheck">
  102. </deptTree>
  103. <div :class="!disableStatus?'tree treeUser':'tree treeUserb'">
  104. <p v-for="(item,index) in treeList" :key="index">{{item.receiveName}}
  105. <i @click="deletes(item,index)" class="el-icon-error"></i>
  106. </p>
  107. </div>
  108. </el-form-item>
  109. <div class="info-line">
  110. <el-form-item>
  111. <span>预警周期</span>
  112. <el-select v-model="infolist.cycleCode" placeholder="预警周期" clearable
  113. :disabled="disableStatus">
  114. <el-option v-for="item in weekopt" :key="item.dataCode" :label="item.dataName"
  115. :value="item.dataCode">
  116. </el-option>
  117. </el-select>
  118. </el-form-item>
  119. <el-form-item>
  120. <span>1级路径</span>
  121. <el-select v-model="infolist.preCata1" placeholder="1级路径" clearable
  122. :disabled="disableStatus">
  123. <el-option v-for="item in preCataopt1" :key="item.dataCode" :label="item.dataName"
  124. :value="item.dataName">
  125. </el-option>
  126. </el-select>
  127. </el-form-item>
  128. <el-form-item>
  129. <span>2级路径</span>
  130. <el-select v-model="infolist.preCata2" placeholder="2级路径" clearable
  131. :disabled="disableStatus">
  132. <el-option v-for="item in preCataopt2" :key="item.dataCode" :label="item.dataName"
  133. :value="item.dataName">
  134. </el-option>
  135. </el-select>
  136. </el-form-item>
  137. <el-form-item>
  138. <span>3级路径</span>
  139. <el-select v-model="infolist.preCata3" placeholder="3级路径" clearable
  140. :disabled="disableStatus">
  141. <el-option v-for="item in preCataopt3" :key="item.dataCode" :label="item.dataName"
  142. :value="item.dataName">
  143. </el-option>
  144. </el-select>
  145. </el-form-item>
  146. <el-form-item>
  147. <span>4级路径</span>
  148. <el-select v-model="infolist.preCata4" placeholder="4级路径" clearable
  149. :disabled="disableStatus">
  150. <el-option v-for="item in preCataopt4" :key="item.dataCode" :label="item.dataName"
  151. :value="item.dataName">
  152. </el-option>
  153. </el-select>
  154. </el-form-item>
  155. <el-form-item>
  156. <span>5级路径</span>
  157. <el-select v-model="infolist.preCata5" placeholder="5级路径" clearable
  158. :disabled="disableStatus">
  159. <el-option v-for="item in preCataopt5" :key="item.dataCode" :label="item.dataName"
  160. :value="item.dataName">
  161. </el-option>
  162. </el-select>
  163. </el-form-item>
  164. <el-form-item>
  165. <span>6级路径</span>
  166. <el-select v-model="infolist.preCata6" placeholder="6级路径" clearable
  167. :disabled="disableStatus">
  168. <el-option v-for="item in preCataopt6" :key="item.dataCode" :label="item.dataName"
  169. :value="item.dataName">
  170. </el-option>
  171. </el-select>
  172. </el-form-item>
  173. <el-form-item>
  174. <span>7级路径</span>
  175. <el-select v-model="infolist.preCata7" placeholder="7级路径" clearable
  176. :disabled="disableStatus">
  177. <el-option v-for="item in preCataopt7" :key="item.dataCode" :label="item.dataName"
  178. :value="item.dataName">
  179. </el-option>
  180. </el-select>
  181. </el-form-item>
  182. <el-form-item>
  183. <span>投诉关键字</span>
  184. <el-input v-model="infolist.keyWords" placeholder="投诉关键字请用 , 分隔" :disabled="disableStatus">
  185. </el-input>
  186. </el-form-item>
  187. <el-form-item>
  188. <span>投诉数量</span>
  189. <el-input v-model="infolist.compalineCnt" placeholder="投诉数量" :disabled="disableStatus">
  190. </el-input>
  191. </el-form-item>
  192. <!-- <el-form-item>
  193. <span><i class="el-icon-question" @click="userbook = !userbook"></i></span>
  194. </el-form-item> -->
  195. <div v-if="" class="userbook">
  196. <span>1.接收人按部门选择,可选择多个人</span>
  197. <span>2.规则添加有效期,过期后不按照该规则进行稽核</span>
  198. <span>3.投诉关键字可填写多个 , 分隔</span>
  199. </div>
  200. </div>
  201. </el-form>
  202. <div slot="footer" class="dialog-footer">
  203. <el-button @click="dialogCli(1)" type="primary" v-if="btnsts !== 2">确 定</el-button>
  204. <el-button @click="dialogCli(2)" v-if="btnsts === 2">确 定</el-button>
  205. <el-button @click="dialogCli(2)">取 消</el-button>
  206. </div>
  207. </el-dialog>
  208. </div>
  209. </fullscreen>
  210. </template>
  211. <script>
  212. import mySearch from '../../../components/search'
  213. import toolList from '../../../components/toolList'
  214. import deptTree from '../../../components/deptTreeUser.vue'
  215. export default {
  216. components: {
  217. mySearch,
  218. toolList,
  219. deptTree
  220. },
  221. data() {
  222. const ruleName = (rule, value, callback) => {
  223. if (!this.infolist.ruleName) {
  224. callback(new Error('不能为空'))
  225. } else {
  226. callback()
  227. }
  228. }
  229. return {
  230. rules: {
  231. ruleName: [{
  232. required: true,
  233. trigger: 'blur',
  234. validator: ruleName
  235. }],
  236. },
  237. tooltit: '预警规则配置',
  238. fullscreen: false,
  239. total: 0,
  240. pageSize: 1,
  241. tableData: [{}],
  242. dialogStatus: false,
  243. infolist: {},
  244. typeOptions: [],
  245. titname: '',
  246. disableStatus: false,
  247. visiblec: [],
  248. visibleList: [],
  249. userInfo: {},
  250. searchList: [{
  251. type: 'input',
  252. tit: '规则名称',
  253. value: '',
  254. width: '48%'
  255. },
  256. {
  257. type: 'input',
  258. tit: '配置工号',
  259. value: '',
  260. width: '48%',
  261. },
  262. ],
  263. params: {},
  264. btnsts: 1,
  265. options2: [],
  266. weekopt: [],
  267. preCataopt1: [],
  268. preCataopt2: [],
  269. preCataopt3: [],
  270. preCataopt4: [],
  271. preCataopt5: [],
  272. preCataopt6: [],
  273. preCataopt7: [],
  274. userbook: false,
  275. treeList: [],
  276. closeList: []
  277. }
  278. },
  279. methods: {
  280. tableRowClassName({
  281. row,
  282. rowIndex
  283. }) {
  284. if (row.overTimeFlag == 0) {
  285. return 'warning-row';
  286. }else{
  287. return 'success-row';
  288. }
  289. },
  290. deletes(val, index) {
  291. this.treeList.splice(index, 1)
  292. this.closeList = this.treeList
  293. },
  294. treeCheck(v) {
  295. this.treeList = v;
  296. },
  297. closedia() {
  298. this.infolist = {};
  299. this.treeList = [];
  300. this.dialogStatus = false;
  301. },
  302. //搜索数据
  303. searchInfo(v) {
  304. this.params = {};
  305. v[0] ? this.params.ruleName = v[0] : '';
  306. v[1] ? this.params.opName = v[1] : '';
  307. this.getList(this.params, this.pageSize);
  308. },
  309. //获取列表
  310. getList(v, n) {
  311. this.pageSize = n;
  312. let _this = this;
  313. this.$http({
  314. url: "/market/calarm/queryPage",
  315. method: "post",
  316. headers: {
  317. "Content-Type": "application/json",
  318. "page": '{"pageNo":"' + n + '","pageSize":"10"}'
  319. },
  320. data: v,
  321. }).then((res) => {
  322. this.tableData = res.data.data;
  323. this.total = res.data.totalRecord;
  324. });
  325. },
  326. // 分页
  327. currchange(v) {
  328. this.pageSize = v;
  329. this.getList(this.params, this.pageSize);
  330. },
  331. //查看 修改 新增
  332. dialogCheck(v, n) {
  333. this.dialogStatus = true;
  334. this.disableStatus = false;
  335. this.btnsts = v;
  336. this.infolist = {};
  337. if (v === 1) {
  338. this.titname = '新建';
  339. this.getUser();
  340. return
  341. } else if (v === 2) {
  342. this.titname = '查看';
  343. this.disableStatus = true;
  344. } else if (v === 3) {
  345. this.titname = '修改';
  346. }
  347. this.infolist = Object.assign({}, n); //拷贝
  348. this.infolist.opName = this.$desensitization(this.infolist.opName, 1);
  349. this.$http({
  350. url: "/market/calarm/query",
  351. method: "post",
  352. headers: {
  353. "Content-Type": "application/json",
  354. "page": '{"pageNo":"' + n + '","pageSize":"10"}'
  355. },
  356. data: {
  357. id: n.id
  358. },
  359. }).then((res) => {
  360. this.infolist = res.data;
  361. this.treeList = res.data.sQaAlarmRuleReceiveList;
  362. });
  363. },
  364. dialogCli(v) {
  365. if (v === 2) {
  366. this.infolist = {};
  367. this.treeList = [];
  368. this.dialogStatus = false;
  369. return
  370. }
  371. // this.infolist.validTime = this.$formatDate(new Date(), "YYYY-MM-DD HH:mm:ss");
  372. this.infolist.opTime = this.$formatDate(new Date(), "YYYY-MM-DD HH:mm:ss");
  373. this.infolist.opName = this.userInfo.loginName;
  374. this.infolist.opNo = this.userInfo.loginNo;
  375. this.infolist.receiveNo = 'admi';
  376. this.infolist.sts = '0';
  377. this.infolist.stsDesc = '待审核';
  378. this.infolist.sQaAlarmRuleReceiveList = this.treeList;
  379. if (this.titname === '新建') {
  380. this.submitInfo("/market/calarm/add", v);
  381. } else if (this.titname === '修改') {
  382. this.submitInfo("/market/calarm/update", v);
  383. }
  384. },
  385. submitInfo(u, v) {
  386. let _this = this;
  387. this.$refs.infolist.validate(valid => {
  388. if (valid) {
  389. this.$http({
  390. url: u,
  391. method: "post",
  392. headers: {
  393. "Content-Type": "application/json",
  394. },
  395. data: this.infolist
  396. }).then((res) => {
  397. if (res.data.result === 1) {
  398. _this.$message({
  399. message: res.data.desc,
  400. type: 'error'
  401. });
  402. } else {
  403. _this.$message({
  404. message: '成功',
  405. type: 'success'
  406. });
  407. _this.infolist = {};
  408. _this.treeList = [];
  409. _this.dialogStatus = false;
  410. _this.getList(this.params, this.pageSize);
  411. }
  412. });
  413. }
  414. })
  415. },
  416. //删除
  417. delLine(v) {
  418. let _this = this;
  419. this.$confirm('即将删除此条数据, 是否删除?', '提示', {
  420. confirmButtonText: '确定',
  421. cancelButtonText: '取消',
  422. type: 'warning'
  423. }).then(() => {
  424. _this.$http({
  425. url: "/market/calarm/del",
  426. method: "post",
  427. headers: {
  428. "Content-Type": "application/json",
  429. },
  430. data: {
  431. id: v.id
  432. }
  433. }).then((res) => {
  434. if (res.data.result === 1) {
  435. _this.$message({
  436. message: res.data.desc,
  437. type: 'error'
  438. });
  439. } else {
  440. _this.$message({
  441. message: '删除成功',
  442. type: 'success'
  443. });
  444. _this.getList(this.params, this.pageSize);
  445. }
  446. });
  447. })
  448. },
  449. //处理所需数据
  450. verifall(v) {
  451. for (let i = 0; i < this.options2.length; i++) {
  452. if (this.options2[i].dataCode === v) {
  453. this.infolist.regionCode = v;
  454. this.infolist.regionName = this.options2[i].dataName;
  455. }
  456. }
  457. },
  458. //功能栏
  459. iconCli(v) {
  460. if (v === 1) {
  461. this.getList(this.params, this.pageSize);
  462. }
  463. if (v === 2) {
  464. this.fullscreen = !this.fullscreen
  465. }
  466. },
  467. //获取部门
  468. getDepot() {
  469. this.$http({
  470. url: "/sysmgr/sysdept/queryList",
  471. method: "post",
  472. headers: {
  473. "Content-Type": "application/json",
  474. },
  475. data: {},
  476. }).then((res) => {
  477. this.typeOptions = res.data;
  478. });
  479. },
  480. getListsf() {
  481. this.$http({
  482. url: "/market/cfgDataDict/queryList",
  483. method: "post",
  484. headers: {
  485. "Content-Type": "application/json",
  486. },
  487. data: {
  488. dictCode: 'region'
  489. },
  490. }).then((res) => {
  491. this.options2 = res.data;
  492. });
  493. },
  494. getUser() {
  495. this.userInfo = JSON.parse(window.sessionStorage.userInfo);
  496. this.infolist = {
  497. opNo: '',
  498. opName: '',
  499. };
  500. this.infolist.opNo = this.userInfo.loginNo;
  501. this.infolist.opName = this.userInfo.loginName;
  502. },
  503. getlj() {
  504. this.$http({
  505. url: "/sysmgr/cfgDataDicts/queryMap",
  506. method: "post",
  507. headers: {
  508. "Content-Type": "application/json",
  509. },
  510. data: {
  511. dictCodePks: 'pre_cata_1,pre_cata_2,pre_cata_3,pre_cata_4,pre_cata_5,pre_cata_6,pre_cata_7,alarmCycle'
  512. },
  513. }).then((res) => {
  514. this.weekopt = res.data.body.alarmCycle;
  515. this.preCataopt1 = res.data.body.pre_cata_1;
  516. this.preCataopt2 = res.data.body.pre_cata_2;
  517. this.preCataopt3 = res.data.body.pre_cata_3;
  518. this.preCataopt4 = res.data.body.pre_cata_4;
  519. this.preCataopt5 = res.data.body.pre_cata_5;
  520. this.preCataopt6 = res.data.body.pre_cata_6;
  521. this.preCataopt7 = res.data.body.pre_cata_7;
  522. });
  523. },
  524. },
  525. mounted() {
  526. this.getList(this.params, this.pageSize);
  527. this.getUser();
  528. this.getListsf();
  529. this.getlj();
  530. },
  531. created() {
  532. }
  533. }
  534. </script>
  535. <style scoped lang="scss">
  536. .userbook {
  537. border: 2px dotted #00A0E9;
  538. width: 100% !important;
  539. padding: 0 10px;
  540. border-radius: 5px;
  541. span {
  542. display: inline-block;
  543. width: 100% !important;
  544. margin: 5px 0;
  545. }
  546. }
  547. .el-icon-question {
  548. font-size: 20px;
  549. color: #ddd !important;
  550. cursor: pointer;
  551. }
  552. .dialog-footer {
  553. padding-right: 20px;
  554. margin-top: 10px;
  555. }
  556. .tabbox {
  557. margin-top: 16px;
  558. }
  559. .pageBox {
  560. text-align: right;
  561. margin-top: 10px;
  562. }
  563. .info-line {
  564. width: 100%;
  565. display: block;
  566. padding-left: 20px;
  567. div {
  568. width: 50%;
  569. display: inline-block;
  570. }
  571. span {
  572. width: 80px;
  573. display: inline-block;
  574. text-align: left;
  575. i {
  576. color: red;
  577. display: inline-block;
  578. padding-right: 5px;
  579. }
  580. }
  581. .el-select,
  582. .el-input {
  583. width: calc(100% - 100px);
  584. }
  585. }
  586. .online {
  587. width: 100%;
  588. .el-select {
  589. width: calc(100% - 100px);
  590. }
  591. span {
  592. vertical-align: top;
  593. }
  594. .el-textarea {
  595. width: calc(100% - 100px);
  596. }
  597. .tree {
  598. width: calc(50% - 60px);
  599. display: inline-block;
  600. margin-right: 20px;
  601. height: 300px;
  602. overflow-y: scroll;
  603. .el-icon-error {
  604. float: right;
  605. font-size: 20px;
  606. margin-top: 9px;
  607. cursor: pointer;
  608. }
  609. }
  610. .treeUser {
  611. margin: 0;
  612. border: 1px solid #ddd;
  613. p {
  614. background: #f4f4f4;
  615. padding: 0 20px;
  616. margin-bottom: 5px;
  617. }
  618. }
  619. .treeUserb {
  620. width: calc(100% - 100px);
  621. border: 1px solid #ddd;
  622. background: #f4f4f4;
  623. border-radius: 3px;
  624. height: auto;
  625. overflow: hidden;
  626. p {
  627. display: inline-block;
  628. padding: 0 20px;
  629. margin-bottom: 5px;
  630. }
  631. }
  632. }
  633. </style>