diff --git a/.env.development b/.env.development index c60de5b..c935818 100644 --- a/.env.development +++ b/.env.development @@ -6,12 +6,12 @@ # @Description: ### # 页面标题 -VUE_APP_TITLE = 莳松管理系统 +VUE_APP_TITLE = 开心学车管理系统 # 开发环境配置 ENV = 'development' -# 莳松管理系统/开发环境 +# 开心学车管理系统/开发环境 VUE_APP_BASE_API = '/dev-api' JWL_API = '' diff --git a/.env.production b/.env.production index 7607d56..64e3256 100644 --- a/.env.production +++ b/.env.production @@ -1,8 +1,8 @@ # 页面标题 -VUE_APP_TITLE = 莳松管理系统 +VUE_APP_TITLE = 开心学车管理系统 # 生产环境配置 ENV = 'production' -# 莳松管理系统/生产环境 +# 开心学车管理系统/生产环境 VUE_APP_BASE_API = '/duima' diff --git a/.env.staging b/.env.staging index 061ba5c..f0edbe0 100644 --- a/.env.staging +++ b/.env.staging @@ -1,10 +1,10 @@ # 页面标题 -VUE_APP_TITLE = 莳松管理系统 +VUE_APP_TITLE = 开心学车管理系统 NODE_ENV = production # 测试环境配置 ENV = 'staging' -# 莳松管理系统/测试环境 +# 开心学车管理系统/测试环境 VUE_APP_BASE_API = '/stage-api' diff --git a/package.json b/package.json index a25b260..dd3ae93 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "river", "version": "1.0.0", - "description": "莳松管理系统", - "author": "莳松", + "description": "开心学车管理系统", + "author": "开心学车", "license": "MIT", "scripts": { "dev": "vue-cli-service serve", 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/api/zs/invitation.js b/src/api/zs/invitation.js new file mode 100644 index 0000000..47b4ee2 --- /dev/null +++ b/src/api/zs/invitation.js @@ -0,0 +1,53 @@ +import request from '@/utils/request' + +// 查询邀约列表 +export function listInvitation(query) { + return request({ + url: '/zs/invitation/list', + method: 'get', + params: query + }) +} + +// 查询邀约详细 +export function getInvitation(invitationId) { + return request({ + url: '/zs/invitation/' + invitationId, + method: 'get' + }) +} + +// 查询邀约详细 +export function getInvitationByClue(query) { + return request({ + url: '/zs/invitation/clue', + method: 'get', + params: query + }) +} + +// 新增邀约 +export function addInvitation(data) { + return request({ + url: '/zs/invitation', + method: 'post', + data: data + }) +} + +// 修改邀约 +export function updateInvitation(data) { + return request({ + url: '/zs/invitation', + method: 'put', + data: data + }) +} + +// 删除邀约 +export function delInvitation(invitationId) { + return request({ + url: '/zs/invitation/' + invitationId, + method: 'delete' + }) +} diff --git a/src/layout/components/Sidebar/Logo.vue b/src/layout/components/Sidebar/Logo.vue index 8ff3ac9..30fcde8 100644 --- a/src/layout/components/Sidebar/Logo.vue +++ b/src/layout/components/Sidebar/Logo.vue @@ -27,7 +27,7 @@ export default { }, data() { return { - title: '莳松管理系统', + title: '开心学车管理系统', logo: logoImg }; }, 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/login.vue b/src/views/login.vue index f9e7075..c969032 100644 --- a/src/views/login.vue +++ b/src/views/login.vue @@ -1,7 +1,7 @@ + 关键话术 + 确 定 @@ -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 @@ - - - \ No newline at end of file + + diff --git a/src/views/zs/clue/components/InvitationFormDialog.vue b/src/views/zs/clue/components/InvitationFormDialog.vue new file mode 100644 index 0000000..1f6186b --- /dev/null +++ b/src/views/zs/clue/components/InvitationFormDialog.vue @@ -0,0 +1,143 @@ + + + + \ 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..b7557cd 100644 --- a/src/views/zs/clue/index.vue +++ b/src/views/zs/clue/index.vue @@ -13,15 +13,22 @@ 导出 批量修改 公海 + 关键话术 +
- + + + + @@ -72,26 +83,28 @@ 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 InvitationFormDialog from './components/InvitationFormDialog.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,InvitationFormDialog + }, + 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 +133,21 @@ export default { 报名他校: '#afaeb0', 无效线索: '#afaeb0' }, + feedbackTagColorMap: { + 0: '待邀约', + 1: '待分发', + 2: '待跟进', + 3: '已跟进', + 4: '已到场', + 5: '退单' + }, 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 +164,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 +176,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 +222,7 @@ export default { .catch(function () { }); }, // 删除 - handleDelete(item) { + handleDelete (item) { this.$confirm('是否确认删除该条线索(“' + item.name + '/' + item.phone + '”)?', '警告', { confirmButtonText: '确定', cancelButtonText: '取消', @@ -213,13 +239,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 +256,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 +269,7 @@ export default { }); }, // 批量修改 - handleBatChUpdate() { + handleBatChUpdate () { this.options = { userOptions: this.userOptions }; @@ -254,7 +280,7 @@ export default { }); }, // 登记成交 - async handleSign(item) { + async handleSign (item) { // 根据clueId查询登记信息 let signInfo = {}; this.clueInfo = item; @@ -266,40 +292,45 @@ 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); }); - } + }, + //邀约 + handleInvitation(item){ + this.$nextTick(() => { + this.$refs.InvitationDialog.init(item) + }) + } } }; 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 @@ + + + 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 @@ + + + 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 @@ + + + diff --git a/src/views/zs/sign/columns.js b/src/views/zs/sign/columns.js index 2eb0da5..6dbe716 100644 --- a/src/views/zs/sign/columns.js +++ b/src/views/zs/sign/columns.js @@ -160,5 +160,13 @@ export const defaultColumns = [{ width: 140, visible: true, overflow: true + }, + { + key: 21, + prop: 'settlementMoney', + label: '结算金额', + width: 140, + visible: true, + overflow: true } ]; diff --git a/src/views/zs/sign/components/CheckDialog/components/SignForm.vue b/src/views/zs/sign/components/CheckDialog/components/SignForm.vue index 3a24846..7440c68 100644 --- a/src/views/zs/sign/components/CheckDialog/components/SignForm.vue +++ b/src/views/zs/sign/components/CheckDialog/components/SignForm.vue @@ -121,13 +121,15 @@ - + + + + + + + + + diff --git a/src/views/zs/sign/components/SettlementDialog.vue b/src/views/zs/sign/components/SettlementDialog.vue new file mode 100644 index 0000000..4b089cd --- /dev/null +++ b/src/views/zs/sign/components/SettlementDialog.vue @@ -0,0 +1,104 @@ + + + + + + + \ No newline at end of file diff --git a/src/views/zs/sign/components/SignFormDialog.vue b/src/views/zs/sign/components/SignFormDialog.vue index baf6f1b..a11765a 100644 --- a/src/views/zs/sign/components/SignFormDialog.vue +++ b/src/views/zs/sign/components/SignFormDialog.vue @@ -124,13 +124,6 @@ - @@ -141,13 +134,6 @@ - - - - - - - diff --git a/src/views/zs/sign/index.vue b/src/views/zs/sign/index.vue index fb69537..c1c8a32 100644 --- a/src/views/zs/sign/index.vue +++ b/src/views/zs/sign/index.vue @@ -21,17 +21,18 @@ - + @@ -43,10 +44,13 @@ - + + + +
@@ -58,6 +62,7 @@ import SearchForm from './components/SearchForm.vue'; import SignFormDialog from './components/SignFormDialog.vue'; import { defaultColumns } from './columns.js'; import UploadDialog from './components/UploadDialog.vue'; +import SettlementDialog from './components/SettlementDialog.vue'; export default { name: 'Sign', @@ -65,7 +70,8 @@ export default { SearchForm, CheckDialog, SignFormDialog, - UploadDialog + UploadDialog, + SettlementDialog }, data() { return { @@ -97,7 +103,8 @@ export default { dialog: { signVisible: false, checkVisible: false, - uploadVisible: false + uploadVisible: false, + settlementVisible: true }, options: { userOptions: [], @@ -225,6 +232,13 @@ export default { this.$nextTick(() => { this.$refs.checkDialogForm.init(item); }); + }, + //结算 + handleSettlement(item){ + this.dialog.settlementVisible = true + this.$nextTick(() => { + this.$refs.SettlementDialog.init(item); + }) } } }; diff --git a/vue.config.js b/vue.config.js index f515584..d975b06 100644 --- a/vue.config.js +++ b/vue.config.js @@ -7,7 +7,7 @@ function resolve(dir) { const CompressionPlugin = require('compression-webpack-plugin'); -const name = process.env.VUE_APP_TITLE || '莳松管理系统'; // 网页标题 +const name = process.env.VUE_APP_TITLE || '开心学车管理系统'; // 网页标题 const port = process.env.port || process.env.npm_config_port || 80; // 端口 @@ -44,7 +44,7 @@ module.exports = { // detail: https://cli.vuejs.org/config/#devserver-proxy [process.env.VUE_APP_BASE_API]: { // target: `https://xueche.ahduima.com/duima/`, - target: `http://localhost:8086`, + target: `http://localhost:8088`, changeOrigin: true, pathRewrite: { ['^' + process.env.VUE_APP_BASE_API]: ''