Commit 06078688 authored by lcl's avatar lcl

Merge branch 'dev20230707' of http://192.168.60.201/root/dsk-operate-sys into dev20230707

# Conflicts:
#	dsk-system/src/main/java/com/dsk/system/service/impl/BusinessOverviewServiceImpl.java
parents fb7f4683 e7c68638
package com.dsk.web.controller.business;
import com.alibaba.fastjson2.JSONObject;
import com.dsk.common.core.controller.BaseController;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.utils.SecurityUtils;
......@@ -8,6 +9,7 @@ import com.dsk.system.service.IBusinessOverviewService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
......@@ -46,4 +48,22 @@ public class BusinessOverviewController extends BaseController {
public AjaxResult typeAnalyze(){
return AjaxResult.success(baseService.typeAnalyze(new BusinessSearchDto(SecurityUtils.getUserId(),2)));
}
/**
* 公招项目地区统计
* @return
*/
@GetMapping("/countGroupByProvince")
public AjaxResult countGroupByProvince(@RequestBody JSONObject object){
return baseService.countGroupByProvince(object);
}
/**
* 公招项目投资金额统计
* @return
*/
@GetMapping("/rangByMoney")
public AjaxResult rangByMoney(@RequestBody JSONObject object){
return baseService.rangByMoney(object);
}
}
......@@ -43,7 +43,7 @@ public class EnterpriseBussinessController {
@ApiOperation(value = "客户项目列表(openApi)")
@RequestMapping(value = "/clientProjectPage", method = RequestMethod.POST)
public Map<String, Object> clientProjectPage(@RequestBody @Valid EnterpriseBussinessClientProjectPageBody paramMap) throws Exception {
public TableDataInfo clientProjectPage(@RequestBody @Valid EnterpriseBussinessClientProjectPageBody paramMap) throws Exception {
return enterpriseBussinessService.clientProjectPage(paramMap);
}
......@@ -67,7 +67,7 @@ public class EnterpriseBussinessController {
@ApiOperation(value = "供应商项目列表(openApi)")
@RequestMapping(value = "/supplierProjectPage",method = RequestMethod.POST)
public Map<String, Object> supplierProjectPage(@RequestBody @Valid EnterpriseBussinessSupplierProjectPageBody paramMap) throws Exception {
public TableDataInfo supplierProjectPage(@RequestBody @Valid EnterpriseBussinessSupplierProjectPageBody paramMap) throws Exception {
return enterpriseBussinessService.supplierProjectPage(paramMap);
}
......@@ -102,4 +102,24 @@ public class EnterpriseBussinessController {
}
@ApiOperation(value = "中标公示详情")
@RequestMapping(value = "/bidWinMergeDetail", method = RequestMethod.POST)
public R bidWinMergeDetail(@RequestBody EnterpriseBusinessBidWinMergeDetailBody paramMap) throws Exception {
return enterpriseBussinessService.bidWinMergeDetail(paramMap);
}
@ApiOperation(value = "四库业绩详情")
@RequestMapping(value = "/skyProjectDetail", method = RequestMethod.POST)
public R skyProjectDetail(@RequestBody EnterpriseBusinessSkyProjectDetailBody paramMap) throws Exception {
return enterpriseBussinessService.skyProjectDetail(paramMap);
}
@ApiOperation(value = "荣誉奖项详情")
@RequestMapping(value = "/awardDetail", method = RequestMethod.POST)
public R awardDetail(@RequestBody EnterpriseBusinessAwardDetailBody paramMap) throws Exception {
return enterpriseBussinessService.awardDetail(paramMap);
}
}
package com.dsk.common.core.domain.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import javax.validation.constraints.NotNull;
@Data
@ToString
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class EnterpriseBusinessAwardDetailBody {
/**
* id
*/
@NotNull(message = "id不能为空")
private String sourceId;
}
package com.dsk.common.core.domain.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@ToString
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class EnterpriseBusinessAwardDetailVo {
/**
* 来源名称
*/
private String sourceName;
/**
* 来源url
*/
private String sourceUrl;
}
package com.dsk.common.core.domain.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import javax.validation.constraints.NotNull;
@Data
@ToString
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class EnterpriseBusinessBidWinMergeDetailBody {
/**
* 来源id
*/
@NotNull(message = "id不能为空")
private String sourceId;
}
package com.dsk.common.core.domain.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import javax.validation.constraints.NotNull;
@Data
@ToString
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class EnterpriseBusinessSkyProjectDetailBody {
/**
* id
*/
@NotNull(message = "id不能为空")
private Long sourceId;
}
......@@ -36,4 +36,15 @@ public class EnterpriseBussinessClientPageBody extends BasePage {
return 0 == cid;
}
/**
* 来源
*/
private List<String> sources;
/**
* 项目类型
*/
private List<String> projects;
}
......@@ -7,6 +7,7 @@ import lombok.ToString;
import javax.validation.constraints.AssertFalse;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
@ToString
......@@ -20,10 +21,10 @@ public class EnterpriseBussinessClientProjectPageBody extends BasePage {
private Integer cid;
/**
* 企业id
* 客户企业Id
*/
@NotNull(message = "企业id不能为空")
private Integer unitId;
private Integer companyId;
/**
* 查询关键字
......@@ -32,7 +33,29 @@ public class EnterpriseBussinessClientProjectPageBody extends BasePage {
public boolean isVaildCid() {
return 0 == cid || 0 == unitId;
return 0 == cid || 0 == companyId;
}
/**
* 来源
*/
private List<String> sources;
/**
* 项目类型
*/
private List<String> projects;
/**
* 金额起
*/
private Double amountStart;
/**
* 金额止
*/
private Double amountEnd;
}
......@@ -7,6 +7,7 @@ import lombok.ToString;
import javax.validation.constraints.AssertFalse;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
@ToString
......@@ -34,4 +35,15 @@ public class EnterpriseBussinessSupplierPageBody extends BasePage {
public boolean isVaildCid() {
return 0 == cid;
}
/**
* 来源
*/
private List<String> sources;
/**
* 项目类型
*/
private List<String> projects;
}
......@@ -7,6 +7,7 @@ import lombok.ToString;
import javax.validation.constraints.AssertFalse;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
@ToString
......@@ -20,10 +21,10 @@ public class EnterpriseBussinessSupplierProjectPageBody extends BasePage {
private Integer cid;
/**
* 企业id
* 供应商企业Id
*/
@NotNull(message = "企业id不能为空")
private Integer unitId;
private Integer companyId;
/**
* 查询关键字
......@@ -32,8 +33,28 @@ public class EnterpriseBussinessSupplierProjectPageBody extends BasePage {
public boolean isVaildCid() {
return 0 == cid || 0 == unitId;
return 0 == cid || 0 == companyId;
}
/**
* 来源
*/
private List<String> sources;
/**
* 项目类型
*/
private List<String> projects;
/**
* 金额起
*/
private Double amountStart;
/**
* 金额止
*/
private Double amountEnd;
}
package com.dsk.common.core.domain.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@ToString
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class EnterpriseBussinessVo {
/**
* 来源Id
*/
private String source_id;
/**
* 类型
*/
private String source_type;
}
import request from "@/utils/request";
// 集团成员列表
export function memberList(data) {
return request({
url: '/combine/info/memberList',
method: 'post',
data: data
})
}
// 集团成员-主营业务
export function memberCount(data) {
return request({
url: '/combine/info/group/memberCount',
method: 'post',
data: data
})
}
// 集团资质列表
export function certificateList(data) {
return request({
url: '/combine/info/certificateList',
method: 'post',
data: data
})
}
// 集团资质列表-详情
export function memberCertificateList(data) {
return request({
url: '/combine/info/member/certificateList',
method: 'post',
data: data
})
}
// 集团资质分组统计
export function certificateCount(data) {
return request({
url: '/combine/info/group/certificateCount',
method: 'post',
data: data
})
}
// 集团业绩列表
export function businessList(data) {
return request({
url: '/combine/info/businessList',
method: 'post',
data: data
})
}
......@@ -100,7 +100,16 @@ export function countNewsBidByMonth(param) {
data: param
})
}
//全国商机项目分析-全国土地交易项目年份统计
//全国中标市场分析-全国中标项目统计
export function countBidByType(param) {
return request({
url: '/marketAnalysis/countBidByType',
method: 'POST',
data: param
})
}
//全国中标市场分析-全国各地区中标统计TOP10
export function countBidGroupByProvince(param) {
return request({
url: '/marketAnalysis/countBidGroupByProvince',
......@@ -108,6 +117,37 @@ export function countBidGroupByProvince(param) {
data: param
})
}
//全国中标市场分析-全国中标金额分析
export function rangeBidMoney(param) {
return request({
url: '/marketAnalysis/rangeBidMoney',
method: 'POST',
data: param
})
}
//全国中标市场分析-全国中标趋势分析
export function rangeBidFiveYears() {
return request({
url: '/marketAnalysis/rangeBidFiveYears',
method: 'POST',
})
}
//全国中标市场分析-全国中标下浮率分析
export function lowerRateByYear(param) {
return request({
url: '/marketAnalysis/lowerRateByYear',
method: 'POST',
data: param
})
}
//全国中标市场分析-全国中标业绩项目类型下浮率
export function lowerRangeTenderType(param) {
return request({
url: '/marketAnalysis/lowerRangeTenderType',
method: 'POST',
data: param
})
}
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -77,6 +77,7 @@ export const constantRoutes = [
{
path: '',
component: Layout,
hidden: true,
redirect: 'urban',
children: [
{
......@@ -101,6 +102,20 @@ export const constantRoutes = [
}
]
},
{
path: '/groupAccount',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: '/groupAccount/:id',
component: () => import('@/views/detail/groupAccount/index'),
name: 'GroupAccount',
meta: { title: '集团户详情', icon: 'enterprise', noCache: false },
}
]
},
{
path: '/enterprise',
component: Layout,
......
<template>
<div id="detailPart" class="sides-container" :style="sideHeight?'height:'+sideHeight+'px':''">
<el-input
placeholder="搜索"
class="side-input"
v-model="searchText"
clearable
@input="handleSearch(true)"
@keyup.enter.native="handleSearch()">
<i slot="prefix" class="el-input__icon el-icon-search" @click="handleSearch()"></i>
</el-input>
<el-menu
ref="sideMenu"
:unique-opened="true"
:default-active="searchIndex?searchIndex:routeIndex"
class="detail-menu"
@open="handleOpen">
<template v-for="(item, index) in sideRoute">
<template>
<el-menu-item :index="index.toString()" @click="handleItem(item)">{{item.title}}</el-menu-item>
</template>
</template>
</el-menu>
</div>
</template>
<script>
export default {
name: 'Sidebar',
props: {
partBoxHeight: {
type: Number,
default: null
},
pathName: {
type: String,
default: null
},
customerId: {
type: String,
default: ''
},
isCompany: {
type: Boolean,
default: true
},
},
data() {
return {
searchText: '',
sideRoute: [
{title: '集团成员', pathName: 'members'},
{title: '集团资质', pathName: 'qualifications'},
{title: '集团业绩', pathName: 'performance'},
],
defaultRoute: [],
customer:[
'members',
'qualifications',
'performance',
],
uniqueOpened:false,
searchIndex: ''
}
},
computed: {
sideHeight() {
let sideHeight = document.getElementById("detailPart")?document.getElementById("detailPart").offsetHeight:null, bowerHeight = document.body.clientHeight-170 || null
if(this.partBoxHeight<bowerHeight) {
sideHeight = bowerHeight
}else{
sideHeight = '1222'/*this.partBoxHeight*/
}
return sideHeight
},
routeIndex(){
let idx = this.getRouteIdx('', this.pathName) || '0'
return idx
}
},
created() {
this.defaultRoute = JSON.parse(JSON.stringify(this.sideRoute))
},
watch:{
},
methods: {
handleOpen(key, keyPath) {
},
handleItem(item){
this.$emit("currentPath", item)
},
handleSearch(flag){
if((this.searchText&&!flag) || (!this.searchText&&flag)){
let idx = this.getRouteIdx(this.searchText)
if(idx){
if(idx.includes('-')){
let openIdx = idx.slice(0, 1)
this.sideRoute = [this.defaultRoute[openIdx]]
this.$refs.sideMenu.open(openIdx)
}else{
this.sideRoute = [this.defaultRoute[idx]]
}
this.searchIndex = '-1'
}else{
this.sideRoute = this.defaultRoute
this.searchIndex = ''
}
}
},
getRouteIdx(pathTitle, pathName){
let idx = '', sideArr = this.sideRoute==this.defaultRoute?this.sideRoute:this.defaultRoute
for(let i=0; i < sideArr.length; i++){
if(sideArr[i].title == pathTitle || sideArr[i].pathName == pathName){
idx = i.toString()
break
}else if(sideArr[i].children){
for(let j=0; j< sideArr[i].children.length ; j++){
if(sideArr[i].children[j].title == pathTitle || sideArr[i].children[j].pathName == pathName){
idx = i+'-'+j
break
}
}
}
}
return idx
},
}
}
</script>
<style lang="scss" scoped>
#app{
.sides-container{
width: 144px;
min-height: calc(100vh - 170px);
padding-bottom: 20px;
background: #FFFFFF;
border-radius: 4px;
.side-input{
width: 128px;
margin-top: 16px;
margin-left: 8px;
border: 0;
::v-deep .el-input__inner{
height: 32px;
background: #F3F3F4;
border-radius: 20px;
border: 0;
&::placeholder {
color: #3D3D3D;
}
}
.el-icon-search{
line-height: 34px;
color: #0081FF;
cursor: pointer;
}
}
.detail-menu{
margin-top: 20px;
border-right: 0;
::v-deep .el-menu-item, ::v-deep .el-submenu__title{
height: 30px;
line-height: 30px;
font-size: 14px;
color: #232323;
padding: 0 0 0 16px !important;
text-align: initial !important;
&:hover, &:focus, &.is-active{
color: #0081FF !important;
background: linear-gradient(91deg, rgba(0,129,255,0.1) 0%, rgba(0,129,255,0) 100%);;
}
.el-submenu__icon-arrow{
color: #232323;
right: 48px;
margin-top: -5px;
}
}
.is-disabled:hover{
color: rgba(35, 35, 35, 0.8)!important;
&:before {
color: rgba(35, 35, 35, 0.8)!important;
}
}
::v-deep .el-submenu .el-menu-item{
font-size: 12px;
color: rgba(35,35,35,0.8);
padding: 0 0 0 27px !important;
min-width: 144px !important;
position: relative;
&:before {
content: "";
position: absolute;
top: 14px;
left: 21px;
width: 2px;
height: 2px;
background: #0081FF;
border-radius: 50%;
}
}
}
}
}
</style>
<template>
<div class="members">
<head-form
title="集团成员"
:form-data="formData"
:query-params="queryParams"
:total="tableDataTotal"
:isExcel="false"
@handle-search="handleSearch"
>
<template slot="slot">
<div class="search-box">
<span class="search-box-t"
:class=" queryParams.companyType||
queryParams.companyTypes.length > 0 ? 'search-box-ta' : ''"
@click="handleSearch1">筛选<i :class="searchState ? 'el-icon-caret-top' : 'el-icon-caret-bottom'"></i></span>
<div v-show="searchState" ref="showContent" class="search-main">
<div class="item">
<span class="wrap_label">科技型企业</span>
<div class="item_ckquery">
<!--<span :class="{color_text:queryParams.companyTypes.length == 0}" @click="changeBeCurrent('','companyTypes')">全部</span>-->
<template v-for="(item,index) in kjxqy">
<span :class="{color_text:queryParams.companyTypes.includes(item.value)}" @click="changeBeCurrent(item.value,'companyTypes')">{{item.name}}</span>
</template>
</div>
</div>
<div class="item">
<span class="wrap_label">企业类型</span>
<div class="item_ckquery">
<!--<span :class="{color_text:queryParams.companyTypes.length == 0}" @click="changeBeCurrent('','companyTypes')">全部</span>-->
<template v-for="(item,index) in qyType">
<span :class="{color_text:item.dictValue == queryParams.companyType}" @click="handleChange('1',item.dictValue)">{{item.dictLabel}}</span>
</template>
</div>
</div>
<div class="item">
<span class="wrap_label">持股比例</span>
<div class="item_ckquery">
<template v-for="(item,index) in cgblList">
<span :class="{color_text:item == cgblName}" @click="handleChange('2',item)">{{item}}</span>
</template>
</div>
</div>
</div>
</div>
</template>
</head-form>
<skeleton style="margin-left:16px;" v-if="isSkeleton"></skeleton>
<tables
v-if="!isSkeleton"
:indexFixed="true"
:defaultSort="defaultSort"
:tableLoading="tableLoading"
:tableData="tableData"
:forData="forData"
:tableDataTotal="tableDataTotal"
:queryParams="queryParams"
@handle-current-change="handleCurrentChange"
@sort-change="sortChange"
>
<template slot="companyName" slot-scope="scope">
<router-link :to="scope.row.uipId?`/enterprise/${encodeStr(scope.row.companyId)}`:`/company/${encodeStr(scope.row.companyId)}`" tag="a" class="a-link" v-if="scope.row.companyId&&scope.row.companyName" v-html="scope.row.companyName"></router-link>
<div v-else v-html="scope.row.companyName || '--'"></div>
</template>
</tables>
</div>
</template>
<script>
import {memberList,memberCount} from '@/api/detail/groupAccount/groupAccount'
import dataRegion from '@/assets/json/dataRegion'
import { getDictType } from '@/api/main'
import mixin from '../../party-a/mixins/mixin'
export default {
name: 'members',
props: ['companyId'],
mixins: [mixin],
data(){
return{
isSkeleton:true,
tableLoading:false,
isDetails: false,
defaultSort: {prop: 'time', order: 'descending'},
queryParams: {
combineId: '81de7ca2a967d91c2afad9cb5fc30e6d',
pageNum: 1,
pageSize: 20,
companyTypes:[],
companyType:'',
},
forData: [
{label: '企业名称', prop: 'companyName', minWidth: '200', slot: true},
{label: '成员层级', prop: 'combineMemberLevel', minWidth: '100'},
{label: '法定代表人', prop: 'corporatePerson', minWidth: '100'},
{label: '注册资本', prop: 'regCapital', minWidth: '150', sortable: 'custom', descending: '3', ascending: '4'},
{label: '持股比例(%)', prop: 'stockPercent', minWidth: '150', sortable: 'custom', descending: '3', ascending: '4'},
{label: '成立日期', prop: 'registeredDate', minWidth: '150'},
{label: '企业地区', prop: 'address', minWidth: '150'},
],
formData: [
{ type: 4, fieldName: 'combineMemberLevel', value: '', placeholder: '成员层级', options:[]},
{ type: 4, fieldName: 'businessType', value: '', placeholder: '主营业务', options:[]},
{ type: 7, fieldName: 'province', value: '',props: {multiple: true}, placeholder: '地区', options:[]},
{ type: 6, fieldName: 'money', value: '', placeholder: '注册资本', startMoney: 'minAmount', endMoney: 'maxAmount',moneyList:[] },
{ type: 0, fieldName: 'penalizeReasonType', value: '', placeholder: '筛选', options: []},
{ type: 3, fieldName: 'searchValue', value: '', placeholder: '输入关键词查询'},
],
cycj:[
{
name:'子集团',
value:'子集团'
},
{
name:'集团本身',
value:'集团本身'
},
{
name:'一级子公司',
value:'一级子公司'
},
{
name:'二级子公司',
value:'二级子公司'
},
{
name:'三级子公司',
value:'三级子公司'
},
],
kjxqy:[
{
name:'高新技术企业',
value:'3.2.1.'
},
{
name:'科技型中小企业',
value:'3.2.2.'
},
{
name:'国家级企业技术中心',
value:'3.2.3.'
},
{
name:'省级企业技术中心',
value:'3.2.4.'
},
{
name:'专精特新',
value:'3.2.5.'
},
{
name:'雏鹰企业',
value:'3.2.6.'
},
{
name:'小巨人企业',
value:'3.2.7.'
},
],
tableData:[],
tableDataTotal:0,
searchState:false,
moneyList: ['1000万以下', '1000万-5000万', '5000万-1亿', '1亿-10亿','10亿以上', '自定义'],
qyType:[],
cgblList:['100%','50%以上','20%以上','5%以上','1%-5%'],
cgblName:''
}
},
watch:{
searchState:{
handler(newVal, olVal) {
if (newVal) {
setTimeout(() => {
document.addEventListener('click', this.handleSearch1);
}, 0);
} else {
document.removeEventListener('click', this.handleSearch1);
}
}
}
},
created() {
this.handleQuery()
this.getMemberCount()
this.dataRegion()
this.formData[0].options=this.cycj;
this.formData[3].moneyList=this.moneyList;
//企业类型
getDictType('company_type_new').then(result=>{
let data = result.code == 200 ? result.data:[];
this.qyType=data;
})
},
methods: {
//主营业务
getMemberCount(){
memberCount({combineId: this.queryParams.combineId}).then(res=>{
let data = res.data
let list=[]
for(let key in data){
list.push({
name: key+ '(' + data[key] + ')',
value: key,
key:data[key],
disabled:data[key] !=0 ? false : true
})
}
list.sort(function(a, b) {
return b.key - a.key;
});
this.formData[1].options=list
})
},
// 筛选
handleSearch1(event){
// this.searchState=!this.searchState;
let dom = this.$refs.showContent;
if (!dom.contains(event.target)) {
this.searchState = !this.searchState;
document.removeEventListener('click', this.handleQuery);
}
},
handleQuery(params){
let data = this.getAreaList(params || this.queryParams)
memberList(data).then(res=>{
this.tableData = res.rows
this.tableDataTotal = res.total
this.isSkeleton = false
})
},
//地区
async dataRegion() {
var str = [];
for (let x = 0; x < 3; x++) {
for (let i = 0; i < dataRegion.length; i++) {
if (dataRegion[i].regionLevel == x + 1 && x + 1 == 1) {
str.push({
'id': dataRegion[i].id,
"label": dataRegion[i].regionName,
"short": dataRegion[i].short,
"value": dataRegion[i].parentId,
"children": []
});
} else if (dataRegion[i].regionLevel == x + 1 && x + 1 == 2) {
for (let j = 0; j < str.length; j++) {
if (str[j].id == dataRegion[i].parentId) {
str[j].children.push({
'id': dataRegion[i].id,
"label": dataRegion[i].regionName,
"short": dataRegion[i].short,
"value": dataRegion[i].parentId,
"children": []
});
}
}
} else if (dataRegion[i].regionLevel == x + 1 && x + 1 == 3) {
for (let j = 0; j < str.length; j++) {
for (let k = 0; k < str[j].children.length; k++) {
if (str[j].children[k].id == dataRegion[i].parentId) {
str[j].children[k].children.push({
'id': dataRegion[i].id,
"label": dataRegion[i].regionName,
"short": dataRegion[i].short,
"value": dataRegion[i].parentId
// "children":[]
});
}
}
}
}
}
}
this.addressList = str;
this.formData[2].options=str;
},
changeBeCurrent(index,name) {
if(index){
let i = this.queryParams[name].indexOf(index)
if(i == -1){
this.queryParams[name].push(index);
}else{
this.queryParams[name].splice(i,1);
}
}else{
this.queryParams[name] = []
}
this.handleQuery();
// this.$forceUpdate();
},
handleChange(key,name) {
if(key === '1'){
if(name === this.queryParams.companyType){
this.queryParams.companyType=''
}else {
this.queryParams.companyType=name
}
}
if(key === '2'){
if(name === this.cgblName){
this.cgblName=''
}else {
this.cgblName=name;
}
if(this.cgblName){
if(name === '100%'){
this.queryParams.minStockPercent=1
}
if(name === '50%以上'){
this.queryParams.minStockPercent=0.5
}
if(name === '20%以上'){
this.queryParams.minStockPercent=0.2
}
if(name === '5%以上'){
this.queryParams.minStockPercent=0.05
}
if(name === '1%-5%'){
this.queryParams.minStockPercent=0.01
this.queryParams.maxStockPercent=0.05
}
}else {
this.queryParams.minStockPercent=''
this.queryParams.maxStockPercent=''
}
}
this.handleQuery();
},
getAreaList(params){
if(params.province&&params.province.length>0){
let arr = this.$children[0].$refs.cascader[0].getCheckedNodes()
let provinceIds = [], cityIds = [], areaIds = []
for (var i in arr) {
if (arr[i].parent) {
if (!arr[i].parent.checked) {
if(arr[i].hasChildren || arr[i].level==2){
cityIds.push(arr[i].data.id)
}else{
areaIds.push(arr[i].data.id)
}
}
} else {
provinceIds.push(arr[i].data.id)
}
}
delete params.province
provinceIds.length>0?params.provinceIds = provinceIds:''
cityIds.length>0?params.cityIds = cityIds:''
areaIds.length>0?params.areaIds = areaIds:''
}
return params
},
sortChange({ column, prop, order }){
this.queryParams.field = prop
if(column.order === "ascending"){
this.queryParams.order = 'asc'
}else if(column.order === "descending"){
this.queryParams.order = 'desc'
}else {
this.queryParams.order=''
this.queryParams.field=''
}
this.pageIndex = 1;
this.handleQuery()
},
}
}
</script>
<style lang="scss" scoped>
.members{
background: #ffffff;
border-radius: 4px;
padding: 16px;
.headForm{
margin-bottom: 14px;
.common-title{
margin-right: 24px;
}
}
.search-box {
display: inline-block;
border-radius: 4px;
border: 1px solid #D9D9D9;
width: 82px;
/*cursor: pointer;*/
position: relative;
.search-box-t {
font-size: 14px;
font-weight: 400;
line-height: 32px;
color: #232323;
margin-right: 8px;
text-align: center;
width: 82px;
display: inline-block;
cursor: pointer;
i {
color: rgba(35, 35, 35, 0.4);
margin-left: 5px
}
}
.search-box-ta {
color: #0081FF;
i {
color: #0081FF;
}
}
.search-main{
background: #ffffff;
box-shadow: 0px 4px 10px 0px rgba(0,0,0,0.1);
border-radius: 4px;
width: 640px;
//height: 337px;
padding: 16px;
position: absolute;
top: 34px;
left: 0;
z-index: 2001;
.item{
margin-bottom: 5px;
display: flex;
/*align-items: center;*/
font-size: 14px;
.wrap_label{
color: rgba(35,35,35,0.8);
margin-right: 12px;
line-height: 30px;
width: 77px;
text-align: right;
/*float: left;*/
}
.item_ckquery{
position: relative;
width: 520px;
/*float: left;*/
/*flex: 1;*/
span{
color: #232323;
padding: 3px 6px;
margin-bottom: 5px;
display: inline-block;
cursor: pointer;
margin-right: 8px;
}
.color_text{
background: #F3F4F5;
border-radius: 4px;
color: #0081FF;
}
.select-active{
color: #0081FF;
}
}
.cascader-region {
position: absolute;
left: 0;
top: -6px;
opacity: 0;
line-height: 22px;
}
}
}
}
}
</style>
<template>
<div class="performance">
<head-form
title="集团业绩"
:form-data="formData"
:query-params="queryParams"
:total="tableDataTotal"
:isExcel="false"
@handle-search="handleSearch"
>
<template slot="slot">
</template>
</head-form>
<skeleton style="margin-left:16px;" v-if="isSkeleton"></skeleton>
<tables
v-if="!isSkeleton"
:indexFixed="true"
:defaultSort="defaultSort"
:tableLoading="tableLoading"
:tableData="tableData"
:forData="forData"
:tableDataTotal="tableDataTotal"
:queryParams="queryParams"
@handle-current-change="handleCurrentChange"
@sort-change="sortChange"
>
<template slot="bidTime" slot-scope="scope">
<div>{{formatDate(scope.row.bidTime)}}</div>
</template>
<template slot="companyName" slot-scope="scope">
<router-link :to="scope.row.uipId?`/enterprise/${encodeStr(scope.row.companyId)}`:`/company/${encodeStr(scope.row.companyId)}`" tag="a" class="a-link" v-if="scope.row.companyId&&scope.row.companyName" v-html="scope.row.companyName"></router-link>
<div v-else v-html="scope.row.companyName || '--'"></div>
</template>
<template slot="projectName" slot-scope="scope">
<router-link :to="`/biddetail/${scope.row.projectId}`" tag="a" class="a-link" v-if="scope.row.projectId" v-html="scope.row.projectName"></router-link>
<div v-else v-html="scope.row.projectName || '--'"></div>
</template>
<template slot="projectUnit" slot-scope="scope">
<router-link :to="scope.row.projectUnitUipId?`/enterprise/${encodeStr(scope.row.projectUnitId)}`:`/company/${encodeStr(scope.row.projectUnitId)}`" tag="a" class="a-link" v-if="scope.row.projectUnitId&&scope.row.projectUnit" v-html="scope.row.projectUnit"></router-link>
<div v-else v-html="scope.row.projectUnit || '--'"></div>
</template>
</tables>
</div>
</template>
<script>
import mixin from '../../party-a/mixins/mixin'
import {businessList} from '@/api/detail/groupAccount/groupAccount'
import dataRegion from '@/assets/json/dataRegion'
import { getDictType } from '@/api/main'
export default {
name: 'qualifications',
props: ['companyId'],
mixins: [mixin],
components:{},
data(){
return{
isSkeleton:true,
tableLoading:false,
isDetails: false,
defaultSort: {prop: 'time', order: 'descending'},
queryParams: {
combineId: '81de7ca2a967d91c2afad9cb5fc30e6d',
pageNum: 1,
pageSize: 20
},
forData: [
{label: '中标时间', prop: 'bidTime',slot: true,minWidth: '100'},
{label: '中标成员', prop: 'companyName', slot: true,minWidth: '150'},
{label: '持股比例(%)', prop: 'stockPercent',minWidth: '150'},
{label: '项目名称', prop: 'projectName', slot: true,minWidth: '200'},
{label: '中标金额(万元)', prop: 'bidAmount',minWidth: '150'},
{label: '中标地区', prop: 'address',minWidth: '100'},
{label: '业绩类型', prop: 'boundType',minWidth: '100'},
{label: '项目类型', prop: 'projectType',minWidth: '100'},
{label: '业主单位', prop: 'projectUnit', slot: true,minWidth: '200'},
],
formData: [
{ type: 7, fieldName: 'combineMemberLevel', value: '',props: {multiple: true}, placeholder: '项目地区', options:[]},
{ type: 5, fieldName: 'time', value: '', placeholder: '中标时间', startTime: 'startBidTime', endTime: 'endBidTime',timeList:[] },
{ type: 6, fieldName: 'money', value: '', placeholder: '中标金额', startMoney: 'minAmount', endMoney: 'maxAmount',moneyList:[] },
{ type: 4, fieldName: 'boundTypes', value: '', placeholder: '业绩类型', options: []},
{ type: 4, fieldName: 'projectTypes', value: '', placeholder: '项目类型', options: []},
{ type: 1, fieldName: 'cgbl', value: '', placeholder: '持股比例', options: []},
{ type: 3, fieldName: 'searchValue', value: '', placeholder: '搜索中标成员名称/项目名称'},
],
tableData:[],
tableDataTotal:0,
addressList: [],
cgblList: [
{name:'100%',value:'100%'},
{name:'50%以上',value:'50%以上'},
{name:'20%以上',value:'20%以上'},
{name:'5%以上',value:'5%以上'},
{name:'1%-5%',value:'1%-5%'},
],
timeList: ['近三天', '近七天', '近半月', '自定义'],
moneyList: ['5000万以下', '5000万-1亿', '1亿-5亿', '5亿-10亿','10亿以上', '自定义'],
}
},
created() {
this.dataRegion()
this.handleQuery()
this.formData[1].timeList=this.timeList;
this.formData[2].moneyList=this.moneyList;
this.formData[5].options=this.cgblList;
//业绩类型
getDictType('bound_type').then(result=>{
let data = result.code == 200 ? result.data:[];
if(data.length > 0){
for (var i=0;i<data.length;i++){
this.formData[3].options.push({
name: data[i].dictLabel,
value: data[i].dictValue,
})
}
}
})
//项目类型
getDictType('project_type_new').then(result=>{
let data = result.code == 200 ? result.data:[];
if(data.length > 0){
for (var i=0;i<data.length;i++){
this.formData[4].options.push({
name: data[i].dictLabel,
value: data[i].dictValue,
})
}
}
})
},
methods: {
handleQuery(params){
this.isSkeleton = true
let data = params ? params : this.queryParams;
if(data.cgbl){
if(data.cgbl === '100%'){
data.minStockPercent=1
}
if(data.cgbl === '50%以上'){
data.minStockPercent=0.5
}
if(data.cgbl === '20%以上'){
data.minStockPercent=0.2
}
if(data.cgbl === '5%以上'){
data.minStockPercent=0.05
}
if(data.cgbl === '1%-5%'){
data.minStockPercent=0.01
data.maxStockPercent=0.05
}
delete data.cgbl
}
businessList(data).then(res=>{
this.tableData = res.code == 200 ? res.rows:[]
this.tableDataTotal = res.total
this.isSkeleton = false
})
},
formatDate(timestamp) {
var time = new Date(timestamp)
let year = time.getFullYear();
let month = time.getMonth() + 1 >= 10 ? parseInt(time.getMonth() + 1) : "0" + parseInt(time.getMonth() + 1);
let day = time.getDate() >= 10 ? time.getDate() : "0" + time.getDate();
return year + '-' + month + '-' + day
},
//地区
async dataRegion() {
var str = [];
for (let x = 0; x < 3; x++) {
for (let i = 0; i < dataRegion.length; i++) {
if (dataRegion[i].regionLevel == x + 1 && x + 1 == 1) {
str.push({
'id': dataRegion[i].id,
"label": dataRegion[i].regionName,
"short": dataRegion[i].short,
"value": dataRegion[i].parentId,
"children": []
});
} else if (dataRegion[i].regionLevel == x + 1 && x + 1 == 2) {
for (let j = 0; j < str.length; j++) {
if (str[j].id == dataRegion[i].parentId) {
str[j].children.push({
'id': dataRegion[i].id,
"label": dataRegion[i].regionName,
"short": dataRegion[i].short,
"value": dataRegion[i].parentId,
"children": []
});
}
}
} else if (dataRegion[i].regionLevel == x + 1 && x + 1 == 3) {
for (let j = 0; j < str.length; j++) {
for (let k = 0; k < str[j].children.length; k++) {
if (str[j].children[k].id == dataRegion[i].parentId) {
str[j].children[k].children.push({
'id': dataRegion[i].id,
"label": dataRegion[i].regionName,
"short": dataRegion[i].short,
"value": dataRegion[i].parentId
// "children":[]
});
}
}
}
}
}
}
this.addressList = str;
this.formData[0].options=str;
},
}
}
</script>
<style lang="scss" scoped>
.performance{
background: #ffffff;
border-radius: 4px;
padding: 16px;
.headForm{
margin-bottom: 14px;
.common-title{
margin-right: 24px;
}
}
}
</style>
<template>
<div class="qualifications">
<head-form
title="集团资质"
:form-data="formData"
:query-params="queryParams"
:total="tableDataTotal"
:isExcel="false"
@handle-search="handleSearch"
/>
<skeleton style="margin-left:16px;" v-if="isSkeleton"></skeleton>
<tables
v-if="!isSkeleton"
:indexFixed="true"
:defaultSort="defaultSort"
:tableLoading="tableLoading"
:tableData="tableData"
:forData="forData"
:tableDataTotal="tableDataTotal"
:queryParams="queryParams"
@handle-current-change="handleCurrentChange"
@sort-change="sortChange"
>
<template slot="companyCount" slot-scope="scope">
<div style="cursor: pointer;color: #0081FF;" @click="handleClick($event, scope.row)" v-html="scope.row.companyCount || '--'"></div>
</template>
</tables>
<qualifications-detail
v-if="isDetails"
:data="rowData"
:title="title"
@cancel="isDetails=false" />
</div>
</template>
<script>
import mixin from '../../party-a/mixins/mixin'
import {certificateList,certificateCount} from '@/api/detail/groupAccount/groupAccount'
import QualificationsDetail from './qualificationsDetail'
export default {
name: 'qualifications',
props: ['companyId','companyInfo'],
mixins: [mixin],
components:{
QualificationsDetail
},
data(){
return{
isSkeleton:true,
tableLoading:false,
isDetails: false,
defaultSort: {prop: 'time', order: 'descending'},
queryParams: {
combineId:'54355f88a5b16d3e52f74931f5567853',
pageNum: 1,
pageSize: 10
},
forData: [
{label: '资质名称', prop: 'qualificationName'},
{label: '拥有该资质成员', prop: 'companyCount', slot: true},
],
formData: [
{ type: 4, fieldName: 'combineMemberLevel', value: '', placeholder: '筛选', options:[]},
],
tableData:[],
tableDataTotal:0,
title:'',
rowData:''
}
},
created() {
this.handleQuery()
this.getCertificateList()
},
methods: {
handleQuery(params){
this.isSkeleton = true
let data = params ? params : this.queryParams
certificateList(data).then(res=>{
this.tableData = res.rows
this.tableDataTotal = res.total
this.isSkeleton = false
})
},
getCertificateList(){
certificateCount({combineId: this.queryParams.combineId}).then(res=>{
let data = res.data
for(let i=0; i<data.length; i++){
this.formData[0].options.push({
name: data[i].qualificationName+ '(' + data[i].companyCount + ')',
value: data[i].qualificationType,
})
}
})
},
handleClick(e, data) {
this.title=this.companyInfo.companyName+data.qualificationName+'('+ data.companyCount +')'
this.rowData = data
this.isDetails = true
},
}
}
</script>
<style lang="scss" scoped>
.qualifications{
background: #ffffff;
border-radius: 4px;
padding: 16px;
.headForm{
margin-bottom: 14px;
.common-title{
margin-right: 24px;
}
}
}
</style>
<template>
<div class="client-details">
<el-drawer
:visible.sync="drawer"
size="40%"
custom-class="client-drawer"
:with-header="false"
@closed="cancel">
<tables
:indexFixed="true"
:tableLoading="tableLoading"
:tableData="tableData"
:forData="forData"
:tableDataTotal="tableDataTotal"
:queryParams="queryParams"
@handle-current-change="handleCurrentChange"
style="margin: 12px;"
>
<template slot="companyName" slot-scope="scope">
<router-link :to="scope.row.uipId?`/enterprise/${encodeStr(scope.row.companyId)}`:`/company/${encodeStr(scope.row.companyId)}`" tag="a" class="a-link" v-if="scope.row.companyId&&scope.row.companyName" v-html="scope.row.companyName"></router-link>
<div v-else v-html="scope.row.companyName || '--'"></div>
</template>
</tables>
</el-drawer>
</div>
</template>
<script>
import mixin from '../../party-a/mixins/mixin'
import {memberCertificateList} from '@/api/detail/groupAccount/groupAccount'
export default {
props: [
'data',
'title'
],
components: { },
mixins: [mixin],
data() {
return {
drawer: false,
queryParams: {
id: this.data.id,
pageNum: 1,
pageSize: 10
},
formData: [
{ type: 3, fieldName: 'keys', value: '', placeholder: '输入项目/工程名称查询', options: []},
],
forData: [
{label: '拥有该资质成员', prop: 'companyName', slot: true},
{label: '成员共有资质(个)', prop: 'certificateCount'},
],
//列表
tableLoading:false,
tableData:[],
tableDataTotal:0,
amountTotal: 0
}
},
created() {
this.drawer = true
this.handleQuery()
},
methods: {
async handleQuery(params) {
this.tableLoading = true
let param = params?params:this.queryParams
let res = await memberCertificateList(param)
this.tableLoading = false
if(res.code==200){
this.tableData = res.rows
}
this.tableDataTotal = res.total
// this.amountTotal = res.totalAmount
},
handlePic(url, isPic){
isPic ? url = 'https://imgs.jiansheku.com/'+url : ''
if(url){
window.open(url, "_blank")
}
},
linkTo(scope){
this.drawer = false
this.$router.push(`/biddetail/${scope.row.id}`)
},
cancel() {
this.$emit('cancel')
}
}
}
</script>
<style lang="scss" scoped>
.client-details {
::v-deep .client-drawer{
background: #FFFFFF;
}
.tip-img{
width: 14px;
height: 14px;
margin-right: 4px;
cursor: pointer;
}
}
</style>
<template>
<el-skeleton animated>
<template slot="template">
<el-skeleton-item variant="text" style="width: 60%;"/>
<el-skeleton-item variant="text" style="width: 100%;" />
<el-skeleton-item variant="text" style="width: 100%;" />
<el-skeleton-item variant="text" style="width: 100%;" />
<el-skeleton-item variant="text" style="width: 60%;" />
<el-skeleton-item variant="text" style="width: 100%;" />
<el-skeleton-item variant="text" style="width: 100%;" />
<el-skeleton-item variant="text" style="width: 100%;" />
</template>
</el-skeleton>
</template>
<script>
export default {
name: 'skeleton'
}
</script>
<style lang="scss" scoped>
.el-skeleton__item{
height: 20px;
border-radius: 0;
margin: 9px 0;
background: #f0f0f0;
}
</style>
<template>
<div class="app-container group-container">
<div class="header-container">
<div class="flex-box part-header">
<img class="header-logo" :src="require('@/assets/images/detail/company_logo.png')">
{{name || '--'}}
</div>
</div>
<div class="flex-box group-main">
<div class="group-left">
<side-bar ref="sidebar" @currentPath="showPartPage" :pathName="currentPath.pathName" :customerId="customerId"/>
</div>
<div class="group-right">
<div id="groupBox" v-if="customerId">
<Members v-if="currentPath.pathName=='members'" :company-id="companyId" :isSkeleton="isSkeleton" :companyInfo="companyInfo" />
<Qualifications v-if="currentPath.pathName=='qualifications'" :company-id="companyId" :isSkeleton="isSkeleton" :companyInfo="companyInfo" />
<Performance v-if="currentPath.pathName=='performance'" :company-id="companyId" :isSkeleton="isSkeleton" :companyInfo="companyInfo" />
</div>
</div>
</div>
</div>
</template>
<script>
import { idRemark } from '@/api/common'
import SideBar from "./component/Sidebar"
import Members from "./component/members"
import Qualifications from "./component/qualifications"
import Performance from "./component/performance"
import { infoHeader } from '@/api/detail/party-a/index'
import elementResizeDetectorMaker from "element-resize-detector"
export default {
name: 'GroupAccount',
components:{
SideBar,Members,Qualifications,Performance
},
data(){
return{
companyId: '3068', //企业Id(测试默认3068)
customerId: '', //企业Id(测试默认'a00d582a6041f32c16aac804e4924736')
companyInfo: {},
cooDetail: {},
currentPath: {
pathName: 'members' //默认展示页
},
isCompany: false,
isSkeleton: false,
name:''
}
},
created() {
if (this.$route.params.id) { // customerId
this.customerId = this.$route.params.id
}
// if (this.$route.query.path) { // 获取跳转对应板块
// this.currentPath.pathName = this.$route.query.path
// }
// this.$route.query.name=''
this.name=this.$route.query.name ? this.$route.query.name : '中建集团'
},
mounted(){
},
methods: {
showPartPage(e){
this.currentPath = e
},
}
}
</script>
<style lang="scss" scoped>
.group-container{
padding: 0;
}
.group-main{
margin-top: 12px;
align-items: initial;
}
.group-left{
margin-right: 16px;
}
.group-right{
min-width: 1088px;
width: 100%;
background: #FFFFFF;
border-radius: 4px;
}
.part-header{
font-size: 16px;
font-weight: bold;
color: #232323;
background: #FFFFFF;
padding: 14px 16px;
margin-top: 12px;
border-radius: 4px;
.header-logo{
width: 28px;
height: 28px;
margin-right: 16px;
}
}
</style>
......@@ -12,8 +12,27 @@
<div class="arrow"></div>
<div @click="handleClick(option)" :class="['option', value==option?'active':'']" :key="i" v-for="(option, i) in options">
<template v-if="option == '自定义'">
<div class="number-box">
<input type="number" v-model="startMoney" class="number-input" clearable>&nbsp;&nbsp;&nbsp;&nbsp;<input v-model="endMoney" class="number-input" type="text" clearable>&nbsp;&nbsp;万元&nbsp;&nbsp;<el-button @click.stop="handleConfirm" class="number-button" type="primary">确定</el-button>
<!--<div class="number-box">-->
<!--<input type="number" v-model="startMoney" class="number-input" clearable>&nbsp;&nbsp;&nbsp;&nbsp;<input v-model="endMoney" class="number-input" type="text" clearable>&nbsp;&nbsp;万元&nbsp;&nbsp;<el-button @click.stop="handleConfirm" class="number-button" type="primary">确定</el-button>-->
<!--</div>-->
<div style="position: relative">
自定义
<div class="popper_box" style="position: absolute" v-if="value === '自定义'">
<div class="popper_wrap">
<el-input class="popper_input" type="number" clearable v-model="startMoney"></el-input>
</div>
<div class="popper_wrap">
<el-input class="popper_input" type="number" clearable v-model="endMoney"></el-input>
</div>
<div style="">
<el-button size="mini" @click.stop="cancellation">取消</el-button>
<el-button type="primary" size="mini" @click.stop="handleConfirm">确定</el-button>
</div>
</div>
</div>
</template>
<template v-else>
......@@ -88,11 +107,11 @@ export default {
// const flag = document.getElementById('custom-money-select').contains(e.target)
!flag ? this.isSelectOption = false : ''
if(this.value == '自定义' && !this.startMoney && !this.endMoney) {
this.value = ''
this.$emit('input', '')
this.$emit('handle-search')
}
// if(this.value == '自定义' && !this.startMoney && !this.endMoney) {
// this.value = ''
// this.$emit('input', '')
// this.$emit('handle-search')
// }
}, true)
},
// 清除
......@@ -120,33 +139,42 @@ export default {
this.value = value
let moneyStr = ''
if(value == '自定义') {
this.value = '自定义'
this.value = '自定义';
}else {
this.startMoney = ''
this.endMoney = ''
this.isSelectOption = false
switch (value) {
case '10亿以上':
moneyStr = [100000]
break;
case '一亿以上':
moneyStr = [10000]
break;
case '1亿-10亿':
moneyStr = [10000, 100000]
break;
case '1亿-5亿':
moneyStr = [10000, 50000]
break;
case '5000万-1亿':
moneyStr = [5000, 10000]
break;
case '1000万-5000万':
moneyStr = [1000, 5000]
break;
case '10亿以上':
moneyStr = [100000]
break;
case '1亿-10亿':
moneyStr = [10000, 100000]
break;
case '2000万-1亿':
moneyStr = [2000, 10000]
break;
case '400万-2000万':
moneyStr = [400, 2000]
break;
case '5000万以下':
moneyStr = [, 5000]
break;
case '1000万以下':
moneyStr = [, 1000]
break;
case '400万以下':
moneyStr = [, 400]
break;
......@@ -158,6 +186,13 @@ export default {
this.$emit('handle-search')
}
},
// 自定义取消
cancellation(){
this.isSelectOption = false
this.value = ''
this.$emit('input', '')
this.$emit('handle-search')
},
// 自定义确认点击后的回调
handleConfirm() {
this.isSelectOption = false
......@@ -271,7 +306,7 @@ export default {
.option {
padding: 0 24px 0 16px;
box-sizing: border-box;
width: 400px;
width: 140px;
height: 36px;
display: flex;
justify-content: space-between;
......@@ -294,8 +329,6 @@ export default {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
width: 206px;
border: 1px solid #DCDCDC;
border-radius: 2px;
&::-webkit-outer-spin-button,
......@@ -360,5 +393,47 @@ export default {
line-height: 30px;
margin-left: 10px;
}
.popper_box {
position: absolute;
left: 128px;
bottom: -15px;
background: #ffffff;
width: 186px;
color: #606266;
text-indent: 0;
padding: 16px;
padding-top: 0px;
border: 1px solid #e0e0e0;
.popper_wrap {
margin-top: 16px;
display: inline-block;
.popper_input {
width: 100px;
display: inline-block;
margin: 0px 8px;
line-height: 34px;
}
.el-input__inner {
width: 100px;
}
}
input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
-webkit-appearance: none !important;
}
input[type='number'] {
-moz-appearance: textfield;
}
}
.popper_box div:last-child {
display: flex;
justify-content: center;
margin-top: 16px;
}
}
</style>
......@@ -57,6 +57,10 @@ export default {
dateTo: {
type: String,
default: ''
},
timeList: {
type: Array,
default: () => [],
}
},
computed: {
......@@ -103,6 +107,9 @@ export default {
this.defaultValue = new Date(this.dateTo)
}
this.handleAppClick()
if(this.timeList&&this.timeList.length>0){
this.options = this.timeList
}
},
methods: {
// 时间格式化
......@@ -159,6 +166,18 @@ export default {
let startTime = ''
let endTime = new Date()
switch (value) {
case '近三天':
startTime = new Date(endTime.getTime() - 3600 * 1000 * 24 * 3)
timeStr = [this.formatDate(startTime), this.formatDate(endTime)]
break;
case '近七天':
startTime = new Date(endTime.getTime() - 3600 * 1000 * 24 * 7)
timeStr = [this.formatDate(startTime), this.formatDate(endTime)]
break;
case '近半月':
startTime = new Date(endTime.getTime() - 3600 * 1000 * 24 * 15)
timeStr = [this.formatDate(startTime), this.formatDate(endTime)]
break;
case '近1年':
startTime = new Date().setFullYear(new Date().getFullYear() - 1)
if(this.dateTo){
......@@ -309,7 +328,7 @@ export default {
.el-picker-panel.el-date-range-picker.el-popper {
left: 0 !important;
top: 205px !important;
/*top: 205px !important;*/
}
.popper__arrow {
......
......@@ -51,12 +51,13 @@
style="max-width: 170px"
:placeholder="form.placeholder"
@change="changeSelect">
<el-option v-for="(item, index) in form.options" :key="index" :label="item.name" :value="item.value" />
<el-option v-for="(item, index) in form.options" :key="index" :label="item.name" :value="item.value" :disabled="item.disabled"/>
</el-select>
</template>
<!-- 时间、自定义 -->
<template v-else-if="form.type==5">
<custom-time-select
:timeList="form.timeList"
v-model="form.value"
:placeholder="form.placeholder"
:dateFrom="form.dateFrom ? form.dateFrom : ''"
......@@ -81,7 +82,6 @@
@change="changeSelect"
:placeholder="form.placeholder"
collapse-tags
style="margin-top: -1px;"
clearable></el-cascader>
</template>
<!-- 自定义 -->
......@@ -143,6 +143,9 @@ export default {
return {
}
},
created() {
},
components: {
CustomTimeSelect,
......@@ -173,22 +176,22 @@ export default {
}
::v-deep .el-input__inner{
border: 1px solid #D9D9D9;
height: 32px;
line-height: 32px;
height: 34px;
line-height: 34px;
padding-right: 27px;
}
::v-deep .el-form-item{
margin-right: 8px !important;
}
::v-deep .el-input--medium .el-input__icon{
line-height: 32px;
line-height: 34px;
}
::v-deep .el-cascader{
height: 32px;
line-height: 32px;
height: 34px;
line-height: 34px;
.el-input{
input{
height: 32px !important;
height: 34px !important;
}
}
.el-cascader__tags{
......
......@@ -147,7 +147,6 @@ export default {
},
created() {
this.defaultRoute = JSON.parse(JSON.stringify(this.sideRoute))
},
watch:{
statisticObj:{
......
......@@ -288,7 +288,6 @@ export default {
this.uipGroupDatalist = res.data
})
},
changeXZDJ(index) {
this.queryParams.uipExecutiveLevel = index;
this.changes()
......
......@@ -36,7 +36,7 @@
</el-table-column>
<el-table-column prop="gdp" label="GDP(亿元)" sortable width="120" :formatter="formatStatus"/>
<el-table-column prop="gdpGrowth" label="GDP增速(%)" sortable width="100" :formatter="formatStatus"/>
<el-table-column prop="gdpGrowth" label="GDP增速(%)" sortable width="120" :formatter="formatStatus"/>
<el-table-column prop="gdpPerCapita" label="人均GDP(元)" sortable width="130" :formatter="formatStatus"/>
<el-table-column prop="population" label="人口(万人)" sortable width="120" :formatter="formatStatus"/>
<el-table-column prop="fixedInvestment" label="固定资产投资 (亿元) " sortable width="200" :formatter="formatStatus"/>
......@@ -100,7 +100,6 @@ export default {
},
methods: {
getData(){
this.isSkeleton = true
const params = { pageNum: this.pageIndex, pageSize: this.pageSize, year: this.queryParams.year,type:2 }
if(this.queryParams.field){
params.field=this.queryParams.field
......@@ -118,6 +117,7 @@ export default {
params.areaId=[this.provinceId[2]]
}
// params.provinceIds=[this.dataQuery.provinceId]
// this.isSkeleton = true
nationalPage(params).then(res => {
this.isSkeleton = false
this.tableData = res.data.list
......
......@@ -717,6 +717,9 @@ export default {
// province:this.dataQuery.province,
// }
// })
console.log(this.dataQuery.provinceId)
console.log(this.dataQuery.province)
// return
this.$router.push({name: 'Urban',
params: {
provinceId: this.dataQuery.provinceId,
......
......@@ -31,7 +31,7 @@
element-loading-text="Loading"
border
fit
height="640"
max-height="640"
@sort-change="sortChange"
highlight-current-row
v-if="tableDataTotal > 0 && !isSkeleton"
......
......@@ -587,6 +587,13 @@
},
itemStyle:{
color: "#FFAB44",
normal: {
label : {show: true},
color:"#FFAB44",
lineStyle: {
color: "#FFAB44"
}
}
},
//设置面积区域为渐变效果
areaStyle: {
......
......@@ -36,7 +36,7 @@
element-loading-text="Loading"
@sort-change="sortChange"
border
height="640"
max-height="640"
highlight-current-row
v-if="tableDataTotal > 0 && !isSkeleton"
:default-sort = "{prop: 'gdp', order: 'descending'}"
......@@ -220,7 +220,7 @@
},
// 查询提交
async querySubmit() {
this.isSkeleton = true
// this.isSkeleton = true
const params = { pageNum: this.pageIndex, pageSize: this.pageSize, year: this.queryParams.year,type:1 }
if(this.queryParams.address){
let arr = this.$refs.address.getCheckedNodes();
......
<template>
<div>
<div class="zhongbiao">
<p class="text_p">注:数据来源大司空建筑大数据平台,统计范围为全国公开的中标项目,未公开的不含在内</p>
<skeleton v-if="isSkeleton" style="padding: 16px"></skeleton>
<div v-if="!isSkeleton" class="zhongbiao">
<div class="zb-content content1">
<div class="flex-box query-box">
<div class="flex-box query-params">
<span class="common-title">全国建筑企业概览</span>
</div>
<div v-if="!isSkeleton" class="td_content">
<div class="flex-box query-box">
<div class="flex-box query-params">
<span class="common-title">全国中标项目统计</span>
<el-select v-model="years" @change="handleYears(1)" multiple collapse-tags filterable class="form-content-width" placeholder="请选择" :popper-append-to-body='false' size="small">
<el-option v-for="(item, index) in yearOptions" :key="index" :label="item" :value="item" />
</el-select>
</div>
<div class="text">截止{{currentdate}},全国共有{{glDetail.major}}资质的企业{{total}}家,其中特级资质企业{{glDetail.tjCount}}家,占比{{glDetail.tjRate}}%;一级资质企业{{glDetail.tjCount}}家,占比{{glDetail.oneRate}}%;二级资质企业{{glDetail.twoCount}}家,占比{{glDetail.twoRate}}%;三级资质企业{{glDetail.threeCount}}家,占比{{glDetail.threeRate}}%</div>
<div class="main1">
<div style="height: 300px;">
<div class="left">
<div class="item" v-for="(item,index) in glData" :class="typeIndex === index ? 'color':''" @click="handleClick(1,index)">{{item.major}}施工总承包<i></i></div>
</div>
<div class="right">
<div id="gl-echarts" style="height: 260px;background: #ffffff;"></div>
</div>
</div>
<p class="tips"><i class="el-icon-info"></i>数据来源大司空建筑大数据平台,统计范围为有效期内资质,未公开不包含在内</p>
</div>
<div class="content_box" v-if="gyflState">
<div class="box-left">
<div id="echarts1" style="height: 280px"></div>
</div>
<div class="main2">
<!--<div class="flex-box query-box head">-->
<!--<span>近五年全国招标总数<span class="number">10,610,000 </span></span>-->
<!--<el-select v-model="year" filterable multiple collapse-tags class="form-content-width" placeholder="请选择">-->
<!--<el-option v-for="(item, index) in yearOptions" :key="index" :label="item.name" :value="item.value" />-->
<!--</el-select>-->
<!--</div>-->
<div class="table-item">
<el-table
:data="zzTableData"
border
fit
highlight-current-row
>
<el-table-column label="序号" width="60" align="left">
<template slot-scope="scope">{{ scope.$index + 1 }}</template>
</el-table-column>
<el-table-column prop="major" label="资质类型"/>
<el-table-column label="特级" align="right">
<el-table-column prop="tjCount" label="数量(个)" align="right"/>
<el-table-column prop="tjRate" label="占比(%)" align="right"/>
</el-table-column>
<el-table-column label="一级" align="right">
<el-table-column prop="oneCount" label="数量(个)" align="right"/>
<el-table-column prop="oneRate" label="占比(%)" align="right"/>
</el-table-column>
<el-table-column label="二级" align="right">
<el-table-column prop="twoCount" label="数量(个)" align="right"/>
<el-table-column prop="twoRate" label="占比(%)" align="right"/>
</el-table-column>
<el-table-column label="三级" align="right">
<el-table-column prop="threeCount" label="数量(个)" align="right"/>
<el-table-column prop="threeRate" label="占比(%)" align="right"/>
</el-table-column>
</el-table>
</div>
<div class="box-right">
<el-table
:data="xmtjList"
element-loading-text="Loading"
border
show-summary
max-height="300"
:summary-method="getSummaries"
fit
highlight-current-row
:default-sort = "{prop: 'count', order: 'descending'}"
>
<el-table-column label="序号" width="60">
<template slot-scope="scope">{{ scope.$index + 1 }}</template>
</el-table-column>
<el-table-column prop="type" label="项目类型" :formatter="formatStatus" width="100"/>
<el-table-column prop="count" label="中标数量 (个)" align="right" :formatter="formatStatus" sortable width="130"/>
<el-table-column prop="countRate" label="数量占比(%)" align="right" :formatter="formatStatus" sortable width="140"/>
<el-table-column prop="money" label="中标总金额 (万元)" align="right" :formatter="formatStatus" width="150"/>
<el-table-column prop="moneyRate" label="金额占比(%)" align="right" :formatter="formatStatus" width="120"/>
</el-table>
</div>
</div>
<div class="zb-content content2">
<div class="flex-box query-box">
<div class="flex-box query-params">
<span class="common-title">全国建筑企业地区分布</span>
</div>
<div class="empty" v-if="!gyflState">
<img class="img" src="@/assets/images/project/empty.png">
<div class="p1">抱歉,暂无数据展示</div>
</div>
</div>
<div v-if="!isSkeleton" class="td_content">
<div class="flex-box query-box">
<div class="flex-box query-params">
<span class="common-title">全国各地区中标统计TOP10</span>
<el-select v-model="years1" @change="handleYears(2)" multiple collapse-tags filterable class="form-content-width" placeholder="请选择" :popper-append-to-body='false' size="small">
<el-option v-for="(item, index) in yearOptions" :key="index" :label="item" :value="item" />
</el-select>
</div>
<div class="main1">
<div class="tabs">
<div class="item" v-for="(item,index) in dqData" :class="qydqIndex === index ? 'color':''" @click="handleClick(2,index)">{{item.major}}<i></i></div>
</div>
<div id="jzqy-echarts" style="height: 250px"></div>
<p class="tips"><i class="el-icon-info"></i>数据来源大司空建筑大数据平台,统计范围为有效期内资质,未公开不包含在内</p>
</div>
<div class="content_box" v-if="tdytState">
<div class="box-left">
<div id="echarts2" style="height: 280px"></div>
</div>
<div class="table-item">
<div class="box-right">
<el-table
:data="jzdqData"
:data="topList"
element-loading-text="Loading"
border
height="470"
show-summary
max-height="300"
:summary-method="getSummaries"
fit
highlight-current-row
:default-sort = "{prop: 'count', order: 'descending'}"
>
<el-table-column label="序号" width="60" align="left">
<el-table-column label="序号" width="60">
<template slot-scope="scope">{{ scope.$index + 1 }}</template>
</el-table-column>
<el-table-column prop="province" label="地区"/>
<el-table-column label="特级" align="right">
<el-table-column prop="tjCount" label="数量(个)" align="right"/>
<el-table-column prop="tjRate" label="占比(%)" align="right"/>
</el-table-column>
<el-table-column label="一级" align="right">
<el-table-column prop="oneCount" label="数量(个)" align="right"/>
<el-table-column prop="oneRate" label="占比(%)" align="right"/>
<el-table-column prop="province" label="地区" :formatter="formatStatus" width="100"/>
<el-table-column prop="count" label="中标数量 (个)" align="right" :formatter="formatStatus" sortable width="130"/>
<el-table-column prop="countRate" label="数量占比(%)" align="right" :formatter="formatStatus" width="120"/>
<el-table-column prop="sumMoney" label="中标总金额 (万元)" align="right" :formatter="formatStatus" width="140"/>
<el-table-column prop="moneyRate" label="金额占比(%)" align="right" :formatter="formatStatus" width="120"/>
</el-table>
</div>
</div>
<div class="empty" v-if="!tdytState">
<img class="img" src="@/assets/images/project/empty.png">
<div class="p1">抱歉,暂无数据展示</div>
</div>
</div>
<div v-if="!isSkeleton" class="td_content">
<div class="flex-box query-box">
<div class="flex-box query-params">
<span class="common-title">全国中标金额分析</span>
<el-select v-model="years2" @change="handleYears(3)" multiple collapse-tags filterable class="form-content-width" placeholder="请选择" :popper-append-to-body='false' size="small">
<el-option v-for="(item, index) in yearOptions" :key="index" :label="item" :value="item" />
</el-select>
</div>
</div>
<div class="content_box" v-if="tdytState">
<div class="box-left">
<div id="echarts3" style="height: 280px"></div>
</div>
<div class="box-right">
<el-table
:data="zbjeList"
element-loading-text="Loading"
border
show-summary
max-height="285"
:summary-method="getSummaries"
fit
highlight-current-row
:default-sort = "{prop: 'count', order: 'descending'}"
>
<el-table-column label="序号" width="60">
<template slot-scope="scope">{{ scope.$index + 1 }}</template>
</el-table-column>
<el-table-column label="二级" align="right">
<el-table-column prop="twoCount" label="数量(个)" align="right"/>
<el-table-column prop="twoRate" label="占比(%)" align="right"/>
<el-table-column prop="rangeName" label="中标金额" :formatter="formatStatus"/>
<el-table-column prop="count" label="中标数量 (个)" align="right" :formatter="formatStatus" sortable/>
<el-table-column prop="rate" label="占比(%)" align="right" :formatter="formatStatus" width="100"/>
</el-table>
</div>
</div>
<div class="empty" v-if="!tdytState">
<img class="img" src="@/assets/images/project/empty.png">
<div class="p1">抱歉,暂无数据展示</div>
</div>
</div>
<div v-if="!isSkeleton" class="td_content">
<div class="flex-box query-box">
<div class="flex-box query-params">
<span class="common-title">全国中标趋势分析</span>
</div>
</div>
<div class="content_box">
<div class="box-left" style="width: 60%;">
<div id="echarts4" style="height: 300px"></div>
</div>
<div class="box-right">
<el-table
:data="zbqsList"
element-loading-text="Loading"
border
show-summary
max-height="290"
:summary-method="getSummaries"
fit
highlight-current-row
:default-sort = "{prop: 'count', order: 'descending'}"
>
<el-table-column label="序号" width="60">
<template slot-scope="scope">{{ scope.$index + 1 }}</template>
</el-table-column>
<el-table-column label="三级" align="right">
<el-table-column prop="threeCount" label="数量(个)" align="right"/>
<el-table-column prop="threeRate" label="占比(%)" align="right"/>
<el-table-column prop="year" label="年份" :formatter="formatStatus" width="100"/>
<el-table-column prop="count" label="中标数量 (个)" align="right" :formatter="formatStatus" sortable/>
<el-table-column prop="sumMoney" label="中标总金额(万元)" align="right" :formatter="formatStatus"/>
</el-table>
</div>
</div>
</div>
<div v-if="!isSkeleton" class="td_content">
<div class="flex-box query-box">
<div class="flex-box query-params">
<span class="common-title">全国中标下浮率分析</span>
<el-select v-model="years3" @change="handleYears(5)" collapse-tags filterable class="form-content-width" placeholder="请选择" :popper-append-to-body='false' size="small">
<el-option v-for="(item, index) in yearOptions" :key="index" :label="item" :value="item" />
</el-select>
</div>
</div>
<div class="content_box" v-if="tdytState">
<div class="box-left">
<div id="echarts5" style="height: 280px"></div>
</div>
<div class="box-right">
<el-table
:data="xflList"
element-loading-text="Loading"
border
show-summary
max-height="280"
:summary-method="getSummaries"
fit
highlight-current-row
:default-sort = "{prop: 'count', order: 'descending'}"
>
<el-table-column label="序号" width="60">
<template slot-scope="scope">{{ scope.$index + 1 }}</template>
</el-table-column>
<el-table-column prop="label" label="时间" :formatter="formatStatus" width="130"/>
<el-table-column prop="rate" label="下浮率(%)" align="right" :formatter="formatStatus" sortable/>
<el-table-column prop="count" label="统计项目数量 (个)" align="right" :formatter="formatStatus"/>
</el-table>
</div>
</div>
<div class="zb-content content3">
<div class="flex-box query-box">
<div class="flex-box query-params">
<span class="common-title">全国建筑企业备案分布</span>
</div>
<div class="empty" v-if="!tdytState">
<img class="img" src="@/assets/images/project/empty.png">
<div class="p1">抱歉,暂无数据展示</div>
</div>
</div>
<div v-if="!isSkeleton" class="td_content">
<div class="flex-box query-box">
<div class="flex-box query-params">
<span class="common-title">全国中标业绩项目类型下浮率</span>
<el-select @change="handleYears(6)" style="margin-right: 8px" v-model="address" collapse-tags filterable class="form-content-width" placeholder="地区筛选" :popper-append-to-body='false' size="small">
<el-option v-for="(item, index) in addressList" :key="index" :label="item.label" :value="item.id" />
</el-select>
<el-select v-model="years4" @change="handleYears(6)" collapse-tags filterable class="form-content-width" placeholder="请选择" :popper-append-to-body='false' size="small">
<el-option v-for="(item, index) in yearOptions" :key="index" :label="item" :value="item" />
</el-select>
</div>
<div class="text">
通过对全国建筑工程总承包一级及以上资质企业的备案数据分析,我们发现这些优质企业主要去了<span v-for="(item,index) in rankList">{{item.province}}{{ rankList.length === index+1 ? '':'、'}}</span>等地开展经营。</div>
<div class="main1">
<div id="ba-echarts" style="height: 250px"></div>
<p class="tips"><i class="el-icon-info"></i>数据来源大司空建筑大数据平台,统计范围为公开企业备案地数据。</p>
</div>
<div class="content_box" v-if="topList.length > 0 && !isSkeleton">
<div class="box-left" style="width: 60%;">
<div id="echarts6" style="height: 300px"></div>
</div>
<div class="table-item">
<div class="box-right">
<el-table
:data="zbData"
:data="xmxflList"
element-loading-text="Loading"
border
height="430"
show-summary
max-height="280"
:summary-method="getSummaries1"
fit
highlight-current-row
:default-sort = "{prop: 'count', order: 'descending'}"
>
<el-table-column label="序号" width="60" align="left">
<el-table-column label="序号" width="60">
<template slot-scope="scope">{{ scope.$index + 1 }}</template>
</el-table-column>
<el-table-column prop="province" label="地区" />
<el-table-column prop="count" label="企业异地备案数量(个)" sortable align="right"/>
<!--<el-table-column prop="zb" label="占比"/>-->
<el-table-column prop="month" label="时间" :formatter="formatStatus" width="120"/>
<el-table-column prop="sgRate" label="施工类项目下浮率(%)" align="right" :formatter="formatStatus" width="170"/>
<el-table-column prop="kcsjRate" label="勘察设计类项目下浮率(%)" align="right" :formatter="formatStatus" width="200"/>
<el-table-column prop="jlRate" label="监理类项目下浮率(%)" align="right" :formatter="formatStatus" width="170"/>
</el-table>
</div>
</div>
<div class="empty" v-if="topList.length === 0 && !isSkeleton">
<img class="img" src="@/assets/images/project/empty.png">
<div class="p1">抱歉,暂无数据展示</div>
</div>
</div>
</div>
</template>
<script>
import * as echarts from 'echarts';
import { certGroupByMajorAndLevel,certGroupByMajorProvinceLevel,areaGroupByProvince } from '@/api/macro/macro'
import dataRegion from '@/assets/json/dataRegion'
import { countBidByType,countBidGroupByProvince,rangeBidMoney,rangeBidFiveYears,lowerRateByYear,lowerRangeTenderType } from '@/api/macro/macro'
import skeleton from '../../component/skeleton'
export default {
name: 'NationalEconomies',
components: {
skeleton
},
data() {
return {
typeIndex:0,
glData:[],
jzglData:[],
zzTableData:[],
tableOption:[
{
label:'资质类型',
prop:'major'
},
{
label: '特级',
prop: 'levelValue',
child:[
{
label: '数量(个)',
prop: 'count'
},
{
label: '占比(%)',
prop: 'rate'
},
]
},
{
label: '一级',
prop: 'levelValue',
child:[
{
label: '数量(个)',
prop: 'count'
},
{
label: '占比(%)',
prop: 'rate'
},
]
},
{
label: '二级',
prop: 'levelValue',
child:[
{
label: '数量(个)',
prop: 'count'
},
{
label: '占比(%)',
prop: 'rate'
},
]
},
{
label: '三级',
prop: 'levelValue',
child:[
{
label: '数量(个)',
prop: 'count'
},
{
label: '占比(%)',
prop: 'rate'
},
]
},
],
dqData:[],
qydqIndex:0,
zbData:[],
rankList:[],
jzdqData:[],
currentdate:'',
total:'',
glDetail:{},
isSkeleton:true,
}
},
created() {
setTimeout(() => {
this.isSkeleton=false;
this.getData()
}, 1000);
var date = new Date()
var year = date.getFullYear()
var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth()+ 1
var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
this.currentdate=year + '-' +month + '-' + day;
},
methods: {
getData(){
//全国建筑企业概览
certGroupByMajorAndLevel().then(res => {
let list=[];
for (let i=0; i<res.data.length; i++){
res.data[i].levelList=res.data[i].levelList.reverse();
let item={};
item.major=res.data[i].major+'施工总承包';
for (let j=0; j<res.data[i].levelList.length; j++){
if(res.data[i].levelList[j].levelValue === '特级'){
item.tjCount=res.data[i].levelList[j].count;
item.tjRate=res.data[i].levelList[j].rate;
}
if(res.data[i].levelList[j].levelValue === '一级'){
item.oneCount=res.data[i].levelList[j].count;
item.oneRate=res.data[i].levelList[j].rate;
}
if(res.data[i].levelList[j].levelValue === '二级'){
item.twoCount=res.data[i].levelList[j].count;
item.twoRate=res.data[i].levelList[j].rate;
}
if(res.data[i].levelList[j].levelValue === '三级'){
item.threeCount=res.data[i].levelList[j].count;
item.threeRate=res.data[i].levelList[j].rate;
}
export default {
name: 'NationalEconomies',
components: {
skeleton
},
data() {
return {
addressList:[],
address:'',
years:[2023],
years1:[2023],
years2:[2023],
years3:2023,
years4:2023,
yearOptions:[],
xmtjList:[],
topList:[],
zbjeList:[],
zbqsList:[],
xflList :[],
xmxflList :[],
isSkeleton:true,
gyflState:true,
tdytState:true,
topState:true,
}
},
created() {
this.dataRegion()
this.yearsData()
this.getCountBidByType()
},
mounted() {
},
beforeDestroy(){
},
methods: {
getCountBidByType(){
let params={
yearStr:this.years.join(",")
}
countBidByType(params).then(res => {
this.isSkeleton=false;
this.xmtjList=res.data.date;
if(res.data){
this.$nextTick(() => {
this.initChart1(res.data.date)
})
}
// item.levelList=res.data[i].levelList.reverse();
list.push(item)
this.getCountBidGroupByProvince()
this.getRangeBidMoney()
this.getRangeBidFiveYears()
this.getLowerRateByYear()
this.getLowerRangeTenderType()
})
},
getCountBidGroupByProvince(){
let params={
yearStr:this.years1.join(",")
}
this.zzTableData=list;
this.glData=res.data;
this.jzglData=this.glData[0].levelList;
this.glDetail=list[0]
let total=0;
for(let i=0; i<this.jzglData.length; i++){
total=total+this.jzglData[i].count
countBidGroupByProvince(params).then(res => {
this.topList=res.data;
if(res.data){
this.$nextTick(() => {
this.initChart2(res.data)
})
}
})
},
getRangeBidMoney(){
let params={
yearStr:this.years2.join(",")
}
this.total=total;
this.initChart()
})
certGroupByMajorProvinceLevel().then(res => {
this.dqData=res.data;
let data=this.dqData[0].province;
let list=[];
for(let i=0; i<data.length; i++){
let item={};
item.province=data[i].province;
for (let j=0; j<data[i].levelList.length; j++){
if(data[i].levelList[j].levelValue === '特级'){
item.tjCount=data[i].levelList[j].count;
item.tjRate=data[i].levelList[j].rate;
}
if(data[i].levelList[j].levelValue === '一级'){
item.oneCount=data[i].levelList[j].count;
item.oneRate=data[i].levelList[j].rate;
}
if(data[i].levelList[j].levelValue === '二级'){
item.twoCount=data[i].levelList[j].count;
item.twoRate=data[i].levelList[j].rate;
}
if(data[i].levelList[j].levelValue === '三级'){
item.threeCount=data[i].levelList[j].count;
item.threeRate=data[i].levelList[j].rate;
}
rangeBidMoney(params).then(res => {
this.zbjeList=res.data;
var list=[];
for(var i=0;i<res.data.length;i++){
var obj={};
obj.name=res.data[i].rangeName;
obj.value=res.data[i].count;
obj.rate=res.data[i].rate;
list.push(obj)
}
list.push(item)
if(res.data){
this.$nextTick(() => {
this.initChart3(list)
})
}
})
},
getRangeBidFiveYears(){
rangeBidFiveYears().then(res => {
this.zbqsList=res.data;
if(res.data){
this.$nextTick(() => {
this.initChart4(res.data)
})
}
})
},
getLowerRateByYear(){
let params={
yearStr:this.years3
}
this.jzdqData=list
this.initChart1()
})
areaGroupByProvince().then(res => {
this.zbData=res.data;
//定义一个变量 保存数据 因为sort方法排序会改变原数组 使用JSON方法深拷贝 将原数值暂存
// let dataArr = JSON.parse(JSON.stringify(res.data))
let arr=res.data.sort((old,New)=>{
return New.count - old.count
lowerRateByYear(params).then(res => {
for (var i=0; i<res.data.length; i++){
res.data[i].rate=res.data[i].rate.toFixed(2)
}
this.xflList=res.data;
if(res.data){
this.$nextTick(() => {
this.initChart5(res.data)
})
}
})
let data=[]
for(let i=0; i<5; i++){
data.push(arr[i])
},
getLowerRangeTenderType(){
let params={
yearStr:this.years4,
}
this.rankList=data;
//将原数组数据赋值回去 保持数据不变
// this.zbData = JSON.parse(JSON.stringify(dataArr))
this.initChart2()
})
},
initChart() {
let myChart = echarts.init(document.getElementById("gl-echarts"))
let option ={
tooltip: {
// show:false
},
xAxis: {
type: 'category',
boundaryGap: false,
data: this.jzglData.map(item => item.levelValue),
},
yAxis: {
type: 'value',
},
grid: {
top:40,
left:70,
right:40,
bottom:40,
},
series: [
{
data: this.jzglData.map(item => item.count),
type: 'line',
smooth: true,
emphasis: {
disabled: true,
focus: 'none'
if(this.address){
params.provinceId=this.address
}
lowerRangeTenderType(params).then(res => {
for (var i=0; i<res.data.length; i++){
for (let j=0; j<res.data[i].typeList.length; j++){
if(res.data[i].typeList[j].tenderType === '施工'){
res.data[i].sgRate=res.data[i].typeList[j].rate.toFixed(2)
}
if(res.data[i].typeList[j].tenderType === '勘察设计'){
res.data[i].kcsjRate=res.data[i].typeList[j].rate.toFixed(2)
}
if(res.data[i].typeList[j].tenderType === '监理'){
res.data[i].jlRate=res.data[i].typeList[j].rate.toFixed(2)
}
}
}
this.xmxflList=res.data;
if(this.xmxflList){
this.$nextTick(() => {
this.initChart6(this.xmxflList)
})
}
})
},
initChart1(data) {
this.$nextTick(() => {
let myChart = echarts.init(document.getElementById("echarts1"))
let list1=[],list2=[]
for(var i=0; i<data.length; i++) {
list1.push(data[i].count)
list2.push(data[i].money)
}
let option ={
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'line',
label: {
backgroundColor: '#FFFFFF'
}
}
},
//设置折线颜色和粗细
lineStyle: {
width: 1,
color: "#0081FF",
xAxis: {
type: 'category',
boundaryGap: false,
axisLabel: {
show: true,
interval: 0
},
data: data.map(item => item.type),
},
itemStyle:{
color: "#4E8EFF",
yAxis: {
type: 'value',
},
//设置面积区域为渐变效果
areaStyle: {
color: echarts.graphic.LinearGradient(0, 1, 0, 0, [
{
offset: 0.2,
color: "#DFEAFF",
grid: {
top:30,
left:100,
right:30,
bottom:30,
},
color:['#ADC0FF', '#E9C8FF'],
series: [
{
name:'中标数量(个)',
smooth: false, //平滑
type:"line",
symbolSize: 6, //折线拐点大小
itemStyle: {
normal: {
borderWidth: 4,
lineStyle: { width: 2 }
}
},
{
offset: 1,
color: "#5895FF",
data:list1,
},
{
name:'中标总金额(万元)',
smooth: false, //平滑
type:"line",
symbolSize: 6, //折线拐点大小
itemStyle: {
normal: {
borderWidth: 4,
lineStyle: { width: 2 }
}
},
]),
},
data:list2,
}
]
}
]
}
myChart.clear(); //图表清除
myChart.setOption(option);
window.addEventListener("resize", function () {
myChart.resize();//图表跟随页面大小变化宽度
});
},
initChart1() {
let myChart = echarts.init(document.getElementById("jzqy-echarts"))
let option ={
legend: {
x:'right',
padding:[0,30,0,0],
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'line',
label: {
backgroundColor: '#FFFFFF'
myChart.setOption(option);
window.addEventListener("resize", function () {
myChart.resize();//图表跟随页面大小变化宽度
});
})
},
initChart2(data) {
this.$nextTick(() => {
// console.log(typeList)
let myChart = echarts.init(document.getElementById("echarts2"))
let seriesData=[]
let color=['#FCD68A', '#67B3FD', '#FFB8AD', '#FFD7AD', '#A9F1E5', '#D0FAB7', '#ADC0FF', '#BEECFF', '#81D5BC', '#FFE48A'];
let typeNameList=data[0].projectType.map(item => item.type);
let item={}
for(var i=0; i<data.length; i++){
for(var j=0; j<data[i].projectType.length; j++){
item[typeNameList[j]] = [];
}
}
},
xAxis: {
type: 'category',
boundaryGap: false,
data: this.jzdqData.map(item => item.province),
},
yAxis: {
type: 'value',
},
grid: {
top:35,
left:60,
right:30,
bottom:20,
},
series: [
{
data: this.jzdqData.map(item => item.tjCount),
name:'特级',
type: 'line',
smooth: true,
emphasis: {
disabled: true,
focus: 'none'
for(var i=0; i<data.length; i++) {
for (var j = 0; j < data[i].projectType.length; j++) {
if(data[i].projectType[j].type === typeNameList[0]){
item[typeNameList[0]].push(data[i].projectType[j].count)
}
if(data[i].projectType[j].type === typeNameList[1]){
item[typeNameList[1]].push(data[i].projectType[j].count)
}
if(data[i].projectType[j].type === typeNameList[2]){
item[typeNameList[2]].push(data[i].projectType[j].count)
}
if(data[i].projectType[j].type === typeNameList[3]){
item[typeNameList[3]].push(data[i].projectType[j].count)
}
if(data[i].projectType[j].type === typeNameList[4]){
item[typeNameList[4]].push(data[i].projectType[j].count)
}
if(data[i].projectType[j].type === typeNameList[5]){
item[typeNameList[5]].push(data[i].projectType[j].count)
}
if(data[i].projectType[j].type === typeNameList[6]){
item[typeNameList[6]].push(data[i].projectType[j].count)
}
if(data[i].projectType[j].type === typeNameList[7]){
item[typeNameList[7]].push(data[i].projectType[j].count)
}
if(data[i].projectType[j].type === typeNameList[8]){
item[typeNameList[8]].push(data[i].projectType[j].count)
}
if(data[i].projectType[j].type === typeNameList[9]){
item[typeNameList[9]].push(data[i].projectType[j].count)
}
}
}
for(var i=0; i<typeNameList.length; i++) {
seriesData.push({
name:typeNameList[i],
smooth: false, //平滑
type:"line",
symbolSize: 6, //折线拐点大小
itemStyle: {
normal: {
color: color[i], //图例颜色
borderWidth: 4,
borderColor: color[i],
lineStyle: { color: color[i], width: 2 }
}
},
data:item[typeNameList[i]],
});
}
let option ={
// legend: {
// left: "center",
// bottom: 0,
// itemHeight:8,
// itemWidth:16,
// },
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'line',
label: {
backgroundColor: '#FFFFFF'
}
}
},
//设置折线颜色和粗细
lineStyle: {
width: 2,
color: "#0081FF",
xAxis: {
type: 'category',
boundaryGap: false,
axisLabel: {
show: true,
interval: 0
},
data: data.map(item => item.province),
},
itemStyle:{
color: "#4E8EFF",
yAxis: {
type: 'value',
},
//设置面积区域为渐变效果
areaStyle: {
opacity:0.8,
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
{
offset: 0.2,
color: "#DFEAFF",
},
{
offset: 1,
color: "#5895FF",
},
]),
grid: {
top:30,
left:50,
right:20,
bottom:30,
},
},
{
data: this.jzdqData.map(item => item.oneCount),
name:'一级',
type: 'line',
smooth: true,
emphasis: {
disabled: true,
focus: 'none'
color:['#FCD68A', '#FFE48A', '#FFB8AD', '#FFD7AD', '#A9F1E5', '#D0FAB7', '#ADC0FF', '#BEECFF', '#81D5BC', '#67B3FD'],
series: seriesData
}
myChart.setOption(option);
window.addEventListener("resize", function () {
myChart.resize();//图表跟随页面大小变化宽度
});
})
},
initChart3(data) {
this.$nextTick(() => {
let myChart = echarts.init(document.getElementById("echarts3"))
let option ={
tooltip: {
trigger: 'item',
borderWidth:0,
backgroundColor:"rgba(255, 255, 255, 0.8)",
formatter: function (params) {
var result = ''
result+='<h3 style="color: #232226;padding: 0 0 5px 0;margin: 0;">'+ params.data.name +'</h3>'
result+='<p style="color: rgba(35,35,35,0.8);padding: 0;margin: 0;">'+ params.data.value +'个 </p>'
return result;
},
extraCssText:'width:150px!important;',
},
//设置折线颜色和粗细
lineStyle: {
width: 2,
color: "#FA6C6C",
legend: {
type: 'scroll',
orient: 'horizontal',
bottom: 0,
data: data,
itemHeight:8,
itemWidth:12,
pageButtonPosition: 'end',
},
itemStyle:{
color: "#FA6C6C",
color:['#8A82F3', '#5B9CF7', '#43BBE0','#8ECF95','#FFDC6B','#FFDC6B','#FFC08D','#FE9C77','#E8649B','#A151F5'],
series: [
{
type: 'pie',
radius: '55%',
center: ['50%', '50%'],
data: data,
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
}
myChart.setOption(option);
window.addEventListener("resize", function () {
myChart.resize();//图表跟随页面大小变化宽度
});
})
},
initChart4(data) {
this.$nextTick(() => {
let myChart = echarts.init(document.getElementById("echarts4"))
let option ={
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross'
}
},
//设置面积区域为渐变效果
areaStyle: {
opacity:0.8,
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
{
offset: 0.1,
color: "#FDF8F5",
xAxis: {
type: 'category',
axisLabel: { //坐标轴刻度标签的相关设置
margin: 15, //刻度标签与轴线之间的距离
color:"#666666"
},
axisTick: false, //坐标轴刻度
axisPointer: {
type: 'shadow'
},
data: data.map(item => item.year),
},
yAxis: [
{
type: 'value',
axisLabel: { //坐标轴刻度标签的相关设置
color:"#666666"
},
{
offset: 1,
color: "#FCD7C8",
name: '单位:个',
nameLocation: 'start',
nameTextStyle: {
padding: [0, 0, 0, -60], // 四个数字分别为上右下左与原位置距离
color: '#666666',
}
},
{
type: 'value',
axisLabel: { //坐标轴刻度标签的相关设置
color:"#666666"
},
]),
},
},
{
data: this.jzdqData.map(item => item.twoCount),
name:'二级',
type: 'line',
smooth: true,
emphasis: {
disabled: true,
focus: 'none'
},
//设置折线颜色和粗细
lineStyle: {
width: 2,
color: "#8077F2",
},
itemStyle:{
color: "#8077F2",
name: '单位:万元',
nameLocation: 'start',
nameTextStyle: {
padding: [0, 0, 0, 72], // 四个数字分别为上右下左与原位置距离
color: '#666666',
},
splitLine: {
show: true,
lineStyle: {
type: 'dashed',
color: ['#FFFFFF']
}
}
}
],
grid: {
top:30,
left:80,
right:90,
bottom:30,
},
//设置面积区域为渐变效果
areaStyle: {
opacity:0.8,
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
{
offset: 0.1,
color: "#ECE8FF",
series: [
{
name:'中标金额(万元)',
smooth: false, //平滑
type:"line",
symbolSize: 6,
yAxisIndex: 1,
tooltip: {
valueFormatter: function (value) {
return value + '万元'
}
},
{
offset: 1,
color: "#BCC0FF",
itemStyle: {
color: '#14C9C9'
},
]),
},
},
{
data: this.jzdqData.map(item => item.threeCount),
name:'三级',
type: 'line',
smooth: true,
emphasis: {
disabled: true,
focus: 'none'
data:data.map(item => item.sumMoney),
},
{
name:'中标总数(个)',
type: 'bar',
barWidth: 20,
tooltip: {
valueFormatter: function (value) {
return value + '个';
}
},
itemStyle: {
normal:{
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [{
offset: 0,
color: '#56A5FF'
}, {
offset: 1,
color: '#1B8EFF'
}])
}
},
data:data.map(item => item.count),
}
]
}
myChart.setOption(option);
window.addEventListener("resize", function () {
myChart.resize();//图表跟随页面大小变化宽度
});
})
},
initChart5(data) {
this.$nextTick(() => {
let myChart = echarts.init(document.getElementById("echarts5"))
let option ={
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross'
}
},
//设置折线颜色和粗细
lineStyle: {
width: 2,
color: "#FA936C",
xAxis: {
type: 'category',
axisLabel: { //坐标轴刻度标签的相关设置
margin: 15, //刻度标签与轴线之间的距离
color:"#666666"
},
axisTick: false, //坐标轴刻度
axisPointer: {
type: 'shadow'
},
data: data.map(item => item.label),
},
itemStyle:{
color: "#FA936C",
yAxis: [
{
type: 'value',
axisLabel: { //坐标轴刻度标签的相关设置
color:"#666666"
},
name: '单位:个',
nameLocation: 'start',
nameTextStyle: {
padding: [0, 0, 0, -60], // 四个数字分别为上右下左与原位置距离
color: '#666666',
}
},
{
type: 'value',
axisLabel: { //坐标轴刻度标签的相关设置
color:"#666666"
},
name: '单位:%',
nameLocation: 'start',
nameTextStyle: {
padding: [0, 0, 0, 72], // 四个数字分别为上右下左与原位置距离
color: '#666666',
},
splitLine: {
show: true,
lineStyle: {
type: 'dashed',
color: ['#FFFFFF']
}
}
}
],
grid: {
top:30,
left:80,
right:90,
bottom:30,
},
//设置面积区域为渐变效果
areaStyle: {
opacity:0.8,
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
{
offset: 0.1,
color: "#FEFBFA",
series: [
{
name:'下浮率',
smooth: false, //平滑
type:"line",
symbolSize: 6,
yAxisIndex: 1,
tooltip: {
valueFormatter: function (value) {
return value + '%'
}
},
itemStyle: {
color: '#14C9C9'
},
data:data.map(item => item.rate),
},
{
name:'统计项目数量',
type: 'bar',
barWidth: 20,
tooltip: {
valueFormatter: function (value) {
return value + '个';
}
},
{
offset: 1,
color: "#FCD7C8",
itemStyle: {
normal:{
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [{
offset: 0,
color: '#56A5FF'
}, {
offset: 1,
color: '#1B8EFF'
}])
}
},
]),
data:data.map(item => item.count),
}
]
}
myChart.setOption(option);
window.addEventListener("resize", function () {
myChart.resize();//图表跟随页面大小变化宽度
});
})
},
initChart6(data) {
this.$nextTick(() => {
let myChart = echarts.init(document.getElementById("echarts6"))
let option ={
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'line',
label: {
backgroundColor: '#FFFFFF'
}
}
},
},
]
}
myChart.clear();
myChart.setOption(option);
window.addEventListener("resize", function () {
myChart.resize();//图表跟随页面大小变化宽度
});
},
initChart2() {
let myChart = echarts.init(document.getElementById("ba-echarts"))
let option ={
tooltip: {
// show:false
},
legend:{},
xAxis: {
type: 'category',
boundaryGap: false,
data: this.zbData.map(item => item.province),
},
yAxis: {
type: 'value',
},
grid: {
top:20,
left:65,
right:50,
bottom:20,
},
series: [
{
data: this.zbData.map(item => item.count),
type: 'line',
smooth: true,
emphasis: {
disabled: true,
focus: 'none'
xAxis: {
type: 'category',
boundaryGap: false,
axisLabel: {
show: true,
interval: 0,
},
data: data.map(item => item.month),
},
//设置折线颜色和粗细
lineStyle: {
width: 1,
color: "#FFAB44",
yAxis: {
type: 'value',
},
itemStyle:{
color: "#FFAB44",
grid: {
top:30,
left:50,
right:50,
bottom:30,
},
//设置面积区域为渐变效果
areaStyle: {
color: echarts.graphic.LinearGradient(0, 1, 0, 0, [
{
offset: 0.2,
color: "#FFEDD0",
color:['#D0FAB7', '#E9C8FF', '#81D5BC'],
series: [
{
name:'勘察项目下浮率',
smooth: false, //平滑
type:"line",
symbolSize: 6, //折线拐点大小
itemStyle: {
normal: {
borderWidth: 4,
lineStyle: { width: 2 }
}
},
{
offset: 1,
color: "#FFC671",
data:data.map(item => item.kcsjRate),
},
{
name:'施工类项目下浮率',
smooth: false, //平滑
type:"line",
symbolSize: 6, //折线拐点大小
itemStyle: {
normal: {
borderWidth: 4,
lineStyle: { width: 2 }
}
},
]),
},
data:data.map(item => item.sgRate),
},
{
name:'监理类项目下浮率',
smooth: false, //平滑
type:"line",
symbolSize: 6, //折线拐点大小
itemStyle: {
normal: {
borderWidth: 4,
lineStyle: { width: 2 }
}
},
data:data.map(item => item.jlRate),
},
]
}
]
}
myChart.setOption(option);
window.addEventListener("resize", function () {
myChart.resize();//图表跟随页面大小变化宽度
});
},
handleClick(type,index){
if(type === 1){
this.typeIndex=index;
this.jzglData=this.glData[index].levelList;
let total=0
for(let i=0; i<this.jzglData.length; i++){
total=total+this.jzglData[i].count
}
this.total=total;
this.glDetail=this.zzTableData[index]
this.initChart()
}
if(type === 2){
this.qydqIndex=index;
let data=this.dqData[index].province;
let list=[];
for(let i=0; i<data.length; i++){
let item={};
item.province=data[i].province;
for (let j=0; j<data[i].levelList.length; j++){
if(data[i].levelList[j].levelValue === '特级'){
item.tjCount=data[i].levelList[j].count;
item.tjRate=data[i].levelList[j].rate;
}
if(data[i].levelList[j].levelValue === '一级'){
item.oneCount=data[i].levelList[j].count;
item.oneRate=data[i].levelList[j].rate;
myChart.setOption(option);
window.addEventListener("resize", function () {
myChart.resize();//图表跟随页面大小变化宽度
});
})
},
//地区
async dataRegion() {
var str = [];
for (let x = 0; x < 3; x++) {
for (let i = 0; i < dataRegion.length; i++) {
if (dataRegion[i].regionLevel == x + 1 && x + 1 == 1) {
str.push({
'id': dataRegion[i].id,
"label": dataRegion[i].regionName,
"short": dataRegion[i].short,
"value": dataRegion[i].parentId,
"children": []
});
}
if(data[i].levelList[j].levelValue === '二级'){
item.twoCount=data[i].levelList[j].count;
item.twoRate=data[i].levelList[j].rate;
}
}
this.addressList = str;
},
handleYears(key){
switch (key) {
case 1:
this.getCountBidByType()
break;
case 2:
this.getCountBidGroupByProvince()
break;
case 3:
this.getRangeBidMoney()
break;
case 5:
this.getLowerRateByYear()
break;
case 6:
this.getLowerRangeTenderType()
break;
}
},
handleSearch(){
// console.log(this.address)
},
yearsData(){
let mydate=new Date();
let Year = mydate.getFullYear();
let startyear=mydate.getFullYear()-4;
let Years=[];
for(var i=startyear;i<=Year;i++){
Years.push(i);
}
this.yearOptions=Years.reverse()
},
formatStatus: function(row, column, cellValue) {
return cellValue? cellValue : '-'
},
getSummaries(param){
const { columns, data } = param;
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '合计';
return;
}
if (index === 1 || index === 3 || index === 5) {
sums[index] = '-';
return;
}
const values = data.map(item => Number(item[column.property]));
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr);
if (!isNaN(value)) {
return Number(prev) + Number(curr)
} else {
return prev;
}
if(data[i].levelList[j].levelValue === '三级'){
item.threeCount=data[i].levelList[j].count;
item.threeRate=data[i].levelList[j].rate;
}, 0);
if (index === 4) {
sums[index] = Number(sums[index]).toFixed(2);
return;
}
});
return sums;
},
getSummaries1(param){
const { columns, data } = param;
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '合计';
return;
}
if (index === 1) {
sums[index] = '-';
return;
}
const values = data.map(item => Number(item[column.property]));
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr);
if (!isNaN(value)) {
return Number(prev) + Number(curr)
} else {
return prev;
}
}, 0);
if (index === 2||index === 3||index === 4) {
sums[index] = Number(sums[index]).toFixed(2);
return;
}
list.push(item)
}
this.jzdqData=list;
this.$nextTick(()=>{
this.initChart1()
})
});
return sums;
},
}
},
}
}
}
</script>
<style lang="scss" scoped>
.zhongbiao{
.zb-content{
padding-top: 16px;
.text_p{
color: #999999;
font-size: 14px;
margin: 0;
}
.empty{
margin: 0 auto;
height: 300px;
text-align: center;
.img{
width: 108px;
height: 108px;
margin-bottom: 24px;
margin-top: 70px;
}
.p1{
color: #333333;
font-size: 16px;
}
}
.query-params{
.common-title{
margin-right: 24px;
}
::v-deep .form-content-width{
width: 150px;
.el-select__input{
width: 10px !important;
max-width: 10px !important;
margin-left:0;
}
}
::v-deep .el-cascader{
width: 220px;
.el-cascader__tags{
flex-wrap: inherit;
.el-tag{
max-width: 130px;
}
}
}
}
.td_content{
background: #ffffff;
border-radius: 4px;
margin-top: 12px;
padding: 16px;
}
.text{
width: 100%;
line-height: 28px;
padding: 0 16px;
margin-top: 24px;
font-size: 12px;
color: rgba(35,35,35,0.8);
background: #F4F4F5;
border-radius: 2px;
margin-bottom: 24px;
padding: 16px 52px 16px 16px;
}
.tips{
margin: 0;
padding-top: 16px;
font-size: 12px;
color: rgba(35,35,35,0.4);
i{
color:#909399;
margin-right: 9px;
font-size: 14px;
.content_box{
display: flex;
justify-content: space-between;
.box-left{
width: 60%;
}
}
.content1{
.main1{
.left{
width: 20%;
float: left;
.item{
height: 74px;
line-height: 74px;
color: #333333;
font-size: 16px;
padding-left: 30px;
border-top: 1px solid #EAF3FF;
border-left: 1px solid #EAF3FF;
border-right: 1px solid #EAF3FF;
cursor: pointer;
}
.item:last-child{
border-bottom: 1px solid #EAF3FF;
}
.color{
.box-right{
width: 33%;
float: right;
::v-deep .el-table{
.sort-caret.ascending{
border-bottom-color: rgba(0,129,255,0.5);
}
.ascending .sort-caret.ascending{
border-bottom-color: #0081FF;
}
.sort-caret.descending{
border-top-color: rgba(0,129,255,0.5);
}
.descending .sort-caret.descending{
border-top-color: #0081FF;
}
.el-table__header-wrapper{
background: #F0F3FA;
color:#0081FF;
i{
width: 4px;
height: 29px;
background: #0081FF;
border-radius: 10px;
display: inline-block;
float: right;
margin-top: 22px;
th{
background: #F0F3FA;
/*text-align: left;*/
}
}
}
.right{
width: 79%;
float: right;
background: #F0F3FA;
height: 295px;
padding: 16px;
}
}
.main2{
margin-top: 30px;
.head{
span{
font-size: 12px;
color: rgba(35,35,35,0.8);
}
.number{
color:#FF3C3C;
}
::v-deep .el-select{
width: 100px;
height: 32px;
.el-input{
width: 100%;
height: 32px;
.el-table__footer-wrapper{
background: #F0F3FA;
}
th {
font-size: 13px !important;
font-weight: 400 !important;
}
.cell {
padding-right: 12px !important;
padding-left: 12px !important;
line-height: 18px;
}
.el-table__fixed-header-wrapper{
th{
background: #F0F3FA;
}
.el-input__inner{
height: 32px !important;
line-height: 32px;
}
td.el-table__cell{
border-bottom: 0;
}
tr{
&.current-row>td{
background-color: initial;
}
&:nth-child(2n) {
background: #F8FBFF;
}
}
}
}
.table-item{
margin-top: 12px;
}
}
.content2{
.tabs{
margin-top: 32px;
margin-bottom: 24px;
.item{
display: inline-block;
color: #3D3D3D;
font-size: 14px;
margin-right: 24px;
cursor: pointer;
}
.color{
color: #3D3D3D;
font-weight: 700;
position: relative;
i{
width: 42px;
height: 2px;
background: #0081FF;
display: inline-block;
position: absolute;
bottom:-4px;
left: 50%;
transform: translate(-50%,0);
.el-table__cell{
height: 40px;
padding: 0;
line-height: 40px;
}
.el-table__body tr:hover > td.el-table__cell{
background: #DCEBFF;
}
::-webkit-scrollbar-track-piece {
//滚动条凹槽的颜色,还可以设置边框属性
background-color: #F3F4F5;
height: 16px;
padding: 0 4px;
}
//滚动条的宽度
::-webkit-scrollbar {
width: 8px;
height: 8px;
background-color: #F3F4F5;
border-radius: 6px;
}
//滚动条的滑块
::-webkit-scrollbar-thumb {
border-radius: 8px;
height: 8px;
margin: 0 4px;
background: rgba(98,110,126,0.2);
border: 4px solid rgba(98,110,126,0.2);;
&:hover{
background: #566380;
}
}
}
}
.table-item{
margin-top: 32px;
}
}
.content3{
.table-item{
margin-top: 32px;
}
.table-item {
::v-deep .el-table {
.has-gutter{
tr{
th:nth-child(3){
th:nth-last-child(2){
border-right:0;
}
td:nth-last-child(2){
border-right:0;
.cell{
padding-right: 24px !important;
}
}
}
}
}
}
}
.table-item{
::v-deep .el-table{
.el-table__header-wrapper{
th{
padding: 0;
.el-table__cell.gutter{
background: #F0F3FA;
}
}
.el-table__cell.is-right{
text-align: right;
}
.has-gutter{
tr{
th:nth-child(6),th:nth-child(8){
border-right:0;
.el-table__row{
td:last-child{
.cell{
padding-right: 24px !important;
padding-right: 12px !important;
}
}
}
}
.el-table__cell.gutter{
/*background: #F0F3FA;*/
width: 16px !important;
}
.el-table__row{
td:last-child{
.cell{
padding-right: 24px !important;
}
}
}
th{
font-size: 12px !important;
font-weight: 400 !important;
}
.el-table__fixed-header-wrapper th{
background: #F0F3FA;
}
td.el-table__cell{
border-bottom: 0;
}
.caret-wrapper{
width: 10px;
}
}
}
::v-deep .el-input--medium{
.el-input__icon{
line-height: 32px;
}
}
}
......
......@@ -4,14 +4,14 @@
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="全国经济大全" name="first"></el-tab-pane>
<el-tab-pane label="全国商机项目分析" name="second"></el-tab-pane>
<!--<el-tab-pane label="全国中标市场分析" name="third"></el-tab-pane>-->
<el-tab-pane label="全国中标市场分析" name="fourth"></el-tab-pane>
<el-tab-pane label="全国中标市场分析" name="third"></el-tab-pane>
<el-tab-pane label="全国建筑企业分析" name="fourth"></el-tab-pane>
</el-tabs>
</div>
<Economic v-if="activeName === 'first'"></Economic>
<Sjxmfx v-if="activeName === 'second'"></Sjxmfx>
<!--<Zhongbiao v-if="activeName === 'third'"></Zhongbiao>-->
<Zhongbiao v-if="activeName === 'third'"></Zhongbiao>
<Jzqyfx v-if="activeName === 'fourth'"></Jzqyfx>
</div>
</template>
......
......@@ -153,7 +153,7 @@
element-loading-text="Loading"
@sort-change="sortChange"
border
height="640"
max-height="640"
fit
highlight-current-row
>
......@@ -162,6 +162,7 @@
</el-table-column>
<el-table-column prop="companyName" label="公司名称" width="300" fixed>
<template slot-scope="scope">
<!--<router-link :to="`/groupAccount/${encodeStr(scope.row.companyId)}`" tag="a" class="a-link companyName" v-html="scope.row.companyName" ></router-link>-->
<router-link :to="`/enterprise/${encodeStr(scope.row.companyId)}`" tag="a" class="a-link companyName" v-html="scope.row.companyName" ></router-link>
<span @click="handleClick(scope.row)" class="table-span" style="color: #3D3D3D;cursor: pointer;" v-if="scope.row.claimStatus === null || scope.row.claimStatus === 1"><img src="@/assets/images/urban/rl_icon1.png"/>认领</span>
<span @click="cancelClaim(scope.row.companyName)" class="table-span" style="color: rgba(35,35,35,0.4);cursor: pointer;" v-if="scope.row.claimStatus === 0"><img src="@/assets/images/urban/rl_icon2.png"/>已认领</span>
......@@ -249,7 +250,7 @@
<el-dialog :visible.sync="claimVisible" width="244" custom-class='dialog-claim' :show-close="false">
<div>认领成功,是否完善客户信息?</div>
<div slot="footer" class="dialog-footer">
<el-button @click="innerVisible = true">
<el-button @click="claimVisible = false">
<router-link :to="`/enterprise/${encodeStr(companyId)}?customerId=${customerId}&path=business`" tag="a" >
立即完善
</router-link>
......@@ -364,7 +365,10 @@ export default {
created() {
this.dataRegion()
this.getType()
this.dataQuery=this.$route.query;
this.dataQuery=this.$route.params;
// console.log(this.dataQuery)
// console.log(this.$route.query)
// console.log(this.$route.params)
if(this.dataQuery.provinceId){
if(Array.isArray(this.dataQuery.province)){
this.province=this.dataQuery.province[0];
......
......@@ -130,9 +130,9 @@
state:2,
}
getGZDB(params).then(result=>{
this.datalist = result.code == 200?result:[]
if(this.datalist){
this.yqnum = `已逾期 ${this.datalist.rows.length} 条`;
let datalist = result.code == 200?result:[]
if(datalist){
this.yqnum = `已逾期 ${datalist.rows.length} 条`;
}
})
},
......
......@@ -37,7 +37,7 @@ module.exports = {
target: `http://47.104.91.229:9099/prod-api`,
// target: `http://122.9.160.122:9011`,
// target: `http://192.168.60.126:9011`,
// target: `http://192.168.60.27:8766`,
// target: `http://192.168.60.126:9098`,
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: ''
......
......@@ -3,10 +3,12 @@ package com.dsk.system.dskService;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.dsk.acc.openapi.client.util.CommonUtils;
import com.dsk.common.core.domain.R;
import com.dsk.common.core.domain.model.*;
import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.utils.DskOpenApiUtil;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -56,23 +58,40 @@ public class EnterpriseBussinessService {
public TableDataInfo clientPage(EnterpriseBussinessClientPageBody body) throws Exception {
if (body.isVaildCid()) return new TableDataInfo(new ArrayList<>(), 0);
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/clientPage", BeanUtil.beanToMap(body, false, false));
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/clientPage2", BeanUtil.beanToMap(body, false, false));
return dskOpenApiUtil.responsePage(map);
}
public Map<String, Object> clientProjectPage(EnterpriseBussinessClientProjectPageBody body) throws Exception {
public TableDataInfo clientProjectPage(EnterpriseBussinessClientProjectPageBody body) throws Exception {
if (body.isVaildCid()) return null;
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/clientProjectPage", BeanUtil.beanToMap(body, false, false));
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/clientProjectPage2", BeanUtil.beanToMap(body, false, false));
Integer code = MapUtils.getInteger(map, "code", 300);
if (200 != code) {
throw new RuntimeException();
}
Map data = MapUtils.getMap(map, "data", null);
if (200 != code) throw new RuntimeException();
Integer count = MapUtils.getInteger(data, "totalCount", 0);
Object list = MapUtils.getObject(data, "list", "");
TableDataInfo tableDataInfo = new TableDataInfo((List<?>) list, count);
Map<String, Object> resMap = BeanUtil.beanToMap(tableDataInfo);
resMap.put("totalAmount", MapUtils.getDouble(data, "totalAmount", 0.0));
return resMap;
List<Object> list = CommonUtils.assertAsArray(MapUtils.getObject(data, "list", ""));
if (CollectionUtils.isEmpty(list)) {
return new TableDataInfo(list, 0);
}
for (Object supplierProject : list) {
Map<String, Object> dataMap = CommonUtils.assertAsMap(supplierProject);
dataMap.put("sourceId", null);
dataMap.put("sourceType", null);
String source = MapUtils.getString(dataMap, "source");
if (ObjectUtil.isNotEmpty(source)) {
List<EnterpriseBussinessVo> enterpriseBussinessVoList = JSONUtil.toList(source, EnterpriseBussinessVo.class);
if (ObjectUtil.isNotEmpty(enterpriseBussinessVoList.get(0))) {
EnterpriseBussinessVo vo = enterpriseBussinessVoList.get(0);
dataMap.put("sourceId", vo.getSource_id());
dataMap.put("sourceType", vo.getSource_type());
}
}
}
return new TableDataInfo(list, MapUtils.getInteger(data, "totalCount", 0));
}
......@@ -121,25 +140,46 @@ public class EnterpriseBussinessService {
public TableDataInfo supplierPage(EnterpriseBussinessSupplierPageBody body) throws Exception {
if (body.isVaildCid()) return new TableDataInfo(new ArrayList<>(), 0);
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/supplierPage", BeanUtil.beanToMap(body, false, false));
if (body.isVaildCid()) {
return new TableDataInfo(new ArrayList<>(), 0);
}
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/supplierPage2", BeanUtil.beanToMap(body, false, false));
return dskOpenApiUtil.responsePage(map);
}
public Map<String, Object> supplierProjectPage(EnterpriseBussinessSupplierProjectPageBody body) throws Exception {
if (body.isVaildCid()) return null;
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/supplierProjectPage", BeanUtil.beanToMap(body, false, false));
public TableDataInfo supplierProjectPage(EnterpriseBussinessSupplierProjectPageBody body) throws Exception {
if (body.isVaildCid()) {
return new TableDataInfo(new ArrayList<>(), 0);
}
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/supplierProjectPage2", BeanUtil.beanToMap(body, false, false));
log.info(JSONUtil.toJsonStr(map));
Integer code = MapUtils.getInteger(map, "code", 300);
if (200 != code) {
throw new RuntimeException();
}
Map data = MapUtils.getMap(map, "data", null);
if (200 != code) throw new RuntimeException();
Integer count = MapUtils.getInteger(data, "totalCount", 0);
Object list = MapUtils.getObject(data, "list", "");
TableDataInfo tableDataInfo = new TableDataInfo((List<?>) list, count);
Map<String, Object> resMap = BeanUtil.beanToMap(tableDataInfo);
resMap.put("totalAmount", MapUtils.getDouble(data, "totalAmount", 0.0));
return resMap;
List<Object> list = CommonUtils.assertAsArray(MapUtils.getObject(data, "list", ""));
if (CollectionUtils.isEmpty(list)) {
return new TableDataInfo(list, 0);
}
for (Object supplierProject : list) {
Map<String, Object> dataMap = CommonUtils.assertAsMap(supplierProject);
dataMap.put("sourceId", null);
dataMap.put("sourceType", null);
String source = MapUtils.getString(dataMap, "source");
if (ObjectUtil.isNotEmpty(source)) {
List<EnterpriseBussinessVo> enterpriseBussinessVoList = JSONUtil.toList(source, EnterpriseBussinessVo.class);
if (ObjectUtil.isNotEmpty(enterpriseBussinessVoList.get(0))) {
EnterpriseBussinessVo vo = enterpriseBussinessVoList.get(0);
dataMap.put("sourceId", vo.getSource_id());
dataMap.put("sourceType", vo.getSource_type());
}
}
}
return new TableDataInfo(list, MapUtils.getInteger(data, "totalCount", 0));
}
......@@ -175,4 +215,34 @@ public class EnterpriseBussinessService {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/historySendProvince", BeanUtil.beanToMap(body, false, false));
return BeanUtil.toBean(map, R.class);
}
public R bidWinMergeDetail(EnterpriseBusinessBidWinMergeDetailBody body) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/bidWinMergeDetail", BeanUtil.beanToMap(body, false, false));
return BeanUtil.toBean(map, R.class);
}
public R skyProjectDetail(EnterpriseBusinessSkyProjectDetailBody body) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/skyProjectDetail", BeanUtil.beanToMap(body, false, false));
return BeanUtil.toBean(map, R.class);
}
public R awardDetail(EnterpriseBusinessAwardDetailBody body) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/awardDetail", BeanUtil.beanToMap(body, false, false));
Integer code = MapUtils.getInteger(map, "code", 300);
if (200 != code) {
throw new RuntimeException();
}
Map data = MapUtils.getMap(map, "data", null);
if (ObjectUtil.isNotEmpty(data)) {
String source = MapUtils.getString(data, "source");
if (ObjectUtil.isNotEmpty(source)) {
List<EnterpriseBusinessAwardDetailVo> enterpriseBussinessVoList = JSONUtil.toList(source, EnterpriseBusinessAwardDetailVo.class);
if (ObjectUtil.isNotEmpty(enterpriseBussinessVoList.get(0))) {
EnterpriseBusinessAwardDetailVo vo = enterpriseBussinessVoList.get(0);
return R.ok(vo);
}
}
}
return BeanUtil.toBean(map, R.class);
}
}
package com.dsk.system.service;
import com.alibaba.fastjson2.JSONObject;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.system.domain.business.dto.BusinessSearchDto;
import com.dsk.system.domain.business.vo.BusinessAnalyzeVo;
......@@ -18,4 +20,8 @@ public interface IBusinessOverviewService {
List<BusinessAnalyzeVo> typeAnalyze(BusinessSearchDto dto);
AjaxResult countGroupByProvince(JSONObject object);
AjaxResult rangByMoney(JSONObject object);
}
......@@ -152,6 +152,7 @@ public class BusinessInfoServiceImpl implements IBusinessInfoService {
vo.setInvestmentAmount(MapUtil.getDouble(map, "projectContractAmount"));
}
vo.setProjectType(MapUtil.getStr(map, "projectType"));
vo.setProjectStage(MapUtil.getStr(map, "tenderStage"));
vo.setProjectCategory(MapUtil.getStr(map, "projectPurposes"));
vos.add(vo);
}
......
package com.dsk.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson2.JSONObject;
import com.dsk.common.annotation.DataScope;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.utils.DskOpenApiUtil;
import com.dsk.system.domain.business.dto.BusinessSearchDto;
import com.dsk.system.domain.business.vo.BusinessAnalyzeVo;
import com.dsk.system.mapper.BusinessInfoMapper;
import com.dsk.system.service.IBusinessOverviewService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
......@@ -22,6 +27,9 @@ public class BusinessOverviewServiceImpl implements IBusinessOverviewService {
@Resource
private BusinessInfoMapper businessInfoMapper;
@Autowired
private DskOpenApiUtil dskOpenApiUtil;
@Override
@DataScope(userAlias = "u",deptAlias = "d")
public Map<String, Object> statusStatistics(BusinessSearchDto dto) {
......@@ -51,4 +59,16 @@ public class BusinessOverviewServiceImpl implements IBusinessOverviewService {
public List<BusinessAnalyzeVo> typeAnalyze(BusinessSearchDto dto) {
return businessInfoMapper.selectTypeAnalyze(dto);
}
@Override
public AjaxResult countGroupByProvince(JSONObject object) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/nationzj/marketAnalysis/project/countGroupByProvince", object);
return BeanUtil.toBean(map, AjaxResult.class);
}
@Override
public AjaxResult rangByMoney(JSONObject object) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/nationzj/marketAnalysis/project/rangByMoney", object);
return BeanUtil.toBean(map, AjaxResult.class);
}
}
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