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; package com.dsk.web.controller.business;
import com.alibaba.fastjson2.JSONObject;
import com.dsk.common.core.controller.BaseController; import com.dsk.common.core.controller.BaseController;
import com.dsk.common.core.domain.AjaxResult; import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.utils.SecurityUtils; import com.dsk.common.utils.SecurityUtils;
...@@ -8,6 +9,7 @@ import com.dsk.system.service.IBusinessOverviewService; ...@@ -8,6 +9,7 @@ import com.dsk.system.service.IBusinessOverviewService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; 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.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
...@@ -46,4 +48,22 @@ public class BusinessOverviewController extends BaseController { ...@@ -46,4 +48,22 @@ public class BusinessOverviewController extends BaseController {
public AjaxResult typeAnalyze(){ public AjaxResult typeAnalyze(){
return AjaxResult.success(baseService.typeAnalyze(new BusinessSearchDto(SecurityUtils.getUserId(),2))); 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 { ...@@ -43,7 +43,7 @@ public class EnterpriseBussinessController {
@ApiOperation(value = "客户项目列表(openApi)") @ApiOperation(value = "客户项目列表(openApi)")
@RequestMapping(value = "/clientProjectPage", method = RequestMethod.POST) @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); return enterpriseBussinessService.clientProjectPage(paramMap);
} }
...@@ -67,7 +67,7 @@ public class EnterpriseBussinessController { ...@@ -67,7 +67,7 @@ public class EnterpriseBussinessController {
@ApiOperation(value = "供应商项目列表(openApi)") @ApiOperation(value = "供应商项目列表(openApi)")
@RequestMapping(value = "/supplierProjectPage",method = RequestMethod.POST) @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); return enterpriseBussinessService.supplierProjectPage(paramMap);
} }
...@@ -102,4 +102,24 @@ public class EnterpriseBussinessController { ...@@ -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 { ...@@ -36,4 +36,15 @@ public class EnterpriseBussinessClientPageBody extends BasePage {
return 0 == cid; return 0 == cid;
} }
/**
* 来源
*/
private List<String> sources;
/**
* 项目类型
*/
private List<String> projects;
} }
...@@ -7,6 +7,7 @@ import lombok.ToString; ...@@ -7,6 +7,7 @@ import lombok.ToString;
import javax.validation.constraints.AssertFalse; import javax.validation.constraints.AssertFalse;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.util.List;
@Data @Data
@ToString @ToString
...@@ -20,10 +21,10 @@ public class EnterpriseBussinessClientProjectPageBody extends BasePage { ...@@ -20,10 +21,10 @@ public class EnterpriseBussinessClientProjectPageBody extends BasePage {
private Integer cid; private Integer cid;
/** /**
* 企业id * 客户企业Id
*/ */
@NotNull(message = "企业id不能为空") @NotNull(message = "企业id不能为空")
private Integer unitId; private Integer companyId;
/** /**
* 查询关键字 * 查询关键字
...@@ -32,7 +33,29 @@ public class EnterpriseBussinessClientProjectPageBody extends BasePage { ...@@ -32,7 +33,29 @@ public class EnterpriseBussinessClientProjectPageBody extends BasePage {
public boolean isVaildCid() { 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; ...@@ -7,6 +7,7 @@ import lombok.ToString;
import javax.validation.constraints.AssertFalse; import javax.validation.constraints.AssertFalse;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.util.List;
@Data @Data
@ToString @ToString
...@@ -34,4 +35,15 @@ public class EnterpriseBussinessSupplierPageBody extends BasePage { ...@@ -34,4 +35,15 @@ public class EnterpriseBussinessSupplierPageBody extends BasePage {
public boolean isVaildCid() { public boolean isVaildCid() {
return 0 == cid; return 0 == cid;
} }
/**
* 来源
*/
private List<String> sources;
/**
* 项目类型
*/
private List<String> projects;
} }
...@@ -7,6 +7,7 @@ import lombok.ToString; ...@@ -7,6 +7,7 @@ import lombok.ToString;
import javax.validation.constraints.AssertFalse; import javax.validation.constraints.AssertFalse;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.util.List;
@Data @Data
@ToString @ToString
...@@ -20,10 +21,10 @@ public class EnterpriseBussinessSupplierProjectPageBody extends BasePage { ...@@ -20,10 +21,10 @@ public class EnterpriseBussinessSupplierProjectPageBody extends BasePage {
private Integer cid; private Integer cid;
/** /**
* 企业id * 供应商企业Id
*/ */
@NotNull(message = "企业id不能为空") @NotNull(message = "企业id不能为空")
private Integer unitId; private Integer companyId;
/** /**
* 查询关键字 * 查询关键字
...@@ -32,8 +33,28 @@ public class EnterpriseBussinessSupplierProjectPageBody extends BasePage { ...@@ -32,8 +33,28 @@ public class EnterpriseBussinessSupplierProjectPageBody extends BasePage {
public boolean isVaildCid() { 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) { ...@@ -100,7 +100,16 @@ export function countNewsBidByMonth(param) {
data: param data: param
}) })
} }
//全国商机项目分析-全国土地交易项目年份统计
//全国中标市场分析-全国中标项目统计
export function countBidByType(param) {
return request({
url: '/marketAnalysis/countBidByType',
method: 'POST',
data: param
})
}
//全国中标市场分析-全国各地区中标统计TOP10
export function countBidGroupByProvince(param) { export function countBidGroupByProvince(param) {
return request({ return request({
url: '/marketAnalysis/countBidGroupByProvince', url: '/marketAnalysis/countBidGroupByProvince',
...@@ -108,6 +117,37 @@ export function countBidGroupByProvince(param) { ...@@ -108,6 +117,37 @@ export function countBidGroupByProvince(param) {
data: 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 = [ ...@@ -77,6 +77,7 @@ export const constantRoutes = [
{ {
path: '', path: '',
component: Layout, component: Layout,
hidden: true,
redirect: 'urban', redirect: 'urban',
children: [ children: [
{ {
...@@ -101,6 +102,20 @@ export const constantRoutes = [ ...@@ -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', path: '/enterprise',
component: Layout, 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 @@ ...@@ -12,8 +12,27 @@
<div class="arrow"></div> <div class="arrow"></div>
<div @click="handleClick(option)" :class="['option', value==option?'active':'']" :key="i" v-for="(option, i) in options"> <div @click="handleClick(option)" :class="['option', value==option?'active':'']" :key="i" v-for="(option, i) in options">
<template v-if="option == '自定义'"> <template v-if="option == '自定义'">
<div class="number-box"> <!--<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> <!--<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> </div>
</template> </template>
<template v-else> <template v-else>
...@@ -88,11 +107,11 @@ export default { ...@@ -88,11 +107,11 @@ export default {
// const flag = document.getElementById('custom-money-select').contains(e.target) // const flag = document.getElementById('custom-money-select').contains(e.target)
!flag ? this.isSelectOption = false : '' !flag ? this.isSelectOption = false : ''
if(this.value == '自定义' && !this.startMoney && !this.endMoney) { // if(this.value == '自定义' && !this.startMoney && !this.endMoney) {
this.value = '' // this.value = ''
this.$emit('input', '') // this.$emit('input', '')
this.$emit('handle-search') // this.$emit('handle-search')
} // }
}, true) }, true)
}, },
// 清除 // 清除
...@@ -120,33 +139,42 @@ export default { ...@@ -120,33 +139,42 @@ export default {
this.value = value this.value = value
let moneyStr = '' let moneyStr = ''
if(value == '自定义') { if(value == '自定义') {
this.value = '自定义' this.value = '自定义';
}else { }else {
this.startMoney = '' this.startMoney = ''
this.endMoney = '' this.endMoney = ''
this.isSelectOption = false this.isSelectOption = false
switch (value) { switch (value) {
case '10亿以上':
moneyStr = [100000]
break;
case '一亿以上': case '一亿以上':
moneyStr = [10000] moneyStr = [10000]
break; break;
case '1亿-10亿':
moneyStr = [10000, 100000]
break;
case '1亿-5亿':
moneyStr = [10000, 50000]
break;
case '5000万-1亿': case '5000万-1亿':
moneyStr = [5000, 10000] moneyStr = [5000, 10000]
break; break;
case '1000万-5000万': case '1000万-5000万':
moneyStr = [1000, 5000] moneyStr = [1000, 5000]
break; break;
case '10亿以上':
moneyStr = [100000]
break;
case '1亿-10亿':
moneyStr = [10000, 100000]
break;
case '2000万-1亿': case '2000万-1亿':
moneyStr = [2000, 10000] moneyStr = [2000, 10000]
break; break;
case '400万-2000万': case '400万-2000万':
moneyStr = [400, 2000] moneyStr = [400, 2000]
break; break;
case '5000万以下':
moneyStr = [, 5000]
break;
case '1000万以下':
moneyStr = [, 1000]
break;
case '400万以下': case '400万以下':
moneyStr = [, 400] moneyStr = [, 400]
break; break;
...@@ -158,6 +186,13 @@ export default { ...@@ -158,6 +186,13 @@ export default {
this.$emit('handle-search') this.$emit('handle-search')
} }
}, },
// 自定义取消
cancellation(){
this.isSelectOption = false
this.value = ''
this.$emit('input', '')
this.$emit('handle-search')
},
// 自定义确认点击后的回调 // 自定义确认点击后的回调
handleConfirm() { handleConfirm() {
this.isSelectOption = false this.isSelectOption = false
...@@ -271,7 +306,7 @@ export default { ...@@ -271,7 +306,7 @@ export default {
.option { .option {
padding: 0 24px 0 16px; padding: 0 24px 0 16px;
box-sizing: border-box; box-sizing: border-box;
width: 400px; width: 140px;
height: 36px; height: 36px;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
...@@ -294,8 +329,6 @@ export default { ...@@ -294,8 +329,6 @@ export default {
overflow: hidden; overflow: hidden;
white-space: nowrap; white-space: nowrap;
text-overflow: ellipsis; text-overflow: ellipsis;
width: 206px;
border: 1px solid #DCDCDC;
border-radius: 2px; border-radius: 2px;
&::-webkit-outer-spin-button, &::-webkit-outer-spin-button,
...@@ -360,5 +393,47 @@ export default { ...@@ -360,5 +393,47 @@ export default {
line-height: 30px; line-height: 30px;
margin-left: 10px; 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> </style>
...@@ -57,6 +57,10 @@ export default { ...@@ -57,6 +57,10 @@ export default {
dateTo: { dateTo: {
type: String, type: String,
default: '' default: ''
},
timeList: {
type: Array,
default: () => [],
} }
}, },
computed: { computed: {
...@@ -103,6 +107,9 @@ export default { ...@@ -103,6 +107,9 @@ export default {
this.defaultValue = new Date(this.dateTo) this.defaultValue = new Date(this.dateTo)
} }
this.handleAppClick() this.handleAppClick()
if(this.timeList&&this.timeList.length>0){
this.options = this.timeList
}
}, },
methods: { methods: {
// 时间格式化 // 时间格式化
...@@ -159,6 +166,18 @@ export default { ...@@ -159,6 +166,18 @@ export default {
let startTime = '' let startTime = ''
let endTime = new Date() let endTime = new Date()
switch (value) { 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年': case '近1年':
startTime = new Date().setFullYear(new Date().getFullYear() - 1) startTime = new Date().setFullYear(new Date().getFullYear() - 1)
if(this.dateTo){ if(this.dateTo){
...@@ -309,7 +328,7 @@ export default { ...@@ -309,7 +328,7 @@ export default {
.el-picker-panel.el-date-range-picker.el-popper { .el-picker-panel.el-date-range-picker.el-popper {
left: 0 !important; left: 0 !important;
top: 205px !important; /*top: 205px !important;*/
} }
.popper__arrow { .popper__arrow {
......
...@@ -51,12 +51,13 @@ ...@@ -51,12 +51,13 @@
style="max-width: 170px" style="max-width: 170px"
:placeholder="form.placeholder" :placeholder="form.placeholder"
@change="changeSelect"> @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> </el-select>
</template> </template>
<!-- 时间、自定义 --> <!-- 时间、自定义 -->
<template v-else-if="form.type==5"> <template v-else-if="form.type==5">
<custom-time-select <custom-time-select
:timeList="form.timeList"
v-model="form.value" v-model="form.value"
:placeholder="form.placeholder" :placeholder="form.placeholder"
:dateFrom="form.dateFrom ? form.dateFrom : ''" :dateFrom="form.dateFrom ? form.dateFrom : ''"
...@@ -81,7 +82,6 @@ ...@@ -81,7 +82,6 @@
@change="changeSelect" @change="changeSelect"
:placeholder="form.placeholder" :placeholder="form.placeholder"
collapse-tags collapse-tags
style="margin-top: -1px;"
clearable></el-cascader> clearable></el-cascader>
</template> </template>
<!-- 自定义 --> <!-- 自定义 -->
...@@ -143,6 +143,9 @@ export default { ...@@ -143,6 +143,9 @@ export default {
return { return {
} }
},
created() {
}, },
components: { components: {
CustomTimeSelect, CustomTimeSelect,
...@@ -173,22 +176,22 @@ export default { ...@@ -173,22 +176,22 @@ export default {
} }
::v-deep .el-input__inner{ ::v-deep .el-input__inner{
border: 1px solid #D9D9D9; border: 1px solid #D9D9D9;
height: 32px; height: 34px;
line-height: 32px; line-height: 34px;
padding-right: 27px; padding-right: 27px;
} }
::v-deep .el-form-item{ ::v-deep .el-form-item{
margin-right: 8px !important; margin-right: 8px !important;
} }
::v-deep .el-input--medium .el-input__icon{ ::v-deep .el-input--medium .el-input__icon{
line-height: 32px; line-height: 34px;
} }
::v-deep .el-cascader{ ::v-deep .el-cascader{
height: 32px; height: 34px;
line-height: 32px; line-height: 34px;
.el-input{ .el-input{
input{ input{
height: 32px !important; height: 34px !important;
} }
} }
.el-cascader__tags{ .el-cascader__tags{
......
...@@ -147,7 +147,6 @@ export default { ...@@ -147,7 +147,6 @@ export default {
}, },
created() { created() {
this.defaultRoute = JSON.parse(JSON.stringify(this.sideRoute)) this.defaultRoute = JSON.parse(JSON.stringify(this.sideRoute))
}, },
watch:{ watch:{
statisticObj:{ statisticObj:{
......
...@@ -288,7 +288,6 @@ export default { ...@@ -288,7 +288,6 @@ export default {
this.uipGroupDatalist = res.data this.uipGroupDatalist = res.data
}) })
}, },
changeXZDJ(index) { changeXZDJ(index) {
this.queryParams.uipExecutiveLevel = index; this.queryParams.uipExecutiveLevel = index;
this.changes() this.changes()
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
</el-table-column> </el-table-column>
<el-table-column prop="gdp" label="GDP(亿元)" sortable width="120" :formatter="formatStatus"/> <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="gdpPerCapita" label="人均GDP(元)" sortable width="130" :formatter="formatStatus"/>
<el-table-column prop="population" label="人口(万人)" sortable width="120" :formatter="formatStatus"/> <el-table-column prop="population" label="人口(万人)" sortable width="120" :formatter="formatStatus"/>
<el-table-column prop="fixedInvestment" label="固定资产投资 (亿元) " sortable width="200" :formatter="formatStatus"/> <el-table-column prop="fixedInvestment" label="固定资产投资 (亿元) " sortable width="200" :formatter="formatStatus"/>
...@@ -100,7 +100,6 @@ export default { ...@@ -100,7 +100,6 @@ export default {
}, },
methods: { methods: {
getData(){ getData(){
this.isSkeleton = true
const params = { pageNum: this.pageIndex, pageSize: this.pageSize, year: this.queryParams.year,type:2 } const params = { pageNum: this.pageIndex, pageSize: this.pageSize, year: this.queryParams.year,type:2 }
if(this.queryParams.field){ if(this.queryParams.field){
params.field=this.queryParams.field params.field=this.queryParams.field
...@@ -118,6 +117,7 @@ export default { ...@@ -118,6 +117,7 @@ export default {
params.areaId=[this.provinceId[2]] params.areaId=[this.provinceId[2]]
} }
// params.provinceIds=[this.dataQuery.provinceId] // params.provinceIds=[this.dataQuery.provinceId]
// this.isSkeleton = true
nationalPage(params).then(res => { nationalPage(params).then(res => {
this.isSkeleton = false this.isSkeleton = false
this.tableData = res.data.list this.tableData = res.data.list
......
...@@ -717,6 +717,9 @@ export default { ...@@ -717,6 +717,9 @@ export default {
// province:this.dataQuery.province, // province:this.dataQuery.province,
// } // }
// }) // })
console.log(this.dataQuery.provinceId)
console.log(this.dataQuery.province)
// return
this.$router.push({name: 'Urban', this.$router.push({name: 'Urban',
params: { params: {
provinceId: this.dataQuery.provinceId, provinceId: this.dataQuery.provinceId,
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
element-loading-text="Loading" element-loading-text="Loading"
border border
fit fit
height="640" max-height="640"
@sort-change="sortChange" @sort-change="sortChange"
highlight-current-row highlight-current-row
v-if="tableDataTotal > 0 && !isSkeleton" v-if="tableDataTotal > 0 && !isSkeleton"
......
...@@ -587,6 +587,13 @@ ...@@ -587,6 +587,13 @@
}, },
itemStyle:{ itemStyle:{
color: "#FFAB44", color: "#FFAB44",
normal: {
label : {show: true},
color:"#FFAB44",
lineStyle: {
color: "#FFAB44"
}
}
}, },
//设置面积区域为渐变效果 //设置面积区域为渐变效果
areaStyle: { areaStyle: {
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
element-loading-text="Loading" element-loading-text="Loading"
@sort-change="sortChange" @sort-change="sortChange"
border border
height="640" max-height="640"
highlight-current-row highlight-current-row
v-if="tableDataTotal > 0 && !isSkeleton" v-if="tableDataTotal > 0 && !isSkeleton"
:default-sort = "{prop: 'gdp', order: 'descending'}" :default-sort = "{prop: 'gdp', order: 'descending'}"
...@@ -220,7 +220,7 @@ ...@@ -220,7 +220,7 @@
}, },
// 查询提交 // 查询提交
async querySubmit() { async querySubmit() {
this.isSkeleton = true // this.isSkeleton = true
const params = { pageNum: this.pageIndex, pageSize: this.pageSize, year: this.queryParams.year,type:1 } const params = { pageNum: this.pageIndex, pageSize: this.pageSize, year: this.queryParams.year,type:1 }
if(this.queryParams.address){ if(this.queryParams.address){
let arr = this.$refs.address.getCheckedNodes(); let arr = this.$refs.address.getCheckedNodes();
......
<template> <template>
<div> <div class="zhongbiao">
<p class="text_p">注:数据来源大司空建筑大数据平台,统计范围为全国公开的中标项目,未公开的不含在内</p>
<skeleton v-if="isSkeleton" style="padding: 16px"></skeleton> <skeleton v-if="isSkeleton" style="padding: 16px"></skeleton>
<div v-if="!isSkeleton" class="zhongbiao"> <div v-if="!isSkeleton" class="td_content">
<div class="zb-content content1"> <div class="flex-box query-box">
<div class="flex-box query-box"> <div class="flex-box query-params">
<div class="flex-box query-params"> <span class="common-title">全国中标项目统计</span>
<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">
</div> <el-option v-for="(item, index) in yearOptions" :key="index" :label="item" :value="item" />
</el-select>
</div> </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>
<div class="main1"> <div class="content_box" v-if="gyflState">
<div style="height: 300px;"> <div class="box-left">
<div class="left"> <div id="echarts1" style="height: 280px"></div>
<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>
<div class="main2"> <div class="box-right">
<!--<div class="flex-box query-box head">--> <el-table
<!--<span>近五年全国招标总数<span class="number">10,610,000 </span></span>--> :data="xmtjList"
<!--<el-select v-model="year" filterable multiple collapse-tags class="form-content-width" placeholder="请选择">--> element-loading-text="Loading"
<!--<el-option v-for="(item, index) in yearOptions" :key="index" :label="item.name" :value="item.value" />--> border
<!--</el-select>--> show-summary
<!--</div>--> max-height="300"
<div class="table-item"> :summary-method="getSummaries"
<el-table fit
:data="zzTableData" highlight-current-row
border :default-sort = "{prop: 'count', order: 'descending'}"
fit >
highlight-current-row <el-table-column label="序号" width="60">
> <template slot-scope="scope">{{ scope.$index + 1 }}</template>
<el-table-column label="序号" width="60" align="left"> </el-table-column>
<template slot-scope="scope">{{ scope.$index + 1 }}</template> <el-table-column prop="type" label="项目类型" :formatter="formatStatus" width="100"/>
</el-table-column> <el-table-column prop="count" label="中标数量 (个)" align="right" :formatter="formatStatus" sortable width="130"/>
<el-table-column prop="major" label="资质类型"/> <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 label="特级" align="right"> <el-table-column prop="moneyRate" label="金额占比(%)" align="right" :formatter="formatStatus" width="120"/>
<el-table-column prop="tjCount" label="数量(个)" align="right"/> </el-table>
<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> </div>
</div> </div>
<div class="zb-content content2"> <div class="empty" v-if="!gyflState">
<div class="flex-box query-box"> <img class="img" src="@/assets/images/project/empty.png">
<div class="flex-box query-params"> <div class="p1">抱歉,暂无数据展示</div>
<span class="common-title">全国建筑企业地区分布</span> </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>
<div class="main1"> </div>
<div class="tabs"> <div class="content_box" v-if="tdytState">
<div class="item" v-for="(item,index) in dqData" :class="qydqIndex === index ? 'color':''" @click="handleClick(2,index)">{{item.major}}<i></i></div> <div class="box-left">
</div> <div id="echarts2" style="height: 280px"></div>
<div id="jzqy-echarts" style="height: 250px"></div>
<p class="tips"><i class="el-icon-info"></i>数据来源大司空建筑大数据平台,统计范围为有效期内资质,未公开不包含在内</p>
</div> </div>
<div class="table-item"> <div class="box-right">
<el-table <el-table
:data="jzdqData" :data="topList"
element-loading-text="Loading"
border border
height="470" show-summary
max-height="300"
:summary-method="getSummaries"
fit fit
highlight-current-row 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> <template slot-scope="scope">{{ scope.$index + 1 }}</template>
</el-table-column> </el-table-column>
<el-table-column prop="province" label="地区"/> <el-table-column prop="province" label="地区" :formatter="formatStatus" width="100"/>
<el-table-column label="特级" align="right"> <el-table-column prop="count" label="中标数量 (个)" align="right" :formatter="formatStatus" sortable width="130"/>
<el-table-column prop="tjCount" label="数量(个)" align="right"/> <el-table-column prop="countRate" label="数量占比(%)" align="right" :formatter="formatStatus" width="120"/>
<el-table-column prop="tjRate" label="占比(%)" align="right"/> <el-table-column prop="sumMoney" label="中标总金额 (万元)" align="right" :formatter="formatStatus" width="140"/>
</el-table-column> <el-table-column prop="moneyRate" label="金额占比(%)" align="right" :formatter="formatStatus" width="120"/>
<el-table-column label="一级" align="right"> </el-table>
<el-table-column prop="oneCount" label="数量(个)" align="right"/> </div>
<el-table-column prop="oneRate" label="占比(%)" align="right"/> </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>
<el-table-column label="二级" align="right"> <el-table-column prop="rangeName" label="中标金额" :formatter="formatStatus"/>
<el-table-column prop="twoCount" label="数量(个)" align="right"/> <el-table-column prop="count" label="中标数量 (个)" align="right" :formatter="formatStatus" sortable/>
<el-table-column prop="twoRate" label="占比(%)" align="right"/> <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>
<el-table-column label="三级" align="right"> <el-table-column prop="year" label="年份" :formatter="formatStatus" width="100"/>
<el-table-column prop="threeCount" label="数量(个)" align="right"/> <el-table-column prop="count" label="中标数量 (个)" align="right" :formatter="formatStatus" sortable/>
<el-table-column prop="threeRate" label="占比(%)" align="right"/> <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>
<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> </el-table>
</div> </div>
</div> </div>
<div class="zb-content content3"> <div class="empty" v-if="!tdytState">
<div class="flex-box query-box"> <img class="img" src="@/assets/images/project/empty.png">
<div class="flex-box query-params"> <div class="p1">抱歉,暂无数据展示</div>
<span class="common-title">全国建筑企业备案分布</span> </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>
<div class="text"> </div>
通过对全国建筑工程总承包一级及以上资质企业的备案数据分析,我们发现这些优质企业主要去了<span v-for="(item,index) in rankList">{{item.province}}{{ rankList.length === index+1 ? '':'、'}}</span>等地开展经营。</div> <div class="content_box" v-if="topList.length > 0 && !isSkeleton">
<div class="main1"> <div class="box-left" style="width: 60%;">
<div id="ba-echarts" style="height: 250px"></div> <div id="echarts6" style="height: 300px"></div>
<p class="tips"><i class="el-icon-info"></i>数据来源大司空建筑大数据平台,统计范围为公开企业备案地数据。</p>
</div> </div>
<div class="table-item"> <div class="box-right">
<el-table <el-table
:data="zbData" :data="xmxflList"
element-loading-text="Loading"
border border
height="430" show-summary
max-height="280"
:summary-method="getSummaries1"
fit fit
highlight-current-row 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> <template slot-scope="scope">{{ scope.$index + 1 }}</template>
</el-table-column> </el-table-column>
<el-table-column prop="province" label="地区" /> <el-table-column prop="month" label="时间" :formatter="formatStatus" width="120"/>
<el-table-column prop="count" label="企业异地备案数量(个)" sortable align="right"/> <el-table-column prop="sgRate" label="施工类项目下浮率(%)" align="right" :formatter="formatStatus" width="170"/>
<!--<el-table-column prop="zb" label="占比"/>--> <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> </el-table>
</div> </div>
</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>
</div> </div>
</template> </template>
<script> <script>
import * as echarts from 'echarts'; 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' import skeleton from '../../component/skeleton'
export default { export default {
name: 'NationalEconomies', name: 'NationalEconomies',
components: { components: {
skeleton skeleton
}, },
data() { data() {
return { return {
typeIndex:0, addressList:[],
glData:[], address:'',
jzglData:[], years:[2023],
zzTableData:[], years1:[2023],
tableOption:[ years2:[2023],
{ years3:2023,
label:'资质类型', years4:2023,
prop:'major' yearOptions:[],
}, xmtjList:[],
{ topList:[],
label: '特级', zbjeList:[],
prop: 'levelValue', zbqsList:[],
child:[ xflList :[],
{ xmxflList :[],
label: '数量(个)', isSkeleton:true,
prop: 'count' gyflState:true,
}, tdytState:true,
{ topState:true,
label: '占比(%)', }
prop: 'rate' },
}, created() {
] this.dataRegion()
}, this.yearsData()
{ this.getCountBidByType()
label: '一级', },
prop: 'levelValue', mounted() {
child:[ },
{ beforeDestroy(){
label: '数量(个)',
prop: 'count' },
}, methods: {
{ getCountBidByType(){
label: '占比(%)', let params={
prop: 'rate' yearStr:this.years.join(",")
}, }
] countBidByType(params).then(res => {
}, this.isSkeleton=false;
{ this.xmtjList=res.data.date;
label: '二级', if(res.data){
prop: 'levelValue', this.$nextTick(() => {
child:[ this.initChart1(res.data.date)
{ })
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;
}
} }
// item.levelList=res.data[i].levelList.reverse(); this.getCountBidGroupByProvince()
list.push(item) this.getRangeBidMoney()
this.getRangeBidFiveYears()
this.getLowerRateByYear()
this.getLowerRangeTenderType()
})
},
getCountBidGroupByProvince(){
let params={
yearStr:this.years1.join(",")
} }
this.zzTableData=list; countBidGroupByProvince(params).then(res => {
this.glData=res.data; this.topList=res.data;
this.jzglData=this.glData[0].levelList; if(res.data){
this.glDetail=list[0] this.$nextTick(() => {
let total=0; this.initChart2(res.data)
for(let i=0; i<this.jzglData.length; i++){ })
total=total+this.jzglData[i].count }
})
},
getRangeBidMoney(){
let params={
yearStr:this.years2.join(",")
} }
this.total=total; rangeBidMoney(params).then(res => {
this.zbjeList=res.data;
this.initChart() var list=[];
}) for(var i=0;i<res.data.length;i++){
certGroupByMajorProvinceLevel().then(res => { var obj={};
this.dqData=res.data; obj.name=res.data[i].rangeName;
let data=this.dqData[0].province; obj.value=res.data[i].count;
let list=[]; obj.rate=res.data[i].rate;
for(let i=0; i<data.length; i++){ list.push(obj)
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;
}
} }
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 lowerRateByYear(params).then(res => {
this.initChart1() for (var i=0; i<res.data.length; i++){
}) res.data[i].rate=res.data[i].rate.toFixed(2)
areaGroupByProvince().then(res => { }
this.zbData=res.data; this.xflList=res.data;
//定义一个变量 保存数据 因为sort方法排序会改变原数组 使用JSON方法深拷贝 将原数值暂存 if(res.data){
// let dataArr = JSON.parse(JSON.stringify(res.data)) this.$nextTick(() => {
let arr=res.data.sort((old,New)=>{ this.initChart5(res.data)
return New.count - old.count })
}
}) })
let data=[] },
for(let i=0; i<5; i++){ getLowerRangeTenderType(){
data.push(arr[i]) let params={
yearStr:this.years4,
} }
this.rankList=data; if(this.address){
//将原数组数据赋值回去 保持数据不变 params.provinceId=this.address
// this.zbData = JSON.parse(JSON.stringify(dataArr)) }
this.initChart2() lowerRangeTenderType(params).then(res => {
})
}, for (var i=0; i<res.data.length; i++){
initChart() { for (let j=0; j<res.data[i].typeList.length; j++){
let myChart = echarts.init(document.getElementById("gl-echarts")) if(res.data[i].typeList[j].tenderType === '施工'){
let option ={ res.data[i].sgRate=res.data[i].typeList[j].rate.toFixed(2)
tooltip: { }
// show:false if(res.data[i].typeList[j].tenderType === '勘察设计'){
}, res.data[i].kcsjRate=res.data[i].typeList[j].rate.toFixed(2)
xAxis: { }
type: 'category', if(res.data[i].typeList[j].tenderType === '监理'){
boundaryGap: false, res.data[i].jlRate=res.data[i].typeList[j].rate.toFixed(2)
data: this.jzglData.map(item => item.levelValue), }
}, }
yAxis: { }
type: 'value', this.xmxflList=res.data;
}, if(this.xmxflList){
grid: { this.$nextTick(() => {
top:40, this.initChart6(this.xmxflList)
left:70, })
right:40, }
bottom:40, })
}, },
series: [
{
data: this.jzglData.map(item => item.count), initChart1(data) {
type: 'line', this.$nextTick(() => {
smooth: true, let myChart = echarts.init(document.getElementById("echarts1"))
emphasis: { let list1=[],list2=[]
disabled: true, for(var i=0; i<data.length; i++) {
focus: 'none' list1.push(data[i].count)
list2.push(data[i].money)
}
let option ={
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'line',
label: {
backgroundColor: '#FFFFFF'
}
}
}, },
//设置折线颜色和粗细 xAxis: {
lineStyle: { type: 'category',
width: 1, boundaryGap: false,
color: "#0081FF", axisLabel: {
show: true,
interval: 0
},
data: data.map(item => item.type),
}, },
itemStyle:{ yAxis: {
color: "#4E8EFF", type: 'value',
}, },
//设置面积区域为渐变效果 grid: {
areaStyle: { top:30,
color: echarts.graphic.LinearGradient(0, 1, 0, 0, [ left:100,
{ right:30,
offset: 0.2, bottom:30,
color: "#DFEAFF", },
color:['#ADC0FF', '#E9C8FF'],
series: [
{
name:'中标数量(个)',
smooth: false, //平滑
type:"line",
symbolSize: 6, //折线拐点大小
itemStyle: {
normal: {
borderWidth: 4,
lineStyle: { width: 2 }
}
}, },
{ data:list1,
offset: 1, },
color: "#5895FF", {
name:'中标总金额(万元)',
smooth: false, //平滑
type:"line",
symbolSize: 6, //折线拐点大小
itemStyle: {
normal: {
borderWidth: 4,
lineStyle: { width: 2 }
}
}, },
]), data:list2,
}, }
]
} }
] myChart.setOption(option);
} window.addEventListener("resize", function () {
myChart.clear(); //图表清除 myChart.resize();//图表跟随页面大小变化宽度
myChart.setOption(option); });
window.addEventListener("resize", function () { })
myChart.resize();//图表跟随页面大小变化宽度 },
}); initChart2(data) {
}, this.$nextTick(() => {
initChart1() { // console.log(typeList)
let myChart = echarts.init(document.getElementById("jzqy-echarts")) let myChart = echarts.init(document.getElementById("echarts2"))
let option ={ let seriesData=[]
legend: { let color=['#FCD68A', '#67B3FD', '#FFB8AD', '#FFD7AD', '#A9F1E5', '#D0FAB7', '#ADC0FF', '#BEECFF', '#81D5BC', '#FFE48A'];
x:'right', let typeNameList=data[0].projectType.map(item => item.type);
padding:[0,30,0,0], let item={}
}, for(var i=0; i<data.length; i++){
tooltip: { for(var j=0; j<data[i].projectType.length; j++){
trigger: 'axis', item[typeNameList[j]] = [];
axisPointer: {
type: 'line',
label: {
backgroundColor: '#FFFFFF'
} }
} }
}, for(var i=0; i<data.length; i++) {
xAxis: { for (var j = 0; j < data[i].projectType.length; j++) {
type: 'category', if(data[i].projectType[j].type === typeNameList[0]){
boundaryGap: false, item[typeNameList[0]].push(data[i].projectType[j].count)
data: this.jzdqData.map(item => item.province), }
}, if(data[i].projectType[j].type === typeNameList[1]){
yAxis: { item[typeNameList[1]].push(data[i].projectType[j].count)
type: 'value', }
}, if(data[i].projectType[j].type === typeNameList[2]){
grid: { item[typeNameList[2]].push(data[i].projectType[j].count)
top:35, }
left:60, if(data[i].projectType[j].type === typeNameList[3]){
right:30, item[typeNameList[3]].push(data[i].projectType[j].count)
bottom:20, }
}, if(data[i].projectType[j].type === typeNameList[4]){
series: [ item[typeNameList[4]].push(data[i].projectType[j].count)
{ }
data: this.jzdqData.map(item => item.tjCount), if(data[i].projectType[j].type === typeNameList[5]){
name:'特级', item[typeNameList[5]].push(data[i].projectType[j].count)
type: 'line', }
smooth: true, if(data[i].projectType[j].type === typeNameList[6]){
emphasis: { item[typeNameList[6]].push(data[i].projectType[j].count)
disabled: true, }
focus: 'none' 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'
}
}
}, },
//设置折线颜色和粗细 xAxis: {
lineStyle: { type: 'category',
width: 2, boundaryGap: false,
color: "#0081FF", axisLabel: {
show: true,
interval: 0
},
data: data.map(item => item.province),
}, },
itemStyle:{ yAxis: {
color: "#4E8EFF", type: 'value',
}, },
//设置面积区域为渐变效果 grid: {
areaStyle: { top:30,
opacity:0.8, left:50,
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [ right:20,
{ bottom:30,
offset: 0.2,
color: "#DFEAFF",
},
{
offset: 1,
color: "#5895FF",
},
]),
}, },
}, color:['#FCD68A', '#FFE48A', '#FFB8AD', '#FFD7AD', '#A9F1E5', '#D0FAB7', '#ADC0FF', '#BEECFF', '#81D5BC', '#67B3FD'],
{ series: seriesData
data: this.jzdqData.map(item => item.oneCount), }
name:'一级', myChart.setOption(option);
type: 'line', window.addEventListener("resize", function () {
smooth: true, myChart.resize();//图表跟随页面大小变化宽度
emphasis: { });
disabled: true, })
focus: 'none' },
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;',
}, },
//设置折线颜色和粗细 legend: {
lineStyle: { type: 'scroll',
width: 2, orient: 'horizontal',
color: "#FA6C6C", bottom: 0,
data: data,
itemHeight:8,
itemWidth:12,
pageButtonPosition: 'end',
}, },
itemStyle:{ color:['#8A82F3', '#5B9CF7', '#43BBE0','#8ECF95','#FFDC6B','#FFDC6B','#FFC08D','#FE9C77','#E8649B','#A151F5'],
color: "#FA6C6C", 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'
}
}, },
//设置面积区域为渐变效果 xAxis: {
areaStyle: { type: 'category',
opacity:0.8, axisLabel: { //坐标轴刻度标签的相关设置
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [ margin: 15, //刻度标签与轴线之间的距离
{ color:"#666666"
offset: 0.1, },
color: "#FDF8F5", axisTick: false, //坐标轴刻度
axisPointer: {
type: 'shadow'
},
data: data.map(item => item.year),
},
yAxis: [
{
type: 'value',
axisLabel: { //坐标轴刻度标签的相关设置
color:"#666666"
}, },
{ name: '单位:个',
offset: 1, nameLocation: 'start',
color: "#FCD7C8", nameTextStyle: {
padding: [0, 0, 0, -60], // 四个数字分别为上右下左与原位置距离
color: '#666666',
}
},
{
type: 'value',
axisLabel: { //坐标轴刻度标签的相关设置
color:"#666666"
}, },
]), name: '单位:万元',
}, nameLocation: 'start',
}, nameTextStyle: {
{ padding: [0, 0, 0, 72], // 四个数字分别为上右下左与原位置距离
data: this.jzdqData.map(item => item.twoCount), color: '#666666',
name:'二级', },
type: 'line', splitLine: {
smooth: true, show: true,
emphasis: { lineStyle: {
disabled: true, type: 'dashed',
focus: 'none' color: ['#FFFFFF']
}, }
//设置折线颜色和粗细 }
lineStyle: { }
width: 2, ],
color: "#8077F2", grid: {
}, top:30,
itemStyle:{ left:80,
color: "#8077F2", right:90,
bottom:30,
}, },
//设置面积区域为渐变效果 series: [
areaStyle: { {
opacity:0.8, name:'中标金额(万元)',
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [ smooth: false, //平滑
{ type:"line",
offset: 0.1, symbolSize: 6,
color: "#ECE8FF", yAxisIndex: 1,
tooltip: {
valueFormatter: function (value) {
return value + '万元'
}
}, },
{ itemStyle: {
offset: 1, color: '#14C9C9'
color: "#BCC0FF",
}, },
]), data:data.map(item => item.sumMoney),
}, },
}, {
{ name:'中标总数(个)',
data: this.jzdqData.map(item => item.threeCount), type: 'bar',
name:'三级', barWidth: 20,
type: 'line', tooltip: {
smooth: true, valueFormatter: function (value) {
emphasis: { return value + '个';
disabled: true, }
focus: 'none' },
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'
}
}, },
//设置折线颜色和粗细 xAxis: {
lineStyle: { type: 'category',
width: 2, axisLabel: { //坐标轴刻度标签的相关设置
color: "#FA936C", margin: 15, //刻度标签与轴线之间的距离
color:"#666666"
},
axisTick: false, //坐标轴刻度
axisPointer: {
type: 'shadow'
},
data: data.map(item => item.label),
}, },
itemStyle:{ yAxis: [
color: "#FA936C", {
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,
}, },
//设置面积区域为渐变效果 series: [
areaStyle: { {
opacity:0.8, name:'下浮率',
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [ smooth: false, //平滑
{ type:"line",
offset: 0.1, symbolSize: 6,
color: "#FEFBFA", 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 + '个';
}
}, },
{ itemStyle: {
offset: 1, normal:{
color: "#FCD7C8", 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'
}
}
}, },
}, xAxis: {
] type: 'category',
} boundaryGap: false,
myChart.clear(); axisLabel: {
myChart.setOption(option); show: true,
window.addEventListener("resize", function () { interval: 0,
myChart.resize();//图表跟随页面大小变化宽度 },
}); data: data.map(item => item.month),
},
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'
}, },
//设置折线颜色和粗细 yAxis: {
lineStyle: { type: 'value',
width: 1,
color: "#FFAB44",
}, },
itemStyle:{ grid: {
color: "#FFAB44", top:30,
left:50,
right:50,
bottom:30,
}, },
//设置面积区域为渐变效果 color:['#D0FAB7', '#E9C8FF', '#81D5BC'],
areaStyle: { series: [
color: echarts.graphic.LinearGradient(0, 1, 0, 0, [ {
{ name:'勘察项目下浮率',
offset: 0.2, smooth: false, //平滑
color: "#FFEDD0", type:"line",
symbolSize: 6, //折线拐点大小
itemStyle: {
normal: {
borderWidth: 4,
lineStyle: { width: 2 }
}
}, },
{ data:data.map(item => item.kcsjRate),
offset: 1, },
color: "#FFC671", {
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.setOption(option); myChart.resize();//图表跟随页面大小变化宽度
window.addEventListener("resize", function () { });
myChart.resize();//图表跟随页面大小变化宽度 })
}); },
},
handleClick(type,index){ //地区
if(type === 1){ async dataRegion() {
this.typeIndex=index; var str = [];
this.jzglData=this.glData[index].levelList; for (let x = 0; x < 3; x++) {
let total=0 for (let i = 0; i < dataRegion.length; i++) {
for(let i=0; i<this.jzglData.length; i++){ if (dataRegion[i].regionLevel == x + 1 && x + 1 == 1) {
total=total+this.jzglData[i].count str.push({
} 'id': dataRegion[i].id,
this.total=total; "label": dataRegion[i].regionName,
this.glDetail=this.zzTableData[index] "short": dataRegion[i].short,
this.initChart() "value": dataRegion[i].parentId,
} "children": []
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;
} }
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 === '三级'){ }, 0);
item.threeCount=data[i].levelList[j].count;
item.threeRate=data[i].levelList[j].rate; 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) });
} return sums;
this.jzdqData=list; },
this.$nextTick(()=>{
this.initChart1()
})
} }
},
} }
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.zhongbiao{ .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; background: #ffffff;
border-radius: 4px; border-radius: 4px;
margin-top: 12px; margin-top: 12px;
padding: 16px; padding: 16px 52px 16px 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;
} }
.tips{ .content_box{
margin: 0; display: flex;
padding-top: 16px; justify-content: space-between;
font-size: 12px; .box-left{
color: rgba(35,35,35,0.4); width: 60%;
i{
color:#909399;
margin-right: 9px;
font-size: 14px;
} }
} .box-right{
.content1{ width: 33%;
.main1{ float: right;
.left{ ::v-deep .el-table{
width: 20%; .sort-caret.ascending{
float: left; border-bottom-color: rgba(0,129,255,0.5);
.item{ }
height: 74px; .ascending .sort-caret.ascending{
line-height: 74px; border-bottom-color: #0081FF;
color: #333333; }
font-size: 16px; .sort-caret.descending{
padding-left: 30px; border-top-color: rgba(0,129,255,0.5);
border-top: 1px solid #EAF3FF; }
border-left: 1px solid #EAF3FF; .descending .sort-caret.descending{
border-right: 1px solid #EAF3FF; border-top-color: #0081FF;
cursor: pointer; }
}
.item:last-child{ .el-table__header-wrapper{
border-bottom: 1px solid #EAF3FF;
}
.color{
background: #F0F3FA; background: #F0F3FA;
color:#0081FF; th{
i{ background: #F0F3FA;
width: 4px; /*text-align: left;*/
height: 29px;
background: #0081FF;
border-radius: 10px;
display: inline-block;
float: right;
margin-top: 22px;
} }
} }
} .el-table__footer-wrapper{
.right{ background: #F0F3FA;
width: 79%; }
float: right; th {
background: #F0F3FA; font-size: 13px !important;
height: 295px; font-weight: 400 !important;
padding: 16px; }
} .cell {
} padding-right: 12px !important;
.main2{ padding-left: 12px !important;
margin-top: 30px; line-height: 18px;
.head{ }
span{ .el-table__fixed-header-wrapper{
font-size: 12px; th{
color: rgba(35,35,35,0.8); background: #F0F3FA;
}
.number{
color:#FF3C3C;
}
::v-deep .el-select{
width: 100px;
height: 32px;
.el-input{
width: 100%;
height: 32px;
} }
.el-input__inner{ }
height: 32px !important; td.el-table__cell{
line-height: 32px; border-bottom: 0;
}
tr{
&.current-row>td{
background-color: initial;
}
&:nth-child(2n) {
background: #F8FBFF;
} }
} }
} .el-table__cell{
} height: 40px;
.table-item{ padding: 0;
margin-top: 12px; line-height: 40px;
} }
} .el-table__body tr:hover > td.el-table__cell{
.content2{ background: #DCEBFF;
.tabs{ }
margin-top: 32px; ::-webkit-scrollbar-track-piece {
margin-bottom: 24px; //滚动条凹槽的颜色,还可以设置边框属性
.item{ background-color: #F3F4F5;
display: inline-block; height: 16px;
color: #3D3D3D; padding: 0 4px;
font-size: 14px; }
margin-right: 24px; //滚动条的宽度
cursor: pointer; ::-webkit-scrollbar {
} width: 8px;
.color{ height: 8px;
color: #3D3D3D; background-color: #F3F4F5;
font-weight: 700; border-radius: 6px;
position: relative; }
i{ //滚动条的滑块
width: 42px; ::-webkit-scrollbar-thumb {
height: 2px; border-radius: 8px;
background: #0081FF; height: 8px;
display: inline-block; margin: 0 4px;
position: absolute; background: rgba(98,110,126,0.2);
bottom:-4px; border: 4px solid rgba(98,110,126,0.2);;
left: 50%; &:hover{
transform: translate(-50%,0); background: #566380;
}
} }
}
}
.table-item{
margin-top: 32px;
}
}
.content3{
.table-item{
margin-top: 32px;
}
.table-item {
::v-deep .el-table {
.has-gutter{ .has-gutter{
tr{ tr{
th:nth-child(3){ th:nth-last-child(2){
border-right:0;
}
td:nth-last-child(2){
border-right:0; border-right:0;
.cell{
padding-right: 24px !important;
}
} }
} }
} }
} .el-table__cell.gutter{
} background: #F0F3FA;
}
.table-item{
::v-deep .el-table{
.el-table__header-wrapper{
th{
padding: 0;
} }
} .el-table__row{
.el-table__cell.is-right{ td:last-child{
text-align: right;
}
.has-gutter{
tr{
th:nth-child(6),th:nth-child(8){
border-right:0;
.cell{ .cell{
padding-right: 24px !important; padding-right: 12px !important;
} }
} }
} }
} }
.el-table__cell.gutter{ }
/*background: #F0F3FA;*/ }
width: 16px !important;
} ::v-deep .el-input--medium{
.el-table__row{ .el-input__icon{
td:last-child{ line-height: 32px;
.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;
}
} }
} }
} }
......
...@@ -4,14 +4,14 @@ ...@@ -4,14 +4,14 @@
<el-tabs v-model="activeName" @tab-click="handleClick"> <el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="全国经济大全" name="first"></el-tab-pane> <el-tab-pane label="全国经济大全" name="first"></el-tab-pane>
<el-tab-pane label="全国商机项目分析" name="second"></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="third"></el-tab-pane>
<el-tab-pane label="全国中标市场分析" name="fourth"></el-tab-pane> <el-tab-pane label="全国建筑企业分析" name="fourth"></el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>
<Economic v-if="activeName === 'first'"></Economic> <Economic v-if="activeName === 'first'"></Economic>
<Sjxmfx v-if="activeName === 'second'"></Sjxmfx> <Sjxmfx v-if="activeName === 'second'"></Sjxmfx>
<!--<Zhongbiao v-if="activeName === 'third'"></Zhongbiao>--> <Zhongbiao v-if="activeName === 'third'"></Zhongbiao>
<Jzqyfx v-if="activeName === 'fourth'"></Jzqyfx> <Jzqyfx v-if="activeName === 'fourth'"></Jzqyfx>
</div> </div>
</template> </template>
......
...@@ -153,7 +153,7 @@ ...@@ -153,7 +153,7 @@
element-loading-text="Loading" element-loading-text="Loading"
@sort-change="sortChange" @sort-change="sortChange"
border border
height="640" max-height="640"
fit fit
highlight-current-row highlight-current-row
> >
...@@ -162,6 +162,7 @@ ...@@ -162,6 +162,7 @@
</el-table-column> </el-table-column>
<el-table-column prop="companyName" label="公司名称" width="300" fixed> <el-table-column prop="companyName" label="公司名称" width="300" fixed>
<template slot-scope="scope"> <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> <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="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> <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 @@ ...@@ -249,7 +250,7 @@
<el-dialog :visible.sync="claimVisible" width="244" custom-class='dialog-claim' :show-close="false"> <el-dialog :visible.sync="claimVisible" width="244" custom-class='dialog-claim' :show-close="false">
<div>认领成功,是否完善客户信息?</div> <div>认领成功,是否完善客户信息?</div>
<div slot="footer" class="dialog-footer"> <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 :to="`/enterprise/${encodeStr(companyId)}?customerId=${customerId}&path=business`" tag="a" >
立即完善 立即完善
</router-link> </router-link>
...@@ -364,7 +365,10 @@ export default { ...@@ -364,7 +365,10 @@ export default {
created() { created() {
this.dataRegion() this.dataRegion()
this.getType() 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(this.dataQuery.provinceId){
if(Array.isArray(this.dataQuery.province)){ if(Array.isArray(this.dataQuery.province)){
this.province=this.dataQuery.province[0]; this.province=this.dataQuery.province[0];
......
...@@ -130,9 +130,9 @@ ...@@ -130,9 +130,9 @@
state:2, state:2,
} }
getGZDB(params).then(result=>{ getGZDB(params).then(result=>{
this.datalist = result.code == 200?result:[] let datalist = result.code == 200?result:[]
if(this.datalist){ if(datalist){
this.yqnum = `已逾期 ${this.datalist.rows.length} 条`; this.yqnum = `已逾期 ${datalist.rows.length} 条`;
} }
}) })
}, },
......
...@@ -37,7 +37,7 @@ module.exports = { ...@@ -37,7 +37,7 @@ module.exports = {
target: `http://47.104.91.229:9099/prod-api`, target: `http://47.104.91.229:9099/prod-api`,
// target: `http://122.9.160.122:9011`, // target: `http://122.9.160.122:9011`,
// target: `http://192.168.60.126:9011`, // target: `http://192.168.60.126:9011`,
// target: `http://192.168.60.27:8766`, // target: `http://192.168.60.126:9098`,
changeOrigin: true, changeOrigin: true,
pathRewrite: { pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: '' ['^' + process.env.VUE_APP_BASE_API]: ''
......
...@@ -3,10 +3,12 @@ package com.dsk.system.dskService; ...@@ -3,10 +3,12 @@ package com.dsk.system.dskService;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil; 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.R;
import com.dsk.common.core.domain.model.*; import com.dsk.common.core.domain.model.*;
import com.dsk.common.core.page.TableDataInfo; import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.utils.DskOpenApiUtil; import com.dsk.common.utils.DskOpenApiUtil;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils; import org.apache.commons.collections4.MapUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -56,23 +58,40 @@ public class EnterpriseBussinessService { ...@@ -56,23 +58,40 @@ public class EnterpriseBussinessService {
public TableDataInfo clientPage(EnterpriseBussinessClientPageBody body) throws Exception { public TableDataInfo clientPage(EnterpriseBussinessClientPageBody body) throws Exception {
if (body.isVaildCid()) return new TableDataInfo(new ArrayList<>(), 0); 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); 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; 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); Integer code = MapUtils.getInteger(map, "code", 300);
if (200 != code) {
throw new RuntimeException();
}
Map data = MapUtils.getMap(map, "data", null); Map data = MapUtils.getMap(map, "data", null);
if (200 != code) throw new RuntimeException(); List<Object> list = CommonUtils.assertAsArray(MapUtils.getObject(data, "list", ""));
Integer count = MapUtils.getInteger(data, "totalCount", 0); if (CollectionUtils.isEmpty(list)) {
Object list = MapUtils.getObject(data, "list", ""); return new TableDataInfo(list, 0);
TableDataInfo tableDataInfo = new TableDataInfo((List<?>) list, count); }
Map<String, Object> resMap = BeanUtil.beanToMap(tableDataInfo);
resMap.put("totalAmount", MapUtils.getDouble(data, "totalAmount", 0.0)); for (Object supplierProject : list) {
return resMap; 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 { ...@@ -121,25 +140,46 @@ public class EnterpriseBussinessService {
public TableDataInfo supplierPage(EnterpriseBussinessSupplierPageBody body) throws Exception { public TableDataInfo supplierPage(EnterpriseBussinessSupplierPageBody body) throws Exception {
if (body.isVaildCid()) return new TableDataInfo(new ArrayList<>(), 0); if (body.isVaildCid()) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/supplierPage", BeanUtil.beanToMap(body, false, false)); return new TableDataInfo(new ArrayList<>(), 0);
}
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/supplierPage2", BeanUtil.beanToMap(body, false, false));
return dskOpenApiUtil.responsePage(map); return dskOpenApiUtil.responsePage(map);
} }
public Map<String, Object> supplierProjectPage(EnterpriseBussinessSupplierProjectPageBody body) throws Exception { public TableDataInfo supplierProjectPage(EnterpriseBussinessSupplierProjectPageBody body) throws Exception {
if (body.isVaildCid()) return null; if (body.isVaildCid()) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/supplierProjectPage", BeanUtil.beanToMap(body, false, false)); 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)); log.info(JSONUtil.toJsonStr(map));
Integer code = MapUtils.getInteger(map, "code", 300); Integer code = MapUtils.getInteger(map, "code", 300);
if (200 != code) {
throw new RuntimeException();
}
Map data = MapUtils.getMap(map, "data", null); Map data = MapUtils.getMap(map, "data", null);
if (200 != code) throw new RuntimeException(); List<Object> list = CommonUtils.assertAsArray(MapUtils.getObject(data, "list", ""));
Integer count = MapUtils.getInteger(data, "totalCount", 0); if (CollectionUtils.isEmpty(list)) {
Object list = MapUtils.getObject(data, "list", ""); return new TableDataInfo(list, 0);
TableDataInfo tableDataInfo = new TableDataInfo((List<?>) list, count); }
Map<String, Object> resMap = BeanUtil.beanToMap(tableDataInfo);
resMap.put("totalAmount", MapUtils.getDouble(data, "totalAmount", 0.0)); for (Object supplierProject : list) {
return resMap; 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 { ...@@ -175,4 +215,34 @@ public class EnterpriseBussinessService {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/historySendProvince", BeanUtil.beanToMap(body, false, false)); Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/historySendProvince", BeanUtil.beanToMap(body, false, false));
return BeanUtil.toBean(map, R.class); 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; 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.dto.BusinessSearchDto;
import com.dsk.system.domain.business.vo.BusinessAnalyzeVo; import com.dsk.system.domain.business.vo.BusinessAnalyzeVo;
...@@ -18,4 +20,8 @@ public interface IBusinessOverviewService { ...@@ -18,4 +20,8 @@ public interface IBusinessOverviewService {
List<BusinessAnalyzeVo> typeAnalyze(BusinessSearchDto dto); List<BusinessAnalyzeVo> typeAnalyze(BusinessSearchDto dto);
AjaxResult countGroupByProvince(JSONObject object);
AjaxResult rangByMoney(JSONObject object);
} }
...@@ -152,6 +152,7 @@ public class BusinessInfoServiceImpl implements IBusinessInfoService { ...@@ -152,6 +152,7 @@ public class BusinessInfoServiceImpl implements IBusinessInfoService {
vo.setInvestmentAmount(MapUtil.getDouble(map, "projectContractAmount")); vo.setInvestmentAmount(MapUtil.getDouble(map, "projectContractAmount"));
} }
vo.setProjectType(MapUtil.getStr(map, "projectType")); vo.setProjectType(MapUtil.getStr(map, "projectType"));
vo.setProjectStage(MapUtil.getStr(map, "tenderStage"));
vo.setProjectCategory(MapUtil.getStr(map, "projectPurposes")); vo.setProjectCategory(MapUtil.getStr(map, "projectPurposes"));
vos.add(vo); vos.add(vo);
} }
......
package com.dsk.system.service.impl; 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.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.dto.BusinessSearchDto;
import com.dsk.system.domain.business.vo.BusinessAnalyzeVo; import com.dsk.system.domain.business.vo.BusinessAnalyzeVo;
import com.dsk.system.mapper.BusinessInfoMapper; import com.dsk.system.mapper.BusinessInfoMapper;
import com.dsk.system.service.IBusinessOverviewService; import com.dsk.system.service.IBusinessOverviewService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
...@@ -22,6 +27,9 @@ public class BusinessOverviewServiceImpl implements IBusinessOverviewService { ...@@ -22,6 +27,9 @@ public class BusinessOverviewServiceImpl implements IBusinessOverviewService {
@Resource @Resource
private BusinessInfoMapper businessInfoMapper; private BusinessInfoMapper businessInfoMapper;
@Autowired
private DskOpenApiUtil dskOpenApiUtil;
@Override @Override
@DataScope(userAlias = "u",deptAlias = "d") @DataScope(userAlias = "u",deptAlias = "d")
public Map<String, Object> statusStatistics(BusinessSearchDto dto) { public Map<String, Object> statusStatistics(BusinessSearchDto dto) {
...@@ -51,4 +59,16 @@ public class BusinessOverviewServiceImpl implements IBusinessOverviewService { ...@@ -51,4 +59,16 @@ public class BusinessOverviewServiceImpl implements IBusinessOverviewService {
public List<BusinessAnalyzeVo> typeAnalyze(BusinessSearchDto dto) { public List<BusinessAnalyzeVo> typeAnalyze(BusinessSearchDto dto) {
return businessInfoMapper.selectTypeAnalyze(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