企微助手 ,仓库名 短剧

index.vue 8.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. <template>
  2. <div v-loading="loading" class="operatorGroup-wrap">
  3. <div class="self-hint">
  4. <i class="el-icon-message-solid" />
  5. <div>
  6. <p>许可续期仅可为购买过许可的客服续期</p>
  7. <p>在系统提交续期任务后,仍然需要通过购买许可流程发送申请邮件以及付款</p>
  8. <p>取消任务仅可取消还未支付的订单,已经支付的不可以取消,只能走退款流程</p>
  9. </div>
  10. </div>
  11. <div class="screenBox">
  12. <div class="filter-wrap">
  13. <!-- 任务名称 -->
  14. <selfInputV2 style="" :labelWidth="true" v-model="filter.title" label_name="任务名称" placeholder="请输入" @change="onChangeTitle" />
  15. <!-- 任务状态 -->
  16. <selfChannelV2 style="margin-right: 10px;" v-model="filter.status" type='licenseTaskStatus' title="任务状态" :labelWidth="true" @change="onChangeStatus" />
  17. </div>
  18. <el-button type="primary" size="mini" @click="onClickCreateBtn">新建续期任务</el-button>
  19. </div>
  20. <el-table :height="height" :data="list" tooltip-effect="dark" style="width: 100%;margin-top:10px">
  21. <el-table-column label="任务名称" prop="title" min-width="200" align="center" fixed="left" />
  22. <el-table-column label="客服数量" prop="user_num" min-width="100" align="center">
  23. <template slot-scope="{ row }">
  24. <span class="btn c-00b38a" @click="onClickUserNum(row)">{{ row.user_num }}</span>
  25. </template>
  26. </el-table-column>
  27. <el-table-column label="创建时间" prop="create_time" min-width="160" show-overflow-tooltip align="center" />
  28. <el-table-column label="任务状态" prop="status" min-width="120" align="center">
  29. <template slot-scope="{ row }">
  30. <span :class="{
  31. 'c-F03F5C': row.status == licenseTaskStatusCode.FAILED,
  32. 'c-00B38A': row.status == licenseTaskStatusCode.COMPLETED,
  33. }">{{ licenseTaskStatusMap.get(row.status) || '-' }}</span>
  34. </template>
  35. </el-table-column>
  36. <el-table-column label="异常信息" prop="err_msg" min-width="240" show-overflow-tooltip align="center">
  37. <template slot-scope="{ row }">
  38. <div v-if="row.err_msg && row.err_msg.length">
  39. <div v-for="(err, idx) in row.err_msg" :key="idx">{{ err }}</div>
  40. </div>
  41. <div v-else> - </div>
  42. </template>
  43. </el-table-column>
  44. <el-table-column label="操作" min-width="160" align="center" fixed="right">
  45. <template slot-scope="{ row }">
  46. <span v-if="isShowCancelTaskBtn(row.status)" class="btn c-00b38a" @click="onClickCancelTask(row)">关闭任务</span>
  47. <span v-else> - </span>
  48. </template>
  49. </el-table-column>
  50. </el-table>
  51. <div class="pagination" v-show="pagination.total > 0">
  52. <el-pagination background :current-page="pagination.page" @current-change="handleCurrentChange" layout="prev, pager, next" :page-count="Number(pagination.pages)" />
  53. </div>
  54. <!-- S 创建续期任务 -->
  55. <createTaskDrawer
  56. v-model="createTaskDrawerVisible"
  57. :rule_id="currentTaskId"
  58. @confirm="onConfirmCreateTask"
  59. @cancel="onCancelCreateTask"
  60. />
  61. <!-- E 创建续期任务 -->
  62. <!-- S 取消失败信息 -->
  63. <errListDialog
  64. :dialogVisible="errListDialogVisible"
  65. :list="currentErrList"
  66. @close="onCloseErrList"
  67. />
  68. <!-- E 取消失败信息 -->
  69. </div>
  70. </template>
  71. <script>
  72. import selfChannelV2 from '@/components/assembly/screen/channelV2.vue'
  73. import selfInputV2 from '@/components/assembly/screen/inputV2.vue'
  74. import createTaskDrawer from './createTaskDrawer.vue'
  75. import errListDialog from './errListDialog.vue'
  76. import { licenseTaskStatusMap, licenseTaskStatusCode } from '@/assets/js/staticTypes'
  77. export default {
  78. name: 'license',
  79. components: {
  80. selfChannelV2,
  81. selfInputV2,
  82. createTaskDrawer,
  83. errListDialog,
  84. },
  85. data () {
  86. return {
  87. licenseTaskStatusMap,
  88. licenseTaskStatusCode,
  89. height: '',
  90. loading: false,
  91. pagination: {
  92. page: 1,
  93. page_size: 20,
  94. pages: 0,
  95. total: 0,
  96. },
  97. filter: {
  98. title: '',
  99. status: '',
  100. },
  101. list: [],
  102. createTaskDrawerVisible: false,
  103. currentTaskId: '',
  104. errListDialogVisible: false,
  105. currentErrList: [],
  106. }
  107. },
  108. created () {
  109. this.height = document.documentElement.clientHeight - 200
  110. this.handleGetList()
  111. },
  112. methods: {
  113. // 获取列表数据
  114. async handleGetList() {
  115. try {
  116. this.loading = true
  117. const url = `${this.URL.BASEURL}${this.URL.license_renewalJobList}`
  118. const params = {
  119. page: this.pagination.page,
  120. page_size: this.pagination.page_size,
  121. title: this.filter.title,
  122. status: this.filter.status,
  123. }
  124. const { data: res = {} } = await this.$axios.get(url, { params })
  125. if (res && res.errno == 0 && Array.isArray(res.rst.data)) {
  126. this.list = res.rst.data;
  127. this.pagination.total = res.rst.pageInfo.total;
  128. this.pagination.pages = res.rst.pageInfo.pages;
  129. } else if (res.errno != 4002) {
  130. this.$message.warning(res.err)
  131. this.list = [];
  132. this.pagination.total = 0;
  133. this.pagination.pages = 0;
  134. }
  135. } catch (error) {
  136. console.log(error)
  137. this.list = [];
  138. this.pagination.total = 0;
  139. this.pagination.pages = 0;
  140. } finally {
  141. this.loading = false
  142. }
  143. },
  144. // 监听"任务标题"变化
  145. onChangeTitle(val) {
  146. this.filter.title = val
  147. this.pagination.page = 1
  148. this.handleGetList()
  149. },
  150. // 监听"任务状态"变化
  151. onChangeStatus(val) {
  152. this.filter.status = (val || val === 0) ? val : ''
  153. this.pagination.page = 1
  154. this.handleGetList()
  155. },
  156. // 监听当前页数变化
  157. handleCurrentChange(currentPage) {
  158. this.pagination.page = currentPage
  159. this.handleGetList()
  160. },
  161. // 监听点击“关闭任务”
  162. async onClickCancelTask({ title, rule_id }) {
  163. try {
  164. await this.$confirm(`确定关闭【${title}】任务吗?`, '提示', {
  165. confirmButtonText: '确定',
  166. cancelButtonText: '取消',
  167. type: 'warning'
  168. })
  169. this.handleCancelTask(rule_id)
  170. } catch (error) {
  171. console.log(error)
  172. }
  173. },
  174. // 执行“关闭任务”
  175. async handleCancelTask(rule_id) {
  176. try {
  177. this.loading = true
  178. const url = `${this.URL.BASEURL}${this.URL.license_cancelRenewalJob}`
  179. const params = { rule_id }
  180. const { data: res = {} } = await this.$axios.post(url, params)
  181. if (res && res.errno == 0) {
  182. this.$message.success('操作成功')
  183. } else if (res.errno == 2708 && Array.isArray(res.rst) && res.rst.length) {
  184. this.handleShowErrList(res.rst)
  185. } else if (res.errno != 4002) {
  186. this.$message.warning(res.err)
  187. }
  188. this.handleGetList()
  189. } catch (error) {
  190. console.log(error)
  191. } finally {
  192. this.loading = false
  193. }
  194. },
  195. isShowCancelTaskBtn(status) {
  196. const allowedStatus = [licenseTaskStatusCode.NOT_EXECUTED, licenseTaskStatusCode.EXECUTED]
  197. return allowedStatus.includes(status)
  198. },
  199. // 监听点击“客服数量”
  200. onClickUserNum(row) {
  201. this.currentTaskId = row.rule_id
  202. this.createTaskDrawerVisible = true
  203. },
  204. // 监听点击“新建续期任务”
  205. onClickCreateBtn() {
  206. this.currentTaskId = ''
  207. this.createTaskDrawerVisible = true
  208. },
  209. onConfirmCreateTask() {
  210. this.createTaskDrawerVisible = false
  211. this.pagination.page = 1
  212. this.handleGetList()
  213. },
  214. onCancelCreateTask() {
  215. this.createTaskDrawerVisible = false
  216. },
  217. handleShowErrList(list) {
  218. this.currentErrList = [...list]
  219. this.errListDialogVisible = true
  220. },
  221. onCloseErrList() {
  222. this.errListDialogVisible = false
  223. this.currentErrList = []
  224. },
  225. },
  226. }
  227. </script>
  228. <style lang="scss" scoped>
  229. @import "@/style/list.scss";
  230. .operatorGroup-wrap {
  231. .screenBox {
  232. background: #fff;
  233. padding: 5px 20px;
  234. display: flex;
  235. justify-content: space-between;
  236. align-items: center;
  237. .filter-wrap {
  238. flex: 1;
  239. display: flex;
  240. flex-wrap: wrap;
  241. }
  242. }
  243. .btn {
  244. cursor: pointer;
  245. margin-right: 4px;
  246. &:last-child {
  247. margin-right: 0;
  248. }
  249. }
  250. .lableBox_dad {
  251. display: flex;
  252. align-items: center;
  253. justify-content: center;
  254. flex-wrap: wrap;
  255. .lableBox {
  256. font-size: 12px;
  257. background-color: #f0f0f0;
  258. padding: 4px 8px;
  259. margin-top: 5px;
  260. margin-right: 4px;
  261. border-radius: 4px;
  262. }
  263. }
  264. }
  265. </style>