Commit b0f1c775 authored by 廖旭伟's avatar 廖旭伟

Merge remote-tracking branch 'origin/master'

parents 267e1c51 a1a24488
......@@ -11,3 +11,11 @@ export function getEventCensus(params) {
export function getProductHotCensus(params) {
return http.post(`${baseURL}/zwfw/act/analyse/productHotCensus`, params);
}
//页面访问分析
export function getAccessAnalyse(params) {
return http.post(`${baseURL}/zwfw/act/analyse/accessAnalyse`, params);
}
//路径分析
export function getWayAccessAnalyse(params) {
return http.post(`${baseURL}/zwfw/act/analyse/wayAccessAnalyse`, params);
}
\ No newline at end of file
......@@ -66,6 +66,10 @@ export function getWLLZCount(params) {
export function getWLLZInfo(params) {
return http.get(`${BASEURL}/wllz/index/complainInfo`, params);
}
// 12345报表
export function getSys12345(params) {
return http.get(`${BASEURL}/wllz/complainapi/sys12345`, params);
}
// 样表列表
export function getBillList(params) {
......
......@@ -13,7 +13,7 @@
<a-range-picker valueFormat="yyyy-MM-DD" v-model="time" style="width: 300px" :allowClear="false"/>
</a-form-model-item>
<a-form-model-item>
<a-button type="primary">
<a-button type="primary" @click="getList">
开始分析
</a-button>
</a-form-model-item>
......
......@@ -3,17 +3,17 @@
<div class="page">
<a-form-model :model="queryform" :label-col="labelCol" :wrapper-col="wrapperCol" layout="inline">
<a-form-model-item>
<a-select v-model="queryform.value" style="width: 200px" placeholder="选择产品">
<a-select-option value="jack">
Jack
<a-select v-model="queryform.productId" style="width: 200px" placeholder="选择产品">
<a-select-option :value="item.id" v-for="(item,index) in product" :key="index">
{{item.title}}
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item>
<a-range-picker valueFormat="yyyy-MM-DD" v-model="queryform.value" style="width: 300px" />
<a-range-picker valueFormat="yyyy-MM-DD" v-model="time" style="width: 300px" :allowClear="false"/>
</a-form-model-item>
<a-form-model-item>
<a-button type="primary">
<a-button type="primary" @click="getData">
开始分析
</a-button>
</a-form-model-item>
......@@ -23,11 +23,11 @@
<div>页面访问指标趋势</div>
<div class="txt-dv">
<div>
<div class="num">4058</div>
<div class="num">{{data ? data.accessSum : 0}}</div>
<div>页面累计访问次数</div>
</div>
<div>
<div class="num">4058</div>
<div class="num">{{data ? data.dayAccessAvg : 0}}</div>
<div>日均访问次数</div>
</div>
</div>
......@@ -37,11 +37,11 @@
<div class="page-box">
<div class="page-dv">
<div>人均访问深度</div>
<div class="page-num">4.00</div>
<div class="page-num">{{data ? data.depthAvg : 0}}</div>
</div>
<div class="page-dv">
<div>次均访问深度</div>
<div class="page-num">4.00</div>
<div class="page-num">{{data ? data.singleDepth : 0}}</div>
</div>
</div>
<div class="chatrs-dv">
......@@ -55,26 +55,48 @@
<script>
import * as echarts from 'echarts'
import {getAccessAnalyse} from '@/api/dataActuary.js'
import moment from 'moment';
export default {
data() {
return {
queryform: {
value: null
productId: 1,
dateTimeStart:moment().format('yyyy-MM-DD'),
dateTimeEnd:moment().format('yyyy-MM-DD')
},
time:[moment().format('yyyy-MM-DD'),moment().format('yyyy-MM-DD')],
product:[{
title:'排队机',
id:1
}],
labelCol: {
span: 1
},
wrapperCol: {
span: 14
},
data:null
}
},
mounted() {
this.initLine()
this.initBar()
this.getData()
},
methods: {
initBar() {
getData() {
this.queryform.dateTimeStart = this.time ? this.time[0] : null
this.queryform.dateTimeStart = this.time ? this.time[1] : null
getAccessAnalyse(this.queryform).then(res=>{
this.data = res.data
let lineX = res.data.accessTrend.map(item=>item.accessDay)
let lineY = res.data.accessTrend.map(item=>item.accessCount)
let barX = res.data.pageAccessTop.map(item=>item.accessCount)
let barY = res.data.pageAccessTop.map(item=>item.pageName)
this.initLine(lineX,lineY)
this.initBar(barX,barY)
})
},
initBar(barX,barY) {
let chartDom = document.getElementById('pages')
let myChart = echarts.init(chartDom);
myChart.setOption({
......@@ -103,7 +125,7 @@
},
yAxis: {
type: 'category',
data: ['Brazil', 'Indonesia', 'USA', 'India', 'China', 'World'],
data: barY,
axisTick: {
show: false
}
......@@ -111,13 +133,13 @@
series: [{
name: '访问次数',
type: 'bar',
data: [18203, 23489, 29034, 104970, 131744, 630230],
data: barX,
barWidth:10
}
]
})
},
initLine() {
initLine(lineX,lineY) {
let chartDom = document.getElementById('number')
let myChart = echarts.init(chartDom);
myChart.setOption({
......@@ -132,7 +154,7 @@
},
xAxis: {
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
data: lineX,
axisTick: {
show: false
}
......@@ -142,7 +164,7 @@
},
series: [{
name: '页面访问次数',
data: [150, 230, 224, 218, 135, 147, 260],
data: lineY,
type: 'line',
markLine: {
data: [{
......
......@@ -3,17 +3,17 @@
<div class="page">
<a-form-model :model="queryform" :label-col="labelCol" :wrapper-col="wrapperCol" layout="inline">
<a-form-model-item>
<a-select v-model="queryform.value" style="width: 200px" placeholder="选择产品">
<a-select-option value="jack">
Jack
<a-select v-model="queryform.productId" style="width: 200px" placeholder="选择产品">
<a-select-option :value="item.id" v-for="(item,index) in product" :key="index">
{{item.title}}
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item>
<a-range-picker valueFormat="yyyy-MM-DD" v-model="queryform.value" style="width: 300px" />
<a-range-picker valueFormat="yyyy-MM-DD" v-model="time" style="width: 300px" :allowClear="false"/>
</a-form-model-item>
<a-form-model-item>
<a-button type="primary">
<a-button type="primary" @click="getData">
开始分析
</a-button>
</a-form-model-item>
......@@ -24,12 +24,21 @@
<script>
import * as echarts from 'echarts'
import {getWayAccessAnalyse} from '@/api/dataActuary.js'
import moment from 'moment';
export default {
data() {
return {
queryform: {
value: null
},
productId: 1,
dateTimeStart:moment().format('yyyy-MM-DD'),
dateTimeEnd:moment().format('yyyy-MM-DD')
},
time:[moment().format('yyyy-MM-DD'),moment().format('yyyy-MM-DD')],
product:[{
title:'排队机',
id:1
}],
labelCol: {
span: 1
},
......@@ -39,10 +48,30 @@
}
},
mounted() {
this.init()
this.getData()
},
methods: {
init() {
getData() {
this.queryform.dateTimeStart = this.time ? this.time[0] : null
this.queryform.dateTimeStart = this.time ? this.time[1] : null
getWayAccessAnalyse(this.queryform).then(res=>{
let data = res.data.data.map(item=>({name:item.name}))
let links = res.data.links.map(item=>({
source:item.sourceName,
target:item.targetName,
value:item.value,
lineStyle:{
color:'source'
}
}))
this.init(data,links)
})
},
uniqueFunc(arr, uniId){
const res = new Map();
return arr.filter((item) => !res.has(item[uniId]) && res.set(item[uniId], 1));
},
init(data,links) {
let chartDom = document.getElementById('path')
let myChart = echarts.init(chartDom);
myChart.setOption({
......@@ -54,74 +83,8 @@
},
color:['#FFCAC4','#6D86DE','#409AFE','#4DB3EA','#07CF8C'],
nodeWidth:10,
data: [{
name: 'a'
},
{
name: 'b'
},
{
name: 'a1'
},
{
name: 'a2'
},
{
name: 'b1'
},
{
name: 'c'
}
],
links: [{
source: 'a',
target: 'a1',
value: 5,
lineStyle:{
color:'source'
}
},
{
source: 'a',
target: 'a2',
value: 3,
lineStyle:{
color:'source'
}
},
{
source: 'b',
target: 'b1',
value: 8,
lineStyle:{
color:'source'
}
},
{
source: 'a',
target: 'b1',
value: 3,
lineStyle:{
color:'source'
}
},
{
source: 'b1',
target: 'a1',
value: 1,
lineStyle:{
color:'source'
}
},
{
source: 'b1',
target: 'c',
value: 2,
lineStyle:{
color:'source'
}
}
]
data: data,
links: links
}
})
}
......
......@@ -2,7 +2,7 @@
<!-- 产品分析 -->
<div class="page">
<div class="img-dv">
<img :src="BASE_URL + img" >
<img :src="BASE_URL + img" ref="img">
<div id="queuing"></div>
</div>
<div class="list-dv">
......@@ -15,17 +15,17 @@
</a-select>
</a-form-model-item>
<a-form-model-item>
<a-range-picker valueFormat="yyyy-MM-DD" v-model="time" style="width: 300px" :allowClear="false"/>
<a-range-picker valueFormat="yyyy-MM-DD" v-model="time" style="width: 300px" :allowClear="false" />
</a-form-model-item>
<a-form-model-item>
<a-select v-model="queryform.pageCode" style="width: 200px">
<a-select v-model="queryform.pageCode" style="width: 410px">
<a-select-option :value="item.id" v-for="(item,index) in page" :key="index">
{{item.title}}
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item>
<a-button type="primary">
<a-button type="primary" @click="getList">
开始分析
</a-button>
</a-form-model-item>
......@@ -46,24 +46,26 @@
<script>
import Heatmap from 'heatmap.js';
import moment from 'moment';
import {getProductHotCensus} from '@/api/dataActuary.js'
import {
getProductHotCensus
} from '@/api/dataActuary.js'
export default {
data() {
return {
queryform: {
productId: 1,
dateTimeStart:moment().format('yyyy-MM-DD'),
dateTimeEnd:moment().format('yyyy-MM-DD'),
pageCode:'/'
dateTimeStart: moment().format('yyyy-MM-DD'),
dateTimeEnd: moment().format('yyyy-MM-DD'),
pageCode: '/'
},
time:[moment().format('yyyy-MM-DD'),moment().format('yyyy-MM-DD')],
product:[{
title:'排队机',
id:1
time: [moment().format('yyyy-MM-DD'), moment().format('yyyy-MM-DD')],
product: [{
title: '排队机',
id: 1
}],
page:[{
title:'首页',
id:'/'
page: [{
title: '首页',
id: '/'
}],
labelCol: {
span: 1
......@@ -96,25 +98,44 @@
data: [],
heatmapInstance: null,
dataPoint: [],
img:'',
BASE_URL:process.env.VUE_APP_API_BASE_URL
img: '',
BASE_URL: process.env.VUE_APP_API_BASE_URL + '/'
}
},
mounted() {
this.getList()
this.init('queuing')
},
methods: {
getList() {
this.queryform.dateTimeStart = this.time ? this.time[0] : null
this.queryform.dateTimeStart = this.time ? this.time[1] : null
getProductHotCensus(this.queryform).then(res=>{
getProductHotCensus(this.queryform).then(res => {
this.data = res.data.data
this.img = res.data.screenUrl
this.dataPoint = res.data.data.map(({x,y,value})=>({x,y,value}))
this.init('queuing',this.dataPoint)
let imgSize = new Image();
imgSize.src = this.BASE_URL + this.img;
imgSize.onload = () => {
let w = this.$refs.img.width / imgSize.width
let h = this.$refs.img.height / imgSize.height
this.dataPoint = res.data.data.map(({
x,
y,
value
}) => ({
x: parseInt(x * w),
y: parseInt(y * h),
value
}))
let data = {
max: 10,
min: 0,
data: this.dataPoint
};
this.heatmapInstance.setData(data);
}
})
},
init(el, dataPoint) {
init(el) {
let config = {
container: document.getElementById(el),
radius: 30,
......@@ -123,12 +144,7 @@
blur: .5
};
this.heatmapInstance = Heatmap.create(config);
let data = {
max: 10,
min: 0,
data: this.dataPoint
};
this.heatmapInstance.setData(data);
this.getList()
}
}
};
......@@ -142,20 +158,19 @@
.img-dv {
width: 60%;
min-height: 100%;
margin-top: 100px;
padding: 0 100px;
margin: 100px;
position: relative;
img{
img {
width: 100%;
background-size: 100% 100%;
}
#queuing {
width: calc(100% - 200px);
width: 100%;
height: 100%;
position: absolute !important;
top: 0;
left:100px;
left: 0;
z-index: 999;
}
}
......
......@@ -316,12 +316,13 @@
});
});
} else {
data = this.$_.cloneDeep(
let datas = this.$_.cloneDeep(
await getImpossible({
page: 1,
size: -1
})
);
data = datas.data.data
if (!data.length) return;
for (let item of data) {
Object.keys(obj).forEach((key) => {
......
......@@ -2,16 +2,16 @@
<div class="callRecord-Container">
<div class="header_box">
<div>
<a-button type="success" @click="exportTable">
<a-button :loading="btnLoading" type="success" @click="handleExportTable">
<span>{{ tableSelectedRows.length ? "导出" : "导出全部" }}</span>
</a-button>
<b>拨打次数:<i>233</i></b>
<b>拨打次数:<i>{{total}}</i></b>
</div>
<span>
<a-input style="width:250px;" v-model="searchName" placeholder="请输入标题或姓名关键字搜索">
<a-icon slot="prefix" type="search" />
</a-input>
<a-button type="primary">搜索</a-button>
<a-button type="primary" @click="getList">搜索</a-button>
</span>
</div>
<div class="main">
......@@ -19,7 +19,7 @@
selectedRowKeys: tableSelectedKeys,
onChange: onSelectChange,
}" :scroll="{ y: 590 }" :pagination="tablePagination" @change="pagTableChange" :loading="tableLoading"
:columns="tableHeaders" :dataSource="tableSourceData">
:columns="tableHeaders" :dataSource="tableSourceData" >
</a-table>
</div>
</div>
......@@ -27,7 +27,10 @@
<script>
import table from "@/mixins/table";
import {getSys12345} from "@/api/dataAdmin"
import {
export2Excel
} from "@/utils/js/exportExcel";
export default {
mixins: [table],
name: "callRecordForm",
......@@ -45,49 +48,55 @@ export default {
{
title: "微信号",
align: "center",
dataIndex: "微信号",
dataIndex: "nickname",
customRender: (text, record, index) => `${record.nickname || '--'}`
},
{
title: "电话号码",
align: "center",
dataIndex: "电话号码",
dataIndex: "phone",
customRender: (text, record, index) => `${record.phone || '--'}`
},
{
title: "拨打位置",
align: "center",
dataIndex: "拨打位置",
dataIndex: "address",
customRender: (text, record, index) => `${record.address || '--'}`
},
{
title: "拨打时间",
align: "center",
dataIndex: "拨打时间",
dataIndex: "create_time",
customRender: (text, record, index) => `${record.create_time || '--'}`
},
],
btnLoading: false,
tableSelectedKeys: [],
tableSelectedRows: [],
BegindAndEndTime: [],
searchName: undefined,
visible: false,
total:0
};
},
components: {
},
mounted() {
this.setMoment();
for (let key = 0; key < 20; key++) {
this.tableSourceData.push({
id: `00${key + 1}`,
微信号: `liudefa${key + 1}`,
电话号码: `1388888888888`,
拨打位置: `四川省成都市武侯区天益街1号理想中心3栋170${key + 1}号`,
拨打时间: `2022-09-26 13:30:00`
});
}
this.getList();
},
methods: {
getList(){
getSys12345({
phone:this.searchName
}).then(res=>{
this.tableSourceData = res.data.data
this.total = res.data.total
})
},
rangePickerChange(val) {
console.log(val);
},
QueueState(type) {
switch (type) {
case 0:
......@@ -98,7 +107,61 @@ export default {
return "type0";
}
},
// 选中
onSelectChange(keys, rows) {
this.tableSelectedKeys = keys;
const res = new Map();
this.tableSelectedRows = [...this.tableSelectedRows, ...rows]
.filter((v) => {
return !res.has(v.id) && res.set(v.id, 1);
})
.filter((v) => {
return this.tableSelectedKeys.some((val) => v.id == val);
});
},
// 导出
async handleExportTable() {
this.btnLoading = true;
let obj = {
1: "本地打印",
2: "在线提交",
};
let data = [];
if (this.tableSelectedKeys.length && this.tableSelectedRows.length) {
// 深度克隆避免影响页面表格展示
data = this.$_.cloneDeep(this.tableSelectedRows);
data.forEach((item) => {
Object.keys(obj).forEach((keys) => {
if (item.type == keys) {
item.type = obj[keys];
}
});
});
} else {
let datas = this.$_.cloneDeep(
await getSys12345({
page: 1,
size: -1
})
);
data = datas.data.data
if (!data.length) return;
for (let item of data) {
Object.keys(obj).forEach((key) => {
if (item.type == key) {
item.type = obj[key];
}
});
}
}
export2Excel(
this.tHeader,
this.filterVal,
data,
"填单记录报表" + this.$moment().format("YYYYMMDDHHmmss")
);
this.btnLoading = false;
},
showDrawer() {
this.visible = true;
},
......
......@@ -11,31 +11,32 @@
</div>
<span>
<a-space>
<a-checkbox @change="changeReply">
<a-checkbox @change="changeReply" v-model="isReply">
只看未回复
</a-checkbox>
<a-select placeholder="全部类型" @change="changeType">
<a-select placeholder="全部类型" v-model="nowType" @change="changeType">
<a-select-option value="1"> 部门建议 </a-select-option>
<a-select-option value="2"> 办事建议 </a-select-option>
<a-select-option value="3"> 网站建议 </a-select-option>
<a-select-option value="4"> 我要就错 </a-select-option>
<a-select-option value="5"> 我要投诉 </a-select-option>
</a-select>
<a-select placeholder="全部来源" @change="changeDevice">
<a-select placeholder="全部来源" v-model="nowDevice" @change="changeDevice">
<a-select-option value="1"> 评价系统 </a-select-option>
<a-select-option value="2"> 导视系统 </a-select-option>
<a-select-option value="3"> 自助服务系统 </a-select-option>
<a-select-option value="4"> 微官网 </a-select-option>
<a-select-option value="5"> 数字填单系统 </a-select-option>
</a-select>
<a-range-picker style="width:250px;" format="YYYY年MM月DD日" class="range_picker_style"
@change="rangePickerChange">
<a-range-picker style="width:250px;" format="YYYY-MM-DD" class="range_picker_style"
@change="rangePickerChange" v-model="timeList">
</a-range-picker>
<a-input style="width:250px;" v-model="searchName" placeholder="请输入标题或姓名关键字搜索">
<a-icon slot="prefix" type="search" />
</a-input>
<a-button type="primary" @click="togetWLLZCount">搜索</a-button>
<a-button @click="resetting">重置</a-button>
</a-space>
</span>
</div>
......@@ -153,8 +154,8 @@ export default {
visible: false,
nowSite:null,//当前站点
isReply:false,//是否回复
nowType:null,//当前类型
nowDevice:null,// 来源
nowType:undefined,//当前类型
nowDevice:undefined,// 来源
timeList:[],// 时间
JYCount:0,//建议次数
HFCount:0,//回复次数
......@@ -166,7 +167,7 @@ export default {
mounted() {
this.setMoment();
// 设置默认时间为今天
this.timeList=[this.$moment(new Date()).format("YYYY-MM-DD"),this.$moment(new Date()).format("YYYY-MM-DD")]
this.timeList=[this.$moment().format("YYYY-MM-DD"),this.$moment().format("YYYY-MM-DD")]
this.nowSite = localStorage.getItem('siteId');
this.togetWLLZCount()
},
......@@ -176,6 +177,15 @@ export default {
}
},
methods: {
//重置
resetting() {
this.timeList=[this.$moment().format("YYYY-MM-DD"),this.$moment().format("YYYY-MM-DD")]
this.nowType = undefined
this.nowDevice = undefined
this.searchName = undefined
this.isReply = false
this.togetWLLZCount()
},
// 重写导出
toexportTable() {
let tableData = [];
......
......@@ -282,7 +282,7 @@
type: 'map',
mapType: 'china',
top: '30%',
left: '20%',
left: '25%',
zoom: 1.7,
label: { // 地图上的文字
normal: {
......@@ -327,7 +327,7 @@
map: 'china',
top: '30%',
aspectScale: 0.75, // 长宽比
left: '20%',
left: '25%',
zoom: 1.7,
roam: false,
itemStyle: {
......@@ -396,7 +396,7 @@
}
&>._right {
width: 35%;
width: 40%;
padding: 15px;
.list {
......
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