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; ...@@ -3,6 +3,7 @@ package com.dsk;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; 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 ...@@ -11,6 +12,7 @@ import org.springframework.boot.context.metrics.buffering.BufferingApplicationSt
*/ */
@SpringBootApplication @SpringBootApplication
@EnableScheduling
public class DskOperateSysApplication { public class DskOperateSysApplication {
public static void main(String[] args) { public static void main(String[] args) {
......
...@@ -41,7 +41,8 @@ public class SysDeptController extends BaseController { ...@@ -41,7 +41,8 @@ public class SysDeptController extends BaseController {
List<SysDept> depts = deptService.selectDeptList(dept); List<SysDept> depts = deptService.selectDeptList(dept);
List<SysDeptVo> deptVos = BeanUtil.copyToList(depts, SysDeptVo.class); List<SysDeptVo> deptVos = BeanUtil.copyToList(depts, SysDeptVo.class);
deptVos.forEach(sysDeptVo -> { deptVos.forEach(sysDeptVo -> {
sysDeptVo.setExistUsers(deptService.hasChildByDeptId(sysDeptVo.getDeptId())); //查询该部门及其子部门是否存在用户
sysDeptVo.setExistUsers(deptService.checkAllDeptsAndUsers(sysDeptVo.getDeptId()));
}); });
return R.ok(deptVos); return R.ok(deptVos);
} }
...@@ -56,7 +57,7 @@ public class SysDeptController extends BaseController { ...@@ -56,7 +57,7 @@ public class SysDeptController extends BaseController {
public R<List<SysDept>> excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) { public R<List<SysDept>> excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) {
List<SysDept> depts = deptService.selectDeptList(new SysDept()); List<SysDept> depts = deptService.selectDeptList(new SysDept());
depts.removeIf(d -> d.getDeptId().equals(deptId) 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); return R.ok(depts);
} }
...@@ -99,7 +100,7 @@ public class SysDeptController extends BaseController { ...@@ -99,7 +100,7 @@ public class SysDeptController extends BaseController {
} else if (dept.getParentId().equals(deptId)) { } else if (dept.getParentId().equals(deptId)) {
return R.fail("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己"); return R.fail("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己");
} else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) } else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus())
&& deptService.selectNormalChildrenDeptById(deptId) > 0) { && deptService.selectNormalChildrenDeptById(deptId) > 0) {
return R.fail("该部门包含未停用的子部门!"); return R.fail("该部门包含未停用的子部门!");
} }
return toAjax(deptService.updateDept(dept)); return toAjax(deptService.updateDept(dept));
......
...@@ -3,6 +3,7 @@ package com.dsk.web.controller.system; ...@@ -3,6 +3,7 @@ package com.dsk.web.controller.system;
import cn.dev33.satoken.annotation.SaCheckLogin; import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaIgnore; import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.lang.RegexPool; import cn.hutool.core.lang.RegexPool;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
...@@ -80,6 +81,38 @@ public class SysLoginController { ...@@ -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 { ...@@ -118,6 +151,11 @@ public class SysLoginController {
return R.ok(new ArrayList<>()); return R.ok(new ArrayList<>());
} }
List<SysTenantVo> tenantList=loginService.tenantListByAccount(phone); List<SysTenantVo> tenantList=loginService.tenantListByAccount(phone);
if(CollectionUtil.isNotEmpty(tenantList)){
for (SysTenantVo sysTenantVo : tenantList) {
sysTenantVo.setCompanyName("");
}
}
return R.ok(tenantList); return R.ok(tenantList);
} }
...@@ -150,35 +188,6 @@ public class SysLoginController { ...@@ -150,35 +188,6 @@ public class SysLoginController {
return R.ok(MapUtil.of("tenantId",defaultTenant)); 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 { ...@@ -39,7 +39,8 @@ public class SysMenuController extends BaseController {
@SaCheckPermission("system:menu:list") @SaCheckPermission("system:menu:list")
@GetMapping("/list") @GetMapping("/list")
public R<List<SysMenu>> list(SysMenu menu) { 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); return R.ok(menus);
} }
......
...@@ -84,7 +84,7 @@ public class SysTenantController extends BaseController { ...@@ -84,7 +84,7 @@ public class SysTenantController extends BaseController {
@PostMapping() @PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody SysTenantBo bo) { public R<Void> add(@Validated(AddGroup.class) @RequestBody SysTenantBo bo) {
if (!tenantService.checkCompanyNameUnique(bo)) { if (!tenantService.checkCompanyNameUnique(bo)) {
return R.fail("新增租户'" + bo.getCompanyName() + "'失败,企业名称已存在"); return R.fail("新增企业'" + bo.getCompanyName() + "'失败,企业名称已存在");
} }
return toAjax(TenantHelper.ignore(() -> tenantService.insertByBo(bo))); return toAjax(TenantHelper.ignore(() -> tenantService.insertByBo(bo)));
} }
...@@ -100,7 +100,7 @@ public class SysTenantController extends BaseController { ...@@ -100,7 +100,7 @@ public class SysTenantController extends BaseController {
public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysTenantBo bo) { public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysTenantBo bo) {
tenantService.checkTenantAllowed(bo.getTenantId()); tenantService.checkTenantAllowed(bo.getTenantId());
if (!tenantService.checkCompanyNameUnique(bo)) { if (!tenantService.checkCompanyNameUnique(bo)) {
return R.fail("修改租户'" + bo.getCompanyName() + "'失败,公司名称已存在"); return R.fail("修改企业'" + bo.getCompanyName() + "'失败,公司名称已存在");
} }
return toAjax(tenantService.updateByBo(bo)); return toAjax(tenantService.updateByBo(bo));
} }
...@@ -162,8 +162,8 @@ public class SysTenantController extends BaseController { ...@@ -162,8 +162,8 @@ public class SysTenantController extends BaseController {
@SaCheckPermission("system:tenant:edit") @SaCheckPermission("system:tenant:edit")
@Log(title = "租户", businessType = BusinessType.UPDATE) @Log(title = "租户", businessType = BusinessType.UPDATE)
@GetMapping("/syncTenantPackage") @GetMapping("/syncTenantPackage")
public R<Void> syncTenantPackage(@NotBlank(message = "租户ID不能为空") String tenantId, public R<Void> syncTenantPackage(@NotBlank(message = "企业ID不能为空") String tenantId,
@NotNull(message = "套餐ID不能为空") Long packageId) { @NotNull(message = "企业方案ID不能为空") Long packageId) {
return toAjax(TenantHelper.ignore(() -> tenantService.syncTenantPackage(tenantId, packageId))); return toAjax(TenantHelper.ignore(() -> tenantService.syncTenantPackage(tenantId, packageId)));
} }
......
...@@ -2,6 +2,7 @@ package com.dsk.web.controller.system; ...@@ -2,6 +2,7 @@ package com.dsk.web.controller.system;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaCheckRole; import cn.dev33.satoken.annotation.SaCheckRole;
import cn.hutool.core.util.ObjectUtil;
import com.dsk.common.annotation.Log; import com.dsk.common.annotation.Log;
import com.dsk.common.annotation.RepeatSubmit; import com.dsk.common.annotation.RepeatSubmit;
import com.dsk.common.constant.TenantConstants; import com.dsk.common.constant.TenantConstants;
...@@ -12,6 +13,7 @@ import com.dsk.common.core.page.TableDataInfo; ...@@ -12,6 +13,7 @@ import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.core.validate.AddGroup; import com.dsk.common.core.validate.AddGroup;
import com.dsk.common.core.validate.EditGroup; import com.dsk.common.core.validate.EditGroup;
import com.dsk.common.enums.BusinessType; import com.dsk.common.enums.BusinessType;
import com.dsk.system.domain.SysTenantPackage;
import com.dsk.system.domain.bo.SysTenantPackageBo; import com.dsk.system.domain.bo.SysTenantPackageBo;
import com.dsk.system.domain.vo.SysTenantPackageSelectVo; import com.dsk.system.domain.vo.SysTenantPackageSelectVo;
import com.dsk.system.domain.vo.SysTenantPackageVo; import com.dsk.system.domain.vo.SysTenantPackageVo;
...@@ -94,6 +96,9 @@ public class SysTenantPackageController extends BaseController { ...@@ -94,6 +96,9 @@ public class SysTenantPackageController extends BaseController {
@RepeatSubmit() @RepeatSubmit()
@PostMapping() @PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody SysTenantPackageBo bo) { public R<Void> add(@Validated(AddGroup.class) @RequestBody SysTenantPackageBo bo) {
if (tenantPackageService.checkDeptNameUnique(bo)) {
return R.fail("新增方案'" + bo.getPackageName() + "'失败,方案名称已存在");
}
return toAjax(tenantPackageService.insertByBo(bo)); return toAjax(tenantPackageService.insertByBo(bo));
} }
...@@ -106,6 +111,10 @@ public class SysTenantPackageController extends BaseController { ...@@ -106,6 +111,10 @@ public class SysTenantPackageController extends BaseController {
@RepeatSubmit() @RepeatSubmit()
@PutMapping() @PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysTenantPackageBo bo) { 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)); return toAjax(tenantPackageService.updateByBo(bo));
} }
......
...@@ -125,7 +125,7 @@ public class SysUserController extends BaseController { ...@@ -125,7 +125,7 @@ public class SysUserController extends BaseController {
@PostMapping("/importTemplate") @PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response) { public void importTemplate(HttpServletResponse response) {
List<Object> list = new ArrayList<>(); List<Object> list = new ArrayList<>();
list.add(new SysUserImportVo("测试部门", "测试用户昵称", "18888888888", "测试角色")); list.add(new SysUserImportVo("测试组织", "测试用户昵称", "18888888888", "测试角色"));
ExcelUtil.exportTemplate(list, "用户数据", "excel/userImportTemplate.xlsx", response); 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 ...@@ -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 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 xcx.code.not.blank=Mini program code cannot be blank
##\u79DF\u6237 ##\u79DF\u6237
tenant.number.not.blank=company number cannot be blank company.number.not.blank=company number cannot be blank
tenant.not.exists=Sorry, your company does not exist. Please contact the administrator company.not.exists=Sorry, your company does not exist. Please contact the administrator
tenant.blocked=Sorry, your company is disabled. Please contact the administrator company.blocked=Sorry, your company is disabled. Please contact the administrator
tenant.expired=Sorry, your company has expired. Please contact the administrator. company.expired=Sorry, your company has expired. Please contact the administrator.
\ No newline at end of file \ No newline at end of file
...@@ -48,7 +48,7 @@ email.code.retry.limit.count=\u90AE\u7BB1\u9A8C\u8BC1\u7801\u8F93\u5165\u9519\u8 ...@@ -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 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 xcx.code.not.blank=\u5C0F\u7A0B\u5E8Fcode\u4E0D\u80FD\u4E3A\u7A7A
##\u79DF\u6237 ##\u79DF\u6237
tenant.number.not.blank=\u4F01\u4E1A\u7F16\u53F7\u4E0D\u80FD\u4E3A\u7A7A company.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 company.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 company.blocked=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u4F01\u4E1A\u5DF2\u505C\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 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 \ No newline at end of file
...@@ -77,7 +77,7 @@ public @interface Excel ...@@ -77,7 +77,7 @@ public @interface Excel
/** /**
* 当值为空时,字段的默认值 * 当值为空时,字段的默认值
*/ */
public String defaultValue() default ""; public String defaultValue() default "-";
/** /**
* 提示信息 * 提示信息
......
...@@ -77,5 +77,10 @@ public interface Constants { ...@@ -77,5 +77,10 @@ public interface Constants {
*/ */
Long TOP_PARENT_ID = 0L; 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 { ...@@ -48,6 +48,8 @@ public class TableDataInfo<T> implements Serializable {
public TableDataInfo(List<T> list, long total) { public TableDataInfo(List<T> list, long total) {
this.rows = list; this.rows = list;
this.total = total; this.total = total;
this.code = HttpStatus.HTTP_OK;
this.msg = "查询成功";
} }
public static <T> TableDataInfo<T> build(IPage<T> page) { public static <T> TableDataInfo<T> build(IPage<T> page) {
......
package com.dsk.common.tenant.helper; package com.dsk.common.tenant.helper;
import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.spring.SpringMVCUtil; import cn.dev33.satoken.spring.SpringMVCUtil;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import com.alibaba.ttl.TransmittableThreadLocal; import com.alibaba.ttl.TransmittableThreadLocal;
...@@ -9,10 +8,7 @@ import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; ...@@ -9,10 +8,7 @@ import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper;
import com.dsk.common.constant.GlobalConstants; import com.dsk.common.constant.GlobalConstants;
import com.dsk.common.helper.LoginHelper; import com.dsk.common.helper.LoginHelper;
import com.dsk.common.utils.StringUtils; import com.dsk.common.utils.StringUtils;
import com.dsk.common.utils.redis.RedisUtils;
import com.dsk.common.utils.spring.SpringUtils; import com.dsk.common.utils.spring.SpringUtils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
......
...@@ -7,6 +7,7 @@ import cn.hutool.core.util.StrUtil; ...@@ -7,6 +7,7 @@ import cn.hutool.core.util.StrUtil;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.springframework.util.AntPathMatcher; import org.springframework.util.AntPathMatcher;
import org.springframework.util.ObjectUtils;
import java.util.*; import java.util.*;
import java.util.function.Function; import java.util.function.Function;
...@@ -327,4 +328,9 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils { ...@@ -327,4 +328,9 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
return oldStr.replace(str, "<font color='#FF204E'>" + str + "</font>"); 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 @@ ...@@ -28,6 +28,16 @@
<artifactId>dsk-sms</artifactId> <artifactId>dsk-sms</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.dsk</groupId>
<artifactId>dsk-oss</artifactId>
</dependency>
<dependency>
<groupId>com.dsk</groupId>
<artifactId>dsk-system</artifactId>
</dependency>
<!-- 短信 用哪个导入哪个依赖 --> <!-- 短信 用哪个导入哪个依赖 -->
<!-- <dependency>--> <!-- <dependency>-->
<!-- <groupId>com.aliyun</groupId>--> <!-- <groupId>com.aliyun</groupId>-->
......
...@@ -310,6 +310,21 @@ public class ExcelUtils<T> { ...@@ -310,6 +310,21 @@ public class ExcelUtils<T> {
exportExcel(response); 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://"; private static final String FILE_PATH = "D://";
/** /**
......
...@@ -2,21 +2,30 @@ package com.dsk.jsk.controller; ...@@ -2,21 +2,30 @@ package com.dsk.jsk.controller;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import com.dsk.biz.utils.ExcelUtils; import com.dsk.biz.utils.ExcelUtils;
import com.dsk.common.constant.Constants;
import com.dsk.common.core.controller.BaseController; import com.dsk.common.core.controller.BaseController;
import com.dsk.common.core.domain.AjaxResult; import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.core.domain.R; import com.dsk.common.core.domain.R;
import com.dsk.common.core.page.TableDataInfo; import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.core.service.OssService;
import com.dsk.jsk.domain.JskCombineBidPageDto; import com.dsk.jsk.domain.JskCombineBidPageDto;
import com.dsk.jsk.domain.JskCombineCertificateDto; import com.dsk.jsk.domain.JskCombineCertificateDto;
import com.dsk.jsk.domain.JskCombineSearchDto; import com.dsk.jsk.domain.JskCombineSearchDto;
import com.dsk.jsk.domain.vo.JskCombineBidProjectExportVo; import com.dsk.jsk.domain.vo.JskCombineBidProjectExportVo;
import com.dsk.jsk.domain.vo.JskCombineWinBidProjectExportVo; import com.dsk.jsk.domain.vo.JskCombineWinBidProjectExportVo;
import com.dsk.jsk.service.JskCombineInfoService; 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 lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -33,6 +42,8 @@ public class JskCombineInfoController extends BaseController { ...@@ -33,6 +42,8 @@ public class JskCombineInfoController extends BaseController {
@Autowired @Autowired
private JskCombineInfoService baseService; private JskCombineInfoService baseService;
@Autowired
private ISysOssService ossService;
/** /**
* 集团成员列表 * 集团成员列表
...@@ -86,7 +97,7 @@ public class JskCombineInfoController extends BaseController { ...@@ -86,7 +97,7 @@ public class JskCombineInfoController extends BaseController {
* 集团户搜索 * 集团户搜索
*/ */
@PostMapping("/index") @PostMapping("/index")
public AjaxResult index(@RequestBody Map<String,Object> object) { public AjaxResult index(@RequestBody Map<String, Object> object) {
return baseService.index(object); return baseService.index(object);
} }
...@@ -110,7 +121,7 @@ public class JskCombineInfoController extends BaseController { ...@@ -110,7 +121,7 @@ public class JskCombineInfoController extends BaseController {
* 查央企子公司 翻页 * 查央企子公司 翻页
*/ */
@PostMapping("/centralEnterprse/child/page") @PostMapping("/centralEnterprse/child/page")
public AjaxResult centralEnterprseChildPage(@RequestBody Map<String,Object> object) { public AjaxResult centralEnterprseChildPage(@RequestBody Map<String, Object> object) {
return baseService.centralEnterprseChildPage(object); return baseService.centralEnterprseChildPage(object);
} }
...@@ -118,7 +129,7 @@ public class JskCombineInfoController extends BaseController { ...@@ -118,7 +129,7 @@ public class JskCombineInfoController extends BaseController {
* 查地方国企 * 查地方国企
*/ */
@PostMapping("/centralEnterprse/local") @PostMapping("/centralEnterprse/local")
public AjaxResult centralEnterprseLocal(@RequestBody Map<String,Object> object) { public AjaxResult centralEnterprseLocal(@RequestBody Map<String, Object> object) {
return baseService.centralEnterprseLocal(object); return baseService.centralEnterprseLocal(object);
} }
...@@ -126,7 +137,7 @@ public class JskCombineInfoController extends BaseController { ...@@ -126,7 +137,7 @@ public class JskCombineInfoController extends BaseController {
* 查地方国企 翻页 * 查地方国企 翻页
*/ */
@PostMapping("/centralEnterprse/local/page") @PostMapping("/centralEnterprse/local/page")
public AjaxResult centralEnterprseLocalPage(@RequestBody Map<String,Object> object) { public AjaxResult centralEnterprseLocalPage(@RequestBody Map<String, Object> object) {
return baseService.centralEnterprseLocalPage(object); return baseService.centralEnterprseLocalPage(object);
} }
...@@ -142,7 +153,7 @@ public class JskCombineInfoController extends BaseController { ...@@ -142,7 +153,7 @@ public class JskCombineInfoController extends BaseController {
* 民营企业 翻页 * 民营企业 翻页
*/ */
@PostMapping("/centralEnterprse/social/page") @PostMapping("/centralEnterprse/social/page")
public AjaxResult centralEnterprseSocialPage(@RequestBody Map<String,Object> object) { public AjaxResult centralEnterprseSocialPage(@RequestBody Map<String, Object> object) {
return baseService.centralEnterprseSocialPage(object); return baseService.centralEnterprseSocialPage(object);
} }
...@@ -172,16 +183,34 @@ public class JskCombineInfoController extends BaseController { ...@@ -172,16 +183,34 @@ public class JskCombineInfoController extends BaseController {
/** /**
* 集团招标分页列表 * 集团招标分页列表
*/ */
@PostMapping("/bidPage") @PostMapping("/bidPage")
public TableDataInfo bidPage(@RequestBody JskCombineBidPageDto dto) throws Exception { public TableDataInfo bidPage(@RequestBody JskCombineBidPageDto dto) throws Exception {
return baseService.bidPage(dto); 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 *@Description: 获取集团logo
*@Param: *@Param:
*@return: com.dsk.common.core.domain.R *@return: com.dsk.common.core.domain.R
*@Author: Dgm *@Author: Dgm
*@date: 2023/9/12 16:05 *@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; ...@@ -8,6 +8,7 @@ import com.dsk.common.core.domain.R;
import com.dsk.common.core.page.TableDataInfo; import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.exception.ServiceException; import com.dsk.common.exception.ServiceException;
import com.dsk.common.utils.DskOpenApiUtil; import com.dsk.common.utils.DskOpenApiUtil;
import com.dsk.common.utils.StringUtils;
import com.dsk.jsk.domain.JskCombineBidPageDto; import com.dsk.jsk.domain.JskCombineBidPageDto;
import com.dsk.jsk.domain.JskCombineCertificateDto; import com.dsk.jsk.domain.JskCombineCertificateDto;
import com.dsk.jsk.domain.JskCombineSearchDto; import com.dsk.jsk.domain.JskCombineSearchDto;
...@@ -137,10 +138,15 @@ public class JskCombineInfoService { ...@@ -137,10 +138,15 @@ public class JskCombineInfoService {
JskCombineWinBidProjectExportVo vo = new JskCombineWinBidProjectExportVo(); JskCombineWinBidProjectExportVo vo = new JskCombineWinBidProjectExportVo();
vo.setId(i + 1); vo.setId(i + 1);
vo.setBidTime(MapUtil.getDate(list.get(i),"bidTime")); 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.setStockPercent(MapUtil.getDouble(list.get(i),"stockPercent"));
vo.setMemberLevel(MapUtil.getStr(list.get(i),"memberLevel")); 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.setBidAmount(MapUtil.getDouble(list.get(i),"bidAmount"));
vo.setAddress(MapUtil.getStr(list.get(i),"address")); vo.setAddress(MapUtil.getStr(list.get(i),"address"));
vo.setBoundType(MapUtil.getStr(list.get(i),"boundType")); vo.setBoundType(MapUtil.getStr(list.get(i),"boundType"));
...@@ -156,7 +162,7 @@ public class JskCombineInfoService { ...@@ -156,7 +162,7 @@ public class JskCombineInfoService {
if (ObjectUtils.isEmpty(dto.getPageSize())) throw new ServiceException("导出条数不能为空!"); if (ObjectUtils.isEmpty(dto.getPageSize())) throw new ServiceException("导出条数不能为空!");
if (dto.getPageSize() > 2000) dto.setPageSize(2000); if (dto.getPageSize() > 2000) dto.setPageSize(2000);
dto.setPageNum(1); 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("导出失败,系统错误!"); if (ObjectUtils.isEmpty(map.get("data"))) throw new ServiceException("导出失败,系统错误!");
Map<String, Object> data = BeanUtil.beanToMap(map.get("data")); Map<String, Object> data = BeanUtil.beanToMap(map.get("data"));
if (ObjectUtils.isEmpty(data.get("list"))) throw new ServiceException("导出失败,系统错误!"); if (ObjectUtils.isEmpty(data.get("list"))) throw new ServiceException("导出失败,系统错误!");
...@@ -168,15 +174,22 @@ public class JskCombineInfoService { ...@@ -168,15 +174,22 @@ public class JskCombineInfoService {
JskCombineBidProjectExportVo vo = new JskCombineBidProjectExportVo(); JskCombineBidProjectExportVo vo = new JskCombineBidProjectExportVo();
vo.setId(i + 1); vo.setId(i + 1);
vo.setIssueTime(MapUtil.getDate(list.get(i),"issueTime")); 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.setStockPercent(MapUtil.getDouble(list.get(i),"stockPercent"));
vo.setMemberLevel(MapUtil.getStr(list.get(i),"memberLevel")); 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.setBidAmount(MapUtil.getDouble(list.get(i),"bidAmount"));
vo.setAddress(MapUtil.getStr(list.get(i),"address")); vo.setAddress(MapUtil.getStr(list.get(i),"address"));
vo.setSubjectMatter(MapUtil.getStr(list.get(i),"subjectMatter")); vo.setSubjectMatter(MapUtil.getStr(list.get(i),"subjectMatter"));
vo.setProjectType(MapUtil.getStr(list.get(i),"projectType")); vo.setProjectType(MapUtil.getStr(list.get(i),"projectType"));
vo.setAgency(MapUtil.getStr(list.get(i),"agency"));
result.add(vo); result.add(vo);
} }
return result; return result;
......
package com.dsk.search.controller; package com.dsk.search.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.dsk.biz.utils.ExcelUtils;
import com.dsk.common.core.domain.AjaxResult; 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.bo.ComposeQueryDto;
import com.dsk.jsk.domain.vo.ImportantProjectExportVo;
import com.dsk.search.service.BusinessOpportunityRadarService; import com.dsk.search.service.BusinessOpportunityRadarService;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/** /**
...@@ -157,4 +163,31 @@ public class BusinessOpportunityRadarController { ...@@ -157,4 +163,31 @@ public class BusinessOpportunityRadarController {
} }
return opportunityRadarService.importantPage(object); 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; package com.dsk.search.service;
import cn.hutool.core.bean.BeanUtil; 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.alibaba.fastjson2.JSONObject;
import com.dsk.common.core.domain.AjaxResult; import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.exception.ServiceException;
import com.dsk.common.utils.DskOpenApiUtil; 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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
...@@ -98,4 +105,59 @@ public class BusinessOpportunityRadarService { ...@@ -98,4 +105,59 @@ public class BusinessOpportunityRadarService {
Map<String, Object> map = dskOpenApiUtil.requestBody("/nationzj/bondProject/importantPage", object); Map<String, Object> map = dskOpenApiUtil.requestBody("/nationzj/bondProject/importantPage", object);
return BeanUtil.toBean(map, AjaxResult.class); 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 @@ ...@@ -40,10 +40,12 @@
"axios": "0.24.0", "axios": "0.24.0",
"clipboard": "2.0.8", "clipboard": "2.0.8",
"core-js": "3.25.3", "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-resize-detector": "^1.2.4",
"element-ui": "2.15.12", "element-ui": "2.15.12",
"file-saver": "2.0.5", "file-saver": "2.0.5",
"flatted": "^3.2.7",
"fuse.js": "6.4.3", "fuse.js": "6.4.3",
"highlight.js": "9.18.5", "highlight.js": "9.18.5",
"jquery": "^3.7.0", "jquery": "^3.7.0",
...@@ -60,7 +62,7 @@ ...@@ -60,7 +62,7 @@
"vue-cropper": "0.5.5", "vue-cropper": "0.5.5",
"vue-meta": "2.4.0", "vue-meta": "2.4.0",
"vue-router": "3.4.9", "vue-router": "3.4.9",
"vuedraggable": "2.24.3", "vuedraggable": "^2.24.3",
"vuex": "3.6.0" "vuex": "3.6.0"
}, },
"devDependencies": { "devDependencies": {
......
...@@ -118,7 +118,8 @@ ...@@ -118,7 +118,8 @@
top: 0; top: 0;
width: 51%; width: 51%;
height: 100%; height: 100%;
background: #7171C6; /*background: #7171C6;*/
background: #46A5FF;
z-index: 1000; z-index: 1000;
-webkit-transform: translateX(0); -webkit-transform: translateX(0);
-ms-transform: translateX(0); -ms-transform: translateX(0);
...@@ -197,12 +198,12 @@ ...@@ -197,12 +198,12 @@
</head> </head>
<body> <body>
<div id="app"> <div id="app">
<!-- <div id="loader-wrapper"> <div id="loader-wrapper">
<div id="loader"></div> <div id="loader"></div>
<div class="loader-section section-left"></div> <div class="loader-section section-left"></div>
<div class="loader-section section-right"></div> <div class="loader-section section-right"></div>
<div class="load_title">正在加载系统资源,请耐心等待</div> <div class="load_title">正在加载央企数字化经营管理系统</div>
</div>--> </div>
</div> </div>
</body> </body>
</html> </html>
import request from '@/utils/request' 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) { export function importData(param) {
return request({ return request({
......
...@@ -50,3 +50,20 @@ export function businessList(data) { ...@@ -50,3 +50,20 @@ export function businessList(data) {
data: 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) { ...@@ -80,3 +80,35 @@ export function tenderPage(data) {
data: 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) { ...@@ -147,7 +147,7 @@ let centralEnterprselocalPage= function centralEnterprselocalPage(param) {
data: param data: param
}) })
} }
// 民营集团 // 其他集团
let centralEnterprsesocial= function centralEnterprsesocial(param) { let centralEnterprsesocial= function centralEnterprsesocial(param) {
return request({ return request({
url: '/combine/info/centralEnterprse/social', url: '/combine/info/centralEnterprse/social',
...@@ -155,7 +155,7 @@ let centralEnterprsesocial= function centralEnterprsesocial(param) { ...@@ -155,7 +155,7 @@ let centralEnterprsesocial= function centralEnterprsesocial(param) {
data: param data: param
}) })
} }
// 民营集团更多 // 其他集团更多
let centralEnterprsesocialPage= function centralEnterprsesocialPage(param) { let centralEnterprsesocialPage= function centralEnterprsesocialPage(param) {
return request({ return request({
url: '/combine/info/centralEnterprse/social/page', url: '/combine/info/centralEnterprse/social/page',
......
import request from "@/utils/request"; 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) { export function bigWinningBidsPage(data) {
return request({ return request({
......
...@@ -219,3 +219,52 @@ export function allRecord(param) { ...@@ -219,3 +219,52 @@ export function allRecord(param) {
params: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) { ...@@ -196,8 +196,55 @@ let getUipIdByCid = function getUipIdByCid(param) {
data: 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 { export default {
radarExport,
getImportantDetail,
getImportantSelect,
getImportantCondition,
getImportantPage,
importData, importData,
searchDic, searchDic,
bondProjectPage, bondProjectPage,
......
This diff is collapsed.
...@@ -121,7 +121,7 @@ aside { ...@@ -121,7 +121,7 @@ aside {
//main-container全局样式 //main-container全局样式
.app-container { .app-container {
padding: 16px; //padding: 16px;
//margin-top: 56px; //margin-top: 56px;
} }
...@@ -223,6 +223,7 @@ ul, li { ...@@ -223,6 +223,7 @@ ul, li {
.app-container { .app-container {
margin: 12px 24px; margin: 12px 24px;
background-color: #f5f5f5; background-color: #f5f5f5;
padding-bottom: 16px !important;
.el-input__inner{ .el-input__inner{
border-color: #D9D9D9; border-color: #D9D9D9;
color: #232323; color: #232323;
...@@ -262,6 +263,19 @@ ul, li { ...@@ -262,6 +263,19 @@ ul, li {
} }
} }
.query-ability{ .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{ span{
font-size: 14px; font-size: 14px;
color: #232323; color: #232323;
...@@ -407,6 +421,18 @@ ul, li { ...@@ -407,6 +421,18 @@ ul, li {
background: #566380; 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 @@ ...@@ -977,6 +977,11 @@
font-size: 12px; font-size: 12px;
} }
} }
.el-form {
.el-form-item--small.el-form-item {
margin-bottom: 0;
}
}
} }
.p10{ .p10{
padding: 0 10px; padding: 0 10px;
...@@ -1171,9 +1176,6 @@ ...@@ -1171,9 +1176,6 @@
} }
.none{display: none} .none{display: none}
.el-popper[x-placement^=bottom]{
margin-top: 0 !important;
}
.el-dialog__body{ .el-dialog__body{
padding-top: 14px; padding-top: 14px;
padding-bottom: 18px; padding-bottom: 18px;
......
This diff is collapsed.
...@@ -43,7 +43,7 @@ export default { ...@@ -43,7 +43,7 @@ export default {
.app-main { .app-main {
/* 84 = navbar + tags-view = 50 + 34 */ /* 84 = navbar + tags-view = 50 + 34 */
min-height: calc(100vh - 68px); min-height: calc(100vh - 68px);
min-width:1440px; min-width:1240px;
background: #F5F5F5; background: #F5F5F5;
overflow: initial; overflow: initial;
} }
......
...@@ -126,7 +126,7 @@ export default { ...@@ -126,7 +126,7 @@ export default {
overflow: inherit; overflow: inherit;
/*position: relative;*/ /*position: relative;*/
background: #fff; background: #fff;
box-shadow: 0 1px 4px rgba(0,21,41,.08); /*box-shadow: 0 1px 4px rgba(0,21,41,.08);*/
position: fixed; position: fixed;
top:0; top:0;
z-index: 999; z-index: 999;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<div :class="classObj" class="app-wrapper" :style="{'--current-color': theme}"> <div :class="classObj" class="app-wrapper" :style="{'--current-color': theme}">
<div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside"/> <div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside"/>
<sidebar v-if="!sidebar.hide" class="sidebar-container" @handleBar="handleSideBar" id="sidebar"/> <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}"> <div :class="{'fixed-header':fixedHeader}">
<navbar :offsetWidth="offsetWidth"/> <navbar :offsetWidth="offsetWidth"/>
</div> </div>
...@@ -21,6 +21,7 @@ import ResizeMixin from './mixin/ResizeHandler' ...@@ -21,6 +21,7 @@ import ResizeMixin from './mixin/ResizeHandler'
import { mapState } from 'vuex' import { mapState } from 'vuex'
import variables from '@/assets/styles/variables.scss' import variables from '@/assets/styles/variables.scss'
import elementResizeDetectorMaker from "element-resize-detector" import elementResizeDetectorMaker from "element-resize-detector"
import { parse,stringify } from 'flatted';
export default { export default {
name: 'Layout', name: 'Layout',
components: { components: {
...@@ -62,7 +63,13 @@ export default { ...@@ -62,7 +63,13 @@ export default {
mounted(){ mounted(){
this.$nextTick(() => { this.$nextTick(() => {
this.listenSider() 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: { methods: {
handleClickOutside() { handleClickOutside() {
...@@ -128,4 +135,13 @@ export default { ...@@ -128,4 +135,13 @@ export default {
.mobile .fixed-header { .mobile .fixed-header {
width: 100%; width: 100%;
} }
.EnterpriseData{
min-width: 1710px;
}
.width1350{
min-width: 1350px;
}
.width1240{
min-width: 1240px;
}
</style> </style>
...@@ -13,7 +13,7 @@ import router from './router' ...@@ -13,7 +13,7 @@ import router from './router'
import directive from './directive' // directive import directive from './directive' // directive
import plugins from './plugins' // plugins import plugins from './plugins' // plugins
import { download } from '@/utils/request' import { download } from '@/utils/request'
import horizontalScroll from 'el-table-horizontal-scroll'
import './assets/icons' // icon import './assets/icons' // icon
import './permission' // permission control import './permission' // permission control
...@@ -59,6 +59,7 @@ Vue.component('FileUpload', FileUpload) ...@@ -59,6 +59,7 @@ Vue.component('FileUpload', FileUpload)
Vue.component('ImageUpload', ImageUpload) Vue.component('ImageUpload', ImageUpload)
Vue.component('ImagePreview', ImagePreview) Vue.component('ImagePreview', ImagePreview)
Vue.use(horizontalScroll)
Vue.use(directive) Vue.use(directive)
Vue.use(plugins) Vue.use(plugins)
Vue.use(VueMeta) Vue.use(VueMeta)
......
...@@ -63,7 +63,7 @@ export default { ...@@ -63,7 +63,7 @@ export default {
saveAs(text, name, opts); saveAs(text, name, opts);
}, },
exportByPost(url, params){ exportByPost(url, params,name){
var url = baseURL + url var url = baseURL + url
axios({ axios({
method: 'post', method: 'post',
...@@ -72,8 +72,12 @@ export default { ...@@ -72,8 +72,12 @@ export default {
data: params, data: params,
headers: { 'Authorization': 'Bearer ' + getToken() } headers: { 'Authorization': 'Bearer ' + getToken() }
}).then(res => { }).then(res => {
const blob = new Blob([res.data], { type: 'application/octet-stream/pdf/doc/xlsx/xls/docx' }) const blob = new Blob([res.data], { type: 'application/octet-stream/pdf/doc/xlsx/xls/docx/excel' })
this.saveAs(blob, decodeURI(res.headers['download-filename'])) if(name){
this.saveAs(blob, name)
}else {
this.saveAs(blob, decodeURI(res.headers['download-filename']))
}
}) })
}, },
async printErrMsg(data) { async printErrMsg(data) {
......
...@@ -70,7 +70,7 @@ export const constantRoutes = [ ...@@ -70,7 +70,7 @@ export const constantRoutes = [
path: 'index', path: 'index',
component: () => import('@/views/index'), component: () => import('@/views/index'),
name: 'Index', name: 'Index',
meta: { title: '首页', icon: 'index', } meta: { title: '首页', icon: 'index',noCache: false }
} }
] ]
}, },
...@@ -88,6 +88,34 @@ export const constantRoutes = [ ...@@ -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', path: '/user',
component: Layout, component: Layout,
...@@ -127,7 +155,7 @@ export const constantRoutes = [ ...@@ -127,7 +155,7 @@ export const constantRoutes = [
path: '/enterprise/:id', path: '/enterprise/:id',
component: () => import('@/views/detail/party-a/index'), component: () => import('@/views/detail/party-a/index'),
name: 'PartyA', name: 'PartyA',
meta: { title: '企业详情', icon: 'enterprise', noCache: false }, meta: { title: '甲方详情', icon: 'enterpriseData', noCache: false },
} }
] ]
}, },
...@@ -291,6 +319,20 @@ export const constantRoutes = [ ...@@ -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', path: '/Bidding',
component: Layout, component: Layout,
......
import { parse,stringify } from 'flatted';
const state = { const state = {
visitedViews: [], visitedViews: [],
cachedViews: [], cachedViews: [],
...@@ -20,6 +22,28 @@ const mutations = { ...@@ -20,6 +22,28 @@ const mutations = {
title: view.meta.title || 'no-name' 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) => { ADD_CACHED_VIEW: (state, view) => {
if (state.cachedViews.includes(view.name)) return if (state.cachedViews.includes(view.name)) return
...@@ -31,6 +55,8 @@ const mutations = { ...@@ -31,6 +55,8 @@ const mutations = {
for (const [i, v] of state.visitedViews.entries()) { for (const [i, v] of state.visitedViews.entries()) {
if (v.path === view.path) { if (v.path === view.path) {
state.visitedViews.splice(i, 1) state.visitedViews.splice(i, 1)
let visitedViews = JSON.parse(JSON.stringify(state.visitedViews))
localStorage.setItem("views",JSON.stringify(visitedViews))
break break
} }
} }
......
...@@ -17,7 +17,7 @@ const service = axios.create({ ...@@ -17,7 +17,7 @@ const service = axios.create({
// axios中请求配置有baseURL选项,表示请求URL公共部分 // axios中请求配置有baseURL选项,表示请求URL公共部分
baseURL: process.env.VUE_APP_BASE_API, baseURL: process.env.VUE_APP_BASE_API,
// 超时 // 超时
timeout: 10000 timeout: 20000
}) })
// request拦截器 // request拦截器
...@@ -37,6 +37,10 @@ service.interceptors.request.use(config => { ...@@ -37,6 +37,10 @@ service.interceptors.request.use(config => {
config.params = {}; config.params = {};
config.url = url; 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')) { if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
const requestObj = { const requestObj = {
url: config.url, url: config.url,
...@@ -68,6 +72,24 @@ service.interceptors.request.use(config => { ...@@ -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 => { service.interceptors.response.use(res => {
const apiList = ['/login', '/system/user/profile/updatePwd'] //需要提示错误的接口 const apiList = ['/login', '/system/user/profile/updatePwd'] //需要提示错误的接口
...@@ -102,6 +124,7 @@ service.interceptors.response.use(res => { ...@@ -102,6 +124,7 @@ service.interceptors.response.use(res => {
Notification.error({ title: msg }) Notification.error({ title: msg })
return Promise.reject('error') return Promise.reject('error')
} else { } else {
cancelPending(res.config)
return res.data return res.data
} }
},error => { },error => {
...@@ -117,7 +140,7 @@ service.interceptors.response.use(res => { ...@@ -117,7 +140,7 @@ service.interceptors.response.use(res => {
if(message=='数据正在处理,请勿重复提交'){ //重复提交,提示样式特殊处理 if(message=='数据正在处理,请勿重复提交'){ //重复提交,提示样式特殊处理
Message({ message: message, type: 'warning', duration: 5 * 1000 }) Message({ message: message, type: 'warning', duration: 5 * 1000 })
}else{ }else{
Message({ message: message, type: 'error', duration: 5 * 1000 }) // Message({ message: message, type: 'error', duration: 5 * 1000 })
} }
if(error.message.indexOf('timeout')<0 ){ //超时报错不提示 if(error.message.indexOf('timeout')<0 ){ //超时报错不提示
......
...@@ -51,6 +51,10 @@ export default { ...@@ -51,6 +51,10 @@ export default {
type: String, type: String,
default: '请选择' default: '请选择'
}, },
'moneyValue': {
type: String,
default: ''
},
'ref-str': { 'ref-str': {
type: String, type: String,
default: `timeselect${String(Math.random(0, 100)).slice(2)}`, default: `timeselect${String(Math.random(0, 100)).slice(2)}`,
...@@ -92,6 +96,9 @@ export default { ...@@ -92,6 +96,9 @@ export default {
if(this.moneyList&&this.moneyList.length>0){ if(this.moneyList&&this.moneyList.length>0){
this.options = this.moneyList this.options = this.moneyList
} }
if(this.moneyValue){
this.value = this.moneyValue
}
}, },
destroyed() { destroyed() {
const app = document.getElementById('app') const app = document.getElementById('app')
...@@ -278,7 +285,7 @@ export default { ...@@ -278,7 +285,7 @@ export default {
.options-block { .options-block {
position: absolute; position: absolute;
margin-top: 12px; margin-top: 3px;
min-width: 120px; min-width: 120px;
font-size: 14px; font-size: 14px;
color: #666666; color: #666666;
...@@ -411,20 +418,20 @@ export default { ...@@ -411,20 +418,20 @@ export default {
width: 186px; width: 186px;
color: #606266; color: #606266;
text-indent: 0; text-indent: 0;
padding: 16px; padding: 14px;
padding-top: 0px; padding-top: 0px;
border: 1px solid #e0e0e0; border: 1px solid #e0e0e0;
.popper_wrap { .popper_wrap {
margin-top: 16px; margin-top: 16px;
display: inline-block; display: inline-block;
.popper_input { .popper_input {
width: 100px; width: 90px;
display: inline-block; display: inline-block;
margin: 0px 8px; margin: 0px 8px;
line-height: 34px; line-height: 34px;
} }
.el-input__inner { .el-input__inner {
width: 100px; width: 90px;
} }
} }
input::-webkit-outer-spin-button, input::-webkit-outer-spin-button,
......
...@@ -46,6 +46,10 @@ export default { ...@@ -46,6 +46,10 @@ export default {
type: String, type: String,
default: '请选择', default: '请选择',
}, },
'timeValue': {
type: String,
default: '',
},
'ref-str': { 'ref-str': {
type: String, type: String,
default: `timeselect${String(Math.random(0, 100)).slice(2)}`, default: `timeselect${String(Math.random(0, 100)).slice(2)}`,
...@@ -61,7 +65,7 @@ export default { ...@@ -61,7 +65,7 @@ export default {
timeList: { timeList: {
type: Array, type: Array,
default: () => [], default: () => [],
} },
}, },
computed: { computed: {
isClear() { isClear() {
...@@ -106,6 +110,9 @@ export default { ...@@ -106,6 +110,9 @@ export default {
if(this.dateTo){ if(this.dateTo){
this.defaultValue = new Date(this.dateTo) this.defaultValue = new Date(this.dateTo)
} }
if(this.timeValue){
this.value = this.timeValue
}
this.handleAppClick() this.handleAppClick()
if(this.timeList&&this.timeList.length>0){ if(this.timeList&&this.timeList.length>0){
this.options = this.timeList this.options = this.timeList
...@@ -319,6 +326,9 @@ export default { ...@@ -319,6 +326,9 @@ export default {
left: -400px; left: -400px;
} }
} }
.el-date-editor{
left: -400px;
}
} }
.picker-block { .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 @@ ...@@ -18,7 +18,7 @@
</div> </div>
</div> </div>
<skeleton v-if="isSkeleton"></skeleton> <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" :data="tableData.rows"
stripe border stripe border
style="width: 100%"> style="width: 100%">
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
prop="index" prop="index"
label="序号" label="序号"
fixed="left" fixed="left"
width="47"> width="60">
<template slot-scope='scope'> <template slot-scope='scope'>
<span>{{ (searchParam.pageNum - 1) * searchParam.pageSize + scope.$index + 1 }}</span> <span>{{ (searchParam.pageNum - 1) * searchParam.pageSize + scope.$index + 1 }}</span>
</template> </template>
...@@ -51,7 +51,7 @@ ...@@ -51,7 +51,7 @@
<el-table-column <el-table-column
prop="cooperationProject" prop="cooperationProject"
label="合作项目" label="合作项目"
width="76"> width="90">
<template slot-scope="scope"> <template slot-scope="scope">
{{scope.row.cooperationProject || '--'}} {{scope.row.cooperationProject || '--'}}
</template> </template>
...@@ -59,7 +59,7 @@ ...@@ -59,7 +59,7 @@
<el-table-column <el-table-column
prop="followProject" prop="followProject"
label="跟进项目" label="跟进项目"
width="76"> width="90">
<template slot-scope="scope"> <template slot-scope="scope">
{{scope.row.followProject || '--'}} {{scope.row.followProject || '--'}}
</template> </template>
...@@ -67,7 +67,7 @@ ...@@ -67,7 +67,7 @@
<el-table-column <el-table-column
prop="reserveProject" prop="reserveProject"
label="储备项目" label="储备项目"
width="76"> width="90">
<template slot-scope="scope"> <template slot-scope="scope">
{{scope.row.reserveProject || '--'}} {{scope.row.reserveProject || '--'}}
</template> </template>
...@@ -91,7 +91,7 @@ ...@@ -91,7 +91,7 @@
<el-table-column <el-table-column
prop="registerCapitalStr" prop="registerCapitalStr"
label="注册资本金(万元)" label="注册资本金(万元)"
width="140"> width="160">
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.registerCapital && scope.row.registerCapital>0">{{scope.row.registerCapital}}</span><span v-else>--</span> <span v-if="scope.row.registerCapital && scope.row.registerCapital>0">{{scope.row.registerCapital}}</span><span v-else>--</span>
</template> </template>
......
...@@ -54,17 +54,24 @@ ...@@ -54,17 +54,24 @@
<label class="label">建设性质</label> <label class="label">建设性质</label>
<span>{{info.projectNature||"--"}}</span> <span>{{info.projectNature||"--"}}</span>
</p> </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>
<div class="biddetail-title">招标信息</div> <div class="biddetail-title">招标信息</div>
<div class="main31-box"> <div class="main31-box">
<p> <p>
<label class="label">招标单位</label> <label class="label">招标单位</label>
<span class="span1"> <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> <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 v-else>--</span>
</span> </span>
<label class="label label1">招标代理机构</label> <label class="label label1">招标代理机构</label>
<span class="span1">{{info.agency||"--"}}</span> <span class="span1">{{info.agency||"--"}}</span>
</p> </p>
</div> </div>
...@@ -91,7 +98,7 @@ ...@@ -91,7 +98,7 @@
</template> </template>
<script> <script>
import "@/assets/styles/public.css"; import "@/assets/styles/public.scss";
import {encodeStr} from "@/assets/js/common.js" import {encodeStr} from "@/assets/js/common.js"
import {getBiddetail} from '@/api/detail/party-a/biddetail.js'; import {getBiddetail} from '@/api/detail/party-a/biddetail.js';
export default { export default {
...@@ -409,9 +416,12 @@ export default { ...@@ -409,9 +416,12 @@ export default {
font-size: 12px; font-size: 12px;
background: #fff; background: #fff;
} }
.span1{ .span1{
width: 40%; width: 40%;
} }
.span2{
width: 88.9%;
}
.span-one { .span-one {
width: 90%; width: 90%;
} }
......
...@@ -53,12 +53,14 @@ export default { ...@@ -53,12 +53,14 @@ export default {
{title: '集团成员', pathName: 'members'}, {title: '集团成员', pathName: 'members'},
{title: '集团资质', pathName: 'qualifications'}, {title: '集团资质', pathName: 'qualifications'},
{title: '集团业绩', pathName: 'performance'}, {title: '集团业绩', pathName: 'performance'},
{title: '集团招标', pathName: 'zhaobiao'},
], ],
defaultRoute: [], defaultRoute: [],
customer:[ customer:[
'members', 'members',
'qualifications', 'qualifications',
'performance', 'performance',
'zhaobiao',
], ],
uniqueOpened:false, uniqueOpened:false,
searchIndex: '' searchIndex: ''
......
...@@ -171,7 +171,7 @@ ...@@ -171,7 +171,7 @@
qyType:[], qyType:[],
cgblList:['100%','50%以上','20%以上','5%以上','1%-5%'], cgblList:['100%','50%以上','20%以上','5%以上','1%-5%'],
cgblName:'', cgblName:'',
paramsData:[], //储存组件筛选的条件 paramsData:{}, //储存组件筛选的条件
} }
}, },
watch:{ watch:{
...@@ -244,8 +244,8 @@ ...@@ -244,8 +244,8 @@
} }
}, },
handleQuery(params){ handleQuery(params){
this.paramsData=params; this.paramsData=params || {};
this.tableLoading=true this.tableLoading=true;
let data = this.getAreaList(params || this.queryParams) let data = this.getAreaList(params || this.queryParams)
memberList(data).then(res=>{ memberList(data).then(res=>{
this.isSkeleton = false this.isSkeleton = false
...@@ -363,8 +363,9 @@ ...@@ -363,8 +363,9 @@
this.queryParams.maxStockPercent='' this.queryParams.maxStockPercent=''
} }
if(this.paramsData){ if(this.paramsData){
this.paramsData.minStockPercent=this.queryParams.minStockPercent if(!this.paramsData.combineId){
this.paramsData.maxStockPercent=this.queryParams.maxStockPercent this.paramsData=this.queryParams
}
this.paramsData.pageNum =1 this.paramsData.pageNum =1
this.queryParams.pageNum =1 this.queryParams.pageNum =1
} }
...@@ -400,16 +401,26 @@ ...@@ -400,16 +401,26 @@
}, },
sortChange({ column, prop, order }){ sortChange({ column, prop, order }){
this.queryParams.orderName = prop 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"){ if(column.order === "ascending"){
this.queryParams.orderType = 'asc' this.queryParams.orderType = 'asc'
this.paramsData.orderType = 'asc'
}else if(column.order === "descending"){ }else if(column.order === "descending"){
this.queryParams.orderType = 'desc' this.queryParams.orderType = 'desc'
this.paramsData.orderType = 'desc'
}else { }else {
this.queryParams.orderType='' this.queryParams.orderType=''
this.queryParams.orderName='' this.queryParams.orderName=''
this.paramsData.orderType=''
this.paramsData.orderName=''
} }
this.pageIndex = 1; this.queryParams.pageNum =1
this.handleQuery() this.paramsData.pageNum =1
this.handleQuery(this.paramsData)
}, },
//分页 //分页
handleCurrentChange(e){ handleCurrentChange(e){
......
...@@ -5,8 +5,9 @@ ...@@ -5,8 +5,9 @@
:form-data="formData" :form-data="formData"
:query-params="queryParams" :query-params="queryParams"
:total="tableDataTotal" :total="tableDataTotal"
:isExcel="false" :isExcel="true"
@handle-search="handleSearch" @handle-search="handleSearch"
@handle-excel="clickEXCEL"
> >
<template slot="slot"> <template slot="slot">
...@@ -57,7 +58,7 @@ ...@@ -57,7 +58,7 @@
import { getDictType } from '@/api/main' import { getDictType } from '@/api/main'
export default { export default {
name: 'qualifications', name: 'qualifications',
props: ['customerId'], props: ['customerId','combineName'],
mixins: [mixin], mixins: [mixin],
components:{}, components:{},
data(){ data(){
...@@ -74,17 +75,17 @@ ...@@ -74,17 +75,17 @@
forData: [ forData: [
{label: '中标时间', prop: 'bidTime',slot: true,minWidth: '80'}, {label: '中标时间', prop: 'bidTime',slot: true,minWidth: '80'},
{label: '中标成员', prop: 'companyName', slot: true,minWidth: '190'}, {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: 'projectName', slot: true,minWidth: '260'},
{label: '中标金额', prop: 'bidAmount',slot: true,minWidth: '110'}, {label: '中标金额', prop: 'bidAmount',slot: true,minWidth: '110'},
{label: '中标地区', prop: 'address',minWidth: '80'}, {label: '中标地区', prop: 'address',minWidth: '130'},
{label: '业绩类型', prop: 'boundType',minWidth: '100'}, {label: '业绩类型', prop: 'boundType',minWidth: '80'},
{label: '项目类型', prop: 'projectType',minWidth: '100'}, {label: '项目类型', prop: 'projectType',minWidth: '80'},
{label: '业主单位', prop: 'projectUnit', slot: true,minWidth: '190'}, {label: '业主单位', prop: 'projectUnit', slot: true,minWidth: '190'},
], ],
formData: [ formData: [
{ type: 7, fieldName: 'province', value: '',props: {multiple: true,value: 'id',expandTrigger: 'hover'}, placeholder: '项目地区', options:[]}, { 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: 6, fieldName: 'money', value: '', placeholder: '中标金额', startMoney: 'minAmount', endMoney: 'maxAmount',moneyList:[] },
{ type: 4, fieldName: 'boundTypes', value: '', placeholder: '业绩类型', options: [],width:150}, { type: 4, fieldName: 'boundTypes', value: '', placeholder: '业绩类型', options: [],width:150},
{ type: 4, fieldName: 'projectTypes', value: '', placeholder: '项目类型', options: [],width:150}, { type: 4, fieldName: 'projectTypes', value: '', placeholder: '项目类型', options: [],width:150},
...@@ -103,6 +104,7 @@ ...@@ -103,6 +104,7 @@
], ],
timeList: ['近三天', '近七天', '近半月', '自定义'], timeList: ['近三天', '近七天', '近半月', '自定义'],
moneyList: ['5000万以下', '5000万-1亿', '1亿-5亿', '5亿-10亿','10亿以上', '自定义'], moneyList: ['5000万以下', '5000万-1亿', '1亿-5亿', '5亿-10亿','10亿以上', '自定义'],
dataEXCEL:{}
} }
}, },
created() { created() {
...@@ -162,6 +164,7 @@ ...@@ -162,6 +164,7 @@
} }
delete data.cgbl delete data.cgbl
} }
this.dataEXCEL=JSON.parse(JSON.stringify(data));
businessList(data).then(res=>{ businessList(data).then(res=>{
this.tableData = res.code == 200 ? res.rows:[] this.tableData = res.code == 200 ? res.rows:[]
this.tableDataTotal = res.total this.tableDataTotal = res.total
...@@ -263,6 +266,16 @@ ...@@ -263,6 +266,16 @@
// this.$children[1].$refs.tableRef.bodyWrapper.scrollTop = 0 // this.$children[1].$refs.tableRef.bodyWrapper.scrollTop = 0
}, 500); }, 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> </script>
......
...@@ -8,6 +8,15 @@ ...@@ -8,6 +8,15 @@
:isExcel="false" :isExcel="false"
@handle-search="handleSearch" @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> <skeleton style="margin-left:16px;" v-if="isSkeleton"></skeleton>
<tables <tables
v-if="!isSkeleton" v-if="!isSkeleton"
...@@ -39,7 +48,7 @@ ...@@ -39,7 +48,7 @@
import QualificationsDetail from './qualificationsDetail' import QualificationsDetail from './qualificationsDetail'
export default { export default {
name: 'qualifications', name: 'qualifications',
props: ['customerId','name'], props: ['customerId','combineName'],
mixins: [mixin], mixins: [mixin],
components:{ components:{
QualificationsDetail QualificationsDetail
...@@ -53,29 +62,31 @@ ...@@ -53,29 +62,31 @@
queryParams: { queryParams: {
combineId:this.customerId, combineId:this.customerId,
pageNum: 1, pageNum: 1,
pageSize: 20 pageSize: 20,
qualificationType:''
}, },
forData: [ forData: [
{label: '资质名称', prop: 'qualificationName'}, {label: '资质名称', prop: 'qualificationName'},
{label: '拥有该资质成员', prop: 'companyCount', slot: true}, {label: '拥有该资质成员', prop: 'companyCount', slot: true},
], ],
formData: [ formData: [
{ type: 1, fieldName: 'qualificationType', value: '', placeholder: '筛选', options:[],width:260}, // { type: 1, fieldName: 'qualificationType', value: '', placeholder: '筛选', options:[],width:260},
], ],
tableData:[], tableData:[],
tableDataTotal:0, tableDataTotal:0,
title:'', title:'',
rowData:'' rowData:'',
certificateList:[],
height:''
} }
}, },
created() { created() {
this.handleQuery()
this.getCertificateList() this.getCertificateList()
}, },
methods: { methods: {
handleQuery(params){ handleQuery(params){
this.isSkeleton = true this.isSkeleton = true
let data = params ? params : this.queryParams let data = params ? params : this.queryParams;
certificateList(data).then(res=>{ certificateList(data).then(res=>{
this.isSkeleton = false this.isSkeleton = false
if(res.code === 200){ if(res.code === 200){
...@@ -89,19 +100,32 @@ ...@@ -89,19 +100,32 @@
getCertificateList(){ getCertificateList(){
certificateCount({combineId: this.queryParams.combineId}).then(res=>{ certificateCount({combineId: this.queryParams.combineId}).then(res=>{
let data = res.data 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++){ for(let i=0; i<data.length; i++){
this.formData[0].options.push({ // this.formData[0].options.push({
name: data[i].qualificationName+ '(' + data[i].companyCount + ')', // name: data[i].qualificationName+ '(' + data[i].companyCount + ')',
value: data[i].qualificationType, // value: data[i].qualificationType,
}) // })
} }
}) })
}, },
handleClick(e, data) { handleClick(e, data) {
this.title=this.name+'-'+data.qualificationName+'(共'+ data.companyCount +'条)' this.title=this.combineName+'-'+data.qualificationName+'(共'+ data.companyCount +'条)'
this.rowData = data this.rowData = data
this.isDetails = true this.isDetails = true
}, },
changeType(value){
this.queryParams.qualificationType=value;
this.queryParams.pageNum=1;
this.queryParams.pageSize=20;
this.handleQuery()
},
moreClick(){
this.height='auto'
},
} }
} }
</script> </script>
...@@ -117,6 +141,33 @@ ...@@ -117,6 +141,33 @@
margin-right: 24px; 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{ ::v-deep .el-table{
.has-gutter{ .has-gutter{
tr{ tr{
...@@ -132,5 +183,28 @@ ...@@ -132,5 +183,28 @@
background: #F0F3FA; 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> </style>
...@@ -6,11 +6,17 @@ ...@@ -6,11 +6,17 @@
custom-class="client-drawer" custom-class="client-drawer"
:with-header="false" :with-header="false"
@closed="cancel"> @closed="cancel">
<skeleton style="margin-left:16px;" v-if="isSkeleton"></skeleton> <div class="head">
<div class="head" v-if="!isSkeleton">
<img class="tip-img" src="@/assets/images/icon.png" /> <img class="tip-img" src="@/assets/images/icon.png" />
<span>{{title}}</span> <span>{{title}}</span>
</div> </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 <tables
v-if="!isSkeleton" v-if="!isSkeleton"
:tableLoading="tableLoading" :tableLoading="tableLoading"
...@@ -18,6 +24,7 @@ ...@@ -18,6 +24,7 @@
:forData="forData" :forData="forData"
:tableDataTotal="tableDataTotal" :tableDataTotal="tableDataTotal"
:queryParams="queryParams" :queryParams="queryParams"
:MaxPage=500
@handle-current-change="handleCurrentChange" @handle-current-change="handleCurrentChange"
style="margin: 12px;" style="margin: 12px;"
> >
...@@ -50,11 +57,9 @@ export default { ...@@ -50,11 +57,9 @@ export default {
queryParams: { queryParams: {
id: this.data.id, id: this.data.id,
pageNum: 1, pageNum: 1,
pageSize: 10 pageSize: 10,
companyName:''
}, },
formData: [
{ type: 3, fieldName: 'keys', value: '', placeholder: '输入项目/工程名称查询', options: []},
],
forData: [ forData: [
{label: '拥有该资质成员', prop: 'companyName', slot: true}, {label: '拥有该资质成员', prop: 'companyName', slot: true},
{label: '成员共有资质(个)', prop: 'certificateCount'}, {label: '成员共有资质(个)', prop: 'certificateCount'},
...@@ -73,7 +78,8 @@ export default { ...@@ -73,7 +78,8 @@ export default {
methods: { methods: {
async handleQuery(params) { async handleQuery(params) {
this.isSkeleton = true this.isSkeleton = true
let param = params?params:this.queryParams let param = params?params:this.queryParams;
console.log(param)
let res = await memberCertificateList(param) let res = await memberCertificateList(param)
this.isSkeleton = false this.isSkeleton = false
if(res.code==200){ if(res.code==200){
...@@ -94,7 +100,19 @@ export default { ...@@ -94,7 +100,19 @@ export default {
}, },
cancel() { cancel() {
this.$emit('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> </script>
...@@ -114,5 +132,47 @@ export default { ...@@ -114,5 +132,47 @@ export default {
height: 17px; height: 17px;
margin: 0 8px -2px 12px; 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> </style>
...@@ -12,9 +12,10 @@ ...@@ -12,9 +12,10 @@
</div> </div>
<div class="group-right"> <div class="group-right">
<div id="groupBox" v-if="customerId"> <div id="groupBox" v-if="customerId">
<Members v-if="currentPath.pathName=='members'" :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" :name="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"/> <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> </div>
</div> </div>
...@@ -27,12 +28,13 @@ ...@@ -27,12 +28,13 @@
import Members from "./component/members" import Members from "./component/members"
import Qualifications from "./component/qualifications" import Qualifications from "./component/qualifications"
import Performance from "./component/performance" import Performance from "./component/performance"
import Zhaobiao from "./component/zhaobiao"
import { infoHeader } from '@/api/detail/party-a/index' import { infoHeader } from '@/api/detail/party-a/index'
import elementResizeDetectorMaker from "element-resize-detector" import elementResizeDetectorMaker from "element-resize-detector"
export default { export default {
name: 'GroupAccount', name: 'GroupAccount',
components:{ components:{
SideBar,Members,Qualifications,Performance SideBar,Members,Qualifications,Performance,Zhaobiao
}, },
data(){ data(){
return{ return{
...@@ -77,6 +79,8 @@ ...@@ -77,6 +79,8 @@
} }
.group-left{ .group-left{
margin-right: 16px; margin-right: 16px;
padding-bottom: 16px;
background: #FFFFFF;
} }
.group-right{ .group-right{
min-width: 1088px; min-width: 1088px;
......
...@@ -272,7 +272,7 @@ export default { ...@@ -272,7 +272,7 @@ export default {
.options-block { .options-block {
position: absolute; position: absolute;
margin-top: 12px; margin-top: 5px;
min-width: 120px; min-width: 120px;
font-size: 14px; font-size: 14px;
color: #666666; color: #666666;
......
<template> <template>
<div class="headForm"> <div class="headForm">
<div class="flex-box query-box"> <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"> <div class="flex-box headForm-text">
<!-- <img v-if="title" src="@/assets/images/detail/ico_title.png" /> --> <template v-if="flag">
<!-- <span class="drawer-title" v-if="title">{{ title }}</span> --> <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"> <template v-if="slots">
<slot name="slot"></slot> <slot name="slot"></slot>
</template> </template>
<!-- <div v-else> <div v-if="flag">
<span class="ability-total" v-if="isTotal">{{ total }}条数据</span> <span class="ability-total" v-if="isTotal">{{ total }}条数据</span>
<span class="ability-total" v-if="amountTotal">,共计合作总金额:<i>{{ amountTotal }}</i>万元</span> <span class="ability-total" v-if="amountTotal">,共计合作总金额:<i>{{ amountTotal }}</i>万元</span>
</div> --> </div>
</div> </div>
<div class="headForm-from"> <div class="headForm-from">
<div class="from-item" :key="i" v-for="(form, i) in formData"> <div class="from-item" :key="i" v-for="(form, i) in formData">
...@@ -45,7 +47,7 @@ ...@@ -45,7 +47,7 @@
<!-- 输入框 --> <!-- 输入框 -->
<template v-if="form.type==3"> <template v-if="form.type==3">
<div class="cooperate-name" :id="'detailFocus'+i"> <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> <span @click="changeSelect">搜索</span>
</div> </div>
</template> </template>
...@@ -96,6 +98,10 @@ export default { ...@@ -96,6 +98,10 @@ export default {
type: String, type: String,
default: '' default: ''
}, },
flag: {
type: Boolean,
default: false
},
queryParams: { queryParams: {
type: Object, type: Object,
default: {} default: {}
...@@ -143,11 +149,26 @@ export default { ...@@ -143,11 +149,26 @@ export default {
width: 100%; width: 100%;
padding: 8px 17px 8px 0; 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{ ::v-deep .el-input__inner{
border: 0; border: 0;
height: 32px; height: 32px;
line-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{ ::v-deep .custom-money-select{
.el-input__inner{ .el-input__inner{
border: 1px solid #D9D9D9; border: 1px solid #D9D9D9;
...@@ -161,6 +182,12 @@ export default { ...@@ -161,6 +182,12 @@ export default {
line-height: 32px; line-height: 32px;
} }
.headForm-text{ .headForm-text{
.drawer-title{
font-size: 16px;
color: #232323;
font-weight: bold;
margin-right: 4px;
}
img{ img{
width: 17px; width: 17px;
height: 17px; height: 17px;
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
:min-width="item.minWidth" :min-width="item.minWidth"
:align="item.align?item.align:'left'" :align="item.align?item.align:'left'"
:fixed="item.fixed" :fixed="item.fixed"
:sortable="item.sortable ? 'custom' : false" :sortable="item.sortable ?item.sortable=='custom'? 'custom':true : false"
:resizable="false"> :resizable="false">
<template v-if="item.children&&item.children.length"> <template v-if="item.children&&item.children.length">
<el-table-column <el-table-column
...@@ -197,6 +197,12 @@ export default { ...@@ -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 { ::v-deep .el-table th.el-table__cell.is-leaf,::v-deep .el-table td.el-table__cell {
border-bottom: 1px solid #E6EAF1; border-bottom: 1px solid #E6EAF1;
} }
...@@ -216,5 +222,4 @@ export default { ...@@ -216,5 +222,4 @@ export default {
::v-deep .el-table--enable-row-hover .el-table__body tr:hover > td { ::v-deep .el-table--enable-row-hover .el-table__body tr:hover > td {
background-color: #DCEBFF; background-color: #DCEBFF;
} }
</style> </style>
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
> >
<template slot="slot"> <template slot="slot">
<div class="flex-box query-add"> <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> </div>
</template> </template>
</head-form> </head-form>
......
...@@ -82,7 +82,6 @@ export default { ...@@ -82,7 +82,6 @@ export default {
}, },
methods: { methods: {
async handleQuery(params) { async handleQuery(params) {
this.isSkeleton = true;
this.tableLoading = true this.tableLoading = true
let param = params?params:this.queryParams let param = params?params:this.queryParams
let res = await oftenAgencyPage(param) let res = await oftenAgencyPage(param)
......
...@@ -71,7 +71,6 @@ export default { ...@@ -71,7 +71,6 @@ export default {
}, },
methods: { methods: {
async handleQuery(params) { async handleQuery(params) {
this.isSkeleton = true;
this.tableLoading = true this.tableLoading = true
let param = params?params:this.queryParams let param = params?params:this.queryParams
let res = await tenderPage(param) let res = await tenderPage(param)
......
...@@ -94,7 +94,6 @@ export default { ...@@ -94,7 +94,6 @@ export default {
}, },
async handleQuery(params) { async handleQuery(params) {
this.tableLoading = true
let param = params?params:this.queryParams let param = params?params:this.queryParams
let res = await historySendPage(param) let res = await historySendPage(param)
this.tableLoading = false this.tableLoading = false
......
...@@ -59,7 +59,11 @@ ...@@ -59,7 +59,11 @@
</el-table-column> </el-table-column>
<el-table-column prop="investStartDate" label="成立日期"></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="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> </el-table>
<no-data v-if="activeName=='second'&&shipData.length<1"/> <no-data v-if="activeName=='second'&&shipData.length<1"/>
<el-table :data="affiliatesData" border style="width: 100%" v-show="activeName=='third'"> <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