接待人场地

caozong
zcx 1 year ago
parent 72d19bfb02
commit fc2404a5b8
  1. BIN
      public/favicon.ico
  2. BIN
      public/favicon2.ico
  3. BIN
      public/logo.png
  4. BIN
      public/logo1.png
  5. 8
      src/api/zs/clue.js
  6. 19
      src/api/zs/feedbackDetail.js
  7. BIN
      src/assets/logo/logo.png
  8. BIN
      src/assets/logo/logo2.png
  9. 30
      src/views/sch/coach/components/CoachForm.vue
  10. 62
      src/views/sch/coach/count/detail.vue
  11. 68
      src/views/sch/coach/count/index.vue
  12. 10
      src/views/sch/coach/index.vue
  13. 4
      src/views/system/dept/index.vue
  14. 4
      src/views/system/employee/index.vue
  15. 43
      src/views/zs/clue/components/FollowCountDialog.vue
  16. 3
      src/views/zs/clue/components/InvitationFormDialog.vue
  17. 13
      src/views/zs/clue/index.vue
  18. 4
      src/views/zs/feedback/arrival.vue

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

@ -210,3 +210,11 @@ export function saveCluePlace(data) {
data: data data: data
}); });
} }
export function getFollowCount() {
return request({
url: `/zs/clue/follow/count`,
method: 'get'
});
}

@ -72,3 +72,22 @@ export function delFeedbackDetail(feedbackId) {
method: 'delete' 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
})
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

