Compare commits
14 Commits
Author | SHA1 | Date |
---|---|---|
|
205e2c7ae5 | 2 years ago |
|
2aabff2e90 | 2 years ago |
|
185163d326 | 2 years 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' |
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 |
NODE_ENV = production |
||||||
|
|
||||||
# 测试环境配置 |
# 测试环境配置 |
||||||
ENV = 'staging' |
ENV = 'staging' |
||||||
|
|
||||||
# 寻驾招生管理系统/测试环境 |
# 开心学车管理系统/测试环境 |
||||||
VUE_APP_BASE_API = '/stage-api' |
VUE_APP_BASE_API = '/stage-api' |
||||||
|
Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 137 KiB After Width: | Height: | Size: 5.5 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,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 |
After Width: | Height: | Size: 5.5 KiB |
@ -1,155 +0,0 @@ |
|||||||
<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"> |
|
||||||
<el-form-item label="利润类型" prop="profitType"> |
|
||||||
<el-radio-group v-model="dialogForm.profitType" @change="profitTypeChange"> |
|
||||||
<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="profitParam"> |
|
||||||
<el-input v-show="dialogForm.profitType != 3" v-model="dialogForm.profitParam" maxlength="100" |
|
||||||
placeholder="请输入" clearable /> |
|
||||||
<div v-show="dialogForm.profitType == 3" style="text-align: center;"> |
|
||||||
<el-table :data="dialogForm.profitParamVOList" stripe border> |
|
||||||
<el-table-column label="下限" > |
|
||||||
<template slot-scope="scope"> |
|
||||||
<el-form-item :prop="'profitParamVOList.' + scope.$index + '.min'" :rules="dataRule['min']"> |
|
||||||
<el-input v-model="scope.row.min" placeholder="请输入" clearable type="number" /> |
|
||||||
</el-form-item> |
|
||||||
</template> |
|
||||||
</el-table-column> |
|
||||||
<el-table-column label="上限" > |
|
||||||
<template slot-scope="scope"> |
|
||||||
<el-form-item :prop="'profitParamVOList.' + scope.$index + '.max'" :rules="dataRule['max']"> |
|
||||||
<el-input v-model="scope.row.max" placeholder="请输入" clearable type="number" /> |
|
||||||
</el-form-item> |
|
||||||
</template> |
|
||||||
</el-table-column> |
|
||||||
<el-table-column label="利润" > |
|
||||||
<template slot-scope="scope"> |
|
||||||
<el-form-item :prop="'profitParamVOList.' + scope.$index + '.profit'" :rules="dataRule['profit']"> |
|
||||||
<el-input v-model="scope.row.profit" placeholder="请输入" clearable type="number" /> |
|
||||||
</el-form-item> |
|
||||||
</template> |
|
||||||
</el-table-column> |
|
||||||
<el-table-column label="操作" fixed="right" width="130"> |
|
||||||
<template slot-scope="scope"> |
|
||||||
<el-button @click="handleProfitParamDelete(scope.$index)">删除</el-button> |
|
||||||
</template> |
|
||||||
</el-table-column> |
|
||||||
</el-table> |
|
||||||
<el-button plain @click="handleAddProfitParam">新增</el-button> |
|
||||||
</div> |
|
||||||
</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 { batchUpdateProfit } from '@/api/sch/classType'; |
|
||||||
|
|
||||||
export default { |
|
||||||
name: 'ProfitSettingDialog', |
|
||||||
data() { |
|
||||||
return { |
|
||||||
visible: false, |
|
||||||
canSubmit: true, |
|
||||||
dialogForm: { |
|
||||||
typeIds: undefined, |
|
||||||
profitType: 1, |
|
||||||
profitParam: undefined, |
|
||||||
remark: undefined, |
|
||||||
profitParamVOList: [{ |
|
||||||
min: 0, |
|
||||||
max: undefined, |
|
||||||
profit: undefined |
|
||||||
}] |
|
||||||
}, |
|
||||||
dataRule: { |
|
||||||
profitType: [{ required: true, message: '利润类型不能为空', trigger: 'blur' }], |
|
||||||
min: [{ required: true, message: '上限不能为空', trigger: 'blur' }], |
|
||||||
max: [{ required: true, message: '下限不能为空', trigger: 'blur' }], |
|
||||||
profit: [{ required: true, message: '利润不能为空', trigger: 'blur' }] |
|
||||||
|
|
||||||
} |
|
||||||
}; |
|
||||||
}, |
|
||||||
methods: { |
|
||||||
init(info = undefined) { |
|
||||||
// debugger |
|
||||||
this.visible = true; |
|
||||||
this.canSubmit = true; |
|
||||||
this.$nextTick(() => { |
|
||||||
this.resetDialogForm(); |
|
||||||
this.$refs['dialogForm'].resetFields(); |
|
||||||
if (info) { |
|
||||||
this.dialogForm = { ...this.dialogForm, ...info }; |
|
||||||
} |
|
||||||
}); |
|
||||||
}, |
|
||||||
resetDialogForm() { |
|
||||||
this.dialogForm = { |
|
||||||
typeIds: undefined, |
|
||||||
profitType: 1, |
|
||||||
profitParam: undefined, |
|
||||||
remark: undefined, |
|
||||||
profitParamVOList: [] |
|
||||||
}; |
|
||||||
}, |
|
||||||
closeDialog() { |
|
||||||
this.$emit('update:dialogVisible', false); |
|
||||||
}, |
|
||||||
handleAddProfitParam() { |
|
||||||
this.dialogForm.profitParamVOList.push({ |
|
||||||
min: 0, |
|
||||||
max: undefined, |
|
||||||
profit: undefined |
|
||||||
}); |
|
||||||
}, |
|
||||||
handleProfitParamDelete(index) { |
|
||||||
console.log(index); |
|
||||||
this.dialogForm.profitParamVOList.splice(index, 1); |
|
||||||
}, |
|
||||||
profitTypeChange(type) { |
|
||||||
if (type == 3) { |
|
||||||
this.dialogForm.profitParamVOList.push({ |
|
||||||
min: 0, |
|
||||||
max: undefined, |
|
||||||
profit: undefined |
|
||||||
}); |
|
||||||
} else { |
|
||||||
this.$set(this.dialogForm, "profitParamVOList", []); |
|
||||||
} |
|
||||||
}, |
|
||||||
// 表单提交 |
|
||||||
dialogFormSubmit() { |
|
||||||
this.$refs.dialogForm.validate((valid) => { |
|
||||||
if (valid) { |
|
||||||
this.canSubmit = false; |
|
||||||
// 校验完成,调接口 |
|
||||||
batchUpdateProfit(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,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,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,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> |
||||||
|
|
||||||
|
|