87406bfd207c0e6f046214dddd1d4ba7.json 19 KB

1
  1. {"remainingRequest":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\src\\pages\\setting\\storeService\\index.vue?vue&type=style&index=0&id=254cfe3a&lang=scss&scoped=true","dependencies":[{"path":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\src\\pages\\setting\\storeService\\index.vue","mtime":1761185180185},{"path":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\node_modules\\css-loader\\index.js","mtime":499162500000},{"path":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\node_modules\\vue-loader\\lib\\loaders\\stylePostLoader.js","mtime":499162500000},{"path":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\node_modules\\postcss-loader\\src\\index.js","mtime":499162500000},{"path":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\node_modules\\sass-loader\\dist\\cjs.js","mtime":499162500000},{"path":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:DQoudGFiQm94X2ltZyB7DQogIHdpZHRoOiAzNnB4Ow0KICBoZWlnaHQ6IDM2cHg7DQogIGJvcmRlci1yYWRpdXM6IDRweDsNCiAgY3Vyc29yOiBwb2ludGVyOw0KDQogIGltZyB7DQogICAgd2lkdGg6IDEwMCU7DQogICAgaGVpZ2h0OiAxMDAlOw0KICB9DQp9DQoubW9kZWxCb3ggew0KICA6OnYtZGVlcCwNCiAgLml2dS10YWJsZS1oZWFkZXIgew0KICAgIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7DQogIH0NCn0NCi50cmVlcy1jb2FkZCB7DQogIHdpZHRoOiAxMDAlOw0KICBoZWlnaHQ6IDM4NXB4Ow0KICAuc2NvbGxoaWRlIHsNCiAgICB3aWR0aDogMTAwJTsNCiAgICBoZWlnaHQ6IDEwMCU7DQogICAgb3ZlcmZsb3cteDogaGlkZGVuOw0KICAgIG92ZXJmbG93LXk6IHNjcm9sbDsNCiAgfQ0KfQ0KLnNjb2xsaGlkZTo6LXdlYmtpdC1zY3JvbGxiYXIgew0KICBkaXNwbGF5OiBub25lOw0KfQ0K"},{"version":3,"sources":["index.vue"],"names":[],"mappings":";AAggBA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"index.vue","sourceRoot":"src/pages/setting/storeService","sourcesContent":["<template>\r\n <div>\r\n <el-card :bordered=\"false\" shadow=\"never\" class=\"ivu-mt\">\r\n <el-row class=\"mb20\">\r\n <el-col :span=\"24\">\r\n <el-button v-auth=\"['setting-store_service-add']\" type=\"primary\" v-db-click @click=\"add\" class=\"mr10\"\r\n >添加客服</el-button\r\n >\r\n </el-col>\r\n </el-row>\r\n <el-table\r\n :data=\"tableList\"\r\n v-loading=\"loading\"\r\n highlight-current-row\r\n no-userFrom-text=\"暂无数据\"\r\n no-filtered-userFrom-text=\"暂无筛选结果\"\r\n >\r\n <el-table-column label=\"ID\" width=\"80\">\r\n <template slot-scope=\"scope\">\r\n <span>{{ scope.row.id }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"客服头像\" min-width=\"90\">\r\n <template slot-scope=\"scope\">\r\n <div class=\"tabBox_img\" v-viewer>\r\n <img v-lazy=\"scope.row.avatar\" />\r\n </div>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"客服名称\" min-width=\"130\">\r\n <template slot-scope=\"scope\">\r\n <span>{{ scope.row.wx_name }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"客服状态\" min-width=\"130\">\r\n <template slot-scope=\"scope\">\r\n <el-switch\r\n class=\"defineSwitch\"\r\n :active-value=\"1\"\r\n :inactive-value=\"0\"\r\n v-model=\"scope.row.status\"\r\n :value=\"scope.row.status\"\r\n @change=\"onchangeIsShow(scope.row)\"\r\n size=\"large\"\r\n active-text=\"开启\"\r\n inactive-text=\"关闭\"\r\n >\r\n </el-switch>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"添加时间\" min-width=\"130\">\r\n <template slot-scope=\"scope\">\r\n <span>{{ scope.row.add_time }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"操作\" fixed=\"right\" width=\"170\">\r\n <template slot-scope=\"scope\">\r\n <a v-db-click @click=\"edit(scope.row)\">编辑</a>\r\n <el-divider direction=\"vertical\"></el-divider>\r\n <a v-db-click @click=\"del(scope.row, '删除客服', scope.$index)\">删除</a>\r\n <el-divider direction=\"vertical\" v-if=\"scope.row.status\" />\r\n <a v-db-click @click=\"goChat(scope.row)\" v-if=\"scope.row.status\">进入工作台</a>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n <div class=\"acea-row row-right page\">\r\n <pagination\r\n v-if=\"total\"\r\n :total=\"total\"\r\n :page.sync=\"tableFrom.page\"\r\n :limit.sync=\"tableFrom.limit\"\r\n @pagination=\"getList\"\r\n />\r\n </div>\r\n </el-card>\r\n\r\n <!--聊天记录-->\r\n <el-dialog :visible.sync=\"modals3\" title=\"聊天记录\" width=\"720px\">\r\n <div v-if=\"isChat\" class=\"modelBox\">\r\n <el-table\r\n v-loading=\"loading3\"\r\n highlight-current-row\r\n no-userFrom-text=\"暂无数据\"\r\n no-filtered-userFrom-text=\"暂无筛选结果\"\r\n :data=\"tableList3\"\r\n >\r\n <el-table-column label=\"用户名称\" width=\"200\">\r\n <template slot-scope=\"scope\">\r\n <span>{{ scope.row.nickname }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"客服头像\" min-width=\"90\">\r\n <template slot-scope=\"scope\">\r\n <div class=\"tabBox_img\" v-viewer>\r\n <img v-lazy=\"scope.row.headimgurl\" />\r\n </div>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"操作\" fixed=\"right\" width=\"170\">\r\n <template slot-scope=\"scope\">\r\n <a v-db-click @click=\"look(scope.row)\">查看对话</a>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n <div class=\"acea-row row-right page\">\r\n <pagination\r\n v-if=\"total3\"\r\n :total=\"total3\"\r\n :page.sync=\"formValidate3.page\"\r\n :limit.sync=\"formValidate3.limit\"\r\n @pagination=\"getListRecord\"\r\n />\r\n </div>\r\n </div>\r\n <div v-if=\"!isChat\">\r\n <el-button type=\"primary\" v-db-click @click=\"isChat = true\">返回聊天记录</el-button>\r\n <el-table\r\n v-loading=\"loading5\"\r\n highlight-current-row\r\n no-userFrom-text=\"暂无数据\"\r\n class=\"mt14\"\r\n no-filtered-userFrom-text=\"暂无筛选结果\"\r\n :data=\"tableList5\"\r\n >\r\n <el-table-column label=\"用户名称\" min-width=\"200\">\r\n <template slot-scope=\"scope\">\r\n <span>{{ scope.row.nickname }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"用户头像\" min-width=\"90\">\r\n <template slot-scope=\"scope\">\r\n <div class=\"tabBox_img\" v-viewer>\r\n <img v-lazy=\"scope.row.avatar\" />\r\n </div>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"发送消息\" min-width=\"200\">\r\n <template slot-scope=\"scope\">\r\n <span>{{ scope.row.msn }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"发送时间\" min-width=\"200\">\r\n <template slot-scope=\"scope\">\r\n <span>{{ scope.row.add_time }}</span>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n <div class=\"acea-row row-right page\">\r\n <pagination\r\n v-if=\"total5\"\r\n :total=\"total5\"\r\n :page.sync=\"formValidate5.page\"\r\n :limit.sync=\"formValidate5.limit\"\r\n @pagination=\"getChatlist\"\r\n />\r\n </div>\r\n </div>\r\n </el-dialog>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport { mapState } from 'vuex';\r\nimport { setCookies } from '@/libs/util';\r\nimport {\r\n kefuListApi,\r\n kefucreateApi,\r\n kefuaddApi,\r\n kefuAddApi,\r\n kefusetStatusApi,\r\n kefuEditApi,\r\n kefuRecordApi,\r\n kefuChatlistApi,\r\n kefuLogin,\r\n} from '@/api/setting';\r\nexport default {\r\n name: 'index',\r\n filters: {\r\n typeFilter(status) {\r\n const statusMap = {\r\n wechat: '微信用户',\r\n routine: '小程序用户',\r\n };\r\n return statusMap[status];\r\n },\r\n },\r\n computed: {\r\n ...mapState('media', ['isMobile']),\r\n ...mapState('userLevel', ['categoryId']),\r\n labelWidth() {\r\n return this.isMobile ? undefined : '80px';\r\n },\r\n labelPosition() {\r\n return this.isMobile ? 'top' : 'right';\r\n },\r\n },\r\n data() {\r\n return {\r\n isChat: true,\r\n formValidate3: {\r\n page: 1,\r\n limit: 15,\r\n },\r\n total3: 0,\r\n loading3: false,\r\n modals3: false,\r\n tableList3: [],\r\n formValidate5: {\r\n page: 1,\r\n limit: 15,\r\n uid: 0,\r\n to_uid: 0,\r\n id: 0,\r\n },\r\n total5: 0,\r\n loading5: false,\r\n tableList5: [],\r\n FromData: null,\r\n formValidate: {\r\n page: 1,\r\n limit: 15,\r\n data: '',\r\n type: '',\r\n nickname: '',\r\n },\r\n tableList2: [],\r\n modals: false,\r\n total: 0,\r\n tableFrom: {\r\n page: 1,\r\n limit: 15,\r\n },\r\n timeVal: [],\r\n fromList: {\r\n title: '选择时间',\r\n custom: true,\r\n fromTxt: [\r\n { text: '全部', val: '' },\r\n { text: '今天', val: 'today' },\r\n { text: '昨天', val: 'yesterday' },\r\n { text: '最近7天', val: 'lately7' },\r\n { text: '最近30天', val: 'lately30' },\r\n { text: '本月', val: 'month' },\r\n { text: '本年', val: 'year' },\r\n ],\r\n },\r\n loading: false,\r\n tableList: [],\r\n loading2: false,\r\n total2: 0,\r\n addFrom: {\r\n uids: [],\r\n },\r\n selections: [],\r\n rows: {},\r\n rowRecord: {},\r\n eidtLoading: false,\r\n };\r\n },\r\n created() {\r\n this.getList();\r\n },\r\n methods: {\r\n // 进入工作台\r\n goChat(item) {\r\n kefuLogin(item.id)\r\n .then((res) => {\r\n var url = '';\r\n if (res.data.token) {\r\n let expires = this.getExpiresTime(res.data.exp_time);\r\n setCookies('kefu_token', res.data.token, expires);\r\n setCookies('kefu_uuid', res.data.kefuInfo.uid, expires);\r\n setCookies('kefu_expires_time', res.data.exp_time, expires);\r\n setCookies('kefuInfo', res.data.kefuInfo, expires);\r\n if (this.$store.state.media.isMobile) {\r\n url = window.location.protocol + '//' + window.location.host + '/kefu/mobile_list';\r\n } else {\r\n url = window.location.protocol + '//' + window.location.host + '/kefu/pc_list';\r\n }\r\n\r\n window.open(url, '_blank');\r\n }\r\n })\r\n .catch((error) => {\r\n this.$message.error(error.msg);\r\n });\r\n },\r\n getExpiresTime(expiresTime) {\r\n let nowTimeNum = Math.round(new Date() / 1000);\r\n let expiresTimeNum = expiresTime - nowTimeNum;\r\n return parseFloat(parseFloat(parseFloat(expiresTimeNum / 60) / 60) / 24);\r\n },\r\n cancel() {\r\n this.formValidate = {\r\n page: 1,\r\n limit: 10,\r\n data: '',\r\n type: '',\r\n nickname: '',\r\n };\r\n },\r\n handleReachBottom() {\r\n return new Promise((resolve) => {\r\n this.formValidate.page = this.formValidate.page + 1;\r\n setTimeout(() => {\r\n // this.loading2 = true;\r\n kefucreateApi(this.formValidate)\r\n .then(async (res) => {\r\n let data = res.data;\r\n // this.tableList2 = data.list;\r\n if (data.list.length > 0) {\r\n for (let i = 0; i < data.list.length; i++) {\r\n this.tableList2.push(data.list[i]);\r\n }\r\n }\r\n this.total2 = data.count;\r\n this.loading2 = false;\r\n })\r\n .catch((res) => {\r\n this.loading2 = false;\r\n this.$message.error(res.msg);\r\n });\r\n resolve();\r\n }, 2000);\r\n });\r\n },\r\n // 查看对话\r\n look(row) {\r\n this.isChat = false;\r\n this.rowRecord = row;\r\n this.getChatlist();\r\n },\r\n // 查看对话列表\r\n getChatlist() {\r\n this.loading5 = true;\r\n this.formValidate5.uid = this.rows.uid;\r\n this.formValidate5.to_uid = this.rowRecord.uid;\r\n this.formValidate5.id = this.rows.id;\r\n kefuChatlistApi(this.formValidate5)\r\n .then(async (res) => {\r\n let data = res.data;\r\n this.tableList5 = data.list;\r\n this.total5 = data.count;\r\n this.loading5 = false;\r\n })\r\n .catch((res) => {\r\n this.loading5 = false;\r\n this.$message.error(res.msg);\r\n });\r\n },\r\n // 修改成功\r\n submitFail() {\r\n this.getList();\r\n },\r\n // 聊天记录\r\n record(row) {\r\n this.rows = row;\r\n this.modals3 = true;\r\n this.isChat = true;\r\n this.getListRecord();\r\n },\r\n // 聊天记录列表\r\n getListRecord() {\r\n this.loading3 = true;\r\n kefuRecordApi(this.formValidate3, this.rows.id)\r\n .then(async (res) => {\r\n let data = res.data;\r\n this.tableList3 = data.list ? data.list : [];\r\n this.total3 = data.count;\r\n this.loading3 = false;\r\n })\r\n .catch((res) => {\r\n this.loading3 = false;\r\n this.$message.error(res.msg);\r\n });\r\n },\r\n // 编辑\r\n edit(row) {\r\n if (this.eidtLoading) return;\r\n this.eidtLoading = true;\r\n this.$modalForm(kefuEditApi(row.id))\r\n .then(() => {\r\n this.getList();\r\n this.eidtLoading = false;\r\n })\r\n .catch(() => {\r\n this.eidtLoading = false;\r\n });\r\n },\r\n // 添加\r\n add() {\r\n this.$modalForm(kefuaddApi()).then(() => this.getList());\r\n },\r\n // 全选\r\n onSelectTab(selection) {\r\n this.selections = selection;\r\n let data = [];\r\n this.selections.map((item) => {\r\n data.push(item.uid);\r\n });\r\n this.addFrom.uids = data;\r\n },\r\n // 具体日期\r\n onchangeTime(e) {\r\n this.timeVal = e;\r\n this.formValidate.data = this.timeVal ? this.timeVal.join('-') : '';\r\n this.formValidate.page = 1;\r\n this.getListService();\r\n },\r\n // 选择时间\r\n selectChange(tab) {\r\n this.formValidate.data = tab;\r\n this.timeVal = [];\r\n this.formValidate.page = 1;\r\n this.getListService();\r\n },\r\n // 客服列表\r\n getListService() {\r\n this.loading2 = true(this.formValidate)\r\n .then(async (res) => {\r\n let data = res.data;\r\n this.tableList2 = data.list;\r\n this.total2 = data.count;\r\n this.tableList2.map((item) => {\r\n item._isChecked = false;\r\n });\r\n this.loading2 = false;\r\n })\r\n .catch((res) => {\r\n tkefucreateApihis.loading2 = false;\r\n this.$message.error(res.msg);\r\n });\r\n },\r\n pageChange2(pageIndex) {\r\n this.formValidate.page = pageIndex;\r\n this.getListService();\r\n this.addFrom.uids = [];\r\n },\r\n // 搜索\r\n userSearchs() {\r\n this.formValidate.page = 1;\r\n this.getListService();\r\n },\r\n // 删除\r\n del(row, tit, num) {\r\n let delfromData = {\r\n title: tit,\r\n num: num,\r\n url: `app/wechat/kefu/${row.id}`,\r\n method: 'DELETE',\r\n ids: '',\r\n };\r\n this.$modalSure(delfromData)\r\n .then((res) => {\r\n this.$message.success(res.msg);\r\n this.tableList.splice(num, 1);\r\n })\r\n .catch((res) => {\r\n this.$message.error(res.msg);\r\n });\r\n },\r\n // 列表\r\n getList() {\r\n this.loading = true;\r\n kefuListApi(this.tableFrom)\r\n .then(async (res) => {\r\n let data = res.data;\r\n this.tableList = data.list;\r\n this.total = res.data.count;\r\n this.loading = false;\r\n })\r\n .catch((res) => {\r\n this.loading = false;\r\n this.$message.error(res.msg);\r\n });\r\n },\r\n // 修改是否显示\r\n onchangeIsShow(row) {\r\n let data = {\r\n id: row.id,\r\n status: row.status,\r\n };\r\n kefusetStatusApi(data)\r\n .then(async (res) => {\r\n this.$message.success(res.msg);\r\n this.getList();\r\n })\r\n .catch((res) => {\r\n this.$message.error(res.msg);\r\n });\r\n },\r\n // 添加客服\r\n putRemark() {\r\n if (this.addFrom.uids.length === 0) {\r\n return this.$message.warning('请选择要添加的客服');\r\n }\r\n kefuAddApi(this.addFrom)\r\n .then(async (res) => {\r\n this.$message.success(res.msg);\r\n this.modals = false;\r\n this.getList();\r\n })\r\n .catch((res) => {\r\n this.loading = false;\r\n this.$message.error(res.msg);\r\n });\r\n },\r\n },\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.tabBox_img {\r\n width: 36px;\r\n height: 36px;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n\r\n img {\r\n width: 100%;\r\n height: 100%;\r\n }\r\n}\r\n.modelBox {\r\n ::v-deep,\r\n .ivu-table-header {\r\n width: 100% !important;\r\n }\r\n}\r\n.trees-coadd {\r\n width: 100%;\r\n height: 385px;\r\n .scollhide {\r\n width: 100%;\r\n height: 100%;\r\n overflow-x: hidden;\r\n overflow-y: scroll;\r\n }\r\n}\r\n.scollhide::-webkit-scrollbar {\r\n display: none;\r\n}\r\n</style>\r\n"]}]}