index.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512
  1. <template>
  2. <div class="app-container">
  3. <div class="table">
  4. <div class="search">
  5. <el-button class="success" icon="el-icon-plus" @click="handleCreate">新增</el-button>
  6. </div>
  7. <el-table
  8. :key="table.tableKey"
  9. v-loading="table.listLoading"
  10. element-loading-text="给我一点时间"
  11. :data="table.list"
  12. border
  13. fit
  14. highlight-current-row
  15. style="width: 100%;"
  16. :row-style="rowStyle"
  17. :cell-style="cellStyle"
  18. class="elTable table-fixed"
  19. :max-height="myHeight"
  20. >
  21. <el-table-column label="消息名称" min-width="130px" align="center" prop="rolename" />
  22. <el-table-column label="触发条件" min-width="130px" align="center" prop="rolename" />
  23. <el-table-column label="提醒类型" min-width="130px" align="center" prop="rolename" />
  24. <el-table-column label="推送方式" min-width="130px" align="center" prop="rolename" />
  25. <el-table-column label="详细配置" min-width="130px" align="center" prop="rolename" />
  26. <el-table-column label="提醒对象" min-width="130px" align="center" prop="rolename" />
  27. <el-table-column label="操作" align="center" width="150" class-name="small-padding fixed-width" fixed="right">
  28. <template slot-scope="{row}">
  29. <a class="correcting" size="mini" style="width: 80px;" @click="handleSetUp(row)">设置</a>
  30. </template>
  31. </el-table-column>
  32. </el-table>
  33. </div>
  34. <el-dialog :title="textMap[setUp.dialogStatus]" :visible.sync="setUp.dialogFormVisible" :close-on-click-modal="false" width="70%">
  35. <div class="setup">
  36. <div style="height: 500px;">
  37. <el-row :gutter="20">
  38. <el-col :span="8">
  39. <el-form ref="temp" :rules="temp.rules" :model="temp" label-position="right" label-width="110px" style="width: 100%;margin:0 auto">
  40. <el-row>
  41. <el-col :span="24">
  42. <el-form-item label="消息名称:" prop="messageName">
  43. <el-input v-model="temp.messageName" style="width: 100%;" class="filter-item" placeholder="消息名称" />
  44. </el-form-item>
  45. </el-col>
  46. </el-row>
  47. <el-row>
  48. <el-col :span="24">
  49. <el-form-item label="触发条件:" prop="triggerCondition">
  50. <el-input ref="triggerCondition" v-model="temp.triggerCondition" style="width: 100%;" class="filter-item" placeholder="触发条件" type="text" />
  51. </el-form-item>
  52. </el-col>
  53. </el-row>
  54. <el-row>
  55. <el-col :span="24">
  56. <el-form-item label="发送方式:" prop="sendingMethod">
  57. <el-select v-model="temp.sendingMethod" style="width: 100%;" placeholder="发送方式">
  58. <el-option v-for="item in modeList" :key="item.id" :label="item.name" :value="item.id" />
  59. </el-select>
  60. </el-form-item>
  61. </el-col>
  62. </el-row>
  63. <div v-if="temp.sendingMethod == '2'">
  64. <el-row>
  65. <el-col :span="24">
  66. <el-form-item label="延时:">
  67. <el-input ref="delayed1" v-model="temp.delayed1" style="width: 33%;margin-right:1%" placeholder="天" type="text" />
  68. <el-input ref="delayed2" v-model="temp.delayed2" style="width: 33%;margin-right:1%" placeholder="小时" type="text" />
  69. <el-input ref="delayed3" v-model="temp.delayed3" style="width: 32%;" placeholder="分钟" type="text" />
  70. </el-form-item>
  71. </el-col>
  72. </el-row>
  73. <el-row>
  74. <el-col :span="24">
  75. <el-form-item label="发送时间">
  76. <el-time-select placeholder="发送时间" style="width: 100%;" v-model="temp.sendTime" :picker-options="{ start: '00:00', step: '00:15', end: '23:59' }" />
  77. </el-form-item>
  78. </el-col>
  79. </el-row>
  80. <el-row :gutter="5">
  81. <el-col :span="18">
  82. <el-form-item label="发送机制">
  83. <el-select v-model="temp.sendingMechanism" style="width: 100%;" placeholder="发送机制">
  84. <el-option v-for="item in mechanismList" :key="item.id" :label="item.name" :value="item.id" />
  85. </el-select>
  86. </el-form-item>
  87. </el-col>
  88. <el-col :span="6" v-if="temp.sendingMechanism == '2'">
  89. <el-input ref="numberCycles" v-model="temp.numberCycles" style="width: 100%;" placeholder="循环次数" type="text" />
  90. </el-col>
  91. </el-row>
  92. <el-row v-if="temp.sendingMechanism !== '1' && temp.sendingMechanism !== ''">
  93. <el-col :span="24">
  94. <el-form-item label="间隔周期:">
  95. <el-input ref="intervalPeriod1" v-model="temp.intervalPeriod1" style="width: 33%;margin-right:1%" placeholder="天" type="text" />
  96. <el-input ref="intervalPeriod2" v-model="temp.intervalPeriod2" style="width: 33%;margin-right:1%" placeholder="小时" type="text" />
  97. <el-input ref="intervalPeriod3" v-model="temp.intervalPeriod3" style="width: 32%;" placeholder="分钟" type="text" />
  98. </el-form-item>
  99. </el-col>
  100. </el-row>
  101. </div>
  102. <div v-if="temp.sendingMethod == '3'">
  103. <el-row>
  104. <el-col :span="24">
  105. <el-form-item label="发送机制:">
  106. <span>持续循环</span>
  107. </el-form-item>
  108. </el-col>
  109. </el-row>
  110. <el-row :gutter="5">
  111. <el-col :span="18">
  112. <el-form-item label="周期类型">
  113. <el-select v-model="temp.cycleType" style="width: 100%;" placeholder="周期类型">
  114. <el-option v-for="item in cycleTypeList" :key="item.id" :label="item.name" :value="item.id" />
  115. </el-select>
  116. </el-form-item>
  117. </el-col>
  118. <el-col :span="6" v-if="temp.cycleType == '2'">
  119. <el-select v-model="temp.week" style="width: 100%;" placeholder="每周">
  120. <el-option v-for="item in weekList" :key="item.id" :label="item.name" :value="item.id" />
  121. </el-select>
  122. </el-col>
  123. <el-col :span="6" v-if="temp.cycleType == 3">
  124. <el-select v-model="temp.month" style="width: 100%;" placeholder="每月">
  125. <el-option v-for="item in monthList" :key="item.id" :label="item.name" :value="item.id" />
  126. </el-select>
  127. </el-col>
  128. </el-row>
  129. <el-row>
  130. <el-col :span="24">
  131. <el-form-item label="发送时间">
  132. <el-time-select placeholder="发送时间" style="width: 100%;" v-model="temp.sendTime" :picker-options="{ start: '00:00', step: '00:15', end: '23:59' }" />
  133. </el-form-item>
  134. </el-col>
  135. </el-row>
  136. </div>
  137. </el-form>
  138. </el-col>
  139. <el-col :span="16">
  140. <b>提醒对象:</b>
  141. <el-tabs v-model="activeName" @tab-click="handleClick">
  142. <el-tab-pane label="角色" name="first">
  143. <el-table
  144. :key="setUp.table1.tableKey"
  145. v-loading="setUp.table1.listLoading"
  146. element-loading-text="给我一点时间"
  147. :data="setUp.table1.list"
  148. border
  149. fit
  150. highlight-current-row
  151. style="width: 100%;"
  152. :row-style="rowStyle"
  153. :cell-style="cellStyle"
  154. class="elTable table-fixed"
  155. @selection-change="handleSelectionChange"
  156. :max-height="450"
  157. >
  158. <el-table-column type="selection" align="center" width="50" />
  159. <el-table-column label="角色名称" min-width="130px" align="center" prop="rolename" />
  160. </el-table>
  161. </el-tab-pane>
  162. <el-tab-pane label="用户" name="second">
  163. <div class="search">
  164. <el-input v-model="setUp.table2.getdataListParm.parammaps.empCode" placeholder="用户名称" style="width: 180px;" class="filter-item" clearable />
  165. <el-input v-model="setUp.table2.getdataListParm.parammaps.empname" placeholder="员工姓名" style="width: 180px;" class="filter-item" clearable />
  166. <el-button class="successBorder" @click="handleSearch">查询</el-button>
  167. </div>
  168. <el-table
  169. :key="setUp.table2.tableKey"
  170. v-loading="setUp.table2.listLoading"
  171. element-loading-text="给我一点时间"
  172. :data="setUp.table2.list"
  173. border
  174. fit
  175. highlight-current-row
  176. style="width: 100%;"
  177. :row-style="rowStyle"
  178. :cell-style="cellStyle"
  179. class="elTable table-fixed"
  180. @selection-change="handleSelectionChange"
  181. :max-height="450"
  182. >
  183. <el-table-column type="selection" align="center" width="50" />
  184. <el-table-column label="用户名称" min-width="130px" align="center" prop="username" />
  185. <el-table-column label="员工姓名" min-width="130px" align="center" prop="empname" />
  186. <el-table-column label="角色" min-width="130px" align="center" prop="rolename" />
  187. </el-table>
  188. </el-tab-pane>
  189. </el-tabs>
  190. </el-col>
  191. </el-row>
  192. </div>
  193. <div slot="footer" class="dialog-footer" style="right:30px;position:absolute;bottom: 40px;">
  194. <el-button class="cancelClose" @click="setUp.dialogFormVisible = false;getList(); ">取消</el-button>
  195. <el-button class="save" :disabled="isokDisable" @click="setData()">确认</el-button>
  196. </div>
  197. </div>
  198. </el-dialog>
  199. <el-dialog :title="textMap[QRcode.dialogStatus]" :visible.sync="QRcode.dialogFormVisible" :close-on-click-modal="false" width="50%">
  200. <div class="QRcode">
  201. <div class="content">
  202. <div class="title">
  203. <p>微信接收系统待办、预警等消息,必须先扫码关注公众号;</p>
  204. <p>请将下方二维码分享给需要接收信息的用户扫码</p>
  205. </div>
  206. <div style="font-weight: 600;">关注微信:</div>
  207. <img src="https://img2.baidu.com/it/u=1151188475,1753963046&fm=253&fmt=auto&app=138&f=JPEG?w=504&h=300" alt="">
  208. </div>
  209. <div slot="footer" class="dialog-footer" style="right:30px;position:absolute;bottom: 40px;">
  210. <el-button class="save" :disabled="isokDisable" @click="QRcode.dialogFormVisible = false;">确认</el-button>
  211. </div>
  212. </div>
  213. </el-dialog>
  214. </div>
  215. </template>
  216. <script>
  217. import { GetDataByName,postJson2 } from '@/api/common'
  218. import Cookies from 'js-cookie'
  219. export default {
  220. name: 'ReminderSettings',
  221. data() {
  222. return {
  223. temp:{
  224. rules:{},
  225. messageName:'',//消息名称
  226. triggerCondition:'',//触发条件,
  227. sendingMethod:'1',//发送方式
  228. delayed1:'',//延时
  229. delayed2:'',//延时
  230. delayed3:'',//延时,
  231. sendTime:'',//发送时间,
  232. sendingMechanism:'1',// 发送机制
  233. numberCycles:'',//循环次数
  234. intervalPeriod1:'',//间隔周期
  235. intervalPeriod2:'',//间隔周期
  236. intervalPeriod3:'',//间隔周期
  237. cycleType:'1',
  238. },
  239. modeList: [
  240. { id: '1', name: '立即' },
  241. { id: '2', name: '延时' },
  242. { id: '3', name: '指定周期' },
  243. ],
  244. mode: '0',
  245. mechanismList: [
  246. { id: '1', name: '单次' },
  247. { id: '2', name: '指定循环次数' },
  248. { id: '3', name: '循环至任务结束' },
  249. ],
  250. cycleTypeList:[
  251. { id: '1', name: '每天' },
  252. { id: '2', name: '每周' },
  253. { id: '3', name: '每月' },
  254. ],//周期类型
  255. weekList:[
  256. { id: 'w1', name: '周一' },
  257. { id: 'w2', name: '周二' },
  258. { id: 'w3', name: '周三' },
  259. { id: 'w4', name: '周四' },
  260. { id: 'w5', name: '周五' },
  261. { id: 'w6', name: '周六' },
  262. { id: 'w7', name: '周日' },
  263. ],//周
  264. monthList:[],//月
  265. mechanism: '0',
  266. activeName:'first',
  267. table: {
  268. getdataListParm: {
  269. name: 'getRoleList',
  270. page: 1,
  271. offset: 1,
  272. pagecount: parseInt(Cookies.get('pageCount')),
  273. returntype: 'Map',
  274. parammaps: {
  275. pastureid: Cookies.get('pastureid')
  276. }
  277. },
  278. tableKey: 0,
  279. list: [],
  280. total: 0,
  281. listLoading: false
  282. },
  283. setUp:{
  284. dialogStatus: '',
  285. dialogFormVisible:false,
  286. table1: {
  287. getdataListParm: {
  288. name: 'getRoleList',
  289. page: 1,
  290. offset: 1,
  291. pagecount: parseInt(Cookies.get('pageCount')),
  292. returntype: 'Map',
  293. parammaps: {
  294. pastureid: Cookies.get('pastureid')
  295. }
  296. },
  297. tableKey: 0,
  298. list: [],
  299. total: 0,
  300. listLoading: false
  301. },
  302. table2: {
  303. getdataListParm: {
  304. name: 'getuserallL',
  305. page: 1,
  306. offset: 1,
  307. pagecount: parseInt(Cookies.get('pageCount')),
  308. returntype: 'Map',
  309. parammaps: {
  310. pastureid: Cookies.get('pastureid')
  311. }
  312. },
  313. tableKey: 0,
  314. list: [],
  315. total: 0,
  316. listLoading: false
  317. },
  318. selectList:[]
  319. },
  320. QRcode:{
  321. dialogStatus: '',
  322. dialogFormVisible:false,
  323. },
  324. myHeight:document.documentElement.clientHeight - 85- 150 - 45,
  325. textMap: {
  326. setup: '设置',
  327. QRcode:'提示',
  328. add:'新增'
  329. },
  330. isokDisable:false,
  331. rowStyle: { maxHeight: 30 + 'px', height: 30 + 'px' },
  332. cellStyle: { padding: 0 + 'px' }
  333. }
  334. },
  335. created() {
  336. this.monthList = []
  337. for(let i=1;i<=31;i++){
  338. let obj = {}
  339. obj.id = 'd'+i
  340. obj.name = i+'日'
  341. this.monthList.push(obj)
  342. }
  343. this.getList()
  344. },
  345. methods: {
  346. getList() {
  347. this.table.listLoading = true
  348. // let url = 'http://tmrwatch.cn/notice/msgtype'
  349. // let data = {}
  350. GetDataByName(this.table.getdataListParm).then(response => {
  351. if (response.data.list !== null) {
  352. console.log('table数据', response.data.list)
  353. this.table.list = response.data.list
  354. this.table.pageNum = response.data.pageNum
  355. this.table.pageSize = response.data.pageSize
  356. } else {
  357. this.table.list = []
  358. }
  359. this.table.total = response.data.total
  360. setTimeout(() => {
  361. this.table.listLoading = false
  362. }, 100)
  363. })
  364. },
  365. handleSetUp(){
  366. this.setUp.dialogStatus = 'setup'
  367. this.setUp.dialogFormVisible = true
  368. this.activeName = 'first'
  369. this.getList1()
  370. },
  371. handleClick(item){
  372. if(item == 'first'){
  373. this.getList1()
  374. }else{
  375. this.getList2()
  376. }
  377. },
  378. handleSelectionChange(val) {
  379. console.log('勾选数据', val)
  380. this.selectList = val
  381. },
  382. handleGenerateQRcode(){
  383. this.QRcode.dialogStatus = 'QRcode'
  384. this.QRcode.dialogFormVisible = true
  385. },
  386. handleSearch(){
  387. this.getList2()
  388. },
  389. getList1() {
  390. this.setUp.table1.listLoading = true
  391. GetDataByName(this.setUp.table1.getdataListParm).then(response => {
  392. if (response.data.list !== null) {
  393. console.log('table数据', response.data.list)
  394. this.setUp.table1.list = response.data.list
  395. this.setUp.table1.pageNum = response.data.pageNum
  396. this.setUp.table1.pageSize = response.data.pageSize
  397. } else {
  398. this.setUp.table1.list = []
  399. }
  400. this.setUp.table1.total = response.data.total
  401. setTimeout(() => {
  402. this.setUp.table1.listLoading = false
  403. }, 100)
  404. })
  405. },
  406. getList2() {
  407. this.setUp.table2.listLoading = true
  408. GetDataByName(this.setUp.table2.getdataListParm).then(response => {
  409. if (response.data.list !== null) {
  410. console.log('table数据', response.data.list)
  411. this.setUp.table2.list = response.data.list
  412. this.setUp.table2.pageNum = response.data.pageNum
  413. this.setUp.table2.pageSize = response.data.pageSize
  414. } else {
  415. this.setUp.table2.list = []
  416. }
  417. this.setUp.table2.total = response.data.total
  418. setTimeout(() => {
  419. this.setUp.table2.listLoading = false
  420. }, 100)
  421. })
  422. },
  423. setData(){
  424. let url = 'http://tmrwatch.cn:8089/notice/msgtype'
  425. let data = {}
  426. data.sys_name = 'tmrWatch'
  427. data.type_name = this.temp.messageName
  428. data.remind_type_id = parseInt(this.temp.sendingMethod)
  429. if(this.temp.sendingMethod == '1'){
  430. data.remind_type = '立即'
  431. }else if(this.temp.sendingMethod == '1'){
  432. data.remind_type = '延时'
  433. }else{
  434. data.remind_type = '指定周期'
  435. }
  436. let dateTime = 0
  437. let delayed1 = 0
  438. let delayed2 = 0
  439. let delayed3 = 0
  440. if(this.temp.delayed1 !== ''){
  441. delayed1 = parseInt(this.temp.delayed1)*24*60
  442. }else {
  443. delayed1 = 0
  444. }
  445. if(this.temp.delayed2 !== ''){
  446. delayed2 = parseInt(this.temp.delayed2)*60
  447. }else {
  448. delayed2 = 0
  449. }
  450. if(this.temp.delayed3 !== ''){
  451. delayed3 = parseInt(this.temp.delayed3)
  452. }else{
  453. delayed2 = 0
  454. }
  455. dateTime = delayed1+ delayed2 + delayed3
  456. if(this.temp.cycleType == '1'){
  457. data.push_date = ''
  458. }else if(this.temp.cycleType == '2'){
  459. data.push_date = this.temp.week
  460. }else{
  461. data.push_date = this.temp.month
  462. }
  463. data.push_time = this.temp.sendTime
  464. data.interval_time = dateTime
  465. if(this.temp.sendingMechanism == '1'){
  466. data.push_limit = 1
  467. }else if(this.temp.sendingMechanism == '2'){
  468. data.push_limit = this.temp.numberCycles
  469. }else{
  470. data.push_limit = 0
  471. }
  472. data.template_id = 'BtkN1rWKOJtKP0C64lGxIrPzLRFsYFas-4gupX2-pFo'
  473. postJson2(url,data).then(response => {
  474. if(response.code == 200){
  475. console.log('成功')
  476. this.$notify({ title: '成功', message: '保存成功', type: 'success', duration: 2000 })
  477. }else{
  478. this.$notify({ title: '成功', message: response.message, type: 'success', duration: 2000 })
  479. console.log('失败')
  480. }
  481. })
  482. },
  483. handleCreate(){
  484. this.setUp.dialogStatus = 'add'
  485. this.setUp.dialogFormVisible = true
  486. this.activeName = 'first'
  487. }
  488. }
  489. }
  490. </script>
  491. <style scoped>
  492. .app-container{
  493. padding: 20px 20px;
  494. }
  495. .content-left{padding: 5px 5px;}
  496. .content-left b{padding-right: 10px;}
  497. .QRcode{display:flex;justify-content: center; align-items:center;}
  498. .content{
  499. /* margin-top: 100px; */
  500. width: 500px;
  501. }
  502. .content img{
  503. max-width:300px;
  504. }
  505. </style>