@ -3,16 +3,12 @@
<el-dialog title="接待人信息" :close-on-click-modal="false" append-to-body :visible.sync="visible" width="600px" @close="closeDialog"> <el-dialog title="接待人信息" :close-on-click-modal="false" append-to-body :visible.sync="visible" width="600px" @close="closeDialog">
<div> <div>
<el-form ref="dialogForm" :model="dialogForm" :rules="dataRule" label-position="top" @keyup.enter.native="dialogFormSubmit()"> <el-form ref="dialogForm" :model="dialogForm" :rules="dataRule" label-position="top" @keyup.enter.native="dialogFormSubmit()">
<el-form-item label="所属驾校" prop="schoolId"> <!-- <el-form-item label="所属驾校" prop="schoolId">
<el-select v-model="dialogForm.schoolId" filterable placeholder="请选择" value-key="schoolId" clearable size="small" style="width:100%"> <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-option v-for="(dict, index) in schoolOptions" :key="index" :label="dict.schoolName" :value="dict.schoolId" />
</el-select> </el-select>
</el-form-item> </el-form-item> -->
<el-form-item label="所属场地" prop="placeId">
<el-select v-model="dialogForm.placeId" filterable placeholder="请选择" clearable value-key="placeId" size="small" style="width:100%">
<el-option v-for="(dict, index) in placeOptions.filter(item => item.schoolId === dialogForm.schoolId)" :key="index" :label="dict.name" :value="dict.placeId" />
</el-select>
</el-form-item>
<el-form-item label="接待人" prop="coachName"> <el-form-item label="接待人" prop="coachName">
<el-input v-model="dialogForm.coachName" placeholder="请输入教练名" /> <el-input v-model="dialogForm.coachName" placeholder="请输入教练名" />
</el-form-item> </el-form-item>
@ -22,6 +18,11 @@
<el-form-item label="微信openid" prop="openId"> <el-form-item label="微信openid" prop="openId">
<el-input v-model="dialogForm.openId" placeholder="请输入微信openid" /> <el-input v-model="dialogForm.openId" placeholder="请输入微信openid" />
</el-form-item> </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> </el-form>
</div> </div>
@ -53,18 +54,19 @@ export default {
dialogForm: { dialogForm: {
coachId: null, coachId: null,
deptId: null, deptId: null,
schoolId: null, // schoolId: null,
placeId: null, placeIdList: null,
placeNames: null,
coachName: null, coachName: null,
phone: null, phone: null,
openId: null openId: null
}, },
dataRule: { dataRule: {
schoolId: [{ required: true, message: '所属驾校不能为空', trigger: 'blur' }], // schoolId: [{ required: true, message: '', trigger: 'blur' }],
placeId: [{ required: true, message: '场地不能为空', trigger: 'blur' }], placeIdList: [{ required: true, message: '负责场地不能为空', trigger: 'blur' }],
coachName: [{ required: true, message: '教练名不能为空', trigger: 'blur' }], coachName: [{ required: true, message: '教练名不能为空', trigger: 'blur' }],
phone: [{ required: true, message: '联系方式不能为空', trigger: 'blur' }] phone: [{ required: true, message: '联系方式不能为空', trigger: 'blur' }],
openId: [{ required: true, message: '微信openId不能为空', trigger: 'blur' }]
} }
}; };
}, },
@ -85,7 +87,7 @@ export default {
coachId: null, coachId: null,
deptId: null, deptId: null,
schoolId: null, schoolId: null,
placeId: null, placeIdList: null,
coachName: null, coachName: null,
phone: null, phone: null,
openId: null openId: null

@ -1,37 +1,45 @@
<!-- 接待人员详情页 --> <!-- 接待人员详情页 -->
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form v-show="showSearch" ref="queryForm" :model="queryParams" size="small" :inline="true" label-width="68px"> <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-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> <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-item>
</el-form> </el-form>
<el-table v-loading="loading" :data="coachList"> <el-table v-loading="loading" :data="coachList">
<el-table-column type="index" width="55" align="center" /> <el-table-column type="index" width="55" align="center" />
<el-table-column label="学员姓名" align="center" prop="schoolName" /> <el-table-column label="学员姓名" align="center" prop="name" />
<el-table-column label="联系方式" align="center" prop="placeName" /> <el-table-column label="联系方式" align="center" prop="phone" />
<el-table-column label="到场状态" align="center" prop="coachName" /> <el-table-column label="到场状态" align="center" prop="arrivalStatus" />
<el-table-column label="备注" align="center" prop="phone" /> <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="['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> </el-table>
</div> </div>
</template> </template>
<script> <script>
import { listCoach, getCoach, delCoach } from '@/api/sch/coach'; import { getCountDetail} from '@/api/zs/feedbackDetail';
export default { export default {
data() { data() {
return { return {
// //
loading: true, loading: false,
//
showSearch: true,
// //
total: 0, total: 0,
// //
@ -39,18 +47,32 @@ export default {
// //
queryParams: { queryParams: {
type: null, // 1 2 type: null, // 1 2
placeId: null, coachId: null,
coachName: null, arrivalStatusList: undefined
phone: null
} }
}; };
}, },
created() { 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: { methods: {
/** 查询教练列表 */ /** 查询教练列表 */
getList() { 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()
} }
} }
}; };

@ -1,40 +1,43 @@
<template> <template>
<!-- 接待人统计页面 --> <!-- 接待人统计页面 -->
<div class="app-container" style="max-width: 600px; margin: auto;"> <div class="app-container" style="max-width: 600px; margin: auto;">
<el-form v-show="showSearch" ref="queryForm" :model="queryParams" size="small" :inline="true" label-width="68px"> <el-form ref="queryForm" :model="queryParams" size="small" :inline="true" label-width="68px" style="text-align: center;">
<el-form-item label="联系方式" prop="phone"> <el-form-item label="手机号" prop="phone">
<el-input v-model="queryParams.phone" placeholder="请输入联系方式" clearable @keyup.enter.native="handleQuery" /> <el-input v-model="queryParams.phone" placeholder="请输入手机号" clearable @keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="验证码" prop="code"> <!-- <el-form-item label="验证码" prop="code">
<el-input v-model="queryParams.code" placeholder="请输入验证码" clearable @keyup.enter.native="handleQuery" /> <el-input v-model="queryParams.code" placeholder="请输入验证码" clearable @keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item> -->
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">查询</el-button> <el-button type="primary" icon="el-icon-search" size="mini" @click="getCount">查询</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-card class="box-card"> <el-card class="box-card" v-if="show">
<div slot="header" class="clearfix"> <div slot="header" class="clearfix" style="text-align: center;">
<span>接待统计</span> <span>接待统计</span>
</div> </div>
<div> <div>
<div><span>今日接到人数100</span></div> <div><span>今日接到人数{{countInfo.todayTotal == undefined ? 0 : countInfo.todayTotal}}</span></div>
<div><span>今日成交人数69</span></div> <div><span>今日成交人数{{countInfo.todaySuccess == undefined ? 0 : countInfo.todaySuccess}}</span></div>
<div><span>今日未成交人数31</span> <div><span>今日未成交人数{{countInfo.todayUnSuccess == undefined ? 0 : countInfo.todayUnSuccess}}</span>
<router-link :to="'/coach/count/detail'"> 详情</router-link> <router-link :to="'/coach/count/detail?coachId=' + coachId +'&type=1'" style="color: blue;"> 详情</router-link>
</div> </div>
</div> </div>
<el-divider></el-divider>
<div> <div>
<div><span>本月接到人数200</span></div> <div><span>本月接到人数{{countInfo.monthTotal}}</span></div>
<div><span>本月成交人数169</span></div> <div><span>本月成交人数{{countInfo.monthSuccess}}</span></div>
<div><span>本月未成交人数31</span></div> <div><span>本月未成交人数{{countInfo.monthUnSuccess}}</span>
<router-link :to="'/coach/count/detail?coachId=' + coachId+'&type=2'" style="color: blue;"> 详情</router-link>
</div>
</div> </div>
</el-card> </el-card>
</div> </div>
</template> </template>
<script> <script>
import { listCoach, delCoach } from '@/api/sch/coach'; import { getCount} from '@/api/zs/feedbackDetail';
export default { export default {
name: 'Count', name: 'Count',
@ -47,16 +50,41 @@ export default {
phone: null, phone: null,
code: null code: null
}, },
countInfo: {} countInfo: {
todayTotal: 0,
todaySuccess: 0,
todayUnSuccess:0,
monthTotal: 0,
monthSuccess: 0,
monthUnSuccess:0
},
coachId: undefined,
show:false
}; };
}, },
created() {
},
methods: { methods: {
/** 查询统计结果 */ /** 查询统计结果 */
getList() { getCount() {
this.resetCount();
this.loading = true; 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
}
} }
} }
}; };

