index.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. <template>
  2. <div class="app-container">
  3. <!-- 搜索 -->
  4. <el-form inline size="mini">
  5. <el-form-item label="批次:">
  6. <el-input v-model="form.no" placeholder="请输入批次" clearable />
  7. </el-form-item>
  8. <el-form-item label="服务时长:">
  9. <el-select v-model="form.serviceTime" placeholder="请选择服务时长" clearable>
  10. <el-option v-for="item in serviceTimeOptions" :key="item.value" :label="item.label" :value="item.value" />
  11. </el-select>
  12. </el-form-item>
  13. <el-form-item label="当前状态:">
  14. <el-select v-model="form.status" placeholder="请选择当前状态" clearable>
  15. <el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value" />
  16. </el-select>
  17. </el-form-item>
  18. <el-form-item label="用户姓名:">
  19. <el-input v-model="form.userName" placeholder="请输入用户姓名" clearable />
  20. </el-form-item>
  21. <el-form-item label="手机号:">
  22. <el-input v-model="form.phone" placeholder="请输入手机号" clearable />
  23. </el-form-item>
  24. <el-form-item label="激活状态:">
  25. <el-select v-model="form.activeStatus" placeholder="请选择激活状态" clearable>
  26. <el-option v-for="item in activeOptions" :key="item.value" :value="item.value" :label="item.label" />
  27. </el-select>
  28. </el-form-item>
  29. <el-form-item>
  30. <el-button type="primary" icon="el-icon-search" @click="getSearch">搜索</el-button>
  31. <el-button icon="el-icon-refresh" @click="getRefresh">重置</el-button>
  32. <Upload action="/qqService/importData" @upload="getUpload" style="margin: 0 10px"
  33. v-hasPermi="['service:platform:push']">批量推送短信</Upload>
  34. <el-button type="danger" @click="getDialog()" v-hasPermi="['service:platform:over']">批量过期</el-button>
  35. <el-button type="text" @click="getTemplate">模板下载</el-button>
  36. </el-form-item>
  37. </el-form>
  38. <!-- 列表 -->
  39. <el-table :data="tableData" v-loading="loading">
  40. <el-table-column label="批次" prop="no" align="center" show-overflow-tooltip />
  41. <el-table-column label="服务时长" prop="serviceTime" align="center" :formatter="timeFormatter" />
  42. <el-table-column label="Key" prop="key" align="center" show-overflow-tooltip />
  43. <el-table-column label="发送时间" prop="sendTime" align="center" show-overflow-tooltip />
  44. <el-table-column label="当前状态" prop="codeStatus" align="center" :formatter="statusFormatter" />
  45. <el-table-column label="是否激活" prop="activeStatus" align="center" :formatter="activeStatusFormatter" />
  46. <el-table-column label="操作" align="center">
  47. <template slot-scope="scope">
  48. <el-button type="text" @click="getDialog(scope.row)">查看</el-button>
  49. <el-button v-if="scope.row.codeStatus === 2" type="text">重新发送</el-button>
  50. </template>
  51. </el-table-column>
  52. </el-table>
  53. <!-- 分页 -->
  54. <pagination v-show="total > 0" :total="total" :page.sync="form.pageNum" :limit.sync="form.pageSize"
  55. @pagination="getList" />
  56. <!-- 弹窗 -->
  57. <el-dialog :visible.sync="dialogVisible" :title="title">
  58. <!-- 批量发送短信 批量过期 -->
  59. <el-form v-if="title === '批量推送短信'">
  60. <el-form-item label="服务时长:" label-width="100px" style="width: 300px">
  61. <el-select v-model="dialogForm.serviceTime" placeholder="请选择服务时长">
  62. <el-option v-for="item in serviceTimeOptions" :key="item.value" :label="item.label" :value="item.value" />
  63. </el-select>
  64. </el-form-item>
  65. <el-form-item>
  66. <el-table :data="dialogData" ref="dialogData" :row-key="rowKey" @selection-change="selectionChange"
  67. height="497">
  68. <el-table-column type="selection" align="center" />
  69. <el-table-column label="购买套餐" prop="name" align="center" />
  70. <el-table-column label="收货地址" prop="receiveAddress" align="center" />
  71. <el-table-column label="用户姓名" prop="userName" align="center" />
  72. <el-table-column label="用户手机号" prop="phone" align="center" />
  73. </el-table>
  74. </el-form-item>
  75. <el-form-item>
  76. <el-button @click="cancel">取消</el-button>
  77. <el-button v-if="title === '批量推送短信'" type="primary" @click="getSend">发送</el-button>
  78. <el-button v-else type="primary">确定</el-button>
  79. </el-form-item>
  80. </el-form>
  81. <!-- 批量过期 -->
  82. <div v-else-if="title === '批量过期'">
  83. <el-table :data="dialogData">
  84. <el-table-column label="批次" prop="no" align="center" show-overflow-tooltip />
  85. <el-table-column label="批次状态" prop="status" align="center" :formatter="batchFormatter" />
  86. <el-table-column label="批次人数" prop="num" align="center" />
  87. <el-table-column label="成功" prop="successNum" align="center" />
  88. <el-table-column label="失败" prop="failNum" align="center" />
  89. <el-table-column label="添加日期" prop="createTime" align="center" show-overflow-tooltip />
  90. <el-table-column label="操作" align="center">
  91. <template slot-scope="scope">
  92. <el-button type="delete" @click="getPast(scope.row)" :disabled="scope.row.status === 1">强制过期</el-button>
  93. </template>
  94. </el-table-column>
  95. </el-table>
  96. <!-- 分页 -->
  97. <pagination v-show="batchTotal > 0" :total="batchTotal" :page.sync="batchForm.pageNum"
  98. :limit.sync="batchForm.pageSize" @pagination="getBatchPage" />
  99. </div>
  100. <!-- 查看详情 -->
  101. <div v-else>
  102. <el-descriptions title="基础信息" :column="1">
  103. <el-descriptions-item label="收货地址">{{ dialogDetail.receiveAddress }}</el-descriptions-item>
  104. <el-descriptions-item label="用户姓名">{{ dialogDetail.userName }}</el-descriptions-item>
  105. <el-descriptions-item label="用户手机号">{{ dialogDetail.phone }}</el-descriptions-item>
  106. <el-descriptions-item label="购买套餐">{{ dialogDetail.name }}</el-descriptions-item>
  107. </el-descriptions>
  108. <el-descriptions title="服务信息" :column="1">
  109. <el-descriptions-item label="批次">{{ dialogDetail.batchNo }}</el-descriptions-item>
  110. <el-descriptions-item label="Key">{{ dialogDetail.key }}</el-descriptions-item>
  111. <el-descriptions-item label="发送时间">{{ dialogDetail.sendTime }}</el-descriptions-item>
  112. <el-descriptions-item label="激活账号">{{ dialogDetail.activeAccount }}</el-descriptions-item>
  113. </el-descriptions>
  114. <el-button type="danger" @click="getPast(dialogDetail)" v-hasPermi="['service:qqmusic:over']">
  115. 强制过期
  116. </el-button>
  117. </div>
  118. </el-dialog>
  119. </div>
  120. </template>
  121. <script>
  122. import { page, send, importData, detail, past, batchList, batchPage } from '@/api/service/platform'
  123. import { serviceTimeMixin } from '@/mixin/index'
  124. export default {
  125. mixins: [serviceTimeMixin],
  126. data() {
  127. return {
  128. // 遮罩层
  129. loading: false,
  130. // 表单
  131. form: {
  132. pageNum: 1,
  133. pageSize: 10
  134. },
  135. // 列表
  136. tableData: [],
  137. total: 0,
  138. // 弹窗
  139. dialogVisible: false,
  140. title: '',
  141. dialogData: [],
  142. // 弹窗详情
  143. dialogDetail: {},
  144. // 发送表单
  145. dialogForm: {
  146. serviceTime: ''
  147. },
  148. // 批次分页
  149. batchForm: {
  150. pageNum: 1,
  151. pageSize: 10
  152. },
  153. batchTotal: 0,
  154. // 批次状态
  155. batchStatusOptions: [{
  156. value: 0,
  157. label: '有效'
  158. }, {
  159. value: 1,
  160. label: '已被强制过期'
  161. }, {
  162. value: 2,
  163. label: '删除'
  164. }],
  165. // batchOptions: [], (3.0.6版本舍弃)
  166. // 当前状态
  167. statusOptions: [
  168. { value: 0, label: '已发送' },
  169. { value: 1, label: '未发送' },
  170. { value: 2, label: '发送失败' }
  171. ],
  172. activeOptions: [
  173. { value: 0, label: '未激活' },
  174. { value: 1, label: '已激活' }
  175. ]
  176. }
  177. },
  178. mounted() {
  179. // this.getBatchList() (3.0.6版本舍弃)
  180. this.getList()
  181. },
  182. methods: {
  183. // 列表
  184. getList() {
  185. this.loading = true
  186. page(this.form).then(res => {
  187. if (res.code === 0) {
  188. this.tableData = res.data.records
  189. this.total = res.data.total
  190. this.loading = false
  191. }
  192. })
  193. },
  194. // 搜索
  195. getSearch() {
  196. this.form.pageNum = 1
  197. this.form.pageSize = 10
  198. this.getList()
  199. },
  200. // 重置
  201. getRefresh() {
  202. this.form = {
  203. pageNum: 1,
  204. pageSize: 10
  205. }
  206. this.getList()
  207. },
  208. // 下载模板
  209. getTemplate() {
  210. this.download('qqService/importTemplate', {
  211. }, `推送短信模板.xlsx`)
  212. },
  213. // 批量推送短信
  214. getUpload(e) {
  215. importData({
  216. batchId: e.file
  217. }).then(res => {
  218. if (res.code === 0) {
  219. this.dialogVisible = true
  220. this.title = '批量推送短信'
  221. this.dialogData = res.data
  222. this.$nextTick(() => {
  223. this.$refs.dialogData.toggleAllSelection()
  224. })
  225. }
  226. })
  227. },
  228. rowKey(row) {
  229. return row.id
  230. },
  231. // 多选
  232. selectionChange(e) {
  233. this.dialogForm.ids = []
  234. e.map(i => {
  235. this.dialogForm.ids.push(i.id)
  236. })
  237. },
  238. // 弹窗
  239. getDialog(row) {
  240. this.dialogVisible = true
  241. if (row) {
  242. this.title = row.name
  243. detail({
  244. id: row.id
  245. }).then(res => {
  246. if (res.code === 0) {
  247. this.dialogDetail = res.data
  248. }
  249. })
  250. } else {
  251. this.title = '批量过期'
  252. this.getBatchPage()
  253. }
  254. },
  255. // 批次分页
  256. getBatchPage() {
  257. batchPage(this.batchForm).then(res => {
  258. if (res.code === 0) {
  259. this.dialogData = res.data.records
  260. this.batchTotal = res.data.total
  261. }
  262. })
  263. },
  264. // 发送
  265. getSend() {
  266. if (this.dialogForm.serviceTime !== '') {
  267. send(this.dialogForm).then(res => {
  268. if (res.code === 0) {
  269. this.$message.success('发送成功!')
  270. this.dialogVisible = false
  271. this.getList()
  272. }
  273. })
  274. } else {
  275. this.$message.error('请选择服务时长!')
  276. }
  277. },
  278. // 强制过期
  279. getPast(row) {
  280. this.$confirm('确定强制过期吗?', '提示', {
  281. confirmButtonText: '确定',
  282. cancelButtonText: '取消',
  283. type: 'warning'
  284. }).then(() => {
  285. past({
  286. id: row.id,
  287. status: 1
  288. }).then(() => {
  289. this.$message.success('操作成功!')
  290. this.getBatchPage()
  291. })
  292. }).catch(() => {
  293. this.$message.info('已取消!')
  294. })
  295. },
  296. // 取消
  297. cancel() {
  298. this.dialogVisible = false
  299. },
  300. // 字典翻译
  301. statusFormatter(row) {
  302. return row.codeStatus === null ? '/' : this.selectDictLabel(this.statusOptions, row.codeStatus)
  303. },
  304. timeFormatter(row) {
  305. return row.serviceTime === null ? '/' : this.selectDictLabel(this.serviceTimeOptions, row.serviceTime)
  306. },
  307. batchFormatter(row) {
  308. return this.selectDictLabel(this.batchStatusOptions, row.status)
  309. },
  310. nameFormatter(row) {
  311. return row.name === null ? '/' : row.name
  312. },
  313. userNameFormatter(row) {
  314. return row.userName === null ? '/' : row.userName
  315. },
  316. phoneFormatter(row) {
  317. return row.phone === null ? '/' : row.phone
  318. },
  319. activeStatusFormatter(row) {
  320. return this.selectDictLabel(this.activeOptions, row.activeStatus)
  321. }
  322. }
  323. }
  324. </script>