|
|
@@ -1,44 +1,68 @@
|
|
|
// 各模块文件存储占比
|
|
|
<template>
|
|
|
<div class="container normal-panel">
|
|
|
- <div>
|
|
|
- <p class="title">销售漏斗图</p>
|
|
|
- <div class="re-panel">
|
|
|
- <div id="containerFunnel"></div>
|
|
|
- </div>
|
|
|
-
|
|
|
+ <div class="inline-16" style="margin-top:20px;margin-bottom: 50px">
|
|
|
+ <label class="search__label" >部门:</label>
|
|
|
+ <el-cascader ref="selectdep" size="small" v-model="depment" :options="deplist" :props="{emitPath:true,expandTrigger:'hover',checkStrictly:true,label:'label',value:'departmentid',children:'children'}" @change="selectDep" clearable></el-cascader>
|
|
|
+ </div>
|
|
|
+ <div class="inline-16">
|
|
|
+ <label class="search__label" >人员:</label>
|
|
|
+ <el-select v-model="person" filterable placeholder="请选择" size="small" clearable @change="selectPerson">
|
|
|
+ <el-option
|
|
|
+ v-for="item in personnelList"
|
|
|
+ :key="item.index"
|
|
|
+ :label="item.name"
|
|
|
+ :value="item.userid">
|
|
|
+ </el-option>
|
|
|
+ </el-select>
|
|
|
+ </div>
|
|
|
+ <div class="inline-16">
|
|
|
+ <el-button-group>
|
|
|
+ <el-button size="small" :type="dataParam.content.dateType==1?'primary':''" @click="dataChange(1)">近一年</el-button>
|
|
|
+ <el-button size="small" :type="dataParam.content.dateType==2?'primary':''" @click="dataChange(2)">近九个月</el-button>
|
|
|
+ <el-button size="small" :type="dataParam.content.dateType==3?'primary':''" @click="dataChange(3)">近六个月</el-button>
|
|
|
+ <el-button size="small" :type="dataParam.content.dateType==4?'primary':''" @click="dataChange(4)">近三个月</el-button>
|
|
|
+ </el-button-group>
|
|
|
</div>
|
|
|
<div>
|
|
|
- <p class="title">表格数据</p>
|
|
|
- <el-table
|
|
|
- :data="tableData"
|
|
|
- style="width: 100%"
|
|
|
- size="small"
|
|
|
- border>
|
|
|
- <el-table-column
|
|
|
- prop="stagename"
|
|
|
- label="阶段"
|
|
|
- width="180">
|
|
|
- </el-table-column>
|
|
|
- <el-table-column
|
|
|
- prop="projectqty"
|
|
|
- label="项目数"
|
|
|
- width="180">
|
|
|
- </el-table-column>
|
|
|
- <el-table-column
|
|
|
- prop="signamount_due"
|
|
|
- label="签约金额(元)">
|
|
|
- </el-table-column>
|
|
|
- <el-table-column
|
|
|
- prop="totalinvestment"
|
|
|
- label="总计预计投资金额(万元)">
|
|
|
- </el-table-column>
|
|
|
- <el-table-column
|
|
|
- prop="budgetary"
|
|
|
- label="项目预算(万元)">
|
|
|
- </el-table-column>
|
|
|
- </el-table>
|
|
|
+ <el-row>
|
|
|
+ <el-col :span="14">
|
|
|
+ <p class="title">销售漏斗图</p>
|
|
|
+ <div class="re-panel">
|
|
|
+ <div id="containerFunnel" style="height: calc(100vh - 500px)"></div>
|
|
|
+ </div>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="10">
|
|
|
+ <div>
|
|
|
+ <p class="title">表格数据</p>
|
|
|
+ <el-table
|
|
|
+ :data="tableData"
|
|
|
+ style="width: 100%"
|
|
|
+ width="900px"
|
|
|
+ size="small"
|
|
|
+ border>
|
|
|
+ <el-table-column
|
|
|
+ prop="stagename"
|
|
|
+ label="阶段"
|
|
|
+ width="120">
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column
|
|
|
+ prop="projectqty"
|
|
|
+ label="项目数"
|
|
|
+ width="100">
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column
|
|
|
+ prop="signamount_due"
|
|
|
+ label="预计签约金额(万元)">
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </div>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+
|
|
|
</div>
|
|
|
+
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
@@ -50,15 +74,124 @@ export default {
|
|
|
return {
|
|
|
chartPie:null,
|
|
|
tableData:[],
|
|
|
- data:[{ stagename: '简历筛选', sequence1: 253 },]
|
|
|
+ person:'',
|
|
|
+ depment:'',
|
|
|
+ dateType:"",
|
|
|
+ data:[{ stagename: '简历筛选', sequence1: 253 },],
|
|
|
+ activeName: '部门',
|
|
|
+ dataid:'',
|
|
|
+ range:'',
|
|
|
+ pointValue:'',
|
|
|
+ isDep:false,
|
|
|
+ isPerson:false,
|
|
|
+ visible:false,
|
|
|
+ deplist:[],
|
|
|
+ personnelList:[],
|
|
|
+ depmentParam:{
|
|
|
+ "id": 20230620102004,
|
|
|
+ "content": {
|
|
|
+ }
|
|
|
+ },
|
|
|
+ dataParam:{
|
|
|
+ "id": 20230630151504,
|
|
|
+ "content": {
|
|
|
+ "type":0, // 0 按人搜素 1 按部门搜索
|
|
|
+ "dataid":0, // 人员id或部门id
|
|
|
+ 'dateType':1,
|
|
|
+ "where": {
|
|
|
+ "begindate": "",
|
|
|
+ "enddate":"",
|
|
|
+ "departmentid":""
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
},
|
|
|
methods:{
|
|
|
+ async departmentrtment() {
|
|
|
+ const res = await this.$api.requested(this.depmentParam)
|
|
|
+ this.deplist = this.createMenu(res.data.dep)
|
|
|
+ this.personnelList = res.data.hr
|
|
|
+ /*this.range = JSON.parse(window.sessionStorage.getItem('active_account')).name*/
|
|
|
+ this.renderPie()
|
|
|
+ },
|
|
|
+ createMenu (array) {
|
|
|
+ var that = this
|
|
|
+ let arr = []
|
|
|
+ function convertToElementTree(node) {
|
|
|
+ // 新节点
|
|
|
+ if (node.subdep.length === 0){
|
|
|
+ var elNode = {
|
|
|
+ label: node["depname"],
|
|
|
+ parentid:node['parentid'],
|
|
|
+ parentname:node['parentname'],
|
|
|
+ departmentid:node["departmentid"],
|
|
|
+ value:node["departmentid"],
|
|
|
+ remarks:node["remarks"],
|
|
|
+ isused:node["isused"],
|
|
|
+ changedate:node['changedate'],
|
|
|
+ changeby:node['changeby'],
|
|
|
+ createdate:node['createdate'],
|
|
|
+ createby:node['createby'],
|
|
|
+ depno:node['depno'],
|
|
|
+ disabled:that.pageOnlyRead,
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ var elNode = {
|
|
|
+ label: node["depname"],
|
|
|
+ parentid:node['parentid'],
|
|
|
+ parentname:node['parentname'],
|
|
|
+ departmentid:node["departmentid"],
|
|
|
+ value:node["departmentid"],
|
|
|
+ remarks:node["remarks"],
|
|
|
+ isused:node["isused"],
|
|
|
+ changedate:node['changedate'],
|
|
|
+ changeby:node['changeby'],
|
|
|
+ createdate:node['createdate'],
|
|
|
+ createby:node['createby'],
|
|
|
+ depno:node['depno'],
|
|
|
+ disabled:that.pageOnlyRead,
|
|
|
+ children: []
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (node.subdep && node.subdep.length > 0) {
|
|
|
+ // 如果存在子节点
|
|
|
+ for (var index = 0; index < node.subdep.length; index++) {
|
|
|
+ // 遍历子节点, 把每个子节点看做一颗独立的树, 传入递归构造子树, 并把结果放回到新node的children中
|
|
|
+ elNode.children.push(convertToElementTree(node.subdep[index]));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return elNode;
|
|
|
+ }
|
|
|
+ array.forEach((element) => {
|
|
|
+ arr.push(convertToElementTree(element))
|
|
|
+ });
|
|
|
+ return arr
|
|
|
+ },
|
|
|
+ selectDep(val) {
|
|
|
+ console.log(val)
|
|
|
+ this.person = ''
|
|
|
+ this.dataParam.content.type = 1
|
|
|
+ this.dataParam.content.dataid = val[0]
|
|
|
+ this.getProportionOfFileModel()
|
|
|
+ },
|
|
|
+ selectPerson(val){
|
|
|
+ console.log(val)
|
|
|
+ this.depment = ''
|
|
|
+ this.dataParam.content.type = 0
|
|
|
+ this.dataParam.content.dataid = val
|
|
|
+ console.log(this.dataParam)
|
|
|
+ this.getProportionOfFileModel()
|
|
|
+ },
|
|
|
+ dataChange(val){
|
|
|
+ this.dataParam.content.dateType = val
|
|
|
+ this.getProportionOfFileModel()
|
|
|
+ },
|
|
|
renderPie() {
|
|
|
const colorArray = ['#6395fa','#63daab','#657798','#f7c122','#7666fa','#75cbed'];
|
|
|
this.chartPie = new Funnel('containerFunnel', {
|
|
|
data: this.data,
|
|
|
- maxSize:0.3,
|
|
|
+ maxSize:0.6,
|
|
|
xField: 'stagename',
|
|
|
yField: 'sequence1',
|
|
|
shape: 'pyramid',
|
|
|
@@ -72,7 +205,7 @@ export default {
|
|
|
const group = new G.Group({});
|
|
|
const content = ()=>{
|
|
|
if (this.tableData[0]) {
|
|
|
- const text = `${datum.stagename} 当前项目数: ${datum.projectqty} 项目数: ${this.tableData[0].projectqty} 转化率: ${((datum[Funnel.CONVERSATION_FIELD][1] / datum[Funnel.CONVERSATION_FIELD][0]) * 100).toFixed(2)}% 总投资金额: ${datum.totalinvestment} 总计项目预算: ${datum.budgetary} 总预计签约金额: ${datum.signamount_due}`
|
|
|
+ const text = `${datum.stagename} 当前项目数: ${datum.projectqty} 项目数: ${this.tableData[0].projectqty} 转化率: ${datum.zhl?datum.zhl* 100 + '%':'--'} 预计签约金额: ${datum.signamount_due}万元`
|
|
|
const lines = text.split(' ');
|
|
|
return lines.join('\n');
|
|
|
}
|
|
|
@@ -92,7 +225,7 @@ export default {
|
|
|
group.addShape({
|
|
|
type: 'text',
|
|
|
attrs: {
|
|
|
- x: 30,
|
|
|
+ x: 40,
|
|
|
y: 0,
|
|
|
text: content(),
|
|
|
textAlign: 'left',
|
|
|
@@ -102,7 +235,7 @@ export default {
|
|
|
},
|
|
|
});
|
|
|
return group;
|
|
|
-
|
|
|
+
|
|
|
},
|
|
|
},
|
|
|
tooltip:{
|
|
|
@@ -128,26 +261,31 @@ export default {
|
|
|
},
|
|
|
});
|
|
|
this.chartPie.render();
|
|
|
+ /*this.departmentrtment()*/
|
|
|
this.getProportionOfFileModel()
|
|
|
},
|
|
|
async getProportionOfFileModel () {
|
|
|
- let param = {
|
|
|
+ /* let param = {
|
|
|
"id": 20230630151504,
|
|
|
"content": {
|
|
|
- "where": {
|
|
|
- "begindate": "",
|
|
|
- "enddate":"",
|
|
|
- "departmentid":""
|
|
|
- }
|
|
|
+ "type":'', // 0 按人搜素 1 按部门搜索
|
|
|
+ "dataid":"", // 人员id或部门id
|
|
|
+ "where": {
|
|
|
+ "begindate": "",
|
|
|
+ "enddate":"",
|
|
|
+ "departmentid":""
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
- const res = await this.$api.requested(param)
|
|
|
+ }*/
|
|
|
+ console.log(this.dataParam,'dataParam')
|
|
|
+ const res = await this.$api.requested(this.dataParam)
|
|
|
this.tableData = res.data
|
|
|
this.chartPie.changeData(res.data)
|
|
|
}
|
|
|
},
|
|
|
mounted () {
|
|
|
- this.renderPie()
|
|
|
+ /* this.renderPie()*/
|
|
|
+ this.departmentrtment()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -166,6 +304,6 @@ export default {
|
|
|
border-left: .3rem solid #3874F6;
|
|
|
}
|
|
|
.container{
|
|
|
- height:calc(100vh - 200px)
|
|
|
+ height:calc(100vh - 180px)
|
|
|
}
|
|
|
</style>
|