Commit c75bdf7e authored by huangjie's avatar huangjie
parents 9be53ec6 94f10e33
......@@ -78,7 +78,7 @@
</configuration>
</plugin>
</plugins>
<finalName>${project.artifactId}</finalName>
<finalName>dsk-operate-sys</finalName>
</build>
</project>
package com.dsk.web.controller.common;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
......@@ -72,7 +73,8 @@ public class CaptchaController
else if ("char".equals(captchaType))
{
capStr = code = captchaProducer.createText();
image = captchaProducer.createImage(capStr);
// image = captchaProducer.createImage(capStr);
image = captchaImage(capStr);
}
redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
......@@ -91,4 +93,47 @@ public class CaptchaController
ajax.put("img", Base64.encode(os.toByteArray()));
return ajax;
}
private static final int WIDTH = 120; // 图片宽度
private static final int HEIGHT = 40; // 图片高度
private static final int CODE_LENGTH = 4; // 验证码长度
private BufferedImage captchaImage(String capStr) {
// 创建图片缓冲区
BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
// 获取画笔
Graphics graphics = image.getGraphics();
// 绘制背景
graphics.setColor(Color.WHITE);
graphics.fillRect(0, 0, WIDTH, HEIGHT);
// 绘制验证码
graphics.setFont(new Font("Arial", Font.BOLD, 28));
for (int i = 0; i < capStr.length(); i++) {
graphics.setColor(getRandomColor());
graphics.drawString(String.valueOf(capStr.charAt(i)), (i + 1) * (WIDTH / (CODE_LENGTH + 1)), 30);
}
// 添加干扰线
for (int i = 0; i < 3; i++) {
graphics.setColor(getRandomColor());
graphics.drawLine((int) (Math.random() * WIDTH), (int) (Math.random() * HEIGHT),
(int) (Math.random() * WIDTH), (int) (Math.random() * HEIGHT));
}
// 释放资源
graphics.dispose();
return image;
}
// 获取随机颜色
private static Color getRandomColor() {
int r = (int) (Math.random() * 256);
int g = (int) (Math.random() * 256);
int b = (int) (Math.random() * 256);
return new Color(r, g, b);
}
}
......@@ -125,6 +125,8 @@ public class CustomerController extends BaseController {
}
}
/**
* 编辑客户
*/
......@@ -190,4 +192,31 @@ public class CustomerController extends BaseController {
success.put("successCount", successCount);
return success;
}
/**
* 客户状态
*/
@GetMapping("/status/{companyName}")
public AjaxResult status(@PathVariable String companyName) {
return AjaxResult.success(baseService.status(companyName));
}
/**
* 取消认领
*/
@PutMapping("/cancelClaim/{companyName}")
@RepeatSubmit
public AjaxResult cancelClaim(@PathVariable String companyName) {
return toAjax(baseService.cancelClaim(companyName));
}
/**
* 历史认领
*/
@PutMapping("/historyClaim/{companyName}")
@RepeatSubmit
public AjaxResult historyClaim(@PathVariable String companyName) {
return toAjax(baseService.historyClaim(companyName));
}
}
......@@ -136,4 +136,10 @@ public class EnterpriseController {
return enterpriseService.getUipIdByCid(vo);
}
@ApiOperation(value = "企业-财务数据")
@PostMapping(value = "financialData")
public R financialData(@RequestBody EnterpriseFinancialDataBody vo) throws Exception {
return enterpriseService.financialData(vo);
}
}
......@@ -119,6 +119,13 @@ public class EnterpriseProjectController {
return enterpriseProjectService.bidPlanPage(body);
}
@ApiOperation(value = "招标计划项目类型(openApi)")
@RequestMapping(value = "/bidPlanProjectType",method = RequestMethod.POST)
public R bidPlanProjectType(@RequestBody @Valid EnterpriseProjectBidPlanProjectTypeBody body) throws Exception {
return enterpriseProjectService.bidPlanProjectType(body);
}
@ApiOperation(value = "招标计划详情(openApi)")
@RequestMapping(value = "/bidPlanDetail", method = RequestMethod.POST)
public R bidPlanDetail(@RequestBody @Valid EnterpriseProjectBidPlanDetailBody body) throws Exception {
......
......@@ -3,6 +3,7 @@ package com.dsk.web.controller.search.macroMarket;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.dtos.*;
import com.dsk.system.service.EconomicService;
import com.dsk.web.controller.tool.IpUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
......
/**
*
*/
package com.dsk.web.controller.search.macroMarket;
package com.dsk.web.controller.tool;
import java.util.Arrays;
import java.util.List;
......
package com.dsk.web.controller.search.macroMarket;
package com.dsk.web.controller.tool;
import org.apache.commons.lang3.StringUtils;
......
......@@ -14,7 +14,7 @@ ruoyi:
# 获取ip地址开关
addressEnabled: false
# 验证码类型 math 数组计算 char 字符验证
captchaType: math
captchaType: char
# 开发环境配置
server:
......
# 项目相关配置
ruoyi:
# 名称
name: RuoYi
# 版本
version: 3.8.5
# 版权年份
copyrightYear: 2023
# 实例演示开关
demoEnabled: true
# 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/server/dsk-operate-sys/uploadPath)
# profile: D:/dsk-operate-sys/uploadPath/
profile: /home/server/dsk-operate-sys/uploadPath/
# 获取ip地址开关
addressEnabled: false
# 验证码类型 math 数组计算 char 字符验证
captchaType: math
# 开发环境配置
server:
# 服务器的HTTP端口,默认为8080
port: 9098
servlet:
# 应用的访问路径
context-path: /
tomcat:
# tomcat的URI编码
uri-encoding: UTF-8
# 连接数满后的排队数,默认为100
accept-count: 1000
threads:
# tomcat最大线程数,默认为200
max: 800
# Tomcat启动初始化的线程数,默认值10
min-spare: 100
# 日志配置
logging:
level:
com.ruoyi: debug
org.springframework: warn
# 用户配置
user:
password:
# 密码最大错误次数
maxRetryCount: 5
# 密码锁定时间(默认10分钟)
lockTime: 10
# Spring配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
druid:
# 主库数据源
master:
url: jdbc:mysql://47.104.91.229:3306/dsk-operate-sys?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: dev
password: zfTFIJjaN#6xB83r
# 从库数据源
# slave:
# # 从数据源开关/默认关闭
# enabled: false
# url:
# username:
# password:
# 初始连接数
initialSize: 5
# 最小连接池数量
minIdle: 10
# 最大连接池数量
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置连接超时时间
connectTimeout: 30000
# 配置网络超时时间
socketTimeout: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
webStatFilter:
enabled: true
statViewServlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
# 控制台管理用户名和密码
login-username: ruoyi
login-password: 123456
filter:
stat:
enabled: true
# 慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
# 资源信息
messages:
# 国际化资源文件路径
basename: i18n/messages
# profiles:
# active: druid
# 文件上传
servlet:
multipart:
# 单个文件大小
max-file-size: 10MB
# 设置总上传的文件大小
max-request-size: 20MB
# 服务模块
devtools:
restart:
# 热部署开关
enabled: true
# redis 配置
redis:
# 地址
host: 47.104.91.229
# 端口,默认为6379
port: 6379
# 数据库索引
database: 6
# 密码
password: zfTFIJjaN#6xB83r
# 连接超时时间
timeout: 10s
lettuce:
pool:
# 连接池中的最小空闲连接
min-idle: 0
# 连接池中的最大空闲连接
max-idle: 8
# 连接池的最大数据库连接数
max-active: 8
# #连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
# token配置
token:
# 令牌自定义标识
header: Authorization
# 令牌密钥
secret: abcdefghijklmnopqrstuvwxyz
# 令牌有效期(默认30分钟)
expireTime: 240
#mybatis:
# # 搜索指定包别名
# typeAliasesPackage: com.dsk.**.domain
# # 配置mapper的扫描,找到所有的mapper.xml映射文件
# mapperLocations: classpath*:mapper/**/*Mapper.xml
# # 加载全局的配置文件
# configLocation: classpath:mybatis/mybatis-config.xml
# PageHelper分页插件
pagehelper:
helperDialect: mysql
supportMethodsArguments: true
params: count=countSql
# Swagger配置
swagger:
# 是否开启swagger
enabled: true
# 请求前缀
pathMapping: /
# 防止XSS攻击
xss:
# 过滤开关
enabled: true
# 排除链接(多个用逗号分隔)
excludes: /system/notice
# 匹配链接
urlPatterns: /system/*,/monitor/*,/tool/*
dsk:
open:
# endPoint: 120.27.13.145:8865
# accessKeyId: aec7b3ff2y2q8x6t49a7e2c463ce21912
# accessKeySecret: ee8a53c7ea04eb3ac311406c8f56f95b
# protocol: http
endPoint: openapi.jiansheku.com
accessKeyId: aec7b3ff2y2q8x6t49a7e2c463ce21912
accessKeySecret: ee8a53c7ea04eb3ac311406c8f56f95b
protocol: https
# 项目相关配置
ruoyi:
# 名称
name: RuoYi
# 版本
version: 3.8.5
# 版权年份
copyrightYear: 2023
# 实例演示开关
demoEnabled: true
# 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/server/dsk-operate-sys/uploadPath)
# profile: D:/dsk-operate-sys/uploadPath/
profile: /home/server/dsk-operate-sys/uploadPath/
# 获取ip地址开关
addressEnabled: false
# 验证码类型 math 数组计算 char 字符验证
captchaType: math
# 开发环境配置
server:
# 服务器的HTTP端口,默认为8080
port: 9011
servlet:
# 应用的访问路径
context-path: /
tomcat:
# tomcat的URI编码
uri-encoding: UTF-8
# 连接数满后的排队数,默认为100
accept-count: 1000
threads:
# tomcat最大线程数,默认为200
max: 800
# Tomcat启动初始化的线程数,默认值10
min-spare: 100
# 日志配置
logging:
level:
com.ruoyi: debug
org.springframework: warn
# 用户配置
user:
password:
# 密码最大错误次数
maxRetryCount: 5
# 密码锁定时间(默认10分钟)
lockTime: 10
# Spring配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
druid:
# 主库数据源
master:
url: jdbc:mysql://47.104.91.229:3306/dsk-operate-sys?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: dev
password: zfTFIJjaN#6xB83r
# 从库数据源
# slave:
# # 从数据源开关/默认关闭
# enabled: false
# url:
# username:
# password:
# 初始连接数
initialSize: 5
# 最小连接池数量
minIdle: 10
# 最大连接池数量
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置连接超时时间
connectTimeout: 30000
# 配置网络超时时间
socketTimeout: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
webStatFilter:
enabled: true
statViewServlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
# 控制台管理用户名和密码
login-username: ruoyi
login-password: 123456
filter:
stat:
enabled: true
# 慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
# 资源信息
messages:
# 国际化资源文件路径
basename: i18n/messages
# profiles:
# active: druid
# 文件上传
servlet:
multipart:
# 单个文件大小
max-file-size: 10MB
# 设置总上传的文件大小
max-request-size: 20MB
# 服务模块
devtools:
restart:
# 热部署开关
enabled: true
# redis 配置
redis:
# 地址
host: 47.104.91.229
# 端口,默认为6379
port: 6379
# 数据库索引
database: 15
# 密码
password: zfTFIJjaN#6xB83r
# 连接超时时间
timeout: 10s
lettuce:
pool:
# 连接池中的最小空闲连接
min-idle: 0
# 连接池中的最大空闲连接
max-idle: 8
# 连接池的最大数据库连接数
max-active: 8
# #连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
# token配置
token:
# 令牌自定义标识
header: Authorization
# 令牌密钥
secret: abcdefghijklmnopqrstuvwxyz
# 令牌有效期(默认30分钟)
expireTime: 240
#mybatis:
# # 搜索指定包别名
# typeAliasesPackage: com.dsk.**.domain
# # 配置mapper的扫描,找到所有的mapper.xml映射文件
# mapperLocations: classpath*:mapper/**/*Mapper.xml
# # 加载全局的配置文件
# configLocation: classpath:mybatis/mybatis-config.xml
# PageHelper分页插件
pagehelper:
helperDialect: mysql
supportMethodsArguments: true
params: count=countSql
# Swagger配置
swagger:
# 是否开启swagger
enabled: true
# 请求前缀
pathMapping: /
# 防止XSS攻击
xss:
# 过滤开关
enabled: true
# 排除链接(多个用逗号分隔)
excludes: /system/notice
# 匹配链接
urlPatterns: /system/*,/monitor/*,/tool/*
dsk:
open:
# endPoint: 120.27.13.145:8865
# accessKeyId: aec7b3ff2y2q8x6t49a7e2c463ce21912
# accessKeySecret: ee8a53c7ea04eb3ac311406c8f56f95b
# protocol: http
endPoint: openapi.jiansheku.com
accessKeyId: aec7b3ff2y2q8x6t49a7e2c463ce21912
accessKeySecret: ee8a53c7ea04eb3ac311406c8f56f95b
protocol: https
spring:
profiles:
active: dev
active: pre
# MyBatisPlus配置
# https://baomidou.com/config/
......
Application Version: ${ruoyi.version}
Spring Boot Version: ${spring-boot.version}
////////////////////////////////////////////////////////////////////
// _ooOoo_ //
// o8888888o //
// 88" . "88 //
// (| ^_^ |) //
// O\ = /O //
// ____/`---'\____ //
// .' \\| |// `. //
// / \\||| : |||// \ //
// / _||||| -:- |||||- \ //
// | | \\\ - /// | | //
// | \_| ''\---/'' | | //
// \ .-\__ `-` ___/-. / //
// ___`. .' /--.--\ `. . ___ //
// ."" '< `.___\_<|>_/___.' >'"". //
// | | : `- \`.;`\ _ /`;.`/ - ` : | | //
// \ \ `-. \_ __\ /__ _/ .-` / / //
// ========`-.____`-.___\_____/___.-`____.-'======== //
// `=---=' //
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
// 佛祖保佑 永不宕机 永无BUG //
////////////////////////////////////////////////////////////////////
\ No newline at end of file
......@@ -46,4 +46,17 @@ public class CacheConstants
* 查甲方 菜单选线
*/
public static final String DATA_UIPGROUPDATA = "data:uipGroupData";
/**
* 查甲方 菜单选线
*/
public static final String PERSONAL_LOCATION = "personal:location";
/**
* 查甲方 财务数据
*/
public static final String DATA_FINANCIAL = "data:financial";
}
......@@ -34,7 +34,10 @@ public class BasePage {
*/
private Integer pageMaxSize;
private String field;
/**
* 总中标金额
*/
private String field = "bidSumAmount";
private String order;
......
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 EnterpriseFinancialDataBody {
/**
* 企业id
*/
@NotNull(message = "企业id不能为空")
private Integer cid;
public boolean isValidateCid() {
return 0 == cid;
}
}
......@@ -25,6 +25,11 @@ public class EnterpriseProjectBidPlanPageBody extends BasePage {
*/
private String keys;
/**
* 项目类型
*/
private String buildingProjectType;
/*
* 排序字段:1金额倒序,2金额正序,3发布时间倒序,4发布时间正序,15预计招标时间倒序,16预计招标时间正序
*/
......
package com.dsk.common.core.domain.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import javax.validation.constraints.NotNull;
/**
* @ClassName EnterpriseProjectBidPlanProjectTypeBody
* @Description
* @Author Dgm
* @Date 2023/7/13 9:37
* @Version
*/
@Data
@ToString
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class EnterpriseProjectBidPlanProjectTypeBody {
/**
* 企业id
*/
@NotNull(message = "企业id不能为空")
private Integer cid;
public boolean isVaildCid() {
return 0 == cid;
}
}
......@@ -14,6 +14,12 @@ import javax.validation.constraints.NotNull;
@Data
public class OpRegionalEconomicDataRegionalListDto {
/**
* id
*/
@NotNull(message = "id 不能为空")
private Integer id;
/**
* 省Id
*/
......
......@@ -16,5 +16,16 @@ public class OpRegionalLocalDto {
*/
private Integer provinceId;
/**
* 市Id
*/
private Integer cityId;
/**
* 区 Id
*/
private Integer areaId;
private String ip;
}
......@@ -17,6 +17,17 @@ public class SpecialPurposeBondsDto {
*/
private Integer provinceId;
/**
* 市Id
*/
private Integer cityId;
/**
* 区Id
*/
private Integer areaId;
/**
* 项目类型
*/
......
......@@ -16,6 +16,15 @@ public class SpecialPurposeBondsPageDto extends BasePage {
* 省Id
*/
private Integer provinceId;
/**
* 市Id
*/
private Integer cityId;
/**
* 区Id
*/
private Integer areaId;
/**
* 排序字段 默认-投资金额
......
......@@ -5,7 +5,7 @@ VUE_APP_TITLE = 数字化经营履约全生命链路管理系统
ENV = 'development'
# 数字化经营履约全生命链路管理系统/开发环境
VUE_APP_BASE_API = '/dev-api'
VUE_APP_BASE_API = '/prod-api'
# 路由懒加载
VUE_CLI_BABEL_TRANSPILE_MODULES = true
......@@ -17,3 +17,10 @@ export const claim= function claim(param) {
data: param
})
}
// 历史客户认领
export const historyClaim= function historyClaim(name) {
return request({
url: '/customer/historyClaim/'+name,
method: 'Put',
})
}
......@@ -8,3 +8,11 @@ export function infoHeader(data) {
data: data
})
}
//企业数据统计
export function statistic(data) {
return request({
url: '/enterprise/statistic',
method: 'post',
data: data
})
}
......@@ -116,3 +116,11 @@ export function bidPlanPage(data) {
data: data
})
}
// 招标计划项目类型
export function bidPlanProjectType(data) {
return request({
url: '/enterpriseProject/bidPlanProjectType',
method: 'post',
data: data
})
}
......@@ -44,6 +44,14 @@ export function projectTenderDataGroup(data) {
data: data
})
}
// 财务数据
export function financialData(data) {
return request({
url: '/enterprise/financialData',
method: 'post',
data: data
})
}
// 招标公告
export function bidNoticePage(data) {
......
......@@ -51,6 +51,30 @@ let claim= function claim(param) {
data: param
})
}
// 取消认领用户
let cancelClaim= function cancelClaim(data) {
return request({
url: '/customer/cancelClaim/'+data,
method: 'put',
// data: data
})
}
// 历史认领用户
let historyClaim= function historyClaim(data) {
return request({
url: '/customer/historyClaim/'+data,
method: 'put',
// data: data
})
}
// 客户状态
let customerStatus= function customerStatus(data) {
return request({
url: '/customer/status/'+data,
method: 'get',
// data: data
})
}
// 查建筑企业
let enterprisePage= function enterprisePage(param) {
......@@ -72,4 +96,4 @@ let infoHeader= function infoHeader(param) {
export default {aptitudeCode,personCert,searchDic,regionWebList,uipGroupData,uipSerach,claim,enterprisePage,infoHeader}
\ No newline at end of file
export default {aptitudeCode,personCert,searchDic,regionWebList,uipGroupData,uipSerach,claim,cancelClaim,enterprisePage,infoHeader,historyClaim,customerStatus}
......@@ -215,6 +215,28 @@ export function claim(param) {
data: param
})
}
//客户状态
export function customerStatus(name) {
return request({
url:`/customer/status/`+name,
method: 'get',
})
}
//历史客户认领
export function historyClaim(name) {
return request({
url:`/customer/historyClaim/`+name,
method: 'put',
})
}
//批量获取城投企业id
export function getUipIdByCid(param) {
return request({
url: '/enterprise/getUipIdByCid',
method: 'POST',
data: param
})
}
......
......@@ -3,27 +3,30 @@
* 1、url地址,如企业详情:https://pre-plug.jiansheku.com/enterprise?ak=aec7b3ff2y2q8x6t49a7e2c463ce21912&uid=a704fb35bca54707b9b5f8c9bba57815(ak:平台唯一标识;uid:用户标识)
*
* */
const steerScroll = function (iframeId, navHeight, state, parentId){ //state:监听or移除监听;navHeight:页面排除iframe后剩下高度;iframeId: iframe的id
const steerScroll = function(iframeId, navigation, state, parentId) { // state:监听or移除监听;navigation:页面排除iframe后剩下高度;iframeId: iframe的id
let dom = window
if(parentId){// 默认页面可以滚动
if (parentId) { // 默认页面可以滚动
dom = document.getElementById(parentId)
if (!dom) {
return
}
dom.style.overflow = 'auto'
navHeight = 0
}else{
} else {
document.body.style.overflow = 'visible'
}
if(state){
if (state) {
window.addEventListener('message', function(e) {
const data = e.data
const sct = parentId ? dom.scrollTop : document && document.documentElement.scrollTop || document && document.body.scrollTop
if (data && typeof data === 'object') {
// 动态设置iFrame高度
if (data.height) {
document.getElementById(iframeId).style.height = data.height+'px'
scrolling(iframeId, navHeight, parentId) // 初始加载获取滚动条距离顶部高度
document.getElementById(iframeId).style.height = data.height + 'px'
scrolling(iframeId, navigation, parentId) // 初始加载获取滚动条距离顶部高度
}
// 点击企业详情页 栏目名动态设置滚动高度
if (data.scrollHeight) {
const navHeight = navigation.isFixed && !parentId ? navigation.totalHeight - navigation.fixedHeight : !parentId ? navigation.totalHeight : 0
dom.scrollTo(sct, parseInt(data.scrollHeight) + navHeight)
}
// 点击企业详情页 栏目下拉子标签动态设置滚动高度
......@@ -31,34 +34,37 @@ const steerScroll = function (iframeId, navHeight, state, parentId){ //state:
dom.scrollTo(sct, sct - parseInt(data.clientHeight))
}
// 点击下拉子标签动态设置滚动高度
if (data.initHeight>=0) {
if (data.initHeight >= 0) {
dom.scrollTo(sct, data.initHeight)
}
// 根据子页面弹窗显示隐藏控制当前页面是否固定不可滚动
if (data.scrollDisabled||data.scrollDisabled==false) {
if(parentId){
dom.style.overflow = data.scrollDisabled?'hidden':'auto'
}else{
document.body.style.overflow = data.scrollDisabled?'hidden':'visible'
if (data.scrollDisabled || data.scrollDisabled === false) {
if (parentId) {
dom.style.overflow = data.scrollDisabled ? 'hidden' : 'auto'
} else {
document.body.style.overflow = data.scrollDisabled ? 'hidden' : 'visible'
}
}
}
})
dom.addEventListener('scroll', scrolling(iframeId, navHeight, parentId))
}else{
dom.removeEventListener('scroll', scrolling(iframeId, navHeight, parentId))
dom.addEventListener('scroll', (event) => {
scrolling(iframeId, navigation, parentId)
})
} else {
dom.removeEventListener('scroll', (event) => {
scrolling(iframeId, navigation, parentId)
})
}
}
const scrolling = function (iframeId, navHeight, parentId){
const scrolling = function(iframeId, navigation, parentId) {
// 滚动条距文档顶部的距离
let scrollTop = parentId ? document.getElementById(parentId).scrollTop : window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
// 将滚动距离传入子组件
const ifa = document.getElementById(iframeId)
if(scrollTop<navHeight){
scrollTop = scrollTop+navHeight
}
ifa.contentWindow.postMessage({ 'scrollTop': scrollTop }, '*')
scrollTop = scrollTop + navigation.totalHeight
const bodyHeight = document.body.clientHeight - navigation.totalHeight
ifa.contentWindow.postMessage({ 'scrollTop': scrollTop, 'navHeight': navigation.totalHeight, 'bodyHeight': bodyHeight }, '*')
}
export {
......
......@@ -122,6 +122,7 @@ aside {
//main-container全局样式
.app-container {
padding: 16px;
//margin-top: 56px;
}
.components-container {
......@@ -201,6 +202,14 @@ aside {
white-space: nowrap;
overflow: hidden;
}
.text-cl2{
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
line-clamp: 2;
-webkit-box-orient: vertical;
}
ul, li {
list-style: none;
......@@ -313,7 +322,7 @@ ul, li {
.is-scrolling-left+.el-table__fixed,.is-scrolling-middle+.el-table__fixed,.is-scrolling-right+.el-table__fixed{
box-shadow:none;
height: auto !important;
bottom: 16px;
bottom: 16px !important;
}
.el-table__body tr.current-row > td.el-table__cell{
background: none;
......@@ -355,6 +364,7 @@ ul, li {
background: #DCEBFF;
}
.el-table__fixed{
bottom:0 !important;
tr:nth-child(2n){
background-color: #F8FBFF;
}
......@@ -514,6 +524,10 @@ ul, li {
line-height: 50px;
height: 50px;
}
.el-tabs__item.is-disabled {
color: #C0C4CC;
cursor: not-allowed;
}
.is-active{
color: #0081FF;
font-weight: bold;
......@@ -642,6 +656,9 @@ ul, li {
height: 32px;
border: 0;
}
.el-input__suffix{
margin-top: -1px;
}
}
.btn{
background: #F5F5F5;
......@@ -701,3 +718,8 @@ ul, li {
border-radius: 0;
padding: 10px;
}
//固定列的阴影问题
.el-table__fixed {
box-shadow: 4px 0 9px -5px rgba(0, 0, 0, 0.12);
-webkit-box-shadow: 4px 0 9px -5px rgba(0, 0, 0, 0.12);
}
.el-card{
overflow: initial;
}
.app-container{
padding: 0;
}
......@@ -576,6 +578,9 @@
padding: 16px;
border-radius: 6px;
border: 1px solid #68AEFF;
&.w836{
width: 836px;
}
.wri_top{
>img{
float: left;
......@@ -662,6 +667,11 @@
width: 128px;
}
}
.w120{
.el-input__inner{
width: 120px;
}
}
}
}
}
......@@ -819,10 +829,22 @@
right: 16px;
top: 17px;
.searchInput{
width: 178px;
border: 1px solid #D9D9D9;
.el-input--medium .el-input__inner{
font-size: 12px;
&.small{
border: 1px solid #d9d9d9;
width: 240px;
.el-input{
width: 180px;
}
.el-input__inner{
padding-right: 32px;
}
.el-input__prefix{
left: 8px;
top: -3px;
img{
width: 16px;
}
}
}
}
.b2{
......@@ -1172,3 +1194,39 @@
//top: 10px !important;
line-height: 34px !important;
}
.el-table__fixed {
height: auto !important;
bottom: 17px !important;
//box-shadow: 4px 0 9px -5px rgba(0, 0, 0, 0.12);
//-webkit-box-shadow: 4px 0 9px -5px rgba(0, 0, 0, 0.12);
}
.el-select .el-input__inner{
padding-left: 16px;
}
.el-tooltip__popper.is-dark {
opacity: 0.5;
//background: rgba(0, 0, 0, 0.5);
//.el-tooltip__popper[x-placement^=top] .popper__arrow {
// border-top-color:rgba(0, 0, 0, 0.5);
//}
}
.fixed-table {
overflow: visible;
.el-table__header-wrapper {
position: sticky;
top: 56px;
z-index: 9;
}
.el-table__fixed-header-wrapper{
position: sticky;
z-index: 9;
top: 56px;
}
.el-table__fixed{
overflow-x: clip;
overflow-y: clip;
}
}
......@@ -5,6 +5,7 @@
transition: margin-left .28s;
margin-left: $base-sidebar-width;
position: relative;
background: #F5F5F5;
}
.sidebarHide {
......
......@@ -46,9 +46,9 @@ export default {
<style scoped>
.svg-icon {
width: 1em;
height: 1em;
vertical-align: -0.15em;
width: 1.29em;
height: 1.29em;
/*vertical-align: -0.22em;*/
fill: currentColor;
overflow: hidden;
}
......
......@@ -45,12 +45,18 @@ export default {
min-height: calc(100vh - 56px);
min-width:1440px;
background: #F5F5F5;
overflow: initial;
}
.fixed-header + .app-main {
padding-top: 84px;
}
}
.EnterpriseData{
.app-main {
overflow: initial;
}
}
</style>
<style lang="scss">
......
<template>
<div id="navBar" class="navbar">
<div ref="navbarWidth" style="width: 100%;background: #ffffff;height: 56px;" >
<div id="navBar" class="navbar" :style="{width: navbarWidth}">
<div class="left-menu" :style="{width: scrollerWidth}">
<tags-view />
</div>
<div ref="rightMenu" class="flex-box right-menu">
<!-- <div class="menu-bells"><img src="@/assets/images/message.png"><i /></div>-->
<!-- <i class="menu-line" />-->
<!-- <div class="menu-bells"><img src="@/assets/images/message.png"><i /></div>-->
<!-- <i class="menu-line" />-->
<el-dropdown class="avatar-container" trigger="hover">
<div class="flex-box avatar-wrapper">
<img v-if="avatar" class="pic-avatar" :src="avatar">
......@@ -23,20 +24,23 @@
</el-dropdown>
</div>
</div>
</div>
</template>
<script>
import { mapGetters } from 'vuex'
import elementResizeDetectorMaker from "element-resize-detector"
import TagsView from './TagsView'
export default {
props:['offsetWidth'],
components: {
TagsView
},
data() {
return {
scrollerWidth: null
scrollerWidth: null,
navbarWidth: null
}
},
computed: {
......@@ -46,6 +50,11 @@ export default {
'name'
])
},
watch: {
offsetWidth(newValue, oldValue){
this.navbarWidth=`calc(100% - ${newValue}px)`
}
},
mounted() {
const _this = this, erd = elementResizeDetectorMaker(), navBar = document.getElementById("navBar")
erd.listenTo(navBar, element => {
......@@ -55,6 +64,7 @@ export default {
this.scrollerWidth = (nvWidth - rtWidth - 100)+'px' || '800px'
})
})
this.navbarWidth=`calc(100% - ${this.offsetWidth}px)`
},
methods: {
async logout() {
......@@ -67,7 +77,7 @@ export default {
location.href = '/index';
})
}).catch(() => {});
}
},
}
}
</script>
......@@ -76,9 +86,12 @@ export default {
.navbar {
height: 56px;
overflow: inherit;
position: relative;
/*position: relative;*/
background: #fff;
box-shadow: 0 1px 4px rgba(0,21,41,.08);
position: fixed;
top:0;
z-index: 999;
.left-menu{
float: left;
......@@ -134,9 +147,9 @@ export default {
.user-avatar {
display: inline-block;
cursor: pointer;
width: 20px;
height: 20px;
line-height: 20px;
width: 24px;
height: 24px;
line-height: 24px;
text-align: center;
background: #E3EEF9;
color: #0081FF;
......
......@@ -90,6 +90,7 @@ export default {
height: 100%;
padding-top: 24px;
margin-bottom: 0 !important;
overflow: hidden;
}
.is-horizontal{
width: 0;
......
......@@ -28,6 +28,34 @@
<li v-if="!isLastView()" @click="closeRightTags"><i class="el-icon-right"></i> 关闭右侧</li>
<li @click="closeAllTags(selectedTag)"><i class="el-icon-circle-close"></i> 全部关闭</li>
</ul>
<div class="alltags" v-if="visitedViews.length > 0">
<div class="" @click="closeall"><i class="el-icon-arrow-down" v-if="!showall"></i> <i class="el-icon-arrow-up" v-if="showall"></i></div>
<div class="tagslist" v-if="showall">
<!--<div v-for="(tag, index) in visitedViews"-->
<!--:key="tag.path"-->
<!--:class="isActive(tag)?'active':''"-->
<!--&gt;-->
<!--<i class="el-icon-check"></i>-->
<!--</div>-->
<router-link
v-for="(tag, index) in visitedViews"
ref="tag"
:key="tag.path"
:class="isActive(tag)?'active':''"
:to="{ path: tag.path, query: tag.query, fullPath: tag.fullPath }"
tag="span"
class="tags-view-item"
@contextmenu.prevent.native="openMenu(tag,$event)"
>
<div @click="changetags">
<i class="el-icon-check"></i>
<span :id="isActive(tag)?'tagTitle':''">{{ tag.title }}</span>
</div>
</router-link>
<div class="clasall" @click="closeAllTag(selectedTag)">关闭全部标签</div>
</div>
</div>
</div>
</template>
......@@ -43,7 +71,8 @@ export default {
top: 0,
left: 0,
selectedTag: {},
affixTags: []
affixTags: [],
showall:false,
}
},
computed: {
......@@ -83,13 +112,24 @@ export default {
} else {
document.body.removeEventListener('click', this.closeMenu)
}
}
},
},
mounted() {
this.initTags()
this.addTags()
},
methods: {
changetags(){
console.log(88)
this.showall = false
},
closeall(){
if(this.showall == true){
this.showall = false
}else{
this.showall = true
}
},
isActive(route) {
return route.path === this.$route.path
},
......@@ -202,6 +242,12 @@ export default {
this.moveToCurrentTag()
})
},
closeAllTag(view){
this.$nextTick(()=>{
this.showall = false
this.closeAllTags(view)
})
},
closeAllTags(view) {
this.$tab.closeAllPage().then(({ visitedViews }) => {
if (this.affixTags.some(tag => tag.path === this.$route.path)) {
......@@ -257,6 +303,7 @@ export default {
height: 56px;
width: 100%;
background: #fff;
position: relative;
.tags-view-wrapper {
.tags-view-item {
display: inline-block;
......@@ -336,6 +383,68 @@ export default {
}
}
}
.alltags{
position: absolute;
align-items: center;
border-radius: 9px;
height: 17px;
justify-content: center;
width: 36px;
right: -46px;
bottom: 10px;
cursor: pointer;
text-align: center;
&:hover{
background: #EFEFEF;
}
.tagslist{
position: absolute;
right: 0;
top: 20px;
background-color: #fcfcfc;
color: #141414;
font-size: 13px;
line-height: 1em;
margin-bottom: 0;
max-height: 450px;
overflow-y: auto;
overflow-y: overlay;
padding: 20px 0 10px;
width: 325px;
text-align: left;
box-shadow: 0 2px 9px 2px rgba(0,0,0,.09), 0 1px 2px -2px rgba(0,0,0,.16);
.tags-view-item{
display: block;
position: relative;
>div{
padding: 8px 24px;
}
&:hover{
color: #0081FF;
}
.el-icon-check{
display: none;
position: absolute;
left: 5px;
width: 13px;
}
&.active{
color: #0081FF;
.el-icon-check{
display: block;
}
}
}
.clasall{
border-top: 1px solid #EFEFEF;
padding: 10px 24px 0;
margin-top: 10px;
&:hover{
color: #0081FF;
}
}
}
}
}
</style>
......
<template>
<div :class="classObj" class="app-wrapper" :style="{'--current-color': theme}">
<div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside"/>
<sidebar v-if="!sidebar.hide" class="sidebar-container" @handleBar="handleSideBar"/>
<div :class="{hasTagsView:needTagsView,sidebarHide:sidebar.hide}" class="main-container">
<sidebar v-if="!sidebar.hide" class="sidebar-container" @handleBar="handleSideBar" id="sidebar"/>
<div :class="{hasTagsView:needTagsView,sidebarHide:sidebar.hide,EnterpriseData:$route.name=='EnterpriseData'}" class="main-container">
<div :class="{'fixed-header':fixedHeader}">
<navbar :is-side-bar="isSideBar"/>
<navbar :offsetWidth="offsetWidth"/>
</div>
<app-main/>
<right-panel>
......@@ -21,7 +20,7 @@ import { AppMain, Navbar, Settings, Sidebar, TagsView } from './components'
import ResizeMixin from './mixin/ResizeHandler'
import { mapState } from 'vuex'
import variables from '@/assets/styles/variables.scss'
import elementResizeDetectorMaker from "element-resize-detector"
export default {
name: 'Layout',
components: {
......@@ -35,7 +34,8 @@ export default {
mixins: [ResizeMixin],
data() {
return {
isSideBar: ''
isSideBar: '',
offsetWidth:null,
}
},
computed: {
......@@ -59,13 +59,25 @@ export default {
return variables;
}
},
mounted(){
this.$nextTick(() => {
this.listenSider()
})
},
methods: {
handleClickOutside() {
this.$store.dispatch('app/closeSideBar', { withoutAnimation: false })
},
handleSideBar(val) {
this.isSideBar = val
}
this.listenSider()
},
listenSider(){
const _this = this, erd = elementResizeDetectorMaker(), partBox = document.getElementById("sidebar")
erd.listenTo(partBox, element => {
this.offsetWidth=partBox.offsetWidth;
})
},
}
}
</script>
......
......@@ -169,7 +169,7 @@ export const constantRoutes = [
path: '/radar/debtProject/details/:id',
component: () => import('@/views/radar/debtProject/details'),
name: 'debtProjectDetails',
meta: { title: '企业专项债详情', icon: 'radar' }
meta: { title: '政府专项债项目详情', icon: 'radar' }
}
]
},
......
......@@ -7,7 +7,7 @@
<div class="app-container">
<el-card class="box-card noborder">
<div class="tables">
<div class="empty" v-if="tableData.total==0">
<div class="empty" v-if="tableData.total==0 && !isSkeleton">
<img src="@/assets/images/project/empty.png">
<div class="p1">抱歉,没找到相关数据</div>
<div class="p2">建议调整关键词或筛选条件,重新搜索</div>
......@@ -25,7 +25,8 @@
<div class="btn btn_primary h32 p10" @click="opennew"><div class="img img1"></div>添加客户</div>
</div>
</div>
<el-table v-if="tableData.total > 0"
<skeleton v-if="isSkeleton"></skeleton>
<el-table v-if="!isSkeleton&&tableData.total > 0" class="fixed-table"
:data="tableData.rows"
stripe border
style="width: 100%">
......@@ -42,13 +43,17 @@
prop="date"
label="企业名称"
fixed="left"
width="441">
width="316">
<template slot-scope="scope">
<div class="ps1">
<div class="wordprimary ps2" @click="toDetail(scope.row,'')">{{scope.row.companyName}}</div>
<div class="ps3">
<div @click="toDetail(scope.row,'gjjl')">写跟进<img src="@/assets/images/project/edit_1.png"></div>
<div @click="toDetail(scope.row,'business')">编辑信息<img src="@/assets/images/project/edit_2.png"></div>
<el-tooltip class="item" effect="dark" content="写跟进" placement="top">
<div @click="toDetail(scope.row,'gjjl')"><img class="i" src="@/assets/images/project/edit_1.png"><img class="o" src="@/assets/images/project/edit_11.png"></div>
</el-tooltip>
<el-tooltip class="item" effect="dark" content="编辑信息" placement="top">
<div @click="toDetail(scope.row,'business')"><img class="i" src="@/assets/images/project/edit_2.png"><img class="o" src="@/assets/images/project/edit_22.png"></div>
</el-tooltip>
</div>
</div>
</template>
......@@ -159,8 +164,11 @@
label="主营业务" width="400">
<template slot-scope="scope">
<div v-if="scope.row.mainBusiness == null || scope.row.mainBusiness == ''">--</div>
<div class="box" v-else-if="scope.row.sq1==true">{{scope.row.mainBusiness1}}...<span @click="sq1(scope.row,false)">更多</span></div>
<div v-if="scope.row.mainBusiness1">
<div class="box" v-if="scope.row.sq1==true">{{scope.row.mainBusiness1}}...<span @click="sq1(scope.row,false)">更多</span></div>
<div class="box" v-else>{{scope.row.mainBusiness}}<span @click="sq1(scope.row,true)">收起</span></div>
</div>
<div v-else>{{scope.row.mainBusiness}}</div>
</template>
</el-table-column>
<el-table-column
......@@ -168,8 +176,11 @@
label="发包属性" width="400">
<template slot-scope="scope">
<div v-if="scope.row.companyAttribute == null || scope.row.companyAttribute == ''">--</div>
<div class="box" v-else-if="scope.row.sq2==true">{{scope.row.companyAttribute1}}...<span @click="sq2(scope.row,false)">更多</span></div>
<div v-if="scope.row.companyAttribute1">
<div class="box" v-if="scope.row.sq2==true">{{scope.row.companyAttribute1}}...<span @click="sq2(scope.row,false)">更多</span></div>
<div class="box" v-else>{{scope.row.companyAttribute}}<span @click="sq2(scope.row,true)">收起</span></div>
</div>
<div v-else>{{scope.row.companyAttribute}}</div>
</template>
</el-table-column>
<el-table-column
......@@ -239,17 +250,18 @@
</template>
<script>
import { getToken } from "@/utils/auth";
import "@/assets/styles/project.scss"
import {getCustomerList,importData,addCustomer} from '@/api/custom/custom'
import {getEnterprise,getDictType,} from '@/api/main'
import { getToken } from '@/utils/auth'
import '@/assets/styles/project.scss'
import { addCustomer, getCustomerList, importData } from '@/api/custom/custom'
import { getDictType, getEnterprise } from '@/api/main'
import prvinceTree from '@/assets/json/provinceTree'
import batchimport from '../../project/projectList/component/batchImport'
import axios from 'axios'
import {encodeStr} from "@/assets/js/common"
export default {
import skeleton from '../../project/projectList/component/skeleton'
import { encodeStr } from '@/assets/js/common'
export default {
name: 'CustomList',
components:{batchimport},
components:{batchimport,skeleton},
data() {
return{
encodeStr,
......@@ -297,6 +309,7 @@ export default {
// isNew:true,
showlist:false,
keys:1,
isSkeleton:true,
}
},
created() {
......@@ -343,6 +356,7 @@ export default {
//获取客户列表
getCustomerList(){
getCustomerList(this.searchParam).then(result=>{
this.isSkeleton = false
this.tableData = result
this.tableData.rows.forEach(item=>{
item.registerCapital = item.registerCapital == null?null: item.registerCapital.replace(/^\D*(\d*(?:\.\d{0,6})?).*$/g, '$1')
......@@ -358,6 +372,7 @@ export default {
}else{
item.sq2 = false
}
// console.log(item)
})
})
},
......@@ -378,6 +393,7 @@ export default {
},
//翻页
handleCurrentChange(val) {
this.isSkeleton = true
this.pldr=false
// this.isNew = false
this.searchParam.pageNum=val
......@@ -584,8 +600,8 @@ export default {
}
.tables{
position: relative;
height: calc(100vh - 134px);
overflow: auto;
min-height: calc(100vh - 134px);
/*overflow: auto;*/
.empty{
position: absolute;
top: 50%;
......@@ -601,23 +617,34 @@ export default {
display: flex;
justify-content: space-between;
.ps2{
width: 270px;
width: 350px;
}
.ps3{
width: 155px;
width: 60px;
display: flex;
justify-content: right;
>div{
margin-left: 12px;
&:hover{
color: #0CBC6D;
cursor: pointer;
}
>img{
float: right;
margin: 3px 0 0 4px;
width: 14px;
}
.i{
display: inline-block;
}
.o{
display: none;
}
&:hover{
cursor: pointer;
.i{
display: none;
}
.o{
display: inline-block;
}
}
}
}
}
......
<template>
<div @click = 'handleALL'>
<div class="app-container">
<el-card class="box-card noborder">
<div class="tables">
<div class="empty" v-if="tableData.total==0&& !isSkeleton">
<img src="@/assets/images/project/empty.png">
<div class="p1">抱歉,没找到相关数据</div>
<div class="p2">建议调整关键词或筛选条件,重新搜索</div>
</div>
<div class="table_search">
<div class="searchInput">
<el-input type="text" clearable v-model="searchParam.companyName" @change="clearname" placeholder="输入企业名称查询"></el-input>
<div class="btn" @click="handleCurrentChange(1)">搜索</div>
</div>
<div class="dc">
<div class="total">{{tableData.total}}</div>
</div>
</div>
<skeleton v-if="isSkeleton"></skeleton>
<el-table v-if="!isSkeleton&&tableData.total > 0" class="fixed-table"
:data="tableData.rows"
stripe border
style="width: 100%">
<el-table-column
prop="index"
label="序号"
fixed="left"
width="47">
<template slot-scope='scope'>
<span>{{ (searchParam.pageNum - 1) * searchParam.pageSize + scope.$index + 1 }}</span>
</template>
</el-table-column>
<el-table-column
prop="date"
label="企业名称"
fixed="left"
width="316">
<template slot-scope="scope">
<div class="ps1">
<div class="wordprimary ps2" @click="toDetail(scope.row,'')">{{scope.row.companyName}}</div>
<div class="ps3">
<el-tooltip class="item" effect="dark" content="重新认领" placement="top">
<div @click="toRL(scope.row)"><img class="i" src="@/assets/images/project/khrl1.png"><img class="o" src="@/assets/images/project/khrl2.png"></div>
</el-tooltip>
</div>
</div>
</template>
</el-table-column>
<el-table-column
prop="cooperationProject"
label="合作项目"
width="76">
<template slot-scope="scope">
{{scope.row.cooperationProject || '--'}}
</template>
</el-table-column>
<el-table-column
prop="followProject"
label="跟进项目"
width="76">
<template slot-scope="scope">
{{scope.row.followProject || '--'}}
</template>
</el-table-column>
<el-table-column
prop="reserveProject"
label="储备项目"
width="76">
<template slot-scope="scope">
{{scope.row.reserveProject || '--'}}
</template>
</el-table-column>
<el-table-column
prop="legalPerson"
label="法定代表人"
width="110">
<template slot-scope="scope">
{{scope.row.legalPerson || '--'}}
</template>
</el-table-column>
<el-table-column
prop="registerAddress"
label="注册地区"
width="160">
<template slot-scope="scope">
{{scope.row.registerAddress || '--'}}
</template>
</el-table-column>
<el-table-column
prop="registerCapitalStr"
label="注册资本金(万元)"
width="140">
<template slot-scope="scope">
{{scope.row.registerCapital || '--'}}
</template>
</el-table-column>
<el-table-column
prop="creditLevel"
label="企业主体评级" width="100">
<template slot-scope="scope">
{{scope.row.creditLevel || '--'}}
</template>
</el-table-column>
<el-table-column
prop="isOn"
label="上市公司" width="76">
<template slot-scope="scope">
{{scope.row.isOn == 1?"是":"否"}}
</template>
</el-table-column>
<el-table-column
prop="isMajor"
label="局级大客户" width="88">
<template slot-scope="scope">
<span v-if="scope.row.isMajor != null">
{{scope.row.isMajor == 1?"是":"否"}}
</span>
<span v-else>--</span>
</template>
</el-table-column>
<el-table-column
prop="customerLevel"
label="客户等级" width="76">
<template slot-scope="scope">
{{scope.row.customerLevel || '--'}}
</template>
</el-table-column>
<el-table-column
prop="companyNature"
label="客户性质" width="76">
<template slot-scope="scope">
{{scope.row.companyNature || '--'}}
</template>
</el-table-column>
<el-table-column
prop="companyLevel"
label="客户级别" width="76">
<template slot-scope="scope">
{{scope.row.companyLevel || '--'}}
</template>
</el-table-column>
<el-table-column
prop="address"
label="企业母公司" width="268">
<template slot-scope="scope">
<div class="">{{scope.row.superCompany || '--'}}</div>
</template>
</el-table-column>
<el-table-column :key="keys"
prop="mainBusiness"
label="主营业务" width="400">
<template slot-scope="scope">
<div v-if="scope.row.mainBusiness == null || scope.row.mainBusiness == ''">--</div>
<div v-if="scope.row.mainBusiness1">
<div class="box" v-if="scope.row.sq1==true">{{scope.row.mainBusiness1}}...<span @click="sq1(scope.row,false)">更多</span></div>
<div class="box" v-else>{{scope.row.mainBusiness}}<span @click="sq1(scope.row,true)">收起</span></div>
</div>
<div v-else>{{scope.row.mainBusiness}}</div>
</template>
</el-table-column>
<el-table-column
prop="companyAttribute" :key="keys+2"
label="发包属性" width="400">
<template slot-scope="scope">
<div v-if="scope.row.companyAttribute == null || scope.row.companyAttribute == ''">--</div>
<div v-if="scope.row.companyAttribute1">
<div class="box" v-if="scope.row.sq2==true">{{scope.row.companyAttribute1}}...<span @click="sq2(scope.row,false)">更多</span></div>
<div class="box" v-else>{{scope.row.companyAttribute}}<span @click="sq2(scope.row,true)">收起</span></div>
</div>
<div v-else>{{scope.row.companyAttribute}}</div>
</template>
</el-table-column>
<el-table-column
prop="followUser"
label="跟进人" width="110">
<template slot-scope="scope">
{{scope.row.followUser || '--'}}
</template>
</el-table-column>
</el-table>
<div class="bottems" v-if="tableData.total>searchParam.pageSize">
<el-pagination
background
:page-size="searchParam.pageSize"
:current-page="searchParam.pageNum"
@current-change="handleCurrentChange"
layout="prev, pager, next"
:total="tableData.total">
</el-pagination>
</div>
<div class="delform" v-if="RLcompanyName">
<div class="words">再次认领将会恢复默认客户数据</div>
<div>
<div class="btnsmall btn_primary h28" @click="RL">确定</div>
<div class="btnsmall btn_cancel h28" @click="RLcompanyName = ''">取消</div>
</div>
</div>
</div>
</el-card>
</div>
</div>
</template>
<script>
import { getToken } from "@/utils/auth";
import "@/assets/styles/project.scss"
import {getCustomerList,importData,addCustomer} from '@/api/custom/custom'
import {getEnterprise,getDictType,} from '@/api/main'
import {encodeStr} from "@/assets/js/common"
import { historyClaim } from "@/api/common" //认领
import skeleton from '../../project/projectList/component/skeleton'
export default {
name: 'CustomList',
components:{skeleton},
data() {
return{
encodeStr,
searchParam:{
companyName:'',
pageNum:1,
pageSize:20,
status:1,
},
tableData: [],//列表
customerLevel:[],//客户等级
rules:{
companyName:[{ required: true, message: '请输入非空格字符!', trigger: 'blur' },]
},
//批量导入
action: process.env.VUE_APP_BASE_API + "/customer/importData",
fileList: [],
headers: {
Authorization: "Bearer " + getToken(),
},
// isNew:true,
showlist:false,
keys:1,
RLcompanyName:'',//重新认领企业名称
isSkeleton:true,
}
},
created() {
this.getCustomerList()
this.getDictType()
},
methods:{
sq1(item,sq){
this.$nextTick(()=>{
item.sq1 = sq
this.keys++ ;
})
},
sq2(item,sq){
this.$nextTick(()=>{
item.sq2 = sq
this.keys++ ;
})
},
handleALL(event){
var one = document.getElementById("box");
if(one){
if(!one.contains(event.target)){
this.showlist = false
}
}
},
toct(){
this.$router.push({path:'/macro/urban'})
},
getDictType(){
//获取客户等级
getDictType('customer_level_type').then(result=>{
this.customerLevel = result.code == 200 ? result.data:[]
})
},
//获取客户列表
getCustomerList(){
getCustomerList(this.searchParam).then(result=>{
this.isSkeleton = false
this.tableData = result
this.tableData.rows.forEach(item=>{
item.registerCapital = item.registerCapital == null?null: item.registerCapital.replace(/^\D*(\d*(?:\.\d{0,6})?).*$/g, '$1')
if(item.mainBusiness != "" && item.mainBusiness != null && item.mainBusiness.length>84){
item.mainBusiness1 = item.mainBusiness.substring(0,81)
item.sq1 = true
}else{
item.sq1 = false
}
if(item.companyAttribute != "" && item.companyAttribute != null && item.companyAttribute.length>84){
item.companyAttribute1 = item.companyAttribute.substring(0,81)
item.sq2 = true
}else{
item.sq2 = false
}
})
})
},
//跳转到客户详情
toDetail(row,type){
let customerId = row.customerId
let companyId = row.companyId
let path = type
if(type == "" && companyId == null){
path = 'business'
}
this.$router.push({path:'/enterprise/'+encodeStr(companyId),query:{customerId:customerId,path:path}})
},
//认领客户
async toRL(row){
this.RLcompanyName = row.companyName
},
async RL(){
let res = await historyClaim(this.RLcompanyName)
if(res.code==200){
this.$message.success('认领成功!')
this.handleCurrentChange(1)
this.RLcompanyName=''
}
},
clearname(value){
if(value == ""){
this.handleCurrentChange(1)
}
},
//翻页
handleCurrentChange(val) {
this.isSkeleton = true
this.searchParam.pageNum=val
this.getCustomerList()
},
}
}
</script>
<style lang="scss" scoped>
.delform{
width: 228px;
left: 50%;
top: 50%;
margin-left: -114px;
margin-top: -57px;
.words{
font-size: 14px;
}
}
.app-container{
height: calc(100vh - 134px)
}
.box-card{
padding-top: 16px;
width: 100%;
height: 100%;
}
.box{
position: relative;
>span{
position: absolute;
right: 10px;
bottom: 0;
color: #0081FF;
cursor: pointer;
&:hover{
color: #006AD1;
}
}
}
.dc{
font-size: 12px;
color: #3D3D3D;
font-weight: 400;
position: relative;
&::after{
content: ' ';
width: 2px;
height: 2px;
background: rgba(35,35,35,0.4);
border-radius: 50%;
position: absolute;
top: 16px;
left: 14px;
}
>div{
display: inline-block;
margin-left: 20px;
}
}
.img.img1{
margin-right: 2px;
background: url('../../../../src/assets/images/project/add_2.png')no-repeat center center;
background-size: 100%;
}
.w88{
width: 88px;
}
.tables{
position: relative;
min-height: calc(100vh - 134px);
/*overflow: auto;*/
.empty{
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
.btn{
margin-right: 8px;
margin-top: 16px;
}
}
}
.ps1{
display: flex;
justify-content: space-between;
.ps2{
width: 350px;
}
.ps3{
width: 60px;
display: flex;
justify-content: right;
>div{
margin-left: 12px;
>img{
float: right;
margin: 3px 0 0 4px;
width: 14px;
}
.i{
display: inline-block;
}
.o{
display: none;
}
&:hover{
cursor: pointer;
.i{
display: none;
}
.o{
display: inline-block;
}
}
}
}
}
.popbot{
.wordprimary{
display: inline;
padding-right: 26px;
}
}
.app-container{
height: auto;
}
.searchInput{
.el-input{
width: 260px;
}
}
</style>
......@@ -118,9 +118,10 @@
</template>
<script>
import "@/assets/styles/project.scss"
import * as echarts from 'echarts'
export default {
import '@/assets/styles/project.scss'
import * as echarts from 'echarts'
export default {
name: 'Overview',
data() {
return {
......@@ -192,9 +193,9 @@ export default {
initChart(){
//客户级别
this.option = {
tooltip: {
trigger: 'item'
trigger: 'item',
extraCssText: 'border:0',
},
color:['#8A82F3','#5B9CF7','#8DCF96','#FFDC6B','#FE9C77'],//修改配色
series: [
......@@ -203,17 +204,17 @@ export default {
type: 'pie',
radius: ['50%','70%'],
data: [
{ value: 23, name: '集团总部:11%' },
{ value: 61, name: '一级单位:29%' },
{ value: 60, name: '二级单位:29%' },
{ value: 21, name: '三级单位:10%' },
{ value: 44, name: '其他单位: 21%' }
{ value: 23, name: '集团总部:11%',borderWidth:0 },
{ value: 61, name: '一级单位:29%',borderWidth:0 },
{ value: 60, name: '二级单位:29%',borderWidth:0 },
{ value: 21, name: '三级单位:10%',borderWidth:0 },
{ value: 44, name: '其他单位: 21%',borderWidth:0 }
],
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
shadowColor: 'rgba(0, 0, 0, 0)'
}
}
}
......@@ -267,7 +268,14 @@ export default {
}
}
}
]
],
emphasis: {
itemStyle: {
// 高亮时点的颜色。
color: 'rgb(90,146,247)'
},
}
}
this.option2 && this.myChart2.setOption(this.option2)
//客户资质分析
......@@ -317,7 +325,14 @@ export default {
},
}
}
]
],
emphasis: {
itemStyle: {
// 高亮时点的颜色。
color: 'rgb(134,231,231)'
},
}
}
this.option3 && this.myChart3.setOption(this.option3)
......@@ -358,6 +373,7 @@ export default {
axisPointer:{ //悬浮于圆点展示标签
type:'axis'
},
extraCssText: 'border:0',
// trigger: 'axis'
},
series: [
......
......@@ -169,7 +169,7 @@ export default {
.headForm{
margin-bottom: 14px;
.common-title{
margin-right: 19px;
margin-right: 24px;
}
::v-deep .el-input__inner{
border: 1px solid #D9D9D9;
......@@ -210,10 +210,12 @@ export default {
display: flex;
border-radius: 2px 0px 0px 2px;
border: 1px solid #D9D9D9;
line-height: 32px;
height: 32px;
span {
width: 60px;
height: 32px;
line-height: 32px;
height: 30px;
line-height: 28px;
font-size: 14px;
background: #F5F5F5;
text-align: center;
......@@ -234,9 +236,12 @@ export default {
flex: 1;
}
::v-deep .el-input__inner {
border-radius: 2px 0 2px 0;
border: 0;
border-right: 0;
line-height: 30px;
height: 30px;
position: absolute;
top: 0;
padding-right: 32px;
}
}
.fromTime{
......@@ -251,6 +256,11 @@ export default {
.fromTime-icon {
display: none;
}
.el-select{
.el-input__suffix{
right: 10px;
}
}
}
::v-deep .form-content-width{
width: 170px;
......
......@@ -31,6 +31,7 @@
</template>
<script>
export default {
name: 'Sidebar',
props: {
......@@ -50,6 +51,10 @@ export default {
type: Boolean,
default: true
},
statisticObj:{
type:Object,
default: {}
},
isCustomer: {
type: Boolean,
default: false
......@@ -142,6 +147,141 @@ export default {
},
created() {
this.defaultRoute = JSON.parse(JSON.stringify(this.sideRoute))
},
watch:{
statisticObj:{
handler(val) {
let arr = JSON.parse(JSON.stringify(val))
for(var i in arr){
for(var j in arr[i]){
switch (j) {
case 'ownershipStructure':
if(arr[i][j]<1){
this.sideRoute[0].children[2].disabled = true;
}
break;
case 'leadingMember':
if(arr[i][j]<1){
this.sideRoute[0].children[3].disabled = true;
}
break;
case 'outboundInvestment':
if(arr[i][j]<1){
this.sideRoute[0].children[4].disabled = true;
}
break;
case 'branch':
if(arr[i][j]<1){
this.sideRoute[0].children[5].disabled = true;
}
break;
case 'landInfo':
if(arr[i][j]<1){
this.sideRoute[2].children[0].disabled = true;
this.sideRoute[4].children[1].disabled = true;
}
break;
case 'busProposedProjectV1':
if(arr[i][j]<1){
this.sideRoute[2].children[1].disabled = true;
}
break;
case 'specialDebt':
if(arr[i][j]<1){
this.sideRoute[2].children[2].disabled = true;
}
break;
case 'bidPlan':
if(arr[i][j]<1){
this.sideRoute[2].children[3].disabled = true;
}
break;
case 'biddingAnnouncement':
if(arr[i][j]<1){
this.sideRoute[2].children[4].disabled = true;
}
break;
case 'proBiddingAnnouncement':
if(arr[i][j]<1){
this.sideRoute[2].children[5].disabled = true;
}
break;
case 'adminLicensing':
if(arr[i][j]<1){
this.sideRoute[2].children[6].disabled = true;
}
break;
case 'customer':
if(arr[i][j]<1){
this.sideRoute[3].children[0].disabled = true;
}
break;
case 'supplier':
if(arr[i][j]<1){
this.sideRoute[3].children[1].disabled = true;
}
break;
case 'coopBiddingAgency':
if(arr[i][j]<1){
this.sideRoute[3].children[2].disabled = true;
}
break;
case 'historySend':
if(arr[i][j]<1){
this.sideRoute[3].children[3].disabled = true;
}
break;
case 'tenderRecordV1':
if(arr[i][j]<1){
this.sideRoute[3].children[4].disabled = true;
}
break;
case 'adminSanction':
if(arr[i][j]<1){
this.sideRoute[5].children[0].disabled = true;
}
break;
case 'abnormalOperation':
if(arr[i][j]<1){
this.sideRoute[5].children[1].disabled = true;
}
break;
case 'dishonestExecutee':
if(arr[i][j]<1){
this.sideRoute[5].children[2].disabled = true;
}
break;
case 'dishonestExecutor':
if(arr[i][j]<1){
this.sideRoute[5].children[3].disabled = true;
}
break;
case 'adjudicativeDoc':
if(arr[i][j]<1){
this.sideRoute[5].children[4].disabled = true;
}
break;
case 'courtAnnouncement':
if(arr[i][j]<1){
this.sideRoute[5].children[5].disabled = true;
}
break;
case 'openAnnouncement':
if(arr[i][j]<1){
this.sideRoute[5].children[6].disabled = true;
}
break;
default:
break;
}
}
}
}
}
},
methods: {
handleOpen(key, keyPath) {
......@@ -255,6 +395,12 @@ export default {
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);
......@@ -268,7 +414,7 @@ export default {
left: 21px;
width: 2px;
height: 2px;
background: rgba(35,35,35,0.8);
background: #0081FF;
border-radius: 50%;
}
}
......
<template>
<div class="Tables">
<div class="table-item">
<el-table
<el-table v-if="tableDataTotal>0" class="fixed-table"
v-loading="tableLoading"
:data="tableData"
element-loading-text="Loading"
......@@ -61,11 +61,12 @@
</template>
<template slot="empty">
<div style="padding: 30px 0">
<no-data />
</div>
</template>
</el-table>
<div style="padding: 30px 0" v-else>
<no-data />
</div>
</div>
<div class="pagination-box" v-if="show_page && tableDataTotal>queryParams.pageSize">
<el-pagination background :current-page="current_page" :page-size="queryParams.pageSize" :total="tableDataTotal" layout="prev, pager, next, jumper" @current-change="handleCurrentChange" @size-change="handleSizeChange" />
......
......@@ -199,9 +199,12 @@ export default {
},
color: ['#5B9CF7','#8DCF96','#FFDC6B','#FE9C77','#8A82F3'],
legend: {
selectedMode: false,
x: 'center',
y: 'bottom',
itemHeight: 9,
itemWidth:12,
itemHeight:8,
textStyle: {
padding: [0, 0, -2, 0],
color: '#000000',
......@@ -248,6 +251,30 @@ export default {
// 使用刚指定的配置项和数据显示图表。
myChart.clear() //清空
myChart.setOption(option)
// 默认高亮
let index = 0; // 高亮索引
myChart.dispatchAction({
type: "highlight",
seriesIndex: index,
dataIndex: index
});
myChart.on("mouseover", function(e) {
if (e.dataIndex != index) {
myChart.dispatchAction({
type: "downplay",
seriesIndex: 0,
dataIndex: index
});
}
});
myChart.on("mouseout", function(e) {
index = e.dataIndex;
myChart.dispatchAction({
type: "highlight",
seriesIndex: 0,
dataIndex: e.dataIndex
});
});
}
}
}
......
......@@ -3,7 +3,7 @@
<Header :company-id="companyId" :companyInfo="companyInfo" :cooDetail="cooDetail" v-if="companyId" @close-detail="closeDetail" />
<div class="flex-box part-main">
<div class="part-left">
<side-bar @currentPath="showPartPage" :pathName="currentPath.pathName" :partBoxHeight="partBoxHeight" :customerId="customerId" :isCompany="isCompany" :isCustomer="isCustomer" />
<side-bar :statisticObj="statisticObj" ref="sidebar" @currentPath="showPartPage" :pathName="currentPath.pathName" :partBoxHeight="partBoxHeight" :customerId="customerId" :isCompany="isCompany" :isCustomer="isCustomer" />
</div>
<div class="part-right">
<div id="partBox" v-if="companyId">
......@@ -64,7 +64,7 @@
<script>
import { idRemark } from '@/api/common'
import { infoHeader } from '@/api/detail/party-a/index'
import { infoHeader,statistic } from '@/api/detail/party-a/index'
import { customerInfo } from '@/api/detail/party-a/cooperate'
import elementResizeDetectorMaker from "element-resize-detector"
import Header from "./component/Header"
......@@ -104,6 +104,9 @@ import Preference from "./preference" //招标偏好
import Cooperate from "./cooperate" //合作情况
import DecisionMaking from "./decisionMaking" //决策链条
import Gjjl from "../../project/projectList/component/gjjl" //跟进记录
import {
urbanInvestmentPage,
} from '@/api/detail/party-a/urbanLnvestment'
export default {
name: 'PartyA',
components: {
......@@ -156,6 +159,7 @@ export default {
currentPath: {
pathName: 'overview' //默认展示页
},
statisticObj:{},
partBoxHeight: null,
cooDetail: false
}
......@@ -234,14 +238,34 @@ export default {
this.$nextTick(() => {
this.listenSider()
})
this.handleQuery()
this.getStatistic();
this.handleQuery();
this.association(this.$route.query.customerId)
}
},
async getStatistic(){
let res = await statistic({companyId:this.companyId});
if(res.code==200){
this.statisticObj = res.data
}
},
async handleQuery() {
let res = await infoHeader({companyId:this.companyId})
if(res.code==200){
this.companyInfo = res.data || {}
let data = {
pageNum: 1,
pageSize: 5,
provinceIds: [this.companyInfo.provinceId],
cityIds: [this.companyInfo.cityId],
}
urbanInvestmentPage(data).then(res => {
if(res.data.totalCount<1){
let arr = JSON.parse(JSON.stringify(this.$refs.sidebar.sideRoute))
arr[4].children[2].disabled = true;
this.$refs.sidebar.sideRoute = arr
}
})
if(this.companyInfo && this.companyInfo.companyName){
this.$nextTick(()=>{
document.getElementById('tagTitle').innerText = this.companyInfo.companyName
......
......@@ -5,6 +5,7 @@
:form-data="formData"
:query-params="queryParams"
:isExcel="true"
@handle-search="handleSearch"
:total="tableDataTotal"
/>
......@@ -33,7 +34,7 @@
<script>
import mixin from '../mixins/mixin'
import {bidPlanPage} from '@/api/detail/party-a/opport'
import {bidPlanPage,bidPlanProjectType} from '@/api/detail/party-a/opport'
export default {
name: 'Biddingplan',
props: ['companyId'],
......@@ -59,7 +60,10 @@ export default {
{label: '标的物类型', prop: 'objectType', minWidth: '100'},
{label: '预计招标日期', prop: 'planTenderDateStart', sortable: 'custom', descending: '15', ascending: '16', minWidth: '110'}
],
formData: [],
formData: [
{ type: 4, fieldName: 'buildingProjectType', value: '', placeholder: '项目类型', options: []},
{ type: 3, fieldName: 'keys', value: '', placeholder: '输入项目名称关键词查询', options: [], width: 220}
],
//列表
tableLoading:false,
tableData:[],
......@@ -70,8 +74,19 @@ export default {
},
created() {
this.handleQuery()
this.handleOption()
},
methods: {
async handleOption(){
let res = await bidPlanProjectType({cid: this.companyId})
if(res.code==200){
let buildingProjectType = res.data.map(item => {
let it = {name:item.buildingProjectType+'('+item.count+')',value:item.buildingProjectType}
return it
})
this.setFormData('buildingProjectType', buildingProjectType)
}
},
async handleQuery(params) {
this.tableLoading = true
let param = params?params:this.queryParams
......
......@@ -52,7 +52,7 @@ export default {
defaultSort: {prop: 'planStartTime', order: 'descending'},
forData: [
{label: '项目名称', prop: 'projectName', minWidth: '300', slot: true},
{label: '成交金额(万元)', prop: 'money', sortable: 'custom', descending: '1', ascending: '2', width: '150'},
// {label: '成交金额(万元)', prop: 'money', sortable: 'custom', descending: '1', ascending: '2', width: '150'},
{label: '项目类别', prop: 'projectCategories', width: '100'},
{label: '计划开工日期', prop: 'planStartTime', sortable: 'custom', descending: '3', ascending: '4', width: '130'},
{label: '计划完工日期', prop: 'planEndTime', sortable: 'custom', descending: '13', ascending: '14', width: '130'},
......
......@@ -102,5 +102,9 @@ export default {
}
}
}
::v-deep .el-input__inner{
padding-left: 10px;
padding-right: 22px;
}
}
</style>
......@@ -30,22 +30,24 @@
<span class="zbph-item-num">{{dataAll.bidAmount?parseFloat(dataAll.bidAmount.toFixed(6)):'--'}}</span></div>
</div>
<div class="zbph-account">招标动态
<div class="labels">
<div class="labels" v-if="dataAll.totalCount">
<div :class="{'on':datatype==3}" @click="getDT(3)">近7天</div>
<div :class="{'on':datatype==2}" @click="getDT(2)">近30天</div>
<div :class="{'on':datatype==1}" @click="getDT(1)">近5年</div>
</div>
</div>
<div id="myEcharts" style="width: 100%;height:250px; margin: 0 auto;"></div>
</template>
<div v-if="dataAll.totalCount" id="myEcharts" style="height:250px; margin: 0 auto;"></div>
<div class="bid-no-data" v-else>
<no-data />
</div>
</template>
</div>
<div class="bid-ywwl">
<div class="common-title">业务往来供应商TOP5</div>
<div class="table-item">
<el-table
v-if="tableData.length>0"
:data="tableData"
style="width: 100%"
>
......@@ -80,12 +82,10 @@
<span style="padding-right: 28px;">{{ scope.row.amount }}</span>
</template>
</el-table-column>
<template slot="empty">
<div style="padding: 30px 0">
</el-table>
<div class="bid-no-data" style="margin-top: 100px;" v-else>
<no-data />
</div>
</template>
</el-table>
</div>
</div>
</div>
......@@ -105,7 +105,7 @@ export default {
data() {
return {
encodeStr,
datatype:'3',//切换类型
datatype:'1',//切换类型
dataAll: {},
dtdata:[],//数据
dttime:[],//坐标
......@@ -166,7 +166,7 @@ export default {
}
},
grid:{
left:'1',
left:'1%',
top:'8%',
right:'5%',
bottom:'8%',
......@@ -316,7 +316,17 @@ export default {
::v-deep .el-table .el-table__body-wrapper tr:nth-child(2n){
background: #FFFFFF;
}
::v-deep .el-table .el-table__body-wrapper tr:nth-child(5) .el-table__cell{
border: none;
}
::v-deep .el-table::before{
display: none;
}
}
}
}
::deep .el-table::before{
display: none;
}
</style>
......@@ -7,13 +7,13 @@
</el-tabs>
<div class="flex-box clue-box">
<div class="clue-echarts" v-if="viewData.length>0"><div id="echartsClue" style="width: 100%;height:300px; margin: 0 auto;"></div></div>
<div class="busc-no-data" v-else>
<no-data />
</div>
<div class="table-item">
<div class="table-item" v-if="viewData.length>0">
<el-table
v-if="viewData.length>0"
:data="viewData"
border
max-height="231"
style="width: 100%"
:default-sort = "{prop: 'date', order: 'descending'}"
>
......@@ -30,13 +30,11 @@
align="right"
label="占比(%)">
</el-table-column>
<template slot="empty">
<div style="padding: 30px 0">
<no-data />
</div>
</template>
</el-table>
</div>
<div class="busc-no-data" v-else>
<no-data />
</div>
</div>
<div class="flex-box clue-type">
<div class="flex-box clue-type-item" :class="!item.count?'disab':''" v-for="(item, index) in typeList" :key="index" @click="handleType(item, index)"><img :src="!item.count?item.dis_ico:item.ico">{{item.name}}</div>
......@@ -197,7 +195,7 @@ export default {
width: calc(50% - 8px);
}
.busc-no-data{
width: calc(50% - 8px);
width: 100%;
}
.table-item{
width: calc(50% - 8px);
......
<template>
<div class="app-container finance-container">
<div class="common-title">财务数据
<el-tooltip placement="top">
<div slot="content">营业收入数据优先取“营业总收入”<br/>营业总收入未披露时取“营业收入”</div>
<img style="width: 18px; height: 18px;margin-left:9px;" src="@/assets/images/detail/overview/zbph_question.png" >
</el-tooltip>
</div>
<el-tabs v-model="activeIndex" @tab-click="handleQuery(vals[activeIndex])" class="tabpane selfTab">
<el-tab-pane label="营业收入" name="0"></el-tab-pane>
<el-tab-pane label="净利润" name="1"></el-tab-pane>
<el-tab-pane label="总资产" name="2"></el-tab-pane>
<el-tab-pane label="净资产" name="3"></el-tab-pane>
</el-tabs>
<div class="flex-box finance-box">
<div class="finance-echarts" v-if="viewData.length>0"><div id="echartsFinance" style="width: 100%;height:300px; margin: 0 auto;"></div></div>
<div class="finance-no-data" v-else>
<no-data />
</div>
<div class="table-item" v-if="viewData.length>0">
<el-table
:data="viewData"
border
style="width: 100%"
:default-sort = "{prop: 'date', order: 'descending'}"
>
<el-table-column label="币种:人民币">
<el-table-column
prop="year"
align="left"
label="报告期(年度)"></el-table-column>
<el-table-column
prop="operatingIncome"
align="right"
label="营业收入(亿)">
</el-table-column>
<el-table-column
prop="netProfit"
align="right"
label="净利润(亿)">
</el-table-column>
<el-table-column
prop="totalAssets"
align="right"
label="总资产(亿)">
</el-table-column>
<el-table-column
prop="netAssets"
align="right"
label="净资产(亿)">
</el-table-column>
</el-table-column>
</el-table>
</div>
</div>
</div>
</template>
<script>
import {financialData} from '@/api/detail/party-a/overview'
import * as echarts from 'echarts'
import NoData from '../../component/noData'
export default {
name: 'Finance',
props: ['companyId'],
components: {
NoData
},
data() {
return {
viewData:[],
activeIndex:0,
vals:['operatingIncome','netProfit','totalAssets','netAssets'],
names:['营业收入(亿)','净利润(亿)','总资产(亿)','净资产(亿)'],
}
},
created() {
this.handleQuery()
},
mounted() {
},
methods: {
async handleQuery(val){
let res = await financialData({cid: this.companyId})
if(res.code==200 && res.data){
this.viewData = res.data
if(this.viewData.length>0){
this.$nextTick(() => {
this.getDT(val)
})
}
}
},
getDT(val="operatingIncome"){
let myChart = echarts.init(document.getElementById("echartsFinance"))
let barData = [],years = [],compareData = [];
this.viewData.map(item=>{
barData.push(item[val+'Size'].toFixed(2));
compareData.push(item[val+'Compare']||'');
years.push(item.year)
})
// let compareDataMax = Math.max(...compareData)
// let compareDataMin = Math.min(...compareData)
let option = {
legend: {
show:true,
width: "100%",
left: 'center',
bottom:0,
textStyle: {
width: 120,
padding: [0, 26, 0, 0],
backgroundColor: "transparent",
},
itemWidth: 18,
itemHeight: 8,
data: [this.names[this.activeIndex], '同比(%)']
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
}
},
grid: {
left: '3%',
right: '4%',
bottom: '32',
containLabel: true
},
xAxis: [
{
type: 'category',
data: years,
axisTick: {
alignWithLabel: true,
show: false
}
}
],
yAxis: [
{
type: 'value',
// min:0,
splitLine : { //网格线
lineStyle: {
type: 'dashed' //设置网格线类型 dotted:虚线 solid:实线
},
}
},
{
type: 'value',
// min:'dataMin',
// max:'dataMax',
// interval:((compareDataMax-compareDataMin)/5).toFixed(2),
splitLine : { //网格线
show:false
},
axisLabel: {
formatter: '{value}%'
}
}
],
series: [
{
name: this.names[this.activeIndex],
type: 'bar',
barWidth: '20px',
data: barData,
itemStyle:{
normal:{
barBorderRadius:[4,4,0,0],
color:'#14C9C9'
},
}
},
{
name: '同比(%)',
symbolSize: 12, //标记的大小(折线图圆点大小)
label: {
color: "#666666",
},
lineStyle: {
color: "#0081FF",
width: 1
},
itemStyle: {
color: "#0081FF"
},
type: 'line',
yAxisIndex: 1,
data: compareData
},
],
emphasis: {
itemStyle: {
// 高亮时点的颜色。
color: 'rgb(134,231,231)'
},
}
}
myChart.setOption(option)
},
},
}
</script>
<style lang="scss" scoped>
.finance-container{
margin: 0;
padding: 24px 16px;
background: #FFFFFF;
border-radius: 4px;
.selfTab{
margin: 24px 0 0 -12px;
::v-deep .el-tabs__nav-wrap::after{
display: none;
}
::v-deep .el-tabs__item{
height: 30px;
line-height: 30px;
padding: 0 12px;
}
}
.finance-box{
width: 100%;
justify-content: space-between;
margin: 8px 0 24px 0;
.finance-echarts{
width: calc(50% - 8px);
}
.finance-no-data{
width: 100%;
}
.table-item{
width: calc(50% - 8px);
}
}
}
</style>
......@@ -65,7 +65,7 @@
</div>
</div>
<div class="company-menu">
<el-button v-if="ifClaim==1" class="hasClaim"><i class="el-ico-claim" alt="已认领" title="已认领"></i> 已认领</el-button>
<el-button v-if="companyInfo.claimStatus==1" @click="cancelClaimClick()" class="hasClaim"><i class="el-ico-claim" alt="已认领" title="已认领"></i> 已认领</el-button>
<el-button @click="handleClaim" v-else class="claim" v-loading="claimLoading"><i class="el-ico-claim" alt="认领客户" title="认领客户"></i> 认领客户</el-button>
</div>
......@@ -134,21 +134,46 @@
<span class="dialog-footer-btn2" @click="renHide()">稍后</span>
</div>
</el-dialog>
<el-dialog :visible.sync="dialogVisible2" custom-class='dialog-renlin' title="重新认领" width="260px" :show-close="false">
<div>再次认领将会恢复客户数据</div>
<div slot="footer" class="dialog-footer">
<span class="dialog-footer-btn1" type="primary" @click="handleHistoryClaim()">确认</span>
<span class="dialog-footer-btn2" @click="dialogVisible2 = false">关闭</span>
</div>
</el-dialog>
<el-dialog
title="取消认领"
:visible.sync="dialogVisible1"
:modal="false"
custom-class='dialog-renlin'
:show-close="false"
width="344px">
<span>是否取消认领客户?客户信息将放入“历史客户”。</span>
<div slot="footer" class="dialog-footer">
<span class="dialog-footer-btn1" type="primary" @click="confirm()" >
确认
</span>
<span class="dialog-footer-btn2" @click="dialogVisible1 = false">关闭</span>
</div>
</el-dialog>
</div>
</template>
<script>
import { changePath } from '@/assets/js/common'
import { changePath,encodeStr } from '@/assets/js/common'
var Swiper = require('@/assets/lib/swiper/swiper-bundle.min.js')
import "@/assets/lib/swiper/swiper-bundle.css"
import { claim } from "@/api/common"
import api from "@/api/enterpriseData/enterpriseData.js"
export default {
name: 'Infoheader',
props: ['companyId', 'companyInfo', 'statistic'],
data() {
return {
encodeStr,
newStatic: null,
labelList: [], //企业标签
customerId:'',
claimLoading: false,
ifClaim: 0, //是否认领
showMore: false,
......@@ -165,7 +190,9 @@ export default {
//风险扫描
labelArr:['失信联合惩戒企业','司法纠纷','注销'], //负向经营状态
enterpriseLabel:[],//企业标签
dialogVisible: false
dialogVisible: false,
dialogVisible1: false,
dialogVisible2: false,
}
},
created() {
......@@ -192,16 +219,49 @@ export default {
registerAddress:this.companyInfo.provinceName+(this.companyInfo.cityName?'-'+this.companyInfo.cityName:'')+(this.companyInfo.districtName?'-'+this.companyInfo.districtName:''),
creditCode:this.companyInfo.creditCode
}
let res = await api.customerStatus(this.companyInfo.companyName)
if(res.data === 1){
this.claimLoading = false
this.dialogVisible2=true;
}else{
let res = await claim(param)
this.claimLoading = false
if(res.code==200){
this.dialogVisible=true
this.ifClaim = 1
this.companyInfo.claimStatus = 1
this.customerId = res.data.customerId
}
}
}else{
this.$message.warning('对不起,当前不能认领')
}
},
//取消认领
cancelClaimClick(){
this.dialogVisible1 = true;
},
async handleHistoryClaim(){
let res = await api.historyClaim(this.companyInfo.companyName)
if(res.code==200){
this.dialogVisible2 = false;
this.companyInfo.claimStatus = 1
}else{
this.$message.error(res.msg)
}
},
async confirm(){
let res = await api.cancelClaim(this.companyInfo.companyName)
if(res.code==200){
this.dialogVisible1 = false;
this.companyInfo.claimStatus = 0
}else{
this.$message.error(res.msg)
}
// api.cancelClaim(this.companyInfo.companyName).then(res=>{
// })
},
companySwiper(){
new Swiper('.swiper-info', {
slidesPerView: 6,
......@@ -292,7 +352,17 @@ export default {
},
renlin(){
this.dialogVisible=false;
// this.$router.push({path:'/home',query: {id:'1'}})
// window.location.href = window.location.origin+window.location.pathname+'?customerId='+this.customerId+'&path=business'
this.$router.replace({
path: '/enterprise/'+encodeStr(this.companyId),
query: {
'customerId': this.customerId,
'path':'business'
} ,
})
this.$nextTick(()=>{
this.$tab.refreshPage();
})
// 跳转地址
},
renHide(){
......@@ -665,6 +735,12 @@ export default {
text-align: center;
padding-bottom: 24px;
}
.el-dialog__header{
text-align: center;
.el-dialog__title{
font-size: 16px;
}
}
.el-dialog__footer{
padding: 0px;
padding-bottom: 24px;
......
......@@ -122,7 +122,7 @@ export default {
margin-right: 22px;
font-weight: bold;
font-size: 20px;
color: #0081FF;
color: #232323;
padding: 24px 16px 0 16px;
span{
font-size: 16px;
......@@ -132,7 +132,7 @@ export default {
padding: 14px 16px 10px 16px;
justify-content: space-between;
font-size: 14px;
color: #416587;
color: #232323;
div{
flex-shrink: 0;
}
......
......@@ -4,6 +4,7 @@
<el-tabs v-model="activeName" @tab-click="handleClick" class="tabpane selfTab">
<el-tab-pane label="股东" name="first"></el-tab-pane>
<el-tab-pane label="对外投资" name="second"></el-tab-pane>
<el-tab-pane label="分支机构" :disabled="affiliatesTotal<1" name="third"></el-tab-pane>
</el-tabs>
<div class="table-item">
<div class="rela-person" v-show="activeName=='first'">实际控制人:{{financial&&financial.actualController || '--'}}</div>
......@@ -34,13 +35,8 @@
<span>{{scope.row.businessStatus || '--'}}</span>
</template>
</el-table-column>
<template slot="empty">
<div style="padding: 30px 0">
<no-data />
</div>
</template>
</el-table>
<el-table :data="shipData" border style="width: 100%" v-show="activeName=='second'">
<el-table v-if="shipData.length>0" :data="shipData" border style="width: 100%" v-show="activeName=='second'">
<el-table-column label="序号" width="55" align="left" fixed>
<template slot-scope="scope">{{ shipParams.pageNum * shipParams.pageSize - shipParams.pageSize + scope.$index + 1 }}</template>
</el-table-column>
......@@ -63,20 +59,49 @@
<el-table-column prop="investStartDate" label="成立日期"></el-table-column>
<el-table-column prop="stockPercentage" label="股权占比"></el-table-column>
<el-table-column prop="shouldCapi" label="认缴出资额(万元)"></el-table-column>
<template slot="empty">
<div style="padding: 30px 0">
<no-data />
</el-table>
<no-data v-if="activeName=='second'&&shipData.length<1"/>
<el-table :data="affiliatesData" border style="width: 100%" v-show="activeName=='third'">
<el-table-column label="序号" width="55" align="left" >
<template slot-scope="scope">{{ affiliatesParams.pageNum * affiliatesParams.pageSize - affiliatesParams.pageSize + scope.$index + 1 }}</template>
</el-table-column>
<el-table-column min-width="140" label="被投资企业名称">
<template slot-scope="scope">
<router-link :to="scope.row.uipId?`/enterprise/${encodeStr(scope.row.id)}`:`/company/${encodeStr(scope.row.id)}`" tag="a" class="a-link" v-if="scope.row.id&&scope.row.name" v-html="scope.row.name"></router-link>
<div v-else v-html="scope.row.name || '--'"></div>
<div class="tags" v-if="scope.row.status || scope.row.biddingCount|| scope.row.landInfoCount|| scope.row.proposedProjectCount">
<span class="tag" :class="labelArr.includes(scope.row.status)?'style2':'style1'" v-if="scope.row.status">{{scope.row.status}}</span>
<span class="tag style1" v-if="scope.row.proposedProjectCount">拟建{{scope.row.proposedProjectCount}}</span>
<span class="tag style1" v-if="scope.row.landInfoCount">土地{{scope.row.landInfoCount}}</span>
<span class="tag style1" v-if="scope.row.biddingCount">招标{{scope.row.biddingCount}}</span>
</div>
</template>
</el-table-column>
<el-table-column prop="operName" label="负责人"></el-table-column>
<el-table-column label="地区">
<template slot-scope="scope">
{{scope.row.provinceName}}
<template v-if="scope.row.cityName">
-
</template>
{{scope.row.cityName}}
<template v-if="scope.row.districtName">
-
</template>
{{scope.row.districtName}}
</template>
</el-table-column>
<el-table-column prop="startDate" label="成立日期"></el-table-column>
</el-table>
<div class="rela-more" v-show="activeName=='second'&& shipTotal>shipParams.pageSize"><span class="a-link" @click="handlePath">查看更多数据 ></span></div>
<div class="rela-more" v-show="activeName=='third'&& affiliatesTotal>affiliatesParams.pageSize"><span class="a-link" @click="handlePath1">查看更多数据 ></span></div>
</div>
</div>
</template>
<script>
import {encodeStr, changePath} from "@/assets/js/common"
import {bestStockPage, investment} from '@/api/detail/party-a/overview'
import {bestStockPage, investment,affiliates} from '@/api/detail/party-a/overview'
import NoData from '../../component/noData'
export default {
name: 'Relationship',
......@@ -103,12 +128,20 @@ export default {
pageSize: 5
},
shipTotal: 0,
affiliatesData:[],
affiliatesParams: {
cid: this.companyId,
pageNum: 1,
pageSize: 5
},
affiliatesTotal: 0,
labelArr:['失信联合惩戒企业','严重行政处罚','司法纠纷','注销', '注销企业']
}
},
created() {
this.handleQuery()
this.handleInvest()
this.getAffiliatesData()
},
mounted() {
},
......@@ -136,10 +169,20 @@ export default {
this.shipTotal = res.total
}
},
async getAffiliatesData(){
let res = await affiliates(this.affiliatesParams)
if(res.code==200){
this.affiliatesData = res.rows
this.affiliatesTotal = res.total
}
},
handleClick(){
},
handlePath(){
changePath(this, 'overseas')
},
handlePath1(){
changePath(this, 'branch')
}
}
}
......
<template>
<div class="app-container clue-container">
<div class="common-title">风险概览</div>
<div class="flex-box clue-box">
<div class="flex-box clue-box" v-if="viewData[0].value>0">
<div class="clue-echarts"><div id="echartsRisk" style="width: 100%;height:300px; margin: 0 auto;"></div></div>
<div class="table-item">
<el-table
......@@ -28,14 +28,10 @@
<span>{{ scope.row.bl }}</span>
</template>
</el-table-column>
<template slot="empty">
<div style="padding: 30px 0">
<no-data />
</div>
</template>
</el-table>
</div>
</div>
<no-data v-else/>
</div>
</template>
......@@ -123,7 +119,7 @@ export default {
tz:'',
bl:''
},
]
],
}
},
created() {
......@@ -145,7 +141,11 @@ export default {
this.viewData.sort((a, b) => {
return a.value < b.value ? 1 : -1;
})
this.getDT()
this.$nextTick(()=>{
if(this.viewData[0].value>0){
this.getDT();
}
})
},
getDT(){
let myChart = echarts.init(document.getElementById("echartsRisk"))
......@@ -172,6 +172,8 @@ export default {
bottom: 20,
data: this.viewData,
pageButtonPosition: 'end',
itemWidth:12,
itemHeight:8,
},
color: ['#8A82F3','#5B9CF7','#43BBE0','#8ECF95','#FFDC6B', '#FE9C77', '#E8649B', '#8A82F3'],
series: [
......
......@@ -3,6 +3,7 @@
<div class="common-title">高管</div>
<div class="table-item">
<el-table
v-if="tableData.length>0"
:data="tableData"
border
style="width: 100%"
......@@ -26,12 +27,8 @@
<el-table-column
prop="userJobs"
label="职务"></el-table-column>
<template slot="empty">
<div style="padding: 30px 0">
<no-data />
</div>
</template>
</el-table>
<no-data v-else/>
</div>
</div>
</template>
......
<template>
<div class="flex-box app-container part-container">
<div class="tender-list">
<div class="tender-list" ref="zbggScroll" @scroll="scrollbottom()">
<div class="common-title">招标公告</div>
<template v-if="zbggList.length>0">
<div class="tender-item" v-for="(item, index) in zbggList" :key="index">
<div class="flex-box tender-title"><div class="text-cl1" :title="item.projectName"><router-link :to="'/radar/Notice/details/'+item.bid" tag="a" class="a-link">{{item.projectName}}</router-link></div><span :class="item.projectCategory=='项目动态'?'style2':item.tag=='招投标'?'style4':'style1'" v-if="item.projectCategory">{{item.projectCategory}}</span></div>
<div class="flex-box tender-title"><div class="text-cl2" :title="item.projectName"><router-link :to="'/radar/Notice/details/'+item.bid" tag="a" class="a-link">{{item.projectName}}</router-link></div><span :class="item.projectCategory=='项目动态'?'style2':item.tag=='招投标'?'style4':'style1'" v-if="item.projectCategory">{{item.projectCategory}}</span></div>
<span class="tender-time"><span @click="handleUrl(item.url)" style="cursor: pointer;">{{item.dataSource}}</span> {{item.issueTime}}</span>
</div>
</template>
......@@ -12,11 +12,11 @@
<no-data />
</div>
</div>
<div class="tender-list">
<div class="tender-list" ref="trendScroll" @scroll="scrollbottom(true)">
<div class="common-title">企业动态</div>
<template v-if="trendList.length>0">
<div class="tender-item" v-for="(item, index) in trendList" :key="index">
<div class="flex-box tender-title"><div class="text-cl1" :title="tendTitle(item.details)">{{tendTitle(item.details)}}</div><span :class="item.parentDimension=='新增分支机构'?'style2':item.parentDimension=='新增施工工法'?'style3':'style1'">{{item.parentDimension}}</span></div>
<div class="flex-box tender-title"><div class="text-cl2" :title="tendTitle(item.details)">{{tendTitle(item.details)}}</div><span :class="item.parentDimension=='新增分支机构'?'style2':item.parentDimension=='新增施工工法'?'style3':'style1'">{{item.parentDimension}}</span></div>
<span class="tender-time">{{item.createTime}}</span>
</div>
</template>
......@@ -42,17 +42,20 @@ export default {
cid: this.companyId,
sort: 3,
pageNum: 1,
pageSize: 5
pageSize: 6
},
//招标公告数据
zbggList:[],
zbggTotal:0,
trendParams: {
companyId: this.companyId,
pageNum: 1,
pageSize: 5
pageSize: 6
},
//企业动态数据
trendList:[]
trendList:[],
trendTotal:0,
}
},
computed: {
......@@ -83,17 +86,54 @@ export default {
dynamicPage(this.trendParams)
])
if(notice.code==200){
this.zbggList = notice.rows
this.zbggList = notice.rows;
this.zbggTotal = notice.total;
}
if(namic.code==200){
this.trendList = namic.rows
this.trendList = namic.rows;
this.trendTotal = namic.total;
}
},
handleUrl(url){
if(url){
window.open(url, "_blank")
}
},
async getBidNotice(){
let notice = await bidNoticePage(this.zbggParams)
if(notice.code==200){
this.zbggTotal = notice.total;
this.zbggList = this.zbggList.concat(notice.rows)
}
},
async getDynamic(){
let dynamic = await dynamicPage(this.trendParams)
if(dynamic.code==200){
this.trendTotal = dynamic.total;
this.trendList = this.trendList.concat(dynamic.rows)
}
},
scrollbottom(type){
let scrllEl = type ? this.$refs.trendScroll : this.$refs.zbggScroll
let scrollHeight = scrllEl.scrollHeight
let clientHeight = scrllEl.clientHeight
let scrollTop = scrllEl.scrollTop
if(scrollHeight - (scrollTop+clientHeight) <= 1 ){
if(type){
if(this.trendParams.pageNum*this.trendParams.pageSize>=this.trendTotal){
return
}
this.trendParams.pageNum+=1;
this.getDynamic()
}else{
if(this.zbggParams.pageNum*this.zbggParams.pageSize>=this.zbggTotal){
return
}
this.zbggParams.pageNum+=1;
this.getBidNotice()
}
}
},
}
}
</script>
......@@ -108,8 +148,9 @@ export default {
width: calc(50% - 8px);
padding: 24px 16px;
background: #FFFFFF;
overflow: hidden;
overflow-y:scroll ;
border-radius: 4px;
height: 512px;
.common-title{
margin-bottom: 10px;
}
......
......@@ -10,6 +10,7 @@
<tables
:tableLoading="tableLoading"
:tableData="tableData"
:tableDataTotal="tableDataTotal"
:forData="forData"
:isIndex="false"
:queryParams="queryParams"
......
......@@ -133,7 +133,7 @@ export default {
border-radius: 4px;
.tab-header{
img{
margin-bottom: -3px;
margin-bottom: 2px;
width: 14px;
height: 14px;
cursor: pointer;
......
......@@ -4,6 +4,7 @@
<div class="view-content"><Operations :companyId="companyId" :financial="financial" /></div><!-- 公司经营 -->
<div class="view-content"><Bidding :companyId="companyId" /></div><!--招标偏好、业务往来-->
<div class="view-content"><Busclue :companyId="companyId" :statistic="statistic" /></div><!--商机线索-->
<div class="view-content"><Finance :companyId="companyId" /></div><!--财务数据-->
<div class="view-content"><Relationship :companyId="companyId" :financial="financial" /></div><!--关系企业-->
<div class="view-content"><Senior :companyId="companyId" /></div><!--高管-->
<div class="view-content"><Risk :companyId="companyId" :statistic="statistic" /></div><!--风险概览-->
......@@ -18,6 +19,7 @@ import Infoheader from "./component/infoheader"
import Operations from "./component/operations"
import Bidding from "./component/bidding"
import Busclue from './component/busclue'
import Finance from './component/finance'
import Relationship from './component/relationship'
import Senior from './component/senior'
import Risk from './component/risk'
......@@ -33,6 +35,7 @@ export default {
Relationship,
Senior,
Risk,
Finance,
Tender
},
data() {
......
......@@ -16,8 +16,8 @@ export default {
loading: false, // 是否加载完成-当前页控制
iframeTimer: '', // 是否加载中定时器-当前页控制
iframeHight: window.innerHeight, // iframe高度-当前页控制
navHeight: 68, // iframe以为的高度px
src: '',
navigation: {isFixed: true, fixedHeight: 56, totalHeight: 68}, // iframe之外页面顶部对象,ifFixed:是否浮动;fixedHeight:浮动对象高度;totalHeight:顶部整体高度
src: '', //iframe嵌套页面地址
domain: 'https://pre-plug.jiansheku.com',
// domain: 'http://192.168.60.30:3300',
ak: 'aec7b3ff2y2q8x6t49a7e2c463ce21912' // 需要携带的sdkId
......@@ -27,8 +27,16 @@ export default {
if (this.$route.params.id) { // 获取companyId
this.loading = true
if(this.$route.name=='Company'){ //企业详情
if(this.$route.query.html){
if(this.$route.query.type){
this.src = `${this.domain}/enterprise/${this.$route.params.id}/${this.$route.query.html}?flag=true&type=${this.$route.query.type}&ak=${this.ak}`
}else{
this.src = `${this.domain}/enterprise/${this.$route.params.id}/${this.$route.query.html}?ak=${this.ak}`
}
}else{
this.src = `${this.domain}/enterprise/${this.$route.params.id}?ak=${this.ak}`
}
}
if(this.$route.name=='Personnel'){ //人员详情
this.src = `${this.domain}/personnel/${this.$route.params.id}.html?ak=${this.ak}`
}
......@@ -36,11 +44,11 @@ export default {
},
mounted() {
this.iframeLoading() // 判断iframe页面是否加载完成-当前页控制
steerScroll('companyIframe', this.navHeight, true) // 监听滚动(iframe的id、页面排除iframe后页面剩下高度[例:80]、增加监听[不传就是移除监听]、父级id[不带默认就是铺满整个页面]])
steerScroll('companyIframe', this.navigation, true) // 监听滚动(iframe的id、页面排除iframe后页面剩下顶部高度[例:80]、增加监听[不传就是移除监听]、父级id[不带默认就是铺满整个页面]])
},
beforeDestroy() {
clearInterval(this.iframeTimer) // -当前页控制
steerScroll('companyIframe', this.navHeight) // 销毁滚动
steerScroll('companyIframe', this.navigation) // 销毁滚动
},
methods: {
//判断iframe页面是否加载完成-当前页控制
......
......@@ -4,7 +4,7 @@
<div class="content_item">
<div class="content_right item_ckquery_list">
<el-input class="ename_input" placeholder="请输入企业名称关键字" v-model="keys" >
<div slot="append" class="btn-search" @click="search">搜索</div>
<div slot="append" class="btn-search" @click="search()">搜索</div>
</el-input>
</div>
......@@ -143,7 +143,7 @@
<div class="item-jf-text">建议调整关键词或筛选条件,重新搜索!</div>
</div>
<div class=" table-item-jf" v-if="tableData.length>0">
<el-table :data="tableData" :header-cell-style="{ background:'#f0f3fa',color: 'rgba(35,35,35,0.8)'}" class="table-item1" element-loading-text="Loading" border highlight-current-row>
<el-table :data="tableData" v-loading="loading" :header-cell-style="{ background:'#f0f3fa',color: 'rgba(35,35,35,0.8)'}" element-loading-text="Loading" class="table-item1 fixed-table" border highlight-current-row>
<el-table-column type="index" label="序号" fixed width="60">
<template slot-scope="scope">
<span>{{(pageNum - 1) *20 + scope.$index + 1}}</span>
......@@ -160,7 +160,7 @@
<p v-else class="renling-img-false">
</p>
<span v-if="scope.row.claimStatus" class="renling-hui">
<span v-if="scope.row.claimStatus" @click="cancelClaim(scope.row.companyName)" class="renling-hui">
已认领
</span>
<span v-else class="renling-hei">
......@@ -288,7 +288,7 @@
{{scope.row.otherReceivable||"--"}}
</template>
</el-table-column>
<el-table-column label="公益性&准公益性主营占比(%)" width="188" >
<el-table-column label="公益性&准公益性主营占比(%)" width="188" >
<template slot-scope="scope">
{{scope.row.econData_001||"--"}}
</template>
......@@ -313,7 +313,7 @@
{{scope.row.belongNetProfit||"--"}}
</template>
</el-table-column>
<el-table-column label="净资产收益率(%)" width="136" >
<el-table-column label="净资产收益率(%)" width="136" >
<template slot-scope="scope">
{{scope.row.roe||"--"}}
</template>
......@@ -343,27 +343,27 @@
{{scope.row.uipInterestBearingDebt||"--"}}
</template>
</el-table-column>
<el-table-column label="有息债务/总负债(%)" width="134" >
<el-table-column label="有息债务/总负债(%)" width="134" >
<template slot-scope="scope">
{{scope.row.econData_002||"--"}}
</template>
</el-table-column>
<el-table-column label="综合融资成本(%)" width="116" >
<el-table-column label="综合融资成本(%)" width="116" >
<template slot-scope="scope">
{{scope.row.ofcb||"--"}}
</template>
</el-table-column>
<el-table-column label="现金比率(%)" width="92" >
<el-table-column label="现金比率(%)" width="92" >
<template slot-scope="scope">
{{scope.row.cashRatio||"--"}}
</template>
</el-table-column>
<el-table-column label="现金流量比率(%)" width="116" >
<el-table-column label="现金流量比率(%)" width="116" >
<template slot-scope="scope">
{{scope.row.cashFlowRatio||"--"}}
</template>
</el-table-column>
<el-table-column label="现金到期债务比(%)" width="132" >
<el-table-column label="现金到期债务比(%)" width="132" >
<template slot-scope="scope">
{{scope.row.cashDebtRatio||"--"}}
</template>
......@@ -373,7 +373,7 @@
{{scope.row.creditBalance||"--"}}
</template>
</el-table-column>
<el-table-column label="授信余额/全部债务(%)" width="146" >
<el-table-column label="授信余额/全部债务(%)" width="146" >
<template slot-scope="scope">
{{scope.row.econData_003||"--"}}
</template>
......@@ -383,17 +383,17 @@
{{scope.row.ebitdaIcr||"--"}}
</template>
</el-table-column>
<el-table-column label="私募债余额占比(%)" width="128" >
<el-table-column label="私募债余额占比(%)" width="128" >
<template slot-scope="scope">
{{scope.row.ppnBalanceProp||"--"}}
</template>
</el-table-column>
<el-table-column label="一年内到期债权占比(%)" width="152" >
<el-table-column label="一年内到期债权占比(%)" width="152" >
<template slot-scope="scope">
{{scope.row.econData_004||"--"}}
</template>
</el-table-column>
<el-table-column label="债券余额/有息债务(%)" width="152" >
<el-table-column label="债券余额/有息债务(%)" width="152" >
<template slot-scope="scope">
{{scope.row.econData_005||"--"}}
</template>
......@@ -403,7 +403,7 @@
{{scope.row.loan||"--"}}
</template>
</el-table-column>
<el-table-column label="借款/有息债务(%)" width="122" >
<el-table-column label="借款/有息债务(%)" width="122" >
<template slot-scope="scope">
{{scope.row.econData_006||"--"}}
</template>
......@@ -413,7 +413,7 @@
{{scope.row.nonStandardBalance||"--"}}
</template>
</el-table-column>
<el-table-column label="非标余额/有息债务(%)" width="152" >
<el-table-column label="非标余额/有息债务(%)" width="152" >
<template slot-scope="scope">
{{scope.row.nonStandardRatio||"--"}}
</template>
......@@ -423,7 +423,7 @@
{{scope.row.guaranteeAmount||"--"}}
</template>
</el-table-column>
<el-table-column label="对外担保比例(%)" width="116" >
<el-table-column label="对外担保比例(%)" width="116" >
<template slot-scope="scope">
{{scope.row.guaranteeRatio||"--"}}
</template>
......@@ -463,6 +463,21 @@
<span class="dialog-footer-btn2" @click="search(pageNum, pageSize)">稍后</span>
</div>
</el-dialog>
<el-dialog
title="取消认领"
:visible.sync="dialogVisible1"
:modal="false"
custom-class='dialog-renlin'
:show-close="false"
width="344px">
<span>是否取消认领客户?客户信息将放入“历史客户”。</span>
<div slot="footer" class="dialog-footer">
<span class="dialog-footer-btn1" type="primary" @click="confirm()" >
确认
</span>
<span class="dialog-footer-btn2" @click="dialogVisible1 = false">关闭</span>
</div>
</el-dialog>
</div>
</template>
......@@ -484,7 +499,7 @@ export default {
value: "id",
},
loading:false,
pageSize: 20,
jskBidQueryDto: {
......@@ -527,8 +542,8 @@ export default {
},
{
key: "3",
value: "拟建项目从多少",
key: "5",
value: "招标数量从多到少",
status: false,
},
......@@ -541,9 +556,10 @@ export default {
],
companyId:'',
companyName:'',
customerId:'',
dialogVisible: false,
dialogVisible1: false,
tableData:[],
total:0,
pageNum:1,
......@@ -598,7 +614,6 @@ export default {
});
},
mounted() {
this.init();
},
methods: {
......@@ -802,7 +817,6 @@ export default {
creditCode:info.creditCode,
}
api.claim(params).then(res1=>{
// console.log(res)
if (res1.code==200) {
this.dialogVisible=true;
this.customerId=res1.data.customerId;
......@@ -815,6 +829,20 @@ export default {
});
},
cancelClaim(companyName){
this.dialogVisible1 = true;
this.companyName = companyName;
},
confirm(){
api.cancelClaim(this.companyName).then(res=>{
if(res.code==200){
this.dialogVisible1 = false;
this.search();
}else{
this.$message.error(res.msg)
}
})
},
claimopen(companyId,customerId){
this.$router.push({
path: '/enterprise/'+encodeStr(companyId),
......@@ -824,6 +852,8 @@ export default {
} ,
})
this.dialogVisible=false;
this.search();
},
search(pageNum, pageSize,exportFlag) {
this.dialogVisible=false;
......@@ -888,7 +918,9 @@ export default {
}else{
delete params.equityRelationship
}
this.loading = true;
api.uipSerach(params).then(res=>{
this.loading = false;
// console.log(res)
if (res.code==200) {
this.tableData=res.rows;
......@@ -896,7 +928,7 @@ export default {
}
}).catch(error=>{
this.loading = false;
});
},
......@@ -1153,6 +1185,9 @@ export default {
::v-deep .el-table--border .el-table__cell{
border-right:1px solid #E6EAF1;
}
::v-deep.el-table__fixed::before{
height: 0;
}
.renling{
display: flex;
align-items: center;
......@@ -1211,6 +1246,25 @@ export default {
color: #232323;
}
}
.fixed-table{
overflow:initial;
::v-deep .el-table__header-wrapper{
position: sticky;
top:56px;
z-index: 9;
}
::v-deep .el-table__fixed-header-wrapper{
position: sticky;
z-index: 9;
top: 56px;
}
::v-deep .el-table__fixed{
overflow-x: clip;
overflow-y: clip;
}
}
.table-item-jf1{
border-top:1px solid #EFEFEF;
}
......
......@@ -5,7 +5,7 @@
<div class="content_item content_item_padding0">
<div class="content_right item_ckquery_list">
<el-input class="ename_input" placeholder="请输入关键字,如企业名称、统一社会信用代码等" v-model="ename" @input="projectNamebtn('ename',ename,'关键字:')">
<div slot="append" class="btn-search" @click="search">搜索</div>
<div slot="append" class="btn-search" @click="search()">搜索</div>
</el-input>
<!-- <template v-if="ename">
<span v-for=" (item,k) in enameQueryTypeList" :key="k" style="margin-right: 24px;">
......@@ -99,7 +99,7 @@
<template v-else>
<el-popover placement="top-start" width="200" trigger="hover">
<div class="select-popper-title">
请先选择<span class="colorhover">进省备案</span>,在选择本省与进省企业!
请先选择<span class="colorhover">进省备案</span>,再选择本省与进省企业!
</div>
<div class="" slot="reference">
......@@ -512,49 +512,48 @@
</template>
<template v-if="item.recentlyCount!=null">
<span class="right-title-grey">中标业绩:</span>
<router-link :to="toEnterprise(item.jskEid,'/performance')" target="_blank" >
<router-link :to="toEnterprise(item.jskEid,'performance')" target="_blank" >
<span class="right-title-blue" v-html="item.recentlyCount"> </span>
</router-link>
</template>
<template v-if="item.skyCount!=null">
<span class="right-title-grey">四库业绩:</span>
<router-link :to="toEnterprise(item.jskEid,'/performance',1)" target="_blank" >
<router-link :to="toEnterprise(item.jskEid,'performance',2)" target="_blank" >
<span class="right-title-blue" v-html="item.skyCount"> </span>
</router-link>
</template>
<template v-if="item.registeredPersonnelCount!=null">
<span class="right-title-grey">注册人员:</span>
<router-link :to="toEnterprise(item.jskEid,'/personnel',1)" target="_blank" >
<router-link :to="toEnterprise(item.jskEid,'personnel',2)" target="_blank" >
<span class="right-title-blue" v-html="item.registeredPersonnelCount"> </span>
</router-link>
</template>
<template v-if="item.threePersonnelCount!=null">
<span class="right-title-grey">三类人员:</span>
<router-link :to="toEnterprise(item.jskEid,'/personnel',4)" target="_blank" >
<router-link :to="toEnterprise(item.jskEid,'personnel',5)" target="_blank" >
<span class="right-title-blue" v-html="item.threePersonnelCount"> </span>
</router-link>
</template>
<template v-if="item.jskBidCount>0">
<span class="right-title-grey">招标公告:</span>
<router-link :to="toEnterprise(item.jskEid,'/business',6)" target="_blank" >
<router-link :to="toEnterprise(item.jskEid,'business',5)" target="_blank" >
<span class="right-title-blue" v-html="item.jskBidCount"> </span>
</router-link>
</template>
<template v-if="item.customerCount>0">
<span class="right-title-grey">客户:</span>
<router-link :to="toEnterprise(item.jskEid,'/business',1)" target="_blank" >
<router-link :to="toEnterprise(item.jskEid,'business',1)" target="_blank" >
<span class="right-title-blue" v-html="item.customerCount"> </span>
</router-link>
</template>
<template v-if="item.supplierCount>0">
<span class="right-title-grey">供应商:</span>
<router-link :to="toEnterprise(item.jskEid,'/business',2)" target="_blank" >
<router-link :to="toEnterprise(item.jskEid,'business',2)" target="_blank" >
<span class="right-title-blue" v-html="item.supplierCount"> </span>
</router-link>
</template>
</p>
<p class="card-right-title" v-if="item.formerName!=null&&(item.formerName.indexOf('color')!=-1||item.name.indexOf('color')!=-1)" style="padding: 10px 0px 0px 0px;">
<
<span class="right-title-grey">曾用名:</span>
<span class="right-title-grey" style="width: 984px;" v-html="item.formerName"></span>
</p>
......@@ -2627,6 +2626,7 @@
this.fieldOptions[i].status = false;
}
this.fieldText = this.fieldOptions[index].value;
this.orderText = this.fieldOptions[index].order;
this.fieldOptions[index].status = true;
this.search();
},
......@@ -2764,7 +2764,7 @@
},
toEnterprise(id, html,type) {
return '/company/' + encodeStr(id) + html + '/'+(type?'?flag=true&type='+type:'');
return '/company/' + encodeStr(id) + '/'+(html?'?html='+html:'')+(type?'&flag=true&type='+type:'');
},
toEnterpriseDetail(id) {
......
......@@ -7,6 +7,7 @@
<div style="position:relative" v-for="(itme,i) in personnelList"
:class="itme.status==true?'active':'' " :key='i' @click="personnelListbtn(i)">
<p>{{itme.value}}</p>
<img v-if="i==1" style="position: absolute;top:-10px;width:80px;height:16px;" src="@/assets/images/owner/tip.png" alt="">
</div>
</div>
......@@ -39,15 +40,16 @@
personnelList: [{
key: 'Owner',
status: true,
value: '查业主单位',
value: '查城投平台',
},
{
key: 'SearchEnterprise',
status: false,
value: '查建筑企业',
value: '查企业',
},
],
personnelHerf:'Owner'
}
},
......
......@@ -111,7 +111,7 @@
<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: 288px;"></div>
<div id="pm-echarts" style="height: 400px;"></div>
</div>
</div>
</div>
......@@ -279,6 +279,20 @@
<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">
......@@ -314,6 +328,24 @@
<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>
......@@ -429,6 +461,24 @@ export default {
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:[
{
......@@ -974,6 +1024,7 @@ export default {
margin: 0;
}
.home {
padding-bottom:24px;
::v-deep .el-row{
.el-col:nth-child(1){
padding-left: 0 !important;
......@@ -1089,18 +1140,18 @@ export default {
}
.content-wrap{
margin-bottom: 12px;
height: 460px;
height: 587px;
.select-popper{
margin-right:0;
}
.record{
height: 460px;
height: 587px;
background: #FFFFFF;
border-radius: 4px;
padding: 16px;
position: relative;
.list{
height: 375px;
height: 510px;
overflow: hidden;
.item{
border-bottom: 1px solid #EEEEEE;
......@@ -1131,27 +1182,28 @@ export default {
text-align: center;
color: #0081FF;
font-size: 14px;
margin-top: 4px;
cursor: pointer;
position: absolute;
bottom:16px;
left: 50%;
margin-left: -48px;
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: 460px;
height: 587px;
background: #FFFFFF;
border-radius: 4px;
padding: 16px;
.main{
background: url("../assets/images/index/yjpm_bg.png");
background-size: 100% 100%;
height: 399px;
height: 525px;
margin-top: 10px;
}
.amount{
padding: 16px 24px;
padding: 16px 12px;
p{
display: flex;
justify-content: space-between;
......@@ -1175,6 +1227,8 @@ export default {
}
.progress1{
height: 10px !important;
margin-bottom:6px;
margin-top:8px;
::v-deep .el-progress-bar__outer{
.el-progress-bar__inner{
background:#9AEAD3
......@@ -1303,6 +1357,7 @@ export default {
font-size: 14px;
span{
margin-right: 24px;
color:rgba(35, 35, 35, 0.8);
}
}
.btn{
......@@ -1380,7 +1435,7 @@ export default {
background: #FFFFFF;
border-radius: 4px;
padding: 16px;
height: 440px;
height: 617px;
overflow: hidden;
position: relative;
::v-deep .el-tabs__header{
......@@ -1388,7 +1443,7 @@ export default {
}
::v-deep .el-tabs__content{
overflow-y: auto;
height: 368px;
height: 567px;
}
::v-deep .el-timeline{
.el-timeline-item{
......@@ -1528,7 +1583,7 @@ export default {
}
}
.zbgg{
height: 470px;
height: 599px;
background: #FFFFFF;
border-radius: 4px;
padding: 16px;
......@@ -1570,7 +1625,7 @@ export default {
}
}
.zbhxr{
height: 382px;
height: 558px;
background: #FFFFFF;
border-radius: 4px;
padding: 16px;
......
......@@ -174,7 +174,7 @@ export default {
.left{
float: left;
width: 730px;
margin-right: 170px;
/*margin-right: 170px;*/
}
.logo{
width: 253px;
......
<template>
<div class="region">
<div class="region_left">
<div>
<span class="province">{{province}}</span>
<span class="icon">
<i class="el-icon-location"></i>切换
<el-cascader ref="address" class="cascader-region" popper-class='cascader-region-addd'
@change="addressListbtn" v-model="address" :options="addressList" :props="props" collapse-tags></el-cascader>
</span>
</div>
</div>
</div>
</template>
<script>
import { location } from '@/api/macro/macro'
import dataRegion from '@/assets/json/dataRegion'
export default {
name:'region',
props:['province','dataQuery'],
data(){
return {
props: {
value: 'id',
label: 'label',
checkStrictly: true
},
addressList: [],
address:'',
provinceId:[],
location:''
}
},
watch: {
province(newValue, oldValue){
this.location = newValue;
},
},
created(){
this.dataRegion()
this.location=this.province
},
methods:{
addressListbtn() {
let nodesObj = this.$refs.address.getCheckedNodes()[0];
this.location=nodesObj.pathLabels[nodesObj.pathLabels.length-1];
this.provinceId=nodesObj.path;
let data={}
data.province=this.location
data.provinceId=this.provinceId
data.provinces=nodesObj.pathLabels
this.$parent.addressListbtn(data)
localStorage.setItem('location', true)
},
//地区
async dataRegion() {
// await axios.post("https://files.jiansheku.com/file/json/common/dataRegion.json", {}, {
// headers: {
// 'Content-Type': 'application/json'
// }
// }).then(res => {
// if (res.data.code == 200) {
// console.log(res.data.data)
// }
// })
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;
},
}
}
</script>
<style lang="scss" scoped>
.region{
height: 48px;
background: #F8FBFF;
border-radius: 4px;
margin-bottom: 12px;
.region_left{
background: url("~@/assets/images/economies/img_bg.png") no-repeat;
background-size: 100%;
width: 603px;
height: 48px;
padding-left: 16px;
.province{
font-size: 20px;
cursor: pointer;
font-weight: 700;
color: #004F9C;
margin-right: 12px;
line-height: 48px;
height: 48px;
float: left;
}
.icon{
width: 24px;
color: #0081FF;
font-size: 12px;
display: inline-block;
height: 48px;
position: relative;
i{
margin-left: 4px;
font-size: 16px;
color:#0081FF;
padding-top: 7px;
}
}
.cascader-region {
position: absolute;
left: -50px;
top: 8px;
opacity: 0;
line-height: 22px;
width: 80px;
}
}
}
</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>
......@@ -16,8 +16,9 @@
<span class="flex-box" @click="handleMessage"><img src="@/assets/images/ability_excel.png">导出EXCEL</span>
</div>
</div>
<div class="table-item">
<div class="table-title">
<div class="table-item" ref="regionalStyle" id="regionalStyle">
<div class="table-title" :class="fixed == true ? 'fixed' : ''" :style="'width:' + StyWidth">
<!--<div class="table-title">-->
<span class="span-tit">指标</span>
<span class="span-tit">
<span class="address" v-if="value1Flag">{{addressValue1}}<i class="el-icon-circle-close" @click="handleDelete(1)"></i></span>
......@@ -102,6 +103,7 @@
<script>
import dataRegion from '@/assets/json/dataRegion'
import elementResizeDetectorMaker from "element-resize-detector"
import { regionalCompare,getYears,multipleCompare } from '@/api/macro/macro'
export default {
name: 'comparison',
......@@ -288,7 +290,9 @@ export default {
value4Flag:false,
value5Flag:false,
regionData:[],
compareList:[{},{},{},{},{}]
compareList:[{},{},{},{},{}],
fixed: false,
StyWidth:null
}
},
watch: {
......@@ -296,6 +300,18 @@ export default {
console.log(newValue)
}
},
mounted(){
window.addEventListener('scroll', this.handleScroll);
const _this = this, erd = elementResizeDetectorMaker(), partBox = document.getElementById("regionalStyle")
erd.listenTo(partBox, element => {
_this.$nextTick(() => {
this.StyWidth = partBox.offsetWidth + 'px';
})
})
},
destroyed () {
window.removeEventListener('scroll', this.handleScroll)
},
created() {
this.dataRegion();
// this.getData();
......@@ -313,9 +329,9 @@ export default {
if(this.provinceId.length >= 2){
item.areaId=this.provinceId[2]
}
if(this.dataQuery.id){
item.id=this.dataQuery.id
}
// if(this.dataQuery.id){
// item.id=this.dataQuery.id
// }
this.compareList.splice(0,1,item);
this.value1Flag=true
this.addressValue1=this.dataQuery.province.join('-')
......@@ -343,6 +359,14 @@ export default {
}
},
methods: {
handleScroll () {
let scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
if (scrollTop > 145) {
this.fixed = true
} else {
this.fixed = false
}
},
getData(params){
params.year=this.queryParams.year;
multipleCompare(params).then(res => {
......@@ -448,9 +472,9 @@ export default {
if(code.length >= 3){
item.areaId=code[2]
}
if(this.dataQuery.id){
item.id=this.dataQuery.id
}
// if(this.dataQuery.id){
// item.id=this.dataQuery.id
// }
this.compareList.splice(index-1,1,item);
let list=[];
......@@ -631,6 +655,7 @@ export default {
}
.table-item{
margin-top: 22px;
position: relative;
::v-deep .el-table{
.el-table__body{
width: 100% !important;
......@@ -641,9 +666,22 @@ export default {
/*}*/
/*}*/
}
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;
}
}
.table-title{
width: 100%;
/*width: 100%;*/
display: flex;
/*justify-content:space-around;*/
border: 1px solid #E6EAF1;
......@@ -677,5 +715,10 @@ export default {
}
}
}
.fixed{
position: fixed;
z-index: 999;
top: 56px;
}
}
</style>
......@@ -20,7 +20,7 @@
<div id="echarts" style="height: 400px"></div>
<p class="tips"> 注:数据均来源于统计公报、统计年鉴,实际披露中由于部分地区最新年度数据不全,导致年份间数据差距较大</p>
</div>
<div class="content-right">
<div class="content-right table-item">
<el-table
v-loading="tableLoading"
:data="tableData"
......@@ -35,7 +35,7 @@
</el-table-column>
<el-table-column label="产业类型" prop="projectType"></el-table-column>
<el-table-column :label="oneYear">
<el-table-column prop="money" label="金额(亿元)" sortable> </el-table-column>
<el-table-column prop="money" label="金额(亿元)" sortable></el-table-column>
<el-table-column prop="rate" label="占比(%)"> </el-table-column>
</el-table-column>
<el-table-column :label="twoYear">
......@@ -45,6 +45,12 @@
</el-table>
</div>
</div>
<!--<div class="content content-box" v-else>-->
<!--<div class="empty">-->
<!--<img class="img" src="@/assets/images/project/empty.png">-->
<!--<div class="p1">抱歉,暂无专项债项目数据</div>-->
<!--</div>-->
<!--</div>-->
</div>
</template>
......@@ -66,11 +72,13 @@ export default {
data:[],
oneYear:'',
twoYear:'',
state:false
}
},
watch: {
provinceId(newValue, oldValue){
this.getData()
this.getGroupCount()
}
},
created() {
......@@ -105,6 +113,7 @@ export default {
params.county=this.provinceId[2]
}
bidMoneyGroupByProjectType(params).then(res => {
if(res.data.length > 0){
let list=res.data[1].type
for (let i=0; i<res.data[0].type.length; i++){
for (let j=0; j<list.length; j++){
......@@ -114,7 +123,14 @@ export default {
}
}
}
for(let i=0; i<list.length; i++){
list[i].money=list[i].money ? Number(list[i].money).toFixed(2) : '-';
list[i].rate=list[i].rate ? Number(list[i].rate).toFixed(2) : '-';
list[i].lastMoney=list[i].lastMoney ? Number(list[i].lastMoney).toFixed(2) : '-';
list[i].lastRate=list[i].lastRate ? Number(list[i].lastRate).toFixed(2) : '-';
}
this.tableData=list.reverse()
}
})
},
getGroupCount(){
......@@ -128,7 +144,17 @@ export default {
startTime=this.queryParams.year+'-01-01';
endTime=this.queryParams.year+'-12-31';
}
bidGroupCountByProjectType({startDate:startTime,endDate:endTime}).then(res => {
let params={startDate:startTime,endDate:endTime}
if(this.provinceId.length >= 0){
params.province=this.provinceId[0]
}
if(this.provinceId.length >= 1){
params.city=this.provinceId[1]
}
if(this.provinceId.length >= 2){
params.county=this.provinceId[2]
}
bidGroupCountByProjectType(params).then(res => {
if(res.code === 200){
let list=[]
for(let i=0; i<res.data.length; i++){
......@@ -138,9 +164,9 @@ export default {
list.push(item);
}
this.data=list;
if(list.length > 0){
// if(list.length > 0){
this.initChart()
}
// }
}
})
},
......@@ -220,7 +246,7 @@ export default {
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr);
if (!isNaN(value)) {
return Number(Number(prev) + Number(curr)).toFixed(3)
return Number(Number(prev) + Number(curr)).toFixed(2)
} else {
return prev;
}
......@@ -277,6 +303,57 @@ export default {
z-index: 0;
top: 46px;
}
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;
}
.has-gutter{
tr{
th:nth-child(4){
border-right:0;
.cell{
padding-right: 24px !important;
}
}
td:nth-child(6){
border-right:0;
}
}
}
.el-table__cell.gutter{
background: #F5F7FA;
width: 16px !important;
border-top: 1px solid #dfe6ec;
}
}
}
.empty{
margin: 0 auto;
height: 550px;
text-align: center;
.img{
width: 108px;
height: 108px;
margin-bottom: 24px;
margin-top: 150px;
}
.p1{
color: #333333;
font-size: 16px;
}
.p2{
color: #999999;
font-size: 14px;
margin-top: 8px;
}
}
}
......
......@@ -6,7 +6,7 @@
<span class="common-title">经济数据</span>
<el-form ref="queryForm" :model="queryParams" :inline="true" size="small">
<el-form-item prop="year">
<el-select v-model="queryParams.year" filterable class="form-content-width" placeholder="请选择" @change="getData">
<el-select v-model="queryParams.year" filterable class="form-content-width" placeholder="请选择" @change="changeSelect">
<el-option v-for="(item, index) in yearOptions" :key="index" :label="item.year" :value="item.year" />
</el-select>
</el-form-item>
......@@ -25,7 +25,7 @@
@sort-change="sortChange"
:default-sort = "{prop: 'gdp', order: 'descending'}"
>
<el-table-column prop="province" label="下辖区" width="170" :formatter="formatStatus" fixed>
<el-table-column prop="province" label="下辖区" width="100" :formatter="formatStatus" fixed>
<!--<template slot-scope="scope">-->
<!--{{ scope.row.province}}{{scope.row.city ? '-': ''}}{{ scope.row.city}}{{scope.row.area ? '-': ''}}{{ scope.row.area}}-->
<!--</template>-->
......@@ -102,14 +102,13 @@ export default {
if(this.queryParams.order){
params.order=this.queryParams.order
}
if(this.provinceId.length >= 0){
if(this.provinceId.length > 0){
params.provinceIds=[this.provinceId[0]]
}
if(this.provinceId.length >= 1){
if(this.provinceId.length > 1){
params.cityId=[this.provinceId[1]]
}
if(this.provinceId.length >= 2){
if(this.provinceId.length > 2){
params.areaId=[this.provinceId[2]]
}
// params.provinceIds=[this.dataQuery.provinceId]
......@@ -118,6 +117,10 @@ export default {
this.tableDataTotal = res.data.totalCount
})
},
changeSelect(){
this.pageIndex=1
this.getData()
},
// 重置页数
handleSizeChange(val) {
this.pageIndex = 1
......@@ -199,6 +202,36 @@ export default {
}
.table-item{
margin-top: 22px;
::v-deep .el-table{
overflow:visible;
.el-table__header-wrapper{
position: sticky;
top:56px;
z-index: 9;
}
.el-table__fixed-header-wrapper{
position: sticky;
z-index: 9;
top: 56px;
}
.el-table__fixed{
overflow-x: clip;
overflow-y: clip;
}
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;
}
}
}
}
......
......@@ -7,68 +7,68 @@
<div class="item-title"><i style="background: #4E8EFF;"></i>{{recentlyYear.year}}年GDP</div>
<div class="item-count">
<span>{{recentlyYear.gdp}}</span>亿
<img v-if="recentlyYear.gdpGrowth > 0" src="@/assets/images/economies/icon_up.png">
<img v-if="Number(recentlyYear.gdpCompare) > 0" src="@/assets/images/economies/icon_up.png">
<img v-else src="@/assets/images/economies/icon_down.png">
</div>
<div id="echartsGDP" style="height: 75px;"></div>
<div class="item-text up" v-if="recentlyYear.gdpGrowth > 0">{{nextYearMap.year}}年上升<span>{{recentlyYear.gdpGrowth}}%</span></div>
<div class="item-text down" v-else>{{nextYearMap.year}}年下降<span>{{Number(recentlyYear.gdpGrowth).toString().substring(1)}}%</span></div>
<div class="item-text up" v-if="Number(recentlyYear.gdpCompare) > 0">{{nextYearMap.year}}年上升<span>{{recentlyYear.gdpCompare}}亿</span></div>
<div class="item-text down" v-else>{{nextYearMap.year}}年下降<span>{{Number(recentlyYear.gdpCompare).toString().substring(1)}}亿</span></div>
</div>
<div class="item">
<div class="item-title"><i style="background: #718AFF;"></i>{{recentlyYear.year}}年GDP增速</div>
<div class="item-count">
<span>{{recentlyYear.gdpGrowth}}</span>%
<img v-if="(recentlyYear.gdpGrowth-nextYearMap.gdpGrowth) > 0" src="@/assets/images/economies/icon_up.png">
<img v-if="Number(recentlyYear.gdpGrowthCompare) > 0" src="@/assets/images/economies/icon_up.png">
<img v-else src="@/assets/images/economies/icon_down.png">
</div>
<div id="echartsZS" style="height: 75px;"></div>
<div class="item-text up" v-if="(recentlyYear.gdpGrowth-nextYearMap.gdpGrowth) > 0">{{nextYearMap.year}}年上升<span>{{(recentlyYear.gdpGrowth-nextYearMap.gdpGrowth).toFixed(2).toString()}}%</span></div>
<div class="item-text down" v-else>{{nextYearMap.year}}年下降<span>{{(this.recentlyYear.gdpGrowth-this.nextYearMap.gdpGrowth).toFixed(2).toString().substring(1)}}%</span></div>
<div class="item-text up" v-if="Number(recentlyYear.gdpGrowthCompare) > 0">{{nextYearMap.year}}年上升<span>{{recentlyYear.gdpGrowthCompare}}%</span></div>
<div class="item-text down" v-else>{{nextYearMap.year}}年下降<span>{{Number(recentlyYear.gdpGrowthCompare).toString().substring(1)}}%</span></div>
</div>
<div class="item">
<div class="item-title"><i style="background: #3AD0D1;"></i>{{recentlyYear.year}}年人口</div>
<div class="item-count">
<span>{{recentlyYear.population}}</span>
<img v-if="recentlyYear.populationGrowthRate > 0" src="@/assets/images/economies/icon_up.png">
<img v-if="Number(recentlyYear.populationCompare) > 0" src="@/assets/images/economies/icon_up.png">
<img v-else src="@/assets/images/economies/icon_down.png">
</div>
<div id="echartsRK" style="height: 75px;"></div>
<div class="item-text up" v-if="recentlyYear.populationGrowthRate > 0">{{nextYearMap.year}}年上升<span>{{recentlyYear.populationGrowthRate}}%</span></div>
<div class="item-text down" v-else>{{nextYearMap.year}}年下降<span>{{recentlyYear.populationGrowthRate}}%</span></div>
<div class="item-text up" v-if="Number(recentlyYear.populationCompare) > 0">{{nextYearMap.year}}年上升<span>{{recentlyYear.populationCompare}}</span></div>
<div class="item-text down" v-else>{{nextYearMap.year}}年下降<span>{{Number(recentlyYear.populationCompare).toString().substring(1)}}</span></div>
</div>
<div class="item">
<div class="item-title"><i style="background: #FFBE5D;"></i>{{recentlyYear.year}}年一般公共预算收入</div>
<div class="item-count">
<span>{{recentlyYear.gbr}}</span>亿
<img v-if="recentlyYear.gbrGrowth > 0" src="@/assets/images/economies/icon_up.png">
<img v-if="Number(recentlyYear.gbrCompare) > 0" src="@/assets/images/economies/icon_up.png">
<img v-else src="@/assets/images/economies/icon_down.png">
</div>
<div id="echartsSR" style="height: 75px;"></div>
<div class="item-text up" v-if="recentlyYear.gbrGrowth > 0">{{nextYearMap.year}}年上升<span>{{recentlyYear.gbrGrowth}}%</span></div>
<div class="item-text down" v-else>{{nextYearMap.year}}年下降<span>{{Number(recentlyYear.gbrGrowth).toString().substring(1)}}%</span></div>
<div class="item-text up" v-if="Number(recentlyYear.gbrCompare) > 0">{{nextYearMap.year}}年上升<span>{{recentlyYear.gbrCompare}}亿</span></div>
<div class="item-text down" v-else>{{nextYearMap.year}}年下降<span>{{Number(recentlyYear.gbrCompare).toString().substring(1)}}亿</span></div>
</div>
<div class="item">
<div class="item-title"><i style="background: #FF8935;"></i>{{recentlyYear.year}}年地方政府债务余额</div>
<div class="item-count">
<span>{{recentlyYear.govDebtBalance}}</span>亿
<img v-if="recentlyYear.govDebtBalance > nextYearMap.govDebtBalance" src="@/assets/images/economies/icon_up.png">
<img v-if="Number(recentlyYear.govDebtBalanceCompare) > 0" src="@/assets/images/economies/icon_up.png">
<img v-else src="@/assets/images/economies/icon_down.png">
</div>
<div id="echartsYE" style="height: 75px;"></div>
<div class="item-text up" v-if="recentlyYear.govDebtBalance > nextYearMap.govDebtBalance">
{{nextYearMap.year}}年上升<span>{{((recentlyYear.govDebtBalance - nextYearMap.govDebtBalance)/nextYearMap.govDebtBalance*100).toFixed(2)}}%</span></div>
<div class="item-text down" v-else>{{nextYearMap.year}}年下降<span>{{((recentlyYear.govDebtBalance - nextYearMap.govDebtBalance)/nextYearMap.govDebtBalance*100).toFixed(2).toString().substring(1)}}%</span></div>
<div class="item-text up" v-if="Number(recentlyYear.govDebtBalanceCompare) > 0">
{{nextYearMap.year}}年上升<span>{{recentlyYear.govDebtBalanceCompare}}亿</span></div>
<div class="item-text down" v-else>{{nextYearMap.year}}年下降<span>{{Number(recentlyYear.govDebtBalanceCompare).toString().substring(1)}}亿</span></div>
</div>
</div>
</div>
<div class="content content2">
<div class="common-title">经济信息</div>
<div class="content-box">
<span><img src="@/assets/images/economies/icon_1.png">下属辖区 <label>{{recentlyYear.subordinateJurisdiction}}<i></i></label></span>
<span><img src="@/assets/images/economies/icon_2.png">城投平台 <label>{{recentlyYear.urbanInvestmentPlatform}}<i></i></label></span>
<span><img src="@/assets/images/economies/icon_3.png">城投平台授信余额 <label>{{recentlyYear.creditBalance}}<i>亿</i></label></span>
<span><img src="@/assets/images/economies/icon_4.png">城投平台营收账款 <label>{{recentlyYear.accountsReceivable}}<i>亿</i></label></span>
<span><img src="@/assets/images/economies/icon_5.png">城投平台有息债务 <label>{{recentlyYear.uipInterestBearingDebt}}<i>亿</i></label></span>
<span class="text" @click="childMethod(1)" style="cursor: pointer;"><img src="@/assets/images/economies/icon_1.png"><span>下属辖区</span> <label>{{recentlyYear.subordinateJurisdiction}}<i></i></label></span>
<span class="text" @click="childMethod(2)" style="cursor: pointer;"><img src="@/assets/images/economies/icon_2.png"><span>城投平台</span> <label>{{recentlyYear.urbanInvestmentPlatform}}<i></i></label></span>
<span class="text"><img src="@/assets/images/economies/icon_3.png"><span>城投平台授信余额</span> <label>{{recentlyYear.creditBalance}}<i>亿</i></label></span>
<span class="text"><img src="@/assets/images/economies/icon_4.png"><span>城投平台应收账款</span> <label>{{recentlyYear.accountsReceivable}}<i>亿</i></label></span>
<span class="text"><img src="@/assets/images/economies/icon_5.png"><span>城投平台有息债务</span> <label>{{recentlyYear.uipInterestBearingDebt}}<i>亿</i></label></span>
</div>
</div>
<div class="content content3">
......@@ -77,7 +77,7 @@
<span class="common-title">主要指标</span>
</div>
<div class="flex-box query-ability">
<span class="flex-box" @click="childMethod"><img src="@/assets/images/ability_vs.png">地区经济对比</span>
<span class="flex-box" @click="childMethod(4)"><img src="@/assets/images/ability_vs.png">地区经济对比</span>
<span class="flex-box" @click="handleMessage"><img src="@/assets/images/ability_excel.png">导出EXCEL</span>
</div>
</div>
......@@ -268,7 +268,7 @@ export default {
pageIndex: 1,
pageSize: 10,
tableDataTotal: 0,
labelData:[2021,2022],
labelData:[],
valData:[],
valData1:[],
valData2:[],
......@@ -279,8 +279,10 @@ export default {
}
},
created() {
this.getData()
let mydate=new Date();
this.labelData=[mydate.getFullYear()-2,mydate.getFullYear()-1]
this.$nextTick(()=>{
this.getData()
// console.log(this.dataQuery)
})
},
......@@ -298,11 +300,6 @@ export default {
// }
},
watch: {
dataQuery: {
handler(newValue, oldValue) {
},
deep: true
},
provinceId(newValue, oldValue){
this.getData()
}
......@@ -325,11 +322,11 @@ export default {
regional(params).then(res => {
this.recentlyYear=res.data[0].recentlyYear;
this.nextYearMap=res.data[0].nextYearMap;
this.valData=[this.nextYearMap.gdp,this.recentlyYear.gdp]
this.valData1=[this.nextYearMap.gdpGrowth,this.recentlyYear.gdpGrowth]
this.valData2=[this.nextYearMap.population,this.recentlyYear.population]
this.valData3=[this.nextYearMap.gbr,this.recentlyYear.gbr]
this.valData4=[this.nextYearMap.govDebtBalance,this.recentlyYear.govDebtBalance]
this.valData=[this.getMoneyNum(this.nextYearMap.gdp),this.getMoneyNum(this.recentlyYear.gdp)]
this.valData1=[this.getMoneyNum(this.nextYearMap.gdpGrowth),this.getMoneyNum(this.recentlyYear.gdpGrowth)]
this.valData2=[this.getMoneyNum(this.nextYearMap.population),this.getMoneyNum(this.recentlyYear.population)]
this.valData3=[this.getMoneyNum(this.nextYearMap.gbr),this.getMoneyNum(this.recentlyYear.gbr)]
this.valData4=[this.getMoneyNum(this.nextYearMap.govDebtBalance),this.getMoneyNum(this.recentlyYear.govDebtBalance)]
this.initChart()
this.initChart1()
this.initChart2()
......@@ -667,6 +664,12 @@ export default {
fontWeight: 'bold'
}
}
if(row.row.title === '指标'){
return {
background: '#F0F3FA',
color:'#4C4D4E',
}
}
},
handleMessage(){
this.$message({
......@@ -674,11 +677,34 @@ export default {
type: 'warning'
});
},
childMethod() {
childMethod(key) {
let data=this.dataQuery
console.log(this.dataQuery,"||||||||")
data.pId=this.dataQuery.provinceId
this.$parent.handleClick('four',data);
data.pId=this.provinceId;
this.dataQuery.provinceId=this.provinceId;
switch (key) {
case 1:
this.$parent.handleClick('second', data);
break;
case 2:
this.$router.push({
path: '/macro/urban',
query:{
provinceId:this.dataQuery.provinceId,
province:this.dataQuery.province,
}
})
break;
case 4:
this.$parent.handleClick('four', data);
break;
}
},
getMoneyNum(num){
if (!num) return 0;
num = num + ''
if (num.indexOf(',') != -1) return num.replace(/\,/g, '');
else return num;
}
}
}
......@@ -747,7 +773,7 @@ export default {
.content2{
.content-box{
margin-top: 18px;
span{
.text{
border-right: 1px solid #E4E4E4;
display: inline-block;
color: rgba(35,35,35,0.8);
......@@ -755,11 +781,15 @@ export default {
padding-left: 16px;
width: 20%;
line-height: 26px;
position: relative;
span{
padding-left: 24px;
}
img{
width: 16px;
height: 16px;
margin-right: 4px;
margin-bottom: -4px;
position: absolute;
top: 4px;
}
label{
font-weight: 700;
......@@ -787,11 +817,32 @@ export default {
}
.table-item{
margin-top: 22px;
/*::v-deep .el-table {*/
/*td.el-table__cell {*/
/*border-bottom: 0;*/
/*}*/
/*}*/
::v-deep .el-table{
overflow:visible;
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;
}
.el-table__body-wrapper{
overflow:visible;
}
.el-table__body{
tr:first-child{
position: sticky;
top:56px;
z-index: 9;
}
}
}
}
}
</style>
<template>
<div class="app-container">
<Region v-if="province" :province="province" :dataQuery="dataQuery" @addressListbtn="addressListbtn"></Region>
<div class="flex-box eco-header">
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="地区经济" name="first"></el-tab-pane>
......@@ -7,20 +8,20 @@
<el-tab-pane label="产业结构" name="third"></el-tab-pane>
<el-tab-pane label="地区经济对比" name="four"></el-tab-pane>
</el-tabs>
<div class="location">
<span><i class="el-icon-location"></i>{{province}}</span>
<el-cascader ref="address" class="cascader-region" popper-class='cascader-region-addd'
@change="addressListbtn" v-model="address" :options="addressList" :props="props" collapse-tags></el-cascader>
<!--<el-select v-model="provinceId" class="cascader-region">-->
<!--<el-option-->
<!--v-for="(item,index) in addressList"-->
<!--:key="index"-->
<!--:label="item.label"-->
<!--:value="item.id"-->
<!--@click.native="addressListbtn(item.label,item.id)"-->
<!--&gt;</el-option>-->
<!--</el-select>-->
</div>
<!--<div class="location">-->
<!--<span><i class="el-icon-location"></i>{{province}}</span>-->
<!--<el-cascader ref="address" class="cascader-region" popper-class='cascader-region-addd'-->
<!--@change="addressListbtn" v-model="address" :options="addressList" :props="props" collapse-tags></el-cascader>-->
<!--&lt;!&ndash;<el-select v-model="provinceId" class="cascader-region">&ndash;&gt;-->
<!--&lt;!&ndash;<el-option&ndash;&gt;-->
<!--&lt;!&ndash;v-for="(item,index) in addressList"&ndash;&gt;-->
<!--&lt;!&ndash;:key="index"&ndash;&gt;-->
<!--&lt;!&ndash;:label="item.label"&ndash;&gt;-->
<!--&lt;!&ndash;:value="item.id"&ndash;&gt;-->
<!--&lt;!&ndash;@click.native="addressListbtn(item.label,item.id)"&ndash;&gt;-->
<!--&lt;!&ndash;&gt;</el-option>&ndash;&gt;-->
<!--&lt;!&ndash;</el-select>&ndash;&gt;-->
<!--</div>-->
</div>
<RegionalEconomy v-if="activeName === 'first' && province" :dataQuery="dataQuery" :provinceId="provinceId"></RegionalEconomy>
<LocalEconomy v-if="activeName === 'second' && province" :dataQuery="dataQuery" :provinceId="provinceId"></LocalEconomy>
......@@ -33,6 +34,7 @@
import RegionalEconomy from './component/regionalEconomy'
import LocalEconomy from './component/localEconomy'
import Comparison from './component/comparison'
import Region from '../component/region'
import IndustrialStructure from './component/industrialStructure'
import { location } from '@/api/macro/macro'
import dataRegion from '@/assets/json/dataRegion'
......@@ -43,6 +45,7 @@ export default {
LocalEconomy,
Comparison,
IndustrialStructure,
Region
},
data() {
return {
......@@ -60,34 +63,64 @@ export default {
}
},
created() {
this.dataQuery=this.$route.query;
// let params={}
// if(this.dataQuery.provinceId){
// params.provinceId=this.dataQuery.provinceId
// }
//使用JSON方法深拷贝
let data = JSON.parse(JSON.stringify(this.$route.query))
this.dataQuery=data;
if(this.dataQuery.provinceId){
this.province=this.dataQuery.province;
this.dataQuery.province=[this.dataQuery.province]
if(Array.isArray(this.dataQuery.province)){
this.province=this.dataQuery.province[0];
}else {
this.province=this.dataQuery.province
this.dataQuery.province = [this.dataQuery.province];
}
if(Array.isArray(this.dataQuery.provinceId)){
this.provinceId=this.dataQuery.provinceId
}else {
this.provinceId.push(this.dataQuery.provinceId)
}
}else {
location({}).then(res => {
this.province=res.data.province;
if(localStorage.getItem('location')){
if(res.data.area){
this.province=res.data.area
}else {
if(res.data.city){
this.province=res.data.city
}else {
this.province=res.data.province
}
}
if(!this.dataQuery.provinceId){
this.dataQuery.provinceId=res.data.provinceId
let arr=[this.province]
if(res.data.areaId){
this.dataQuery.provinceId=[res.data.provinceId,res.data.cityId,res.data.areaId]
this.provinceId=[res.data.provinceId,res.data.cityId,res.data.areaId]
}else {
if(res.data.cityId){
this.provinceId=[res.data.provinceId,res.data.cityId]
}else {
this.provinceId=[res.data.provinceId]
}
}
let arr=[res.data.province]
this.dataQuery.province=arr;
this.provinceId.push(res.data.provinceId)
}else {
this.provinceId.push(this.dataQuery.provinceId)
this.provinceId=this.dataQuery.provinceId
}
}else {
this.province=res.data.province
if(!this.dataQuery.provinceId){
this.provinceId=[res.data.provinceId]
let arr=[res.data.province]
this.dataQuery.province=arr;
}else {
this.provinceId=this.dataQuery.provinceId
}
}
})
}
if(this.dataQuery.activeName){
this.activeName=this.dataQuery.activeName;
}
this.dataRegion()
// let name = sessionStorage.getItem('currentTab')
// if (name != "undefined" && name){
// this.activeName = name;
......@@ -96,10 +129,13 @@ export default {
methods: {
handleClick(key,item) {
if(key === 'four'){
this.activeName='four'
this.activeName=key
}
if(key === 'first'){
this.activeName='first'
this.activeName=key
}
if(key === 'second'){
this.activeName=key
}
if(item.cityId){
if(this.provinceId.length >= 2){
......@@ -119,73 +155,26 @@ export default {
}
// sessionStorage.setItem('currentTab', this.activeName)
},
//地区
async dataRegion() {
// await axios.post("https://files.jiansheku.com/file/json/common/dataRegion.json", {}, {
// headers: {
// 'Content-Type': 'application/json'
// }
// }).then(res => {
// if (res.data.code == 200) {
// console.log(res.data.data)
// }
// })
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;
},
addressListbtn() {
let nodesObj = this.$refs.address.getCheckedNodes()[0];
// console.log(nodesObj)
this.province=nodesObj.pathLabels[nodesObj.pathLabels.length-1];
this.provinceId=nodesObj.path;
this.dataQuery.province=nodesObj.pathLabels;
// this.dataQuery.provinceId=nodesObj.path[nodesObj.path.length-1];
// console.log(this.dataQuery)
// this.province=label;
// this.provinceId=id;
// this.dataQuery.provinceId=id;
// this.dataQuery.province=label;
addressListbtn(data) {
this.province=data.province;
this.provinceId=data.provinceId;
this.dataQuery.province=data.provinces;
let params={}
if(data){
if(this.provinceId.length > 0){
params.provinceId=this.provinceId[0]
}
if(this.provinceId.length > 1){
params.cityId=this.provinceId[1]
}
if(this.provinceId.length > 2){
params.areaId=this.provinceId[2]
}
}
location(params).then(res => {
console.log(res.data)
})
}
}
}
......
<template>
<div class="app-container enterprises">
<Region v-if="province" :province="province" :dataQuery="dataQuery" @addressListbtn="addressListbtn"></Region>
<div class="flex-box eco-header">
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="本地企业" name="first"></el-tab-pane>
<el-tab-pane label="异地备案" name="second"></el-tab-pane>
</el-tabs>
<div class="location"><i class="el-icon-location"></i>{{province}}</div>
<!--<div class="location"><i class="el-icon-location"></i>{{province}}</div>-->
</div>
<div class="content">
<div class="search">
......@@ -18,27 +19,27 @@
placeholder="资质资格"
collapse-tags
clearable></el-cascader>
<el-input placeholder="输入企业名称关键词" v-model="queryParams.ename" clearable @clear="handleSearch()">
<el-input placeholder="输入关键词查询" v-model="queryParams.ename" clearable @clear="handleSearch()">
<el-button slot="append" @click="handleSearch()">搜索</el-button>
</el-input>
<span class="total">{{tableDataTotal}}</span>
</div>
<skeleton v-if="isSkeleton" style="padding: 16px"></skeleton>
<div class="table-item">
<el-table
v-loading="tableLoading"
:data="tableData"
element-loading-text="Loading"
border
fit
@sort-change="sortChange"
highlight-current-row
v-if="tableDataTotal > 0"
v-if="tableDataTotal > 0 && !isSkeleton"
:default-sort = "{prop: 'skyCount', order: 'descending'}"
>
<el-table-column label="序号" width="60" align="left" fixed>
<template slot-scope="scope">{{ pageIndex * pageSize - pageSize + scope.$index + 1 }}</template>
</el-table-column>
<el-table-column label="公司名称" align="left" fixed width="350">
<el-table-column label="公司名称" align="left" fixed width="290">
<template slot-scope="scope">
<router-link v-if="scope.row.jskEid" :to="`/company/${encodeStr(scope.row.jskEid)}`" tag="a" class="a-link" v-html="scope.row.name" ></router-link>
<span v-else v-html="scope.row.name" ></span>
......@@ -53,22 +54,22 @@
<el-table-column label="四库业绩" prop="skyCount" sortable="custom" width="120" :formatter="formatStatus"/>
<el-table-column label="公路业绩" prop="roadConservancy" sortable="custom" width="100" :formatter="formatStatus"/>
<el-table-column label="水利业绩" prop="waterConservancy" sortable="custom" width="100" :formatter="formatStatus"/>
<el-table-column label="常合作业主" prop="topCustomer" width="150" :formatter="formatStatus">
<el-table-column label="常合作业主" prop="topCustomer" width="290" :formatter="formatStatus">
<template slot-scope="scope">
<router-link v-if="scope.row.topCustomerId" :to="`/company/${encodeStr(scope.row.topCustomerId)}`" tag="a" class="a-link" v-html="scope.row.topCustomer" ></router-link>
<span v-else v-html="scope.row.topCustomer" ></span>
<span style="cursor: pointer;" v-if="scope.row.topCustomerId" @click="getUipIdByCid(scope.row.topCustomerId)" class="a-link" v-html="scope.row.topCustomer" ></span>
<span v-else>{{scope.row.topCustomer ? scope.row.topCustomer :'-'}}</span>
</template>
</el-table-column>
<el-table-column label="客户(个)" prop="customerCount" sortable="custom" width="120" :formatter="formatStatus"/>
<el-table-column label="供应商(个)" prop="supplierCount" sortable="custom" width="150" :formatter="formatStatus"/>
<el-table-column label="常合作供应商" prop="topSupplier" width="200" :formatter="formatStatus">
<el-table-column label="常合作供应商" prop="topSupplier" width="290" :formatter="formatStatus">
<template slot-scope="scope">
<router-link v-if="scope.row.topSupplierId" :to="`/company/${encodeStr(scope.row.topSupplierId)}`" tag="a" class="a-link" v-html="scope.row.topSupplier" ></router-link>
<span v-else v-html="scope.row.topSupplier" ></span>
<span v-else>{{scope.row.topSupplier ? scope.row.topSupplier :'-'}}</span>
</template>
</el-table-column>
</el-table>
<div class="empty" v-if="tableDataTotal === 0">
<div class="empty" v-if="tableDataTotal === 0 && !isSkeleton">
<img class="img" src="@/assets/images/project/empty.png">
<div class="p1">抱歉,没找到相关数据</div>
<div class="p2">建议调整关键词或筛选条件,重新搜索</div>
......@@ -89,14 +90,17 @@
// import Offsite from './component/offsite'
import {encodeStr} from "@/assets/js/common.js"
import aptitudeCode from '@/assets/json/aptitudeCode'
import { enterprise,location } from '@/api/macro/macro'
import { enterprise,location,getUipIdByCid } from '@/api/macro/macro'
import Region from '../component/region'
import skeleton from '../component/skeleton'
export default {
name: 'Enterprises',
// components: {LocalEnterprises,Offsite},
components: {Region,skeleton},
data() {
return {
encodeStr,
activeName: 'first',
dataQuery:{},
queryParams:{
ename:'',
codeStr:'',
......@@ -119,20 +123,37 @@ export default {
province:'',
provinceId:'',
show_page:true,
MaxPage:500
MaxPage:500,
isSkeleton:true
}
},
created() {
location({}).then(res => {
this.province=res.data.province;
this.provinceId=res.data.provinceId;
this.provinceId=res.data.provinceId
this.querySubmit()
})
this.aptitudeCode()
},
mounted() {
// window.addEventListener("scroll",this.scrolling)
},
beforeDestroy() {
// window.removeEventListener("scroll", this.scrolling);
},
methods: {
//资质Json
scrolling() {
let el = document.getElementsByClassName("el-table__fixed-header-wrapper")[0]
let scrollTop =window.pageYOffset ||document.documentElement.scrollTop ||document.body.scrollTop;
if (scrollTop>197){
let top = scrollTop-197
el.style.top = top+'px'
}else{
el.style.top = 0
}
},
//资质Json
async aptitudeCode() {
// await axios.post("https://files.jiansheku.com/file/json/common/aptitudeCode.json", {}, {
// headers: {
......@@ -146,6 +167,7 @@ export default {
this.aptitudeCodeList=aptitudeCode
},
async querySubmit(){
this.isSkeleton = true;
const params = { pageNum: this.pageIndex, pageSize: this.pageSize}
if(this.queryParams.field){
params.field=this.queryParams.field
......@@ -172,6 +194,7 @@ export default {
params.aptitudeQueryDto.aptitudeDtoList=aptitudeType
}
enterprise(params).then(res => {
this.isSkeleton = false
if(res.code === 200){
this.tableData=res.data.list;
this.tableDataTotal=res.data.total;
......@@ -211,7 +234,6 @@ export default {
this.querySubmit()
},
handleClick(){
console.log(this.activeName)
this.queryParams.codeStr=[]
this.aptitudeType='';
this.queryParams={
......@@ -245,6 +267,43 @@ export default {
this.pageIndex = 1;
this.querySubmit()
},
getUipIdByCid(companyId){
var params=[companyId]
getUipIdByCid(params).then(res=>{
if (res.code==200) {
if(res.data&&res.data.length>0&&res.data[0].uipId){
this.$router.push({path: '/enterprise/'+this.encodeStr(companyId)})
}else{
this.$router.push({path: '/company/'+this.encodeStr(companyId)})
}
}
}).catch(error=>{
});
},
addressListbtn(data) {
this.province=data.province;
this.provinceId=data.provinceId[data.provinceId.length-1];
this.dataQuery.province=data.provinces;
let params={}
if(data){
if(this.provinceId.length > 0){
params.provinceId=this.provinceId[0]
}
if(this.provinceId.length > 1){
params.cityId=this.provinceId[1]
}
if(this.provinceId.length > 2){
params.areaId=this.provinceId[2]
}
}
this.querySubmit()
location(params).then(res => {
console.log(res.data)
})
}
}
}
</script>
......@@ -315,17 +374,23 @@ export default {
}
}
}
::v-deep .el-input{
width: 250px;
::v-deep .el-input.el-input-group{
width: 240px;
height: 32px;
.el-input__inner{
height: 32px;
border-right: 0;
}
.el-input__suffix{
margin-top: -1px;
}
.el-input-group__append{
width: 59px;
background: #F5F5F5;
color:#0081FF;
border-left: 0;
padding: 0;
text-align: center;
}
}
.total{
......@@ -358,6 +423,36 @@ export default {
margin-top: 8px;
}
}
::v-deep .el-table{
overflow:visible;
.el-table__header-wrapper{
position: sticky;
top:56px;
z-index: 9;
}
.el-table__fixed-header-wrapper{
position: sticky;
z-index: 9;
top: 56px;
}
.el-table__fixed{
overflow-x: clip;
overflow-y: clip;
}
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;
}
}
}
}
}
......
......@@ -130,9 +130,9 @@
{{formatDate(scope.row.tenderDate)}}
</template>
</el-table-column>
<el-table-column prop="actualBondIssueScale" label="专项债规模(亿)" width="260" />
<el-table-column prop="isUsedProjectScale" label="用于项目规模(亿)" width="260" />
<el-table-column prop="isUsedCapital" label="是否资本金" width="200" />
<el-table-column prop="actualBondIssueScale" label="专项债规模(亿)" width="260" :formatter="formatStatus"/>
<el-table-column prop="isUsedProjectScale" label="用于项目规模(亿)" width="260" :formatter="formatStatus"/>
<el-table-column prop="isUsedCapital" label="是否资本金" width="200" :formatter="formatStatus"/>
</el-table>
</div>
</div>
......@@ -185,7 +185,10 @@ export default {
// var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
// return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds
return year + '-' + month + '-' + day
}
},
formatStatus: function(row, column, cellValue) {
return cellValue? cellValue : '-'
},
}
}
</script>
......
<template>
<div class="app-container qyzx">
<Region v-if="province" :province="province" :dataQuery="dataQuery" @addressListbtn="addressListbtn"></Region>
<div class="content">
<div class="common-title">专项债项目</div>
<div class="content-box">
<div class="content-box" v-if="!state">
<div class="box-left">
<div id="echarts" style="height: 400px"></div>
</div>
......@@ -26,6 +27,12 @@
</el-table>
</div>
</div>
<div class="content-box" v-else>
<div class="empty">
<img class="img" src="@/assets/images/project/empty.png">
<div class="p1">抱歉,暂无专项债项目数据</div>
</div>
</div>
</div>
<div class="content">
<div class="common-title flex-box">
......@@ -76,9 +83,13 @@
<script>
import * as echarts from 'echarts';
import { statistics,projectsPage } from '@/api/macro/macro'
import { statistics,projectsPage,location } from '@/api/macro/macro'
import Region from '../component/region'
export default {
name: 'Financing',
components: {
Region
},
data() {
return {
queryParams:{},
......@@ -90,15 +101,59 @@ export default {
pageSize: 10,
tableDataTotal: 0,
show_page:true,
MaxPage:1000
MaxPage:1000,
dataQuery:{},
province:'',
provinceId:[],
state:false,
}
},
created() {
this.getStatistics()
location({}).then(res => {
if(localStorage.getItem('location')){
if(res.data.area){
this.province=res.data.area
}else {
if(res.data.city){
this.province=res.data.city
}else {
this.province=res.data.province
}
}
if(!this.dataQuery.provinceId){
if(res.data.areaId){
this.dataQuery.provinceId=[res.data.provinceId,res.data.cityId,res.data.areaId]
this.provinceId=[res.data.provinceId,res.data.cityId,res.data.areaId]
}else {
if(res.data.cityId){
this.provinceId=[res.data.provinceId,res.data.cityId]
}else {
this.provinceId=[res.data.provinceId]
}
}
let arr=[res.data.province]
this.dataQuery.province=arr;
}else {
this.provinceId=this.dataQuery.provinceId
}
}else {
this.province=res.data.province;
if(!this.dataQuery.provinceId){
this.provinceId=[res.data.provinceId]
let arr=[res.data.province]
this.dataQuery.province=arr;
}else {
this.provinceId=this.dataQuery.provinceId
}
}
this.$nextTick(() => {
this.getData()
this.$nextTick(()=>{
this.getStatistics()
})
})
},
mounted() {
},
methods: {
getData(){
......@@ -110,6 +165,15 @@ export default {
if(this.tableParams.order){
params.order=this.tableParams.order
}
if(this.provinceId.length > 0){
params.provinceId=this.provinceId[0]
}
if(this.provinceId.length > 1){
params.cityId=this.provinceId[1]
}
if(this.provinceId.length > 2){
params.areaId=this.provinceId[2]
}
projectsPage(params).then(res => {
this.tableLoading = false
this.listData=res.data.list;
......@@ -122,6 +186,15 @@ export default {
},
getStatistics(){
let params={};
if(this.provinceId.length > 0){
params.provinceId=this.provinceId[0]
}
if(this.provinceId.length > 1){
params.cityId=this.provinceId[1]
}
if(this.provinceId.length > 2){
params.areaId=this.provinceId[2]
}
if(this.queryParams.field){
params.field=this.queryParams.field
}
......@@ -145,15 +218,27 @@ export default {
return New.value - old.value
})
let data=[]
if(arr.length >= 10){
for(let i=0; i<10; i++){
data.push(arr[i])
}
}else {
for(let i=0; i<arr.length; i++){
data.push(arr[i])
}
}
this.total=this.tableData.length;
if(this.tableData.length > 0){
this.state=false;
this.initChart(data)
}else {
this.state=true;
}
})
},
initChart(data) {
this.$nextTick(() => {
let myChart = echarts.init(document.getElementById("echarts"))
let option ={
tooltip: {
trigger: 'item',
......@@ -196,6 +281,8 @@ export default {
]
}
myChart.setOption(option);
})
},
formatStatus: function(row, column, cellValue) {
return cellValue? cellValue : '-'
......@@ -301,7 +388,30 @@ export default {
message: '功能正在开发中',
type: 'warning'
});
},
addressListbtn(data) {
this.province=data.province;
this.provinceId=data.provinceId;
this.dataQuery.province=data.provinces;
let params={}
if(data){
if(this.provinceId.length > 0){
params.provinceId=this.provinceId[0]
}
if(this.provinceId.length > 1){
params.cityId=this.provinceId[1]
}
if(this.provinceId.length > 2){
params.areaId=this.provinceId[2]
}
}
location(params).then(res => {
console.log(res.data)
})
this.pageIndex = 1;
this.getData()
this.getStatistics()
},
}
}
</script>
......@@ -332,7 +442,27 @@ export default {
display: flex;
justify-content: space-between;
.box-left{
width: 55%;
width: 50%;
}
.empty{
margin: 0 auto;
height: 550px;
text-align: center;
.img{
width: 108px;
height: 108px;
margin-bottom: 24px;
margin-top: 150px;
}
.p1{
color: #333333;
font-size: 16px;
}
.p2{
color: #999999;
font-size: 14px;
margin-top: 8px;
}
}
.box-right{
float: right;
......@@ -390,6 +520,9 @@ export default {
padding: 0;
line-height: 40px;
}
.el-table__body tr:hover > td.el-table__cell{
background: #DCEBFF;
}
::-webkit-scrollbar-track-piece {
//滚动条凹槽的颜色,还可以设置边框属性
background-color: #F3F4F5;
......@@ -419,6 +552,9 @@ export default {
th:nth-child(4){
border-right:0;
}
td:nth-child(4){
border-right:0;
}
}
}
.el-table__cell.gutter{
......
......@@ -295,5 +295,17 @@ export default {
}
.table-item{
padding: 16px 10px 16px 16px;
::v-deep .el-table{
/*.el-table__body-wrapper{*/
/*overflow:visible;*/
/*}*/
/*.el-table__body{*/
/*tr:first-child{*/
/*position: fixed;*/
/*top: 49px;*/
/*z-index: 9;*/
/*}*/
/*}*/
}
}
</style>
......@@ -6,7 +6,7 @@
<span class="common-title">全国经济大全</span>
<el-form ref="queryForm" :model="queryParams" :inline="true" size="small">
<el-form-item prop="year">
<el-select v-model="queryParams.year" filterable class="form-content-width" placeholder="请选择" @change="handleSearch">
<el-select v-model="queryParams.year" filterable class="form-content-width" placeholder="请选择" @change="handleSearch" :popper-append-to-body='false'>
<el-option v-for="(item, index) in yearOptions" :key="index" :label="item.year" :value="item.year" />
</el-select>
</el-form-item>
......@@ -28,16 +28,16 @@
<span class="flex-box" @click="handleMessage"><img src="@/assets/images/ability_excel.png">导出EXCEL</span>
</div>
</div>
<skeleton v-if="isSkeleton" style="padding: 16px"></skeleton>
<div class="table-item">
<el-table
v-loading="tableLoading"
class="fixed-table"
:data="tableData"
element-loading-text="Loading"
@sort-change="sortChange"
border
fit
highlight-current-row
v-if="tableDataTotal > 0"
v-if="tableDataTotal > 0 && !isSkeleton"
:default-sort = "{prop: 'gdp', order: 'descending'}"
>
<el-table-column label="序号" width="60" align="left" fixed>
......@@ -57,9 +57,9 @@
<el-table-column label="GDP增速(%)" prop="gdpGrowth" :formatter="formatStatus" sortable="custom" min-width="120" align="right"></el-table-column>
<el-table-column label="人均GDP(元)" prop="gdpPerCapita" :formatter="formatStatus" sortable="custom" width="125" align="right"></el-table-column>
<el-table-column label="人口(万人)" prop="population" :formatter="formatStatus" sortable="custom" width="120" align="right"></el-table-column>
<el-table-column label="一般公共预算收入(亿元)" prop="gbr" sortable="custom" :formatter="formatStatus" width="170" align="right"></el-table-column>
<el-table-column label="一般公共预算收入增速(%)" prop="gbrGrowth" :formatter="formatStatus" sortable="custom" min-width="140" align="right"></el-table-column>
<el-table-column label="一般公共预算收入:税收收入(亿元)" prop="taxIncome" :formatter="formatStatus" sortable="custom" min-width="140" align="right"></el-table-column>
<el-table-column label="一般公共预算收入(亿元)" prop="gbr" sortable="custom" :formatter="formatStatus" width="180" align="right"></el-table-column>
<el-table-column label="一般公共预算收入增速(%)" prop="gbrGrowth" :formatter="formatStatus" sortable="custom" min-width="150" align="right"></el-table-column>
<el-table-column label="一般公共预算收入:税收收入(亿元)" prop="taxIncome" :formatter="formatStatus" sortable="custom" min-width="150" align="right"></el-table-column>
<el-table-column label="一般公共预算支出(亿元)" prop="gbe" :formatter="formatStatus" sortable="custom" width="140" align="right"></el-table-column>
<el-table-column label="政府性基金收入(亿元)" width="140" prop="govFundIncome" :formatter="formatStatus" sortable="custom" align="right"></el-table-column>
<el-table-column label="政府性基金收入:土地出让收入(亿元)" prop="landTransferIncome" sortable="custom" :formatter="formatStatus" width="150" align="right"></el-table-column>
......@@ -96,7 +96,7 @@
<el-table-column label="社会消费品零售总额(亿元)" prop="trscg" :formatter="formatStatus" width="160" align="right"></el-table-column>
<el-table-column label="城镇居民人均可支配收入(元)" prop="urbanPcdi" :formatter="formatStatus" width="160" align="right"></el-table-column>
</el-table>
<div class="empty" v-if="tableDataTotal === 0">
<div class="empty" v-if="tableDataTotal === 0 && !isSkeleton">
<img class="img" src="@/assets/images/project/empty.png">
<div class="p1">抱歉,没找到相关数据</div>
<div class="p2">建议调整关键词或筛选条件,重新搜索</div>
......@@ -117,11 +117,12 @@
import { nationalPage,getYears } from '@/api/macro/macro'
import dataRegion from '@/assets/json/dataRegion'
import economiesDetail from './economies-detail'
import skeleton from '../../component/skeleton'
import axios from 'axios'
export default {
name: 'NationalEconomies',
components: {
economiesDetail
economiesDetail,skeleton
},
data() {
return {
......@@ -142,7 +143,8 @@
pageSize: 20,
tableDataTotal: null,
show_page:true,
MaxPage:500
MaxPage:500,
isSkeleton:true
}
},
created() {
......@@ -150,7 +152,23 @@
this.dataRegion()
this.getYears()
},
mounted() {
// window.addEventListener("scroll",this.scrolling)
},
beforeDestroy() {
// window.removeEventListener("scroll", this.scrolling);
},
methods: {
scrolling() {
// let el = document.getElementsByClassName("el-table__fixed-header-wrapper")[0]
// let scrollTop =window.pageYOffset ||document.documentElement.scrollTop ||document.body.scrollTop;
// if (scrollTop>138){
// let top = scrollTop-138
// el.style.top = top+'px'
// }else{
// el.style.top = 0
// }
},
getYears(){
getYears({}).then(res => {
this.yearOptions=res.data.reverse();
......@@ -211,7 +229,7 @@
},
// 查询提交
async querySubmit() {
this.tableLoading = true
this.isSkeleton = true
const params = { pageNum: this.pageIndex, pageSize: this.pageSize, year: this.queryParams.year,type:1 }
if(this.queryParams.address){
let arr = this.$refs.address.getCheckedNodes();
......@@ -256,7 +274,7 @@
}
nationalPage(params).then(res => {
this.tableLoading = false
this.isSkeleton = false
this.tableData = res.data.list;
this.tableDataTotal = res.data.totalCount
})
......@@ -322,6 +340,7 @@
</script>
<style lang="scss" scoped>
.qgjjdq{
.query-box{
margin: -8px 0 8px 0;
......@@ -346,13 +365,18 @@
}
}
}
::v-deep .el-select-dropdown{
.el-select-dropdown__item.hover{
color: #0081FF;
}
}
.content{
background: #ffffff;
padding: 16px;
margin-top: 12px;
/*height: calc(100vh - 300px);*/
.table-item{
position: relative;
/*position: relative;*/
.empty{
/*position: absolute;*/
/*top: 50%;*/
......@@ -379,6 +403,21 @@
}
}
::v-deep .el-table{
overflow:visible;
.el-table__header-wrapper{
position: sticky;
top:56px;
z-index: 9;
}
.el-table__fixed-header-wrapper{
position: sticky;
z-index: 9;
top: 56px;
}
.el-table__fixed{
overflow-x: clip;
overflow-y: clip;
}
th{
font-size: 12px !important;
font-weight: 400 !important;
......@@ -393,6 +432,9 @@
width: 10px;
}
}
::v-deep .fixed-table{
}
}
}
}
......
......@@ -7,7 +7,7 @@
</div>
</div>
<div class="text">{{value}}全国项目招标数量达到{{totalCount}}万个,招标数量前五的地区分别是
{{tableData[0].type}}{{tableData[0].count}}个)、{{tableData[1].type}}{{tableData[1].count}}个)、{{tableData[2].type}}{{tableData[2].count}}个)、{{tableData[3].type}}{{tableData[3].count}}个)、{{tableData[4].type}}{{tableData[4].count}}个)。</div>
{{tableData[1].type}}{{tableData[1].count}}个)、{{tableData[2].type}}{{tableData[2].count}}个)、{{tableData[3].type}}{{tableData[3].count}}个)、{{tableData[4].type}}{{tableData[4].count}}个)、{{tableData[5].type}}{{tableData[5].count}}个)。</div>
<div class="main1">
<div id="zb-echarts" style="height: 250px"></div>
<p class="tips"><i class="el-icon-info"></i>数据来源大司空建筑大数据平台,统计范围为{{value}}全国公开的招标项目,未公开的不含在内</p>
......@@ -67,7 +67,9 @@
<el-table-column label="序号" width="60" align="left">
<template slot-scope="scope">{{ scope.$index + 1 }}</template>
</el-table-column>
<el-table-column prop="type" label="地区"/>
<el-table-column label="地区">
<template slot-scope="scope">{{ scope.row.type === '全国'? '未公示地区': scope.row.type}}</template>
</el-table-column>
<el-table-column prop="count" sortable label="招标数量" align="right"/>
<el-table-column prop="rate" sortable label="占比(%)" align="right"/>
</el-table>
......@@ -80,7 +82,7 @@
<span class="common-title">全国招标项目概览</span>
</div>
</div>
<div class="text">通过对{{year}}全国招标数据进行分析,发现主要集中在{{dataSort[0].label}}({{dataSort[0].count}}个)、{{dataSort[1].label}}({{dataSort[1].count}}个)进行招标。</div>
<div class="text">通过对{{year}}全国招标数据进行分析,发现主要集中在{{dataSort[0].label}}({{dataSort[0].count}}个)、{{dataSort[1].label}}({{dataSort[1].count}}个)进行招标。</div>
<div class="main1">
<div id="gl-echarts" style="height: 250px"></div>
<p class="tips"><i class="el-icon-info"></i>数据来源大司空建筑大数据平台,统计范围为{{year}}年全国公开的招标项目,未公开的不含在内</p>
......@@ -88,7 +90,7 @@
<div class="main2">
<div class="selectYear">
<el-select v-model="year" filterable class="form-content-width" placeholder="请选择" @change="changeValue()">
<el-option v-for="(item, index) in yearData" :key="index" :label="item" :value="item" />
<el-option v-for="(item, index) in yearData" :key="index" :label="item.label" :value="item.value" />
</el-select>
</div>
<div class="table-item">
......@@ -119,7 +121,7 @@ export default {
name: 'NationalEconomies',
data() {
return {
year:'2023',
year:'近一年',
yearOptions: [
{ label: '近五年', value: '近五年' },
{ label: '近三年', value: '近三年' },
......@@ -146,6 +148,10 @@ export default {
type:'',
count:'',
},
{
type:'',
count:'',
},
],
tableData1:[],
dataSort:[
......@@ -163,22 +169,37 @@ export default {
value:'近五年',
punishDateShowPopper: false,
punishDate: "",
yearData:[],
yearData:[
{ label: '近一年', value: '近一年' },
{ label: '近二年', value: '近二年' },
{ label: '近三年', value: '近三年' },
],
myChart:'',
myChart1:'',
}
},
created() {
let params={}
this.getDataByProvince(params)
this.getDataByProvince({})
let mydate=new Date();
var startTime, endTime, Year, Month, Day,startyear
Year = mydate.getFullYear();
Month = mydate.getMonth() + 1;
Day = mydate.getDate();
Month = Month < 10 ? '0' + Month : Month
Day = Day < 10 ? '0' + Day : Day
startyear=mydate.getFullYear()-1;
startTime = startyear + "-" + Month + "-" + Day;
endTime = Year + "-" + Month + "-" + Day;
let params={
startDate:startTime,
endDate:endTime
}
this.getDataByMonth(params)
this.$nextTick(()=>{
// this.initChart()
// this.initChart1()
})
getYear().then(res => {
this.yearData=res.rows;
})
window.addEventListener("resize", this.resizeEcharts);
},
beforeDestroy(){
......@@ -198,6 +219,13 @@ export default {
getDataByProvince(params){
countGroupByProvince(params).then(res => {
this.tableData=res.data.provinceDate;
let arr=[]
for (let i=0; i<res.data.provinceDate.length; i++){
if(res.data.provinceDate[i].type != '全国'){
arr.push(res.data.provinceDate[i])
}
}
this.dataList=arr;
this.totalCount=res.data.totalCount;
this.initChart()
})
......@@ -232,7 +260,7 @@ export default {
},
xAxis: {
type: 'category',
data: this.tableData.map(item => item.type),
data: this.dataList.map(item => item.type),
axisLabel: {
show: true,
// "interval": 0,
......@@ -244,7 +272,7 @@ export default {
},
series: [
{
data: this.tableData.map(item => item.count),
data: this.dataList.map(item => item.count),
type: 'bar',
barWidth: 16,
itemStyle: {
......@@ -290,6 +318,11 @@ export default {
xAxis: {
type: 'category',
data: this.tableData1.map(item => item.label),
axisLabel: {
show: true,
// "interval": 0,
"rotate": this.year === '近二年'|| this.year === '近三年'? 40: 0 //X轴倾斜度
},
},
yAxis: {
type: 'value'
......@@ -402,7 +435,36 @@ export default {
}
},
changeValue(){
this.getDataByMonth({year:this.year})
let mydate=new Date();
var startTime, endTime, Year, Month, Day,startyear
Year = mydate.getFullYear();
Month = mydate.getMonth() + 1;
Day = mydate.getDate();
Month = Month < 10 ? '0' + Month : Month
Day = Day < 10 ? '0' + Day : Day
switch (this.year) {
case "近三年":
startyear=mydate.getFullYear()-3;
startTime = startyear + "-" + Month + "-" + Day;
endTime = Year + "-" + Month + "-" + Day;
break;
case "近二年":
startyear=mydate.getFullYear()-2;
startTime = startyear + "-" + Month + "-" + Day;
endTime = Year + "-" + Month + "-" + Day;
break;
case "近一年":
startyear=mydate.getFullYear()-1;
startTime = startyear + "-" + Month + "-" + Day;
endTime = Year + "-" + Month + "-" + Day;
break;
}
let params={
startDate:startTime,
endDate:endTime
}
this.getDataByMonth(params)
}
}
......@@ -548,6 +610,19 @@ export default {
}
}
}
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;
}
}
}
}
......
......@@ -10,7 +10,7 @@
<div class="main1">
<div style="height: 300px;">
<div class="left">
<div class="item" v-for="(item,index) in glData" :class="typeIndex === index ? 'color':''" @click="handleClick(1,index)">{{item.major}}企业<i></i></div>
<div 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>
......@@ -557,7 +557,7 @@ export default {
grid: {
top:20,
left:65,
right:30,
right:50,
bottom:20,
},
series: [
......@@ -829,6 +829,19 @@ export default {
}
}
}
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;
}
}
}
}
......
<template>
<div class="app-container container-box nationalEconomies">
<div class="app-container nationalEconomies">
<div class="header">
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="全国经济大全" name="first"></el-tab-pane>
......@@ -7,6 +7,7 @@
<el-tab-pane label="全国中标市场分析" name="third"></el-tab-pane>
</el-tabs>
</div>
<Economic v-if="activeName === 'first'"></Economic>
<ZhaoBiao v-if="activeName === 'second'"></ZhaoBiao>
<ZhongBiao v-if="activeName === 'third'"></ZhongBiao>
......
<template>
<div class="app-container urban">
<div class="content">
<div class="app-container urban" ref="urban">
<Region v-if="province" :province="province" :dataQuery="dataQuery" @addressListbtn="addressListbtn"></Region>
<div class="content" ref="queryForm">
<div class="flex-box query-box">
<div class="flex-box query-params">
<span class="common-title">城投平台</span>
......@@ -80,17 +81,17 @@
<!--</template>-->
<!--</div>-->
<!--</div>-->
<div class="item">
<span class="wrap_label">更多筛选</span>
<div class="item_ckquery">
<span :class="addresslength>0?'select-active':''">注册地区{{addresslength>0?(addresslength+'项'):''}}</span>
<el-cascader ref="address" class="cascader-region" popper-class='cascader-region-addd'
@input="addressListbtn" v-model="queryParams.address" :options="addressList" :props="props" collapse-tags></el-cascader>
</div>
</div>
<!--<div class="item">-->
<!--<span class="wrap_label">更多筛选</span>-->
<!--<div class="item_ckquery">-->
<!--<span :class="addresslength>0?'select-active':''">注册地区{{addresslength>0?(addresslength+'项'):''}}</span>-->
<!--<el-cascader ref="address" class="cascader-region" popper-class='cascader-region-addd'-->
<!--@input="addressListbtn" v-model="queryParams.address" :options="addressList" :props="props" collapse-tags></el-cascader>-->
<!--</div>-->
<!--</div>-->
</div>
</div>
<el-input class="search-input" placeholder="输入企业名称关键词" v-model="queryParams.keyword" clearable @clear="handleKeyword()">
<el-input class="search-input" placeholder="输入企业名称查询" v-model="queryParams.keyword" clearable @clear="handleKeyword()">
<template slot="prepend"><i class="el-icon-search"></i></template>
<el-button slot="append" @click="handleKeyword">搜索</el-button>
</el-input>
......@@ -120,7 +121,7 @@
<div class="item">
<div class="left">
<p>{{statistics.accountsReceivable}}<span>亿元</span></p>
<span>收账款</span>
<span>收账款</span>
</div>
<img src="@/assets/images/urban/img4.png">
</div>
......@@ -133,18 +134,20 @@
</div>
</div>
</div>
<div class="content">
<div class="content" id="content">
<div class="flex-box query-box">
<div class="flex-box query-params">
<span class="common-title">城投平台列表</span>
</div>
<div class="flex-box query-ability">
<span class="total">共{{tableDataTotal}}条</span>
<span class="flex-box" @click="handleMessage"><img src="@/assets/images/ability_excel.png">导出EXCEL</span>
</div>
</div>
<skeleton v-if="isSkeleton" style="padding: 16px"></skeleton>
<div class="table-item">
<div v-if="tableDataTotal > 0 && !isSkeleton">
<el-table
v-if="tableDataTotal > 0"
v-loading="tableLoading"
:data="tableData"
element-loading-text="Loading"
......@@ -160,7 +163,7 @@
<template slot-scope="scope">
<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 === 0"><img src="@/assets/images/urban/rl_icon1.png"/>认领</span>
<span class="table-span" style="color: rgba(35,35,35,0.4);" v-if="scope.row.claimStatus === 1"><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 === 1"><img src="@/assets/images/urban/rl_icon2.png"/>已认领</span>
</template>
</el-table-column>
<el-table-column prop="city" label="区域" :formatter="formatStatus" width="150">
......@@ -231,7 +234,8 @@
<el-table-column prop="developmentZone" label="所属开发区" :formatter="formatStatus" width="160" />
<!--<el-table-column prop="bl" label="开发区类别" width="160" />-->
</el-table>
<div class="empty" v-if="tableDataTotal === 0">
</div>
<div class="empty" v-if="tableDataTotal === 0 && !isSkeleton">
<img class="img" src="@/assets/images/project/empty.png">
<div class="p1">抱歉,没找到相关数据</div>
<div class="p2">建议调整关键词或筛选条件,重新搜索</div>
......@@ -241,27 +245,56 @@
<el-pagination background :current-page="pageIndex" :page-size="pageSize" :total="tableDataTotal" layout="prev, pager, next, jumper" @current-change="handleCurrentChange" @size-change="handleSizeChange" />
</div>
</div>
<el-dialog :visible.sync="claimVisible" width="244" :show-close="false">
<el-dialog :visible.sync="claimVisible" width="244" custom-class='dialog-claim' :show-close="false">
<div>认领成功,是否完善客户信息?</div>
<div slot="footer" class="dialog-footer">
<el-button @click="innerVisible = true">
<router-link :to="`/enterprise/${encodeStr(companyId)}?customerId=${customerId}`" tag="a" >
<router-link :to="`/enterprise/${encodeStr(companyId)}?customerId=${customerId}&path=business`" tag="a" >
立即完善
</router-link>
</el-button>
<el-button @click="claimVisible = false">稍后</el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="claimVisible1" custom-class='historyClaim' title="重新认领" width="260" :show-close="false">
<div>再次认领将会恢复客户数据</div>
<div slot="footer" class="dialog-footer">
<el-button @click="handleHistoryClaim">确认</el-button>
<el-button @click="claimVisible1 = false">取消</el-button>
</div>
</el-dialog>
<el-dialog
title="取消认领"
:visible.sync="dialogVisible1"
:modal="false"
custom-class='dialog-renlin'
:show-close="false"
width="344px">
<span>是否取消认领客户?客户信息将放入“历史客户”。</span>
<div slot="footer" class="dialog-footer">
<span class="dialog-footer-btn1" type="primary" @click="confirm()" >
确认
</span>
<span class="dialog-footer-btn2" @click="dialogVisible1 = false">关闭</span>
</div>
</el-dialog>
</div>
</template>
<script>
import {encodeStr} from "@/assets/js/common.js"
import skeleton from '../component/skeleton'
import dataRegion from '@/assets/json/dataRegion'
import { uipGroupData,urbanInvestmentPage,urbanInvestmentStatistics,claim } from '@/api/macro/macro'
import api from '@/api/enterpriseData/enterpriseData.js';
import elementResizeDetectorMaker from "element-resize-detector"
import { uipGroupData,urbanInvestmentPage,urbanInvestmentStatistics,claim,location,customerStatus,historyClaim } from '@/api/macro/macro'
import { infoHeader } from '@/api/detail/party-a/index'
import Region from '../component/region'
export default {
name: 'Urban',
components: {
Region,skeleton
},
data() {
return {
encodeStr,
......@@ -293,10 +326,19 @@ export default {
typeList:[],
statistics:{},
claimVisible:false,
claimVisible1:false,
dialogVisible1: false,
customerId:'',
companyId:'',
companyName:'',
show_page:true,
MaxPage:500
MaxPage:500,
// 表格高度
tableHeight: 0,
dataQuery:{},
province:'',
provinceId:[],
isSkeleton:true
}
},
watch:{
......@@ -312,12 +354,99 @@ export default {
}
}
},
mounted(){
// window.addEventListener("scroll",this.scrolling)
},
beforeDestroy() {
// window.removeEventListener("scroll", this.scrolling);
},
created() {
this.dataRegion()
this.getType()
this.dataQuery=this.$route.query;
if(this.dataQuery.provinceId){
if(Array.isArray(this.dataQuery.province)){
this.province=this.dataQuery.province[0];
}else {
this.province=this.dataQuery.province
this.dataQuery.province = [this.dataQuery.province];
}
if(Array.isArray(this.dataQuery.provinceId)){
this.provinceId=this.dataQuery.provinceId
}else {
this.provinceId.push(this.dataQuery.provinceId)
}
this.querySubmit()
}else {
location({}).then(res => {
if(localStorage.getItem('location')){
if(res.data.area){
this.province=res.data.area
}else {
if(res.data.city){
this.province=res.data.city
}else {
this.province=res.data.province
}
}
if(!this.dataQuery.provinceId){
if(res.data.areaId){
this.dataQuery.provinceId=[res.data.provinceId,res.data.cityId,res.data.areaId]
this.provinceId=[res.data.provinceId,res.data.cityId,res.data.areaId]
}else {
if(res.data.cityId){
this.provinceId=[res.data.provinceId,res.data.cityId]
}else {
this.provinceId=[res.data.provinceId]
}
}
let arr=[res.data.province]
this.dataQuery.province=arr;
}else {
this.provinceId=this.dataQuery.provinceId
}
}else {
this.province=res.data.province
if(!this.dataQuery.provinceId){
this.provinceId=[res.data.provinceId]
let arr=[res.data.province]
this.dataQuery.province=arr;
}else {
this.provinceId=this.dataQuery.provinceId
}
}
this.querySubmit()
})
}
this.$nextTick(() => {
})
},
methods: {
scrolling() {
let el = document.getElementsByClassName("el-table__fixed-header-wrapper")[0]
// let scrollTop =window.pageYOffset ||document.documentElement.scrollTop ||document.body.scrollTop;
// if (scrollTop>368){
// let top = scrollTop-368
// el.style.top = top+'px'
// }else{
// el.style.top = 0
// }
let el1 = document.getElementsByClassName("el-table")[0].offsetTop
let el2 = document.getElementsByClassName("content")[1].offsetTop
let scrollTop = document.documentElement.scrollTop ||document.body.scrollTop;
this.$nextTick(() => {
if (scrollTop>(el1+el2)){
let top = scrollTop-(el1+el2)-13
el.style.top = top+'px'
}else{
el.style.top = 0
}
})
},
getType(){
uipGroupData({}).then(res => {
this.typeList=res.data;
......@@ -325,35 +454,47 @@ export default {
},
// 查询提交
async querySubmit() {
this.tableLoading = true
// this.tableLoading = true;
this.isSkeleton = true
const params = { pageNum: this.pageIndex, pageSize: this.pageSize,type:Number(this.queryParams.radio)}
const param={}
if(this.queryParams.address.length > 0){
let arr = this.$refs.address.getCheckedNodes();
let provinceCode = [],cityCode = [],countyCode = [];
for (var i in arr) {
if (arr[i].parent) {
if (!arr[i].parent.checked) {
arr[i].hasChildren && cityCode.push(arr[i].value);
!arr[i].hasChildren && countyCode.push(arr[i].value);
}
} else {
provinceCode.push(arr[i].value)
}
}
if(provinceCode.length > 0){
params.provinceIds=provinceCode
param.provinceIds=provinceCode
}
if(cityCode.length > 0){
params.cityIds=cityCode
param.cityIds=cityCode
// if(this.queryParams.address.length > 0){
// let arr = this.$refs.address.getCheckedNodes();
// let provinceCode = [],cityCode = [],countyCode = [];
// for (var i in arr) {
// if (arr[i].parent) {
// if (!arr[i].parent.checked) {
// arr[i].hasChildren && cityCode.push(arr[i].value);
// !arr[i].hasChildren && countyCode.push(arr[i].value);
// }
// } else {
// provinceCode.push(arr[i].value)
// }
// }
// if(provinceCode.length > 0){
// params.provinceIds=provinceCode
// param.provinceIds=provinceCode
// }
// if(cityCode.length > 0){
// params.cityIds=cityCode
// param.cityIds=cityCode
// }
// if(countyCode.length > 0){
// params.areaIds=countyCode
// param.areaIds=countyCode
// }
// }
if(this.provinceId.length > 0){
params.provinceIds=[this.provinceId[0]]
}
if(countyCode.length > 0){
params.areaIds=countyCode
param.areaIds=countyCode
if(this.provinceId.length > 1){
params.cityIds=[this.provinceId[1]]
}
if(this.provinceId.length > 2){
params.areaIds=[this.provinceId[2]]
}
if(this.queryParams.uipExecutiveLevel){
params.uipExecutiveLevel=this.queryParams.uipExecutiveLevel;
param.uipExecutiveLevel=this.queryParams.uipExecutiveLevel;
......@@ -391,7 +532,7 @@ export default {
}
urbanInvestmentPage(params).then(res => {
this.tableLoading = false
this.isSkeleton = false
this.tableData = res.data.list;
this.tableDataTotal = res.data.totalCount
})
......@@ -485,24 +626,25 @@ export default {
this.queryParams.uipExecutiveLevel=name;
this.querySubmit()
},
addressListbtn() {
let arr = this.$refs.address.getCheckedNodes();
let provinceCode = [],cityCode = [],countyCode = [];
for (var i in arr) {
if (arr[i].parent) {
if (!arr[i].parent.checked) {
arr[i].hasChildren && cityCode.push(arr[i].value);
!arr[i].hasChildren && countyCode.push(arr[i].value);
addressListbtn(data) {
this.province=data.province;
this.provinceId=data.provinceId;
this.dataQuery.province=data.provinces;
let params={}
if(data){
if(this.provinceId.length > 0){
params.provinceId=this.provinceId[0]
}
} else {
provinceCode.push(arr[i].value)
if(this.provinceId.length > 1){
params.cityId=this.provinceId[1]
}
if(this.provinceId.length > 2){
params.areaId=this.provinceId[2]
}
if (provinceCode.length > 0 || cityCode.length > 0 || countyCode.length > 0) {
this.addresslength = provinceCode.length + cityCode.length + countyCode.length;
} else {
this.addresslength = 0;
}
location(params).then(res => {
console.log(res.data)
})
this.pageIndex = 1;
this.querySubmit()
},
......@@ -598,8 +740,29 @@ export default {
type: 'warning'
});
},
cancelClaim(companyName){
this.dialogVisible1 = true;
this.companyName = companyName;
},
confirm(){
api.cancelClaim(this.companyName).then(res=>{
if(res.code==200){
this.dialogVisible1 = false;
this.querySubmit();
}
})
},
handleHistoryClaim(){
historyClaim(this.companyName).then(res => {
if(res.code === 200){
this.claimVisible1=false;
this.querySubmit()
}
})
},
handleClick(item){
this.companyId=item.companyId;
this.companyName=item.companyName;
infoHeader({companyId:this.companyId}).then(res => {
if(res.code === 200){
let registerAddress=res.data.provinceName
......@@ -622,6 +785,10 @@ export default {
registerAddress:registerAddress,
creditCode:res.data.creditCode,
}
customerStatus(item.companyName).then(res => {
if(res.data === 1){
this.claimVisible1=true;
}else {
claim(params).then(res => {
if(res.code === 200){
this.claimVisible=true;
......@@ -629,9 +796,12 @@ export default {
this.querySubmit()
}
})
}
})
},
}
})
}
},
}
</script>
......@@ -729,8 +899,11 @@ export default {
}
::v-deep .search-input{
/*::v-deep .el-input{*/
width: 260px;
width: 235px;
height: 32px;
.el-input__inner:focus{
border-color: #e0e0e0;
}
.el-input-group__prepend:first-child{
padding: 0;
background-color:#ffffff;
......@@ -744,6 +917,12 @@ export default {
border-left: 0;
height: 32px;
line-height: 32px;
font-size: 12px;
padding-left: 6px;
border-right: 0;
}
.el-input__suffix{
margin-top: -1px;
}
.el-input-group__append:last-child{
width: 60px;
......@@ -780,6 +959,36 @@ export default {
margin-top: 8px;
}
}
::v-deep .el-table{
overflow:visible;
.el-table__header-wrapper{
position: sticky;
top:56px;
z-index: 9;
}
.el-table__fixed-header-wrapper{
position: sticky;
z-index: 9;
top: 56px;
}
.el-table__fixed{
overflow-x: clip;
overflow-y: clip;
}
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;
}
}
}
.companyName{
width: 200px;
......@@ -871,5 +1080,66 @@ export default {
}
}
}
::v-deep .historyClaim{
.el-dialog__header{
display: block;
padding: 12px;
text-align: center;
.el-dialog__title{
font-size: 16px;
}
}
.el-dialog__body{
padding: 0;
text-align: center;
padding-bottom: 24px;
}
}
::v-deep .dialog-renlin{
.el-dialog__header{
display: block;
text-align: center;
}
.el-dialog__body{
padding: 0;
text-align: center;
padding-bottom: 24px;
}
.el-dialog__footer{
padding: 0px;
padding-bottom: 24px;
.dialog-footer{
display: inline-flex;
align-items: center;
justify-content: center;
width: 100%;
.dialog-footer-btn1{
cursor: pointer;
width: 72px;
height: 28px;
background: #0081FF;
border-radius: 2px 2px 2px 2px;
font-size: 12px;
font-weight: 400;
color: #FFFFFF;
line-height: 28px;
text-align: center;
margin-right: 8px;
}
.dialog-footer-btn2{
cursor: pointer;
width: 72px;
height: 28px;
border-radius: 2px 2px 2px 2px;
border: 1px solid #CCCCCC;
line-height: 28px;
text-align: center;
font-size: 12px;
font-weight: 400;
color: rgba(35,35,35,0.8);
}
}
}
}
}
</style>
......@@ -346,6 +346,7 @@ export default {
axisPointer:{ //悬浮于圆点展示标签
type:'axis'
},
extraCssText: 'border:0',
// trigger: 'axis'
},
legend: {
......
......@@ -75,10 +75,10 @@
projectName:'',// 项目名称
companyId:'',//企业id
ownerCompany:'',//业主单位
projectStage:'',//项目阶段
projectType:'',//项目类型
projectCategory:'',//项目类别
investmentAmount:'',//投资估算
projectStage:null,//项目阶段
projectType:null,//项目类型
projectCategory:null,//项目类别
investmentAmount:null,//投资估算
isPrivate:0,//可见范围(0 仅自己可见,1 他人可见)
},
rules:{
......@@ -169,10 +169,10 @@
projectName:'',// 项目名称
companyId:'',//企业id
ownerCompany:'',//业主单位
projectStage:'',//项目阶段
projectType:'',//项目类型
projectCategory:'',//项目类别
investmentAmount:'',//投资估算
projectStage:null,//项目阶段
projectType:null,//项目类型
projectCategory:null,//项目类别
investmentAmount:null,//投资估算
isPrivate:0,//可见范围(0 仅自己可见,1 他人可见)
},
this.showlist = false
......
......@@ -9,7 +9,7 @@
<img src="@/assets/images/project/add_3.png">
<div>新建一条跟进记录,如:周五上午预约客户上门拜访</div>
</div>
<div class="writting" v-if="isEdit == true">
<div class="writting" v-if="isEdit == true" :class="{'w836':showtype!='gjjl'}">
<div class="wri_top">
<img src="@/assets/images/project/add_3.png">
<el-input v-model="addParam.content" placeholder="新建一条跟进记录,如:周五上午预约客户上门拜访"></el-input>
......@@ -43,6 +43,13 @@
<el-input v-model="addParam.position" placeholder="客户职位" style="width: 100px;">
</el-input>
</div>
<div class="sels times" style="width: 132px"><img src="@/assets/images/project/ico_4.png">
<el-date-picker class="w120" value-format="yyyy-MM-dd"
v-model="addParam.visitTime"
type="date"
placeholder="拜访时间">
</el-date-picker>
</div>
<div class="times"><img src="@/assets/images/project/ico_4.png">
<el-date-picker class="w128" value-format="yyyy-MM-dd"
v-model="addParam.nextVisitTime"
......@@ -54,6 +61,8 @@
</div>
</div>
</div>
<skeleton v-if="isSkeleton" style="padding-top: 16px"></skeleton>
<div v-else>
<div class="recordlist" v-if="showtype=='gjdt'">
<div class="rec_detail" v-for="(item,index) in recordlist.rows">
<div class="delform" v-if="isdel && delID == item.id">
......@@ -79,7 +88,7 @@
<span v-if="item.name">拜访对象:{{item.name||'--'}}</span>
<span v-if="showtype == 'gjdt' && item.companyName != ''">关联企业:{{item.companyName}}</span>
<span v-if="item.position">职位:{{item.position}}</span>
<span v-if="item.createTime">拜访时间:{{item.createTime.slice(0, 10)}}</span>
<span v-if="item.visitTime">拜访时间:{{item.visitTime.slice(0, 10)}}</span>
<span v-if="item.nextVisitTime">下次拜访时间:{{item.nextVisitTime.slice(0, 10)}}</span>
</div>
</div>
......@@ -110,7 +119,7 @@
<span v-if="item.projectName && showtype == 'projectgjdt'">关联项目:{{item.projectName||'--'}}</span>
<span v-if="item.visitPerson">拜访对象:{{item.visitPerson||'--'}}</span>
<span v-if="item.position">职位:{{item.position||'--'}}</span>
<span v-if="item.creatTime">拜访时间:{{item.creatTime}}</span>
<span v-if="item.visitTime">拜访时间:{{item.visitTime}}</span>
<span v-if="item.nextVisitTime">下次拜访时间:{{item.nextVisitTime || '--'}}</span>
</div>
</div>
......@@ -129,6 +138,7 @@
</div>
</div>
</div>
</div>
</el-card>
</div>
</template>
......@@ -138,7 +148,9 @@
import {getFollowList,addFollowRecord,getUserList,delFollowRecord} from '@/api/custom/custom'
import {getGJJL,addGJJL,delGJJL,relateProject,allRecord} from '@/api/project/project'
import {getEnterprise,getDictType,} from '@/api/main'
import skeleton from './skeleton'
export default {
components:{skeleton},
props:{
types: { //当前组件展示类型
type: String,
......@@ -169,6 +181,7 @@
addParam:{
customerId:'', //客户id
visitMode:'',//拜访方式
visitTime:'',//拜访时间
nextVisitTime:'',//下次拜访时间
name:'',//拜访对象姓名
position:'',//拜访对象职务
......@@ -183,6 +196,7 @@
projectList:[],//关联项目
isDisableds:this.isDisabled,
keys:1,
isSkeleton:true,
}
},
computed: {
......@@ -212,6 +226,7 @@
this.isDisableds = false
this.projectId = null//项目id暂时清空,必须手选id
relateProject(this.userId).then(res=>{
this.isSkeleton = false
this.projectList = res.data
})
this.getGJDT()
......@@ -250,6 +265,7 @@
userId:this.$store.state.user.userId,
visitPerson:this.addParam.name,
position:this.addParam.position,
visitTime: this.addParam.visitTime,
nextVisitTime: this.addParam.nextVisitTime,
recordInfo:this.addParam.content,
visitWay:this.addParam.visitMode,
......@@ -314,9 +330,11 @@
param.customerId = this.customerIds
}
getFollowList(param).then(result=>{
this.isSkeleton = false
this.recordlist = result.code == 200?result:[]
this.recordlist.rows.forEach(item=>{
item.createTime = this.gettime(item.createTime)
item.visitTime = this.gettime(item.visitTime)
item.nextVisitTime = this.gettime(item.nextVisitTime)
})
})
......@@ -329,6 +347,7 @@
userId: this.userId
}
allRecord(param).then(result=>{
this.isSkeleton = false
this.recordlist = result.code == 200?result:[]
// this.recordlist.rows.forEach(item=>{
// item.createTime = this.gettime(item.createTime)
......@@ -344,10 +363,12 @@
businessId:this.projectId
}
getGJJL(param).then(result=>{
this.isSkeleton = false
this.recordlist = result.code == 200?result:[]
})
},
handleCurrentChange(val){
this.isSkeleton = true
this.pageNum = val
if(this.showtype == 'gjdt'){
this.getGJDTlist()
......@@ -365,6 +386,7 @@
this.addParam={
customerId:'', //客户id
visitMode:'',//拜访方式
visitTime:'',//拜访时间
nextVisitTime:'',//下次拜访时间
name:'',//拜访对象姓名
position:'',//拜访对象职务
......
......@@ -30,6 +30,8 @@
</div>
</div>
</div>
<skeleton v-if="isSkeleton" style="padding-top: 16px"></skeleton>
<div v-else>
<div class="tasktitle"><strong>我的任务</strong><span @click="getYQ">{{yqnum}}条已逾期</span><!--<span class="on">4条已逾期</span>--></div>
<div class="tasklist" v-for="(item,index) in datalist.rows">
<div class="task_name">{{item.task}}</div>
......@@ -60,6 +62,7 @@
</div>
</div>
</div>
</div>
</el-card>
</div>
</template>
......@@ -68,8 +71,10 @@
import "@/assets/styles/project.scss"
import "@/assets/styles/public.css"
import {addGZDB,getGZDB,editGZDB} from '@/api/project/project'
import skeleton from './skeleton'
export default {
components:{skeleton},
name: 'gjjl',
props: {
detailId: { //从企业详情跳转过来ID
......@@ -98,6 +103,7 @@
datalist:[],
yqnum:0,//已逾期数量
isDisableds:this.isDisabled,
isSkeleton:true,
}
},
created(){
......@@ -124,7 +130,9 @@
})
},
getList(){
this.isSkeleton = true
getGZDB(this.searchPram).then(result=>{
this.isSkeleton = false
this.datalist = result.code == 200?result:[]
let num = 0
this.datalist.rows.forEach(item=>{
......
<template>
<div>
<el-card class="box-card noborder">
<div class="cardtitles">基本信息</div>
<div class="tables">
<el-table
:data="tableData"
stripe border
style="width: 100%"
:default-sort = "{prop: 'role', order: 'ascending'}"
>
<template slot="empty">
<div class="empty">
<div class="cardtitles">联系人</div>
<skeleton v-if="isSkeleton" style="padding: 16px"></skeleton>
<div class="tables" v-else>
<div class="empty" v-if="total==0">
<img src="@/assets/images/project/empty.png">
<div class="p1">暂无数据展示</div>
<div class="p2">抱歉,你还未添加相关数据,快去添加吧</div>
<div class="btn btn_primary h36 w102" @click="opennew" v-if="isDisableds == false">新增联系人</div>
</div>
</template>
<el-table class="fixed-table" v-else
:data="tableData"
stripe border
style="width: 100%"
:default-sort = "{prop: 'role', order: 'ascending'}"
>
<!--<template slot="empty">-->
<!--<div class="empty">-->
<!--<img src="@/assets/images/project/empty.png">-->
<!--<div class="p1">暂无数据展示</div>-->
<!--<div class="p2">抱歉,你还未添加相关数据,快去添加吧</div>-->
<!--<div class="btn btn_primary h36 w102" @click="opennew" v-if="isDisableds == false">新增联系人</div>-->
<!--</div>-->
<!--</template>-->
<el-table-column
prop="name"
label="姓名"
......@@ -135,7 +144,9 @@
<script>
import "@/assets/styles/project.scss"
import {getLXR,editLXR,addLXR} from '@/api/project/project'
import skeleton from './skeleton'
export default {
components:{skeleton},
name: 'lxr',
props: {
detailId: { //从企业详情跳转过来ID
......@@ -163,6 +174,7 @@
projectname:this.$route.query.projectname,
queryParam:[],
isDisableds:this.isDisabled,
isSkeleton:true,
}
},
created(){
......@@ -180,7 +192,9 @@
this.isnew = false
},
getList(){
this.isSkeleton = true
getLXR(this.searchParam).then(result=>{
this.isSkeleton = false
this.tableData = result.code == 200?result.rows:[]
this.total = result.code == 200?result.total:0
})
......
<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>
......@@ -7,26 +7,26 @@
<el-select class="select" placeholder="企业类型" clearable v-model="searchParam.companyType" @change="handleCurrentChange(1)">
<el-option v-for="(item,index) in companytype" :label="item.dictLabel" :value="item.dictValue"></el-option>
</el-select>
<div class="searchInput">
<el-input type="text" placeholder="输入关键词查询" clearable v-model="searchParam.companyName"></el-input>
<div class="searchInput small">
<el-input type="text" placeholder="输入关键词查询" clearable v-model="searchParam.companyName">
<i slot="prefix" class="el-input__icon"><img src="@/assets/images/project/sousuo.png"></i></el-input>
<div class="btn" @click="handleCurrentChange(1)">搜索</div>
</div>
<div class="btn btn_primary h32 b3" @click="opennew" v-if="isDisableds == false"><div class="img img1"></div>添加相关企业</div>
</div>
<div class="document tables">
<el-table
:data="tableData.rows"
style="width: 100%"
:default-sort = "{prop: 'depth', order: 'descending'}"
>
<template slot="empty">
<div class="empty">
<skeleton v-if="isSkeleton" style="padding-top: 16px"></skeleton>
<div class="empty" v-if="tableData.total == 0">
<img src="@/assets/images/project/empty.png">
<div class="p1">抱歉,没找到相关数据</div>
<div class="p2">建议调整关键词或添加相关企业,重新搜索</div>
<div class="btn btn_primary h36 w102" @click="opennew" v-if="isDisableds==false">新增相关企业</div>
</div>
</template>
<el-table v-else-if="!isSkeleton" class="fixed-table"
:data="tableData.rows"
style="width: 100%"
:default-sort = "{prop: 'depth', order: 'descending'}"
>
<el-table-column
prop="companyName"
label="企业名称"
......@@ -143,7 +143,9 @@
import "@/assets/styles/project.scss"
import {getXGQY,addXGQY,delXGQY} from '@/api/project/project'
import {getDictType,getEnterprise} from '@/api/main'
import skeleton from './skeleton'
export default {
components:{skeleton},
name: 'xgqy',
props: {
detailId: { //从企业详情跳转过来ID
......@@ -189,6 +191,7 @@
isDisableds:this.isDisabled,
showlist:false,
companData:[],
isSkeleton:true,
}
},
created(){
......@@ -261,8 +264,9 @@
})
},
getlist(){
this.isSkeleton = true
getXGQY(this.searchParam).then(result=>{
console.log(result)
this.isSkeleton = false
this.tableData = result
})
},
......
......@@ -340,7 +340,7 @@
getXMSL(){
getXMSL(this.id).then(result=> {
this.xmjd = result.data.projectStage
this.xmjd = !result.data.projectStage?'待添加':result.data.projectStage
if(result.data.labelList == null || result.data.labelList == "" || result.data.labelList == undefined){
this.tipslit = []
}else {
......
......@@ -5,8 +5,10 @@
<div class="cardtitles">资料文档</div>
<div class="searchbtns">
<!--<div class="searchbtns" v-if="fileDatas.rows != null && fileDatas.rows.length>0">-->
<div class="searchInput">
<el-input type="text" v-model="param.keyword" clearable placeholder="输入关键词查询"></el-input>
<div class="searchInput small">
<el-input type="text" v-model="param.keyword" clearable placeholder="输入关键词查询">
<i slot="prefix" class="el-input__icon"><img src="@/assets/images/project/sousuo.png"></i>
</el-input>
<div class="btn" @click="handleCurrentChange(1)">搜索</div>
</div>
<!--<div class="btn btn_primary h32 b2" @click="getUP" v-if="fileDatas.total>0"><div class="img img2"></div>上传</div>-->
......@@ -58,13 +60,8 @@
</div>
</div>
<div class="document tables">
<el-table
:data="fileDatas.rows"
style="width: 100%"
:default-sort = "{prop: 'creatTime', order: 'descending'}"
>
<template slot="empty">
<div class="empty">
<skeleton v-if="isSkeleton" style="padding-top: 16px"></skeleton>
<div class="empty" v-if="fileDatas.total==0">
<img src="@/assets/images/project/empty.png">
<div class="p1">抱歉,没找到相关数据</div>
<div class="p2">建议调整关键词或筛选条件,重新搜索</div>
......@@ -83,6 +80,12 @@
上传文档
</el-upload></div>
</div>
<el-table v-else-if="!isSkeleton" class="fixed-table"
:data="fileDatas.rows"
style="width: 100%"
:default-sort = "{prop: 'creatTime', order: 'descending'}"
>
<template slot="empty">
</template>
<el-table-column
prop="name"
......@@ -147,10 +150,13 @@
</template>
<script>
import "@/assets/styles/project.scss"
import { getToken } from "@/utils/auth";
import { getZLWD ,delZLWD} from "@/api/project/project";
import '@/assets/styles/project.scss'
import { getToken } from '@/utils/auth'
import { delZLWD, getZLWD } from '@/api/project/project'
import skeleton from './skeleton'
export default {
components:{skeleton},
name: 'zlwd',
props: {
detailId: { //从企业详情跳转过来ID
......@@ -181,6 +187,7 @@
ondel:"",
isDisableds:this.isDisabled,
keys:1,
isSkeleton:true,
}
},
created(){
......@@ -195,8 +202,10 @@
this.handleCurrentChange(1)
},
getList(){
this.isSkeleton = true
getZLWD(this.param).then(res=>{
this.fileDatas = res
this.isSkeleton = false
if(this.fileDatas.rows!=null && this.fileDatas.rows.length>0){
this.fileDatas.rows.forEach(item=>{
let names = item.filePath.split('/')
......@@ -300,6 +309,7 @@
</script>
<style lang="scss" scoped>
v-deep.el-upload:focus{
color: #FFFFFF !important;
}
......@@ -382,7 +392,4 @@
}
}
}
.searchInput .el-input{
width: 68%;
}
</style>
......@@ -10,7 +10,7 @@
<el-tab-pane label="公司全部项目" name="second"></el-tab-pane>
<div class="searchInput">
<el-input type="text" v-model="searchParam.projectName" placeholder="请输入项目或业主单位名称关键词进行搜索"></el-input>
<el-input type="text" style="width: 530px;" v-model="searchParam.projectName" placeholder="请输入项目或业主单位名称关键词进行搜索"></el-input>
<div class="btn" @click="getList(1)">搜索</div>
</div>
<div class="sellist">
......@@ -104,7 +104,9 @@
<!--</el-tooltip>-->
</div>
</div>
<div class="tables" v-if="total == 0">
<skeleton v-if="isSkeleton" style="padding: 16px"></skeleton>
<div class="tables" v-if="total == 0 && !isSkeleton">
<div class="empty">
<img src="@/assets/images/project/empty.png">
<div class="p1">抱歉,没找到相关数据</div>
......@@ -113,7 +115,7 @@
<div class="btn btn_primary btn_shallow h36 w88" @click="pldrs">批量导入</div>
</div>
</div>
<div class="datalist">
<div class="datalist" v-if="!isSkeleton">
<div class="datali" v-for="(item,index) in datalist">
<div class="det-title" @click="toDetail(item.id,'xmsl')">
{{item.projectName}}<span v-if="activeName!='first' && item.followTime" class="people"><i>{{item.nickName1}}</i>
......@@ -182,9 +184,10 @@
import {getDictType,} from '@/api/main'
import addproject from './component/addProject'
import batchimport from './component/batchImport'
import skeleton from './component/skeleton'
export default {
name: 'ProjectList',
components:{addproject,batchimport},
components:{addproject,batchimport,skeleton},
data() {
return {
types:'project',
......@@ -240,6 +243,7 @@ export default {
datalist:[],//列表数据
ondel:-1,
total:0,
isSkeleton:true
}
},
created() {
......@@ -289,6 +293,7 @@ export default {
},
//获取商机列表
getList(pageNum){
this.isSkeleton = true
this.searchParam.pageNum = pageNum
if(this.activeName == 'first'){
this.searchParam.userId = this.$store.state.user.userId
......@@ -297,6 +302,7 @@ export default {
}
this.searchParam.ownerCompany = this.searchParam.projectName
getProjectlist(this.searchParam).then(result=>{
this.isSkeleton = false
if(result.code == 200){
this.datalist = result.rows
this.total = result.total
......@@ -382,7 +388,7 @@ export default {
this.$router.push({ path: '/project/projectList/detail', query: {id:id,tag:tag} });
},
handleClick(){
this.getList(1)
this.reset()
},
handleChange(value) {
// console.log(value);
......@@ -594,6 +600,7 @@ export default {
font-size: 16px;
font-weight: 700;
line-height: 23px;
padding-right: 190px;
.people{
padding-left: 10px;
color: #4f4f4f;
......
......@@ -98,7 +98,7 @@
{{textList.projectDuration}}
</template>
<template v-else>
'--'
--
</template>
</span>
<label class="label">项目属地</label>
......@@ -195,12 +195,12 @@
<p>
<label class="label">招标人联系方式</label>
<span>{{textList.tendereeTel||'--'}}</span>
<label class="label">招标人联系地址</label>
<span>{{textList.tendereeAddress||'--'}}</span>
</p>
<p>
<label class="label">代理机构联系方式</label>
<span>{{textList.agencyTel||'--'}}</span>
</p>
<p>
<label class="label">招标人联系地址</label>
<span>{{textList.tendereeAddress||'--'}}</span>
<label class="label">代理机构联系地址</label>
<span>{{textList.agencyAddress||'--'}}</span>
</p>
......
......@@ -137,7 +137,39 @@
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<el-dropdown @command="PlanTenderDatehandleCommand" trigger="click" placement="bottom-start" class="el-dropdown-land" ref="PlanTenderDateShowPopper" :hide-on-click="false" >
<span class="el-dropdown-link" :class="PlanTenderDateValue ? 'color_text' : ''" >
计划招标时间{{ PlanTenderDateValue ? " 1项" : ""}}
<i class="el-icon-caret-bottom"></i>
</span>
<div>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item v-for="(item, i) in PlanTenderDateOptions" class="el-dropdown-land" :class=" PlanTenderDateValue && PlanTenderDateValue == item.value ? 'color_text': '' " :key="i" :command="item.value">
<div @mouseenter="hidePoper1">{{ item.label }}</div>
</el-dropdown-item>
<el-dropdown-item command="自定义" style="padding: 0; text-indent: 20px">
<div @mouseenter="mouseenter1">
<span :class="PlanTenderDateValue == '自定义' ? 'color_text' : ''">
自定义<i class="el-icon-arrow-right"></i>
</span>
<el-date-picker
v-if="PlanTenderDateShowPopper"
@change="changePlanTenderDate"
class="land_date_picker"
v-model="PlanTenderDate"
ref="datePicker1"
value-format="yyyy-MM-dd"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
>
</el-date-picker>
</div>
</el-dropdown-item>
</el-dropdown-menu>
</div>
</el-dropdown>
<div class="select-popper">
<span :class="{ color_text: jskBidPlanDto.projectCapitalSource.length }">
资金来源{{jskBidPlanDto.projectCapitalSource.length? jskBidPlanDto.projectCapitalSource.length + "项": ""}}
......@@ -317,6 +349,35 @@ export default {
IssueTimeValue: "",
IssueTime: "",
IssueTimeShowPopper: false,
PlanTenderDateOptions: [
{
label: "不限",
value: "",
},
{
label: "今天",
value: "今天",
},
{
label: "未来3天",
value: "未来3天",
},
{
label: "未来7天",
value: "未来7天",
},
{
label: "未来1个月",
value: "未来1个月",
},
{
label: "未来3个月",
value: "未来3个月",
},
],
PlanTenderDateValue: "",
PlanTenderDate: "",
PlanTenderDateShowPopper: false,
addressList: [],
addressType: [],
......@@ -370,6 +431,8 @@ export default {
projectCapitalSource:[],
startIssueTime:'',
endIssueTime:'',
startPlanTenderDate:'',
endPlanTenderDate:'',
},
planTenderAmountShowPopper:false,
......@@ -528,7 +591,6 @@ export default {
delete params.keywordNot
}
api.jskBidPlanPage(params).then(res=>{
console.log(res);
if (res.code==200) {
this.tableData=res.data.list;
this.total=res.data.total;
......@@ -661,6 +723,93 @@ export default {
}
this.jskBidPlanDto = obj;
},
PlanTenderDatehandleCommand(command) {
var obj = JSON.parse(JSON.stringify(this.jskBidPlanDto));
if (command && command != "自定义") {
this.PlanTenderDateValue = command;
this.$refs.PlanTenderDateShowPopper.hide();
const datetime = new Date();
var startTime, endTime, Year, Month, Day;
Year = datetime.getFullYear();
Month = datetime.getMonth() + 1;
Day = datetime.getDate();
switch (command) {
case "今天":
startTime = Year + "-" + Month +"-" + Day;
endTime = Year + "-" + Month + "-" + Day;
break;
case "未来3天":
startTime = Year + "-" + Month + "-" + Day;
endTime = this.getDate(3)
break;
case "未来7天":
startTime = Year + "-" + Month + "-" + Day;
endTime = this.getDate(7)
break;
case "未来1个月":
startTime = Year + "-" + Month + "-" + Day;
if (Month == 12) {
endTime = Year+1 + "-01-" + + Day;
} else {
endTime = Year + "-" + (Month + 1) + "-" + Day;
}
break;
case "未来3个月":
startTime = Year + "-" + Month + "-" + Day;
if (Month >9) {
endTime = Year+1 + "-" + Month-9 + "-" + + Day;
} else {
endTime = Year + "-" + (Month + 3) + "-" + Day;
}
break;
case "自定义":
if (!this.PlanTenderDate) {
this.PlanTenderDateValue = "";
}
break;
}
if(startTime){
var start=startTime.split('-');
startTime=start.map((item)=>{
if(item.length==1){
return '0'+item
}else{
return item
}
})
startTime=startTime.join('-')
}
if(endTime){
var end=endTime.split('-');
endTime=end.map((item)=>{
if(item.length==1){
return '0'+item
}else{
return item
}
})
endTime=endTime.join('-')
}
obj.startPlanTenderDate = startTime;
obj.endPlanTenderDate = endTime;
} else if (command == "自定义") {
this.$refs.datePicker1.pickerVisible = true;
} else {
this.$refs.PlanTenderDateShowPopper.hide();
this.PlanTenderDateValue = "";
this.PlanTenderDate = "";
obj.startPlanTenderDate = "";
obj.endPlanTenderDate = "";
}
this.jskBidPlanDto = obj;
},
getDate(n){
let date1 = new Date();
let date2 = new Date(date1);
date2.setDate(date1.getDate() + n);
let time2 = date2.getFullYear() + "-" + ("0" + (date2.getMonth() + 1)).slice(-2) + "-" + ("0" + date2.getDate()).slice(-2);
return time2
},
changeIssueTime(type) {
if(type=='bid'&&this.tenderDate){
this.tenderDateValue = "自定义";
......@@ -676,6 +825,21 @@ export default {
this.jskBidPlanDto = obj;
}
},
changePlanTenderDate(type) {
if(type=='bid'&&this.tenderDate){
this.tenderDateValue = "自定义";
var obj = JSON.parse(JSON.stringify(this.jskBidPlanDto));
obj.startTenderTime = this.tenderDate[0];
obj.endTenderTime = this.tenderDate[1];
this.jskBidPlanDto = obj;
}else if(this.PlanTenderDate) {
this.PlanTenderDateValue = "自定义";
var obj = JSON.parse(JSON.stringify(this.jskBidPlanDto));
obj.startPlanTenderDate = this.PlanTenderDate[0];
obj.endPlanTenderDate = this.PlanTenderDate[1];
this.jskBidPlanDto = obj;
}
},
hidePoper(type) {
if(type=='bid'&&this.$refs.tenderDatePicker){
this.$refs.tenderDatePicker.pickerVisible = false;
......@@ -683,6 +847,13 @@ export default {
this.$refs.datePicker.pickerVisible = false;
}
},
hidePoper1(type) {
if(type=='bid'&&this.$refs.tenderDatePicker){
this.$refs.tenderDatePicker.pickerVisible = false;
}else if(this.$refs.datePicker1){
this.$refs.datePicker1.pickerVisible = false;
}
},
mouseenter(type) {
if(type=='bid'){
this.tenderDateShowPopper = true;
......@@ -700,6 +871,23 @@ export default {
}
}
},
mouseenter1(type) {
if(type=='bid'){
this.tenderDateShowPopper = true;
if(this.tenderDateValue=="自定义"){
this.$nextTick(() => {
this.$refs.tenderDatePicker.pickerVisible = true;
});
}
}else{
this.PlanTenderDateShowPopper = true;
if(this.PlanTenderDateValue=="自定义"){
this.$nextTick(() => {
this.$refs.datePicker1.pickerVisible = true;
});
}
}
},
clearIssueTime(type) {
var obj = JSON.parse(JSON.stringify(this.jskBidPlanDto));
if(type=='bid'){
......@@ -715,6 +903,21 @@ export default {
}
this.jskBidPlanDto = obj;
},
clearPlanTenderDate(type) {
var obj = JSON.parse(JSON.stringify(this.jskBidPlanDto));
if(type=='bid'){
this.tenderDate = "";
this.tenderDateValue = "";
obj.startTenderTime = "";
obj.endTenderTime = "";
}else{
this.PlanTenderDate = "";
this.PlanTenderDateValue = "";
obj.startPlanTenderDate = "";
obj.endPlanTenderDate = "";
}
this.jskBidPlanDto = obj;
},
deleteDomicile() {
this.$refs.address.handleClear();
},
......
......@@ -202,7 +202,7 @@
<span class="list-label list-label-zb" v-if="item.domicile">
{{item.domicile}}
</span>
<span class="list-label list-label-zb" v-if="item.tenderingManner&&item.tenderingManner!='其他'&&item.tenderingManner!='空白'">
<span class="list-label list-label-zb" v-if="item.tenderingManner&&item.tenderingManner!='其他'&&item.tenderingManner!='空白'&&item.tenderingManner!='未知'">
{{ item.tenderingManner}}
</span>
<span class="list-label list-label-lx" v-if="item.projectType&&item.projectType!='其他'&&item.projectType!='空白'">
......
......@@ -13,7 +13,7 @@
<div class="list">
<div class="item color1">
<div class="item-left">
<h4 v-if="textList.projectTotalInvestment">{{textList.projectTotalInvestment}}<span></span></h4>
<h4 v-if="textList.projectTotalInvestment">{{textList.projectTotalInvestment}}<span>亿</span></h4>
<h4 v-else>
--
</h4>
......@@ -23,7 +23,7 @@
</div>
<div class="item color2">
<div class="item-left">
<h4 v-if="textList.projectCapital">{{textList.projectCapital}}<span></span></h4>
<h4 v-if="textList.projectCapital">{{textList.projectCapital}}<span>亿</span></h4>
<h4 v-else>
--
</h4>
......@@ -33,7 +33,7 @@
</div>
<div class="item color3">
<div class="item-left">
<h4 v-if="textList.econData_013">{{textList.econData_013}}<span></span></h4>
<h4 v-if="textList.econData_013">{{textList.econData_013}}<span>亿</span></h4>
<h4 v-else>
--
</h4>
......@@ -43,7 +43,7 @@
</div>
<div class="item color4">
<div class="item-left">
<h4 v-if="textList.specialBondCapital">{{textList.specialBondCapital}}<span></span></h4>
<h4 v-if="textList.specialBondCapital">{{textList.specialBondCapital}}<span>亿</span></h4>
<h4 v-else>
--
</h4>
......@@ -55,7 +55,7 @@
<div class="list">
<div class="item color4">
<div class="item-left">
<h4 v-if="textList.otherFunds">{{textList.otherFunds}}<span></span></h4>
<h4 v-if="textList.otherFunds">{{textList.otherFunds}}<span>亿</span></h4>
<h4 v-else>
--
</h4>
......@@ -65,7 +65,7 @@
</div>
<div class="item color3">
<div class="item-left">
<h4 v-if="textList.specialBondIssue_number">{{textList.specialBondIssue_number}}<span>元/ 10只</span></h4>
<h4 v-if="textList.specialBondIssue_number">{{textList.specialBondIssue_number}}<span>亿元/ 10只</span></h4>
<h4 v-else>
--
</h4>
......@@ -75,7 +75,7 @@
</div>
<div class="item color4">
<div class="item-left">
<h4 v-if="textList.otherFinancing">{{textList.otherFinancing}}<span></span></h4>
<h4 v-if="textList.otherFinancing">{{textList.otherFinancing}}<span>亿</span></h4>
<h4 v-else>
--
</h4>
......@@ -85,7 +85,7 @@
</div>
<div class="item color2">
<div class="item-left">
<h4 v-if="textList.govSupportFunds">{{textList.govSupportFunds}}<span></span></h4>
<h4 v-if="textList.govSupportFunds">{{textList.govSupportFunds}}<span>亿</span></h4>
<h4 v-else>
--
</h4>
......@@ -126,7 +126,7 @@
</p>
<p>
<label class="label">项目预测总收益</label>
<span v-if="textList.projectForecastTotalRevenue">{{textList.projectForecastTotalRevenue}}</span>
<span v-if="textList.projectForecastTotalRevenue">{{textList.projectForecastTotalRevenue}}亿</span>
<span v-else>--</span>
</p>
</div>
......@@ -159,7 +159,7 @@
</el-table-column>
<el-table-column prop="tenderDate" label="招标日期" width="220" />
<el-table-column prop="actualBondIssueScale" label="专项债规模(亿)" width="260" />
<el-table-column prop="isUsedProjectScale" label="用于项目规模(万元)" width="260" />
<el-table-column prop="isUsedProjectScale" label="用于项目规模(亿)" width="260" />
<el-table-column label="是否资本金" width="200">
<template slot-scope="scope">
......
......@@ -14,7 +14,7 @@
</div>
<p class="solid"></p>
</div>
<!-- 企业专项债 -->
<!-- 政府专项债 -->
<debtProject v-if="personnelHerf=='debtProject'" />
<!-- 土地交易 -->
<Land v-if="personnelHerf=='Land'" />
......@@ -52,7 +52,7 @@
personnelList: [{
key: 'debtProject',
status: true,
value: '企业专项债项目',
value: '政府专项债项目',
},
{
......
......@@ -34,6 +34,7 @@ module.exports = {
proxy: {
// detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: {
// target: `http://47.104.91.229:9099/prod-api`,
target: `http://122.9.160.122:9011`,
// target: `http://192.168.60.126:9011`,
// target: `http://192.168.60.27:8766`,
......
......@@ -35,6 +35,10 @@ public class CustomerFollowRecord implements Serializable {
* 拜访方式(visit_mode_type)
*/
private String visitMode;
/**
* 拜访时间
*/
private Date visitTime;
/**
* 下次拜访时间
*/
......
......@@ -18,5 +18,9 @@ public class CustomerSearchDto implements Serializable {
* 用户id
*/
private Long userId;
/**
* 客户状态 0:正常 1:历史
*/
private Integer status;
}
......@@ -40,9 +40,15 @@ public class CustomerFollowRecordListVo implements Serializable {
* 拜访方式(visit_mode_type)
*/
private String visitMode;
/**
* 拜访时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date visitTime;
/**
* 下次拜访时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date nextVisitTime;
/**
* 拜访对象姓名
......
......@@ -20,5 +20,9 @@ public class CustomerStatusListVo implements Serializable {
* 城投id
*/
private String uipId;
/**
* 企业名称
*/
private String companyName;
}
......@@ -121,6 +121,12 @@ public class EnterpriseProjectService {
return dskOpenApiUtil.responsePage(map);
}
public R bidPlanProjectType(EnterpriseProjectBidPlanProjectTypeBody body) throws Exception {
if (body.isVaildCid()) return R.ok(new ArrayList<>());
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseProject/bidPlanProjectType", BeanUtil.beanToMap(body, false, false));
return BeanUtil.toBean(map, R.class);
}
public R bidPlanDetail(EnterpriseProjectBidPlanDetailBody body) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseProject/bidPlanDetail", BeanUtil.beanToMap(body, false, false));
......
......@@ -19,6 +19,7 @@ import org.apache.commons.collections4.MapUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
......@@ -58,6 +59,7 @@ public class EnterpriseService {
companyData.put("uipId", null);
companyData.put("claimStatus", 0);
companyData.put("bratingSubjectLevel", null);
String companyName = MapUtils.getString(companyData, "companyName", "");
Map<String, Object> map = BeanUtil.beanToMap(body, false, false);
map.put("cid", body.getCompanyId());
......@@ -73,6 +75,11 @@ public class EnterpriseService {
ArrayList<String> uipIds = new ArrayList<>();
uipIds.add(uipId);
companyData.put("claimStatus", CollectionUtils.isEmpty(iCustomerService.selectStatusList(uipIds)) ? 0 : 1);
} else {
Integer status = iCustomerService.status(companyName);
if (ObjectUtil.isNotEmpty(status)) {
companyData.put("claimStatus", status.equals(0) ? 1 : 0);
}
}
Map<String, Object> bondCreditRatingMap = dskOpenApiUtil.requestBody("/operate/enterprise/bondCreditRating", map);
......@@ -224,6 +231,42 @@ public class EnterpriseService {
for (Object companyObj : list) {
Map<String, Object> companyMap = CommonUtils.assertAsMap(companyObj);
String uipId = MapUtils.getString(companyMap, "uipId");
companyMap.put("bondBalance",MapUtils.getDouble(companyMap, "bondBalance")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "bondBalance")));
companyMap.put("totalAssets",MapUtils.getDouble(companyMap, "totalAssets")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "totalAssets")));
companyMap.put("belongNetAssets",MapUtils.getDouble(companyMap, "belongNetAssets")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "belongNetAssets")));
companyMap.put("monetaryFunds",MapUtils.getDouble(companyMap, "monetaryFunds")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "monetaryFunds")));
companyMap.put("landAssets",MapUtils.getDouble(companyMap, "landAssets")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "landAssets")));
companyMap.put("restrictedAssets",MapUtils.getDouble(companyMap, "restrictedAssets")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "restrictedAssets")));
companyMap.put("accountsReceivable",MapUtils.getDouble(companyMap, "accountsReceivable")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "accountsReceivable")));
companyMap.put("otherReceivable",MapUtils.getDouble(companyMap, "otherReceivable")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "otherReceivable")));
companyMap.put("econData_001",MapUtils.getDouble(companyMap, "econData_001")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "econData_001")));
companyMap.put("govSubsidy",MapUtils.getDouble(companyMap, "govSubsidy")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "govSubsidy")));
companyMap.put("specialPayable",MapUtils.getDouble(companyMap, "specialPayable")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "specialPayable")));
companyMap.put("operatingIncome",MapUtils.getDouble(companyMap, "operatingIncome")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "operatingIncome")));
companyMap.put("belongNetProfit",MapUtils.getDouble(companyMap, "belongNetProfit")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "belongNetProfit")));
companyMap.put("roe",MapUtils.getDouble(companyMap, "roe")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "roe")));
companyMap.put("netOperatingCashFlow",MapUtils.getDouble(companyMap, "netOperatingCashFlow")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "netOperatingCashFlow")));
companyMap.put("netFinancingCashFlow",MapUtils.getDouble(companyMap, "netFinancingCashFlow")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "netFinancingCashFlow")));
companyMap.put("netInvestmentCashFlow",MapUtils.getDouble(companyMap, "netInvestmentCashFlow")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "netInvestmentCashFlow")));
companyMap.put("totalLiabilities",MapUtils.getDouble(companyMap, "totalLiabilities")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "totalLiabilities")));
companyMap.put("uipInterestBearingDebt",MapUtils.getDouble(companyMap, "uipInterestBearingDebt")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "uipInterestBearingDebt")));
companyMap.put("econData_002",MapUtils.getDouble(companyMap, "econData_002")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "econData_002")));
companyMap.put("ofcb",MapUtils.getDouble(companyMap, "ofcb")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "ofcb")));
companyMap.put("cashRatio",MapUtils.getDouble(companyMap, "cashRatio")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "cashRatio")));
companyMap.put("cashFlowRatio",MapUtils.getDouble(companyMap, "cashFlowRatio")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "cashFlowRatio")));
companyMap.put("cashDebtRatio",MapUtils.getDouble(companyMap, "cashDebtRatio")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "cashDebtRatio")));
companyMap.put("creditBalance",MapUtils.getDouble(companyMap, "creditBalance")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "creditBalance")));
companyMap.put("econData_003",MapUtils.getDouble(companyMap, "econData_003")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "econData_003")));
companyMap.put("ebitdaIcr",MapUtils.getDouble(companyMap, "ebitdaIcr")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "ebitdaIcr")));
companyMap.put("ppnBalanceProp",MapUtils.getDouble(companyMap, "ppnBalanceProp")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "ppnBalanceProp")));
companyMap.put("econData_004",MapUtils.getDouble(companyMap, "econData_004")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "econData_004")));
companyMap.put("econData_005",MapUtils.getDouble(companyMap, "econData_005")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "econData_005")));
companyMap.put("econData_006",MapUtils.getDouble(companyMap, "econData_006")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "econData_006")));
companyMap.put("nonStandardBalance",MapUtils.getDouble(companyMap, "nonStandardBalance")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "nonStandardBalance")));
companyMap.put("nonStandardRatio",MapUtils.getDouble(companyMap, "nonStandardRatio")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "nonStandardRatio")));
companyMap.put("guaranteeAmount",MapUtils.getDouble(companyMap, "guaranteeAmount")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "guaranteeAmount")));
companyMap.put("guaranteeRatio",MapUtils.getDouble(companyMap, "guaranteeRatio")==null?null:String.format("%.2f", MapUtils.getDouble(companyMap, "guaranteeRatio")));
companyMap.put("claimStatus", 0);
for (CustomerStatusListVo vo : claimStatusList) {
if (uipId.equals(vo.getUipId())) {
......@@ -235,6 +278,14 @@ public class EnterpriseService {
return new TableDataInfo(list, MapUtils.getInteger(data, "totalCount", 0));
}
public static void main(String[] args) {
String str = String.format("%1$.2f", 0.0456);
System.out.println(str);
String format = String.format("%.2f", null);
System.out.println(format);
}
public R uipGroupData() throws Exception {
String redisKey = CacheConstants.DATA_UIPGROUPDATA;
......@@ -270,4 +321,27 @@ public class EnterpriseService {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterprise/getUipIdByCid", paramMap);
return BeanUtil.toBean(map, R.class);
}
public R financialData(EnterpriseFinancialDataBody body) throws Exception {
if (body.isValidateCid()) {
return R.ok();
}
String redisKey = CacheConstants.DATA_FINANCIAL + body.getCid();
List cacheMap = redisCache.getCacheList(redisKey);
if (ObjectUtil.isNotEmpty(cacheMap)) {
return R.ok(cacheMap);
}
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterprise/financialData", BeanUtil.beanToMap(body, false, false));
Integer code = MapUtils.getInteger(map, "code", 300);
if (!code.equals(HttpStatus.OK.value())) {
throw new RuntimeException();
}
Object data = map.get("data");
if (ObjectUtil.isNotEmpty(data)) {
redisCache.setCacheList(redisKey, (List)data);
redisCache.expire(redisKey, 24, TimeUnit.HOURS);
}
return BeanUtil.toBean(map, R.class);
}
}
......@@ -76,8 +76,8 @@ public interface BusinessInfoMapper extends BaseMapper<BusinessInfo>
public int deleteBusinessInfoById(Long id);
/**
* 批量删除项目详情
*
* 批量删除项目
* 项目关联的其他所有表数据一并删除
* @param ids 需要删除的数据主键集合
* @return 结果
*/
......
......@@ -28,7 +28,9 @@ public interface CustomerMapper extends BaseMapper<Customer> {
List<CustomerStatusListVo> selectStatusList(@Param("uipIds") List<String> uipIds, @Param("userId") Long userId);
List<String> selectUipIdList(@Param("uipIds") List<String> uipIds, @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);
}
......@@ -3,6 +3,8 @@ package com.dsk.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.system.domain.customer.CustomerUser;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
/**
......@@ -14,5 +16,7 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface CustomerUserMapper extends BaseMapper<CustomerUser> {
CustomerUser selectByCustomerIdAndUserId(@Param("customerId") String customerId,@Param("userId") Long userId);
}
......@@ -29,6 +29,14 @@ public interface ICustomerService {
List<CustomerStatusListVo> selectStatusList(List<String> uipIds);
List<String> selectUipIdList(List<String> uipIds);
List<CustomerStatusListVo> selectStatusListByCompanyName(List<String> companyNames);
// List<String> selectUipIdList(List<String> uipIds);
Integer status(String companyName);
boolean cancelClaim(String companyName);
boolean historyClaim(String companyName);
}
......@@ -228,15 +228,25 @@ public class BusinessInfoServiceImpl implements IBusinessInfoService {
}
/**
* 批量删除项目详情
*
* 批量删除项目
* 项目关联的其他所有表数据一并删除
* @param ids 需要删除的项目详情主键
* @return 结果
*/
@Override
@Transactional
public int deleteBusinessInfoByIds(Long[] ids) {
return businessInfoMapper.deleteBusinessInfoByIds(ids);
//删除项目详情,用户关联项目,项目工作代办,项目联系人,项目跟进记录,项目标签,项目相关企业
int deleteBusiness = businessInfoMapper.deleteBusinessInfoByIds(ids);
//删除项目上传的文件
for (Long id : ids) {
try {
FileUtils.delFolder(RuoYiConfig.getUploadPath() + id);
} catch (Exception e) {
e.printStackTrace();
}
}
return deleteBusiness;
}
/**
......
......@@ -48,6 +48,7 @@ public class CustomerServiceImpl implements ICustomerService {
@Override
public List<CustomerListVo> selectList(CustomerSearchDto dto) {
dto.setUserId(SecurityUtils.getUserId());
dto.setStatus(ObjectUtils.isEmpty(dto.getStatus()) ? 0 : dto.getStatus());
return baseMapper.selectList(dto);
}
......@@ -118,10 +119,53 @@ public class CustomerServiceImpl implements ICustomerService {
return baseMapper.selectStatusList(uipIds, SecurityUtils.getUserId());
}
@Override
public List<CustomerStatusListVo> selectStatusListByCompanyName(List<String> companyNames) {
return baseMapper.selectStatusListByCompanyName(companyNames, SecurityUtils.getUserId());
}
// @Override
// public List<String> selectUipIdList(List<String> uipIds) {
// return baseMapper.selectUipIdList(uipIds, SecurityUtils.getUserId());
// }
@Override
public Integer status(String companyName) {
Customer cus = baseMapper.selectByCompanyNameAndUserId(companyName, SecurityUtils.getUserId());
if (ObjectUtils.isEmpty(cus)) {
return null;
}
CustomerUser customerUser = customerUserMapper.selectByCustomerIdAndUserId(cus.getCustomerId(), SecurityUtils.getUserId());
if (ObjectUtils.isEmpty(customerUser)) {
throw new ServiceException("数据错误!");
}
return customerUser.getStatus();
}
@Override
public List<String> selectUipIdList(List<String> uipIds) {
return baseMapper.selectUipIdList(uipIds, SecurityUtils.getUserId());
public boolean cancelClaim(String companyName) {
return updateClaimStatus(companyName, 1);
}
@Override
public boolean historyClaim(String companyName) {
return updateClaimStatus(companyName, 0);
}
//修改客户认领状态
private boolean updateClaimStatus(String companyName, Integer status) {
Customer cus = baseMapper.selectByCompanyNameAndUserId(companyName, SecurityUtils.getUserId());
if (ObjectUtils.isEmpty(cus)) {
throw new ServiceException("数据错误!");
}
CustomerUser customerUser = customerUserMapper.selectByCustomerIdAndUserId(cus.getCustomerId(), SecurityUtils.getUserId());
if (ObjectUtils.isEmpty(customerUser)) {
throw new ServiceException("数据错误!");
}
customerUser.setStatus(status);
return customerUserMapper.updateById(customerUser) == 1;
}
}
......@@ -2,14 +2,21 @@ package com.dsk.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.dsk.common.constant.CacheConstants;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.core.redis.RedisCache;
import com.dsk.common.dtos.*;
import com.dsk.common.utils.DateUtils;
import com.dsk.common.utils.DskOpenApiUtil;
import com.dsk.common.utils.SecurityUtils;
import com.dsk.system.service.EconomicService;
import org.springframework.beans.factory.annotation.Autowired;
import org.apache.commons.collections4.MapUtils;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
......@@ -22,9 +29,12 @@ import java.util.Map;
@Service
public class EconomicServiceImpl implements EconomicService {
@Autowired
@Resource
private DskOpenApiUtil dskOpenApiUtil;
@Resource
private RedisCache redisCache;
@Override
public AjaxResult nationalPage(OpRegionalEconomicDataV1PageDto dto) {
if (ObjectUtil.isEmpty(dto.getYear())) {
......@@ -48,7 +58,27 @@ public class EconomicServiceImpl implements EconomicService {
@Override
public AjaxResult location(OpRegionalLocalDto detailsDto) {
Long userId = SecurityUtils.getLoginUser().getUserId();
String redisKey = CacheConstants.PERSONAL_LOCATION + userId;
if (ObjectUtil.isEmpty(detailsDto.getProvinceId()) && ObjectUtil.isEmpty(detailsDto.getCityId()) && ObjectUtil.isEmpty(detailsDto.getAreaId())) {
if (ObjectUtil.isNotEmpty(redisKey)) {
Map<String, Object> cacheMap = redisCache.getCacheMap(redisKey);
if (MapUtils.isNotEmpty(cacheMap)) {
return AjaxResult.success(cacheMap);
}
}
}
Map<String, Object> map = dskOpenApiUtil.requestBody("/economic/location", BeanUtil.beanToMap(detailsDto, false, false));
Integer code = MapUtils.getInteger(map, "code", 300);
if (!code.equals(HttpStatus.OK.value())) {
throw new RuntimeException();
}
Map data = MapUtils.getMap(map, "data", null);
if (ObjectUtil.isNotEmpty(detailsDto.getProvinceId()) || ObjectUtil.isNotEmpty(detailsDto.getCityId()) || ObjectUtil.isNotEmpty(detailsDto.getAreaId())) {
redisCache.setCacheMap(redisKey, data);
}
return BeanUtil.toBean(map, AjaxResult.class);
}
......
package com.dsk.system.service.impl;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import com.dsk.system.domain.BusinessExcelDto;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
......@@ -13,6 +8,11 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* @author lxl
* @Description:
......@@ -120,25 +120,29 @@ public class ReadBusinessInfoExcel {
for (int c = 0; c < this.totalCells; c++) {
Cell cell = row.getCell(c);
if (null != cell) {
//项目名称
if (c == 0) {
//如果是纯数字,比如你写的是25,cell.getNumericCellValue()获得是25.0,通过截取字符串去掉.0获得25
if (cell.getCellType() == CellType.NUMERIC) {
String name = String.valueOf(cell.getNumericCellValue());
businessExcelDto.setProjectName(name.substring(0, name.length() - 2 > 0 ? name.length() - 2 : 1));//项目名称
businessExcelDto.setProjectName(name.substring(0, name.length() - 2 > 0 ? name.length() - 2 : 1));
} else {
businessExcelDto.setProjectName(cell.getStringCellValue());//名称
businessExcelDto.setProjectName(cell.getStringCellValue());
}
//业主单位
} else if (c == 1) {
if (cell.getCellType() == CellType.NUMERIC) {
String company = String.valueOf(cell.getNumericCellValue());
businessExcelDto.setOwnerCompany(company.substring(0, company.length() - 2 > 0 ? company.length() - 2 : 1));//业主单位
businessExcelDto.setOwnerCompany(company.substring(0, company.length() - 2 > 0 ? company.length() - 2 : 1));
} else {
businessExcelDto.setOwnerCompany(cell.getStringCellValue());//性别
businessExcelDto.setOwnerCompany(cell.getStringCellValue());
}
//投资估算(万元)
} else if (c == 2) {
if (cell.getCellType() == CellType.NUMERIC) {
String amount = String.valueOf(cell.getNumericCellValue());
businessExcelDto.setInvestmentAmount(amount.substring(0, amount.length() - 2 > 0 ? amount.length() - 2 : 1));//投资估算(万元)
// businessExcelDto.setInvestmentAmount(amount.substring(0, amount.length() - 2 > 0 ? amount.length() - 2 : 1));
businessExcelDto.setInvestmentAmount(amount);
} else {
businessExcelDto.setInvestmentAmount(cell.getStringCellValue());
}
......
......@@ -4,7 +4,6 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.dsk.acc.openapi.client.util.CommonUtils;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.core.domain.model.EnterpriseInfoHeaderBody;
import com.dsk.common.dtos.ComposeQueryDto;
import com.dsk.common.utils.DskOpenApiUtil;
import com.dsk.system.service.RegionalEnterprisesService;
......@@ -14,8 +13,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* @ClassName RegionalEnterprisesServiceImpl
......@@ -37,45 +35,91 @@ public class RegionalEnterprisesServiceImpl implements RegionalEnterprisesServic
if (code.equals(HttpStatus.OK.value())) {
Map data = MapUtils.getMap(map, "data", null);
List<Object> list = CommonUtils.assertAsArray(MapUtils.getObject(data, "list", ""));
// 常合作客户
List<Integer> getTopCustomerIds = getTopCustomerIds(list);
Map<String,Object> topCustomerIdsMap = new HashMap<>(1);
topCustomerIdsMap.put("ids", getTopCustomerIds);
Map<String, Object> topCustomerMap = dskOpenApiUtil.requestBody("/operate/enterprise/selectCompanyNameList", topCustomerIdsMap);
// 常合作供应商
List<Integer> getTopSupplierIds = getTopSupplierIds(list);
Map<String,Object> topSupplierIdsMap = new HashMap<>(1);
topSupplierIdsMap.put("ids", getTopSupplierIds);
Map<String, Object> topSupplierMap = dskOpenApiUtil.requestBody("/operate/enterprise/selectCompanyNameList", topSupplierIdsMap);
if (CollectionUtils.isNotEmpty(list)) {
for (Object companyObj : list) {
Map<String, Object> companyMap = CommonUtils.assertAsMap(companyObj);
companyMap.put("topCustomer", null);
//常合作客户id
Integer topCustomerId = MapUtils.getInteger(companyMap, "topCustomerId");
EnterpriseInfoHeaderBody body = new EnterpriseInfoHeaderBody();
body.setCompanyId(topCustomerId);
if (ObjectUtil.isNotEmpty(topCustomerId)) {
Map<String, Object> infoHeaderMap = dskOpenApiUtil.requestBody("/api/jsk/enterprise/infoHeader", BeanUtil.beanToMap(body, false, false));
Integer infoHeaderCode = MapUtils.getInteger(infoHeaderMap, "code", 300);
if (infoHeaderCode.equals(HttpStatus.OK.value())) {
Map infoHeaderData = MapUtils.getMap(infoHeaderMap, "data", null);
String companyName = MapUtils.getString(infoHeaderData, "companyName", null);
Integer topCustomerCode = MapUtils.getInteger(topCustomerMap, "code", 300);
if (topCustomerCode.equals(HttpStatus.OK.value())) {
List<Map<String, Object>> companyNameList = (List<Map<String, Object>>)MapUtils.getObject(topCustomerMap, "data", null);
for (Map<String, Object> comMap : companyNameList) {
Integer id = MapUtils.getInteger(comMap, "id", 0);
if (id.equals(topCustomerId)) {
String companyName = MapUtils.getString(comMap, "companyName", null);
companyMap.put("topCustomer", companyName);
} else {
companyMap.put("topCustomer", null);
}
} else {
companyMap.put("topCustomer", null);
}
}
}
//常合作供应商id
Integer topSupplierId = MapUtils.getInteger(companyMap, "topSupplierId");
body.setCompanyId(topSupplierId);
companyMap.put("topSupplier", null);
if (ObjectUtil.isNotEmpty(topSupplierId)) {
Map<String, Object> infoHeaderMap = dskOpenApiUtil.requestBody("/api/jsk/enterprise/infoHeader", BeanUtil.beanToMap(body, false, false));
Integer infoHeaderCode = MapUtils.getInteger(infoHeaderMap, "code", 300);
if (infoHeaderCode.equals(HttpStatus.OK.value())) {
Map infoHeaderData = MapUtils.getMap(infoHeaderMap, "data", null);
String companyName = MapUtils.getString(infoHeaderData, "companyName", null);
Integer topSupplierCode = MapUtils.getInteger(topSupplierMap, "code", 300);
if (topSupplierCode.equals(HttpStatus.OK.value())) {
List<Map<String, Object>> companyNameList = (List<Map<String, Object>>)MapUtils.getObject(topSupplierMap, "data", null);
for (Map<String, Object> comMap : companyNameList) {
Integer id = MapUtils.getInteger(comMap, "id", 0);
if (id.equals(topCustomerId)) {
String companyName = MapUtils.getString(comMap, "companyName", null);
companyMap.put("topSupplier", companyName);
} else {
companyMap.put("topSupplier", null);
}
} else {
companyMap.put("topSupplier", null);
}
}
}
}
}
}
return BeanUtil.toBean(map, AjaxResult.class);
}
/***
*@Description: 获取企业Id-客户
*@Param:
*@return: java.util.List<java.lang.Integer>
*@Author: Dgm
*@date: 2023/7/11 16:04
*/
public List<Integer> getTopCustomerIds(List<Object> list) {
List<Integer> getIds = new ArrayList<>(20);
for (Object companyObj : list) {
Map<String, Object> companyMap = CommonUtils.assertAsMap(companyObj);
//常合作客户id
Integer topCustomerId = MapUtils.getInteger(companyMap, "topCustomerId");
getIds.add(topCustomerId);
}
return getIds;
}
/***
*@Description: 获取企业Id-供应商
*@Param:
*@return: java.util.List<java.lang.Integer>
*@Author: Dgm
*@date: 2023/7/11 16:04
*/
public List<Integer> getTopSupplierIds(List<Object> list) {
List<Integer> getIds = new ArrayList<>(20);
for (Object companyObj : list) {
Map<String, Object> companyMap = CommonUtils.assertAsMap(companyObj);
//常合作供应商id
Integer topSupplierId = MapUtils.getInteger(companyMap, "topSupplierId");
getIds.add(topSupplierId);
}
return getIds;
}
}
......@@ -5,6 +5,7 @@ import com.dsk.acc.openapi.client.util.CommonUtils;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.dtos.UrbanInvestmentPlatformDto;
import com.dsk.common.utils.DskOpenApiUtil;
import com.dsk.system.domain.customer.vo.CustomerStatusListVo;
import com.dsk.system.service.ICustomerService;
import com.dsk.system.service.UrbanInvestmentPlatformService;
import org.apache.commons.collections4.CollectionUtils;
......@@ -51,19 +52,32 @@ public class UrbanInvestmentPlatformServiceImpl implements UrbanInvestmentPlatfo
for (Object dataMap : list) {
uipIds.add(MapUtils.getString(CommonUtils.assertAsMap(dataMap), "uipId"));
}
List<String> claimStatusList = iCustomerService.selectUipIdList(uipIds);
// List<String> claimStatusList = iCustomerService.selectUipIdList(uipIds);
List<CustomerStatusListVo> customerStatusListVos = iCustomerService.selectStatusList(uipIds);
//按照城投企业id合并两个list
//按照城投企业id合并两个list
for (Object companyObj : list) {
Map<String, Object> companyMap = CommonUtils.assertAsMap(companyObj);
String uipId = MapUtils.getString(companyMap, "uipId","uipId");
if (CollectionUtils.isEmpty(claimStatusList)) {
String uipId = MapUtils.getString(companyMap, "uipId");
companyMap.put("claimStatus", 0);
} else if (claimStatusList.contains(uipId)) {
for (CustomerStatusListVo vo : customerStatusListVos) {
if (uipId.equals(vo.getUipId())) {
companyMap.put("claimStatus", 1);
} else {
companyMap.put("claimStatus", 0);
}
}
}
// for (Object companyObj : list) {
// Map<String, Object> companyMap = CommonUtils.assertAsMap(companyObj);
// String uipId = MapUtils.getString(companyMap, "uipId","uipId");
// if (CollectionUtils.isEmpty(claimStatusList)) {
// companyMap.put("claimStatus", 0);
// } else if (claimStatusList.contains(uipId)) {
// companyMap.put("claimStatus", 1);
// } else {
// companyMap.put("claimStatus", 0);
// }
// }
return BeanUtil.toBean(map, AjaxResult.class);
}
......
......@@ -110,15 +110,15 @@
#{projectType}
</foreach>
</if>
<if test="minAmount != null and minAmount != '' and minAmount != 0 and maxAmount != minAmount">
<if test="minAmount != null and minAmount != '' and minAmount != '0' and maxAmount != minAmount">
and i.investment_amount &gt; #{minAmount}
</if>
<if test="minAmount == 0 and maxAmount != minAmount">
<if test="minAmount == '0' and maxAmount != minAmount">
and ((i.investment_amount &gt; #{minAmount}
and i.investment_amount &lt;= #{maxAmount})
or i.investment_amount is null)
</if>
<if test="maxAmount != null and maxAmount != '' and maxAmount != minAmount and minAmount != 0">
<if test="maxAmount != null and maxAmount != '' and maxAmount != minAmount and minAmount != '0'">
and i.investment_amount &lt;= #{maxAmount}
</if>
<if test="minAmount != null and minAmount != '' and maxAmount != null and maxAmount != '' and maxAmount == minAmount">
......@@ -373,7 +373,15 @@
</delete>
<delete id="deleteBusinessInfoByIds" parameterType="Long">
delete from business_info where id in
delete i,b,co,f,l,r,u
from business_info i
left join business_backlog b on b.business_id = i.id
left join business_contacts co on co.business_id = i.id
left join business_follow_record f on f.business_id = i.id
left join business_label l on l.business_id = i.id
left join business_relate_company r on r.business_id = i.id
left join business_user u on u.business_id = i.id
where i.id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
......
......@@ -3,7 +3,7 @@
<mapper namespace="com.dsk.system.mapper.CustomerFollowRecordMapper">
<sql id="Base_Bean">
cfr.id, cfr.customer_id, cfr.user_id, cfr.visit_mode, cfr.next_visit_time, cfr.name, cfr.position,
cfr.id, cfr.customer_id, cfr.user_id, cfr.visit_mode, cfr.visit_time, cfr.next_visit_time, cfr.name, cfr.position,
cfr.content, cfr.create_time
</sql>
......
......@@ -26,7 +26,7 @@
left join (
select count(status) num,customer_id from business_info where `status` = 2 group by customer_id
) bi3 on bi3.customer_id = ct.customer_id
where ctu.user_id = #{dto.userId}
where ctu.user_id = #{dto.userId} and ctu.status = #{dto.status}
<if test="dto.companyName != null and dto.companyName != '' "> and ct.company_name like concat('%',#{dto.companyName},'%')</if>
order by ct.create_time desc
</select>
......@@ -52,22 +52,33 @@
ct.customer_id, ct.uip_id
from customer ct
join customer_user ctu on ct.customer_id = ctu.customer_id
where ctu.user_id = #{userId} and ct.uip_id in
where ctu.user_id = #{userId} and ctu.status = 0 and ct.uip_id in
<foreach collection="uipIds" item="uipId" open="(" separator="," close=")">
#{uipId}
</foreach>
</select>
<select id="selectUipIdList" resultType="java.lang.String">
<select id="selectStatusListByCompanyName" resultType="com.dsk.system.domain.customer.vo.CustomerStatusListVo">
select
ct.uip_id
ct.customer_id, ct.company_name
from customer ct
join customer_user ctu on ct.customer_id = ctu.customer_id
where ctu.user_id = #{userId} and ct.uip_id in
<foreach collection="uipIds" item="uipId" open="(" separator="," close=")">
#{uipId}
where ctu.user_id = #{userId} and ctu.status = 0 and ct.company_name in
<foreach collection="companyNames" item="companyName" open="(" separator="," close=")">
#{companyName}
</foreach>
</select>
<!-- <select id="selectUipIdList" resultType="java.lang.String">-->
<!-- select-->
<!-- ct.uip_id-->
<!-- from customer ct-->
<!-- 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-->
<!-- <foreach collection="uipIds" item="uipId" open="(" separator="," close=")">-->
<!-- #{uipId}-->
<!-- </foreach>-->
<!-- </select>-->
</mapper>
......@@ -2,6 +2,13 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dsk.system.mapper.CustomerUserMapper">
<select id="selectByCustomerIdAndUserId" resultType="com.dsk.system.domain.customer.CustomerUser">
select
id, customer_id, user_id, status, create_time, update_time
from customer_user
where customer_id = #{customerId} and user_id = #{userId}
</select>
</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