Commit 567c2436 authored by Administrator's avatar Administrator

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

# Conflicts:
#	dsk-module/dsk-biz-api/src/main/java/com/dsk/jsk/controller/JskCombineInfoController.java
parents a5750d37 cff32831
......@@ -3,6 +3,7 @@ package com.dsk;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
import org.springframework.scheduling.annotation.EnableScheduling;
/**
* 启动程序
......@@ -11,6 +12,7 @@ import org.springframework.boot.context.metrics.buffering.BufferingApplicationSt
*/
@SpringBootApplication
@EnableScheduling
public class DskOperateSysApplication {
public static void main(String[] args) {
......
......@@ -41,7 +41,8 @@ public class SysDeptController extends BaseController {
List<SysDept> depts = deptService.selectDeptList(dept);
List<SysDeptVo> deptVos = BeanUtil.copyToList(depts, SysDeptVo.class);
deptVos.forEach(sysDeptVo -> {
sysDeptVo.setExistUsers(deptService.hasChildByDeptId(sysDeptVo.getDeptId()));
//查询该部门及其子部门是否存在用户
sysDeptVo.setExistUsers(deptService.checkAllDeptsAndUsers(sysDeptVo.getDeptId()));
});
return R.ok(deptVos);
}
......@@ -56,7 +57,7 @@ public class SysDeptController extends BaseController {
public R<List<SysDept>> excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) {
List<SysDept> depts = deptService.selectDeptList(new SysDept());
depts.removeIf(d -> d.getDeptId().equals(deptId)
|| StringUtils.splitList(d.getAncestors()).contains(Convert.toStr(deptId)));
|| StringUtils.splitList(d.getAncestors()).contains(Convert.toStr(deptId)));
return R.ok(depts);
}
......@@ -99,7 +100,7 @@ public class SysDeptController extends BaseController {
} else if (dept.getParentId().equals(deptId)) {
return R.fail("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己");
} else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus())
&& deptService.selectNormalChildrenDeptById(deptId) > 0) {
&& deptService.selectNormalChildrenDeptById(deptId) > 0) {
return R.fail("该部门包含未停用的子部门!");
}
return toAjax(deptService.updateDept(dept));
......
......@@ -3,6 +3,7 @@ package com.dsk.web.controller.system;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.lang.RegexPool;
import cn.hutool.core.map.MapUtil;
......@@ -80,6 +81,38 @@ public class SysLoginController {
// /**
// * 发送短信验证码
// *
// * @param phones 电话号
// * @param templateId 模板ID
// */
// @SaIgnore
// @GetMapping("/send/sms/code")
// public R<Object> sendAliyun(String phones, String templateId) {
// LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
// map.put("code", RandomUtil.randomNumbers(4));
// SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA);
// SmsResponse smsResponse = smsBlend.sendMessage(phones, templateId, map);
// return R.ok(smsResponse);
// }
/**
* 短信登录
*
* @param smsLoginBody 登录信息
* @return 结果
*/
@SaIgnore
@PostMapping("/smsLogin")
public R<LoginVo> smsLogin(@Validated @RequestBody SmsLoginBody smsLoginBody) {
// 生成令牌
LoginVo loginVo=loginService.smsLogin(smsLoginBody.getPhonenumber(), smsLoginBody.getSmsCode());
return R.ok(loginVo);
}
/**
* 动态切换租户
*
......@@ -118,6 +151,11 @@ public class SysLoginController {
return R.ok(new ArrayList<>());
}
List<SysTenantVo> tenantList=loginService.tenantListByAccount(phone);
if(CollectionUtil.isNotEmpty(tenantList)){
for (SysTenantVo sysTenantVo : tenantList) {
sysTenantVo.setCompanyName("");
}
}
return R.ok(tenantList);
}
......@@ -150,35 +188,6 @@ public class SysLoginController {
return R.ok(MapUtil.of("tenantId",defaultTenant));
}
/**
* 发送短信验证码
*
* @param phones 电话号
* @param templateId 模板ID
*/
@SaIgnore
@GetMapping("/send/sms/code")
public R<Object> sendAliyun(String phones, String templateId) {
LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
map.put("code", RandomUtil.randomNumbers(4));
SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA);
SmsResponse smsResponse = smsBlend.sendMessage(phones, templateId, map);
return R.ok(smsResponse);
}
/**
* 短信登录
*
* @param smsLoginBody 登录信息
* @return 结果
*/
@SaIgnore
@PostMapping("/smsLogin")
public R<LoginVo> smsLogin(@Validated @RequestBody SmsLoginBody smsLoginBody) {
// 生成令牌
LoginVo loginVo=loginService.smsLogin(smsLoginBody.getPhonenumber(), smsLoginBody.getSmsCode());
return R.ok(loginVo);
}
/**
* 邮件登录
*
......
......@@ -39,7 +39,8 @@ public class SysMenuController extends BaseController {
@SaCheckPermission("system:menu:list")
@GetMapping("/list")
public R<List<SysMenu>> list(SysMenu menu) {
List<SysMenu> menus = menuService.selectMenuList(menu, getUserId());
List<SysMenu> menus = menuService.selectAllMenu(menu,getUserId());
//List<SysMenu> menus = menuService.selectMenuList(menu, getUserId());
return R.ok(menus);
}
......
......@@ -84,7 +84,7 @@ public class SysTenantController extends BaseController {
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody SysTenantBo bo) {
if (!tenantService.checkCompanyNameUnique(bo)) {
return R.fail("新增租户'" + bo.getCompanyName() + "'失败,企业名称已存在");
return R.fail("新增企业'" + bo.getCompanyName() + "'失败,企业名称已存在");
}
return toAjax(TenantHelper.ignore(() -> tenantService.insertByBo(bo)));
}
......@@ -100,7 +100,7 @@ public class SysTenantController extends BaseController {
public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysTenantBo bo) {
tenantService.checkTenantAllowed(bo.getTenantId());
if (!tenantService.checkCompanyNameUnique(bo)) {
return R.fail("修改租户'" + bo.getCompanyName() + "'失败,公司名称已存在");
return R.fail("修改企业'" + bo.getCompanyName() + "'失败,公司名称已存在");
}
return toAjax(tenantService.updateByBo(bo));
}
......@@ -162,8 +162,8 @@ public class SysTenantController extends BaseController {
@SaCheckPermission("system:tenant:edit")
@Log(title = "租户", businessType = BusinessType.UPDATE)
@GetMapping("/syncTenantPackage")
public R<Void> syncTenantPackage(@NotBlank(message = "租户ID不能为空") String tenantId,
@NotNull(message = "套餐ID不能为空") Long packageId) {
public R<Void> syncTenantPackage(@NotBlank(message = "企业ID不能为空") String tenantId,
@NotNull(message = "企业方案ID不能为空") Long packageId) {
return toAjax(TenantHelper.ignore(() -> tenantService.syncTenantPackage(tenantId, packageId)));
}
......
......@@ -2,6 +2,7 @@ package com.dsk.web.controller.system;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaCheckRole;
import cn.hutool.core.util.ObjectUtil;
import com.dsk.common.annotation.Log;
import com.dsk.common.annotation.RepeatSubmit;
import com.dsk.common.constant.TenantConstants;
......@@ -12,6 +13,7 @@ import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.core.validate.AddGroup;
import com.dsk.common.core.validate.EditGroup;
import com.dsk.common.enums.BusinessType;
import com.dsk.system.domain.SysTenantPackage;
import com.dsk.system.domain.bo.SysTenantPackageBo;
import com.dsk.system.domain.vo.SysTenantPackageSelectVo;
import com.dsk.system.domain.vo.SysTenantPackageVo;
......@@ -94,6 +96,9 @@ public class SysTenantPackageController extends BaseController {
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody SysTenantPackageBo bo) {
if (tenantPackageService.checkDeptNameUnique(bo)) {
return R.fail("新增方案'" + bo.getPackageName() + "'失败,方案名称已存在");
}
return toAjax(tenantPackageService.insertByBo(bo));
}
......@@ -106,6 +111,10 @@ public class SysTenantPackageController extends BaseController {
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysTenantPackageBo bo) {
SysTenantPackage tenantPackage = tenantPackageService.selectTenantPackageByName(bo.getPackageName());
if (ObjectUtil.isNotNull(tenantPackage) && !tenantPackage.getPackageId().equals(bo.getPackageId())) {
return R.fail("修改方案'" + bo.getPackageName() + "'失败,方案名称已存在");
}
return toAjax(tenantPackageService.updateByBo(bo));
}
......
......@@ -125,7 +125,7 @@ public class SysUserController extends BaseController {
@PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response) {
List<Object> list = new ArrayList<>();
list.add(new SysUserImportVo("测试部门", "测试用户昵称", "18888888888", "测试角色"));
list.add(new SysUserImportVo("测试组织", "测试用户昵称", "18888888888", "测试角色"));
ExcelUtil.exportTemplate(list, "用户数据", "excel/userImportTemplate.xlsx", response);
}
......
package com.dsk.web.schedule;
import com.dsk.common.tenant.helper.TenantHelper;
import com.dsk.system.service.ISysTenantService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* 租户相关定时任务类
*
* @author sxk
* @date 2023.09.06
*/
@Component
@RequiredArgsConstructor
@Slf4j
public class TenantTimerTask {
private final ISysTenantService tenantService;
/**
* 每6小时扫描并禁用已过期租户账号
*/
@Scheduled(cron = "0 0 0/6 * * ?")
public void updateExpiredTenantStatus() {
log.info("执行定时禁用已过期租户账号(6h/次)");
TenantHelper.ignore(tenantService::handleExpiredTenant);
}
}
\ No newline at end of file
......@@ -48,7 +48,7 @@ email.code.retry.limit.count=Email code input error {0} times
email.code.retry.limit.exceed=Email code input error {0} times, account locked for {1} minutes
xcx.code.not.blank=Mini program code cannot be blank
##\u79DF\u6237
tenant.number.not.blank=company number cannot be blank
tenant.not.exists=Sorry, your company does not exist. Please contact the administrator
tenant.blocked=Sorry, your company is disabled. Please contact the administrator
tenant.expired=Sorry, your company has expired. Please contact the administrator.
\ No newline at end of file
company.number.not.blank=company number cannot be blank
company.not.exists=Sorry, your company does not exist. Please contact the administrator
company.blocked=Sorry, your company is disabled. Please contact the administrator
company.expired=Sorry, your company has expired. Please contact the administrator.
\ No newline at end of file
......@@ -48,7 +48,7 @@ email.code.retry.limit.count=\u90AE\u7BB1\u9A8C\u8BC1\u7801\u8F93\u5165\u9519\u8
email.code.retry.limit.exceed=\u90AE\u7BB1\u9A8C\u8BC1\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21\uFF0C\u5E10\u6237\u9501\u5B9A{1}\u5206\u949F
xcx.code.not.blank=\u5C0F\u7A0B\u5E8Fcode\u4E0D\u80FD\u4E3A\u7A7A
##\u79DF\u6237
tenant.number.not.blank=\u4F01\u4E1A\u7F16\u53F7\u4E0D\u80FD\u4E3A\u7A7A
tenant.not.exists=\u5BF9\u4E0D\u8D77, \u60A8\u7684\u4F01\u4E1A\u4E0D\u5B58\u5728\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458
tenant.blocked=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u4F01\u4E1A\u5DF2\u7981\u7528\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458
tenant.expired=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u4F01\u4E1A\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458
\ No newline at end of file
company.number.not.blank=\u4F01\u4E1A\u7F16\u53F7\u4E0D\u80FD\u4E3A\u7A7A
company.not.exists=\u5BF9\u4E0D\u8D77, \u60A8\u7684\u4F01\u4E1A\u4E0D\u5B58\u5728\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458
company.blocked=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u4F01\u4E1A\u5DF2\u505C\u7528\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458
company.expired=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u4F01\u4E1A\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458
\ No newline at end of file
......@@ -77,7 +77,7 @@ public @interface Excel
/**
* 当值为空时,字段的默认值
*/
public String defaultValue() default "";
public String defaultValue() default "-";
/**
* 提示信息
......
......@@ -77,5 +77,10 @@ public interface Constants {
*/
Long TOP_PARENT_ID = 0L;
String SUFFIX_XLSX = ".xlsx";
String CONTENT_TYPE_XLSX = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
}
package com.dsk.common.constant;
/**
* 租户套餐常量信息
*
* @author Lion Li
*/
public interface TenantPackageConstants {
/**
* 租户套餐正常状态
*/
String NORMAL = "0";
/**
* 租户套餐停用状态
*/
String DISABLE = "1";
/**
* 租户套餐已逻辑删除装填
*/
String NOT_LOGIC_DEL = "0";
/**
* 租户套餐已逻辑删除装填
*/
String IS_LOGIC_DEL = "2";
}
......@@ -48,6 +48,8 @@ public class TableDataInfo<T> implements Serializable {
public TableDataInfo(List<T> list, long total) {
this.rows = list;
this.total = total;
this.code = HttpStatus.HTTP_OK;
this.msg = "查询成功";
}
public static <T> TableDataInfo<T> build(IPage<T> page) {
......
package com.dsk.common.tenant.helper;
import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.spring.SpringMVCUtil;
import cn.hutool.core.convert.Convert;
import com.alibaba.ttl.TransmittableThreadLocal;
......@@ -9,10 +8,7 @@ import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper;
import com.dsk.common.constant.GlobalConstants;
import com.dsk.common.helper.LoginHelper;
import com.dsk.common.utils.StringUtils;
import com.dsk.common.utils.redis.RedisUtils;
import com.dsk.common.utils.spring.SpringUtils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
......
......@@ -7,6 +7,7 @@ import cn.hutool.core.util.StrUtil;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.ObjectUtils;
import java.util.*;
import java.util.function.Function;
......@@ -327,4 +328,9 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
return oldStr.replace(str, "<font color='#FF204E'>" + str + "</font>");
}
//去除字符串标红
public static String removeRed(String str) {
if(ObjectUtils.isEmpty(str)) return null;
return str.replace("<font color='#FF204E'>" ,"").replace("</font>","");
}
}
......@@ -28,6 +28,16 @@
<artifactId>dsk-sms</artifactId>
</dependency>
<dependency>
<groupId>com.dsk</groupId>
<artifactId>dsk-oss</artifactId>
</dependency>
<dependency>
<groupId>com.dsk</groupId>
<artifactId>dsk-system</artifactId>
</dependency>
<!-- 短信 用哪个导入哪个依赖 -->
<!-- <dependency>-->
<!-- <groupId>com.aliyun</groupId>-->
......
......@@ -310,6 +310,21 @@ public class ExcelUtils<T> {
exportExcel(response);
}
public ByteArrayOutputStream exportExcel( List<T> list, String sheetName, String title, boolean dateStatus) {
ByteArrayOutputStream ba= new ByteArrayOutputStream();
this.init(list, sheetName, title, Excel.Type.EXPORT, dateStatus);
try {
writeSheet();
wb.write(ba);
} catch (Exception e) {
log.error("导出Excel异常{}", e.getMessage());
} finally {
IOUtils.closeQuietly(wb);
}
return ba;
}
private static final String FILE_PATH = "D://";
/**
......
......@@ -2,21 +2,30 @@ package com.dsk.jsk.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.dsk.biz.utils.ExcelUtils;
import com.dsk.common.constant.Constants;
import com.dsk.common.core.controller.BaseController;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.core.domain.R;
import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.core.service.OssService;
import com.dsk.jsk.domain.JskCombineBidPageDto;
import com.dsk.jsk.domain.JskCombineCertificateDto;
import com.dsk.jsk.domain.JskCombineSearchDto;
import com.dsk.jsk.domain.vo.JskCombineBidProjectExportVo;
import com.dsk.jsk.domain.vo.JskCombineWinBidProjectExportVo;
import com.dsk.jsk.service.JskCombineInfoService;
import com.dsk.oss.core.OssClient;
import com.dsk.oss.entity.UploadResult;
import com.dsk.oss.factory.OssFactory;
import com.dsk.system.domain.vo.SysOssVo;
import com.dsk.system.service.ISysOssService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.List;
import java.util.Map;
......@@ -33,6 +42,8 @@ public class JskCombineInfoController extends BaseController {
@Autowired
private JskCombineInfoService baseService;
@Autowired
private ISysOssService ossService;
/**
* 集团成员列表
......@@ -86,7 +97,7 @@ public class JskCombineInfoController extends BaseController {
* 集团户搜索
*/
@PostMapping("/index")
public AjaxResult index(@RequestBody Map<String,Object> object) {
public AjaxResult index(@RequestBody Map<String, Object> object) {
return baseService.index(object);
}
......@@ -110,7 +121,7 @@ public class JskCombineInfoController extends BaseController {
* 查央企子公司 翻页
*/
@PostMapping("/centralEnterprse/child/page")
public AjaxResult centralEnterprseChildPage(@RequestBody Map<String,Object> object) {
public AjaxResult centralEnterprseChildPage(@RequestBody Map<String, Object> object) {
return baseService.centralEnterprseChildPage(object);
}
......@@ -118,7 +129,7 @@ public class JskCombineInfoController extends BaseController {
* 查地方国企
*/
@PostMapping("/centralEnterprse/local")
public AjaxResult centralEnterprseLocal(@RequestBody Map<String,Object> object) {
public AjaxResult centralEnterprseLocal(@RequestBody Map<String, Object> object) {
return baseService.centralEnterprseLocal(object);
}
......@@ -126,7 +137,7 @@ public class JskCombineInfoController extends BaseController {
* 查地方国企 翻页
*/
@PostMapping("/centralEnterprse/local/page")
public AjaxResult centralEnterprseLocalPage(@RequestBody Map<String,Object> object) {
public AjaxResult centralEnterprseLocalPage(@RequestBody Map<String, Object> object) {
return baseService.centralEnterprseLocalPage(object);
}
......@@ -142,7 +153,7 @@ public class JskCombineInfoController extends BaseController {
* 民营企业 翻页
*/
@PostMapping("/centralEnterprse/social/page")
public AjaxResult centralEnterprseSocialPage(@RequestBody Map<String,Object> object) {
public AjaxResult centralEnterprseSocialPage(@RequestBody Map<String, Object> object) {
return baseService.centralEnterprseSocialPage(object);
}
......@@ -172,16 +183,34 @@ public class JskCombineInfoController extends BaseController {
/**
* 集团招标分页列表
* 集团招标分页列表
*/
@PostMapping("/bidPage")
public TableDataInfo bidPage(@RequestBody JskCombineBidPageDto dto) throws Exception {
return baseService.bidPage(dto);
}
/**
* 导出上传oss测试
*/
@PostMapping("/export/upload")
public R<SysOssVo> exportuUpload(@RequestBody JskCombineSearchDto dto) {
List<JskCombineWinBidProjectExportVo> list = baseService.exportWinBid(dto);
String title = dto.getCombineName().concat("中标业绩清单");
ExcelUtils<JskCombineWinBidProjectExportVo> util = new ExcelUtils<>(JskCombineWinBidProjectExportVo.class);
ByteArrayOutputStream ba = util.exportExcel(list, "集团中标", title, true);
ByteArrayInputStream bio = new ByteArrayInputStream(ba.toByteArray());
OssClient client = OssFactory.instance();
UploadResult uploadResult = client.uploadSuffix(bio, Constants.SUFFIX_XLSX, Constants.CONTENT_TYPE_XLSX);
//总文件记录
SysOssVo sysOssVo = ossService.buildResultEntity(title.concat(Constants.SUFFIX_XLSX), Constants.SUFFIX_XLSX, client.getConfigKey(), uploadResult);
return R.ok(sysOssVo);
}
/***
*@Description: 获取集团logo
*@Param:
*@Param:
*@return: com.dsk.common.core.domain.R
*@Author: Dgm
*@date: 2023/9/12 16:05
......
package com.dsk.jsk.domain.vo;
import com.dsk.common.annotation.Excel;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 重点项目清单
* @author lcl
* @create 2023/8/28
*/
@Data
public class ImportantProjectExportVo implements Serializable {
@Excel(name = "序号", width = 6)
private Integer id;
@Excel(name = "项目类型", width = 15)
private String buildingProjectType;
@Excel(name = "项目名称", width = 40)
private String projectName;
@Excel(name = "主管部门", width = 35)
private String chargeDepartment;
@Excel(name = "项目法人", width = 35)
private String constructUnit;
@Excel(name = "项目投资额" , suffix = "万元")
private Double projectTotalInvestment;
@Excel(name = "项目地区", width = 15)
private String domicile;
@Excel(name = "建设规模", width = 50)
private String projectScale;
@Excel(name = "附件名称", width = 30)
private String fileTitle;
@Excel(name = "附件链接", width = 30)
private String fileUrl;
}
......@@ -8,6 +8,7 @@ import com.dsk.common.core.domain.R;
import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.exception.ServiceException;
import com.dsk.common.utils.DskOpenApiUtil;
import com.dsk.common.utils.StringUtils;
import com.dsk.jsk.domain.JskCombineBidPageDto;
import com.dsk.jsk.domain.JskCombineCertificateDto;
import com.dsk.jsk.domain.JskCombineSearchDto;
......@@ -137,10 +138,15 @@ public class JskCombineInfoService {
JskCombineWinBidProjectExportVo vo = new JskCombineWinBidProjectExportVo();
vo.setId(i + 1);
vo.setBidTime(MapUtil.getDate(list.get(i),"bidTime"));
vo.setCompanyName(MapUtil.getStr(list.get(i),"companyName"));
if(ObjectUtils.isEmpty(dto.getSearchValue())){
vo.setCompanyName(MapUtil.getStr(list.get(i),"companyName"));
vo.setProjectName(MapUtil.getStr(list.get(i),"projectName"));
}else {
vo.setCompanyName(StringUtils.removeRed(MapUtil.getStr(list.get(i),"companyName")));
vo.setProjectName(StringUtils.removeRed(MapUtil.getStr(list.get(i),"projectName")));
}
vo.setStockPercent(MapUtil.getDouble(list.get(i),"stockPercent"));
vo.setMemberLevel(MapUtil.getStr(list.get(i),"memberLevel"));
vo.setProjectName(MapUtil.getStr(list.get(i),"projectName"));
vo.setBidAmount(MapUtil.getDouble(list.get(i),"bidAmount"));
vo.setAddress(MapUtil.getStr(list.get(i),"address"));
vo.setBoundType(MapUtil.getStr(list.get(i),"boundType"));
......@@ -156,7 +162,7 @@ public class JskCombineInfoService {
if (ObjectUtils.isEmpty(dto.getPageSize())) throw new ServiceException("导出条数不能为空!");
if (dto.getPageSize() > 2000) dto.setPageSize(2000);
dto.setPageNum(1);
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/combine/bidPage", BeanUtil.beanToMap(dto, false, false));
Map<String, Object> map = dskOpenApiUtil.requestBody("/nationzj/project/combine/tenderList", BeanUtil.beanToMap(dto, false, false));
if (ObjectUtils.isEmpty(map.get("data"))) throw new ServiceException("导出失败,系统错误!");
Map<String, Object> data = BeanUtil.beanToMap(map.get("data"));
if (ObjectUtils.isEmpty(data.get("list"))) throw new ServiceException("导出失败,系统错误!");
......@@ -168,15 +174,22 @@ public class JskCombineInfoService {
JskCombineBidProjectExportVo vo = new JskCombineBidProjectExportVo();
vo.setId(i + 1);
vo.setIssueTime(MapUtil.getDate(list.get(i),"issueTime"));
vo.setTenderee(MapUtil.getStr(list.get(i),"tenderee"));
if(ObjectUtils.isEmpty(dto.getKeys())){
vo.setTenderee(MapUtil.getStr(list.get(i),"tenderee"));
vo.setProjectName(MapUtil.getStr(list.get(i),"projectName"));
vo.setAgency(MapUtil.getStr(list.get(i),"agency"));
}else {
vo.setTenderee(StringUtils.removeRed(MapUtil.getStr(list.get(i),"tenderee")));
vo.setProjectName(StringUtils.removeRed(MapUtil.getStr(list.get(i),"projectName")));
vo.setAgency(StringUtils.removeRed(MapUtil.getStr(list.get(i),"agency")));
}
vo.setStockPercent(MapUtil.getDouble(list.get(i),"stockPercent"));
vo.setMemberLevel(MapUtil.getStr(list.get(i),"memberLevel"));
vo.setProjectName(MapUtil.getStr(list.get(i),"projectName"));
vo.setBidAmount(MapUtil.getDouble(list.get(i),"bidAmount"));
vo.setAddress(MapUtil.getStr(list.get(i),"address"));
vo.setSubjectMatter(MapUtil.getStr(list.get(i),"subjectMatter"));
vo.setProjectType(MapUtil.getStr(list.get(i),"projectType"));
vo.setAgency(MapUtil.getStr(list.get(i),"agency"));
result.add(vo);
}
return result;
......
package com.dsk.search.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.alibaba.fastjson2.JSONObject;
import com.dsk.biz.utils.ExcelUtils;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.utils.poi.ExcelUtil;
import com.dsk.jsk.domain.bo.ComposeQueryDto;
import com.dsk.jsk.domain.vo.ImportantProjectExportVo;
import com.dsk.search.service.BusinessOpportunityRadarService;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
......@@ -157,4 +163,31 @@ public class BusinessOpportunityRadarController {
}
return opportunityRadarService.importantPage(object);
}
/*
* 重点项目清单关联查询
*/
@RequestMapping("/importantSelect")
public AjaxResult importantSelect(@RequestBody JSONObject object) {
return opportunityRadarService.importantSelect(object);
}
/*
* 重点项目清单筛选条件
*/
@RequestMapping("/importantCondition")
public AjaxResult importantCondition() {
return opportunityRadarService.importantCondition();
}
/**
* 导出重点项目清单
*/
@RequestMapping("/export/important")
@SaCheckPermission("radar:export:important")
public void exportBid(@RequestBody JSONObject object, HttpServletResponse response) {
List<ImportantProjectExportVo> list = opportunityRadarService.exportImportant(object);
// ExcelUtil<ImportantProjectExportVo> util = new ExcelUtil<>(ImportantProjectExportVo.class);
ExcelUtils<ImportantProjectExportVo> util = new ExcelUtils<>(ImportantProjectExportVo.class);
util.exportExcel(response, list, "重点项目", "重点项目导出明细", true);
}
}
package com.dsk.search.service;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson2.JSONObject;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.exception.ServiceException;
import com.dsk.common.utils.DskOpenApiUtil;
import com.dsk.common.utils.StringUtils;
import com.dsk.jsk.domain.vo.ImportantProjectExportVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
......@@ -98,4 +105,59 @@ public class BusinessOpportunityRadarService {
Map<String, Object> map = dskOpenApiUtil.requestBody("/nationzj/bondProject/importantPage", object);
return BeanUtil.toBean(map, AjaxResult.class);
}
public AjaxResult importantSelect(JSONObject object) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/nationzj/bondProject/importantSelect", object);
return BeanUtil.toBean(map, AjaxResult.class);
}
public AjaxResult importantCondition() {
Map<String, Object> map = dskOpenApiUtil.requestBody("/nationzj/bondProject/importantCondition", null);
return BeanUtil.toBean(map, AjaxResult.class);
}
public List<ImportantProjectExportVo> exportImportant(JSONObject object) {
if (ObjectUtil.isEmpty(object.get("page"))) {
throw new ServiceException("导出条数不能为空!");
}
Map<String, Object> page = (Map<String,Object>)object.get("page");
if (null==page.get("limit")|| MapUtil.getInt(page,"limit")>2000){
page.put("limit",2000);
}
page.put("page",1);
object.put("page",page);
Map<String, Object> map = dskOpenApiUtil.requestBody("/nationzj/bondProject/importantPage",object);
if (ObjectUtil.isEmpty(map.get("data"))) throw new ServiceException("导出失败,系统错误!");
Map<String, Object> data = BeanUtil.beanToMap(map.get("data"));
if (ObjectUtil.isEmpty(data.get("list"))) throw new ServiceException("导出失败,系统错误!");
List<Map<String, Object>> list = (List<Map<String, Object>>) data.get("list");
if (ObjectUtil.isEmpty(list)) throw new ServiceException("导出失败,无数据导出!");
List<ImportantProjectExportVo> result = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
ImportantProjectExportVo vo = new ImportantProjectExportVo();
vo.setId(i + 1);
vo.setBuildingProjectType(MapUtil.getStr(list.get(i),"buildingProjectType"));
if (null!=list.get(i).get("projectName")){
vo.setProjectName(StringUtils.removeRed(MapUtil.getStr(list.get(i),"projectName")));
}
if (null!=list.get(i).get("chargeDepartment")){
vo.setChargeDepartment(StringUtils.removeRed(MapUtil.getStr(list.get(i),"chargeDepartment")));
}
if (null!=list.get(i).get("constructUnit")){
vo.setConstructUnit(StringUtils.removeRed(MapUtil.getStr(list.get(i),"constructUnit")));
}
if (null!=list.get(i).get("projectScale")){
vo.setProjectScale(StringUtils.removeRed(MapUtil.getStr(list.get(i),"projectScale")));
}
vo.setProjectTotalInvestment(MapUtil.getDouble(list.get(i),"projectTotalInvestment"));
vo.setDomicile(MapUtil.getStr(list.get(i),"domicile"));
vo.setFileTitle(MapUtil.getStr(list.get(i),"fileTitle"));
vo.setFileUrl(MapUtil.getStr(list.get(i),"fileUrl"));
result.add(vo);
}
return result;
}
}
......@@ -40,10 +40,12 @@
"axios": "0.24.0",
"clipboard": "2.0.8",
"core-js": "3.25.3",
"echarts": "^5.4.0",
"echarts": "^5.0.0",
"el-table-horizontal-scroll": "^1.2.5",
"element-resize-detector": "^1.2.4",
"element-ui": "2.15.12",
"file-saver": "2.0.5",
"flatted": "^3.2.7",
"fuse.js": "6.4.3",
"highlight.js": "9.18.5",
"jquery": "^3.7.0",
......@@ -60,7 +62,7 @@
"vue-cropper": "0.5.5",
"vue-meta": "2.4.0",
"vue-router": "3.4.9",
"vuedraggable": "2.24.3",
"vuedraggable": "^2.24.3",
"vuex": "3.6.0"
},
"devDependencies": {
......
......@@ -118,7 +118,8 @@
top: 0;
width: 51%;
height: 100%;
background: #7171C6;
/*background: #7171C6;*/
background: #46A5FF;
z-index: 1000;
-webkit-transform: translateX(0);
-ms-transform: translateX(0);
......@@ -197,12 +198,12 @@
</head>
<body>
<div id="app">
<!-- <div id="loader-wrapper">
<div id="loader-wrapper">
<div id="loader"></div>
<div class="loader-section section-left"></div>
<div class="loader-section section-right"></div>
<div class="load_title">正在加载系统资源,请耐心等待</div>
</div>-->
<div class="load_title">正在加载央企数字化经营管理系统</div>
</div>
</div>
</body>
</html>
import request from '@/utils/request'
// 客户概览-客户统计
export function statistics() {
return request({
url: '/customer/overview/statistics',
method: 'get',
})
}
// 客户概览-客户合作情况
export function cooperationTop() {
return request({
url: '/customer/overview/cooperation/top',
method: 'get',
})
}
// 客户概览-客户信资评级
export function creditLevel() {
return request({
url: '/customer/overview/credit/level',
method: 'get',
})
}
// 导入客户列表
export function importData(param) {
return request({
......
......@@ -50,3 +50,20 @@ export function businessList(data) {
data: data
})
}
// 集团招标
export function bidPage(data) {
return request({
url: '/combine/info/bidPage',
method: 'post',
data: data
})
}
// 集团招标导出
export function exportBid(data) {
return request({
url: '/combine/info/export/bid',
method: 'post',
data: data
})
}
......@@ -80,3 +80,35 @@ export function tenderPage(data) {
data: data
})
}
// 客户-供应商下拉框
export function getSelect(data) {
return request({
url: '/enterpriseBussiness/select',
method: 'post',
data: data
})
}
// 中标公示来源链接
export function bidWinMergeDetail(data) {
return request({
url: '/enterpriseBussiness/bidWinMergeDetail',
method: 'post',
data: data
})
}
// 四库业绩来源链接
export function skyProjectDetail(data) {
return request({
url: '/enterpriseBussiness/skyProjectDetail',
method: 'post',
data: data
})
}
// 荣誉奖项来源链接
export function awardDetail(data) {
return request({
url: '/enterpriseBussiness/awardDetail',
method: 'post',
data: data
})
}
......@@ -147,7 +147,7 @@ let centralEnterprselocalPage= function centralEnterprselocalPage(param) {
data: param
})
}
// 民营集团
// 其他集团
let centralEnterprsesocial= function centralEnterprsesocial(param) {
return request({
url: '/combine/info/centralEnterprse/social',
......@@ -155,7 +155,7 @@ let centralEnterprsesocial= function centralEnterprsesocial(param) {
data: param
})
}
// 民营集团更多
// 其他集团更多
let centralEnterprsesocialPage= function centralEnterprsesocialPage(param) {
return request({
url: '/combine/info/centralEnterprse/social/page',
......
import request from "@/utils/request";
// 集团中标统计
export function countByCompany(data) {
return request({
url: '/index/countByCompany',
method: 'post',
data: data
})
}
// 企业中标排行榜
export function bidRank(data) {
return request({
url: '/index/bidRank',
method: 'post',
data: data
})
}
// 大项目最新中标
export function bigWinningBidsPage(data) {
return request({
......
......@@ -219,3 +219,52 @@ export function allRecord(param) {
params:param,
})
}
//项目状态统计
export function getStatistics(param) {
return request({
url: '/business/overview/status/statistics',
method: 'get',
params:param,
})
}
//储备项目统计
export function getCount(param) {
return request({
url: '/business/overview/category/analyze/'+param,
method: 'get',
params:param,
})
}
//储备项目资金
export function getAmount(param) {
return request({
url: '/business/overview/amount/analyze',
method: 'get',
params:param,
})
}
//跟进动态
export function getAllRecord(param) {
return request({
url: '/business/record/all/list',
method: 'get',
params:param,
})
}
//公招项目地区统计
export function countGroupByProvince(param) {
return request({
url: '/business/overview/countGroupByProvince',
method: 'post',
data:param
})
}
//公招项目投资金额统计
export function rangByMoney(param) {
return request({
url: '/business/overview/rangByMoney',
method: 'post',
data:param
})
}
......@@ -196,8 +196,55 @@ let getUipIdByCid = function getUipIdByCid(param) {
data: param
})
}
// 重点项目清单查询
let getImportantPage = function getImportantPage(param) {
return request({
url: '/radar/importantPage',
method: 'post',
data: param
})
}
// 重点项目清单筛选
let getImportantCondition = function getImportantCondition(param) {
return request({
url: '/radar/importantCondition',
method: 'post',
data: param
})
}
// 重点项目清单关联列表
let getImportantSelect = function getImportantSelect(param) {
return request({
url: '/radar/importantSelect',
method: 'post',
data: param
})
}
//重点项目清单详情
let getImportantDetail = function getImportantDetail(param) {
return request({
url: '/enterpriseProject/importantDetail',
method: 'post',
data: param
})
}
//项目清单导出
let radarExport = function radarExport(param) {
return request({
url: '/radar/export/important',
method: 'post',
data: param
})
}
export default {
radarExport,
getImportantDetail,
getImportantSelect,
getImportantCondition,
getImportantPage,
importData,
searchDic,
bondProjectPage,
......
This diff is collapsed.
......@@ -121,7 +121,7 @@ aside {
//main-container全局样式
.app-container {
padding: 16px;
//padding: 16px;
//margin-top: 56px;
}
......@@ -223,6 +223,7 @@ ul, li {
.app-container {
margin: 12px 24px;
background-color: #f5f5f5;
padding-bottom: 16px !important;
.el-input__inner{
border-color: #D9D9D9;
color: #232323;
......@@ -262,6 +263,19 @@ ul, li {
}
}
.query-ability{
.total{
display: flex !important;
flex-direction: row;
align-items: center;
&:before {
content: "";
display: inline-block;
width: 2px;
height: 2px;
background: rgba(35, 35, 35, 0.4);
margin-right: 4px;
}
}
span{
font-size: 14px;
color: #232323;
......@@ -407,6 +421,18 @@ ul, li {
background: #566380;
}
}
.el-scrollbar{
height: 16px;
.el-scrollbar__bar.is-horizontal{
height: 8px;
}
.el-scrollbar__thumb{
background: rgba(98,110,126,0.4);
&:hover{
background: #566380;
}
}
}
}
}
......
......@@ -977,6 +977,11 @@
font-size: 12px;
}
}
.el-form {
.el-form-item--small.el-form-item {
margin-bottom: 0;
}
}
}
.p10{
padding: 0 10px;
......@@ -1171,9 +1176,6 @@
}
.none{display: none}
.el-popper[x-placement^=bottom]{
margin-top: 0 !important;
}
.el-dialog__body{
padding-top: 14px;
padding-bottom: 18px;
......
This diff is collapsed.
......@@ -43,7 +43,7 @@ export default {
.app-main {
/* 84 = navbar + tags-view = 50 + 34 */
min-height: calc(100vh - 68px);
min-width:1440px;
min-width:1240px;
background: #F5F5F5;
overflow: initial;
}
......
......@@ -126,7 +126,7 @@ export default {
overflow: inherit;
/*position: relative;*/
background: #fff;
box-shadow: 0 1px 4px rgba(0,21,41,.08);
/*box-shadow: 0 1px 4px rgba(0,21,41,.08);*/
position: fixed;
top:0;
z-index: 999;
......
......@@ -2,7 +2,7 @@
<div :class="classObj" class="app-wrapper" :style="{'--current-color': theme}">
<div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside"/>
<sidebar v-if="!sidebar.hide" class="sidebar-container" @handleBar="handleSideBar" id="sidebar"/>
<div :class="{hasTagsView:needTagsView,sidebarHide:sidebar.hide,EnterpriseData:$route.name=='EnterpriseData'}" class="main-container">
<div :class="{hasTagsView:needTagsView,sidebarHide:sidebar.hide,EnterpriseData:$route.name=='Group',width1350:$route.name=='Radar',width1240:$route.name=='Overview'}" class="main-container">
<div :class="{'fixed-header':fixedHeader}">
<navbar :offsetWidth="offsetWidth"/>
</div>
......@@ -21,6 +21,7 @@ import ResizeMixin from './mixin/ResizeHandler'
import { mapState } from 'vuex'
import variables from '@/assets/styles/variables.scss'
import elementResizeDetectorMaker from "element-resize-detector"
import { parse,stringify } from 'flatted';
export default {
name: 'Layout',
components: {
......@@ -62,7 +63,13 @@ export default {
mounted(){
this.$nextTick(() => {
this.listenSider()
})
})
// console.log(9999)
let views = localStorage.getItem('views')
if(views!=null){
this.$store.state.tagsView.visitedViews = JSON.parse(views)
localStorage.removeItem('views')
}
},
methods: {
handleClickOutside() {
......@@ -128,4 +135,13 @@ export default {
.mobile .fixed-header {
width: 100%;
}
.EnterpriseData{
min-width: 1710px;
}
.width1350{
min-width: 1350px;
}
.width1240{
min-width: 1240px;
}
</style>
......@@ -13,7 +13,7 @@ import router from './router'
import directive from './directive' // directive
import plugins from './plugins' // plugins
import { download } from '@/utils/request'
import horizontalScroll from 'el-table-horizontal-scroll'
import './assets/icons' // icon
import './permission' // permission control
......@@ -59,6 +59,7 @@ Vue.component('FileUpload', FileUpload)
Vue.component('ImageUpload', ImageUpload)
Vue.component('ImagePreview', ImagePreview)
Vue.use(horizontalScroll)
Vue.use(directive)
Vue.use(plugins)
Vue.use(VueMeta)
......
......@@ -63,7 +63,7 @@ export default {
saveAs(text, name, opts);
},
exportByPost(url, params){
exportByPost(url, params,name){
var url = baseURL + url
axios({
method: 'post',
......@@ -72,8 +72,12 @@ export default {
data: params,
headers: { 'Authorization': 'Bearer ' + getToken() }
}).then(res => {
const blob = new Blob([res.data], { type: 'application/octet-stream/pdf/doc/xlsx/xls/docx' })
this.saveAs(blob, decodeURI(res.headers['download-filename']))
const blob = new Blob([res.data], { type: 'application/octet-stream/pdf/doc/xlsx/xls/docx/excel' })
if(name){
this.saveAs(blob, name)
}else {
this.saveAs(blob, decodeURI(res.headers['download-filename']))
}
})
},
async printErrMsg(data) {
......
......@@ -70,7 +70,7 @@ export const constantRoutes = [
path: 'index',
component: () => import('@/views/index'),
name: 'Index',
meta: { title: '首页', icon: 'index', }
meta: { title: '首页', icon: 'index',noCache: false }
}
]
},
......@@ -88,6 +88,34 @@ export const constantRoutes = [
}
]
},
// {
// path: '',
// component: Layout,
// hidden: true,
// redirect: 'economies',
// children: [
// {
// path: '/macro/economies',
// component: () => import('@/views/macro/economies'),
// name: 'Economies',
// meta: { title: '区域经济', icon: 'macro' }
// }
// ]
// },
{
path: '',
component: Layout,
hidden: true,
redirect: 'urban',
children: [
{
path: '/macro/urban',
component: () => import('@/views/macro/urban'),
name: 'Urban',
meta: { title: '城投平台', icon: 'macro' }
}
]
},
{
path: '/user',
component: Layout,
......@@ -127,7 +155,7 @@ export const constantRoutes = [
path: '/enterprise/:id',
component: () => import('@/views/detail/party-a/index'),
name: 'PartyA',
meta: { title: '企业详情', icon: 'enterprise', noCache: false },
meta: { title: '甲方详情', icon: 'enterpriseData', noCache: false },
}
]
},
......@@ -291,6 +319,20 @@ export const constantRoutes = [
}
]
},
{
path: '/MajorProject',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: '/radar/MajorProject/details/:id',
component: () => import('@/views/radar/MajorProject/details'),
name: 'MajorProjectDetails',
meta: { title: '重点项目详情', icon: 'radar' }
}
]
},
{
path: '/Bidding',
component: Layout,
......
import { parse,stringify } from 'flatted';
const state = {
visitedViews: [],
cachedViews: [],
......@@ -20,6 +22,28 @@ const mutations = {
title: view.meta.title || 'no-name'
})
)
// console.log(state.visitedViews)
// try {
// stringify(view)
// }catch(e)
// {
//
// }
// console.log(
// localStorage.removeItem('views')
// let views =view
// let viewlist = localStorage.getItem("views")==null?[]:JSON.parse(localStorage.getItem("views"))
// let li = {}
// li.fullPath = view.fullPath
// li.hash = view.hash
// li.meta = view.meta
// li.name = view.name
// li.params = view.params
// li.path = view.path
// li.query = view.query
// viewlist.push(li)
// viewlist.push(parse(stringify(view)))
// localStorage.setItem("views",stringify(viewlist))
},
ADD_CACHED_VIEW: (state, view) => {
if (state.cachedViews.includes(view.name)) return
......@@ -31,6 +55,8 @@ const mutations = {
for (const [i, v] of state.visitedViews.entries()) {
if (v.path === view.path) {
state.visitedViews.splice(i, 1)
let visitedViews = JSON.parse(JSON.stringify(state.visitedViews))
localStorage.setItem("views",JSON.stringify(visitedViews))
break
}
}
......
......@@ -17,7 +17,7 @@ const service = axios.create({
// axios中请求配置有baseURL选项,表示请求URL公共部分
baseURL: process.env.VUE_APP_BASE_API,
// 超时
timeout: 10000
timeout: 20000
})
// request拦截器
......@@ -37,6 +37,10 @@ service.interceptors.request.use(config => {
config.params = {};
config.url = url;
}
cancelPending(config)
config.cancelToken = new CancelToken(res => {
pending.push({'UrlPath': config.url, 'Cancel': res})
})
if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
const requestObj = {
url: config.url,
......@@ -68,6 +72,24 @@ service.interceptors.request.use(config => {
}
})
//频繁发送请求时,返回慢的数据覆盖了返回快的数据
let pending = []
let CancelToken = axios.CancelToken
let cancelPending = (config) => {
pending.forEach((item, index) => {
if (config) {
// if (item.UrlPath === '/combine/info/memberList' || item.UrlPath === '/combine/info/businessList' || item.UrlPath === '/combine/info/bidPage') {
if (item.UrlPath === config.url && ['/combine/info/memberList','/combine/info/businessList','/combine/info/bidPage'].includes(config.url)) {
item.Cancel() // 取消请求
pending.splice(index, 1) // 移除当前请求记录
};
} else {
item.Cancel() // 取消请求
pending.splice(index, 1) // 移除当前请求记录
}
})
}
// 响应拦截器
service.interceptors.response.use(res => {
const apiList = ['/login', '/system/user/profile/updatePwd'] //需要提示错误的接口
......@@ -102,6 +124,7 @@ service.interceptors.response.use(res => {
Notification.error({ title: msg })
return Promise.reject('error')
} else {
cancelPending(res.config)
return res.data
}
},error => {
......@@ -117,7 +140,7 @@ service.interceptors.response.use(res => {
if(message=='数据正在处理,请勿重复提交'){ //重复提交,提示样式特殊处理
Message({ message: message, type: 'warning', duration: 5 * 1000 })
}else{
Message({ message: message, type: 'error', duration: 5 * 1000 })
// Message({ message: message, type: 'error', duration: 5 * 1000 })
}
if(error.message.indexOf('timeout')<0 ){ //超时报错不提示
......
......@@ -51,6 +51,10 @@ export default {
type: String,
default: '请选择'
},
'moneyValue': {
type: String,
default: ''
},
'ref-str': {
type: String,
default: `timeselect${String(Math.random(0, 100)).slice(2)}`,
......@@ -92,6 +96,9 @@ export default {
if(this.moneyList&&this.moneyList.length>0){
this.options = this.moneyList
}
if(this.moneyValue){
this.value = this.moneyValue
}
},
destroyed() {
const app = document.getElementById('app')
......@@ -278,7 +285,7 @@ export default {
.options-block {
position: absolute;
margin-top: 12px;
margin-top: 3px;
min-width: 120px;
font-size: 14px;
color: #666666;
......@@ -411,20 +418,20 @@ export default {
width: 186px;
color: #606266;
text-indent: 0;
padding: 16px;
padding: 14px;
padding-top: 0px;
border: 1px solid #e0e0e0;
.popper_wrap {
margin-top: 16px;
display: inline-block;
.popper_input {
width: 100px;
width: 90px;
display: inline-block;
margin: 0px 8px;
line-height: 34px;
}
.el-input__inner {
width: 100px;
width: 90px;
}
}
input::-webkit-outer-spin-button,
......
......@@ -46,6 +46,10 @@ export default {
type: String,
default: '请选择',
},
'timeValue': {
type: String,
default: '',
},
'ref-str': {
type: String,
default: `timeselect${String(Math.random(0, 100)).slice(2)}`,
......@@ -61,7 +65,7 @@ export default {
timeList: {
type: Array,
default: () => [],
}
},
},
computed: {
isClear() {
......@@ -106,6 +110,9 @@ export default {
if(this.dateTo){
this.defaultValue = new Date(this.dateTo)
}
if(this.timeValue){
this.value = this.timeValue
}
this.handleAppClick()
if(this.timeList&&this.timeList.length>0){
this.options = this.timeList
......@@ -319,6 +326,9 @@ export default {
left: -400px;
}
}
.el-date-editor{
left: -400px;
}
}
.picker-block {
......
<template>
<div class="no-data">
<div class="no-data-box">
<img :src="noData" alt="抱歉,没找到相关数据" />
<div v-if="text">抱歉,您还未添加{{text}}项目</div>
<div v-else>抱歉,没找到相关数据</div>
<span v-if="condition">建议调整关键词或筛选条件,重新搜索</span>
</div>
</div>
</template>
<script>
export default {
name: "NoData",
props: {
condition: {
type: Boolean,
default: false
},
text: {
type: String,
default: ''
}
},
data() {
return {
noData: require("@/assets/images/detail/noData.png")
}
},
methods:{
}
}
</script>
<style lang="scss" scoped>
.no-data {
font-size: 14px;
color: #999999;
width: 100%;
height: 100%;
min-height: 120px;
display: flex;
justify-content: center;
align-items: center;
background: #ffffff;
//border: 1px solid #eeeeee;
.no-data-box {
display: flex;
flex-direction: column;
align-items: center;
img {
width: 108px;
height: 109px;
margin-bottom: 22px;
}
div{
font-size: 16px;
line-height: 1;
color: #333333;
}
span{
margin-top: 4px;
}
}
}
</style>
<template>
<div>
<el-dialog
class="popups"
:visible.sync="dialogVisible"
width="534px"
:close-on-click-modal="false"
@close="resetForm('ruleForm')"
>
<div class="poptitle">
<img src="@/assets/images/economies/icon.png">
<span>添加客户</span>
</div>
<el-form class="popform j" :model="queryParam" :rules="rules" ref="ruleForm" label-width="130px">
<el-form-item label="企业名称:" class="row" prop="companyName">
<el-input type="text" placeholder="请输入" v-model="queryParam.companyName" @input="getCompany(1)"></el-input>
<div class="resultlist infinite-list" v-if="showlist" id="box" v-infinite-scroll="load" style="overflow:auto">
<div class="infinite-list-item" v-for="(item,index) in companData" @click="selCompany(item)"><span v-html="item.name" :key="companypage"></span></div>
</div>
</el-form-item>
<el-form-item label="客户等级:" class="row">
<el-select placeholder="请选择" v-model="queryParam.customerLevel">
<el-option v-for="(item,index) in customerLevel" :key="index" :label="item.dictLabel" :value="item.dictValue"></el-option>
</el-select>
</el-form-item>
<el-form-item label="法定代表人:" class="row">
<el-input type="text" placeholder="请输入" v-model="queryParam.legalPerson"></el-input>
</el-form-item>
<el-form-item label="注册资本(万):" class="row">
<el-input type="text" placeholder="请输入" v-model="queryParam.registerCapital" @input='number'></el-input>
</el-form-item>
<el-form-item label="企业注册地:" class="row">
<el-cascader :props="props" @change="getAddr($event)" ref="address" v-model="queryParam.address" :options="addressList" clearable></el-cascader>
</el-form-item>
<el-form-item label="统一社会信用代码:" class="row">
<el-input type="text" placeholder="请输入" v-model="queryParam.creditCode"></el-input>
</el-form-item>
<div class="popbot">
<div class="wordprimary" @click="toct">前往城投平台寻找客户线索></div>
<div class="btn btn_cancel h32" @click="resetForm('ruleForm')">返回</div>
<div class="btn btn_primary h32" @click="submitForm('ruleForm')">添加</div>
</div>
</el-form>
</el-dialog>
</div>
</template>
<script>
import { getDictType, getEnterprise } from '@/api/main'
import { addCustomer, getCustomerList, importData } from '@/api/custom/custom'
import prvinceTree from '@/assets/json/provinceTree'
export default {
name: '',
components: {
},
props: {
data:{}
},
data() {
return {
props:{ checkStrictly: true, expandTrigger: 'hover' },
dialogVisible: this.data.open,
//添加客户
queryParam:{
companyId:'',//jsk企业id
companyName:'',//客户名称(企业名称
customerLevel:'',//客户等级
legalPerson:'',//法定代表人
registerCapital:'',//注册资本
registerAddress:'',//企业注册地址
creditCode:'',//社会统一信用代码
address:'',//选择的地址
provinceId:'',
cityId:'',
districtId:'',
},
rules:{
companyName:[{ required: true, message: '请输入非空格字符!', trigger: 'blur' },]
},
showlist:false,
customerLevel:[]
}
},
created() {
this.prvinceTree()
this.getDictType()
console.log(this.dialogVisible)
console.log('1111111111')
},
computed: {},
methods:{
async prvinceTree() {
this.addressList = prvinceTree;
this.getadd(this.addressList)
},
getDictType(){
//获取客户等级
getDictType('customer_level_type').then(result=>{
this.customerLevel = result.code == 200 ? result.data:[]
})
},
open() {
// this.dialogVisible = true;
},
resetForm(formName) {
this.queryParam = {
companyId:'',//jsk企业id
companyName:'',//客户名称(企业名称
customerLevel:'',//客户等级
legalPerson:'',//法定代表人
registerCapital:'',//注册资本
registerAddress:'',//企业注册地址
creditCode:'',//社会统一信用代码
address:'',//选择的地址
provinceId:'',
cityId:'',
districtId:'',
},
this.dialogVisible = false
this.showlist = false
},
getAddr(obj){
if(obj.length == 0){
this.queryParam.provinceId = ''
this.queryParam.cityId = ''
this.queryParam.districtId = ''
return false
}
let labelString = this.$refs.address.getCheckedNodes()[0].pathLabels.join("-");
this.queryParam.registerAddress = labelString
this.queryParam.provinceId = obj[0]
this.queryParam.cityId = obj.length>=1 ? obj[1]:''
this.queryParam.districtId = obj.length>=2 ? obj[2]:''
},
//获取建设库客户
getCompany(value){
this.queryParam.companyId = null
if(value == 1){
this.companData = []
this.companypage = 1
}
if (this.queryParam.companyName.length>=2){
let param = {
keyword:this.queryParam.companyName,
page:{
limit:20,
page:this.companypage
}
}
getEnterprise(JSON.stringify(param)).then(result=>{
if(result.code != 200){
return false
}
if(result.data.list != null && result.data.list.length>0){
this.isscroll = true
if (this.companData.length===0) {
this.companData = result.data.list
} else {
let arr2 = result.data.list
arr2.unshift(2, 0);
Array.prototype.splice.apply(this.companData, arr2);
}
if(this.companData.length===0) {
this.showlist = false
}else{
this.showlist = true
}
this.companypage += 1
}else{
this.isscroll = false
}
})
}
},
load(){
if(this.isscroll){
this.getCompany(2)
}
},
selCompany(item){
this.queryParam.companyId = item.jskEid
this.queryParam.companyName = item.name.replace(/<[^>]+>/g, '')
this.queryParam.legalPerson = item.legalPerson
let registeredCapitalStr = ""
if(item.registeredCapitalStr == "0" || item.registeredCapitalStr == 0){
registeredCapitalStr = ''
}else{
registeredCapitalStr = item.registeredCapitalStr
}
this.queryParam.registerCapital = registeredCapitalStr
this.queryParam.creditCode = item.creditCode
this.queryParam.provinceId = item.provinceId
this.queryParam.cityId = item.cityId
this.queryParam.districtId = item.cityId
let list = []
if(item.provinceId != null && item.provinceId != "")
list.push(item.provinceId)
if(item.cityId != null && item.cityId != "")
list.push(item.cityId)
if(item.districtId != null && item.districtId != "")
list.push(item.districtId)
this.$nextTick(()=>{
this.queryParam.address = list
let _this = this
setTimeout(function() {
if(_this.$refs.address){
_this.queryParam.registerAddress = _this.$refs.address.getCheckedNodes()[0].pathLabels.join("-")
}
},1000)
})
this.showlist = false
},
//添加客户
submitForm(formName) {
// if(this.queryParam.companyId=="" || this.queryParam.companyId == null){
// this.$message.error({message:'请选择企业!',showClose:true})
//
// return;
// }
this.$refs[formName].validate((valid) => {
if (valid) {
addCustomer(this.queryParam).then(result=>{
if(result.code == 200){
this.$message.success('添加成功!')
this.dialogVisible = false
this.resetForm('ruleForm')
}else{
this.$message.error(result.msg)
}
})
} else {
}
});
},
toct(){
this.$router.push({path:'/macro/urban'})
},
//输入数字
number(value){
if(value == '')
this.queryParam.registerCapital = value
else
this.queryParam.registerCapital = value.replace(/^\D*(\d*(?:\.\d{0,6})?).*$/g, '$1')//输入6位小数
},
//处理注册地数据
getadd(row) {
this.addrcallback(row,this.getadd)
},
addrcallback(row,callback){
if(row){
row.forEach(item => {
item.value = item.id
callback && callback(item.children)
})
}
},
},
}
</script>
<style scoped>
</style>
......@@ -18,7 +18,7 @@
</div>
</div>
<skeleton v-if="isSkeleton"></skeleton>
<el-table v-if="!isSkeleton&&tableData.total > 0" class="fixed-table" max-height="640"
<el-table v-if="!isSkeleton&&tableData.total > 0" class="fixed-table" v-horizontal-scroll="tableData.total > 10 ? 'hover' : '1'" max-height="640"
:data="tableData.rows"
stripe border
style="width: 100%">
......@@ -26,7 +26,7 @@
prop="index"
label="序号"
fixed="left"
width="47">
width="60">
<template slot-scope='scope'>
<span>{{ (searchParam.pageNum - 1) * searchParam.pageSize + scope.$index + 1 }}</span>
</template>
......@@ -51,7 +51,7 @@
<el-table-column
prop="cooperationProject"
label="合作项目"
width="76">
width="90">
<template slot-scope="scope">
{{scope.row.cooperationProject || '--'}}
</template>
......@@ -59,7 +59,7 @@
<el-table-column
prop="followProject"
label="跟进项目"
width="76">
width="90">
<template slot-scope="scope">
{{scope.row.followProject || '--'}}
</template>
......@@ -67,7 +67,7 @@
<el-table-column
prop="reserveProject"
label="储备项目"
width="76">
width="90">
<template slot-scope="scope">
{{scope.row.reserveProject || '--'}}
</template>
......@@ -91,7 +91,7 @@
<el-table-column
prop="registerCapitalStr"
label="注册资本金(万元)"
width="140">
width="160">
<template slot-scope="scope">
<span v-if="scope.row.registerCapital && scope.row.registerCapital>0">{{scope.row.registerCapital}}</span><span v-else>--</span>
</template>
......
......@@ -54,17 +54,24 @@
<label class="label">建设性质</label>
<span>{{info.projectNature||"--"}}</span>
</p>
<p>
<label class="label">招标公告</label>
<span class="span2">
<router-link :to="`/radar/Notice/details/${info.bId}`" tag="a" class="a-link" v-if="info.bId" >查看招标公告</router-link>
<span v-else>--</span>
</span>
</p>
</div>
<div class="biddetail-title">招标信息</div>
<div class="main31-box">
<p>
<label class="label">招标单位</label>
<span class="span1">
<router-link v-if="info.projectUnit" :to="info.uipId?'/enterprise/' + encodeStr(info.projectUnitId) :'/company/' + encodeStr(info.projectUnitId) " tag="a" class="list-titel-a blue" v-html="info.projectUnit"></router-link>
<span v-else>--</span>
</span>
<span class="span1">
<router-link v-if="info.projectUnit" :to="info.uipId?'/enterprise/' + encodeStr(info.projectUnitId) :'/company/' + encodeStr(info.projectUnitId) " tag="a" class="list-titel-a blue" v-html="info.projectUnit"></router-link>
<span v-else>--</span>
</span>
<label class="label label1">招标代理机构</label>
<span class="span1">{{info.agency||"--"}}</span>
<span class="span1">{{info.agency||"--"}}</span>
</p>
</div>
......@@ -91,7 +98,7 @@
</template>
<script>
import "@/assets/styles/public.css";
import "@/assets/styles/public.scss";
import {encodeStr} from "@/assets/js/common.js"
import {getBiddetail} from '@/api/detail/party-a/biddetail.js';
export default {
......@@ -409,9 +416,12 @@ export default {
font-size: 12px;
background: #fff;
}
.span1{
width: 40%;
}
.span1{
width: 40%;
}
.span2{
width: 88.9%;
}
.span-one {
width: 90%;
}
......
......@@ -53,12 +53,14 @@ export default {
{title: '集团成员', pathName: 'members'},
{title: '集团资质', pathName: 'qualifications'},
{title: '集团业绩', pathName: 'performance'},
{title: '集团招标', pathName: 'zhaobiao'},
],
defaultRoute: [],
customer:[
'members',
'qualifications',
'performance',
'zhaobiao',
],
uniqueOpened:false,
searchIndex: ''
......
......@@ -171,7 +171,7 @@
qyType:[],
cgblList:['100%','50%以上','20%以上','5%以上','1%-5%'],
cgblName:'',
paramsData:[], //储存组件筛选的条件
paramsData:{}, //储存组件筛选的条件
}
},
watch:{
......@@ -244,8 +244,8 @@
}
},
handleQuery(params){
this.paramsData=params;
this.tableLoading=true
this.paramsData=params || {};
this.tableLoading=true;
let data = this.getAreaList(params || this.queryParams)
memberList(data).then(res=>{
this.isSkeleton = false
......@@ -363,8 +363,9 @@
this.queryParams.maxStockPercent=''
}
if(this.paramsData){
this.paramsData.minStockPercent=this.queryParams.minStockPercent
this.paramsData.maxStockPercent=this.queryParams.maxStockPercent
if(!this.paramsData.combineId){
this.paramsData=this.queryParams
}
this.paramsData.pageNum =1
this.queryParams.pageNum =1
}
......@@ -400,16 +401,26 @@
},
sortChange({ column, prop, order }){
this.queryParams.orderName = prop
this.paramsData.orderName = prop;
this.paramsData.combineId = this.customerId;
this.paramsData.pageNum = 1;
this.paramsData.pageSize = 20;
if(column.order === "ascending"){
this.queryParams.orderType = 'asc'
this.paramsData.orderType = 'asc'
}else if(column.order === "descending"){
this.queryParams.orderType = 'desc'
this.paramsData.orderType = 'desc'
}else {
this.queryParams.orderType=''
this.queryParams.orderName=''
this.paramsData.orderType=''
this.paramsData.orderName=''
}
this.pageIndex = 1;
this.handleQuery()
this.queryParams.pageNum =1
this.paramsData.pageNum =1
this.handleQuery(this.paramsData)
},
//分页
handleCurrentChange(e){
......
......@@ -5,8 +5,9 @@
:form-data="formData"
:query-params="queryParams"
:total="tableDataTotal"
:isExcel="false"
:isExcel="true"
@handle-search="handleSearch"
@handle-excel="clickEXCEL"
>
<template slot="slot">
......@@ -57,7 +58,7 @@
import { getDictType } from '@/api/main'
export default {
name: 'qualifications',
props: ['customerId'],
props: ['customerId','combineName'],
mixins: [mixin],
components:{},
data(){
......@@ -74,17 +75,17 @@
forData: [
{label: '中标时间', prop: 'bidTime',slot: true,minWidth: '80'},
{label: '中标成员', prop: 'companyName', slot: true,minWidth: '190'},
{label: '持股比例', prop: 'stockPercent',slot: true,minWidth: '95'},
{label: '持股比例', prop: 'stockPercent',slot: true,minWidth: '80'},
{label: '项目名称', prop: 'projectName', slot: true,minWidth: '260'},
{label: '中标金额', prop: 'bidAmount',slot: true,minWidth: '110'},
{label: '中标地区', prop: 'address',minWidth: '80'},
{label: '业绩类型', prop: 'boundType',minWidth: '100'},
{label: '项目类型', prop: 'projectType',minWidth: '100'},
{label: '中标地区', prop: 'address',minWidth: '130'},
{label: '业绩类型', prop: 'boundType',minWidth: '80'},
{label: '项目类型', prop: 'projectType',minWidth: '80'},
{label: '业主单位', prop: 'projectUnit', slot: true,minWidth: '190'},
],
formData: [
{ type: 7, fieldName: 'province', value: '',props: {multiple: true,value: 'id',expandTrigger: 'hover'}, placeholder: '项目地区', options:[]},
{ type: 5, fieldName: 'time', value: '', placeholder: '中标时间', startTime: 'startBidTime', endTime: 'endBidTime',timeList:[] },
{ type: 5, fieldName: 'time', value: '', placeholder: '中标时间', startTime: 'startBidTime', endTime: 'endBidTime',timeList:[],dateTo:this.formatDate(new Date()) },
{ type: 6, fieldName: 'money', value: '', placeholder: '中标金额', startMoney: 'minAmount', endMoney: 'maxAmount',moneyList:[] },
{ type: 4, fieldName: 'boundTypes', value: '', placeholder: '业绩类型', options: [],width:150},
{ type: 4, fieldName: 'projectTypes', value: '', placeholder: '项目类型', options: [],width:150},
......@@ -103,6 +104,7 @@
],
timeList: ['近三天', '近七天', '近半月', '自定义'],
moneyList: ['5000万以下', '5000万-1亿', '1亿-5亿', '5亿-10亿','10亿以上', '自定义'],
dataEXCEL:{}
}
},
created() {
......@@ -162,6 +164,7 @@
}
delete data.cgbl
}
this.dataEXCEL=JSON.parse(JSON.stringify(data));
businessList(data).then(res=>{
this.tableData = res.code == 200 ? res.rows:[]
this.tableDataTotal = res.total
......@@ -263,6 +266,16 @@
// this.$children[1].$refs.tableRef.bodyWrapper.scrollTop = 0
}, 500);
},
clickEXCEL() {
this.dataEXCEL.combineName=this.combineName;
if(this.tableDataTotal > 2000){
this.dataEXCEL.pageSize=2000;
}else {
this.dataEXCEL.pageSize=this.tableDataTotal;
}
delete this.dataEXCEL.pageNum
this.$download.exportByPost('/combine/info/export/win/bid',this.dataEXCEL,'集团中标.xlsx');
},
}
}
</script>
......
......@@ -8,6 +8,15 @@
:isExcel="false"
@handle-search="handleSearch"
/>
<div style="margin-bottom: 20px;">
<!--certificateList-->
<div class="item_ckquery" :style="height?'height:'+height+'':'height: 60px'">
<template v-for="(item,index) in certificateList">
<span :class="{'color_text':queryParams.qualificationType === item.qualificationType}" @click="changeType(item.qualificationType)">{{item.qualificationName}}{{item.companyCount}}</span>
</template>
</div>
<el-divider v-if="certificateList.length > 10 && !height" @click="moreClick()">更多<span></span></el-divider>
</div>
<skeleton style="margin-left:16px;" v-if="isSkeleton"></skeleton>
<tables
v-if="!isSkeleton"
......@@ -39,7 +48,7 @@
import QualificationsDetail from './qualificationsDetail'
export default {
name: 'qualifications',
props: ['customerId','name'],
props: ['customerId','combineName'],
mixins: [mixin],
components:{
QualificationsDetail
......@@ -53,29 +62,31 @@
queryParams: {
combineId:this.customerId,
pageNum: 1,
pageSize: 20
pageSize: 20,
qualificationType:''
},
forData: [
{label: '资质名称', prop: 'qualificationName'},
{label: '拥有该资质成员', prop: 'companyCount', slot: true},
],
formData: [
{ type: 1, fieldName: 'qualificationType', value: '', placeholder: '筛选', options:[],width:260},
// { type: 1, fieldName: 'qualificationType', value: '', placeholder: '筛选', options:[],width:260},
],
tableData:[],
tableDataTotal:0,
title:'',
rowData:''
rowData:'',
certificateList:[],
height:''
}
},
created() {
this.handleQuery()
this.getCertificateList()
},
methods: {
handleQuery(params){
this.isSkeleton = true
let data = params ? params : this.queryParams
let data = params ? params : this.queryParams;
certificateList(data).then(res=>{
this.isSkeleton = false
if(res.code === 200){
......@@ -89,19 +100,32 @@
getCertificateList(){
certificateCount({combineId: this.queryParams.combineId}).then(res=>{
let data = res.data
this.certificateList=res.data;
this.queryParams.qualificationType=res.data[0].qualificationType;
this.handleQuery()
for(let i=0; i<data.length; i++){
this.formData[0].options.push({
name: data[i].qualificationName+ '(' + data[i].companyCount + ')',
value: data[i].qualificationType,
})
// this.formData[0].options.push({
// name: data[i].qualificationName+ '(' + data[i].companyCount + ')',
// value: data[i].qualificationType,
// })
}
})
},
handleClick(e, data) {
this.title=this.name+'-'+data.qualificationName+'(共'+ data.companyCount +'条)'
this.title=this.combineName+'-'+data.qualificationName+'(共'+ data.companyCount +'条)'
this.rowData = data
this.isDetails = true
},
changeType(value){
this.queryParams.qualificationType=value;
this.queryParams.pageNum=1;
this.queryParams.pageSize=20;
this.handleQuery()
},
moreClick(){
this.height='auto'
},
}
}
</script>
......@@ -117,6 +141,33 @@
margin-right: 24px;
}
}
.item_ckquery{
position: relative;
margin-bottom: 10px;
overflow: hidden;
span{
color: #232323;
padding: 3px 10px;
margin-bottom: 4px;
display: inline-block;
font-size: 14px;
cursor: pointer;
width: 20%;
}
span:hover{
background: #F3F4F5;
border-radius: 4px;
color:#0081FF;
}
.color_text{
background: #F3F4F5;
border-radius: 4px;
color: #0081FF;
}
.select-active{
color: #0081FF;
}
}
::v-deep .el-table{
.has-gutter{
tr{
......@@ -132,5 +183,28 @@
background: #F0F3FA;
}
}
::v-deep .el-divider{
/*width: calc(100% - 107px);*/
margin-top: 12px;
.el-divider__text{
cursor: pointer;
span{
display: inline-block;
width: 16px;
height: 16px;
position: relative;
top: 2px;
background: url('../../../../assets/images/down.png');
background-size: 16px 16px;
}
&:hover{
color: #0081FF;
span{
background: url('../../../../assets/images/down1.png');
background-size: 16px 16px;
}
}
}
}
}
</style>
......@@ -6,11 +6,17 @@
custom-class="client-drawer"
:with-header="false"
@closed="cancel">
<skeleton style="margin-left:16px;" v-if="isSkeleton"></skeleton>
<div class="head" v-if="!isSkeleton">
<div class="head">
<img class="tip-img" src="@/assets/images/icon.png" />
<span>{{title}}</span>
</div>
<div style="height: 34px;margin: 12px">
<div class="cooperate-name" id="focus01">
<el-input clearable @clear="changeSelect" style="width: 300px;" @focus="clickFocus('focus01')" @blur="clickFocus('focus01')" v-model="queryParams.companyName" placeholder="成员名称查询"></el-input>
<span @click="changeSelect">搜索</span>
</div>
</div>
<skeleton style="margin-left:16px;" v-if="isSkeleton"></skeleton>
<tables
v-if="!isSkeleton"
:tableLoading="tableLoading"
......@@ -18,6 +24,7 @@
:forData="forData"
:tableDataTotal="tableDataTotal"
:queryParams="queryParams"
:MaxPage=500
@handle-current-change="handleCurrentChange"
style="margin: 12px;"
>
......@@ -50,11 +57,9 @@ export default {
queryParams: {
id: this.data.id,
pageNum: 1,
pageSize: 10
pageSize: 10,
companyName:''
},
formData: [
{ type: 3, fieldName: 'keys', value: '', placeholder: '输入项目/工程名称查询', options: []},
],
forData: [
{label: '拥有该资质成员', prop: 'companyName', slot: true},
{label: '成员共有资质(个)', prop: 'certificateCount'},
......@@ -73,7 +78,8 @@ export default {
methods: {
async handleQuery(params) {
this.isSkeleton = true
let param = params?params:this.queryParams
let param = params?params:this.queryParams;
console.log(param)
let res = await memberCertificateList(param)
this.isSkeleton = false
if(res.code==200){
......@@ -94,7 +100,19 @@ export default {
},
cancel() {
this.$emit('cancel')
}
},
changeSelect(){
this.queryParams.pageNum = 1
this.handleQuery()
},
clickFocus(e){
document.getElementById(e).classList.toggle('span-ba')
},
//分页
handleCurrentChange(e){
this.queryParams.pageNum = e
this.handleQuery()
},
}
}
</script>
......@@ -114,5 +132,47 @@ export default {
height: 17px;
margin: 0 8px -2px 12px;
}
.cooperate-name {
display: flex;
border-radius: 2px 0px 0px 2px;
border: 1px solid #D9D9D9;
line-height: 34px;
height: 34px;
width: 300px;
float: right;
span {
width: 80px;
height: 32px;
line-height: 32px;
font-size: 14px;
background: #F5F5F5;
text-align: center;
color: #0081FF;
border: 1px solid #EFEFEF;
border-left: 0;
cursor: pointer;
}
&.span-ba{
border: 1px solid #0081FF;
span{
color: #ffffff;
background: #0081FF;
border: 1px solid #0081FF;
}
}
::v-deep .el-input{
flex: 1;
}
::v-deep .el-input__inner {
border: 0;
line-height: 32px;
height: 32px;
position: absolute;
top: 0;
padding-right: 22px;
font-size: 12px;
padding-left: 8px;
}
}
}
</style>
......@@ -12,9 +12,10 @@
</div>
<div class="group-right">
<div id="groupBox" v-if="customerId">
<Members v-if="currentPath.pathName=='members'" :customer-id="customerId" :isSkeleton="isSkeleton" />
<Qualifications v-if="currentPath.pathName=='qualifications'" :customer-id="customerId" :isSkeleton="isSkeleton" :name="name"/>
<Performance v-if="currentPath.pathName=='performance'" :customer-id="customerId" :isSkeleton="isSkeleton"/>
<Members v-if="currentPath.pathName=='members'" :customer-id="customerId" :isSkeleton="isSkeleton" :combineName="name"/>
<Qualifications v-if="currentPath.pathName=='qualifications'" :customer-id="customerId" :isSkeleton="isSkeleton" :combineName="name"/>
<Performance v-if="currentPath.pathName=='performance'" :customer-id="customerId" :isSkeleton="isSkeleton" :combineName="name"/>
<Zhaobiao v-if="currentPath.pathName=='zhaobiao'" :customer-id="customerId" :isSkeleton="isSkeleton" :combineName="name"/>
</div>
</div>
</div>
......@@ -27,12 +28,13 @@
import Members from "./component/members"
import Qualifications from "./component/qualifications"
import Performance from "./component/performance"
import Zhaobiao from "./component/zhaobiao"
import { infoHeader } from '@/api/detail/party-a/index'
import elementResizeDetectorMaker from "element-resize-detector"
export default {
name: 'GroupAccount',
components:{
SideBar,Members,Qualifications,Performance
SideBar,Members,Qualifications,Performance,Zhaobiao
},
data(){
return{
......@@ -77,6 +79,8 @@
}
.group-left{
margin-right: 16px;
padding-bottom: 16px;
background: #FFFFFF;
}
.group-right{
min-width: 1088px;
......
......@@ -272,7 +272,7 @@ export default {
.options-block {
position: absolute;
margin-top: 12px;
margin-top: 5px;
min-width: 120px;
font-size: 14px;
color: #666666;
......
<template>
<div class="headForm">
<div class="flex-box query-box">
<div class="flex-box query-params">
<div class="flex-box query-params" :class="flag?'box1':''">
<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="flag">
<img v-if="title" src="@/assets/images/detail/ico_title.png" />
<span class="drawer-title" v-if="title">{{ title }}</span>
</template>
<template v-if="slots">
<slot name="slot"></slot>
</template>
<!-- <div v-else>
<div v-if="flag">
<span class="ability-total" v-if="isTotal">{{ total }}条数据</span>
<span class="ability-total" v-if="amountTotal">,共计合作总金额:<i>{{ amountTotal }}</i>万元</span>
</div> -->
</div>
</div>
<div class="headForm-from">
<div class="from-item" :key="i" v-for="(form, i) in formData">
......@@ -45,7 +47,7 @@
<!-- 输入框 -->
<template v-if="form.type==3">
<div class="cooperate-name" :id="'detailFocus'+i">
<el-input clearable @focus="clickFocus('detailFocus'+i)" @blur="clickFocus('detailFocus'+i)" v-model="form.value" :placeholder="form.placeholder" :style="form.width?'width:'+form.width+'px':'width:180px'"></el-input>
<el-input clearable @clear="changeSelect" @focus="clickFocus('detailFocus'+i)" @blur="clickFocus('detailFocus'+i)" v-model="form.value" :placeholder="form.placeholder" :style="form.width?'width:'+form.width+'px':'width:180px'"></el-input>
<span @click="changeSelect">搜索</span>
</div>
</template>
......@@ -96,6 +98,10 @@ export default {
type: String,
default: ''
},
flag: {
type: Boolean,
default: false
},
queryParams: {
type: Object,
default: {}
......@@ -143,11 +149,26 @@ export default {
width: 100%;
padding: 8px 17px 8px 0;
}
.box1{
padding: 8px 17px 8px 13px;
justify-content: space-between;
border-bottom: 1px solid #E1E1E1;
}
::v-deep .el-input__inner{
border: 0;
height: 32px;
line-height: 32px;
}
::v-deep .el-select .el-input__inner{
border: 1px solid #D9D9D9;
height: 34px;
line-height: 34px;
padding-right: 27px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
border-radius: 4px;
}
::v-deep .custom-money-select{
.el-input__inner{
border: 1px solid #D9D9D9;
......@@ -161,6 +182,12 @@ export default {
line-height: 32px;
}
.headForm-text{
.drawer-title{
font-size: 16px;
color: #232323;
font-weight: bold;
margin-right: 4px;
}
img{
width: 17px;
height: 17px;
......
......@@ -31,7 +31,7 @@
:min-width="item.minWidth"
:align="item.align?item.align:'left'"
:fixed="item.fixed"
:sortable="item.sortable ? 'custom' : false"
:sortable="item.sortable ?item.sortable=='custom'? 'custom':true : false"
:resizable="false">
<template v-if="item.children&&item.children.length">
<el-table-column
......@@ -197,6 +197,12 @@ export default {
}
}
}
.table-item{
::v-deep .el-table td.el-table__cell{
border-bottom: 0;
}
}
::v-deep .el-table th.el-table__cell.is-leaf,::v-deep .el-table td.el-table__cell {
border-bottom: 1px solid #E6EAF1;
}
......@@ -216,5 +222,4 @@ export default {
::v-deep .el-table--enable-row-hover .el-table__body tr:hover > td {
background-color: #DCEBFF;
}
</style>
......@@ -14,7 +14,7 @@
>
<template slot="slot">
<div class="flex-box query-add">
<el-button type="primary" icon="el-icon-plus" @click="drawer = true">添加商务信息</el-button>
<el-button type="primary" icon="el-icon-plus" @click="drawer = true">添加合作情况</el-button>
</div>
</template>
</head-form>
......
......@@ -82,7 +82,6 @@ export default {
},
methods: {
async handleQuery(params) {
this.isSkeleton = true;
this.tableLoading = true
let param = params?params:this.queryParams
let res = await oftenAgencyPage(param)
......
......@@ -71,7 +71,6 @@ export default {
},
methods: {
async handleQuery(params) {
this.isSkeleton = true;
this.tableLoading = true
let param = params?params:this.queryParams
let res = await tenderPage(param)
......
......@@ -94,7 +94,6 @@ export default {
},
async handleQuery(params) {
this.tableLoading = true
let param = params?params:this.queryParams
let res = await historySendPage(param)
this.tableLoading = false
......
......@@ -59,7 +59,11 @@
</el-table-column>
<el-table-column prop="investStartDate" label="成立日期"></el-table-column>
<el-table-column prop="stockPercentage" label="股权占比"></el-table-column>
<el-table-column prop="shouldCapi" label="认缴出资额(万元)"></el-table-column>
<el-table-column prop="shouldCapi" label="认缴出资额(万元)">
<template slot-scope="scope">
<span>{{scope.row.shouldCapi>0?scope.row.shouldCapi:'--'}}</span>
</template>
</el-table-column>
</el-table>
<no-data v-if="activeName=='second'&&shipData.length<1"/>
<el-table :data="affiliatesData" border style="width: 100%" v-show="activeName=='third'">
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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