@ -1,14 +1,9 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form v-show="showSearch" ref="queryForm" :model="queryParams" size="small" :inline="true" label-width="68px"> <el-form v-show="showSearch" ref="queryForm" :model="queryParams" size="small" :inline="true" label-width="68px">
<el-form-item label="所属驾校" prop="schoolId">
<el-select v-model="queryParams.schoolId" filterable placeholder="请选择" value-key="schoolId" clearable size="small">
<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="placeId"> <el-form-item label="所属场地" prop="placeId">
<el-select v-model="queryParams.placeId" filterable placeholder="请选择" clearable value-key="placeId" size="small"> <el-select v-model="queryParams.placeId" filterable placeholder="请选择" clearable value-key="placeId" size="small">
<el-option v-for="(dict, index) in placeOptions.filter(item => item.schoolId === queryParams.schoolId)" :key="index" :label="dict.name" :value="dict.placeId" /> <el-option v-for="(dict, index) in placeOptions" :key="index" :label="dict.name" :value="dict.placeId" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="接待人" prop="coachName"> <el-form-item label="接待人" prop="coachName">
@ -32,10 +27,9 @@
<el-table v-loading="loading" :data="coachList"> <el-table v-loading="loading" :data="coachList">
<el-table-column type="index" width="55" align="center" /> <el-table-column type="index" width="55" align="center" />
<el-table-column label="所属驾校" align="center" prop="schoolName" />
<el-table-column label="所属场地" align="center" prop="placeName" />
<el-table-column label="接待人" align="center" prop="coachName" /> <el-table-column label="接待人" align="center" prop="coachName" />
<el-table-column label="联系方式" align="center" prop="phone" /> <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="微信openid" align="center" prop="openId" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope"> <template slot-scope="scope">

@ -79,13 +79,13 @@
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <!-- <el-col :span="12">
<el-form-item label="所属区域" prop="areaList"> <el-form-item label="所属区域" prop="areaList">
<el-select v-model="form.areaList" placeholder="请选择" filterable multiple> <el-select v-model="form.areaList" placeholder="请选择" filterable multiple>
<el-option label="区域1" :value="1" /> <el-option label="区域1" :value="1" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col> -->
<el-col :span="24"> <el-col :span="24">
<el-form-item label="备注"> <el-form-item label="备注">
<el-input v-model="form.remark" placeholder="请输入" type="textarea" :autosize="{ minRows: 3 }" /> <el-input v-model="form.remark" placeholder="请输入" type="textarea" :autosize="{ minRows: 3 }" />

@ -166,12 +166,14 @@
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="24">
<el-form-item label="数据权限" prop="openId">
<el-radio-group v-model="form.dataScope"> <el-radio-group v-model="form.dataScope">
<el-radio :label="1">全部数据</el-radio> <el-radio :label="1">全部数据</el-radio>
<el-radio :label="2">部门数据</el-radio> <el-radio :label="2">部门数据</el-radio>
<el-radio :label="3">个人数据</el-radio> <el-radio :label="3">个人数据</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item>
</el-col> </el-col>
</el-row> </el-row>

@ -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>

