Commit 13ea9508 authored by 华国豪's avatar 华国豪 🙄

Merge branch 'master' of http://gitlab.oytour.com/huaguohao/crm

parents 6ffebcc7 77764a1e
......@@ -30,7 +30,7 @@ export default {
@import './assets/css/tablevoerride.css';
@import './assets/global/font.css';
@import '//at.alicdn.com/t/font_1627123_j29h6a48r8m.css';
@import '//at.alicdn.com/t/font_1627123_98ft13ltmlv.css';
@import url('//at.alicdn.com/t/font_1627123_grz80mbm3sv.css');
/* @import './assets/css/common.css'; */
@import './assets/css/init.css';
......
......@@ -19,7 +19,7 @@
</div> -->
<div class="rightmenu">
<!-- <el-button class="crm-btn query-btn" @click="getList">查询</el-button> -->
<el-button icon="el-icon-plus" class="crm-btn org-btn" @click="CustomerId = 0, dialogTableVisibleName = '新建直客', dialogTableVisible=true">发送生日祝福涵</el-button>
<el-button icon="el-icon-present" class="crm-btn org-btn" @click="addSendMsg.isAll=true;addSendMsg.sendObj='所有客户',transferVisible=true">发送生日祝福涵</el-button>
<!-- <el-dropdown>
<el-button class="crm-btn crm-btn-more easy-btn margin-right0">
<i class="iconfont icongengduo"></i>
......@@ -33,7 +33,7 @@
</div>
<div class="query-box" :style="{'padding-bottom': sceneList.length > 0 ? '0px' : '10px'}">
<el-row v-if="!multipleSelection.length" :gutter="30">
<el-col :span="4">
<!-- <el-col :span="4">
<span class="font-size-12" style="padding-right: 10px">场景</span>
<el-popover
placement="bottom"
......@@ -64,22 +64,27 @@
</el-option>
</el-select>
</el-popover>
</el-col>
<el-col :span="4">
<span class="font-size-12" style="padding-right: 10px">客户类型</span>
<el-select size="mini" v-model="msg.CustomerType" placeholder="请选择" @change="getList">
<el-option key="0" label="客户" :value="0"></el-option>
<el-option key="1" label="直客" :value="1"></el-option>
</el-col> -->
<!-- <el-col :span="10">
<span class="font-size-12" style="padding-right: 10px">距离生日天数</span>
<el-select size="mini" v-model="t" placeholder="请选择" @change="changeBirthday">
<el-option label="今日生日" value="0"></el-option>
<el-option label="明日生日" value="1"></el-option>
<el-option label="还有3天生日" value="2"></el-option>
<el-option label="还有4天生日" value="3"></el-option>
<el-option label="还有5天生日" value="4"></el-option>
<el-option label="还有6天生日" value="5"></el-option>
<el-option label="还有7天生日" value="6"></el-option>
</el-select>
</el-col>
<el-col :span="4">
</el-col> -->
<!-- <el-col :span="4">
<el-button icon="iconfont iconshaixuan" class="crm-btn query-btn crm-btn-mini margin-right0" @click="MsgBus.$emit('sceneBoxShow', 5)">高级筛选</el-button>
</el-col>
</el-col> -->
</el-row>
<div v-else class="flex-center">
<p class="font-size-12">已选 <span class="font-color-link">{{multipleSelection.length}}</span></p>
<div class="selection-box">
<el-button v-for="(item, index) in selectionList" :key="index" @click="item.myFun"><i :class="item.class"></i>{{item.name}}</el-button>
<el-button @click="transferVisible=true"><i class="el-icon-present"></i>发送祝福</el-button>
</div>
</div>
<div class="scene-wrapper" v-if="sceneList.length > 0">
......@@ -262,29 +267,44 @@
</div> -->
<el-dialog :visible.sync="transferVisible" :close-on-click-modal="false" width="450px" custom-class="transfer-box add-box add-box2">
<div class="add-tit" slot="title">
<p><span></span>客户转移</p>
<p><span></span>发送生日祝福涵</p>
<span icon="el-icon-close"></span>
</div>
<el-form :model="transferMsg" ref="form" class="MyEditForm" >
<div class="MyEditForm-item">
<el-form-item label="变更负责人为" class="label-pad-left">
<el-select
filterable
v-model="transferMsg.EmpId" placeholder="请选择">
<el-option
v-for="item in EmployeeList"
:label='item.EmName'
:value='item.EmployeeId'
:key='item.EmployeeId'>
</el-option>
<el-form-item label="计划标题" class="label-pad-left">
<el-input v-model="addSendMsg.title" placeholder="请输入计划标题,如果不填系统将自动生成"></el-input>
</el-form-item>
</div>
<div class="MyEditForm-item">
<el-form-item label="发送方式" class="label-pad-left">
<el-select v-model="addSendMsg.sendType" placeholder="请选择">
<el-option label='同业助手' value='0'></el-option>
<el-option label='短信' value='1'></el-option>
</el-select>
</el-form-item>
</div>
<div class="MyEditForm-item">
<el-form-item label="接收人员" class="label-pad-left">
<el-input readonly="true" v-model="addSendMsg.sendObj"></el-input>
<div style="font-size:12px;color:red;margin-left: 10px; margin-top: 2px;">消息将发送给关联的同行,由同行转发给客人,暂不支持直接转发</div>
</el-form-item>
</div>
<div class="MyEditForm-item">
<el-form-item label="发送时间" class="label-pad-left">
<el-date-picker
type="datetime"
v-model="addSendMsg.sendTime"
placeholder="选择日期时间">
</el-date-picker>
</el-form-item>
</div>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" class="add-box-btn" @click="transfer(2)">确 定</el-button>
<el-button class="add-box-btn add-box-cancel" @click="transferVisible = false">取 消</el-button>
</div>
</el-dialog>
</div>
</template>
......@@ -399,10 +419,7 @@ export default {
EmployeeList: [],
value: '',
userInfo: {},
transferMsg: {
IDs: [],
EmpId: '',
},
msg: {
GusetName: '',
pageIndex: 1,
......@@ -413,43 +430,24 @@ export default {
ID: 36
},
total: 0,
WhereTypeList: [
{
id: -1,
name: '全部'
},{
id: 1,
name: '我负责的'
},{
id: 2,
name: '下属的'
},{
id: 3,
name: '我关注的'
},
],
selectionList: [
{
name: '转移',
class:'iconfont iconplus-transfer',
myFun: this.transfer
},{
name: '删除',
class:'iconfont icondelete',
myFun: this.delete
},
],
sceneList: [],
SceneEmployeeList: [],
sceneID: 36,
visible: false,
addSendMsg:{
title:"",
sendType:"0",
sendObj:"",
sendTime:"",
isAll:false,
}
};
},
mounted() {
this.userInfo = this.getLocalStorage();
console.log(this.queryType)
this.getList()
this.Employee()
//this.Employee()
let $this = this
this.MsgBus.$on('closeCustomerDialogBox', function (){
$this.dialogTableVisible = false
......@@ -474,6 +472,9 @@ export default {
this.MsgBus.$off('editScene');
},
methods: {
sendPresent(){
},
changeWhere(item){
this.msg.ID = item.ID
this.sceneID = item.ID
......@@ -498,34 +499,6 @@ export default {
this.msg.Data = obj
this.getList()
},
getMarriageStr(type){
if (type === 5) return '其他'
if (type === 4) return '丧偶'
if (type === 3) return '未婚'
if (type === 2) return '离婚'
if (type === 1) return '已婚'
if (type === 0) return '无'
},
Employee(){
let msg = {
RB_Group_id: this.userInfo.RB_Group_id,
BranchId:-1,
DepartmentId:0,
PostId:0,
IsLeave:0,
}
this.apipost2(
"admin_get_EmployeeGetList",
this.msg,
res => {
if (res.data.resultCode == 1) {
this.EmployeeList = res.data.data;
} else {
}
},
err => {}
);
},
//锁定
locking(){
......@@ -633,9 +606,13 @@ export default {
})
},
handleSelectionChange(val) {
this.multipleSelection = val.map(x=>
x.ID
)
this.multipleSelection = val
this.addSendMsg.isAll=false
if(val && val.length>0){
this.addSendMsg.sendObj=val.length==1?val[0].GuestName:val[0].GuestName+"等"+val.length+"人"
}else{
this.addSendMsg.sendObj=""
}
}
}
};
......
......@@ -49,7 +49,7 @@
display: flex;
flex-direction: column;
}
.sex .sjsm>div:nth-child(1){
.sex .sjsm>div{
margin-bottom: 20px;
}
.sex .sjsm>div{
......@@ -85,7 +85,7 @@
}
.Opinionpolls .countryUl li{
position: relative;
padding: 20px 0;
padding: 30px 0;
border-bottom: 1px solid #E2E4EF;
display: flex;
align-items: center;
......@@ -93,7 +93,7 @@
.Opinionpolls .countryUl li .rightSpan{
position: absolute;
right: 0;
bottom: 20px;
bottom: 32px;
}
.Opinionpolls .countryUl li img{
......@@ -102,6 +102,10 @@
border-radius:6px;
}
.Opinionpolls .index{
font-weight: bold;
margin-right:20px;
}
.Opinionpolls .countryUl li:nth-child(1) .index{
color:#FFA475
}
......@@ -120,15 +124,15 @@
}
.timeChart{
width: 100%;
height: 300px;
height: 386px;
}
</style>
<template>
<div class="sex Opinionpolls" v-loading="loading">
<div class="statistics-title bold18">季节统计</div>
<div class="conten-box" v-if="!loading">
<div class="statistics-title bold18">意见调查统计</div>
<div class="conten-box">
<el-row :gutter="25" class="top">
<el-col :span="6" style="height: 100%;">
<el-col :span="6" style="height: 450px">
<el-card style="height: calc(100% - 2px);background:#FFA475">
<p style="color:#FDFEFE;margin-top:15px;font-size:14px" >意见调查总和</p>
<div>
......@@ -140,10 +144,11 @@
<el-col :span="18" class="left">
<el-card>
<div slot="header" class="clearfix">
<span>季节统计</span>
<span>景点评分(前10名)</span>
</div>
<el-row :gutter="80" style="height: 100%;">
<sexChart :myData="chartData" :strArr="strArr"/>
<!-- <sexChart v-if="isShowTop" style="height:350px;" :myData="chartData" :strArr="strArr"/> -->
<div id="tenTopchart" style="height:350px;" class="tenTopchart" ref="tenTopchart"></div>
</el-row>
</el-card>
</el-col>
......@@ -155,7 +160,7 @@
<div slot="header" class="clearfix">
<span>首选印象产品</span>
</div>
<shopChart :shopChartData="shopChartData"/>
<shopChart v-if="isShowTop" :shopChartData="shopChartData"/>
</el-card>
</el-col>
<el-col :span="7">
......@@ -170,32 +175,14 @@
<el-col :span="8" style="height: 100%;">
<el-card style="height: calc(100% - 2px);">
<div slot="header" class="clearfix">
<span>下次出行首选国家</span>
<span>国家/目的地</span>
</div>
<ul class="countryUl">
<li>
<span class="index" style="font-size:14px">NO.1</span>
<img style="margin:0 15px" src="../../assets/img/tongji/cj.png" alt="">
<span style="font-size:18px;">日本</span>
<span class="rightSpan">16520<span class="font-size-12"></span> </span>
</li>
<li>
<span class="index" style="font-size:14px">NO.1</span>
<img style="margin:0 15px" src="../../assets/img/tongji/cj.png" alt="">
<span style="font-size:18px;">日本</span>
<span class="rightSpan">16520<span class="font-size-12"></span> </span>
</li>
<li>
<span class="index" style="font-size:14px">NO.1</span>
<img style="margin:0 15px" src="../../assets/img/tongji/cj.png" alt="">
<span style="font-size:18px;">日本</span>
<span class="rightSpan">16520<span class="font-size-12"></span> </span>
</li>
<li>
<span class="index" style="font-size:14px">NO.1</span>
<img style="margin:0 15px" src="../../assets/img/tongji/cj.png" alt="">
<span style="font-size:18px;">日本</span>
<span class="rightSpan">16520<span class="font-size-12"></span> </span>
<li v-for="(item,index) in dataList.countryList" :key="index">
<span class="index" style="font-size:14px">NO.{{index+1}}</span>
<!-- <img style="margin:0 15px" src="../../assets/img/tongji/cj.png" alt=""> -->
<span style="font-size:18px;">{{item.ItemName}}</span>
<span class="rightSpan">{{item.OrderCount}}<span class="font-size-12"></span> </span>
</li>
</ul>
</el-card>
......@@ -209,7 +196,7 @@
<span>数据说明</span>
</div>
<div style="height: 100%;" class="sjsm">
<div v-for="(item, index) in orders" :key="index">
<div v-for="(item, index) in dataList.GuestSurveyShopList" :key="index">
<div class="left">
<img v-if="item.SeasonType === 1" src="../../assets/img/tongji/cj.png" alt="">
<img v-if="item.SeasonType === 2" src="../../assets/img/tongji/xj.png" alt="">
......@@ -218,7 +205,7 @@
<span class="font-size-12">{{item.SeasonTypeName}}</span>
</div>
<div class="right">
<p>累计报名<span class="hight-font">{{item.StudentCount}}</span>人,关联购物金额<span class="hight-font">{{item.TotalMoney}}</span>万,报名均价为<span class="hight-font">{{item.Unit_Price}}</span></p>
<p>累计报名<span class="hight-font">{{item.SeasonCount}}</span>人,关联购物金额<span class="hight-font">{{item.TotalMoney}}</span>万,报名均价为<span class="hight-font">{{item.Unit_Price}}</span></p>
<p>最喜爱产品<span class="hight-font">{{item.LtName}}</span></p>
</div>
</div>
......@@ -238,7 +225,7 @@
</el-row>
</div>
<div class="situ">
<div class="c">根据对客户季节的统计可以,更好的了解不同季节客人的喜好,消费能力的判读,从而快速的推荐团队给客人等等等</div>
<div class="c">根据对客户意见调查的统计可以,更好的了解客人的喜好,消费能力的判读,从而快速的推荐团队给客人</div>
<div class="bot" @click="drawer = true">
查看更多,参与讨论(1)
<i class="el-icon-d-arrow-right"></i>
......@@ -271,26 +258,29 @@ export default {
return {
discussID: 0,
drawer: false,
chartData: [1,2,3,4],
chartData: [],
shopChartData: [],
SexOrder: [],
loading: false,
strArr: ['春季', '夏季', '秋季', '冬季'],
orders:[]
strArr: [],
orders:[],
dataList:{},
isShowTop:false,
//出游日期
chuyouDate:[],
chuyouList:[],
};
},watch:{
},
mounted() {
// this.GetSexOrderList()
this.initTimeChart();
this.getData();
},
methods: {
initTimeChart(){
// let myChart = this.$echarts.init(this.$refs.timeChart);
var myChart = this.$echarts.init(document.getElementById('timeChart'));
console.log("myChart",myChart)
var option={
xAxis: {
axisTick: {
......@@ -300,100 +290,141 @@ export default {
show: false
},
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
data: this.chuyouDate
},
yAxis: {
show : false,
type: 'value'
},
series: [{
data: [120, 200, 150, 80, 70, 110, 130],
data: this.chuyouList,
type: 'bar',
showBackground: true,
backgroundStyle: {
color: 'rgba(220, 220, 220, 0.8)'
},
barWidth: '20',
itemStyle: {
color: '#0D2481'
}
}]
};
console.log("option",option)
myChart.setOption(option);
},
GetSexOrderList(){
//初始化top10插件
initTopTen(){
let myChart = this.$echarts.init(document.getElementById('tenTopchart'));
let option = {
grid: {
left: '75',
right: '75'
},
xAxis: {
data: this.strArr,
type: 'category',
axisLabel: {
color: '#999999'
},
axisLine: {
show: false
},
},
yAxis: {
type: 'value',
axisLine: {
show: false
},
axisLabel: {
color: '#999999',
formatter: '{value} %'
},
max: 100,
},
series: [{
data: this.chartData,
type: 'bar',
itemStyle: {
color: '#FFA475',
},
barWidth: '44'
}]
};
myChart.setOption(option);
},
getData(){
this.loading = true
this.apipost("/api/Statistic/GetSeasonShopList", {}, res => {
console.log("dsafsaf",res);
let contShop = res.data.data[0].TotalMoney + res.data.data[1].TotalMoney+ res.data.data[2].TotalMoney+ res.data.data[3].TotalMoney,
one = res.data.data[0].TotalMoney,
two = res.data.data[1].TotalMoney,
three = res.data.data[2].TotalMoney,
four= res.data.data[3].TotalMoney,
contNum = res.data.data[0].SeasonCount + res.data.data[1].SeasonCount+ res.data.data[2].SeasonCount+ res.data.data[3].SeasonCount,
oneN = res.data.data[0].SeasonCount,
twoN = res.data.data[1].SeasonCount,
threeN = res.data.data[2].SeasonCount,
fourN = res.data.data[3].SeasonCount;
let chartData = [], shopChartData = [];
chartData.push(
((oneN/contNum)*100).toFixed(2)
)
chartData.push(
((twoN/contNum)*100).toFixed(2)
)
chartData.push(
((threeN/contNum)*100).toFixed(2)
)
chartData.push(
((fourN/contNum)*100).toFixed(2)
)
shopChartData.push(
{
num: Number(((one/contShop)*100).toFixed(2)),
color: "#0D2481",
text: '春季'
}
)
shopChartData.push(
{
num: Number(((two/contShop)*100).toFixed(2)),
color: "#FFA475",
text: '夏季'
}
)
shopChartData.push(
{
num: Number(((three/contShop)*100).toFixed(2)),
color: "#99BD7B",
text: '秋季'
}
)
shopChartData.push(
{
num: Number(((four/contShop)*100).toFixed(2)),
color: "#D2C9F1",
text: '冬季'
}
)
this.chartData = chartData
this.shopChartData = shopChartData
this.orders=res.data.data;
this.getOrders()
this.apipost("/api/Statistic/GetGuestSurveyList", {}, res => {
this.loading=false;
if(res.data.resultCode==1){
this.dataList=res.data.data;
this.chartData=[];
this.strArr=[];
var totalTenCount=0;
var totalChuyou=0;
this.dataList.TopTenScenicList.forEach((x,index) => {
this.strArr.push('TOP'+(index+1));
totalTenCount+=x.OrderCount;
});
this.dataList.TopTenScenicList.forEach((x,index) => {
this.chartData.push();
this.chartData.push(parseFloat(((x.OrderCount/totalTenCount)*100).toFixed(2)));
});
//获取总的出游首选
this.dataList.souXuanList.forEach(x=>{
totalChuyou+=x.OrderCount;
})
var hefeng = this.dataList.souXuanList[0].OrderCount
var xierdunSj = this.dataList.souXuanList[1].OrderCount
var dantuan = this.dataList.souXuanList[2].OrderCount
var xierdun = this.dataList.souXuanList[3].OrderCount
//和风畅享系列
this.shopChartData.push(
{
num: Number(((hefeng/totalChuyou)*100).toFixed(0)),
color: "#0D2481",
text: '和风畅享系列'
}
)
this.shopChartData.push(
{
num: Number(((xierdunSj/totalChuyou)*100).toFixed(0)),
color: "#FFA97C",
text: '希尔顿假期<升级版>'
}
)
this.shopChartData.push(
{
num: Number(((dantuan/totalChuyou)*100).toFixed(0)),
color: "#99BD7B",
text: '单团小团系列(本州大阪.东京)'
}
)
this.shopChartData.push(
{
num: Number(((xierdun/totalChuyou)*100).toFixed(0)),
color: "#D2C9F1",
text: '希尔顿假期系列'
}
)
//遍历出游计划
this.chuyouDate=[];
this.chuyouList=[];
this.dataList.chuyouList.forEach(x=>{
this.chuyouDate.push(x.ItemName);
this.chuyouList.push(x.OrderCount);
})
this.isShowTop=true;
this.initTimeChart();
this.initTopTen();
}else{
this.$message.error(res.data.message);
}
});
},
getOrders(){
this.apipost("/api/Statistic/GetSeasonOrderList", {}, res => {
console.log(res)
res.data.data.forEach(x => {
this.orders[x.NewSeasonType - 1].LtName = x.LtName;
this.orders[x.NewSeasonType - 1].Unit_Price = x.Unit_Price;
});
this.loading = false
});
}
}
}
</script>
\ No newline at end of file
......@@ -49,7 +49,7 @@
display: flex;
flex-direction: column;
}
.sex .sjsm>div:nth-child(1){
.sex .sjsm>div{
margin-bottom: 20px;
}
.sex .sjsm>div{
......
......@@ -49,7 +49,7 @@
display: flex;
flex-direction: column;
}
.sex .sjsm>div:nth-child(1){
.sex .sjsm>div{
margin-bottom: 20px;
}
.sex .sjsm>div{
......
......@@ -84,7 +84,7 @@
<template>
<div class="marriage" v-loading="loading">
<div class="statistics-title bold18">婚姻统计</div>
<div class="conten-box" v-if="!loading">
<div class="conten-box">
<el-row :gutter="25" class="top">
<el-col :span="12" class="left">
<el-card class="blue">
......@@ -187,7 +187,7 @@ export default {
BbsList: [],
isShow:false,
orders:[],
dataList:[]
dataList:[],
};
},watch:{
......@@ -197,7 +197,9 @@ export default {
},
methods: {
initData() {
this.loading=true;
this.apipost("/api/Statistic/GetMarriageShopList", {}, res => {
this.loading=false;
if(res.data.resultCode==1){
this.strArr=[];
let data=res.data.data;
......
<template>
<div class="old-box">
<div class="old-box" v-loading="loading">
<div class="statistics-title bold18">客户年龄分布统计</div>
<el-row :gutter="25" style="height:calc(100% - 62px)">
<el-col :span="12" style="height:100%;">
......@@ -132,6 +132,7 @@ export default {
showChats: [],
moneys: [],
isLoaded: false,
loading:false,
icons: [
"icon-yinger",
"icon-ertong",
......@@ -164,7 +165,9 @@ export default {
});
},
init() {
this.loading=true;
this.apipost("/api/Statistic/GetAgeShopList", {}, res => {
this.loading=false;
res.data.data.forEach(x => {
this.scaleData.push({
name: x.AgeTypeName,
......
......@@ -49,7 +49,7 @@
display: flex;
flex-direction: column;
}
.sex .sjsm>div:nth-child(1){
.sex .sjsm>div{
margin-bottom: 20px;
}
.sex .sjsm>div{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment