|
@@ -3,7 +3,7 @@
|
|
|
<normalLayout>
|
|
|
<template #refresh>
|
|
|
<div style="margin-right:15px">
|
|
|
- <el-button type="text" size="small" @click="$refs.scroll.wrap.scrollTop=0">返回顶部</el-button>
|
|
|
+ <el-button style="font-size:14px !important" type="text" size="small" @click="$refs.scroll.wrap.scrollTop=0">返回顶部</el-button>
|
|
|
</div>
|
|
|
<!-- <i class="el-icon-refresh-right" @click="refresh" v-loading.fullscreen.lock="fullscreenLoading"></i> -->
|
|
|
</template>
|
|
@@ -26,7 +26,7 @@
|
|
|
></el-cascader>
|
|
|
</div>
|
|
|
<div class="data-all">
|
|
|
- <div>客户</div>
|
|
|
+ <div style="margin-bottom:20px">项目</div>
|
|
|
<div class="data-all-wrapper">
|
|
|
<div class="data-left">
|
|
|
<div class="data-item">
|
|
@@ -61,7 +61,7 @@
|
|
|
</p>
|
|
|
</div>
|
|
|
<div class="data-item">
|
|
|
- <p>{{ dataAll.cjl * 100 }}%</p>
|
|
|
+ <p>{{ dataAll.cjl }}%</p>
|
|
|
<p>
|
|
|
项目成交率
|
|
|
<el-tooltip class="item" effect="dark" content="项目成交率=有关联审核订单的项目数÷项目总数×100%" placement="top">
|
|
@@ -124,9 +124,12 @@
|
|
|
</el-option>
|
|
|
</el-select>
|
|
|
</div>
|
|
|
+ <div class="mt-10 inline-16" style="margin-left:10px">
|
|
|
+ <FullScroll domId="projectType"></FullScroll>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <div class="panel-content">
|
|
|
+ <div class="panel-content" id="projectType">
|
|
|
<div ref="typeEl" style="width:430rem"></div>
|
|
|
<div class="panel-table" style="width:1151rem;">
|
|
|
<pageTable
|
|
@@ -881,7 +884,7 @@
|
|
|
</div>
|
|
|
<div class="progress">
|
|
|
<div class="progress-item" :style="[{'--bg':colorArr[index]},{'--width':item.avg}]" v-for="(item,index) in dateList" :key="index">
|
|
|
- <div class="day">平均周期:{{ item.dateavg.toFixed(2) }}</div>
|
|
|
+ <div class="day">平均周期:{{ item.dateavg.toFixed(2) }}天</div>
|
|
|
<div class="start" v-if="index == 0">
|
|
|
<span>{{ item.start }}</span>
|
|
|
<span v-if="item.end == '立项'">项目立项</span>
|
|
@@ -1002,8 +1005,9 @@ import { DualAxes,Pie,measureTextWidth,Column,Line,Bar } from '@antv/g2plot'
|
|
|
import pageTable from './components/pageTable.vue'
|
|
|
import selectProject from './components/selectProject.vue'
|
|
|
import borderTemp from '@/HDrpManagement/dataanalysis/components/border.vue'
|
|
|
+import FullScroll from '@/components/fullScroll/index.vue'
|
|
|
export default {
|
|
|
- components:{borderTemp,pageTable,selectProject},
|
|
|
+ components:{borderTemp,pageTable,selectProject,FullScroll},
|
|
|
data () {
|
|
|
return {
|
|
|
colorArr:['#3874f6','#00b32b','#ffae02','#f53f3f','#f2f2f2'],
|
|
@@ -1388,8 +1392,13 @@ export default {
|
|
|
colorField: 'key',
|
|
|
radius: 1,
|
|
|
innerRadius: 0.64,
|
|
|
+ meta: {
|
|
|
+ value: {
|
|
|
+ formatter: (v) => `${v} ¥`,
|
|
|
+ },
|
|
|
+ },
|
|
|
label:{
|
|
|
- formatter: (datum) => `${(datum.ratio * 100).toFixed(2)}%`
|
|
|
+ formatter: (datum) => `${datum.ratio}%`
|
|
|
},
|
|
|
statistic: {
|
|
|
title: {
|
|
@@ -1404,11 +1413,11 @@ export default {
|
|
|
content: {
|
|
|
offsetY: 4,
|
|
|
style: {
|
|
|
- fontSize: '32px',
|
|
|
+ fontSize: '24px',
|
|
|
},
|
|
|
customHtml: (container, view, datum, data) => {
|
|
|
const { width } = container.getBoundingClientRect();
|
|
|
- const text = datum ? `${datum.qty}` : data[0] ? data[0].qty : 0;
|
|
|
+ const text = datum ? `${datum.ratio}%` : data[0] ? data[0].qty : 0;
|
|
|
return this.renderStatistic(width, text, { fontSize: 32 });
|
|
|
},
|
|
|
},
|
|
@@ -1417,7 +1426,7 @@ export default {
|
|
|
position:'left'
|
|
|
},
|
|
|
// 添加 中心统计文本 交互
|
|
|
- interactions: [{ type: 'element-single-selected' },{ type: 'element-active' },{ type: 'element-click' }],
|
|
|
+ interactions: [{ type: 'element-single-selected' },{ type: 'element-active' },{ type: 'pie-statistic-active' }],
|
|
|
});
|
|
|
this.typeMap.on('element:click',(v) => {
|
|
|
if (v.data.data.value != this.typeTableParam.content.where.projecttype) {
|
|
@@ -1448,7 +1457,7 @@ export default {
|
|
|
radius: 1,
|
|
|
innerRadius: 0.64,
|
|
|
label:{
|
|
|
- formatter: (datum) => `${(datum.ratio * 100).toFixed(2)}%`
|
|
|
+ formatter: (datum) => `${datum.ratio}%`
|
|
|
},
|
|
|
statistic: {
|
|
|
title: {
|
|
@@ -1463,11 +1472,11 @@ export default {
|
|
|
content: {
|
|
|
offsetY: 4,
|
|
|
style: {
|
|
|
- fontSize: '32px',
|
|
|
+ fontSize: '24px',
|
|
|
},
|
|
|
customHtml: (container, view, datum, data) => {
|
|
|
const { width } = container.getBoundingClientRect();
|
|
|
- const text = datum ? `${datum.qty}` : data[0] ? data[0].qty : 0;
|
|
|
+ const text = datum ? `${datum.ratio}%` : data[0] ? data[0].qty : 0;
|
|
|
return this.renderStatistic(width, text, { fontSize: 32 });
|
|
|
},
|
|
|
},
|
|
@@ -1476,7 +1485,7 @@ export default {
|
|
|
position:'left'
|
|
|
},
|
|
|
// 添加 中心统计文本 交互
|
|
|
- interactions: [{ type: 'element-selected' },{ type: 'element-active' },{ type: 'element-click' }],
|
|
|
+ interactions: [{ type: 'element-selected' },{ type: 'element-active' },{ type: 'pie-statistic-active' }],
|
|
|
});
|
|
|
this.gradMap.on('element:click',(v) => {
|
|
|
if (v.data.data.key != this.gradTableParam.content.where.grade) {
|
|
@@ -1580,6 +1589,7 @@ export default {
|
|
|
async fllowFun (init) {
|
|
|
let res = await this.$api.requested(this.fllowParam)
|
|
|
this.fllowData = res.data
|
|
|
+ this.fllowData.tbzzl.forEach(item => item.key = '同比增长率(%)')
|
|
|
console.log(res.data,'跟进数据');
|
|
|
if (init) {
|
|
|
this.fllowMap = new DualAxes(this.$refs.fllowEl, {
|
|
@@ -1644,7 +1654,7 @@ export default {
|
|
|
radius: 1,
|
|
|
innerRadius: 0.64,
|
|
|
label:{
|
|
|
- formatter: (datum) => `${(datum.ratio * 100).toFixed(2)}%`
|
|
|
+ formatter: (datum) => `${datum.ratio}%`
|
|
|
},
|
|
|
statistic: {
|
|
|
title: {
|
|
@@ -1659,11 +1669,11 @@ export default {
|
|
|
content: {
|
|
|
offsetY: 4,
|
|
|
style: {
|
|
|
- fontSize: '32px',
|
|
|
+ fontSize: '24px',
|
|
|
},
|
|
|
customHtml: (container, view, datum, data) => {
|
|
|
const { width } = container.getBoundingClientRect();
|
|
|
- const text = datum ? `${datum.value}` : data[0] ? data[0].totalqty : 0;
|
|
|
+ const text = datum ? `${datum.ratio}%` : data[0] ? data[0].totalqty : 0;
|
|
|
return this.renderStatistic(width, text, { fontSize: 32 });
|
|
|
},
|
|
|
},
|
|
@@ -1672,7 +1682,7 @@ export default {
|
|
|
position:'left'
|
|
|
},
|
|
|
// 添加 中心统计文本 交互
|
|
|
- interactions: [{ type: 'element-selected' },{ type: 'element-active' },{ type: 'element-click' }],
|
|
|
+ interactions: [{ type: 'element-selected' },{ type: 'element-active' },{ type: 'pie-statistic-active' }],
|
|
|
});
|
|
|
this.projectFllowMap.on('element:click',(v) => {
|
|
|
if (v.data.data.value != this.fllowTableParam.content.where.isfollowup) {
|
|
@@ -1703,7 +1713,7 @@ export default {
|
|
|
radius: 1,
|
|
|
innerRadius: 0.64,
|
|
|
label:{
|
|
|
- formatter: (datum) => `${(datum.ratio * 100).toFixed(2)}%`
|
|
|
+ formatter: (datum) => `${datum.ratio}%`
|
|
|
},
|
|
|
statistic: {
|
|
|
title: {
|
|
@@ -1718,11 +1728,11 @@ export default {
|
|
|
content: {
|
|
|
offsetY: 4,
|
|
|
style: {
|
|
|
- fontSize: '32px',
|
|
|
+ fontSize: '24px',
|
|
|
},
|
|
|
customHtml: (container, view, datum, data) => {
|
|
|
const { width } = container.getBoundingClientRect();
|
|
|
- const text = datum ? `${datum.value}` : data[0] ? data[0].totalqty : 0;
|
|
|
+ const text = datum ? `${datum.ratio}%` : data[0] ? data[0].totalqty : 0;
|
|
|
return this.renderStatistic(width, text, { fontSize: 32 });
|
|
|
},
|
|
|
},
|
|
@@ -1731,7 +1741,7 @@ export default {
|
|
|
position:'left'
|
|
|
},
|
|
|
// 添加 中心统计文本 交互
|
|
|
- interactions: [{ type: 'element-selected' },{ type: 'element-active' },{ type: 'element-click' }],
|
|
|
+ interactions: [{ type: 'element-selected' },{ type: 'element-active' },{ type: 'pie-statistic-active' }],
|
|
|
});
|
|
|
this.projectContactMap.on('element:click',(v) => {
|
|
|
if (v.data.data.key != this.contactTableParam.content.where.iscontacts) {
|
|
@@ -1762,7 +1772,7 @@ export default {
|
|
|
radius: 1,
|
|
|
innerRadius: 0.64,
|
|
|
label:{
|
|
|
- formatter: (datum) => `${(datum.ratio * 100).toFixed(2)}%`
|
|
|
+ formatter: (datum) => `${datum.ratio}%`
|
|
|
},
|
|
|
statistic: {
|
|
|
title: {
|
|
@@ -1777,11 +1787,11 @@ export default {
|
|
|
content: {
|
|
|
offsetY: 4,
|
|
|
style: {
|
|
|
- fontSize: '32px',
|
|
|
+ fontSize: '24px',
|
|
|
},
|
|
|
customHtml: (container, view, datum, data) => {
|
|
|
const { width } = container.getBoundingClientRect();
|
|
|
- const text = datum ? `${datum.value}` : data[0] ? data[0].totalqty : 0;
|
|
|
+ const text = datum ? `${datum.ratio}%` : data[0] ? data[0].totalqty : 0;
|
|
|
return this.renderStatistic(width, text, { fontSize: 32 });
|
|
|
},
|
|
|
},
|
|
@@ -1790,7 +1800,7 @@ export default {
|
|
|
position:'left'
|
|
|
},
|
|
|
// 添加 中心统计文本 交互
|
|
|
- interactions: [{ type: 'element-selected' },{ type: 'element-active' },{ type: 'element-click' }],
|
|
|
+ interactions: [{ type: 'element-selected' },{ type: 'element-active' },{ type: 'pie-statistic-active' }],
|
|
|
});
|
|
|
this.projectCustomerMap.on('element:click',(v) => {
|
|
|
if (v.data.data.key != this.customerTableParam.content.where.iscustomers) {
|
|
@@ -1821,7 +1831,7 @@ export default {
|
|
|
radius: 1,
|
|
|
innerRadius: 0.64,
|
|
|
label:{
|
|
|
- formatter: (datum) => `${(datum.ratio * 100).toFixed(2)}%`
|
|
|
+ formatter: (datum) => `${datum.ratio}%`
|
|
|
},
|
|
|
statistic: {
|
|
|
title: {
|
|
@@ -1836,11 +1846,11 @@ export default {
|
|
|
content: {
|
|
|
offsetY: 4,
|
|
|
style: {
|
|
|
- fontSize: '32px',
|
|
|
+ fontSize: '24px',
|
|
|
},
|
|
|
customHtml: (container, view, datum, data) => {
|
|
|
const { width } = container.getBoundingClientRect();
|
|
|
- const text = datum ? `${datum.value}` : data[0] ? data[0].totalqty : 0;
|
|
|
+ const text = datum ? `${datum.ratio}%` : data[0] ? data[0].totalqty : 0;
|
|
|
return this.renderStatistic(width, text, { fontSize: 32 });
|
|
|
},
|
|
|
},
|
|
@@ -1849,7 +1859,7 @@ export default {
|
|
|
position:'left'
|
|
|
},
|
|
|
// 添加 中心统计文本 交互
|
|
|
- interactions: [{ type: 'element-selected' },{ type: 'element-active' },{ type: 'element-click' }],
|
|
|
+ interactions: [{ type: 'element-selected' },{ type: 'element-active' },{ type: 'pie-statistic-active' }],
|
|
|
});
|
|
|
this.projectScoreMap.on('element:click',(v) => {
|
|
|
if (v.data.data.key != this.scoreTableParam.content.where.istask) {
|
|
@@ -2184,12 +2194,16 @@ export default {
|
|
|
*{
|
|
|
box-sizing: border-box;
|
|
|
}
|
|
|
+.panel-select {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+}
|
|
|
.data-all {
|
|
|
padding: 24rem 20rem;
|
|
|
width: 100%;
|
|
|
border-radius: 5rem;
|
|
|
border: 1rem;
|
|
|
- box-shadow: rgb(136, 136, 136) 0rem 0rem 5rem 0rem;
|
|
|
+ box-shadow: 0rem 2rem 5rem 0rem rgba(0, 0, 0, 0.15);
|
|
|
margin-top: 10rem;
|
|
|
}
|
|
|
.data-all .data-left {
|
|
@@ -2198,7 +2212,7 @@ export default {
|
|
|
flex-wrap: wrap;
|
|
|
}
|
|
|
.data-all .data-right {
|
|
|
- padding-left: 50rem;
|
|
|
+ padding-left: 100rem;
|
|
|
display: flex;
|
|
|
flex-wrap: wrap;
|
|
|
}
|
|
@@ -2207,13 +2221,19 @@ export default {
|
|
|
}
|
|
|
.data-all .data-item {
|
|
|
width: 186rem;
|
|
|
+ margin-bottom: 20px;
|
|
|
}
|
|
|
.data-all .data-item p:nth-child(1) {
|
|
|
- font-size: 26rem;
|
|
|
- font-weight: bold;
|
|
|
+ font-size: 26px;
|
|
|
+ font-weight: 5px;
|
|
|
+ font-family: 'ArialMT', 'Arial', sans-serif;
|
|
|
+ color: rgba(0, 0, 0, 0.85);
|
|
|
}
|
|
|
.data-all .data-item p:nth-child(2) {
|
|
|
- font-size: 16rem;
|
|
|
+ font-size: 14px;
|
|
|
+ font-weight: 5px;
|
|
|
+ font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
|
|
|
+ color: rgba(0, 0, 0, 0.65)
|
|
|
}
|
|
|
.data-all .data-all-wrapper {
|
|
|
display: flex;
|
|
@@ -2239,6 +2259,7 @@ export default {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
justify-content: space-between;
|
|
|
+ background:#ffffff;
|
|
|
}
|
|
|
.panel-content div:first-child {
|
|
|
padding: 0 5px;
|