diff --git a/src/api/chat/waiter.js b/src/api/chat/waiter.js new file mode 100644 index 0000000..03004fc --- /dev/null +++ b/src/api/chat/waiter.js @@ -0,0 +1,36 @@ +import request from '@/utils/request.js'; +export const search = (params) => { + return request({ + url: '/mall/im/admin/waiterUser', + method: 'get', + params, + }); +}; +export const detail = (userId) => { + return request({ + url: '/mall/im/admin/waiterUser/getWaiterByUserId', + method: 'get', + params: { userId }, + }); +}; +export const create = (data) => { + return request({ + url: '/mall/im/admin/waiterUser', + method: 'post', + data, + }); +}; +export const update = (data) => { + return request({ + url: '/mall/im/admin/waiterUser', + method: 'put', + data, + }); +}; +export const remove = (ids) => { + return request({ + url: '/mall/im/admin/waiterUser', + method: 'delete', + data: { ids }, + }); +}; diff --git a/src/api/im/index.js b/src/api/im/index.js new file mode 100644 index 0000000..52f51f7 --- /dev/null +++ b/src/api/im/index.js @@ -0,0 +1,106 @@ +import request from '@/utils/request.js'; +export const online = (params) => { + return request({ + url: '/im/admin/count/online', + method: 'get', + params, + }); +}; +export const hours = (params) => { + return request({ + url: '/im/admin/count/hoursMessage', + method: 'get', + params, + }); +}; +export const days = (params) => { + return request({ + url: '/im/admin/count/daysMessage', + method: 'get', + params, + }); +}; +export const searchSystem = (params) => { + return request({ + url: '/im/admin/thirdSystem', + method: 'get', + params, + }); +}; +export const createSystem = (data) => { + return request({ + url: '/im/admin/thirdSystem', + method: 'post', + data, + }); +}; +export const updateSystem = (data) => { + return request({ + url: '/im/admin/thirdSystem', + method: 'put', + data, + }); +}; +export const removeSystem = (data) => { + return request({ + url: '/im/admin/thirdSystem', + method: 'delete', + data, + }); +}; +export const searchStore = (params) => { + return request({ + url: '/im/admin/storeConfig', + method: 'get', + params, + }); +}; +export const createStore = (data) => { + return request({ + url: '/im/admin/storeConfig', + method: 'post', + data, + }); +}; +export const updateStore = (data) => { + return request({ + url: '/im/admin/storeConfig', + method: 'put', + data, + }); +}; +export const removeStore = (data) => { + return request({ + url: '/im/admin/storeConfig', + method: 'delete', + data, + }); +}; +export const searchWaiter = (params) => { + return request({ + url: '/im/admin/waiter', + method: 'get', + params, + }); +}; +export const createWaiter = (data) => { + return request({ + url: '/im/admin/waiter', + method: 'post', + data, + }); +}; +export const updateWaiter = (data) => { + return request({ + url: '/im/admin/waiter', + method: 'put', + data, + }); +}; +export const removeWaiter = (data) => { + return request({ + url: '/im/admin/waiter', + method: 'delete', + data, + }); +}; diff --git a/src/store/modules/chat/customerService.js b/src/store/modules/chat/chatWaiter.js similarity index 65% rename from src/store/modules/chat/customerService.js rename to src/store/modules/chat/chatWaiter.js index 50de3ee..7451300 100644 --- a/src/store/modules/chat/customerService.js +++ b/src/store/modules/chat/chatWaiter.js @@ -1,26 +1,14 @@ -import * as api from '@/api/chat/index.js'; +import * as api from '@/api/chat/waiter.js'; +import * as EmployeeAPI from '@/api/permission/employee.js'; import { ElMessage, ElMessageBox } from '@/plugins/element-plus'; const state = () => ({ - code: 'CustomerServiceManagement', + code: 'ChatWaiter', condition: {}, list: [], total: 0, opts: { init: false, - customerServiceType: [ - { - label: '售前', - value: 1, - }, - { - label: '售后', - value: 2, - }, - { - label: '发货', - value: 3, - }, - ], + employee: [], }, }); const getters = {}; @@ -32,9 +20,11 @@ const mutations = { setOpts: (state, data) => (state.opts = data), }; const actions = { - search: async ({ commit }) => { - let res = await api.searchService(1); - commit('setList', res || []); + search: async ({ state, commit, rootGetters }) => { + let data = { ...state.condition }; + let res = await api.search({ ...rootGetters['local/page'](state.code), ...data }); + commit('setList', res?.records || []); + commit('setTotal', res?.total || 0); if (!res) { ElMessage.error('查询失败'); } @@ -44,16 +34,13 @@ const actions = { commit('setOpts', { ...state.opts, init: true, + employee: (await EmployeeAPI.search({ pageIndex: 1, length: 9999 }))?.records || [], }); }, - detail: async (context, id) => { - let res = await api.detail(id); - if (!res) { - ElMessage.error('加载详情失败'); + save: async ({ state, dispatch }, data) => { + if (data.id) { + data.systemId = state.condition.systemid; } - return res; - }, - save: async ({ dispatch }, data) => { let save = data.id ? api.update : api.create; let res = await save(data); if (res) { @@ -64,13 +51,13 @@ const actions = { } return res; }, - remove: async ({ dispatch }, idList) => { - if (!idList.length) { + remove: async ({ dispatch }, ids) => { + if (!ids.length) { ElMessage.warning('请选择要删除的数据'); } else { try { await ElMessageBox.confirm('数据删除后无法恢复,确定要删除吗?', '危险操作'); - let res = await api.remove(idList.join(',')); + let res = await api.remove(ids); if (res) { ElMessage.success('删除成功'); dispatch('search'); diff --git a/src/store/modules/im/imHome.js b/src/store/modules/im/imHome.js new file mode 100644 index 0000000..8f12d1e --- /dev/null +++ b/src/store/modules/im/imHome.js @@ -0,0 +1,45 @@ +import * as api from '@/api/im/index.js'; +import { ElMessage } from '@/plugins/element-plus'; +const state = () => ({ + online: 0, + single: [], + range: [], +}); +const getters = {}; +const mutations = { + setOnline: (state, data) => (state.online = data), + setSingle: (state, data) => (state.single = data), + setRange: (state, data) => (state.range = data), +}; +const actions = { + loadOnline: async ({ commit }, data) => { + let res = await api.online(data); + commit('setOnline', res || 0); + if (!res && res !== 0) { + ElMessage.error('查询失败'); + } + return res; + }, + loadSingle: async ({ commit }, data) => { + let res = await api.hours(data); + commit('setSingle', res || []); + if (!res) { + ElMessage.error('查询失败'); + } + return res; + }, + loadRange: async ({ commit }, data) => { + let res = await api.days(data); + commit('setRange', res || []); + if (!res) { + ElMessage.error('查询失败'); + } + return res; + }, +}; +export default { + state, + getters, + mutations, + actions, +}; diff --git a/src/store/modules/im/imStore.js b/src/store/modules/im/imStore.js new file mode 100644 index 0000000..41523a8 --- /dev/null +++ b/src/store/modules/im/imStore.js @@ -0,0 +1,78 @@ +import * as api from '@/api/im/index.js'; +import { ElMessage, ElMessageBox } from '@/plugins/element-plus'; +const state = () => ({ + code: 'ImStore', + condition: {}, + list: [], + total: 0, + opts: { + init: false, + system: [], + }, +}); +const getters = {}; +const mutations = { + setCode: (state, data) => (state.code = data), + setCondition: (state, data) => (state.condition = data), + setList: (state, data) => (state.list = data), + setTotal: (state, data) => (state.total = data), + setOpts: (state, data) => (state.opts = data), +}; +const actions = { + search: async ({ state, commit, rootGetters }) => { + let data = { ...state.condition }; + let res = await api.searchStore({ ...rootGetters['local/page'](state.code), ...data }); + if (res) { + commit('setList', res.records); + commit('setTotal', res.total); + } else { + ElMessage.error('查询失败'); + commit('setList', []); + } + return res; + }, + load: async ({ commit }) => { + commit('setOpts', { + init: true, + system: (await api.searchSystem({ pageIndex: 1, length: 9999 }))?.records || [], + }); + }, + save: async ({ dispatch }, data) => { + if (data.id) { + data.systemId = data.sysId; + } + let save = data.id ? api.updateStore : api.createStore; + let res = await save(data); + if (res) { + ElMessage.success('保存成功'); + dispatch('search'); + } else { + ElMessage.error('保存失败'); + } + return res; + }, + remove: async ({ dispatch }, ids) => { + if (!ids.length) { + ElMessage.warning('请选择要删除的数据'); + } else { + try { + await ElMessageBox.confirm('数据删除后无法恢复,确定要删除吗?', '危险操作'); + let res = await api.removeStore({ ids }); + if (res) { + ElMessage.success('删除成功'); + dispatch('search'); + } else { + ElMessage.error('删除失败'); + } + } catch (e) { + console.info('取消删除', e); + } + } + }, +}; +export default { + state, + getters, + mutations, + actions, +}; diff --git a/src/store/modules/im/imSystem.js b/src/store/modules/im/imSystem.js new file mode 100644 index 0000000..c2ddf62 --- /dev/null +++ b/src/store/modules/im/imSystem.js @@ -0,0 +1,73 @@ +import * as api from '@/api/im/index.js'; +import { ElMessage, ElMessageBox } from '@/plugins/element-plus'; +const state = () => ({ + code: 'ImSystem', + condition: {}, + list: [], + total: 0, + opts: { + init: false, + }, +}); +const getters = {}; +const mutations = { + setCode: (state, data) => (state.code = data), + setCondition: (state, data) => (state.condition = data), + setList: (state, data) => (state.list = data), + setTotal: (state, data) => (state.total = data), + setOpts: (state, data) => (state.opts = data), +}; +const actions = { + search: async ({ state, commit, rootGetters }) => { + let data = { ...state.condition }; + let res = await api.searchSystem({ ...rootGetters['local/page'](state.code), ...data }); + if (res) { + commit('setList', res.records); + commit('setTotal', res.total); + } else { + ElMessage.error('查询失败'); + commit('setList', []); + } + return res; + }, + load: async ({ commit }) => { + commit('setOpts', { + init: true, + }); + }, + save: async ({ dispatch }, data) => { + let save = data.id ? api.updateSystem : api.createSystem; + let res = await save(data); + if (res) { + ElMessage.success('保存成功'); + dispatch('search'); + } else { + ElMessage.error('保存失败'); + } + return res; + }, + remove: async ({ dispatch }, ids) => { + if (!ids.length) { + ElMessage.warning('请选择要删除的数据'); + } else { + try { + await ElMessageBox.confirm('数据删除后无法恢复,确定要删除吗?', '危险操作'); + let res = await api.removeSystem({ ids }); + if (res) { + ElMessage.success('删除成功'); + dispatch('search'); + } else { + ElMessage.error('删除失败'); + } + } catch (e) { + console.info('取消删除', e); + } + } + }, +}; +export default { + state, + getters, + mutations, + actions, +}; diff --git a/src/store/modules/im/imWaiter.js b/src/store/modules/im/imWaiter.js new file mode 100644 index 0000000..824f28c --- /dev/null +++ b/src/store/modules/im/imWaiter.js @@ -0,0 +1,78 @@ +import * as api from '@/api/im/index.js'; +import { ElMessage, ElMessageBox } from '@/plugins/element-plus'; +const state = () => ({ + code: 'ImWaiter', + condition: {}, + list: [], + total: 0, + opts: { + init: false, + store: [], + }, +}); +const getters = {}; +const mutations = { + setCode: (state, data) => (state.code = data), + setCondition: (state, data) => (state.condition = data), + setList: (state, data) => (state.list = data), + setTotal: (state, data) => (state.total = data), + setOpts: (state, data) => (state.opts = data), +}; +const actions = { + search: async ({ state, commit, rootGetters }) => { + let data = { ...state.condition }; + let res = await api.searchWaiter({ ...rootGetters['local/page'](state.code), ...data }); + if (res) { + commit('setList', res.records); + commit('setTotal', res.total); + } else { + ElMessage.error('查询失败'); + commit('setList', []); + } + return res; + }, + load: async ({ commit }) => { + commit('setOpts', { + init: true, + store: (await api.searchStore({ pageIndex: 1, length: 9999 }))?.records || [], + }); + }, + save: async ({ state, dispatch }, data) => { + if (data.id) { + data.systemId = state.condition.systemid; + } + let save = data.id ? api.updateWaiter : api.createWaiter; + let res = await save(data); + if (res) { + ElMessage.success('保存成功'); + dispatch('search'); + } else { + ElMessage.error('保存失败'); + } + return res; + }, + remove: async ({ dispatch }, data) => { + if (!data.waiterIds.length) { + ElMessage.warning('请选择要删除的数据'); + } else { + try { + await ElMessageBox.confirm('数据删除后无法恢复,确定要删除吗?', '危险操作'); + let res = await api.removeWaiter(data); + if (res) { + ElMessage.success('删除成功'); + dispatch('search'); + } else { + ElMessage.error('删除失败'); + } + } catch (e) { + console.info('取消删除', e); + } + } + }, +}; +export default { + state, + getters, + mutations, + actions, +}; diff --git a/src/store/modules/system/notify.js b/src/store/modules/system/notify.js index 535c033..d4a1d55 100644 --- a/src/store/modules/system/notify.js +++ b/src/store/modules/system/notify.js @@ -23,7 +23,7 @@ const actions = { data.startReleaseTime = data.dateRange?.[0]; data.endReleaseTime = data.dateRange?.[1]; delete data.dateRange; - let res = await api.search({ ...rootGetters['local/page'](state.code), ...state.condition }); + let res = await api.search({ ...rootGetters['local/page'](state.code), ...data }); if (res) { commit('setList', res.records); commit('setTotal', res.total); diff --git a/src/utils/request.js b/src/utils/request.js index 4a7d620..410c830 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -64,6 +64,14 @@ instance.interceptors.request.use( if (token) { config.headers['Authorization'] = token; } + config.params = Object.fromEntries( + Object.entries(config.params || {}).filter( + (entry) => + entry[1] !== null && + typeof entry[1] !== 'undefined' && + (typeof entry[1] !== 'string' || entry[1].trim() !== '') + ) + ); if (config.data && config.headers['Content-Type'] === 'application/x-www-form-urlencoded;charset=UTF-8') { config.data = qs.stringify(config.data); } diff --git a/src/views/chat/waiter.vue b/src/views/chat/waiter.vue new file mode 100644 index 0000000..4d15ea3 --- /dev/null +++ b/src/views/chat/waiter.vue @@ -0,0 +1,190 @@ + + + + + diff --git a/src/views/im/home/dateRange.vue b/src/views/im/home/dateRange.vue new file mode 100644 index 0000000..886f2c1 --- /dev/null +++ b/src/views/im/home/dateRange.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/src/views/im/home/index.vue b/src/views/im/home/index.vue new file mode 100644 index 0000000..1d8d72e --- /dev/null +++ b/src/views/im/home/index.vue @@ -0,0 +1,239 @@ + + + + + diff --git a/src/views/im/store/index.vue b/src/views/im/store/index.vue new file mode 100644 index 0000000..4dd7193 --- /dev/null +++ b/src/views/im/store/index.vue @@ -0,0 +1,212 @@ + + + + + diff --git a/src/views/im/system/index.vue b/src/views/im/system/index.vue new file mode 100644 index 0000000..607f4c6 --- /dev/null +++ b/src/views/im/system/index.vue @@ -0,0 +1,175 @@ + + + + + diff --git a/src/views/im/waiter/index.vue b/src/views/im/waiter/index.vue new file mode 100644 index 0000000..cc7ee15 --- /dev/null +++ b/src/views/im/waiter/index.vue @@ -0,0 +1,225 @@ + + + + + diff --git a/vite.config.js b/vite.config.js index 611fffc..6e19788 100644 --- a/vite.config.js +++ b/vite.config.js @@ -23,7 +23,7 @@ export default (configEnv) => { // target: 'http://192.168.10.109:8090/', // 显雨 // target: 'http://192.168.10.5:4500', // 高玉 // target: 'http://192.168.10.67:8090', // 罗战 - // target: 'http://192.168.10.93:8090', // 周渺 + // target: 'http://192.168.10.94:8090', // 周渺 // target: 'http://192.168.10.124:8090', // 舒梦娇 target: 'https://k8s-horse-gateway.mashibing.cn/', // 测试地址 // target: 'https://you-gateway.mashibing.com', // 生产环境