Commit f2b43518 authored by yht15023815643's avatar yht15023815643

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

parents 46e5bbca ede6a83e
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.alibaba.fastjson2.JSONObject;
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.RequestBody;
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("/status/statistics")
public AjaxResult statusStatistics(){
return AjaxResult.success(baseService.statusStatistics(new BusinessSearchDto(SecurityUtils.getUserId())));
}
/**
* 项目资金分析
*/
@GetMapping("/amount/analyze")
public AjaxResult amountAnalyze(){
return AjaxResult.success(baseService.amountAnalyze(new BusinessSearchDto(SecurityUtils.getUserId(),0)));
}
/**
* 项目类型分析
*/
@GetMapping("/type/analyze")
public AjaxResult typeAnalyze(){
return AjaxResult.success(baseService.typeAnalyze(new BusinessSearchDto(SecurityUtils.getUserId(),2)));
}
/**
* 公招项目地区统计
* @return
*/
@GetMapping("/countGroupByProvince")
public AjaxResult countGroupByProvince(@RequestBody JSONObject object){
return baseService.countGroupByProvince(object);
}
/**
* 公招项目投资金额统计
* @return
*/
@GetMapping("/rangByMoney")
public AjaxResult rangByMoney(@RequestBody JSONObject object){
return baseService.rangByMoney(object);
}
}
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.customer;
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.customer.dto.CustomerSearchDto;
import com.dsk.system.service.ICustomerOverviewService;
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/15
*/
@RestController
@RequestMapping("/customer/overview")
public class CustomerOverviewController extends BaseController {
@Autowired
private ICustomerOverviewService baseService;
/**
* 客户统计
*/
@GetMapping("/statistics")
public AjaxResult statistics(){
return AjaxResult.success(baseService.statistics(new CustomerSearchDto()));
}
/**
* 客户合作情况
*/
@GetMapping("/cooperation/top")
public AjaxResult cooperationTop(){
return AjaxResult.success(baseService.cooperationTop(new CustomerSearchDto()));
}
/**
* 客户信资评级
*/
@GetMapping("/credit/level")
public AjaxResult creditLevel(){
return AjaxResult.success(baseService.creditLevel(new CustomerSearchDto()));
}
}
...@@ -43,7 +43,7 @@ public class EnterpriseBussinessController { ...@@ -43,7 +43,7 @@ public class EnterpriseBussinessController {
@ApiOperation(value = "客户项目列表(openApi)") @ApiOperation(value = "客户项目列表(openApi)")
@RequestMapping(value = "/clientProjectPage", method = RequestMethod.POST) @RequestMapping(value = "/clientProjectPage", method = RequestMethod.POST)
public Map<String, Object> clientProjectPage(@RequestBody @Valid EnterpriseBussinessClientProjectPageBody paramMap) throws Exception { public TableDataInfo clientProjectPage(@RequestBody @Valid EnterpriseBussinessClientProjectPageBody paramMap) throws Exception {
return enterpriseBussinessService.clientProjectPage(paramMap); return enterpriseBussinessService.clientProjectPage(paramMap);
} }
...@@ -67,7 +67,7 @@ public class EnterpriseBussinessController { ...@@ -67,7 +67,7 @@ public class EnterpriseBussinessController {
@ApiOperation(value = "供应商项目列表(openApi)") @ApiOperation(value = "供应商项目列表(openApi)")
@RequestMapping(value = "/supplierProjectPage",method = RequestMethod.POST) @RequestMapping(value = "/supplierProjectPage",method = RequestMethod.POST)
public Map<String, Object> supplierProjectPage(@RequestBody @Valid EnterpriseBussinessSupplierProjectPageBody paramMap) throws Exception { public TableDataInfo supplierProjectPage(@RequestBody @Valid EnterpriseBussinessSupplierProjectPageBody paramMap) throws Exception {
return enterpriseBussinessService.supplierProjectPage(paramMap); return enterpriseBussinessService.supplierProjectPage(paramMap);
} }
...@@ -102,4 +102,29 @@ public class EnterpriseBussinessController { ...@@ -102,4 +102,29 @@ public class EnterpriseBussinessController {
} }
@ApiOperation(value = "中标公示详情")
@RequestMapping(value = "/bidWinMergeDetail", method = RequestMethod.POST)
public R bidWinMergeDetail(@RequestBody EnterpriseBusinessBidWinMergeDetailBody paramMap) throws Exception {
return enterpriseBussinessService.bidWinMergeDetail(paramMap);
}
@ApiOperation(value = "四库业绩详情")
@RequestMapping(value = "/skyProjectDetail", method = RequestMethod.POST)
public R skyProjectDetail(@RequestBody EnterpriseBusinessSkyProjectDetailBody paramMap) throws Exception {
return enterpriseBussinessService.skyProjectDetail(paramMap);
}
@ApiOperation(value = "荣誉奖项详情")
@RequestMapping(value = "/awardDetail", method = RequestMethod.POST)
public R awardDetail(@RequestBody EnterpriseBusinessAwardDetailBody paramMap) throws Exception {
return enterpriseBussinessService.awardDetail(paramMap);
}
@ApiOperation(value = "荣誉奖项详情")
@RequestMapping(value = "/select", method = RequestMethod.POST)
public R select(@RequestBody EnterpriseBusinessAwardDetailBody paramMap) throws Exception {
return enterpriseBussinessService.select(paramMap);
}
} }
...@@ -28,6 +28,13 @@ public class EnterpriseController { ...@@ -28,6 +28,13 @@ public class EnterpriseController {
@Autowired @Autowired
private EnterpriseService enterpriseService; private EnterpriseService enterpriseService;
@ApiOperation(value = "企业标签信息(建设库)")
@PostMapping("/label")
public R label(@RequestBody @Valid EnterpriseInfoLabelBody body) throws Exception {
return enterpriseService.label(body);
}
@ApiOperation(value = "企业详情头部信息(建设库)") @ApiOperation(value = "企业详情头部信息(建设库)")
@PostMapping("/infoHeader") @PostMapping("/infoHeader")
public R infoHeader(@RequestBody @Valid EnterpriseInfoHeaderBody body) throws Exception { public R infoHeader(@RequestBody @Valid EnterpriseInfoHeaderBody body) throws Exception {
......
package com.dsk.web.controller.dsk;
import com.dsk.common.core.domain.R;
import com.dsk.common.core.domain.model.*;
import com.dsk.common.core.page.TableDataInfo;
import com.dsk.system.dskService.IndexService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
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.RestController;
import java.util.Map;
/**
* @ClassName IndexController
* @Description TODO
* @Author Dgm
* @Date 2023/8/15 12:01
* @Version 1.0
*/
@Api("首页数据相关")
@RestController
@RequestMapping("/index")
public class IndexController {
@Autowired
private IndexService enterpriseService;
@ApiOperation(value = "企业中标排行榜")
@PostMapping("/winningBidsRanking")
public R winningBidsRanking(@RequestBody Map<String, Object> paramMap) throws Exception {
return enterpriseService.winningBidsRanking(paramMap);
}
@ApiOperation(value = "企业中标排行-项目类型")
@PostMapping("/rankingProjectType")
public R rankingProjectType(@RequestBody Map<String, Object> paramMap) throws Exception {
return enterpriseService.rankingProjectType(paramMap);
}
@ApiOperation(value = "大项目最新中标")
@PostMapping(value = "bigWinningBidsPage")
public TableDataInfo bigWinningBidsPage(@RequestBody IndexBigWinningBidsPageBody vo) throws Exception {
return enterpriseService.bigWinningBidsPage(vo);
}
@ApiOperation(value = "大项目最新招标")
@PostMapping(value = "bigBidPage")
public TableDataInfo bigBidPage(@RequestBody IndexBigBidPageBody vo) throws Exception {
return enterpriseService.bigBidPage(vo);
}
@ApiOperation(value = "企业中标排行-项目类型")
@PostMapping("/bigBidProjectType")
public R bigBidProjectType(@RequestBody Map<String, Object> paramMap) throws Exception {
return enterpriseService.bigBidProjectType(paramMap);
}
}
package com.dsk.web.controller.dsk; package com.dsk.web.controller.dsk;
import com.alibaba.fastjson2.JSONObject;
import com.dsk.common.core.controller.BaseController; import com.dsk.common.core.controller.BaseController;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.core.domain.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;
...@@ -72,4 +74,68 @@ public class JskCombineInfoController extends BaseController { ...@@ -72,4 +74,68 @@ public class JskCombineInfoController extends BaseController {
public R groupCertificateCount(@RequestBody JskCombineSearchDto dto) throws Exception { public R groupCertificateCount(@RequestBody JskCombineSearchDto dto) throws Exception {
return baseService.groupCertificateCount(dto); return baseService.groupCertificateCount(dto);
} }
/**
* 集团户搜索
*/
@PostMapping("/index")
public AjaxResult index(@RequestBody JSONObject object) {
return baseService.index(object);
}
/**
* 查央企
*/
@PostMapping("/centralEnterprse")
public AjaxResult centralEnterprse() {
return baseService.centralEnterprse();
}
/**
* 查央企子公司
*/
@PostMapping("/centralEnterprse/child")
public AjaxResult centralEnterprseChild() {
return baseService.centralEnterprseChild();
}
/**
* 查央企子公司 翻页
*/
@PostMapping("/centralEnterprse/child/page")
public AjaxResult centralEnterprseChildPage(@RequestBody JSONObject object) {
return baseService.centralEnterprseChildPage(object);
}
/**
* 查地方国企
*/
@PostMapping("/centralEnterprse/local")
public AjaxResult centralEnterprseLocal(@RequestBody JSONObject object) {
return baseService.centralEnterprseLocal(object);
}
/**
* 查地方国企 翻页
*/
@PostMapping("/centralEnterprse/local/page")
public AjaxResult centralEnterprseLocalPage(@RequestBody JSONObject object) {
return baseService.centralEnterprseLocalPage(object);
}
/**
* 民营企业
*/
@PostMapping("/centralEnterprse/social")
public AjaxResult centralEnterprseSocial() {
return baseService.centralEnterprseSocial();
}
/**
* 民营企业 翻页
*/
@PostMapping("/centralEnterprse/social/page")
public AjaxResult centralEnterprseSocialPage(@RequestBody JSONObject object) {
return baseService.centralEnterprseSocialPage(object);
}
} }
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();
}
}
package com.dsk.common.core.domain.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import javax.validation.constraints.NotNull;
@Data
@ToString
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class EnterpriseBusinessAwardDetailBody {
/**
* id
*/
@NotNull(message = "id不能为空")
private String sourceId;
}
package com.dsk.common.core.domain.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@ToString
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class EnterpriseBusinessAwardDetailVo {
/**
* 来源名称
*/
private String sourceName;
/**
* 来源url
*/
private String sourceUrl;
}
package com.dsk.common.core.domain.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import javax.validation.constraints.NotNull;
@Data
@ToString
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class EnterpriseBusinessBidWinMergeDetailBody {
/**
* 来源id
*/
@NotNull(message = "id不能为空")
private String sourceId;
}
package com.dsk.common.core.domain.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import javax.validation.constraints.NotNull;
@Data
@ToString
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class EnterpriseBusinessSkyProjectDetailBody {
/**
* id
*/
@NotNull(message = "id不能为空")
private Long sourceId;
}
...@@ -36,4 +36,15 @@ public class EnterpriseBussinessClientPageBody extends BasePage { ...@@ -36,4 +36,15 @@ public class EnterpriseBussinessClientPageBody extends BasePage {
return 0 == cid; return 0 == cid;
} }
/**
* 来源
*/
private List<String> sources;
/**
* 项目类型
*/
private List<String> projects;
} }
...@@ -7,6 +7,7 @@ import lombok.ToString; ...@@ -7,6 +7,7 @@ import lombok.ToString;
import javax.validation.constraints.AssertFalse; import javax.validation.constraints.AssertFalse;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.util.List;
@Data @Data
@ToString @ToString
...@@ -20,10 +21,10 @@ public class EnterpriseBussinessClientProjectPageBody extends BasePage { ...@@ -20,10 +21,10 @@ public class EnterpriseBussinessClientProjectPageBody extends BasePage {
private Integer cid; private Integer cid;
/** /**
* 企业id * 客户企业Id
*/ */
@NotNull(message = "企业id不能为空") @NotNull(message = "企业id不能为空")
private Integer unitId; private Integer companyId;
/** /**
* 查询关键字 * 查询关键字
...@@ -32,7 +33,29 @@ public class EnterpriseBussinessClientProjectPageBody extends BasePage { ...@@ -32,7 +33,29 @@ public class EnterpriseBussinessClientProjectPageBody extends BasePage {
public boolean isVaildCid() { public boolean isVaildCid() {
return 0 == cid || 0 == unitId; return 0 == cid || 0 == companyId;
} }
/**
* 来源
*/
private List<String> sources;
/**
* 项目类型
*/
private List<String> projects;
/**
* 金额起
*/
private Double amountStart;
/**
* 金额止
*/
private Double amountEnd;
} }
...@@ -7,6 +7,7 @@ import lombok.ToString; ...@@ -7,6 +7,7 @@ import lombok.ToString;
import javax.validation.constraints.AssertFalse; import javax.validation.constraints.AssertFalse;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.util.List;
@Data @Data
@ToString @ToString
...@@ -34,4 +35,15 @@ public class EnterpriseBussinessSupplierPageBody extends BasePage { ...@@ -34,4 +35,15 @@ public class EnterpriseBussinessSupplierPageBody extends BasePage {
public boolean isVaildCid() { public boolean isVaildCid() {
return 0 == cid; return 0 == cid;
} }
/**
* 来源
*/
private List<String> sources;
/**
* 项目类型
*/
private List<String> projects;
} }
...@@ -7,6 +7,7 @@ import lombok.ToString; ...@@ -7,6 +7,7 @@ import lombok.ToString;
import javax.validation.constraints.AssertFalse; import javax.validation.constraints.AssertFalse;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.util.List;
@Data @Data
@ToString @ToString
...@@ -20,10 +21,10 @@ public class EnterpriseBussinessSupplierProjectPageBody extends BasePage { ...@@ -20,10 +21,10 @@ public class EnterpriseBussinessSupplierProjectPageBody extends BasePage {
private Integer cid; private Integer cid;
/** /**
* 企业id * 供应商企业Id
*/ */
@NotNull(message = "企业id不能为空") @NotNull(message = "企业id不能为空")
private Integer unitId; private Integer companyId;
/** /**
* 查询关键字 * 查询关键字
...@@ -32,8 +33,28 @@ public class EnterpriseBussinessSupplierProjectPageBody extends BasePage { ...@@ -32,8 +33,28 @@ public class EnterpriseBussinessSupplierProjectPageBody extends BasePage {
public boolean isVaildCid() { public boolean isVaildCid() {
return 0 == cid || 0 == unitId; return 0 == cid || 0 == companyId;
} }
/**
* 来源
*/
private List<String> sources;
/**
* 项目类型
*/
private List<String> projects;
/**
* 金额起
*/
private Double amountStart;
/**
* 金额止
*/
private Double amountEnd;
} }
package com.dsk.common.core.domain.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@ToString
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class EnterpriseBussinessVo {
/**
* 来源Id
*/
private String source_id;
/**
* 类型
*/
private String source_type;
}
package com.dsk.common.core.domain.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import javax.validation.constraints.NotNull;
@Data
@ToString
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class EnterpriseInfoLabelBody
{
/**
* 企业id
*/
@NotNull(message = "企业id不能为空")
private Integer companyId;
public boolean isVaildCid() {
return 0 == companyId;
}
}
package com.dsk.common.core.domain.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.util.Date;
import java.util.List;
@Data
@ToString
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class IndexBigBidPageBody extends BasePage
{
/**
* 开始时间
*/
private Date timeStart;
/**
* 截止时间
*/
private Date timeEnd;
/**
* 金额起 默认2亿
*/
private Double amountStart = 20000.00;
/**
* 金额止
*/
private Double amountEnd;
/**
* 省份Id
*/
private Integer provinceId;
private List<String> projects;
}
package com.dsk.common.core.domain.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.util.Date;
import java.util.List;
@Data
@ToString
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class IndexBigWinningBidsPageBody extends BasePage {
/**
* 开始时间
*/
private Date timeStart;
/**
* 截止时间
*/
private Date timeEnd;
/**
* 金额起 默认2亿
*/
private Double amountStart = 20000.00;
/**
* 金额止
*/
private Double amountEnd;
/**
* 省份Id
*/
private Integer provinceId;
private List<String> projects;
}
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
})
}
import request from "@/utils/request";
// 大项目最新中标
export function bigWinningBidsPage(data) {
return request({
url: '/index/bigWinningBidsPage',
method: 'post',
data: data
})
}
// 大项目最新招标
export function bigBidPage(data) {
return request({
url: '/index/bigBidPage',
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.
...@@ -233,6 +233,17 @@ ul, li { ...@@ -233,6 +233,17 @@ ul, li {
.el-select .el-input .el-select__caret{ .el-select .el-input .el-select__caret{
color: #232323; color: #232323;
} }
.el-cascader .el-input .el-icon-arrow-down{
color: #232323;
}
.custom-money-select .el-input .el-icon-arrow-down{
color: #232323;
font-size: 14px;
}
.custom-time-select .el-input .el-icon-arrow-down{
color: #232323;
font-size: 14px;
}
.query-box{ .query-box{
justify-content: space-between; justify-content: space-between;
} }
......
...@@ -597,17 +597,18 @@ ...@@ -597,17 +597,18 @@
float: left; float: left;
width: 16px; width: 16px;
} }
.el-input{ .el-input,.el-textarea {
width: calc(100% - 26px); width: calc(100% - 26px);
display: inline-block; display: inline-block;
} }
.el-input__inner{ .el-input__inner,.el-textarea__inner{
line-height: 16px; line-height: 16px;
height: 16px; height: 16px;
border: 0; border: 0;
padding: 0; padding: 0 0 0 8px;
text-indent: 8px; //float: left;
float: left; color: #232323;
font-size: 14px;
} }
} }
.wr_bot{ .wr_bot{
......
...@@ -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 :ref="refStr" class="custom-money-select screen-popper" id="custom-money-select">
<div :class="['input-block', isSelectOption?'rote':'']">
<div class="block" @click="isSelectOption=!isSelectOption" @mouseenter="handleMouseenter" @mouseleave="handleMouseleave">
<el-input class="custom-money-input" v-model="value" :placeholder="placeholder" readonly>
<template slot="suffix">
<span @click.stop="handleClear" :class="[isClear&&isHover?'el-icon-circle-close':'el-icon-arrow-down']"></span>
</template>
</el-input>
</div>
<div class="options-block" v-if="isSelectOption">
<div class="arrow"></div>
<div @click="handleClick(option)" :class="['option', value==option?'active':'']" :key="i" v-for="(option, i) in options">
<template v-if="option == '自定义'">
<!--<div class="number-box">-->
<!--<input type="number" v-model="startMoney" class="number-input" clearable>&nbsp;&nbsp;&nbsp;&nbsp;<input v-model="endMoney" class="number-input" type="text" clearable>&nbsp;&nbsp;万元&nbsp;&nbsp;<el-button @click.stop="handleConfirm" class="number-button" type="primary">确定</el-button>-->
<!--</div>-->
<div style="position: relative">
自定义
<div class="popper_box" style="position: absolute" v-if="value === '自定义'">
<div class="popper_wrap">
<el-input class="popper_input" type="number" clearable v-model="startMoney"></el-input>
</div>
<div class="popper_wrap">
<el-input class="popper_input" type="number" clearable v-model="endMoney"></el-input>
</div>
<div style="">
<el-button size="mini" @click.stop="cancellation">取消</el-button>
<el-button type="primary" size="mini" @click.stop="handleConfirm">确定</el-button>
</div>
</div>
</div>
</template>
<template v-else>
<span>{{option}}</span> <span v-if="value==option" class="el-icon-check"></span>
</template>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
props: {
'placeholder': {
type: String,
default: '请选择'
},
'ref-str': {
type: String,
default: `timeselect${String(Math.random(0, 100)).slice(2)}`,
},
permissions: { //文本权限相关字段
type: Array,
default: () => {},
},
powerLabel: {
type: String,
default: ''
},
moneyList: {
type: Array,
default: () => [],
}
},
computed: {
isClear() {
if(!this.isSelectOption && this.value) {
return true
}else {
return false
}
}
},
data() {
return {
value: '',
options: ['一亿以上', '5000万-1亿', '1000万-5000万', '1000万以下', '自定义'],
isSelectOption: false,
startMoney: '',
endMoney: '',
isHover: false
}
},
mounted() {
this.handleAppClick()
if(this.moneyList&&this.moneyList.length>0){
this.options = this.moneyList
}
},
destroyed() {
const app = document.getElementById('app')
app.removeEventListener('click', ()=>{}, true)
},
methods: {
// 判断是否点击的为组件内部
handleAppClick() {
const app = document.getElementById('app')
app.addEventListener('click', (e) => {
const dom = this.$refs[this.refStr]
const flag = dom && dom.contains(e.target)
// const flag = document.getElementById('custom-money-select').contains(e.target)
!flag ? this.isSelectOption = false : ''
// if(this.value == '自定义' && !this.startMoney && !this.endMoney) {
// this.value = ''
// this.$emit('input', '')
// this.$emit('handle-search')
// }
}, true)
},
// 清除
handleClear() {
if(this.isClear && this.isHover) {
this.value = ''
this.startMoney = ''
this.endMoney = ''
this.$emit('input', '')
this.$emit('handle-search')
}else {
this.isSelectOption = true
}
},
// 鼠标移入后的回调
handleMouseenter() {
this.isHover = true
},
// 鼠标离开后的回调
handleMouseleave() {
this.isHover = false
},
// 选项点击后的回调
handleClick(value) {
this.value = value
let moneyStr = ''
if(value == '自定义') {
this.value = '自定义';
}else {
this.startMoney = ''
this.endMoney = ''
this.isSelectOption = false
switch (value) {
case '10亿以上':
moneyStr = [100000]
break;
case '一亿以上':
moneyStr = [10000]
break;
case '5亿-10亿':
moneyStr = [50000, 100000]
break;
case '1亿-10亿':
moneyStr = [10000, 100000]
break;
case '1亿-5亿':
moneyStr = [10000, 50000]
break;
case '5000万-1亿':
moneyStr = [5000, 10000]
break;
case '1000万-5000万':
moneyStr = [1000, 5000]
break;
case '2000万-1亿':
moneyStr = [2000, 10000]
break;
case '400万-2000万':
moneyStr = [400, 2000]
break;
case '5000万以下':
moneyStr = [, 5000]
break;
case '1000万以下':
moneyStr = [, 1000]
break;
case '400万以下':
moneyStr = [, 400]
break;
default:
moneyStr = [, 1000]
break;
}
this.$emit('input', moneyStr)
this.$emit('handle-search')
}
},
// 自定义取消
cancellation(){
this.isSelectOption = false
this.value = ''
this.$emit('input', '')
this.$emit('handle-search')
},
// 自定义确认点击后的回调
handleConfirm() {
this.isSelectOption = false
if(!this.startMoney && !this.endMoney) {
this.value = ''
this.$emit('input', '')
}else {
if(this.endMoney && this.startMoney) {
this.value = `${this.startMoney}-${this.endMoney}万`
}else {
if(this.startMoney) {
this.value = `大于等于${this.startMoney}万`
}
if(this.endMoney) {
this.value = `小于等于${this.endMoney}万`
}
}
let moneyStr = [this.startMoney, this.endMoney]
this.$emit('input', moneyStr)
}
this.$emit('handle-search')
}
}
}
</script>
<style lang="scss">
.custom-money-select {
width: 120px;
height: 34px;
position: relative;
.input-block {
margin: 0;
width: 100%;
height: 100%;
cursor: pointer;
.block {
width: 100%;
height: 100%;
>.custom-money-input.el-input {
width: 100%;
height: 100%;
>input {
width: 100%;
height: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
border-radius: 2px;
}
}
}
.el-input__suffix {
transform: rotateZ(0);
width: 25px;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
}
&.rote {
.el-input__suffix {
transform: rotateZ(180deg);
}
}
}
.options-block {
position: absolute;
margin-top: 12px;
min-width: 120px;
font-size: 14px;
color: #666666;
background-color: #fff;
border: 1px solid #E4E7ED;
padding: 6px 0;
border-radius: 4px;
z-index: 10;
// .arrow {
// position: absolute;
// width: 0;
// height: 0;
// top: -12px;
// left: 35px;
// border: 6px solid transparent;
// border-bottom-color: #E4E7ED;
// &::after {
// position: absolute;
// display: inline-block;
// left: -4px;
// top: -2px;
// content: '';
// width: 0;
// height: 0;
// border: 4px solid transparent;
// border-bottom-color: #fff;
// z-index: 9;
// }
// }
.option {
padding: 0 24px 0 16px;
box-sizing: border-box;
width: 140px;
height: 36px;
display: flex;
justify-content: space-between;
align-items: center;
.number-box {
display: flex;
align-items: center;
>span {
margin: 0 10px;
}
.number-input {
padding: 0 24px 0 10px;
width: 100px !important;
height: 30px;
line-height: 30px;
border: none;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
border-radius: 2px;
&::-webkit-outer-spin-button,
&::-webkit-inner-spin-button {
-webkit-appearance: none;
}
&[type="number"]{
-moz-appearance: textfield;
}
}
.number-button {
padding: 0;
width: 60px;
height: 30px;
line-height: 30px;
margin-left: 10px;
}
}
>span {
display: inline-block;
}
&.active {
background-color: #F2F7FF;
color: #0381FA;
}
&:hover {
background-color: #F5F7FA;
}
}
}
.number-input {
padding: 0 24px 0 10px;
width: 60px !important;
height: 30px;
line-height: 30px;
border: none;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
width: 206px;
border: 1px solid #DCDCDC;
border-radius: 2px;
&::-webkit-outer-spin-button,
&::-webkit-inner-spin-button {
-webkit-appearance: none;
}
&[type="number"]{
-moz-appearance: textfield;
}
}
.number-button {
padding: 0;
width: 60px;
height: 30px;
line-height: 30px;
margin-left: 10px;
}
.popper_box {
position: absolute;
left: 128px;
bottom: -15px;
background: #ffffff;
width: 186px;
color: #606266;
text-indent: 0;
padding: 16px;
padding-top: 0px;
border: 1px solid #e0e0e0;
.popper_wrap {
margin-top: 16px;
display: inline-block;
.popper_input {
width: 100px;
display: inline-block;
margin: 0px 8px;
line-height: 34px;
}
.el-input__inner {
width: 100px;
}
}
input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
-webkit-appearance: none !important;
}
input[type='number'] {
-moz-appearance: textfield;
}
}
.popper_box div:last-child {
display: flex;
justify-content: center;
margin-top: 16px;
}
}
</style>
<template>
<div :ref="refStr" class="custom-time-select screen-popper" id="custom-time-select">
<div :class="['input-block', isSelectOption?'rote':'']">
<div class="block" @click="isSelectOption=!isSelectOption" @mouseenter="handleMouseenter" @mouseleave="handleMouseleave">
<el-input class="custom-time-input" v-model="value" :placeholder="placeholder" readonly>
<template slot="suffix">
<span @click.stop="handleClear" :class="[isClear&&isHover?'el-icon-circle-close':'el-icon-arrow-down']"></span>
</template>
</el-input>
</div>
<div class="options-block" v-if="isSelectOption">
<div class="arrow"></div>
<div @click="handleClick(option)" :class="['option', value==option?'active':'']" :key="i" v-for="(option, i) in options">
<template v-if="option == '自定义'">
<div style="position: relative">
自定义
<el-date-picker
ref="picker"
:default-value="defaultValue"
style="position: absolute;opacity: 0;"
v-model="pickerValue"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd"
:picker-options="pickerOptions"
@change="changePicker">
</el-date-picker>
</div>
</template>
<template v-else>
<span>{{option}}</span> <span v-if="value==option" class="el-icon-check"></span>
</template>
</div>
</div>
</div>
<div v-if="isSelectOption" class="picker-block" ref="picker-block"></div>
</div>
</template>
<script>
export default {
props: {
'placeholder': {
type: String,
default: '请选择',
},
'ref-str': {
type: String,
default: `timeselect${String(Math.random(0, 100)).slice(2)}`,
},
dateFrom: {
type: String,
default: ''
},
dateTo: {
type: String,
default: ''
},
timeList: {
type: Array,
default: () => [],
}
},
computed: {
isClear() {
if(!this.isSelectOption && this.value) {
return true
}else {
return false
}
},
pickerOptions() {
// 用计算属性
let _this = this
// 此时 this指向的就是vue实例
return {
disabledDate(time) {
if(_this.dateFrom){
return time.getTime() < new Date(_this.dateFrom.replace(/-/g, '/')).getTime() - 8.64e6;//如果没有后面的-8.64e6就是不可以选择今天的
}
if(_this.dateTo){
return time.getTime() > new Date(_this.dateTo.replace(/-/g, '/')).getTime();//如果没有后面的-8.64e7就是不可以选择今天的
}
}
}
},
},
watch: {
refStr(refStr) {
return refStr
}
},
data() {
return {
value: '',
options: ['近1年', '近2年', '近3年', '近5年', '自定义',],
isSelectOption: false,
isHover: false,
pickerValue: [],
defaultValue:new Date()
}
},
mounted() {
if(this.dateTo){
this.defaultValue = new Date(this.dateTo)
}
this.handleAppClick()
if(this.timeList&&this.timeList.length>0){
this.options = this.timeList
}
},
methods: {
// 时间格式化
formatDate(timeStr) {
let date = new Date(Number(timeStr))
let year = date.getFullYear()
let month = String(date.getMonth() + 1).padStart(2, 0)
let day = String(date.getDate()).padStart(2, 0)
return `${year}-${month}-${day}`
},
// 判断是否点击的为组件内部
handleAppClick() {
const app = document.getElementById('app')
app.addEventListener('click', (e) => {
const dom = this.$refs[this.refStr]
const flag = dom && dom.contains(e.target)
// const flag = document.getElementById('custom-time-select').contains(e.target)
!flag ? this.isSelectOption = false : ''
if(this.value == '自定义' && (!this.pickerValue || !this.pickerValue.length)) {
this.value = ''
this.$emit('input', '')
this.$emit('handle-search')
}
}, true)
},
handleMouseenter() {
this.isHover = true
},
handleMouseleave() {
this.isHover = false
},
handleClear() {
if(this.isClear && this.isHover) {
this.value = ''
this.pickerValue = []
this.$emit('input', '')
this.$emit('handle-search')
}else {
this.isSelectOption = true
}
},
handleClick(value) {
this.value = value
if(value == '自定义') {
this.value = '自定义'
this.$refs.picker && this.$refs.picker.length && this.$refs.picker[0].focus()
this.$nextTick(() => {
this.$refs['picker-block'].appendChild(this.$refs.picker[0].popperElm)
})
}else {
this.pickerValue = []
this.isSelectOption = false
let timeStr = []
let startTime = ''
let endTime = new Date()
switch (value) {
case '近三天':
startTime = new Date(endTime.getTime() - 3600 * 1000 * 24 * 3)
timeStr = [this.formatDate(startTime), this.formatDate(endTime)]
break;
case '近七天':
startTime = new Date(endTime.getTime() - 3600 * 1000 * 24 * 7)
timeStr = [this.formatDate(startTime), this.formatDate(endTime)]
break;
case '近半月':
startTime = new Date(endTime.getTime() - 3600 * 1000 * 24 * 15)
timeStr = [this.formatDate(startTime), this.formatDate(endTime)]
break;
case '近1年':
startTime = new Date().setFullYear(new Date().getFullYear() - 1)
if(this.dateTo){
startTime = new Date(this.dateTo).setFullYear(new Date(this.dateTo).getFullYear() - 1)
}
timeStr = [this.formatDate(startTime), this.formatDate(endTime)]
break;
case '近2年':
startTime = new Date().setFullYear(new Date().getFullYear() - 2)
if(this.dateTo){
startTime = new Date(this.dateTo).setFullYear(new Date(this.dateTo).getFullYear() - 2)
}
timeStr = [this.formatDate(startTime), this.formatDate(endTime)]
break;
case '近3年':
startTime = new Date().setFullYear(new Date().getFullYear() - 3)
if(this.dateTo){
startTime = new Date(this.dateTo).setFullYear(new Date(this.dateTo).getFullYear() - 3)
}
timeStr = [this.formatDate(startTime), this.formatDate(endTime)]
break;
case '近5年':
startTime = new Date().setFullYear(new Date().getFullYear() - 5)
if(this.dateTo){
startTime = new Date(this.dateTo).setFullYear(new Date(this.dateTo).getFullYear() - 5)
}
timeStr = [this.formatDate(startTime), this.formatDate(endTime)]
break;
default:
if(this.pickerValue && this.pickerValue.length) {
timeStr = this.pickerValue
}else {
timeStr = []
this.value = ''
}
break;
}
this.$emit('input', timeStr)
this.$emit('handle-search')
}
},
// 时间选择改变后的回调
changePicker(value) {
this.isSelectOption = false
if(value && value.length) {
// this.value = '自定义'
this.value = String(this.pickerValue)
this.$emit('input', this.pickerValue)
}else {
this.value = ''
this.$emit('input', '')
}
this.$emit('handle-search')
}
}
}
</script>
<style lang="scss">
.custom-time-select {
width: 120px;
height: 34px;
.input-block {
width: 100%;
height: 100%;
margin: 0;
cursor: pointer;
.block {
width: 100%;
height: 100%;
>.custom-time-input.el-input {
width: 100%;
height: 100%;
>input {
width: 100%;
height: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
border-radius: 2px;
}
}
}
.el-input__suffix {
transform: rotateZ(0);
width: 25px;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
}
&.rote {
.el-input__suffix {
transform: rotateZ(180deg);
}
}
}
.options-block {
position: absolute;
margin-top: 4px;
min-width: 120px;
font-size: 14px;
color: #666666;
background-color: #fff;
border: 1px solid #E4E7ED;
padding: 6px 0;
border-radius: 4px;
z-index: 10;
.option {
padding: 0 24px 0 16px;
box-sizing: border-box;
height: 36px;
display: flex;
justify-content: space-between;
align-items: center;
>span {
display: inline-block;
}
&.active {
background-color: #F2F7FF;
color: #0381FA;
}
&:hover {
background-color: #F5F7FA;
}
}
.active{
.el-date-editor{
left: -400px;
}
}
}
.picker-block {
position: relative;
&::after {
content:"";
display:block;
visibility:hidden;
clear:both;
}
.el-picker-panel.el-date-range-picker.el-popper {
left: -500px !important;
/*top: 205px !important;*/
}
.popper__arrow {
left: 30px !important;
}
}
}
</style>
<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-arrow-up' : 'el-icon-arrow-down'"></i></span>
<div v-show="searchState" id="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: 'combineMemberLevels', value: '', placeholder: '成员层级', options:[]},
{ type: 1, fieldName: 'businessType', value: '', placeholder: '主营业务', options:[]},
{ type: 7, fieldName: 'province', value: '',props: {multiple: true,value: 'id',expandTrigger: 'hover'}, 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:'三级公司'
},
{
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:'',
paramsData:[], //储存组件筛选的条件
}
},
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 = document.getElementById("showContent");
if(dom){
if (!dom.contains(event.target)) {
this.searchState = !this.searchState;
document.removeEventListener('click', this.handleQuery);
}
}
},
handleQuery(params){
this.paramsData=params;
let data = this.getAreaList(params || this.queryParams)
memberList(data).then(res=>{
this.isSkeleton = false
if(res.code === 200){
this.tableData = res.rows
this.tableDataTotal = res.total
}else {
this.tableData = []
}
})
},
//地区
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.paramsData.companyType=this.queryParams.companyType
this.paramsData.companyTypes=this.queryParams.companyTypes
this.handleQuery(this.paramsData);
},
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 = [], districtIds = []
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{
districtIds.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:''
districtIds.length>0?params.districtIds = districtIds:''
// provinceIds.length>0?this.queryParams.provinceIds = provinceIds:''
// cityIds.length>0?this.queryParams.cityIds = cityIds:''
// districtIds.length>0?this.queryParams.districtIds = districtIds:''
}
return params
},
sortChange({ column, prop, order }){
this.queryParams.orderName = prop
if(column.order === "ascending"){
this.queryParams.orderType = 'asc'
}else if(column.order === "descending"){
this.queryParams.orderType = 'desc'
}else {
this.queryParams.orderType=''
this.queryParams.orderName=''
}
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: #999999;
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;
}
}
}
}
::v-deep .el-table{
.has-gutter{
tr{
th:nth-last-child(2){
border-right:0;
}
td:nth-last-child(2){
border-right:0;
}
}
}
.el-table__cell.gutter{
background: #F0F3FA;
}
}
::v-deep .el-icon-arrow-down,.el-icon-arrow-up{
font-size: 14px;
color:#232323 !important;
}
}
</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: 'province', value: '',props: {multiple: true,value: 'id',expandTrigger: 'hover'}, 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 = this.getAreaList(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;
},
getAreaList(params){
if(params.province&&params.province.length>0){
let arr = this.$children[0].$refs.cascader[0].getCheckedNodes()
let provinceIds = [], cityIds = [], districtIds = []
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{
districtIds.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:''
districtIds.length>0?params.districtIds = districtIds:''
}
return params
},
}
}
</script>
<style lang="scss" scoped>
.performance{
background: #ffffff;
border-radius: 4px;
padding: 16px;
.headForm{
margin-bottom: 14px;
.common-title{
margin-right: 24px;
}
}
::v-deep .el-table{
.has-gutter{
tr{
th:nth-last-child(2){
border-right:0;
}
td:nth-last-child(2){
border-right:0;
}
}
}
.el-table__cell.gutter{
background: #F0F3FA;
}
}
}
</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: 20
},
forData: [
{label: '资质名称', prop: 'qualificationName'},
{label: '拥有该资质成员', prop: 'companyCount', slot: true},
],
formData: [
{ type: 1, fieldName: 'qualificationType', value: '', placeholder: '筛选', options:[],width:260},
],
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.isSkeleton = false
if(res.code === 200){
this.tableData = res.rows
this.tableDataTotal = res.total
}else {
this.tableData = []
}
})
},
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;
}
}
::v-deep .el-table{
.has-gutter{
tr{
th:nth-last-child(2){
border-right:0;
}
td:nth-last-child(2){
border-right:0;
}
}
}
.el-table__cell.gutter{
background: #F0F3FA;
}
}
}
</style>
<template>
<div class="client-details">
<el-drawer
:visible.sync="drawer"
size="40%"
custom-class="client-drawer"
:with-header="false"
@closed="cancel">
<skeleton style="margin-left:16px;" v-if="isSkeleton"></skeleton>
<tables
v-if="!isSkeleton"
: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">
<div @click="cancel">
<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>
<!--<div v-else v-html="scope.row.companyName || '&#45;&#45;'"></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,
isSkeleton:true,
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.isSkeleton = true
let param = params?params:this.queryParams
let res = await memberCertificateList(param)
this.isSkeleton = 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,45 @@ export default { ...@@ -120,33 +139,45 @@ 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 '5亿-10亿':
moneyStr = [50000, 100000]
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 +189,13 @@ export default { ...@@ -158,6 +189,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 +309,7 @@ export default { ...@@ -271,7 +309,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 +332,6 @@ export default { ...@@ -294,8 +332,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 +396,47 @@ export default { ...@@ -360,5 +396,47 @@ export default {
line-height: 30px; line-height: 30px;
margin-left: 10px; margin-left: 10px;
} }
.popper_box {
position: absolute;
left: 125px;
bottom: -15px;
background: #ffffff;
width: 186px;
color: #606266;
text-indent: 0;
padding: 16px;
padding-top: 0px;
border: 1px solid #E4E7ED;
.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 {
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
:style="form.width?'width:'+form.width+'px':'max-width: 110px'" :style="form.width?'width:'+form.width+'px':'max-width: 110px'"
: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>
<!-- 年月日 --> <!-- 年月日 -->
...@@ -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"/>
</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,25 @@ export default { ...@@ -173,22 +176,25 @@ 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;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
} }
::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{
...@@ -210,12 +216,12 @@ export default { ...@@ -210,12 +216,12 @@ export default {
display: flex; display: flex;
border-radius: 2px 0px 0px 2px; border-radius: 2px 0px 0px 2px;
border: 1px solid #D9D9D9; border: 1px solid #D9D9D9;
line-height: 32px; line-height: 34px;
height: 32px; height: 34px;
span { span {
width: 60px; width: 60px;
height: 30px; height: 32px;
line-height: 28px; line-height: 32px;
font-size: 14px; font-size: 14px;
background: #F5F5F5; background: #F5F5F5;
text-align: center; text-align: center;
...@@ -237,11 +243,13 @@ export default { ...@@ -237,11 +243,13 @@ export default {
} }
::v-deep .el-input__inner { ::v-deep .el-input__inner {
border: 0; border: 0;
line-height: 30px; line-height: 32px;
height: 30px; height: 32px;
position: absolute; position: absolute;
top: 0; top: 0;
padding-right: 32px; padding-right: 22px;
font-size: 12px;
padding-left: 8px;
} }
} }
.fromTime{ .fromTime{
......
...@@ -59,7 +59,16 @@ export default { ...@@ -59,7 +59,16 @@ export default {
handleSearch(){ handleSearch(){
let params = this.formParams() let params = this.formParams()
params.pageNum = 1 params.pageNum = 1
this.queryParams.pageNum = 1 this.queryParams.pageNum = 1;
if(params.companyTypes){
if(params.companyTypes.length === 0){
delete params.companyTypes
}
}
if(!params.companyType){
delete params.companyType
}
this.handleQuery(params) this.handleQuery(params)
}, },
//分页 //分页
......
...@@ -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()
......
<template> <template>
<div class="app-container home"> <div class="app-container home">
<el-row :gutter="20"> <!--经理视角-->
<el-col :span="18"> <div class="manage" v-if="user === 1">
<div class="content-left"> <el-row>
<el-col :span="16">
<div class="task-wrap"> <div class="task-wrap">
<div class="item"> <div class="item">
<img class="left" src="@/assets/images/index/icon1.png"/> <img class="icon-img" src="@/assets/images/index/icon1.png"/>
<div class="right"> <p class="text">项目管理</p>
<p class="title">即将开标项目</p>
<p class="number">36</p>
<p class="compare">较上月 <span class="up">+3<img src="@/assets/images/index/up.png"/></span></p>
</div>
</div> </div>
<div class="item"> <div class="item">
<img class="left" src="@/assets/images/index/icon2.png"/> <img class="icon-img" src="@/assets/images/index/icon2.png"/>
<div class="right"> <p class="text">客户管理</p>
<p class="title">重点关注项目</p>
<p class="number">36</p>
<p class="compare">较上月 <span class="up">+3<img src="@/assets/images/index/up.png"/></span></p>
</div>
</div> </div>
<div class="item"> <div class="item">
<img class="left" src="@/assets/images/index/icon3.png"/> <img class="icon-img" src="@/assets/images/index/icon3.png"/>
<div class="right"> <p class="text">宏观经济</p>
<p class="title">重点关注客户</p>
<p class="number">36</p>
<p class="compare">较上月 <span class="down">-3<img src="@/assets/images/index/down.png"/></span></p>
</div>
</div> </div>
<div class="item"> <div class="item">
<img class="left" src="@/assets/images/index/icon4.png"/> <img class="icon-img" src="@/assets/images/index/icon4.png"/>
<div class="right"> <p class="text">集团户</p>
<p class="title">储备合作客户</p>
<p class="number">36</p>
<p class="compare">较上月 <span class="up">+3<img src="@/assets/images/index/up.png"/></span></p>
</div>
</div> </div>
<div class="item add"> <div class="item">
<span class="yd"><i></i><i></i><i></i><i></i><i></i><i></i></span> <img class="icon-img" src="@/assets/images/index/icon5.png"/>
<div class="btn"><i class="el-icon-plus"></i>新建待办任务</div> <p class="text">查城投平台</p>
</div>
<div class="item">
<img class="icon-img" src="@/assets/images/index/icon6.png"/>
<p class="text">商机雷达</p>
</div> </div>
</div> </div>
<!--经理视角--> </el-col>
<div v-if="user === 1" class="content-wrap"> <el-col :span="8">
<el-col :span="12"> <div class="user" @click="handleChange">
<div class="record"> <h3>刘毅<span>总经理</span></h3>
<div class="flex-box query-box"> <p>您好,祝您工作顺利每一天</p>
<div class="flex-box query-params">
<span class="common-title">跟进记录</span>
</div>
<div class="flex-box query-ability">
<div class="select-popper">
<div class="area">{{area}}<i class="sjx"></i></div>
<el-select v-model="area" class="select-multiple" placeholder="请选择">
<el-option v-for="(item,index) in areaList" :key="index" :label="item.name" :value="item.name"></el-option>
</el-select>
</div>
<div class="select-popper">
<div class="month">{{date}}<i class="sjx"></i></div>
<el-select v-model="date" class="select-multiple" placeholder="请选择">
<el-option v-for="(item,index) in dateList" :key="index" :label="item" :value="item"></el-option>
</el-select>
</div>
</div>
</div>
<div class="list">
<div class="item" v-for="(item,index) in gjjlData" :key="index">
<h3>{{item.title}}</h3>
<p>
<span>跟进人:{{item.user}}</span>
<span>关联企业:{{item.name}}</span>
</p>
</div>
</div>
<p class="more">更多跟进记录 ></p>
</div>
</el-col>
<el-col :span="12">
<div class="ranking">
<div class="flex-box query-box">
<div class="flex-box query-params">
<span class="common-title">业绩排名</span>
</div>
<div class="flex-box query-ability">
<div class="select-popper">
<div class="area">{{area}}<i class="sjx"></i></div>
<el-select v-model="area" class="select-multiple" placeholder="请选择">
<el-option v-for="(item,index) in areaList" :key="index" :label="item.name" :value="item.name"></el-option>
</el-select>
</div>
<div class="select-popper">
<div class="month">{{date}}<i class="sjx"></i></div>
<el-select v-model="date" class="select-multiple" placeholder="请选择">
<el-option v-for="(item,index) in dateList" :key="index" :label="item" :value="item"></el-option>
</el-select>
</div>
</div>
</div>
<div class="main">
<div class="amount">
<p>
<span>实际已完成(万元)</span>
<span>产值目标(万元)</span>
</p>
<p>
<span class="money">359,800.00</span>
<span class="money">359,800.00</span>
</p>
<el-progress class="progress1" :text-inside="true" :stroke-width="14" :percentage="40"></el-progress>
<el-progress class="progress2" :text-inside="true" :stroke-width="14" :percentage="70"></el-progress>
</div>
<div style="background: #ffffff;margin: 0 12px 12px 12px;">
<div id="pm-echarts" style="height: 400px;"></div>
</div>
</div>
</div>
</el-col>
</div> </div>
<div v-if="user === 1" class="analysis"> </el-col>
<div class="flex-box query-box"> </el-row>
<div class="flex-box query-params"> <div class="tips">注:数据来源大司空建筑大数据平台,统计范围为全国公开的施工内土地交易项目,未公开的不含在内</div>
<span class="common-title">经营分析</span> <div class="content content_wap1">
</div> <div class="flex-box query-box">
<div class="flex-box query-ability"> <div class="flex-box query-params">
<div class="tabs"> <span class="common-title">集团中标统计</span>
<!--<div class="label" v-for="(item,index) in typeList" :class="typeIndex === index ? 'color':''" @click="handleClick(index)">{{item.name}}</div>--> </div>
</div> </div>
<div class="select-popper"> <el-row>
<div class="area">{{area}}<i class="sjx"></i></div> <el-col :span="14">
<el-select v-model="area" class="select-multiple" placeholder="请选择"> <div id="zbtj-echarts" style="height: 300px;"></div>
<el-option v-for="(item,index) in areaList" :key="index" :label="item.name" :value="item.name"></el-option> </el-col>
<el-col :span="10">
<div class="search">
<el-form ref="queryForm" :model="queryParams" :inline="true" size="small">
<el-form-item prop="address">
<el-select v-model="queryParams.address" placeholder="项目地区" style="width: 150px;">
<el-option v-for="(item,index) in addressList" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select> </el-select>
</div> </el-form-item>
</div> <el-form-item prop="type">
<el-select v-model="queryParams.type" multiple collapse-tags clearable placeholder="项目类型" :class="queryParams.type.length > 1 ? 'selectTag' : ''" style="width: 170px;">
<el-option v-for="(item,index) in typeList" :key="index" :label="item" :value="item"></el-option>
</el-select>
</el-form-item>
<el-form-item prop="time">
<custom-time-select
:timeList="timeList"
placeholder="中标日期"
@handle-search="changeSelect"/>
</el-form-item>
</el-form>
</div> </div>
<div> <div class="box-right">
<div id="fx-echarts" style="height: 280px;"></div> <el-table
:data="jtList"
border
max-height="250"
fit
highlight-current-row
>
<el-table-column prop="name" label="集团名称" width="120"/>
<el-table-column prop="count" label="中标数量(个)" align="right" sortable/>
<el-table-column prop="amount" label="中标金额(万元)" align="right" sortable/>
</el-table>
</div> </div>
</el-col>
</el-row>
</div>
<div class="content content_wap2">
<div class="flex-box query-box">
<div class="flex-box query-params">
<span class="common-title">大项目中标排行榜</span>
</div> </div>
</div>
<!--员工视角--> <el-row>
<div v-if="user === 2" class="content-db"> <el-col :span="14">
<div class="flex-box query-box"> <div id="zbph-echarts" style="height: 500px;"></div>
<div class="flex-box query-params"> </el-col>
<span class="common-title">待办</span> <el-col :span="10">
</div> <div class="search">
<div class="flex-box query-ability"><span>9</span>全部待办 ></div> <el-form ref="queryForm" :model="queryParams" :inline="true" size="small">
<el-form-item prop="money">
<custom-money-select
:moneyList="moneyList"
v-model="queryParams.money"
placeholder="中标金额"
@handle-search="changeSelect" />
</el-form-item>
<el-form-item prop="address">
<el-select v-model="queryParams.address" placeholder="项目地区" style="width: 150px;">
<el-option v-for="(item,index) in addressList" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item prop="type">
<el-select v-model="queryParams.type" multiple collapse-tags clearable placeholder="项目类型" :class="queryParams.type.length > 1 ? 'selectTag' : ''" style="width: 170px;">
<el-option v-for="(item,index) in typeList" :key="index" :label="item" :value="item"></el-option>
</el-select>
</el-form-item>
<el-form-item prop="time">
<custom-time-select
:timeList="timeList"
v-model="queryParams.time"
placeholder="中标日期"
@handle-search="changeSelect"/>
</el-form-item>
</el-form>
</div> </div>
<div class="list"> <div class="box-right">
<div class="item" v-for="(item,index) in gjjlData" :key="index" v-if='index < 3'> <el-table
<h3>{{item.title}}</h3> :data="jtList"
<p> border
<span>拜访时间:{{item.time}}</span> max-height="400"
<span>关联企业:{{item.name}}</span> fit
</p> highlight-current-row
<div class="btn">写跟进<i class="el-icon-edit"></i></div> >
</div> <el-table-column prop="name" label="企业名称" width="120"/>
<el-table-column prop="count" label="中标数量(个)" align="right" sortable/>
<el-table-column prop="amount" label="中标金额(万元)" align="right" sortable/>
</el-table>
</div> </div>
</div> </el-col>
<div v-if="user === 2" class="trends"> </el-row>
<el-tabs v-model="activeName" @tab-click="handleClickTab"> </div>
<el-tab-pane label="甲方舆情" name="first"> <div class="content_wap3">
<div class="main-box"> <el-tabs v-model="activeName" @tab-click="handleClickTab">
<el-timeline> <el-tab-pane label="大项目最新中标" name="first">
<el-timeline-item <div class="list">
v-for="(item, index) in trendsList" <div class="item" v-for="(item,index) in projectList" :key="index">
:key="index" <p class="list-title"><router-link :to="`/biddetail/${item.id}`" tag="a" class="a-link" v-if="item.id" v-html="item.projectName"></router-link></p>
icon="el-icon-time"> <div class="list-content">
<div class="time">{{item.time}}<span class="company">{{item.name}}</span></div> <p class="list-content-text">
<div class="cont">{{item.main}}</div> <span>中标企业:</span>
</el-timeline-item> <span>{{item.companyName || '--'}}</span>
</el-timeline> </p>
</div> <p class="list-content-text">
<!--<div class="check">全部甲方舆情 ></div>--> <span>中标金额:</span>
</el-tab-pane> <span>{{item.amount}}万元</span>
<el-tab-pane label="监控动态" name="second"> </p>
<div class="main-box"> <p class="list-content-text">
<el-timeline> <span>中标日期:</span>
<el-timeline-item <span>{{item.winBidTime || '--'}}</span>
v-for="(item, index) in trendsList" </p>
:key="index" <p class="list-content-text">
icon="el-icon-time"> <span>招标人:</span>
<div class="time">{{item.time}}<span class="company">{{item.name}}</span></div> <span>{{item.projectUnit || '--'}}</span>
<div class="cont">{{item.main}}</div> </p>
</el-timeline-item>
</el-timeline>
</div> </div>
<!--<div class="check">全部监控动态 ></div>-->
</el-tab-pane>
</el-tabs>
</div>
</div>
</el-col>
<el-col :span="6">
<div class="content-right">
<div class="user" @click="handleChange">
<h3 v-if="user === 1">刘毅<span>总经理</span></h3>
<h3 v-if="user === 2">李婷婷<span>营销员</span></h3>
<p>您好,祝您工作顺利每一天</p>
</div>
<div class="search">
<span class="common-title">快捷搜索</span>
<el-input placeholder="找客户/找项目/找甲方">
<i slot="prefix" class="el-icon-search"></i>
</el-input>
<span class="common-title">储备项目类</span>
<div class="list" style="margin-top: 8px;">
<div class="item">
<img src="@/assets/images/index/cb_icon1.png"/>
<p>EPC项目</p>
</div>
<div class="item">
<img src="@/assets/images/index/cb_icon2.png"/>
<p>投资项目</p>
</div>
<div class="item">
<img src="@/assets/images/index/cb_icon3.png"/>
<p>房建项目</p>
</div> </div>
</div> </div>
<div class="list"> <div class="pagination-box" v-if="totalCount>queryParams2.pageSize">
<div class="item"> <el-pagination background :current-page="queryParams2.pageNum" :page-size="queryParams2.pageSize" :total="totalCount" layout="prev, pager, next, jumper" @current-change="handleCurrentChange" @size-change="handleSizeChange" />
<img src="@/assets/images/index/cb_icon4.png"/>
<p>电力项目</p>
</div>
<div class="item">
<img src="@/assets/images/index/cb_icon5.png"/>
<p>市政项目</p>
</div>
<div class="item">
<img src="@/assets/images/index/cb_icon6.png"/>
<p>水利项目</p>
</div>
</div> </div>
</div> </el-tab-pane>
<div class="zbgg" v-if="user === 1"> <el-tab-pane label="大项目最新招标" name="second">
<span class="common-title">中标公告</span>
<div class="list"> <div class="list">
<div class="item"> <div class="item" v-for="(item,index) in zbList" :key="index">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3> <p class="list-title"><router-link :to="`/biddetail/${item.bid}`" tag="a" class="a-link" v-if="item.bid" v-html="item.projectName"></router-link></p>
<p> <div class="list-content">
<span>中标金额:4754.34</span> <p class="list-content-text">
<span>中标单位:中铁十二局集团</span> <span>总投资:</span>
</p> <span>{{item.projectAmount}}万元</span>
</p>
<p class="list-content-text">
<span>招标人:</span>
<span>{{item.tenderee || '--'}}</span>
</p>
<p class="list-content-text">
<span>发布日期:</span>
<span>{{item.issueTime || '--'}}</span>
</p>
</div>
</div> </div>
</div>
<div class="pagination-box" v-if="zbTableTotal>queryParams3.pageSize">
<el-pagination background :current-page="queryParams3.pageNum" :page-size="queryParams3.pageSize" :total="zbTableTotal" layout="prev, pager, next, jumper" @current-change="handleCurrentChange" @size-change="handleSizeChange" />
</div>
</el-tab-pane>
</el-tabs>
</div>
</div>
<!--员工视角-->
<div class="staff" v-if="user === 2">
<el-row :gutter="20">
<el-col :span="18">
<div class="content-left">
<div class="task-wrap">
<div class="item"> <div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3> <img class="left" src="@/assets/images/index/icon1.png"/>
<p> <div class="right">
<span>中标金额:4754.34</span> <p class="title">即将开标项目</p>
<span>中标单位:中铁十二局集团</span> <p class="number">36</p>
</p> <p class="compare">较上月 <span class="up">+3<img src="@/assets/images/index/up.png"/></span></p>
</div>
</div> </div>
<div class="item"> <div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3> <img class="left" src="@/assets/images/index/icon2.png"/>
<p> <div class="right">
<span>中标金额:4754.34</span> <p class="title">重点关注项目</p>
<span>中标单位:中铁十二局集团</span> <p class="number">36</p>
</p> <p class="compare">较上月 <span class="up">+3<img src="@/assets/images/index/up.png"/></span></p>
</div>
</div> </div>
<div class="item"> <div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3> <img class="left" src="@/assets/images/index/icon3.png"/>
<p> <div class="right">
<span>中标金额:4754.34</span> <p class="title">重点关注客户</p>
<span>中标单位:中铁十二局集团</span> <p class="number">36</p>
</p> <p class="compare">较上月 <span class="down">-3<img src="@/assets/images/index/down.png"/></span></p>
</div>
</div> </div>
<div class="item"> <div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3> <img class="left" src="@/assets/images/index/icon4.png"/>
<p> <div class="right">
<span>中标金额:4754.34</span> <p class="title">储备合作客户</p>
<span>中标单位:中铁十二局集团</span> <p class="number">36</p>
</p> <p class="compare">较上月 <span class="up">+3<img src="@/assets/images/index/up.png"/></span></p>
</div>
</div> </div>
<div class="item"> <div class="item add">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3> <span class="yd"><i></i><i></i><i></i><i></i><i></i><i></i></span>
<p> <div class="btn"><i class="el-icon-plus"></i>新建待办任务</div>
<span>中标金额:4754.34</span>
<span>中标单位:中铁十二局集团</span>
</p>
</div> </div>
<div class="item"> </div>
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3> <div class="content-db">
<p> <div class="flex-box query-box">
<span>中标金额:4754.34</span> <div class="flex-box query-params">
<span>中标单位:中铁十二局集团</span> <span class="common-title">待办</span>
</p> </div>
<div class="flex-box query-ability"><span>9</span>全部待办 ></div>
</div> </div>
<div class="item"> <div class="list">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3> <div class="item" v-for="(item,index) in gjjlData" :key="index" v-if='index < 3'>
<p> <h3>{{item.title}}</h3>
<span>中标金额:4754.34</span> <p>
<span>中标单位:中铁十二局集团</span> <span>拜访时间:{{item.time}}</span>
</p> <span>关联企业:{{item.name}}</span>
</p>
<div class="btn">写跟进<i class="el-icon-edit"></i></div>
</div>
</div> </div>
</div> </div>
<div class="trends">
<el-tabs v-model="activeName" @tab-click="handleClickTab1">
<el-tab-pane label="甲方舆情" name="first">
<div class="main-box">
<el-timeline>
<el-timeline-item
v-for="(item, index) in trendsList"
:key="index"
icon="el-icon-time">
<div class="time">{{item.time}}<span class="company">{{item.name}}</span></div>
<div class="cont">{{item.main}}</div>
</el-timeline-item>
</el-timeline>
</div>
<!--<div class="check">全部甲方舆情 ></div>-->
</el-tab-pane>
<el-tab-pane label="监控动态" name="second">
<div class="main-box">
<el-timeline>
<el-timeline-item
v-for="(item, index) in trendsList"
:key="index"
icon="el-icon-time">
<div class="time">{{item.time}}<span class="company">{{item.name}}</span></div>
<div class="cont">{{item.main}}</div>
</el-timeline-item>
</el-timeline>
</div>
<!--<div class="check">全部监控动态 ></div>-->
</el-tab-pane>
</el-tabs>
</div>
</div> </div>
<div v-if="user === 2" class="zbhxr"> </el-col>
<span class="common-title">竞争对手中标候选人公告</span> <el-col :span="6">
<div class="list"> <div class="content-right">
<div class="item"> <div class="user" @click="handleChange">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3> <h3>李婷婷<span>营销员</span></h3>
<p> <p>您好,祝您工作顺利每一天</p>
<span>中标金额:4754.34</span> </div>
</p> <div class="search">
</div> <span class="common-title">快捷搜索</span>
<div class="item"> <el-input placeholder="找客户/找项目/找甲方">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3> <i slot="prefix" class="el-icon-search"></i>
<p> </el-input>
<span>中标金额:4754.34</span> <span class="common-title">储备项目类</span>
</p> <div class="list" style="margin-top: 8px;">
</div> <div class="item">
<div class="item"> <img src="@/assets/images/index/cb_icon1.png"/>
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3> <p>EPC项目</p>
<p> </div>
<span>中标金额:4754.34</span> <div class="item">
</p> <img src="@/assets/images/index/cb_icon2.png"/>
</div> <p>投资项目</p>
<div class="item"> </div>
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3> <div class="item">
<p> <img src="@/assets/images/index/cb_icon3.png"/>
<span>中标金额:4754.34</span> <p>房建项目</p>
</p> </div>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
</p>
</div> </div>
<div class="item"> <div class="list">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3> <div class="item">
<p> <img src="@/assets/images/index/cb_icon4.png"/>
<span>中标金额:4754.34</span> <p>电力项目</p>
</p> </div>
<div class="item">
<img src="@/assets/images/index/cb_icon5.png"/>
<p>市政项目</p>
</div>
<div class="item">
<img src="@/assets/images/index/cb_icon6.png"/>
<p>水利项目</p>
</div>
</div> </div>
<div class="item"> </div>
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3> <div class="zbhxr">
<p> <span class="common-title">竞争对手中标候选人公告</span>
<span>中标金额:4754.34</span> <div class="list">
</p> <div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
</p>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </el-col>
</el-col> </el-row>
</el-row> </div>
</div> </div>
</template> </template>
<script> <script>
import * as echarts from 'echarts'; import * as echarts from 'echarts';
import dataRegion from '@/assets/json/dataRegion'
import "@/assets/styles/public.css"; import "@/assets/styles/public.css";
import CustomTimeSelect from './component/CustomTimeSelect'
import CustomMoneySelect from './component/CustomMoneySelect'
import { bigWinningBidsPage,bigBidPage } from '@/api/index'
export default { export default {
name: "Index", name: "Index",
components: {
CustomTimeSelect,CustomMoneySelect,
},
data() { data() {
return { return {
// 版本号 // 版本号
version: "3.8.5", version: "3.8.5",
typeList:[
{name:'待成交项目数'},
{name:'待成交总金额'},
{name:'成交项目金额'},
{name:'成交项目总数'},
{name:'储备项目总数'},
{name:'储备项目总金额'},
],
typeIndex:0,
jyfxData:['1月','2月','3月','4月','5月','6月'],
jyfxData1:[
{
dcjxm:'103',
dcjzje:'123',
cjxmje:'153',
cjxmzs:'113',
cbxmzs:'93',
cbxmzje:'193',
},
{
dcjxm:'256',
dcjzje:'223',
cjxmje:'113',
cjxmzs:'163',
cbxmzs:'193',
cbxmzje:'123',
},
{
dcjxm:'103',
dcjzje:'123',
cjxmje:'153',
cjxmzs:'113',
cbxmzs:'93',
cbxmzje:'193',
},
{
dcjxm:'256',
dcjzje:'223',
cjxmje:'113',
cjxmzs:'163',
cbxmzs:'193',
cbxmzje:'123',
},
{
dcjxm:'103',
dcjzje:'123',
cjxmje:'153',
cjxmzs:'113',
cbxmzs:'93',
cbxmzje:'193',
},
{
dcjxm:'256',
dcjzje:'223',
cjxmje:'113',
cjxmzs:'163',
cbxmzs:'193',
cbxmzje:'123',
},
],
gjjlData:[ gjjlData:[
{ {
title:'今天拜访了重庆交通局杨科长,洽谈比较愉快,预计下月有项目招标,希望能有机会合作。', title:'今天拜访了重庆交通局杨科长,洽谈比较愉快,预计下月有项目招标,希望能有机会合作。',
...@@ -481,30 +468,55 @@ export default { ...@@ -481,30 +468,55 @@ export default {
], ],
pmData:[ pmData:[
{ {
name:'朱博', name:'中治建工集团有限公司',
value:334, value:334,
value1:164, value1:164,
}, },
{ {
name:'陈伟', name:'中机中联工程有限公司',
value:230, value:230,
value1:130, value1:130,
}, },
{ {
name:'张天翼', name:'中铁五局集团第六公司',
value:156, value:156,
value1:150, value1:150,
}, },
{ {
name:'李晨旭', name:'中铁长江交通设计公司',
value:112, value:112,
value1:130, value1:130,
}, },
{ {
name:'徐阳', name:'重庆设计院有限公公司',
value:110, value:110,
value1:90, value1:90,
}, },
{
name:'中铁五局集团第六公司',
value:100,
value1:91,
},
{
name:'中铁五局集团第六公司',
value:99,
value1:102,
},
{
name:'重庆设计院有限公公司',
value:80,
value1:90,
},
{
name:'中铁五局集团第六公司',
value:100,
value1:91,
},
{
name:'中铁五局集团第六公司',
value:99,
value1:102,
},
], ],
rankIconsSize:'24', rankIconsSize:'24',
rankIcons:[// 排序图标 rankIcons:[// 排序图标
...@@ -513,6 +525,11 @@ export default { ...@@ -513,6 +525,11 @@ export default {
require('@/assets/images/index/3.png'), require('@/assets/images/index/3.png'),
require('@/assets/images/index/4.png'), require('@/assets/images/index/4.png'),
require('@/assets/images/index/5.png'), require('@/assets/images/index/5.png'),
require('@/assets/images/index/6.png'),
require('@/assets/images/index/7.png'),
require('@/assets/images/index/8.png'),
require('@/assets/images/index/9.png'),
require('@/assets/images/index/10.png'),
], ],
user:1, user:1,
activeName:'first', activeName:'first',
...@@ -558,296 +575,254 @@ export default { ...@@ -558,296 +575,254 @@ export default {
main:'发布招标公告 重庆轨道交通环线鹅公岩轨道专用桥增设防船撞设施项目,项目地区是重庆市-江北区,项目类型为工程建设。' main:'发布招标公告 重庆轨道交通环线鹅公岩轨道专用桥增设防船撞设施项目,项目地区是重庆市-江北区,项目类型为工程建设。'
}, },
], ],
area:'西南地区', jtList:[
areaList:[ {
name:'中交集团',
count:'24534',
amount:'23011'
},
{
name:'中建集团',
count:'11534',
amount:'22331'
},
{ {
name:'西南地区' name:'中冶集团',
count:'15534',
amount:'20231'
}, },
{ {
name:'华中地区' name:'中国铁路',
count:'6534',
amount:'11231'
}, },
{ {
name:'华南地区' name:'中国水利',
count:'9534',
amount:'4231'
}, },
{ {
name:'华东地区' name:'中建集团',
count:'14534',
amount:'23231'
}, },
{ {
name:'华北地区' name:'中建集团',
count:'24534',
amount:'15231'
}, },
{ {
name:'东北地区' name:'中国水利',
count:'2334',
amount:'5231'
}, },
{ {
name:'西北地区' name:'中建集团',
count:'2534',
amount:'8231'
},
{
name:'中交集团',
count:'2334',
amount:'9231'
}, },
], ],
date:'不限', addressList:[],
dateList:['不限','今日','昨日','近三天','近七天'] typeList:['施工类项目','施工类项目1','施工类项目2','施工类项目3','施工类项目4'],
queryParams:{
address:'',
type:[],
money:'',
time:'',
},
queryParams1:{
address:'',
type:[],
money:'',
time:'',
},
queryParams2:{
provinceId:'',
projects:[],
amount:'',
time:'',
pageNum:1,
pageSize:10
},
queryParams3:{
provinceId:'',
projects:[],
amount:'',
time:'',
pageNum:1,
pageSize:10
},
timeList: ['近三天', '近七天', '近半月', '自定义'],
moneyList: ['2亿以上', '5亿以上', '10亿以上', '自定义'],
projectList:[],
zbList:[],
totalCount:0,
zbTableTotal:0,
}; };
}, },
created() { created() {
this.dataRegion()
this.getBigWinningBidsPage()
if(this.user === 1){ if(this.user === 1){
this.$nextTick(()=>{ this.$nextTick(()=>{
this.initChart() this.initChart(this.jtList)
this.initChart1() this.initChart1()
}) })
} }
}, },
methods: { methods: {
handleClick(index){ getBigWinningBidsPage(){
this.typeIndex=index; let params={}
bigWinningBidsPage(this.queryParams2).then(res=>{
console.log(res)
if(res.code == 200){
this.projectList=res.rows;
this.totalCount=res.total;
}
})
}, },
initChart() { getBigBidPage(){
let myChart = echarts.init(document.getElementById("fx-echarts")) let params={}
let option ={ bigBidPage(this.queryParams3).then(res=>{
legend: { console.log(res)
x:'right', if(res.code == 200){
padding:[3,120,0,0], this.zbList=res.rows;
itemHeight:8, this.zbTableTotal=res.total;
itemWidth:16, }
}, })
tooltip: { },
trigger: 'axis', //地区
axisPointer: { async dataRegion() {
type: 'line', var str = [];
label: { for (let x = 0; x < 3; x++) {
backgroundColor: '#FFFFFF' 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": []
});
} }
}, }
xAxis: { }
type: 'category', this.addressList = str;
boundaryGap: false, },
data: this.jyfxData, initChart(data) {
}, this.$nextTick(()=>{
yAxis: { let myChart = echarts.init(document.getElementById("zbtj-echarts"))
type: 'value', let option ={
}, tooltip: {
grid: { trigger: 'axis',
top:40, axisPointer: {
left:30, type: 'cross'
right:10, }
bottom:20,
},
// dcjxm:'256',
// dcjzje:'223',
// cjxmje:'113',
// cjxmzs:'163',
// cbxmzs:'193',
// cbxmzje:'123',
series: [
{
data: this.jyfxData1.map(item => item.dcjxm),
name:'待成交项目数',
type: 'line',
smooth: true,
emphasis: {
disabled: true,
focus: 'none'
},
//设置折线颜色和粗细
lineStyle: {
width: 2,
color: "#81D4BC",
},
itemStyle:{
color: "#81D4BC",
},
//设置面积区域为渐变效果
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [{
offset: 0, color: 'rgba(189, 249, 232, 1)'
}, {
offset: 1, color: 'rgba(189, 249, 232, 0)'
} ],
global: false
}
},
},
{
data: this.jyfxData1.map(item => item.dcjzje),
name:'待成交总金额',
type: 'line',
smooth: true,
emphasis: {
disabled: true,
focus: 'none'
},
//设置折线颜色和粗细
lineStyle: {
width: 2,
color: "#9EE474",
},
itemStyle:{
color: "#9EE474",
},
//设置面积区域为渐变效果
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [{
offset: 0, color: 'rgba(208, 250, 183, 1)'
}, {
offset: 1, color: 'rgba(208, 250, 183, 0)'
} ],
global: false
}
},
}, },
{ xAxis: {
data: this.jyfxData1.map(item => item.cjxmje), type: 'category',
name:'成交项目金额', axisLabel: { //坐标轴刻度标签的相关设置
type: 'line', margin: 15, //刻度标签与轴线之间的距离
smooth: true, color:"#666666"
emphasis: {
disabled: true,
focus: 'none'
},
//设置折线颜色和粗细
lineStyle: {
width: 2,
color: "#E1B3FF",
}, },
itemStyle:{ axisTick: false, //坐标轴刻度
color: "#E1B3FF", axisPointer: {
}, type: 'shadow'
//设置面积区域为渐变效果
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [{
offset: 0, color: 'rgba(233, 200, 255, 1)'
}, {
offset: 1, color: 'rgba(233, 200, 255, 0)'
} ],
global: false
}
}, },
data: data.map(item => item.name),
}, },
{ yAxis: [
data: this.jyfxData1.map(item => item.cjxmzs), {
name:'成交项目总数', type: 'value',
type: 'line', axisLabel: { //坐标轴刻度标签的相关设置
smooth: true, color:"#666666"
emphasis: { },
disabled: true, name: '单位:个',
focus: 'none' nameLocation: 'start',
}, nameTextStyle: {
//设置折线颜色和粗细 padding: [0, 0, 0, -60], // 四个数字分别为上右下左与原位置距离
lineStyle: { color: '#666666',
width: 2,
color: "#ADC0FF",
},
itemStyle:{
color: "#ADC0FF",
},
//设置面积区域为渐变效果
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [{
offset: 0, color: 'rgba(173, 192, 255, 1)'
}, {
offset: 1, color: 'rgba(173, 192, 255, 0)'
} ],
global: false
} }
}, },
}, {
{ type: 'value',
data: this.jyfxData1.map(item => item.cbxmzs), axisLabel: { //坐标轴刻度标签的相关设置
name:'储备项目总数', color:"#666666"
type: 'line', },
smooth: true, name: '单位:万元',
emphasis: { nameLocation: 'start',
disabled: true, nameTextStyle: {
focus: 'none' padding: [0, 0, 0, 72], // 四个数字分别为上右下左与原位置距离
}, color: '#666666',
//设置折线颜色和粗细 },
lineStyle: { splitLine: {
width: 2, show: true,
color: "#67B3FD", lineStyle: {
}, type: 'dashed',
itemStyle:{ color: ['#FFFFFF']
color: "#67B3FD", }
},
//设置面积区域为渐变效果
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [{
offset: 0, color: 'rgba(192, 224, 255, 1)'
}, {
offset: 1, color: 'rgba(192, 224, 255, 0)'
} ],
global: false
} }
}, }
],
grid: {
top:30,
left:80,
right:90,
bottom:30,
}, },
{ series: [
data: this.jyfxData1.map(item => item.cbxmzje), {
name:'储备项目总金额', name:'中标金额(万元)',
type: 'line', smooth: false, //平滑
smooth: true, type:"line",
emphasis: { symbolSize: 6,
disabled: true, yAxisIndex: 1,
focus: 'none' tooltip: {
}, valueFormatter: function (value) {
//设置折线颜色和粗细 return value + '万元'
lineStyle: { }
width: 2, },
color: "#BEECFF", itemStyle: {
}, color: '#14C9C9'
itemStyle:{ },
color: "#BEECFF", data:data.map(item => item.amount),
},
//设置面积区域为渐变效果
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [{
offset: 0, color: 'rgba(165, 229, 255, 1)'
}, {
offset: 1, color: 'rgba(165, 229, 255, 0)'
} ],
global: false
}
}, },
}, {
] name:'中标总数(个)',
} type: 'bar',
myChart.setOption(option); barWidth: 20,
window.addEventListener("resize", function () { tooltip: {
myChart.resize();//图表跟随页面大小变化宽度 valueFormatter: function (value) {
}); return value + '个';
}
},
itemStyle: {
normal:{
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [{
offset: 0,
color: '#56A5FF'
}, {
offset: 1,
color: '#1B8EFF'
}])
}
},
data:data.map(item => item.count),
}
]
}
myChart.setOption(option);
window.addEventListener("resize", function () {
myChart.resize();//图表跟随页面大小变化宽度
});
})
}, },
initChart1(){ initChart1(){
var rankPic = [ var rankPic = [
...@@ -856,15 +831,20 @@ export default { ...@@ -856,15 +831,20 @@ export default {
require('@/assets/images/index/3.png'), require('@/assets/images/index/3.png'),
require('@/assets/images/index/4.png'), require('@/assets/images/index/4.png'),
require('@/assets/images/index/5.png'), require('@/assets/images/index/5.png'),
require('@/assets/images/index/6.png'),
require('@/assets/images/index/7.png'),
require('@/assets/images/index/8.png'),
require('@/assets/images/index/9.png'),
require('@/assets/images/index/10.png'),
] ]
let myChart = echarts.init(document.getElementById("pm-echarts")) let myChart = echarts.init(document.getElementById("zbph-echarts"))
let option ={ let option ={
legend: { legend: {
show: true, show: true,
x:'center', x:'right',
y:'bottom', y:'top',
padding:[0,0,10,0], padding:[10,0,10,0],
itemWidth: 24, itemWidth: 24,
itemHeight: 10, itemHeight: 10,
textStyle:{ textStyle:{
...@@ -888,7 +868,7 @@ export default { ...@@ -888,7 +868,7 @@ export default {
} }
}, },
axisLabel: { axisLabel: {
margin: 80, margin: 200,
textStyle: { textStyle: {
align: 'left', align: 'left',
}, },
...@@ -900,6 +880,7 @@ export default { ...@@ -900,6 +880,7 @@ export default {
1: { 1: {
height: 24, height: 24,
width: 24, width: 24,
// marginBottom:-15,
align: 'center', align: 'center',
backgroundColor: { backgroundColor: {
image: rankPic[0] image: rankPic[0]
...@@ -937,6 +918,46 @@ export default { ...@@ -937,6 +918,46 @@ export default {
image: rankPic[4] image: rankPic[4]
} }
}, },
6: {
height: 24,
width: 24,
align: 'center',
backgroundColor: {
image: rankPic[5]
}
},
7: {
height: 24,
width: 24,
align: 'center',
backgroundColor: {
image: rankPic[6]
}
},
8: {
height: 24,
width: 24,
align: 'center',
backgroundColor: {
image: rankPic[7]
}
},
9: {
height: 24,
width: 24,
align: 'center',
backgroundColor: {
image: rankPic[8]
}
},
10: {
height: 24,
width: 24,
align: 'center',
backgroundColor: {
image: rankPic[9]
}
},
} }
}, },
}, },
...@@ -945,7 +966,7 @@ export default { ...@@ -945,7 +966,7 @@ export default {
}, },
grid: { grid: {
left: '20%', left: '20%',
top: 20, top: 40,
right: 20, right: 20,
bottom: 60, bottom: 60,
}, },
...@@ -964,10 +985,6 @@ export default { ...@@ -964,10 +985,6 @@ export default {
data: this.pmData.map(item => item.value), data: this.pmData.map(item => item.value),
barGap: 0, barGap: 0,
type: 'bar', type: 'bar',
// stack: 'total',
// emphasis: {
// focus: 'series'
// },
itemStyle:{ itemStyle:{
color: '#14C9C9', color: '#14C9C9',
barBorderRadius:[0, 20, 20, 0] barBorderRadius:[0, 20, 20, 0]
...@@ -975,15 +992,10 @@ export default { ...@@ -975,15 +992,10 @@ export default {
barWidth: 8, barWidth: 8,
}, },
{ {
// realtimeSort: true,
name:'目标产值', name:'目标产值',
data: this.pmData.map(item => item.value1), data: this.pmData.map(item => item.value1),
barGap: 0, barGap: 0,
type: 'bar', type: 'bar',
// stack: 'total',
// emphasis: {
// focus: 'series'
// },
itemStyle:{ itemStyle:{
color: '#92C9FF', color: '#92C9FF',
barBorderRadius:[0, 20, 20, 0] barBorderRadius:[0, 20, 20, 0]
...@@ -998,8 +1010,14 @@ export default { ...@@ -998,8 +1010,14 @@ export default {
}); });
}, },
handleClickTab(){ handleClickTab(){
if(this.activeName === 'first'){
this.getBigWinningBidsPage()
}
if(this.activeName === 'second'){
this.getBigBidPage()
}
}, },
handleClickTab1(){},
handleChange(){ handleChange(){
this.user = this.user === 1 ? 2 : 1; this.user = this.user === 1 ? 2 : 1;
if(this.user === 1){ if(this.user === 1){
...@@ -1008,7 +1026,17 @@ export default { ...@@ -1008,7 +1026,17 @@ export default {
this.initChart1() this.initChart1()
}) })
} }
} },
changeSelect(){
console.log("11111")
// this.$emit('handle-search')
},
handleCurrentChange(){
},
handleSizeChange(){
},
} }
}; };
</script> </script>
...@@ -1016,6 +1044,7 @@ export default { ...@@ -1016,6 +1044,7 @@ export default {
<style scoped lang="scss"> <style scoped lang="scss">
.app-container{ .app-container{
padding: 0; padding: 0;
margin: 16px 24px;
} }
p{ p{
padding: 0; padding: 0;
...@@ -1033,6 +1062,303 @@ export default { ...@@ -1033,6 +1062,303 @@ export default {
padding-right: 0 !important; padding-right: 0 !important;
} }
} }
.manage{
.task-wrap{
height: 99px;
background: #FFFFFF;
border-radius: 4px;
display: flex;
justify-content: space-between;
.item{
width: 20%;
text-align: center;
margin: 0 auto;
cursor: pointer;
.icon-img{
width: 48px;
height: 48px;
margin-top: 16px;
}
.text{
color: #3D3D3D;
font-size: 12px;
margin-top: 5px;
}
}
}
.user{
height: 99px;
border-radius: 4px;
background-image: url("../assets/images/index/user_bg.png");
background-size: cover;
padding-left: 24px;
h3{
font-weight: 700;
color: #1C1C28;
font-size: 18px;
padding-top: 16px;
padding-bottom: 8px;
margin: 0px;
span{
height: 20px;
background: #FFF2E2;
display: inline-block;
border-radius: 11px;
border: 1px solid #FFB010;
color: #FFB010;
font-size: 12px;
line-height: 20px;
padding: 0 10px;
margin-left: 12px;
font-weight: 400;
}
}
p{
color: #666666;
font-size: 16px;
}
}
.tips{
color: #999999;
font-size: 12px;
margin: 12px 0;
}
.content{
background: #ffffff;
padding: 22px 16px;
}
.content_wap1{
height: 360px;
margin-bottom: 12px;
}
.content_wap2{
height: 540px;
}
.search{
float:right;
::v-deep .el-form{
.el-form-item--small.el-form-item{
margin-bottom: 16px;
}
.el-form-item{
height: 32px;
}
.el-form-item__content{
line-height: 32px;
}
.el-input{
line-height: 32px;
.el-input__inner{
height: 32px;
line-height: 32px;
}
}
}
}
.box-right{
width: 90%;
float: right;
::v-deep .el-table{
.sort-caret.ascending{
border-bottom-color: rgba(0,129,255,0.5);
}
.ascending .sort-caret.ascending{
border-bottom-color: #0081FF;
}
.sort-caret.descending{
border-top-color: rgba(0,129,255,0.5);
}
.descending .sort-caret.descending{
border-top-color: #0081FF;
}
.el-table__header-wrapper{
background: #F0F3FA;
th{
background: #F0F3FA;
/*text-align: left;*/
}
}
.el-table__footer-wrapper{
background: #F0F3FA;
}
th {
font-size: 13px !important;
font-weight: 400 !important;
}
.cell {
padding-right: 12px !important;
padding-left: 12px !important;
line-height: 18px;
}
.el-table__fixed-header-wrapper{
th{
background: #F0F3FA;
}
}
td.el-table__cell{
border-bottom: 0;
}
tr{
&.current-row>td{
background-color: initial;
}
&:nth-child(2n) {
background: #F8FBFF;
}
}
.el-table__cell{
height: 40px;
padding: 0;
line-height: 40px;
}
.el-table__body tr:hover > td.el-table__cell{
background: #DCEBFF;
}
::-webkit-scrollbar-track-piece {
//滚动条凹槽的颜色,还可以设置边框属性
background-color: #F3F4F5;
height: 16px;
padding: 0 4px;
}
//滚动条的宽度
::-webkit-scrollbar {
width: 8px;
height: 8px;
background-color: #F3F4F5;
border-radius: 6px;
}
//滚动条的滑块
::-webkit-scrollbar-thumb {
border-radius: 8px;
height: 8px;
margin: 0 4px;
background: rgba(98,110,126,0.2);
border: 4px solid rgba(98,110,126,0.2);;
&:hover{
background: #566380;
}
}
.has-gutter{
tr{
th:nth-last-child(2){
border-right:0;
}
td:nth-last-child(2){
border-right:0;
}
}
}
.el-table__cell.gutter{
background: #F0F3FA;
}
.el-table__row{
td:last-child{
.cell{
padding-right: 12px !important;
}
}
}
}
}
.content_wap3{
margin-top: 12px;
background: #ffffff;
::v-deep .el-tabs{
.el-tabs__header{
margin-bottom: 0;
}
.el-tabs__item{
height: 54px;
line-height: 54px;
font-size: 16px;
}
.el-tabs__item.is-active{
font-weight: 700;
color: #232323;
}
.el-tabs__nav-wrap{
padding:0 24px;
}
.el-tabs__active-bar{
border-radius: 8px;
}
.el-tabs__nav-wrap::after{
height: 1px;
}
}
.list{
margin: 0 16px;
.item{
border-bottom: 1px solid #EFEFEF;
padding: 16px 0;
.list-title{
font-size: 16px;
font-weight: 700;
color: #3D3D3D;
line-height: 23px;
cursor: pointer;
.list-titel-a{
text-decoration: none;
color:#3D3D3D;
}
a{
color: #3D3D3D;
}
a:hover{
color:#0081FF;
}
}
.list-content {
margin-top: 16px;
display: flex;
justify-content: start;
align-items: center;
.list-content-text {
display: flex;
justify-content: start;
align-items: center;
margin-right: 32px;
font-size: 14px;
span:first-child {
font-weight: 400;
color: rgba(35, 35, 35, 0.4);
line-height: 15px
}
span:last-child {
font-weight: 400;
color: rgba(35, 35, 35, 0.8);
line-height: 15px
}
.blue {
color: #0081FF !important;
cursor: pointer;
}
}
}
}
}
}
::v-deep .selectTag{
.el-select__tags{
.el-tag{
&:first-child{
width: 90px;
}
}
}
}
}
.content-left{ .content-left{
.task-wrap{ .task-wrap{
height: 88px; height: 88px;
......
<template> <template>
<div class="dashboard-editor-container"> <div class="app-container home">
<el-row :gutter="20">
<el-col :span="18">
<div class="content-left">
<div class="task-wrap">
<div class="item">
<img class="left" src="@/assets/images/index/icon1.png"/>
<div class="right">
<p class="title">即将开标项目</p>
<p class="number">36</p>
<p class="compare">较上月 <span class="up">+3<img src="@/assets/images/index/up.png"/></span></p>
</div>
</div>
<div class="item">
<img class="left" src="@/assets/images/index/icon2.png"/>
<div class="right">
<p class="title">重点关注项目</p>
<p class="number">36</p>
<p class="compare">较上月 <span class="up">+3<img src="@/assets/images/index/up.png"/></span></p>
</div>
</div>
<div class="item">
<img class="left" src="@/assets/images/index/icon3.png"/>
<div class="right">
<p class="title">重点关注客户</p>
<p class="number">36</p>
<p class="compare">较上月 <span class="down">-3<img src="@/assets/images/index/down.png"/></span></p>
</div>
</div>
<div class="item">
<img class="left" src="@/assets/images/index/icon4.png"/>
<div class="right">
<p class="title">储备合作客户</p>
<p class="number">36</p>
<p class="compare">较上月 <span class="up">+3<img src="@/assets/images/index/up.png"/></span></p>
</div>
</div>
<div class="item add">
<span class="yd"><i></i><i></i><i></i><i></i><i></i><i></i></span>
<div class="btn"><i class="el-icon-plus"></i>新建待办任务</div>
</div>
</div>
<!--经理视角-->
<div v-if="user === 1" class="content-wrap">
<el-col :span="12">
<div class="record">
<div class="flex-box query-box">
<div class="flex-box query-params">
<span class="common-title">跟进记录</span>
</div>
<div class="flex-box query-ability">
<div class="select-popper">
<div class="area">{{area}}<i class="sjx"></i></div>
<el-select v-model="area" class="select-multiple" placeholder="请选择">
<el-option v-for="(item,index) in areaList" :key="index" :label="item.name" :value="item.name"></el-option>
</el-select>
</div>
<div class="select-popper">
<div class="month">{{date}}<i class="sjx"></i></div>
<el-select v-model="date" class="select-multiple" placeholder="请选择">
<el-option v-for="(item,index) in dateList" :key="index" :label="item" :value="item"></el-option>
</el-select>
</div>
</div>
</div>
<div class="list">
<div class="item" v-for="(item,index) in gjjlData" :key="index">
<h3>{{item.title}}</h3>
<p>
<span>跟进人:{{item.user}}</span>
<span>关联企业:{{item.name}}</span>
</p>
</div>
</div>
<p class="more">更多跟进记录 ></p>
</div>
</el-col>
<el-col :span="12">
<div class="ranking">
<div class="flex-box query-box">
<div class="flex-box query-params">
<span class="common-title">业绩排名</span>
</div>
<div class="flex-box query-ability">
<div class="select-popper">
<div class="area">{{area}}<i class="sjx"></i></div>
<el-select v-model="area" class="select-multiple" placeholder="请选择">
<el-option v-for="(item,index) in areaList" :key="index" :label="item.name" :value="item.name"></el-option>
</el-select>
</div>
<div class="select-popper">
<div class="month">{{date}}<i class="sjx"></i></div>
<el-select v-model="date" class="select-multiple" placeholder="请选择">
<el-option v-for="(item,index) in dateList" :key="index" :label="item" :value="item"></el-option>
</el-select>
</div>
</div>
</div>
<div class="main">
<div class="amount">
<p>
<span>实际已完成(万元)</span>
<span>产值目标(万元)</span>
</p>
<p>
<span class="money">359,800.00</span>
<span class="money">359,800.00</span>
</p>
<el-progress class="progress1" :text-inside="true" :stroke-width="14" :percentage="40"></el-progress>
<el-progress class="progress2" :text-inside="true" :stroke-width="14" :percentage="70"></el-progress>
</div>
<div style="background: #ffffff;margin: 0 12px 12px 12px;">
<div id="pm-echarts" style="height: 400px;"></div>
</div>
</div>
</div>
</el-col>
</div>
<div v-if="user === 1" class="analysis">
<div class="flex-box query-box">
<div class="flex-box query-params">
<span class="common-title">经营分析</span>
</div>
<div class="flex-box query-ability">
<div class="tabs">
<!--<div class="label" v-for="(item,index) in typeList" :class="typeIndex === index ? 'color':''" @click="handleClick(index)">{{item.name}}</div>-->
</div>
<div class="select-popper">
<div class="area">{{area}}<i class="sjx"></i></div>
<el-select v-model="area" class="select-multiple" placeholder="请选择">
<el-option v-for="(item,index) in areaList" :key="index" :label="item.name" :value="item.name"></el-option>
</el-select>
</div>
</div>
</div>
<div>
<div id="fx-echarts" style="height: 280px;"></div>
</div>
</div>
<panel-group @handleSetLineChartData="handleSetLineChartData" /> <!--员工视角-->
<div v-if="user === 2" class="content-db">
<el-row style="background:#fff;padding:16px 16px 0;margin-bottom:32px;"> <div class="flex-box query-box">
<line-chart :chart-data="lineChartData" /> <div class="flex-box query-params">
</el-row> <span class="common-title">待办</span>
</div>
<el-row :gutter="32"> <div class="flex-box query-ability"><span>9</span>全部待办 ></div>
<el-col :xs="24" :sm="24" :lg="8"> </div>
<div class="chart-wrapper"> <div class="list">
<raddar-chart /> <div class="item" v-for="(item,index) in gjjlData" :key="index" v-if='index < 3'>
<h3>{{item.title}}</h3>
<p>
<span>拜访时间:{{item.time}}</span>
<span>关联企业:{{item.name}}</span>
</p>
<div class="btn">写跟进<i class="el-icon-edit"></i></div>
</div>
</div>
</div>
<div v-if="user === 2" class="trends">
<el-tabs v-model="activeName" @tab-click="handleClickTab">
<el-tab-pane label="甲方舆情" name="first">
<div class="main-box">
<el-timeline>
<el-timeline-item
v-for="(item, index) in trendsList"
:key="index"
icon="el-icon-time">
<div class="time">{{item.time}}<span class="company">{{item.name}}</span></div>
<div class="cont">{{item.main}}</div>
</el-timeline-item>
</el-timeline>
</div>
<!--<div class="check">全部甲方舆情 ></div>-->
</el-tab-pane>
<el-tab-pane label="监控动态" name="second">
<div class="main-box">
<el-timeline>
<el-timeline-item
v-for="(item, index) in trendsList"
:key="index"
icon="el-icon-time">
<div class="time">{{item.time}}<span class="company">{{item.name}}</span></div>
<div class="cont">{{item.main}}</div>
</el-timeline-item>
</el-timeline>
</div>
<!--<div class="check">全部监控动态 ></div>-->
</el-tab-pane>
</el-tabs>
</div>
</div> </div>
</el-col> </el-col>
<el-col :xs="24" :sm="24" :lg="8"> <el-col :span="6">
<div class="chart-wrapper"> <div class="content-right">
<pie-chart /> <div class="user" @click="handleChange">
</div> <h3 v-if="user === 1">刘毅<span>总经理</span></h3>
</el-col> <h3 v-if="user === 2">李婷婷<span>营销员</span></h3>
<el-col :xs="24" :sm="24" :lg="8"> <p>您好,祝您工作顺利每一天</p>
<div class="chart-wrapper"> </div>
<bar-chart /> <div class="search">
<span class="common-title">快捷搜索</span>
<el-input placeholder="找客户/找项目/找甲方">
<i slot="prefix" class="el-icon-search"></i>
</el-input>
<span class="common-title">储备项目类</span>
<div class="list" style="margin-top: 8px;">
<div class="item">
<img src="@/assets/images/index/cb_icon1.png"/>
<p>EPC项目</p>
</div>
<div class="item">
<img src="@/assets/images/index/cb_icon2.png"/>
<p>投资项目</p>
</div>
<div class="item">
<img src="@/assets/images/index/cb_icon3.png"/>
<p>房建项目</p>
</div>
</div>
<div class="list">
<div class="item">
<img src="@/assets/images/index/cb_icon4.png"/>
<p>电力项目</p>
</div>
<div class="item">
<img src="@/assets/images/index/cb_icon5.png"/>
<p>市政项目</p>
</div>
<div class="item">
<img src="@/assets/images/index/cb_icon6.png"/>
<p>水利项目</p>
</div>
</div>
</div>
<div class="zbgg" v-if="user === 1">
<span class="common-title">中标公告</span>
<div class="list">
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
<span>中标单位:中铁十二局集团</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
<span>中标单位:中铁十二局集团</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
<span>中标单位:中铁十二局集团</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
<span>中标单位:中铁十二局集团</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
<span>中标单位:中铁十二局集团</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
<span>中标单位:中铁十二局集团</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
<span>中标单位:中铁十二局集团</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
<span>中标单位:中铁十二局集团</span>
</p>
</div>
</div>
</div>
<div v-if="user === 2" class="zbhxr">
<span class="common-title">竞争对手中标候选人公告</span>
<div class="list">
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
</p>
</div>
</div>
</div>
</div> </div>
</el-col> </el-col>
</el-row> </el-row>
</div> </div>
</template> </template>
<script> <script>
import PanelGroup from './dashboard/PanelGroup' import * as echarts from 'echarts';
import LineChart from './dashboard/LineChart' import "@/assets/styles/public.css";
import RaddarChart from './dashboard/RaddarChart'
import PieChart from './dashboard/PieChart'
import BarChart from './dashboard/BarChart'
const lineChartData = {
newVisitis: {
expectedData: [100, 120, 161, 134, 105, 160, 165],
actualData: [120, 82, 91, 154, 162, 140, 145]
},
messages: {
expectedData: [200, 192, 120, 144, 160, 130, 140],
actualData: [180, 160, 151, 106, 145, 150, 130]
},
purchases: {
expectedData: [80, 100, 121, 104, 105, 90, 100],
actualData: [120, 90, 100, 138, 142, 130, 130]
},
shoppings: {
expectedData: [130, 140, 141, 142, 145, 150, 160],
actualData: [120, 82, 91, 154, 162, 140, 130]
}
}
export default { export default {
name: 'Index', name: "Index",
components: {
PanelGroup,
LineChart,
RaddarChart,
PieChart,
BarChart
},
data() { data() {
return { return {
lineChartData: lineChartData.newVisitis // 版本号
version: "3.8.5",
typeList:[
{name:'待成交项目数'},
{name:'待成交总金额'},
{name:'成交项目金额'},
{name:'成交项目总数'},
{name:'储备项目总数'},
{name:'储备项目总金额'},
],
typeIndex:0,
jyfxData:['1月','2月','3月','4月','5月','6月'],
jyfxData1:[
{
dcjxm:'103',
dcjzje:'123',
cjxmje:'153',
cjxmzs:'113',
cbxmzs:'93',
cbxmzje:'193',
},
{
dcjxm:'256',
dcjzje:'223',
cjxmje:'113',
cjxmzs:'163',
cbxmzs:'193',
cbxmzje:'123',
},
{
dcjxm:'103',
dcjzje:'123',
cjxmje:'153',
cjxmzs:'113',
cbxmzs:'93',
cbxmzje:'193',
},
{
dcjxm:'256',
dcjzje:'223',
cjxmje:'113',
cjxmzs:'163',
cbxmzs:'193',
cbxmzje:'123',
},
{
dcjxm:'103',
dcjzje:'123',
cjxmje:'153',
cjxmzs:'113',
cbxmzs:'93',
cbxmzje:'193',
},
{
dcjxm:'256',
dcjzje:'223',
cjxmje:'113',
cjxmzs:'163',
cbxmzs:'193',
cbxmzje:'123',
},
],
gjjlData:[
{
title:'今天拜访了重庆交通局杨科长,洽谈比较愉快,预计下月有项目招标,希望能有机会合作。',
user:'李婷婷',
name:'重庆机场集团',
time:'2023-04-12 14: 00'
},
{
title:'今天拜访了重庆机场集团董事长,下个月招标项目预计1.2个亿。争取能拿到项目。',
user:'李婷婷',
name:'重庆机场集团',
time:'2023-04-12 14: 00'
},
{
title:'5月27日早上劳动局去杨局长说希望我们把项目预算清单做出来看一下。',
user:'李婷婷',
name:'重庆机场集团',
time:'2023-04-12 14: 00'
},
{
title:'拜访了重庆交通局杨科长,洽谈比较愉快,预计下月有项目招标,希望能有机会合作。',
user:'李婷婷',
name:'重庆机场集团',
time:'2023-04-12 14: 00'
},
{
title:'5月27日早上劳动局去杨局长说希望我们把项目预算清单做出来看一下。',
user:'李婷婷',
name:'重庆机场集团',
time:'2023-04-12 14: 00'
},
{
title:'拜访了重庆交通局杨科长,洽谈比较愉快,预计下月有项目招标,希望能有机会合作。',
user:'李婷婷',
name:'重庆机场集团',
time:'2023-04-12 14: 00'
},
{
title:'拜访了重庆交通局杨科长,洽谈比较愉快,预计下月有项目招标,希望能有机会合作。',
user:'李婷婷',
name:'重庆机场集团',
time:'2023-04-12 14: 00'
},
{
title:'拜访了重庆交通局杨科长,洽谈比较愉快,预计下月有项目招标,希望能有机会合作。',
user:'李婷婷',
name:'重庆机场集团',
time:'2023-04-12 14: 00'
},
{
title:'拜访了重庆交通局杨科长,洽谈比较愉快,预计下月有项目招标,希望能有机会合作。',
user:'李婷婷',
name:'重庆机场集团',
time:'2023-04-12 14: 00'
},
],
pmData:[
{
name:'朱博',
value:334,
value1:164,
},
{
name:'陈伟',
value:230,
value1:130,
},
{
name:'张天翼',
value:156,
value1:150,
},
{
name:'李晨旭',
value:112,
value1:130,
},
{
name:'徐阳',
value:110,
value1:90,
},
],
rankIconsSize:'24',
rankIcons:[// 排序图标
require('@/assets/images/index/1.png'),
require('@/assets/images/index/2.png'),
require('@/assets/images/index/3.png'),
require('@/assets/images/index/4.png'),
require('@/assets/images/index/5.png'),
],
user:1,
activeName:'first',
trendsList:[
{
time:'2018-04-03 10:20',
name:'重庆轨道交通集团有限公司',
main:'发布招标公告 重庆轨道交通环线鹅公岩轨道专用桥增设防船撞设施项目,项目地区是重庆市-江北区,项目类型为工程建设。'
},
{
time:'2018-04-03 10:20',
name:'重庆轨道交通集团有限公司',
main:'发布招标公告 重庆轨道交通环线鹅公岩轨道专用桥增设防船撞设施项目,项目地区是重庆市-江北区,项目类型为工程建设。'
},
{
time:'2018-04-03 10:20',
name:'重庆轨道交通集团有限公司',
main:'发布招标公告 重庆轨道交通环线鹅公岩轨道专用桥增设防船撞设施项目,项目地区是重庆市-江北区,项目类型为工程建设。'
},
{
time:'2018-04-03 10:20',
name:'重庆轨道交通集团有限公司',
main:'发布招标公告 重庆轨道交通环线鹅公岩轨道专用桥增设防船撞设施项目,项目地区是重庆市-江北区,项目类型为工程建设。'
},
{
time:'2018-04-03 10:20',
name:'重庆轨道交通集团有限公司',
main:'发布招标公告 重庆轨道交通环线鹅公岩轨道专用桥增设防船撞设施项目,项目地区是重庆市-江北区,项目类型为工程建设。'
},
{
time:'2018-04-03 10:20',
name:'重庆轨道交通集团有限公司',
main:'发布招标公告 重庆轨道交通环线鹅公岩轨道专用桥增设防船撞设施项目,项目地区是重庆市-江北区,项目类型为工程建设。'
},
{
time:'2018-04-03 10:20',
name:'重庆轨道交通集团有限公司',
main:'发布招标公告 重庆轨道交通环线鹅公岩轨道专用桥增设防船撞设施项目,项目地区是重庆市-江北区,项目类型为工程建设。'
},
{
time:'2018-04-03 10:20',
name:'重庆轨道交通集团有限公司',
main:'发布招标公告 重庆轨道交通环线鹅公岩轨道专用桥增设防船撞设施项目,项目地区是重庆市-江北区,项目类型为工程建设。'
},
],
area:'西南地区',
areaList:[
{
name:'西南地区'
},
{
name:'华中地区'
},
{
name:'华南地区'
},
{
name:'华东地区'
},
{
name:'华北地区'
},
{
name:'东北地区'
},
{
name:'西北地区'
},
],
date:'不限',
dateList:['不限','今日','昨日','近三天','近七天']
};
},
created() {
if(this.user === 1){
this.$nextTick(()=>{
this.initChart()
this.initChart1()
})
} }
}, },
methods: { methods: {
handleSetLineChartData(type) { handleClick(index){
this.lineChartData = lineChartData[type] this.typeIndex=index;
},
initChart() {
let myChart = echarts.init(document.getElementById("fx-echarts"))
let option ={
legend: {
x:'right',
padding:[3,120,0,0],
itemHeight:8,
itemWidth:16,
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'line',
label: {
backgroundColor: '#FFFFFF'
}
}
},
xAxis: {
type: 'category',
boundaryGap: false,
data: this.jyfxData,
},
yAxis: {
type: 'value',
},
grid: {
top:40,
left:30,
right:10,
bottom:20,
},
// dcjxm:'256',
// dcjzje:'223',
// cjxmje:'113',
// cjxmzs:'163',
// cbxmzs:'193',
// cbxmzje:'123',
series: [
{
data: this.jyfxData1.map(item => item.dcjxm),
name:'待成交项目数',
type: 'line',
smooth: true,
emphasis: {
disabled: true,
focus: 'none'
},
//设置折线颜色和粗细
lineStyle: {
width: 2,
color: "#81D4BC",
},
itemStyle:{
color: "#81D4BC",
},
//设置面积区域为渐变效果
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [{
offset: 0, color: 'rgba(189, 249, 232, 1)'
}, {
offset: 1, color: 'rgba(189, 249, 232, 0)'
} ],
global: false
}
},
},
{
data: this.jyfxData1.map(item => item.dcjzje),
name:'待成交总金额',
type: 'line',
smooth: true,
emphasis: {
disabled: true,
focus: 'none'
},
//设置折线颜色和粗细
lineStyle: {
width: 2,
color: "#9EE474",
},
itemStyle:{
color: "#9EE474",
},
//设置面积区域为渐变效果
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [{
offset: 0, color: 'rgba(208, 250, 183, 1)'
}, {
offset: 1, color: 'rgba(208, 250, 183, 0)'
} ],
global: false
}
},
},
{
data: this.jyfxData1.map(item => item.cjxmje),
name:'成交项目金额',
type: 'line',
smooth: true,
emphasis: {
disabled: true,
focus: 'none'
},
//设置折线颜色和粗细
lineStyle: {
width: 2,
color: "#E1B3FF",
},
itemStyle:{
color: "#E1B3FF",
},
//设置面积区域为渐变效果
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [{
offset: 0, color: 'rgba(233, 200, 255, 1)'
}, {
offset: 1, color: 'rgba(233, 200, 255, 0)'
} ],
global: false
}
},
},
{
data: this.jyfxData1.map(item => item.cjxmzs),
name:'成交项目总数',
type: 'line',
smooth: true,
emphasis: {
disabled: true,
focus: 'none'
},
//设置折线颜色和粗细
lineStyle: {
width: 2,
color: "#ADC0FF",
},
itemStyle:{
color: "#ADC0FF",
},
//设置面积区域为渐变效果
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [{
offset: 0, color: 'rgba(173, 192, 255, 1)'
}, {
offset: 1, color: 'rgba(173, 192, 255, 0)'
} ],
global: false
}
},
},
{
data: this.jyfxData1.map(item => item.cbxmzs),
name:'储备项目总数',
type: 'line',
smooth: true,
emphasis: {
disabled: true,
focus: 'none'
},
//设置折线颜色和粗细
lineStyle: {
width: 2,
color: "#67B3FD",
},
itemStyle:{
color: "#67B3FD",
},
//设置面积区域为渐变效果
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [{
offset: 0, color: 'rgba(192, 224, 255, 1)'
}, {
offset: 1, color: 'rgba(192, 224, 255, 0)'
} ],
global: false
}
},
},
{
data: this.jyfxData1.map(item => item.cbxmzje),
name:'储备项目总金额',
type: 'line',
smooth: true,
emphasis: {
disabled: true,
focus: 'none'
},
//设置折线颜色和粗细
lineStyle: {
width: 2,
color: "#BEECFF",
},
itemStyle:{
color: "#BEECFF",
},
//设置面积区域为渐变效果
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [{
offset: 0, color: 'rgba(165, 229, 255, 1)'
}, {
offset: 1, color: 'rgba(165, 229, 255, 0)'
} ],
global: false
}
},
},
]
}
myChart.setOption(option);
window.addEventListener("resize", function () {
myChart.resize();//图表跟随页面大小变化宽度
});
},
initChart1(){
var rankPic = [
require('@/assets/images/index/1.png'),
require('@/assets/images/index/2.png'),
require('@/assets/images/index/3.png'),
require('@/assets/images/index/4.png'),
require('@/assets/images/index/5.png'),
]
let myChart = echarts.init(document.getElementById("pm-echarts"))
let option ={
legend: {
show: true,
x:'center',
y:'bottom',
padding:[0,0,10,0],
itemWidth: 24,
itemHeight: 10,
textStyle:{
borderRadius:30,
}
},
yAxis: {
type: 'category',
inverse: true, // 反向坐标
data: this.pmData.map(item => item.name),
axisLine: {
show: false,
},
axisTick: {
show: false,
},
axisPointer: {
label: {
show: true,
margin: 30
}
},
axisLabel: {
margin: 80,
textStyle: {
align: 'left',
},
formatter: function (value,index) {
let idx=index+1;
return '{' + idx + '|} {s|' + value + '}'
},
rich: {
1: {
height: 24,
width: 24,
align: 'center',
backgroundColor: {
image: rankPic[0]
},
},
2: {
height: 24,
width: 24,
align: 'center',
backgroundColor: {
image: rankPic[1]
}
},
3: {
height: 24,
width: 24,
align: 'center',
backgroundColor: {
image: rankPic[2]
}
},
4: {
height: 24,
width: 24,
align: 'center',
backgroundColor: {
image: rankPic[3]
}
},
5: {
height: 24,
width: 24,
align: 'center',
backgroundColor: {
image: rankPic[4]
}
},
}
},
},
xAxis: {
type: 'value',
},
grid: {
left: '20%',
top: 20,
right: 20,
bottom: 60,
},
tooltip: {
show: true,
backgroundColor: 'rgba(0,0,0,.7)',
borderWidth: 0,
textStyle: {
color: '#fff',
},
},
series: [
{
// realtimeSort: true,
name:'已完成产值',
data: this.pmData.map(item => item.value),
barGap: 0,
type: 'bar',
// stack: 'total',
// emphasis: {
// focus: 'series'
// },
itemStyle:{
color: '#14C9C9',
barBorderRadius:[0, 20, 20, 0]
},
barWidth: 8,
},
{
// realtimeSort: true,
name:'目标产值',
data: this.pmData.map(item => item.value1),
barGap: 0,
type: 'bar',
// stack: 'total',
// emphasis: {
// focus: 'series'
// },
itemStyle:{
color: '#92C9FF',
barBorderRadius:[0, 20, 20, 0]
},
barWidth: 8,
},
],
}
myChart.setOption(option);
window.addEventListener("resize", function () {
myChart.resize();//图表跟随页面大小变化宽度
});
},
handleClickTab(){
},
handleChange(){
this.user = this.user === 1 ? 2 : 1;
if(this.user === 1){
this.$nextTick(()=>{
this.initChart()
this.initChart1()
})
}
} }
} }
} };
</script> </script>
<style lang="scss" scoped> <style scoped lang="scss">
.dashboard-editor-container { .app-container{
padding: 32px; padding: 0;
background-color: rgb(240, 242, 245); }
position: relative; p{
padding: 0;
.chart-wrapper { margin: 0;
background: #fff;
padding: 16px 16px 0;
margin-bottom: 32px;
} }
} .home {
padding-bottom:24px;
::v-deep .el-row{
.el-col:nth-child(1){
padding-left: 0 !important;
padding-right: 0 !important;
}
.el-col:nth-child(2){
padding-left: 16px !important;
padding-right: 0 !important;
}
}
.content-left{
.task-wrap{
height: 88px;
background: #FFFFFF;
border-radius: 4px;
margin-bottom: 12px;
display: flex;
justify-content: space-between;
.item{
width: 20%;
display: flex;
padding-left: 16px;
margin-right: 9px;
margin-top: 14px;
margin-bottom: 14px;
border-right: 1px solid #EFEFEF;
cursor: pointer;
.left{
width: 48px;
height: 48px;
margin-right: 8px;
}
.right{
.title{
font-size: 12px;
color: #3D3D3D;
border-bottom: 0;
}
.number{
font-weight: bold;
color: #3D3D3D;
font-size: 18px;
padding: 4px 0;
}
.compare{
color: rgba(35,35,35,0.4);
font-size: 12px;
img{
width: 8px;
height: 10px;
margin-left: 4px;
margin-bottom: -1px;
}
.down{
color:#FF3C3C;
}
.up{
color:#0CBC6D;
}
}
}
}
.item:nth-child(4){
border-right: 0;
}
.item:last-child{
border-right: 0;
}
.item:hover{
.right{
.title{
color: #0081FF;
}
.number{
color: #0081FF;
}
}
}
.add{
padding-left: 0;
.yd{
display: inline-block;
width: 5px;
margin-right: 10%;
i{
width: 5px;
height: 5px;
border-radius: 2px;
background: #E6E6E9;
margin-bottom: 6px;
display: block;
}
}
.btn{
width: 100%;
height: 60px;
background: #FFFFFF;
border-radius: 4px;
/*border: 1px solid #E6E6E9;*/
color:#0081FF;
line-height: 64px;
font-size: 14px;
margin-left: 0;
margin-right: 7px;
i{
margin-right: 4px;
}
}
.btn:hover{
background: #F6F9FC;
}
}
}
.content-wrap{
margin-bottom: 12px;
height: 587px;
.select-popper{
margin-right:0;
}
.record{
height: 587px;
background: #FFFFFF;
border-radius: 4px;
padding: 16px;
position: relative;
.list{
height: 510px;
overflow: hidden;
.item{
border-bottom: 1px solid #EEEEEE;
padding: 16px 0;
h3{
color: #232323;
font-size: 14px;
font-weight: 400;
margin: 0;
}
p{
color: rgba(35,35,35,0.4);
font-size: 14px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
margin-top: 8px;
span{
margin-right: 15px;
}
}
}
.item:last-child{
border-bottom: 0;
}
}
.more{
text-align: center;
color: #0081FF;
font-size: 14px;
cursor: pointer;
position: absolute;
width: 95%;
height: 60px;
line-height: 60px;
background: linear-gradient(360deg, #FFFFFF 0%, #FFFFFF 17%, rgba(255,255,255,0.6) 100%);
bottom: 0;
}
}
.ranking{
height: 587px;
background: #FFFFFF;
border-radius: 4px;
padding: 16px;
.main{
background: url("../assets/images/index/yjpm_bg.png");
background-size: 100% 100%;
height: 525px;
margin-top: 10px;
}
.amount{
padding: 16px 12px;
p{
display: flex;
justify-content: space-between;
}
span{
font-weight: 400;
color: #184280;
font-size: 14px;
}
.money{
font-weight: bold;
color: #184280;
font-size: 18px;
margin-top: 2px;
}
.money:first-child{
color:#48C5A0;
}
.money:last-child{
color:#60B0FD;
}
.progress1{
height: 10px !important;
margin-bottom:6px;
margin-top:8px;
::v-deep .el-progress-bar__outer{
.el-progress-bar__inner{
background:#9AEAD3
}
}
}
.progress2{
height: 10px !important;
::v-deep .el-progress-bar__outer{
.el-progress-bar__inner{
background:#92C9FF
}
}
}
::v-deep .el-progress-bar__outer{
/*border: 1px solid #A2E8E8;*/
/*background-color:#ffffff !important;*/
height: 10px !important;
background-color: rgba(235, 238, 245, 0%) !important;
border-radius:0 20px 20px 0;
.el-progress-bar__inner{
/*<!--background: linear-gradient(-270deg, #C3F6F6 0%, #14C9C9 100%);-->*/
border-radius:0 20px 20px 0;
.el-progress-bar__innerText{
color: #ffffff;
opacity: 0;
}
}
}
}
}
.select-popper{
.area{
font-size: 14px;
color: #232323;
cursor: pointer;
i{
background: url("../assets/images/index/sjx.png");
background-size: 100% 100%;
width: 10px;
height: 6px;
display: inline-block;
margin-bottom: 2px;
margin-left: 4px;
}
}
.month{
font-size: 14px;
color: #232323;
margin-left: 16px;
cursor: pointer;
i{
background: url("../assets/images/index/sjx.png");
background-size: 100% 100%;
width: 10px;
height: 6px;
display: inline-block;
margin-bottom: 2px;
margin-left: 4px;
}
}
.color{
color: #0081FF;
i{
background: url("../assets/images/index/sjx2.png");
background-size: 100% 100%;
}
}
}
.select-popper:hover{
.area,.month{
color: #0081FF;
i{
background: url("../assets/images/index/sjx1.png");
background-size: 100% 100%;
}
}
}
}
.content-db{
height: 263px;
background: #FFFFFF;
border-radius: 4px;
margin-bottom: 12px;
padding: 16px;
overflow: hidden;
.query-ability{
color: #0081FF;
font-size: 14px;
cursor: pointer;
span{
width: 16px;
height: 16px;
background: #FF3C3C;
display: inline-block;
color:#ffffff;
font-size: 12px;
border-radius: 50%;
line-height: 16px;
text-align: center;
margin-right: 4px;
}
}
.list{
margin-top: 12px;
}
.item{
min-height: 62px;
background: #F6F9FD;
border-radius: 6px;
margin-bottom: 8px;
position: relative;
padding: 10px 16px;
h3{
font-weight: 400;
color: #232323;
font-size: 14px;
margin: 0;
padding-bottom: 6px;
width: 85%;
}
p{
color: rgba(35,35,35,0.4);
font-size: 14px;
span{
margin-right: 24px;
color:rgba(35, 35, 35, 0.8);
}
}
.btn{
position: absolute;
right: 50px;
top:22px;
color: #0CBC6D;
font-size: 12px;
}
}
}
.analysis{
height: 334px;
background: #FFFFFF;
border-radius: 4px;
padding: 16px;
position: relative;
.tabs{
.label{
display: inline-block;
padding: 0 14px;
height: 22px;
color: rgba(35,35,35,0.8);
font-size: 12px;
line-height: 22px;
border-top: 1px solid #EFEFEF;
border-bottom: 1px solid #EFEFEF;
border-left: 1px solid #EFEFEF;
cursor: pointer;
}
.label:first-child{
border-radius: 2px 0px 0px 2px;
}
.label:last-child{
border-radius: 0px 2px 2px 0px;
border-right: 1px solid #EFEFEF;
}
.color{
background: #0081FF;
color: #FFFFFF;
}
}
.select-popper{
position: absolute;
right: 0;
top: 27px;
z-index: 99;
.area{
font-size: 14px;
color: #232323;
margin-left: 16px;
cursor: pointer;
i{
background: url("../assets/images/index/sjx.png");
background-size: 100% 100%;
width: 10px;
height: 6px;
display: inline-block;
margin-bottom: 2px;
margin-left: 4px;
}
}
}
.select-popper:hover{
.area,.month{
color: #0081FF;
i{
background: url("../assets/images/index/sjx1.png");
background-size: 100% 100%;
}
}
}
}
.trends{
background: #FFFFFF;
border-radius: 4px;
padding: 16px;
height: 617px;
overflow: hidden;
position: relative;
::v-deep .el-tabs__header{
margin: 0 0 18px;
}
::v-deep .el-tabs__content{
overflow-y: auto;
height: 567px;
}
::v-deep .el-timeline{
.el-timeline-item{
padding-bottom: 18px;
}
.el-timeline-item__tail{
left: 7px;
border-left: 2px dotted rgba(0,129,255,0.5);
}
.el-timeline-item__node{
background-color:#ffffff;
.el-timeline-item__icon{
color:#0081FF;
font-size: 14px;
}
}
.el-timeline-item__node--normal{
left: 0px;
width: 16px;
height: 16px;
}
}
.time{
font-size: 14px;
color: rgba(35,35,35,0.8);
.company{
color: #0081FF;
margin-left: 16px;
}
}
.cont{
background: #F6F9FD;
border-radius: 6px;
padding: 16px;
margin-top: 8px;
font-size: 14px;
color: rgba(35,35,35,0.8);
margin-right: 16px;
}
.check{
height: 60px;
background: linear-gradient(360deg, #FFFFFF 0%, #FFFFFF 17%, rgba(255,255,255,0.6) 100%);
font-size: 16px;
color: #0CBC6D;
line-height: 60px;
text-align: center;
width: 100%;
position: absolute;
bottom: 46px;
cursor: pointer;
}
@media (max-width:1024px) { }
.chart-wrapper { }
padding: 8px; .content-right{
.user{
height: 88px;
border-radius: 4px;
margin-bottom: 12px;
background-image: url("../assets/images/index/user_bg.png");
background-size: cover;
padding-left: 24px;
h3{
font-weight: 700;
color: #1C1C28;
font-size: 18px;
padding-top: 16px;
padding-bottom: 8px;
margin: 0px;
span{
height: 20px;
background: #FFF2E2;
display: inline-block;
border-radius: 11px;
border: 1px solid #FFB010;
color: #FFB010;
font-size: 12px;
line-height: 20px;
padding: 0 10px;
margin-left: 12px;
font-weight: 400;
}
}
p{
color: #666666;
font-size: 16px;
}
}
.search{
height: 322px;
background: #FFFFFF;
border-radius: 4px;
margin-bottom: 12px;
padding: 16px;
::v-deep .el-input{
height: 32px;
border-radius: 2px;
margin-bottom: 20px;
margin-top: 14px;
.el-input__inner{
height: 32px;
line-height: 32px;
background: #F3F3F4;
padding-left: 37px;
border: 0;
}
.el-icon-search{
font-size: 16px;
line-height: 32px;
color:#0081FF;
margin-left: 10px;
margin-right: 10px;
}
}
.list{
display: flex;
justify-content: space-between;
.item{
margin: 0 auto;
width: 33.3%;
height: 94px;
text-align: center;
cursor: pointer;
img{
width: 40px;
height: 40px;
margin-top: 16px;
}
p{
color: #3D3D3D;
font-size: 12px;
}
}
.item:hover{
background: #F6F9FC;
}
}
}
.zbgg{
height: 599px;
background: #FFFFFF;
border-radius: 4px;
padding: 16px;
.list{
margin-top: 16px;
}
.item{
border-bottom: 1px solid #EEEEEE;
padding: 10px 0;
cursor: pointer;
h3{
font-weight: 400;
color: rgba(35,35,35,0.8);
font-size: 14px;
padding-bottom: 8px;
margin: 0;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
p{
color: rgba(35,35,35,0.4);
font-size: 14px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
span{
margin-right: 15px;
}
}
}
.item:hover{
h3{
color:#0081FF;
}
}
.item:last-child{
border-bottom: 0;
}
}
.zbhxr{
height: 558px;
background: #FFFFFF;
border-radius: 4px;
padding: 16px;
.list{
margin-top: 16px;
}
.item{
border-bottom: 1px solid #EEEEEE;
padding: 10px 0;
cursor: pointer;
h3{
font-weight: 400;
color: rgba(35,35,35,0.8);
font-size: 14px;
padding-bottom: 8px;
margin: 0;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
p{
color: rgba(35,35,35,0.4);
font-size: 14px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
span{
margin-right: 15px;
}
}
}
.item:hover{
h3{
color:#0081FF;
}
}
.item:last-child{
border-bottom: 0;
}
}
}
} }
}
</style> </style>
...@@ -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'}"
...@@ -119,7 +119,6 @@ ...@@ -119,7 +119,6 @@
import dataRegion from '@/assets/json/dataRegion' import dataRegion from '@/assets/json/dataRegion'
import economiesDetail from './economies-detail' import economiesDetail from './economies-detail'
import skeleton from '../../component/skeleton' import skeleton from '../../component/skeleton'
import axios from 'axios'
export default { export default {
name: 'NationalEconomies', name: 'NationalEconomies',
components: { components: {
...@@ -220,7 +219,7 @@ ...@@ -220,7 +219,7 @@
}, },
// 查询提交 // 查询提交
async querySubmit() { async querySubmit() {
this.isSkeleton = true // this.isSkeleton = true
const params = { pageNum: this.pageIndex, pageSize: this.pageSize, year: this.queryParams.year,type:1 } const params = { pageNum: this.pageIndex, pageSize: this.pageSize, year: this.queryParams.year,type:1 }
if(this.queryParams.address){ if(this.queryParams.address){
let arr = this.$refs.address.getCheckedNodes(); let arr = this.$refs.address.getCheckedNodes();
......
<template> <template>
<div> <div class="zhongbiao">
<p class="text_p">注:数据来源大司空建筑大数据平台,统计范围为全国公开的中标项目,未公开的不含在内</p>
<skeleton v-if="isSkeleton" style="padding: 16px"></skeleton> <skeleton v-if="isSkeleton" style="padding: 16px"></skeleton>
<div v-if="!isSkeleton" class="zhongbiao"> <div v-if="!isSkeleton" class="td_content">
<div class="zb-content content1"> <div class="flex-box query-box">
<div class="flex-box query-box"> <div class="flex-box query-params">
<div class="flex-box query-params"> <span class="common-title">全国中标项目统计</span>
<span class="common-title">全国建筑企业概览</span> <el-select v-model="years" @change="handleYears(1)" multiple collapse-tags filterable class="form-content-width" placeholder="请选择" :popper-append-to-body='false' size="small">
</div> <el-option v-for="(item, index) in yearOptions" :key="index" :label="item" :value="item" />
</el-select>
</div> </div>
<div class="text">截止{{currentdate}},全国共有{{glDetail.major}}资质的企业{{total}}家,其中特级资质企业{{glDetail.tjCount}}家,占比{{glDetail.tjRate}}%;一级资质企业{{glDetail.tjCount}}家,占比{{glDetail.oneRate}}%;二级资质企业{{glDetail.twoCount}}家,占比{{glDetail.twoRate}}%;三级资质企业{{glDetail.threeCount}}家,占比{{glDetail.threeRate}}%</div> </div>
<div class="main1"> <div class="content_box" v-if="gyflState">
<div style="height: 300px;"> <div class="box-left">
<div class="left"> <div id="echarts1" style="height: 280px"></div>
<div class="item" v-for="(item,index) in glData" :class="typeIndex === index ? 'color':''" @click="handleClick(1,index)">{{item.major}}施工总承包<i></i></div>
</div>
<div class="right">
<div id="gl-echarts" style="height: 260px;background: #ffffff;"></div>
</div>
</div>
<p class="tips"><i class="el-icon-info"></i>数据来源大司空建筑大数据平台,统计范围为有效期内资质,未公开不包含在内</p>
</div> </div>
<div class="main2"> <div class="box-right">
<!--<div class="flex-box query-box head">--> <el-table
<!--<span>近五年全国招标总数<span class="number">10,610,000 </span></span>--> :data="xmtjList"
<!--<el-select v-model="year" filterable multiple collapse-tags class="form-content-width" placeholder="请选择">--> element-loading-text="Loading"
<!--<el-option v-for="(item, index) in yearOptions" :key="index" :label="item.name" :value="item.value" />--> border
<!--</el-select>--> show-summary
<!--</div>--> max-height="300"
<div class="table-item"> :summary-method="getSummaries"
<el-table fit
:data="zzTableData" highlight-current-row
border :default-sort = "{prop: 'count', order: 'descending'}"
fit >
highlight-current-row <el-table-column label="序号" width="60">
> <template slot-scope="scope">{{ scope.$index + 1 }}</template>
<el-table-column label="序号" width="60" align="left"> </el-table-column>
<template slot-scope="scope">{{ scope.$index + 1 }}</template> <el-table-column prop="type" label="项目类型" :formatter="formatStatus" width="100"/>
</el-table-column> <el-table-column prop="count" label="中标数量 (个)" align="right" :formatter="formatStatus" sortable width="130"/>
<el-table-column prop="major" label="资质类型"/> <el-table-column prop="countRate" label="数量占比(%)" align="right" :formatter="formatStatus" sortable width="140"/>
<el-table-column prop="money" label="中标总金额 (万元)" align="right" :formatter="formatStatus" sortable width="170"/>
<el-table-column label="特级" align="right"> <el-table-column prop="moneyRate" label="金额占比(%)" align="right" :formatter="formatStatus" sortable width="140"/>
<el-table-column prop="tjCount" label="数量(个)" align="right"/> </el-table>
<el-table-column prop="tjRate" label="占比(%)" align="right"/>
</el-table-column>
<el-table-column label="一级" align="right">
<el-table-column prop="oneCount" label="数量(个)" align="right"/>
<el-table-column prop="oneRate" label="占比(%)" align="right"/>
</el-table-column>
<el-table-column label="二级" align="right">
<el-table-column prop="twoCount" label="数量(个)" align="right"/>
<el-table-column prop="twoRate" label="占比(%)" align="right"/>
</el-table-column>
<el-table-column label="三级" align="right">
<el-table-column prop="threeCount" label="数量(个)" align="right"/>
<el-table-column prop="threeRate" label="占比(%)" align="right"/>
</el-table-column>
</el-table>
</div>
</div> </div>
</div> </div>
<div class="zb-content content2"> <div class="empty" v-if="!gyflState">
<div class="flex-box query-box"> <img class="img" src="@/assets/images/project/empty.png">
<div class="flex-box query-params"> <div class="p1">抱歉,暂无数据展示</div>
<span class="common-title">全国建筑企业地区分布</span> </div>
</div> </div>
<div v-if="!isSkeleton" class="td_content">
<div class="flex-box query-box">
<div class="flex-box query-params">
<span class="common-title">全国各地区中标统计TOP10</span>
<el-select v-model="years1" @change="handleYears(2)" multiple collapse-tags filterable class="form-content-width" placeholder="请选择" :popper-append-to-body='false' size="small">
<el-option v-for="(item, index) in yearOptions" :key="index" :label="item" :value="item" />
</el-select>
</div> </div>
<div class="main1"> </div>
<div class="tabs"> <div class="content_box" v-if="tdytState">
<div class="item" v-for="(item,index) in dqData" :class="qydqIndex === index ? 'color':''" @click="handleClick(2,index)">{{item.major}}<i></i></div> <div class="box-left">
</div> <div id="echarts2" style="height: 280px"></div>
<div id="jzqy-echarts" style="height: 250px"></div>
<p class="tips"><i class="el-icon-info"></i>数据来源大司空建筑大数据平台,统计范围为有效期内资质,未公开不包含在内</p>
</div> </div>
<div class="table-item"> <div class="box-right">
<el-table <el-table
:data="jzdqData" :data="topList"
element-loading-text="Loading"
border border
height="470" show-summary
max-height="300"
:summary-method="getSummaries"
fit fit
highlight-current-row highlight-current-row
:default-sort = "{prop: 'count', order: 'descending'}"
> >
<el-table-column label="序号" width="60" align="left"> <el-table-column label="序号" width="60">
<template slot-scope="scope">{{ scope.$index + 1 }}</template> <template slot-scope="scope">{{ scope.$index + 1 }}</template>
</el-table-column> </el-table-column>
<el-table-column prop="province" label="地区"/> <el-table-column prop="province" label="地区" :formatter="formatStatus" width="100"/>
<el-table-column label="特级" align="right"> <el-table-column prop="count" label="中标数量 (个)" align="right" :formatter="formatStatus" sortable width="130"/>
<el-table-column prop="tjCount" label="数量(个)" align="right"/> <el-table-column prop="countRate" label="数量占比(%)" align="right" :formatter="formatStatus" sortable width="150"/>
<el-table-column prop="tjRate" label="占比(%)" align="right"/> <el-table-column prop="sumMoney" label="中标总金额 (万元)" align="right" :formatter="formatStatus" width="140"/>
</el-table-column> <el-table-column prop="moneyRate" label="金额占比(%)" align="right" :formatter="formatStatus"/>
<el-table-column label="一级" align="right"> </el-table>
<el-table-column prop="oneCount" label="数量(个)" align="right"/> </div>
<el-table-column prop="oneRate" label="占比(%)" align="right"/> </div>
<div class="empty" v-if="!tdytState">
<img class="img" src="@/assets/images/project/empty.png">
<div class="p1">抱歉,暂无数据展示</div>
</div>
</div>
<div v-if="!isSkeleton" class="td_content">
<div class="flex-box query-box">
<div class="flex-box query-params">
<span class="common-title">全国中标金额分析</span>
<el-select v-model="years2" @change="handleYears(3)" multiple collapse-tags filterable class="form-content-width" placeholder="请选择" :popper-append-to-body='false' size="small">
<el-option v-for="(item, index) in yearOptions" :key="index" :label="item" :value="item" />
</el-select>
</div>
</div>
<div class="content_box" v-if="tdytState">
<div class="box-left">
<div id="echarts3" style="height: 280px"></div>
</div>
<div class="box-right">
<el-table
:data="zbjeList"
element-loading-text="Loading"
border
show-summary
max-height="285"
:summary-method="getSummaries"
fit
highlight-current-row
:default-sort = "{prop: 'count', order: 'descending'}"
>
<el-table-column label="序号" width="60">
<template slot-scope="scope">{{ scope.$index + 1 }}</template>
</el-table-column> </el-table-column>
<el-table-column label="二级" align="right"> <el-table-column prop="rangeName" label="中标金额" :formatter="formatStatus"/>
<el-table-column prop="twoCount" label="数量(个)" align="right"/> <el-table-column prop="count" label="中标数量 (个)" align="right" :formatter="formatStatus" sortable/>
<el-table-column prop="twoRate" label="占比(%)" align="right"/> <el-table-column prop="rate" label="占比(%)" align="right" :formatter="formatStatus" width="120" sortable/>
</el-table>
</div>
</div>
<div class="empty" v-if="!tdytState">
<img class="img" src="@/assets/images/project/empty.png">
<div class="p1">抱歉,暂无数据展示</div>
</div>
</div>
<div v-if="!isSkeleton" class="td_content">
<div class="flex-box query-box">
<div class="flex-box query-params">
<span class="common-title">全国中标趋势分析</span>
</div>
</div>
<div class="content_box">
<div class="box-left">
<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="getSummaries1"
fit
highlight-current-row
:default-sort = "{prop: 'count', order: 'descending'}"
>
<el-table-column label="序号" width="60">
<template slot-scope="scope">{{ scope.$index + 1 }}</template>
</el-table-column> </el-table-column>
<el-table-column prop="label" label="时间" :formatter="formatStatus" width="130"/>
<el-table-column prop="rate" label="下浮率(%)" align="right" :formatter="formatStatus" sortable/>
<el-table-column prop="count" label="统计项目数量 (个)" align="right" :formatter="formatStatus"/>
</el-table> </el-table>
</div> </div>
</div> </div>
<div class="zb-content content3"> <div class="empty" v-if="!tdytState">
<div class="flex-box query-box"> <img class="img" src="@/assets/images/project/empty.png">
<div class="flex-box query-params"> <div class="p1">抱歉,暂无数据展示</div>
<span class="common-title">全国建筑企业备案分布</span> </div>
</div> </div>
<div v-if="!isSkeleton" class="td_content">
<div class="flex-box query-box">
<div class="flex-box query-params">
<span class="common-title">全国中标业绩项目类型下浮率</span>
<el-select @change="handleYears(6)" style="margin-right: 8px" v-model="address" collapse-tags filterable class="form-content-width" placeholder="地区筛选" :popper-append-to-body='false' size="small">
<el-option v-for="(item, index) in addressList" :key="index" :label="item.label" :value="item.id" />
</el-select>
<el-select v-model="years4" @change="handleYears(6)" collapse-tags filterable class="form-content-width" placeholder="请选择" :popper-append-to-body='false' size="small">
<el-option v-for="(item, index) in yearOptions" :key="index" :label="item" :value="item" />
</el-select>
</div> </div>
<div class="text"> </div>
通过对全国建筑工程总承包一级及以上资质企业的备案数据分析,我们发现这些优质企业主要去了<span v-for="(item,index) in rankList">{{item.province}}{{ rankList.length === index+1 ? '':'、'}}</span>等地开展经营。</div> <div class="content_box" v-if="topList.length > 0 && !isSkeleton">
<div class="main1"> <div class="box-left">
<div id="ba-echarts" style="height: 250px"></div> <div id="echarts6" style="height: 300px"></div>
<p class="tips"><i class="el-icon-info"></i>数据来源大司空建筑大数据平台,统计范围为公开企业备案地数据。</p>
</div> </div>
<div class="table-item"> <div class="box-right">
<el-table <el-table
:data="zbData" :data="xmxflList"
element-loading-text="Loading"
border border
height="430" show-summary
max-height="280"
:summary-method="getSummaries2"
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="160"/>
<!--<el-table-column prop="zb" label="占比"/>--> <el-table-column prop="kcsjRate" label="勘察设计类下浮率(%)" align="right" :formatter="formatStatus"/>
<el-table-column prop="jlRate" label="监理类下浮率(%)" align="right" :formatter="formatStatus" width="160"/>
</el-table> </el-table>
</div> </div>
</div> </div>
<div class="empty" v-if="topList.length === 0 && !isSkeleton">
<img class="img" src="@/assets/images/project/empty.png">
<div class="p1">抱歉,暂无数据展示</div>
</div>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import * as echarts from 'echarts'; import * as echarts from 'echarts';
import { certGroupByMajorAndLevel,certGroupByMajorProvinceLevel,areaGroupByProvince } from '@/api/macro/macro' import dataRegion from '@/assets/json/dataRegion'
import { countBidByType,countBidGroupByProvince,rangeBidMoney,rangeBidFiveYears,lowerRateByYear,lowerRangeTenderType } from '@/api/macro/macro'
import skeleton from '../../component/skeleton' import skeleton from '../../component/skeleton'
export default { export default {
name: 'NationalEconomies', name: 'NationalEconomies',
components: { components: {
skeleton skeleton
}, },
data() { data() {
return { return {
typeIndex:0, addressList:[],
glData:[], address:'',
jzglData:[], years:[2023],
zzTableData:[], years1:[2023],
tableOption:[ years2:[2023],
{ years3:2023,
label:'资质类型', years4:2023,
prop:'major' yearOptions:[],
}, xmtjList:[],
{ topList:[],
label: '特级', zbjeList:[],
prop: 'levelValue', zbqsList:[],
child:[ xflList :[],
{ xmxflList :[],
label: '数量(个)', isSkeleton:true,
prop: 'count' gyflState:true,
}, tdytState:true,
{ topState:true,
label: '占比(%)', }
prop: 'rate' },
}, created() {
] this.dataRegion()
}, this.yearsData()
{ this.getCountBidByType()
label: '一级', this.$nextTick(() => {
prop: 'levelValue',
child:[ })
{ setTimeout(() => {
label: '数量(个)', this.getCountBidGroupByProvince()
prop: 'count' this.getRangeBidMoney()
}, this.getRangeBidFiveYears()
{ this.getLowerRateByYear()
label: '占比(%)', this.getLowerRangeTenderType()
prop: 'rate' }, 1000);
}, },
] mounted() {
},
{ },
label: '二级', beforeDestroy(){
prop: 'levelValue',
child:[ },
{ methods: {
label: '数量(个)', getCountBidByType(){
prop: 'count' let params={
}, yearStr:this.years.join(",")
{ }
label: '占比(%)', countBidByType(params).then(res => {
prop: 'rate' this.isSkeleton=false;
}, this.xmtjList=res.data.date;
] this.xmtjList.forEach(item =>{
}, item.money=Number(item.money)
{ })
label: '三级', var list=[];
prop: 'levelValue', for(var i=0;i<10;i++){
child:[ list.push(res.data.date[i])
{
label: '数量(个)',
prop: 'count'
},
{
label: '占比(%)',
prop: 'rate'
},
]
},
],
dqData:[],
qydqIndex:0,
zbData:[],
rankList:[],
jzdqData:[],
currentdate:'',
total:'',
glDetail:{},
isSkeleton:true,
}
},
created() {
setTimeout(() => {
this.isSkeleton=false;
this.getData()
}, 1000);
var date = new Date()
var year = date.getFullYear()
var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth()+ 1
var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
this.currentdate=year + '-' +month + '-' + day;
},
methods: {
getData(){
//全国建筑企业概览
certGroupByMajorAndLevel().then(res => {
let list=[];
for (let i=0; i<res.data.length; i++){
res.data[i].levelList=res.data[i].levelList.reverse();
let item={};
item.major=res.data[i].major+'施工总承包';
for (let j=0; j<res.data[i].levelList.length; j++){
if(res.data[i].levelList[j].levelValue === '特级'){
item.tjCount=res.data[i].levelList[j].count;
item.tjRate=res.data[i].levelList[j].rate;
}
if(res.data[i].levelList[j].levelValue === '一级'){
item.oneCount=res.data[i].levelList[j].count;
item.oneRate=res.data[i].levelList[j].rate;
}
if(res.data[i].levelList[j].levelValue === '二级'){
item.twoCount=res.data[i].levelList[j].count;
item.twoRate=res.data[i].levelList[j].rate;
}
if(res.data[i].levelList[j].levelValue === '三级'){
item.threeCount=res.data[i].levelList[j].count;
item.threeRate=res.data[i].levelList[j].rate;
}
} }
// item.levelList=res.data[i].levelList.reverse(); if(res.data){
list.push(item) this.$nextTick(() => {
this.initChart1(list)
})
}
})
},
getCountBidGroupByProvince(){
let params={
yearStr:this.years1.join(",")
} }
this.zzTableData=list; countBidGroupByProvince(params).then(res => {
this.glData=res.data; this.topList=res.data;
this.jzglData=this.glData[0].levelList; if(res.data){
this.glDetail=list[0] this.$nextTick(() => {
let total=0; this.initChart2(res.data)
for(let i=0; i<this.jzglData.length; i++){ })
total=total+this.jzglData[i].count }
})
},
getRangeBidMoney(){
let params={
yearStr:this.years2.join(",")
} }
this.total=total; rangeBidMoney(params).then(res => {
this.zbjeList=res.data;
this.initChart() var list=[];
}) for(var i=0;i<res.data.length;i++){
certGroupByMajorProvinceLevel().then(res => { var obj={};
this.dqData=res.data; obj.name=res.data[i].rangeName;
let data=this.dqData[0].province; obj.value=res.data[i].count;
let list=[]; obj.rate=res.data[i].rate;
for(let i=0; i<data.length; i++){ list.push(obj)
let item={}; }
item.province=data[i].province; if(res.data){
for (let j=0; j<data[i].levelList.length; j++){ this.$nextTick(() => {
if(data[i].levelList[j].levelValue === '特级'){ this.initChart3(list)
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; getRangeBidFiveYears(){
item.oneRate=data[i].levelList[j].rate; rangeBidFiveYears().then(res => {
} this.zbqsList=res.data;
if(data[i].levelList[j].levelValue === '二级'){ if(res.data){
item.twoCount=data[i].levelList[j].count; this.$nextTick(() => {
item.twoRate=data[i].levelList[j].rate; this.initChart4(res.data)
} })
if(data[i].levelList[j].levelValue === '三级'){
item.threeCount=data[i].levelList[j].count;
item.threeRate=data[i].levelList[j].rate;
}
} }
list.push(item) })
},
getLowerRateByYear(){
let params={
yearStr:this.years3
} }
this.jzdqData=list lowerRateByYear(params).then(res => {
this.initChart1() for (var i=0; i<res.data.length; i++){
}) res.data[i].rate=res.data[i].rate.toFixed(2)
areaGroupByProvince().then(res => { }
this.zbData=res.data; this.xflList=res.data;
//定义一个变量 保存数据 因为sort方法排序会改变原数组 使用JSON方法深拷贝 将原数值暂存 if(res.data){
// let dataArr = JSON.parse(JSON.stringify(res.data)) this.$nextTick(() => {
let arr=res.data.sort((old,New)=>{ this.initChart5(res.data)
return New.count - old.count })
}
}) })
let data=[] },
for(let i=0; i<5; i++){ getLowerRangeTenderType(){
data.push(arr[i]) let params={
yearStr:this.years4,
} }
this.rankList=data; if(this.address){
//将原数组数据赋值回去 保持数据不变 params.provinceId=this.address
// this.zbData = JSON.parse(JSON.stringify(dataArr)) }
this.initChart2() lowerRangeTenderType(params).then(res => {
})
}, for (var i=0; i<res.data.length; i++){
initChart() { for (let j=0; j<res.data[i].typeList.length; j++){
let myChart = echarts.init(document.getElementById("gl-echarts")) if(res.data[i].typeList[j].tenderType === '施工'){
let option ={ res.data[i].sgRate=res.data[i].typeList[j].rate.toFixed(2)
tooltip: { }
// show:false if(res.data[i].typeList[j].tenderType === '勘察设计'){
}, res.data[i].kcsjRate=res.data[i].typeList[j].rate.toFixed(2)
xAxis: { }
type: 'category', if(res.data[i].typeList[j].tenderType === '监理'){
boundaryGap: false, res.data[i].jlRate=res.data[i].typeList[j].rate.toFixed(2)
data: this.jzglData.map(item => item.levelValue), }
}, }
yAxis: { }
type: 'value', this.xmxflList=res.data;
}, if(this.xmxflList){
grid: { this.$nextTick(() => {
top:40, this.initChart6(this.xmxflList)
left:70, })
right:40, }
bottom:40, })
}, },
series: [ initChart1(data) {
{ this.$nextTick(() => {
data: this.jzglData.map(item => item.count), let myChart = echarts.init(document.getElementById("echarts1"))
type: 'line', let option ={
smooth: true, tooltip: {
emphasis: { trigger: 'axis',
disabled: true, axisPointer: {
focus: 'none' type: 'cross'
}, }
//设置折线颜色和粗细
lineStyle: {
width: 1,
color: "#0081FF",
}, },
itemStyle:{ xAxis: {
color: "#4E8EFF", type: 'category',
axisLabel: { //坐标轴刻度标签的相关设置
margin: 10, //刻度标签与轴线之间的距离
color:"#666666",
show: true,
interval: 0
},
axisTick: false, //坐标轴刻度
axisPointer: {
type: 'shadow'
},
data: data.map(item => item.type),
}, },
//设置面积区域为渐变效果 yAxis: [
areaStyle: { {
color: echarts.graphic.LinearGradient(0, 1, 0, 0, [ type: 'value',
{ axisLabel: { //坐标轴刻度标签的相关设置
offset: 0.2, color:"#666666"
color: "#DFEAFF", },
name: '单位:个',
nameLocation: 'start',
nameTextStyle: {
padding: [0, 0, 0, -60], // 四个数字分别为上右下左与原位置距离
color: '#666666',
}, },
{ splitLine: {
offset: 1, show: true,
color: "#5895FF", lineStyle: {
type: 'dashed',
color: ['#FFFFFF']
}
}
},
{
type: 'value',
axisLabel: { //坐标轴刻度标签的相关设置
color:"#666666"
},
name: '单位:万元',
nameLocation: 'start',
nameTextStyle: {
padding: [0, 0, 0, 72], // 四个数字分别为上右下左与原位置距离
color: '#666666',
}, },
]), splitLine: {
show: true,
lineStyle: {
type: 'dashed',
color: ['#FFFFFF']
}
}
}
],
grid: {
top:30,
left:70,
right:100,
bottom:30,
}, },
series: [
{
name:'中标金额(万元)',
smooth: false, //平滑
type:"line",
symbolSize: 5,
yAxisIndex: 1,
tooltip: {
valueFormatter: function (value) {
return value + '万元'
}
},
itemStyle: {
color: '#14C9C9'
},
data:data.map(item => item.money),
},
{
name:'中标总数(个)',
type: 'bar',
barWidth: 20,
tooltip: {
valueFormatter: function (value) {
return value + '个';
}
},
itemStyle: {
normal:{
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [{
offset: 0,
color: '#56A5FF'
}, {
offset: 1,
color: '#1B8EFF'
}])
}
},
data:data.map(item => item.count),
}
]
} }
] myChart.setOption(option);
} window.addEventListener("resize", function () {
myChart.clear(); //图表清除 myChart.resize();//图表跟随页面大小变化宽度
myChart.setOption(option); });
window.addEventListener("resize", function () { })
myChart.resize();//图表跟随页面大小变化宽度 },
}); initChart2(data) {
}, this.$nextTick(() => {
initChart1() { // console.log(typeList)
let myChart = echarts.init(document.getElementById("jzqy-echarts")) let myChart = echarts.init(document.getElementById("echarts2"))
let option ={ let seriesData=[]
legend: { let color=['#FCD68A', '#67B3FD', '#FFB8AD', '#FFD7AD', '#A9F1E5', '#D0FAB7', '#ADC0FF', '#BEECFF', '#81D5BC', '#FFE48A'];
x:'right', let typeNameList=data[0].projectType.map(item => item.type);
padding:[0,30,0,0], let item={}
}, for(var i=0; i<data.length; i++){
tooltip: { for(var j=0; j<data[i].projectType.length; j++){
trigger: 'axis', item[typeNameList[j]] = [];
axisPointer: {
type: 'line',
label: {
backgroundColor: '#FFFFFF'
} }
} }
}, for(var i=0; i<data.length; i++) {
xAxis: { for (var j = 0; j < data[i].projectType.length; j++) {
type: 'category', if(data[i].projectType[j].type === typeNameList[0]){
boundaryGap: false, item[typeNameList[0]].push(data[i].projectType[j].count)
data: this.jzdqData.map(item => item.province), }
}, if(data[i].projectType[j].type === typeNameList[1]){
yAxis: { item[typeNameList[1]].push(data[i].projectType[j].count)
type: 'value', }
}, if(data[i].projectType[j].type === typeNameList[2]){
grid: { item[typeNameList[2]].push(data[i].projectType[j].count)
top:35, }
left:60, if(data[i].projectType[j].type === typeNameList[3]){
right:30, item[typeNameList[3]].push(data[i].projectType[j].count)
bottom:20, }
}, if(data[i].projectType[j].type === typeNameList[4]){
series: [ item[typeNameList[4]].push(data[i].projectType[j].count)
{ }
data: this.jzdqData.map(item => item.tjCount), if(data[i].projectType[j].type === typeNameList[5]){
name:'特级', item[typeNameList[5]].push(data[i].projectType[j].count)
type: 'line', }
smooth: true, if(data[i].projectType[j].type === typeNameList[6]){
emphasis: { item[typeNameList[6]].push(data[i].projectType[j].count)
disabled: true, }
focus: 'none' if(data[i].projectType[j].type === typeNameList[7]){
item[typeNameList[7]].push(data[i].projectType[j].count)
}
if(data[i].projectType[j].type === typeNameList[8]){
item[typeNameList[8]].push(data[i].projectType[j].count)
}
if(data[i].projectType[j].type === typeNameList[9]){
item[typeNameList[9]].push(data[i].projectType[j].count)
}
}
}
for(var i=0; i<typeNameList.length; i++) {
seriesData.push({
name:typeNameList[i],
smooth: false, //平滑
type:"line",
symbolSize: 6, //折线拐点大小
itemStyle: {
normal: {
color: color[i], //图例颜色
borderWidth: 4,
borderColor: color[i],
lineStyle: { color: color[i], width: 2 }
}
},
data:item[typeNameList[i]],
});
}
let option ={
// legend: {
// left: "center",
// bottom: 0,
// itemHeight:8,
// itemWidth:16,
// },
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'line',
label: {
backgroundColor: '#FFFFFF'
}
}
}, },
//设置折线颜色和粗细 xAxis: {
lineStyle: { type: 'category',
width: 2, boundaryGap: false,
color: "#0081FF", axisLabel: {
show: true,
interval: 0
},
data: data.map(item => item.province),
}, },
itemStyle:{ yAxis: {
color: "#4E8EFF", type: 'value',
}, },
//设置面积区域为渐变效果 grid: {
areaStyle: { top:30,
opacity:0.8, left:50,
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [ right:20,
{ bottom:30,
offset: 0.2,
color: "#DFEAFF",
},
{
offset: 1,
color: "#5895FF",
},
]),
}, },
}, color:['#FCD68A', '#FFE48A', '#FFB8AD', '#FFD7AD', '#A9F1E5', '#D0FAB7', '#ADC0FF', '#BEECFF', '#81D5BC', '#67B3FD'],
{ series: seriesData
data: this.jzdqData.map(item => item.oneCount), }
name:'一级', myChart.setOption(option);
type: 'line', window.addEventListener("resize", function () {
smooth: true, myChart.resize();//图表跟随页面大小变化宽度
emphasis: { });
disabled: true, })
focus: 'none' },
initChart3(data) {
this.$nextTick(() => {
let myChart = echarts.init(document.getElementById("echarts3"))
let option ={
tooltip: {
trigger: 'item',
borderWidth:0,
backgroundColor:"rgba(255, 255, 255, 0.8)",
formatter: function (params) {
var result = ''
result+='<h3 style="color: #232226;padding: 0 0 5px 0;margin: 0;">'+ params.data.name +'</h3>'
result+='<p style="color: rgba(35,35,35,0.8);padding: 0;margin: 0;">'+ params.data.value +'个 </p>'
return result;
},
extraCssText:'width:150px!important;',
},
legend: {
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'],
lineStyle: { series: [
width: 2, {
color: "#FA6C6C", type: 'pie',
radius: '55%',
center: ['50%', '50%'],
data: data,
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
}
myChart.setOption(option);
window.addEventListener("resize", function () {
myChart.resize();//图表跟随页面大小变化宽度
});
})
},
initChart4(data) {
this.$nextTick(() => {
let myChart = echarts.init(document.getElementById("echarts4"))
let option ={
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross'
}
}, },
itemStyle:{ xAxis: {
color: "#FA6C6C", type: 'category',
axisLabel: { //坐标轴刻度标签的相关设置
margin: 15, //刻度标签与轴线之间的距离
color:"#666666",
},
axisTick: false, //坐标轴刻度
axisPointer: {
type: 'shadow'
},
data: data.map(item => item.year),
}, },
//设置面积区域为渐变效果 yAxis: [
areaStyle: { {
opacity:0.8, type: 'value',
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [ axisLabel: { //坐标轴刻度标签的相关设置
{ color:"#666666"
offset: 0.1,
color: "#FDF8F5",
}, },
{ name: '单位:个',
offset: 1, nameLocation: 'start',
color: "#FCD7C8", nameTextStyle: {
padding: [0, 0, 0, -60], // 四个数字分别为上右下左与原位置距离
color: '#666666',
}
},
{
type: 'value',
axisLabel: { //坐标轴刻度标签的相关设置
color:"#666666"
}, },
]), name: '单位:万元',
}, nameLocation: 'start',
}, nameTextStyle: {
{ padding: [0, 0, 0, 72], // 四个数字分别为上右下左与原位置距离
data: this.jzdqData.map(item => item.twoCount), color: '#666666',
name:'二级', },
type: 'line', splitLine: {
smooth: true, show: true,
emphasis: { lineStyle: {
disabled: true, type: 'dashed',
focus: 'none' color: ['#FFFFFF']
}, }
//设置折线颜色和粗细 }
lineStyle: { }
width: 2, ],
color: "#8077F2", grid: {
}, top:30,
itemStyle:{ left:80,
color: "#8077F2", right:90,
bottom:30,
}, },
//设置面积区域为渐变效果 series: [
areaStyle: { {
opacity:0.8, name:'中标金额(万元)',
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [ smooth: false, //平滑
{ type:"line",
offset: 0.1, symbolSize: 6,
color: "#ECE8FF", yAxisIndex: 1,
tooltip: {
valueFormatter: function (value) {
return value + '万元'
}
}, },
{ itemStyle: {
offset: 1, color: '#14C9C9'
color: "#BCC0FF",
}, },
]), data:data.map(item => item.sumMoney),
}, },
}, {
{ name:'中标总数(个)',
data: this.jzdqData.map(item => item.threeCount), type: 'bar',
name:'三级', barWidth: 20,
type: 'line', tooltip: {
smooth: true, valueFormatter: function (value) {
emphasis: { return value + '个';
disabled: true, }
focus: 'none' },
itemStyle: {
normal:{
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [{
offset: 0,
color: '#56A5FF'
}, {
offset: 1,
color: '#1B8EFF'
}])
}
},
data:data.map(item => item.count),
}
]
}
myChart.setOption(option);
window.addEventListener("resize", function () {
myChart.resize();//图表跟随页面大小变化宽度
});
})
},
initChart5(data) {
this.$nextTick(() => {
let myChart = echarts.init(document.getElementById("echarts5"))
let option ={
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross'
}
}, },
//设置折线颜色和粗细 xAxis: {
lineStyle: { type: 'category',
width: 2, axisLabel: { //坐标轴刻度标签的相关设置
color: "#FA936C", margin: 10, //刻度标签与轴线之间的距离
color:"#666666",
// show: true,
// interval: 0
},
axisTick: false, //坐标轴刻度
axisPointer: {
type: 'shadow'
},
data: data.map(item => item.label),
}, },
itemStyle:{ yAxis: [
color: "#FA936C", {
type: 'value',
axisLabel: { //坐标轴刻度标签的相关设置
color:"#666666"
},
name: '单位:个',
nameLocation: 'start',
nameTextStyle: {
padding: [0, 0, 0, -60], // 四个数字分别为上右下左与原位置距离
color: '#666666',
}
},
{
type: 'value',
axisLabel: { //坐标轴刻度标签的相关设置
color:"#666666"
},
name: '单位:%',
nameLocation: 'start',
nameTextStyle: {
padding: [0, 0, 0, 72], // 四个数字分别为上右下左与原位置距离
color: '#666666',
},
splitLine: {
show: true,
lineStyle: {
type: 'dashed',
color: ['#FFFFFF']
}
}
}
],
grid: {
top:30,
left:70,
right:70,
bottom:30,
}, },
//设置面积区域为渐变效果 series: [
areaStyle: { {
opacity:0.8, name:'下浮率',
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [ smooth: false, //平滑
{ type:"line",
offset: 0.1, symbolSize: 5,
color: "#FEFBFA", yAxisIndex: 1,
tooltip: {
valueFormatter: function (value) {
return value + '%'
}
}, },
{ itemStyle: {
offset: 1, color: '#14C9C9'
color: "#FCD7C8",
}, },
]), data:data.map(item => item.rate),
},
{
name:'统计项目数量',
type: 'bar',
barWidth: 18,
tooltip: {
valueFormatter: function (value) {
return value + '个';
}
},
itemStyle: {
normal:{
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [{
offset: 0,
color: '#56A5FF'
}, {
offset: 1,
color: '#1B8EFF'
}])
}
},
data:data.map(item => item.count),
}
]
}
myChart.setOption(option);
window.addEventListener("resize", function () {
myChart.resize();//图表跟随页面大小变化宽度
});
})
},
initChart6(data) {
this.$nextTick(() => {
let myChart = echarts.init(document.getElementById("echarts6"))
let option ={
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'line',
label: {
backgroundColor: '#FFFFFF'
}
}
}, },
}, xAxis: {
] type: 'category',
} boundaryGap: false,
myChart.clear(); axisLabel: {
myChart.setOption(option); show: true,
window.addEventListener("resize", function () { interval: 0,
myChart.resize();//图表跟随页面大小变化宽度 },
}); data: data.map(item => item.month),
},
initChart2() {
let myChart = echarts.init(document.getElementById("ba-echarts"))
let option ={
tooltip: {
// show:false
},
legend:{},
xAxis: {
type: 'category',
boundaryGap: false,
data: this.zbData.map(item => item.province),
},
yAxis: {
type: 'value',
},
grid: {
top:20,
left:65,
right:50,
bottom:20,
},
series: [
{
data: this.zbData.map(item => item.count),
type: 'line',
smooth: true,
emphasis: {
disabled: true,
focus: 'none'
}, },
//设置折线颜色和粗细 yAxis: {
lineStyle: { type: 'value',
width: 1,
color: "#FFAB44",
}, },
itemStyle:{ grid: {
color: "#FFAB44", top:30,
left:50,
right:50,
bottom:30,
}, },
//设置面积区域为渐变效果 color:['#D0FAB7', '#E9C8FF', '#81D5BC'],
areaStyle: { series: [
color: echarts.graphic.LinearGradient(0, 1, 0, 0, [ {
{ name:'勘察项目下浮率',
offset: 0.2, smooth: false, //平滑
color: "#FFEDD0", type:"line",
symbolSize: 6, //折线拐点大小
itemStyle: {
normal: {
borderWidth: 4,
lineStyle: { width: 2 }
}
}, },
{ data:data.map(item => item.kcsjRate),
offset: 1, },
color: "#FFC671", {
name:'施工类项目下浮率',
smooth: false, //平滑
type:"line",
symbolSize: 6, //折线拐点大小
itemStyle: {
normal: {
borderWidth: 4,
lineStyle: { width: 2 }
}
}, },
]), data:data.map(item => item.sgRate),
}, },
{
name:'监理类项目下浮率',
smooth: false, //平滑
type:"line",
symbolSize: 6, //折线拐点大小
itemStyle: {
normal: {
borderWidth: 4,
lineStyle: { width: 2 }
}
},
data:data.map(item => item.jlRate),
},
]
} }
] myChart.setOption(option);
} window.addEventListener("resize", function () {
myChart.setOption(option); myChart.resize();//图表跟随页面大小变化宽度
window.addEventListener("resize", function () { });
myChart.resize();//图表跟随页面大小变化宽度 })
}); },
},
handleClick(type,index){ //地区
if(type === 1){ async dataRegion() {
this.typeIndex=index; var str = [];
this.jzglData=this.glData[index].levelList; for (let x = 0; x < 3; x++) {
let total=0 for (let i = 0; i < dataRegion.length; i++) {
for(let i=0; i<this.jzglData.length; i++){ if (dataRegion[i].regionLevel == x + 1 && x + 1 == 1) {
total=total+this.jzglData[i].count str.push({
} 'id': dataRegion[i].id,
this.total=total; "label": dataRegion[i].regionName,
this.glDetail=this.zzTableData[index] "short": dataRegion[i].short,
this.initChart() "value": dataRegion[i].parentId,
} "children": []
if(type === 2){ });
this.qydqIndex=index;
let data=this.dqData[index].province;
let list=[];
for(let i=0; i<data.length; i++){
let item={};
item.province=data[i].province;
for (let j=0; j<data[i].levelList.length; j++){
if(data[i].levelList[j].levelValue === '特级'){
item.tjCount=data[i].levelList[j].count;
item.tjRate=data[i].levelList[j].rate;
} }
if(data[i].levelList[j].levelValue === '一级'){ }
item.oneCount=data[i].levelList[j].count; }
item.oneRate=data[i].levelList[j].rate; this.addressList = str;
},
handleYears(key){
switch (key) {
case 1:
this.getCountBidByType()
break;
case 2:
this.getCountBidGroupByProvince()
break;
case 3:
this.getRangeBidMoney()
break;
case 5:
this.getLowerRateByYear()
break;
case 6:
this.getLowerRangeTenderType()
break;
}
},
handleSearch(){
// console.log(this.address)
},
yearsData(){
let mydate=new Date();
let Year = mydate.getFullYear();
let startyear=mydate.getFullYear()-4;
let Years=[];
for(var i=startyear;i<=Year;i++){
Years.push(i);
}
this.yearOptions=Years.reverse()
},
formatStatus: function(row, column, cellValue) {
return cellValue? cellValue : '-'
},
getSummaries(param){
const { columns, data } = param;
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '合计';
return;
}
if (index === 1 || index === 3 || index === 5) {
sums[index] = '-';
return;
}
const values = data.map(item => Number(item[column.property]));
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr);
if (!isNaN(value)) {
return Number(prev) + Number(curr)
} else {
return prev;
} }
if(data[i].levelList[j].levelValue === '二级'){ }, 0);
item.twoCount=data[i].levelList[j].count;
item.twoRate=data[i].levelList[j].rate; if (index === 4) {
sums[index] = Number(sums[index]).toFixed(2);
return;
}
});
return sums;
},
getSummaries1(param){
const { columns, data } = param;
const sums = [];
columns.forEach((column, index) => {
if (index === 1) {
sums[index] = '平均下浮率';
return;
}
if (index === 0 ||index === 3) {
sums[index] = '-';
return;
}
const values = data.map(item => Number(item[column.property]));
let length=0
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr);
if (!isNaN(value)) {
length=values.length
return Number(prev) + Number(curr)
} else {
return prev;
} }
if(data[i].levelList[j].levelValue === '三级'){ }, 0);
item.threeCount=data[i].levelList[j].count;
item.threeRate=data[i].levelList[j].rate; if (index === 2) {
sums[index] = (Number(sums[index])/length).toFixed(2);
return;
}
});
return sums;
},
getSummaries2(param){
const { columns, data } = param;
const sums = [];
columns.forEach((column, index) => {
if (index === 1) {
sums[index] = '平均下浮率';
return;
}
if (index === 0) {
sums[index] = '-';
return;
}
const values = data.map(item => Number(item[column.property]));
let length=0
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr);
if (!isNaN(value)) {
length=values.length
return Number(prev) + Number(curr)
} else {
return prev;
} }
}, 0);
if (index === 2||index === 3||index === 4) {
sums[index] = (Number(sums[index])/length).toFixed(2);
return;
} }
list.push(item) });
} return sums;
this.jzdqData=list; },
this.$nextTick(()=>{
this.initChart1()
})
} }
},
} }
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.zhongbiao{ .zhongbiao{
.zb-content{ padding-top: 16px;
.text_p{
color: #999999;
font-size: 14px;
margin: 0;
}
.empty{
margin: 0 auto;
height: 300px;
text-align: center;
.img{
width: 108px;
height: 108px;
margin-bottom: 24px;
margin-top: 70px;
}
.p1{
color: #333333;
font-size: 16px;
}
}
.query-params{
.common-title{
margin-right: 24px;
}
::v-deep .form-content-width{
width: 150px;
.el-select__input{
width: 10px !important;
max-width: 10px !important;
margin-left:0;
}
}
::v-deep .el-cascader{
width: 220px;
.el-cascader__tags{
flex-wrap: inherit;
.el-tag{
max-width: 130px;
}
}
}
}
.td_content{
background: #ffffff; background: #ffffff;
border-radius: 4px; border-radius: 4px;
margin-top: 12px; margin-top: 12px;
padding: 16px; padding: 16px 52px 16px 16px;
}
.text{
width: 100%;
line-height: 28px;
padding: 0 16px;
margin-top: 24px;
font-size: 12px;
color: rgba(35,35,35,0.8);
background: #F4F4F5;
border-radius: 2px;
margin-bottom: 24px;
} }
.tips{ .content_box{
margin: 0; display: flex;
padding-top: 16px; justify-content: space-between;
font-size: 12px; .box-left{
color: rgba(35,35,35,0.4); width: 50%;
i{
color:#909399;
margin-right: 9px;
font-size: 14px;
} }
} .box-right{
.content1{ width: 43%;
.main1{ float: right;
.left{ ::v-deep .el-table{
width: 20%; .sort-caret.ascending{
float: left; border-bottom-color: rgba(0,129,255,0.5);
.item{ }
height: 74px; .ascending .sort-caret.ascending{
line-height: 74px; border-bottom-color: #0081FF;
color: #333333; }
font-size: 16px; .sort-caret.descending{
padding-left: 30px; border-top-color: rgba(0,129,255,0.5);
border-top: 1px solid #EAF3FF; }
border-left: 1px solid #EAF3FF; .descending .sort-caret.descending{
border-right: 1px solid #EAF3FF; border-top-color: #0081FF;
cursor: pointer; }
}
.item:last-child{ .el-table__header-wrapper{
border-bottom: 1px solid #EAF3FF;
}
.color{
background: #F0F3FA; background: #F0F3FA;
color:#0081FF; th{
i{ background: #F0F3FA;
width: 4px; /*text-align: left;*/
height: 29px;
background: #0081FF;
border-radius: 10px;
display: inline-block;
float: right;
margin-top: 22px;
} }
} }
} .el-table__footer-wrapper{
.right{ background: #F0F3FA;
width: 79%; }
float: right; th {
background: #F0F3FA; font-size: 13px !important;
height: 295px; font-weight: 400 !important;
padding: 16px; }
} .cell {
} padding-right: 12px !important;
.main2{ padding-left: 12px !important;
margin-top: 30px; line-height: 18px;
.head{ }
span{ .el-table__fixed-header-wrapper{
font-size: 12px; th{
color: rgba(35,35,35,0.8); background: #F0F3FA;
}
.number{
color:#FF3C3C;
}
::v-deep .el-select{
width: 100px;
height: 32px;
.el-input{
width: 100%;
height: 32px;
} }
.el-input__inner{ }
height: 32px !important; td.el-table__cell{
line-height: 32px; border-bottom: 0;
}
tr{
&.current-row>td{
background-color: initial;
}
&:nth-child(2n) {
background: #F8FBFF;
} }
} }
} .el-table__cell{
} height: 40px;
.table-item{ padding: 0;
margin-top: 12px; line-height: 40px;
} }
} .el-table__body tr:hover > td.el-table__cell{
.content2{ background: #DCEBFF;
.tabs{ }
margin-top: 32px; ::-webkit-scrollbar-track-piece {
margin-bottom: 24px; //滚动条凹槽的颜色,还可以设置边框属性
.item{ background-color: #F3F4F5;
display: inline-block; height: 16px;
color: #3D3D3D; padding: 0 4px;
font-size: 14px; }
margin-right: 24px; //滚动条的宽度
cursor: pointer; ::-webkit-scrollbar {
} width: 8px;
.color{ height: 8px;
color: #3D3D3D; background-color: #F3F4F5;
font-weight: 700; border-radius: 6px;
position: relative; }
i{ //滚动条的滑块
width: 42px; ::-webkit-scrollbar-thumb {
height: 2px; border-radius: 8px;
background: #0081FF; height: 8px;
display: inline-block; margin: 0 4px;
position: absolute; background: rgba(98,110,126,0.2);
bottom:-4px; border: 4px solid rgba(98,110,126,0.2);;
left: 50%; &:hover{
transform: translate(-50%,0); background: #566380;
}
} }
}
}
.table-item{
margin-top: 32px;
}
}
.content3{
.table-item{
margin-top: 32px;
}
.table-item {
::v-deep .el-table {
.has-gutter{ .has-gutter{
tr{ tr{
th:nth-child(3){ th:nth-last-child(2){
border-right:0;
}
td:nth-last-child(2){
border-right:0; border-right:0;
.cell{
padding-right: 24px !important;
}
} }
} }
} }
} .el-table__cell.gutter{
} background: #F0F3FA;
}
.table-item{
::v-deep .el-table{
.el-table__header-wrapper{
th{
padding: 0;
} }
} .el-table__row{
.el-table__cell.is-right{ td:last-child{
text-align: right;
}
.has-gutter{
tr{
th:nth-child(6),th:nth-child(8){
border-right:0;
.cell{ .cell{
padding-right: 24px !important; padding-right: 12px !important;
} }
} }
} }
} }
.el-table__cell.gutter{ }
/*background: #F0F3FA;*/ }
width: 16px !important;
} ::v-deep .el-input--medium{
.el-table__row{ .el-input__icon{
td:last-child{ line-height: 32px;
.cell{
padding-right: 24px !important;
}
}
}
th{
font-size: 12px !important;
font-weight: 400 !important;
}
.el-table__fixed-header-wrapper th{
background: #F0F3FA;
}
td.el-table__cell{
border-bottom: 0;
}
.caret-wrapper{
width: 10px;
}
} }
} }
} }
......
...@@ -4,14 +4,14 @@ ...@@ -4,14 +4,14 @@
<el-tabs v-model="activeName" @tab-click="handleClick"> <el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="全国经济大全" name="first"></el-tab-pane> <el-tab-pane label="全国经济大全" name="first"></el-tab-pane>
<el-tab-pane label="全国商机项目分析" name="second"></el-tab-pane> <el-tab-pane label="全国商机项目分析" name="second"></el-tab-pane>
<!--<el-tab-pane label="全国中标市场分析" name="third"></el-tab-pane>--> <el-tab-pane label="全国中标市场分析" name="third"></el-tab-pane>
<el-tab-pane label="全国中标市场分析" name="fourth"></el-tab-pane> <el-tab-pane label="全国建筑企业分析" name="fourth"></el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>
<Economic v-if="activeName === 'first'"></Economic> <Economic v-if="activeName === 'first'"></Economic>
<Sjxmfx v-if="activeName === 'second'"></Sjxmfx> <Sjxmfx v-if="activeName === 'second'"></Sjxmfx>
<!--<Zhongbiao v-if="activeName === 'third'"></Zhongbiao>--> <Zhongbiao v-if="activeName === 'third'"></Zhongbiao>
<Jzqyfx v-if="activeName === 'fourth'"></Jzqyfx> <Jzqyfx v-if="activeName === 'fourth'"></Jzqyfx>
</div> </div>
</template> </template>
......
...@@ -153,7 +153,7 @@ ...@@ -153,7 +153,7 @@
element-loading-text="Loading" element-loading-text="Loading"
@sort-change="sortChange" @sort-change="sortChange"
border border
height="640" max-height="640"
fit fit
highlight-current-row highlight-current-row
> >
...@@ -162,6 +162,7 @@ ...@@ -162,6 +162,7 @@
</el-table-column> </el-table-column>
<el-table-column prop="companyName" label="公司名称" width="300" fixed> <el-table-column prop="companyName" label="公司名称" width="300" fixed>
<template slot-scope="scope"> <template slot-scope="scope">
<!--<router-link :to="`/groupAccount/${encodeStr(scope.row.companyId)}`" tag="a" class="a-link companyName" v-html="scope.row.companyName" ></router-link>-->
<router-link :to="`/enterprise/${encodeStr(scope.row.companyId)}`" tag="a" class="a-link companyName" v-html="scope.row.companyName" ></router-link> <router-link :to="`/enterprise/${encodeStr(scope.row.companyId)}`" tag="a" class="a-link companyName" v-html="scope.row.companyName" ></router-link>
<span @click="handleClick(scope.row)" class="table-span" style="color: #3D3D3D;cursor: pointer;" v-if="scope.row.claimStatus === null || scope.row.claimStatus === 1"><img src="@/assets/images/urban/rl_icon1.png"/>认领</span> <span @click="handleClick(scope.row)" class="table-span" style="color: #3D3D3D;cursor: pointer;" v-if="scope.row.claimStatus === null || scope.row.claimStatus === 1"><img src="@/assets/images/urban/rl_icon1.png"/>认领</span>
<span @click="cancelClaim(scope.row.companyName)" class="table-span" style="color: rgba(35,35,35,0.4);cursor: pointer;" v-if="scope.row.claimStatus === 0"><img src="@/assets/images/urban/rl_icon2.png"/>已认领</span> <span @click="cancelClaim(scope.row.companyName)" class="table-span" style="color: rgba(35,35,35,0.4);cursor: pointer;" v-if="scope.row.claimStatus === 0"><img src="@/assets/images/urban/rl_icon2.png"/>已认领</span>
...@@ -249,7 +250,7 @@ ...@@ -249,7 +250,7 @@
<el-dialog :visible.sync="claimVisible" width="244" custom-class='dialog-claim' :show-close="false"> <el-dialog :visible.sync="claimVisible" width="244" custom-class='dialog-claim' :show-close="false">
<div>认领成功,是否完善客户信息?</div> <div>认领成功,是否完善客户信息?</div>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button @click="innerVisible = true"> <el-button @click="claimVisible = false">
<router-link :to="`/enterprise/${encodeStr(companyId)}?customerId=${customerId}&path=business`" tag="a" > <router-link :to="`/enterprise/${encodeStr(companyId)}?customerId=${customerId}&path=business`" tag="a" >
立即完善 立即完善
</router-link> </router-link>
...@@ -364,7 +365,10 @@ export default { ...@@ -364,7 +365,10 @@ export default {
created() { created() {
this.dataRegion() this.dataRegion()
this.getType() this.getType()
this.dataQuery=this.$route.query; this.dataQuery=this.$route.params;
// console.log(this.dataQuery)
// console.log(this.$route.query)
// console.log(this.$route.params)
if(this.dataQuery.provinceId){ if(this.dataQuery.provinceId){
if(Array.isArray(this.dataQuery.province)){ if(Array.isArray(this.dataQuery.province)){
this.province=this.dataQuery.province[0]; this.province=this.dataQuery.province[0];
......
...@@ -19,9 +19,9 @@ ...@@ -19,9 +19,9 @@
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="招采单位:" class="row" prop="ownerCompany"> <el-form-item label="招采单位:" class="row" prop="ownerCompany">
<el-input type="text" placeholder="请输入" v-model="queryParam.ownerCompany" @input="getCompany" :οnkeyup="queryParam.ownerCompany=queryParam.ownerCompany.replace(/^\s+|\s+$/g,'')"></el-input> <el-input type="text" placeholder="请输入" v-model="queryParam.ownerCompany" @input="getCompany(1)" :οnkeyup="queryParam.ownerCompany=queryParam.ownerCompany.replace(/^\s+|\s+$/g,'')"></el-input>
<div class="resultlist" v-if="showlist" id="box"> <div class="resultlist infinite-list" v-if="showlist" v-infinite-scroll="load" id="box" style="overflow:auto">
<div v-for="(item,index) in companData" @click="selCompany(item)"><span v-html="item.name"></span></div> <div class="infinite-list-item" v-for="(item,index) in companData" @click="selCompany(item)"><span v-html="item.name" :key="companypage"></span></div>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="项目阶段:" class="row"> <el-form-item label="项目阶段:" class="row">
...@@ -96,6 +96,8 @@ ...@@ -96,6 +96,8 @@
projectType:[],//项目类型 projectType:[],//项目类型
projectCategory:[],//项目类别 projectCategory:[],//项目类别
proList:[],//项目列表 proList:[],//项目列表
companypage:1,
isscroll:false,
} }
}, },
mounted(){ mounted(){
...@@ -135,20 +137,41 @@ ...@@ -135,20 +137,41 @@
}, },
//获取建设库客户 //获取建设库客户
getCompany(value){ getCompany(value){
this.queryParam.companyId = '' this.queryParam.companyId = null
if (value.length>=2){ if(value == 1){
this.companData = []
this.companypage = 1
}
if (this.queryParam.ownerCompany.length>=2){
let param = { let param = {
keyword:value, keyword:this.queryParam.ownerCompany,
page:{ page:{
limit:20, limit:20,
page:1 page:this.companypage
} }
} }
getEnterprise(JSON.stringify(param)).then(result=>{ getEnterprise(JSON.stringify(param)).then(result=>{
if(result.code != 200) if(result.code != 200){
return return false
this.showlist = true }
this.companData = result.data.list if(result.data.list != null && result.data.list.length>0){
this.isscroll = true
if (this.companData.length===0) {
this.companData = result.data.list
} else {
let arr2 = result.data.list
arr2.unshift(2, 0);
Array.prototype.splice.apply(this.companData, arr2);
}
if(this.companData.length===0) {
this.showlist = false
}else{
this.showlist = true
}
this.companypage += 1
}else{
this.isscroll = false
}
}) })
} }
}, },
...@@ -167,6 +190,11 @@ ...@@ -167,6 +190,11 @@
}) })
} }
}, },
load(){
if(this.isscroll){
this.getCompany(2)
}
},
selCompany(item){ selCompany(item){
this.queryParam.companyId = item.jskEid this.queryParam.companyId = item.jskEid
this.queryParam.ownerCompany = item.name.replace(/<[^>]+>/g, '') this.queryParam.ownerCompany = item.name.replace(/<[^>]+>/g, '')
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
<div class="writting" v-if="isEdit == true" :class="{'w836':showtype!='gjjl'}"> <div class="writting" v-if="isEdit == true" :class="{'w836':showtype!='gjjl'}">
<div class="wri_top"> <div class="wri_top">
<img src="@/assets/images/project/add_3.png"> <img src="@/assets/images/project/add_3.png">
<el-input v-model="addParam.content" placeholder="新建一条跟进记录,如:周五上午预约客户上门拜访"></el-input> <el-input type="textarea" autosize resize="none" v-model="addParam.content" placeholder="新建一条跟进记录,如:周五上午预约客户上门拜访"></el-input>
</div> </div>
<div class="wr_bot"> <div class="wr_bot">
<div class="sels"> <div class="sels">
......
...@@ -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} 条`;
} }
}) })
}, },
......
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
<div style="position: relative"> <div style="position: relative">
<el-input placeholder="待添加" id="biaoqian" :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>
</div> </div>
</div> </div>
......
...@@ -37,7 +37,7 @@ module.exports = { ...@@ -37,7 +37,7 @@ module.exports = {
target: `http://47.104.91.229:9099/prod-api`, target: `http://47.104.91.229:9099/prod-api`,
// target: `http://122.9.160.122:9011`, // target: `http://122.9.160.122:9011`,
// target: `http://192.168.60.126:9011`, // target: `http://192.168.60.126:9011`,
// target: `http://192.168.60.27:8766`, // target: `http://192.168.60.126:9098`,
changeOrigin: true, changeOrigin: true,
pathRewrite: { pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: '' ['^' + process.env.VUE_APP_BASE_API]: ''
......
...@@ -3,6 +3,7 @@ package com.dsk.system.domain.business.dto; ...@@ -3,6 +3,7 @@ package com.dsk.system.domain.business.dto;
import com.dsk.common.core.domain.BaseEntity; import com.dsk.common.core.domain.BaseEntity;
import lombok.Data; import lombok.Data;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -72,4 +73,16 @@ public class BusinessListDto extends BaseEntity { ...@@ -72,4 +73,16 @@ public class BusinessListDto extends BaseEntity {
* 业主单位 * 业主单位
*/ */
private String ownerCompany; private String ownerCompany;
/**
* 项目状态
*/
private Integer status;
/**
* 开始时间
*/
private String startTime;
/**
* 结束时间
*/
private String endTime;
} }
package com.dsk.system.domain.business.dto;
import lombok.AllArgsConstructor;
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 {
/**
* 用户id
*/
private Long userId;
/**
* 状态
*/
private Integer status;
/**
* 数据权限
*/
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;
}
public BusinessSearchDto(Long userId, Integer status) {
this.userId = userId;
this.status = status;
}
}
package com.dsk.system.domain.business.vo;
import lombok.Data;
import java.io.Serializable;
/**
* 项目金额分析
*
* @author lcl
* @create 2023/8/15
*/
@Data
public class BusinessAnalyzeVo implements Serializable {
/**
* 项目类型
*/
private String projectType;
/**
* 资金来源
*/
private String amountSource;
/**
* 项目数量
*/
private Integer businessCount;
/**
* 总投资金额
*/
private Double totalAmount;
}
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;
}
package com.dsk.system.domain.customer.dto; package com.dsk.system.domain.customer.dto;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable; import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/** /**
* @author lcl * @author lcl
* @create 2023/5/16 * @create 2023/5/16
*/ */
@Data @Data
@NoArgsConstructor
public class CustomerSearchDto implements Serializable { public class CustomerSearchDto implements Serializable {
/** /**
* 企业id * 企业id
...@@ -22,6 +27,10 @@ public class CustomerSearchDto implements Serializable { ...@@ -22,6 +27,10 @@ public class CustomerSearchDto implements Serializable {
* 企业名称 * 企业名称
*/ */
private String companyName; private String companyName;
/**
* 企业性质
*/
private String companyNature;
/** /**
* 客户id * 客户id
*/ */
...@@ -34,5 +43,41 @@ public class CustomerSearchDto implements Serializable { ...@@ -34,5 +43,41 @@ public class CustomerSearchDto implements Serializable {
* 客户状态 0:正常 1:历史 * 客户状态 0:正常 1:历史
*/ */
private Integer status; private Integer status;
/**
* 是否上市 0:否 1:是
*/
private Integer isOn;
/**
* 省id
*/
private List<Integer> provinceIds;
/**
* 市id
*/
private List<Integer> cityIds;
/**
* 区id
*/
private List<Integer> districtIds;
/**
* 企业性质
*/
private List<String> companyNatures;
/**
* 信资等级
*/
private List<String> creditLevels;
/**
* 数据权限
*/
private Map<String, Object> params;
public Map<String, Object> getParams() {
if (params == null) {
params = new HashMap<>();
}
return params;
}
} }
package com.dsk.system.domain.customer.vo;
import lombok.Data;
import java.io.Serializable;
/**
* 客户分析
*
* @author lcl
* @create 2023/8/15
*/
@Data
public class CustomerAnalyzeVo implements Serializable {
/**
* 客户id
*/
private String customerId;
/**
* 企业名称
*/
private String companyName;
/**
* 企业id
*/
private Integer companyId;
/**
* 城投id
*/
private String uipId;
/**
* 项目数量
*/
private Integer businessCount;
/**
* 总投资金额
*/
private Double totalAmount;
}
...@@ -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
*/ */
...@@ -71,11 +71,11 @@ public class JskCombineSearchDto implements Serializable { ...@@ -71,11 +71,11 @@ public class JskCombineSearchDto implements Serializable {
/** /**
* 中标时间(开始) * 中标时间(开始)
*/ */
private Date startBidTime; private String startBidTime;
/** /**
* 中标时间(结束) * 中标时间(结束)
*/ */
private Date endBidTime; private String endBidTime;
/** /**
* 业绩类型 * 业绩类型
*/ */
...@@ -97,6 +97,13 @@ public class JskCombineSearchDto implements Serializable { ...@@ -97,6 +97,13 @@ public class JskCombineSearchDto implements Serializable {
* 每页条数 * 每页条数
*/ */
private Integer pageSize; private Integer pageSize;
/**
* 排序字段
*/
private String orderName;
/**
* 排序类型 ASC DESC
*/
private String orderType;
} }
...@@ -3,10 +3,12 @@ package com.dsk.system.dskService; ...@@ -3,10 +3,12 @@ package com.dsk.system.dskService;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.dsk.acc.openapi.client.util.CommonUtils;
import com.dsk.common.core.domain.R; import com.dsk.common.core.domain.R;
import com.dsk.common.core.domain.model.*; import com.dsk.common.core.domain.model.*;
import com.dsk.common.core.page.TableDataInfo; import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.utils.DskOpenApiUtil; import com.dsk.common.utils.DskOpenApiUtil;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils; import org.apache.commons.collections4.MapUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -56,23 +58,42 @@ public class EnterpriseBussinessService { ...@@ -56,23 +58,42 @@ public class EnterpriseBussinessService {
public TableDataInfo clientPage(EnterpriseBussinessClientPageBody body) throws Exception { public TableDataInfo clientPage(EnterpriseBussinessClientPageBody body) throws Exception {
if (body.isVaildCid()) return new TableDataInfo(new ArrayList<>(), 0); if (body.isVaildCid()) return new TableDataInfo(new ArrayList<>(), 0);
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/clientPage", BeanUtil.beanToMap(body, false, false)); Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/clientPage2", BeanUtil.beanToMap(body, false, false));
return dskOpenApiUtil.responsePage(map); return dskOpenApiUtil.responsePage(map);
} }
public Map<String, Object> clientProjectPage(EnterpriseBussinessClientProjectPageBody body) throws Exception { public TableDataInfo clientProjectPage(EnterpriseBussinessClientProjectPageBody body) throws Exception {
if (body.isVaildCid()) return null; if (body.isVaildCid()) return null;
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/clientProjectPage", BeanUtil.beanToMap(body, false, false)); Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/clientProjectPage2", BeanUtil.beanToMap(body, false, false));
Integer code = MapUtils.getInteger(map, "code", 300); Integer code = MapUtils.getInteger(map, "code", 300);
if (200 != code) {
throw new RuntimeException();
}
Map data = MapUtils.getMap(map, "data", null); Map data = MapUtils.getMap(map, "data", null);
if (200 != code) throw new RuntimeException(); List<Object> list = CommonUtils.assertAsArray(MapUtils.getObject(data, "list", ""));
Integer count = MapUtils.getInteger(data, "totalCount", 0); if (CollectionUtils.isEmpty(list)) {
Object list = MapUtils.getObject(data, "list", ""); return new TableDataInfo(list, 0);
TableDataInfo tableDataInfo = new TableDataInfo((List<?>) list, count); }
Map<String, Object> resMap = BeanUtil.beanToMap(tableDataInfo);
resMap.put("totalAmount", MapUtils.getDouble(data, "totalAmount", 0.0)); for (Object supplierProject : list) {
return resMap; Map<String, Object> dataMap = CommonUtils.assertAsMap(supplierProject);
dataMap.put("sourceId", null);
dataMap.put("sourceType", null);
dataMap.put("sourceList", null);
String source = MapUtils.getString(dataMap, "source");
if (ObjectUtil.isNotEmpty(source)) {
List<EnterpriseBussinessVo> enterpriseBussinessVoList = JSONUtil.toList(source, EnterpriseBussinessVo.class);
if (ObjectUtil.isNotEmpty(enterpriseBussinessVoList.get(0))) {
EnterpriseBussinessVo vo = enterpriseBussinessVoList.get(0);
dataMap.put("sourceId", vo.getSource_id());
dataMap.put("sourceType", vo.getSource_type());
dataMap.put("sourceList", enterpriseBussinessVoList);
}
}
}
return new TableDataInfo(list, MapUtils.getInteger(data, "totalCount", 0));
} }
...@@ -121,25 +142,47 @@ public class EnterpriseBussinessService { ...@@ -121,25 +142,47 @@ public class EnterpriseBussinessService {
public TableDataInfo supplierPage(EnterpriseBussinessSupplierPageBody body) throws Exception { public TableDataInfo supplierPage(EnterpriseBussinessSupplierPageBody body) throws Exception {
if (body.isVaildCid()) return new TableDataInfo(new ArrayList<>(), 0); if (body.isVaildCid()) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/supplierPage", BeanUtil.beanToMap(body, false, false)); return new TableDataInfo(new ArrayList<>(), 0);
}
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/supplierPage2", BeanUtil.beanToMap(body, false, false));
return dskOpenApiUtil.responsePage(map); return dskOpenApiUtil.responsePage(map);
} }
public Map<String, Object> supplierProjectPage(EnterpriseBussinessSupplierProjectPageBody body) throws Exception { public TableDataInfo supplierProjectPage(EnterpriseBussinessSupplierProjectPageBody body) throws Exception {
if (body.isVaildCid()) return null; if (body.isVaildCid()) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/supplierProjectPage", BeanUtil.beanToMap(body, false, false)); return new TableDataInfo(new ArrayList<>(), 0);
}
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/supplierProjectPage2", BeanUtil.beanToMap(body, false, false));
log.info(JSONUtil.toJsonStr(map)); log.info(JSONUtil.toJsonStr(map));
Integer code = MapUtils.getInteger(map, "code", 300); Integer code = MapUtils.getInteger(map, "code", 300);
if (200 != code) {
throw new RuntimeException();
}
Map data = MapUtils.getMap(map, "data", null); Map data = MapUtils.getMap(map, "data", null);
if (200 != code) throw new RuntimeException(); List<Object> list = CommonUtils.assertAsArray(MapUtils.getObject(data, "list", ""));
Integer count = MapUtils.getInteger(data, "totalCount", 0); if (CollectionUtils.isEmpty(list)) {
Object list = MapUtils.getObject(data, "list", ""); return new TableDataInfo(list, 0);
TableDataInfo tableDataInfo = new TableDataInfo((List<?>) list, count); }
Map<String, Object> resMap = BeanUtil.beanToMap(tableDataInfo);
resMap.put("totalAmount", MapUtils.getDouble(data, "totalAmount", 0.0)); for (Object supplierProject : list) {
return resMap; Map<String, Object> dataMap = CommonUtils.assertAsMap(supplierProject);
dataMap.put("sourceId", null);
dataMap.put("sourceType", null);
String source = MapUtils.getString(dataMap, "source");
if (ObjectUtil.isNotEmpty(source)) {
List<EnterpriseBussinessVo> enterpriseBussinessVoList = JSONUtil.toList(source, EnterpriseBussinessVo.class);
if (ObjectUtil.isNotEmpty(enterpriseBussinessVoList.get(0))) {
EnterpriseBussinessVo vo = enterpriseBussinessVoList.get(0);
dataMap.put("sourceId", vo.getSource_id());
dataMap.put("sourceType", vo.getSource_type());
dataMap.put("sourceList", enterpriseBussinessVoList);
}
}
}
return new TableDataInfo(list, MapUtils.getInteger(data, "totalCount", 0));
} }
...@@ -175,4 +218,63 @@ public class EnterpriseBussinessService { ...@@ -175,4 +218,63 @@ public class EnterpriseBussinessService {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/historySendProvince", BeanUtil.beanToMap(body, false, false)); Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/historySendProvince", BeanUtil.beanToMap(body, false, false));
return BeanUtil.toBean(map, R.class); return BeanUtil.toBean(map, R.class);
} }
public R bidWinMergeDetail(EnterpriseBusinessBidWinMergeDetailBody body) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/bidWinMergeDetail", BeanUtil.beanToMap(body, false, false));
return BeanUtil.toBean(map, R.class);
}
public R skyProjectDetail(EnterpriseBusinessSkyProjectDetailBody body) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/skyProjectDetail", BeanUtil.beanToMap(body, false, false));
return BeanUtil.toBean(map, R.class);
}
public R awardDetail(EnterpriseBusinessAwardDetailBody body) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseBussiness/awardDetail", BeanUtil.beanToMap(body, false, false));
Integer code = MapUtils.getInteger(map, "code", 300);
if (200 != code) {
throw new RuntimeException();
}
Map data = MapUtils.getMap(map, "data", null);
if (ObjectUtil.isNotEmpty(data)) {
String source = MapUtils.getString(data, "source");
if (ObjectUtil.isNotEmpty(source)) {
List<EnterpriseBusinessAwardDetailVo> enterpriseBussinessVoList = JSONUtil.toList(source, EnterpriseBusinessAwardDetailVo.class);
if (ObjectUtil.isNotEmpty(enterpriseBussinessVoList.get(0))) {
EnterpriseBusinessAwardDetailVo vo = enterpriseBussinessVoList.get(0);
return R.ok(vo);
}
}
}
return BeanUtil.toBean(map, R.class);
}
public R select(EnterpriseBusinessAwardDetailBody body) throws Exception {
Map<String, Object> map = new HashMap<>();
List<String> sourcesList = new ArrayList<>(5);
sourcesList.add("中标公示");
sourcesList.add("四库业绩");
sourcesList.add("中标业绩");
sourcesList.add("水利业绩");
sourcesList.add("荣誉奖项");
map.put("sources", sourcesList);
List<String> projectsList = new ArrayList<>(2);
projectsList.add("矿山工程");
projectsList.add("铁路工程");
projectsList.add("港口与航道工程");
projectsList.add("冶金工程");
projectsList.add("水利工程");
projectsList.add("机电工程");
projectsList.add("市政工程");
projectsList.add("石油化工工程");
projectsList.add("电力工程");
projectsList.add("通信工程");
projectsList.add("公路工程");
projectsList.add("房建工程");
projectsList.add("其他");
map.put("projects", projectsList);
return R.ok(map);
}
} }
...@@ -49,6 +49,30 @@ public class EnterpriseService { ...@@ -49,6 +49,30 @@ public class EnterpriseService {
@Autowired @Autowired
private RedisCache redisCache; private RedisCache redisCache;
public R label(EnterpriseInfoLabelBody body) throws Exception {
List<Map<String, Object>> mapList = new ArrayList<>();
if (body.isVaildCid()) {
return R.ok(mapList);
}
Map<String, Object> companyMap = dskOpenApiUtil.requestBody("/api/jsk/enterprise/label", BeanUtil.beanToMap(body, false, false));
Integer companyCode = MapUtils.getInteger(companyMap, "code", 300);
if (200 != companyCode) {
return R.ok(mapList);
}
// list
List<Map<String, Object>> data = (List<Map<String, Object>>) companyMap.get("data");
if (ObjectUtil.isNotEmpty(data)) {
for (Map<String, Object> labelsMap : data) {
String labelName = MapUtils.getString(labelsMap,"labelName", "");
if (labelName.equals("央企企业") || labelName.equals("国企") || labelName.equals("央企") ||
labelName.equals("央企子公司") || labelName.equals("国有企业") || labelName.equals("省属国企")) {
mapList.add(labelsMap);
}
}
}
return R.ok(mapList);
}
public R infoHeader(EnterpriseInfoHeaderBody body) throws Exception { public R infoHeader(EnterpriseInfoHeaderBody body) throws Exception {
if (body.isVaildCid()) return R.ok(); if (body.isVaildCid()) return R.ok();
Map<String, Object> companyMap = dskOpenApiUtil.requestBody("/api/jsk/enterprise/infoHeader", BeanUtil.beanToMap(body, false, false)); Map<String, Object> companyMap = dskOpenApiUtil.requestBody("/api/jsk/enterprise/infoHeader", BeanUtil.beanToMap(body, false, false));
......
package com.dsk.system.dskService;
import cn.hutool.core.bean.BeanUtil;
import com.dsk.common.core.domain.R;
import com.dsk.common.core.domain.model.*;
import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.utils.DskOpenApiUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
/**
* @ClassName enterpriseService
* @Description TODO
* @Author Dgm
* @Date 2023/5/15 12:00
* @Version 1.0
*/
@Service
public class IndexService {
private static final Logger log = LoggerFactory.getLogger(IndexService.class);
@Autowired
private DskOpenApiUtil dskOpenApiUtil;
public R winningBidsRanking(Map<String, Object> paramMap) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseProject/winningBidsRanking", paramMap);
return BeanUtil.toBean(map, R.class);
}
public R rankingProjectType(Map<String, Object> paramMap) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseProject/rankingProjectType", paramMap);
return BeanUtil.toBean(map, R.class);
}
public TableDataInfo bigWinningBidsPage(IndexBigWinningBidsPageBody body) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseProject/bigWinningBidsPage", BeanUtil.beanToMap(body, false, false));
return dskOpenApiUtil.responsePage(map);
}
public TableDataInfo bigBidPage(IndexBigBidPageBody body) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseProject/bigBidPage", BeanUtil.beanToMap(body, false, false));
return dskOpenApiUtil.responsePage(map);
}
public R bigBidProjectType(Map<String, Object> paramMap) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseProject/bigBidProjectType", paramMap);
return BeanUtil.toBean(map, R.class);
}
}
...@@ -3,6 +3,8 @@ package com.dsk.system.dskService; ...@@ -3,6 +3,8 @@ package com.dsk.system.dskService;
import cn.hutool.core.bean.BeanException; import cn.hutool.core.bean.BeanException;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson2.JSONObject;
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.common.utils.DskOpenApiUtil; import com.dsk.common.utils.DskOpenApiUtil;
...@@ -35,6 +37,17 @@ public class JskCombineInfoService { ...@@ -35,6 +37,17 @@ public class JskCombineInfoService {
public TableDataInfo memberList(JskCombineSearchDto dto) throws Exception { public TableDataInfo memberList(JskCombineSearchDto dto) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/combine/memberList", BeanUtil.beanToMap(dto, false, false)); Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/combine/memberList", BeanUtil.beanToMap(dto, false, false));
if (!ObjectUtils.isEmpty(map.get("data"))) {
Map<String, Object> data = BeanUtil.beanToMap(map.get("data"));
if (!ObjectUtils.isEmpty(data.get("list"))) {
List<Map<String, Object>> list = (List<Map<String, Object>>) data.get("list");
list.parallelStream().forEach(res -> {
Integer companyId = MapUtils.getInteger(res, "companyId");
String companyName = MapUtils.getString(res, "companyName");
res.put("uipId", enterpriseService.getUipIdByCompanyNameOrCompanyId(companyName, companyId));
});
}
}
return dskOpenApiUtil.responsePage(map); return dskOpenApiUtil.responsePage(map);
} }
...@@ -88,4 +101,44 @@ public class JskCombineInfoService { ...@@ -88,4 +101,44 @@ public class JskCombineInfoService {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/combine/group/certificateCount", BeanUtil.beanToMap(dto, false, false)); Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/combine/group/certificateCount", BeanUtil.beanToMap(dto, false, false));
return BeanUtil.toBean(map, R.class); return BeanUtil.toBean(map, R.class);
} }
public AjaxResult index(JSONObject object) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/nationzj/enterprice/groupCompany", object);
return BeanUtil.toBean(map, AjaxResult.class);
}
public AjaxResult centralEnterprse() {
Map<String, Object> map = dskOpenApiUtil.requestBody("/nationzj/enterprice/centralEnterprse", null);
return BeanUtil.toBean(map, AjaxResult.class);
}
public AjaxResult centralEnterprseChild() {
Map<String, Object> map = dskOpenApiUtil.requestBody("/nationzj/enterprice/centralEnterprse/child", null);
return BeanUtil.toBean(map, AjaxResult.class);
}
public AjaxResult centralEnterprseChildPage(JSONObject object) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/nationzj/enterprice/centralEnterprse/child/page", object);
return BeanUtil.toBean(map, AjaxResult.class);
}
public AjaxResult centralEnterprseLocal(JSONObject object) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/nationzj/enterprice/centralEnterprse/local", object);
return BeanUtil.toBean(map, AjaxResult.class);
}
public AjaxResult centralEnterprseLocalPage(JSONObject object) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/nationzj/enterprice/centralEnterprse/local/page", object);
return BeanUtil.toBean(map, AjaxResult.class);
}
public AjaxResult centralEnterprseSocial() {
Map<String, Object> map = dskOpenApiUtil.requestBody("/nationzj/enterprice/centralEnterprse/social", null);
return BeanUtil.toBean(map, AjaxResult.class);
}
public AjaxResult centralEnterprseSocialPage(JSONObject object) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/nationzj/enterprice/centralEnterprse/social/page", object);
return BeanUtil.toBean(map, AjaxResult.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);
} //}
...@@ -3,6 +3,8 @@ package com.dsk.system.mapper; ...@@ -3,6 +3,8 @@ 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.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.BusinessAnalyzeVo;
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,10 @@ public interface BusinessInfoMapper extends BaseMapper<BusinessInfo> { ...@@ -108,4 +110,10 @@ public interface BusinessInfoMapper extends BaseMapper<BusinessInfo> {
List<CustomerBusinessListVo> selectCustomerBusinessList(CustomerBusinessSearchDto dto); List<CustomerBusinessListVo> selectCustomerBusinessList(CustomerBusinessSearchDto dto);
int selectCountByStatus(BusinessSearchDto dto);
List<BusinessAnalyzeVo> selectAmountAnalyze(BusinessSearchDto dto);
List<BusinessAnalyzeVo> selectTypeAnalyze(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> {
//
} //}
//
...@@ -3,12 +3,14 @@ package com.dsk.system.mapper; ...@@ -3,12 +3,14 @@ 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.Customer; import com.dsk.system.domain.customer.Customer;
import com.dsk.system.domain.customer.dto.CustomerSearchDto; import com.dsk.system.domain.customer.dto.CustomerSearchDto;
import com.dsk.system.domain.customer.vo.CustomerAnalyzeVo;
import com.dsk.system.domain.customer.vo.CustomerListVo; import com.dsk.system.domain.customer.vo.CustomerListVo;
import com.dsk.system.domain.customer.vo.CustomerStatusListVo; import com.dsk.system.domain.customer.vo.CustomerStatusListVo;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
...@@ -20,7 +22,7 @@ import java.util.List; ...@@ -20,7 +22,7 @@ import java.util.List;
@Mapper @Mapper
public interface CustomerMapper extends BaseMapper<Customer> { public interface CustomerMapper extends BaseMapper<Customer> {
List<CustomerListVo> selectList(@Param("dto") CustomerSearchDto dto); List<CustomerListVo> selectList(CustomerSearchDto dto);
List<Customer> selectUserList(Long userId); List<Customer> selectUserList(Long userId);
...@@ -30,7 +32,11 @@ public interface CustomerMapper extends BaseMapper<Customer> { ...@@ -30,7 +32,11 @@ public interface CustomerMapper extends BaseMapper<Customer> {
List<CustomerStatusListVo> selectStatusListByCompanyName(@Param("companyNames") List<String> companyNames, @Param("userId") Long userId); List<CustomerStatusListVo> selectStatusListByCompanyName(@Param("companyNames") List<String> companyNames, @Param("userId") Long userId);
// List<String> selectUipIdList(@Param("uipIds") List<String> uipIds, @Param("userId") Long userId); int selectCustomerCount(CustomerSearchDto dto);
List<CustomerAnalyzeVo> selectCooperationTop(CustomerSearchDto dto);
List<Map<String, Object>> selectCreditLevelGroup(CustomerSearchDto dto);
} }
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.alibaba.fastjson2.JSONObject;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.system.domain.business.dto.BusinessSearchDto;
import com.dsk.system.domain.business.vo.BusinessAnalyzeVo;
import java.util.List;
import java.util.Map;
/**
* @author lcl
* @create 2023/8/14
*/
public interface IBusinessOverviewService {
Map<String, Object> statusStatistics(BusinessSearchDto dto);
List<BusinessAnalyzeVo> amountAnalyze(BusinessSearchDto dto);
List<BusinessAnalyzeVo> typeAnalyze(BusinessSearchDto dto);
AjaxResult countGroupByProvince(JSONObject object);
AjaxResult rangByMoney(JSONObject object);
}
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;
import com.dsk.system.domain.customer.dto.CustomerSearchDto;
import com.dsk.system.domain.customer.vo.CustomerAnalyzeVo;
import java.util.List;
import java.util.Map;
/**
* @author lcl
* @create 2023/8/15
*/
public interface ICustomerOverviewService {
Map<String, Object> statistics(CustomerSearchDto dto);
List<CustomerAnalyzeVo> cooperationTop(CustomerSearchDto dto);
List<Map<String, Object>> creditLevel(CustomerSearchDto dto);
}
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; package com.dsk.system.service.impl;
import com.dsk.common.annotation.DataScope;
import com.dsk.common.core.domain.entity.BusinessFollowRecord; import com.dsk.common.core.domain.entity.BusinessFollowRecord;
import com.dsk.common.utils.DateUtils; import com.dsk.common.utils.DateUtils;
import com.dsk.system.domain.business.dto.BusinessIdDto; import com.dsk.system.domain.business.dto.BusinessIdDto;
...@@ -44,6 +45,7 @@ public class BusinessFollowRecordServiceImpl implements IBusinessFollowRecordSer ...@@ -44,6 +45,7 @@ public class BusinessFollowRecordServiceImpl implements IBusinessFollowRecordSer
} }
@Override @Override
@DataScope(userAlias = "u",deptAlias = "d")
public List<BusinessFollowRecord> allFollow(BusinessListDto dto) { public List<BusinessFollowRecord> allFollow(BusinessListDto dto) {
//userId不传值,就查询全部 //userId不传值,就查询全部
// if (dto.getUserId() == null) { // if (dto.getUserId() == null) {
......
...@@ -152,6 +152,7 @@ public class BusinessInfoServiceImpl implements IBusinessInfoService { ...@@ -152,6 +152,7 @@ public class BusinessInfoServiceImpl implements IBusinessInfoService {
vo.setInvestmentAmount(MapUtil.getDouble(map, "projectContractAmount")); vo.setInvestmentAmount(MapUtil.getDouble(map, "projectContractAmount"));
} }
vo.setProjectType(MapUtil.getStr(map, "projectType")); vo.setProjectType(MapUtil.getStr(map, "projectType"));
vo.setProjectStage(MapUtil.getStr(map, "tenderStage"));
vo.setProjectCategory(MapUtil.getStr(map, "projectPurposes")); vo.setProjectCategory(MapUtil.getStr(map, "projectPurposes"));
vos.add(vo); vos.add(vo);
} }
......
package com.dsk.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson2.JSONObject;
import com.dsk.common.annotation.DataScope;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.utils.DskOpenApiUtil;
import com.dsk.system.domain.business.dto.BusinessSearchDto;
import com.dsk.system.domain.business.vo.BusinessAnalyzeVo;
import com.dsk.system.mapper.BusinessInfoMapper;
import com.dsk.system.service.IBusinessOverviewService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author lcl
* @create 2023/8/14
*/
@Service
public class BusinessOverviewServiceImpl implements IBusinessOverviewService {
@Resource
private BusinessInfoMapper businessInfoMapper;
@Autowired
private DskOpenApiUtil dskOpenApiUtil;
@Override
@DataScope(userAlias = "u",deptAlias = "d")
public Map<String, Object> statusStatistics(BusinessSearchDto dto) {
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;
}
@Override
@DataScope(userAlias = "u",deptAlias = "d")
public List<BusinessAnalyzeVo> amountAnalyze(BusinessSearchDto dto) {
return businessInfoMapper.selectAmountAnalyze(dto);
}
@Override
@DataScope(userAlias = "u",deptAlias = "d")
public List<BusinessAnalyzeVo> typeAnalyze(BusinessSearchDto dto) {
return businessInfoMapper.selectTypeAnalyze(dto);
}
@Override
public AjaxResult countGroupByProvince(JSONObject object) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/nationzj/marketAnalysis/project/countGroupByProvince", object);
return BeanUtil.toBean(map, AjaxResult.class);
}
@Override
public AjaxResult rangByMoney(JSONObject object) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/nationzj/marketAnalysis/project/rangByMoney", object);
return BeanUtil.toBean(map, AjaxResult.class);
}
}
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());
}
}
package com.dsk.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.dsk.common.utils.SecurityUtils;
import com.dsk.system.domain.customer.Customer;
import com.dsk.system.domain.customer.dto.CustomerSearchDto;
import com.dsk.system.domain.customer.vo.CustomerAnalyzeVo;
import com.dsk.system.mapper.CustomerMapper;
import com.dsk.system.service.ICustomerOverviewService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 客户概览相关
* @author lcl
* @create 2023/8/15
*/
@Service
public class CustomerOverviewServiceImpl implements ICustomerOverviewService {
@Resource
private CustomerMapper customerMapper;
@Override
public Map<String, Object> statistics(CustomerSearchDto dto) {
Map<String, Object> resultMap = new HashMap<>();
dto.setUserId(SecurityUtils.getUserId());
//总
resultMap.put("totalCount",customerMapper.selectCustomerCount(dto));
//国企
dto.setCompanyNature("国有企业");
resultMap.put("nationCount",customerMapper.selectCustomerCount(dto));
//央企
dto.setCompanyNature("央企");
resultMap.put("centreCount",customerMapper.selectCustomerCount(dto));
//事业
dto.setCompanyNature("事业单位");
resultMap.put("undertakingCount",customerMapper.selectCustomerCount(dto));
return resultMap;
}
@Override
public List<CustomerAnalyzeVo> cooperationTop(CustomerSearchDto dto) {
dto.setUserId(SecurityUtils.getUserId());
return customerMapper.selectCooperationTop(dto);
}
@Override
public List<Map<String, Object>> creditLevel(CustomerSearchDto dto) {
dto.setUserId(SecurityUtils.getUserId());
return customerMapper.selectCreditLevelGroup(dto);
}
}
...@@ -54,7 +54,7 @@ public class EconomicServiceImpl implements EconomicService { ...@@ -54,7 +54,7 @@ public class EconomicServiceImpl implements EconomicService {
if (ObjectUtil.isEmpty(dto.getYear())) { if (ObjectUtil.isEmpty(dto.getYear())) {
dto.setYear(DateUtils.getYear() - 1); dto.setYear(DateUtils.getYear() - 1);
} }
Map<String, Object> map = dskOpenApiUtil.requestBody("/economic/national/nationalPage", BeanUtil.beanToMap(dto, false, false)); Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/economic/national/nationalPage", BeanUtil.beanToMap(dto, false, false));
Integer code = MapUtils.getInteger(map, "code", 300); Integer code = MapUtils.getInteger(map, "code", 300);
if (!code.equals(HttpStatus.OK.value())) { if (!code.equals(HttpStatus.OK.value())) {
throw new RuntimeException(); throw new RuntimeException();
...@@ -64,13 +64,13 @@ public class EconomicServiceImpl implements EconomicService { ...@@ -64,13 +64,13 @@ public class EconomicServiceImpl implements EconomicService {
@Override @Override
public AjaxResult yearsList(OpRegionalEconomicDataYearsListDto dto) { public AjaxResult yearsList(OpRegionalEconomicDataYearsListDto dto) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/economic/years/list", BeanUtil.beanToMap(dto, false, false)); Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/economic/years/list", BeanUtil.beanToMap(dto, false, false));
return BeanUtil.toBean(map, AjaxResult.class); return BeanUtil.toBean(map, AjaxResult.class);
} }
@Override @Override
public AjaxResult details(OpRegionalEconomicDataDetailsDto detailsDto) { public AjaxResult details(OpRegionalEconomicDataDetailsDto detailsDto) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/economic/details", BeanUtil.beanToMap(detailsDto, false, false)); Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/economic/details", BeanUtil.beanToMap(detailsDto, false, false));
return BeanUtil.toBean(map, AjaxResult.class); return BeanUtil.toBean(map, AjaxResult.class);
} }
...@@ -87,7 +87,7 @@ public class EconomicServiceImpl implements EconomicService { ...@@ -87,7 +87,7 @@ public class EconomicServiceImpl implements EconomicService {
} }
} }
Map<String, Object> map = dskOpenApiUtil.requestBody("/economic/location", BeanUtil.beanToMap(detailsDto, false, false)); Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/economic/location", BeanUtil.beanToMap(detailsDto, false, false));
Integer code = MapUtils.getInteger(map, "code", 300); Integer code = MapUtils.getInteger(map, "code", 300);
if (!code.equals(HttpStatus.OK.value())) { if (!code.equals(HttpStatus.OK.value())) {
throw new RuntimeException(); throw new RuntimeException();
...@@ -102,25 +102,25 @@ public class EconomicServiceImpl implements EconomicService { ...@@ -102,25 +102,25 @@ public class EconomicServiceImpl implements EconomicService {
@Override @Override
public AjaxResult statisticsRegional(OpRegionalEconomicDataStatisticsRegionalDto dto) { public AjaxResult statisticsRegional(OpRegionalEconomicDataStatisticsRegionalDto dto) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/economic/statistics/regional", BeanUtil.beanToMap(dto, false, false)); Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/economic/statistics/regional", BeanUtil.beanToMap(dto, false, false));
return BeanUtil.toBean(map, AjaxResult.class); return BeanUtil.toBean(map, AjaxResult.class);
} }
@Override @Override
public AjaxResult regionalList(OpRegionalEconomicDataRegionalListDto dto) { public AjaxResult regionalList(OpRegionalEconomicDataRegionalListDto dto) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/economic/regional/list", BeanUtil.beanToMap(dto, false, false)); Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/economic/regional/list", BeanUtil.beanToMap(dto, false, false));
return BeanUtil.toBean(map, AjaxResult.class); return BeanUtil.toBean(map, AjaxResult.class);
} }
@Override @Override
public AjaxResult regionalCompare(OpRegionalEconomicDataStatisticsRegionalDto dto) { public AjaxResult regionalCompare(OpRegionalEconomicDataStatisticsRegionalDto dto) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/economic/regional/compare", BeanUtil.beanToMap(dto, false, false)); Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/economic/regional/compare", BeanUtil.beanToMap(dto, false, false));
return BeanUtil.toBean(map, AjaxResult.class); return BeanUtil.toBean(map, AjaxResult.class);
} }
@Override @Override
public AjaxResult regionalMultipleCompare(OpRegionalEconomicRegionalCompareDto dto) { public AjaxResult regionalMultipleCompare(OpRegionalEconomicRegionalCompareDto dto) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/economic/regional/multipleCompare", BeanUtil.beanToMap(dto, false, false)); Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/economic/regional/multipleCompare", BeanUtil.beanToMap(dto, false, false));
return BeanUtil.toBean(map, AjaxResult.class); return BeanUtil.toBean(map, AjaxResult.class);
} }
......
...@@ -35,7 +35,7 @@ public class SpecialPurposeBondsServiceImpl implements SpecialPurposeBondsServic ...@@ -35,7 +35,7 @@ public class SpecialPurposeBondsServiceImpl implements SpecialPurposeBondsServic
@Override @Override
public AjaxResult page(SpecialPurposeBondsPageDto dto) { public AjaxResult page(SpecialPurposeBondsPageDto dto) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/specialPurposeBonds/projects/page", BeanUtil.beanToMap(dto, false, false)); Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/specialPurposeBonds/projects/page", BeanUtil.beanToMap(dto, false, false));
Integer code = MapUtils.getInteger(map, "code", 300); Integer code = MapUtils.getInteger(map, "code", 300);
if (code.equals(HttpStatus.OK.value())) { if (code.equals(HttpStatus.OK.value())) {
Map data = MapUtils.getMap(map, "data", null); Map data = MapUtils.getMap(map, "data", null);
...@@ -60,7 +60,7 @@ public class SpecialPurposeBondsServiceImpl implements SpecialPurposeBondsServic ...@@ -60,7 +60,7 @@ public class SpecialPurposeBondsServiceImpl implements SpecialPurposeBondsServic
@Override @Override
public AjaxResult details(SpecialBondInformationDetailsDto detailsDto) { public AjaxResult details(SpecialBondInformationDetailsDto detailsDto) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/specialPurposeBonds/details", BeanUtil.beanToMap(detailsDto, false, false)); Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/specialPurposeBonds/details", BeanUtil.beanToMap(detailsDto, false, false));
Integer code = MapUtils.getInteger(map, "code", 300); Integer code = MapUtils.getInteger(map, "code", 300);
if (code.equals(HttpStatus.OK.value())) { if (code.equals(HttpStatus.OK.value())) {
Map projectMap = MapUtils.getMap(map, "data", null); Map projectMap = MapUtils.getMap(map, "data", null);
...@@ -100,7 +100,7 @@ public class SpecialPurposeBondsServiceImpl implements SpecialPurposeBondsServic ...@@ -100,7 +100,7 @@ public class SpecialPurposeBondsServiceImpl implements SpecialPurposeBondsServic
@Override @Override
public AjaxResult bondStatistics(SpecialPurposeBondsDto dto) { public AjaxResult bondStatistics(SpecialPurposeBondsDto dto) {
// todo 临时处理 待还原 // todo 临时处理 待还原
Map<String, Object> map = dskOpenApiUtil.requestBody("/specialPurposeBonds/bond/statistics", BeanUtil.beanToMap(dto, false, false)); Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/specialPurposeBonds/bond/statistics", BeanUtil.beanToMap(dto, false, false));
Integer code = MapUtils.getInteger(map, "code", 300); Integer code = MapUtils.getInteger(map, "code", 300);
if (code.equals(HttpStatus.OK.value())) { if (code.equals(HttpStatus.OK.value())) {
List<Object> list = CommonUtils.assertAsArray(MapUtils.getObject(map, "data", "")); List<Object> list = CommonUtils.assertAsArray(MapUtils.getObject(map, "data", ""));
...@@ -119,7 +119,7 @@ public class SpecialPurposeBondsServiceImpl implements SpecialPurposeBondsServic ...@@ -119,7 +119,7 @@ public class SpecialPurposeBondsServiceImpl implements SpecialPurposeBondsServic
@Override @Override
public AjaxResult bondPage(SpecialBondInformationPageDto pageDto) { public AjaxResult bondPage(SpecialBondInformationPageDto pageDto) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/specialPurposeBonds/bond/page", BeanUtil.beanToMap(pageDto, false, false)); Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/specialPurposeBonds/bond/page", BeanUtil.beanToMap(pageDto, false, false));
Integer code = MapUtils.getInteger(map, "code", 300); Integer code = MapUtils.getInteger(map, "code", 300);
if (code.equals(HttpStatus.OK.value())) { if (code.equals(HttpStatus.OK.value())) {
Map data = MapUtils.getMap(map, "data", null); Map data = MapUtils.getMap(map, "data", null);
......
...@@ -36,7 +36,7 @@ public class UrbanInvestmentPlatformServiceImpl implements UrbanInvestmentPlatfo ...@@ -36,7 +36,7 @@ public class UrbanInvestmentPlatformServiceImpl implements UrbanInvestmentPlatfo
@Override @Override
public AjaxResult page(UrbanInvestmentPlatformDto pageDto) { public AjaxResult page(UrbanInvestmentPlatformDto pageDto) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/urbanInvestment/page", BeanUtil.beanToMap(pageDto, false, false)); Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/urbanInvestment/page", BeanUtil.beanToMap(pageDto, false, false));
Integer code = MapUtils.getInteger(map, "code", 300); Integer code = MapUtils.getInteger(map, "code", 300);
if (HttpStatus.OK.value() != code) { if (HttpStatus.OK.value() != code) {
throw new RuntimeException(); throw new RuntimeException();
...@@ -64,7 +64,7 @@ public class UrbanInvestmentPlatformServiceImpl implements UrbanInvestmentPlatfo ...@@ -64,7 +64,7 @@ public class UrbanInvestmentPlatformServiceImpl implements UrbanInvestmentPlatfo
Map<String, Object> bondCreditRatingBatchMap = new HashMap<>(1); Map<String, Object> bondCreditRatingBatchMap = new HashMap<>(1);
bondCreditRatingBatchMap.put("cIds", cIds); bondCreditRatingBatchMap.put("cIds", cIds);
Map<String, Object> bondCreditRatingMap = dskOpenApiUtil.requestBody("/operate/enterprise/bondCreditRatingBatch", bondCreditRatingBatchMap); Map<String, Object> bondCreditRatingMap = dskOpenApiUtil.requestBody("/operate/operate/enterprise/bondCreditRatingBatch", bondCreditRatingBatchMap);
Integer codeRating = MapUtils.getInteger(bondCreditRatingMap, "code", 300); Integer codeRating = MapUtils.getInteger(bondCreditRatingMap, "code", 300);
ArrayList<Map<String, Object>> objArrayList = new ArrayList(1); ArrayList<Map<String, Object>> objArrayList = new ArrayList(1);
if (codeRating.equals(HttpStatus.OK.value())) { if (codeRating.equals(HttpStatus.OK.value())) {
...@@ -115,13 +115,13 @@ public class UrbanInvestmentPlatformServiceImpl implements UrbanInvestmentPlatfo ...@@ -115,13 +115,13 @@ public class UrbanInvestmentPlatformServiceImpl implements UrbanInvestmentPlatfo
public AjaxResult details(String id) { public AjaxResult details(String id) {
Map<String, Object> bodyMap = new HashMap<>(1); Map<String, Object> bodyMap = new HashMap<>(1);
bodyMap.put("id", id); bodyMap.put("id", id);
Map<String, Object> map = dskOpenApiUtil.requestBody("/urbanInvestment/details", bodyMap); Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/urbanInvestment/details", bodyMap);
return BeanUtil.toBean(map, AjaxResult.class); return BeanUtil.toBean(map, AjaxResult.class);
} }
@Override @Override
public AjaxResult statistics(UrbanInvestmentPlatformDto dto) { public AjaxResult statistics(UrbanInvestmentPlatformDto dto) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/urbanInvestment/statistics", BeanUtil.beanToMap(dto, false, false)); Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/urbanInvestment/statistics", BeanUtil.beanToMap(dto, false, false));
return BeanUtil.toBean(map, AjaxResult.class); return BeanUtil.toBean(map, AjaxResult.class);
} }
} }
<?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
...@@ -68,10 +68,12 @@ ...@@ -68,10 +68,12 @@
from business_follow_record f from business_follow_record f
left join business_info i on i.id = f.business_id left join business_info i on i.id = f.business_id
left join sys_user u on f.user_id = u.user_id left join sys_user u on f.user_id = u.user_id
left join sys_dept d on u.dept_id = d.dept_id
<where> <where>
<if test="userId != null"> <if test="userId != null"> and (f.user_id = #{userId} or i.is_private = 1)</if>
and f.user_id = #{userId} <if test="startTime != null and startTime != '' "> and f.creat_time &gt;= #{startTime} </if>
</if> <if test="endTime != null and endTime != '' "> and f.creat_time &lt;= #{endTime} </if>
${params.dataScope}
</where> </where>
ORDER BY f.creat_time DESC ORDER BY f.creat_time DESC
</select> </select>
......
...@@ -114,6 +114,7 @@ ...@@ -114,6 +114,7 @@
</if> </if>
<if test="minAmount != null and minAmount != ''"> and i.investment_amount &gt;= #{minAmount} </if> <if test="minAmount != null and minAmount != ''"> and i.investment_amount &gt;= #{minAmount} </if>
<if test="maxAmount != null and maxAmount != ''"> and i.investment_amount &lt;= #{maxAmount}</if> <if test="maxAmount != null and maxAmount != ''"> and i.investment_amount &lt;= #{maxAmount}</if>
<if test="status != null "> and i.status = #{status}</if>
<if test="projectStage != null and projectStage != ''"> <if test="projectStage != null and projectStage != ''">
and i.project_stage in and i.project_stage in
<foreach collection="projectStage" item="projectStage" open="(" separator="," close=")"> <foreach collection="projectStage" item="projectStage" open="(" separator="," close=")">
...@@ -373,4 +374,33 @@ ...@@ -373,4 +374,33 @@
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>
<sql id="businessSearchSql">
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}
</sql>
<select id="selectCountByStatus" resultType="java.lang.Integer">
select count(bi.id) <include refid="businessSearchSql"/>
</select>
<select id="selectAmountAnalyze" resultType="com.dsk.system.domain.business.vo.BusinessAnalyzeVo">
select
bi.amount_source,count(bi.id) businessCount,sum(bi.investment_amount) totalAmount
<include refid="businessSearchSql"/>
group by bi.amount_source
</select>
<select id="selectTypeAnalyze" resultType="com.dsk.system.domain.business.vo.BusinessAnalyzeVo">
select
bi.project_type,count(bi.id) businessCount,sum(bi.investment_amount) totalAmount
<include refid="businessSearchSql"/>
group by bi.project_type
</select>
</mapper> </mapper>
<?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>
...@@ -26,8 +26,39 @@ ...@@ -26,8 +26,39 @@
left join ( left join (
select count(status) num,customer_id from business_info where `status` = 2 group by customer_id select count(status) num,customer_id from business_info where `status` = 2 group by customer_id
) bi3 on bi3.customer_id = ct.customer_id ) bi3 on bi3.customer_id = ct.customer_id
where ctu.user_id = #{dto.userId} and ctu.status = #{dto.status} where ctu.user_id = #{userId} and ctu.status = #{status}
<if test="dto.companyName != null and dto.companyName != '' "> and ct.company_name like concat('%',#{dto.companyName},'%')</if> <if test="companyName != null and companyName != '' "> and ct.company_name like concat('%',#{companyName},'%')</if>
<if test="isOn != null "> and ct.is_on = #{isOn}</if>
<if test="provinceIds != null and provinceIds.size > 0 ">
and ct.province_id in
<foreach collection="provinceIds" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<if test="cityIds != null and cityIds.size > 0 ">
and ct.city_id in
<foreach collection="cityIds" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<if test="districtIds != null and districtIds.size > 0 ">
and ct.district_id in
<foreach collection="districtIds" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<if test="companyNatures != null and companyNatures.size > 0 ">
and ct.company_nature in
<foreach collection="companyNatures" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<if test="creditLevels != null and creditLevels.size > 0 ">
and ct.credit_level in
<foreach collection="creditLevels" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
order by ct.create_time desc order by ct.create_time desc
</select> </select>
...@@ -69,16 +100,37 @@ ...@@ -69,16 +100,37 @@
</foreach> </foreach>
</select> </select>
<!-- <select id="selectUipIdList" resultType="java.lang.String">--> <select id="selectCustomerCount" resultType="java.lang.Integer">
<!-- select--> select
<!-- ct.uip_id--> count(ct.customer_id)
<!-- from customer ct--> from customer ct
<!-- join customer_user ctu on ct.customer_id = ctu.customer_id--> join customer_user ctu on ct.customer_id = ctu.customer_id
<!-- where ctu.user_id = #{userId} and ctu.status = 0 and ct.uip_id in--> where ctu.status = 0 and ctu.user_id = #{userId}
<!-- <foreach collection="uipIds" item="uipId" open="(" separator="," close=")">--> <if test="companyNature != null and companyNature != ''"> and ct.company_nature = #{companyNature} </if>
<!-- #{uipId}--> </select>
<!-- </foreach>-->
<!-- </select>--> <select id="selectCooperationTop" resultType="com.dsk.system.domain.customer.vo.CustomerAnalyzeVo">
select
ct.customer_id, ct.company_name, ct.company_id, ct.uip_id, count(bi.id) businessCount,
sum(bi.investment_amount) totalAmount
from customer ct
join customer_user ctu on ct.customer_id = ctu.customer_id
left join business_info bi on (bi.customer_id = ct.customer_id and bi.status = 2)
where ctu.status = 0 and ctu.user_id = #{userId}
group by ct.customer_id
order by totalAmount desc
limit 10
</select>
<select id="selectCreditLevelGroup" resultType="java.util.Map">
select
ct.credit_level creditLevel, count(ct.credit_level) customerCount
from customer ct
join customer_user ctu on ct.customer_id = ctu.customer_id
where ctu.user_id = #{userId}
group by ct.credit_level
order by ct.credit_level desc
</select>
</mapper> </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