Commit f00b63a2 authored by 远方不远's avatar 远方不远

hy

parents e32e4f2f 4d748c06
package com.dsk.web.controller.customer;
import com.dsk.common.annotation.RepeatSubmit;
import com.dsk.common.core.controller.BaseController;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.utils.PageUtils;
import com.dsk.system.domain.customer.Customer;
import com.dsk.system.domain.customer.dto.CustomerSearchDto;
import com.dsk.system.service.ICustomerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
/**
* 客户相关
......@@ -19,4 +25,34 @@ public class CustomerController extends BaseController {
@Autowired
private ICustomerService baseService;
/**
* 查询客户列表
*/
@PreAuthorize("@ss.hasPermi('customer:list')")
@GetMapping("/list")
public TableDataInfo selectPageList(CustomerSearchDto dto){
startPage();
return getDataTable(baseService.selectList(dto));
}
/**
* 添加客户
*/
@PreAuthorize("@ss.hasPermi('customer:add')")
@PostMapping()
@RepeatSubmit
public AjaxResult add(@RequestBody Customer customer){
return AjaxResult.success(baseService.add(customer));
}
/**
* 编辑客户
*/
@PreAuthorize("@ss.hasPermi('customer:edit')")
@PutMapping()
@RepeatSubmit
public AjaxResult edit(@RequestBody Customer customer){
return AjaxResult.success(baseService.edit(customer));
}
}
package com.dsk.web.controller.customer;
import com.dsk.common.annotation.RepeatSubmit;
import com.dsk.common.core.controller.BaseController;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.core.page.TableDataInfo;
import com.dsk.system.domain.CustomerDecisionChain;
import com.dsk.system.domain.dto.CustomerDecisionChainSearchDto;
import com.dsk.system.domain.customer.CustomerDecisionChain;
import com.dsk.system.domain.customer.dto.CustomerDecisionChainSearchDto;
import com.dsk.system.service.ICustomerDecisionChainService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
......@@ -37,7 +38,8 @@ public class CustomerDecisionChainController extends BaseController {
*/
@PreAuthorize("@ss.hasPermi('customer:decision:chain:add')")
@PostMapping()
public AjaxResult add(CustomerDecisionChain customerDecisionChain){
@RepeatSubmit()
public AjaxResult add(@RequestBody CustomerDecisionChain customerDecisionChain){
return AjaxResult.success(baseService.insert(customerDecisionChain));
}
......@@ -46,7 +48,8 @@ public class CustomerDecisionChainController extends BaseController {
*/
@PreAuthorize("@ss.hasPermi('customer:decision:chain:edit')")
@PutMapping()
public AjaxResult edit(CustomerDecisionChain customerDecisionChain){
@RepeatSubmit()
public AjaxResult edit(@RequestBody CustomerDecisionChain customerDecisionChain){
return AjaxResult.success(baseService.update(customerDecisionChain));
}
......@@ -55,6 +58,7 @@ public class CustomerDecisionChainController extends BaseController {
*/
@PreAuthorize("@ss.hasPermi('customer:decision:chain:del')")
@DeleteMapping("/{id}")
@RepeatSubmit()
public AjaxResult del(@PathVariable("id") Long id){
return AjaxResult.success(baseService.deleteById(id));
}
......
package com.dsk.web.controller.customer;
import com.dsk.common.annotation.RepeatSubmit;
import com.dsk.common.core.controller.BaseController;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.core.page.TableDataInfo;
import com.dsk.system.domain.customer.Customer;
import com.dsk.system.domain.customer.CustomerFollowRecord;
import com.dsk.system.domain.customer.dto.CustomerFollowRecordSearchDto;
import com.dsk.system.domain.customer.dto.CustomerSearchDto;
import com.dsk.system.service.ICustomerFollowRecordService;
import com.dsk.system.service.ICustomerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
/**
* 客户跟进记录相关
*
* @author lcl
* @create 2023/5/18
*/
@RestController
@RequestMapping("/customer/follow/record")
public class CustomerFollowRecordController extends BaseController {
@Autowired
private ICustomerFollowRecordService baseService;
/**
* 查询客户跟进记录列表
*/
// @PreAuthorize("@ss.hasPermi('customer:follow:record:list')")
@GetMapping("/list")
public TableDataInfo selectPageList(CustomerFollowRecordSearchDto dto){
startPage();
return getDataTable(baseService.selectList(dto));
}
/**
* 添加客户跟进记录
*/
// @PreAuthorize("@ss.hasPermi('customer:follow:record:add')")
@PostMapping()
@RepeatSubmit
public AjaxResult add(@RequestBody CustomerFollowRecord followRecord){
return AjaxResult.success(baseService.add(followRecord));
}
}
package com.dsk.web.controller.dsk;
import com.dsk.common.core.domain.R;
import com.dsk.common.core.domain.model.EnterpriseBody;
import com.dsk.common.core.domain.model.*;
import com.dsk.system.dskService.EnterpriseService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
......@@ -25,9 +26,83 @@ public class EnterpriseController {
@Autowired
private EnterpriseService enterpriseService;
@ApiOperation(value = "企业详情头部信息(建设库)")
@PostMapping("/infoHeader")
public R infoHeader(@RequestBody @Valid EnterpriseBody body) throws Exception
public R infoHeader(@RequestBody @Valid EnterpriseInfoHeaderBody body) throws Exception
{
return enterpriseService.infoHeader(body);
}
@ApiOperation(value = "企业统计信息")
@PostMapping(value = "statistic(建设库)")
public R statistic(@RequestBody @Valid EnterpriseStatisticBody vo) throws Exception {
return enterpriseService.statistic(vo);
}
@ApiOperation(value = "招标偏好信息(openApi)")
@PostMapping(value = "bidDataGroup")
public R bidDataGroup(@RequestBody @Valid EnterpriseBidDataGroupBody vo) throws Exception {
return enterpriseService.bidDataGroup(vo);
}
@ApiOperation(value = "供应商列表(建设库)")
@PostMapping(value = "supplierPage")
public R supplierPage(@RequestBody @Valid EnterpriseSupplierPageBody vo) throws Exception {
return enterpriseService.supplierPage(vo);
}
@ApiOperation(value = "甲方业绩数据(openApi)")
@PostMapping(value = "projectTenderDataGroup")
public R projectTenderDataGroup(@RequestBody @Valid EnterpriseProjectTenderDataGroupBody vo) throws Exception {
return enterpriseService.projectTenderDataGroup(vo);
}
@ApiOperation(value = "股东列表(openApi)")
@PostMapping(value = "partners")
public R partners(@RequestBody @Valid EnterprisePartnersBody vo) throws Exception {
return enterpriseService.partners(vo);
}
@ApiOperation(value = "对外投资列表(openApi)")
@PostMapping(value = "investment")
public R investment(@RequestBody @Valid EnterpriseInvestmentBody vo) throws Exception {
return enterpriseService.investment(vo);
}
@ApiOperation(value = "分支机构列表(openApi)")
@PostMapping(value = "affiliates")
public R affiliates(@RequestBody @Valid EnterpriseAffiliatesBody vo) throws Exception {
return enterpriseService.affiliates(vo);
}
@ApiOperation(value = "招标公告列表(建设库)")
@PostMapping(value = "bidNoticePage")
public R bidNoticePage(@RequestBody @Valid EnterpriseBidNoticePageBody vo) throws Exception {
return enterpriseService.bidNoticePage(vo);
}
@ApiOperation(value = "企业动态列表(建设库)")
@PostMapping(value = "dynamicPage")
public R dynamicPage(@RequestBody @Valid EnterpriseDynamicPageBody vo) throws Exception {
return enterpriseService.dynamicPage(vo);
}
@ApiOperation(value = "工商基本信息(openApi)")
@PostMapping(value = "icInfo")
public R icInfo(@RequestBody @Valid EnterpriseIcInfoBody vo) throws Exception {
return enterpriseService.icInfo(vo);
}
@ApiOperation(value = "工商变更信息列表(openApi)")
@PostMapping(value = "changeInfo")
public R changeInfo(@RequestBody @Valid EnterpriseChangeInfoBody vo) throws Exception {
return enterpriseService.changeInfo(vo);
}
@ApiOperation(value = "高管信息列表(openApi)")
@PostMapping(value = "keymembers")
public R keymembers(@RequestBody @Valid EnterpriseKeymembersBody vo) throws Exception {
return enterpriseService.keymembers(vo);
}
}
package com.dsk.web.controller.search.macroMarket;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.system.service.EconomicService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName EconomicController
* @Description 经济大全
* @Author Dgm
* @Date 2023/5/18 10:09
* @Version 1.0.0
*/
@RestController
@RequestMapping(value ="/economic")
public class EconomicController {
@Autowired
private EconomicService economicService;
/***
*@Description: 全国经济大全分页列表
*@Param:
*@return: com.dsk.common.core.domain.AjaxResult
*@Author: Dgm
*@date: 2023/5/18 10:29
*/
@GetMapping("/nationalPage")
public AjaxResult areaGroupByProvince() {
return economicService.nationalPage();
}
}
......@@ -167,98 +167,7 @@ token:
# # 加载全局的配置文件
# configLocation: classpath:mybatis/mybatis-config.xml
# MyBatisPlus配置
# https://baomidou.com/config/
mybatis-plus:
# 不支持多包, 如有需要可在注解配置 或 提升扫包等级
# 例如 com.**.**.mapper
mapperPackage: com.dsk.**.mapper
# 对应的 XML 文件位置
mapperLocations: classpath*:mapper/**/*Mapper.xml
# 实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.dsk.**.domain
# 针对 typeAliasesPackage,如果配置了该属性,则仅仅会扫描路径下以该类作为父类的域对象
#typeAliasesSuperType: Class<?>
# 如果配置了该属性,SqlSessionFactoryBean 会把该包下面的类注册为对应的 TypeHandler
#typeHandlersPackage: null
# 如果配置了该属性,会将路径下的枚举类进行注入,让实体类字段能够简单快捷的使用枚举属性
#typeEnumsPackage: null
# 启动时是否检查 MyBatis XML 文件的存在,默认不检查
checkConfigLocation: false
# 通过该属性可指定 MyBatis 的执行器,MyBatis 的执行器总共有三种:
# SIMPLE:该执行器类型不做特殊的事情,为每个语句的执行创建一个新的预处理语句(PreparedStatement)
# REUSE:该执行器类型会复用预处理语句(PreparedStatement)
# BATCH:该执行器类型会批量执行所有的更新语句
executorType: SIMPLE
configuration:
# 自动驼峰命名规则(camel case)映射
# 如果您的数据库命名符合规则无需使用 @TableField 注解指定数据库字段名
mapUnderscoreToCamelCase: true
# 默认枚举处理类,如果配置了该属性,枚举将统一使用指定处理器进行处理
# org.apache.ibatis.type.EnumTypeHandler : 存储枚举的名称
# org.apache.ibatis.type.EnumOrdinalTypeHandler : 存储枚举的索引
# com.baomidou.mybatisplus.extension.handlers.MybatisEnumTypeHandler : 枚举类需要实现IEnum接口或字段标记@EnumValue注解.
defaultEnumTypeHandler: org.apache.ibatis.type.EnumTypeHandler
# 当设置为 true 的时候,懒加载的对象可能被任何懒属性全部加载,否则,每个属性都按需加载。需要和 lazyLoadingEnabled 一起使用。
aggressiveLazyLoading: true
# MyBatis 自动映射策略
# NONE:不启用自动映射
# PARTIAL:只对非嵌套的 resultMap 进行自动映射
# FULL:对所有的 resultMap 都进行自动映射
autoMappingBehavior: PARTIAL
# MyBatis 自动映射时未知列或未知属性处理策
# NONE:不做任何处理 (默认值)
# WARNING:以日志的形式打印相关警告信息
# FAILING:当作映射失败处理,并抛出异常和详细信息
autoMappingUnknownColumnBehavior: NONE
# Mybatis一级缓存,默认为 SESSION
# SESSION session级别缓存,同一个session相同查询语句不会再次查询数据库
# STATEMENT 关闭一级缓存
localCacheScope: SESSION
# 开启Mybatis二级缓存,默认为 true
cacheEnabled: false
# 更详细的日志输出 会有性能损耗 org.apache.ibatis.logging.stdout.StdOutImpl
# 关闭日志记录 (可单纯使用 p6spy 分析) org.apache.ibatis.logging.nologging.NoLoggingImpl
# 默认日志输出 org.apache.ibatis.logging.slf4j.Slf4jImpl
logImpl: org.apache.ibatis.logging.slf4j.Slf4jImpl
global-config:
# 是否打印 Logo banner
banner: true
# 是否初始化 SqlRunner
enableSqlRunner: false
dbConfig:
# 主键类型
# AUTO 数据库ID自增
# NONE 空
# INPUT 用户输入ID
# ASSIGN_ID 全局唯一ID
# ASSIGN_UUID 全局唯一ID UUID
idType: AUTO
# 表名前缀
tablePrefix: null
# 字段 format,例: %s,(对主键无效)
columnFormat: null
# 表名是否使用驼峰转下划线命名,只对表名生效
tableUnderline: true
# 大写命名,对表名和字段名均生效
capitalMode: false
# 全局的entity的逻辑删除字段属性名
logicDeleteField: null
# 逻辑已删除值
logicDeleteValue: 2
# 逻辑未删除值
logicNotDeleteValue: 0
# 字段验证策略之 insert,在 insert 的时候的字段验证策略
# IGNORED 忽略判断
# NOT_NULL 非NULL判断
# NOT_EMPTY 非空判断(只对字符串类型字段,其他类型字段依然为非NULL判断)
# DEFAULT 默认的,一般只用于注解里
# NEVER 不加入 SQL
insertStrategy: NOT_NULL
# 字段验证策略之 update,在 update 的时候的字段验证策略
updateStrategy: NOT_NULL
# 字段验证策略之 select,在 select 的时候的字段验证策略既 wrapper 根据内部 entity 生成的 where 条件
where-strategy: NOT_NULL
# PageHelper分页插件
pagehelper:
......
spring:
profiles:
active: dev
# MyBatisPlus配置
# https://baomidou.com/config/
mybatis-plus:
# 不支持多包, 如有需要可在注解配置 或 提升扫包等级
# 例如 com.**.**.mapper
mapperPackage: com.dsk.**.mapper
# 对应的 XML 文件位置
mapperLocations: classpath*:mapper/**/*Mapper.xml
# 实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.dsk.**.domain
# 针对 typeAliasesPackage,如果配置了该属性,则仅仅会扫描路径下以该类作为父类的域对象
#typeAliasesSuperType: Class<?>
# 如果配置了该属性,SqlSessionFactoryBean 会把该包下面的类注册为对应的 TypeHandler
#typeHandlersPackage: null
# 如果配置了该属性,会将路径下的枚举类进行注入,让实体类字段能够简单快捷的使用枚举属性
#typeEnumsPackage: null
# 启动时是否检查 MyBatis XML 文件的存在,默认不检查
checkConfigLocation: false
# 通过该属性可指定 MyBatis 的执行器,MyBatis 的执行器总共有三种:
# SIMPLE:该执行器类型不做特殊的事情,为每个语句的执行创建一个新的预处理语句(PreparedStatement)
# REUSE:该执行器类型会复用预处理语句(PreparedStatement)
# BATCH:该执行器类型会批量执行所有的更新语句
executorType: SIMPLE
configuration:
# 自动驼峰命名规则(camel case)映射
# 如果您的数据库命名符合规则无需使用 @TableField 注解指定数据库字段名
mapUnderscoreToCamelCase: true
# 默认枚举处理类,如果配置了该属性,枚举将统一使用指定处理器进行处理
# org.apache.ibatis.type.EnumTypeHandler : 存储枚举的名称
# org.apache.ibatis.type.EnumOrdinalTypeHandler : 存储枚举的索引
# com.baomidou.mybatisplus.extension.handlers.MybatisEnumTypeHandler : 枚举类需要实现IEnum接口或字段标记@EnumValue注解.
defaultEnumTypeHandler: org.apache.ibatis.type.EnumTypeHandler
# 当设置为 true 的时候,懒加载的对象可能被任何懒属性全部加载,否则,每个属性都按需加载。需要和 lazyLoadingEnabled 一起使用。
aggressiveLazyLoading: true
# MyBatis 自动映射策略
# NONE:不启用自动映射
# PARTIAL:只对非嵌套的 resultMap 进行自动映射
# FULL:对所有的 resultMap 都进行自动映射
autoMappingBehavior: PARTIAL
# MyBatis 自动映射时未知列或未知属性处理策
# NONE:不做任何处理 (默认值)
# WARNING:以日志的形式打印相关警告信息
# FAILING:当作映射失败处理,并抛出异常和详细信息
autoMappingUnknownColumnBehavior: NONE
# Mybatis一级缓存,默认为 SESSION
# SESSION session级别缓存,同一个session相同查询语句不会再次查询数据库
# STATEMENT 关闭一级缓存
localCacheScope: SESSION
# 开启Mybatis二级缓存,默认为 true
cacheEnabled: false
# 更详细的日志输出 会有性能损耗 org.apache.ibatis.logging.stdout.StdOutImpl
# 关闭日志记录 (可单纯使用 p6spy 分析) org.apache.ibatis.logging.nologging.NoLoggingImpl
# 默认日志输出 org.apache.ibatis.logging.slf4j.Slf4jImpl
logImpl: org.apache.ibatis.logging.slf4j.Slf4jImpl
global-config:
# 是否打印 Logo banner
banner: true
# 是否初始化 SqlRunner
enableSqlRunner: false
dbConfig:
# 主键类型
# AUTO 数据库ID自增
# NONE 空
# INPUT 用户输入ID
# ASSIGN_ID 全局唯一ID
# ASSIGN_UUID 全局唯一ID UUID
idType: AUTO
# 表名前缀
tablePrefix: null
# 字段 format,例: %s,(对主键无效)
columnFormat: null
# 表名是否使用驼峰转下划线命名,只对表名生效
tableUnderline: true
# 大写命名,对表名和字段名均生效
capitalMode: false
# 全局的entity的逻辑删除字段属性名
logicDeleteField: null
# 逻辑已删除值
logicDeleteValue: 2
# 逻辑未删除值
logicNotDeleteValue: 0
# 字段验证策略之 insert,在 insert 的时候的字段验证策略
# IGNORED 忽略判断
# NOT_NULL 非NULL判断
# NOT_EMPTY 非空判断(只对字符串类型字段,其他类型字段依然为非NULL判断)
# DEFAULT 默认的,一般只用于注解里
# NEVER 不加入 SQL
insertStrategy: NOT_NULL
# 字段验证策略之 update,在 update 的时候的字段验证策略
updateStrategy: NOT_NULL
# 字段验证策略之 select,在 select 的时候的字段验证策略既 wrapper 根据内部 entity 生成的 where 条件
where-strategy: NOT_NULL
package com.dsk.common.core.domain.model;
/**
* 基础分页类
* @author hypnos
* @Description
* @Date Created in 2022-10-27 07:08:54
* @Modified By hypnos
*/
public class BasePage {
/**
* 当前页码
*/
private Integer pageIndex = 1;
/**
* 每页数量
*/
private Integer pageSize = 10;
/**
* 最大页码
*/
private Integer pageMaxIndex;
/**
* 最大条数
*/
private Integer pageMaxSize;
public Integer getPageIndex() {
return pageMaxIndex != null && pageIndex > pageMaxIndex? pageMaxIndex : pageIndex;
}
public void setPageIndex(Integer pageIndex) {
this.pageIndex = pageIndex;
}
public Integer getPageSize() {
return pageMaxSize != null && pageSize > pageMaxSize? pageMaxSize : pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getPageMaxIndex() {
return pageMaxIndex;
}
public void setPageMaxIndex(Integer pageMaxIndex) {
this.pageMaxIndex = pageMaxIndex;
}
public Integer getPageMaxSize() {
return pageMaxSize;
}
public void setPageMaxSize(Integer pageMaxSize) {
this.pageMaxSize = pageMaxSize;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("BasePageVo [pageIndex=");
builder.append(pageIndex);
builder.append(", pageSize=");
builder.append(pageSize);
builder.append("]");
return builder.toString();
}
}
package com.dsk.common.core.domain.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
/**
* 分支结构列表
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class EnterpriseAffiliatesBody extends BasePage {
//企业Id
@NotNull(message = "企业id不能为空")
private Integer cid;
}
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 EnterpriseBidDataGroupBody
{
/**
* 企业id
*/
@NotNull(message = "企业id不能为空")
private Integer cid;
/**
* 时间跨度id 1:年,2:月,3:周
*/
@NotNull(message = "spanId不能为空")
private Integer spanId;
}
package com.dsk.common.core.domain.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import javax.validation.constraints.NotNull;
public class EnterpriseBody
@Data
@ToString
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class EnterpriseBidNoticePageBody extends BasePage
{
/**
* 企业id
......@@ -10,19 +19,4 @@ public class EnterpriseBody
@NotNull(message = "企业id不能为空")
private Integer companyId;
public Integer getCompanyId() {
return companyId;
}
public void setCompanyId(Integer companyId) {
this.companyId = companyId;
}
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("com.dsk.common.core.domain.model.EnterpriseBody{");
sb.append("companyId='").append(companyId).append('\'');
sb.append('}');
return sb.toString();
}
}
package com.dsk.common.core.domain.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import javax.validation.constraints.NotNull;
@Data
@ToString
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class EnterpriseChangeInfoBody extends BasePage
{
/**
* 企业id
*/
@NotNull(message = "企业id不能为空")
private Integer cid;
}
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 EnterpriseDynamicPageBody extends BasePage
{
/**
* 企业id
*/
@NotNull(message = "企业id不能为空")
private Integer companyId;
}
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 EnterpriseIcInfoBody extends BasePage
{
/**
* 企业id
*/
@NotNull(message = "企业id不能为空")
private Integer cid;
}
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 EnterpriseInfoHeaderBody
{
/**
* 企业id
*/
@NotNull(message = "企业id不能为空")
private Integer companyId;
}
package com.dsk.common.core.domain.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
/**
* 对外投资列表
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class EnterpriseInvestmentBody extends BasePage {
//企业Id
@NotNull(message = "企业id不能为空")
private Integer cid;
}
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 EnterpriseKeymembersBody extends BasePage
{
/**
* 企业id
*/
@NotNull(message = "企业id不能为空")
private Integer cid;
}
package com.dsk.common.core.domain.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
/**
* 股东列表
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class EnterprisePartnersBody extends BasePage {
//企业Id
@NotNull(message = "企业id不能为空")
private Integer cid;
}
package com.dsk.common.core.domain.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
/**
* 甲方业绩数据
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class EnterpriseProjectTenderDataGroupBody {
//企业Id
@NotNull(message = "企业id不能为空")
private Integer cid;
//group类型 0:金额,1:项目类型
private Integer type;
}
package com.dsk.common.core.domain.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import javax.validation.constraints.NotNull;
@Data
@ToString
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class EnterpriseStatisticBody
{
/**
* 企业id
*/
@NotNull(message = "企业id不能为空")
private Integer companyId;
}
package com.dsk.common.core.domain.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
/**
* 企业详情供应商信息列表
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class EnterpriseSupplierPageBody extends BasePage {
//企业Id
@NotNull(message = "企业id不能为空")
private Integer companyId;
//是否企业首页用,首页用到缓存
private Boolean isIndex = true;
//查询关键词(供应商名)
private String key;
//排序字段
private String orderColumn;
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("com.dsk.common.core.domain.model.EnterpriseSupplierPageBody{");
sb.append("companyId=").append(companyId);
sb.append(", isIndex=").append(isIndex);
sb.append(", key='").append(key).append('\'');
sb.append(", orderColumn='").append(orderColumn).append('\'');
sb.append(", pageIndex=").append(getPageIndex());
sb.append(", pageSize=").append(getPageSize());
sb.append('}');
return sb.toString();
}
}
package com.dsk.common.core.mybatisplus.methods;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
import com.dsk.common.utils.StringUtils;
import org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator;
import org.apache.ibatis.executor.keygen.KeyGenerator;
import org.apache.ibatis.executor.keygen.NoKeyGenerator;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlSource;
import java.util.List;
/**
* 单sql批量插入( 全量填充 )
*
* @author Lion Li
*/
public class InsertAll extends AbstractMethod {
private final static String[] FILL_PROPERTY = {"createTime", "createBy", "updateTime", "updateBy"};
@Override
public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
final String sql = "<script>insert into %s %s values %s</script>";
final String fieldSql = prepareFieldSql(tableInfo);
final String valueSql = prepareValuesSqlForMysqlBatch(tableInfo);
KeyGenerator keyGenerator = new NoKeyGenerator();
String sqlMethod = "insertAll";
String keyProperty = null;
String keyColumn = null;
// 表包含主键处理逻辑,如果不包含主键当普通字段处理
if (StringUtils.isNotBlank(tableInfo.getKeyProperty())) {
if (tableInfo.getIdType() == IdType.AUTO) {
/** 自增主键 */
keyGenerator = new Jdbc3KeyGenerator();
keyProperty = tableInfo.getKeyProperty();
keyColumn = tableInfo.getKeyColumn();
} else {
if (null != tableInfo.getKeySequence()) {
keyGenerator = TableInfoHelper.genKeyGenerator(sqlMethod, tableInfo, builderAssistant);
keyProperty = tableInfo.getKeyProperty();
keyColumn = tableInfo.getKeyColumn();
}
}
}
final String sqlResult = String.format(sql, tableInfo.getTableName(), fieldSql, valueSql);
SqlSource sqlSource = languageDriver.createSqlSource(configuration, sqlResult, modelClass);
return this.addInsertMappedStatement(mapperClass, modelClass, sqlMethod, sqlSource, keyGenerator, keyProperty, keyColumn);
}
private String prepareFieldSql(TableInfo tableInfo) {
StringBuilder fieldSql = new StringBuilder();
if (StringUtils.isNotBlank(tableInfo.getKeyColumn())) {
fieldSql.append(tableInfo.getKeyColumn()).append(",");
}
tableInfo.getFieldList().forEach(x -> fieldSql.append(x.getColumn()).append(","));
fieldSql.delete(fieldSql.length() - 1, fieldSql.length());
fieldSql.insert(0, "(");
fieldSql.append(")");
return fieldSql.toString();
}
private String prepareValuesSqlForMysqlBatch(TableInfo tableInfo) {
final StringBuilder valueSql = new StringBuilder();
valueSql.append("<foreach collection=\"list\" item=\"item\" index=\"index\" open=\"(\" separator=\"),(\" close=\")\">");
if (StringUtils.isNotBlank(tableInfo.getKeyColumn())) {
valueSql.append("\n#{item.").append(tableInfo.getKeyProperty()).append("},\n");
}
List<TableFieldInfo> fieldList = tableInfo.getFieldList();
int last = fieldList.size() - 1;
for (int i = 0; i < fieldList.size(); i++) {
String property = fieldList.get(i).getProperty();
if (!StringUtils.equalsAny(property, FILL_PROPERTY)) {
valueSql.append("<if test=\"item.").append(property).append(" != null\">");
valueSql.append("#{item.").append(property).append("}");
if (i != last) {
valueSql.append(",");
}
valueSql.append("</if>");
valueSql.append("<if test=\"item.").append(property).append(" == null\">");
valueSql.append("DEFAULT");
if (i != last) {
valueSql.append(",");
}
valueSql.append("</if>");
} else {
valueSql.append("#{item.").append(property).append("}");
if (i != last) {
valueSql.append(",");
}
}
}
valueSql.append("</foreach>");
return valueSql.toString();
}
}
package com.dsk.common.dtos;
import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Getter;
import lombok.Setter;
......
package com.dsk.common.dtos;
import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Data;
import java.util.Date;
......
package com.dsk.common.dtos;
import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Getter;
import lombok.Setter;
......
package com.dsk.common.dtos;
import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Data;
import java.util.Date;
......
package com.dsk.common.dtos;
import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Data;
import java.util.Date;
......
package com.dsk.common.dtos;
import com.md.common.entity.Page;
import lombok.Data;
/**
......
package com.dsk.common.dtos;
import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Data;
import java.util.Date;
......
package com.dsk.common.dtos;
import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Data;
import java.util.Date;
......
package com.dsk.common.dtos;
import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Data;
import java.util.Date;
......
package com.dsk.common.dtos;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.md.common.entity.Page;
import lombok.Data;
@Data
......
package com.dsk.common.dtos;
import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Data;
import java.util.Date;
......
......@@ -24,6 +24,10 @@ public class DskOpenApiUtil {
return request(path, bodyMap, "json");
}
public Map<String,Object> requestBodyWithHeader(String path, Map<String, Object> bodyMap, Map<String, String> headerMap){
return requestWithHeader(path, bodyMap, "json", headerMap);
}
/**
* <b>application/x-www-form-urlencoded请求</b>
* @param path 请求路径
......@@ -59,4 +63,29 @@ public class DskOpenApiUtil {
}
}
/**
* <b>开放平台统一请求</b>
* @param path 请求路径
* @param bodyMap 参数体
* @param reqBodyType 请求格式
* @return
*/
public Map<String,Object> requestWithHeader(String path, Map<String, Object> bodyMap, String reqBodyType, Map<String, String> headerMap){
try {
AccClient.init(new Config(dskOpenApiConfig.accessKeyId, dskOpenApiConfig.accessKeySecret)
.setEndpoint(dskOpenApiConfig.endPoint));
Map<String, ?> res = AccClient.request(reqBodyType, path, bodyMap, headerMap);
if(!res.containsKey("headers") || !res.containsKey("body")) {
throw new RuntimeException(String.format("请求无返回:path=%s",path));
}
Object resBody = res.get("body");
if(resBody == null) {
return null;
}
return CommonUtils.assertAsMap(resBody);
} catch (Exception e) {
throw new RuntimeException(String.format("请求异常:path=%s,err=%s",path,e.getMessage()));
}
}
}
\ No newline at end of file
package com.dsk.framework.config;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import javax.sql.DataSource;
import org.apache.ibatis.io.VFS;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.util.ClassUtils;
import com.dsk.common.utils.StringUtils;
/**
* Mybatis支持*匹配扫描包
*
* @author dsk
*/
@Configuration
public class MyBatisConfig
{
@Autowired
private Environment env;
static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";
public static String setTypeAliasesPackage(String typeAliasesPackage)
{
ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver();
MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);
List<String> allResult = new ArrayList<String>();
try
{
for (String aliasesPackage : typeAliasesPackage.split(","))
{
List<String> result = new ArrayList<String>();
aliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
+ ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim()) + "/" + DEFAULT_RESOURCE_PATTERN;
Resource[] resources = resolver.getResources(aliasesPackage);
if (resources != null && resources.length > 0)
{
MetadataReader metadataReader = null;
for (Resource resource : resources)
{
if (resource.isReadable())
{
metadataReader = metadataReaderFactory.getMetadataReader(resource);
try
{
result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName());
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
}
}
}
if (result.size() > 0)
{
HashSet<String> hashResult = new HashSet<String>(result);
allResult.addAll(hashResult);
}
}
if (allResult.size() > 0)
{
typeAliasesPackage = String.join(",", (String[]) allResult.toArray(new String[0]));
}
else
{
throw new RuntimeException("mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:" + typeAliasesPackage + "未找到任何包");
}
}
catch (IOException e)
{
e.printStackTrace();
}
return typeAliasesPackage;
}
public Resource[] resolveMapperLocations(String[] mapperLocations)
{
ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
List<Resource> resources = new ArrayList<Resource>();
if (mapperLocations != null)
{
for (String mapperLocation : mapperLocations)
{
try
{
Resource[] mappers = resourceResolver.getResources(mapperLocation);
resources.addAll(Arrays.asList(mappers));
}
catch (IOException e)
{
// ignore
}
}
}
return resources.toArray(new Resource[resources.size()]);
}
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
{
String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
String mapperLocations = env.getProperty("mybatis.mapperLocations");
String configLocation = env.getProperty("mybatis.configLocation");
typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
VFS.addImplClass(SpringBootVFS.class);
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
return sessionFactory.getObject();
}
}
//package com.dsk.framework.config;
//
//import java.io.IOException;
//import java.util.ArrayList;
//import java.util.Arrays;
//import java.util.HashSet;
//import java.util.List;
//import javax.sql.DataSource;
//import org.apache.ibatis.io.VFS;
//import org.apache.ibatis.session.SqlSessionFactory;
//import org.mybatis.spring.SqlSessionFactoryBean;
//import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.core.env.Environment;
//import org.springframework.core.io.DefaultResourceLoader;
//import org.springframework.core.io.Resource;
//import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
//import org.springframework.core.io.support.ResourcePatternResolver;
//import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
//import org.springframework.core.type.classreading.MetadataReader;
//import org.springframework.core.type.classreading.MetadataReaderFactory;
//import org.springframework.util.ClassUtils;
//import com.dsk.common.utils.StringUtils;
//
///**
// * Mybatis支持*匹配扫描包
// *
// * @author dsk
// */
//@Configuration
//public class MyBatisConfig
//{
// @Autowired
// private Environment env;
//
// static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";
//
// public static String setTypeAliasesPackage(String typeAliasesPackage)
// {
// ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver();
// MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);
// List<String> allResult = new ArrayList<String>();
// try
// {
// for (String aliasesPackage : typeAliasesPackage.split(","))
// {
// List<String> result = new ArrayList<String>();
// aliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
// + ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim()) + "/" + DEFAULT_RESOURCE_PATTERN;
// Resource[] resources = resolver.getResources(aliasesPackage);
// if (resources != null && resources.length > 0)
// {
// MetadataReader metadataReader = null;
// for (Resource resource : resources)
// {
// if (resource.isReadable())
// {
// metadataReader = metadataReaderFactory.getMetadataReader(resource);
// try
// {
// result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName());
// }
// catch (ClassNotFoundException e)
// {
// e.printStackTrace();
// }
// }
// }
// }
// if (result.size() > 0)
// {
// HashSet<String> hashResult = new HashSet<String>(result);
// allResult.addAll(hashResult);
// }
// }
// if (allResult.size() > 0)
// {
// typeAliasesPackage = String.join(",", (String[]) allResult.toArray(new String[0]));
// }
// else
// {
// throw new RuntimeException("mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:" + typeAliasesPackage + "未找到任何包");
// }
// }
// catch (IOException e)
// {
// e.printStackTrace();
// }
// return typeAliasesPackage;
// }
//
// public Resource[] resolveMapperLocations(String[] mapperLocations)
// {
// ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
// List<Resource> resources = new ArrayList<Resource>();
// if (mapperLocations != null)
// {
// for (String mapperLocation : mapperLocations)
// {
// try
// {
// Resource[] mappers = resourceResolver.getResources(mapperLocation);
// resources.addAll(Arrays.asList(mappers));
// }
// catch (IOException e)
// {
// // ignore
// }
// }
// }
// return resources.toArray(new Resource[resources.size()]);
// }
//
// @Bean
// public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
// {
// String typeAliasesPackage = env.getProperty("mybatis-plus.typeAliasesPackage");
// String mapperLocations = env.getProperty("mybatis-plus.mapperLocations");
//// String configLocation = env.getProperty("mybatis-plus.configLocation");
// typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
// VFS.addImplClass(SpringBootVFS.class);
//
// final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
// sessionFactory.setDataSource(dataSource);
// sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
// sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
//// sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
// return sessionFactory.getObject();
// }
//}
package com.dsk.framework.config;
import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.dsk.common.core.mybatisplus.methods.InsertAll;
import com.dsk.framework.mybatisplus.CreateAndUpdateMetaObjectHandler;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import java.util.List;
/**
* mybatis-plus配置类
*
* @author Lion Li
*/
@EnableTransactionManagement(proxyTargetClass = true)
@Configuration
// 指定要扫描的Mapper类的包的路径
@MapperScan("${mybatis-plus.mapperPackage}")
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 分页插件
interceptor.addInnerInterceptor(paginationInnerInterceptor());
// 乐观锁插件
interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor());
// 阻断插件
// interceptor.addInnerInterceptor(blockAttackInnerInterceptor());
return interceptor;
}
/**
* 分页插件,自动识别数据库类型
* https://baomidou.com/guide/interceptor-pagination.html
*/
public PaginationInnerInterceptor paginationInnerInterceptor() {
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
// 设置最大单页限制数量,默认 500 条,-1 不受限制
paginationInnerInterceptor.setMaxLimit(500L);
// 分页合理化
paginationInnerInterceptor.setOverflow(true);
// paginationInnerInterceptor.setOptimizeJoin(new JsqlParserCountOptimize(true));
return paginationInnerInterceptor;
}
/**
* 乐观锁插件
* https://baomidou.com/guide/interceptor-optimistic-locker.html
*/
public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() {
return new OptimisticLockerInnerInterceptor();
}
/**
* 如果是对全表的删除或更新操作,就会终止该操作
* https://baomidou.com/guide/interceptor-block-attack.html
*/
// public BlockAttackInnerInterceptor blockAttackInnerInterceptor() {
// return new BlockAttackInnerInterceptor();
// }
/**
* sql性能规范插件(垃圾SQL拦截)
* 如有需要可以启用
*/
// public IllegalSQLInnerInterceptor illegalSQLInnerInterceptor() {
// return new IllegalSQLInnerInterceptor();
// }
/**
* 自定义主键策略
* https://baomidou.com/guide/id-generator.html
*/
// @Bean
// public IdentifierGenerator idGenerator() {
// return new CustomIdGenerator();
// }
/**
* 元对象字段填充控制器
* https://baomidou.com/guide/auto-fill-metainfo.html
*/
@Bean
public MetaObjectHandler metaObjectHandler() {
return new CreateAndUpdateMetaObjectHandler();
}
/**
* TenantLineInnerInterceptor 多租户插件
* https://baomidou.com/guide/interceptor-tenant-line.html
* DynamicTableNameInnerInterceptor 动态表名插件
* https://baomidou.com/guide/interceptor-dynamic-table-name.html
*/
@Bean
ConfigurationCustomizer mybatisConfigurationCustomizer() {
return new ConfigurationCustomizer() {
@Override
public void customize(MybatisConfiguration configuration) {
configuration.addInterceptor(new com.github.pagehelper.PageInterceptor());
}
};
}
}
package com.dsk.framework.mybatisplus;
import cn.hutool.http.HttpStatus;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.dsk.common.core.domain.model.LoginUser;
import com.dsk.common.exception.ServiceException;
import com.dsk.common.utils.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import java.util.Date;
/**
* MP注入处理器
*
* @author Lion Li
* @date 2021/4/25
*/
@Slf4j
public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
try {
//根据属性名字设置要填充的值
if (metaObject.hasGetter("createTime")) {
this.setFieldValByName("createTime", new Date(), metaObject);
}
if (metaObject.hasGetter("createBy")) {
this.setFieldValByName("createBy", getLoginNickname(), metaObject);
}
} catch (Exception e) {
throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED);
}
updateFill(metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
try {
if (metaObject.hasGetter("updateBy")) {
this.setFieldValByName("updateBy", getLoginNickname(), metaObject);
}
if (metaObject.hasGetter("updateTime")) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
} catch (Exception e) {
throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED);
}
}
/**
* 获取登录用户名
*/
private String getLoginUsername() {
LoginUser loginUser;
try {
loginUser = SecurityUtils.getLoginUser();
} catch (Exception e) {
log.warn("自动注入警告 => 用户未登录");
return null;
}
return loginUser.getUsername();
}
/**
* 获取登录用户名
*/
private String getLoginNickname() {
LoginUser loginUser;
try {
loginUser = SecurityUtils.getLoginUser();
} catch (Exception e) {
log.warn("自动注入警告 => 用户未登录");
return null;
}
return loginUser.getUser().getNickName();
}
}
......@@ -20,4 +20,6 @@ npm run dev
4* 组件引用:公用组件存放目录src/components;单独引用的组件存放目录可在页面同级目录下建component文件夹存。
5* 表格小样例:src/views/macro/nationalEconomies/index.vue
\ No newline at end of file
5* 表格小样例:src/views/macro/nationalEconomies/index.vue。
6* 页面上能使用栅栏布局的就用栅栏布局,拉伸收缩能达到适当的自适应效果。
\ No newline at end of file
......@@ -41,6 +41,7 @@
"clipboard": "2.0.8",
"core-js": "3.25.3",
"echarts": "5.4.0",
"element-resize-detector": "^1.2.4",
"element-ui": "2.15.12",
"file-saver": "2.0.5",
"fuse.js": "6.4.3",
......
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1684392363345" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4078" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M300.8 202.666667l-12.8 64h-42.666667v640h533.333334v-640h-42.666667l-12.8-64h119.466667v768h-661.333334v-768h119.466667zM554.666667 640v64H320v-64h234.666667z m149.333333-170.666667v64H320v-64h384zM512 53.333333A96 96 0 0 1 608 149.333333v10.666667h58.24l34.133333 170.666667H323.626667l34.133333-170.666667h58.24V149.333333A96 96 0 0 1 512 53.333333z m0 64A32 32 0 0 0 480 149.333333v74.666667h-69.76l-8.533333 42.666667h220.586666l-8.533333-42.666667H544V149.333333A32 32 0 0 0 512 117.333333z" fill="#979797" p-id="4079"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1684392363345" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4078" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M300.8 202.666667l-12.8 64h-42.666667v640h533.333334v-640h-42.666667l-12.8-64h119.466667v768h-661.333334v-768h119.466667zM554.666667 640v64H320v-64h234.666667z m149.333333-170.666667v64H320v-64h384zM512 53.333333A96 96 0 0 1 608 149.333333v10.666667h58.24l34.133333 170.666667H323.626667l34.133333-170.666667h58.24V149.333333A96 96 0 0 1 512 53.333333z m0 64A32 32 0 0 0 480 149.333333v74.666667h-69.76l-8.533333 42.666667h220.586666l-8.533333-42.666667H544V149.333333A32 32 0 0 0 512 117.333333z" fill="#58637B" p-id="4079"></path></svg>
\ No newline at end of file
......@@ -494,6 +494,14 @@ ul, li {
width: 16px;
}
}
.btnsmall{
display: inline-block;
font-size: 12px;
border-radius: 2px;
width: 72px;
text-align: center;
margin: 0 4px;
}
.btn_default{
border: 1px solid #0081FF;
color: #0081FF;
......@@ -527,6 +535,25 @@ ul, li {
background-color: #006AD1;
}
}
.btn_cancel{
border: 1px solid #CCCCCC;
color: #4f4f4f;
&.h28{
line-height: 26px;
}
&.h32 {
line-height: 30px;
}
&.h34{
line-height: 32px;
}
&:hover{
color: #4f4f4f;
border-color: #CCCCCC;
background-color: #F4F4F4;
}
}
//搜索框
.searchInput{
width: 590px;
......@@ -556,3 +583,34 @@ ul, li {
}
}
}
//导出EXCEL
.btn-export{
display: inline-block;
color: #232323;
font-size: 14px;
height: 24px;
line-height: 24px;
cursor: pointer;
img{
margin-right: 5px;
float: left;
width: 18px;
height: 18px;
margin-top: 2px;
}
&:hover{
color: #0081FF;
}
}
//有链接字体颜色
.wordprimary{
color: #0081FF;
cursor: pointer;
}
//分割线
.el-divider--horizontal{
margin: 0;
}
.el-divider{
background-color: #efefef;
}
<template>
<div class="navbar">
<hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
<breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!topNav"/>
<top-nav id="topmenu-container" class="topmenu-container" v-if="topNav"/>
<div class="right-menu">
<template v-if="device!=='mobile'">
<search id="header-search" class="right-menu-item" />
<el-tooltip content="源码地址" effect="dark" placement="bottom">
<ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" />
</el-tooltip>
<el-tooltip content="文档地址" effect="dark" placement="bottom">
<ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" />
</el-tooltip>
<screenfull id="screenfull" class="right-menu-item hover-effect" />
<el-tooltip content="布局大小" effect="dark" placement="bottom">
<size-select id="size-select" class="right-menu-item hover-effect" />
</el-tooltip>
</template>
<el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
<div class="avatar-wrapper">
<img :src="avatar" class="user-avatar">
<i class="el-icon-caret-bottom" />
<div id="navBar" class="navbar">
<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" />
<el-dropdown class="avatar-container" trigger="hover">
<div class="flex-box avatar-wrapper">
<img v-if="avatar" class="pic-avatar" src="@/assets/images/avatar.png">
<span v-else class="user-avatar">{{ name&&name.slice(0, 1) }}</span>
{{ name }}
</div>
<el-dropdown-menu slot="dropdown">
<el-dropdown-menu slot="dropdown" class="user-dropdown">
<router-link to="/user/profile">
<el-dropdown-item>个人中心</el-dropdown-item>
<el-dropdown-item>用户中心</el-dropdown-item>
</router-link>
<el-dropdown-item @click.native="setting = true">
<span>布局设置</span>
</el-dropdown-item>
<el-dropdown-item divided @click.native="logout">
<span>退出登录</span>
<span>退出</span>
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
......@@ -48,53 +27,36 @@
<script>
import { mapGetters } from 'vuex'
import Breadcrumb from '@/components/Breadcrumb'
import TopNav from '@/components/TopNav'
import Hamburger from '@/components/Hamburger'
import Screenfull from '@/components/Screenfull'
import SizeSelect from '@/components/SizeSelect'
import Search from '@/components/HeaderSearch'
import RuoYiGit from '@/components/RuoYi/Git'
import RuoYiDoc from '@/components/RuoYi/Doc'
import elementResizeDetectorMaker from "element-resize-detector"
import TagsView from './TagsView'
export default {
components: {
Breadcrumb,
TopNav,
Hamburger,
Screenfull,
SizeSelect,
Search,
RuoYiGit,
RuoYiDoc
TagsView
},
data() {
return {
scrollerWidth: null
}
},
computed: {
...mapGetters([
'sidebar',
'avatar',
'device'
]),
setting: {
get() {
return this.$store.state.settings.showSettings
'name'
])
},
set(val) {
this.$store.dispatch('settings/changeSetting', {
key: 'showSettings',
value: val
mounted() {
const _this = this, erd = elementResizeDetectorMaker(), navBar = document.getElementById("navBar")
erd.listenTo(navBar, element => {
_this.$nextTick(() => {
const nvWidth = navBar.offsetWidth
const rtWidth = _this.$refs.rightMenu.offsetWidth
this.scrollerWidth = (nvWidth - rtWidth - 100)+'px' || '800px'
})
})
}
},
topNav: {
get() {
return this.$store.state.settings.topNav
}
}
},
methods: {
toggleSideBar() {
this.$store.dispatch('app/toggleSideBar')
},
async logout() {
this.$confirm('确定注销并退出系统吗?', '提示', {
confirmButtonText: '确定',
......@@ -112,89 +74,94 @@ export default {
<style lang="scss" scoped>
.navbar {
height: 50px;
overflow: hidden;
height: 56px;
overflow: inherit;
position: relative;
background: #fff;
box-shadow: 0 1px 4px rgba(0,21,41,.08);
.hamburger-container {
line-height: 46px;
height: 100%;
float: left;
cursor: pointer;
transition: background .3s;
-webkit-tap-highlight-color:transparent;
&:hover {
background: rgba(0, 0, 0, .025)
}
}
.breadcrumb-container {
.left-menu{
float: left;
}
.topmenu-container {
position: absolute;
left: 50px;
}
.errLog-container {
display: inline-block;
vertical-align: top;
}
.right-menu {
float: right;
height: 100%;
line-height: 50px;
&:focus {
outline: none;
}
.right-menu-item {
display: inline-block;
padding: 0 8px;
height: 100%;
font-size: 18px;
color: #5a5e66;
vertical-align: text-bottom;
&.hover-effect {
.menu-bells{
position: relative;
margin-right: 16px;
cursor: pointer;
transition: background .3s;
&:hover {
background: rgba(0, 0, 0, .025)
img{
width: 24px;
height: 24px;
}
i{
width: 6px;
height: 6px;
background: #FF4545;
border-radius: 50%;
position: absolute;
right: 0;
top: 0;
}
}
.menu-line{
display: inline-block;
width: 1px;
height: 24px;
background: #EEEEEE;
margin-right: 16px;
}
.avatar-container {
margin-right: 30px;
margin-right: 24px;
margin-top: -5px;
.avatar-wrapper {
margin-top: 5px;
position: relative;
.user-avatar {
font-size: 12px;
color: #232323;
line-height: 20px;
cursor: pointer;
width: 40px;
height: 40px;
border-radius: 10px;
.pic-avatar{
width: 20px;
height: 20px;
border-radius: 50%;
margin-right: 4px;
overflow: hidden;
}
.el-icon-caret-bottom {
.user-avatar {
display: inline-block;
cursor: pointer;
position: absolute;
right: -20px;
top: 25px;
font-size: 12px;
width: 20px;
height: 20px;
line-height: 20px;
text-align: center;
background: #E3EEF9;
color: #0081FF;
border-radius: 50%;
margin-right: 4px;
}
}
}
}
}
.user-dropdown {
.el-dropdown-menu__item{
font-size: 12px;
color: #232323;
line-height: 24px;
border-top: 0;
margin-top: 0;
padding: 0 12px;
&:focus, &:not(.is-disabled):hover{
background: #E3EEF9;
}
&:before{
height: 0;
margin: 0;
}
}
}
</style>
......@@ -87,7 +87,17 @@ export default {
bottom: 0px;
}
.el-scrollbar__wrap {
height: 39px;
height: 100%;
padding-top: 24px;
margin-bottom: 0 !important;
}
.is-horizontal{
width: 0;
height: 0;
}
.is-vertical{
width: 0;
height: 0;
}
}
}
......
......@@ -2,19 +2,22 @@
<div id="tags-view-container" class="tags-view-container">
<scroll-pane ref="scrollPane" class="tags-view-wrapper" @scroll="handleScroll">
<router-link
v-for="tag in visitedViews"
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"
:style="activeStyle(tag)"
@click.middle.native="!isAffix(tag)?closeSelectedTag(tag):''"
@contextmenu.prevent.native="openMenu(tag,$event)"
>
<svg :class="isActive(tag)?'tags-icon tags-icon-active':'tags-icon'" aria-hidden="true">
<use :xlink:href="iconName(tag)" />
</svg>
{{ tag.title }}
<span v-if="!isAffix(tag)" class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)" />
<i :class="index!=visitedViews.length-1 && index != isActiveIndex() && index != isActiveIndex()-1?'tags-item-line':'tags-item-line item-color'" />
</router-link>
</scroll-pane>
<ul v-show="visible" :style="{left:left+'px',top:top+'px'}" class="contextmenu">
......@@ -47,6 +50,21 @@ export default {
visitedViews() {
return this.$store.state.tagsView.visitedViews
},
iconName() {
return function(val) {
let svgIcon = val.meta.icon, currentIcon = ''
let icon = this.isActive(val) ? svgIcon+'Tags' : svgIcon+'Tag'
if (!svgIcon) {
const index = val.path.indexOf('/', val.path.indexOf('/') + 1)
const parentPath = val.path.slice(0, index)
const currentRoute = this.$router.options.routes.find(item => item.path === parentPath)
currentIcon = currentRoute.meta.icon
icon = this.isActive(val) ? currentIcon+'Tags' : currentIcon+'Tag'
}
icon = (svgIcon && svgIcon != '#') || (currentIcon && svgIcon != '#') ? icon : this.isActive(val) ? 'defaultTags' : 'defaultTag'
return `#icon-${icon}`
}
},
routes() {
return this.$store.state.permission.routes
},
......@@ -75,16 +93,13 @@ export default {
isActive(route) {
return route.path === this.$route.path
},
activeStyle(tag) {
if (!this.isActive(tag)) return {};
return {
"background-color": this.theme,
"border-color": this.theme
};
},
isAffix(tag) {
return tag.meta && tag.meta.affix
},
isActiveIndex() {
const idx = this.visitedViews.findIndex(item => item.path === this.$route.path) || 0
return idx
},
isFirstView() {
try {
return this.selectedTag.fullPath === '/index' || this.selectedTag.fullPath === this.visitedViews[1].fullPath
......@@ -239,44 +254,63 @@ export default {
<style lang="scss" scoped>
.tags-view-container {
height: 34px;
height: 56px;
width: 100%;
background: #fff;
border-bottom: 1px solid #d8dce5;
box-shadow: 0 1px 3px 0 rgba(0, 0, 0, .12), 0 0 3px 0 rgba(0, 0, 0, .04);
.tags-view-wrapper {
.tags-view-item {
display: inline-block;
position: relative;
cursor: pointer;
height: 26px;
line-height: 26px;
border: 1px solid #d8dce5;
min-width: 128px;
height: 32px;
line-height: 32px;
color: #495060;
background: #fff;
padding: 0 8px;
padding: 0 20px 0 8px;
font-size: 12px;
margin-left: 5px;
margin-top: 4px;
.tags-icon{
width: 16px;
height: 16px;
fill: currentColor;
color: #5a5e66;
margin: 8px 4px -3px 4px;
&.tags-icon-active{
color: pink;
}
}
.tags-item-line{
display: block;
width: 1px;
height: 24px;
background: #D0D1D9;
position: absolute;
right: 0;
top: 4px;
z-index: 2;
&.item-color{
background: #FFFFFF;
}
}
&:first-of-type {
margin-left: 15px;
margin-left: 24px;
}
&:hover {
.el-icon-close{
background-color: rgba(153,153,153,0.3);
color: #999999;
}
&:last-of-type {
margin-right: 15px;
}
&.active {
background-color: #42b983;
color: #fff;
border-color: #42b983;
&::before {
content: '';
background: #fff;
display: inline-block;
width: 8px;
height: 8px;
border-radius: 50%;
position: relative;
margin-right: 2px;
background-color: #F5F5F5;
color: #232323;
border-top-left-radius: 10px;
border-top-right-radius: 10px;
&:hover {
.el-icon-close{
background-color: initial;
color: initial;
}
}
}
}
......@@ -310,6 +344,9 @@ export default {
.tags-view-wrapper {
.tags-view-item {
.el-icon-close {
position: absolute;
right: 5px;
top: 8px;
width: 16px;
height: 16px;
vertical-align: 2px;
......@@ -322,10 +359,6 @@ export default {
display: inline-block;
vertical-align: -3px;
}
&:hover {
background-color: #b4bccc;
color: #fff;
}
}
}
}
......
......@@ -70,7 +70,7 @@ export const constantRoutes = [
path: 'index',
component: () => import('@/views/index'),
name: 'Index',
meta: { title: '首页', icon: 'index', affix: true }
meta: { title: '首页', icon: 'index', }
}
]
},
......@@ -87,6 +87,39 @@ export const constantRoutes = [
meta: { title: '个人中心', icon: 'user' }
}
]
},
{
path: '/party',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: 'party-a',
component: () => import('@/views/detail/party-a/index'),
name: 'PartyA',
meta: { title: '甲方详情', icon: 'custom' }
},
{
path: 'party-b',
component: () => import('@/views/detail/party-b/index'),
name: 'PartyB',
meta: { title: '已方详情', icon: 'users' }
}
]
},
{
path: '/financing',
component: Layout,
hidden: true,
children: [
{
path: '/macro/financing/details/:id(\\d+)',
component: () => import('@/views/macro/financing/details'),
name: 'financingDetails',
meta: { title: '区域专项债详情' }
}
]
}
]
......
<template>
<div class="app-container part-container">
<div class="bread-crumb">
<el-breadcrumb separator="/">
<el-breadcrumb-item :to="{ path: '/' }">企业数据</el-breadcrumb-item>
<el-breadcrumb-item><a href="/">查企业</a></el-breadcrumb-item>
<el-breadcrumb-item>中铁一建</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="flex-box part-header">
<img class="header-logo" src="@/assets/images/avatar.png">
中交第二航务工程局有限公司
</div>
</div>
</template>
<script>
export default {
name: 'PartyA',
data() {
return {
}
},
created() {
},
methods: {
}
}
</script>
<style lang="scss" scoped>
.part-container{
padding: 0;
}
.bread-crumb{
.el-breadcrumb{
font-size: 12px;
::v-deep .el-breadcrumb__separator{
margin: 0 5px;
}
::v-deep .el-breadcrumb__inner.is-link, .el-breadcrumb__inner a{
color: rgba(35,35,35,0.4);
&:hover{
color: #1890ff;
}
}
::v-deep .el-breadcrumb__item{
&:last-child .el-breadcrumb__inner{
color: #232323;
}
&:nth-last-child(2){
.el-breadcrumb__separator{
color: #232323;
}
}
}
}
}
.part-header{
font-size: 16px;
font-weight: bold;
color: #232323;
background: #FFFFFF;
padding: 14px 16px;
margin-top: 12px;
.header-logo{
width: 28px;
height: 28px;
margin-right: 16px;
}
}
</style>
<template>
<div v-loading="loading" class="app-container">
<iframe ref="companyIframe" marginwidth="0" marginheight="0" frameborder="0" scrolling="no" width="100%" :height="iframeHight" :src="src" />
</div>
</template>
<script>
export default {
name: 'PartyB',
components: {
},
data() {
return {
loading: false, // 是否加载中
companyId: null, // 企业ID
iframeHight: window.innerHeight, // iframe高度
scrollTop: 0, // 滚动条距离内部页面顶部距离
token: this.$store.getters.token // 需要携带的token
}
},
created() {
if (this.$route.query.companyId) { // 获取companyId
this.loading = true
this.companyId = this.encodeStr(window.atob(this.$route.query.companyId))
this.src = `https://pre-plug.jiansheku.com/enterprise/${this.companyId}?token=${this.token}`
}
// 示例传参:?companyId=window.btoa('12306')
},
mounted() {
this.getInframeHight() // 实时控制iframe高度
window.addEventListener('scroll', this.scrolling) // 监听页面滚动事件
},
beforeDestroy() {
window.removeEventListener('scroll', this.scrolling) // 销毁页面滚动事件
},
methods: {
getInframeHight() {
const _this = this
window.addEventListener('message', function(e) {
const data = e.data
const sc = document && document.documentElement.scrollTop || document && document.body.scrollTop
if (data && typeof data === 'object') {
// 动态设置iFrame高度
if (data.height) {
_this.iframeHight = data.height
_this.loading = false
}
// 点击栏目名及子标签动态设置滚动高度
if (data.scrollHeight) {
window.scrollTo(sc, parseInt(data.scrollHeight) + 83)
}
// 点击下拉子标签动态设置滚动高度
if (data.clientHeight) {
window.scrollTo(sc, sc - 30)
}
}
})
},
scrolling() {
// 滚动条距文档顶部的距离
const scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
this.scrollTop = scrollTop
// 准备传值
this.$nextTick(() => {
const ifa = this.$refs.companyIframe
ifa.contentWindow.postMessage({ 'scrollTop': this.scrollTop }, '*')
})
},
// companyId加密
encodeStr(str, secondary) {
const table = 'VyB2Kz79QWYjpiD5lRCIMwJEhqFSx0GN1cveZfU4gs6rk8dPbLtAomOnT3'
const ss = [2, 7, 5, 1, 4, 8, 3, 0, 6]
const xor = 177451812
const add = 8728348608
const mp2 = new Map()
let content = secondary ? str : ' '
let result = '' // 最终加密id
if (!secondary) {
let s = parseInt(str)
s = (s ^ xor) + add
for (let i = 0; i < table.length; i++) {
const s1 = table.substring(i, i + 1)
mp2.set(i, s1)
}
for (let i = 0; i < 9; i++) {
const r = mp2.get(parseInt(s / this.power(58, i) % 58))
content = this.changeStr(content, ss[i], r)
}
}
// 二次加密
const idArr = content.split('')
for (var i = 0; i < idArr.length; i++) {
const hex = idArr[i].charCodeAt().toString(16)
result = result + hex
}
return result
},
power(a, b) {
let power = 1
for (let c = 0; c < b; c++) {
power *= a
}
return power
},
changeStr(str, index, changeStr) {
return str.substr(0, index) + changeStr + str.substr(index + changeStr.length)
}
}
}
</script>
<style lang="scss" scoped>
</style>
<template>
<div class="app-container qyzx-details">
<p class="tab">区域专项债 <span>/ 专项债项目详情{{id}}</span></p>
<div class="content main1">
<div class="title"><img src="@/assets/images/financing/head_icon.png" />重庆至黔江高速铁路项目一项目详情</div>
<p>本项目是厦渝高铁通道的重要组成部分,是成渝地区、海西经济区间高速客运交流的主通道;是成渝地区与华南、华东地区间客运交流的辅助通道;是以重庆主城为核心的城际客流的快速客运通道;
是整合区域旅游资源,促进沿线旅游资源开发的黄金旅游通道。线路起自重庆站,经巴南、南川、武隆、彭水,终至江,正线全长265公里,设8座,其中新建6座。
同步建设重庆东动车所动车出入段,重庆枢纽东环联络线。</p>
</div>
<div class="content main2">
<div class="common-title">项目筹资</div>
<div class="main2-box">
<div class="list">
<div class="item color1">
<div class="item-left">
<h4>535.00<span>亿</span></h4>
<p>项目总投资额</p>
</div>
<img class="img" src="@/assets/images/financing/icon1.png" />
</div>
<div class="item color2">
<div class="item-left">
<h4>535.00<span>亿</span></h4>
<p>项目资本金</p>
</div>
<img class="img" src="@/assets/images/financing/icon2.png" />
</div>
<div class="item color3">
<div class="item-left">
<h4>535.00<span>亿</span></h4>
<p>专项债融资</p>
</div>
<img class="img" src="@/assets/images/financing/icon3.png" />
</div>
<div class="item color4">
<div class="item-left">
<h4>535.00<span>亿</span></h4>
<p>专项债用作资本金</p>
</div>
<img class="img" src="@/assets/images/financing/icon4.png" />
</div>
</div>
<div class="list">
<div class="item color4">
<div class="item-left">
<h4>535.00<span>亿</span></h4>
<p>其他资金</p>
</div>
<img class="img" src="@/assets/images/financing/icon5.png" />
</div>
<div class="item color3">
<div class="item-left">
<h4>535.00<span>亿 / 10只</span></h4>
<p>专项债融资额/专项债只数</p>
</div>
<img class="img" src="@/assets/images/financing/icon6.png" />
</div>
<div class="item color4">
<div class="item-left">
<h4>535.00<span>亿</span></h4>
<p>其他融资</p>
</div>
<img class="img" src="@/assets/images/financing/icon7.png" />
</div>
<div class="item color2">
<div class="item-left">
<h4>535.00<span>亿</span></h4>
<p>政府安排资金</p>
</div>
<img class="img" src="@/assets/images/financing/icon8.png" />
</div>
</div>
</div>
</div>
<div class="content main3">
<div class="common-title">项目保障</div>
</div>
<div class="content main4">
<div class="common-title">项目当事人</div>
<div class="main4-box">
<label class="label">项目主体</label>
<span>重庆铁路投资集团有限公司</span>
<label class="label">主管部门</label>
<span>-</span>
<label class="label">实施单位</label>
<span>重庆铁路投资集团有限公司</span>
</div>
</div>
<div class="content main5">
<div class="common-title">专项债</div>
<div class="table-item">
<el-table
:data="tableData"
element-loading-text="Loading"
border
fit
highlight-current-row
>
<el-table-column prop="name" label="债券简称">
<template slot-scope="scope">
<router-link :to="'/macro/financing/details/'+ scope.row.id" tag="a" class="a-link">{{ scope.row.name}}</router-link>
</template>
</el-table-column>
<el-table-column prop="name" label="招标日期" width="220" />
<el-table-column prop="gm" label="专项债规模(亿)" width="260" />
<el-table-column prop="gm" label="用于项目规模(亿)" width="260" />
<el-table-column prop="zj" label="是否资本金" width="200" />
</el-table>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'financingDetails',
data() {
return {
id:'',
tableData:[
{
id:0,
name:'20重庆债14(2005938)',
time:'2020-09-18',
gm:'285.24',
zj:'否',
}
]
}
},
created() {
console.log(this.$route.params)
this.id=this.$route.params.id
},
methods: {
}
}
</script>
<style lang="scss" scoped>
.app-container{
padding: 0;
}
.qyzx-details{
.tab{
font-size: 12px;
color:#A1A1A1;
span{
color:#232323;
}
}
.content{
margin-top: 16px;
background: #FFFFFF;
padding: 16px;
}
.common-title{
margin-bottom: 8px;
}
.main1{
.title{
color: #232323;
font-size: 16px;
line-height: 28px;
font-weight: bold;
margin-bottom: 8px;
text-align: left;
img{
width: 28px;
height: 28px;
margin-bottom: -9px;
margin-right: 17px;
}
}
p{
color: #3D3D3D;
font-size: 14px;
margin: 0;
}
}
.main2{
.list{
display: flex;
margin: 16px 0;
}
.item{
width: 24.5%;
margin-right: 16px;
height: 100px;
display: flex;
justify-content: space-between;
border-radius: 8px;
.item-left{
margin-left: 16px;
margin-top: 24px;
h4{
color: #232323;
font-size: 22px;
line-height: 22px;
font-weight: bold;
margin: 0;
span{
font-weight: 400;
margin-left: 4px;
font-size: 18px;
}
}
p{
margin: 0;
color: #3D3D3D;
font-size: 14px;
padding-top: 8px;
}
}
.img{
width: 56px;
height: 56px;
margin-top: 22px;
margin-right: 12px;
}
}
.color1{
background: rgba(246,190,59,0.08);
border: 1px solid rgba(246,190,59,0.2);
}
.color2{
background: rgba(148,216,196,0.102);
border: 1px solid rgba(73,187,154,0.1);
}
.color3{
background: rgba(57,100,199,0.06);
border: 1px solid rgba(57,100,199,0.1);
}
.color4{
background: rgba(0,129,255,0.04);
border: 1px solid rgba(0,129,255,0.1);
}
}
.main4{
.main4-box{
margin-top: 22px;
.label{
width: 14%;
background: #F0F3FA;
border: 1px solid #E6E9F0;
display: inline-block;
height: 40px;
line-height: 40px;
font-size: 12px;
color: rgba(35,35,35,0.8);
padding-left: 12px;
}
span{
width: 19%;
display: inline-block;
height: 40px;
line-height: 40px;
border-top: 1px solid #E6E9F0;
border-bottom: 1px solid #E6E9F0;
padding-left: 12px;
font-size: 12px;
}
span:last-child{
width: 20%;
border-right: 1px solid #E6E9F0;
}
}
}
}
</style>
<template>
<div class="app-container">
<div>
专项债项目
<div class="app-container qyzx">
<div class="content">
<div class="common-title">专项债项目</div>
<div class="content-box">
<div class="box-left">
<div id="echarts" style="height: 400px"></div>
</div>
<div class="box-right">
<el-table
:data="tableData"
element-loading-text="Loading"
border
height="360"
fit
highlight-current-row
>
<el-table-column prop="name" label="项目关系" width="150" />
<el-table-column prop="value" label="项目个数" width="140" />
<el-table-column prop="tz" label="投资额(亿元)" width="140" />
<el-table-column prop="bl" label="比例" width="140" />
</el-table>
</div>
</div>
</div>
<div class="content">
<div class="common-title flex-box">
<div class="flex-box">项目明细</div>
<div class="flex-box query-ability">
<span class="flex-box">{{tableDataTotal}}</span>
<span class="flex-box"><img src="@/assets/images/ability_excel.png">导出EXCEL</span>
</div>
</div>
<div class="table-item">
<el-table
:data="listData"
element-loading-text="Loading"
border
fit
highlight-current-row
>
<el-table-column label="序号" width="55" align="left" fixed>
<template slot-scope="scope">{{ pageIndex * pageSize - pageSize + scope.$index + 1 }}</template>
</el-table-column>
<el-table-column prop="name" label="项目名称" width="290">
<template slot-scope="scope">
<router-link :to="'/macro/financing/details/'+ scope.row.id" tag="a" class="a-link">{{ scope.row.name}}</router-link>
</template>
</el-table-column>
<el-table-column prop="tz" label="项目总投资(亿)" sortable width="155" />
<el-table-column prop="bj" label="项目资本金(亿)" sortable width="155" />
<el-table-column prop="sy" label="项目收益倍数(倍)" width="150" />
<el-table-column prop="zxz" label="专项债金额(亿)" width="150" />
<el-table-column prop="zxzzj" label="专项债用作资本金(亿)" width="170" />
<el-table-column prop="xmzt" label="项目主体"/>
</el-table>
</div>
<div>
项目明细
</div>
</div>
</template>
<script>
import * as echarts from 'echarts';
export default {
name: 'Financing',
data() {
return {
tableData:[
{
name:'农业农村',
value:'2',
tz:'50.01',
bl:'0.19%'
},
{
name:'乡村振兴',
value:'2',
tz:'50.01',
bl:'0.19%'
},
{
name:'农林水利',
value:'2',
tz:'50.01',
bl:'0.19%'
},
{
name:'交通',
value:'2',
tz:'50.01',
bl:'0.19%'
},
{
name:'轨道交通',
value:'2',
tz:'50.01',
bl:'0.19%'
},
{
name:'政府收费公路',
value:'2',
tz:'50.01',
bl:'0.19%'
},
{
name:'其他交通基础设施',
value:'2',
tz:'50.01',
bl:'0.19%'
},
{
name:'铁路',
value:'2',
tz:'50.01',
bl:'0.19%'
},
{
name:'养老',
value:'2',
tz:'50.01',
bl:'0.19%'
},
{
name:'生态环保',
value:'2',
tz:'50.01',
bl:'0.19%'
},
{
name:'职业教育',
value:'2',
tz:'50.01',
bl:'0.19%'
},
{
name:'能源',
value:'2',
tz:'50.01',
bl:'0.19%'
},
],
listData:[
{
id:1,
name:'涪陵高新产业园区总和配套项目',
tz:'535.00',
bj:'235.00',
sy:'3',
zxz:'230',
zxzzj:'423',
xmzt:'重庆市涪陵区新城区开发 (集团) 有限公司',
},
{
id:2,
name:'涪陵高新产业园区总和配套项目',
tz:'235.00',
bj:'435.00',
sy:'6',
zxz:'530',
zxzzj:'323',
xmzt:'重庆市涪陵区新城区开发 (集团) 有限公司',
}
],
tableLoading: false,
pageIndex: 1,
pageSize: 10,
tableDataTotal: 120
}
},
created() {
this.$nextTick(()=>{
this.initChart()
})
},
methods: {
initChart() {
let myChart = echarts.init(document.getElementById("echarts"))
let option ={
tooltip: {
trigger: 'item',
borderWidth:0,
backgroundColor:"rgba(255, 255, 255, 0.8)",
formatter: function (params) {
var result = ''
result+='<h3 style="color: #232226;padding: 0 0 5px 0;margin: 0;">'+ params.data.name +'</h3>'
result+='<p style="color: rgba(35,35,35,0.8);padding: 0;margin: 0;">'+ params.data.value +'个</p>'
result+='<p style="color: rgba(35,35,35,0.8);padding: 0;margin: 0;">'+ params.data.tz +'亿元</p>'
result+='<p style="color: rgba(35,35,35,0.8);padding: 0;margin: 0;">'+ params.data.bl +'%</p>'
return result;
},
extraCssText:'width:150px!important;',
},
legend: {
type: 'scroll',
orient: 'horizontal',
bottom: 20,
data: this.tableData,
pageButtonPosition: 'end',
},
series: [
{
type: 'pie',
radius: '55%',
center: ['50%', '40%'],
data: this.tableData,
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
}
myChart.setOption(option);
}
}
}
</script>
<style lang="scss" scoped>
.app-container{
padding: 0;
}
.qyzx{
.content{
background: #ffffff;
padding: 16px;
margin-bottom: 16px;
}
.common-title{
justify-content: space-between;
}
.content-box{
height: 422px;
display: flex;
justify-content: space-between;
.box-left{
width: 55%;
}
.box-right{
float: right;
::v-deep .el-table{
.el-table__cell{
height: 40px;
padding: 0;
line-height: 40px;
}
}
}
}
.table-item{
margin-top: 22px;
}
}
</style>
<template>
<div class="child-container">
<div class="child-container ndmx-detail">
<el-drawer
:visible.sync="dialogVisible"
direction="rtl"
size="50%"
>
<div slot="title" class="common-title">年度明细</div>
<div slot="title" class="ndmx-title"><img src="@/assets/images/economies/icon.png" class="icon">年度明细</div>
<!--<div class="content">-->
<!--<div class="main-title">-->
<!--<span class="label-200">指标</span>-->
<!--<span>2022年</span>-->
<!--<span>2021年</span>-->
<!--<span>2020年</span>-->
<!--<span>2019年</span>-->
<!--<span>2018年</span>-->
<!--</div>-->
<!--<div class="main-list">-->
<!--<div class="item">-->
<!--<h3></h3>-->
<!--<div class="item-cont">-->
<!--<span>指标</span>-->
<!--<span>2022年</span>-->
<!--<span>2021年</span>-->
<!--<span>2020年</span>-->
<!--<span>2019年</span>-->
<!--<span>2018年</span>-->
<!--</div>-->
<!--</div>-->
<!--</div>-->
<!--</div>-->
<div class="table-item">
<el-table
:data="tableData"
element-loading-text="Loading"
:data="getValues"
:show-header="false"
border
fit
highlight-current-row
>
<el-table-column prop="date" label="指标" width="150" />
<el-table-column prop="name" label="2022年" width="200" />
<el-table-column prop="name" label="2021年" />
<el-table-column prop="name" label="2020年" />
<el-table-column prop="name" label="2019年" />
<el-table-column prop="name" label="2018年" />
<el-table-column
v-for="(item, index) in getHeaders"
:key="index"
:prop="item"
>
</el-table-column>
</el-table>
</div>
</el-drawer>
......@@ -36,28 +57,62 @@ export default {
data() {
return {
dialogVisible: false,
tableData: [{
date: '2016-05-02',
name: '大司空'
}, {
date: '2016-05-04',
name: '大司空'
}, {
date: '2016-05-01',
name: '大司空'
}, {
date: '2016-05-03',
name: '大司空'
}, {
date: '2016-05-03',
name: '大司空'
}, {
date: '2016-05-03',
name: '大司空'
}]
tableData: [
{
zb:"2022年",
gdp:'129,118.58',
gdpzs:'124,369.67',
rjgdp:'134,369.67',
},
{
zb:"2021年",
gdp:'129,118.58',
gdpzs:'124,369.67',
rjgdp:'134,369.67',
},
{
zb:"2020年",
gdp:'129,118.58',
gdpzs:'124,369.67',
rjgdp:'134,369.67',
},
],
headers: [
{
prop: 'zb',
label: '指标',
},
{
prop: 'name',
label: '国民经济核算',
},
{
prop: 'gdp',
label: 'GDP(亿元)',
},
{
prop: 'gdpzs',
label: 'GDP增速',
},
{
prop: 'rjgdp',
label: '人均GDP(元)',
},
],
}
},
created() {
},
computed: {
getHeaders() {
return this.tableData.reduce((pre, cur, index) => pre.concat(`value${index}`), ['title'])
},
getValues() {
return this.headers.map(item => {
return this.tableData.reduce((pre, cur, index) => Object.assign(pre, {['value' + index]: cur[item.prop]}), {'title': item.label,});
});
}
},
methods: {
open(row) {
......@@ -74,6 +129,28 @@ export default {
</script>
<style lang="scss" scoped>
.ndmx-detail{
::v-deep .el-drawer{
.el-drawer__header{
padding:0 0 0 13px;
line-height: 48px;
}
}
.content{
height: 100%;
padding: 0 12px;
}
}
.ndmx-title{
color: #232323;
font-weight: bold;
font-size: 16px;
.icon{
width: 17px;
height: 17px;
margin-right: 8px;
}
}
.table-item{
padding: 16px 10px 16px 16px;
}
......
......@@ -39,7 +39,7 @@
<el-table-column label="序号" width="50" align="left" fixed>
<template slot-scope="scope">{{ pageIndex * pageSize - pageSize + scope.$index + 1 }}</template>
</el-table-column>
<el-table-column label="地区" min-width="60" align="left" fixed>
<el-table-column label="地区" min-width="70" align="left" fixed>
<template slot-scope="scope">
<router-link to="" tag="a" class="a-link">{{ scope.row.address || '广东省' }}</router-link>
</template>
......@@ -72,12 +72,13 @@
<el-table-column label="专项债余额(亿元)" prop="cgfs" width="160" align="left" />
<el-table-column label="地方政府债务限额(亿元)" prop="cgfs" width="160" align="left" />
<el-table-column label="城投平台有息债务??(亿元)" prop="cgfs" width="160" align="left" >
<!--<template slot="header" slot-scope="scope">-->
<!--<el-input-->
<!--v-model="search"-->
<!--size="mini"-->
<!--placeholder="输入关键字搜索"/>-->
<!--</template>-->
<template slot="header" slot-scope="scope">
<span>城投平台有息债务(亿元)
<el-tooltip popper-class="tips" effect="light" content="城投平台有息债务是该地区行政区划下所有的城投公司的短期债务与长期债务合计。其中,短期债务=短期借款+一年内到期的非流动负债+应付短期债券,长期债务=长期借款+应付长期债券。" placement="top">
<i class="el-icon-warning-outline"></i>
</el-tooltip>
</span>
</template>
</el-table-column>
<el-table-column label="负债率(%)" prop="cgfs" width="160" align="left" />
<el-table-column label="负债率(宽口径)(%)" prop="cgfs" width="160" align="left" />
......@@ -128,7 +129,13 @@ export default {
multiple: true,
},
addressList: [],
tableData: [],
tableData: [
{
dataId:'1',
cgrssqy:'100',
cgfs:'200'
}
],
tableLoading: false,
pageIndex: 1,
pageSize: 10,
......@@ -250,8 +257,24 @@ export default {
}
}
</script>
<style lang="scss">
.tips.is-light{
padding: 12px;
width: 318px;
box-sizing: border-box;
font-size: 14px;
line-height: 20px;
color: #333333;
border-color: rgba(0, 0, 0, 0.08);
box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.08);
.popper__arrow {
border-bottom-color: rgba(0, 0, 0, 0.08) !important;
border-top-color: rgba(0, 0, 0, 0.08) !important;
}
}
</style>
<style lang="scss" scoped>
.query-box{
margin: -8px 0 8px 0;
.query-params{
......
......@@ -6,7 +6,9 @@
<div class="btn btn_primary h28"><div class="img img2"></div>批量导出</div>
</div>
<el-tabs v-model="activeName" @tab-click="handleClick" class="tabpane w100">
<el-tab-pane label="我参与的项目" name="first">
<el-tab-pane label="我参与的项目" name="first"></el-tab-pane>
<el-tab-pane label="公司全部项目" name="second"></el-tab-pane>
<div class="searchInput">
<el-input type="text" placeholder="请输入项目或业主单位名称关键词进行搜索"></el-input>
<div class="btn">搜索</div>
......@@ -15,7 +17,13 @@
<div class="selli">
<span>
地区团队
</span>aaa
</span>
<div class="selectInput" @click="getxmdq"><span class="selecttext">{{xmdqlabel}}<i class="el-icon-caret-bottom"></i></span>
<el-cascader class="input"
ref="myCascader"
:props='props' :options="options"
@change="handleChange"></el-cascader>
</div>
</div>
<div class="selli">
<span>
......@@ -25,15 +33,55 @@
</div>
<div class="scbtns">
<div class="btn btn_primary h34">查询</div>
<div class="btn btn_default h34">重置</div>
<div class="btn btn_cancel h34">重置</div>
</div>
</el-tab-pane>
<el-tab-pane label="公司全部项目" name="second">配置管理</el-tab-pane>
</el-tabs>
</el-card>
<el-card class="box-card noborder">
<div class="titles">项目明细
<div class="dc">
<div class="total">共126条</div>
<div class="btn-export"><img src="@/assets/images/EXCEL.png">导出EXCEL</div>
</div>
</div>
<div class="datalist">
<div class="datali">
<div class="det-title">轨道交通13号线扩能提升工程<span class="people"><i>A</i>四川-李丽 <font color="#FA8A00">正在跟进</font></span></div>
<div class="det-tips"><span class="tips tip1">轨道交通</span><span class="tips tip2">江西省-南昌市</span></div>
<div class="det-contets">
<div class="det-con">
<span>项目类型:</span>
<span>轨道交通</span>
</div>
<div class="det-con">
<span>投资估算(万元):</span>
<span>21</span>
</div>
<div class="det-con">
<span>最后跟进时间:</span>
<span>2013-02-19</span>
</div>
<div class="det-con">
<span>业主单位:</span>
<span class="wordprimary">重庆市交通开发投资(集团)有限公司</span>
</div>
</div>
<el-divider></el-divider>
<div class="operates">
<div><img src="@/assets/images/follow.png">跟进</div>
<div><img src="@/assets/images/edit.png">编辑</div>
<div><img src="@/assets/images/delete.png">删除</div>
</div>
<div class="delform">
<div class="words">是否将项目删除</div>
<div>
<div class="btnsmall btn_primary h28">确定</div>
<div class="btnsmall btn_cancel h28">取消</div>
</div>
</div>
</div>
</div>
</el-card>
</div>
</template>
......@@ -44,12 +92,237 @@ export default {
name: 'ProjectList',
data() {
return {
props:{
multiple: true},
xmdq: [],
xmdqlabel:'项目地区',
activeName:'first',
options: [
{
value: 'zhinan',
label: '指南',
children: [{
value: 'shejiyuanze',
label: '设计原则',
children: [{
value: 'yizhi',
label: '一致'
}, {
value: 'fankui',
label: '反馈'
}, {
value: 'xiaolv',
label: '效率'
}, {
value: 'kekong',
label: '可控'
}]
}, {
value: 'daohang',
label: '导航',
children: [{
value: 'cexiangdaohang',
label: '侧向导航'
}, {
value: 'dingbudaohang',
label: '顶部导航'
}]
}]
}, {
value: 'zujian',
label: '组件',
children: [{
value: 'basic',
label: 'Basic',
children: [{
value: 'layout',
label: 'Layout 布局'
}, {
value: 'color',
label: 'Color 色彩'
}, {
value: 'typography',
label: 'Typography 字体'
}, {
value: 'icon',
label: 'Icon 图标'
}, {
value: 'button',
label: 'Button 按钮'
}]
}, {
value: 'form',
label: 'Form',
children: [{
value: 'radio',
label: 'Radio 单选框'
}, {
value: 'checkbox',
label: 'Checkbox 多选框'
}, {
value: 'input',
label: 'Input 输入框'
}, {
value: 'input-number',
label: 'InputNumber 计数器'
}, {
value: 'select',
label: 'Select 选择器'
}, {
value: 'cascader',
label: 'Cascader 级联选择器'
}, {
value: 'switch',
label: 'Switch 开关'
}, {
value: 'slider',
label: 'Slider 滑块'
}, {
value: 'time-picker',
label: 'TimePicker 时间选择器'
}, {
value: 'date-picker',
label: 'DatePicker 日期选择器'
}, {
value: 'datetime-picker',
label: 'DateTimePicker 日期时间选择器'
}, {
value: 'upload',
label: 'Upload 上传'
}, {
value: 'rate',
label: 'Rate 评分'
}, {
value: 'form',
label: 'Form 表单'
}]
}, {
value: 'data',
label: 'Data',
children: [{
value: 'table',
label: 'Table 表格'
}, {
value: 'tag',
label: 'Tag 标签'
}, {
value: 'progress',
label: 'Progress 进度条'
}, {
value: 'tree',
label: 'Tree 树形控件'
}, {
value: 'pagination',
label: 'Pagination 分页'
}, {
value: 'badge',
label: 'Badge 标记'
}]
}, {
value: 'notice',
label: 'Notice',
children: [{
value: 'alert',
label: 'Alert 警告'
}, {
value: 'loading',
label: 'Loading 加载'
}, {
value: 'message',
label: 'Message 消息提示'
}, {
value: 'message-box',
label: 'MessageBox 弹框'
}, {
value: 'notification',
label: 'Notification 通知'
}]
}, {
value: 'navigation',
label: 'Navigation',
children: [{
value: 'menu',
label: 'NavMenu 导航菜单'
}, {
value: 'tabs',
label: 'Tabs 标签页'
}, {
value: 'breadcrumb',
label: 'Breadcrumb 面包屑'
}, {
value: 'dropdown',
label: 'Dropdown 下拉菜单'
}, {
value: 'steps',
label: 'Steps 步骤条'
}]
}, {
value: 'others',
label: 'Others',
children: [{
value: 'dialog',
label: 'Dialog 对话框'
}, {
value: 'tooltip',
label: 'Tooltip 文字提示'
}, {
value: 'popover',
label: 'Popover 弹出框'
}, {
value: 'card',
label: 'Card 卡片'
}, {
value: 'carousel',
label: 'Carousel 走马灯'
}, {
value: 'collapse',
label: 'Collapse 折叠面板'
}]
}]
}, {
value: 'ziyuan',
label: '资源',
children: [{
value: 'axure',
label: 'Axure Components'
}, {
value: 'sketch',
label: 'Sketch Templates'
}, {
value: 'jiaohu',
label: '组件交互文档'
}]
}]
}
},
created() {
},
methods: {
getxmdq(){
console.log(888)
},
handleClick(){
},
handleChange(value) {
console.log(value);
this.xmdq = value
var labelString = this.$refs.myCascader.getCheckedNodes()[0].pathLabels;
console.log(labelString)
if(labelString.length>0){
let dq = ''
labelString.forEach((item,index)=>{
let str = ','
if(index == 0)
str = ''
dq += str + item
})
this.xmdqlabel = dq
}else{
this.xmdqlabel = '项目地区'
}
}
}
}
</script>
......@@ -58,6 +331,9 @@ export default {
.app-container{
padding: 0;
}
.el-card{
overflow: initial;
}
.noborder{
position: relative;
}
......@@ -97,7 +373,169 @@ export default {
>span{
float: left;
margin-right: 28px;
opacity: 0.8;
}
}
}
.titles{
color: #232323;
font-size: 16px;
font-weight: bold;
height: 60px;
line-height: 64px;
border-bottom: 1px solid #EFEFEF;
padding-left: 26px;
&::after{
content: " ";
width: 2px;
height: 14px;
background: #445781;
float: left;
margin-left: -10px;
margin-top: 24px;
}
.dc{
float: right;
font-size: 12px;
color: #3D3D3D;
font-weight: 400;
padding-right: 24px;
position: relative;
&::after{
content: ' ';
width: 2px;
height: 2px;
background: rgba(35,35,35,0.4);
border-radius: 50%;
position: absolute;
top: 30px;
left: 14px;
}
>div{
display: inline-block;
margin-left: 20px;
}
}
}
.datalist{
.datali{
padding: 16px 16px 0;
position: relative;
.operates{
position: absolute;
z-index: 1;
right: 0;
top: 24px;
>div{
padding-right: 16px;
display: inline-block;
font-size: 12px;
>img{
float: left;
margin-right: 5px;
}
}
.tits{
padding: 12px 0;
}
}
.delform{
width: 200px;
height: 114px;
background: #FFFFFF;
box-shadow: 0px 0px 8px 0px rgba(0,0,0,0.1608);
border-radius: 2px;
position: absolute;
right: 16px;
top: -94px;
z-index: 3;
text-align: center;
.words{
padding: 24px 0;
}
}
&:hover{
background-color: #F6F9FC;
cursor: pointer;
}
.det-title{
color: #3D3D3D;
font-size: 16px;
font-weight: 700;
line-height: 23px;
.people{
padding-left: 10px;
color: #4f4f4f;
font-weight: 400;
font-size: 14px;
i{
width: 20px;
height: 20px;
background: #E3EEF9;
border-radius: 50%;
font-style: initial;
font-size: 12px;
display: inline-block;
color: #0081FF;
text-align: center;
line-height: 20px;
margin-right: 4px;
}
}
}
.det-tips{
padding: 8px 0 ;
.tips{
display: inline-block;
padding: 4px 8px;
border-radius: 2px;
font-size: 12px;
margin-right: 8px;
&.tip1{
background-color: #E4F3FD;
color: #41A1FD;
}
&.tip2{
background-color: #F3F3FF;
color: #8491E8;
}
}
}
.det-contets{
padding: 4px 0 16px;
.det-con{
font-size: 14px;
display: inline-block;
padding-right: 32px;
&:last-child{
padding-right: 0;
}
span:nth-child(2n-1){
color: #a7a7a7;
}
}
}
}
}
.selectInput{
position: relative;
display: inline-block;
&:hover{
.selecttext{color: #0081FF;
i{color: #0081FF;}}
}
.selecttext{
i{
margin-left: 5px;
color: #a7a7a7;
}
}
.input{
position: absolute;
left: 0;
opacity: 0;
height: 20px;
}
}
</style>
package com.dsk.system.domain;
package com.dsk.system.domain.customer;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
......@@ -101,17 +99,15 @@ public class Customer implements Serializable {
* 其它管理体系特点
*/
private String otherMsCharacteistic;
/**
* 最后跟进时间
*/
private Date lastFollowTime;
private Long createId;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
private Long updateId;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
......
package com.dsk.system.domain;
package com.dsk.system.domain.customer;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
......@@ -54,10 +52,16 @@ public class CustomerDecisionChain implements Serializable {
*/
private String remark;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 更新人
*/
private String updateBy;
private Long updateId;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
......
package com.dsk.system.domain.customer;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* 客户跟进记录(CustomerFollowRecord)实体类
*
* @author makejava
* @since 2023-05-18 15:07:59
*/
@Data
@NoArgsConstructor
@Accessors(chain = true)
@TableName("customer_follow_record")
public class CustomerFollowRecord implements Serializable {
private static final long serialVersionUID = -17639570424991398L;
@TableId(value = "id",type = IdType.AUTO)
private Long id;
/**
* 客户id
*/
private String customerId;
/**
* 用户id
*/
private Long userId;
/**
* 拜访方式(visit_mode_type)
*/
private String visitMode;
/**
* 下次拜访时间
*/
private Date nextVisitTime;
/**
* 拜访对象姓名
*/
private String name;
/**
* 拜访对象职务
*/
private String position;
/**
* 拜访内容
*/
private String content;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
}
package com.dsk.system.domain.customer;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* 客户负责人表
*
* @author lcl
* @create 2023/5/17
*/
@Data
@NoArgsConstructor
@Accessors(chain = true)
@TableName("customer_user")
public class CustomerUser implements Serializable {
@TableId(value = "id",type = IdType.AUTO)
private Long id;
/**
* 客户id
*/
private String customerId;
/**
* 负责人id
*/
private Long userId;
/**
* 状态
*/
private Integer status;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date careteTime;
/**
* 修改时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
public CustomerUser(String customerId, Long userId) {
this.customerId = customerId;
this.userId = userId;
}
}
package com.dsk.system.domain.customer.dto;
import lombok.Data;
import java.io.Serializable;
/**
* 客户跟进记录筛选对象
*
* @author lcl
* @create 2023/5/18
*/
@Data
public class CustomerFollowRecordSearchDto implements Serializable {
/**
* 客户id
*/
private String customerId;
/**
* 用户id
*/
private Long userId;
}
package com.dsk.system.domain.customer.dto;
import lombok.Data;
import java.io.Serializable;
/**
* @author lcl
* @create 2023/5/16
*/
@Data
public class CustomerSearchDto implements Serializable {
/**
* 企业名称
*/
private String companyName;
/**
* 用户id
*/
private Long userId;
}
package com.dsk.system.domain.customer.vo;
import lombok.Data;
/**
* @author lcl
* @create 2023/5/17
*/
@Data
public class CustomerListVo {
private String customerId;
/**
* jsk企业id
*/
private Integer companyId;
/**
* 客户名称(企业名称)
*/
private String companyName;
/**
* 合作项目
*/
private Integer cooperationProject;
/**
* 跟进项目
*/
private Integer followProject;
/**
* 储备项目
*/
private Integer reserveProject;
/**
* 法定代表人
*/
private String legalPerson;
/**
* 注册资本(字符串)
*/
private String registerCapitalStr;
/**
* 企业性质
*/
private String companyNature;
/**
* 企业级别
*/
private String companyLevel;
/**
* 信用等级
*/
private String creditLevel;
/**
* 上级公司
*/
private String superCompany;
/**
* 是否上市 0:否 1:是
*/
private Integer isOn;
/**
* 是否主要客户 0:否 1:是
*/
private Integer isMajor;
/**
* 发包属性
*/
private String companyAttribute;
/**
* 主要业务
*/
private String mainBusiness;
/**
* 经营范围
*/
private String businessScope;
/**
* 商务条件特点
*/
private String businessCharacteristic;
/**
* 决策链条
*/
private String decisionChain;
/**
* 招投标流程特点
*/
private String bidCharacteristic;
/**
* 履约阶段特点
*/
private String performanceCharacteristic;
/**
* 其它管理体系特点
*/
private String otherMsCharacteistic;
/**
* 跟进人
*/
private String followUser;
}
......@@ -2,13 +2,14 @@ package com.dsk.system.dskService;
import cn.hutool.core.bean.BeanUtil;
import com.dsk.common.core.domain.R;
import com.dsk.common.core.domain.model.EnterpriseBody;
import com.dsk.common.core.domain.model.*;
import com.dsk.common.utils.DskOpenApiUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
/**
......@@ -26,8 +27,73 @@ public class EnterpriseService {
@Autowired
private DskOpenApiUtil dskOpenApiUtil;
public R infoHeader(EnterpriseBody body) throws Exception {
public R infoHeader(EnterpriseInfoHeaderBody body) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/api/jsk/enterprise/infoHeader", BeanUtil.beanToMap(body, false, false));
return BeanUtil.toBean(map, R.class);
}
public R statistic(EnterpriseStatisticBody body) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/api/jsk/enterprise/statistic", BeanUtil.beanToMap(body, false, false));
return BeanUtil.toBean(map, R.class);
}
public R bidDataGroup(EnterpriseBidDataGroupBody body) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterprise/bidDataGroup", BeanUtil.beanToMap(body, false, false));
return BeanUtil.toBean(map, R.class);
}
public R supplierPage(EnterpriseSupplierPageBody body) throws Exception {
Map<String, String> headerMap = new HashMap<>();
headerMap.put("Api-Version", "1.0");
Map<String, Object> map = dskOpenApiUtil.requestBodyWithHeader("/api/jsk/enterpriseBusiness/selectPageSupplierInfo", BeanUtil.beanToMap(body, false, false), headerMap);
return BeanUtil.toBean(map, R.class);
}
public R projectTenderDataGroup(EnterpriseProjectTenderDataGroupBody body) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterprise/projectTenderDataGroup", BeanUtil.beanToMap(body, false, false));
return BeanUtil.toBean(map, R.class);
}
//todo 新数据,待入库
public R partners(EnterprisePartnersBody body) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterprise/partners", BeanUtil.beanToMap(body, false, false));
return BeanUtil.toBean(map, R.class);
}
public R investment(EnterpriseInvestmentBody body) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterprise/investment", BeanUtil.beanToMap(body, false, false));
return BeanUtil.toBean(map, R.class);
}
public R affiliates(EnterpriseAffiliatesBody body) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterprise/affiliates", BeanUtil.beanToMap(body, false, false));
return BeanUtil.toBean(map, R.class);
}
public R bidNoticePage(EnterpriseBidNoticePageBody body) throws Exception {
Map<String, String> headerMap = new HashMap<>();
headerMap.put("Api-Version", "1.0");
Map<String, Object> map = dskOpenApiUtil.requestBodyWithHeader("/api/jsk/enterpriseBusiness/selectPageBidNoticeInfo", BeanUtil.beanToMap(body, false, false), headerMap);
return BeanUtil.toBean(map, R.class);
}
public R dynamicPage(EnterpriseDynamicPageBody body) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/api/jsk/enterprise/dynamic", BeanUtil.beanToMap(body, false, false));
return BeanUtil.toBean(map, R.class);
}
public R icInfo(EnterpriseIcInfoBody body) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterprise/icInfo", BeanUtil.beanToMap(body, false, false));
return BeanUtil.toBean(map, R.class);
}
public R changeInfo(EnterpriseChangeInfoBody body) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterprise/changeInfo", BeanUtil.beanToMap(body, false, false));
return BeanUtil.toBean(map, R.class);
}
public R keymembers(EnterpriseKeymembersBody body) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterprise/keymembers", BeanUtil.beanToMap(body, false, false));
return BeanUtil.toBean(map, R.class);
}
}
package com.dsk.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.system.domain.CustomerDecisionChain;
import com.dsk.system.domain.customer.CustomerDecisionChain;
import org.apache.ibatis.annotations.Mapper;
......
package com.dsk.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.system.domain.customer.CustomerFollowRecord;
import org.apache.ibatis.annotations.Mapper;
/**
* 客户跟进记录(CustomerFollowRecord)表数据库访问层
*
* @author makejava
* @since 2023-05-18 15:07:59
*/
@Mapper
public interface CustomerFollowRecordMapper extends BaseMapper<CustomerFollowRecord> {
}
package com.dsk.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.system.domain.Customer;
import com.dsk.system.domain.customer.Customer;
import com.dsk.system.domain.customer.dto.CustomerSearchDto;
import com.dsk.system.domain.customer.vo.CustomerListVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
......@@ -14,5 +19,7 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface CustomerMapper extends BaseMapper<Customer> {
List<CustomerListVo> selectList(@Param("dto") CustomerSearchDto dto);
}
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;
/**
* 客户负责人表(Customer)表数据库访问层
*
* @author makejava
* @since 2023-05-16 09:28:00
*/
@Mapper
public interface CustomerUserMapper extends BaseMapper<CustomerUser> {
}
package com.dsk.system.service;
import com.dsk.common.core.domain.AjaxResult;
/**
* @ClassName EconomicService
* @Description 经济大全业务层
* @Author Dgm
* @Date 2023/5/18 10:17
* @Version 1.00
*/
public interface EconomicService {
/***
*@Description: 全国经济大全分页列表
*@Param:
*@return: com.dsk.common.core.domain.AjaxResult
*@Author: Dgm
*@date: 2023/5/18 10:25
*/
AjaxResult nationalPage();
}
package com.dsk.system.service;
import com.dsk.system.domain.CustomerDecisionChain;
import com.dsk.system.domain.dto.CustomerDecisionChainSearchDto;
import com.dsk.system.domain.customer.CustomerDecisionChain;
import com.dsk.system.domain.customer.dto.CustomerDecisionChainSearchDto;
import java.util.List;
......
package com.dsk.system.service;
import com.dsk.system.domain.customer.CustomerFollowRecord;
import com.dsk.system.domain.customer.dto.CustomerFollowRecordSearchDto;
import java.util.List;
/**
* 客户跟进记录(CustomerFollowRecord)表服务接口
*
* @author makejava
* @since 2023-05-18 15:07:59
*/
public interface ICustomerFollowRecordService {
List<CustomerFollowRecord> selectList(CustomerFollowRecordSearchDto dto);
boolean add(CustomerFollowRecord followRecord);
}
package com.dsk.system.service;
import com.dsk.system.domain.Customer;
import com.dsk.system.domain.customer.Customer;
import com.dsk.system.domain.customer.dto.CustomerSearchDto;
import com.dsk.system.domain.customer.vo.CustomerListVo;
import java.util.List;
......@@ -13,4 +14,10 @@ import java.util.List;
*/
public interface ICustomerService {
List<CustomerListVo> selectList(CustomerSearchDto dto);
boolean add(Customer customer);
boolean edit(Customer customer);
}
......@@ -3,8 +3,8 @@ package com.dsk.system.service.impl;
import cn.hutool.core.bean.BeanException;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.dsk.common.utils.SecurityUtils;
import com.dsk.system.domain.CustomerDecisionChain;
import com.dsk.system.domain.dto.CustomerDecisionChainSearchDto;
import com.dsk.system.domain.customer.CustomerDecisionChain;
import com.dsk.system.domain.customer.dto.CustomerDecisionChainSearchDto;
import com.dsk.system.mapper.CustomerDecisionChainMapper;
import com.dsk.system.service.ICustomerDecisionChainService;
import lombok.extern.slf4j.Slf4j;
......@@ -86,5 +86,6 @@ public class CustomerDecisionChainServiceImpl implements ICustomerDecisionChainS
private void verifyParameter(CustomerDecisionChain customerDecisionChain){
if(ObjectUtils.isEmpty(customerDecisionChain.getCustomerId())) throw new BeanException("客户id不能为空!");
customerDecisionChain.setUpdateId(SecurityUtils.getUserId());
customerDecisionChain.setUpdateBy(SecurityUtils.getLoginUser().getUser().getNickName());
}
}
package com.dsk.system.service.impl;
import cn.hutool.core.bean.BeanException;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.dsk.common.utils.SecurityUtils;
import com.dsk.system.domain.customer.CustomerFollowRecord;
import com.dsk.system.domain.customer.dto.CustomerFollowRecordSearchDto;
import com.dsk.system.mapper.CustomerFollowRecordMapper;
import com.dsk.system.service.ICustomerFollowRecordService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.util.List;
/**
* 客户跟进记录(CustomerFollowRecord)表服务实现类
*
* @author makejava
* @since 2023-05-18 15:07:59
*/
@Slf4j
@Service
public class CustomerFollowRecordServiceImpl implements ICustomerFollowRecordService {
@Resource
private CustomerFollowRecordMapper baseMapper;
@Override
public List<CustomerFollowRecord> selectList(CustomerFollowRecordSearchDto dto) {
LambdaQueryWrapper<CustomerFollowRecord> wrapper = Wrappers.lambdaQuery();
if (!ObjectUtils.isEmpty(dto.getCustomerId())) {
wrapper.eq(CustomerFollowRecord::getCustomerId, dto.getCustomerId());
}
wrapper.eq(CustomerFollowRecord::getUserId, SecurityUtils.getUserId())
.orderByDesc(CustomerFollowRecord::getCreateTime);
return baseMapper.selectList(wrapper);
}
@Override
public boolean add(CustomerFollowRecord followRecord) {
if (ObjectUtils.isEmpty(followRecord.getContent())) throw new BeanException("跟进内容不能为空");
if (ObjectUtils.isEmpty(followRecord.getCustomerId())) throw new BeanException("跟进客户不能为空");
followRecord.setUserId(SecurityUtils.getUserId());
return baseMapper.insert(followRecord) != 0;
}
}
package com.dsk.system.service.impl;
import cn.hutool.core.bean.BeanException;
import com.dsk.common.exception.ServiceException;
import com.dsk.common.utils.SecurityUtils;
import com.dsk.system.domain.customer.Customer;
import com.dsk.system.domain.customer.CustomerUser;
import com.dsk.system.domain.customer.dto.CustomerSearchDto;
import com.dsk.system.domain.customer.vo.CustomerListVo;
import com.dsk.system.mapper.CustomerMapper;
import com.dsk.system.mapper.CustomerUserMapper;
import com.dsk.system.service.ICustomerService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.util.List;
/**
* 客户信息表(Customer)表服务实现类
......@@ -16,6 +27,51 @@ import javax.annotation.Resource;
public class CustomerServiceImpl implements ICustomerService {
@Resource
private CustomerMapper customerMapper;
private CustomerMapper baseMapper;
@Resource
private CustomerUserMapper customerUserMapper;
@Override
public List<CustomerListVo> selectList(CustomerSearchDto dto) {
dto.setUserId(SecurityUtils.getUserId());
List<CustomerListVo> vos = baseMapper.selectList(dto);
for (CustomerListVo vo : vos) {
//TODO 客户项目相关统计
//合作项目
vo.setCooperationProject(1);
//跟进项目
vo.setFollowProject(1);
//储备项目
vo.setReserveProject(1);
}
return vos;
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean add(Customer customer) {
if (ObjectUtils.isEmpty(customer.getCompanyName())) throw new BeanException("企业名称不能为空");
final Long userId = SecurityUtils.getUserId();
customer.setCreateId(userId);
customer.setUpdateId(userId);
//TODO 查询企业id
customer.setCompanyId(0);
int i = baseMapper.insert(customer);
if (i == 0) throw new ServiceException("客户信息添加错误!");
int ui = customerUserMapper.insert(new CustomerUser(customer.getCustomerId(), userId));
if (ui == 0) throw new ServiceException("客户跟进人信息添加错误!");
return true;
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean edit(Customer customer) {
if (ObjectUtils.isEmpty(customer.getCustomerId())) throw new BeanException("客户id不能为空");
customer.setUpdateId(SecurityUtils.getUserId());
int u = baseMapper.updateById(customer);
return u != 0;
}
}
package com.dsk.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.utils.DskOpenApiUtil;
import com.dsk.system.service.EconomicService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
* @ClassName EconomicServiceImpl
* @Description 经济大全实现
* @Author Dgm
* @Date 2023/5/18 10:23
* @Version
*/
@Service
public class EconomicServiceImpl implements EconomicService {
@Autowired
private DskOpenApiUtil dskOpenApiUtil;
@Override
public AjaxResult nationalPage() {
Map<String, Object> map = dskOpenApiUtil.requestBody("/xx", null);
return BeanUtil.toBean(map, AjaxResult.class);
}
}
......@@ -2,7 +2,7 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dsk.system.mapper.CustomerDecisionChainMapper">
<resultMap type="com.dsk.system.domain.CustomerDecisionChain" id="CustomerDecisionChainMap">
<resultMap type="com.dsk.system.domain.customer.CustomerDecisionChain" id="CustomerDecisionChainMap">
<result property="id" column="id" jdbcType="INTEGER"/>
<result property="customerId" column="customer_id" jdbcType="VARCHAR"/>
<result property="name" column="name" jdbcType="VARCHAR"/>
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dsk.system.mapper.CustomerFollowRecordMapper">
</mapper>
......@@ -2,6 +2,19 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dsk.system.mapper.CustomerMapper">
<select id="selectList" resultType="com.dsk.system.domain.customer.vo.CustomerListVo">
select
ct.customer_id, ct.company_id, ct.company_name, ct.legal_person, ct.register_capital_str,
ct.register_capital, ct.company_nature, ct.company_level, ct.credit_level, ct.super_company,
ct.is_on, ct.is_major, ct.company_attribute, ct.main_business, ct.business_scope,
ct.business_characteristic, ct.decision_chain, ct.bid_characteristic, ct.performance_characteristic,
ct.other_ms_characteistic, u.nick_name followUser
from customer ct
join customer_user ctu on ct.customer_id = ctu.customer_id
join sys_user u on ctu.user_id = u.user_id
where ctu.user_id = #{dto.userId}
<if test="dto.companyName != null and dto.companyName != '' "> and ct.company_name like concat('%',#{dto.companyName},'%')</if>
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dsk.system.mapper.CustomerUserMapper">
</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