Compare commits
14 Commits
Author | SHA1 | Date |
---|---|---|
|
205e2c7ae5 | 1 year ago |
|
2aabff2e90 | 1 year ago |
|
185163d326 | 1 year ago |
|
052fcd60b8 | 2 years ago |
|
fc2404a5b8 | 2 years ago |
![]() |
72d19bfb02 | 2 years ago |
![]() |
ac798f3f94 | 2 years ago |
![]() |
0ba4d3fe26 | 2 years ago |
|
a2c29e8dda | 2 years ago |
|
9631dba573 | 2 years ago |
|
13f3fd4377 | 2 years ago |
|
d41a186e22 | 2 years ago |
|
6c71bccd83 | 2 years ago |
|
2c0bc99c03 | 2 years ago |
@ -1,8 +1,8 @@ |
||||
# 页面标题 |
||||
VUE_APP_TITLE = 莳松管理系统 |
||||
VUE_APP_TITLE = 开心学车管理系统 |
||||
|
||||
# 生产环境配置 |
||||
ENV = 'production' |
||||
|
||||
# 莳松管理系统/生产环境 |
||||
VUE_APP_BASE_API = '/duima' |
||||
# 开心学车管理系统/生产环境 |
||||
VUE_APP_BASE_API = '/zhaosheng' |
||||
|
@ -1,10 +1,10 @@ |
||||
# 页面标题 |
||||
VUE_APP_TITLE = 莳松管理系统 |
||||
VUE_APP_TITLE = 开心学车管理系统 |
||||
|
||||
NODE_ENV = production |
||||
|
||||
# 测试环境配置 |
||||
ENV = 'staging' |
||||
|
||||
# 莳松管理系统/测试环境 |
||||
# 开心学车管理系统/测试环境 |
||||
VUE_APP_BASE_API = '/stage-api' |
||||
|
Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 137 KiB |
Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 137 KiB |
@ -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 |
||||
}); |
||||
} |
@ -0,0 +1,44 @@ |
||||
import request from '@/utils/request' |
||||
|
||||
// 查询抖音门店列表
|
||||
export function listShop(query) { |
||||
return request({ |
||||
url: '/system/shop/list', |
||||
method: 'get', |
||||
params: query |
||||
}) |
||||
} |
||||
|
||||
// 查询抖音门店详细
|
||||
export function getShop(shopId) { |
||||
return request({ |
||||
url: '/system/shop/' + shopId, |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
// 新增抖音门店
|
||||
export function addShop(data) { |
||||
return request({ |
||||
url: '/system/shop', |
||||
method: 'post', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 修改抖音门店
|
||||
export function updateShop(data) { |
||||
return request({ |
||||
url: '/system/shop', |
||||
method: 'put', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 删除抖音门店
|
||||
export function delShop(shopId) { |
||||
return request({ |
||||
url: '/system/shop/' + shopId, |
||||
method: 'delete' |
||||
}) |
||||
} |
@ -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' |
||||
}) |
||||
} |
@ -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' |
||||
}); |
||||
} |
@ -0,0 +1,93 @@ |
||||
/* |
||||
* @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' |
||||
}); |
||||
} |
||||
|
||||
//查询接待人统计
|
||||
export function getCount(param){ |
||||
return request({ |
||||
url: '/zs/feedback/detail/count', |
||||
method: 'get', |
||||
params: param |
||||
}) |
||||
} |
||||
|
||||
|
||||
//查询接待人接待详情
|
||||
export function getCountDetail(param){ |
||||
return request({ |
||||
url: '/zs/feedback/detail/count/detail', |
||||
method: 'get', |
||||
params: param |
||||
}) |
||||
} |
@ -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' |
||||
}); |
||||
} |
@ -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' |
||||
}) |
||||
} |
Before Width: | Height: | Size: 105 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 137 KiB After Width: | Height: | Size: 137 KiB |
@ -0,0 +1,138 @@ |
||||
|
||||
<template> |
||||
<el-dialog title="接待人信息" :close-on-click-modal="false" append-to-body :visible.sync="visible" width="600px" @close="closeDialog"> |
||||
<div> |
||||
<el-form ref="dialogForm" :model="dialogForm" :rules="dataRule" label-position="top" @keyup.enter.native="dialogFormSubmit()"> |
||||
<!-- <el-form-item label="所属驾校" prop="schoolId"> |
||||
<el-select v-model="dialogForm.schoolId" filterable placeholder="请选择" value-key="schoolId" clearable size="small" style="width:100%"> |
||||
<el-option v-for="(dict, index) in schoolOptions" :key="index" :label="dict.schoolName" :value="dict.schoolId" /> |
||||
</el-select> |
||||
</el-form-item> --> |
||||
|
||||
<el-form-item label="接待人" prop="coachName"> |
||||
<el-input v-model="dialogForm.coachName" placeholder="请输入教练名" /> |
||||
</el-form-item> |
||||
<el-form-item label="联系方式" prop="phone"> |
||||
<el-input v-model="dialogForm.phone" placeholder="请输入联系方式" /> |
||||
</el-form-item> |
||||
<el-form-item label="微信openid" prop="openId"> |
||||
<el-input v-model="dialogForm.openId" placeholder="请输入微信openid" /> |
||||
</el-form-item> |
||||
<el-form-item label="负责场地" prop="placeIdList"> |
||||
<el-select v-model="dialogForm.placeIdList" multiple filterable placeholder="请选择" clearable size="small" style="width:100%"> |
||||
<el-option v-for="(dict, index) in placeOptions" :key="index" :label="dict.name" :value="dict.placeId" /> |
||||
</el-select> |
||||
</el-form-item> |
||||
</el-form> |
||||
|
||||
</div> |
||||
<span slot="footer" class="dialog-footer"> |
||||
<el-button plain @click="(visible=false)">取消</el-button> |
||||
<el-button v-jclick type="primary" :disabled="!canSubmit" @click="dialogFormSubmit()">确定</el-button> |
||||
</span> |
||||
</el-dialog> |
||||
</template> |
||||
|
||||
<script> |
||||
import { addCoach, updateCoach } from '@/api/sch/coach'; |
||||
|
||||
export default { |
||||
props: { |
||||
schoolOptions: { |
||||
type: Array, |
||||
default: [] |
||||
}, |
||||
placeOptions: { |
||||
type: Array, |
||||
default: [] |
||||
} |
||||
}, |
||||
data () { |
||||
return { |
||||
visible: false, |
||||
canSubmit: true, |
||||
dialogForm: { |
||||
coachId: null, |
||||
deptId: null, |
||||
// schoolId: null, |
||||
placeIdList: null, |
||||
placeNames: null, |
||||
coachName: null, |
||||
phone: null, |
||||
openId: null |
||||
}, |
||||
dataRule: { |
||||
// schoolId: [{ required: true, message: '所属驾校不能为空', trigger: 'blur' }], |
||||
placeIdList: [{ required: true, message: '负责场地不能为空', trigger: 'blur' }], |
||||
coachName: [{ required: true, message: '教练名不能为空', trigger: 'blur' }], |
||||
phone: [{ required: true, message: '联系方式不能为空', trigger: 'blur' }], |
||||
openId: [{ required: true, message: '微信openId不能为空', trigger: 'blur' }] |
||||
} |
||||
}; |
||||
}, |
||||
methods: { |
||||
init (info = undefined) { |
||||
// debugger |
||||
this.visible = true; |
||||
this.$nextTick(() => { |
||||
this.resetDialogForm(); |
||||
this.$refs['dialogForm'].resetFields(); |
||||
if (info) { |
||||
this.dialogForm = this.deepClone(info); |
||||
} |
||||
}); |
||||
}, |
||||
resetDialogForm () { |
||||
this.dialogForm = { |
||||
coachId: null, |
||||
deptId: null, |
||||
schoolId: null, |
||||
placeIdList: null, |
||||
coachName: null, |
||||
phone: null, |
||||
openId: null |
||||
}; |
||||
}, |
||||
closeDialog () { |
||||
this.$emit('update:dialogVisible', false); |
||||
}, |
||||
// 表单提交 |
||||
dialogFormSubmit () { |
||||
this.$refs.dialogForm.validate((valid) => { |
||||
if (valid) { |
||||
this.canSubmit = false; |
||||
|
||||
if (this.dialogForm.coachId) { |
||||
// 校验完成,调接口 |
||||
updateCoach(this.dialogForm) |
||||
.then((resp) => { |
||||
this.canSubmit = true; |
||||
if (resp.code == 200) { |
||||
this.$message.success('保存成功'); |
||||
this.$emit('refreshDataList'); |
||||
this.visible = false; |
||||
} |
||||
}) |
||||
.catch(() => { |
||||
this.canSubmit = true; |
||||
}); |
||||
} else { |
||||
addCoach(this.dialogForm) |
||||
.then((resp) => { |
||||
this.canSubmit = true; |
||||
if (resp.code == 200) { |
||||
this.$message.success('保存成功'); |
||||
this.$emit('refreshDataList'); |
||||
this.visible = false; |
||||
} |
||||
}) |
||||
.catch(() => { |
||||
this.canSubmit = true; |
||||
}); |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
} |
||||
}; |
||||
</script> |
@ -0,0 +1,85 @@ |
||||
<!-- 接待人员详情页 --> |
||||
<template> |
||||
<div class="app-container"> |
||||
<el-form ref="queryForm" :model="queryParams" size="small" :inline="true" label-width="68px" label-position="top"> |
||||
<el-form-item label="时间" prop="type"> |
||||
<el-radio-group v-model="queryParams.type"> |
||||
<el-radio label="1">今日接待</el-radio> |
||||
<el-radio label="2">本月接待</el-radio> |
||||
</el-radio-group> |
||||
</el-form-item> |
||||
<el-form-item label="到场状态" prop="arrivalStatusList"> |
||||
<el-checkbox-group v-model="queryParams.arrivalStatusList"> |
||||
<el-checkbox :label="1">未到场</el-checkbox> |
||||
<el-checkbox :label="2">到场未成交</el-checkbox> |
||||
<el-checkbox :label="3">到场已成交</el-checkbox> |
||||
</el-checkbox-group> |
||||
</el-form-item> |
||||
<el-form-item> |
||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="getList">搜索</el-button> |
||||
<el-button type="primary" icon="el-icon-back" size="mini" @click="back">返回</el-button> |
||||
|
||||
</el-form-item> |
||||
</el-form> |
||||
|
||||
<el-table v-loading="loading" :data="coachList"> |
||||
<el-table-column type="index" width="50" align="center" /> |
||||
<el-table-column label="学员姓名" align="center" prop="name" /> |
||||
<el-table-column label="联系方式" align="center" prop="phone" /> |
||||
<el-table-column label="到场状态" align="center" prop="arrivalStatus" > |
||||
<template scope="scope"> |
||||
<el-tag v-if="scope.row.arrivalStatus == 1">未到场</el-tag> |
||||
<el-tag v-if="scope.row.arrivalStatus == 2">到场未成交</el-tag> |
||||
<el-tag v-if="scope.row.arrivalStatus == 3">到场已成交</el-tag> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column label="备注" align="center" prop="remark" /> |
||||
</el-table> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import { getCountDetail} from '@/api/zs/feedbackDetail'; |
||||
export default { |
||||
data() { |
||||
return { |
||||
// 遮罩层 |
||||
loading: false, |
||||
|
||||
// 总条数 |
||||
total: 0, |
||||
// 教练表格数据 |
||||
coachList: [], |
||||
// 查询参数 |
||||
queryParams: { |
||||
type: null, // 1本日统计 2本月统计 |
||||
coachId: null, |
||||
arrivalStatusList: undefined |
||||
} |
||||
}; |
||||
}, |
||||
created() { |
||||
this.queryParams.type = this.$route.query.type; |
||||
this.queryParams.coachId = this.$route.query.coachId |
||||
if(this.queryParams.arrivalStatusList == undefined){ |
||||
this.queryParams.arrivalStatusList = [1,2] |
||||
} |
||||
this.getList() |
||||
}, |
||||
methods: { |
||||
/** 查询教练列表 */ |
||||
getList() { |
||||
this.loading = true; |
||||
getCountDetail(this.queryParams).then(resp=> { |
||||
if(resp.code == 200 && resp.data){ |
||||
this.coachList = resp.data |
||||
this.loading = false |
||||
} |
||||
}) |
||||
}, |
||||
back(){ |
||||
window.history.back() |
||||
} |
||||
} |
||||
}; |
||||
</script> |
@ -0,0 +1,91 @@ |
||||
<template> |
||||
<!-- 接待人统计页面 --> |
||||
<div class="app-container" style="max-width: 600px; margin: auto;"> |
||||
<el-form ref="queryForm" :model="queryParams" size="small" :inline="true" label-width="68px" style="text-align: center;"> |
||||
<el-form-item label="手机号" prop="phone"> |
||||
<el-input v-model="queryParams.phone" placeholder="请输入手机号" clearable @keyup.enter.native="handleQuery" /> |
||||
</el-form-item> |
||||
<!-- <el-form-item label="验证码" prop="code"> |
||||
<el-input v-model="queryParams.code" placeholder="请输入验证码" clearable @keyup.enter.native="handleQuery" /> |
||||
</el-form-item> --> |
||||
<el-form-item> |
||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="getCount">查询</el-button> |
||||
</el-form-item> |
||||
</el-form> |
||||
|
||||
<el-card class="box-card" v-if="show"> |
||||
<div slot="header" class="clearfix" style="text-align: center;"> |
||||
<span>接待统计</span> |
||||
</div> |
||||
<div> |
||||
<div><span>今日接到人数:{{countInfo.todayTotal == undefined ? 0 : countInfo.todayTotal}}</span></div> |
||||
<div><span>今日成交人数:{{countInfo.todaySuccess == undefined ? 0 : countInfo.todaySuccess}}</span></div> |
||||
<div><span>今日未成交人数:{{countInfo.todayUnSuccess == undefined ? 0 : countInfo.todayUnSuccess}}</span> |
||||
<router-link :to="'/coach/count/detail?coachId=' + coachId +'&type=1'" style="color: blue;"> 详情</router-link> |
||||
</div> |
||||
</div> |
||||
<el-divider></el-divider> |
||||
<div> |
||||
<div><span>本月接到人数:{{countInfo.monthTotal}}</span></div> |
||||
<div><span>本月成交人数:{{countInfo.monthSuccess}}</span></div> |
||||
<div><span>本月未成交人数:{{countInfo.monthUnSuccess}}</span> |
||||
<router-link :to="'/coach/count/detail?coachId=' + coachId+'&type=2'" style="color: blue;"> 详情</router-link> |
||||
</div> |
||||
</div> |
||||
</el-card> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import { getCount} from '@/api/zs/feedbackDetail'; |
||||
|
||||
export default { |
||||
name: 'Count', |
||||
data() { |
||||
return { |
||||
// 遮罩层 |
||||
loading: true, |
||||
// 查询参数 |
||||
queryParams: { |
||||
phone: null, |
||||
code: null |
||||
}, |
||||
countInfo: { |
||||
todayTotal: 0, |
||||
todaySuccess: 0, |
||||
todayUnSuccess:0, |
||||
monthTotal: 0, |
||||
monthSuccess: 0, |
||||
monthUnSuccess:0 |
||||
}, |
||||
coachId: undefined, |
||||
show:false |
||||
}; |
||||
}, |
||||
|
||||
methods: { |
||||
/** 查询统计结果 */ |
||||
getCount() { |
||||
this.resetCount(); |
||||
this.loading = true; |
||||
getCount(this.queryParams).then(resp => { |
||||
if(resp.code == 200 && resp.data ){ |
||||
this.countInfo = resp.data; |
||||
this.coachId = resp.data.coachId; |
||||
this.show = true; |
||||
} |
||||
}) |
||||
}, |
||||
resetCount(){ |
||||
this.countInfo= { |
||||
todayTotal: 0, |
||||
todaySuccess: 0, |
||||
todayUnSuccess:0, |
||||
monthTotal: 0, |
||||
monthSuccess: 0, |
||||
monthUnSuccess:0 |
||||
} |
||||
} |
||||
} |
||||
}; |
||||
</script> |
@ -0,0 +1,153 @@ |
||||
<template> |
||||
<div class="app-container"> |
||||
<el-form v-show="showSearch" ref="queryForm" :model="queryParams" size="small" :inline="true" label-width="68px"> |
||||
<el-form-item label="所属场地" prop="placeId"> |
||||
<el-select v-model="queryParams.placeId" filterable placeholder="请选择" clearable value-key="placeId" size="small"> |
||||
<el-option v-for="(dict, index) in placeOptions" :key="index" :label="dict.name" :value="dict.placeId" /> |
||||
</el-select> |
||||
</el-form-item> |
||||
<el-form-item label="接待人" prop="coachName"> |
||||
<el-input v-model="queryParams.coachName" placeholder="请输入" clearable @keyup.enter.native="handleQuery" /> |
||||
</el-form-item> |
||||
<el-form-item label="联系方式" prop="phone"> |
||||
<el-input v-model="queryParams.phone" placeholder="请输入联系方式" clearable @keyup.enter.native="handleQuery" /> |
||||
</el-form-item> |
||||
<el-form-item> |
||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> |
||||
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button> |
||||
</el-form-item> |
||||
</el-form> |
||||
|
||||
<el-row :gutter="10" class="mb8"> |
||||
<el-col :span="1.5"> |
||||
<el-button v-hasPermi="['sch:coach:add']" type="primary" plain icon="el-icon-plus" size="mini" @click="handleAddAndUpdate(undefined)">新增</el-button> |
||||
</el-col> |
||||
<right-toolbar :show-search.sync="showSearch" @queryTable="getList" /> |
||||
</el-row> |
||||
|
||||
<el-table v-loading="loading" :data="coachList"> |
||||
<el-table-column type="index" width="55" align="center" /> |
||||
<el-table-column label="接待人" align="center" prop="coachName" /> |
||||
<el-table-column label="联系方式" align="center" prop="phone" /> |
||||
<el-table-column label="负责场地" align="center" prop="placeNames" /> |
||||
<el-table-column label="微信openid" align="center" prop="openId" /> |
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> |
||||
<template slot-scope="scope"> |
||||
<el-button v-hasPermi="['sch:coach:edit']" size="mini" type="text" icon="el-icon-edit" @click="handleAddAndUpdate(scope.row)">修改</el-button> |
||||
<el-button v-hasPermi="['sch:coach:remove']" size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)">删除</el-button> |
||||
</template> |
||||
</el-table-column> |
||||
</el-table> |
||||
|
||||
<pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" /> |
||||
|
||||
<!-- 添加或修改教练对话框 --> |
||||
<coach-form v-if="dialogVisible" ref="dialogForm" :dialog-visible="dialogVisible" :school-options="schoolOptions" :place-options="placeOptions" @refreshDataList="getList" /> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import { listCoach, getCoach, delCoach } from '@/api/sch/coach'; |
||||
import CoachForm from './components/CoachForm.vue'; |
||||
import schoolAPi from '@/api/sch/school'; |
||||
import { getAllPlaces } from '@/api/sch/place'; |
||||
|
||||
export default { |
||||
name: 'Coach', |
||||
components: { CoachForm }, |
||||
data () { |
||||
return { |
||||
// 遮罩层 |
||||
loading: true, |
||||
// 选中数组 |
||||
ids: [], |
||||
// 非单个禁用 |
||||
single: true, |
||||
// 非多个禁用 |
||||
multiple: true, |
||||
// 显示搜索条件 |
||||
showSearch: true, |
||||
// 总条数 |
||||
total: 0, |
||||
// 教练表格数据 |
||||
coachList: [], |
||||
// 查询参数 |
||||
queryParams: { |
||||
pageNum: 1, |
||||
pageSize: 10, |
||||
schoolId: null, |
||||
placeId: null, |
||||
coachName: null, |
||||
phone: null |
||||
}, |
||||
dialogVisible: false, |
||||
schoolOptions: [], |
||||
placeOptions: [] |
||||
}; |
||||
}, |
||||
created () { |
||||
this.getSchools(); |
||||
this.getPlaces(); |
||||
this.getList(); |
||||
}, |
||||
methods: { |
||||
/** 查询教练列表 */ |
||||
getList () { |
||||
this.loading = true; |
||||
listCoach(this.queryParams).then(response => { |
||||
this.coachList = response.rows; |
||||
this.total = response.total; |
||||
this.loading = false; |
||||
}); |
||||
}, |
||||
// 取消按钮 |
||||
cancel () { |
||||
this.open = false; |
||||
this.reset(); |
||||
}, |
||||
/** 搜索按钮操作 */ |
||||
handleQuery () { |
||||
this.queryParams.pageNum = 1; |
||||
this.getList(); |
||||
}, |
||||
/** 重置按钮操作 */ |
||||
resetQuery () { |
||||
this.resetForm('queryForm'); |
||||
this.handleQuery(); |
||||
}, |
||||
/** 新增或修改按钮操作 */ |
||||
handleAddAndUpdate (item) { |
||||
this.dialogVisible = true; |
||||
this.$nextTick(() => { |
||||
this.$refs.dialogForm.init(item); |
||||
}); |
||||
}, |
||||
/** 删除按钮操作 */ |
||||
handleDelete (row) { |
||||
const coachIds = row.coachId || this.ids; |
||||
this.$modal.confirm('是否确认删除教练编号为"' + coachIds + '"的数据项?').then(function () { |
||||
return delCoach(coachIds); |
||||
}).then(() => { |
||||
this.getList(); |
||||
this.$modal.msgSuccess('删除成功'); |
||||
}).catch(() => { }); |
||||
}, |
||||
/** 导出按钮操作 */ |
||||
handleExport () { |
||||
this.download('system/coach/export', { |
||||
...this.queryParams |
||||
}, `coach_${new Date().getTime()}.xlsx`); |
||||
}, |
||||
getSchools () { |
||||
schoolAPi.allList().then((resp) => { |
||||
this.schoolOptions = resp.data; |
||||
}); |
||||
}, |
||||
getPlaces () { |
||||
getAllPlaces({ status: '0', showInMap: true }).then((resp) => { |
||||
this.placeOptions = resp.data; |
||||
}); |
||||
} |
||||
} |
||||
}; |
||||
</script> |
@ -0,0 +1,747 @@ |
||||
|
||||
<template> |
||||
<div class="amap-page-container"> |
||||
<div id="map" class="amap-cavans" /> |
||||
<el-input id="search" v-model="searchBody" class="search-body" placeholder="请输入..." @keyup.enter.native="submitSearch"> |
||||
<el-button slot="append" icon="el-icon-search" @click="submitSearch" /> |
||||
</el-input> |
||||
<div class="asider" :class="showSchool ? '' : 'hidden-school'"> |
||||
<el-card class="box-card" :body-style="{ flex: 1, 'overflow-y': 'scroll', padding: 0 }"> |
||||
<div slot="header" class="clearfix"> |
||||
<div class="map-card-title">驾校列表</div> |
||||
</div> |
||||
<div v-for="school in schoolList" :key="school.schoolId" style="margin:10px;" :class="currentdeptId == school.schoolId ? 'actived-school' : ''"> |
||||
<el-card :body-style="{ padding: '10px' }"> |
||||
<div slot="header" class="clearfix"> |
||||
<div class="map-card-title">{{ school.schoolName }}</div> |
||||
<el-switch v-model="school.showInMap" v-hasPermi="['sch:place:edit']" class="add-icon" active-text="展示" inactive-text="隐藏" @change="changeSchoolStatus(school)" /> |
||||
</div> |
||||
<el-button @click="handleClickSchool(school)">{{ `数据管理(${getCount(school.schoolId)})` }}</el-button> |
||||
<el-tooltip v-hasPermi="['sch:place:add']" content="新增场地" placement="left" effect="dark"> |
||||
<el-button icon="el-icon-plus" class="add-place-btn" @click="handleInsertPlace(school.schoolId)" /> |
||||
</el-tooltip> |
||||
</el-card> |
||||
</div> |
||||
</el-card> |
||||
<div class="asider-sub"> |
||||
<el-tooltip content="放大" placement="left" effect="dark"> |
||||
<el-button icon="el-icon-plus" class="is-circle" :disabled="zomm >= 18" @click="bigger" /> |
||||
</el-tooltip> |
||||
<el-tooltip content="缩小" placement="left" effect="dark"> |
||||
<el-button icon="el-icon-minus" class="is-circle" :disabled="zomm <= 8" @click="smaller" /> |
||||
</el-tooltip> |
||||
<div class="mt10"> |
||||
<el-tooltip content="驾校" placement="left" effect="dark"> |
||||
<el-button icon="el-icon-school" class="is-circle" @click="toggleSchool" /> |
||||
</el-tooltip> |
||||
<el-tooltip content="定位" placement="left" effect="dark"> |
||||
<el-button icon="el-icon-help" class="is-circle" @click="geolocation" /> |
||||
</el-tooltip> |
||||
<el-tooltip content="测距" placement="left" effect="dark"> |
||||
<el-button icon="el-icon-thumb" class="is-circle" @click="ranging" /> |
||||
</el-tooltip> |
||||
<el-tooltip content="分享" placement="left" effect="dark"> |
||||
<el-button icon="el-icon-share" class="is-circle" /> |
||||
</el-tooltip> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<el-card v-if="placeDialogShow" class="place-dialog" :body-style="{ padding: '10px' }"> |
||||
<div slot="header" class="clearfix"> |
||||
<div class="map-card-title">场地设置</div> |
||||
<el-tooltip content="取点" placement="right" effect="dark"> |
||||
<el-button icon="el-icon-location" class="add-icon" @click="getPoint" /> |
||||
</el-tooltip> |
||||
</div> |
||||
<el-form ref="placeForm" :model="placeForm" label-width="70px"> |
||||
<el-form-item label="所属驾校" prop="schoolId"> |
||||
<el-select v-model="placeForm.schoolId" placeholder="请选择" clearable> |
||||
<el-option v-for="dict in schoolList" :key="dict.schoolId" :label="dict.schoolName" :value="dict.schoolId" /> |
||||
</el-select> |
||||
</el-form-item> |
||||
<el-form-item label="名称" prop="name"> |
||||
<el-input v-model="placeForm.name" placeholder="输入名称" /> |
||||
</el-form-item> |
||||
<el-form-item label="旗子颜色" prop="flagColor"> |
||||
<el-radio-group v-model="placeForm.flagColor"> |
||||
<el-radio v-for="(item, index) in colorOptions" :key="index" :label="item"> |
||||
<img :src="require(`@/assets/images/place/flag_${item}.png`)" width="20px"> |
||||
</el-radio> |
||||
</el-radio-group> |
||||
</el-form-item> |
||||
<el-form-item label="地址" prop="address"> |
||||
<el-input v-model="placeForm.address" placeholder="输入地址" /> |
||||
</el-form-item> |
||||
<el-form-item label="经度" prop="lng"> |
||||
<el-input v-model="placeForm.lng" placeholder="输入经度" /> |
||||
</el-form-item> |
||||
<el-form-item label="纬度" prop="lat"> |
||||
<el-input v-model="placeForm.lat" placeholder="输入纬度" /> |
||||
</el-form-item> |
||||
<el-form-item label="所属区域" prop="area"> |
||||
<el-select v-model="placeForm.area" placeholder="请选择" clearable size="small"> |
||||
<el-option v-for="dict in areaOptions" :key="dict.dictValue" :label="dict.dictLabel" :value="dict.dictValue" /> |
||||
</el-select> |
||||
</el-form-item> |
||||
<el-form-item label="电话" prop="phone"> |
||||
<el-input v-model="placeForm.phone" placeholder="输入电话" /> |
||||
</el-form-item> |
||||
<el-form-item label="负责人" prop="contact"> |
||||
<el-input v-model="placeForm.contact" placeholder="输入负责人" /> |
||||
</el-form-item> |
||||
<el-form-item label="是否推荐" prop="contact"> |
||||
<el-radio v-model="placeForm.recommend" :label="true">是</el-radio> |
||||
<el-radio v-model="placeForm.recommend" :label="false">否</el-radio> |
||||
</el-form-item> |
||||
<el-form-item label="备注" prop="remark"> |
||||
<el-input v-model="placeForm.remark" placeholder="输入备注" type="textarea" :autosize="{ minRows: 2, maxRows: 4 }" /> |
||||
</el-form-item> |
||||
<el-form-item style="text-align:right;"> |
||||
<el-button v-hasPermi="['sch:place:edit']" type="primary" @click="onSubmit">保存</el-button> |
||||
<el-button @click="closePlaceDialog">取消</el-button> |
||||
</el-form-item> |
||||
</el-form> |
||||
</el-card> |
||||
<el-card :class="placeListDialogShow ? '' : 'hidden-place-list'" class="place-list-dialog" :style="{ right: showSchool ? '300px' : '0', top: fullScreenPlaceList ? '0px' : '420px' }" :body-style="{ padding: '10px', height: 'calc(100% - 52px)' }"> |
||||
<div slot="header" class="clearfix"> |
||||
<div class="map-card-title"> |
||||
{{ placeListDialogTitle }} |
||||
<el-input v-model="tableSearch" placeholder="请输入搜索的内容" clearable /> |
||||
</div> |
||||
<el-tooltip content="全屏" placement="top" effect="dark"> |
||||
<el-button icon="el-icon-full-screen" class="add-icon" @click="fullScreenPlaceList = !fullScreenPlaceList" /> |
||||
</el-tooltip> |
||||
<el-tooltip content="关闭" placement="top" effect="dark"> |
||||
<el-button icon="el-icon-close" class="add-icon" @click="() => { placeListDialogShow = false; fullScreenPlaceList = false }" /> |
||||
</el-tooltip> |
||||
</div> |
||||
<el-table :data="placeTableData" border stripe class="place-table-list" height="100%"> |
||||
<el-table-column label="序号" type="index" fixed="left" width="50" /> |
||||
<el-table-column prop="name" label="名称" min-width="100" /> |
||||
<el-table-column prop="phone" label="电话" width="120" /> |
||||
<el-table-column prop="contact" label="负责人" width="120" /> |
||||
<el-table-column prop="address" label="地址" min-width="100" /> |
||||
<el-table-column prop="lng" label="经度" width="110" /> |
||||
<el-table-column prop="lat" label="纬度" width="110" /> |
||||
<el-table-column prop="area" label="所属区域" width="110" /> |
||||
<el-table-column label="展示" width="100"> |
||||
<template slot-scope="scope"> |
||||
<el-switch v-model="scope.row.showInMap" v-hasPermi="['sch:place:edit']" @change="changePlaceStatus(scope.row)" /> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column label="操作" width="100"> |
||||
<template slot-scope="scope"> |
||||
<el-tooltip v-hasPermi="['sch:place:edit']" content="编辑" placement="top" effect="dark"> |
||||
<el-button icon="el-icon-edit" type="primary" style="padding: 4px 8px;" @click="handleEditPlace(scope.row)" /> |
||||
</el-tooltip> |
||||
</template> |
||||
</el-table-column> |
||||
</el-table> |
||||
</el-card> |
||||
|
||||
<div v-if="isPointing || isRanging" class="map-tip" :style="{ transform: 'translate3D(' + (tipPostion.x + 15) + 'px,' + (tipPostion.y - 10) + 'px, 0)' }">{{ mapHelpText }}</div> |
||||
<i v-if="isPointing" class="el-icon-s-flag circle" :style="{ transform: 'translate3D(' + tipPostion.x + 'px,' + tipPostion.y + 'px, 0)' }" /> |
||||
</div> |
||||
</template> |
||||
<!-- eslint-disable no-undef --> |
||||
<script> |
||||
import AMap from 'AMap'; |
||||
import { getMapData, addPlace, updatePlace, updateSchoolStatus } from '@/api/sch/place'; |
||||
export default { |
||||
name: 'Place', |
||||
data() { |
||||
return { |
||||
aMap: null, |
||||
zomm: 12, |
||||
showSchool: true, |
||||
isRanging: false, |
||||
aMapLocation: null, |
||||
aMouseTool: null, |
||||
searchBody: '', |
||||
placeSearch: null, |
||||
placeDialogShow: false, |
||||
isPointing: false, |
||||
placeForm: { |
||||
lat: undefined, |
||||
lng: undefined, |
||||
name: undefined, |
||||
address: undefined, |
||||
remark: undefined, |
||||
phone: undefined, |
||||
flagColor: 'red' |
||||
}, |
||||
colorOptions: ['red', 'yellow', 'blue', 'green', 'purple', 'black'], |
||||
mapHelpText: '', |
||||
tipPostion: { |
||||
x: 0, |
||||
y: 0 |
||||
}, |
||||
geocoder: null, |
||||
locationMarker: null, |
||||
selectMarker: null, |
||||
placeListDialogShow: false, |
||||
placeListDialogTitle: '', |
||||
fullScreenPlaceList: false, |
||||
tableSearch: '', |
||||
tableData: [], |
||||
schoolList: [], |
||||
currentdeptId: undefined, |
||||
placeMarkerList: [], |
||||
areaOptions: [] |
||||
}; |
||||
}, |
||||
computed: { |
||||
placeTableData: function () { |
||||
if (this.tableSearch) { |
||||
return this.tableData.filter((dataNews) => { |
||||
return ( |
||||
dataNews.schoolId === this.currentdeptId && |
||||
Object.keys(dataNews).some((key) => { |
||||
return String(dataNews[key]).toLowerCase().indexOf(this.tableSearch) > -1; |
||||
}) |
||||
); |
||||
}); |
||||
} |
||||
return this.tableData.filter((dataNews) => dataNews.schoolId === this.currentdeptId); |
||||
} |
||||
}, |
||||
mounted() { |
||||
this.initMap(); |
||||
this.getDicts('dm_area').then((response) => { |
||||
this.areaOptions = response.data; |
||||
}); |
||||
}, |
||||
methods: { |
||||
initMap() { |
||||
window.onLoad = () => { |
||||
this.aMap = new AMap.Map('map', { |
||||
zoom: this.zomm, |
||||
center: [117.226095, 31.814372], |
||||
zooms: [8, 18] |
||||
}); |
||||
// 监听缩放 |
||||
this.aMap.on('zoomend', () => { |
||||
this.zomm = this.aMap.getZoom(); |
||||
this.$message('当前缩放等级:' + this.zomm); |
||||
}); |
||||
// 监听点击 |
||||
this.aMap.on('click', (ev) => { |
||||
if (this.isPointing) { |
||||
this.placeForm.lat = ev.lnglat.lat; |
||||
this.placeForm.lng = ev.lnglat.lng; |
||||
this.regeoCode(); |
||||
if (this.selectMarker) { |
||||
this.selectMarker.setPosition([this.placeForm.lng, this.placeForm.lat]); |
||||
} else { |
||||
this.locationMarker.setPosition([this.placeForm.lng, this.placeForm.lat]); |
||||
this.aMap.add(this.locationMarker); |
||||
} |
||||
this.isPointing = false; |
||||
} |
||||
}); |
||||
// 监听移动 |
||||
this.aMap.on('mousemove', (ev) => { |
||||
if (this.isRanging) { |
||||
this.mapHelpText = '左键单击选点,双击/右键单击完成选点,再次点击测距按钮可退出测距模式,并清除测距结果'; |
||||
this.tipPostion = { |
||||
x: ev.pixel.x, |
||||
y: ev.pixel.y |
||||
}; |
||||
} else if (this.isPointing) { |
||||
this.mapHelpText = '点击地图添加标注'; |
||||
this.tipPostion = { |
||||
x: ev.pixel.x, |
||||
y: ev.pixel.y |
||||
}; |
||||
} |
||||
}); |
||||
// 添加地图插件 |
||||
AMap.plugin(['AMap.Scale', 'AMap.Geolocation', 'AMap.MouseTool', 'AMap.PlaceSearch', 'AMap.Autocomplete', 'AMap.Geocoder'], () => { |
||||
this.aMap.addControl(new AMap.Scale()); |
||||
const geoLoca = new AMap.Geolocation({ |
||||
showButton: false |
||||
}); |
||||
this.aMapLocation = geoLoca; |
||||
this.aMap.addControl(geoLoca); |
||||
this.aMouseTool = new AMap.MouseTool(this.aMap); |
||||
const auto = new AMap.Autocomplete({ |
||||
input: 'search' // 前端搜索框 |
||||
}); |
||||
this.placeSearch = new AMap.PlaceSearch({ |
||||
map: this.aMap |
||||
}); |
||||
AMap.event.addListener(auto, 'select', this.select); |
||||
this.geocoder = new AMap.Geocoder(); |
||||
this.locationMarker = new AMap.Marker({ |
||||
icon: require(`@/assets/images/place/flag_red.png`) |
||||
}); |
||||
}); |
||||
this.getPageData(); |
||||
}; |
||||
// this.importMap(); |
||||
}, |
||||
// 导入地图 |
||||
// importMap() { |
||||
// const url = 'https://webapi.amap.com/maps?v=1.4.15&key=0e62be0896c6b8d27d453445f0fb8bc4&callback=onLoad'; |
||||
// var jsapi = document.createElement('script'); |
||||
// jsapi.charset = 'utf-8'; |
||||
// jsapi.src = url; |
||||
// document.head.appendChild(jsapi); |
||||
// }, |
||||
toggleSchool() { |
||||
this.showSchool = !this.showSchool; |
||||
}, |
||||
// 经纬度 -> 地址 |
||||
regeoCode() { |
||||
this.geocoder.getAddress([this.placeForm.lng, this.placeForm.lat], (status, result) => { |
||||
if (status === 'complete' && result.regeocode) { |
||||
this.placeForm.address = result.regeocode.formattedAddress; |
||||
} else { |
||||
console.log('根据经纬度查询地址失败'); |
||||
} |
||||
}); |
||||
}, |
||||
// 定位 |
||||
geolocation() { |
||||
this.aMapLocation.getCurrentPosition(); |
||||
}, |
||||
// 测距 |
||||
ranging() { |
||||
this.isPointing = false; |
||||
this.isRanging = !this.isRanging; |
||||
if (this.isRanging) { |
||||
this.aMap.setDefaultCursor('crosshair'); |
||||
this.drawLine(); |
||||
} else { |
||||
this.aMap.setDefaultCursor('default'); |
||||
this.aMouseTool.close(true); |
||||
} |
||||
}, |
||||
// 画线 |
||||
drawLine() { |
||||
this.aMouseTool.rule({ |
||||
startMarkerOptions: { |
||||
// 可缺省 |
||||
icon: new AMap.Icon({ |
||||
size: new AMap.Size(19, 31), // 图标大小 |
||||
imageSize: new AMap.Size(19, 31), |
||||
image: 'https://webapi.amap.com/theme/v1.3/markers/b/start.png' |
||||
}) |
||||
}, |
||||
endMarkerOptions: { |
||||
// 可缺省 |
||||
icon: new AMap.Icon({ |
||||
size: new AMap.Size(19, 31), // 图标大小 |
||||
imageSize: new AMap.Size(19, 31), |
||||
image: 'https://webapi.amap.com/theme/v1.3/markers/b/end.png' |
||||
}), |
||||
offset: new AMap.Pixel(-9, -31) |
||||
}, |
||||
midMarkerOptions: { |
||||
// 可缺省 |
||||
icon: new AMap.Icon({ |
||||
size: new AMap.Size(19, 31), // 图标大小 |
||||
imageSize: new AMap.Size(19, 31), |
||||
image: 'https://webapi.amap.com/theme/v1.3/markers/b/mid.png' |
||||
}), |
||||
offset: new AMap.Pixel(-9, -31) |
||||
}, |
||||
lineOptions: { |
||||
// 可缺省 |
||||
strokeStyle: 'solid', |
||||
strokeColor: '#FF33FF', |
||||
strokeOpacity: 1, |
||||
strokeWeight: 2 |
||||
}, |
||||
tmpLineOptions: { |
||||
strokeStyle: 'dashed', |
||||
strokeColor: '#FF33FF', |
||||
strokeOpacity: 1, |
||||
strokeWeight: 2 |
||||
} |
||||
}); |
||||
}, |
||||
// 选择查询结果 |
||||
select(e) { |
||||
this.placeSearch.setCity(e.poi.adcode); |
||||
this.placeSearch.search(e.poi.name); // 关键字查询查询 |
||||
}, |
||||
// 查询按钮/回车事件 |
||||
submitSearch() { |
||||
this.placeSearch.search(this.searchBody); |
||||
}, |
||||
// 缩放 |
||||
bigger() { |
||||
this.zomm++; |
||||
this.aMap.setZoom(this.zomm); |
||||
}, |
||||
smaller() { |
||||
this.zomm--; |
||||
this.aMap.setZoom(this.zomm); |
||||
}, |
||||
|
||||
// 点击数据管理 |
||||
handleClickSchool(item) { |
||||
this.placeListDialogShow = true; |
||||
this.placeListDialogTitle = `数据管理 [${item.schoolName}]`; |
||||
this.currentdeptId = item.schoolId; |
||||
}, |
||||
// 新增场地 |
||||
handleInsertPlace(schoolId) { |
||||
if (this.selectMarker) { |
||||
this.selectMarker.setAnimation('AMAP_ANIMATION_NONE'); |
||||
this.selectMarker = null; |
||||
} |
||||
this.placeDialogShow = true; |
||||
this.aMap.setDefaultCursor('default'); |
||||
this.isRanging = false; |
||||
this.placeForm = { |
||||
lat: undefined, |
||||
lng: undefined, |
||||
name: undefined, |
||||
address: undefined, |
||||
remark: undefined, |
||||
phone: undefined, |
||||
schoolId: schoolId, |
||||
showInMap: true, |
||||
flagColor: 'red' |
||||
}; |
||||
}, |
||||
// 编辑场地 |
||||
handleEditPlace(item) { |
||||
this.placeDialogShow = true; |
||||
this.aMap.setDefaultCursor('default'); |
||||
if (this.selectMarker) { |
||||
this.selectMarker.setAnimation('AMAP_ANIMATION_NONE'); |
||||
} |
||||
this.isRanging = false; |
||||
this.placeForm = Object.assign({}, item); |
||||
this.selectMarker = this.placeMarkerList.filter((marker) => marker.getExtData().placeId === item.placeId)[0]; |
||||
this.selectMarker && this.selectMarker.setAnimation('AMAP_ANIMATION_BOUNCE'); |
||||
this.aMap.setCenter([item.lng, item.lat]); |
||||
}, |
||||
getPoint() { |
||||
this.isPointing = !this.isPointing; |
||||
}, |
||||
// 保存 |
||||
async onSubmit() { |
||||
// 保存接口 |
||||
if (this.checkPlaceFormValidate()) { |
||||
// 先访问接口,返回id插入placeForm |
||||
const resp = this.savePlace(this.placeForm); |
||||
if (resp.code != 200) { |
||||
return; |
||||
} else { |
||||
this.$message.success('操作成功'); |
||||
} |
||||
if (!this.placeForm.placeId && resp.data) { |
||||
this.$set(this.placeForm, 'placeId', resp.data); |
||||
} |
||||
// 移除选点用 的标记 |
||||
this.aMap.remove(this.locationMarker); |
||||
// 根据form创建新marker 并添加到地图上 |
||||
const tmpMarker = new AMap.Marker({ |
||||
map: this.aMap, |
||||
position: [this.placeForm.lng, this.placeForm.lat], |
||||
icon: require(`@/assets/images/place/flag_${this.placeForm.flagColor}.png`), |
||||
label: { |
||||
content: this.placeForm.name, |
||||
direction: 'right' |
||||
}, |
||||
extData: this.placeForm |
||||
}); |
||||
// 新marker事件 |
||||
tmpMarker.on('click', this.handleClickMarker); |
||||
// 如果当前选择的marker点存在(编辑) |
||||
if (this.selectMarker) { |
||||
// 地图上 移除选择的点 |
||||
this.aMap.remove(this.selectMarker); |
||||
this.selectMarker = null; |
||||
} |
||||
// 关闭场地弹窗 |
||||
this.placeDialogShow = false; |
||||
this.isPointing = false; |
||||
|
||||
// 场地列表 移除原列表中操作的场地数据 |
||||
const tmpArr = this.tableData.filter((item) => item.placeId !== this.placeForm.placeId); |
||||
// 新增新的场地 |
||||
tmpArr.push(this.placeForm); |
||||
// 重置场地数组 |
||||
this.tableData = tmpArr; |
||||
// 地图marker列表 移除操作的原marker 添加新marker进数组 |
||||
const tmpArr1 = this.placeMarkerList.filter((item) => item.getExtData().placeId !== this.placeForm.placeId); |
||||
tmpArr1.push(tmpMarker); |
||||
this.placeMarkerList = tmpArr1; |
||||
} |
||||
}, |
||||
async savePlace(item) { |
||||
if (item.placeId) { |
||||
return updatePlace(item); |
||||
} else { |
||||
return addPlace(item); |
||||
} |
||||
}, |
||||
checkPlaceFormValidate() { |
||||
const valid = []; |
||||
if (!this.placeForm.name) { |
||||
valid.push('名称'); |
||||
} |
||||
if (!this.placeForm.address) { |
||||
valid.push('地址'); |
||||
} |
||||
if (!this.placeForm.lng) { |
||||
valid.push('经度'); |
||||
} |
||||
if (!this.placeForm.lat) { |
||||
valid.push('纬度'); |
||||
} |
||||
if (!this.placeForm.phone) { |
||||
valid.push('电话'); |
||||
} |
||||
if (valid.length == 0) { |
||||
return true; |
||||
} else { |
||||
this.$message.error(`请将以下填写完整: ${valid.join(',')}`); |
||||
return false; |
||||
} |
||||
}, |
||||
// 关闭场地弹窗 |
||||
closePlaceDialog() { |
||||
this.placeDialogShow = false; |
||||
this.isPointing = false; |
||||
this.aMap.remove(this.locationMarker); |
||||
if (this.selectMarker) { |
||||
this.selectMarker.setAnimation('AMAP_ANIMATION_NONE'); |
||||
this.selectMarker = null; |
||||
} |
||||
}, |
||||
handleClickMarker(ev) { |
||||
if (this.selectMarker) { |
||||
this.selectMarker.setAnimation('AMAP_ANIMATION_NONE'); |
||||
} |
||||
this.placeForm = ev.target.getExtData(); |
||||
this.placeDialogShow = true; |
||||
ev.target.setAnimation('AMAP_ANIMATION_BOUNCE'); |
||||
this.selectMarker = ev.target; |
||||
}, |
||||
getPageData() { |
||||
getMapData().then((resp) => { |
||||
if (resp.code == 200) { |
||||
this.schoolList = resp.data.schoolList; |
||||
this.tableData = resp.data.placeList; |
||||
this.currentdeptId = this.schoolList[0].schoolId; |
||||
this.createMarkersInMap(); |
||||
} |
||||
}); |
||||
}, |
||||
getCount(schoolId) { |
||||
return this.tableData.filter((item) => item.schoolId === schoolId).length; |
||||
}, |
||||
// 重置markers |
||||
resetMarkers() { |
||||
this.aMap.clearMap(); |
||||
this.createMarkersInMap(); |
||||
}, |
||||
// 生成markers |
||||
createMarkersInMap() { |
||||
for (let i = 0; i < this.tableData.length; i++) { |
||||
const element = this.tableData[i]; |
||||
const tempSchool = this.schoolList.filter((item) => item.schoolId === element.schoolId)[0]; |
||||
if (!element.schoolShow || !element.showInMap) { |
||||
continue; |
||||
} |
||||
const tmpMarker = new AMap.Marker({ |
||||
map: this.aMap, |
||||
position: [element.lng, element.lat], |
||||
icon: require(`@/assets/images/place/flag_${element.flagColor}.png`), |
||||
label: { |
||||
content: element.name, |
||||
direction: 'right' |
||||
}, |
||||
extData: element |
||||
}); |
||||
tmpMarker.on('click', this.handleClickMarker); |
||||
this.placeMarkerList.push(tmpMarker); |
||||
} |
||||
}, |
||||
// 修改驾校状态 |
||||
changeSchoolStatus(item) { |
||||
// 访问接口,成功后重置markers |
||||
updateSchoolStatus(item).then((resp) => { |
||||
if (resp.code == 200) { |
||||
this.$message.success('操作成功'); |
||||
// this.aMap.clearMap() |
||||
// this.getPageData() |
||||
this.resetMarkers(); |
||||
} |
||||
}); |
||||
}, |
||||
// 修改场地状态 |
||||
async changePlaceStatus(item) { |
||||
const resp = await updatePlace(item); |
||||
if (resp.code == 200) { |
||||
this.resetMarkers(); |
||||
} |
||||
} |
||||
} |
||||
}; |
||||
</script> |
||||
|
||||
<style scoped> |
||||
.amap-page-container { |
||||
position: absolute; |
||||
left: 0; |
||||
top: 0; |
||||
width: 100%; |
||||
height: 100%; |
||||
} |
||||
|
||||
.amap-cavans { |
||||
width: 100%; |
||||
height: 100%; |
||||
} |
||||
|
||||
.asider { |
||||
position: absolute; |
||||
right: 0; |
||||
top: 0; |
||||
width: 300px; |
||||
height: 100%; |
||||
transition: 0.3s; |
||||
z-index: 9; |
||||
} |
||||
|
||||
.box-card { |
||||
display: flex; |
||||
flex-direction: column; |
||||
height: 100%; |
||||
} |
||||
|
||||
::v-deep .el-card__header { |
||||
padding: 10px 15px; |
||||
} |
||||
|
||||
.clearfix { |
||||
display: flex; |
||||
} |
||||
|
||||
.clearfix .map-card-title { |
||||
flex: 1; |
||||
line-height: 30px; |
||||
} |
||||
|
||||
.clearfix .add-icon { |
||||
width: auto; |
||||
height: 30px; |
||||
} |
||||
|
||||
.asider-sub { |
||||
position: absolute; |
||||
top: 40px; |
||||
left: -45px; |
||||
padding: 10px 10px 0 0; |
||||
z-index: 900; |
||||
} |
||||
|
||||
.asider-sub .is-circle { |
||||
display: block; |
||||
margin: 0; |
||||
padding: 10px; |
||||
color: #464646; |
||||
border-radius: 0; |
||||
font-size: 16px; |
||||
box-shadow: 2px 2px 2px rgba(80, 80, 80, 0.67); |
||||
} |
||||
|
||||
.mt10 { |
||||
margin-top: 10px; |
||||
} |
||||
|
||||
.hidden-school { |
||||
transform: translateX(300px); |
||||
} |
||||
|
||||
.search-body { |
||||
position: absolute; |
||||
top: 20px; |
||||
left: 20px; |
||||
width: 400px; |
||||
} |
||||
|
||||
.add-place-btn { |
||||
float: right; |
||||
border: none; |
||||
font-size: 16px; |
||||
color: #409eff; |
||||
} |
||||
|
||||
::v-deep .place-dialog { |
||||
position: absolute; |
||||
left: 20px; |
||||
top: 60px; |
||||
width: 350px; |
||||
} |
||||
|
||||
.map-tip { |
||||
position: absolute; |
||||
left: 0; |
||||
top: 0; |
||||
max-width: 150px; |
||||
padding: 5px; |
||||
border-radius: 2px; |
||||
background: #000; |
||||
color: #fff; |
||||
opacity: 0.7; |
||||
font-size: 12px; |
||||
transition-duration: 1ms; |
||||
} |
||||
|
||||
.circle { |
||||
position: absolute; |
||||
left: -8px; |
||||
top: -25px; |
||||
font-size: 24px; |
||||
color: red; |
||||
transition-duration: 1ms; |
||||
} |
||||
|
||||
.place-dialog .el-form .el-form-item { |
||||
margin-bottom: 8px; |
||||
} |
||||
|
||||
.place-list-dialog { |
||||
position: absolute; |
||||
top: 420px; |
||||
left: 0; |
||||
bottom: 0; |
||||
transition: 0.3s; |
||||
z-index: 151; |
||||
background: #e2e5ea; |
||||
} |
||||
|
||||
.place-list-dialog .add-icon { |
||||
font-size: 18px; |
||||
border: none; |
||||
} |
||||
|
||||
.hidden-place-list { |
||||
transform: translateY(100%); |
||||
} |
||||
|
||||
.place-list-dialog .clearfix .map-card-title { |
||||
font-weight: bold; |
||||
} |
||||
|
||||
.place-list-dialog .clearfix .map-card-title .el-input { |
||||
margin-left: 20px; |
||||
width: 240px; |
||||
} |
||||
|
||||
.actived-school { |
||||
border: 2px solid #409eff !important; |
||||
} |
||||
|
||||
::v-deep .el-radio__label { |
||||
vertical-align: middle; |
||||
} |
||||
</style> |
@ -0,0 +1,338 @@ |
||||
<template> |
||||
<div class="app-container"> |
||||
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> |
||||
<el-form-item label="店铺名称" prop="shopName"> |
||||
<el-input |
||||
v-model="queryParams.shopName" |
||||
placeholder="请输入店铺名称" |
||||
clearable |
||||
@keyup.enter.native="handleQuery" |
||||
/> |
||||
</el-form-item> |
||||
<el-form-item label="区域" prop="area"> |
||||
<el-input |
||||
v-model="queryParams.area" |
||||
placeholder="请输入区域" |
||||
clearable |
||||
@keyup.enter.native="handleQuery" |
||||
/> |
||||
</el-form-item> |
||||
<el-form-item label="城市" prop="city"> |
||||
<el-input |
||||
v-model="queryParams.city" |
||||
placeholder="请输入城市" |
||||
clearable |
||||
@keyup.enter.native="handleQuery" |
||||
/> |
||||
</el-form-item> |
||||
<el-form-item label="联系人" prop="contacts"> |
||||
<el-input |
||||
v-model="queryParams.contacts" |
||||
placeholder="请输入联系人" |
||||
clearable |
||||
@keyup.enter.native="handleQuery" |
||||
/> |
||||
</el-form-item> |
||||
<el-form-item label="备注名" prop="remarkName"> |
||||
<el-input |
||||
v-model="queryParams.remarkName" |
||||
placeholder="请输入备注名" |
||||
clearable |
||||
@keyup.enter.native="handleQuery" |
||||
/> |
||||
</el-form-item> |
||||
<el-form-item label="备注id" prop="remarkId"> |
||||
<el-input |
||||
v-model="queryParams.remarkId" |
||||
placeholder="请输入备注id" |
||||
clearable |
||||
@keyup.enter.native="handleQuery" |
||||
/> |
||||
</el-form-item> |
||||
<el-form-item> |
||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> |
||||
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button> |
||||
</el-form-item> |
||||
</el-form> |
||||
|
||||
<el-row :gutter="10" class="mb8"> |
||||
<el-col :span="1.5"> |
||||
<el-button |
||||
type="primary" |
||||
plain |
||||
icon="el-icon-plus" |
||||
size="mini" |
||||
@click="handleAdd" |
||||
v-hasPermi="['system:shop:add']" |
||||
>新增</el-button> |
||||
</el-col> |
||||
<el-col :span="1.5"> |
||||
<el-button |
||||
type="success" |
||||
plain |
||||
icon="el-icon-edit" |
||||
size="mini" |
||||
:disabled="single" |
||||
@click="handleUpdate" |
||||
v-hasPermi="['system:shop:edit']" |
||||
>修改</el-button> |
||||
</el-col> |
||||
<el-col :span="1.5"> |
||||
<el-button |
||||
type="danger" |
||||
plain |
||||
icon="el-icon-delete" |
||||
size="mini" |
||||
:disabled="multiple" |
||||
@click="handleDelete" |
||||
v-hasPermi="['system:shop:remove']" |
||||
>删除</el-button> |
||||
</el-col> |
||||
<el-col :span="1.5"> |
||||
<el-button |
||||
type="warning" |
||||
plain |
||||
icon="el-icon-download" |
||||
size="mini" |
||||
@click="handleExport" |
||||
v-hasPermi="['system:shop:export']" |
||||
>导出</el-button> |
||||
</el-col> |
||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> |
||||
</el-row> |
||||
|
||||
<el-table v-loading="loading" :data="shopList" @selection-change="handleSelectionChange"> |
||||
<el-table-column type="selection" width="55" align="center" /> |
||||
<el-table-column label="门店id 和抖音门店id 一致" align="center" prop="shopId" /> |
||||
<el-table-column label="店铺名称" align="center" prop="shopName" /> |
||||
<el-table-column label="门店品类" align="center" prop="shopType" /> |
||||
<el-table-column label="主营类目" align="center" prop="businessCategory" /> |
||||
<el-table-column label="区域" align="center" prop="area" /> |
||||
<el-table-column label="城市" align="center" prop="city" /> |
||||
<el-table-column label="地址" align="center" prop="address" /> |
||||
<el-table-column label="联系人" align="center" prop="contacts" /> |
||||
<el-table-column label="营业状态" align="center" prop="status" /> |
||||
<el-table-column label="备注" align="center" prop="remark" /> |
||||
<el-table-column label="备注名" align="center" prop="remarkName" /> |
||||
<el-table-column label="备注id" align="center" prop="remarkId" /> |
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> |
||||
<template slot-scope="scope"> |
||||
<el-button |
||||
size="mini" |
||||
type="text" |
||||
icon="el-icon-edit" |
||||
@click="handleUpdate(scope.row)" |
||||
v-hasPermi="['system:shop:edit']" |
||||
>修改</el-button> |
||||
<el-button |
||||
size="mini" |
||||
type="text" |
||||
icon="el-icon-delete" |
||||
@click="handleDelete(scope.row)" |
||||
v-hasPermi="['system:shop:remove']" |
||||
>删除</el-button> |
||||
</template> |
||||
</el-table-column> |
||||
</el-table> |
||||
|
||||
<pagination |
||||
v-show="total>0" |
||||
:total="total" |
||||
:page.sync="queryParams.pageNum" |
||||
:limit.sync="queryParams.pageSize" |
||||
@pagination="getList" |
||||
/> |
||||
|
||||
<!-- 添加或修改抖音门店对话框 --> |
||||
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body> |
||||
<el-form ref="form" :model="form" :rules="rules" label-width="80px"> |
||||
<el-form-item label="店铺名称" prop="shopName"> |
||||
<el-input v-model="form.shopName" placeholder="请输入店铺名称" /> |
||||
</el-form-item> |
||||
<el-form-item label="主营类目" prop="businessCategory"> |
||||
<el-input v-model="form.businessCategory" type="textarea" placeholder="请输入内容" /> |
||||
</el-form-item> |
||||
<el-form-item label="区域" prop="area"> |
||||
<el-input v-model="form.area" placeholder="请输入区域" /> |
||||
</el-form-item> |
||||
<el-form-item label="城市" prop="city"> |
||||
<el-input v-model="form.city" placeholder="请输入城市" /> |
||||
</el-form-item> |
||||
<el-form-item label="地址" prop="address"> |
||||
<el-input v-model="form.address" type="textarea" placeholder="请输入内容" /> |
||||
</el-form-item> |
||||
<el-form-item label="联系人" prop="contacts"> |
||||
<el-input v-model="form.contacts" placeholder="请输入联系人" /> |
||||
</el-form-item> |
||||
<el-form-item label="备注" prop="remark"> |
||||
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" /> |
||||
</el-form-item> |
||||
<el-form-item label="备注名" prop="remarkName"> |
||||
<el-input v-model="form.remarkName" placeholder="请输入备注名" /> |
||||
</el-form-item> |
||||
<el-form-item label="备注id" prop="remarkId"> |
||||
<el-input v-model="form.remarkId" placeholder="请输入备注id" /> |
||||
</el-form-item> |
||||
</el-form> |
||||
<div slot="footer" class="dialog-footer"> |
||||
<el-button type="primary" @click="submitForm">确 定</el-button> |
||||
<el-button @click="cancel">取 消</el-button> |
||||
</div> |
||||
</el-dialog> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import { listShop, getShop, delShop, addShop, updateShop } from "@/api/sch/shop"; |
||||
|
||||
export default { |
||||
name: "Shop", |
||||
data() { |
||||
return { |
||||
// 遮罩层 |
||||
loading: true, |
||||
// 选中数组 |
||||
ids: [], |
||||
// 非单个禁用 |
||||
single: true, |
||||
// 非多个禁用 |
||||
multiple: true, |
||||
// 显示搜索条件 |
||||
showSearch: true, |
||||
// 总条数 |
||||
total: 0, |
||||
// 抖音门店表格数据 |
||||
shopList: [], |
||||
// 弹出层标题 |
||||
title: "", |
||||
// 是否显示弹出层 |
||||
open: false, |
||||
// 查询参数 |
||||
queryParams: { |
||||
pageNum: 1, |
||||
pageSize: 10, |
||||
shopName: null, |
||||
shopType: null, |
||||
businessCategory: null, |
||||
area: null, |
||||
city: null, |
||||
address: null, |
||||
contacts: null, |
||||
status: null, |
||||
remarkName: null, |
||||
remarkId: null |
||||
}, |
||||
// 表单参数 |
||||
form: {}, |
||||
// 表单校验 |
||||
rules: { |
||||
} |
||||
}; |
||||
}, |
||||
created() { |
||||
this.getList(); |
||||
}, |
||||
methods: { |
||||
/** 查询抖音门店列表 */ |
||||
getList() { |
||||
this.loading = true; |
||||
listShop(this.queryParams).then(response => { |
||||
this.shopList = response.rows; |
||||
this.total = response.total; |
||||
this.loading = false; |
||||
}); |
||||
}, |
||||
// 取消按钮 |
||||
cancel() { |
||||
this.open = false; |
||||
this.reset(); |
||||
}, |
||||
// 表单重置 |
||||
reset() { |
||||
this.form = { |
||||
shopId: null, |
||||
shopName: null, |
||||
shopType: null, |
||||
businessCategory: null, |
||||
area: null, |
||||
city: null, |
||||
address: null, |
||||
contacts: null, |
||||
status: "0", |
||||
remark: null, |
||||
remarkName: null, |
||||
remarkId: null |
||||
}; |
||||
this.resetForm("form"); |
||||
}, |
||||
/** 搜索按钮操作 */ |
||||
handleQuery() { |
||||
this.queryParams.pageNum = 1; |
||||
this.getList(); |
||||
}, |
||||
/** 重置按钮操作 */ |
||||
resetQuery() { |
||||
this.resetForm("queryForm"); |
||||
this.handleQuery(); |
||||
}, |
||||
// 多选框选中数据 |
||||
handleSelectionChange(selection) { |
||||
this.ids = selection.map(item => item.shopId) |
||||
this.single = selection.length!==1 |
||||
this.multiple = !selection.length |
||||
}, |
||||
/** 新增按钮操作 */ |
||||
handleAdd() { |
||||
this.reset(); |
||||
this.open = true; |
||||
this.title = "添加抖音门店"; |
||||
}, |
||||
/** 修改按钮操作 */ |
||||
handleUpdate(row) { |
||||
this.reset(); |
||||
const shopId = row.shopId || this.ids |
||||
getShop(shopId).then(response => { |
||||
this.form = response.data; |
||||
this.open = true; |
||||
this.title = "修改抖音门店"; |
||||
}); |
||||
}, |
||||
/** 提交按钮 */ |
||||
submitForm() { |
||||
this.$refs["form"].validate(valid => { |
||||
if (valid) { |
||||
if (this.form.shopId != null) { |
||||
updateShop(this.form).then(response => { |
||||
this.$modal.msgSuccess("修改成功"); |
||||
this.open = false; |
||||
this.getList(); |
||||
}); |
||||
} else { |
||||
addShop(this.form).then(response => { |
||||
this.$modal.msgSuccess("新增成功"); |
||||
this.open = false; |
||||
this.getList(); |
||||
}); |
||||
} |
||||
} |
||||
}); |
||||
}, |
||||
/** 删除按钮操作 */ |
||||
handleDelete(row) { |
||||
const shopIds = row.shopId || this.ids; |
||||
this.$modal.confirm('是否确认删除抖音门店编号为"' + shopIds + '"的数据项?').then(function() { |
||||
return delShop(shopIds); |
||||
}).then(() => { |
||||
this.getList(); |
||||
this.$modal.msgSuccess("删除成功"); |
||||
}).catch(() => {}); |
||||
}, |
||||
/** 导出按钮操作 */ |
||||
handleExport() { |
||||
this.download('system/shop/export', { |
||||
...this.queryParams |
||||
}, `shop_${new Date().getTime()}.xlsx`) |
||||
} |
||||
} |
||||
}; |
||||
</script> |
@ -0,0 +1,193 @@ |
||||
<template> |
||||
<div class="app-container"> |
||||
<el-form v-show="showSearch" ref="queryForm" :model="queryParams" size="small" :inline="true" label-width="68px"> |
||||
<el-form-item label="关键词" prop="skillKey"> |
||||
<el-input v-model="queryParams.skillKey" placeholder="请输入关键词" clearable @keyup.enter.native="handleQuery" /> |
||||
</el-form-item> |
||||
<el-form-item> |
||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> |
||||
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button> |
||||
</el-form-item> |
||||
</el-form> |
||||
|
||||
<el-row :gutter="10" class="mb8"> |
||||
<el-col :span="1.5"> |
||||
<el-button v-hasPermi="['system:skill:add']" type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd">新增</el-button> |
||||
</el-col> |
||||
|
||||
<right-toolbar :show-search.sync="showSearch" @queryTable="getList" /> |
||||
</el-row> |
||||
|
||||
<el-table v-loading="loading" :data="skillList" @selection-change="handleSelectionChange"> |
||||
<el-table-column type="index" width="55" align="center" /> |
||||
<el-table-column label="关键词" align="center" prop="skillKey" /> |
||||
<el-table-column label="话术内容" align="center" prop="content" /> |
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> |
||||
<template slot-scope="scope"> |
||||
<el-button v-hasPermi="['system:skill:edit']" size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)">修改</el-button> |
||||
<el-button v-hasPermi="['system:skill:remove']" size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)">删除</el-button> |
||||
</template> |
||||
</el-table-column> |
||||
</el-table> |
||||
|
||||
<pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" /> |
||||
|
||||
<!-- 添加或修改关键话术对话框 --> |
||||
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body> |
||||
<el-form ref="form" :model="form" :rules="rules" label-width="80px"> |
||||
<el-form-item label="关键词" prop="skillKey"> |
||||
<el-input v-model="form.skillKey" placeholder="请输入关键词" /> |
||||
</el-form-item> |
||||
<el-form-item label="话术内容"> |
||||
<editor v-model="form.content" :min-height="192" /> |
||||
</el-form-item> |
||||
</el-form> |
||||
<div slot="footer" class="dialog-footer"> |
||||
<el-button type="primary" @click="submitForm">确 定</el-button> |
||||
<el-button @click="cancel">取 消</el-button> |
||||
</div> |
||||
</el-dialog> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import { listSkill, getSkill, delSkill, addSkill, updateSkill } from '@/api/system/skill'; |
||||
|
||||
export default { |
||||
name: 'Skill', |
||||
data () { |
||||
return { |
||||
// 遮罩层 |
||||
loading: true, |
||||
// 选中数组 |
||||
ids: [], |
||||
// 非单个禁用 |
||||
single: true, |
||||
// 非多个禁用 |
||||
multiple: true, |
||||
// 显示搜索条件 |
||||
showSearch: true, |
||||
// 总条数 |
||||
total: 0, |
||||
// 关键话术表格数据 |
||||
skillList: [], |
||||
// 弹出层标题 |
||||
title: '', |
||||
// 是否显示弹出层 |
||||
open: false, |
||||
// 查询参数 |
||||
queryParams: { |
||||
pageNum: 1, |
||||
pageSize: 10, |
||||
deptId: null, |
||||
skillKey: null, |
||||
content: null |
||||
}, |
||||
// 表单参数 |
||||
form: {}, |
||||
// 表单校验 |
||||
rules: { |
||||
skillKey: [{ required: true, message: '关键词不能为空', trigger: 'blur' }], |
||||
content: [{ required: true, message: '话术内容不能为空', trigger: 'blur' }] |
||||
} |
||||
}; |
||||
}, |
||||
created () { |
||||
this.getList(); |
||||
}, |
||||
methods: { |
||||
/** 查询关键话术列表 */ |
||||
getList () { |
||||
this.loading = true; |
||||
listSkill(this.queryParams).then(response => { |
||||
this.skillList = response.rows; |
||||
this.total = response.total; |
||||
this.loading = false; |
||||
}); |
||||
}, |
||||
// 取消按钮 |
||||
cancel () { |
||||
this.open = false; |
||||
this.reset(); |
||||
}, |
||||
// 表单重置 |
||||
reset () { |
||||
this.form = { |
||||
skillId: null, |
||||
deptId: null, |
||||
skillKey: null, |
||||
content: null |
||||
}; |
||||
this.resetForm('form'); |
||||
}, |
||||
/** 搜索按钮操作 */ |
||||
handleQuery () { |
||||
this.queryParams.pageNum = 1; |
||||
this.getList(); |
||||
}, |
||||
/** 重置按钮操作 */ |
||||
resetQuery () { |
||||
this.resetForm('queryForm'); |
||||
this.handleQuery(); |
||||
}, |
||||
// 多选框选中数据 |
||||
handleSelectionChange (selection) { |
||||
this.ids = selection.map(item => item.skillId); |
||||
this.single = selection.length !== 1; |
||||
this.multiple = !selection.length; |
||||
}, |
||||
/** 新增按钮操作 */ |
||||
handleAdd () { |
||||
this.reset(); |
||||
this.open = true; |
||||
this.title = '添加关键话术'; |
||||
}, |
||||
/** 修改按钮操作 */ |
||||
handleUpdate (row) { |
||||
this.reset(); |
||||
const skillId = row.skillId || this.ids; |
||||
getSkill(skillId).then(response => { |
||||
this.form = response.data; |
||||
this.open = true; |
||||
this.title = '修改关键话术'; |
||||
}); |
||||
}, |
||||
/** 提交按钮 */ |
||||
submitForm () { |
||||
this.$refs['form'].validate(valid => { |
||||
if (valid) { |
||||
if (this.form.skillId != null) { |
||||
updateSkill(this.form).then(response => { |
||||
this.$modal.msgSuccess('修改成功'); |
||||
this.open = false; |
||||
this.getList(); |
||||
}); |
||||
} else { |
||||
addSkill(this.form).then(response => { |
||||
this.$modal.msgSuccess('新增成功'); |
||||
this.open = false; |
||||
this.getList(); |
||||
}); |
||||
} |
||||
} |
||||
}); |
||||
}, |
||||
/** 删除按钮操作 */ |
||||
handleDelete (row) { |
||||
const skillIds = row.skillId || this.ids; |
||||
this.$modal.confirm('是否确认删除关键话术编号为"' + skillIds + '"的数据项?').then(function () { |
||||
return delSkill(skillIds); |
||||
}).then(() => { |
||||
this.getList(); |
||||
this.$modal.msgSuccess('删除成功'); |
||||
}).catch(() => { }); |
||||
}, |
||||
/** 导出按钮操作 */ |
||||
handleExport () { |
||||
this.download('system/skill/export', { |
||||
...this.queryParams |
||||
}, `skill_${new Date().getTime()}.xlsx`); |
||||
} |
||||
} |
||||
}; |
||||
</script> |
@ -0,0 +1,134 @@ |
||||
<template> |
||||
<div> |
||||
<el-dialog :title="title" :close-on-click-modal="false" append-to-body :visible.sync="visible" width="800px" |
||||
@close="closeDialog" style="min-height: 400px;"> |
||||
<el-tabs v-model="activeTab"> |
||||
<el-tab-pane label="邀约信息" name="first"> |
||||
<el-table v-loading="loading" :data="invitationRecords" border> |
||||
<el-table-column label="操作时间" prop="createTime" width="140" /> |
||||
<el-table-column label="邀约场地" prop="placeName" min-width="200" /> |
||||
<el-table-column label="约定时间" prop="invitationTime" width="120" /> |
||||
<el-table-column label="备注" prop="remark" min-width="200" /> |
||||
</el-table> |
||||
</el-tab-pane> |
||||
<el-tab-pane label="分发信息" name="second"> |
||||
<el-table v-loading="loading" :data="distributeRecords" border> |
||||
<el-table-column label="操作时间" prop="distributeTime" width="140" /> |
||||
<el-table-column label="分发场地" prop="placeName" min-width="200" /> |
||||
<!-- <el-table-column label="接待人" prop="invitationTime" min-width="120" /> --> |
||||
<el-table-column label="接待人" prop="coachName" min-width="120" /> |
||||
<el-table-column label="操作" fixed="right" min-width="100"> |
||||
<template slot-scope="scope"> |
||||
<el-button size="mini" v-if="scope.$index == 0 && isEdit" type="text" icon="el-icon-edit" |
||||
@click="handleEdit(scope.row)">修改</el-button> |
||||
<el-button size="mini" type="text" |
||||
@click="handleFeedback(scope.row)">反馈信息</el-button> |
||||
</template> |
||||
</el-table-column> |
||||
</el-table> |
||||
</el-tab-pane> |
||||
</el-tabs> |
||||
|
||||
<span slot="footer" class="dialog-footer" > |
||||
<el-button v-jclick type="primary" :disabled="!isAdd" @click="handleAdd()">新增</el-button> |
||||
<el-button plain @click="(visible = false)">取消</el-button> |
||||
</span> |
||||
</el-dialog> |
||||
<DistributeFormDialog ref="DistributeFormDialog" @refreshDataList="getFeedbackOrder" /> |
||||
<FeedbackDialog ref="FeedbackDialog" /> |
||||
|
||||
</div> |
||||
</template> |
||||
<script> |
||||
import { listFeedbackOrder } from '@/api/zs/feedbackOrder'; |
||||
import { getInvitationByClue } from '@/api/zs/invitation'; |
||||
import DistributeFormDialog from './DistributeFormDialog.vue'; |
||||
import FeedbackDialog from './FeedbackDialog.vue'; |
||||
|
||||
export default { |
||||
name: 'DistributeDialog', |
||||
components: { |
||||
DistributeFormDialog, FeedbackDialog |
||||
}, |
||||
data() { |
||||
return { |
||||
visible: false, |
||||
canSubmit: true, |
||||
loading: false, |
||||
placeOptions: [], |
||||
coachOptions: [], |
||||
feedbackDetail: [], |
||||
activeTab: 'first', |
||||
invitationRecords: [], |
||||
clueInfo: undefined, |
||||
distributeRecords: [], |
||||
isAdd: false, |
||||
isEdit: true, |
||||
title: '分发' |
||||
}; |
||||
}, |
||||
methods: { |
||||
init(info = undefined) { |
||||
this.activeTab = 'first'; |
||||
// this.getPlaces(); |
||||
this.visible = true; |
||||
this.isAdd = false; |
||||
this.isEdit = true; |
||||
this.title = '邀约'; |
||||
this.$nextTick(() => { |
||||
if (info) { |
||||
this.clueInfo = info; |
||||
if (info.feedbackStatus > 2) { |
||||
this.isEdit = false; |
||||
} |
||||
if (info.feedbackStatus == 1 || info.feedbackStatus == 5 || info.feedbackStatus == 6) { |
||||
this.isAdd = true; |
||||
} |
||||
// 查询线索的邀约情况 |
||||
this.getInvitationByClue(); |
||||
// 查询该线索的分发a情况 |
||||
this.getFeedbackOrder(); |
||||
this.title = this.title + '【' + (info.name == null ? '' : info.name) + ' ' + info.phone + '】'; |
||||
} |
||||
}); |
||||
}, |
||||
closeDialog() { |
||||
this.$emit('update:dialog.batchUpdateVisible', false); |
||||
}, |
||||
getInvitationByClue() { |
||||
getInvitationByClue({ clueId: this.clueInfo.clueId }).then(resp => { |
||||
if (resp.code == 200 && resp.data) { |
||||
this.invitationRecords = resp.data; |
||||
} |
||||
}); |
||||
}, |
||||
getFeedbackOrder() { |
||||
listFeedbackOrder({ clueId: this.clueInfo.clueId }).then(resp => { |
||||
if (resp.code == 200 && resp.rows && resp.rows.length > 0) { |
||||
this.distributeRecords = resp.rows.filter(item => item.feedbackStatus != 0); |
||||
} |
||||
}); |
||||
}, |
||||
handleFeedback(item) { |
||||
this.$nextTick(() => { |
||||
this.$refs.FeedbackDialog.init(item.orderId); |
||||
}); |
||||
}, |
||||
handleAdd() { |
||||
const item = { |
||||
placeId: undefined, |
||||
clueId: this.clueInfo.clueId, |
||||
coachId: undefined, |
||||
copyUserList: [] |
||||
}; |
||||
this.handleEdit(item); |
||||
}, |
||||
handleEdit(item) { |
||||
this.$nextTick(() => { |
||||
this.$refs.DistributeFormDialog.init(item); |
||||
}); |
||||
} |
||||
} |
||||
}; |
||||
</script> |
||||
|
@ -0,0 +1,112 @@ |
||||
<template> |
||||
<el-dialog title="分发" :close-on-click-modal="false" append-to-body :visible.sync="visible" width="600px" @close="closeDialog"> |
||||
<el-form ref="dialogForm" :model="dialogForm" :rules="rules" label-width="110px"> |
||||
<el-row> |
||||
<el-col :span="24"> |
||||
<el-form-item label="场地" prop="newPlaceList"> |
||||
<span v-if="oldForm.placeNames">{{ oldForm.placeNames }}</span> |
||||
|
||||
<el-select v-model="dialogForm.newPlaceList" filterable multiple placeholder="请选择" clearable style="width: 100%;"> |
||||
<el-option v-for="dict in placeOptions" :key="dict.placeId" :label="dict.name" :value="dict.placeId" /> |
||||
</el-select> |
||||
</el-form-item> |
||||
</el-col> |
||||
</el-row> |
||||
</el-form> |
||||
<span slot="footer" class="dialog-footer"> |
||||
<el-button plain @click="(visible = false)">取消</el-button> |
||||
<el-button v-jclick type="primary" :disabled="!canSubmit" @click="dialogFormSubmit()">确定</el-button> |
||||
</span> |
||||
</el-dialog> |
||||
</template> |
||||
<script> |
||||
import { getCluePlaceList, saveCluePlace } from '@/api/zs/clue'; |
||||
import { getAllPlaces } from '@/api/sch/place'; |
||||
|
||||
export default { |
||||
name: 'DistributeFormDialog', |
||||
|
||||
data () { |
||||
return { |
||||
visible: false, |
||||
canSubmit: true, |
||||
dialogForm: {}, |
||||
oldForm: {}, |
||||
rules: { |
||||
newPlaceList: { |
||||
required: true, |
||||
message: '场地不能为空不能为空', |
||||
trigger: 'blur' |
||||
} |
||||
}, |
||||
placeOptions: [] |
||||
}; |
||||
}, |
||||
methods: { |
||||
init (info = undefined) { |
||||
this.getPlaces(); |
||||
this.visible = true; |
||||
this.$nextTick(() => { |
||||
this.resetDialogForm(); |
||||
this.$refs['dialogForm'].resetFields(); |
||||
if (info) { |
||||
this.dialogForm.clueId = info; |
||||
// 查询该线索的分发情况 |
||||
this.getDistributePlaces(info); |
||||
} |
||||
}); |
||||
}, |
||||
resetDialogForm () { |
||||
this.dialogForm = { |
||||
oldPlaceList: [], |
||||
newPlaceList: [], |
||||
placeIdList: [], |
||||
clueId: undefined |
||||
}; |
||||
this.oldForm = {}; |
||||
}, |
||||
closeDialog () { |
||||
this.$emit('update:dialog.batchUpdateVisible', false); |
||||
}, |
||||
getDistributePlaces (clueId) { |
||||
getCluePlaceList({ clueId: clueId }).then(resp => { |
||||
if (resp.code == 200) { |
||||
this.oldForm = resp.data; |
||||
this.dialogForm.oldPlaceList = this.oldForm.placeIdList; |
||||
if (this.oldForm.placeIdList && this.oldForm.placeIdList) { |
||||
this.placeOptions = this.placeOptions.filter(item => this.oldForm.placeIdList.indexOf(item.placeId) == -1); |
||||
} |
||||
} |
||||
}); |
||||
}, |
||||
// 表单提交 |
||||
dialogFormSubmit () { |
||||
this.$refs.dialogForm.validate((valid) => { |
||||
if (valid) { |
||||
this.canSubmit = false; |
||||
this.dialogForm.placeIdList = this.dialogForm.oldPlaceList.concat(this.dialogForm.newPlaceList); |
||||
// 校验完成,调接口 |
||||
saveCluePlace(this.dialogForm) |
||||
.then((resp) => { |
||||
this.canSubmit = true; |
||||
if (resp.code == 200) { |
||||
this.$message.success('分发成功'); |
||||
this.$emit('refreshDataList'); |
||||
this.visible = false; |
||||
} |
||||
}) |
||||
.catch(() => { |
||||
this.canSubmit = true; |
||||
}); |
||||
} |
||||
}); |
||||
}, |
||||
getPlaces () { |
||||
getAllPlaces({ status: '0' }).then((resp) => { |
||||
this.placeOptions = resp.data; |
||||
}); |
||||
} |
||||
} |
||||
}; |
||||
</script> |
||||
|
@ -0,0 +1,53 @@ |
||||
<template> |
||||
<el-dialog title="反馈" :close-on-click-modal="false" append-to-body :visible.sync="visible" width="800px" |
||||
@close="closeDialog" style="min-height: 400px;"> |
||||
<el-timeline :reverse="true"> |
||||
<el-timeline-item v-for="(item, index) in feedbackDetail" :key="index" :timestamp="item.updateTime" placement="top"> |
||||
<div v-if="item.feedbackType == 1"> |
||||
<div>是否联系:<span>{{ item.isContact ? '已联系' : '未联系' }}</span></div> |
||||
<div>到场时间:<span>{{ item.arrivalTime }}</span></div> |
||||
<div>备注:<span>{{ item.remark }}</span></div> |
||||
</div> |
||||
<div v-if="item.feedbackType == 2"> |
||||
<div>到场状态:<span v-if="item.arrivalStatus == 1">未到场</span> |
||||
<span v-if="item.arrivalStatus == 2">到场未成交</span> |
||||
<span v-if="item.arrivalStatus == 3">到场已成交</span> |
||||
</div> |
||||
<div> 备注:<span>{{ item.remark }}</span></div> |
||||
</div> |
||||
</el-timeline-item> |
||||
</el-timeline> |
||||
</el-dialog> |
||||
</template> |
||||
<script> |
||||
import { listFeedbackDetail } from '@/api/zs/feedbackDetail'; |
||||
|
||||
export default { |
||||
name: 'FeedbackDialog', |
||||
data() { |
||||
return { |
||||
visible: false, |
||||
feedbackDetail: [], |
||||
}; |
||||
}, |
||||
methods: { |
||||
init(info = undefined) { |
||||
this.visible = true; |
||||
this.$nextTick(() => { |
||||
this.getFeedbackDetail(info); |
||||
}); |
||||
}, |
||||
closeDialog() { |
||||
this.$emit('update:dialog.batchUpdateVisible', false); |
||||
}, |
||||
getFeedbackDetail(orderId) { |
||||
listFeedbackDetail({ orderId: orderId }).then(resp => { |
||||
this.feedbackDetail = resp.rows; |
||||
}); |
||||
} |
||||
|
||||
} |
||||
}; |
||||
</script> |
||||
|
||||
|
@ -0,0 +1,43 @@ |
||||
<template> |
||||
<el-dialog title="跟进统计" :close-on-click-modal="false" append-to-body :visible.sync="visible" width="500px" min-height="500"> |
||||
<div> |
||||
<el-form ref="dialogForm" :model="dialogForm" label-width="110px" > |
||||
<el-form-item label="今日跟进线索数" prop="name"> |
||||
<span>{{dialogForm.total}}</span> |
||||
</el-form-item> |
||||
<el-form-item v-for="item in dialogForm.intentionCountList" :label="item.label" > |
||||
<span>{{item.num}}</span> |
||||
</el-form-item> |
||||
</el-form> |
||||
</div> |
||||
</el-dialog> |
||||
</template> |
||||
<script> |
||||
import { getFollowCount } from '@/api/zs/clue'; |
||||
export default { |
||||
name: 'FollowCountDialog', |
||||
data() { |
||||
return { |
||||
visible: false, |
||||
publicList: [], |
||||
dialogForm:{} |
||||
}; |
||||
}, |
||||
methods: { |
||||
init() { |
||||
this.visible = true; |
||||
this.getCount(); |
||||
}, |
||||
getCount() { |
||||
this.loading = true; |
||||
getFollowCount().then((resp) => { |
||||
if (resp && resp.code === 200) { |
||||
this.dialogForm = resp.data; |
||||
this.loading = false; |
||||
} |
||||
}); |
||||
}, |
||||
} |
||||
}; |
||||
</script> |
||||
|
@ -0,0 +1,39 @@ |
||||
<template> |
||||
<el-dialog title="跟进记录" :close-on-click-modal="false" append-to-body :visible.sync="visible" width="800px"> |
||||
<FollowRecord v-if="clueId" :clue-id="clueId" /> |
||||
</el-dialog> |
||||
</template> |
||||
<script> |
||||
import FollowRecord from '../ClueForm/components/FollowRecord.vue'; |
||||
export default { |
||||
name: 'FollowInfoDialog', |
||||
components: { |
||||
FollowRecord |
||||
}, |
||||
data() { |
||||
return { |
||||
visible: false, |
||||
title: undefined, |
||||
clueId: undefined |
||||
}; |
||||
}, |
||||
methods: { |
||||
init(info = undefined) { |
||||
this.$nextTick(() => { |
||||
this.visible = true; |
||||
if (info) { |
||||
this.clueId = info; |
||||
} |
||||
}); |
||||
} |
||||
} |
||||
}; |
||||
</script> |
||||
|
||||
<style scoped> |
||||
.el-divider--vertical { |
||||
height: 15em !important; |
||||
} |
||||
</style> |
||||
|
||||
|
@ -0,0 +1,117 @@ |
||||
<template> |
||||
<div> |
||||
<el-dialog :title="title" :close-on-click-modal="false" append-to-body :visible.sync="visible" width="800px" |
||||
@close="closeDialog"> |
||||
<div> |
||||
<el-table v-loading="loading" :data="invitationRecords" border> |
||||
<el-table-column label="操作时间" prop="createTime" width="140" /> |
||||
<el-table-column label="邀约场地" prop="placeName" width="200" /> |
||||
<el-table-column label="约定时间" prop="invitationTime" width="120" /> |
||||
<el-table-column label="备注" prop="remark" width="200" /> |
||||
<el-table-column label="操作" fixed="right" width="80"> |
||||
<template slot-scope="scope"> |
||||
<el-button size="mini" v-if="scope.$index == 0 && isEdit" type="text" icon="el-icon-edit" |
||||
@click="handleEdit(scope.row)">修改</el-button> |
||||
</template> |
||||
</el-table-column> |
||||
</el-table> |
||||
</div> |
||||
<span slot="footer" class="dialog-footer"> |
||||
<el-button v-jclick type="primary" :disabled="!isAdd" @click="handleAdd()">新增</el-button> |
||||
<el-button plain @click="closeDialog">关闭</el-button> |
||||
</span> |
||||
</el-dialog> |
||||
<InvitationFormDialog ref="InvitationFormDialog" @refreshDataList="getInvitationRecord" /> |
||||
</div> |
||||
</template> |
||||
<script> |
||||
import { getInvitationByClue } from '@/api/zs/invitation'; |
||||
import InvitationFormDialog from './InvitationFormDialog.vue'; |
||||
|
||||
export default { |
||||
name: 'InvitationDialog', |
||||
components: { |
||||
InvitationFormDialog |
||||
}, |
||||
data() { |
||||
return { |
||||
visible: false, |
||||
canSubmit: true, |
||||
placeOptions: [], |
||||
isEdit: true, |
||||
invitationRecords: [], |
||||
clueId: undefined, |
||||
loading: false, |
||||
title: undefined, |
||||
clueInfo: undefined, |
||||
isAdd: false |
||||
}; |
||||
}, |
||||
methods: { |
||||
init(info = undefined) { |
||||
this.visible = true; |
||||
this.title = "邀约"; |
||||
this.isAdd = false; |
||||
this.isEdit = true; |
||||
this.clueInfo = undefined; |
||||
this.$nextTick(() => { |
||||
if (info) { |
||||
this.clueInfo = info; |
||||
if (info.feedbackStatus >= 2) { |
||||
this.isEdit = false; |
||||
} |
||||
if (info.feedbackStatus == 0 || info.feedbackStatus == 5 || info.feedbackStatus == 6) { |
||||
this.isAdd = true; |
||||
} |
||||
if (info.clueId) { |
||||
this.clueId = info.clueId; |
||||
this.getInvitationRecord(); |
||||
} |
||||
this.title = this.title + '【' + (info.name == null ? '' : info.name) + ' ' + info.phone + '】'; |
||||
} |
||||
}); |
||||
}, |
||||
closeDialog() { |
||||
this.visible = false; |
||||
// this.$emit('update:dialog.batchUpdateVisible', false); |
||||
this.$emit('refreshDataList'); |
||||
}, |
||||
getInvitationRecord() { |
||||
getInvitationByClue({ clueId: this.clueId }).then(resp => { |
||||
if (resp.data) { |
||||
this.invitationRecords = resp.data; |
||||
if (this.invitationRecords && this.invitationRecords.length > 0) { |
||||
this.dialogForm = this.invitationRecords[0]; |
||||
} |
||||
} |
||||
}); |
||||
}, |
||||
handleAdd() { |
||||
const invitation = { |
||||
invitationId: undefined, |
||||
clueId: this.clueInfo.clueId, |
||||
name: this.clueInfo.name, |
||||
phone: this.clueInfo.phone, |
||||
address: this.clueInfo.address, |
||||
placeId: undefined, |
||||
invitationTime: undefined, |
||||
remark: undefined |
||||
}; |
||||
this.handleEdit(invitation); |
||||
}, |
||||
handleEdit(item) { |
||||
this.$nextTick(() => { |
||||
this.$refs.InvitationFormDialog.init(item) |
||||
}); |
||||
} |
||||
} |
||||
}; |
||||
</script> |
||||
|
||||
<style scoped> |
||||
.el-divider--vertical { |
||||
height: 15em !important; |
||||
} |
||||
</style> |
||||
|
||||
|
@ -0,0 +1,162 @@ |
||||
<template> |
||||
<el-dialog title="邀约" :close-on-click-modal="false" append-to-body :visible.sync="visible" width="500px" |
||||
@close="closeDialog"> |
||||
<el-form ref="dialogForm" :model="dialogForm" :rules="rules" label-width="110px" :disabled="!isEdit"> |
||||
<el-row> |
||||
<el-col :span="24"> |
||||
<el-form-item label="姓名" prop="name"> |
||||
<el-input v-model="dialogForm.name" placeholder="请输入姓名" /> |
||||
</el-form-item> |
||||
</el-col> |
||||
<el-col :span="24"> |
||||
<el-form-item label="联系方式" prop="phone"> |
||||
<el-input v-model="dialogForm.phone" placeholder="请输入联系方式" /> |
||||
</el-form-item> |
||||
</el-col> |
||||
</el-row> |
||||
<el-row> |
||||
<el-col :span="24"> |
||||
<el-form-item label="场地" prop="placeId"> |
||||
<el-select v-model="dialogForm.placeId" filterable placeholder="请选择" clearable style="width: 100%;"> |
||||
<el-option v-for="dict in placeOptions" :key="dict.placeId" :label="dict.name" :value="dict.placeId" /> |
||||
</el-select> |
||||
</el-form-item> |
||||
</el-col> |
||||
<el-col :span="24"> |
||||
<el-form-item label="约定时间" prop="invitationTime"> |
||||
<el-date-picker clearable v-model="dialogForm.invitationTime" type="datetime" value-format="yyyy-MM-dd HH:mm" |
||||
format="yyyy-MM-dd HH:mm" placeholder="请选择约定时间"> |
||||
</el-date-picker> |
||||
</el-form-item> |
||||
</el-col> |
||||
</el-row> |
||||
<el-form-item label="备注" prop="remark"> |
||||
<el-input v-model="dialogForm.remark" type="textarea" placeholder="请输入" /> |
||||
</el-form-item> |
||||
</el-form> |
||||
|
||||
<span slot="footer" class="dialog-footer"> |
||||
<el-button plain @click="(visible = false)">取消</el-button> |
||||
<el-button v-jclick type="primary" :disabled="!canSubmit || !isEdit" @click="dialogFormSubmit()">确定</el-button> |
||||
</span> |
||||
</el-dialog> |
||||
</template> |
||||
<script> |
||||
import { addInvitation, updateInvitation } from '@/api/zs/invitation'; |
||||
import { getAllPlaces } from '@/api/sch/place'; |
||||
|
||||
export default { |
||||
name: 'InvitationFormDialog', |
||||
|
||||
data() { |
||||
return { |
||||
visible: false, |
||||
canSubmit: true, |
||||
dialogForm: { |
||||
invitationId: undefined, |
||||
clueId: undefined, |
||||
name: undefined, |
||||
phone: undefined, |
||||
address: undefined, |
||||
placeId: undefined, |
||||
invitationTime: undefined, |
||||
remark: undefined |
||||
}, |
||||
rules: { |
||||
name: { required: true, message: '姓名不能为空', trigger: 'blur' }, |
||||
phone: { required: true, message: '姓名不能为空', trigger: 'blur' }, |
||||
placeId: { required: true, message: '场地不能为空', trigger: 'blur' }, |
||||
invitationTime: { required: true, message: '约定时间不能为空', trigger: 'blur' } |
||||
|
||||
}, |
||||
placeOptions: [], |
||||
isEdit: true, |
||||
invitationRecords: [] |
||||
}; |
||||
}, |
||||
methods: { |
||||
init(info = undefined) { |
||||
this.visible = true; |
||||
this.getPlaces() |
||||
this.$nextTick(() => { |
||||
this.resetDialogForm(); |
||||
this.$refs['dialogForm'].resetFields(); |
||||
if (info) { |
||||
this.dialogForm = { ...info } |
||||
} |
||||
}); |
||||
}, |
||||
resetDialogForm() { |
||||
this.dialogForm = { |
||||
invitationId: undefined, |
||||
clueId: undefined, |
||||
name: undefined, |
||||
phone: undefined, |
||||
address: undefined, |
||||
placeId: undefined, |
||||
invitationTime: undefined, |
||||
remark: undefined |
||||
}; |
||||
this.isEdit = true; |
||||
}, |
||||
closeDialog() { |
||||
this.$emit('update:dialog.batchUpdateVisible', false); |
||||
}, |
||||
handleEdit(item) { |
||||
this.$nextTick(() => { |
||||
this.$refs.InvitationDialog.init(item) |
||||
}) |
||||
}, |
||||
// 表单提交 |
||||
dialogFormSubmit() { |
||||
this.$refs.dialogForm.validate((valid) => { |
||||
if (valid) { |
||||
this.canSubmit = false; |
||||
if (this.dialogForm.invitationId) { |
||||
// 校验完成,调接口 |
||||
updateInvitation(this.dialogForm) |
||||
.then((resp) => { |
||||
this.canSubmit = true; |
||||
if (resp.code == 200) { |
||||
this.$message.success('修改成功'); |
||||
this.$emit('refreshDataList'); |
||||
this.visible = false; |
||||
} |
||||
}) |
||||
.catch(() => { |
||||
this.canSubmit = true; |
||||
}); |
||||
} else { |
||||
// 校验完成,调接口 |
||||
addInvitation(this.dialogForm) |
||||
.then((resp) => { |
||||
this.canSubmit = true; |
||||
if (resp.code == 200) { |
||||
this.$message.success('邀约成功'); |
||||
this.$emit('refreshDataList'); |
||||
this.visible = false; |
||||
} |
||||
}) |
||||
.catch(() => { |
||||
this.canSubmit = true; |
||||
}); |
||||
} |
||||
} |
||||
}); |
||||
}, |
||||
getPlaces() { |
||||
getAllPlaces({ status: '0' }).then((resp) => { |
||||
this.placeOptions = resp.data; |
||||
}); |
||||
} |
||||
} |
||||
}; |
||||
</script> |
||||
|
||||
<style scoped> |
||||
.el-divider--vertical { |
||||
height: 15em !important; |
||||
} |
||||
</style> |
||||
|
||||
|
@ -0,0 +1,70 @@ |
||||
<!-- |
||||
* @Author: riverQiu |
||||
* @Date: 2023-10-14 13:21:37 |
||||
* @LastEditors: riverQiu |
||||
* @LastEditTime: 2023-10-15 00:55:44 |
||||
* @Description: |
||||
--> |
||||
<template> |
||||
<el-dialog title="话术" :close-on-click-modal="false" append-to-body :visible.sync="visible" width="700px" height="700"> |
||||
<div> |
||||
<!-- 搜索框 --> |
||||
<el-select v-model="skillId" placeholder="请选择关键词" filterable style="width: 90%;" @change="selectKey"> |
||||
<el-option v-for="item in keyOptions" :key="item.skillId" :label="item.skillKey" :value="item.skillId" /> |
||||
</el-select> <!-- 常用关键词 --> |
||||
|
||||
<!-- 话术内容 --> |
||||
<el-card class="box-card"> |
||||
|
||||
<div class="text item"> |
||||
<span v-html="content" /> |
||||
</div> |
||||
</el-card> |
||||
</div> |
||||
</el-dialog> |
||||
</template> |
||||
<script> |
||||
import { getSkillKey, getSkill } from '@/api/system/skill'; |
||||
export default { |
||||
name: 'SkillDialog', |
||||
data () { |
||||
return { |
||||
visible: false, |
||||
loading: true, |
||||
keyOptions: [], |
||||
content: undefined, |
||||
skillId: undefined |
||||
}; |
||||
}, |
||||
methods: { |
||||
init () { |
||||
this.visible = true; |
||||
this.getSkillKeyOption(); |
||||
}, |
||||
getSkillKeyOption () { |
||||
getSkillKey().then((resp) => { |
||||
if (resp && resp.code === 200) { |
||||
this.keyOptions = resp.data; |
||||
} |
||||
}); |
||||
}, |
||||
selectKey (item) { |
||||
if (item) { |
||||
getSkill(item).then((resp) => { |
||||
if (resp && resp.code === 200) { |
||||
this.content = resp.data.content; |
||||
} |
||||
}); |
||||
} |
||||
} |
||||
} |
||||
}; |
||||
</script> |
||||
|
||||
<style lang="scss" scoped> |
||||
.box-card { |
||||
width: 500px; |
||||
min-height: 100px; |
||||
} |
||||
</style> |
||||
|
@ -0,0 +1,138 @@ |
||||
<template> |
||||
<div class="app-container" style="width:90%;margin:auto;"> |
||||
<!-- 添加或修改线索反馈对话框 --> |
||||
<el-form ref="form" :model="form" :rules="rules" label-width="80px"> |
||||
<el-form-item label="学员姓名"> |
||||
<span>{{ order.stuName }}</span> |
||||
</el-form-item> |
||||
<el-form-item label="联系方式"> |
||||
<span>{{ order.phone }}</span> |
||||
</el-form-item> |
||||
<el-form-item label="地址"> |
||||
<span>{{ order.address }}</span> |
||||
</el-form-item> |
||||
<el-form-item label="邀约场地"> |
||||
<span>{{ order.placeName }}</span> |
||||
</el-form-item> |
||||
<el-form-item label="邀约时间" v-if="order.invitationTime != undefined"> |
||||
<span>{{ order.invitationTime }}</span> |
||||
</el-form-item> |
||||
<el-form-item label="邀约备注" prop="coachId" v-if="order.remark != undefined"> |
||||
<span>{{ order.remark }}</span> |
||||
</el-form-item> |
||||
<el-form-item label="接待人" prop="coachId"> |
||||
<span>{{ order.coachName }}</span> |
||||
</el-form-item> |
||||
<el-divider></el-divider> |
||||
<el-form-item label="到场状态" prop="arrivalStatus"> |
||||
<el-radio-group v-model="form.arrivalStatus" size="small" :disabled="!isEdit"> |
||||
<el-radio :label="1">未到场</el-radio> |
||||
<el-radio :label="2">到场未成交</el-radio> |
||||
<el-radio :label="3">到场已成交</el-radio> |
||||
</el-radio-group> |
||||
</el-form-item> |
||||
<el-form-item label="备注" prop="remark"> |
||||
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" :disabled="!isEdit" /> |
||||
</el-form-item> |
||||
</el-form> |
||||
<div v-if="isEdit" style="text-align: center;"> |
||||
<div style="text-align: center;"> |
||||
<el-button type="primary" @click="submitForm">提 交</el-button> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import { getFeedbackDetailInfo, addFeedbackDetail, updateFeedbackDetail } from '@/api/zs/feedbackDetail'; |
||||
|
||||
import { getFeedbackOrder } from '@/api/zs/feedbackOrder'; |
||||
|
||||
export default { |
||||
name: 'Follow', |
||||
data () { |
||||
return { |
||||
// 遮罩层 |
||||
loading: true, |
||||
// 表单参数 |
||||
form: { |
||||
|
||||
}, |
||||
// 表单校验 |
||||
rules: { |
||||
}, |
||||
order: {}, |
||||
orderId: undefined, |
||||
type: undefined, |
||||
isEdit: false |
||||
}; |
||||
}, |
||||
created () { |
||||
console.log(this.$route.query.no); |
||||
this.type = this.$route.query.type; |
||||
this.reset(); |
||||
this.getFeedbackOrder(this.$route.query.no); |
||||
this.getFeedbackDetailInfo(this.$route.query.no); |
||||
}, |
||||
methods: { |
||||
/** 查询线索反馈表单 */ |
||||
getFeedbackOrder (orderId) { |
||||
this.loading = true; |
||||
getFeedbackOrder(orderId).then(response => { |
||||
this.order = response.data; |
||||
if (this.order.clueId) { |
||||
this.form.clueId = this.order.clueId; |
||||
} |
||||
if (this.order.coachId) { |
||||
this.form.coachId = this.order.coachId; |
||||
} |
||||
if (this.order.orderId) { |
||||
this.form.orderId = this.order.orderId; |
||||
} |
||||
if (this.type == this.order.coachId) { |
||||
this.isEdit = true; |
||||
} |
||||
this.loading = false; |
||||
}); |
||||
}, |
||||
/** 查询线索反馈表单 */ |
||||
getFeedbackDetailInfo (orderId) { |
||||
this.loading = true; |
||||
getFeedbackDetailInfo({ orderId: orderId, feedbackType: 2 }).then(response => { |
||||
if (response.data) { |
||||
this.form = response.data; |
||||
} |
||||
this.loading = false; |
||||
}); |
||||
}, |
||||
// 表单重置 |
||||
reset () { |
||||
this.form = { |
||||
feedbackId: null, |
||||
clueId: null, |
||||
feedbackType: 2, |
||||
coachId: null, |
||||
arrivalStatus: 1, |
||||
remark: null |
||||
}; |
||||
this.resetForm('form'); |
||||
}, |
||||
/** 提交按钮 */ |
||||
submitForm () { |
||||
this.$refs['form'].validate(valid => { |
||||
if (valid) { |
||||
if (this.form.feedbackId != null) { |
||||
updateFeedbackDetail(this.form).then(response => { |
||||
this.$modal.msgSuccess('提交成功'); |
||||
}); |
||||
} else { |
||||
addFeedbackDetail(this.form).then(response => { |
||||
this.$modal.msgSuccess('提交成功'); |
||||
}); |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
} |
||||
}; |
||||
</script> |
@ -0,0 +1,140 @@ |
||||
<template> |
||||
<div class="app-container" style="width:90%;margin:auto;"> |
||||
<!-- 添加或修改线索反馈对话框 --> |
||||
<el-form ref="form" :model="form" :rules="rules" label-width="80px"> |
||||
<el-form-item label="学员姓名"> |
||||
<span>{{ order.stuName }}</span> |
||||
</el-form-item> |
||||
<el-form-item label="联系方式"> |
||||
<span>{{ order.phone }}</span> |
||||
</el-form-item> |
||||
<el-form-item label="地址"> |
||||
<span>{{ order.address }}</span> |
||||
</el-form-item> |
||||
<el-form-item label="邀约场地"> |
||||
<span>{{ order.placeName }}</span> |
||||
</el-form-item> |
||||
<el-form-item label="邀约时间" v-if="order.invitationTime != undefined"> |
||||
<span>{{ order.invitationTime }}</span> |
||||
</el-form-item> |
||||
<el-form-item label="邀约备注" prop="coachId" v-if="order.remark != undefined"> |
||||
<span>{{ order.remark }}</span> |
||||
</el-form-item> |
||||
<el-form-item label="接待人" prop="coachId"> |
||||
<span>{{ order.coachName }}</span> |
||||
</el-form-item> |
||||
<el-divider></el-divider> |
||||
<el-form-item label="是否联系" prop="isContact"> |
||||
<el-radio-group v-model="form.isContact" size="small" :disabled="!isEdit"> |
||||
<el-radio :label="1">是</el-radio> |
||||
<el-radio :label="0">否</el-radio> |
||||
</el-radio-group> |
||||
</el-form-item> |
||||
<el-form-item label="到场时间" prop="arrivalTime"> |
||||
<el-date-picker v-model="form.arrivalTime" :disabled="!isEdit" clearable type="datetime" format="yyyy-MM-dd HH:mm" value-format="yyyy-MM-dd HH:mm" placeholder="请选择到场时间" /> |
||||
</el-form-item> |
||||
<el-form-item label="备注" prop="remark"> |
||||
<el-input v-model="form.remark" :disabled="!isEdit" type="textarea" placeholder="请输入内容" /> |
||||
</el-form-item> |
||||
</el-form> |
||||
<div v-if="isEdit" style="text-align: center;"> |
||||
<div style="text-align: center;"> |
||||
<el-button type="primary" @click="submitForm">提 交</el-button> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import { getFeedbackDetailInfo, addFeedbackDetail, updateFeedbackDetail } from '@/api/zs/feedbackDetail'; |
||||
|
||||
import { getFeedbackOrder } from '@/api/zs/feedbackOrder'; |
||||
|
||||
export default { |
||||
name: 'Follow', |
||||
data () { |
||||
return { |
||||
// 遮罩层 |
||||
loading: true, |
||||
// 表单参数 |
||||
form: {}, |
||||
// 表单校验 |
||||
rules: { |
||||
}, |
||||
order: {}, |
||||
orderId: undefined, |
||||
type: undefined, |
||||
isEdit: false |
||||
}; |
||||
}, |
||||
created () { |
||||
console.log(this.$route.query.no); |
||||
this.type = this.$route.query.type; |
||||
this.reset(); |
||||
this.getFeedbackOrder(this.$route.query.no); |
||||
this.getFeedbackDetailInfo(this.$route.query.no); |
||||
}, |
||||
methods: { |
||||
/** 查询线索反馈表单 */ |
||||
getFeedbackOrder (orderId) { |
||||
this.loading = true; |
||||
getFeedbackOrder(orderId).then(response => { |
||||
this.order = response.data; |
||||
if (this.order.clueId) { |
||||
this.form.clueId = this.order.clueId; |
||||
} |
||||
if (this.order.coachId) { |
||||
this.form.coachId = this.order.coachId; |
||||
} |
||||
if (this.order.orderId) { |
||||
this.form.orderId = this.order.orderId; |
||||
} |
||||
if (this.type == this.order.coachId) { |
||||
this.isEdit = true; |
||||
} |
||||
this.loading = false; |
||||
}); |
||||
}, |
||||
/** 查询线索反馈表单 */ |
||||
getFeedbackDetailInfo (orderId) { |
||||
this.loading = true; |
||||
getFeedbackDetailInfo({ orderId: orderId, feedbackType: 1 }).then(response => { |
||||
if (response.data) { |
||||
this.form = response.data; |
||||
} |
||||
this.loading = false; |
||||
}); |
||||
}, |
||||
// 表单重置 |
||||
reset () { |
||||
this.form = { |
||||
feedbackId: null, |
||||
clueId: null, |
||||
feedbackType: 1, |
||||
coachId: null, |
||||
feedbackTime: null, |
||||
isContact: 0, |
||||
arrivalTime: null, |
||||
remark: null |
||||
}; |
||||
this.resetForm('form'); |
||||
}, |
||||
/** 提交按钮 */ |
||||
submitForm () { |
||||
this.$refs['form'].validate(valid => { |
||||
if (valid) { |
||||
if (this.form.feedbackId != null) { |
||||
updateFeedbackDetail(this.form).then(response => { |
||||
this.$modal.msgSuccess('提交成功'); |
||||
}); |
||||
} else { |
||||
addFeedbackDetail(this.form).then(response => { |
||||
this.$modal.msgSuccess('提交成功'); |
||||
}); |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
} |
||||
}; |
||||
</script> |
@ -0,0 +1,253 @@ |
||||
<template> |
||||
<div class="app-container"> |
||||
<el-form v-show="showSearch" ref="queryForm" :model="queryParams" size="small" :inline="true" label-width="68px"> |
||||
<el-form-item label="线索id" prop="clueId"> |
||||
<el-input v-model="queryParams.clueId" placeholder="请输入线索id" clearable @keyup.enter.native="handleQuery" /> |
||||
</el-form-item> |
||||
<el-form-item label="教练id" prop="coachId"> |
||||
<el-input v-model="queryParams.coachId" placeholder="请输入教练id" clearable @keyup.enter.native="handleQuery" /> |
||||
</el-form-item> |
||||
<el-form-item label="反馈时间" prop="feedbackTime"> |
||||
<el-date-picker v-model="queryParams.feedbackTime" clearable type="date" value-format="yyyy-MM-dd" placeholder="请选择反馈时间" /> |
||||
</el-form-item> |
||||
<el-form-item label="是否联系" prop="isContact"> |
||||
<el-input v-model="queryParams.isContact" placeholder="请输入是否联系" clearable @keyup.enter.native="handleQuery" /> |
||||
</el-form-item> |
||||
<el-form-item label="到场时间" prop="arrivalTime"> |
||||
<el-date-picker v-model="queryParams.arrivalTime" clearable type="date" value-format="yyyy-MM-dd" placeholder="请选择到场时间" /> |
||||
</el-form-item> |
||||
<el-form-item> |
||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> |
||||
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button> |
||||
</el-form-item> |
||||
</el-form> |
||||
|
||||
<el-row :gutter="10" class="mb8"> |
||||
<el-col :span="1.5"> |
||||
<el-button v-hasPermi="['system:feedback:add']" type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd">新增</el-button> |
||||
</el-col> |
||||
<el-col :span="1.5"> |
||||
<el-button v-hasPermi="['system:feedback:edit']" type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate">修改</el-button> |
||||
</el-col> |
||||
<el-col :span="1.5"> |
||||
<el-button v-hasPermi="['system:feedback:remove']" type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete">删除</el-button> |
||||
</el-col> |
||||
<el-col :span="1.5"> |
||||
<el-button v-hasPermi="['system:feedback:export']" type="warning" plain icon="el-icon-download" size="mini" @click="handleExport">导出</el-button> |
||||
</el-col> |
||||
<right-toolbar :show-search.sync="showSearch" @queryTable="getList" /> |
||||
</el-row> |
||||
|
||||
<el-table v-loading="loading" :data="feedbackList" @selection-change="handleSelectionChange"> |
||||
<el-table-column type="selection" width="55" align="center" /> |
||||
<el-table-column label="${comment}" align="center" prop="feedbackId" /> |
||||
<el-table-column label="线索id" align="center" prop="clueId" /> |
||||
<el-table-column label="反馈类型 1 跟进反馈 2 到场负反馈" align="center" prop="feedbackType" /> |
||||
<el-table-column label="教练id" align="center" prop="coachId" /> |
||||
<el-table-column label="反馈内容" align="center" prop="content" /> |
||||
<el-table-column label="反馈时间" align="center" prop="feedbackTime" width="180"> |
||||
<template slot-scope="scope"> |
||||
<span>{{ parseTime(scope.row.feedbackTime, '{y}-{m}-{d}') }}</span> |
||||
</template>00000000000000000000000 |
||||
</el-table-column> |
||||
<el-table-column label="是否联系" align="center" prop="isContact" /> |
||||
<el-table-column label="到场时间" align="center" prop="arrivalTime" width="180"> |
||||
<template slot-scope="scope"> |
||||
<span>{{ parseTime(scope.row.arrivalTime, '{y}-{m}-{d}') }}</span> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column label="到场状态" align="center" prop="arrivalStatus" /> |
||||
<el-table-column label="备注" align="center" prop="remark" /> |
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> |
||||
<template slot-scope="scope"> |
||||
<el-button v-hasPermi="['system:feedback:edit']" size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)">修改</el-button> |
||||
<el-button v-hasPermi="['system:feedback:remove']" size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)">删除</el-button> |
||||
</template> |
||||
</el-table-column> |
||||
</el-table> |
||||
|
||||
<pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" /> |
||||
|
||||
<!-- 添加或修改线索反馈对话框 --> |
||||
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body> |
||||
<el-form ref="form" :model="form" :rules="rules" label-width="80px"> |
||||
<el-form-item label="线索id" prop="clueId"> |
||||
<el-input v-model="form.clueId" placeholder="请输入线索id" /> |
||||
</el-form-item> |
||||
<el-form-item label="教练id" prop="coachId"> |
||||
<el-input v-model="form.coachId" placeholder="请输入教练id" /> |
||||
</el-form-item> |
||||
<el-form-item label="反馈内容"> |
||||
<editor v-model="form.content" :min-height="192" /> |
||||
</el-form-item> |
||||
<el-form-item label="反馈时间" prop="feedbackTime"> |
||||
<el-date-picker v-model="form.feedbackTime" clearable type="date" value-format="yyyy-MM-dd" placeholder="请选择反馈时间" /> |
||||
</el-form-item> |
||||
<el-form-item label="是否联系" prop="isContact"> |
||||
<el-input v-model="form.isContact" placeholder="请输入是否联系" /> |
||||
</el-form-item> |
||||
<el-form-item label="到场时间" prop="arrivalTime"> |
||||
<el-date-picker v-model="form.arrivalTime" clearable type="date" value-format="yyyy-MM-dd" placeholder="请选择到场时间" /> |
||||
</el-form-item> |
||||
<el-form-item label="备注" prop="remark"> |
||||
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" /> |
||||
</el-form-item> |
||||
</el-form> |
||||
<div slot="footer" class="dialog-footer"> |
||||
<el-button type="primary" @click="submitForm">确 定</el-button> |
||||
<el-button @click="cancel">取 消</el-button> |
||||
</div> |
||||
</el-dialog> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import { listFeedback, getFeedback, delFeedback, addFeedback, updateFeedback } from '@/api/zs/feedback'; |
||||
|
||||
export default { |
||||
name: 'Feedback', |
||||
data () { |
||||
return { |
||||
// 遮罩层 |
||||
loading: true, |
||||
// 选中数组 |
||||
ids: [], |
||||
// 非单个禁用 |
||||
single: true, |
||||
// 非多个禁用 |
||||
multiple: true, |
||||
// 显示搜索条件 |
||||
showSearch: true, |
||||
// 总条数 |
||||
total: 0, |
||||
// 线索反馈表格数据 |
||||
feedbackList: [], |
||||
// 弹出层标题 |
||||
title: '', |
||||
// 是否显示弹出层 |
||||
open: false, |
||||
// 查询参数 |
||||
queryParams: { |
||||
pageNum: 1, |
||||
pageSize: 10, |
||||
clueId: null, |
||||
feedbackType: null, |
||||
coachId: null, |
||||
content: null, |
||||
feedbackTime: null, |
||||
isContact: null, |
||||
arrivalTime: null, |
||||
arrivalStatus: null |
||||
}, |
||||
// 表单参数 |
||||
form: {}, |
||||
// 表单校验 |
||||
rules: { |
||||
} |
||||
}; |
||||
}, |
||||
created () { |
||||
this.getList(); |
||||
}, |
||||
methods: { |
||||
/** 查询线索反馈列表 */ |
||||
getList () { |
||||
this.loading = true; |
||||
listFeedback(this.queryParams).then(response => { |
||||
this.feedbackList = response.rows; |
||||
this.total = response.total; |
||||
this.loading = false; |
||||
}); |
||||
}, |
||||
// 取消按钮 |
||||
cancel () { |
||||
this.open = false; |
||||
this.reset(); |
||||
}, |
||||
// 表单重置 |
||||
reset () { |
||||
this.form = { |
||||
feedbackId: null, |
||||
clueId: null, |
||||
feedbackType: null, |
||||
coachId: null, |
||||
content: null, |
||||
feedbackTime: null, |
||||
isContact: null, |
||||
arrivalTime: null, |
||||
arrivalStatus: 0, |
||||
remark: null |
||||
}; |
||||
this.resetForm('form'); |
||||
}, |
||||
/** 搜索按钮操作 */ |
||||
handleQuery () { |
||||
this.queryParams.pageNum = 1; |
||||
this.getList(); |
||||
}, |
||||
/** 重置按钮操作 */ |
||||
resetQuery () { |
||||
this.resetForm('queryForm'); |
||||
this.handleQuery(); |
||||
}, |
||||
// 多选框选中数据 |
||||
handleSelectionChange (selection) { |
||||
this.ids = selection.map(item => item.feedbackId); |
||||
this.single = selection.length !== 1; |
||||
this.multiple = !selection.length; |
||||
}, |
||||
/** 新增按钮操作 */ |
||||
handleAdd () { |
||||
this.reset(); |
||||
this.open = true; |
||||
this.title = '添加线索反馈'; |
||||
}, |
||||
/** 修改按钮操作 */ |
||||
handleUpdate (row) { |
||||
this.reset(); |
||||
const feedbackId = row.feedbackId || this.ids; |
||||
getFeedback(feedbackId).then(response => { |
||||
this.form = response.data; |
||||
this.open = true; |
||||
this.title = '修改线索反馈'; |
||||
}); |
||||
}, |
||||
/** 提交按钮 */ |
||||
submitForm () { |
||||
this.$refs['form'].validate(valid => { |
||||
if (valid) { |
||||
if (this.form.feedbackId != null) { |
||||
updateFeedback(this.form).then(response => { |
||||
this.$modal.msgSuccess('修改成功'); |
||||
this.open = false; |
||||
this.getList(); |
||||
}); |
||||
} else { |
||||
addFeedback(this.form).then(response => { |
||||
this.$modal.msgSuccess('新增成功'); |
||||
this.open = false; |
||||
this.getList(); |
||||
}); |
||||
} |
||||
} |
||||
}); |
||||
}, |
||||
/** 删除按钮操作 */ |
||||
handleDelete (row) { |
||||
const feedbackIds = row.feedbackId || this.ids; |
||||
this.$modal.confirm('是否确认删除线索反馈编号为"' + feedbackIds + '"的数据项?').then(function () { |
||||
return delFeedback(feedbackIds); |
||||
}).then(() => { |
||||
this.getList(); |
||||
this.$modal.msgSuccess('删除成功'); |
||||
}).catch(() => { }); |
||||
}, |
||||
/** 导出按钮操作 */ |
||||
handleExport () { |
||||
this.download('system/feedback/export', { |
||||
...this.queryParams |
||||
}, `feedback_${new Date().getTime()}.xlsx`); |
||||
} |
||||
} |
||||
}; |
||||
</script> |
@ -0,0 +1,104 @@ |
||||
<template> |
||||
<!-- 结算对话框 --> |
||||
<el-dialog v-if="visible" v-loading="signLoading" title="结算" :visible.sync="visible" width="600px" append-to-body :close-on-click-modal="false" style> |
||||
<el-form ref="modalForm" :model="modalForm" :rules="modalRules" label-width="110px" > |
||||
<el-row> |
||||
|
||||
<!-- <el-col :span="24"> |
||||
<el-form-item label="学员姓名" prop="name"> |
||||
<el-input v-model="modalForm.name" :disabled="modalForm.clueId != undefined" /> |
||||
</el-form-item> |
||||
</el-col> --> |
||||
<el-col :span="24"> |
||||
<el-form-item label="结算金额" prop="settlementMoney"> |
||||
<el-input v-model="modalForm.settlementMoney" /> |
||||
</el-form-item> |
||||
</el-col> |
||||
</el-row> |
||||
</el-form> |
||||
<span slot="footer"> |
||||
<el-button @click="visible = false">取 消</el-button> |
||||
<el-button type="primary" :disabled="!canSubmit" @click="handleSubmit">提 交</el-button> |
||||
</span> |
||||
</el-dialog> |
||||
</template> |
||||
|
||||
<script> |
||||
import { updateSign } from '@/api/zs/sign'; |
||||
import { validateMoney } from '@/utils/validate'; |
||||
|
||||
export default { |
||||
name: 'SettlementDialog', |
||||
data() { |
||||
return { |
||||
admin: localStorage.getItem('admin'), |
||||
preUrl: process.env.VUE_APP_BASE_API, |
||||
userId: localStorage.getItem('userId'), |
||||
visible: false, |
||||
signLoading: false, |
||||
modalForm: {}, |
||||
modalRules: { |
||||
settlementMoney: [{ required: true, message: '结算金额不为空', trigger: 'blur' }, |
||||
{ required: true, validator: validateMoney, trigger: 'blur' }] |
||||
}, |
||||
}; |
||||
}, |
||||
methods: { |
||||
init(info = undefined) { |
||||
this.canSubmit = true; |
||||
this.$nextTick(() => { |
||||
this.resetForm('modalForm'); |
||||
if (info && info.signId) { |
||||
this.modalForm = {... info} |
||||
} |
||||
this.visible = true; |
||||
}); |
||||
}, |
||||
// 重置表单 |
||||
resetForm() { |
||||
this.modalForm = { |
||||
signId: undefined, |
||||
settlementMoney: undefined, |
||||
}; |
||||
}, |
||||
handleSubmit() { |
||||
// 保存结算表 |
||||
this.$refs.modalForm.validate((valid) => { |
||||
if (valid) { |
||||
this.canSubmit = false; |
||||
updateSign(this.modalForm).then((resp) => { |
||||
if (resp.code == 200) { |
||||
this.$message.success('提交成功'); |
||||
this.visible = false; |
||||
this.$emit('refreshDataList'); |
||||
} else { |
||||
this.canSubmit = true; |
||||
} |
||||
}); |
||||
} |
||||
}); |
||||
}, |
||||
|
||||
} |
||||
}; |
||||
</script> |
||||
|
||||
<style scoped> |
||||
.demo-image__item { |
||||
width: 100px; |
||||
height: 100px; |
||||
display: inline-block; |
||||
} |
||||
|
||||
.image-list-item { |
||||
width: 100%; |
||||
height: 100%; |
||||
} |
||||
|
||||
.el-upload--picture-card { |
||||
width: 100px !important; |
||||
height: 100px !important; |
||||
} |
||||
</style> |
||||
|
||||
|