@ -8,7 +8,7 @@
<el-input v-model="dialogForm.phone" placeholder="请输入联系方式" /> <el-input v-model="dialogForm.phone" placeholder="请输入联系方式" />
</el-form-item> </el-form-item>
<el-form-item label="场地" prop="placeId"> <el-form-item label="场地" prop="placeId">
<el-select v-model="dialogForm.placeId" filterable placeholder="请选择" clearable style="width: 100%;" @change="getCoaChes"> <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-option v-for="dict in placeOptions" :key="dict.placeId" :label="dict.name" :value="dict.placeId" />
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -25,7 +25,6 @@
<el-input v-model="dialogForm.remark" type="textarea" placeholder="请输入" /> <el-input v-model="dialogForm.remark" type="textarea" placeholder="请输入" />
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-form>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<el-button plain @click="(visible = false)">取消</el-button> <el-button plain @click="(visible = false)">取消</el-button>
<el-button v-jclick type="primary" :disabled="!canSubmit" @click="dialogFormSubmit()">确定</el-button> <el-button v-jclick type="primary" :disabled="!canSubmit" @click="dialogFormSubmit()">确定</el-button>

@ -14,6 +14,7 @@
<el-button v-hasPermi="['zs:clue:edit']" icon="el-icon-edit" type="primary" :disabled="multiple" @click="handleBatChUpdate()">批量修改</el-button> <el-button v-hasPermi="['zs:clue:edit']" icon="el-icon-edit" type="primary" :disabled="multiple" @click="handleBatChUpdate()">批量修改</el-button>
<el-button type="primary" @click="handlePublicClue">公海</el-button> <el-button type="primary" @click="handlePublicClue">公海</el-button>
<el-button type="primary" @click="handleSkill">关键话术</el-button> <el-button type="primary" @click="handleSkill">关键话术</el-button>
<el-button type="primary" @click="handleFollowCount">跟进统计</el-button>
</el-col> </el-col>
<right-toolbar :show-search.sync="showSearch" :columns="columns" @queryTable="_getTableList" /> <right-toolbar :show-search.sync="showSearch" :columns="columns" @queryTable="_getTableList" />
@ -70,6 +71,8 @@
<SkillDialog ref="SkillDialog" /> <SkillDialog ref="SkillDialog" />
<!-- 邀约弹窗 --> <!-- 邀约弹窗 -->
<InvitationFormDialog ref="InvitationDialog" @refreshDataList="_getTableList"/> <InvitationFormDialog ref="InvitationDialog" @refreshDataList="_getTableList"/>
<!-- 跟进统计弹窗 -->
<FollowCountDialog ref="FollowCountDialog" />
</div> </div>
</template> </template>
@ -85,6 +88,7 @@ import MemoFormDialog from './components/MemoFormDialog.vue';
import DYClueFormDialog from './components/DYClueFormDialog.vue'; import DYClueFormDialog from './components/DYClueFormDialog.vue';
import SkillDialog from './components/SkillDialog.vue'; import SkillDialog from './components/SkillDialog.vue';
import InvitationFormDialog from './components/InvitationFormDialog.vue'; import InvitationFormDialog from './components/InvitationFormDialog.vue';
import FollowCountDialog from './components/FollowCountDialog.vue';
import { defaultColumns } from './columns.js'; import { defaultColumns } from './columns.js';
import { getClueList, deleteClue, getClueCountBadge, discardClue, getSign, getConsultRecord } from '@/api/zs/clue'; import { getClueList, deleteClue, getClueCountBadge, discardClue, getSign, getConsultRecord } from '@/api/zs/clue';
@ -93,7 +97,7 @@ export default {
name: 'Clue', name: 'Clue',
components: { components: {
SearchForm, BatchUpdateDialog, PublicDialog, UploadDialog, SignFormDialog, DistributeFormDialog, ZhuangDanDialog, MemoFormDialog, SearchForm, BatchUpdateDialog, PublicDialog, UploadDialog, SignFormDialog, DistributeFormDialog, ZhuangDanDialog, MemoFormDialog,
DYClueFormDialog, SkillDialog,InvitationFormDialog DYClueFormDialog, SkillDialog,InvitationFormDialog,FollowCountDialog
}, },
beforeRouteEnter (to, from, next) { beforeRouteEnter (to, from, next) {
if (from.name == 'ClueForm') { if (from.name == 'ClueForm') {
@ -331,6 +335,13 @@ export default {
this.$refs.InvitationDialog.init(item) this.$refs.InvitationDialog.init(item)
}) })
},
//
handleFollowCount(){
this.$nextTick(() => {
this.$refs.FollowCountDialog.init()
})
} }
} }
}; };

@ -45,7 +45,9 @@ export default {
// //
loading: true, loading: true,
// //
form: {}, form: {
},
// //
rules: { rules: {
}, },

Loading…
Cancel
Save