Commit e6c7ae26 authored by Administrator's avatar Administrator

Merge remote-tracking branch 'origin/dev20230707' into dev20230707

parents dcd5f9d0 14b738fe
package com.dsk.web.controller.business;
import com.dsk.common.core.controller.BaseController;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.core.domain.entity.BusinessContacts;
import com.dsk.common.core.page.TableDataInfo;
import com.dsk.system.service.IBusinessContactsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 项目联系人Controller
*
* @author lxl
* @date 2023-05-17
*/
@RestController
@RequestMapping("/business/contacts")
public class BusinessContactsController extends BaseController
{
@Autowired
private IBusinessContactsService businessContactsService;
/**
* 分页查询项目联系人列表
*/
// @PreAuthorize("@ss.hasPermi('system:contacts:list')")
@GetMapping("/list")
public TableDataInfo list(BusinessContacts businessContacts)
{
startPage();
List<BusinessContacts> list = businessContactsService.selectBusinessContactsList(businessContacts);
return getDataTable(list);
}
/**
* 新增项目联系人
*/
// @PreAuthorize("@ss.hasPermi('system:contacts:add')")
// @Log(title = "项目联系人", businessType = BusinessType.INSERT)
@PostMapping("/add")
public AjaxResult add(@RequestBody BusinessContacts businessContacts)
{
return toAjax(businessContactsService.insertBusinessContacts(businessContacts));
}
/**
* 修改项目联系人
*/
// @PreAuthorize("@ss.hasPermi('system:contacts:edit')")
// @Log(title = "项目联系人", businessType = BusinessType.UPDATE)
@PostMapping("/edit")
public AjaxResult edit(@RequestBody BusinessContacts businessContacts)
{
return toAjax(businessContactsService.updateBusinessContacts(businessContacts));
}
// /**
// * 导出项目联系人列表
// */
// @PreAuthorize("@ss.hasPermi('system:contacts:export')")
// @Log(title = "项目联系人", businessType = BusinessType.EXPORT)
// @PostMapping("/export")
// public void export(HttpServletResponse response, BusinessContacts businessContacts)
// {
// List<BusinessContacts> list = businessContactsService.selectBusinessContactsList(businessContacts);
// ExcelUtil<BusinessContacts> util = new ExcelUtil<BusinessContacts>(BusinessContacts.class);
// util.exportExcel(response, list, "项目联系人数据");
// }
// /**
// * 获取项目联系人详细信息
// */
// @PreAuthorize("@ss.hasPermi('system:contacts:query')")
// @GetMapping(value = "/{id}")
// public AjaxResult getInfo(@PathVariable("id") Long id)
// {
// return success(businessContactsService.selectBusinessContactsById(id));
// }
// /**
// * 删除项目联系人
// */
// @PreAuthorize("@ss.hasPermi('system:contacts:remove')")
// @Log(title = "项目联系人", businessType = BusinessType.DELETE)
// @DeleteMapping("/{ids}")
// public AjaxResult remove(@PathVariable Long[] ids)
// {
// return toAjax(businessContactsService.deleteBusinessContactsByIds(ids));
// }
}
package com.dsk.web.controller.business;
import com.dsk.common.core.controller.BaseController;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.utils.SecurityUtils;
import com.dsk.system.domain.business.dto.BusinessSearchDto;
import com.dsk.system.service.IBusinessOverviewService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 项目概览
* @author lcl
* @create 2023/8/14
*/
@Api("项目概览")
@RestController
@RequestMapping("/business/overview")
public class BusinessOverviewController extends BaseController {
@Autowired
private IBusinessOverviewService baseService;
/**
* 项目统计
*/
@GetMapping("/statistics")
public AjaxResult statistics(){
return AjaxResult.success(baseService.statistics(new BusinessSearchDto(SecurityUtils.getUserId())));
}
}
package com.dsk.web.controller.customer;
import com.dsk.common.annotation.RepeatSubmit;
import com.dsk.common.core.controller.BaseController;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.core.page.TableDataInfo;
import com.dsk.system.domain.customer.CustomerDecisionChain;
import com.dsk.system.domain.customer.dto.CustomerDecisionChainSearchDto;
import com.dsk.system.service.ICustomerDecisionChainService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
/**
* 客户决策链条
* @author lcl
* @create 2023/5/16
*/
@RestController
@RequestMapping("/customer/decision/chain")
public class CustomerDecisionChainController extends BaseController {
@Autowired
private ICustomerDecisionChainService baseService;
/**
* 获取客户决策链条列表
*/
// @PreAuthorize("@ss.hasPermi('customer:decision:chain:list')")
@GetMapping("/list")
public TableDataInfo selectPageList(CustomerDecisionChainSearchDto dto){
startPage();
return getDataTable(baseService.selectList(dto));
}
/**
* 添加客户决策链条
*/
// @PreAuthorize("@ss.hasPermi('customer:decision:chain:add')")
@PostMapping()
@RepeatSubmit()
public AjaxResult add(@RequestBody CustomerDecisionChain customerDecisionChain){
return AjaxResult.success(baseService.insert(customerDecisionChain));
}
/**
* 编辑客户决策链条
*/
// @PreAuthorize("@ss.hasPermi('customer:decision:chain:edit')")
@PutMapping()
@RepeatSubmit()
public AjaxResult edit(@RequestBody CustomerDecisionChain customerDecisionChain){
return AjaxResult.success(baseService.update(customerDecisionChain));
}
/**
* 删除客户决策链条
*/
// @PreAuthorize("@ss.hasPermi('customer:decision:chain:del')")
@DeleteMapping("/{id}")
@RepeatSubmit()
public AjaxResult del(@PathVariable("id") Long id){
return AjaxResult.success(baseService.deleteById(id));
}
}
package com.dsk.web.controller.dsk; package com.dsk.web.controller.dsk;
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.R; import com.dsk.common.core.domain.R;
import com.dsk.common.core.page.TableDataInfo; import com.dsk.common.core.page.TableDataInfo;
import com.dsk.system.domain.dsk.dto.JskCombineCertificateDto; import com.dsk.system.domain.dsk.dto.JskCombineCertificateDto;
...@@ -9,7 +8,8 @@ import com.dsk.system.domain.dsk.dto.JskCombineSearchDto; ...@@ -9,7 +8,8 @@ import com.dsk.system.domain.dsk.dto.JskCombineSearchDto;
import com.dsk.system.dskService.JskCombineInfoService; import com.dsk.system.dskService.JskCombineInfoService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
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.PostMapping;
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;
...@@ -29,39 +29,47 @@ public class JskCombineInfoController extends BaseController { ...@@ -29,39 +29,47 @@ public class JskCombineInfoController extends BaseController {
/** /**
* 集团成员列表 * 集团成员列表
*/ */
@GetMapping("/memberList") @PostMapping("/memberList")
public TableDataInfo memberList(JskCombineSearchDto dto) throws Exception { public TableDataInfo memberList(@RequestBody JskCombineSearchDto dto) throws Exception {
return baseService.memberList(dto); return baseService.memberList(dto);
} }
/** /**
* 分组成员数量 * 分组成员数量
*/ */
@GetMapping("/group/memberCount") @PostMapping("/group/memberCount")
public R groupMemberCount(JskCombineSearchDto dto) { public R groupMemberCount(@RequestBody JskCombineSearchDto dto) {
return baseService.groupMemberCount(dto); return baseService.groupMemberCount(dto);
} }
/** /**
* 集团业绩列表 * 集团业绩列表
*/ */
@GetMapping("/businessList") @PostMapping("/businessList")
public TableDataInfo businessList(JskCombineSearchDto dto) throws Exception { public TableDataInfo businessList(@RequestBody JskCombineSearchDto dto) throws Exception {
return baseService.businessList(dto); return baseService.businessList(dto);
} }
/** /**
* 集团资质列表 * 集团资质列表
*/ */
@GetMapping("/certificateList") @PostMapping("/certificateList")
public TableDataInfo certificateList(JskCombineSearchDto dto) throws Exception { public TableDataInfo certificateList(@RequestBody JskCombineSearchDto dto) throws Exception {
return baseService.certificateList(dto); return baseService.certificateList(dto);
} }
/** /**
* 集团成员资质列表 * 集团成员资质列表
*/ */
@GetMapping("/menber/certificateList") @PostMapping("/member/certificateList")
public TableDataInfo menberCertificateList(JskCombineCertificateDto dto) throws Exception { public TableDataInfo menberCertificateList(@RequestBody JskCombineCertificateDto dto) throws Exception {
return baseService.menberCertificateList(dto); return baseService.menberCertificateList(dto);
} }
/**
* 集团资质分组统计
*/
@PostMapping("/group/certificateCount")
public R groupCertificateCount(@RequestBody JskCombineSearchDto dto) throws Exception {
return baseService.groupCertificateCount(dto);
}
} }
...@@ -202,3 +202,7 @@ dsk: ...@@ -202,3 +202,7 @@ dsk:
# accessKeyId: aec7b3ff2y2q8x6t49a7e2c463ce21912 # accessKeyId: aec7b3ff2y2q8x6t49a7e2c463ce21912
# accessKeySecret: ee8a53c7ea04eb3ac311406c8f56f95b # accessKeySecret: ee8a53c7ea04eb3ac311406c8f56f95b
# protocol: https # protocol: https
# endPoint: localhost:8767
# accessKeyId: aec7b3ff2y2q8x6t49a7e2c463ce21912
# accessKeySecret: ee8a53c7ea04eb3ac311406c8f56f95b
# protocol: http
package com.dsk.common.core.domain.entity;
import com.dsk.common.annotation.Excel;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import java.util.Date;
/**
* 项目联系人对象 business_contacts
*
* @author lxl
* @date 2023-05-17
*/
public class BusinessContacts
{
private static final long serialVersionUID = 1L;
/** $column.columnComment */
private Integer id;
/** 项目id */
@Excel(name = "项目id")
private Integer businessId;
/** 姓名 */
@Excel(name = "姓名")
private String name;
/** 角色 */
@Excel(name = "角色")
private String role;
/** 公司/机关 */
@Excel(name = "公司/机关")
private String office;
/** 职位 */
@Excel(name = "职位")
private String position;
/** 联系电话 */
@Excel(name = "联系电话")
private String phone;
/** 维护人员 */
@Excel(name = "维护人员")
private String accendant;
/** 性别(1.男 2.女 0.未知) */
@Excel(name = "性别")
private Integer sex;
/** 创建时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/** 修改时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "修改时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
public void setId(Integer id)
{
this.id = id;
}
public Integer getId()
{
return id;
}
public void setBusinessId(Integer businessId)
{
this.businessId = businessId;
}
public Integer getBusinessId()
{
return businessId;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public void setRole(String role)
{
this.role = role;
}
public String getRole()
{
return role;
}
public void setOffice(String office)
{
this.office = office;
}
public String getOffice()
{
return office;
}
public void setPosition(String position)
{
this.position = position;
}
public String getPosition()
{
return position;
}
public void setPhone(String phone)
{
this.phone = phone;
}
public String getPhone()
{
return phone;
}
public void setAccendant(String accendant)
{
this.accendant = accendant;
}
public String getAccendant()
{
return accendant;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("businessId", getBusinessId())
.append("name", getName())
.append("role", getRole())
.append("office", getOffice())
.append("position", getPosition())
.append("phone", getPhone())
.append("accendant", getAccendant())
.append("createTime", getCreateTime())
.append("updateTime", getUpdateTime())
.append("sex", getSex())
.toString();
}
}
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.
...@@ -36,9 +36,11 @@ ...@@ -36,9 +36,11 @@
> >
<div class="side-container"> <div class="side-container">
<div class="side-title"> <div class="side-title">
<app-link v-if="onlyOneChild.meta || item.meta" :to="resolvePath(onlyOneChild.path || item.path)"> <!--<app-link v-if="onlyOneChild.meta || item.meta" :to="resolvePath(onlyOneChild.path || item.path)">-->
<app-link :to="resolvePath(onlyOneChild.path || item.path)">
{{ onlyOneChild.meta.title || item.meta.title }} {{ onlyOneChild.meta.title || item.meta.title }}
</app-link> </app-link>
</div> </div>
</div> </div>
<item v-if="onlyOneChild.meta" slot="reference" :icon="sideIcon(item, onlyOneChild)" /> <item v-if="onlyOneChild.meta" slot="reference" :icon="sideIcon(item, onlyOneChild)" />
......
...@@ -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">
<el-option v-for="(item, index) in yearOptions" :key="index" :label="item" :value="item" />
</el-select>
</div> </div>
</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 class="content_box" v-if="gyflState">
<div class="main1"> <div class="box-left">
<div style="height: 300px;"> <div id="echarts1" style="height: 280px"></div>
<div class="left"> </div>
<div class="item" v-for="(item,index) in glData" :class="typeIndex === index ? 'color':''" @click="handleClick(1,index)">{{item.major}}施工总承包<i></i></div> <div class="box-right">
<el-table
:data="xmtjList"
element-loading-text="Loading"
border
show-summary
max-height="300"
:summary-method="getSummaries"
fit
highlight-current-row
:default-sort = "{prop: 'count', order: 'descending'}"
>
<el-table-column label="序号" width="60">
<template slot-scope="scope">{{ scope.$index + 1 }}</template>
</el-table-column>
<el-table-column prop="type" label="项目类型" :formatter="formatStatus" width="100"/>
<el-table-column prop="count" label="中标数量 (个)" align="right" :formatter="formatStatus" sortable width="130"/>
<el-table-column prop="countRate" label="数量占比(%)" align="right" :formatter="formatStatus" sortable width="140"/>
<el-table-column prop="money" label="中标总金额 (万元)" align="right" :formatter="formatStatus" width="150"/>
<el-table-column prop="moneyRate" label="金额占比(%)" align="right" :formatter="formatStatus" width="120"/>
</el-table>
</div> </div>
<div class="right">
<div id="gl-echarts" style="height: 260px;background: #ffffff;"></div>
</div> </div>
<div class="empty" v-if="!gyflState">
<img class="img" src="@/assets/images/project/empty.png">
<div class="p1">抱歉,暂无数据展示</div>
</div> </div>
<p class="tips"><i class="el-icon-info"></i>数据来源大司空建筑大数据平台,统计范围为有效期内资质,未公开不包含在内</p>
</div> </div>
<div class="main2"> <div v-if="!isSkeleton" class="td_content">
<!--<div class="flex-box query-box head">--> <div class="flex-box query-box">
<!--<span>近五年全国招标总数<span class="number">10,610,000 </span></span>--> <div class="flex-box query-params">
<!--<el-select v-model="year" filterable multiple collapse-tags class="form-content-width" placeholder="请选择">--> <span class="common-title">全国各地区中标统计TOP10</span>
<!--<el-option v-for="(item, index) in yearOptions" :key="index" :label="item.name" :value="item.value" />--> <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-select>--> <el-option v-for="(item, index) in yearOptions" :key="index" :label="item" :value="item" />
<!--</div>--> </el-select>
<div class="table-item"> </div>
</div>
<div class="content_box" v-if="tdytState">
<div class="box-left">
<div id="echarts2" style="height: 280px"></div>
</div>
<div class="box-right">
<el-table <el-table
:data="zzTableData" :data="topList"
element-loading-text="Loading"
border border
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="major" label="资质类型"/> <el-table-column prop="province" label="地区" :formatter="formatStatus" width="100"/>
<el-table-column prop="count" label="中标数量 (个)" align="right" :formatter="formatStatus" sortable width="130"/>
<el-table-column label="特级" align="right"> <el-table-column prop="countRate" label="数量占比(%)" align="right" :formatter="formatStatus" width="120"/>
<el-table-column prop="tjCount" label="数量(个)" align="right"/> <el-table-column prop="sumMoney" label="中标总金额 (万元)" align="right" :formatter="formatStatus" width="140"/>
<el-table-column prop="tjRate" label="占比(%)" align="right"/> <el-table-column prop="moneyRate" label="金额占比(%)" align="right" :formatter="formatStatus" width="120"/>
</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> </el-table>
</div> </div>
</div> </div>
<div class="empty" v-if="!tdytState">
<img class="img" src="@/assets/images/project/empty.png">
<div class="p1">抱歉,暂无数据展示</div>
</div>
</div> </div>
<div class="zb-content content2"> <div v-if="!isSkeleton" class="td_content">
<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>
</div> <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="main1">
<div class="tabs">
<div class="item" v-for="(item,index) in dqData" :class="qydqIndex === index ? 'color':''" @click="handleClick(2,index)">{{item.major}}<i></i></div>
</div> </div>
<div id="jzqy-echarts" style="height: 250px"></div> <div class="content_box" v-if="tdytState">
<p class="tips"><i class="el-icon-info"></i>数据来源大司空建筑大数据平台,统计范围为有效期内资质,未公开不包含在内</p> <div class="box-left">
<div id="echarts3" style="height: 280px"></div>
</div> </div>
<div class="table-item"> <div class="box-right">
<el-table <el-table
:data="jzdqData" :data="zbjeList"
element-loading-text="Loading"
border border
height="470" show-summary
max-height="285"
: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="rangeName" label="中标金额" :formatter="formatStatus"/>
<el-table-column label="特级" align="right"> <el-table-column prop="count" label="中标数量 (个)" align="right" :formatter="formatStatus" sortable/>
<el-table-column prop="tjCount" label="数量(个)" align="right"/> <el-table-column prop="rate" label="占比(%)" align="right" :formatter="formatStatus" width="100"/>
<el-table-column prop="tjRate" label="占比(%)" align="right"/> </el-table>
</el-table-column> </div>
<el-table-column label="一级" align="right"> </div>
<el-table-column prop="oneCount" label="数量(个)" align="right"/> <div class="empty" v-if="!tdytState">
<el-table-column prop="oneRate" label="占比(%)" align="right"/> <img class="img" src="@/assets/images/project/empty.png">
</el-table-column> <div class="p1">抱歉,暂无数据展示</div>
<el-table-column label="二级" align="right"> </div>
<el-table-column prop="twoCount" label="数量(个)" align="right"/> </div>
<el-table-column prop="twoRate" label="占比(%)" align="right"/> <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">
<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-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 @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> </div>
<div class="text"> <div class="content_box" v-if="topList.length > 0 && !isSkeleton">
通过对全国建筑工程总承包一级及以上资质企业的备案数据分析,我们发现这些优质企业主要去了<span v-for="(item,index) in rankList">{{item.province}}{{ rankList.length === index+1 ? '':'、'}}</span>等地开展经营。</div> <div class="box-left" style="width: 60%;">
<div class="main1"> <div id="echarts6" style="height: 300px"></div>
<div id="ba-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="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'
},
]
},
{
label: '一级',
prop: 'levelValue',
child:[
{
label: '数量(个)',
prop: 'count'
},
{
label: '占比(%)',
prop: 'rate'
},
]
},
{
label: '二级',
prop: 'levelValue',
child:[
{
label: '数量(个)',
prop: 'count'
}, },
{ created() {
label: '占比(%)', this.dataRegion()
prop: 'rate' this.yearsData()
this.getCountBidByType()
}, },
] mounted() {
}, },
{ beforeDestroy(){
label: '三级',
prop: 'levelValue',
child:[
{
label: '数量(个)',
prop: 'count'
}, },
{ methods: {
label: '占比(%)', getCountBidByType(){
prop: 'rate' let params={
yearStr:this.years.join(",")
}
countBidByType(params).then(res => {
this.isSkeleton=false;
this.xmtjList=res.data.date;
if(res.data){
this.$nextTick(() => {
this.initChart1(res.data.date)
})
}
this.getCountBidGroupByProvince()
this.getRangeBidMoney()
this.getRangeBidFiveYears()
this.getLowerRateByYear()
this.getLowerRangeTenderType()
})
}, },
] getCountBidGroupByProvince(){
let params={
yearStr:this.years1.join(",")
}
countBidGroupByProvince(params).then(res => {
this.topList=res.data;
if(res.data){
this.$nextTick(() => {
this.initChart2(res.data)
})
}
})
}, },
], getRangeBidMoney(){
dqData:[], let params={
qydqIndex:0, yearStr:this.years2.join(",")
zbData:[], }
rankList:[], rangeBidMoney(params).then(res => {
jzdqData:[], this.zbjeList=res.data;
currentdate:'', var list=[];
total:'', for(var i=0;i<res.data.length;i++){
glDetail:{}, var obj={};
isSkeleton:true, obj.name=res.data[i].rangeName;
obj.value=res.data[i].count;
obj.rate=res.data[i].rate;
list.push(obj)
}
if(res.data){
this.$nextTick(() => {
this.initChart3(list)
})
} }
})
}, },
created() { getRangeBidFiveYears(){
setTimeout(() => { rangeBidFiveYears().then(res => {
this.isSkeleton=false; this.zbqsList=res.data;
this.getData() if(res.data){
}, 1000); this.$nextTick(() => {
var date = new Date() this.initChart4(res.data)
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: { getLowerRateByYear(){
getData(){ let params={
//全国建筑企业概览 yearStr:this.years3
certGroupByMajorAndLevel().then(res => { }
let list=[]; lowerRateByYear(params).then(res => {
for (let i=0; i<res.data.length; i++){ for (var i=0; i<res.data.length; i++){
res.data[i].levelList=res.data[i].levelList.reverse(); res.data[i].rate=res.data[i].rate.toFixed(2)
let item={}; }
item.major=res.data[i].major+'施工总承包'; this.xflList=res.data;
for (let j=0; j<res.data[i].levelList.length; j++){ if(res.data){
if(res.data[i].levelList[j].levelValue === '特级'){ this.$nextTick(() => {
item.tjCount=res.data[i].levelList[j].count; this.initChart5(res.data)
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();
list.push(item)
}
this.zzTableData=list;
this.glData=res.data;
this.jzglData=this.glData[0].levelList;
this.glDetail=list[0]
let total=0;
for(let i=0; i<this.jzglData.length; i++){
total=total+this.jzglData[i].count
}
this.total=total;
this.initChart()
}) })
certGroupByMajorProvinceLevel().then(res => { }
this.dqData=res.data;
let data=this.dqData[0].province;
let list=[];
for(let i=0; i<data.length; i++){
let item={};
item.province=data[i].province;
for (let j=0; j<data[i].levelList.length; j++){
if(data[i].levelList[j].levelValue === '特级'){
item.tjCount=data[i].levelList[j].count;
item.tjRate=data[i].levelList[j].rate;
}
if(data[i].levelList[j].levelValue === '一级'){
item.oneCount=data[i].levelList[j].count;
item.oneRate=data[i].levelList[j].rate;
}
if(data[i].levelList[j].levelValue === '二级'){
item.twoCount=data[i].levelList[j].count;
item.twoRate=data[i].levelList[j].rate;
}
if(data[i].levelList[j].levelValue === '三级'){
item.threeCount=data[i].levelList[j].count;
item.threeRate=data[i].levelList[j].rate;
}
}
list.push(item)
}
this.jzdqData=list
this.initChart1()
}) })
areaGroupByProvince().then(res => { },
this.zbData=res.data; getLowerRangeTenderType(){
//定义一个变量 保存数据 因为sort方法排序会改变原数组 使用JSON方法深拷贝 将原数值暂存 let params={
// let dataArr = JSON.parse(JSON.stringify(res.data)) yearStr:this.years4,
let arr=res.data.sort((old,New)=>{ }
return New.count - old.count if(this.address){
params.provinceId=this.address
}
lowerRangeTenderType(params).then(res => {
for (var i=0; i<res.data.length; i++){
for (let j=0; j<res.data[i].typeList.length; j++){
if(res.data[i].typeList[j].tenderType === '施工'){
res.data[i].sgRate=res.data[i].typeList[j].rate.toFixed(2)
}
if(res.data[i].typeList[j].tenderType === '勘察设计'){
res.data[i].kcsjRate=res.data[i].typeList[j].rate.toFixed(2)
}
if(res.data[i].typeList[j].tenderType === '监理'){
res.data[i].jlRate=res.data[i].typeList[j].rate.toFixed(2)
}
}
}
this.xmxflList=res.data;
if(this.xmxflList){
this.$nextTick(() => {
this.initChart6(this.xmxflList)
}) })
let data=[] }
for(let i=0; i<5; i++){
data.push(arr[i])
}
this.rankList=data;
//将原数组数据赋值回去 保持数据不变
// this.zbData = JSON.parse(JSON.stringify(dataArr))
this.initChart2()
}) })
}, },
initChart() {
let myChart = echarts.init(document.getElementById("gl-echarts"))
initChart1(data) {
this.$nextTick(() => {
let myChart = echarts.init(document.getElementById("echarts1"))
let list1=[],list2=[]
for(var i=0; i<data.length; i++) {
list1.push(data[i].count)
list2.push(data[i].money)
}
let option ={ let option ={
tooltip: { tooltip: {
// show:false trigger: 'axis',
axisPointer: {
type: 'line',
label: {
backgroundColor: '#FFFFFF'
}
}
}, },
xAxis: { xAxis: {
type: 'category', type: 'category',
boundaryGap: false, boundaryGap: false,
data: this.jzglData.map(item => item.levelValue), axisLabel: {
show: true,
interval: 0
},
data: data.map(item => item.type),
}, },
yAxis: { yAxis: {
type: 'value', type: 'value',
}, },
grid: { grid: {
top:40, top:30,
left:70, left:100,
right:40, right:30,
bottom:40, bottom:30,
}, },
color:['#ADC0FF', '#E9C8FF'],
series: [ series: [
{ {
data: this.jzglData.map(item => item.count), name:'中标数量(个)',
type: 'line', smooth: false, //平滑
smooth: true, type:"line",
emphasis: { symbolSize: 6, //折线拐点大小
disabled: true, itemStyle: {
focus: 'none' normal: {
}, borderWidth: 4,
//设置折线颜色和粗细 lineStyle: { width: 2 }
lineStyle: { }
width: 1,
color: "#0081FF",
}, },
itemStyle:{ data:list1,
color: "#4E8EFF",
}, },
//设置面积区域为渐变效果
areaStyle: {
color: echarts.graphic.LinearGradient(0, 1, 0, 0, [
{ {
offset: 0.2, name:'中标总金额(万元)',
color: "#DFEAFF", smooth: false, //平滑
}, type:"line",
{ symbolSize: 6, //折线拐点大小
offset: 1, itemStyle: {
color: "#5895FF", normal: {
}, borderWidth: 4,
]), lineStyle: { width: 2 }
}
}, },
data:list2,
} }
] ]
} }
myChart.clear(); //图表清除
myChart.setOption(option); myChart.setOption(option);
window.addEventListener("resize", function () { window.addEventListener("resize", function () {
myChart.resize();//图表跟随页面大小变化宽度 myChart.resize();//图表跟随页面大小变化宽度
}); });
})
}, },
initChart1() { initChart2(data) {
let myChart = echarts.init(document.getElementById("jzqy-echarts")) this.$nextTick(() => {
let option ={ // console.log(typeList)
legend: { let myChart = echarts.init(document.getElementById("echarts2"))
x:'right', let seriesData=[]
padding:[0,30,0,0], let color=['#FCD68A', '#67B3FD', '#FFB8AD', '#FFD7AD', '#A9F1E5', '#D0FAB7', '#ADC0FF', '#BEECFF', '#81D5BC', '#FFE48A'];
let typeNameList=data[0].projectType.map(item => item.type);
let item={}
for(var i=0; i<data.length; i++){
for(var j=0; j<data[i].projectType.length; j++){
item[typeNameList[j]] = [];
}
}
for(var i=0; i<data.length; i++) {
for (var j = 0; j < data[i].projectType.length; j++) {
if(data[i].projectType[j].type === typeNameList[0]){
item[typeNameList[0]].push(data[i].projectType[j].count)
}
if(data[i].projectType[j].type === typeNameList[1]){
item[typeNameList[1]].push(data[i].projectType[j].count)
}
if(data[i].projectType[j].type === typeNameList[2]){
item[typeNameList[2]].push(data[i].projectType[j].count)
}
if(data[i].projectType[j].type === typeNameList[3]){
item[typeNameList[3]].push(data[i].projectType[j].count)
}
if(data[i].projectType[j].type === typeNameList[4]){
item[typeNameList[4]].push(data[i].projectType[j].count)
}
if(data[i].projectType[j].type === typeNameList[5]){
item[typeNameList[5]].push(data[i].projectType[j].count)
}
if(data[i].projectType[j].type === typeNameList[6]){
item[typeNameList[6]].push(data[i].projectType[j].count)
}
if(data[i].projectType[j].type === typeNameList[7]){
item[typeNameList[7]].push(data[i].projectType[j].count)
}
if(data[i].projectType[j].type === typeNameList[8]){
item[typeNameList[8]].push(data[i].projectType[j].count)
}
if(data[i].projectType[j].type === typeNameList[9]){
item[typeNameList[9]].push(data[i].projectType[j].count)
}
}
}
for(var i=0; i<typeNameList.length; i++) {
seriesData.push({
name:typeNameList[i],
smooth: false, //平滑
type:"line",
symbolSize: 6, //折线拐点大小
itemStyle: {
normal: {
color: color[i], //图例颜色
borderWidth: 4,
borderColor: color[i],
lineStyle: { color: color[i], width: 2 }
}
}, },
data:item[typeNameList[i]],
});
}
let option ={
// legend: {
// left: "center",
// bottom: 0,
// itemHeight:8,
// itemWidth:16,
// },
tooltip: { tooltip: {
trigger: 'axis', trigger: 'axis',
axisPointer: { axisPointer: {
...@@ -402,457 +551,659 @@ export default { ...@@ -402,457 +551,659 @@ export default {
xAxis: { xAxis: {
type: 'category', type: 'category',
boundaryGap: false, boundaryGap: false,
data: this.jzdqData.map(item => item.province), axisLabel: {
show: true,
interval: 0
},
data: data.map(item => item.province),
}, },
yAxis: { yAxis: {
type: 'value', type: 'value',
}, },
grid: { grid: {
top:35, top:30,
left:60, left:50,
right:30, right:20,
bottom:20, bottom:30,
},
color:['#FCD68A', '#FFE48A', '#FFB8AD', '#FFD7AD', '#A9F1E5', '#D0FAB7', '#ADC0FF', '#BEECFF', '#81D5BC', '#67B3FD'],
series: seriesData
}
myChart.setOption(option);
window.addEventListener("resize", function () {
myChart.resize();//图表跟随页面大小变化宽度
});
})
},
initChart3(data) {
this.$nextTick(() => {
let myChart = echarts.init(document.getElementById("echarts3"))
let option ={
tooltip: {
trigger: 'item',
borderWidth:0,
backgroundColor:"rgba(255, 255, 255, 0.8)",
formatter: function (params) {
var result = ''
result+='<h3 style="color: #232226;padding: 0 0 5px 0;margin: 0;">'+ params.data.name +'</h3>'
result+='<p style="color: rgba(35,35,35,0.8);padding: 0;margin: 0;">'+ params.data.value +'个 </p>'
return result;
},
extraCssText:'width:150px!important;',
}, },
legend: {
type: 'scroll',
orient: 'horizontal',
bottom: 0,
data: data,
itemHeight:8,
itemWidth:12,
pageButtonPosition: 'end',
},
color:['#8A82F3', '#5B9CF7', '#43BBE0','#8ECF95','#FFDC6B','#FFDC6B','#FFC08D','#FE9C77','#E8649B','#A151F5'],
series: [ series: [
{ {
data: this.jzdqData.map(item => item.tjCount), type: 'pie',
name:'特级', radius: '55%',
type: 'line', center: ['50%', '50%'],
smooth: true, data: data,
emphasis: { emphasis: {
disabled: true, itemStyle: {
focus: 'none' shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
}
myChart.setOption(option);
window.addEventListener("resize", function () {
myChart.resize();//图表跟随页面大小变化宽度
});
})
}, },
//设置折线颜色和粗细 initChart4(data) {
lineStyle: { this.$nextTick(() => {
width: 2, let myChart = echarts.init(document.getElementById("echarts4"))
color: "#0081FF", let option ={
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross'
}
},
xAxis: {
type: 'category',
axisLabel: { //坐标轴刻度标签的相关设置
margin: 15, //刻度标签与轴线之间的距离
color:"#666666"
},
axisTick: false, //坐标轴刻度
axisPointer: {
type: 'shadow'
}, },
itemStyle:{ data: data.map(item => item.year),
color: "#4E8EFF",
}, },
//设置面积区域为渐变效果 yAxis: [
areaStyle: {
opacity:0.8,
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
{ {
offset: 0.2, type: 'value',
color: "#DFEAFF", axisLabel: { //坐标轴刻度标签的相关设置
color:"#666666"
},
name: '单位:个',
nameLocation: 'start',
nameTextStyle: {
padding: [0, 0, 0, -60], // 四个数字分别为上右下左与原位置距离
color: '#666666',
}
}, },
{ {
offset: 1, type: 'value',
color: "#5895FF", 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: [
{ {
data: this.jzdqData.map(item => item.oneCount), name:'中标金额(万元)',
name:'一级', smooth: false, //平滑
type: 'line', type:"line",
smooth: true, symbolSize: 6,
emphasis: { yAxisIndex: 1,
disabled: true, tooltip: {
focus: 'none' valueFormatter: function (value) {
return value + '万元'
}
}, },
//设置折线颜色和粗细 itemStyle: {
lineStyle: { color: '#14C9C9'
width: 2,
color: "#FA6C6C",
}, },
itemStyle:{ data:data.map(item => item.sumMoney),
color: "#FA6C6C",
}, },
//设置面积区域为渐变效果
areaStyle: {
opacity:0.8,
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
{ {
offset: 0.1, name:'中标总数(个)',
color: "#FDF8F5", type: 'bar',
barWidth: 20,
tooltip: {
valueFormatter: function (value) {
return value + '个';
}
}, },
{ itemStyle: {
normal:{
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [{
offset: 0,
color: '#56A5FF'
}, {
offset: 1, offset: 1,
color: "#FCD7C8", 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: {
data: this.jzdqData.map(item => item.twoCount), type: 'category',
name:'二级', axisLabel: { //坐标轴刻度标签的相关设置
type: 'line', margin: 15, //刻度标签与轴线之间的距离
smooth: true, color:"#666666"
emphasis: {
disabled: true,
focus: 'none'
}, },
//设置折线颜色和粗细 axisTick: false, //坐标轴刻度
lineStyle: { axisPointer: {
width: 2, type: 'shadow'
color: "#8077F2",
}, },
itemStyle:{ data: data.map(item => item.label),
color: "#8077F2",
}, },
//设置面积区域为渐变效果 yAxis: [
areaStyle: {
opacity:0.8,
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
{ {
offset: 0.1, type: 'value',
color: "#ECE8FF", axisLabel: { //坐标轴刻度标签的相关设置
color:"#666666"
},
name: '单位:个',
nameLocation: 'start',
nameTextStyle: {
padding: [0, 0, 0, -60], // 四个数字分别为上右下左与原位置距离
color: '#666666',
}
}, },
{ {
offset: 1, type: 'value',
color: "#BCC0FF", 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: [
{ {
data: this.jzdqData.map(item => item.threeCount), name:'下浮率',
name:'三级', smooth: false, //平滑
type: 'line', type:"line",
smooth: true, symbolSize: 6,
emphasis: { yAxisIndex: 1,
disabled: true, tooltip: {
focus: 'none' valueFormatter: function (value) {
return value + '%'
}
}, },
//设置折线颜色和粗细 itemStyle: {
lineStyle: { color: '#14C9C9'
width: 2,
color: "#FA936C",
}, },
itemStyle:{ data:data.map(item => item.rate),
color: "#FA936C",
}, },
//设置面积区域为渐变效果
areaStyle: {
opacity:0.8,
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
{ {
offset: 0.1, name:'统计项目数量',
color: "#FEFBFA", type: 'bar',
barWidth: 20,
tooltip: {
valueFormatter: function (value) {
return value + '个';
}
}, },
{ itemStyle: {
normal:{
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [{
offset: 0,
color: '#56A5FF'
}, {
offset: 1, offset: 1,
color: "#FCD7C8", color: '#1B8EFF'
}, }])
]), }
},
}, },
data:data.map(item => item.count),
}
] ]
} }
myChart.clear();
myChart.setOption(option); myChart.setOption(option);
window.addEventListener("resize", function () { window.addEventListener("resize", function () {
myChart.resize();//图表跟随页面大小变化宽度 myChart.resize();//图表跟随页面大小变化宽度
}); });
})
}, },
initChart2() { initChart6(data) {
let myChart = echarts.init(document.getElementById("ba-echarts")) this.$nextTick(() => {
let myChart = echarts.init(document.getElementById("echarts6"))
let option ={ let option ={
tooltip: { tooltip: {
// show:false trigger: 'axis',
axisPointer: {
type: 'line',
label: {
backgroundColor: '#FFFFFF'
}
}
}, },
legend:{},
xAxis: { xAxis: {
type: 'category', type: 'category',
boundaryGap: false, boundaryGap: false,
data: this.zbData.map(item => item.province), axisLabel: {
show: true,
interval: 0,
},
data: data.map(item => item.month),
}, },
yAxis: { yAxis: {
type: 'value', type: 'value',
}, },
grid: { grid: {
top:20, top:30,
left:65, left:50,
right:50, right:50,
bottom:20, bottom:30,
}, },
color:['#D0FAB7', '#E9C8FF', '#81D5BC'],
series: [ series: [
{ {
data: this.zbData.map(item => item.count), name:'勘察项目下浮率',
type: 'line', smooth: false, //平滑
smooth: true, type:"line",
emphasis: { symbolSize: 6, //折线拐点大小
disabled: true, itemStyle: {
focus: 'none' normal: {
}, borderWidth: 4,
//设置折线颜色和粗细 lineStyle: { width: 2 }
lineStyle: { }
width: 1,
color: "#FFAB44",
}, },
itemStyle:{ data:data.map(item => item.kcsjRate),
color: "#FFAB44",
}, },
//设置面积区域为渐变效果
areaStyle: {
color: echarts.graphic.LinearGradient(0, 1, 0, 0, [
{ {
offset: 0.2, name:'施工类项目下浮率',
color: "#FFEDD0", smooth: false, //平滑
type:"line",
symbolSize: 6, //折线拐点大小
itemStyle: {
normal: {
borderWidth: 4,
lineStyle: { width: 2 }
}
},
data:data.map(item => item.sgRate),
}, },
{ {
offset: 1, name:'监理类项目下浮率',
color: "#FFC671", smooth: false, //平滑
type:"line",
symbolSize: 6, //折线拐点大小
itemStyle: {
normal: {
borderWidth: 4,
lineStyle: { width: 2 }
}
}, },
]), data:data.map(item => item.jlRate),
}, },
}
] ]
} }
myChart.setOption(option); myChart.setOption(option);
window.addEventListener("resize", function () { window.addEventListener("resize", function () {
myChart.resize();//图表跟随页面大小变化宽度 myChart.resize();//图表跟随页面大小变化宽度
}); });
},
handleClick(type,index){
if(type === 1){
this.typeIndex=index;
this.jzglData=this.glData[index].levelList;
let total=0
for(let i=0; i<this.jzglData.length; i++){
total=total+this.jzglData[i].count
}
this.total=total;
this.glDetail=this.zzTableData[index]
this.initChart()
}
if(type === 2){
this.qydqIndex=index;
let data=this.dqData[index].province;
let list=[];
for(let i=0; i<data.length; i++){
let item={};
item.province=data[i].province;
for (let j=0; j<data[i].levelList.length; j++){
if(data[i].levelList[j].levelValue === '特级'){
item.tjCount=data[i].levelList[j].count;
item.tjRate=data[i].levelList[j].rate;
}
if(data[i].levelList[j].levelValue === '一级'){
item.oneCount=data[i].levelList[j].count;
item.oneRate=data[i].levelList[j].rate;
}
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)
}
this.jzdqData=list;
this.$nextTick(()=>{
this.initChart1()
}) })
},
//地区
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": []
});
}
}
}
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;
}
}, 0);
if (index === 4) {
sums[index] = Number(sums[index]).toFixed(2);
return;
} }
});
return sums;
},
getSummaries1(param){
const { columns, data } = param;
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '合计';
return;
}
if (index === 1) {
sums[index] = '-';
return;
}
const values = data.map(item => Number(item[column.property]));
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr);
if (!isNaN(value)) {
return Number(prev) + Number(curr)
} else {
return prev;
}
}, 0);
if (index === 2||index === 3||index === 4) {
sums[index] = Number(sums[index]).toFixed(2);
return;
}
});
return sums;
}, },
}
} }
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.zhongbiao{ .zhongbiao{
.zb-content{
background: #ffffff;
border-radius: 4px;
margin-top: 12px;
padding: 16px;
}
.text{
width: 100%;
line-height: 28px;
padding: 0 16px;
margin-top: 24px;
font-size: 12px;
color: rgba(35,35,35,0.8);
background: #F4F4F5;
border-radius: 2px;
margin-bottom: 24px;
}
.tips{
margin: 0;
padding-top: 16px; padding-top: 16px;
font-size: 12px; .text_p{
color: rgba(35,35,35,0.4); color: #999999;
i{
color:#909399;
margin-right: 9px;
font-size: 14px; 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;
} }
.content1{ .p1{
.main1{
.left{
width: 20%;
float: left;
.item{
height: 74px;
line-height: 74px;
color: #333333; color: #333333;
font-size: 16px; font-size: 16px;
padding-left: 30px;
border-top: 1px solid #EAF3FF;
border-left: 1px solid #EAF3FF;
border-right: 1px solid #EAF3FF;
cursor: pointer;
}
.item:last-child{
border-bottom: 1px solid #EAF3FF;
}
.color{
background: #F0F3FA;
color:#0081FF;
i{
width: 4px;
height: 29px;
background: #0081FF;
border-radius: 10px;
display: inline-block;
float: right;
margin-top: 22px;
} }
} }
.query-params{
.common-title{
margin-right: 24px;
} }
.right{ ::v-deep .form-content-width{
width: 79%; width: 150px;
float: right; .el-select__input{
background: #F0F3FA; width: 10px !important;
height: 295px; max-width: 10px !important;
padding: 16px; margin-left:0;
} }
} }
.main2{ ::v-deep .el-cascader{
margin-top: 30px; width: 220px;
.head{ .el-cascader__tags{
span{ flex-wrap: inherit;
font-size: 12px; .el-tag{
color: rgba(35,35,35,0.8); max-width: 130px;
} }
.number{
color:#FF3C3C;
} }
::v-deep .el-select{
width: 100px;
height: 32px;
.el-input{
width: 100%;
height: 32px;
} }
.el-input__inner{
height: 32px !important;
line-height: 32px;
} }
.td_content{
background: #ffffff;
border-radius: 4px;
margin-top: 12px;
padding: 16px 52px 16px 16px;
} }
.content_box{
display: flex;
justify-content: space-between;
.box-left{
width: 60%;
} }
.box-right{
width: 33%;
float: right;
::v-deep .el-table{
.sort-caret.ascending{
border-bottom-color: rgba(0,129,255,0.5);
} }
.table-item{ .ascending .sort-caret.ascending{
margin-top: 12px; border-bottom-color: #0081FF;
} }
.sort-caret.descending{
border-top-color: rgba(0,129,255,0.5);
} }
.content2{ .descending .sort-caret.descending{
.tabs{ border-top-color: #0081FF;
margin-top: 32px;
margin-bottom: 24px;
.item{
display: inline-block;
color: #3D3D3D;
font-size: 14px;
margin-right: 24px;
cursor: pointer;
}
.color{
color: #3D3D3D;
font-weight: 700;
position: relative;
i{
width: 42px;
height: 2px;
background: #0081FF;
display: inline-block;
position: absolute;
bottom:-4px;
left: 50%;
transform: translate(-50%,0);
} }
.el-table__header-wrapper{
background: #F0F3FA;
th{
background: #F0F3FA;
/*text-align: left;*/
} }
} }
.table-item{ .el-table__footer-wrapper{
margin-top: 32px; background: #F0F3FA;
}
} }
.content3{ th {
.table-item{ font-size: 13px !important;
margin-top: 32px; font-weight: 400 !important;
} }
.table-item { .cell {
::v-deep .el-table { padding-right: 12px !important;
.has-gutter{ padding-left: 12px !important;
tr{ line-height: 18px;
th:nth-child(3){
border-right:0;
.cell{
padding-right: 24px !important;
} }
.el-table__fixed-header-wrapper{
th{
background: #F0F3FA;
} }
} }
td.el-table__cell{
border-bottom: 0;
} }
tr{
&.current-row>td{
background-color: initial;
} }
&:nth-child(2n) {
background: #F8FBFF;
} }
} }
.table-item{ .el-table__cell{
::v-deep .el-table{ height: 40px;
.el-table__header-wrapper{
th{
padding: 0; padding: 0;
line-height: 40px;
}
.el-table__body tr:hover > td.el-table__cell{
background: #DCEBFF;
}
::-webkit-scrollbar-track-piece {
//滚动条凹槽的颜色,还可以设置边框属性
background-color: #F3F4F5;
height: 16px;
padding: 0 4px;
}
//滚动条的宽度
::-webkit-scrollbar {
width: 8px;
height: 8px;
background-color: #F3F4F5;
border-radius: 6px;
}
//滚动条的滑块
::-webkit-scrollbar-thumb {
border-radius: 8px;
height: 8px;
margin: 0 4px;
background: rgba(98,110,126,0.2);
border: 4px solid rgba(98,110,126,0.2);;
&:hover{
background: #566380;
} }
} }
.el-table__cell.is-right{
text-align: right;
}
.has-gutter{ .has-gutter{
tr{ tr{
th:nth-child(6),th:nth-child(8){ th:nth-last-child(2){
border-right:0; border-right:0;
.cell{
padding-right: 24px !important;
} }
td:nth-last-child(2){
border-right:0;
} }
} }
} }
.el-table__cell.gutter{ .el-table__cell.gutter{
/*background: #F0F3FA;*/ background: #F0F3FA;
width: 16px !important;
} }
.el-table__row{ .el-table__row{
td:last-child{ td:last-child{
.cell{ .cell{
padding-right: 24px !important; padding-right: 12px !important;
} }
} }
} }
th{
font-size: 12px !important;
font-weight: 400 !important;
} }
.el-table__fixed-header-wrapper th{
background: #F0F3FA;
} }
td.el-table__cell{
border-bottom: 0;
}
.caret-wrapper{
width: 10px;
} }
::v-deep .el-input--medium{
.el-input__icon{
line-height: 32px;
} }
} }
} }
......
...@@ -4,14 +4,14 @@ ...@@ -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} 条`;
} }
}) })
}, },
......
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
label="企业名称" label="企业名称"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<div class="wordprimary">{{scope.row.companyName}}</div> <div>{{scope.row.companyName}}</div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
...@@ -73,7 +73,7 @@ ...@@ -73,7 +73,7 @@
label="备注" label="备注"
width=""> width="">
<template slot-scope="scope"> <template slot-scope="scope">
<div class="showremark" v-if="scope.row.remark"> <div v-if="scope.row.remark">
<el-tooltip class="item" effect="dark" :content="scope.row.remark" placement="top"><span>{{scope.row.remark}}</span></el-tooltip> <el-tooltip class="item" effect="dark" :content="scope.row.remark" placement="top"><span>{{scope.row.remark}}</span></el-tooltip>
</div> </div>
<div v-else>--</div> <div v-else>--</div>
......
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
<div class="flex tipinput"> <div class="flex tipinput">
<div class="tips" v-for="(item,index) in tipslit">{{item.label}}<img v-if="isDisabled == false" @click="deltip(item)" src="@/assets/images/project/del.png"></div> <div class="tips" v-for="(item,index) in tipslit">{{item.label}}<img v-if="isDisabled == false" @click="deltip(item)" src="@/assets/images/project/del.png"></div>
<div style="position: relative"> <div style="position: relative">
<el-input placeholder="待添加" :disabled="isDisabled" v-model="tipsvalue" @input="getValue" :style="spanWidth"></el-input><span class="spanText">{{ tipsvalue }}</span> <el-input placeholder="待添加" id="biaoqian" :disabled="isDisabled" v-model="tipsvalue" @input="getValue" :style="spanWidth"></el-input><span class="spanText">{{ tipsvalue }}</span>
</div> </div>
<div class="addbtn" v-if="isDisabled == false" @click="addtips"></div> <div class="addbtn" v-if="isDisabled == false" @click="addtips"></div>
</div> </div>
...@@ -196,6 +196,15 @@ ...@@ -196,6 +196,15 @@
isDisabled:false, isDisabled:false,
} }
}, },
watch:{
nowedit:{
handler(newVal, olVal) {
if(newVal == -1){
this.getXMSL()
}
}
}
},
created(){ created(){
//项目阶段 //项目阶段
getDictType('project_stage_type').then(result=>{ getDictType('project_stage_type').then(result=>{
...@@ -207,6 +216,10 @@ ...@@ -207,6 +216,10 @@
document.getElementById('xmsl').addEventListener('mouseup',(e) => { document.getElementById('xmsl').addEventListener('mouseup',(e) => {
if(this.isDisabled == true) if(this.isDisabled == true)
return false return false
let bq = document.getElementById('biaoqian').contains(event.target)
if(!bq){
this.addtips()
}
let j = 0 let j = 0
for(var i=1;i<=7;i++){ for(var i=1;i<=7;i++){
let isSelf = document.getElementById('inputxt'+i).contains(event.target) // 这个是自己的区域 let isSelf = document.getElementById('inputxt'+i).contains(event.target) // 这个是自己的区域
......
...@@ -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]: ''
......
package com.dsk.system.domain.business.dto;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* @author lcl
* @create 2023/8/14
*/
@Data
@NoArgsConstructor
public class BusinessSearchDto implements Serializable {
/**
* 状态
*/
private Integer status;
/**
* 用户id
*/
private Long userId;
/**
* 数据权限
*/
private Map<String,Object> params;
public Map<String, Object> getParams()
{
if (params == null)
{
params = new HashMap<>();
}
return params;
}
public BusinessSearchDto(Long userId){
this.userId = userId;
}
}
package com.dsk.system.domain.customer;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* 客户决策链条(CustomerDecisionChain)实体类
*
* @author makejava
* @since 2023-05-16 15:33:45
*/
@Data
@NoArgsConstructor
@Accessors(chain = true)
@TableName("customer_decision_chain")
public class CustomerDecisionChain implements Serializable {
private static final long serialVersionUID = 990085082282249053L;
@TableId(value = "id",type = IdType.AUTO)
private Long id;
/**
* 客户id
*/
private String customerId;
/**
* 姓名
*/
private String name;
/**
* 角色
*/
private String role;
/**
* 公司/机关(工作单位)
*/
private String workUnit;
/**
* 职位
*/
private String position;
/**
* 联系方式
*/
private String contactInformation;
/**
* 备注
*/
private String remark;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 更新人
*/
private String updateBy;
private Long updateId;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
...@@ -27,7 +27,7 @@ public class JskCombineSearchDto implements Serializable { ...@@ -27,7 +27,7 @@ public class JskCombineSearchDto implements Serializable {
/** /**
* 集团层级 * 集团层级
*/ */
private String combineMemberLevel; private List<String> combineMemberLevels;
/** /**
* 省id * 省id
*/ */
...@@ -84,6 +84,10 @@ public class JskCombineSearchDto implements Serializable { ...@@ -84,6 +84,10 @@ public class JskCombineSearchDto implements Serializable {
* 项目类型 * 项目类型
*/ */
private List<String> projectTypes; private List<String> projectTypes;
/**
* 资质类型
*/
private Integer qualificationType;
/** /**
* 页码 * 页码
...@@ -93,6 +97,13 @@ public class JskCombineSearchDto implements Serializable { ...@@ -93,6 +97,13 @@ public class JskCombineSearchDto implements Serializable {
* 每页条数 * 每页条数
*/ */
private Integer pageSize; private Integer pageSize;
/**
* 排序字段
*/
private String orderName;
/**
* 排序类型 ASC DESC
*/
private String orderType;
} }
...@@ -83,4 +83,9 @@ public class JskCombineInfoService { ...@@ -83,4 +83,9 @@ public class JskCombineInfoService {
} }
return dskOpenApiUtil.responsePage(map); return dskOpenApiUtil.responsePage(map);
} }
public R groupCertificateCount(JskCombineSearchDto dto) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/combine/group/certificateCount", BeanUtil.beanToMap(dto, false, false));
return BeanUtil.toBean(map, R.class);
}
} }
package com.dsk.system.mapper; //package com.dsk.system.mapper;
//
import com.dsk.common.core.domain.entity.BusinessContacts; //import com.dsk.common.core.domain.entity.BusinessContacts;
//
import java.util.List; //import java.util.List;
//
/** ///**
* 项目联系人Mapper接口 // * 项目联系人Mapper接口
* // *
* @author lxl // * @author lxl
* @date 2023-05-17 // * @date 2023-05-17
*/ // */
public interface BusinessContactsMapper //public interface BusinessContactsMapper
{ //{
/** // /**
* 查询项目联系人 // * 查询项目联系人
* // *
* @param id 项目联系人主键 // * @param id 项目联系人主键
* @return 项目联系人 // * @return 项目联系人
*/ // */
public BusinessContacts selectBusinessContactsById(Long id); // public BusinessContacts selectBusinessContactsById(Long id);
//
/** // /**
* 查询项目联系人列表 // * 查询项目联系人列表
* // *
* @param businessContacts 项目联系人 // * @param businessContacts 项目联系人
* @return 项目联系人集合 // * @return 项目联系人集合
*/ // */
public List<BusinessContacts> selectBusinessContactsList(BusinessContacts businessContacts); // public List<BusinessContacts> selectBusinessContactsList(BusinessContacts businessContacts);
//
/** // /**
* 新增项目联系人 // * 新增项目联系人
* // *
* @param businessContacts 项目联系人 // * @param businessContacts 项目联系人
* @return 结果 // * @return 结果
*/ // */
public int insertBusinessContacts(BusinessContacts businessContacts); // public int insertBusinessContacts(BusinessContacts businessContacts);
//
/** // /**
* 修改项目联系人 // * 修改项目联系人
* // *
* @param businessContacts 项目联系人 // * @param businessContacts 项目联系人
* @return 结果 // * @return 结果
*/ // */
public int updateBusinessContacts(BusinessContacts businessContacts); // public int updateBusinessContacts(BusinessContacts businessContacts);
//
/** // /**
* 删除项目联系人 // * 删除项目联系人
* // *
* @param id 项目联系人主键 // * @param id 项目联系人主键
* @return 结果 // * @return 结果
*/ // */
public int deleteBusinessContactsById(Long id); // public int deleteBusinessContactsById(Long id);
//
/** // /**
* 批量删除项目联系人 // * 批量删除项目联系人
* // *
* @param ids 需要删除的数据主键集合 // * @param ids 需要删除的数据主键集合
* @return 结果 // * @return 结果
*/ // */
public int deleteBusinessContactsByIds(Long[] ids); // public int deleteBusinessContactsByIds(Long[] ids);
} //}
package com.dsk.system.mapper; package com.dsk.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.common.annotation.DataScope;
import com.dsk.common.core.domain.entity.BusinessInfo; import com.dsk.common.core.domain.entity.BusinessInfo;
import com.dsk.system.domain.business.dto.BusinessListDto; import com.dsk.system.domain.business.dto.BusinessListDto;
import com.dsk.system.domain.business.dto.BusinessSearchDto;
import com.dsk.system.domain.business.vo.BusinessLikeProjectNameListVo; import com.dsk.system.domain.business.vo.BusinessLikeProjectNameListVo;
import com.dsk.system.domain.customer.dto.CustomerBusinessSearchDto; import com.dsk.system.domain.customer.dto.CustomerBusinessSearchDto;
import com.dsk.system.domain.customer.vo.CustomerBusinessListVo; import com.dsk.system.domain.customer.vo.CustomerBusinessListVo;
...@@ -108,4 +110,6 @@ public interface BusinessInfoMapper extends BaseMapper<BusinessInfo> { ...@@ -108,4 +110,6 @@ public interface BusinessInfoMapper extends BaseMapper<BusinessInfo> {
List<CustomerBusinessListVo> selectCustomerBusinessList(CustomerBusinessSearchDto dto); List<CustomerBusinessListVo> selectCustomerBusinessList(CustomerBusinessSearchDto dto);
int selectCountByStatus(BusinessSearchDto dto);
} }
...@@ -2,7 +2,6 @@ package com.dsk.system.mapper; ...@@ -2,7 +2,6 @@ package com.dsk.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.common.core.domain.entity.BusinessRelateCompany; import com.dsk.common.core.domain.entity.BusinessRelateCompany;
import com.dsk.system.domain.customer.CustomerDecisionChain;
import java.util.List; import java.util.List;
......
package com.dsk.system.mapper; //package com.dsk.system.mapper;
//
import com.baomidou.mybatisplus.core.mapper.BaseMapper; //import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.system.domain.customer.CustomerDecisionChain; //import com.dsk.system.domain.customer.CustomerDecisionChain;
import org.apache.ibatis.annotations.Mapper; //import org.apache.ibatis.annotations.Mapper;
//
//
/** ///**
* 客户决策链条(CustomerDecisionChain)表数据库访问层 // * 客户决策链条(CustomerDecisionChain)表数据库访问层
* // *
* @author makejava // * @author makejava
* @since 2023-05-16 15:33:46 // * @since 2023-05-16 15:33:46
*/ // */
@Mapper //@Mapper
public interface CustomerDecisionChainMapper extends BaseMapper<CustomerDecisionChain> { //public interface CustomerDecisionChainMapper extends BaseMapper<CustomerDecisionChain> {
//
} //}
//
package com.dsk.system.service;
import com.dsk.common.core.domain.entity.BusinessContacts;
import java.util.List;
/**
* 项目联系人Service接口
*
* @date 2023-05-17
*/
public interface IBusinessContactsService
{
/**
* 查询项目联系人
*
* @param id 项目联系人主键
* @return 项目联系人
*/
public BusinessContacts selectBusinessContactsById(Long id);
/**
* 查询项目联系人列表
*
* @param businessContacts 项目联系人
* @return 项目联系人集合
*/
public List<BusinessContacts> selectBusinessContactsList(BusinessContacts businessContacts);
/**
* 新增项目联系人
*
* @param businessContacts 项目联系人
* @return 结果
*/
public int insertBusinessContacts(BusinessContacts businessContacts);
/**
* 修改项目联系人
*
* @param businessContacts 项目联系人
* @return 结果
*/
public int updateBusinessContacts(BusinessContacts businessContacts);
/**
* 批量删除项目联系人
*
* @param ids 需要删除的项目联系人主键集合
* @return 结果
*/
public int deleteBusinessContactsByIds(Long[] ids);
/**
* 删除项目联系人信息
*
* @param id 项目联系人主键
* @return 结果
*/
public int deleteBusinessContactsById(Long id);
}
package com.dsk.system.service;
import com.dsk.system.domain.business.dto.BusinessSearchDto;
import java.util.Map;
/**
* @author lcl
* @create 2023/8/14
*/
public interface IBusinessOverviewService {
Map<String, Object> statistics(BusinessSearchDto dto);
}
package com.dsk.system.service;
import com.dsk.system.domain.customer.CustomerDecisionChain;
import com.dsk.system.domain.customer.dto.CustomerDecisionChainSearchDto;
import java.util.List;
/**
* 客户决策链条(CustomerDecisionChain)表服务接口
*
* @author makejava
* @since 2023-05-16 15:33:45
*/
public interface ICustomerDecisionChainService {
/**
* 查询数据列表
*/
List<CustomerDecisionChain> selectList(CustomerDecisionChainSearchDto dto);
/**
* 通过ID查询单条数据
*
* @param id 主键
* @return 实例对象
*/
CustomerDecisionChain selectById(Long id);
/**
* 新增数据
*
* @param customerDecisionChain 实例对象
* @return 实例对象
*/
boolean insert(CustomerDecisionChain customerDecisionChain);
/**
* 修改数据
*
* @param customerDecisionChain 实例对象
* @return 实例对象
*/
boolean update(CustomerDecisionChain customerDecisionChain);
/**
* 通过主键删除数据
*
* @param id 主键
* @return 是否成功
*/
boolean deleteById(Long id);
}
package com.dsk.system.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.dsk.common.core.domain.entity.BusinessContacts;
import com.dsk.common.core.domain.model.LoginUser;
import com.dsk.common.exception.base.BaseException;
import com.dsk.common.utils.CheckUtils;
import com.dsk.common.utils.DateUtils;
import com.dsk.common.utils.SecurityUtils;
import com.dsk.system.mapper.BusinessContactsMapper;
import com.dsk.system.service.IBusinessContactsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* 项目联系人Service业务层处理
*
* @author lxl
* @date 2023-05-17
*/
@Service
public class BusinessContactsServiceImpl implements IBusinessContactsService
{
@Autowired
private BusinessContactsMapper businessContactsMapper;
/**
* 查询项目联系人
*
* @param id 项目联系人主键
* @return 项目联系人
*/
@Override
public BusinessContacts selectBusinessContactsById(Long id)
{
return businessContactsMapper.selectBusinessContactsById(id);
}
/**
* 查询项目联系人列表
*
* @param businessContacts 项目联系人
* @return 项目联系人
*/
@Override
public List<BusinessContacts> selectBusinessContactsList(BusinessContacts businessContacts)
{
return businessContactsMapper.selectBusinessContactsList(businessContacts);
}
/**
* 新增项目联系人
*
* @param businessContacts 项目联系人
* @return 结果
*/
@Override
@Transactional
public int insertBusinessContacts(BusinessContacts businessContacts)
{
if(!CheckUtils.isPhone(businessContacts.getPhone())) throw new BaseException("500","请输入正确的电话号码");
LoginUser loginUser = SecurityUtils.getLoginUser();
if (ObjectUtil.isEmpty(loginUser)) throw new BaseException("请登录");
//维护人员为当前登录用户
businessContacts.setAccendant(loginUser.getUser().getNickName());
return businessContactsMapper.insertBusinessContacts(businessContacts);
}
/**
* 修改项目联系人
*
* @param businessContacts 项目联系人
* @return 结果
*/
@Override
@Transactional
public int updateBusinessContacts(BusinessContacts businessContacts)
{
if(!CheckUtils.isPhone(businessContacts.getPhone())) throw new BaseException("500","请输入正确的电话号码");
businessContacts.setUpdateTime(DateUtils.getNowDate());
return businessContactsMapper.updateBusinessContacts(businessContacts);
}
/**
* 批量删除项目联系人
*
* @param ids 需要删除的项目联系人主键
* @return 结果
*/
@Override
public int deleteBusinessContactsByIds(Long[] ids)
{
return businessContactsMapper.deleteBusinessContactsByIds(ids);
}
/**
* 删除项目联系人信息
*
* @param id 项目联系人主键
* @return 结果
*/
@Override
public int deleteBusinessContactsById(Long id)
{
return businessContactsMapper.deleteBusinessContactsById(id);
}
}
package com.dsk.system.service.impl;
import com.dsk.common.annotation.DataScope;
import com.dsk.common.core.domain.BaseEntity;
import com.dsk.common.utils.SecurityUtils;
import com.dsk.system.domain.business.dto.BusinessSearchDto;
import com.dsk.system.mapper.BusinessInfoMapper;
import com.dsk.system.service.IBusinessOverviewService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
/**
* @author lcl
* @create 2023/8/14
*/
@Service
public class BusinessOverviewServiceImpl implements IBusinessOverviewService {
@Resource
private BusinessInfoMapper businessInfoMapper;
@Override
@DataScope(userAlias = "u",deptAlias = "d")
public Map<String, Object> statistics(BusinessSearchDto dto) {
Map<String, Object> resultMap = new HashMap<>();
//总
resultMap.put("totalCount",businessInfoMapper.selectCountByStatus(dto));
//储备
dto.setStatus(0);
resultMap.put("reserveCount",businessInfoMapper.selectCountByStatus(dto));
//跟进
dto.setStatus(1);
resultMap.put("followUpCount",businessInfoMapper.selectCountByStatus(dto));
//中标(已合作)
dto.setStatus(2);
resultMap.put("bidCount",businessInfoMapper.selectCountByStatus(dto));
return resultMap;
}
}
package com.dsk.system.service.impl;
import cn.hutool.core.bean.BeanException;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.dsk.common.utils.SecurityUtils;
import com.dsk.system.domain.customer.CustomerDecisionChain;
import com.dsk.system.domain.customer.dto.CustomerDecisionChainSearchDto;
import com.dsk.system.mapper.CustomerDecisionChainMapper;
import com.dsk.system.service.ICustomerDecisionChainService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.util.List;
/**
* 客户决策链条(CustomerDecisionChain)表服务实现类
*
* @author makejava
* @since 2023-05-16 15:33:45
*/
@Slf4j
@Service
public class CustomerDecisionChainServiceImpl implements ICustomerDecisionChainService {
@Resource
private CustomerDecisionChainMapper baseMapper;
@Override
public List<CustomerDecisionChain> selectList(CustomerDecisionChainSearchDto dto) {
return baseMapper.selectList(Wrappers.<CustomerDecisionChain>lambdaQuery()
.eq(CustomerDecisionChain::getCustomerId, dto.getCustomerId())
.orderByDesc(CustomerDecisionChain::getCreateTime));
}
/**
* 通过ID查询单条数据
*
* @param id 主键
* @return 实例对象
*/
@Override
public CustomerDecisionChain selectById(Long id) {
return baseMapper.selectById(id);
}
/**
* 新增数据
*
* @param customerDecisionChain 实例对象
* @return 实例对象
*/
@Override
public boolean insert(CustomerDecisionChain customerDecisionChain) {
verifyParameter(customerDecisionChain);
return baseMapper.insert(customerDecisionChain) > 0;
}
/**
* 修改数据
*
* @param customerDecisionChain 实例对象
* @return 实例对象
*/
@Override
public boolean update(CustomerDecisionChain customerDecisionChain) {
if (ObjectUtils.isEmpty(customerDecisionChain.getId())) throw new BeanException("id不能为空!");
verifyParameter(customerDecisionChain);
return baseMapper.updateById(customerDecisionChain) > 0;
}
/**
* 通过主键删除数据
*
* @param id 主键
* @return 是否成功
*/
@Override
public boolean deleteById(Long id) {
return baseMapper.deleteById(id) > 0;
}
/**
* 参数验证
*
* @param customerDecisionChain
*/
private void verifyParameter(CustomerDecisionChain customerDecisionChain) {
if (ObjectUtils.isEmpty(customerDecisionChain.getCustomerId())) throw new BeanException("客户id不能为空!");
customerDecisionChain.setUpdateId(SecurityUtils.getUserId());
customerDecisionChain.setUpdateBy(SecurityUtils.getLoginUser().getUser().getNickName());
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dsk.system.mapper.BusinessContactsMapper">
<resultMap type="com.dsk.common.core.domain.entity.BusinessContacts" id="BusinessContactsResult">
<result property="id" column="id"/>
<result property="businessId" column="business_id"/>
<result property="name" column="name"/>
<result property="role" column="role"/>
<result property="office" column="office"/>
<result property="position" column="position"/>
<result property="phone" column="phone"/>
<result property="sex" column="sex"/>
<result property="accendant" column="accendant"/>
<result property="createTime" column="create_time"/>
<result property="updateTime" column="update_time"/>
</resultMap>
<sql id="selectBusinessContactsVo">
select id,
business_id,
name,
role,
office,
position,
phone,
accendant,
sex,
create_time,
update_time
from business_contacts
</sql>
<select id="selectBusinessContactsList" parameterType="com.dsk.common.core.domain.entity.BusinessContacts" resultMap="BusinessContactsResult">
<include refid="selectBusinessContactsVo"/>
<where>
<if test="businessId != null ">and business_id = #{businessId}</if>
<if test="name != null and name != ''">and name like concat('%', #{name}, '%')</if>
<if test="role != null and role != ''">and role = #{role}</if>
<if test="office != null and office != ''">and office = #{office}</if>
<if test="position != null and position != ''">and position = #{position}</if>
<if test="phone != null and phone != ''">and phone = #{phone}</if>
<if test="accendant != null and accendant != ''">and accendant = #{accendant}</if>
<if test="createTime != null ">and create_time = #{createTime}</if>
<if test="sex != null ">and sex = #{sex}</if>
</where>
order by update_time desc,id desc
</select>
<select id="selectBusinessContactsById" parameterType="Long" resultMap="BusinessContactsResult">
<include refid="selectBusinessContactsVo"/>
where id = #{id}
</select>
<insert id="insertBusinessContacts" parameterType="com.dsk.common.core.domain.entity.BusinessContacts" useGeneratedKeys="true" keyProperty="id">
insert into business_contacts
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="businessId != null">business_id,</if>
<if test="name != null">name,</if>
<if test="role != null">role,</if>
<if test="office != null">office,</if>
<if test="position != null">position,</if>
<if test="phone != null">phone,</if>
<if test="accendant != null">accendant,</if>
<if test="createTime != null">create_time,</if>
<if test="updateTime != null">update_time,</if>
<if test="sex != null">sex,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="businessId != null">#{businessId},</if>
<if test="name != null">#{name},</if>
<if test="role != null">#{role},</if>
<if test="office != null">#{office},</if>
<if test="position != null">#{position},</if>
<if test="phone != null">#{phone},</if>
<if test="accendant != null">#{accendant},</if>
<if test="createTime != null">#{createTime},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="sex != null">#{sex},</if>
</trim>
</insert>
<update id="updateBusinessContacts" parameterType="com.dsk.common.core.domain.entity.BusinessContacts">
update business_contacts
<trim prefix="SET" suffixOverrides=",">
<if test="businessId != null">business_id = #{businessId},</if>
<if test="name != null">name = #{name},</if>
<if test="role != null">role = #{role},</if>
<if test="office != null">office = #{office},</if>
<if test="position != null">position = #{position},</if>
<if test="phone != null">phone = #{phone},</if>
<if test="accendant != null">accendant = #{accendant},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="sex != null">sex = #{sex},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteBusinessContactsById" parameterType="Long">
delete
from business_contacts
where id = #{id}
</delete>
<delete id="deleteBusinessContactsByIds" parameterType="String">
delete from business_contacts where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>
\ No newline at end of file
...@@ -373,4 +373,16 @@ ...@@ -373,4 +373,16 @@
and u.user_id = #{userId} and u.user_id = #{userId}
<if test="companyName != null and companyName != '' "> and ct.company_name =#{companyName}</if> <if test="companyName != null and companyName != '' "> and ct.company_name =#{companyName}</if>
</select> </select>
<select id="selectCountByStatus" resultType="java.lang.Integer">
select
count(bi.id)
from business_info bi
join business_user bu on bu.business_id = bi.id
left join sys_user u on bu.user_id = u.user_id
left join sys_dept d on u.dept_id = d.dept_id
where (bu.user_id = #{userId} or bi.is_private = 1)
<if test="status != null"> and bi.status = #{status}</if>
${params.dataScope}
</select>
</mapper> </mapper>
...@@ -86,6 +86,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ...@@ -86,6 +86,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</if> </if>
<!-- 数据范围过滤 --> <!-- 数据范围过滤 -->
${params.dataScope} ${params.dataScope}
order by u.create_time desc
</select> </select>
<select id="selectAllocatedList" parameterType="SysUser" resultMap="SysUserResult"> <select id="selectAllocatedList" parameterType="SysUser" resultMap="SysUserResult">
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dsk.system.mapper.CustomerDecisionChainMapper">
<resultMap type="com.dsk.system.domain.customer.CustomerDecisionChain" id="CustomerDecisionChainMap">
<result property="id" column="id" jdbcType="INTEGER"/>
<result property="customerId" column="customer_id" jdbcType="VARCHAR"/>
<result property="name" column="name" jdbcType="VARCHAR"/>
<result property="role" column="role" jdbcType="VARCHAR"/>
<result property="workUnit" column="work_unit" jdbcType="VARCHAR"/>
<result property="position" column="position" jdbcType="VARCHAR"/>
<result property="contactInformation" column="contact_information" jdbcType="VARCHAR"/>
<result property="remark" column="remark" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="updateId" column="update_id" jdbcType="INTEGER"/>
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
</resultMap>
</mapper>
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