diff --git a/src/api/sch/coach.js b/src/api/sch/coach.js new file mode 100644 index 0000000..be32fc0 --- /dev/null +++ b/src/api/sch/coach.js @@ -0,0 +1,59 @@ +/* + * @Author: riverQiu + * @Date: 2023-10-07 17:14:32 + * @LastEditors: riverQiu + * @LastEditTime: 2023-10-10 17:00:57 + * @Description:教练接口 + */ +import request from '@/utils/request'; + +// 查询教练列表 +export function listCoach(query) { + return request({ + url: '/sch/coach/list', + method: 'get', + params: query + }); +} + +// 查询教练详细 +export function getCoach(coachId) { + return request({ + url: '/sch/coach/' + coachId, + method: 'get' + }); +} + +// 新增教练 +export function addCoach(data) { + return request({ + url: '/sch/coach', + method: 'post', + data: data + }); +} + +// 修改教练 +export function updateCoach(data) { + return request({ + url: '/sch/coach', + method: 'put', + data: data + }); +} + +// 删除教练 +export function delCoach(coachId) { + return request({ + url: '/sch/coach/' + coachId, + method: 'delete' + }); +} + +export function getAllCoaches(query){ + return request({ + url: '/sch/coach/all', + method: 'get', + params: query + }); +} diff --git a/src/api/system/skill.js b/src/api/system/skill.js new file mode 100644 index 0000000..edb38a8 --- /dev/null +++ b/src/api/system/skill.js @@ -0,0 +1,59 @@ +/* + * @Author: riverQiu + * @Date: 2023-10-14 00:31:37 + * @LastEditors: riverQiu + * @LastEditTime: 2023-10-15 00:37:52 + * @Description: + */ +import request from '@/utils/request' + +// 查询关键话术列表 +export function listSkill(query) { + return request({ + url: '/system/skill/list', + method: 'get', + params: query + }) +} + +// 查询关键话术详细 +export function getSkill(skillId) { + return request({ + url: '/system/skill/' + skillId, + method: 'get' + }) +} + + +export function getSkillKey() { + return request({ + url: '/system/skill/key', + method: 'get' + }) +} + +// 新增关键话术 +export function addSkill(data) { + return request({ + url: '/system/skill', + method: 'post', + data: data + }) +} + +// 修改关键话术 +export function updateSkill(data) { + return request({ + url: '/system/skill', + method: 'put', + data: data + }) +} + +// 删除关键话术 +export function delSkill(skillId) { + return request({ + url: '/system/skill/' + skillId, + method: 'delete' + }) +} diff --git a/src/api/zs/feedback.js b/src/api/zs/feedback.js new file mode 100644 index 0000000..af7ffa7 --- /dev/null +++ b/src/api/zs/feedback.js @@ -0,0 +1,51 @@ +/* + * @Author: riverQiu + * @Date: 2023-10-07 17:14:38 + * @LastEditors: riverQiu + * @LastEditTime: 2023-10-07 17:14:44 + * @Description: 线索反馈接口 + */ +import request from '@/utils/request'; + +// 查询线索反馈列表 +export function listFeedback(query) { + return request({ + url: '/zs/feedback/list', + method: 'get', + params: query + }); +} + +// 查询线索反馈详细 +export function getFeedback(feedbackId) { + return request({ + url: '/zs/feedback/' + feedbackId, + method: 'get' + }); +} + +// 新增线索反馈 +export function addFeedback(data) { + return request({ + url: '/zs/feedback', + method: 'post', + data: data + }); +} + +// 修改线索反馈 +export function updateFeedback(data) { + return request({ + url: '/zs/feedback', + method: 'put', + data: data + }); +} + +// 删除线索反馈 +export function delFeedback(feedbackId) { + return request({ + url: '/zs/feedback/' + feedbackId, + method: 'delete' + }); +} diff --git a/src/api/zs/feedbackDetail.js b/src/api/zs/feedbackDetail.js new file mode 100644 index 0000000..1d3ac59 --- /dev/null +++ b/src/api/zs/feedbackDetail.js @@ -0,0 +1,74 @@ +/* + * @Author: riverQiu + * @Date: 2023-10-11 20:48:02 + * @LastEditors: riverQiu + * @LastEditTime: 2023-10-11 20:57:06 + * @Description: + */ +/* + * @Author: riverQiu + * @Date: 2023-10-10 16:08:39 + * @LastEditors: riverQiu + * @LastEditTime: 2023-10-10 16:10:06 + * @Description: 反馈单 + */ +import request from '@/utils/request'; + +// 查询线索反馈列表 +export function listFeedbackDetail(query) { + return request({ + url: '/zs/feedback/detail/list', + method: 'get', + params: query + }); +} + +// 查询线索反馈详细 +export function getFeedbackDetail(feedbackId) { + return request({ + url: '/zs/feedback/detail/' + feedbackId, + method: 'get' + }); +} + +export function getFeedbackDetailInfo(query){ + return request({ + url: '/zs/feedback/detail/info', + method: 'get', + params: query + }); +} + +// 查询线索反馈详细 +export function getFeedbackDetailByClueId(clueId) { + return request({ + url: '/zs/feedback/detail/' + clueId, + method: 'get' + }); +} + +// 新增线索反馈 +export function addFeedbackDetail(data) { + return request({ + url: '/zs/feedback/detail', + method: 'post', + data: data + }); +} + +// 修改线索反馈 +export function updateFeedbackDetail(data) { + return request({ + url: '/zs/feedback/detail', + method: 'put', + data: data + }); +} + +// 删除线索反馈 +export function delFeedbackDetail(feedbackId) { + return request({ + url: '/zs/feedback/detail/' + feedbackId, + method: 'delete' + }); +} diff --git a/src/api/zs/feedbackOrder.js b/src/api/zs/feedbackOrder.js new file mode 100644 index 0000000..2e2073c --- /dev/null +++ b/src/api/zs/feedbackOrder.js @@ -0,0 +1,59 @@ +/* + * @Author: riverQiu + * @Date: 2023-10-10 16:08:39 + * @LastEditors: riverQiu + * @LastEditTime: 2023-10-10 16:10:06 + * @Description: 反馈单 + */ +import request from '@/utils/request'; + +// 查询线索反馈列表 +export function listFeedbackOrder(query) { + return request({ + url: '/zs/feedback/order/list', + method: 'get', + params: query + }); +} + +// 查询线索反馈详细 +export function getFeedbackOrder(feedbackId) { + return request({ + url: '/zs/feedback/order/' + feedbackId, + method: 'get' + }); +} + +// 查询线索反馈详细 +export function getFeedbackOrderByClueId(clueId) { + return request({ + url: '/zs/feedback/order/' + clueId, + method: 'get' + }); +} + +// 新增线索反馈 +export function addFeedbackOrder(data) { + return request({ + url: '/zs/feedback/order', + method: 'post', + data: data + }); +} + +// 修改线索反馈 +export function updateFeedbackOrder(data) { + return request({ + url: '/zs/feedback/order', + method: 'put', + data: data + }); +} + +// 删除线索反馈 +export function delFeedbackOrder(feedbackId) { + return request({ + url: '/zs/feedback/order/' + feedbackId, + method: 'delete' + }); +} diff --git a/src/permission.js b/src/permission.js index 1841aea..b14dc3e 100644 --- a/src/permission.js +++ b/src/permission.js @@ -1,3 +1,10 @@ +/* + * @Author: riverQiu + * @Date: 2023-08-16 22:04:23 + * @LastEditors: riverQiu + * @LastEditTime: 2023-10-11 22:17:43 + * @Description: + */ import router from './router'; import store from './store'; import { @@ -16,7 +23,7 @@ NProgress.configure({ showSpinner: false }); -const whiteList = ['/login', '/auth-redirect', '/bind', '/register', '/question']; +const whiteList = ['/login', '/auth-redirect', '/bind', '/register', '/question', '/clue/feedback/follow', '/clue/feedback/arrival']; router.beforeEach((to, from, next) => { NProgress.start(); diff --git a/src/router/index.js b/src/router/index.js index df2777f..b143427 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -53,6 +53,16 @@ export const constantRoutes = [{ component: () => import('@/views/question'), hidden: true }, +{ + path: '/clue/feedback/follow', + component: () => import('@/views/zs/feedback/follow'), + hidden: true +}, +{ + path: '/clue/feedback/arrival', + component: () => import('@/views/zs/feedback/arrival'), + hidden: true +}, { path: '/404', component: () => import('@/views/error/404'), diff --git a/src/views/question/index.vue b/src/views/question/index.vue index 1f617db..035238c 100644 --- a/src/views/question/index.vue +++ b/src/views/question/index.vue @@ -82,7 +82,7 @@ export default { components: { QuestionForm, QuestionAddForm }, - data() { + data () { return { // 遮罩层 loading: false, @@ -99,12 +99,12 @@ export default { dialogAddVisible: false }; }, - created() { + created () { // this.getList(); }, methods: { /** 查询文件列表 */ - getList() { + getList () { this.loading = true; searchQuestion(this.queryParams).then(response => { this.tableList = response.data; @@ -114,7 +114,7 @@ export default { }, /** 搜索按钮操作 */ - handleQuery() { + handleQuery () { if (this.queryParams.question) { this.getList(); } else { @@ -122,17 +122,17 @@ export default { } }, /** 重置按钮操作 */ - resetQuery() { + resetQuery () { this.queryParams.question = ''; this.handleQuery(); }, - handleEdit(item) { + handleEdit (item) { this.dialogVisible = true; this.$nextTick(() => { this.$refs.dialogForm.init(item); }); }, - handleAdd(item) { + handleAdd (item) { this.dialogAddVisible = true; this.$nextTick(() => { this.$refs.dialogAddForm.init(item); diff --git a/src/views/sch/coach/components/CoachForm.vue b/src/views/sch/coach/components/CoachForm.vue new file mode 100644 index 0000000..cb2c854 --- /dev/null +++ b/src/views/sch/coach/components/CoachForm.vue @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 取消 + 确定 + + + + + diff --git a/src/views/sch/coach/index.vue b/src/views/sch/coach/index.vue new file mode 100644 index 0000000..8d6b8e5 --- /dev/null +++ b/src/views/sch/coach/index.vue @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + 搜索 + 重置 + + + + + + 新增 + + + + + + + + + + + + + + 修改 + 删除 + + + + + + + + + + + + diff --git a/src/views/system/employee/index.vue b/src/views/system/employee/index.vue index 7d17bda..fa26eff 100644 --- a/src/views/system/employee/index.vue +++ b/src/views/system/employee/index.vue @@ -158,6 +158,11 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/views/zs/clue/ClueForm/index.vue b/src/views/zs/clue/ClueForm/index.vue index c419ced..6cbb56f 100644 --- a/src/views/zs/clue/ClueForm/index.vue +++ b/src/views/zs/clue/ClueForm/index.vue @@ -26,6 +26,8 @@ 保存后继续创建下一条 + 关键话术 + 确 定 @@ -39,12 +41,12 @@ - + - + @@ -64,57 +66,57 @@ - + - + - + - - + + {{ dict.dictValue }} - + - - - - + + + + {{ dict.dictValue }} - + - + - + - + @@ -131,7 +133,7 @@ - + @@ -139,7 +141,7 @@ - + @@ -158,25 +160,28 @@ + + + diff --git a/src/views/zs/clue/components/DistributeFormDialog.vue b/src/views/zs/clue/components/DistributeFormDialog.vue index 095c588..4b5808b 100644 --- a/src/views/zs/clue/components/DistributeFormDialog.vue +++ b/src/views/zs/clue/components/DistributeFormDialog.vue @@ -1,94 +1,142 @@ - + - - {{oldForm.placeNames}} - - + + + + + + + + + + + + + + + + + + + + + + + + + 是否联系:{{ item.isContact ? '已联系' : '未联系' }} + 到场时间:{{ item.arrivalTime }} + 备注: + + + 状态: + 未到场 + 到场未成交 + 到场已成交 + + 备注: + + + + + + + - + 取消 - 确定 + 确定 - - - \ No newline at end of file + + diff --git a/src/views/zs/clue/components/SkillDialog.vue b/src/views/zs/clue/components/SkillDialog.vue new file mode 100644 index 0000000..296d123 --- /dev/null +++ b/src/views/zs/clue/components/SkillDialog.vue @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/views/zs/clue/index.vue b/src/views/zs/clue/index.vue index 3eb5fdc..b90df3e 100644 --- a/src/views/zs/clue/index.vue +++ b/src/views/zs/clue/index.vue @@ -13,15 +13,22 @@ 导出 批量修改 公海 + 关键话术 + - + + + + {{ feedbackTagColorMap[row.feedbackStatus] }} + + {{ row.intentionState }} @@ -31,11 +38,11 @@ 编辑 - 分发 - 已登记 - 未登记 - 删除 - 释放 + 分发 + 已登记 + 未登记 + 删除 + 释放 撞单信息 @@ -57,7 +64,9 @@ - + + + @@ -72,26 +81,27 @@ import SignFormDialog from '../sign/components/SignFormDialog.vue'; import ZhuangDanDialog from './components/ZhuangDanDialog.vue'; import MemoFormDialog from './components/MemoFormDialog.vue'; import DYClueFormDialog from './components/DYClueFormDialog.vue'; +import SkillDialog from './components/SkillDialog.vue'; import { defaultColumns } from './columns.js'; import { getClueList, deleteClue, getClueCountBadge, discardClue, getSign, getConsultRecord } from '@/api/zs/clue'; import empApi from '@/api/system/employee'; export default { name: 'Clue', - beforeRouteEnter(to, from, next) { + components: { + SearchForm, BatchUpdateDialog, PublicDialog, UploadDialog, SignFormDialog, DistributeFormDialog, ZhuangDanDialog, MemoFormDialog, + DYClueFormDialog, SkillDialog + }, + beforeRouteEnter (to, from, next) { if (from.name == 'ClueForm') { next(vm => { - vm._getTableList() - }) + vm._getTableList(); + }); } else { - next() + next(); } }, - components: { - SearchForm, BatchUpdateDialog, PublicDialog, UploadDialog, SignFormDialog, DistributeFormDialog, ZhuangDanDialog, MemoFormDialog, - DYClueFormDialog - }, - data() { + data () { return { admin: localStorage.getItem('admin'), userId: localStorage.getItem('userId'), @@ -120,13 +130,20 @@ export default { 报名他校: '#afaeb0', 无效线索: '#afaeb0' }, + feedbackTagColorMap: { + 0: '待分发', + 1: '待跟进', + 2: '已跟进', + 3: '已到场', + 4: '退单' + }, options: undefined, clueInfo: undefined, consultRecord: [], quickSearch: 0 }; }, - created() { + created () { const str = localStorage.getItem(`${this.$route.name}-table-columns`); this.columns = str ? JSON.parse(str) : defaultColumns; this._getClueCountBadge(); @@ -143,10 +160,10 @@ export default { }, methods: { // 分页查询表格数据 - _getTableList() { + _getTableList () { this.loading = true; const tempForm = this.$refs.SearchForm?.searchForm || {}; - this.quickSearch = tempForm.quickSearch + this.quickSearch = tempForm.quickSearch; const params = { ...this.searchForm, ...tempForm }; getClueList(params).then((response) => { this.tableList = response.rows; @@ -155,31 +172,36 @@ export default { }); }, // 获取已过期线索数 - async _getClueCountBadge() { + async _getClueCountBadge () { const resp = await getClueCountBadge(); if (resp.code === 200) { this.expireCount = resp.data; } }, // 新增或修改 - handleAddandUpdate(info) { + handleAddandUpdate (info) { this.$router.push('/zs/clue-form/index/' + (info ? info.clueId : 0)); }, - //抖音新增 - handleDYAddandUpdate(info){ + // 抖音新增 + handleDYAddandUpdate (info) { this.$nextTick(() => { this.$refs.DYClueFormDialog.init(info); }); }, + handleSkill () { + this.$nextTick(() => { + this.$refs.SkillDialog.init(); + }); + }, // 多选框选中数据 - handleSelectionChange(selection) { + handleSelectionChange (selection) { console.log(selection); this.ids = selection.map((item) => item.clueId); this.single = selection.length !== 1; this.multiple = !selection.length; }, // 释放线索操作 - handleDiscard(item) { + handleDiscard (item) { this.$confirm('是否确认释放该条线索(“' + item.name + '/' + item.phone + '”)到公海?', '警告', { confirmButtonText: '确定', cancelButtonText: '取消', @@ -196,7 +218,7 @@ export default { .catch(function () { }); }, // 删除 - handleDelete(item) { + handleDelete (item) { this.$confirm('是否确认删除该条线索(“' + item.name + '/' + item.phone + '”)?', '警告', { confirmButtonText: '确定', cancelButtonText: '取消', @@ -213,13 +235,13 @@ export default { .catch(function () { }); }, // 导入 - handleImport(ydtData, dYData) { + handleImport (ydtData, dYData) { this.$nextTick(() => { - this.$refs.uploadDialogForm.init({ydtData: ydtData, dYData: dYData}); + this.$refs.uploadDialogForm.init({ ydtData: ydtData, dYData: dYData }); }); }, /** 导出按钮操作 */ - handleExport() { + handleExport () { this.$confirm('是否确认导出所有学员信息项?', '警告', { confirmButtonText: '确定', cancelButtonText: '取消', @@ -230,12 +252,12 @@ export default { }); }, // 公海按钮点击时间 - handlePublicClue() { + handlePublicClue () { this.$nextTick(() => { this.$refs.publicDialogForm.init(); }); }, - getEmployee() { + getEmployee () { empApi.getEmployee().then((resp) => { if (resp.code === 200) { this.userOptions = resp.data; @@ -243,7 +265,7 @@ export default { }); }, // 批量修改 - handleBatChUpdate() { + handleBatChUpdate () { this.options = { userOptions: this.userOptions }; @@ -254,7 +276,7 @@ export default { }); }, // 登记成交 - async handleSign(item) { + async handleSign (item) { // 根据clueId查询登记信息 let signInfo = {}; this.clueInfo = item; @@ -266,39 +288,37 @@ export default { this.$refs.signDialogForm.init(signInfo); }); }, - //分发到场地 - handleDistribute(item) { - + // 分发到场地 + handleDistribute (item) { this.$nextTick(() => { this.$refs.distributeDialogForm.init(item.clueId); }); }, - //外呼 - handlePhone(item) { + // 外呼 + handlePhone (item) { }, - handleViewZhuangDan(item) { + handleViewZhuangDan (item) { this.$nextTick(() => { this.$refs.zhuangDanDialog.init(item.clueId); }); }, - handleRowClick(row) { + handleRowClick (row) { if (this.quickSearch != 8) { // if(row.source == '抖音直播'){ // this.handleDYAddandUpdate(row); // } else { - this.handleAddandUpdate(row) + this.handleAddandUpdate(row); // } } }, - handleCellClick(row, column, cell, event) { - //如果点击的是备注的话 开始备注编辑框 + handleCellClick (row, column, cell, event) { + // 如果点击的是备注的话 开始备注编辑框 if (column.property == 'clueMemo') { - console.log(row, column, cell, event) + console.log(row, column, cell, event); this.$nextTick(() => { this.$refs.memoDialog.init(row); }); - } } } diff --git a/src/views/zs/feedback/arrival.vue b/src/views/zs/feedback/arrival.vue new file mode 100644 index 0000000..1b397ae --- /dev/null +++ b/src/views/zs/feedback/arrival.vue @@ -0,0 +1,122 @@ + + + + + + {{ order.stuName }} + + + {{ order.phone }} + + + {{ order.address }} + + + {{ order.coachName }} + + + + 未到场 + 到场未成交 + 到场已成交 + + + + + + + + + 提 交 + + + + + + diff --git a/src/views/zs/feedback/follow.vue b/src/views/zs/feedback/follow.vue new file mode 100644 index 0000000..9c0e179 --- /dev/null +++ b/src/views/zs/feedback/follow.vue @@ -0,0 +1,126 @@ + + + + + + {{ order.stuName }} + + + {{ order.phone }} + + + {{ order.address }} + + + {{ order.coachName }} + + + + 是 + 否 + + + + + + + + + + + + 提 交 + + + + + + diff --git a/src/views/zs/feedback/index.vue b/src/views/zs/feedback/index.vue new file mode 100644 index 0000000..4086e65 --- /dev/null +++ b/src/views/zs/feedback/index.vue @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + 搜索 + 重置 + + + + + + 新增 + + + 修改 + + + 删除 + + + 导出 + + + + + + + + + + + + + + {{ parseTime(scope.row.feedbackTime, '{y}-{m}-{d}') }} + 00000000000000000000000 + + + + + {{ parseTime(scope.row.arrivalTime, '{y}-{m}-{d}') }} + + + + + + + 修改 + 删除 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +