Commit 4cad5044 authored by 远方不远's avatar 远方不远
parents 474a8a9c fbfb6af1
......@@ -4,6 +4,7 @@ import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.dsk.common.core.domain.entity.BusinessFollowRecord;
import com.dsk.system.domain.BusinessIdDto;
import com.dsk.system.service.IBusinessFollowRecordService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -39,11 +40,12 @@ public class BusinessFollowRecordController extends BaseController
* 根据项目id查询项目跟进记录
*/
// @PreAuthorize("@ss.hasPermi('system:record:list')")
@GetMapping("/list/{businessId}")
public AjaxResult list(@PathVariable Integer businessId)
{
return success(businessFollowRecordService.selectBusinessFollowRecordList(businessId));
}
// @GetMapping("/list/{businessId}")
// public TableDataInfo list(@PathVariable("businessId") Integer businessId)
// {
// startPage();
// return getDataTable(businessFollowRecordService.selectBusinessFollowRecordList(businessId));
// }
/**
* 新增项目跟进记录
......@@ -60,13 +62,24 @@ public class BusinessFollowRecordController extends BaseController
* 分页查询项目跟进记录
*/
// @PreAuthorize("@ss.hasPermi('system:record:list')")
// @GetMapping("/list")
// public TableDataInfo list(BusinessFollowRecord businessFollowRecord)
// {
// startPage();
// List<BusinessFollowRecord> list = businessFollowRecordService.selectBusinessFollowRecordList(businessFollowRecord);
// return getDataTable(list);
// }
@GetMapping("/list")
public TableDataInfo list(@RequestBody(required=false) BusinessIdDto businessId)
{
startPage();
List<BusinessFollowRecord> list = businessFollowRecordService.selectBusinessFollowRecordList(businessId);
return getDataTable(list);
}
/**
* 删除项目跟进记录
*/
// @PreAuthorize("@ss.hasPermi('system:record:remove')")
// @Log(title = "项目跟进记录", businessType = BusinessType.DELETE)
@DeleteMapping("remove/{ids}")
public AjaxResult remove(@PathVariable(value = "ids",required=false) Long[] ids)
{
return toAjax(businessFollowRecordService.deleteBusinessFollowRecordByIds(ids));
}
// /**
// * 导出项目跟进记录列表
......@@ -102,14 +115,4 @@ public class BusinessFollowRecordController extends BaseController
// return toAjax(businessFollowRecordService.updateBusinessFollowRecord(businessFollowRecord));
// }
// /**
// * 删除项目跟进记录
// */
// @PreAuthorize("@ss.hasPermi('system:record:remove')")
// @Log(title = "项目跟进记录", businessType = BusinessType.DELETE)
// @DeleteMapping("/{ids}")
// public AjaxResult remove(@PathVariable Long[] ids)
// {
// return toAjax(businessFollowRecordService.deleteBusinessFollowRecordByIds(ids));
// }
}
......@@ -4,6 +4,8 @@ import java.util.List;
import com.dsk.common.core.domain.entity.BusinessInfo;
import com.dsk.common.dtos.BusinessInfoDto;
import com.dsk.common.exception.base.BaseException;
import com.dsk.common.utils.CheckUtils;
import com.dsk.system.domain.BusinessAddDto;
import com.dsk.system.domain.BusinessListDto;
import com.dsk.system.domain.vo.BusinessBrowseVo;
......@@ -69,9 +71,9 @@ public class BusinessInfoController extends BaseController
*/
// @PreAuthorize("@ss.hasPermi('system:business:query')")
@GetMapping("/browse/{businessId}")
public AjaxResult browse(@PathVariable Integer id)
public AjaxResult browse(@PathVariable("businessId") Integer businessId)
{
return success(businessInfoService.browse(id));
return success(businessInfoService.browse(businessId));
}
/**
......
package com.dsk.web.controller.search.macroMarket;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.dtos.OpRegionalEconomicDataRegionalListDto;
import com.dsk.common.dtos.OpRegionalEconomicDataStatisticsRegionalDto;
import com.dsk.common.dtos.OpRegionalEconomicDataV1PageDto;
import com.dsk.common.dtos.*;
import com.dsk.system.service.EconomicService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
......@@ -37,6 +35,19 @@ public class RegionalEconomicDataController {
return economicService.nationalPage(dto);
}
/***
*@Description: 获取年份
*@Param:
*@return: com.dsk.acc.security.common.msg.RestResponse
*@Author: Dgm
*@date: 2023/5/18 10:29
*/
@PostMapping("/years/list")
public AjaxResult yearsList(@RequestBody OpRegionalEconomicDataYearsListDto dto) {
return economicService.yearsList(dto);
}
/***
*@Description: 全国经济大全详情
*@Param:
......@@ -44,9 +55,9 @@ public class RegionalEconomicDataController {
*@Author: Dgm
*@date: 2023/5/18 10:29
*/
@GetMapping("/details/{id}")
public AjaxResult details(@PathVariable("id") Integer id) {
return economicService.details(id);
@PostMapping("/details")
public AjaxResult details(@RequestBody @Valid OpRegionalEconomicDataDetailsDto detailsDto) {
return economicService.details(detailsDto);
}
......
package com.dsk.web.controller.search.macroMarket;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.dtos.SpecialBondInformationDetailsDto;
import com.dsk.common.dtos.SpecialBondInformationPageDto;
import com.dsk.common.dtos.SpecialPurposeBondsDto;
import com.dsk.common.dtos.SpecialPurposeBondsPageDto;
......@@ -8,6 +9,8 @@ import com.dsk.system.service.SpecialPurposeBondsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
/**
* @ClassName SpecialBondProjectsController
* @Description 专项债项目
......@@ -42,9 +45,9 @@ public class SpecialBondProjectsController {
*@Author: Dgm
*@date: 2023/5/18 10:29
*/
@GetMapping("/details/{id}")
public AjaxResult details(@PathVariable("id") String id) {
return specialPurposeBondsService.details(id);
@PostMapping("/details")
public AjaxResult details(@RequestBody @Valid SpecialBondInformationDetailsDto detailsDto) {
return specialPurposeBondsService.details(detailsDto);
}
......
......@@ -9,7 +9,7 @@ ruoyi:
# 实例演示开关
demoEnabled: true
# 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
profile: D:/dsk-operate-sys/uploadPath
profile: D:/dsk-operate-sys/uploadPath/
# 获取ip地址开关
addressEnabled: false
# 验证码类型 math 数组计算 char 字符验证
......
......@@ -150,6 +150,18 @@
<artifactId>dsk-acc-open-sdk-java</artifactId>
<version>${dsk-openapi-sdk.version}</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.13</version>
</dependency>
</dependencies>
</project>
......@@ -142,6 +142,78 @@ public class BusinessInfo extends BaseEntity
@Excel(name = "评标委员会")
private String evaluationBidCouncil;
/** 建设单位 */
@Excel(name = "建设单位")
private String constructionUnit;
/** 建设单位负责人 */
@Excel(name = "建设单位负责人")
private String constructionPrincipal;
/** 建设单位联系电话 */
@Excel(name = "建设单位联系电话")
private String constructionPhone;
/** 主管单位 */
@Excel(name = "主管单位")
private String supervisorUnit;
/** 主管单位负责人 */
@Excel(name = "主管单位负责人")
private String supervisorPrincipal;
/** 主管单位联系电话 */
@Excel(name = "主管单位联系电话")
private String supervisorPhone;
public String getConstructionUnit() {
return constructionUnit;
}
public void setConstructionUnit(String constructionUnit) {
this.constructionUnit = constructionUnit;
}
public String getConstructionPrincipal() {
return constructionPrincipal;
}
public void setConstructionPrincipal(String constructionPrincipal) {
this.constructionPrincipal = constructionPrincipal;
}
public String getConstructionPhone() {
return constructionPhone;
}
public void setConstructionPhone(String constructionPhone) {
this.constructionPhone = constructionPhone;
}
public String getSupervisorUnit() {
return supervisorUnit;
}
public void setSupervisorUnit(String supervisorUnit) {
this.supervisorUnit = supervisorUnit;
}
public String getSupervisorPrincipal() {
return supervisorPrincipal;
}
public void setSupervisorPrincipal(String supervisorPrincipal) {
this.supervisorPrincipal = supervisorPrincipal;
}
public String getSupervisorPhone() {
return supervisorPhone;
}
public void setSupervisorPhone(String supervisorPhone) {
this.supervisorPhone = supervisorPhone;
}
public String getEvaluationBidWay() {
return evaluationBidWay;
}
......@@ -437,6 +509,12 @@ public class BusinessInfo extends BaseEntity
.append("earnestMoneyPay", getEarnestMoneyPay())
.append("earnestMoney", getEarnestMoney())
.append("evaluationBidCouncil", getEvaluationBidCouncil())
.append("constructionUnit", getConstructionUnit())
.append("constructionPrincipal", getConstructionPrincipal())
.append("constructionPhone", getConstructionPhone())
.append("supervisorUnit", getSupervisorUnit())
.append("supervisorPrincipal", getSupervisorPrincipal())
.append("supervisorPhone", getSupervisorPhone())
.toString();
}
}
......@@ -21,7 +21,7 @@ public class EnterpriseUipSearchBody extends BasePage {
/*
* 1金额倒序,2金额正序,3时间倒序,4时间正序
* 1供应商倒序,2供应商正序,3拟建项目倒序,4拟建项目正序,5招标公告倒序,6招标公告正序,7土地倒序,8土地正序
*/
@NotNull(message = "排序条件不能为空")
private Integer sort;
......
package com.dsk.common.dtos;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* @ClassName OpRegionalEconomicDataV1Dto
* @Description 区域经济大全-详情
* @Author Dgm
* @Date 2023/5/23 14:05
* @Version
*/
@Data
public class OpRegionalEconomicDataDetailsDto {
/**
* id
*/
@NotNull(message = "id 不能为空")
private Integer id;
}
......@@ -3,7 +3,6 @@ package com.dsk.common.dtos;
import com.dsk.common.core.domain.model.BasePage;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
......@@ -19,20 +18,19 @@ public class OpRegionalEconomicDataV1PageDto extends BasePage {
/**
* 年份
*/
@NotNull(message = "year 不能为空")
private Integer year;
/**
* 省
*/
private List<String> provinceIds;
private List<Integer> provinceIds;
/**
* 市
*/
private List<String> cityIds;
private List<Integer> cityIds;
/**
* 区
*/
private List<String> areaIds;
private List<Integer> areaIds;
/**
* 全国宏观经济:1 / 辖区经济:2 / 地区对比:3
......
package com.dsk.common.dtos;
import lombok.Data;
/**
* @ClassName OpRegionalEconomicDataYearsListDto
* @Description 获取年份
* @Author Dgm
* @Date 2023/5/23 14:05
* @Version
*/
@Data
public class OpRegionalEconomicDataYearsListDto {
private Integer year;
}
package com.dsk.common.dtos;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* @ClassName SpecialBondInformationDetailsDto
* @Description 专项债-详情
* @Author Dgm
* @Date 2023/5/23 14:05
* @Version
*/
@Data
public class SpecialBondInformationDetailsDto {
/**
* 专项债券唯一标识
*/
@NotNull(message = "id 不能为空")
private Integer id;
}
......@@ -188,4 +188,17 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
return Date.from(zdt.toInstant());
}
/***
*@Description: 获取当前年份
*@Param:
*@return: int
*@Author: Dgm
*@date: 2023/5/29 16:05
*/
public static int getYear() {
LocalDate localDate = LocalDate.now();
int year = localDate.getYear();
return year;
}
}
......@@ -7,13 +7,20 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.dsk.common.utils.DateUtils;
import com.dsk.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.ArrayUtils;
import com.dsk.common.config.RuoYiConfig;
......@@ -25,10 +32,51 @@ import org.apache.commons.io.FilenameUtils;
*
* @author dsk
*/
@Slf4j
public class FileUtils
{
public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+";
/**
* 检查目录是否存在,如果不存在,则创建目录,如果创建失败则返回false
*
* @param path 文件夹路径
* @return boolean
*/
public static boolean newFolder(String path) {
File file = new File(path);
if (!file.exists()) {
boolean isSuccess = file.mkdir();
if (!isSuccess)
file.mkdirs();
return !isSuccess;
} else {
return true;
}
}
/**
*
*
* @param folderPath 文件夹路径
* @return 文件夹路径
*/
public static String newFolder1(String folderPath) {
String filePath = folderPath;
try {
File myFilePath = new File(filePath);
if (!myFilePath.exists()) {
myFilePath.mkdirs();
}
} catch (Exception e) {
log.error("创建文件夹失败");
filePath = "";
e.printStackTrace();
}
return filePath;
}
/**
* 输出指定文件的byte数组
*
......@@ -104,12 +152,12 @@ public class FileUtils
return FileUploadUtils.getPathFileName(uploadDir, pathName);
}
/**
/* *//**
* 删除文件
*
* @param filePath 文件
* @return
*/
*//*
public static boolean deleteFile(String filePath)
{
boolean flag = false;
......@@ -120,8 +168,171 @@ public class FileUtils
flag = file.delete();
}
return flag;
}*/
/**
* 删除整个文件夹或者文某个文件
*
* @param filePath 文件
* @return
*/
public static boolean deleteFile(String filePath) {
try {
if(StringUtils.isNotEmpty(delAllFile(filePath))) return false;
File file = new File(filePath);
return file.delete();
} catch (Exception e) {
log.info("删除文件失败");
e.printStackTrace();
return false;
}
}
/**
* 文件夹过滤
*
* @param path 文件夹路径
*/
public static String delAllFile(String path) {
String hint = "这是一个根目录,请更换目录!";
File file = new File(path);
if (!file.exists()) {
return hint;
}
// if (!file.isDirectory()) {
// return false;
// }
if (file.getAbsolutePath().equalsIgnoreCase("/")) {
return hint;
}
if (file.getAbsolutePath().equalsIgnoreCase("/root")) {
return hint;
}
if (file.getAbsolutePath().equalsIgnoreCase("/usr") || file.getAbsolutePath().equalsIgnoreCase("/opt")
|| file.getAbsolutePath().equalsIgnoreCase("/bin") || file.getAbsolutePath().equalsIgnoreCase("/sbin")
|| file.getAbsolutePath().equalsIgnoreCase("/etc") || file.getAbsolutePath().equalsIgnoreCase("/selinux")
|| file.getAbsolutePath().equalsIgnoreCase("/sys") || file.getAbsolutePath().equalsIgnoreCase("/var")
|| file.getAbsolutePath().equalsIgnoreCase("/home") || file.getAbsolutePath().equalsIgnoreCase("/net")) {
return hint;
}
if (file.getAbsolutePath().equalsIgnoreCase("C://") || file.getAbsolutePath().equalsIgnoreCase("C:\\\\")) {
return hint;
}
return "";
}
/**
* 获取文件夹中所有文件
* @param filePath 全路径
* @return
*/
public static List<String> getAllFiles(String filePath) {
List<String> fileList = new ArrayList<String>();
File file = new File(filePath);
if (!file.exists()) {
return fileList;
}
if (!file.isDirectory()) {
return fileList;
}
// 获取当前目录下的文件和文件夹
File[] files = file.listFiles();
if (files != null) {
for (File directory : files) {
// 如果是文件夹则递归调用此方法
if (directory.isDirectory()) {
fileList.add(directory.getPath());
getAllFiles(directory.getPath());
} else {
// 如果是文件则直接输出路径
fileList.add(directory.getPath());
}
}
return fileList;
}
return fileList;
}
/**
* 获取文件夹中的所有文件,不包括文件夹
*
* @param path 文件夹路径
* @return List<File>
*/
public static List<File> getAllFileNames(String path) {
List<File> fileList = new ArrayList<File>();
File file = new File(path);
if (!file.exists()) {
return fileList;
}
if (!file.isDirectory()) {
return fileList;
}
String[] tempList = file.list();
File tempFile;
for (String fileName : tempList) {
if (path.endsWith(File.separator)) {
tempFile = new File(path + fileName);
} else {
tempFile = new File(path + File.separator + fileName);
}
if (tempFile.isFile()) {
fileList.add(tempFile);
}
if (tempFile.isDirectory()) {
List<File> allFiles = getAllFileNames(tempFile.getAbsolutePath());
fileList.addAll(allFiles);
}
}
return fileList;
}
/**
* 下载文件
*
* @param url 要下载的文件链接
* @param targetFolder 目标文件
* @throws IOException
*/
public static void downloadFolder(String url, String targetFolder) throws IOException {
URL downloadUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection) downloadUrl.openConnection();
connection.setRequestMethod("GET");
connection.connect();
if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
throw new RuntimeException("下载文件夹失败: " + connection.getResponseMessage());
}
try (ZipInputStream zipInputStream = new ZipInputStream(connection.getInputStream())) {
ZipEntry entry;
while ((entry = zipInputStream.getNextEntry()) != null) {
String entryName = entry.getName();
if (StringUtils.isBlank(entryName)) {
continue;
}
File entryFile = new File(targetFolder, entryName);
if (entry.isDirectory()) {
entryFile.mkdirs();
} else {
File parent = entryFile.getParentFile();
if (!parent.exists()) {
parent.mkdirs();
}
try (FileOutputStream outputStream = new FileOutputStream(entryFile)) {
IOUtils.copy(zipInputStream, outputStream);
}
}
}
}
}
/**
* 文件名称验证
*
......
......@@ -111,7 +111,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
// 过滤请求
.authorizeRequests()
// 对于登录login 注册register 验证码captchaImage 允许匿名访问
.antMatchers("/login", "/register", "/captchaImage").permitAll()
.antMatchers("/login", "/register", "/captchaImage","/economic/**","/enterprises/**","/specialPurposeBonds/**","/urbanInvestment/**").permitAll()
// 静态资源,可匿名访问
.antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
.antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
......
......@@ -64,7 +64,7 @@ public class SysLoginService
public String login(String username, String password, String code, String uuid)
{
// 验证码校验
validateCaptcha(username, code, uuid);
// validateCaptcha(username, code, uuid);
// 登录前置校验
loginPreCheck(username, password);
// 用户验证
......
import request from "@/utils/request";
// 客户信息列表
export function clientPage(data) {
return request({
url: '/enterpriseBussiness/clientPage',
method: 'post',
data: data
})
}
// 客户项目列表
export function clientProjectPage(data) {
return request({
url: '/enterpriseBussiness/clientProjectPage',
method: 'post',
data: data
})
}
// 供应商列表
export function supplierPage(data) {
return request({
url: '/enterpriseBussiness/supplierPage',
method: 'post',
data: data
})
}
// 供应商项目列表
export function supplierProjectPage(data) {
return request({
url: '/enterpriseBussiness/supplierProjectPage',
method: 'post',
data: data
})
}
// 招标-常合作代理机构列表
export function oftenAgencyPage(data) {
return request({
url: '/enterpriseBussiness/oftenAgencyPage',
method: 'post',
data: data
})
}
// 招标-合作明细列表
export function bidCooperatePage(data) {
return request({
url: '/enterpriseBussiness/bidCooperatePage',
method: 'post',
data: data
})
}
// 历史发包列表
export function historySendPage(data) {
return request({
url: '/enterpriseBussiness/historySendPage',
method: 'post',
data: data
})
}
// 历史发包省份
export function historySendProvince(data) {
return request({
url: '/enterpriseBussiness/historySendProvince',
method: 'post',
data: data
})
}
// 投标记录列表
export function tenderPage(data) {
return request({
url: '/enterpriseBussiness/tenderPage',
method: 'post',
data: data
})
}
import request from "@/utils/request";
// 获取页面数据
export function getList(data) {
// 财务简析
export function financial(data) {
return request({
url: '/getInfo',
method: 'get'
url: '/enterprise/financial',
method: 'post',
data: data
})
}
import request from "@/utils/request";
// 获取查询下拉选项
export function getOption() {
// 招标公告列表
export function bidNoticePage(data) {
return request({
url: '/getInfo',
method: 'get'
url: '/enterpriseProject/bidNoticePage',
method: 'post',
data: data
})
}
// 获取列表数据
export function getList(data) {
// 招标公告招标类别
export function bidNoticeTenderStage(data) {
return request({
url: '/getInfo',
method: 'get'
url: '/enterpriseProject/bidNoticeTenderStage',
method: 'post',
data: data
})
}
// 招标公告地区
export function bidNoticeArea(data) {
return request({
url: '/enterpriseProject/bidNoticeArea',
method: 'post',
data: data
})
}
// 土地交易列表
export function landTransactionPage(data) {
return request({
url: '/enterpriseProject/landTransactionPage',
method: 'post',
data: data
})
}
// 土地交易用途
export function landUse(data) {
return request({
url: '/enterpriseProject/landUse',
method: 'post',
data: data
})
}
// 拟建项目列表
export function approvalProjectPage(data) {
return request({
url: '/enterpriseProject/approvalProjectPage',
method: 'post',
data: data
})
}
// 拟建项目立项审批列表
export function approvalExaminePage(data) {
return request({
url: '/enterpriseProject/approvalExaminePage',
method: 'post',
data: data
})
}
// 拟建项目民间推介列表
export function approvalMarketingPage(data) {
return request({
url: '/enterpriseProject/approvalMarketingPage',
method: 'post',
data: data
})
}
// 标讯PRO招标公告列表
export function bidNoticeProPage(data) {
return request({
url: '/enterpriseProject/bidNoticeProPage',
method: 'post',
data: data
})
}
// 标讯PRO招标公告项目类别
export function bidNoticeProProjectType(data) {
return request({
url: '/enterpriseProject/bidNoticeProProjectType',
method: 'post',
data: data
})
}
// 标讯PRO招标公告工程类别
export function bidNoticeProProjectPurposes(data) {
return request({
url: '/enterpriseProject/bidNoticeProProjectPurposes',
method: 'post',
data: data
})
}
// 标讯PRO招标公告评标办法
export function bidNoticeProAssessmentWay(data) {
return request({
url: '/enterpriseProject/bidNoticeProAssessmentWay',
method: 'post',
data: data
})
}
// 行政许可列表
export function creditXzxkPage(data) {
return request({
url: '/enterpriseProject/creditXzxkPage',
method: 'post',
data: data
})
}
// 专项债项目列表
export function specialDebtProjectPage(data) {
return request({
url: '/enterpriseProject/specialDebtProjectPage',
method: 'post',
data: data
})
}
// 专项债列表
export function specialDebtPage(data) {
return request({
url: '/enterpriseProject/specialDebtPage',
method: 'post',
data: data
})
}
import request from "@/utils/request";
// 获取查询下拉选项
export function getOption() {
// 甲方详情-公司概要
export function infoHeader(data) {
return request({
url: '/getInfo',
method: 'get'
url: '/enterprise/infoHeader',
method: 'post',
data: data
})
}
// 获取列表数据
export function getList(data) {
// 企业数据统计
export function statistic(data) {
return request({
url: '/getInfo',
method: 'get'
url: '/enterprise/statistic',
method: 'post',
data: data
})
}
// 招标偏好信息
export function bidDataGroup(data) {
return request({
url: '/enterprise/bidDataGroup',
method: 'post',
data: data
})
}
// 供应商列表
export function supplierPage(data) {
return request({
url: '/enterpriseBussiness/supplierPage',
method: 'post',
data: data
})
}
// 甲方业绩数据
export function projectTenderDataGroup(data) {
return request({
url: '/enterprise/projectTenderDataGroup',
method: 'post',
data: data
})
}
// 关系企业-股东信息
export function yyy(data) {
return request({
url: 'xxx',
method: 'post',
data: data
})
}
// 关系企业-对外投资
export function testinvestment(data) {
return request({
url: '/enterprise/investment',
method: 'post',
data: data
})
}
// 关系企业-分支机构
export function testaffiliates(data) {
return request({
url: '/enterprise/affiliates',
method: 'post',
data: data
})
}
// 招标公告
export function bidNoticePage(data) {
return request({
url: '/enterpriseProject/bidNoticePage',
method: 'post',
data: data
})
}
// 企业动态
export function dynamicPage(data) {
return request({
url: '/enterprise/dynamicPage',
method: 'post',
data: data
})
}
// 工商基础信息
export function icInfo(data) {
return request({
url: '/enterprise/icInfo',
method: 'post',
data: data
})
}
// 工商变更信息
export function changeInfo(data) {
return request({
url: '/enterprise/changeInfo',
method: 'post',
data: data
})
}
// 工商股东信息列表
export function bestStockPage(data) {
return request({
url: '/enterprise/bestStockPage',
method: 'post',
data: data
})
}
// 工商高管信息
export function keymembers(data) {
return request({
url: '/enterprise/keymembers',
method: 'post',
data: data
})
}
// 工商对外投资
export function investment(data) {
return request({
url: '/enterprise/investment',
method: 'post',
data: data
})
}
// 工商分支机构
export function affiliates(data) {
return request({
url: '/enterprise/affiliates',
method: 'post',
data: data
})
}
......@@ -44,6 +44,23 @@ export function editXMNR(param) {
data:param
})
}
//项目标签新增
export function addLabel(param) {
return request({
url: '/business/label/add',
method: 'POST',
data:param
})
}
//项目标签删除
export function removeLabel(param) {
return request({
url: '/business/label/remove',
method: 'POST',
data:param
})
}
//查询项目联系人
export function getLXR(param) {
......@@ -124,3 +141,20 @@ export function editGZDB(param) {
data:param
})
}
//查询相关企业
export function getXGQY(param) {
return request({
url: '/business/company/list',
method: 'GET',
params:param
})
}
//新增相关企业
export function addXGQY(param) {
return request({
url: '/business/company/add',
method: 'POST',
data:param
})
}
<template>
<div :ref="refStr" class="custom-money-select screen-popper" id="custom-money-select">
<div :class="['input-block', isSelectOption?'rote':'']">
<div class="block" @click="isSelectOption=!isSelectOption" @mouseenter="handleMouseenter" @mouseleave="handleMouseleave">
<el-input class="custom-money-input" v-model="value" :placeholder="placeholder" readonly>
<template slot="suffix">
<span @click.stop="handleClear" :class="[isClear&&isHover?'el-icon-circle-close':'el-icon-arrow-down']"></span>
</template>
</el-input>
</div>
<div class="options-block" v-if="isSelectOption">
<div class="arrow"></div>
<div @click="handleClick(option)" :class="['option', value==option?'active':'']" :key="i" v-for="(option, i) in options">
<template v-if="option == '自定义'">
<div class="number-box">
<input type="number" v-model="startMoney" class="number-input" clearable>&nbsp;&nbsp;&nbsp;&nbsp;<input v-model="endMoney" class="number-input" type="text" clearable>&nbsp;&nbsp;万元&nbsp;&nbsp;<el-button @click.stop="handleConfirm" class="number-button" type="primary">确定</el-button>
</div>
</template>
<template v-else>
<span>{{option}}</span> <span v-if="value==option" class="el-icon-check"></span>
</template>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
props: {
'placeholder': {
type: String,
default: '请选择'
},
'ref-str': {
type: String,
default: `timeselect${String(Math.random(0, 100)).slice(2)}`,
},
permissions: { //文本权限相关字段
type: Array,
default: () => {},
},
powerLabel: {
type: String,
default: ''
},
moneyList: {
type: Array,
default: () => [],
}
},
computed: {
isClear() {
if(!this.isSelectOption && this.value) {
return true
}else {
return false
}
}
},
data() {
return {
value: '',
options: ['一亿以上', '5000万-1亿', '1000万-5000万', '1000万以下', '自定义'],
isSelectOption: false,
startMoney: '',
endMoney: '',
isHover: false
}
},
mounted() {
this.handleAppClick()
if(this.moneyList&&this.moneyList.length>0){
this.options = this.moneyList
}
},
destroyed() {
const app = document.getElementById('app')
app.removeEventListener('click', ()=>{}, true)
},
methods: {
// 判断是否点击的为组件内部
handleAppClick() {
const app = document.getElementById('app')
app.addEventListener('click', (e) => {
const dom = this.$refs[this.refStr]
const flag = dom && dom.contains(e.target)
// const flag = document.getElementById('custom-money-select').contains(e.target)
!flag ? this.isSelectOption = false : ''
if(this.value == '自定义' && !this.startMoney && !this.endMoney) {
this.value = ''
this.$emit('input', '')
this.$emit('handle-search')
}
}, true)
},
// 清除
handleClear() {
if(this.isClear && this.isHover) {
this.value = ''
this.startMoney = ''
this.endMoney = ''
this.$emit('input', '')
this.$emit('handle-search')
}else {
this.isSelectOption = true
}
},
// 鼠标移入后的回调
handleMouseenter() {
this.isHover = true
},
// 鼠标离开后的回调
handleMouseleave() {
this.isHover = false
},
// 选项点击后的回调
handleClick(value) {
this.value = value
let moneyStr = ''
if(value == '自定义') {
this.value = '自定义'
}else {
this.startMoney = ''
this.endMoney = ''
this.isSelectOption = false
switch (value) {
case '一亿以上':
moneyStr = [10000]
break;
case '5000万-1亿':
moneyStr = [5000, 10000]
break;
case '1000万-5000万':
moneyStr = [1000, 5000]
break;
case '10亿以上':
moneyStr = [100000]
break;
case '1亿-10亿':
moneyStr = [10000, 100000]
break;
case '2000万-1亿':
moneyStr = [2000, 10000]
break;
case '400万-2000万':
moneyStr = [400, 2000]
break;
case '400万以下':
moneyStr = [, 400]
break;
default:
moneyStr = [, 1000]
break;
}
this.$emit('input', moneyStr)
this.$emit('handle-search')
}
},
// 自定义确认点击后的回调
handleConfirm() {
this.isSelectOption = false
if(!this.startMoney && !this.endMoney) {
this.value = ''
this.$emit('input', '')
}else {
if(this.endMoney && this.startMoney) {
this.value = `${this.startMoney}-${this.endMoney}万`
}else {
if(this.startMoney) {
this.value = `大于等于${this.startMoney}万`
}
if(this.endMoney) {
this.value = `小于等于${this.endMoney}万`
}
}
let moneyStr = [this.startMoney, this.endMoney]
this.$emit('input', moneyStr)
}
this.$emit('handle-search')
}
}
}
</script>
<style lang="scss">
.custom-money-select {
width: 120px;
height: 34px;
position: relative;
.input-block {
margin: 0;
width: 100%;
height: 100%;
cursor: pointer;
.block {
width: 100%;
height: 100%;
>.custom-money-input.el-input {
width: 100%;
height: 100%;
>input {
width: 100%;
height: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
border-radius: 2px;
}
}
}
.el-input__suffix {
transform: rotateZ(0);
width: 25px;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
}
&.rote {
.el-input__suffix {
transform: rotateZ(180deg);
}
}
}
.options-block {
position: absolute;
margin-top: 12px;
min-width: 120px;
font-size: 14px;
color: #666666;
background-color: #fff;
border: 1px solid #E4E7ED;
padding: 6px 0;
border-radius: 4px;
z-index: 9;
// .arrow {
// position: absolute;
// width: 0;
// height: 0;
// top: -12px;
// left: 35px;
// border: 6px solid transparent;
// border-bottom-color: #E4E7ED;
// &::after {
// position: absolute;
// display: inline-block;
// left: -4px;
// top: -2px;
// content: '';
// width: 0;
// height: 0;
// border: 4px solid transparent;
// border-bottom-color: #fff;
// z-index: 9;
// }
// }
.option {
padding: 0 24px 0 16px;
box-sizing: border-box;
width: 400px;
height: 36px;
display: flex;
justify-content: space-between;
align-items: center;
.number-box {
display: flex;
align-items: center;
>span {
margin: 0 10px;
}
.number-input {
padding: 0 24px 0 10px;
width: 100px !important;
height: 30px;
line-height: 30px;
border: none;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
width: 206px;
border: 1px solid #DCDCDC;
border-radius: 2px;
&::-webkit-outer-spin-button,
&::-webkit-inner-spin-button {
-webkit-appearance: none;
}
&[type="number"]{
-moz-appearance: textfield;
}
}
.number-button {
padding: 0;
width: 60px;
height: 30px;
line-height: 30px;
margin-left: 10px;
}
}
>span {
display: inline-block;
}
&.active {
background-color: #F2F7FF;
color: #0381FA;
}
&:hover {
background-color: #F5F7FA;
}
}
}
.number-input {
padding: 0 24px 0 10px;
width: 60px !important;
height: 30px;
line-height: 30px;
border: none;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
width: 206px;
border: 1px solid #DCDCDC;
border-radius: 2px;
&::-webkit-outer-spin-button,
&::-webkit-inner-spin-button {
-webkit-appearance: none;
}
&[type="number"]{
-moz-appearance: textfield;
}
}
.number-button {
padding: 0;
width: 60px;
height: 30px;
line-height: 30px;
margin-left: 10px;
}
}
</style>
<template>
<div :ref="refStr" class="custom-time-select screen-popper" id="custom-time-select">
<div :class="['input-block', isSelectOption?'rote':'']">
<div class="block" @click="isSelectOption=!isSelectOption" @mouseenter="handleMouseenter" @mouseleave="handleMouseleave">
<el-input class="custom-time-input" v-model="value" :placeholder="placeholder" readonly>
<template slot="suffix">
<span @click.stop="handleClear" :class="[isClear&&isHover?'el-icon-circle-close':'el-icon-arrow-down']"></span>
</template>
</el-input>
</div>
<div class="options-block" v-if="isSelectOption">
<div class="arrow"></div>
<div @click="handleClick(option)" :class="['option', value==option?'active':'']" :key="i" v-for="(option, i) in options">
<template v-if="option == '自定义'">
<div style="position: relative">
自定义
<el-date-picker
ref="picker"
:default-value="defaultValue"
style="position: absolute;opacity: 0;"
v-model="pickerValue"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd"
:picker-options="pickerOptions"
@change="changePicker">
</el-date-picker>
</div>
</template>
<template v-else>
<span>{{option}}</span> <span v-if="value==option" class="el-icon-check"></span>
</template>
</div>
</div>
</div>
<div v-if="isSelectOption" class="picker-block" ref="picker-block"></div>
</div>
</template>
<script>
export default {
props: {
'placeholder': {
type: String,
default: '请选择',
},
'ref-str': {
type: String,
default: `timeselect${String(Math.random(0, 100)).slice(2)}`,
},
dateFrom: {
type: String,
default: ''
},
dateTo: {
type: String,
default: ''
}
},
computed: {
isClear() {
if(!this.isSelectOption && this.value) {
return true
}else {
return false
}
},
pickerOptions() {
// 用计算属性
let _this = this
// 此时 this指向的就是vue实例
return {
disabledDate(time) {
if(_this.dateFrom){
return time.getTime() < new Date(_this.dateFrom.replace(/-/g, '/')).getTime() - 8.64e6;//如果没有后面的-8.64e6就是不可以选择今天的
}
if(_this.dateTo){
return time.getTime() > new Date(_this.dateTo.replace(/-/g, '/')).getTime();//如果没有后面的-8.64e7就是不可以选择今天的
}
}
}
},
},
watch: {
refStr(refStr) {
return refStr
}
},
data() {
return {
value: '',
options: ['近1年', '近2年', '近3年', '近5年', '自定义',],
isSelectOption: false,
isHover: false,
pickerValue: [],
defaultValue:new Date()
}
},
mounted() {
if(this.dateTo){
this.defaultValue = new Date(this.dateTo)
}
this.handleAppClick()
},
methods: {
// 时间格式化
formatDate(timeStr) {
let date = new Date(Number(timeStr))
let year = date.getFullYear()
let month = String(date.getMonth() + 1).padStart(2, 0)
let day = String(date.getDate()).padStart(2, 0)
return `${year}-${month}-${day}`
},
// 判断是否点击的为组件内部
handleAppClick() {
const app = document.getElementById('app')
app.addEventListener('click', (e) => {
const dom = this.$refs[this.refStr]
const flag = dom && dom.contains(e.target)
// const flag = document.getElementById('custom-time-select').contains(e.target)
!flag ? this.isSelectOption = false : ''
if(this.value == '自定义' && (!this.pickerValue || !this.pickerValue.length)) {
this.value = ''
this.$emit('input', '')
this.$emit('handle-search')
}
}, true)
},
handleMouseenter() {
this.isHover = true
},
handleMouseleave() {
this.isHover = false
},
handleClear() {
if(this.isClear && this.isHover) {
this.value = ''
this.pickerValue = []
this.$emit('input', '')
this.$emit('handle-search')
}else {
this.isSelectOption = true
}
},
handleClick(value) {
this.value = value
if(value == '自定义') {
this.value = '自定义'
this.$refs.picker && this.$refs.picker.length && this.$refs.picker[0].focus()
this.$nextTick(() => {
this.$refs['picker-block'].appendChild(this.$refs.picker[0].popperElm)
})
}else {
this.pickerValue = []
this.isSelectOption = false
let timeStr = []
let startTime = ''
let endTime = new Date()
switch (value) {
case '近1年':
startTime = new Date().setFullYear(new Date().getFullYear() - 1)
if(this.dateTo){
startTime = new Date(this.dateTo).setFullYear(new Date(this.dateTo).getFullYear() - 1)
}
timeStr = [this.formatDate(startTime), this.formatDate(endTime)]
break;
case '近2年':
startTime = new Date().setFullYear(new Date().getFullYear() - 2)
if(this.dateTo){
startTime = new Date(this.dateTo).setFullYear(new Date(this.dateTo).getFullYear() - 2)
}
timeStr = [this.formatDate(startTime), this.formatDate(endTime)]
break;
case '近3年':
startTime = new Date().setFullYear(new Date().getFullYear() - 3)
if(this.dateTo){
startTime = new Date(this.dateTo).setFullYear(new Date(this.dateTo).getFullYear() - 3)
}
timeStr = [this.formatDate(startTime), this.formatDate(endTime)]
break;
case '近5年':
startTime = new Date().setFullYear(new Date().getFullYear() - 5)
if(this.dateTo){
startTime = new Date(this.dateTo).setFullYear(new Date(this.dateTo).getFullYear() - 5)
}
timeStr = [this.formatDate(startTime), this.formatDate(endTime)]
break;
default:
if(this.pickerValue && this.pickerValue.length) {
timeStr = this.pickerValue
}else {
timeStr = []
this.value = ''
}
break;
}
this.$emit('input', timeStr)
this.$emit('handle-search')
}
},
// 时间选择改变后的回调
changePicker(value) {
this.isSelectOption = false
if(value && value.length) {
// this.value = '自定义'
this.value = String(this.pickerValue)
this.$emit('input', this.pickerValue)
}else {
this.value = ''
this.$emit('input', '')
}
this.$emit('handle-search')
}
}
}
</script>
<style lang="scss">
.custom-time-select {
width: 120px;
height: 34px;
.input-block {
width: 100%;
height: 100%;
margin: 0;
cursor: pointer;
.block {
width: 100%;
height: 100%;
>.custom-time-input.el-input {
width: 100%;
height: 100%;
>input {
width: 100%;
height: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
border-radius: 2px;
}
}
}
.el-input__suffix {
transform: rotateZ(0);
width: 25px;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
}
&.rote {
.el-input__suffix {
transform: rotateZ(180deg);
}
}
}
.options-block {
position: absolute;
margin-top: 12px;
min-width: 120px;
font-size: 14px;
color: #666666;
background-color: #fff;
border: 1px solid #E4E7ED;
padding: 6px 0;
border-radius: 4px;
z-index: 9;
.option {
padding: 0 24px 0 16px;
box-sizing: border-box;
height: 36px;
display: flex;
justify-content: space-between;
align-items: center;
>span {
display: inline-block;
}
&.active {
background-color: #F2F7FF;
color: #0381FA;
}
&:hover {
background-color: #F5F7FA;
}
}
}
.picker-block {
position: relative;
&::after {
content:"";
display:block;
visibility:hidden;
clear:both;
}
.el-picker-panel.el-date-range-picker.el-popper {
left: 0 !important;
top: 205px !important;
}
.popper__arrow {
left: 30px !important;
}
}
}
</style>
<template>
<div class="headForm">
<div class="flex-box query-box">
<div class="flex-box query-params">
<div class="flex-box headForm-text">
<img v-if="title" src="@/assets/images/detail/ico_title.png" />
<span class="drawer-title" v-if="title">{{ title }}</span>
<template v-if="slots">
<slot name="slot"></slot>
</template>
<div v-else>
<span class="ability-total" v-if="isTotal">{{ total }}条数据</span>
<span class="ability-total" v-if="amountTotal">,共计合作总金额:<i>{{ amountTotal }}</i>万元</span>
</div>
</div>
<div class="headForm-from">
<div class="from-item" :key="i" v-for="(form, i) in formData">
<!-- 单选 -->
<template v-if="form.type==1">
<el-select
v-model="form.value"
clearable
class="form-content-width"
style="max-width: 110px"
:placeholder="form.placeholder"
@change="changeSelect">
<el-option v-for="(item, index) in form.options" :key="index" :label="item.name" :value="item.value" />
</el-select>
</template>
<!-- 年月日 -->
<template v-if="form.type==2">
<el-date-picker
@change="changeSelect"
class="fromTime"
style="width: 210px"
v-model="form.value"
type="daterange"
prefix-icon="fromTime-icon"
value-format="yyyy-MM-dd"
range-separator="至"
start-placeholder="开始月份"
end-placeholder="结束月份">
</el-date-picker>
</template>
<!-- 输入框 -->
<template v-if="form.type==3">
<div class="cooperate-name">
<el-input v-model="form.value" :placeholder="form.placeholder"></el-input>
<span @click="changeSelect">搜索</span>
</div>
</template>
<!-- 多选 -->
<template v-if="form.type==4">
<el-select
class="form-content-width"
v-model="form.value"
multiple
collapse-tags
clearable
style="max-width: 170px"
:placeholder="form.placeholder"
@change="changeSelect">
<el-option v-for="(item, index) in form.options" :key="index" :label="item.name" :value="item.value" />
</el-select>
</template>
<!-- 自定义 -->
<template v-if="form.type==0">
<slot name="slot"></slot>
</template>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "HeadDetailForm",
props: {
title: {
type: String,
default: ''
},
queryParams: {
type: Object,
default: {}
},
formData: {
type: Array,
default: []
},
isTotal: {
type: Boolean,
default: true
},
total: {
type: Number,
default: 0
},
amountTotal: {
type: Number,
default: 0
},
slots: {
type: Boolean,
default: false
}
},
data() {
return {
}
},
methods: {
changeSelect(){
this.$emit('handle-search')
}
}
}
</script>
<style lang="scss" scoped>
.headForm{
.query-params{
width: 100%;
padding: 8px 17px 8px 13px;
justify-content: space-between;
border-bottom: 1px solid #E1E1E1;
}
::v-deep .el-input__inner{
border: 1px solid #EFEFEF;
height: 32px;
line-height: 32px;
}
::v-deep .el-form-item{
margin-right: 8px !important;
}
::v-deep .el-input--medium .el-input__icon{
line-height: 32px;
}
.headForm-text{
img{
width: 17px;
height: 17px;
margin-right: 8px;
}
.drawer-title{
font-size: 16px;
color: #232323;
font-weight: bold;
margin-right: 4px;
}
.ability-total{
font-size: 12px;
color: rgba(35,35,35,0.8);
position: relative;
i{
color: #FF3C3C;
}
}
}
.headForm-from {
display: flex;
.from-item{
margin-right: 8px;
&:last-child{
margin-right: 0;
}
.cooperate-name {
display: flex;
span {
width: 60px;
height: 32px;
line-height: 32px;
font-size: 14px;
background: #F5F5F5;
text-align: center;
color: #0081FF;
border: 1px solid #EFEFEF;
border-left: 0;
cursor: pointer;
}
::v-deep .el-input{
flex: 1;
}
::v-deep .el-input__inner {
border-right: 0;
border-radius: 2px 0 2px 0;
width: 259px;
}
}
.fromTime{
::v-deep .el-range-input{
width: 100%;
}
::v-deep .el-range-separator, ::v-deep .el-range__close-icon{
line-height: 24px;
width: 20px;
}
}
.fromTime-icon {
display: none;
}
}
::v-deep .form-content-width{
width: 170px;
}
}
}
</style>
......@@ -53,6 +53,23 @@
<el-option v-for="(item, index) in form.options" :key="index" :label="item.name" :value="item.value" />
</el-select>
</template>
<!-- 时间、自定义 -->
<template v-else-if="form.type==5">
<custom-time-select
v-model="form.value"
:placeholder="form.placeholder"
:dateFrom="form.dateFrom ? form.dateFrom : ''"
:dateTo="form.dateTo ? form.dateTo : ''"
@handle-search="changeSelect" />
</template>
<!-- 金额 -->
<template v-else-if="form.type==6">
<custom-money-select
:moneyList="form.moneyList"
v-model="form.value"
:placeholder="form.placeholder"
@handle-search="changeSelect" />
</template>
<!-- 自定义 -->
<template v-if="form.type==0">
<slot name="slot"></slot>
......@@ -74,6 +91,8 @@
</template>
<script>
import CustomTimeSelect from './CustomTimeSelect'
import CustomMoneySelect from './CustomMoneySelect'
export default {
name: "HeadForm",
props: {
......@@ -111,6 +130,10 @@ export default {
}
},
components: {
CustomTimeSelect,
CustomMoneySelect
},
methods: {
changeSelect(){
this.$emit('handle-search')
......
......@@ -59,11 +59,11 @@ export default {
{title: '行政许可', pathName: 'administrative'}
]},
{title: '业务往来', pathName: '', children: [
{title: '客户', pathName: ''},
{title: '供应商', pathName: ''},
{title: '招标代理', pathName: ''},
{title: '历史发包', pathName: ''},
{title: '开标记录', pathName: ''}
{title: '客户', pathName: 'custom'},
{title: '供应商', pathName: 'supplier'},
{title: '招标代理', pathName: 'bidagency'},
{title: '历史发包', pathName: 'hiscontract'},
{title: '开标记录', pathName: 'bidrecords'}
]},
{title: '城投分析', pathName: '', children: [
{title: '区域经济', pathName: 'regionalEconomies'},
......
......@@ -25,7 +25,7 @@
:prop="item.prop"
:width="item.width"
:min-width="item.minWidth"
align="left"
:align="item.align?item.align:'left'"
:fixed="item.fixed"
:sortable="item.sortable"
:resizable="false">
......@@ -35,7 +35,7 @@
<template slot-scope="scope">
<slot v-if="item.slot" :name="item.prop" :row="scope.row" :index="scope.$index" :data="item"></slot>
<span v-else>
{{ scope.row[item.prop] }}
{{ scope.row[item.prop] || '--' }}
</span>
</template>
</el-table-column>
......
<template>
<div class="detail-container">
<head-form
title="常合作招标代理单位"
:form-data="formData"
:query-params="queryParams"
:total="tableDataTotal"
:isExcel="true"
@handle-search="handleSearch"
/>
<tables
:indexFixed="true"
:tableLoading="tableLoading"
:tableData="tableData"
:forData="forData"
:tableDataTotal="tableDataTotal"
:queryParams="queryParams"
@handle-current-change="handleCurrentChange"
@sort-change="sortChange"
>
<template slot="agency" slot-scope="scope">
<router-link to="" tag="a" class="a-link" v-if="scope.row.agencyId&&scope.row.agency" v-html="scope.row.agency"></router-link>
<div v-else v-html="scope.row.agency || '--'"></div>
</template>
<template slot="projectInfo" slot-scope="scope">
<router-link to="" tag="a" class="a-link" v-if="scope.row.projectInfo.bid&&scope.row.projectInfo.dealTitle" v-html="scope.row.projectInfo.dealTitle"></router-link>
<div v-else v-html="scope.row.projectInfo.dealTitle || '--'"></div>
<div v-if="scope.row.count>1" @click="handleClick($event, scope.row)" style="color: #FF7E38;cursor: pointer;">{{scope.row.count}}个合作项目/工程 ></div>
</template>
</tables>
<client-detail
v-if="isDetails"
:data="rowData"
:title="'合作项目/工程明细'"
@cancel="isDetails=false" />
</div>
</template>
<script>
import mixin from '../mixins/mixin'
import {oftenAgencyPage} from '@/api/detail/party-a/dealings'
import ClientDetail from './component/bidagencyDetail'
export default {
name: 'Bidagency',
props: ['companyId'],
mixins: [mixin],
components: {
ClientDetail
},
data() {
return {
queryParams: {
cid: this.companyId,
sort: 3,
pageNum: 1,
pageSize: 10
},
forData: [
{label: '招标代理单位名称', prop: 'agency', minWidth: '350', slot: true},
{label: '合作项目/工程名称', prop: 'projectInfo', minWidth: '400', sortable: 'custom', slot: true},
{label: '最近一次合作时间', prop: 'issueTime', minWidth: '140', sortable: 'custom'}
],
formData: [
{ type: 3, fieldName: 'keys', value: '', placeholder: '输入企业名称查询', options: []},
],
//列表
tableLoading:false,
tableData:[],
tableDataTotal:0,
isDetails: false,
rowData: {}
}
},
computed: {
},
created() {
this.handleQuery()
},
methods: {
async handleQuery(params) {
this.tableLoading = true
let param = params?params:this.queryParams
let res = await oftenAgencyPage(param)
this.tableLoading = false
if(res.code==200){
this.tableData = res.rows.map((item)=>{
item.projectInfo = typeof item.projectInfo == 'string' ? JSON.parse(item.projectInfo) : item.projectInfo
return item
})
}
this.tableDataTotal = res.total
},
handleClick(e, data) {
this.rowData = data
this.isDetails = true
}
}
}
</script>
<style lang="scss" scoped>
.detail-container{
background: #ffffff;
border-radius: 4px;
padding: 16px;
}
</style>
<template>
<div class="detail-container">
<head-form
title="开标记录"
:form-data="formData"
:query-params="queryParams"
:total="tableDataTotal"
:isExcel="true"
@handle-search="handleSearch"
/>
<tables
:indexFixed="true"
:tableLoading="tableLoading"
:tableData="tableData"
:forData="forData"
:tableDataTotal="tableDataTotal"
:queryParams="queryParams"
@handle-current-change="handleCurrentChange"
>
<template slot="name" slot-scope="scope">
<router-link to="" tag="a" class="a-link" v-if="scope.row.id&&scope.row.name" v-html="scope.row.name"></router-link>
<div v-else v-html="scope.row.name || '--'"></div>
</template>
<template slot="source" slot-scope="scope">
<span class="a-link" v-if="scope.row.url&&scope.row.source" @click="handlePic(scope.row.url)" style="cursor: pointer;">{{ scope.row.source }}</span>
<div v-else>{{ scope.row.source || '--' }}</div>
</template>
</tables>
</div>
</template>
<script>
import mixin from '../mixins/mixin'
import {tenderPage} from '@/api/detail/party-a/dealings'
export default {
name: 'Bidrecords',
props: ['companyId'],
mixins: [mixin],
components: {
},
data() {
return {
queryParams: {
cid: this.companyId,
pageNum: 1,
pageSize: 10
},
forData: [
{label: '项目名称', prop: 'name', minWidth: '320', slot: true},
{label: '本企业投标报价(万元)', prop: 'tenderOffer', minWidth: '160'},
{label: '发布日期', prop: 'publishTime', minWidth: '100'},
{label: '项目地区', prop: 'province', minWidth: '160'},
{label: '信息来源', prop: 'source', minWidth: '280', slot: true}
],
formData: [
{ type: 3, fieldName: 'keys', value: '', placeholder: '输入项目名称查询', options: []},
],
//列表
tableLoading:false,
tableData:[],
tableDataTotal:0
}
},
computed: {
},
created() {
this.handleQuery()
},
methods: {
async handleQuery(params) {
this.tableLoading = true
let param = params?params:this.queryParams
let res = await tenderPage(param)
this.tableLoading = false
if(res.code==200){
this.tableData = res.rows
}
this.tableDataTotal = res.total
},
handlePic(url){
window.open(url, "_blank")
}
}
}
</script>
<style lang="scss" scoped>
.detail-container{
background: #ffffff;
border-radius: 4px;
padding: 16px;
}
</style>
<template>
<div class="client-details">
<el-drawer
:visible.sync="drawer"
size="60%"
custom-class="client-drawer"
:with-header="false"
@closed="cancel">
<head-detail-form
:title="title"
:form-data="formData"
:query-params="queryParams"
:total="tableDataTotal"
:amountTotal="amountTotal"
@handle-search="handleSearch"
/>
<tables
:indexFixed="true"
:tableLoading="tableLoading"
:tableData="tableData"
:forData="forData"
:tableDataTotal="tableDataTotal"
:queryParams="queryParams"
@handle-current-change="handleCurrentChange"
style="margin: 12px;"
>
<template slot="dealTitle" slot-scope="scope">
<div class="flex-box">
<img class="tip-img" src="@/assets/images/detail/ico_pdf.png" v-if="scope.row.fileUrlL" @click="handlePic(scope.row.fileUrlL)"/>
<router-link to="" tag="a" class="a-link" v-if="scope.row.bid&&scope.row.dealTitle" v-html="scope.row.dealTitle"></router-link>
<span v-else v-html="scope.row.dealTitle || '--'"></span>
</div>
</template>
<template slot="province" slot-scope="scope">
{{scope.row.province}}{{`${scope.row.city?'-'+scope.row.city:''}`}}{{`${scope.row.area?'-'+scope.row.area:''}`}}
</template>
</tables>
</el-drawer>
</div>
</template>
<script>
import mixin from '../../mixins/mixin'
import {bidCooperatePage} from '@/api/detail/party-a/dealings'
import HeadDetailForm from "../../component/HeadDetailForm"
export default {
props: {
'data': {
type: Object,
default: () => {
return {}
}
},
'title': {
type: String,
default: () => {
return ''
}
}
},
components: {
HeadDetailForm
},
mixins: [mixin],
data() {
return {
drawer: false,
queryParams: {
tendereeId: this.data.tendereeId,
agencyId: this.data.agencyId,
pageNum: 1,
pageSize: 10
},
formData: [
{ type: 3, fieldName: 'keys', value: '', placeholder: '输入企业名称查询', options: []},
],
forData: [
{label: '合作项目/工程名称', prop: 'dealTitle', width: '720', slot: true},
{label: '项目/工程金额(万元)', prop: 'projectAmount', width: '160'},
{label: '合作时间', prop: 'issueTime', width: '100'},
{label: '项目地区', prop: 'province', width: '160', slot: true},
{label: '项目类型', prop: 'projectCategory', width: '130'}
],
//列表
tableLoading:false,
tableData:[],
tableDataTotal:0,
amountTotal: 0
}
},
created() {
this.drawer = true
this.handleQuery()
},
methods: {
async handleQuery(params) {
this.tableLoading = true
let param = params?params:this.queryParams
let res = await bidCooperatePage(param)
this.tableLoading = false
if(res.code==200){
this.tableData = res.rows
}
this.tableDataTotal = res.total
this.amountTotal = res.totalAmount
},
handlePic(url){
window.open(url, "_blank")
},
cancel() {
this.$emit('cancel')
}
}
}
</script>
<style lang="scss" scoped>
.client-details {
::v-deep .client-drawer{
background: #FFFFFF;
}
}
</style>
<template>
<div class="client-details">
<el-drawer
:visible.sync="drawer"
size="60%"
custom-class="client-drawer"
:with-header="false"
@closed="cancel">
<head-detail-form
:title="title"
:form-data="formData"
:query-params="queryParams"
:total="tableDataTotal"
:amountTotal="amountTotal"
@handle-search="handleSearch"
/>
<tables
:indexFixed="true"
:tableLoading="tableLoading"
:tableData="tableData"
:forData="forData"
:tableDataTotal="tableDataTotal"
:queryParams="queryParams"
@handle-current-change="handleCurrentChange"
style="margin: 12px;"
>
<template slot="projectAllName" slot-scope="scope">
<div class="flex-box">
<img class="tip-img" src="@/assets/images/detail/ico_pdf.png" v-if="scope.row.sourceUrl" @click="handlePic(scope.row.sourceUrl)"/>
<router-link to="" tag="a" class="a-link" v-if="scope.row.id&&scope.row.projectAllName" v-html="scope.row.projectAllName"></router-link>
<span v-else v-html="scope.row.projectAllName || '--'"></span>
</div>
</template>
<template slot="province" slot-scope="scope">
{{scope.row.province}}{{`${scope.row.city?'-'+scope.row.city:''}`}}
</template>
</tables>
</el-drawer>
</div>
</template>
<script>
import mixin from '../../mixins/mixin'
import {clientProjectPage} from '@/api/detail/party-a/dealings'
import HeadDetailForm from "../../component/HeadDetailForm"
export default {
props: {
'data': {
type: Object,
default: () => {
return {}
}
},
'company-id': {
type: Number,
default: () => {
return 0
}
},
'title': {
type: String,
default: () => {
return ''
}
}
},
components: {
HeadDetailForm
},
mixins: [mixin],
data() {
return {
drawer: false,
queryParams: {
cid: this.companyId,
unitId: this.data.projectUnitId,
pageNum: 1,
pageSize: 10
},
formData: [
{ type: 3, fieldName: 'keys', value: '', placeholder: '输入企业名称查询', options: []},
],
forData: [
{label: '合作项目/工程名称', prop: 'projectAllName', width: '720', slot: true},
{label: '项目/工程金额(万元)', prop: 'winBidAmount', width: '160'},
{label: '合作时间', prop: 'winBidTime', width: '100'},
{label: '项目地区', prop: 'province', width: '160', slot: true},
{label: '项目类型', prop: 'boundType', width: '130'},
{label: '工期(天)', prop: 'period', width: '90'},
{label: '下浮率', prop: 'lowerRate', width: '90'}
],
//列表
tableLoading:false,
tableData:[],
tableDataTotal:0,
amountTotal: 0
}
},
created() {
this.drawer = true
this.handleQuery()
},
methods: {
async handleQuery(params) {
this.tableLoading = true
let param = params?params:this.queryParams
let res = await clientProjectPage(param)
this.tableLoading = false
if(res.code==200){
this.tableData = res.rows
}
this.tableDataTotal = res.total
this.amountTotal = res.totalAmount
},
handlePic(url){
window.open(url, "_blank")
},
cancel() {
this.$emit('cancel')
}
}
}
</script>
<style lang="scss" scoped>
.client-details {
::v-deep .client-drawer{
background: #FFFFFF;
}
.tip-img{
width: 14px;
height: 14px;
margin-right: 4px;
cursor: pointer;
}
}
</style>
<template>
<div class="client-details">
<el-drawer
:visible.sync="drawer"
size="60%"
custom-class="client-drawer"
:with-header="false"
@closed="cancel">
<head-detail-form
:title="title"
:form-data="formData"
:query-params="queryParams"
:total="tableDataTotal"
:amountTotal="amountTotal"
@handle-search="handleSearch"
/>
<tables
:indexFixed="true"
:tableLoading="tableLoading"
:tableData="tableData"
:forData="forData"
:tableDataTotal="tableDataTotal"
:queryParams="queryParams"
@handle-current-change="handleCurrentChange"
style="margin: 12px;"
>
<template slot="projectAllName" slot-scope="scope">
<div class="flex-box">
<img class="tip-img" src="@/assets/images/detail/ico_pdf.png" v-if="scope.row.sourceUrl" @click="handlePic(scope.row.sourceUrl)"/>
<router-link to="" tag="a" class="a-link" v-if="scope.row.id&&scope.row.projectAllName" v-html="scope.row.projectAllName"></router-link>
<span v-else v-html="scope.row.projectAllName || '--'"></span>
</div>
</template>
<template slot="province" slot-scope="scope">
{{scope.row.province}}{{`${scope.row.city?'-'+scope.row.city:''}`}}
</template>
</tables>
</el-drawer>
</div>
</template>
<script>
import mixin from '../../mixins/mixin'
import { supplierProjectPage } from '@/api/detail/party-a/dealings'
import HeadDetailForm from "../../component/HeadDetailForm"
export default {
props: {
'data': {
type: Object,
default: () => {
return {}
}
},
'company-id': {
type: Number,
default: () => {
return 0
}
},
'title': {
type: String,
default: () => {
return ''
}
}
},
components: {
HeadDetailForm
},
mixins: [mixin],
data() {
return {
drawer: false,
queryParams: {
cid: this.data.companyId,
unitId: this.companyId,
pageNum: 1,
pageSize: 10
},
formData: [
{ type: 3, fieldName: 'keys', value: '', placeholder: '输入企业名称查询', options: []},
],
forData: [
{label: '合作项目/工程名称', prop: 'projectAllName', width: '720', slot: true},
{label: '项目/工程金额(万元)', prop: 'winBidAmount', width: '160'},
{label: '合作时间', prop: 'winBidTime', width: '100'},
{label: '项目地区', prop: 'province', width: '160', slot: true},
{label: '项目类型', prop: 'boundType', width: '130'},
{label: '工期(天)', prop: 'period', width: '90'},
{label: '下浮率', prop: 'lowerRate', width: '90'}
],
//列表
tableLoading:false,
tableData:[],
tableDataTotal:0,
amountTotal: 0
}
},
created() {
this.drawer = true
this.handleQuery()
},
methods: {
async handleQuery(params) {
this.tableLoading = true
let param = params?params:this.queryParams
let res = await supplierProjectPage(param)
this.tableLoading = false
if(res.code==200){
this.tableData = res.rows
}
this.tableDataTotal = res.total
this.amountTotal = res.totalAmount
},
handlePic(url){
window.open(url, "_blank")
},
cancel() {
this.$emit('cancel')
}
}
}
</script>
<style lang="scss" scoped>
.client-details {
::v-deep .client-drawer{
background: #FFFFFF;
}
.tip-img{
width: 14px;
height: 14px;
margin-right: 4px;
cursor: pointer;
}
}
</style>
<template>
<div class="detail-container">
<head-form
title="客户"
:form-data="formData"
:query-params="queryParams"
:total="tableDataTotal"
:isExcel="true"
@handle-search="handleSearch"
/>
<tables
:indexFixed="true"
:tableLoading="tableLoading"
:tableData="tableData"
:forData="forData"
:tableDataTotal="tableDataTotal"
:queryParams="queryParams"
@handle-current-change="handleCurrentChange"
@sort-change="sortChange"
>
<template slot="companyName" slot-scope="scope">
<router-link to="" tag="a" class="a-link" v-if="scope.row.companyId&&scope.row.companyName" v-html="scope.row.companyName"></router-link>
<div v-else v-html="scope.row.companyName || '--'"></div>
</template>
<template slot="projectAllName" slot-scope="scope">
<router-link to="" tag="a" class="a-link" v-if="scope.row.projectId&&scope.row.projectAllName" v-html="scope.row.projectAllName"></router-link>
<div v-else v-html="scope.row.projectAllName || '--'"></div>
<div v-if="scope.row.count>1" @click="handleClick($event, scope.row)" style="color: #FF7E38;cursor: pointer;">{{scope.row.count}}个合作项目/工程 ></div>
</template>
</tables>
<client-detail
v-if="isDetails"
:data="rowData"
:title="'合作项目/工程明细'"
:company-id="companyId"
@cancel="isDetails=false" />
</div>
</template>
<script>
import mixin from '../mixins/mixin'
import { clientPage } from '@/api/detail/party-a/dealings'
import ClientDetail from './component/customDetail'
export default {
name: 'Custom',
props: ['companyId'],
mixins: [mixin],
components: {
ClientDetail
},
data() {
return {
queryParams: {
cid: this.companyId,
sort: 3,
pageNum: 1,
pageSize: 10
},
forData: [
{label: '客户名称', prop: 'companyName', minWidth: '350', slot: true},
{label: '合作项目/工程名称', prop: 'projectAllName', minWidth: '400', sortable: 'custom', slot: true},
{label: '合作总金额(万元)', prop: 'amount', minWidth: '150', sortable: 'custom'},
{label: '最近一次合作时间', prop: 'time', minWidth: '140', sortable: 'custom'}
],
formData: [
{ type: 3, fieldName: 'keys', value: '', placeholder: '输入企业名称查询', options: []},
],
//列表
tableLoading:false,
tableData:[],
tableDataTotal:0,
isDetails: false,
rowData: {}
}
},
computed: {
},
created() {
this.handleQuery()
},
methods: {
async handleQuery(params) {
this.tableLoading = true
let param = params?params:this.queryParams
let res = await clientPage(param)
this.tableLoading = false
if(res.code==200){
this.tableData = res.rows
}
this.tableDataTotal = res.total
},
//排序-测试
sortChange(e){
this.tableData = []
let sortRule = e.prop+','+e.order
switch (sortRule){
case 'amount,descending':
this.queryParams.sort = 1
break
case 'amount,ascending':
this.queryParams.sort = 2
break
case 'time,descending':
this.queryParams.sort = 3
break
case 'time,ascending':
this.queryParams.sort = 4
break
case 'projectAllName,descending':
this.queryParams.sort = 5
break
case 'projectAllName,ascending':
this.queryParams.sort = 6
break
}
this.handleSearch()
},
handleClick(e, data) {
this.rowData = data
this.isDetails = true
}
}
}
</script>
<style lang="scss" scoped>
.detail-container{
background: #ffffff;
border-radius: 4px;
padding: 16px;
}
</style>
<template>
<div class="detail-container">
<head-form
title="历史发包"
:form-data="formData"
:query-params="queryParams"
:total="tableDataTotal"
:isExcel="true"
@handle-search="handleSearch"
/>
<tables
:indexFixed="true"
:tableLoading="tableLoading"
:tableData="tableData"
:forData="forData"
:tableDataTotal="tableDataTotal"
:queryParams="queryParams"
@handle-current-change="handleCurrentChange"
@sort-change="sortChange"
>
<template slot="projectAllName" slot-scope="scope">
<router-link to="" tag="a" class="a-link" v-if="scope.row.id&&scope.row.projectAllName ">{{ scope.row.projectAllName }}</router-link>
<div v-else>{{ scope.row.projectAllName || '--' }}</div>
</template>
<template slot="companyName" slot-scope="scope">
<router-link to="" tag="a" class="a-link" v-if="scope.row.companyId&&scope.row.companyName">{{ scope.row.companyName }}</router-link>
<div v-else>{{ scope.row.companyName || '--' }}</div>
</template>
</tables>
</div>
</template>
<script>
import mixin from '../mixins/mixin'
import {historySendProvince, historySendPage} from '@/api/detail/party-a/dealings'
export default {
name: 'Hiscontract',
props: ['companyId'],
mixins: [mixin],
components: {
},
data() {
return {
queryParams: {
cid: this.companyId,
sort: 3,
pageNum: 1,
pageSize: 10
},
forData: [
{label: '项目名称', prop: 'projectAllName', minWidth: '560', slot: true},
{label: '中标时间', prop: 'winBidTime', minWidth: '100', sortable: 'custom'},
{label: '中标企业', prop: 'companyName', minWidth: '320', slot: true},
{label: '中标金额(万元)', prop: 'winBidAmount', minWidth: '140', sortable: 'custom'},
{label: '下浮率(%)', prop: 'lowerRate', minWidth: '120', sortable: 'custom'},
{label: '项目经理 / 负责人', prop: 'staffName', minWidth: '130'},
{label: '中标地区', prop: 'region', minWidth: '160'},
{label: '工期(天)', prop: 'period', minWidth: '110', sortable: 'custom'},
{label: '业绩类别', prop: 'boundType', minWidth: '110'}
],
formData: [
{ type: 1, fieldName: 'provinceId', value: '', placeholder: '项目地区', options: [] },
{ type: 5, fieldName: 'time', value: '', placeholder: '中标时间', startTime: 'dateFrom', endTime: 'dateTo' },
{ type: 6, fieldName: 'money', value: '', placeholder: '中标金额', startMoney: 'amountMin', endMoney: 'amountMax' },
{ type: 3, fieldName: 'keys', value: '', placeholder: '输入关键词查询', options: [] }
],
//列表
tableLoading:false,
tableData:[],
tableDataTotal:0
}
},
computed: {
},
created() {
this.handleOption()
this.handleQuery()
},
methods: {
async handleOption(){
let res = await historySendProvince({cid: this.companyId})
if(res.code==200){
let region = res.data.map(item => {
let it = {name:item.province+'('+item.count+')',value:item.provinceId}
return it
})
this.setFormData('provinceId', region)
}
},
async handleQuery(params) {
this.tableLoading = true
let param = params?params:this.queryParams
let res = await historySendPage(param)
this.tableLoading = false
if(res.code==200){
this.tableData = res.rows
}
this.tableDataTotal = res.total
}
}
}
</script>
<style lang="scss" scoped>
.detail-container{
background: #ffffff;
border-radius: 4px;
padding: 16px;
}
</style>
<template>
<div class="detail-container">
<head-form
title="供应商"
:form-data="formData"
:query-params="queryParams"
:total="tableDataTotal"
:isExcel="true"
@handle-search="handleSearch"
/>
<tables
:indexFixed="true"
:tableLoading="tableLoading"
:tableData="tableData"
:forData="forData"
:tableDataTotal="tableDataTotal"
:queryParams="queryParams"
@handle-current-change="handleCurrentChange"
@sort-change="sortChange"
>
<template slot="companyName" slot-scope="scope">
<router-link to="" tag="a" class="a-link" v-if="scope.row.companyId&&scope.row.companyName" v-html="scope.row.companyName"></router-link>
<div v-else v-html="scope.row.companyName || '--'"></div>
</template>
<template slot="projectAllName" slot-scope="scope">
<router-link to="" tag="a" class="a-link" v-if="scope.row.projectId&&scope.row.projectAllName" v-html="scope.row.projectAllName"></router-link>
<div v-else v-html="scope.row.projectAllName || '--'"></div>
<div v-if="scope.row.count>1" @click="handleClick($event, scope.row)" style="color: #FF7E38;cursor: pointer;">{{scope.row.count}}个合作项目/工程 ></div>
</template>
</tables>
<client-detail
v-if="isDetails"
:data="rowData"
:title="'合作项目/工程明细'"
:company-id="companyId"
@cancel="isDetails=false" />
</div>
</template>
<script>
import mixin from '../mixins/mixin'
import { supplierPage } from '@/api/detail/party-a/dealings'
import ClientDetail from './component/supplierDetail'
export default {
name: 'Supplier',
props: ['companyId'],
mixins: [mixin],
components: {
ClientDetail
},
data() {
return {
queryParams: {
cid: this.companyId,
sort: 3,
pageNum: 1,
pageSize: 10
},
forData: [
{label: '供应商', prop: 'companyName', minWidth: '350', slot: true},
{label: '合作项目/工程名称', prop: 'projectAllName', minWidth: '400', sortable: 'custom', slot: true},
{label: '合作总金额(万元)', prop: 'amount', minWidth: '150', sortable: 'custom'},
{label: '最近一次合作时间', prop: 'time', minWidth: '140', sortable: 'custom'}
],
formData: [
{ type: 3, fieldName: 'keys', value: '', placeholder: '输入企业名称查询', options: []},
],
//列表
tableLoading:false,
tableData:[],
tableDataTotal:0,
isDetails: false,
rowData: {}
}
},
computed: {
},
created() {
this.handleQuery()
},
methods: {
async handleQuery(params) {
this.tableLoading = true
let param = params?params:this.queryParams
let res = await supplierPage(param)
this.tableLoading = false
if(res.code==200){
this.tableData = res.rows
}
this.tableDataTotal = res.total
},
handleClick(e, data) {
this.rowData = data
this.isDetails = true
}
}
}
</script>
<style lang="scss" scoped>
.detail-container{
background: #ffffff;
border-radius: 4px;
padding: 16px;
}
</style>
......@@ -24,6 +24,12 @@
<Announcement v-if="currentPath.pathName=='announcement'" :company-id="companyId" />
<Tencent v-if="currentPath.pathName=='tencent'" :company-id="companyId" />
<Administrative v-if="currentPath.pathName=='administrative'" :company-id="companyId" />
<!-- 业务往来 -->
<Custom v-if="currentPath.pathName=='custom'" :company-id="companyId" />
<Supplier v-if="currentPath.pathName=='supplier'" :company-id="companyId" />
<Bidagency v-if="currentPath.pathName=='bidagency'" :company-id="companyId" />
<Hiscontract v-if="currentPath.pathName=='hiscontract'" :company-id="companyId" />
<Bidrecords v-if="currentPath.pathName=='bidrecords'" :company-id="companyId" />
<!-- 投诚分析 -->
<LandAcquisition v-if="currentPath.pathName=='landAcquisition'" :company-id="companyId" />
<RegionalEconomies v-if="currentPath.pathName=='regionalEconomies'" :company-id="companyId" />
......@@ -70,6 +76,11 @@ import Biddingplan from "./opport/biddingplan" //项目商机-招标计划
import Announcement from "./opport/announcement" //项目商机-招标公告
import Tencent from "./opport/tencent" //项目商机-标讯Pro
import Administrative from "./opport/administrative" //项目商机-行政许可
import Custom from "./dealings/custom" //业务往来-客户
import Supplier from "./dealings/supplier" //业务往来-供应商
import Bidagency from "./dealings/bidagency" //业务往来-招标代理
import Hiscontract from "./dealings/hiscontract" //业务往来-历史发包
import Bidrecords from "./dealings/bidrecords" //业务往来-开标记录
import LandAcquisition from "./urbanLnvestment/landAcquisition" //投诚分析-城投拿地
import RegionalEconomies from "./urbanLnvestment/regionalEconomies" //投诚分析-区域经济
import SameRegion from "./urbanLnvestment/sameRegion" //投诚分析-同地区城投
......@@ -104,6 +115,11 @@ export default {
Announcement,
Tencent,
Administrative,
Custom,
Supplier,
Bidagency,
Hiscontract,
Bidrecords,
LandAcquisition,
RegionalEconomies,
SameRegion,
......
......@@ -30,6 +30,11 @@ export default {
condtion[item.endTime] = item.value[1];
return
}
if(item.fieldName == 'money') {
condtion[item.startMoney] = item.value[0];
condtion[item.endMoney] = item.value[1];
return
}
condtion[item.fieldName] = item.value
}
})
......
......@@ -40,7 +40,7 @@ export default {
data() {
return {
queryParams: {
companyId: this.companyId,
cid: this.companyId,
pageNum: 1,
pageSize: 10
},
......
......@@ -38,14 +38,14 @@ export default {
data() {
return {
queryParams: {
companyId: this.companyId,
cid: this.companyId,
pageNum: 1,
pageSize: 10
},
forData: [
{label: '项目名称', prop: 'porjectName', minWidth: '300', slot: true},
{label: '发布日期', prop: 'use', sortable: true, width: '120'},
{label: '预算金额(万元)', prop: 'type', sortable: true, width: '140'},
{label: '发布日期', prop: 'use', sortable: 'custom', width: '120'},
{label: '预算金额(万元)', prop: 'type', sortable: 'custom', width: '140'},
{label: '项目地区', prop: 'way', width: '120'},
{label: '项目类别', prop: 'state', width: '90'},
{label: '招采单位联系人', prop: 'money', width: '110'},
......
......@@ -38,17 +38,17 @@ export default {
data() {
return {
queryParams: {
companyId: this.companyId,
cid: this.companyId,
pageNum: 1,
pageSize: 10
},
forData: [
{label: '项目名称', prop: 'porjectName', minWidth: '300', slot: true},
{label: '项目总投资(亿元)', prop: 'use', sortable: true, width: '150'},
{label: '项目资本金(亿元)', prop: 'type', sortable: true, width: '150'},
{label: '项目收益倍数(倍)', prop: 'way', sortable: true, width: '150'},
{label: '专项债金额(亿元)', prop: 'state', sortable: true, width: '150'},
{label: '专项债用作资本金(亿元)', prop: 'money', sortable: true, width: '200'}
{label: '项目总投资(亿元)', prop: 'use', sortable: 'custom', width: '150'},
{label: '项目资本金(亿元)', prop: 'type', sortable: 'custom', width: '150'},
{label: '项目收益倍数(倍)', prop: 'way', sortable: 'custom', width: '150'},
{label: '专项债金额(亿元)', prop: 'state', sortable: 'custom', width: '150'},
{label: '专项债用作资本金(亿元)', prop: 'money', sortable: 'custom', width: '200'}
],
formData: [
{ type: 3, fieldName: 'keys', value: '', placeholder: '输入项目名称关键词查询', options: []},
......
......@@ -38,7 +38,7 @@ export default {
data() {
return {
queryParams: {
companyId: this.companyId,
cid: this.companyId,
pageNum: 1,
pageSize: 10
},
......@@ -48,8 +48,8 @@ export default {
{label: '行业分类', prop: 'type', width: '100'},
{label: '供地方式', prop: 'way', width: '100'},
{label: '土地坐落', prop: 'state', width: '130'},
{label: '成交金额(万元)', prop: 'money', sortable: true, width: '140'},
{label: '总面积(㎡)', prop: 'scale', sortable: true, width: '130'},
{label: '成交金额(万元)', prop: 'money', sortable: 'custom', width: '140'},
{label: '总面积(㎡)', prop: 'scale', sortable: 'custom', width: '130'},
{label: '批准单位', prop: 'unit', width: '130'},
{label: '签订日期', prop: 'date', width: '130'}
],
......
......@@ -38,16 +38,16 @@ export default {
data() {
return {
queryParams: {
companyId: this.companyId,
cid: this.companyId,
pageNum: 1,
pageSize: 10
},
forData: [
{label: '项目名称', prop: 'porjectName', minWidth: '300', slot: true},
{label: '成交金额(万元)', prop: 'use', sortable: true, width: '150'},
{label: '成交金额(万元)', prop: 'use', sortable: 'custom', width: '150'},
{label: '项目类别', prop: 'type', width: '100'},
{label: '计划开工日期', prop: 'way', sortable: true, width: '130'},
{label: '计划完工日期', prop: 'state', sortable: true, width: '130'},
{label: '计划开工日期', prop: 'way', sortable: 'custom', width: '130'},
{label: '计划完工日期', prop: 'state', sortable: 'custom', width: '130'},
{label: '审批结果', prop: 'money', width: '100'},
{label: '是否为民间推介项目', prop: 'scale', width: '150'}
],
......
......@@ -38,7 +38,7 @@ export default {
data() {
return {
queryParams: {
companyId: this.companyId,
cid: this.companyId,
pageNum: 1,
pageSize: 10
},
......
......@@ -35,7 +35,7 @@ export default {
return {
activeName: 'first',
queryParams: {
companyId: this.companyId,
cid: this.companyId,
pageNum: 1,
pageSize: 10
},
......
......@@ -27,7 +27,7 @@ export default {
data() {
return {
queryParams: {
companyId: this.companyId,
cid: this.companyId,
pageNum: 1,
pageSize: 10
},
......
......@@ -40,7 +40,7 @@ export default {
return {
activeName: 'first',
queryParams: {
companyId: this.companyId,
cid: this.companyId,
pageNum: 1,
pageSize: 10
},
......
......@@ -47,7 +47,7 @@ export default {
data() {
return {
queryParams: {
companyId: this.companyId,
cid: this.companyId,
pageNum: 1,
pageSize: 10
},
......
......@@ -15,13 +15,13 @@ export default {
loading: false, // 是否加载中
iframeHight: window.innerHeight, // iframe高度
scrollTop: 0, // 滚动条距离内部页面顶部距离
secretid: '' // 需要携带的sdkId
secretId: '' // 需要携带的sdkId
}
},
created() {
if (this.$route.query.companyId) { // 获取companyId
this.loading = true
this.src = `https://pre-plug.jiansheku.com/enterprise/${this.$route.query.companyId}?secretid=${this.secretid}`
this.src = `https://pre-plug.jiansheku.com/enterprise/${this.$route.query.companyId}?secretId=${this.secretId}`
}
},
mounted() {
......
......@@ -251,8 +251,9 @@
param.id = this.id
editXMNR(param).then(result=>{
if(result.code == 200)
this.$message.success('修改成功')
this.$message.success('修改成功!')
else{
this.$message.error(res.msg)
this.getJSNR()
}
})
......
......@@ -61,7 +61,7 @@
</el-table>
<div class="bottems">
<div class="btn btn_primary h28" @click="opennew"><div class="img img1"></div>新增联系人</div>
<el-pagination
<el-pagination v-if="total>searchParam.pageSize"
background
:page-size="searchParam.pageSize"
:current-page="searchParam.pageNum"
......
......@@ -4,8 +4,10 @@
<el-card class="box-card noborder">
<div class="cardtitles">相关企业</div>
<div class="searchbtns">
<el-select class="select" placeholder="企业角色">
<option label="111" value="222"></option>
<el-select class="select" placeholder="企业类型">
<el-select placeholder="请选择">
<el-option v-for="(item,index) in companytype" :label="item.dictLabel" :value="item.dictValue"></el-option>
</el-select>
</el-select>
<div class="searchInput">
<el-input type="text" placeholder="输入关键词查询"></el-input>
......@@ -85,9 +87,7 @@
<span>新建相关企业</span>
</div>
<div class="types">
<div :class="{'on':types==1}" @click="types=1"><i></i>业主单位</div>
<div :class="{'on':types==2}" @click="types=2"><i></i>合作伙伴</div>
<div :class="{'on':types==3}" @click="types=3"><i></i>竞争对手</div>
<div v-for="(item,index) in companytype" :class="{'on':types==item.dictValue}" @click="types=item.dictLabel"><i></i>{{item.dictLabel}}</div>
</div>
<div class="popform">
<div class="popbot" style="padding-right: 0">
......@@ -102,34 +102,24 @@
width="464px">
<div class="poptitle">
<img src="@/assets/images/economies/icon.png">
<span>新建相关企业-{{types==1?"业主单位":""}}{{types==2?"合作伙伴":""}}{{types==3?"竞争对手":""}}</span>
<span>新建相关企业-{{types}}</span>
</div>
<el-form class="popform i" label-width="85px" :rules="rules" ref="ruleForm" >
<el-form-item label="企业名称:" prop="projectName" class="row">
<el-input type="text" placeholder="请输入"></el-input>
</el-form-item>
<el-form-item v-if="types == 1" label="对接深度:" class="row">
<el-select placeholder="请选择">
<el-option label="cccc" value="11"></el-option>
<el-option label="cccc" value="121"></el-option>
</el-select>
<el-form-item v-if="types == companytype[0].dictValue" label="对接深度:" class="row">
<el-input type="text" placeholder="请输入"></el-input>
</el-form-item>
<el-form-item v-if="types == 2" label="合作阶段:" class="row">
<el-select placeholder="请选择">
<el-option label="cccc" value="11"></el-option>
<el-option label="cccc" value="121"></el-option>
</el-select>
<el-form-item v-if="types == companytype[1].dictValue" label="合作阶段:" class="row">
<el-input type="text" placeholder="请输入"></el-input>
</el-form-item>
<el-form-item v-if="types == 3" label="竞争力度:" prop="projectName" class="row">
<el-select placeholder="请选择">
<el-option label="cccc" value="11"></el-option>
<el-option label="cccc" value="121"></el-option>
</el-select>
<el-form-item v-if="types == companytype[2].dictValue" label="竞争力度:" class="row">
<el-input type="text" placeholder="请输入"></el-input>
</el-form-item>
<el-form-item label="企业角色:" prop="projectName" class="row">
<el-form-item label="企业角色:" class="row">
<el-select placeholder="请选择">
<el-option label="cccc" value="11"></el-option>
<el-option label="cccc" value="121"></el-option>
<el-option v-for="(item,index) in companyrole" :key="index" :label="item.dictLabel" :value="item.dictValue"></el-option>
</el-select>
</el-form-item>
<el-form-item label="负责人:" class="row">
......@@ -147,8 +137,10 @@
<script>
import "@/assets/styles/project.scss"
import {getXGQY,addXGQY} from '@/api/project/project'
import {getDictType} from '@/api/main'
export default {
name: 'zlwd',
name: 'xgqy',
data(){
return{
types:1,
......@@ -180,10 +172,22 @@
rules:{
projectName:[{ required: true, message: '请输入非空格字符!', trigger: 'blur' },],
ownerCompany:[{ required: true, message: '请输入非空格字符!', trigger: 'blur' },],
},
companytype:[],
companyrole:[],
}
},
created(){
//企业类型
getDictType('company_type').then(result=>{
this.companytype = result.code == 200 ? result.data:[]
this.types = this.companytype[0].dictValue
})
//企业角色
getDictType('company_role').then(result=>{
this.companyrole = result.code == 200 ? result.data:[]
})
},
methods:{
//翻页
handleCurrentChange(val) {
......
......@@ -12,17 +12,18 @@
<img src="@/assets/images/project/headimg.png" class="headimg">
<strong class="text">{{ProjectData.projectName}}</strong>
<div class="locks">
<div @click="islock=true">
<img v-if="ProjectData.isPrivate == 0" src="@/assets/images/project/lock.png">
<img v-else src="@/assets/images/project/lockopen.png">
{{ProjectData.isPrivate == 0?"仅自己可见":"他人可见"}}
<!--<div class="delform">-->
<!--<div class="words">{{ProjectData.isPrivate == 0?"是否将项目权限修改为他人可见?":"是否将项目权限修改为仅自己可见?"}}</div>-->
<!--<div>-->
<!--<div class="btnsmall btn_primary h28">确定</div>-->
<!--<div class="btnsmall btn_cancel h28">取消</div>-->
<!--</div>-->
<!--</div>-->
</div>
<div class="delform" v-if="islock">
<div class="words">{{ProjectData.isPrivate == 0?"是否将项目权限修改为他人可见?":"是否将项目权限修改为仅自己可见?"}}</div>
<div>
<div class="btnsmall btn_primary h28" @click="locks(ProjectData.isPrivate)">确定</div>
<div class="btnsmall btn_cancel h28" @click="islock=false">取消</div>
</div>
</div>
</div>
</div>
<div class="contets row">
......@@ -33,7 +34,7 @@
{{xmlx}}
<i class="el-icon-caret-bottom"></i>
</span>
<el-select v-model="xmlx" class="select-multiple" placeholder="请选择" @change="{}">
<el-select v-model="xmlx" class="select-multiple" placeholder="请选择" @change="editXMSL({projectType:xmlx})">
<el-option v-for="(item,index) in projectType" :key="index" :label="item.dictLabel" :value="item.dictValue"></el-option>
</el-select>
</div>
......@@ -46,7 +47,7 @@
{{xmlb}}
<i class="el-icon-caret-bottom"></i>
</span>
<el-select v-model="xmlb" class="select-multiple" placeholder="请选择">
<el-select v-model="xmlb" class="select-multiple" placeholder="请选择" @change="editXMSL({projectCategory:xmlb})">
<el-option v-for="(item,index) in projectCategory" :key="index" :label="item.dictLabel" :value="item.dictValue"></el-option>
</el-select>
</div>
......@@ -58,7 +59,7 @@
<div class="flex" v-if="nowedit == 3">
<el-input v-model="ProjectData.investmentAmount" placeholder="待添加" @input="number"></el-input>
<div class="flex">
<div class="btnsmall btn_primary h28" style="width: 56px">确定</div>
<div class="btnsmall btn_primary h28" style="width: 56px" @click="editXMSL({investmentAmount:ProjectData.investmentAmount})">确定</div>
<div class="cancels h28" @click="nowedit = -1" style="">取消</div>
</div>
</div>
......@@ -69,11 +70,11 @@
<span>建设地点:</span>
<div class="select-popper">
<span :class="{ color_text:address != '待添加'}">
{{address}}
<span :class="{ color_text:addresstxt != '待添加'}">
{{addresstxt}}
<i class="el-icon-caret-bottom"></i>
</span>
<el-cascader class="cascader-region select-location"
<el-cascader class="cascader-region select-location" v-model="ProjectData.address"
ref="myCascader" :props="props"
:options="addressList"
@change="handleChange"></el-cascader>
......@@ -133,7 +134,7 @@
import zlwd from './component/zlwd.vue'
import xgqy from './component/xgqy.vue'
import prvinceTree from '@/assets/json/provinceTree'
import {getXMSL} from '@/api/project/project'
import {getXMSL,editXMNR} from '@/api/project/project'
export default {
name: 'detail',
components: {xmsl,jsnr,lxr,gjjl,gzdb,zlwd,xgqy},
......@@ -153,12 +154,13 @@
thistag:'xmsl',
xmlx:'请选择',//项目类型
xmlb:'请选择',//项目类别
islock:true,//仅自己可见
islock:false,
projectStage:[],//项目阶段
projectType:[],//项目类型
projectCategory:[],//项目类别
nowedit:-1,
address:'待添加',
address:[],
addresstxt:'待添加',
//项目地区
addressList:[],
domicile:[],
......@@ -183,27 +185,53 @@
this.projectCategory = result.code == 200 ? result.data:[]
})
//获取基本信息
getXMSL(this.id).then(result=>{
this.ProjectData = result.code==200?result.data:{}
this.$route.query.projectname = result.data.projectName
this.xmlx = result.data.projectType==""||result.data.projectType==null?"请选择":result.data.projectType
this.xmlb = result.data.projectCategory==""||result.data.projectCategory==null?"请选择":result.data.projectCategory
this.thisindex = result.data.projectStage
let list = []
if(result.data.provinceName){
list.push(result.data.provinceName)
}
if(result.data.cityName){
list.push(result.data.cityName)
}
if(result.data.districtName){
list.push(result.data.districtName)
}
this.address = list
console.log(this.ProjectData.team)
})
this.getXMSL()
},
methods: {
getXMSL(){
getXMSL(this.id).then(result=>{
this.ProjectData = result.code==200?result.data:{}
this.$route.query.projectname = result.data.projectName
this.xmlx = result.data.projectType==""||result.data.projectType==null?"请选择":result.data.projectType
this.xmlb = result.data.projectCategory==""||result.data.projectCategory==null?"请选择":result.data.projectCategory
this.thisindex = result.data.projectStage
let list = []
let txt = ''
if(result.data.provinceId){
list.push(result.data.provinceId)
txt += result.data.provinceName
}
if(result.data.cityId){
list.push(result.data.cityId)
txt += '/'+result.data.cityName
}
if(result.data.districtId){
list.push(result.data.districtId)
txt += '/'+result.data.districtName
}
this.address = list.length>0?list:"待添加"
this.addresstxt = txt == "" ? "待添加":txt
})
},
locks(isPrivate){
isPrivate = isPrivate==0?1:0
this.editXMSL({isPrivate:isPrivate})
this.lock = false
},
editXMSL(param){
let params = param
params.id = this.id
editXMNR(JSON.stringify(params)).then(res=>{
if (res.code == 200){
this.$message.success('修改成功!')
}else{
this.$message.error(res.msg)
this.getXMSL()
}
})
this.nowedit = -1
},
//地区
async prvinceTree() {
// await axios.post("https://files.jiansheku.com/file/json/common/provinceTree.json", {}, {
......@@ -238,11 +266,10 @@
},
choose(value){
this.thisindex = value
console.log(value)
this.editXMSL({projectStage:value})
},
//内容组件切换
getCom(tag){
console.log(tag)
this.thistag = tag
},
//输入数字
......@@ -251,40 +278,33 @@
},
handleChange(value) {
console.log(value);
let str = ''
var labelString = this.$refs.myCascader.getCheckedNodes()[0].pathLabels;
let txt = ''
labelString.forEach((item,index)=>{
if(index == 0)
str += item
else
str += '-'+item
})
this.address = str
let arr = this.$refs.myCascader.getCheckedNodes();
// console.log(arr)
let province = [],
city = [],
area = [];
this.domicile = [];
for (var i in arr) {
if (arr[i].parent) {
if (!arr[i].parent.checked) {
arr[i].hasChildren && city.push(arr[i].value);
arr[i].hasChildren && this.domicile.push(arr[i].label);
!arr[i].hasChildren && area.push(arr[i].value);
!arr[i].hasChildren && this.domicile.push(arr[i].label);
}
} else {
province.push(arr[i].value);
this.domicile.push(arr[i].label);
let str = ''
if(index >0){
str = '/'
}
txt += str + item
})
this.addresstxt = txt
let param = {
provinceId:null,
cityId:null,
districtId:null
}
// var obj = JSON.parse(JSON.stringify(this.searchParam));
// obj.province = province;
// obj.city = city;
// obj.area = area;
// this.searchParam = obj;
value.forEach((item,index)=>{
if(index == 0){
param.provinceId = parseInt(item)
}
if(index == 1){
param.cityId = parseInt(item)
}
if(index == 2){
param.districtId = parseInt(item)
}
})
this.editXMSL(param)
},
}
}
......
......@@ -149,7 +149,7 @@
</div>
</div>
<div class="tables">
<div class="bottems" v-if="total>0">
<div class="bottems" v-if="total>searchParam.pageSize">
<el-pagination
background
:page-size="searchParam.pageSize"
......
package com.dsk.system.domain.vo;
import com.dsk.common.annotation.Excel;
import com.dsk.common.core.domain.entity.BusinessRelateCompany;
import lombok.Data;
......@@ -53,6 +54,21 @@ public class BusinessBrowseVo {
*/
private String districtName;
/**
* 省id
*/
private Integer provinceId;
/**
* 市id
*/
private Integer cityId;
/**
* 区id
*/
private Integer districtId;
/**
* 商务团队
*/
......@@ -73,10 +89,23 @@ public class BusinessBrowseVo {
*/
private List<String> labelList;
/**
* 关键企业
*/
private List<BusinessRelateCompany> relateCompany;
/** 建设单位 */
private String constructionUnit;
/** 建设单位负责人 */
private String constructionPrincipal;
/** 建设单位联系电话 */
private String constructionPhone;
/** 主管单位 */
private String supervisorUnit;
/** 主管单位负责人 */
private String supervisorPrincipal;
/** 主管单位联系电话 */
private String supervisorPhone;
/**
* 联系人统计
......
package com.dsk.system.mapper;
import com.dsk.common.core.domain.entity.BusinessFollowRecord;
import com.dsk.system.domain.BusinessIdDto;
import java.util.List;
......@@ -34,7 +35,7 @@ public interface BusinessFollowRecordMapper
* @param businessId 项目id
* @return 项目跟进记录集合
*/
public List<BusinessFollowRecord> selectBusinessFollowRecordList(Integer businessId);
public List<BusinessFollowRecord> selectBusinessFollowRecordList(BusinessIdDto businessId);
/**
* 新增项目跟进记录
......
......@@ -58,4 +58,11 @@ public interface BusinessUserMapper
* @return 结果
*/
public int deleteBusinessUserByIds(Long[] ids);
/**
* 根据项目id查询项目的创建人
* @param businessId
* @return
*/
String selectCreatorByBusinessId(Integer businessId);
}
package com.dsk.system.service;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.dtos.OpRegionalEconomicDataRegionalListDto;
import com.dsk.common.dtos.OpRegionalEconomicDataStatisticsRegionalDto;
import com.dsk.common.dtos.OpRegionalEconomicDataV1Dto;
import com.dsk.common.dtos.OpRegionalEconomicDataV1PageDto;
import com.dsk.common.dtos.*;
/**
* @ClassName EconomicService
......@@ -24,6 +21,17 @@ public interface EconomicService {
*/
AjaxResult nationalPage(OpRegionalEconomicDataV1PageDto dto);
/***
*@Description: 全国经济大全分页列表
*@Param:
*@return: com.dsk.common.core.domain.AjaxResult
*@Author: Dgm
*@date: 2023/5/18 10:25
*/
AjaxResult yearsList(OpRegionalEconomicDataYearsListDto dataYearsListDto);
/***
*@Description: 全国经济大全详情
*@Param:
......@@ -31,7 +39,7 @@ public interface EconomicService {
*@Author: Dgm
*@date: 2023/5/18 10:25
*/
AjaxResult details(Integer id);
AjaxResult details(OpRegionalEconomicDataDetailsDto detailsDto);
/***
......
package com.dsk.system.service;
import com.dsk.common.core.domain.entity.BusinessFollowRecord;
import com.dsk.system.domain.BusinessIdDto;
import java.util.List;
......@@ -26,7 +27,7 @@ public interface IBusinessFollowRecordService
* @param businessId 项目跟进记录
* @return 项目跟进记录集合
*/
public List<BusinessFollowRecord> selectBusinessFollowRecordList(Integer businessId);
public List<BusinessFollowRecord> selectBusinessFollowRecordList(BusinessIdDto businessId);
/**
* 分页查询项目跟进记录列表
......
package com.dsk.system.service;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.dtos.SpecialBondInformationDetailsDto;
import com.dsk.common.dtos.SpecialBondInformationPageDto;
import com.dsk.common.dtos.SpecialPurposeBondsDto;
import com.dsk.common.dtos.SpecialPurposeBondsPageDto;
......@@ -30,7 +31,7 @@ public interface SpecialPurposeBondsService {
*@Author: Dgm
*@date: 2023/5/18 10:25
*/
AjaxResult details(String id);
AjaxResult details(SpecialBondInformationDetailsDto detailsDto);
/***
*@Description: 项目类别统计
......
......@@ -4,6 +4,7 @@ import java.util.List;
import com.dsk.common.core.domain.entity.BusinessFollowRecord;
import com.dsk.common.utils.DateUtils;
import com.dsk.system.domain.BusinessIdDto;
import com.dsk.system.mapper.BusinessFollowRecordMapper;
import com.dsk.system.service.IBusinessFollowRecordService;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -35,7 +36,7 @@ public class BusinessFollowRecordServiceImpl implements IBusinessFollowRecordSer
}
@Override
public List<BusinessFollowRecord> selectBusinessFollowRecordList(Integer businessId)
public List<BusinessFollowRecord> selectBusinessFollowRecordList(BusinessIdDto businessId)
{
return businessFollowRecordMapper.selectBusinessFollowRecordList(businessId);
}
......@@ -78,6 +79,7 @@ public class BusinessFollowRecordServiceImpl implements IBusinessFollowRecordSer
* @return 结果
*/
@Override
@Transactional
public int deleteBusinessFollowRecordByIds(Long[] ids)
{
return businessFollowRecordMapper.deleteBusinessFollowRecordByIds(ids);
......
......@@ -8,6 +8,7 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.dsk.common.config.RuoYiConfig;
import com.dsk.common.constant.HttpStatus;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.core.domain.entity.BusinessInfo;
......@@ -15,8 +16,11 @@ import com.dsk.common.core.domain.entity.BusinessLabel;
import com.dsk.common.core.domain.entity.BusinessRelateCompany;
import com.dsk.common.core.domain.entity.BusinessUser;
import com.dsk.common.exception.base.BaseException;
import com.dsk.common.utils.CheckUtils;
import com.dsk.common.utils.DateUtils;
import com.dsk.common.utils.SecurityUtils;
import com.dsk.common.utils.StringUtils;
import com.dsk.common.utils.file.FileUtils;
import com.dsk.system.domain.BusinessExcelDto;
import com.dsk.system.domain.BusinessAddDto;
import com.dsk.system.domain.BusinessListDto;
......@@ -82,11 +86,11 @@ public class BusinessInfoServiceImpl implements IBusinessInfoService {
*/
@Override
public List<BusinessListVo> selectBusinessInfoList(BusinessListDto dto) {
if (dto.getUserId() == null) {
Long deptId = SecurityUtils.getLoginUser().getDeptId();
if (deptId == null) throw new BaseException("请登录");
dto.setDeptId(deptId.intValue());
}
// if (dto.getUserId() == null) {
// Long deptId = SecurityUtils.getLoginUser().getDeptId();
// if (deptId == null) throw new BaseException("请登录");
// dto.setDeptId(deptId.intValue());
// }
return businessInfoMapper.selectBusinessInfoList(dto);
}
......@@ -96,15 +100,18 @@ public class BusinessInfoServiceImpl implements IBusinessInfoService {
//查询项目基本信息
BusinessInfo businessInfo = businessInfoMapper.selectBusinessInfoById(businessId);
BeanUtil.copyProperties(businessInfo, businessBrowseVo);
//商务团队
businessBrowseVo.setTeam(businessUserMapper.selectCreatorByBusinessId(businessId));
//查询项目标签
businessBrowseVo.setLabelList(businessLabelMapper.selectBusinessLabelList(new BusinessLabel(businessId)).stream().map(p -> p.getLabel()).collect(Collectors.toList()));
//查询关键企业
businessBrowseVo.setRelateCompany(businessRelateCompanyMapper.selectBusinessRelateCompanyList(new BusinessRelateCompany(businessId)));
//相关数据统计
BusinessBrowseVo total = businessInfoMapper.selectTotal(businessId);
businessBrowseVo.setBacklogCount(total.getBacklogCount());
businessBrowseVo.setContactsCount(total.getContactsCount());
businessBrowseVo.setFollowRecordCount(total.getFollowRecordCount());
businessBrowseVo.setRelateCompanyCount(total.getRelateCompanyCount());
//资料文档统计
businessBrowseVo.setRelateCompanyCount(FileUtils.getAllFileNames(RuoYiConfig.getProfile()+businessId).size());
return businessBrowseVo;
}
......@@ -186,6 +193,10 @@ public class BusinessInfoServiceImpl implements IBusinessInfoService {
@Override
@Transactional
public int updateBusinessInfo(BusinessInfo businessInfo) {
if (StringUtils.isNotEmpty(businessInfo.getConstructionPhone()) && StringUtils.isNotEmpty(businessInfo.getSupervisorPhone())) {
if (!CheckUtils.isPhone(businessInfo.getConstructionPhone()) || !CheckUtils.isPhone(businessInfo.getSupervisorPhone()))
throw new BaseException("500", "请输入正确的手机号码");
}
businessInfo.setUpdateTime(DateUtils.getNowDate());
return businessInfoMapper.updateBusinessInfo(businessInfo);
}
......
......@@ -63,7 +63,7 @@ public class BusinessRelateCompanyServiceImpl implements IBusinessRelateCompanyS
@Transactional
public int insertBusinessRelateCompany(BusinessRelateCompany businessRelateCompany)
{
if(!CheckUtils.isPhone(businessRelateCompany.getPhone())) throw new BaseException("500","请输入正确的手机号码");
// if(!CheckUtils.isPhone(businessRelateCompany.getPhone())) throw new BaseException("500","请输入正确的手机号码");
businessRelateCompany.setCreateTime(DateUtils.getNowDate());
return businessRelateCompanyMapper.insertBusinessRelateCompany(businessRelateCompany);
}
......@@ -78,7 +78,7 @@ public class BusinessRelateCompanyServiceImpl implements IBusinessRelateCompanyS
@Transactional
public int updateBusinessRelateCompany(BusinessRelateCompany businessRelateCompany)
{
if(!CheckUtils.isPhone(businessRelateCompany.getPhone())) throw new BaseException("500","请输入正确的手机号码");
// if(!CheckUtils.isPhone(businessRelateCompany.getPhone())) throw new BaseException("500","请输入正确的手机号码");
businessRelateCompany.setUpdateTime(DateUtils.getNowDate());
return businessRelateCompanyMapper.updateBusinessRelateCompany(businessRelateCompany);
}
......
package com.dsk.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.dtos.OpRegionalEconomicDataRegionalListDto;
import com.dsk.common.dtos.OpRegionalEconomicDataStatisticsRegionalDto;
import com.dsk.common.dtos.OpRegionalEconomicDataV1Dto;
import com.dsk.common.dtos.OpRegionalEconomicDataV1PageDto;
import com.dsk.common.dtos.*;
import com.dsk.common.utils.DateUtils;
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.HashMap;
import java.util.Map;
/**
......@@ -29,15 +27,22 @@ public class EconomicServiceImpl implements EconomicService {
@Override
public AjaxResult nationalPage(OpRegionalEconomicDataV1PageDto dto) {
if (ObjectUtil.isEmpty(dto.getYear())) {
dto.setYear(DateUtils.getYear() - 1);
}
Map<String, Object> map = dskOpenApiUtil.requestBody("/economic/national/nationalPage", BeanUtil.beanToMap(dto, false, false));
return BeanUtil.toBean(map, AjaxResult.class);
}
@Override
public AjaxResult details(Integer id) {
Map<String, Object> bodyMap = new HashMap<>(1);
bodyMap.put("id", id);
Map<String, Object> map = dskOpenApiUtil.requestBody("/economic/details", bodyMap);
public AjaxResult yearsList(OpRegionalEconomicDataYearsListDto dto) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/economic/years/list", BeanUtil.beanToMap(dto, false, false));
return BeanUtil.toBean(map, AjaxResult.class);
}
@Override
public AjaxResult details(OpRegionalEconomicDataDetailsDto detailsDto) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/economic/details", BeanUtil.beanToMap(detailsDto, false, false));
return BeanUtil.toBean(map, AjaxResult.class);
}
......
......@@ -2,6 +2,7 @@ package com.dsk.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.dtos.SpecialBondInformationDetailsDto;
import com.dsk.common.dtos.SpecialBondInformationPageDto;
import com.dsk.common.dtos.SpecialPurposeBondsDto;
import com.dsk.common.dtos.SpecialPurposeBondsPageDto;
......@@ -10,7 +11,6 @@ import com.dsk.system.service.SpecialPurposeBondsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
/**
......@@ -33,10 +33,8 @@ public class SpecialPurposeBondsServiceImpl implements SpecialPurposeBondsServic
}
@Override
public AjaxResult details(String id) {
Map<String, Object> bodyMap = new HashMap<>(1);
bodyMap.put("id", id);
Map<String, Object> map = dskOpenApiUtil.requestBody("/specialPurposeBonds/details", bodyMap);
public AjaxResult details(SpecialBondInformationDetailsDto detailsDto) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/specialPurposeBonds/details", BeanUtil.beanToMap(detailsDto, false, false));
return BeanUtil.toBean(map, AjaxResult.class);
}
......
package com.dsk.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.dsk.acc.openapi.client.util.CommonUtils;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.dtos.UrbanInvestmentPlatformDto;
import com.dsk.common.utils.DskOpenApiUtil;
import com.dsk.system.domain.customer.vo.CustomerStatusListVo;
import com.dsk.system.service.ICustomerService;
import com.dsk.system.service.UrbanInvestmentPlatformService;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
......@@ -24,9 +32,41 @@ public class UrbanInvestmentPlatformServiceImpl implements UrbanInvestmentPlatfo
@Autowired
private DskOpenApiUtil dskOpenApiUtil;
@Autowired
private ICustomerService iCustomerService;
@Override
public AjaxResult page(UrbanInvestmentPlatformDto pageDto) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/urbanInvestment/page", BeanUtil.beanToMap(pageDto, false, false));
Integer code = MapUtils.getInteger(map, "code", 300);
if (HttpStatus.OK.value() != code) {
throw new RuntimeException();
}
Map data = MapUtils.getMap(map, "data", null);
List<Object> list = CommonUtils.assertAsArray(MapUtils.getObject(data, "list", ""));
if (CollectionUtils.isEmpty(list)) {
return BeanUtil.toBean(map, AjaxResult.class);
}
ArrayList<String> uipIds = new ArrayList<>();
for (Object dataMap : list) {
uipIds.add(MapUtils.getString(CommonUtils.assertAsMap(dataMap), "uipId"));
}
List<CustomerStatusListVo> claimStatusList = iCustomerService.selectStatusList(uipIds);
//按照城投企业id合并两个list
for (Object companyObj : list) {
Map<String, Object> companyMap = CommonUtils.assertAsMap(companyObj);
String uipId = MapUtils.getString(companyMap, "uipId");
if (CollectionUtils.isEmpty(claimStatusList)) {
companyMap.put("claimStatus", 0);
}
for (CustomerStatusListVo vo : claimStatusList) {
if (uipId.equals(vo.getUipId())) {
companyMap.put("claimStatus", 1);
}
}
}
return BeanUtil.toBean(map, AjaxResult.class);
}
......
......@@ -24,7 +24,6 @@
<result property="districtId" column="district_id"/>
<result property="projectType" column="project_type"/>
<result property="projectCategory" column="project_category"/>
<result property="team" column="team"/>
<result property="isPrivate" column="is_private"/>
<result property="createTime" column="create_time"/>
<result property="updateTime" column="update_time"/>
......@@ -35,6 +34,12 @@
<result property="earnestMoneyPay" column="earnest_money_pay"/>
<result property="earnestMoney" column="earnest_money"/>
<result property="evaluationBidCouncil" column="evaluation_bid_council"/>
<result property="constructionUnit" column="construction_unit"/>
<result property="constructionPrincipal" column="construction_principal"/>
<result property="constructionPhone" column="construction_phone"/>
<result property="supervisorUnit" column="supervisor_unit"/>
<result property="supervisorPrincipal" column="supervisor_principal"/>
<result property="supervisorPhone" column="supervisor_phone"/>
</resultMap>
<sql id="selectBusinessInfoVo">
......@@ -57,7 +62,6 @@
district_id,
project_type,
project_category,
team,
is_private,
create_time,
update_time,
......@@ -68,7 +72,13 @@
bid_open_place,
earnest_money_pay,
earnest_money,
evaluation_bid_council
evaluation_bid_council,
construction_unit,
construction_principal,
construction_phone,
supervisor_unit,
supervisor_principal,
supervisor_phone
from business_info
</sql>
......@@ -246,7 +256,6 @@
<if test="districtId != null">district_id,</if>
<if test="projectType != null">project_type,</if>
<if test="projectCategory != null">project_category,</if>
<if test="team != null">team,</if>
<if test="isPrivate != null">is_private,</if>
<if test="createTime != null">create_time,</if>
<if test="updateTime != null">update_time,</if>
......@@ -257,6 +266,12 @@
<if test="earnestMoneyPay != null">earnest_money_pay,</if>
<if test="earnestMoney != null">earnest_money,</if>
<if test="evaluationBidCouncil != null">evaluation_bid_council,</if>
<if test="constructionUnit != null">construction_unit,</if>
<if test="constructionPrincipal != null">construction_principal,</if>
<if test="constructionPhone != null">construction_phone,</if>
<if test="supervisorUnit != null">supervisor_unit,</if>
<if test="supervisorPrincipal != null">supervisor_principal,</if>
<if test="supervisorPhone != null">supervisor_phone,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="projectName != null">#{projectName},</if>
......@@ -277,7 +292,6 @@
<if test="districtId != null">#{districtId},</if>
<if test="projectType != null">#{projectType},</if>
<if test="projectCategory != null">#{projectCategory},</if>
<if test="team != null">#{team},</if>
<if test="isPrivate != null">#{isPrivate},</if>
<if test="createTime != null">#{createTime},</if>
<if test="updateTime != null">#{updateTime},</if>
......@@ -289,6 +303,12 @@
<if test="earnestMoneyPay != null">#{earnestMoneyPay},</if>
<if test="earnestMoney != null">#{earnestMoney},</if>
<if test="evaluationBidCouncil != null">#{evaluationBidCouncil},</if>
<if test="constructionUnit != null">#{constructionUnit},</if>
<if test="constructionPrincipal != null">#{constructionPrincipal},</if>
<if test="constructionPhone != null">#{constructionPhone},</if>
<if test="supervisorUnit != null">#{supervisorUnit},</if>
<if test="supervisorPrincipal != null">#{supervisorPrincipal},</if>
<if test="supervisorPhone != null">#{supervisorPhone},</if>
</trim>
</insert>
......@@ -313,7 +333,6 @@
<if test="districtId != null">district_id = #{districtId},</if>
<if test="projectType != null">project_type = #{projectType},</if>
<if test="projectCategory != null">project_category = #{projectCategory},</if>
<if test="team != null">team = #{team},</if>
<if test="isPrivate != null">is_private = #{isPrivate},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
......@@ -325,6 +344,12 @@
<if test="earnestMoneyPay != null">earnest_money_pay = #{earnestMoneyPay},</if>
<if test="earnestMoney != null">earnest_money = #{earnestMoney},</if>
<if test="evaluationBidCouncil != null">evaluation_bid_council = #{evaluationBidCouncil},</if>
<if test="constructionUnit != null">construction_unit = #{constructionUnit},</if>
<if test="constructionPrincipal != null">construction_principal = #{constructionPrincipal},</if>
<if test="constructionPhone != null">construction_phone = #{constructionPhone},</if>
<if test="supervisorUnit != null">supervisor_unit = #{supervisorUnit},</if>
<if test="supervisorPrincipal != null">supervisor_principal = #{supervisorPrincipal},</if>
<if test="supervisorPhone != null">evaluation_bid_council = #{supervisorPhone},</if>
</trim>
where id = #{id}
</update>
......
......@@ -33,6 +33,14 @@
<include refid="selectBusinessUserVo"/>
where id = #{id}
</select>
<select id="selectCreatorByBusinessId" resultType="java.lang.String">
select u.nick_name
from business_user bu
left join business_info i on i.id = bu.business_id
left join sys_user u on u.user_id = bu.user_id
where bu.is_founder = 1
and i.id = #{BusinessId}
</select>
<insert id="insertBusinessUser" parameterType="com.dsk.common.core.domain.entity.BusinessUser" useGeneratedKeys="true" keyProperty="id">
insert into business_user
......
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