Commit e967da69 authored by danfuman's avatar danfuman

Merge branch 'master' of http://192.168.60.201/root/dsk-operate-sys

# Conflicts:
#	dsk-operate-ui/src/views/custom/customList/index.vue
parents 41359bda b05e842d
......@@ -2,17 +2,25 @@ package com.dsk.biz.controller;
import com.dsk.biz.domain.BusinessOpenTender;
import com.dsk.biz.domain.bo.BusinessOpenTenderDto;
import com.dsk.biz.domain.bo.BusinessSearchDto;
import com.dsk.biz.service.IBusinessOpenTenderService;
import com.dsk.biz.utils.ExcelUtils;
import com.dsk.common.annotation.Log;
import com.dsk.common.annotation.RepeatSubmit;
import com.dsk.common.core.controller.BaseController;
import com.dsk.common.core.domain.PageQuery;
import com.dsk.common.core.domain.R;
import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.enums.BusinessType;
import com.dsk.common.exception.BusinessException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 项目开标记录
......@@ -31,7 +39,7 @@ public class BusinessOpenTenderController extends BaseController {
* 开标记录列表
*/
@GetMapping("/list")
public TableDataInfo<BusinessOpenTender> list(BusinessOpenTenderDto dto, PageQuery pageQuery){
public TableDataInfo<BusinessOpenTender> list(BusinessOpenTenderDto dto, PageQuery pageQuery) {
return baseService.selectList(dto, pageQuery);
}
......@@ -39,8 +47,8 @@ public class BusinessOpenTenderController extends BaseController {
* 添加开标记录
*/
@PostMapping
@RepeatSubmit()
public R<Void> add(@RequestBody BusinessOpenTender bo){
@RepeatSubmit
public R<Void> add(@RequestBody BusinessOpenTender bo) {
return toAjax(baseService.add(bo));
}
......@@ -48,8 +56,8 @@ public class BusinessOpenTenderController extends BaseController {
* 修改开标记录
*/
@PutMapping
@RepeatSubmit()
public R<Void> edit(@RequestBody BusinessOpenTender bo){
@RepeatSubmit
public R<Void> edit(@RequestBody BusinessOpenTender bo) {
return toAjax(baseService.edit(bo));
}
......@@ -57,9 +65,41 @@ public class BusinessOpenTenderController extends BaseController {
* 删除开标记录
*/
@DeleteMapping("/{ids}")
@RepeatSubmit()
public R<Void> remove(@PathVariable Long[] ids){
@RepeatSubmit
public R<Void> remove(@PathVariable Long[] ids) {
return toAjax(baseService.remove(ids));
}
/**
* 批量导入
*/
@Log(title = "开标记录批量导入", businessType = BusinessType.IMPORT)
@PostMapping("/importData/{businessId}")
public R<Map<String, Object>> importData(@RequestPart("file") MultipartFile file, @PathVariable Integer businessId) throws Exception {
List<BusinessOpenTender> list = new ExcelUtils<>(BusinessOpenTender.class).importExcel(file.getInputStream(), 1);
if (list.isEmpty()) throw new BusinessException("请填写导入数据!");
int sucessCount = 0;
List<String> errorList = new ArrayList<>();
for (BusinessOpenTender openTender : list) {
if (ObjectUtils.isEmpty(openTender.getTenderer())) {
errorList.add("投标人不能为空!");
continue;
}
openTender.setBusinessId(businessId);
try {
int add = baseService.add(openTender);
if (add > 0) {
sucessCount++;
}
} catch (Exception e) {
errorList.add(openTender.getTenderer().concat(":").concat(e.getMessage()));
}
}
Map<String, Object> result = new HashMap<>();
result.put("sucessCount", sucessCount);
result.put("errorCount", list.size() - sucessCount);
result.put("errorMsg", errorList);
return R.ok(result);
}
}
package com.dsk.biz.domain;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.dsk.common.annotation.Excel;
import lombok.Data;
import java.io.Serializable;
......@@ -14,7 +16,7 @@ import java.util.Date;
@Data
public class BusinessOpenTender implements Serializable {
@TableId(value = "id",type = IdType.AUTO)
@TableId(value = "id",type = IdType.ASSIGN_ID)
private Long id;
/**
* 项目id
......@@ -27,22 +29,27 @@ public class BusinessOpenTender implements Serializable {
/**
* 投标人
*/
@Excel(name = "投标人")
private String tenderer;
/**
* 企业性质
*/
@Excel(name = "企业性质")
private String tendererNature;
/**
* 项目经理
*/
@Excel(name = "项目经理")
private String businessManager;
/**
* 联系方式
*/
@Excel(name = "联系方式")
private String contact;
/**
* 投标金额
*/
@Excel(name = "投标金额(万元)")
private Double tenderAmount;
private Date createTime;
......
package com.dsk.biz.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dsk.biz.domain.BusinessOpenTender;
import com.dsk.biz.domain.bo.BusinessOpenTenderDto;
import com.dsk.biz.domain.bo.BusinessSearchDto;
import com.dsk.biz.mapper.BusinessOpenTenderMapper;
import com.dsk.biz.service.IBusinessOpenTenderService;
import com.dsk.common.core.domain.PageQuery;
import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.exception.ServiceException;
import jodd.bean.BeanException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.sql.Wrapper;
import java.util.Arrays;
import java.util.List;
/**
* @Author lcl
......@@ -40,6 +37,10 @@ public class BusinessOpenTenderServiceImpl implements IBusinessOpenTenderService
@Override
public int add(BusinessOpenTender bo) {
verifyBean(bo);
BusinessOpenTender openTender = baseMapper.selectOne(Wrappers.<BusinessOpenTender>lambdaQuery()
.eq(BusinessOpenTender::getTenderer, bo.getTenderer())
.eq(BusinessOpenTender::getBusinessId,bo.getBusinessId()));
if(!ObjectUtils.isEmpty(openTender)) throw new ServiceException("当前投标人已存在");
return baseMapper.insert(bo);
}
......@@ -47,6 +48,10 @@ public class BusinessOpenTenderServiceImpl implements IBusinessOpenTenderService
public int edit(BusinessOpenTender bo) {
if(ObjectUtils.isArray(bo.getId())) throw new BeanException("id不能为空!");
verifyBean(bo);
BusinessOpenTender openTender = baseMapper.selectOne(Wrappers.<BusinessOpenTender>lambdaQuery()
.eq(BusinessOpenTender::getTenderer, bo.getTenderer())
.eq(BusinessOpenTender::getBusinessId,bo.getBusinessId()));
if(!ObjectUtils.isEmpty(openTender) && !openTender.getId().equals(bo.getId())) throw new ServiceException("当前投标人已存在");
return baseMapper.updateById(bo);
}
......@@ -56,9 +61,9 @@ public class BusinessOpenTenderServiceImpl implements IBusinessOpenTenderService
}
private void verifyBean(BusinessOpenTender bo){
if(ObjectUtils.isArray(bo.getBusinessId())) throw new BeanException("项目id不能为空!");
if(ObjectUtils.isArray(bo.getTenderer())) throw new BeanException("开标人不能为空!");
if(ObjectUtils.isArray(bo.getTendererNature())) throw new BeanException("企业性质不能为空!");
if(ObjectUtils.isArray(bo.getTenderAmount())) throw new BeanException("投标金额不能为空!");
if(ObjectUtils.isEmpty(bo.getBusinessId())) throw new BeanException("项目id不能为空!");
if(ObjectUtils.isEmpty(bo.getTenderer())) throw new BeanException("投标人不能为空!");
// if(ObjectUtils.isEmpty(bo.getTendererNature())) throw new BeanException("企业性质不能为空!");
// if(ObjectUtils.isEmpty(bo.getTenderAmount())) throw new BeanException("投标金额不能为空!");
}
}
......@@ -36,6 +36,7 @@
"url": "https://gitee.com/y_project/RuoYi-Vue.git"
},
"dependencies": {
"@cell-x/el-table-sticky": "^1.0.2",
"@riophae/vue-treeselect": "0.4.0",
"axios": "0.24.0",
"clipboard": "2.0.8",
......
......@@ -37,6 +37,14 @@ export function getTenantPackage(param) {
params: param
})
}
//同步企业方案
export function syncTenantPackage(param) {
return request({
url: '/system/tenant/syncTenantPackage',
method: 'get',
params: param
})
}
//租户列表
export function getTenantList(param) {
......
import request from '@/utils/request'
import request from '@/utils/request';
//新增项目
export function addProject(param) {
return request({
url: '/business/info/add',
method: 'POST',
data: param
})
});
}
//商机列表
export function getProjectlist(param) {
......@@ -13,52 +13,52 @@ export function getProjectlist(param) {
url: '/business/info/list',
method: 'GET',
params: param
})
});
}
//删除项目
export function delProject(param) {
return request({
url: '/business/info/remove/'+param,
url: '/business/info/remove/' + param,
method: 'DELETE',
})
});
}
//建设内容
export function getJSNR(param) {
return request({
url: '/business/info/construction/'+param,
url: '/business/info/construction/' + param,
method: 'GET',
})
});
}
//项目速览
export function getXMSL(param) {
return request({
url: '/business/info/browse/'+param,
url: '/business/info/browse/' + param,
method: 'GET',
})
});
}
//项目内容修改
export function editXMNR(param) {
return request({
url: '/business/info/edit',
method: 'POST',
data:param
})
data: param
});
}
//项目标签新增
export function addLabel(param) {
return request({
url: '/business/label/add',
method: 'POST',
data:param
})
data: param
});
}
//项目标签删除
export function removeLabel(param) {
return request({
url: '/business/label/remove',
method: 'POST',
data:param
})
data: param
});
}
......@@ -68,8 +68,8 @@ export function getLXR(param) {
// url: '/business/contacts/list',
url: '/contact/info/list',
method: 'GET',
params:param
})
params: param
});
}
//修改项目联系人
export function editLXR(param) {
......@@ -77,8 +77,8 @@ export function editLXR(param) {
// url: '/business/contacts/edit',
url: '/contact/info',
method: 'PUT',
data:param
})
data: param
});
}
//新增项目联系人
......@@ -87,16 +87,16 @@ export function addLXR(param) {
// url: '/business/contacts/add',
url: '/contact/info',
method: 'POST',
data:param
})
data: param
});
}
//删除项目联系人
export function delLXR(param) {
return request({
url: '/contact/info/'+param,
url: '/contact/info/' + param,
method: 'DELETE',
})
});
}
//跟进记录
......@@ -104,8 +104,8 @@ export function getGJJL(param) {
return request({
url: '/business/record/list',
method: 'get',
params:param
})
params: param
});
}
//新增跟进记录
......@@ -113,15 +113,15 @@ export function addGJJL(param) {
return request({
url: '/business/record/add',
method: 'POST',
data:param
})
data: param
});
}
//删除跟进记录
export function delGJJL(param) {
return request({
url: '/business/record/remove/'+param,
url: '/business/record/remove/' + param,
method: 'DELETE',
})
});
}
......@@ -130,8 +130,8 @@ export function getGZDB(param) {
return request({
url: '/business/backlog/list',
method: 'GET',
params:param
})
params: param
});
}
//添加工作待办
......@@ -139,8 +139,8 @@ export function addGZDB(param) {
return request({
url: '/business/backlog/add',
method: 'post',
data:param
})
data: param
});
}
//修改工作待办
......@@ -148,16 +148,16 @@ export function editGZDB(param) {
return request({
url: '/business/backlog/edit',
method: 'post',
data:param
})
data: param
});
}
//查询相关企业
export function getXGQY(param) {
return request({
url: '/business/company/list',
method: 'GET',
params:param
})
params: param
});
}
//新增相关企业
......@@ -165,8 +165,8 @@ export function addXGQY(param) {
return request({
url: '/business/company/add',
method: 'POST',
data:param
})
data: param
});
}
//编辑相关企业
......@@ -174,24 +174,24 @@ export function saveXGQY(param) {
return request({
url: '/business/company/edit',
method: 'POST',
data:param
})
data: param
});
}
//删除相关企业
export function delXGQY(param) {
return request({
url: '/business/company/remove/'+param,
url: '/business/company/remove/' + param,
method: 'DELETE',
})
});
}
//查询资料文档
export function getZLWD(param) {
return request({
url: '/business/file/list',
method: 'GET',
params:param
})
params: param
});
}
//删除资料文档
......@@ -199,16 +199,16 @@ export function delZLWD(param) {
return request({
url: '/business/file/remove',
method: 'POST',
data:param
})
data: param
});
}
//查询关联项目
export function relateProject(param) {
return request({
url: '/business/record/relate/project/'+param,
url: '/business/record/relate/project/' + param,
method: 'get',
})
});
}
//查询跟进动态
......@@ -216,8 +216,8 @@ export function allRecord(param) {
return request({
url: '/business/record/all/list',
method: 'get',
params:param,
})
params: param,
});
}
//项目状态统计
......@@ -225,46 +225,91 @@ export function getStatistics(param) {
return request({
url: '/business/overview/status/statistics',
method: 'get',
params:param,
})
params: param,
});
}
//储备项目统计
export function getCount(param) {
return request({
url: '/business/overview/category/analyze/'+param,
url: '/business/overview/category/analyze/' + param,
method: 'get',
params:param,
})
params: param,
});
}
//储备项目资金
export function getAmount(param) {
return request({
url: '/business/overview/amount/analyze',
method: 'get',
params:param,
})
params: param,
});
}
//跟进动态
export function getAllRecord(param) {
return request({
url: '/business/record/all/list',
method: 'get',
params:param,
})
params: param,
});
}
//公招项目地区统计
export function countGroupByProvince(param) {
return request({
url: '/business/overview/countGroupByProvince',
method: 'post',
data:param
})
data: param
});
}
//公招项目投资金额统计
export function rangByMoney(param) {
return request({
url: '/business/overview/rangByMoney',
method: 'post',
data:param
})
data: param
});
}
/**
* 获取项目管理 商机列表 详情页开标记录列表
* @param {object} params
* @returns
*/
export const getBidOpeningRecordListApi = (params) => request({
method: "get",
url: "/business/open/tender/list",
params
});
/**
* 新增项目管理 商机列表 详情页开标记录
* @param {object} data
* @returns
*/
export const addBidOpeningRecordApi = (data) => request({
method: "post",
url: "/business/open/tender",
data
});
/**
* 修改项目管理 商机列表 详情页开标记录
* @param {object} data
* @returns
*/
export const modifyBidOpeningRecordApi = (data) => request({
method: "put",
url: "/business/open/tender",
data
});
/**
* 删除项目管理 商机列表 详情页开标记录
* @param {object} data
* @returns
*/
export const removeBidOpeningRecordApi = (params) => request({
method: "DELETE",
url: `/business/open/tender/${params}`,
});
<svg width="24" height="24" viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg"><path d="M23.063 13.171a1.2 1.2 0 011.874 0l13.503 16.88c.629.785.07 1.949-.937 1.949H10.497c-1.006 0-1.566-1.164-.937-1.95l13.503-16.879z"/></svg>
\ No newline at end of file
<svg width="24" height="24" viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg"><path d="M24.937 34.829a1.2 1.2 0 01-1.874 0L9.56 17.949C8.93 17.165 9.49 16 10.497 16h27.006c1.007 0 1.566 1.164.937 1.95L24.937 34.829z"/></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="14" height="14" viewBox="0 0 14 14"><g transform="matrix(1,5.551115123125783e-17,-5.551115123125783e-17,1,0,0)"><g><path d="M1.166015625,7.0003221875C1.166015625,3.7786621875,3.777685625,1.1669921875,6.999345625,1.1669921875C10.221015625,1.1669921875,12.832715625,3.7786621875,12.832715625,7.0003221875C12.832715625,10.2219921875,10.221015625,12.8336921875,6.999345625,12.8336921875C3.777685625,12.8336921875,1.166015625,10.2219921875,1.166015625,7.0003221875C1.166015625,7.0003221875,1.166015625,7.0003221875,1.166015625,7.0003221875ZM4.732635625,5.5586421875C4.732635625,5.5586421875,6.176295625,7.0023121875,6.176295625,7.0023121875C6.176295625,7.0023121875,4.732635625,8.4460021875,4.732635625,8.4460021875C4.732635625,8.4460021875,5.557585625,9.2709521875,5.557585625,9.2709521875C5.557585625,9.2709521875,7.001245625,7.8272621875,7.001245625,7.8272621875C7.001245625,7.8272621875,8.444935625,9.2709521875,8.444935625,9.2709521875C8.444935625,9.2709521875,9.269885625,8.4460021875,9.269885625,8.4460021875C9.269885625,8.4460021875,7.826225625,7.0023121875,7.826225625,7.0023121875C7.826225625,7.0023121875,9.269885625,5.5586421875,9.269885625,5.5586421875C9.269885625,5.5586421875,8.444935625,4.7336621875,8.444935625,4.7336621875C8.444935625,4.7336621875,7.001245625,6.1773621875,7.001245625,6.1773621875C7.001245625,6.1773621875,5.557585625,4.7336621875,5.557585625,4.7336621875C5.557585625,4.7336621875,4.732635625,5.5586421875,4.732635625,5.5586421875C4.732635625,5.5586421875,4.732635625,5.5586421875,4.732635625,5.5586421875Z" fill-rule="evenodd" fill="#BFBFBF" fill-opacity="1"/></g></g></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="14" height="14" viewBox="0 0 14 14"><defs><clipPath id="master_svg0_1539_143431/829_061997"><rect x="0" y="0" width="14" height="14" rx="0"/></clipPath></defs><g clip-path="url(#master_svg0_1539_143431/829_061997)"><g><path d="M6.417314375,6.4163378125C6.417314375,6.4163378125,6.417314375,1.4580078125,6.417314375,1.4580078125C6.417314375,1.4580078125,7.583984375,1.4580078125,7.583984375,1.4580078125C7.583984375,1.4580078125,7.583984375,6.4163378125,7.583984375,6.4163378125C7.583984375,6.4163378125,12.542284375,6.4163378125,12.542284375,6.4163378125C12.542284375,6.4163378125,12.542284375,7.5830078125,12.542284375,7.5830078125C12.542284375,7.5830078125,7.583984375,7.5830078125,7.583984375,7.5830078125C7.583984375,7.5830078125,7.583984375,12.5413078125,7.583984375,12.5413078125C7.583984375,12.5413078125,6.417314375,12.5413078125,6.417314375,12.5413078125C6.417314375,12.5413078125,6.417314375,7.5830078125,6.417314375,7.5830078125C6.417314375,7.5830078125,1.458984375,7.5830078125,1.458984375,7.5830078125C1.458984375,7.5830078125,1.458984375,6.4163378125,1.458984375,6.4163378125C1.458984375,6.4163378125,6.417314375,6.4163378125,6.417314375,6.4163378125C6.417314375,6.4163378125,6.417314375,6.4163378125,6.417314375,6.4163378125Z" fill-rule="evenodd" fill="#FFFFFF" fill-opacity="1"/></g></g></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="14" height="14" viewBox="0 0 14 14"><defs><clipPath id="master_svg0_1539_143591"><rect x="0" y="0" width="14" height="14" rx="0"/></clipPath></defs><g clip-path="url(#master_svg0_1539_143591)"><g><path d="M7.00035,1.508544921875C7.00035,1.508544921875,10.05856,4.566754921875,10.05856,4.566754921875C10.05856,4.566754921875,9.233609999999999,5.391704921875,9.233609999999999,5.391704921875C9.233609999999999,5.391704921875,7.584,3.742104921875,7.584,3.742104921875C7.584,3.742104921875,7.584,9.666634921875,7.584,9.666634921875C7.584,9.666634921875,6.41734,9.666634921875,6.41734,9.666634921875C6.41734,9.666634921875,6.41734,3.741484921875,6.41734,3.741484921875C6.41734,3.741484921875,4.76709,5.391704921875,4.76709,5.391704921875C4.76709,5.391704921875,3.94214,4.566754921875,3.94214,4.566754921875C3.94214,4.566754921875,7.00035,1.508544921875,7.00035,1.508544921875C7.00035,1.508544921875,7.00035,1.508544921875,7.00035,1.508544921875ZM2.91667,11.375164921875C2.91667,11.375164921875,2.91667,10.208494921875,2.91667,10.208494921875C2.91667,10.208494921875,1.75,10.208494921875,1.75,10.208494921875C1.75,10.208494921875,1.75,12.541844921875,1.75,12.541844921875C1.75,12.541844921875,12.25,12.541844921875,12.25,12.541844921875C12.25,12.541844921875,12.25,10.208494921875,12.25,10.208494921875C12.25,10.208494921875,11.08333,10.208494921875,11.08333,10.208494921875C11.08333,10.208494921875,11.08333,11.375164921875,11.08333,11.375164921875C11.08333,11.375164921875,2.91667,11.375164921875,2.91667,11.375164921875C2.91667,11.375164921875,2.91667,11.375164921875,2.91667,11.375164921875Z" fill-rule="evenodd" fill="#232323" fill-opacity="1"/></g></g></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="14" height="14" viewBox="0 0 14 14"><g><g><path d="M9.91682609375,2.624921953125C9.91682609375,2.624921953125,9.91682609375,1.458251953125,9.91682609375,1.458251953125C9.91682609375,1.458251953125,4.08349609375,1.458253204825,4.08349609375,1.458253204825C4.08349609375,1.458253204825,4.08349609375,2.624921953125,4.08349609375,2.624921953125C4.08349609375,2.624921953125,1.45849609375,2.624921953125,1.45849609375,2.624921953125C1.45849609375,2.624921953125,1.45849609375,3.791581953125,1.45849609375,3.791581953125C1.45849609375,3.791581953125,2.47932609375,3.791581953125,2.47932609375,3.791581953125C2.47932609375,3.791581953125,2.47932609375,11.666551953125,2.47932609375,11.666551953125C2.47932609375,12.149851953125,2.87107609375,12.541551953125,3.35432609375,12.541551953125C3.35432609375,12.541551953125,10.64599609375,12.541551953125,10.64599609375,12.541551953125C11.12925609375,12.541551953125,11.52099609375,12.149851953125,11.52099609375,11.666551953125C11.52099609375,11.666551953125,11.52099609375,3.791591953125,11.52099609375,3.791591953125C11.52099609375,3.791591953125,12.54179609375,3.791591953125,12.54179609375,3.791591953125C12.54179609375,3.791591953125,12.54179609375,2.624921953125,12.54179609375,2.624921953125C12.54179609375,2.624921953125,9.91682609375,2.624921953125,9.91682609375,2.624921953125C9.91682609375,2.624921953125,9.91682609375,2.624921953125,9.91682609375,2.624921953125ZM3.64599609375,11.374921953125C3.64599609375,11.374921953125,3.64599609375,3.791581953125,3.64599609375,3.791581953125C3.64599609375,3.791581953125,10.35432609375,3.791591953125,10.35432609375,3.791591953125C10.35432609375,3.791591953125,10.35432609375,11.374921953125,10.35432609375,11.374921953125C10.35432609375,11.374921953125,3.64599609375,11.374921953125,3.64599609375,11.374921953125C3.64599609375,11.374921953125,3.64599609375,11.374921953125,3.64599609375,11.374921953125ZM5.25016609375,5.249921953125C5.25016609375,5.249921953125,5.25016609375,9.624921953125,5.25016609375,9.624921953125C5.25016609375,9.624921953125,6.41682609375,9.624921953125,6.41682609375,9.624921953125C6.41682609375,9.624921953125,6.41682609375,5.249921953125,6.41682609375,5.249921953125C6.41682609375,5.249921953125,5.25016609375,5.249921953125,5.25016609375,5.249921953125C5.25016609375,5.249921953125,5.25016609375,5.249921953125,5.25016609375,5.249921953125ZM7.58349609375,5.249921953125C7.58349609375,5.249921953125,7.58349609375,9.624921953125,7.58349609375,9.624921953125C7.58349609375,9.624921953125,8.75016609375,9.624921953125,8.75016609375,9.624921953125C8.75016609375,9.624921953125,8.75016609375,5.249921953125,8.75016609375,5.249921953125C8.75016609375,5.249921953125,7.58349609375,5.249921953125,7.58349609375,5.249921953125C7.58349609375,5.249921953125,7.58349609375,5.249921953125,7.58349609375,5.249921953125Z" fill-rule="evenodd" fill="#FF3C3C" fill-opacity="1"/></g></g></svg>
\ No newline at end of file
......@@ -16,3 +16,7 @@
.fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
opacity: 0;
}
.el-message {
z-index: 3000 !important;
}
......@@ -227,6 +227,7 @@ li {
}
.app-main {
position: relative;
background-color: #f5f5f5;
>div{
width: calc(100% - 48px);
......@@ -236,6 +237,7 @@ li {
margin: 16px 24px;
background-color: #f5f5f5;
box-sizing: border-box;
//width: 100%;
.el-input__inner {
border-color: #d9d9d9;
color: #232323;
......
.el-card{
.el-card {
overflow: initial;
}
//小导航
.miantitle{
.miantitle {
color: #232323;
font-size: 12px;
margin: 12px 0;
>span{
padding: 0px 24px;
box-sizing: border-box;
> span {
opacity: 0.4;
&:last-child{opacity:0.8}
&.on:hover{
color: #0081FF;
&:last-child {
opacity: 0.8;
}
&.on:hover {
color: #0081ff;
opacity: 1;
cursor: pointer;
}
}
}
.overflows{
.overflows {
overflow: initial;
}
.pad16{
.pad16 {
padding: 16px;
}
//提示弹窗
.delform{
.delform {
width: 200px;
height: 114px;
background: #FFFFFF;
box-shadow: 0px 0px 8px 0px rgba(0,0,0,0.12);
background: #ffffff;
box-shadow: 0px 0px 8px 0px rgba(0, 0, 0, 0.12);
border-radius: 2px;
position: absolute;
z-index: 20;
text-align: center;
.words{
.words {
padding: 24px 0;
line-height: 14px;
}
......@@ -58,27 +62,27 @@
}
//项目速览板块
.baseinfo{
.baseinfo {
position: relative;
.btns{
.btns {
position: absolute;
bottom: 24px;
left: 838px;
line-height: 28px;
}
.row{
.row {
display: flex;
padding-bottom: 8px;
padding-left: 16px;
font-size: 14px;
width: 100%;
.con{
>span{
.con {
> span {
opacity: 0.8;
float: left;
margin-top: 3px;
}
.inputxt{
.inputxt {
display: inline-block;
width: 184px;
height: 28px;
......@@ -93,45 +97,45 @@
visibility: hidden;
height: 0;
}
&:hover{
background: #F3F4F5;
&:hover {
background: #f3f4f5;
}
.el-input{
.el-input {
margin-right: 8px;
.el-input__inner{
.el-input__inner {
width: 184px;
height: 28px;
background: #F3F4F5;
background: #f3f4f5;
border-radius: 2px;
border: 1px solid #D9D9D9;
border: 1px solid #d9d9d9;
padding: 0;
text-indent: 8px;
}
}
.el-date-editor--date{
.el-input__prefix{
.el-date-editor--date {
.el-input__prefix {
display: none;
}
}
&.i{
.el-input{
.el-input__inner{
&.i {
.el-input {
.el-input__inner {
width: 100px;
}
}
}
}
.txt{
.txt {
padding-left: 8px;
color: rgba(35,35,35,0.4);
color: rgba(35, 35, 35, 0.4);
display: inline-block;
width: 100%;
}
width: 438px;
&.i{
&.i {
width: auto;
}
.inputime{
.inputime {
display: inline-block;
width: 184px;
height: 28px;
......@@ -139,17 +143,17 @@
line-height: 28px;
cursor: pointer;
position: relative;
>span{
> span {
padding-left: 8px;
}
.el-icon-caret-bottom{
color: rgba(35,35,32,0.4);
.el-icon-caret-bottom {
color: rgba(35, 35, 32, 0.4);
margin-left: 4px;
}
.timeinput{
.timeinput {
opacity: 0;
position: absolute;
.el-input__inner{
.el-input__inner {
padding: 0;
margin: 0;
border: 0;
......@@ -158,7 +162,7 @@
}
}
}
.tipinput{
.tipinput {
display: inline-block;
margin-top: 1px;
width: calc(100% - 116px);
......@@ -170,46 +174,48 @@
visibility: hidden;
height: 0;
}
.el-input{
.el-input {
float: left;
margin-right: 8px;
min-width: 70px;
width: auto;
margin-bottom: 10px;
.el-input__inner{
.el-input__inner {
min-width: 70px;
padding: 0 14px;
height: 24px;
background: #F3F4F5;
background: #f3f4f5;
border-radius: 2px;
border: 0;
}
}
.addbtn{
.addbtn {
float: left;
width: 20px;
height: 20px;
background: url("../../assets/images/project/add.png") no-repeat center center;
background: url("../../assets/images/project/add.png") no-repeat center
center;
background-size: 100%;
display: inline-block;
margin-left: 8px;
margin-top: 2px;
&:hover{
background: url("../../assets/images/project/add_1.png") no-repeat center center;
&:hover {
background: url("../../assets/images/project/add_1.png") no-repeat
center center;
background-size: 100%;
}
}
.tips{
.tips {
float: left;
height: 24px;
line-height: 24px;
padding: 0 14px;
font-size: 14px;
color: #0081FF;
background: #E4F3FD;
color: #0081ff;
background: #e4f3fd;
margin-right: 8px;
margin-bottom: 5px;
img{
img {
margin-left: 8px;
margin-top: 4px;
float: right;
......@@ -217,58 +223,58 @@
display: none;
cursor: pointer;
}
&:hover{
background: #DCEAF3;
img{
&:hover {
background: #dceaf3;
img {
display: block;
}
}
}
}
.textarea{
.textarea {
margin: 0 16px 24px;
width: 800px;
.el-textarea__inner{
.el-textarea__inner {
padding: 5px 10px;
width: 800px;
height: 184px;
border-radius: 2px;
border: 1px solid #D9D9D9;
border: 1px solid #d9d9d9;
}
}
}
.cancels{
.cancels {
font-size: 12px;
margin-left: 4px;
width: 28px;
opacity: 0.4;
cursor: pointer;
&:hover{
&:hover {
opacity: 0.8;
}
}
.otherdata{
.otherdata {
padding: 0 16px 29px;
display: flex;
.det{
.det {
width: 230px;
height: 100px;
margin-right: 17px;
padding: 22px 0;
>img{
> img {
float: left;
margin-right: 8px;
width: 56px;
}
.i{
.i {
font-size: 18px;
font-weight: bold;
line-height: 22px;
padding: 7px 0;
}
.j{
.j {
opacity: 0.8;
font-size: 14px;
line-height: 14px;
......@@ -276,68 +282,73 @@
}
}
//表格样式
.tables{
.tables {
padding: 0 16px 24px;
.el-table .el-table__header-wrapper th,.el-table th.el-table__cell.is-leaf{
.el-table .el-table__header-wrapper th,
.el-table th.el-table__cell.is-leaf {
color: #4f4f4f;
background: #F0F3FA;
background: #f0f3fa;
font-size: 13px;
font-weight: 400;
}
.el-table__fixed::before{
.el-table__fixed::before {
background: none;
}
.is-sortable .sort-caret.ascending{
border-bottom-color: #0081FF;
.is-sortable .sort-caret.ascending {
border-bottom-color: #0081ff;
opacity: 0.4;
}
.el-table .sort-caret.descending{
border-top-color:#0081FF;
.el-table .sort-caret.descending {
border-top-color: #0081ff;
opacity: 0.4;
}
.el-table .ascending .sort-caret.ascending{
.el-table .ascending .sort-caret.ascending {
opacity: 1;
}
.el-table .descending .sort-caret.descending{
.el-table .descending .sort-caret.descending {
opacity: 1;
}
.el-table .cell{
.el-table .cell {
line-height: 20px;
padding: 0 12px;
color: #232323;
font-size: 13px;
}
.el-table--border .el-table__cell{
border-color: #E6EAF1;
.el-table--border .el-table__cell {
border-color: #e6eaf1;
border-bottom: 0;
}
.el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell{
background: #F9FCFF;
.el-table--striped
.el-table__body
tr.el-table__row--striped
td.el-table__cell {
background: #f9fcff;
}
.el-table th.el-table__cell.is-leaf{
.el-table th.el-table__cell.is-leaf {
border-bottom: 0;
}
.el-table__body tr.hover-row > td.el-table__cell,.el-table__body tr.el-table__row--striped.hover-row > td.el-table__cell{
background: #DCEBFF;
.el-table__body tr.hover-row > td.el-table__cell,
.el-table__body tr.el-table__row--striped.hover-row > td.el-table__cell {
background: #dcebff;
}
.has-gutter{
th{
.has-gutter {
th {
height: 40px;
padding: 0;
.cell{
.cell {
line-height: 40px;
}
}
}
.empty{
.empty {
padding: 32px 0;
text-align: center;
>img{
> img {
width: 109px;
display: block;
margin: 0 auto 24px;
}
.p1{
.p1 {
height: 21px;
font-size: 16px;
font-family: Microsoft YaHei-Regular, Microsoft YaHei;
......@@ -346,7 +357,7 @@
line-height: 21px;
margin-bottom: 8px;
}
.p2{
.p2 {
height: 18px;
font-size: 14px;
font-family: Microsoft YaHei-Regular, Microsoft YaHei;
......@@ -356,19 +367,21 @@
margin-bottom: 8px;
}
}
.edit{
>img{
float:left;
.edit {
> img {
float: left;
margin: 2px 4px 0 0;
width: 16px;
}
}
.bottems{
.bottems {
padding-top: 16px;
.el-pagination{
.el-pagination {
float: right;
padding: 0;
.btn-prev, .btn-next, .el-pager li{
.btn-prev,
.btn-next,
.el-pager li {
min-width: 24px;
margin: 0 4px;
height: 24px;
......@@ -377,44 +390,48 @@
color: #4f4f4f;
font-weight: 400;
}
.el-pager li:not(.disabled):hover{
.el-pager li:not(.disabled):hover {
opacity: 0.3;
background: #0081FF;
color: #FFFFFF;
background: #0081ff;
color: #ffffff;
}
.btn-prev .el-icon, .btn-next .el-icon{
.btn-prev .el-icon,
.btn-next .el-icon {
font-weight: 400;
}
.el-pager .more::before{
.el-pager .more::before {
line-height: 24px;
}
}
}
a:hover, a:visited, a:link, a:active{
color: #0081FF;
a:hover,
a:visited,
a:link,
a:active {
color: #0081ff;
}
}
//弹出层样式
.popups{
.el-dialog__headerbtn{
.popups {
.el-dialog__headerbtn {
top: 14px;
right: 12px;
z-index: 3;
}
.poptitle{
.poptitle {
line-height: 48px;
border-bottom: 1px solid #E1E1E1;
border-bottom: 1px solid #e1e1e1;
height: 48px;
position: absolute;
top: 0;
left: 0;
width: 100%;
>img{
> img {
width: 17px;
margin: 16px;
float: left;
}
>span{
> span {
font-weight: bold;
font-size: 16px;
color: #232323;
......@@ -426,22 +443,22 @@
text-overflow: ellipsis;
}
}
.popform{
.popform {
padding-top: 24px;
.row{
.row {
margin-bottom: 16px;
position: relative;
.resultlist{
.resultlist {
position: absolute;
width: 100%;
max-height: 218px;
background: #FFFFFF;
box-shadow: 0px 4px 10px 0px rgba(0,0,0,0.1);
background: #ffffff;
box-shadow: 0px 4px 10px 0px rgba(0, 0, 0, 0.1);
overflow: auto;
z-index: 2;
text-indent: 13px;
cursor: pointer;
>div{
> div {
font-size: 14px;
color: #333;
height: 32px;
......@@ -449,159 +466,164 @@
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
&:hover{
background: #F1F6FB;
&:hover {
background: #f1f6fb;
}
}
}
.el-form-item__label{
.el-form-item__label {
font-weight: 400;
opacity: 0.8;
padding: 0;
}
.el-input,.el-textarea{
.el-input,
.el-textarea {
display: inline-block;
width: 240px;
.el-input__inner,.el-textarea__inner{
.el-input__inner,
.el-textarea__inner {
width: 100%;
height: 32px;
border-radius: 0px;
&:hover{
border-color: #0081FF;
&:hover {
border-color: #0081ff;
}
}
.el-textarea__inner{
.el-textarea__inner {
height: 90px;
font-family: inherit;
color: #000;
}
.el-input__suffix{
.el-input__suffix {
height: 32px;
}
.el-input__icon{
.el-input__icon {
line-height: 32px;
}
.el-icon-arrow-up:before{
.el-icon-arrow-up:before {
content: "\e78f";
opacity: 0.4;
}
.el-icon-arrow-down:before{
.el-icon-arrow-down:before {
content: "\e790";
opacity: 0.4;
color: #232323;
}
}
.el-form-item__error{
.el-form-item__error {
padding-top: 2px;
}
}
.popbot{
.popbot {
text-align: right;
padding-top: 8px;
padding-right: 0;
.btn{
.btn {
border-radius: 2px;
width: 80px;
}
}
.row.i{
.el-form-item__label{
.row.i {
.el-form-item__label {
line-height: 18px;
text-align: left;
}
}
}
.popform.i{
.el-input,.el-textarea{
.popform.i {
.el-input,
.el-textarea {
width: 335px;
}
}
.popform.j{
.el-input{
.popform.j {
.el-input {
width: 364px;
}
}
.types{
.types {
display: flex;
justify-content: space-between;
padding: 24px 0;
>div{
> div {
cursor: pointer;
>i{
> i {
width: 14px;
height: 14px;
border-radius: 150%;
border: 1px solid #DCDFE6;
border: 1px solid #dcdfe6;
float: left;
margin: 3px 8px 0 0;;
margin: 3px 8px 0 0;
}
&.on{
color: #0081FF;
>i{
border-color: #0081FF;
&:after{
&.on {
color: #0081ff;
> i {
border-color: #0081ff;
&:after {
content: " ";
width: 8px;
height: 8px;
border-radius: 50%;
background: #0081FF;
background: #0081ff;
float: left;
margin: 2px;
}
}
}
}
}
}
.el-select-dropdown__item.hover, .el-select-dropdown__item:hover{
background: #F4F6F9;
color: #0081FF;
.el-select-dropdown__item.hover,
.el-select-dropdown__item:hover {
background: #f4f6f9;
color: #0081ff;
}
//跟进记录、工作待办
.records{
.records {
width: 800px;
box-sizing: content-box;
padding: 0 16px 24px;
.writeIn{
.writeIn {
margin-top: -10px;
.default{
.default {
width: 800px;
height: 46px;
background: #F3F4F5;
background: #f3f4f5;
border-radius: 6px;
line-height: 46px;
>img{
> img {
float: left;
width: 16px;
margin: 15px 4px 0px 16px;
}
>div{
> div {
font-size: 14px;
opacity: 0.4;
}
}
.writting{
.writting {
width: 800px;
padding: 16px;
border-radius: 6px;
border: 1px solid #68AEFF;
&.w836{
border: 1px solid #68aeff;
&.w836 {
width: 836px;
}
.wri_top{
>img{
.wri_top {
> img {
float: left;
width: 16px;
}
.el-input,.el-textarea {
.el-input,
.el-textarea {
width: calc(100% - 26px);
display: inline-block;
}
.el-input__inner,.el-textarea__inner{
.el-input__inner,
.el-textarea__inner {
line-height: 16px;
height: 16px;
border: 0;
......@@ -611,13 +633,13 @@
font-size: 14px;
}
}
.wr_bot{
.wr_bot {
position: relative;
padding-top: 25px;
display: flex;
.sels{
.sels {
position: relative;
>img{
> img {
position: absolute;
left: 10px;
z-index: 1;
......@@ -625,117 +647,119 @@
width: 16px;
}
}
.el-input{
.el-input {
display: inline-block;
margin-right: 12px;
position: relative;
.el-input__inner{
.el-input__inner {
height: 32px;
padding: 0;
text-indent: 30px;
width: 100px;
&:hover{
border-color: #0081FF;
&:hover {
border-color: #0081ff;
}
}
.el-input__prefix .el-input__icon{
.el-input__prefix .el-input__icon {
//left: 8px;
top: -2px;
position: absolute;
}
.el-input__suffix{
.el-input__suffix {
height: 32px;
right: 13px;
}
.el-input__icon{
.el-input__icon {
line-height: 32px;
}
.el-icon-arrow-up:before{
.el-icon-arrow-up:before {
content: "\e78f";
opacity: 0.4;
}
}
.times{
.times {
display: inline-block;
position: relative;
>img{
> img {
position: absolute;
left: 8px;
top: 8px;
width: 16px;
z-index: 1;
}
.el-input{
.el-input {
position: absolute;
}
.el-input__icon{
.el-input__icon {
opacity: 0;
}
}
.w128{
.el-input__inner{
.w128 {
.el-input__inner {
width: 128px;
}
}
.w120{
.el-input__inner{
.w120 {
.el-input__inner {
width: 120px;
}
}
}
}
}
.recordlist{
.recordlist {
padding-left: 10px;
padding-top: 19px;
.rec_detail{
border-left: 1px dashed rgba(0,129,255,0.5);
.rec_detail {
border-left: 1px dashed rgba(0, 129, 255, 0.5);
font-size: 14px;
padding-bottom: 34px;
&:last-child{
&:last-child {
border: 0;
}
.rec_time{
color: #0081FF;
.rec_time {
color: #0081ff;
position: relative;
.el-icon-time{
.el-icon-time {
font-size: 16px;
float: left;
margin: -1px 10px 0 -8px;
background: #fff;
}
.operate{
.operate {
display: none;
position: absolute;
right: 0;
top: 0;
>img{
> img {
margin-left: 16px;
cursor: pointer;
width: 20px;
}
}
}
.rec_con{
.rec_con {
margin: 12px 0 0 18px;
background: #F6F9FD;
background: #f6f9fd;
border-radius: 6px;
padding: 24px;
border: 1px solid #F6F9FD;
border: 1px solid #f6f9fd;
//box-sizing: content-box;
box-sizing: border-box;
>div{
>span{opacity: 0.8;}
> div {
> span {
opacity: 0.8;
}
line-height: 30px;
&.rec_text{
&.rec_text {
opacity: 0.4;
>span{
> span {
padding-right: 24px;
}
}
>strong{
> strong {
opacity: 1;
font-size: 18px;
line-height: 14px;
......@@ -744,229 +768,231 @@
}
}
.rec_detail:hover{
.operate{
.rec_detail:hover {
.operate {
display: block;
}
.rec_con{
border: 1px solid #68AEFF;
.rec_con {
border: 1px solid #68aeff;
}
}
}
.tasktitle{
color: #3D3D3D;
.tasktitle {
color: #3d3d3d;
line-height: 28px;
font-size: 14px;
padding-left: 11px;
margin-top: 24px;
&:after{
content: ' ';
&:after {
content: " ";
width: 4px;
height: 4px;
background: #0081FF;
background: #0081ff;
border-radius: 50%;
float: left;
margin-top: 12px;
margin-left: -9px;
}
>span{
> span {
width: 88px;
height: 26px;
border-radius: 14px;
border: 1px solid #FF3C3C;
color: #FF3C3C;
border: 1px solid #ff3c3c;
color: #ff3c3c;
line-height: 26px;
text-align: center;
display: inline-block;
margin-left: 10px;
&.on{
background: #FF3C3C;
color: #FF3C3C;
&.on {
background: #ff3c3c;
color: #ff3c3c;
}
&:hover{
border: 1px solid #FF3C3C;
color: #FF3C3C;
background: #FFEBEB;
&:hover {
border: 1px solid #ff3c3c;
color: #ff3c3c;
background: #ffebeb;
}
}
}
.tasklist{
.tasklist {
padding: 24px;
background: #F6F9FD;
background: #f6f9fd;
border-radius: 6px;
margin-top: 16px;
position: relative;
.task_name{
.task_name {
font-size: 16px;
}
.task_con{
.task_con {
padding-top: 12px;
line-height: 14px;
font-size: 14px;
>span{
color: rgb(167,167,167);
> span {
color: rgb(167, 167, 167);
padding-right: 28px;
}
}
.select{
.select {
position: absolute;
width: 88px;
height: 32px;
background: #E0E4EA;
background: #e0e4ea;
border-radius: 4px;
right: 16px;
top: 30px;
padding: 8px 12px;
line-height: 16px;
box-sizing: border-box;
&.on{
background: #D3F0E8;
.color_text{
color: #0CBC6D;
&.on {
background: #d3f0e8;
.color_text {
color: #0cbc6d;
}
}
.select-popper{
.select-popper {
margin: 0;
}
.el-icon-caret-bottom{
color:rgba(35,35,35,0.4) ;
.el-icon-caret-bottom {
color: rgba(35, 35, 35, 0.4);
}
}
}
}
//资料文档、相关企业
.searchbtns{
.searchbtns {
position: absolute;
left: 100px;
top: 17px;
width: calc(100% - 116px);
.searchInput, .el-select {
.searchInput,
.el-select {
float: left;
}
.btn{
.btn {
float: right;
}
.searchInput{
.searchInput {
position: relative;
&.small{
&.small {
border: 1px solid #fff;
width: 240px;
.el-input{
.el-input {
//width: 180px;
}
.el-input__inner{
.el-input__inner {
//padding-right: 32px;
}
.el-input__prefix{
.el-input__prefix {
left: 8px;
top: -3px;
img{
img {
width: 16px;
}
}
}
}
.b2{
.b2 {
width: 80px;
border-radius: 2px;
}
.b3{
.b3 {
padding: 0 10px;
border-radius: 2px;
}
.select{
.select {
width: 94px;
.el-input__inner{
.el-input__inner {
//width: 110px;
height: 32px;
background: #FFFFFF;
background: #ffffff;
border-radius: 4px;
border: 0;
padding:5px 28px 5px 8px;
padding: 5px 28px 5px 8px;
}
.el-input--medium .el-input__icon{
.el-input--medium .el-input__icon {
line-height: 32px;
}
margin-right: 10px;
.is-focus{
.el-input__inner{
background: #F4F6F9;
.is-focus {
.el-input__inner {
background: #f4f6f9;
}
}
}
}
.document{
padding:0 16px 16px;
.document {
padding: 0 16px 16px;
margin-top: -14px;
.el-table {
color: #232323;
&::before{
background: #FFFFFF;
&::before {
background: #ffffff;
}
th.el-table__cell.is-leaf, td.el-table__cell{
th.el-table__cell.is-leaf,
td.el-table__cell {
border: 0;
color: #232323;
padding: 2px 0 0;
}
td.el-table__cell{
td.el-table__cell {
padding: 12px 0;
}
.el-table__header-wrapper{
.el-table__header-wrapper {
border-bottom: 1px solid #eeeeee;
}
.el-table--enable-row-hover .el-table__body tr:hover > td.el-table__cell{
background: #F6F9FC;;
.el-table--enable-row-hover .el-table__body tr:hover > td.el-table__cell {
background: #f6f9fc;
}
.el-table__header-wrapper th, th.el-table__cell.is-leaf{
.el-table__header-wrapper th,
th.el-table__cell.is-leaf {
background: #fff;
}
.hoverbtn{
.hoverbtn {
display: none;
>div{
> div {
cursor: pointer;
margin-right: 24px;
}
.xz{
.xz {
opacity: 0.8;
}
.xg{
.xg {
//color: #FF3C3C;
}
.sc{
color: #FF3C3C;
.sc {
color: #ff3c3c;
}
}
tr:hover{
.hoverbtn{
tr:hover {
.hoverbtn {
display: flex;
justify-content: right;
}
}
.el-table__header-wrapper th{
background: #FFFFFF;
.el-table__header-wrapper th {
background: #ffffff;
font-size: 13px;
opacity: 0.8;
font-weight: 400;
}
.is-sortable .sort-caret.ascending{
border-bottom-color: #0081FF;
.is-sortable .sort-caret.ascending {
border-bottom-color: #0081ff;
opacity: 0.4;
}
.sort-caret.descending{
border-top-color:#0081FF;
.sort-caret.descending {
border-top-color: #0081ff;
opacity: 0.4;
}
.ascending .sort-caret.ascending{
.ascending .sort-caret.ascending {
opacity: 1;
}
.descending .sort-caret.descending{
.descending .sort-caret.descending {
opacity: 1;
}
.img{
.img {
float: left;
margin-right: 8px;
margin-top: -2px;
......@@ -975,19 +1001,17 @@
}
}
/*
客户管理
*/
//表格搜索
.table_search{
.table_search {
padding-bottom: 16px;
display: flex;
justify-content: space-between;
.searchInput{
.searchInput {
width: 320px;
.el-input__inner{
.el-input__inner {
font-size: 12px;
}
}
......@@ -997,100 +1021,100 @@
}
}
}
.p10{
.p10 {
padding: 0 10px;
}
.tips{
.tips {
display: inline-block;
padding: 4px 8px;
border-radius: 2px;
font-size: 12px;
margin-right: 8px;
&.tip1{
background-color: #E4F3FD;
color: #41A1FD;
&.tip1 {
background-color: #e4f3fd;
color: #41a1fd;
}
&.tip2{
background-color: #F3F3FF;
color: #8491E8;
&.tip2 {
background-color: #f3f3ff;
color: #8491e8;
}
&.tip3{
background-color: #DEF6F0;
color: #0BAE8D;
&.tip3 {
background-color: #def6f0;
color: #0bae8d;
}
}
//批量导入
.uploadwin{
background: rgba(0,0,0,0.3);
.uploadwin {
background: rgba(0, 0, 0, 0.3);
width: 100%;
height: 100%;
position: fixed;
top: 0;
left: 0;
z-index: 10;
.upload{
z-index: 1024;
.upload {
width: 528px;
height: 430px;
background: #F4F9FF;
background: #f4f9ff;
border-radius: 4px;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
.up_title{
transform: translate(-50%, -50%);
.up_title {
font-size: 14px;
font-weight: 700;
text-align: center;
line-height: 50px;
}
.up_box{
.up_box {
margin: 0 24px;
width: 480px;
height: 296px;
background: #FFFFFF;
background: #ffffff;
border-radius: 2px;
border: 1px dashed #0081FF;
border: 1px dashed #0081ff;
position: relative;
.el-upload-dragger{
.el-upload-dragger {
height: 294px;
width: 478px;
border: 0;
}
.up_img{
.up_img {
margin: 56px auto 13px;
width: 50px;
}
.up_text{
.up_text {
color: #666;
font-size: 14px;
line-height: 18px;
padding-bottom: 12px;
}
.up_tip{
.up_tip {
color: #999;
font-size: 12px;
line-height: 16px;
padding-bottom: 12px;
text-align: left;
padding-left: 82px;
&:before{
&:before {
content: " ";
width: 4px;
height: 4px;
background: #D8D8D8;
background: #d8d8d8;
border-radius: 50%;
float: left;
margin: 6px 6px 0 0;
}
}
.up_success{
.up_success {
padding-top: 135px;
font-size: 18px;
color: #46AF41;
color: #46af41;
font-weight: 700;
line-height: 24px;
>img{
> img {
float: left;
width: 24px;
margin-right: 10px;
......@@ -1098,22 +1122,22 @@
}
}
}
.btn_download{
.btn_download {
position: absolute;
width: 78px;
height: 22px;
background: #E2EEFF;
background: #e2eeff;
border-radius: 2px;
color: #0081FF;
color: #0081ff;
background: rgba(0, 129, 255, 0.16);
font-size: 12px;
line-height: 22px;
top: 148px;
right: 61px;
cursor: pointer;
.img{
.img {
float: left;
background: url('../images/upload.png')no-repeat center center;
background: url("../images/upload.png") no-repeat center center;
transform: rotateX(180deg);
width: 9px;
height: 11px;
......@@ -1121,103 +1145,107 @@
}
}
}
.btns{
.btns {
text-align: center;
.btn_primary,.btn_disabled,.btn_default{
.btn_primary,
.btn_disabled,
.btn_default {
border-radius: 2px;
margin: 24px 8px 0;
width: 104px;
}
.btn_disabled{
.btn_disabled {
background: #999;
}
}
.success{
.success {
min-width: 240px;
padding: 0 24px;
height: 175px;
background: #FFFFFF;
background: #ffffff;
border-radius: 4px;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
transform: translate(-50%, -50%);
text-align: center;
.img{
.img {
display: block;
margin: 24px auto 16px;
width: 60px;
}
.p1{
.p1 {
font-size: 16px;
font-family: Microsoft YaHei-Bold, Microsoft YaHei;
font-weight: 700;
color: rgba(35,35,35,0.8);
color: rgba(35, 35, 35, 0.8);
line-height: 21px;
}
.p2{
.p2 {
margin-top: 16px;
font-size: 14px;
font-family: Microsoft YaHei-Regular, Microsoft YaHei;
font-weight: 400;
color: rgba(35,35,35,0.4);
color: rgba(35, 35, 35, 0.4);
line-height: 14px;
}
.p3{
.p3 {
padding-top: 35px;
font-size: 18px;
color: #46AF41;
color: #46af41;
font-weight: 700;
line-height: 24px;
text-align: left;
>img{
> img {
float: left;
width: 24px;
margin-right: 10px;
margin-left: 67px;
}
}
.btn_primary{
.btn_primary {
margin-top: 16px;
}
}
}
.el-input__inner{
.el-input__inner {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
padding-right: 10px;
}
.none{display: none}
.el-dialog__body{
.none {
display: none;
}
.el-dialog__body {
padding-top: 14px;
padding-bottom: 18px;
}
.tables{
.el-table__body-wrapper{
.tables {
.el-table__body-wrapper {
&::-webkit-scrollbar {
width: 16px; //竖轴宽度
height: 16px; //横轴宽度
}
&::-webkit-scrollbar-track {
background-color: #F3F4F5;
background-color: #f3f4f5;
border-radius: 0;
}
&::-webkit-scrollbar-thumb {
background-color: rgba(98,110,126,0.2);
border: 4px solid #F3F4F5;
background-color: rgba(98, 110, 126, 0.2);
border: 4px solid #f3f4f5;
border-radius: 10px;
}
&::-webkit-scrollbar-corner {
background: #F3F4F5;
background: #f3f4f5;
/*border-left: 1px solid #E0EAF2;*/
}
}
::-webkit-scrollbar-track-piece {
//滚动条凹槽的颜色,还可以设置边框属性
background-color: #F3F4F5;
background-color: #f3f4f5;
height: 16px;
padding: 0 4px;
}
......@@ -1225,7 +1253,7 @@
::-webkit-scrollbar {
width: 8px;
height: 16px;
background-color: #F3F4F5;
background-color: #f3f4f5;
border-radius: 6px;
}
//滚动条的滑块
......@@ -1233,14 +1261,15 @@
border-radius: 8px;
height: 8px;
margin: 0 4px;
background: rgba(98,110,126,0.2);
border: 4px solid #F3F4F5;
&:hover{
background: rgba(98, 110, 126, 0.2);
border: 4px solid #f3f4f5;
&:hover {
background: #566380;
}
}
}
.select-multiple,.select-popper .el-input{
.select-multiple,
.select-popper .el-input {
//top: 10px !important;
line-height: 34px !important;
}
......@@ -1251,7 +1280,7 @@
//box-shadow: 4px 0 9px -5px rgba(0, 0, 0, 0.12);
//-webkit-box-shadow: 4px 0 9px -5px rgba(0, 0, 0, 0.12);
}
.el-select .el-input__inner{
.el-select .el-input__inner {
padding-left: 16px;
}
.el-tooltip__popper.is-dark {
......@@ -1270,23 +1299,23 @@
top: 56px;
z-index: 9;
}
.el-table__fixed-header-wrapper{
.el-table__fixed-header-wrapper {
position: sticky;
z-index: 9;
top: 56px;
}
.el-table__fixed{
.el-table__fixed {
overflow-x: clip;
overflow-y: clip;
}
}
.tables{
.tables {
.el-table__fixed {
.el-table__body {
padding-bottom: 16px;
}
}
}
.top12{
.top12 {
margin-top: 12px;
}
#app {
.main-container {
height: 100%;
transition: margin-left .28s;
transition: margin-left 0.28s;
margin-left: $base-sidebar-width;
width: calc(100% - #{$base-sidebar-width});
position: relative;
background: #F5F5F5;
background: #f5f5f5;
}
.sidebarHide {
margin-left: 0!important;
margin-left: 0 !important;
}
.sidebar-container {
-webkit-transition: width .28s;
-webkit-transition: width 0.28s;
transition: width 0.28s;
width: $base-sidebar-width !important;
background-color: $base-menu-background;
......@@ -28,25 +28,30 @@
// -webkit-box-shadow: 2px 0 6px rgba(0,21,41,.35);
// box-shadow: 2px 0 6px rgba(0,21,41,.35);
//展开、收起箭头
.side-expand{
.side-expand {
position: absolute;
top: 180px;
width: 21px;
height: 62px;
cursor: pointer;
animation: left-right .2s;
animation: left-right 0.2s;
animation-fill-mode: forwards;
z-index: 1002;
}
@keyframes left-right{
0%{right: 0;}
100%{right: -21px;}
@keyframes left-right {
0% {
right: 0;
}
100% {
right: -21px;
}
}
// reset element-ui css
.horizontal-collapse-transition {
transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out;
transition: 0s width ease-in-out, 0s padding-left ease-in-out,
0s padding-right ease-in-out;
}
.scrollbar-wrapper {
......@@ -59,11 +64,8 @@
.el-scrollbar {
height: 100%;
}
&.has-logo {
.el-scrollbar {
height: calc(100% - 50px);
......@@ -83,7 +85,7 @@
.svg-icon {
margin-right: 6px;
}
.el-submenu__icon-arrow{
.el-submenu__icon-arrow {
top: 54%;
right: 5px;
color: #d8d8d8;
......@@ -95,28 +97,29 @@
width: calc(100% - 16px) !important;
margin: 0 8px;
}
.el-menu--inline{
.el-menu--inline {
margin: 0;
width: 100%!important;
width: 100% !important;
}
.el-menu--inline .nest-menu .el-menu-item{
width: 100%!important;
.el-menu--inline .nest-menu .el-menu-item {
width: 100% !important;
min-width: 128px;
font-size: 12px;
color: #fff!important;
padding-left: 23px!important;
color: #fff !important;
padding-left: 23px !important;
}
.el-menu--inline .nest-menu .el-menu-item .svg-icon{
.el-menu--inline .nest-menu .el-menu-item .svg-icon {
display: none;
}
.el-menu-item, .el-submenu__title {
.el-menu-item,
.el-submenu__title {
height: 40px;
line-height: 40px;
border: 1px solid #141b2f;
color: #fff;
margin-bottom: 6px;
padding: 0 6px!important;
padding: 0 6px !important;
overflow: hidden !important;
text-overflow: ellipsis !important;
white-space: nowrap !important;
......@@ -125,44 +128,43 @@
// menu hover
.el-menu-item.is-active {
// 点击菜单的颜色
background-color: #1e2c4c!important;
color: #fff!important;
background-color: #1e2c4c !important;
color: #fff !important;
border-radius: 10px;
border: 1px solid #2b3f69;
&:hover {
background-color: #1e2c4c!important;
background-color: #1e2c4c !important;
border-radius: 10px;
color: #fff!important;
color: #fff !important;
border: 1px solid #2b3f69;
}
&:before{
background: #fff!important;
&:before {
background: #fff !important;
}
}
// menu hover
.submenu-title-noDropdown, .el-submenu__title {
color: #fff!important;
.submenu-title-noDropdown,
.el-submenu__title {
color: #fff !important;
&:hover {
background-color: #1e2c4c!important;
color: #fff!important;
background-color: #1e2c4c !important;
color: #fff !important;
border-radius: 10px;
border: 1px solid #2b3f69;
}
}
}
.sidebar-container .el-submenu .el-menu-item:hover,.sidebar-container .nest-menu .el-submenu>.el-submenu__title:hover {
background-color: #1e2c4c!important;
color: #fff!important;
.sidebar-container .el-submenu .el-menu-item:hover,
.sidebar-container .nest-menu .el-submenu > .el-submenu__title:hover {
background-color: #1e2c4c !important;
color: #fff !important;
border-radius: 10px;
border: 1px solid #2b3f69;
}
.sidebar-container .el-submenu .el-menu-item:before, .sidebar-container .nest-menu .el-submenu>.el-submenu__title:before {
.sidebar-container .el-submenu .el-menu-item:before,
.sidebar-container .nest-menu .el-submenu > .el-submenu__title:before {
position: absolute;
width: 2px;
height: 2px;
......@@ -172,7 +174,8 @@
top: 50%;
content: "";
}
.sidebar-container .el-submenu .el-menu-item:hover:before, .sidebar-container .nest-menu .el-submenu>.el-submenu__title:hover:before{
.sidebar-container .el-submenu .el-menu-item:hover:before,
.sidebar-container .nest-menu .el-submenu > .el-submenu__title:hover:before {
position: absolute;
width: 2px;
height: 2px;
......@@ -190,11 +193,12 @@
.main-container {
margin-left: 48px;
width: calc(100% - 48px);
}
.submenu-title-noDropdown {
margin-bottom: 6px;
padding: 0 6px!important;
padding: 0 6px !important;
text-align: center;
cursor: pointer;
position: relative;
......@@ -203,7 +207,7 @@
padding: 0 !important;
.svg-icon {
margin: 0px!important;
margin: 0px !important;
width: 1em;
height: 1em;
font-size: 16px;
......@@ -211,7 +215,6 @@
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
}
}
......@@ -219,14 +222,14 @@
.el-submenu {
overflow: hidden;
&>.el-submenu__title {
& > .el-submenu__title {
margin-bottom: 6px;
padding: 0 6px!important;
padding: 0 6px !important;
text-align: center;
cursor: pointer;
.svg-icon {
margin: 0px!important;
margin: 0px !important;
width: 1em;
height: 1em;
font-size: 16px;
......@@ -236,14 +239,13 @@
overflow: hidden;
margin-left: 0px;
}
}
}
.el-menu--collapse {
.el-submenu {
&>.el-submenu__title {
&>span {
& > .el-submenu__title {
& > span {
height: 0;
width: 0;
overflow: hidden;
......@@ -266,7 +268,7 @@
}
.sidebar-container {
transition: transform .28s;
transition: transform 0.28s;
width: $base-sidebar-width !important;
}
......@@ -280,7 +282,6 @@
}
.withoutAnimation {
.main-container,
.sidebar-container {
transition: none;
......@@ -290,13 +291,13 @@
// when menu collapsed
.el-menu--vertical {
&>.el-menu {
& > .el-menu {
.svg-icon {
margin-right: 16px;
}
}
.nest-menu .el-submenu>.el-submenu__title,
.nest-menu .el-submenu > .el-submenu__title,
.el-menu-item {
&:hover {
// you can use $subMenuHover
......@@ -305,7 +306,7 @@
}
// the scroll bar appears when the subMenu is too long
>.el-menu--popup {
> .el-menu--popup {
max-height: 100vh;
overflow-y: auto;
......@@ -323,24 +324,24 @@
}
}
}
.side-popover{
.side-popover {
min-width: 80px;
font-size: 12px;
color: #232323;
padding: 0 8px 32px 8px;
margin-left: 16px !important;
.side-title{
.side-title {
font-size: 16px;
height: 54px;
line-height: 58px;
padding: 0 6px;
border-bottom: 1px solid #F0F0F0;
border-bottom: 1px solid #f0f0f0;
}
.side-list{
li{
.side-list {
li {
padding: 24px 6px 0 6px;
&:hover{
color: #3D3D3D;
&:hover {
color: #3d3d3d;
}
}
}
......@@ -348,15 +349,15 @@
.side-retract {
height: 40px;
line-height: 48px;
border: 1px solid #141B2F;
border: 1px solid #141b2f;
margin-bottom: 6px;
padding: 0 6px !important;
text-align: center;
cursor: pointer;
&:hover {
background-color: #1E2C4C !important;
background-color: #1e2c4c !important;
border-radius: 10px;
border: 1px solid #2B3F69;
border: 1px solid #2b3f69;
}
.svg-icon {
margin-right: 0 !important;
......@@ -370,10 +371,10 @@
margin-left: 0px;
}
}
.side-one-popover{
.side-one-popover {
min-width: 52px;
padding-bottom: 0;
.side-title{
.side-title {
font-size: 12px;
height: 24px;
line-height: 24px;
......@@ -381,23 +382,23 @@
}
}
.side-logo-popover{
.side-logo-popover {
width: 120px;
padding-top: 16px;
padding-bottom: 0;
margin-left: 16px !important;
.sidebar-logo{
.sidebar-logo {
width: 24px;
height: 24px;
background: #F5F5F5;
background: #f5f5f5;
margin: 0 auto;
text-align: center;
img{
img {
width: 16px;
height: 23px;
}
}
.side-title{
.side-title {
text-align: center;
font-size: 12px;
height: auto;
......
<template>
<div class="no-data">
<div class="no-data-box">
<img :src="noData" alt="抱歉,没找到相关数据" />
<div v-if="record">抱歉,您还未添加跟进动态</div>
<template v-else>
<div v-if="text">抱歉,您还未添加{{text}}项目</div>
<div v-else>抱歉,没找到相关数据</div>
</template>
<span v-if="condition">建议调整关键词或筛选条件,重新搜索</span>
</div>
</div>
</template>
<script>
export default {
name: "noData",
props: {
record: {
type: Boolean,
default: false
},
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 class="Tables table-list-com-ins">
<div class="table-item">
<el-table v-if="tableDataTotal>0" class="fixed-table" :class="headerFixed ? 'headerFixed':''" v-loading="tableLoading" :data="tableData"
element-loading-text="Loading" ref="tableRef" border fit highlight-current-row v-sticky-header.always="stickyHeader"
:default-sort="defaultSort?defaultSort:{}" @sort-change="sortChange" @selection-change="selectionChange">
<el-table-column type="selection" :width="needSelection.width ? needSelection.width : '38px'" v-if="needSelection.flag"
:fixed="needSelection.fixed" :align="needSelection.align">
</el-table-column>
<el-table-column v-if="isIndex" label="序号" :width="flexWidth(tableData)" align="left" :fixed="indexFixed" :resizable="false">
<template slot-scope="scope">{{ queryParams.pageNum * queryParams.pageSize - queryParams.pageSize + scope.$index + 1 }}</template>
</el-table-column>
<template>
<el-table-column v-for="(item,index) in formColum" :key="index" :label="item.label" :prop="item.prop" :width="item.width"
:min-width="item.minWidth" :align="item.align?item.align:'left'" :fixed="item.fixed"
:sortable="item.sortable ?item.sortable=='custom'? 'custom':true : false" :resizable="false">
<template v-if="item.children&&item.children.length">
<el-table-column v-for="(cld, i) in item.children" :key="i" :prop="cld.prop" :label="cld.label" :width="cld.width" :resizable="false">
<template slot-scope="cldscope">
<template v-if="cld.slot">
<slot :name="cld.prop" :row="cldscope.row" :data="cld"></slot>
</template>
<template v-else>
<span>{{cldscope.row[cld.prop] || '--'}}</span>
</template>
</template>
</el-table-column>
</template>
<template v-else-if="item.slotHeader" slot="header">
<slot :name="item.slotName"></slot>
</template>
<template slot-scope="scope">
<slot v-if="item.slot" :name="item.prop" :row="scope.row" :index="scope.$index" :data="item"></slot>
<!-- 操作栏 -->
<slot v-else-if="item.prop == 'action-field-bar'" name="action-field-bar" :row="scope.row" :index="scope.$index" :data="item"></slot>
<span v-else>
{{ scope.row[item.prop] || '--' }}
</span>
</template>
</el-table-column>
</template>
<template slot="empty">
</template>
</el-table>
<div style="padding: 30px 0" v-else>
<no-data />
</div>
</div>
<div class="pagination-box" v-if="show_page && tableDataTotal>queryParams.pageSize">
<el-pagination background :current-page="current_page" :page-size="queryParams.pageSize" :total="tableDataTotal"
layout="prev, pager, next, jumper" @current-change="handleCurrentChange" @size-change="handleSizeChange" />
</div>
</div>
</template>
<script>
import NoData from '@/components/NoData';
export default {
name: "tableListCom",
props: {
isIndex: {
type: Boolean,
default: true
},
needSelection: {
type: Object,
default: () => ({
flag: false,
width: "39px",
fixed: false,
align: "left"
})
},
// 吸顶偏移量
stickyHeader: {
type: Object,
default: () => ({
offsetBottom: '10px',
offsetTop: "0px"
})
},
headerFixed: {
type: Boolean,
default: false
},
indexFixed: {
type: Boolean,
default: false
},
tableLoading: {
type: Boolean,
default: false
},
defaultSort: {
type: Object,
default: null
},
tableData: {
type: Array,
default: () => []
},
formColum: {
type: Array,
default: () => []
},
tableDataTotal: {
type: Number,
default: 0
},
queryParams: {
type: Object,
default: () => ({})
},
paging: {
type: Boolean,
default: true
},
MaxPage: { //最大页码
type: Number,
default: 500
},
},
components: {
NoData
},
data() {
return {
current_page: this.queryParams.pageNum,
show_page: this.paging
};
},
watch: {
'queryParams.pageNum'(newVal, oldVal) {
this.current_page = newVal;
}
},
created() {
},
methods: {
handleCurrentChange(e) {
if (this.MaxPage < e) {
this.show_page = false;
this.$nextTick(() => {
this.current_page = this.queryParams.pageNum;
this.$message.warning(`对不起,最多只能访问${this.MaxPage}页`);
this.show_page = true;
});
} else {
this.$emit('handle-current-change', e);
}
},
handleSizeChange(e) {
this.$emit('handle-current-change', e);
},
sortChange(e) {
this.$emit('sort-change', e);
},
selectionChange(selectionArray) {
this.$emit("selectionChange", selectionArray);
},
flexWidth(tableData) {
let currentMax = this.queryParams.pageNum * this.queryParams.pageSize - this.queryParams.pageSize + tableData.length, wdth = 59;
if (currentMax.toString().length > 3) {
wdth = wdth + (currentMax.toString().length - 3) * 10;
}
return wdth + 'px';
}
}
}
</script>
<style lang="scss" scoped>
.Tables {
::v-deep .el-table__body tr.current-row > td.el-table__cell {
background-color: #ffffff;
}
/*::v-deep .el-table__fixed{
height: calc(100% - 16px) !important;
}*/
::v-deep .el-table__row {
&:nth-child(even) {
background-color: #f9fcff;
.more {
background: #f8fbff;
span {
color: #0081ff;
}
}
}
&:nth-child(odd) {
.more {
span {
color: #0081ff;
}
}
}
}
.table-item {
::v-deep .el-table td.el-table__cell {
border-bottom: 0;
}
}
::v-deep .el-table th.el-table__cell.is-leaf,
::v-deep .el-table td.el-table__cell {
border-bottom: 1px solid #e6eaf1;
}
::v-deep .el-table--border .el-table__cell {
border-right: 1px solid #e6eaf1;
}
::v-deep .el-table__body tr.hover-row.current-row > td,
::v-deep .el-table__body tr.hover-row.el-table__row--striped.current-row > td,
::v-deep .el-table__body tr.hover-row.el-table__row--striped > td,
::v-deep .el-table__body tr.hover-row > td {
background-color: #dcebff !important;
.more {
background: #dcebff;
}
}
::v-deep .el-table--enable-row-hover .el-table__body tr:hover > td {
background-color: #dcebff;
}
::v-deep .el-table__header-wrapper {
position: sticky;
top: 0;
z-index: 99;
}
::v-deep .el-table__fixed {
overflow-x: clip;
overflow-y: clip;
}
}
.table-list-com-ins {
::v-deep .el-table {
.el-table__fixed-header-wrapper {
top: 0px;
}
}
}
</style>
......@@ -44,7 +44,7 @@
<svg :class="isActive(tag)?'tags-icon tags-icon-active':'tags-icon'" aria-hidden="true">
<use :xlink:href="iconName(tag)" />
</svg>
<span :id="isActive(tag)?'tagTitle':''">{{ tag.title }}</span>
<span :id="isActive(tag)?'tagTitle':''">{{ tag.title.replace(/<[^>]+>/g, '') }}</span>
<span v-if="!isAffix(tag)" class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)" />
<i :class="index!=visitedViews.length-1 && index != isActiveIndex() && index != isActiveIndex()-1?'tags-item-line':'tags-item-line item-color'" />
</router-link>
......@@ -166,7 +166,7 @@ export default {
}
},
isActive(route) {
return route.path === this.$route.path
return route.path.split("?")[0] === this.$route.path
},
isAffix(tag) {
return tag.meta && tag.meta.affix
......
......@@ -15,6 +15,7 @@ import directive from './directive'; // directive
import plugins from './plugins'; // plugins
import { download } from '@/utils/request';
import horizontalScroll from 'el-table-horizontal-scroll';
import elTableSticky from '@cell-x/el-table-sticky';
import './assets/icons'; // icon
import './permission'; // permission control
......@@ -61,6 +62,7 @@ Vue.component('ImageUpload', ImageUpload);
Vue.component('ImagePreview', ImagePreview);
Vue.use(horizontalScroll);
Vue.use(elTableSticky);
Vue.use(directive);
Vue.use(plugins);
Vue.use(VueMeta);
......
......@@ -70,7 +70,7 @@ export const constantRoutes = [
path: 'index',
component: () => import('@/views/index'),
name: 'Index',
meta: { title: '首页', icon: 'index'}
meta: { title: '首页', icon: 'index', noCache: true}
}
]
},
......@@ -159,7 +159,19 @@ export const constantRoutes = [
}
]
},
//企业详情
{
path: '',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: '/JumpPage.html',
component: () => import('@/views/detail'),
}
]
},
//乙方-企业详情
{
path: '/company',
component: Layout,
......@@ -174,6 +186,97 @@ export const constantRoutes = [
}
]
},
//企业详情-业绩
{
path: '',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: '/company/:id/performance',
component: () => import('@/views/detail'),
}
]
},
//企业详情-人员
{
path: '',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: '/company/:id/personnel',
component: () => import('@/views/detail'),
}
]
},
//企业详情-经营信息
{
path: '',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: '/company/:id/business',
component: () => import('@/views/detail'),
}
]
},
//企业详情-良好行为
{
path: '',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: '/company/:id/behavior',
component: () => import('@/views/detail'),
}
]
},
//企业详情-信用评价
{
path: '',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: '/company/:id/evaluation',
component: () => import('@/views/detail'),
}
]
},
//企业详情-信用行为
{
path: '',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: '/company/:id/credit',
component: () => import('@/views/detail'),
}
]
},
//企业详情-股权
{
path: '',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: '/company/:id/lt',
component: () => import('@/views/detail'),
}
]
},
//人员详情
{
path: '/personnel',
......@@ -216,6 +319,215 @@ export const constantRoutes = [
}
]
},
//荣誉详情
{
path: '',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: '/honor/:id.html',
component: () => import('@/views/detail'),
}
]
},
//标讯Pro-招标公告
{
path: '',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: '/bxpro/:id.html',
component: () => import('@/views/detail'),
}
]
},
//中标候选人
{
path: '',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: '/zbpro/:id.html',
component: () => import('@/views/detail'),
}
]
},
//开标记录
{
path: '',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: '/biz/tbjl/:id.html',
component: () => import('@/views/detail'),
}
]
},
//一体化详情
{
path: '',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: '/performance/sjyth/:id.html',
component: () => import('@/views/detail'),
}
]
},
//一体化详情
{
path: '',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: '/performance/yth/:id.html',
component: () => import('@/views/detail'),
}
]
},
//四库详情
{
path: '',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: '/performance/sky/:id.html',
component: () => import('@/views/detail'),
}
]
},
//公路系统详情
{
path: '',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: '/performance/glxt/:id.html',
component: () => import('@/views/detail'),
}
]
},
//公路系统详情
{
path: '',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: '/performance/xmzt/:id.html',
component: () => import('@/views/detail'),
}
]
},
//水利详情
{
path: '',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: '/performance/slyj/:id.html',
component: () => import('@/views/detail'),
}
]
},
//江西住建云详情
{
path: '',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: '/performance/jxzjy/:id.html',
component: () => import('@/views/detail'),
}
]
},
//北京业绩详情
{
path: '',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: '/performance/bj/:id.html',
component: () => import('@/views/detail'),
}
]
},
//云南业绩详情
{
path: '',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: '/performance/yn/:id.html',
component: () => import('@/views/detail'),
}
]
},
//商机-标讯详情
{
path: '',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: '/biz/bx/:id.html',
component: () => import('@/views/detail'),
}
]
},
//商机-土地交易详情
{
path: '',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: '/biz/tdjy/:id.html',
component: () => import('@/views/detail'),
}
]
},
//商机-拟建项目详情
{
path: '',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: '/biz/njxm/:id.html',
component: () => import('@/views/detail'),
}
]
},
{
path: '/structure',
component: Layout,
......
/*
* @Author: thy
* @Date: 2023-10-26 14:56:41
* @LastEditors: thy
* @LastEditTime: 2023-10-26 16:00:22
* @Description: file content
* @FilePath: \dsk-operate-ui\src\utils\postMessageBridge\bridge\index.js
*/
class PostMessageBridge {
constructor() {
}
}
\ No newline at end of file
......@@ -25,7 +25,7 @@ service.interceptors.request.use(config => {
// 是否需要设置 token
const isToken = (config.headers || {}).isToken === false
// 是否需要防止数据重复提交
const isRepeatSubmit = (config.headers || {}).repeatSubmit === false||config.url.indexOf('getUipIdByCid')!=-1
const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
if (getToken() && !isToken) {
config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
config.headers['tenantid'] = getTenantid() //携带租户id
......
<template>
<div @click = 'handleALL' class="app-container">
<div @click='handleALL' class="custom-list-container">
<div class="miantitle">
<span>客户管理</span>
<span> / 客户列表</span>
</div>
<div>
<el-card class="box-card noborder min1370">
<el-card class="box-card noborder">
<div class="tables ">
<div class="empty" v-if="tableData.total==0 && !isSkeleton">
<img src="@/assets/images/project/empty.png">
......@@ -18,52 +18,43 @@
<div>
<el-form ref="queryForm" :model="searchParam" :inline="true" size="small">
<el-form-item>
<el-cascader
ref="address1"
:class="[`select-adaptive-${inputID1}`]"
:options="addressList"
:props="addressProps"
v-model="address"
@change="iptAdaptive(inputID1,true)"
placeholder="地区选择"
collapse-tags
style="width: 130px;"
clearable></el-cascader>
<el-cascader ref="address1" :class="[`select-adaptive-${inputID1}`]" :options="addressList" :props="addressProps" v-model="address"
@change="iptAdaptive(inputID1,true)" placeholder="地区选择" collapse-tags style="width: 130px;" clearable></el-cascader>
</el-form-item>
<el-form-item prop="companyNatures">
<el-select v-model="searchParam.companyNatures" :class="[`select-adaptive-${inputID2}`]" style="width: 130px;" @change="iptAdaptive(inputID2,true)" multiple collapse-tags clearable class="form-content-width" placeholder="客户性质">
<el-select v-model="searchParam.companyNatures" :class="[`select-adaptive-${inputID2}`]" style="width: 130px;"
@change="iptAdaptive(inputID2,true)" multiple collapse-tags clearable class="form-content-width" placeholder="客户性质">
<el-option v-for="(item, index) in companyNaturelist" :key="index" :label="item.dictLabel" :value="item.dictValue" />
</el-select>
</el-form-item>
<el-form-item prop="isOn">
<el-select v-model="searchParam.isOn" :class="[`select-adaptive-${inputID3}`]" filterable clearable style="width: 130px;" @change="iptAdaptive(inputID3)" class="form-content-width" placeholder="上市公司">
<el-select v-model="searchParam.isOn" :class="[`select-adaptive-${inputID3}`]" filterable clearable style="width: 130px;"
@change="iptAdaptive(inputID3)" class="form-content-width" placeholder="上市公司">
<el-option v-for="(item, index) in isMajorlist" :key="index" :label="item.dictLabel" :value="item.dictValue" />
</el-select>
</el-form-item>
<el-form-item prop="creditLevels">
<el-select v-model="searchParam.creditLevels" :class="[`select-adaptive-${inputID4}`]" style="width: 130px;" @change="iptAdaptive(inputID4,true)" multiple collapse-tags clearable class="form-content-width" placeholder="资信评级">
<el-select v-model="searchParam.creditLevels" :class="[`select-adaptive-${inputID4}`]" style="width: 130px;"
@change="iptAdaptive(inputID4,true)" multiple collapse-tags clearable class="form-content-width" placeholder="资信评级">
<el-option v-for="(item, index) in creditLevellist" :key="index" :label="item.dictLabel" :value="item.dictValue" />
</el-select>
</el-form-item>
<el-form-item prop="companyName">
<!--<div class="newSearch">-->
<!--<el-input type="text" v-model="searchParam.companyName" clearable placeholder="输入企业名称查询" @change="clearname" >-->
<!--<i slot="prefix" class="el-input__icon"><img src="@/assets/images/project/sousuo.png" width="16px" @click="handleCurrentChange(1)"></i>-->
<!--</el-input>-->
<!--</div>-->
<!-- 未点击前的输入框样式 -->
<div class="normal-search-container" @click="showSearchBox = true" v-if="!showSearchBox">
<div class="normal-search-container" :class="{'is-hover-search' : searchHoverStatus}" @mouseover="searchHover($event)"
@mouseleave="searchUnHover($event,form)">
<img src="@/assets/images/enterprise/enterprise-search-icon.svg" alt="">
<span>搜索</span>
</div>
<!-- 输入框展开后样式 -->
<transition @enter="onEnter" appear mode="out-in">
<div class="cooperate-name enterprise-search-container" id="focus1" v-if="showSearchBox">
<el-input clearable @clear="handleSearch" @focus="clickFocus('focus1')" @blur="clickFocus('focus1')" v-model="searchParam.companyName"
placeholder="输入关键词查询"></el-input>
<span @click="handleSearch">搜索</span>
</div>
<span v-show="!searchHoverStatus && !searchParam.companyName">搜索</span>
<el-input v-model="searchParam.companyName" placeholder="输入关键词查询" style="width:238px;" @focus="searchFocus($event)"
@blur="searchBlur($event)" @input="value => searchInput(value)" v-show="searchHoverStatus || searchParam.companyName"
@keydown.native.enter="handleSearch">
<template slot="suffix">
<transition mode="out-in" appear name="fade">
<img src="@/assets/images/enterprise/search-input-clear-icon.svg" alt=""
@click.stop="searchParam.companyName = '';handleSearch" v-show="showClearIcon">
</transition>
</template>
</el-input>
</div>
</el-form-item>
</el-form>
</div>
......@@ -71,109 +62,79 @@
<div class="dc">
<div class="total">共{{tableData.total}}条</div>
<div class="btn-export" @click="pldrs"><img src="@/assets/images/project/import.png">批量导入</div>
<div class="btn btn_primary h32 p10" @click="opennew"><div class="img img1"></div>添加客户</div>
<div class="btn btn_primary h32 p10" @click="opennew">
<div class="img img1"></div>添加客户
</div>
</div>
</div>
<skeleton v-if="isSkeleton"></skeleton>
<div class="table-item">
<el-table v-show="!isSkeleton&&tableData.total > 0" class="fixed-table" v-horizontal-scroll="'hover'" ref="thistables"
:data="tableData.rows"
stripe border
style="width: 100%">
<el-table-column
prop="index"
label="序号"
fixed="left"
width="60">
:data="tableData.rows" stripe border style="width: 100%">
<el-table-column prop="index" label="序号" fixed="left" width="60">
<template slot-scope='scope'>
<span>{{ (searchParam.pageNum - 1) * searchParam.pageSize + scope.$index + 1 }}</span>
</template>
</el-table-column>
<el-table-column
prop="date"
label="企业名称"
fixed="left"
width="316">
<el-table-column prop="date" label="企业名称" fixed="left" width="316">
<template slot-scope="scope">
<div class="ps1">
<div class="wordprimary ps2" @click="toDetail(scope.row,'business')" v-html="scope.row.companyName"></div>
<div class="ps3">
<el-tooltip class="item" effect="dark" content="写跟进" placement="top" transition="" :open-delay="450">
<div @click="toDetail(scope.row,'gjjl')"><img class="i" src="@/assets/images/project/edit_1.png"><img class="o" src="@/assets/images/project/edit_11.png"></div>
<div @click="toDetail(scope.row,'gjjl')"><img class="i" src="@/assets/images/project/edit_1.png"><img class="o"
src="@/assets/images/project/edit_11.png"></div>
</el-tooltip>
<el-tooltip class="item" effect="dark" content="编辑信息" placement="top" transition="" :open-delay="450">
<div @click="toDetail(scope.row,'business')"><img class="i" src="@/assets/images/project/edit_2.png"><img class="o" src="@/assets/images/project/edit_22.png"></div>
<div @click="toDetail(scope.row,'business')"><img class="i" src="@/assets/images/project/edit_2.png"><img class="o"
src="@/assets/images/project/edit_22.png"></div>
</el-tooltip>
</div>
</div>
</template>
</el-table-column>
<el-table-column
prop="cooperationProject"
label="合作项目"
width="90">
<el-table-column prop="cooperationProject" label="合作项目" width="90">
<template slot-scope="scope">
{{scope.row.cooperationProject || '--'}}
</template>
</el-table-column>
<el-table-column
prop="followProject"
label="跟进项目"
width="90">
<el-table-column prop="followProject" label="跟进项目" width="90">
<template slot-scope="scope">
{{scope.row.followProject || '--'}}
</template>
</el-table-column>
<el-table-column
prop="reserveProject"
label="储备项目"
width="90">
<el-table-column prop="reserveProject" label="储备项目" width="90">
<template slot-scope="scope">
{{scope.row.reserveProject || '--'}}
</template>
</el-table-column>
<el-table-column
prop="legalPerson"
label="法定代表人"
width="110">
<el-table-column prop="legalPerson" label="法定代表人" width="110">
<template slot-scope="scope">
{{scope.row.legalPerson || '--'}}
</template>
</el-table-column>
<el-table-column
prop="registerAddress"
label="注册地区"
width="160">
<el-table-column prop="registerAddress" label="注册地区" width="160">
<template slot-scope="scope">
{{scope.row.registerAddress || '--'}}
</template>
</el-table-column>
<el-table-column
prop="registerCapitalStr"
label="注册资本金(万元)"
width="160">
<el-table-column prop="registerCapitalStr" label="注册资本金(万元)" width="160">
<template slot-scope="scope">
<span v-if="scope.row.registerCapital && scope.row.registerCapital>0">{{scope.row.registerCapital}}</span><span v-else>--</span>
</template>
</el-table-column>
<el-table-column
prop="creditLevel"
label="企业主体评级" width="120">
<el-table-column prop="creditLevel" label="企业主体评级" width="120">
<template slot-scope="scope">
{{scope.row.creditLevel || '--'}}
</template>
</el-table-column>
<el-table-column
prop="isOn"
label="上市公司" width="90">
<el-table-column prop="isOn" label="上市公司" width="90">
<template slot-scope="scope">
{{scope.row.isOn == 1?"是":"否"}}
</template>
</el-table-column>
<el-table-column
prop="isMajor"
label="局级大客户" width="90">
<el-table-column prop="isMajor" label="局级大客户" width="90">
<template slot-scope="scope">
<span v-if="scope.row.isMajor != null">
{{scope.row.isMajor == 1?"是":"否"}}
......@@ -181,37 +142,27 @@
<span v-else>--</span>
</template>
</el-table-column>
<el-table-column
prop="customerLevel"
label="客户等级" width="90">
<el-table-column prop="customerLevel" label="客户等级" width="90">
<template slot-scope="scope">
{{scope.row.customerLevel || '--'}}
</template>
</el-table-column>
<el-table-column
prop="companyNature"
label="客户性质" width="90">
<el-table-column prop="companyNature" label="客户性质" width="90">
<template slot-scope="scope">
{{scope.row.companyNature || '--'}}
</template>
</el-table-column>
<el-table-column
prop="companyLevel"
label="客户级别" width="90">
<el-table-column prop="companyLevel" label="客户级别" width="90">
<template slot-scope="scope">
{{scope.row.companyLevel || '--'}}
</template>
</el-table-column>
<el-table-column
prop="address"
label="企业母公司" width="200">
<el-table-column prop="address" label="企业母公司" width="200">
<template slot-scope="scope">
<div class="">{{scope.row.superCompany || '--'}}</div>
</template>
</el-table-column>
<el-table-column :key="keys"
prop="mainBusiness"
label="主营业务" width="300">
<el-table-column :key="keys" prop="mainBusiness" label="主营业务" width="300">
<template slot-scope="scope">
<div v-if="scope.row.mainBusiness == null || scope.row.mainBusiness == ''">--</div>
<div v-if="scope.row.mainBusiness1">
......@@ -221,9 +172,7 @@
<div v-else>{{scope.row.mainBusiness}}</div>
</template>
</el-table-column>
<el-table-column
prop="companyAttribute" :key="keys+2"
label="发包属性" width="300">
<el-table-column prop="companyAttribute" :key="keys+2" label="发包属性" width="300">
<template slot-scope="scope">
<div v-if="scope.row.companyAttribute == null || scope.row.companyAttribute == ''">--</div>
<div v-if="scope.row.companyAttribute1">
......@@ -233,9 +182,7 @@
<div v-else>{{scope.row.companyAttribute}}</div>
</template>
</el-table-column>
<el-table-column
prop="followUser"
label="跟进人" width="110">
<el-table-column prop="followUser" label="跟进人" width="110">
<template slot-scope="scope">
{{scope.row.followUser || '--'}}
</template>
......@@ -243,23 +190,12 @@
</el-table>
</div>
<div class="bottems" v-if="tableData.total>searchParam.pageSize">
<el-pagination
background
:page-size="searchParam.pageSize"
:current-page="searchParam.pageNum"
@current-change="handleCurrentChange"
layout="prev, pager, next"
:total="tableData.total">
<el-pagination background :page-size="searchParam.pageSize" :current-page="searchParam.pageNum" @current-change="handleCurrentChange"
layout="prev, pager, next" :total="tableData.total">
</el-pagination>
</div>
</div>
<el-dialog
class="popups"
:visible.sync="dialogVisible"
width="534px"
:close-on-click-modal="false"
@close="resetForm('ruleForm')"
>
<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>
......@@ -268,7 +204,8 @@
<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 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">
......@@ -283,7 +220,8 @@
<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-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>
......@@ -302,73 +240,72 @@
</template>
<script>
import { getToken } from '@/utils/auth'
import '@/assets/styles/project.scss'
import { addCustomer, getCustomerList, importData } from '@/api/custom/custom'
import { getDictType, getEnterprise } from '@/api/main'
import prvinceTree from '@/assets/json/provinceTree'
import batchimport from '../../project/projectList/component/batchImport'
import skeleton from '../../project/projectList/component/skeleton'
import { encodeStr } from '@/assets/js/common'
import { v4 } from "uuid";
import gsap from "gsap";
export default {
import { getToken } from '@/utils/auth';
import '@/assets/styles/project.scss';
import { addCustomer, getCustomerList, importData } from '@/api/custom/custom';
import { getDictType, getEnterprise } from '@/api/main';
import prvinceTree from '@/assets/json/provinceTree';
import batchimport from '../../project/projectList/component/batchImport';
import skeleton from '../../project/projectList/component/skeleton';
import { encodeStr } from '@/assets/js/common';
import { v4 } from "uuid";
export default {
name: 'CustomList',
components:{batchimport,skeleton},
components: { batchimport, skeleton },
data() {
return{
return {
encodeStr,
pldr: false,
types:'custom',
searchParam:{
companyName:'',
pageNum:1,
pageSize:20
types: 'custom',
searchParam: {
companyName: '',
pageNum: 1,
pageSize: 20
},
address:'',
props:{ checkStrictly: true, expandTrigger: 'hover' },
dialogVisible:false,
textarea:"",
nowedit:-1,//当前正在编辑的文本
tipslit:[],//项目标签
tipsvalue:"",//标签填写内容
address: '',
props: { checkStrictly: true, expandTrigger: 'hover' },
dialogVisible: false,
textarea: "",
nowedit: -1,//当前正在编辑的文本
tipslit: [],//项目标签
tipsvalue: "",//标签填写内容
tableData: [],//列表
companData:[],//联想企业列表
companData: [],//联想企业列表
addressProps: {
multiple: true,
expandTrigger: 'hover'
},
//上市公司
isMajorlist:[
isMajorlist: [
{
dictValue: 0,
dictLabel:'否',
dictLabel: '否',
},
{
dictValue: 1,
dictLabel:'是',
dictLabel: '是',
}
],
companyNaturelist:[], //客户性质
creditLevellist:[], //资信评级
customerLevel:[],//客户等级
addressList:[],//地区
companyNaturelist: [], //客户性质
creditLevellist: [], //资信评级
customerLevel: [],//客户等级
addressList: [],//地区
//添加客户
queryParam:{
companyId:'',//jsk企业id
companyName:'',//客户名称(企业名称
customerLevel:'',//客户等级
legalPerson:'',//法定代表人
registerCapital:'',//注册资本
registerAddress:'',//企业注册地址
creditCode:'',//社会统一信用代码
address:'',//选择的地址
provinceId:'',
cityId:'',
districtId:'',
queryParam: {
companyId: '',//jsk企业id
companyName: '',//客户名称(企业名称
customerLevel: '',//客户等级
legalPerson: '',//法定代表人
registerCapital: '',//注册资本
registerAddress: '',//企业注册地址
creditCode: '',//社会统一信用代码
address: '',//选择的地址
provinceId: '',
cityId: '',
districtId: '',
},
rules:{
companyName:[{ required: true, message: '请输入非空格字符!', trigger: 'blur' },]
rules: {
companyName: [{ required: true, message: '请输入非空格字符!', trigger: 'blur' },]
},
//批量导入
action: process.env.VUE_APP_BASE_API + "/customer/importData",
......@@ -376,117 +313,127 @@
headers: {
Authorization: "Bearer " + getToken(),
},
showlist:false,
keys:1,
isSkeleton:true,
companypage:1,
isscroll:false,
inputID1:this.getUid(),
inputID2:this.getUid(),
inputID3:this.getUid(),
inputID4:this.getUid(),
showSearchBox: false
}
// isNew:true,
showlist: false,
keys: 1,
isSkeleton: true,
companypage: 1,
isscroll: false,
inputID1: this.getUid(),
inputID2: this.getUid(),
inputID3: this.getUid(),
inputID4: this.getUid(),
showSearchBox: false,
searchHoverStatus: false,
showClearIcon: false
};
},
created() {
if(this.$route.query.key){
this.searchParam.companyName=this.$route.query.key;
if (this.$route.query.key) {
this.searchParam.companyName = this.$route.query.key;
}
if(this.$route.query.type === '1'){
this.searchParam.companyNatures=['国有企业']
if (this.$route.query.type === '1') {
this.searchParam.companyNatures = ['国有企业'];
}
if(this.$route.query.type === '2'){
this.searchParam.companyNatures=['央企']
if (this.$route.query.type === '2') {
this.searchParam.companyNatures = ['央企'];
}
if(this.$route.query.type ==='3'){
this.searchParam.companyNatures=['事业单位','机关单位']
if (this.$route.query.type === '3') {
this.searchParam.companyNatures = ['事业单位', '机关单位'];
}
this.$watch(() => this.$route.params,() => {
this.getCustomerList()
this.getDictType()
this.prvinceTree()
this.handleQuery()
this.searchParam.companyName=''
this.$watch(() => this.$route.params, () => {
this.getCustomerList();
this.getDictType();
this.prvinceTree();
this.handleQuery();
this.searchParam.companyName = '';
},
// 组件创建完后获取数据,
// 此时 data 已经被 observed 了
{ immediate: true }
)
);
},
methods:{
onEnter(el, done) {
gsap.from(el, {
opacity: 0,
width: 0,
});
gsap.to(el, {
opacity: 1,
width: 242,
onComplete() {
// 完成动画聚焦输入框
el.querySelector("input").focus();
done();
methods: {
searchFocus(event) {
const { target } = event;
if (target?.value?.length) {
this.showClearIcon = true;
}
},
searchBlur(event) {
this.showClearIcon = false;
},
searchInput(value) {
if (value?.length) {
this.showClearIcon = true;
}
},
searchHover(event) {
this.searchHoverStatus = true;
},
searchUnHover(event) {
if (!this.searchParam.companyName) {
this.searchHoverStatus = false;
}
});
},
async handleQuery() {
let [type1,type2] = await Promise.all([
let [type1, type2] = await Promise.all([
getDictType('company_nature_type'),
getDictType('credit_level_type'),
])
if(type1.code==200){
]);
if (type1.code == 200) {
type1.data.forEach(item => {
this.companyNaturelist.push({dictLabel:item.dictLabel,dictValue:item.dictLabel})
})
this.companyNaturelist.push({ dictLabel: item.dictLabel, dictValue: item.dictLabel });
});
}
if(type2.code==200){
if (type2.code == 200) {
type2.data.forEach(item => {
this.creditLevellist.push({dictLabel:item.dictLabel,dictValue:item.dictLabel})
})
this.creditLevellist.push({ dictLabel: item.dictLabel, dictValue: item.dictLabel });
});
}
},
sq1(item,sq){
this.$nextTick(()=>{
item.sq1 = sq
this.keys++ ;
})
sq1(item, sq) {
this.$nextTick(() => {
item.sq1 = sq;
this.keys++;
});
},
sq2(item,sq){
this.$nextTick(()=>{
item.sq2 = sq
this.keys++ ;
})
sq2(item, sq) {
this.$nextTick(() => {
item.sq2 = sq;
this.keys++;
});
},
handleALL(event){
handleALL(event) {
var one = document.getElementById("box");
if(one){
if(!one.contains(event.target)){
this.showlist = false
if (one) {
if (!one.contains(event.target)) {
this.showlist = false;
}
}
},
toct(){
this.dialogVisible = false
this.$router.push({path:'/macro/urban'})
toct() {
this.dialogVisible = false;
this.$router.push({ path: '/macro/urban' });
},
getDictType(){
getDictType() {
//获取客户等级
getDictType('customer_level_type').then(result=>{
this.customerLevel = result.code == 200 ? result.data:[]
})
getDictType('customer_level_type').then(result => {
this.customerLevel = result.code == 200 ? result.data : [];
});
},
pldrs(){
this.pldr = true
pldrs() {
this.pldr = true;
},
cancelimport(){
this.pldr = false
cancelimport() {
this.pldr = false;
},
//获取客户列表
getCustomerList(){
let params=this.searchParam
if(this.address.length > 0){
getCustomerList() {
let params = this.searchParam;
if (this.address.length > 0) {
let arr = this.$refs.address1.getCheckedNodes();
let provinceCode = [],cityCode = [],countyCode = [];
let provinceCode = [], cityCode = [], countyCode = [];
for (var i in arr) {
if (arr[i].parent) {
if (!arr[i].parent.checked) {
......@@ -494,175 +441,175 @@
!arr[i].hasChildren && countyCode.push(arr[i].value);
}
} else {
provinceCode.push(arr[i].value)
provinceCode.push(arr[i].value);
}
}
if(provinceCode.length > 0){
params.provinceIds=provinceCode
if (provinceCode.length > 0) {
params.provinceIds = provinceCode;
}
if(cityCode.length > 0){
params.cityIds=cityCode
if (cityCode.length > 0) {
params.cityIds = cityCode;
}
if(countyCode.length > 0){
params.districtIds=countyCode
if (countyCode.length > 0) {
params.districtIds = countyCode;
}
}else {
if(params.provinceIds){
delete params.provinceIds
} else {
if (params.provinceIds) {
delete params.provinceIds;
}
if(params.cityIds){
delete params.cityIds
if (params.cityIds) {
delete params.cityIds;
}
if(params.districtIds){
delete params.districtIds
if (params.districtIds) {
delete params.districtIds;
}
}
getCustomerList(params).then(result=>{
this.isSkeleton = false
this.tableData = result
this.tableData.rows.forEach(item=>{
item.registerCapital = item.registerCapital == null?null: item.registerCapital.replace(/^\D*(\d*(?:\.\d{0,6})?).*$/g, '$1')
if(item.mainBusiness != "" && item.mainBusiness != null && item.mainBusiness.length>84){
item.mainBusiness1 = item.mainBusiness.substring(0,81)
item.sq1 = true
}else{
item.sq1 = false
}
if(item.companyAttribute != "" && item.companyAttribute != null && item.companyAttribute.length>84){
item.companyAttribute1 = item.companyAttribute.substring(0,81)
item.sq2 = true
}else{
item.sq2 = false
getCustomerList(params).then(result => {
this.isSkeleton = false;
this.tableData = result;
this.tableData.rows.forEach(item => {
item.registerCapital = item.registerCapital == null ? null : item.registerCapital.replace(/^\D*(\d*(?:\.\d{0,6})?).*$/g, '$1');
if (item.mainBusiness != "" && item.mainBusiness != null && item.mainBusiness.length > 84) {
item.mainBusiness1 = item.mainBusiness.substring(0, 81);
item.sq1 = true;
} else {
item.sq1 = false;
}
if (item.companyAttribute != "" && item.companyAttribute != null && item.companyAttribute.length > 84) {
item.companyAttribute1 = item.companyAttribute.substring(0, 81);
item.sq2 = true;
} else {
item.sq2 = false;
}
// console.log(item)
})
})
});
});
},
//跳转到客户详情
toDetail(row,type){
let customerId = row.customerId
let companyId = row.companyId
let path = type
toDetail(row, type) {
let customerId = row.customerId;
let companyId = row.companyId;
let path = type;
// if(type == "" && companyId == null){
// path = 'business'
// }
this.$router.push({path:'/enterprise/'+encodeStr(companyId),query:{customerId:customerId,path:path}})
this.$router.push({ path: '/enterprise/' + encodeStr(companyId), query: { customerId: customerId, path: path } });
},
handleSearch(){
handleSearch() {
this.$nextTick(() => {
this.searchParam.pageNum = 1
this.getCustomerList()
})
this.searchParam.pageNum = 1;
this.getCustomerList();
});
},
clearname(value){
if(value == ""){
this.handleCurrentChange(1)
clearname(value) {
if (value == "") {
this.handleCurrentChange(1);
}
},
//翻页
handleCurrentChange(val) {
this.isSkeleton = true
this.pldr=false
this.isSkeleton = true;
this.pldr = false;
// this.isNew = false
this.searchParam.pageNum=val
this.getCustomerList()
this.searchParam.pageNum = val;
this.getCustomerList();
},
//打开新建窗口
opennew(){
this.dialogVisible = true
opennew() {
this.dialogVisible = true;
},
getAddr(obj){
if(obj.length == 0){
this.queryParam.provinceId = ''
this.queryParam.cityId = ''
this.queryParam.districtId = ''
return 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]:''
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
getCompany(value) {
this.queryParam.companyId = null;
if (value == 1) {
this.companData = [];
this.companypage = 1;
}
if (this.queryParam.companyName.length>=2){
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
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
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
if (this.companData.length === 0) {
this.showlist = false;
} else {
this.showlist = true;
}
this.companypage += 1
}else{
this.isscroll = false
this.companypage += 1;
} else {
this.isscroll = false;
}
})
});
}
},
load(){
if(this.isscroll){
this.getCompany(2)
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
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
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) {
......@@ -673,36 +620,36 @@
// }
this.$refs[formName].validate((valid) => {
if (valid) {
addCustomer(this.queryParam).then(result=>{
if(result.code == 200){
this.$message.success('添加成功!')
this.dialogVisible = false
this.handleCurrentChange(1)
this.resetForm('ruleForm')
}else{
this.$message.error(result.msg)
}
})
addCustomer(this.queryParam).then(result => {
if (result.code == 200) {
this.$message.success('添加成功!');
this.dialogVisible = false;
this.handleCurrentChange(1);
this.resetForm('ruleForm');
} else {
this.$message.error(result.msg);
}
});
} else {
}
});
},
resetForm(formName) {
this.queryParam = {
companyId:'',//jsk企业id
companyName:'',//客户名称(企业名称
customerLevel:'',//客户等级
legalPerson:'',//法定代表人
registerCapital:'',//注册资本
registerAddress:'',//企业注册地址
creditCode:'',//社会统一信用代码
address:'',//选择的地址
provinceId:'',
cityId:'',
districtId:'',
companyId: '',//jsk企业id
companyName: '',//客户名称(企业名称
customerLevel: '',//客户等级
legalPerson: '',//法定代表人
registerCapital: '',//注册资本
registerAddress: '',//企业注册地址
creditCode: '',//社会统一信用代码
address: '',//选择的地址
provinceId: '',
cityId: '',
districtId: '',
},
this.dialogVisible = false
this.showlist = false
this.dialogVisible = false;
this.showlist = false;
},
//地区
......@@ -718,26 +665,26 @@
// })
// console.log(prvinceTree)
this.addressList = prvinceTree;
this.getadd(this.addressList)
this.getadd(this.addressList);
},
//处理注册地数据
getadd(row) {
this.addrcallback(row,this.getadd)
this.addrcallback(row, this.getadd);
},
addrcallback(row,callback){
if(row){
addrcallback(row, callback) {
if (row) {
row.forEach(item => {
item.value = item.id
callback && callback(item.children)
})
item.value = item.id;
callback && callback(item.children);
});
}
},
//输入数字
number(value){
if(value == '')
this.queryParam.registerCapital = value
number(value) {
if (value == '')
this.queryParam.registerCapital = value;
else
this.queryParam.registerCapital = value.replace(/^\D*(\d*(?:\.\d{0,6})?).*$/g, '$1')//输入6位小数
this.queryParam.registerCapital = value.replace(/^\D*(\d*(?:\.\d{0,6})?).*$/g, '$1');//输入6位小数
},
iptAdaptive(uid, multiple = false) {
multiple ? this.multipleAdaptiveHandle(uid) : this.iptAdaptiveHandle(uid);
......@@ -813,10 +760,10 @@
textContainer.textContent = iptChild.value ? iptChild.value : iptChild.getAttribute("placeholder");
document.body.append(textContainer);
// let containerWidth = textContainer.offsetWidth + 12 + 8;
let containerWidth=0
if(iptChild.value){
let containerWidth = 0;
if (iptChild.value) {
containerWidth = 70;
}else {
} else {
containerWidth = 130;
}
......@@ -836,117 +783,228 @@
</script>
<style lang="scss" scoped>
.app-container{
height: calc(100vh - 134px)
.custom-list-container {
width: 100%;
height: 100%;
padding: 24px;
box-sizing: border-box;
.miantitle {
padding: 12px 0px;
padding-top: 0px;
margin: 0px;
}
::v-deep .el-card {
.table_search {
.el-form-item {
.el-input {
.el-input__inner {
&::placeholder {
color: rgba(35, 35, 35, 0.8);
font-size: 14px;
}
&:focus {
color: rgba(35, 35, 35, 1);
}
}
.el-input__suffix {
.el-input__icon {
color: rgba(35, 35, 35, 0.8);
}
}
}
}
}
}
.box-card{
}
.box-card {
@import "@/assets/styles/search-common.scss";
padding-top: 16px;
width: 100%;
height: 100%;
.table_search{
::v-deep .el-form{
.el-input{
.table_search {
::v-deep .el-form {
.el-input {
line-height: 32px;
.el-input__inner{
.el-input__inner {
height: 32px;
line-height: 32px;
border-radius: 4px;
border: 0;
}
}
.is-focus{
.el-input__inner{
background: #F4F6F9;
.is-focus {
.el-input__inner {
background: #f4f6f9;
}
}
}
::v-deep .normal-search-container {
display: flex;
align-items: center;
&.is-hover-search {
width: 238px;
background: #f4f6f9;
border-radius: 4px 4px 4px 4px;
& > img {
cursor: unset;
}
}
&:hover {
& > span {
color: #0081ff;
}
}
& > img {
width: 16px;
height: 16px;
margin-left: 12px;
cursor: pointer;
}
& > span {
color: rgba(35, 35, 35, 0.8);
font-weight: 400;
margin-left: 8px;
line-height: 22px;
font-size: 14px;
cursor: pointer;
}
.el-input {
& > .el-input__inner {
border: none;
height: 32px;
line-height: 32px;
caret-color: #0081ff;
color: rgba(35, 35, 35, 0.8);
font-size: 14px;
background: #f4f6f9;
padding-right: 26px;
padding-left: 8px;
&::placeholder {
color: rgba(35, 35, 35, 0.4) !important;
font-size: 14px !important;
line-height: 32px;
}
}
.el-input__suffix {
right: 12px;
display: flex;
align-items: center;
.el-input__suffix-inner {
height: 14px;
width: 14px;
}
img {
cursor: pointer;
vertical-align: unset;
margin-bottom: 14px;
}
}
}
}
}
}
.box{
.box {
position: relative;
>span{
> span {
position: absolute;
right: 10px;
bottom: 0;
color: #0081FF;
color: #0081ff;
cursor: pointer;
&:hover{
color: #006AD1;
&:hover {
color: #006ad1;
}
}
}
.dc{
.dc {
font-size: 12px;
color: #3D3D3D;
color: #3d3d3d;
font-weight: 400;
position: relative;
&::after{
content: ' ';
&::after {
content: " ";
width: 2px;
height: 2px;
background: rgba(35,35,35,0.4);
background: rgba(35, 35, 35, 0.4);
border-radius: 50%;
position: absolute;
top: 16px;
left: 14px;
}
>div{
> div {
display: inline-block;
margin-left: 20px;
}
}
.img.img1{
}
.img.img1 {
margin-right: 2px;
background: url('../../../../src/assets/images/project/add_2.png')no-repeat center center;
background: url("../../../../src/assets/images/project/add_2.png") no-repeat
center center;
background-size: 100%;
}
.w88{
}
.w88 {
width: 88px;
}
.tables{
}
.tables {
position: relative;
min-height: calc(100vh - 134px);
/*overflow: auto;*/
.empty{
.empty {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
.btn{
transform: translate(-50%, -50%);
.btn {
margin-right: 8px;
margin-top: 16px;
}
}
.table_search{
::v-deep .el-cascader{
.table_search {
::v-deep .el-cascader {
height: 32px;
line-height: 32px;
.el-input{
input{
.el-input {
input {
height: 32px !important;
}
}
.el-cascader__tags{
.el-cascader__tags {
flex-wrap: inherit;
margin-top: 1px;
.el-tag{
.el-tag {
/*max-width: 120px;*/
}
}
.el-input__suffix{
.el-input__suffix {
top: 1px;
}
}
.normal-search-container {
margin-left: 12px;
::v-deep .normal-search-container {
height: 32px;
display: flex;
align-items: center;
cursor: pointer;
height: 34px;
&.is-hover-search {
width: 238px;
background: #f4f6f9;
border-radius: 4px 4px 4px 4px;
& > img {
cursor: unset;
}
}
&:hover {
& > span {
color: #0081ff;
......@@ -957,15 +1015,51 @@
width: 16px;
height: 16px;
margin-left: 12px;
cursor: pointer;
}
& > span {
color: #232323;
color: rgba(35, 35, 35, 0.4);
color: rgba(35, 35, 35, 0.8);
font-weight: 400;
margin-left: 8px;
line-height: 22px;
font-size: 14px;
cursor: pointer;
}
.el-input {
& > .el-input__inner {
border: none;
height: 32px;
line-height: 32px;
caret-color: #0081ff;
color: rgba(35, 35, 35, 0.8);
font-size: 14px;
background: #f4f6f9;
padding-right: 26px;
padding-left: 8px;
&::placeholder {
color: rgba(35, 35, 35, 0.4) !important;
font-size: 14px !important;
line-height: 32px;
}
}
.el-input__suffix {
right: 12px;
display: flex;
align-items: center;
.el-input__suffix-inner {
height: 14px;
width: 14px;
}
img {
cursor: pointer;
vertical-align: unset;
}
}
}
}
.cooperate-name {
......@@ -1011,52 +1105,49 @@
}
}
}
}
.ps1{
}
.ps1 {
display: flex;
justify-content: space-between;
.ps2{
.ps2 {
width: 350px;
}
.ps3{
.ps3 {
width: 60px;
display: flex;
justify-content: right;
>div{
> div {
margin-left: 12px;
>img{
> img {
float: right;
margin: 3px 0 0 4px;
width: 14px;
}
.i{
.i {
display: inline-block;
}
.o{
.o {
display: none;
}
&:hover{
&:hover {
cursor: pointer;
.i{
.i {
display: none;
}
.o{
.o {
display: inline-block;
}
}
}
}
}
.popbot{
.wordprimary{
}
.popbot {
.wordprimary {
display: inline;
padding-right: 26px;
}
}
.app-container{
height: auto;
}
.searchInput{
}
.searchInput {
width: 240px;
}
}
</style>
......@@ -8,11 +8,24 @@
<div class="p2">建议调整关键词或筛选条件,重新搜索</div>
</div>
<div class="table_search">
<div class="newSearch">
<el-input type="text" v-model="searchParam.companyName" clearable placeholder="输入企业名称查询" @change="clearname" >
<i slot="prefix" class="el-input__icon"><img src="@/assets/images/project/sousuo.png" width="16px" @click="handleCurrentChange(1)"></i>
<div>
<!-- 未点击前的输入框样式 -->
<div class="normal-search-container" :class="{'is-hover-search' : hover}" @mouseover="searchHover($event)"
@mouseleave="searchUnHover($event,searchParam.companyName)">
<img src="@/assets/images/enterprise/enterprise-search-icon.svg" alt="">
<span v-show="!hover && !searchParam.companyName">搜索</span>
<el-input v-model="searchParam.companyName" placeholder="输入关键词查询"
@focus="searchFocus($event)" @blur="searchBlur($event)" @keydown.native.enter="getCustomerList"
@input="value => searchInput(value)" v-show="hover || searchParam.companyName">
<template slot="suffix">
<transition mode="out-in" appear name="fade">
<img src="@/assets/images/enterprise/search-input-clear-icon.svg" alt="" @click.stop="searchParam.companyName = '';getCustomerList()"
v-show="showClearIcon">
</transition>
</template>
</el-input>
</div>
</div>
<div class="dc">
<div class="total">共{{tableData.total}}条</div>
</div>
......@@ -239,6 +252,8 @@ export default {
keys:1,
RLcompanyName:'',//重新认领企业名称
isSkeleton:true,
showClearIcon: false,
hover: false,
}
},
created() {
......@@ -336,6 +351,28 @@ export default {
this.searchParam.pageNum=val
this.getCustomerList()
},
searchFocus(event) {
const { target } = event;
if (target?.value?.length) {
this.showClearIcon=true
}
},
searchBlur(event) {
this.showClearIcon=false
},
searchInput(value) {
if (value?.length) {
this.showClearIcon=true
}
},
searchHover(event) {
this.hover=true
},
searchUnHover(event, value) {
if (!value) {
this.hover=false
}
},
}
}
</script>
......@@ -358,6 +395,81 @@ export default {
padding-top: 16px;
width: 100%;
height: 100%;
.table_search{
::v-deep .normal-search-container {
display: flex;
align-items: center;
line-height: 32px;
height: 32px;
&.is-hover-search {
width: 238px;
background: #f4f6f9;
border-radius: 4px 4px 4px 4px;
& > img {
cursor: unset;
}
}
&:hover {
& > span {
color: #0081ff;
}
}
& > img {
width: 16px;
height: 16px;
margin-left: 12px;
cursor: pointer;
}
& > span {
color: rgba(35, 35, 35, 0.8);
font-weight: 400;
margin-left: 8px;
line-height: 22px;
font-size: 14px;
cursor: pointer;
}
.el-input {
& > .el-input__inner {
border: none;
height: 32px;
line-height: 32px;
caret-color: #0081ff;
color: rgba(35, 35, 35, 0.8);
font-size: 14px;
background: #f4f6f9;
padding-right: 26px;
padding-left: 8px;
&::placeholder {
color: rgba(35, 35, 35, 0.4) !important;
font-size: 14px !important;
line-height: 32px;
}
}
.el-input__suffix {
right: 12px;
display: flex;
align-items: center;
.el-input__suffix-inner {
height: 14px;
width: 14px;
}
img {
cursor: pointer;
vertical-align: unset;
margin-bottom: 14px;
}
}
}
}
}
}
.box{
position: relative;
......
......@@ -8,7 +8,8 @@
<script>
import { steerScroll } from '@/assets/js/jskplug';
import { dskAccessToken } from '@/api/common';
import {encodeStr} from "@/assets/js/common.js"
import { getUipIdByCid } from '@/api/macro/macro'
export default {
name: 'Enterprise',
components: {
......@@ -16,6 +17,7 @@ export default {
},
data() {
return {
encodeStr,
loading: false, // 是否加载完成-当前页控制
iframeTimer: '', // 是否加载中定时器-当前页控制
footHeight: 0, //底部高度,若为0(页面内部嵌套或者没有底部板块)
......@@ -35,28 +37,45 @@ export default {
this.domain='https://plug.jiansheku.com'
}else {
this.domain='https://pre-plug.jiansheku.com'
this.domain='http://192.168.60.210:3400'
// this.domain='http://192.168.60.210:3400'
}
this.gettokens();
},
mounted() {
this.iframeLoading(); // 判断iframe页面是否加载完成-当前页控制
let that = this
window.addEventListener('message', function (event) {
if(!event.data.id && event.data.url){
that.$tab.openPage(event.data.title, event.data.url).then(() => {
// 执行结束的逻辑
})
}
}, false);
window.addEventListener('message', this.linkListener, false);
steerScroll('companyIframe', this.navigation, this.footHeight, true); // iframeId: iframe的id;navigation:页面排除iframe后剩下的顶部高度;footHeight: 页面排除iframe后剩下的底部高度;state:监听or移除监听;parentId: 父级id[不带默认就是铺满整个页面]];_this:指向当前实例(可忽略)
},
beforeDestroy() {
clearInterval(this.iframeTimer); // -当前页控制
window.removeEventListener("message", this.linkListener);
steerScroll('companyIframe', this.navigation, this.footHeight); // iframeId: iframe的id;navigation:页面排除iframe后剩下的顶部高度;footHeight: 页面排除iframe后剩下的底部高度;state:监听or移除监听;parentId: 父级id[不带默认就是铺满整个页面]];_this:指向当前实例(可忽略)
clearInterval(this.tokentimer);
},
methods: {
linkListener(event){
let {data} = event
if(data.id){
getUipIdByCid([data.id]).then(res=>{
if (res.code==200) {
if(res.data&&res.data.length>0&&res.data[0].uipId){
this.$router.push({path: '/enterprise/'+this.encodeStr(data.id)})
}else{
this.$tab.openPage(data.title, '/company/'+this.encodeStr(data.id))
}
}
}).catch(error=>{
});
}else{
if(data.url){
this.$tab.openPage(data.title, data.url).then(() => {
// 执行结束的逻辑
})
}
}
},
gettokens() {
dskAccessToken().then(res => {
if (res.code == 200) {
......
......@@ -576,11 +576,11 @@
legend: {
data: [
{
name: '招标数量',
name: '招标数量(个)',
// icon: 'rect',
},
{
name: '招标金额(万元)',
name: '招标金额万元)',
// icon: 'circle',
}
],
......@@ -643,7 +643,7 @@
},
series: [
{
name:'招标金额(万元)',
name:'招标金额万元)',
smooth: false, //平滑
type:"line",
symbolSize: 6,
......@@ -664,12 +664,12 @@
data:data.map(item => item.sum),
},
{
name:'招标数量',
name:'招标数量(个)',
type: 'bar',
barWidth: 20,
tooltip: {
valueFormatter: function (value) {
return value + '个';
return value;
}
},
itemStyle: {
......@@ -754,23 +754,23 @@
axisPointer: {
type: 'cross'
},
formatter: function (params) {
var relVal = params[0].name;
// relVal+='<br/>' +"<span style=\"display:inline-block;margin-right:4px;border-radius:10px;width:10px;height:10px;background-color:#f17f0a;\"></span>" + '次数' +": "+ array[0][relVal.replace(/"/g, '')]
for (var i = 0, l = params.length; i < l; i++) {
relVal += '<br/>' + params[i].marker + params[i].seriesName +": "+ params[i].value
}
return relVal
}
// formatter: function (params) {
// var relVal = params[0].name;
// // relVal+='<br/>' +"<span style=\"display:inline-block;margin-right:4px;border-radius:10px;width:10px;height:10px;background-color:#f17f0a;\"></span>" + '次数' +": "+ array[0][relVal.replace(/"/g, '')]
// for (var i = 0, l = params.length; i < l; i++) {
// relVal += '<br/>' + params[i].marker + params[i].seriesName +": "+ params[i].value
// }
// return relVal
// }
},
legend: {
data: [
{
name: '招标数量',
name: '招标数量(个)',
// icon: 'rect',
},
{
name: '招标金额(万元)',
name: '招标金额万元)',
// icon: 'circle',
}
],
......@@ -833,7 +833,7 @@
},
series: [
{
name:'招标金额(万元)',
name:'招标金额万元)',
smooth: false, //平滑
type:"line",
symbolSize: 6,
......@@ -854,12 +854,12 @@
data:data.map(item => item.sum),
},
{
name:'招标数量',
name:'招标数量(个)',
type: 'bar',
barWidth: 20,
tooltip: {
valueFormatter: function (value) {
return value + '';
return value;
}
},
itemStyle: {
......
......@@ -21,19 +21,22 @@
<!-- 输入框 -->
<template v-if="form.type==3">
<!-- 未点击前的输入框样式 -->
<div class="normal-search-container" @click="showSearchBox = true" v-if="!showSearchBox">
<div class="normal-search-container" :class="{'is-hover-search' : form.hover}" @mouseover="searchHover($event,form)"
@mouseleave="searchUnHover($event,form)">
<img src="@/assets/images/enterprise/enterprise-search-icon.svg" alt="">
<span>搜索</span>
</div>
<!-- 输入框展开后样式 -->
<transition @enter="onEnter" appear mode="out-in">
<div class="cooperate-name enterprise-search-container" :id="'focus'+i" v-if="showSearchBox">
<el-input clearable @clear="changeSelect" @focus="clickFocus('focus'+i)" @blur="clickFocus('focus'+i)" v-model="form.value"
:placeholder="form.placeholder" :style="form.width?'width:'+form.width+'px':'width:180px'"></el-input>
<span @click="changeSelect">搜索</span>
</div>
<span v-show="!form.hover && !form.value">搜索</span>
<el-input v-model="form.value" :placeholder="form.placeholder ? form.placeholder : '输入关键词查询'"
:style="form.width?'width:'+form.width+'px':'width:238px'" @focus="searchFocus($event,form)" @blur="searchBlur($event,form)"
@input="value => searchInput(value,form)" v-show="form.hover || form.value" @keydown.native.enter="changeSelect">
<template slot="suffix">
<transition mode="out-in" appear name="fade">
<img src="@/assets/images/enterprise/search-input-clear-icon.svg" alt="" @click.stop="form.value = '';changeSelect()"
v-show="form.showClearIcon">
</transition>
</template>
</el-input>
</div>
</template>
<!-- 多选 -->
<template v-if="form.type==4">
<el-select class="form-content-width"
......@@ -135,6 +138,28 @@ export default {
CustomMoneySelect
},
methods: {
searchFocus(event, formData) {
const { target } = event;
if (target?.value?.length) {
this.$set(formData, "showClearIcon", true);
}
},
searchBlur(event, formData) {
this.$set(formData, "showClearIcon", false);
},
searchInput(value, formData) {
if (value?.length) {
this.$set(formData, "showClearIcon", true);
}
},
searchHover(event, formData) {
this.$set(formData, "hover", true);
},
searchUnHover(event, formData) {
if (!formData.value) {
this.$set(formData, "hover", false);
}
},
async getPlaceholder() {
try {
await this.$nextTick();
......@@ -284,7 +309,7 @@ export default {
::v-deep .el-popper[x-placement^="bottom"] {
margin-top: 5px;
}
.headerFixed{
.headerFixed {
position: sticky;
top: 0;
z-index: 10;
......@@ -401,10 +426,19 @@ export default {
}
}
.normal-search-container {
::v-deep .normal-search-container {
display: flex;
align-items: center;
cursor: pointer;
&.is-hover-search {
width: 238px;
background: #f4f6f9;
border-radius: 4px 4px 4px 4px;
& > img {
cursor: unset;
}
}
&:hover {
& > span {
......@@ -416,6 +450,7 @@ export default {
width: 16px;
height: 16px;
margin-left: 12px;
cursor: pointer;
}
& > span {
......@@ -424,6 +459,42 @@ export default {
margin-left: 8px;
line-height: 22px;
font-size: 14px;
cursor: pointer;
}
.el-input {
& > .el-input__inner {
border: none;
height: 32px;
line-height: 32px;
caret-color: #0081ff;
color: rgba(35, 35, 35, 0.8);
font-size: 14px;
background: #f4f6f9;
padding-right: 26px;
padding-left: 8px;
&::placeholder {
color: rgba(35, 35, 35, 0.4) !important;
font-size: 14px !important;
line-height: 32px;
}
}
.el-input__suffix {
right: 12px;
display: flex;
align-items: center;
.el-input__suffix-inner {
height: 14px;
width: 14px;
}
img {
cursor: pointer;
vertical-align: unset;
}
}
}
}
}
......
......@@ -438,13 +438,15 @@ export default {
margin-left: 25px;
overflow: hidden;
.swiper-slide{
min-width: 242px;
padding: 7px 4px 9px 0;
box-sizing: border-box;
&.swiper-disn{
display: none;
}
>div{
min-width: 242px;
width: 100%;
height: 100%;
padding: 7px 4px 9px 0;
cursor: pointer;
align-items: normal;
.swiper-item{
......
......@@ -446,9 +446,12 @@
</div>
<div class="info-list-right">
<p class="card-right-title">
<router-link :to="toEnterpriseDetail(item.jskEid)">
<span @click="toEnterpriseDetail(item.jskEid,item.name)">
<span class="title" v-html="item.name"> </span>
</router-link>
</span>
<!-- <router-link :to="toEnterpriseDetail(item.jskEid,item.name)">
<span class="title" v-html="item.name"> </span>
</router-link> -->
</p>
<p class="card-right-title card-right-title1" :ref="'labels'+item.id" :style="{padding: '16px 0px 12px 0px'}">
......@@ -485,51 +488,75 @@
<p class="card-right-title" style="padding-top: 8px ;">
<template v-if="item.aptitudeCountNew!=null">
<span class="right-title-grey">资质资格:</span>
<router-link :to="toEnterprise(item.jskEid,'')" target="_blank">
<span @click="toEnterprise(item.jskEid,'','',item.name)">
<span class="right-title-blue" v-html="item.aptitudeCountNew"> </span>
</router-link>
</span>
<!-- <router-link :to="toEnterprise(item.jskEid,'','',item.name)" >
<span class="right-title-blue" v-html="item.aptitudeCountNew"> </span>
</router-link> -->
</template>
<template v-if="item.recentlyCount!=null">
<span class="right-title-grey">中标业绩:</span>
<router-link :to="toEnterprise(item.jskEid,'performance')" target="_blank">
<span @click="toEnterprise(item.jskEid,'performance','',item.name)">
<span class="right-title-blue" v-html="item.recentlyCount"> </span>
</span>
<!-- <router-link :to="toEnterprise(item.jskEid,'performance')" >
<span class="right-title-blue" v-html="item.recentlyCount"> </span>
</router-link>
</router-link> -->
</template>
<template v-if="item.skyCount!=null">
<span class="right-title-grey">四库业绩:</span>
<router-link :to="toEnterprise(item.jskEid,'performance',2)" target="_blank">
<span @click="toEnterprise(item.jskEid,'performance',2,item.name)">
<span class="right-title-blue" v-html="item.skyCount"> </span>
</span>
<!-- <router-link :to="toEnterprise(item.jskEid,'performance',2)" >
<span class="right-title-blue" v-html="item.skyCount"> </span>
</router-link>
</router-link> -->
</template>
<template v-if="item.registeredPersonnelCount!=null">
<span class="right-title-grey">注册人员:</span>
<router-link :to="toEnterprise(item.jskEid,'personnel',2)" target="_blank">
<span @click="toEnterprise(item.jskEid,'personnel',2,item.name)">
<span class="right-title-blue" v-html="item.registeredPersonnelCount"> </span>
</span>
<!-- <router-link :to="toEnterprise(item.jskEid,'personnel',2)" >
<span class="right-title-blue" v-html="item.registeredPersonnelCount"> </span>
</router-link>
</router-link> -->
</template>
<template v-if="item.threePersonnelCount!=null">
<span class="right-title-grey">三类人员:</span>
<router-link :to="toEnterprise(item.jskEid,'personnel',5)" target="_blank">
<span @click="toEnterprise(item.jskEid,'personnel',5,item.name)">
<span class="right-title-blue" v-html="item.threePersonnelCount"> </span>
</router-link>
</span>
<!-- <router-link :to="toEnterprise(item.jskEid,'personnel',5)" >
<span class="right-title-blue" v-html="item.threePersonnelCount"> </span>
</router-link> -->
</template>
<template v-if="item.jskBidCount>0">
<span class="right-title-grey">招标公告:</span>
<router-link :to="toEnterprise(item.jskEid,'business',5)" target="_blank">
<span @click="toEnterprise(item.jskEid,'business',5,item.name)">
<span class="right-title-blue" v-html="item.jskBidCount"> </span>
</router-link>
</span>
<!-- <router-link :to="toEnterprise(item.jskEid,'business',5)" >
<span class="right-title-blue" v-html="item.jskBidCount"> </span>
</router-link> -->
</template>
<template v-if="item.customerCount>0">
<span class="right-title-grey">客户:</span>
<router-link :to="toEnterprise(item.jskEid,'business',1)" target="_blank">
<span @click="toEnterprise(item.jskEid,'business',1,item.name)">
<span class="right-title-blue" v-html="item.customerCount"> </span>
</router-link>
</span>
<!-- <router-link :to="toEnterprise(item.jskEid,'business',1)" >
<span class="right-title-blue" v-html="item.customerCount"> </span>
</router-link> -->
</template>
<template v-if="item.supplierCount>0">
<span class="right-title-grey">供应商:</span>
<router-link :to="toEnterprise(item.jskEid,'business',2)" target="_blank">
<span @click="toEnterprise(item.jskEid,'business',2,item.name)">
<span class="right-title-blue" v-html="item.supplierCount"> </span>
</span>
<!-- <router-link :to="toEnterprise(item.jskEid,'business',2)" >
<span class="right-title-blue" v-html="item.supplierCount"> </span>
</router-link>
</router-link> -->
</template>
</p>
<p class="card-right-title" v-if="item.formerName!=null&&(item.formerName.indexOf('color')!=-1||item.name.indexOf('color')!=-1)"
......@@ -2748,12 +2775,11 @@ export default {
},
toEnterprise(id, html, type) {
return '/company/' + encodeStr(id) + '/' + (html ? '?html=' + html : '') + (type ? '&flag=true&type=' + type : '');
toEnterprise(id, html, type,name) {
this.$tab.openPage(name, '/company/' + encodeStr(id) + '/' + (html ? html + '/' : '') + (type ? '?flag=true&type=' + type : ''))
},
toEnterpriseDetail(id) {
return '/company/' + encodeStr(id) + '/?index=true';
toEnterpriseDetail(id,name) {
this.$tab.openPage(name, '/company/' + encodeStr(id) )
},
labelsWidth(e, t = 0) {
......
......@@ -112,9 +112,10 @@
<skeleton style="margin-left:16px;" v-if="isSkeleton"></skeleton>
<div class="table-item-jf table-item" v-if="!isSkeleton&&tableData.length>0">
<el-table :data="tableData" :header-cell-style="{ background:'#f0f3fa',color: 'rgba(35,35,35,0.8)'}" v-horizontal-scroll="'hover'"
class="table-item1 fixed-table" border highlight-current-row :header-row-class-name="setHeaderRow" :cell-class-name="setCellClass"
:row-class-name="setRowClass" :header-cell-class-name="setCellClass" @sort-change="sortChange" ref="theOwnerListTable">
<el-table :data="tableData" :header-cell-style="{ background:'#f0f3fa',color: 'rgba(35,35,35,0.8)'}"
v-sticky-header.always="{offsetTop : '56px',offsetBottom : '10px'}" class="table-item1 fixed-table" border highlight-current-row
:header-row-class-name="setHeaderRow" :cell-class-name="setCellClass" :row-class-name="setRowClass" :header-cell-class-name="setCellClass"
@sort-change="sortChange" ref="theOwnerListTable">
<el-table-column type="index" label="序号" :fixed="tableColumnFixed" width="60" :resizable="false">
<template slot-scope="scope">
......@@ -180,7 +181,8 @@
<el-table-column label="历史发包总金额" min-width="120" :resizable="false" :sortable="'custom'" prop="inviteTenderSumAmount">
<template slot-scope="scope">
<div style="text-align:right;white-space: nowrap;">{{parseFloat(scope.row.inviteTenderSumAmount) ? `${scope.row.inviteTenderSumAmount}万元`:"--"}}
<div style="text-align:right;white-space: nowrap;">
{{parseFloat(scope.row.inviteTenderSumAmount) ? `${scope.row.inviteTenderSumAmount}万元`:"--"}}
</div>
</template>
</el-table-column>
......
......@@ -97,6 +97,12 @@
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right">
<template slot-scope="scope" v-if="scope.row.roleId !== 1">
<el-button
size="mini"
type="text"
icon="el-icon-refresh"
@click="handleSync(scope.row)"
>同步</el-button>
<el-button
size="mini"
type="text"
......@@ -205,6 +211,19 @@
<el-button @click="cancel">取 消</el-button>
</div>
</el-dialog>
<el-dialog
title="权限同步"
:visible.sync="dialogVisible1"
custom-class="sync"
width="400px">
<p style="font-size: 16px;"><i class="el-icon-warning-outline" style="margin-right: 8px;"></i>是否确认同步?</p>
<p>温馨提示:此操作可能会影响正在使用的用户,建议合理安排同步时间</p>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogVisible1 = false">取消</el-button>
<el-button type="primary" @click="handleConfirm()" :loading="state">同步</el-button>
</div>
</el-dialog>
</div>
</template>
......@@ -215,7 +234,8 @@
getTenant,
getTenantList,
saveTenant,
selectTenant
selectTenant,
syncTenantPackage
} from '@/api/enterpriseManagement/enterpriseManagement'
export default {
......@@ -242,6 +262,7 @@
title: "",
// 是否显示弹出层
open: false,
dialogVisible1: false,
// 查询参数
queryParams: {
pageNum: 1,
......@@ -284,6 +305,8 @@
},
//企业方案列表
packageList:[],
syncItem:{},
state:false,
};
},
created() {
......@@ -360,6 +383,24 @@
this.title = "添加企业";
this.getpack()
},
/** 同步弹窗显示 */
handleSync(row) {
this.dialogVisible1=true;
this.syncItem=row;
},
/** 同步按钮操作 */
handleConfirm() {
let _this = this
this.state=true
syncTenantPackage({tenantId:this.syncItem.tenantId,packageId:this.syncItem.packageId}).then(res => {
if(res.code === 200){
this.state=false
_this.$message.success(res.msg);
this.dialogVisible1=false;
}
});
},
/** 修改按钮操作 */
handleUpdate(row) {
this.disabled = false
......@@ -447,4 +488,14 @@
}
};
</script>
<style lang="scss" scoped>
::v-deep .sync{
.el-dialog__header{
border-bottom: 1px solid #eee;
}
.el-dialog__body{
padding: 15px 20px
}
}
</style>
......@@ -32,19 +32,35 @@
<!--<i slot="prefix" class="el-icon-search"></i>-->
<!--<el-button slot="append" @click="handleSearch()">搜索</el-button>-->
<!--</el-input>-->
<!--&lt;!&ndash; 未点击前的输入框样式 &ndash;&gt;-->
<!--<div class="normal-search-container" @click="showSearchBox = true" v-if="!showSearchBox">-->
<!--<img src="@/assets/images/enterprise/enterprise-search-icon.svg" alt="">-->
<!--<span>搜索</span>-->
<!--</div>-->
<!--&lt;!&ndash; 输入框展开后样式 &ndash;&gt;-->
<!--<transition @enter="onEnter" appear mode="out-in">-->
<!--<div class="cooperate-name enterprise-search-container" id="focus1" v-if="showSearchBox">-->
<!--<el-input clearable @clear="handleSearch" @focus="clickFocus('focus1')" @blur="clickFocus('focus1')" v-model="queryParams.ename"-->
<!--placeholder="输入关键词查询"></el-input>-->
<!--<span @click="handleSearch">搜索</span>-->
<!--</div>-->
<!--</transition>-->
<!-- 未点击前的输入框样式 -->
<div class="normal-search-container" @click="showSearchBox = true" v-if="!showSearchBox">
<div class="normal-search-container" :class="{'is-hover-search' : hover}" @mouseover="searchHover($event)"
@mouseleave="searchUnHover($event,queryParams.ename)">
<img src="@/assets/images/enterprise/enterprise-search-icon.svg" alt="">
<span>搜索</span>
</div>
<!-- 输入框展开后样式 -->
<transition @enter="onEnter" appear mode="out-in">
<div class="cooperate-name enterprise-search-container" id="focus1" v-if="showSearchBox">
<el-input clearable @clear="handleSearch" @focus="clickFocus('focus1')" @blur="clickFocus('focus1')" v-model="queryParams.ename"
placeholder="输入关键词查询"></el-input>
<span @click="handleSearch">搜索</span>
</div>
<span v-show="!hover && !queryParams.ename">搜索</span>
<el-input v-model="queryParams.ename" placeholder="输入关键词查询"
@focus="searchFocus($event)" @blur="searchBlur($event)" @keydown.native.enter="handleSearch"
@input="value => searchInput(value)" v-show="hover || queryParams.ename">
<template slot="suffix">
<transition mode="out-in" appear name="fade">
<img src="@/assets/images/enterprise/search-input-clear-icon.svg" alt="" @click.stop="queryParams.ename = '';handleSearch()"
v-show="showClearIcon">
</transition>
</template>
</el-input>
</div>
<span class="total">共{{tableDataTotal}}条</span>
</div>
<skeleton v-if="isSkeleton" style="padding: 16px"></skeleton>
......@@ -157,7 +173,8 @@ export default {
timePlaceholder:'中标时间',
inputID1:this.getUid(),
inputID2:this.getUid(),
showSearchBox: false
showClearIcon: false,
hover: false,
}
},
created() {
......@@ -315,6 +332,28 @@ export default {
this.querySubmit()
}
},
searchFocus(event) {
const { target } = event;
if (target?.value?.length) {
this.showClearIcon=true
}
},
searchBlur(event) {
this.showClearIcon=false
},
searchInput(value) {
if (value?.length) {
this.showClearIcon=true
}
},
searchHover(event) {
this.hover=true
},
searchUnHover(event, value) {
if (!value) {
this.hover=false
}
},
formatStatus: function(row, column, cellValue) {
return cellValue? cellValue : '-'
},
......@@ -593,12 +632,21 @@ export default {
margin-bottom: 3px;
}
}
.normal-search-container {
margin-left: 12px;
::v-deep .normal-search-container {
display: flex;
align-items: center;
cursor: pointer;
height: 34px;
line-height: 32px;
height: 32px;
&.is-hover-search {
width: 238px;
background: #f4f6f9;
border-radius: 4px 4px 4px 4px;
& > img {
cursor: unset;
}
}
&:hover {
& > span {
color: #0081ff;
......@@ -609,15 +657,52 @@ export default {
width: 16px;
height: 16px;
margin-left: 12px;
cursor: pointer;
}
& > span {
color: #232323;
color: rgba(35, 35, 35, 0.8);
font-weight: 400;
margin-left: 8px;
line-height: 22px;
font-size: 14px;
cursor: pointer;
}
.el-input {
& > .el-input__inner {
border: none;
height: 32px;
line-height: 32px;
caret-color: #0081ff;
color: rgba(35, 35, 35, 0.8);
font-size: 14px;
background: #f4f6f9;
padding-right: 26px;
padding-left: 8px;
&::placeholder {
color: rgba(35, 35, 35, 0.4) !important;
font-size: 14px !important;
line-height: 32px;
}
}
.el-input__suffix {
right: 12px;
display: flex;
align-items: center;
.el-input__suffix-inner {
height: 14px;
width: 14px;
}
img {
cursor: pointer;
vertical-align: unset;
margin-bottom: 14px;
}
}
}
}
.cooperate-name {
......
......@@ -320,16 +320,16 @@
this.dataRegion()
this.yearsData()
this.getCountBidByType()
setTimeout(() => {
}, 1000);
},
mounted() {
this.getCountBidGroupByProvince()
this.getRangeBidMoney()
this.getRangeBidFiveYears()
this.getLowerRateByYear()
setTimeout(() => {
this.getLowerRangeTenderType()
}, 1000);
},
beforeDestroy(){
......@@ -977,6 +977,11 @@
smooth: false, //平滑
type:"line",
symbolSize: 6, //折线拐点大小
tooltip: {
valueFormatter: function (value) {
return value + '%';
}
},
itemStyle: {
normal: {
borderWidth: 4,
......@@ -990,6 +995,11 @@
smooth: false, //平滑
type:"line",
symbolSize: 6, //折线拐点大小
tooltip: {
valueFormatter: function (value) {
return value + '%';
}
},
itemStyle: {
normal: {
borderWidth: 4,
......@@ -1003,6 +1013,11 @@
smooth: false, //平滑
type:"line",
symbolSize: 6, //折线拐点大小
tooltip: {
valueFormatter: function (value) {
return value + '%';
}
},
itemStyle: {
normal: {
borderWidth: 4,
......
......@@ -11,9 +11,9 @@
<script>
import { steerScroll } from '@/assets/js/jskplug';
import { dskAccessToken } from '@/api/common';
import {encodeStr} from "@/assets/js/common.js"
import { encodeStr } from "@/assets/js/common";
import MaxPageSizeTip from "@/views/components/MaxPageSizeTip.vue";
import { getUipIdByCid } from '@/api/macro/macro'
import { getUipIdByCid } from '@/api/macro/macro';
export default {
name: 'Enterprise',
components: {
......@@ -42,35 +42,15 @@ export default {
if (window.location.host === 'http://szh.jiansheku.com' || window.location.host === 'szh.jiansheku.com') {
this.domain = 'https://plug.jiansheku.com';
} else {
this.domain='https://pre-plug.jiansheku.com'
this.domain = 'https://pre-plug.jiansheku.com';
// this.domain = 'http://192.168.60.8:3400';
// this.domain = 'http://192.168.60.210:3400';
}
this.gettokens();
this.iframeObserver();
let that = this
let that = this;
window.addEventListener("message", this.pagecapListener, { passive: true });
window.addEventListener('message', function (event) {
if(event.data.id){
getUipIdByCid([event.data.id]).then(res=>{
if (res.code==200) {
if(res.data&&res.data.length>0&&res.data[0].uipId){
that.$router.push({path: '/enterprise/'+that.encodeStr(event.data.id)})
}else{
that.$tab.openPage(event.data.title, '/company/'+that.encodeStr(event.data.id))
}
}
}).catch(error=>{
});
}else{
if(event.data.url){
that.$tab.openPage(event.data.title, event.data.url).then(() => {
// 执行结束的逻辑
})
}
}
}, false);
window.addEventListener('message', this.linkListener, false);
},
mounted() {
this.iframeLoading(); // 判断iframe页面是否加载完成-当前页控制
......@@ -81,10 +61,34 @@ export default {
steerScroll('companyIframe', this.navigation, this.footHeight); // iframeId: iframe的id;navigation:页面排除iframe后剩下的顶部高度;footHeight: 页面排除iframe后剩下的底部高度;state:监听or移除监听;parentId: 父级id[不带默认就是铺满整个页面]];_this:指向当前实例(可忽略)
clearInterval(this.tokentimer);
window.removeEventListener("message", this.pagecapListener, { passive: true });
window.removeEventListener("message", this.linkListener);
// 移除layout样式
this.iframeIns.contentWindow.postMessage("removeHtmlLayoutStyle", { targetOrigin: this.domain, });
},
methods: {
linkListener(event) {
let { data } = event;
if (data.id) {
getUipIdByCid([data.id]).then(res => {
if (res.code == 200) {
if (res.data && res.data.length > 0 && res.data[0].uipId) {
this.$router.push({ path: '/enterprise/' + this.encodeStr(data.id) });
} else {
this.$tab.openPage(data.title, '/company/' + this.encodeStr(data.id));
}
}
}).catch(error => {
});
} else {
if (data.url) {
this.$tab.openPage(data.title, data.url).then(() => {
// 执行结束的逻辑
});
}
}
},
async iframeObserver() {
try {
await this.$nextTick();
......@@ -147,9 +151,13 @@ export default {
<style lang="scss" scoped>
.market-container {
width: 100%;
height: 100%;
padding: 16px 24px;
padding-right: 15px;
box-sizing: border-box;
position: absolute;
left: 0;
top: 0;
.market-iframe {
width: 100%;
......
<template>
<el-dialog :visible="dialogShow" width="464px" custom-class="add-bid-opening-record" :show-close="false">
<div class="add-bid-opening-record-inner">
<slot name="dialog-main">
<!-- 弹窗header -->
<slot name="dialog-header">
<div class="add-header">
<div class="header-left-container">
<slot name="dialog-header-icon">
<img src="@/assets/images/economies/icon.png" alt="" class="header-icon">
</slot>
<slot name="dialog-header-title">
<span class="header-title">{{title}}</span>
</slot>
</div>
<div class="header-right-container">
<slot name="dialog-header-close-icon">
<i class="el-icon-close dialog-header-close-icon" @click="dialogClose('contentFormIns')"></i>
</slot>
</div>
</div>
</slot>
<!-- 弹窗表单 -->
<slot name="dialog-content">
<div class="add-content-form">
<el-form :model="formData" :rules="formRules" label-width="auto" class="content-form-ins" ref="contentFormIns">
<el-form-item label="投标人 :" prop="tenderer">
<el-input v-model="formData.tenderer" placeholder="请输入投标人"></el-input>
</el-form-item>
<el-form-item label="企业性质 :" prop="tendererNature">
<el-input v-model="formData.tendererNature" placeholder="请输入企业性质"></el-input>
</el-form-item>
<el-form-item label="项目经理 :" prop="businessManager">
<el-input v-model="formData.businessManager" placeholder="请输入项目经理"></el-input>
</el-form-item>
<el-form-item label="联系方式 :" prop="contact">
<el-input v-model="formData.contact" placeholder="请输入联系方式"></el-input>
</el-form-item>
<el-form-item label="投标金额 :" class="has-unit" prop="tenderAmount">
<el-input v-model="formData.tenderAmount" placeholder="请输入投标金额" @input="(value) => tenderAmountInput(value,formData)"></el-input>
<span class="content-form-item-unit">万元</span>
</el-form-item>
</el-form>
</div>
</slot>
<!-- 底部按钮 -->
<slot name="dialog-footer">
<div class="add-footer">
<div class="add-footer-btn cancel-btn" @click="dialogClose('contentFormIns')">{{cancelText}}</div>
<div class="add-footer-btn ok-btn" @click="ok('contentFormIns')">{{okText}}</div>
</div>
</slot>
</slot>
</div>
</el-dialog>
</template>
<script>
export default {
name: "addBidOpeningRecord",
props: {
show: {
type: Boolean,
default: false
},
title: {
type: String,
default: ""
},
formData: {
type: Object,
default: () => ({})
},
formRules: {
type: Object,
default: () => ({})
},
okText: {
type: String,
default: "确定"
},
cancelText: {
type: String,
default: "取消"
}
},
watch: {
"show": {
handler(newValue, oldValue) {
this.dialogShow = newValue;
}
}
},
data() {
return {
dialogShow: this.show
};
},
//可访问data属性
created() {
},
//计算集
computed: {
},
//方法集
methods: {
dialogClose(refStr) {
Object.assign(this.$data, this.$options.data.call(this));
this.$refs[refStr].clearValidate();
this.$emit("dialogClose");
},
ok(refStr) {
this.$refs[refStr].validate(flag => {
console.log(flag);
if (flag) {
this.$emit("validatorSuccess");
}
});
},
tenderAmountInput(value, data) {
data.tenderAmount = value.replace(/[^\d.]/g, "")
.replace(/\.{2,}/g, ".")
.replace(".", "$#$")
.replace(/\./g, "")
.replace("$#$", ".")
.replace(/^(\-)*(\d+)\.(\d+).*$/, '$1$2.$3')
.replace(/^\./g, "").replace(/^0+(\d)/, '');
}
},
}
</script>
<style lang="scss" scoped>
::v-deep .add-bid-opening-record {
.el-dialog__body,
.el-dialog__header {
padding: 0px;
}
.add-bid-opening-record-inner {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
.add-header {
width: 100%;
height: 48px;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0px 16px;
box-sizing: border-box;
border-bottom: 1px solid #e1e1e1;
.header-left-container {
display: flex;
align-items: center;
& > .header-icon {
width: 17px;
height: 17px;
}
& > .header-title {
margin-left: 8px;
color: #232323;
font-size: 16px;
font-weight: bold;
}
}
.header-right-container {
.dialog-header-close-icon {
font-size: 16px;
color: #999999;
cursor: pointer;
&:hover {
color: #0081ff;
}
}
}
}
.add-content-form {
padding: 24px;
box-sizing: border-box;
.content-form-ins {
.el-form-item {
margin-bottom: 16px;
display: flex;
align-items: center;
.el-form-item__label {
padding: 0px;
line-height: 32px;
font-size: 14px;
font-weight: 400;
color: rgba(35, 35, 35, 0.8);
white-space: nowrap;
}
.el-form-item__content {
width: 100%;
margin-left: 0px !important;
line-height: 32px;
.el-input {
.el-input__inner {
height: 32px;
line-height: 32px;
padding: 0px 8px;
box-sizing: border-box;
&:focus {
border-color: #0081ff;
}
&::placeholder {
color: rgba(35, 35, 35, 0.4) !important;
font-size: 14px;
}
}
}
.el-form-item__error {
padding-top: 2px;
}
}
&.has-unit {
.el-form-item__content {
display: flex;
align-items: center;
.content-form-item-unit {
white-space: nowrap;
margin-left: 8px;
}
}
}
}
}
}
.add-footer {
display: flex;
justify-content: flex-end;
align-items: center;
padding: 24px;
padding-top: 0px;
box-sizing: border-box;
.add-footer-btn {
min-width: 80px;
padding: 0px 13px;
height: 32px;
line-height: 32px;
text-align: center;
border-radius: 2px;
color: rgba(35, 35, 35, 0.8);
font-size: 14px;
font-weight: 400;
cursor: pointer;
box-sizing: border-box;
&.cancel-btn {
background: #fff;
border: 1px solid #d9d9d9;
}
&.ok-btn {
background: #0081ff;
color: #fff;
margin-left: 8px;
}
}
}
}
}
</style>
<template>
<div class="batch-import-com">
<!-- 导入弹窗 -->
<el-dialog :title="upload.title" :visible.sync="upload.open" width="400px">
<el-upload ref="upload" :limit="1" accept=".xlsx, .xls" :headers="upload.headers" :action="upload.url" :disabled="upload.isUploading"
:on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
<div class="el-upload__tip text-center" slot="tip">
<span>仅允许导入xls、xlsx格式文件。</span>
<el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">下载模板</el-link>
</div>
</el-upload>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitFileForm">确 定</el-button>
<el-button @click="upload.open = false">取 消</el-button>
</div>
</el-dialog>
<!--导入结果-->
<el-dialog title="导入失败" :visible.sync="upload.showResult" width="60%" class="batch-import-upload-dialog-container"
custom-class="batch-import-upload-dialog" @close="importResultClose">
<div class="batch-import-upload-inner">
<el-table :data="uploadResult.errorMsg" border stripe v-if="uploadResult.errorMsg.length" class="error-msg-list-table" max-height="500px">
<el-table-column label="导入状态">
<template slot-scope="scope">
<span style="color:red;">导入失败</span>
</template>
</el-table-column>
<!-- <el-table-column label="投标人">
<template slot-scope="scope">
<span></span>
</template>
</el-table-column> -->
<el-table-column label="导入失败原因">
<template slot-scope="scope">
<span style="color:red;">{{scope.row}}</span>
</template>
</el-table-column>
</el-table>
<el-row style="padding-top: 20px;text-align: right">
<el-button @click="upload.showResult = false">取消</el-button>
<el-button type="primary" @click="upload.showResult = false">确定</el-button>
</el-row>
</div>
</el-dialog>
</div>
</template>
<script>
export default {
name: "batchImportCom",
props: {
uploadOptions: {
type: Object,
default: () => ({})
}
},
watch: {
"uploadOptions": {
handler(newValue, oldValue) {
this.upload = newValue;
},
deep: true
}
},
data() {
return {
// 导入参数
upload: this.uploadOptions,
// 导入结果
uploadResult: {
successCount: 0,
errorCount: 0,
errorMsg: []
}
};
},
//可访问data属性
created() {
},
//计算集
computed: {
},
//方法集
methods: {
// 文件上传中处理
handleFileUploadProgress(event, file, fileList) {
this.upload.isUploading = true;
},
// 文件上传成功处理
handleFileSuccess(response, file, fileList) {
this.upload.open = false;
this.upload.isUploading = false;
this.$refs.upload.clearFiles();
if (response.code == 200) {
this.$message.success('上传成功!');
if (response.data) {
this.uploadResult.successCount = response.data.sucessCount;
this.uploadResult.errorCount = response.data.errorCount;
response.data.errorMsg ? this.uploadResult.errorMsg = response.data.errorMsg : null;
this.upload.showResult = true;
}
} else {
this.$message.error(`上传失败,${response.msg ? response.msg : "请根据模板正确填写表格内容!"}`);
}
},
// 提交上传文件
submitFileForm() {
this.$refs.upload.submit();
},
/** 下载模板操作 */
importTemplate() {
let a = document.createElement("a");
a.setAttribute("href", this.upload.fileTemplateUrl);
a.setAttribute("download", `${this.upload.fileName}_${new Date().getTime()}.xlsx`);
document.body.appendChild(a);
a.click();
a.remove();
},
importResultClose() {
this.upload.showResult = false;
this.uploadResult = this.$options.data.call(this).uploadResult;
},
},
}
</script>
<style lang="scss" scoped>
.batch-import-com {
::v-deep.batch-import-upload-dialog-container {
.batch-import-upload-dialog {
width: 100%;
max-height: 85%;
overflow: auto;
.el-dialog__header {
position: sticky;
top: 0px;
background: #fff;
z-index: 99;
padding-bottom: 0px;
}
.batch-import-upload-inner {
width: 100%;
display: flex;
flex-direction: column;
.result-count {
line-height: 32px;
.success {
color: #67c23a;
}
.error {
color: #f56c6c;
}
}
.error-msg-list-table {
margin-top: 8px;
}
}
}
}
}
</style>
<template>
<div class="bid-opening-record">
<div class="bid-opening-record-inner">
<!-- 查询功能 -->
<div class="search-form-container">
<div class="left-form-title">开标记录</div>
<div class="right-form-btn-box">
<div class="search-btn add" @click.stop="addBidOpeningRecord">
<img src="@/assets/images/project/project-bid-opening-record-add.svg" alt="">
<span>新增</span>
</div>
<div class="search-btn remove" @click.stop="batchDeletion()">
<img src="@/assets/images/project/project-bid-opening-record-remove.svg" alt="">
<span>批量删除</span>
</div>
<div class="search-btn import" @click.stop="batchImport">
<img src="@/assets/images/project/project-bid-opening-record-import.svg" alt="">
<span>批量导入</span>
</div>
</div>
</div>
<!-- 骨架屏 -->
<skeleton v-if="isLoadingData"></skeleton>
<!-- 列表 -->
<div class="table-data-list-container" v-else-if="!isLoadingData || !tableDataList.length">
<table-list-com :formColum="formColum" :queryParams="queryParams" :tableData="tableDataList" :tableDataTotal="tableDataTotal"
:needSelection="needSelection" :stickyHeader="{offsetTop:'48px',offsetBottom : '10px'}" @selectionChange="selectionChange"
@handle-current-change="pageCurrentChange" ref="tableListComParent">
<template slot="tenderAmountHeader">
<div class="tender-amount-header">
<span>投标金额(万元)</span>
<div class="tender-amount-sort">
<svg-icon icon-class="asc" :class="{'sort-active' : queryParams.isAsc == 'asc'}"
@click.stop="sortChange('tenderAmount','asc')"></svg-icon>
<svg-icon icon-class="desc" :class="{'sort-active' : queryParams.isAsc == 'desc'}"
@click.stop="sortChange('tenderAmount','desc')"></svg-icon>
</div>
</div>
</template>
<template slot="tenderAmount" slot-scope="scope">
<span>{{parseFloat(scope.row.tenderAmount) ? scope.row.tenderAmount : "--"}}</span>
</template>
<template slot="action-field-bar" slot-scope="scope">
<div class="action-field-bar-container">
<span class="action-field-bar-btn modify" @click.stop="modifyBidOpeningRecord(scope.row)">编辑</span>
<span class="action-field-bar-btn remove" @click.stop="batchDeletion(scope.row.id)">删除</span>
</div>
</template>
</table-list-com>
</div>
</div>
<!-- 新增开标记录弹窗 -->
<add-bid-opening-record :show="showAddDialog" :title="title" @dialogClose="dialogClose" @validatorSuccess="validatorSuccess"
:formRules="formRules" :formData="formData"></add-bid-opening-record>
<!-- 导入弹窗 -->
<batch-import-com :uploadOptions="uploadOptions"></batch-import-com>
</div>
</template>
<script>
import skeleton from './skeleton';
import TableListCom from "@/components/TableListCom";
import BatchImportCom from "./BatchImportCom";
import { getBidOpeningRecordListApi, addBidOpeningRecordApi, modifyBidOpeningRecordApi, removeBidOpeningRecordApi } from "@/api/project/project";
import AddBidOpeningRecord from "./AddBidOpeningRecord.vue";
import { getToken } from "@/utils/auth";
export default {
components: { skeleton, TableListCom, AddBidOpeningRecord, BatchImportCom },
name: "bidOpeningRecord",
data() {
// 必填字符串长度验证
function tendererStrLengthValidator(target) {
return function (rule, value, callback) {
if (!value && !value?.toString()?.trim()) {
return callback(new Error(`请输入${target}`));
}
return callback();
};
};
function requiredStrLengthValidator(target) {
return function (rule, value, callback) {
if (value && !value?.toString()?.trim()) {
return callback(new Error(`请输入${target}`));
}
return callback();
};
};
// 字符串长度验证
function strLengthValidator(target) {
return function (rule, value, callback) {
if (value && !value?.toString()?.trim()) {
return callback(new Error(`请输入${target}`));
}
return callback();
};
};
// 电话验证
const phoneReg = /^1[3-9]\d{9}$/;
function phoneNumberValidator(rule, value, callback) {
if (value && !value?.toString()?.trim()) {
return callback(new Error(`请输入联系方式`));
}
if (value && !phoneReg.test(value)) {
return callback(new Error(`请输入正确的手机号码`));
}
return callback();
};
// 金额验证
const amountReg = /^(?!0\d)\d+(\.\d+)?$/;
function amountValidator(rule, value, callback) {
if ((value && value != "0") && !value?.toString()?.trim()) {
return callback(new Error(`请输入投标金额`));
}
if (value && !amountReg.test(value)) {
return callback(new Error("请输入正确的投标金额"));
}
return callback();
}
return {
title: "新增开标记录",
// 加载状态
isLoadingData: false,
// 列表列数据
formColum: [
{ label: '投标人', prop: 'tenderer', minWidth: "468px" },
{ label: '企业性质', prop: 'tendererNature', minWidth: "96px" },
{ label: '项目经理', prop: 'businessManager', minWidth: "115px" },
{ label: '联系方式', prop: 'contact', width: "133px", },
{ label: '投标金额(万元)', prop: 'tenderAmount', width: "168px", slot: true, slotHeader: true, slotName: "tenderAmountHeader" },
{ label: '操作', prop: 'action-field-bar', width: "151px", fixed: "right" },
],
needSelection: {
flag: true,
width: "39px",
},
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 20,
orderByColumn: "tenderAmount",
isAsc: "asc",
businessId: this.$route.query.id,
},
tableDataTotal: 0,
tableDataList: [],
// 表单验证规则
// 表单数据
formData: {
businessId: this.$route.query.id,
tenderer: "",
tendererNature: "",
businessManager: "",
contact: "",
tenderAmount: ""
},
formRules: {
tenderer: [{ required: true, trigger: "blur", validator: tendererStrLengthValidator("投标人") }],
tendererNature: [{ trigger: "blur", validator: requiredStrLengthValidator("企业性质") }],
businessManager: [{ trigger: ["change", "blur"], validator: strLengthValidator("项目经理") }],
contact: [{ trigger: ["blur"], validator: phoneNumberValidator }],
tenderAmount: [{ trigger: ["blur"], validator: amountValidator }],
},
selectionArray: [],
// 展示新增弹窗
showAddDialog: false,
// 导入开标记录配置
uploadOptions: {
// 是否显示弹出层
open: false,
// 弹出层标题
title: "导入开标信息",
// 是否禁用上传
isUploading: false,
// 设置上传的请求头部
headers: { Authorization: "Bearer " + getToken() },
// 上传的地址
url: process.env.VUE_APP_BASE_API + `/business/open/tender/importData/${this.$route.query.id}`,
// 展示上传结果
showResult: false,
// 模板下载地址
fileTemplateUrl: "/file/bidOpeningRecordTemplate.xlsx",
// 模板名称
fileName: "bidOpeningRecordTemplate"
},
};
},
//可访问data属性
created() {
this.dataInit();
},
//计算集
computed: {
},
//方法集
methods: {
async dataInit() {
try {
await this.getTableList();
} catch (error) {
console.log(error);
}
},
async getTableList(pageNum, pageSize, orderByColumn, isAsc) {
try {
this.searchCheck(pageNum, pageSize, orderByColumn, isAsc);
this.isLoadingData = true;
const result = await getBidOpeningRecordListApi(this.queryParams);
if (result.code == 200) {
this.tableDataList = result.rows;
this.tableDataTotal = result.total;
}
} catch (error) {
console.log(error);
} finally {
this.isLoadingData = false;
await this.resetSelection();
}
},
searchCheck(pageNum, pageSize, orderByColumn, isAsc) {
if (!pageNum) {
this.queryParams.pageNum = 1;
}
if (!pageSize) {
this.queryParams.pageSize = 20;
}
if (!orderByColumn) {
this.queryParams.orderByColumn = "tenderAmount";
}
if (!isAsc) {
this.queryParams.isAsc = "asc";
}
},
addBidOpeningRecord() {
this.title = "新增开标记录";
this.showAddDialog = true;
},
// 修改开标记录
modifyBidOpeningRecord({ businessId, businessManager, contact, id, tenderAmount, tenderer, tendererNature }) {
const params = {
businessId,
businessManager,
contact,
id,
tenderAmount,
tenderer,
tendererNature
};
this.formData = { ...this.formData, ...params };
this.title = "修改开标记录";
this.showAddDialog = true;
},
dialogClose() {
this.showAddDialog = false;
this.formData = this.$options.data.call(this).formData;
},
// 验证通过提交数据
async validatorSuccess() {
try {
const temp = JSON.parse(JSON.stringify(this.formData));
const keys = Object.keys(temp);
const flag = keys.every(key => ((key == "id" || key == "businessId") ? true : (!temp[key] && temp[key] != "0") ? true : false));
if (flag) {
return this.dialogClose();
}
const result = this.formData.id ? await modifyBidOpeningRecordApi(this.formData) : await addBidOpeningRecordApi(this.formData);
if (result.code == 200) {
this.$message.success(`${this.formData.id ? "修改成功!" : "新增成功!"}`);
this.dialogClose();
await this.getTableList();
}
} catch (error) {
console.log(error);
}
},
// 重置复选框
async resetSelection() {
try {
await this.$nextTick();
// 清空复选框选项
this.$refs["tableListComParent"].$refs["tableRef"].clearSelection();
this.selectionArray = [];
} catch (error) {
console.log(error);
}
},
// 批量删除
async batchDeletion(id) {
if (!this.selectionArray?.length && !id) return;
this.$confirm('此操作将会删除该数据, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
try {
const array = id ? [{ id }] : this.selectionArray;
const result = await removeBidOpeningRecordApi((array.map(item => item.id)).join(","));
if (result.code == 200) {
this.$message({
type: 'success',
message: '删除成功!'
});
this.getTableList();
}
} catch (error) {
console.log(error);
}
}).catch(() => { });
},
// 复选框选中
selectionChange(array) {
this.selectionArray = array;
},
hasConditions() {
const { pageNum, pageSize, orderByColumn, isAsc } = this.queryParams;
this.getTableList(pageNum, pageSize, orderByColumn, isAsc);
},
// 列排序
sortChange(prop, order) {
this.queryParams.orderByColumn = prop;
if (order == "asc") {
this.queryParams.isAsc = "asc";
} else if (order == "desc") {
this.queryParams.isAsc = "desc";
}
this.hasConditions();
},
// 翻页
pageCurrentChange(page) {
this.queryParams.pageNum = page;
this.hasConditions();
},
// 批量导入
batchImport() {
this.uploadOptions.open = true;
},
cancelimport() {
this.uploadOptions.open = false;
},
getdatas() {
this.getTableList();
}
},
}
</script>
<style lang="scss" scoped>
.bid-opening-record {
width: 100%;
background: #fff;
padding: 16px;
box-sizing: border-box;
.bid-opening-record-inner {
width: 100%;
height: 100%;
.search-form-container {
display: flex;
align-items: center;
justify-content: space-between;
.left-form-title {
font-size: 16px;
line-height: 16px;
font-weight: bold;
color: #232323;
position: relative;
padding-left: 8px;
box-sizing: border-box;
&::before {
content: "";
position: absolute;
left: 0px;
width: 2px;
height: 14px;
background: #445781;
}
}
.right-form-btn-box {
display: flex;
align-items: center;
& > .search-btn:first-of-type {
margin-left: 0px;
}
.search-btn {
height: 32px;
display: flex;
align-items: center;
justify-content: center;
padding: 0px 16px;
box-sizing: border-box;
font-size: 14px;
margin-left: 12px;
cursor: pointer;
& > span {
margin-left: 8px;
}
& > img {
width: 14px;
height: 14px;
}
&.add {
background: #0081ff;
border-radius: 4px;
color: #fff;
}
&.remove {
background: #fff;
border: 1px solid #ff3c3c;
color: #ff3c3c;
border-radius: 2px;
}
&.import {
background: #fff;
border: 1px solid #d9d9d9;
color: #232323;
border-radius: 2px;
}
}
}
}
.table-data-list-container {
width: 100%;
margin-top: 16px;
.action-field-bar-container {
display: flex;
.action-field-bar-btn {
font-size: 12px;
font-weight: 400;
line-height: 20px;
padding: 0px 12px;
box-sizing: border-box;
cursor: pointer;
&.modify {
color: #0081ff;
}
&.remove {
color: #ff3c3c;
}
}
}
.tender-amount-header {
display: flex;
align-items: center;
.tender-amount-sort {
margin-left: 5px;
display: flex;
flex-direction: column;
.svg-icon {
width: 10px;
height: 10px;
fill: #8bd1ff;
cursor: pointer;
&:hover {
fill: #0081ff;
}
&.sort-active {
fill: #0081ff;
}
}
}
}
}
}
}
</style>
<template>
<div class="uploadwin batch-import-reset">
<div class="upload" v-if="addfile==false">
<div class="up_title">批量导入{{titletext}}</div>
<div class="up_box">
<el-upload :class="{'none':isUpload == true}" class="upload-demo" :action="action" :multiple="false" accept=".xls,.xlsx" drag ref="upload"
:auto-upload="false" :file-list="fileList" :on-change="handleFileListChange" :headers="headers" :on-success="onSuccess">
<img class="up_img" src="@/assets/images/project/upload.png">
<div class="up_text">点击选择或将文件(xls,xlsx)拖拽至此上传项目表格</div>
<div class="up_tip">导入的文件内容必须依照下载模板的要求填写</div>
<div class="up_tip">上传文件最大为2M,仅支持Excel表格文件(xls,xlsx)</div>
<div class="up_tip">导入已存在的{{titletext}}将自动跳过</div>
</el-upload>
<div class="up_success" v-if="isUpload == true">
<img src="@/assets/images/project/success.png">上传成功
</div>
<div class="btn_download" v-if="isUpload == false" @click="downloadClick">
<div class="img"></div>点击下载
</div>
</div>
<div class="btns">
<div class="btn btn_primary btn_disabled h34" v-if="isUpload==false">确定导入</div>
<div class="btn btn_primary h34" @click="importConfirmClick" v-else>确定导入</div>
<div class="btn btn_default h34" @click="importCancel">取消</div>
</div>
</div>
<div class="success" v-if="addfile==true">
<div v-if="addsuccess==false">
<img class="img" src="@/assets/images/project/clock.png">
<div class="p1">查询数据中...</div>
<div class="p2">请耐心等待,过程大概30秒</div>
</div>
<div v-if="addsuccess == true">
<div class="p3">
<img src="@/assets/images/project/success.png">查询成功
</div>
<!--<div class="p2">导入成功,已为您去掉重复{{titletext}}{{successCount}}</div>-->
<div class="p2">{{messages}}</div>
<div class="btns">
<div class="btn btn_primary h32" @click="getmsg">查看</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { getToken } from "@/utils/auth";
import "@/assets/styles/project.scss";
export default {
name: 'batchImportReset',
props: {
importtype: ''
},
data() {
return {
isUpload: false,//有上传的文件
addfile: false,//已上传文件
addsuccess: false,//已成功加入数据
//批量导入
action: "",
fileList: [],
headers: {
Authorization: "Bearer " + getToken(),
},
downloadhref: '',//样例地址
titletext: '',
successCount: 0,//成功条数
messages: '',
};
},
created() {
this.downloadhref = '/file/bidOpeningRecordTemplate.xlsx';
this.titletext = '开标记录';
this.action = process.env.VUE_APP_BASE_API + `/business/open/tender/importData/${this.$route.query.id}`;
},
methods: {
getmsg() {
this.importCancel();
this.$emit('getdatas');
},
handleFileListChange(file, fileList) {
var testmsg = file.name.substring(file.name.lastIndexOf(".") + 1);
const extension = testmsg === "xlsx";
const extension1 = testmsg === "xls";
if (!extension && !extension1) {
this.$message({
message: "上传文件只能是.xls,.xlsx格式!",
type: "warning",
});
return false;
}
const isLt2M = file.size / 1024 / 1024 < 2;
if (!isLt2M) {
this.$refs.upload.clearFiles();
this.$message({
message: '上传文件大小不能超过 2MB!',
type: 'warning'
});
return false;
}
if (fileList.length > 0) {
this.fileList = [fileList[fileList.length - 1]];
this.isUpload = true;
}
},
onSuccess(res, file, fileList) {
if (res.code == 200) {
this.successCount = res.data.successCount;
let str = '成功导入条数' + res.data.successCount + ',失败条数' + res.data.errorCount;
this.messages = str;
this.addsuccess = true;
} else {
this.importCancel();
this.$message.error({ message: res.msg, showClose: true });
}
},
downloadClick() {
let a = document.createElement("a");
a.setAttribute("href", this.downloadhref);
a.setAttribute("download", "批量导入模版.xlsx");
document.body.appendChild(a);
a.click();
a.remove();
},
// 批量导入
importConfirmClick() {
if (this.fileList.length > 0) {
this.$refs["upload"].submit();
this.addfile = true;
} else {
this.$message("请先选择文件");
}
},
importCancel() {
this.addfile = false;
this.isUpload = false;
this.addsuccess = false;
this.$emit('cancels');
},
}
}
</script>
<style scoped>
</style>
<template>
<div id="jsnr">
<div id="jsnr" class="project-detail-list">
<div class="project-detail-list-inner">
<div class="miantitle">
<template v-if="!detailId">
<span>项目管理</span>
......@@ -107,7 +108,7 @@
</div>
</el-card>
<el-card class="box-card noborder top12" style="margin-bottom: 12px">
<el-card class="box-card noborder top12 project-detail-tablist" style="margin-bottom: 12px">
<div class="tabslist">
<div class="tab" v-for="(item,index) in tabslist" :class="{'on':thistag == item.tag}" @click="getCom(item.tag)">
<span>{{item.name}}</span>
......@@ -120,6 +121,8 @@
<jsnr v-if="thistag == 'jsnr'" :key="keys1" :isDisabled='isDisabled' @Refrehmoney="getXMSL" :detailId="detailId"></jsnr>
<!--联系人-->
<lxr v-if="thistag == 'lxr'" :isDisabled='isDisabled' :detailId="detailId" listtype="project"></lxr>
<!-- 开标记录 -->
<bid-opening-record v-if="thistag == 'bidOpeningRecord'"></bid-opening-record>
<!--跟进记录-->
<gjjl v-if="thistag == 'gjjl'" :isDisabled='isDisabled' types="gjjl" :detailId="detailId"></gjjl>
<!--工作待办-->
......@@ -130,6 +133,7 @@
<xgqy v-if="thistag == 'xgqy'" :isDisabled='isDisabled' :detailId="detailId"></xgqy>
</div>
</div>
</div>
</template>
<script>
......@@ -143,11 +147,12 @@ import gjjl from './component/gjjl.vue';
import gzdb from './component/gzdb.vue';
import zlwd from './component/zlwd.vue';
import xgqy from './component/xgqy.vue';
import BidOpeningRecord from "./component/BidOpeningRecord.vue";
import prvinceTree from '@/assets/json/provinceTree';
import { getXMSL, editXMNR } from '@/api/project/project';
export default {
name: 'detail',
components: { xmsl, jsnr, lxr, gjjl, gzdb, zlwd, xgqy },
components: { xmsl, jsnr, lxr, gjjl, gzdb, zlwd, xgqy, BidOpeningRecord },
props: {
detailId: { //从企业详情跳转过来ID
type: Number,
......@@ -162,6 +167,7 @@ export default {
{ tag: 'xmsl', name: '项目速览' },
{ tag: 'jsnr', name: '建设内容' },
{ tag: 'lxr', name: '联系人' },
{ tag: 'bidOpeningRecord', name: '开标记录' },
{ tag: 'gjjl', name: '跟进记录' },
{ tag: 'gzdb', name: '工作待办' },
{ tag: 'zlwd', name: '资料文档' },
......@@ -410,6 +416,34 @@ export default {
</script>
<style lang="scss" scoped>
.project-detail-list {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
overflow: auto;
.project-detail-list-inner {
width: 100%;
height: 100%;
.miantitle {
margin: 0px;
padding: 12px 24px;
}
.app-container {
padding-top: 0px;
}
}
.project-detail-tablist {
position: sticky;
top: 0px;
z-index: 10;
}
}
.select-popper {
top: 0;
}
......
......@@ -2,8 +2,12 @@
<div class="app-container">
<el-card class="box-card noborder">
<div class="btns">
<div class="btn btn_default h28" @click="addNew(true)"><div class="img img1"></div>新建项目商机</div>
<div class="btn btn_primary h28" @click="pldrs"><div class="img img2"></div>批量导入</div>
<div class="btn btn_default h28" @click="addNew(true)">
<div class="img img1"></div>新建项目商机
</div>
<div class="btn btn_primary h28" @click="pldrs">
<div class="img img2"></div>批量导入
</div>
</div>
<el-tabs v-model="activeName" @tab-click="handleClick" class="tabpane w100">
<el-tab-pane label="我参与的项目" name="first"></el-tab-pane>
......@@ -23,9 +27,7 @@
项目地区{{searchParam.provinceId.length ||searchParam.cityId.length ||searchParam.districtId.length? searchParam.provinceId.length +searchParam.cityId.length +searchParam.districtId.length +"项": ""}}
<i class="el-icon-caret-bottom"></i>
</span>
<el-cascader class="cascader-region select-location"
ref="myCascader"
:props='props' :options="addressList"
<el-cascader class="cascader-region select-location" ref="myCascader" :props='props' :options="addressList"
@change="handleChange"></el-cascader>
</div>
</div>
......@@ -135,10 +137,12 @@
<div class="det-title" @click="toDetail(item.id,'xmsl')">
<span v-html="item.projectName"></span> <span v-if="activeName!='first' && item.followTime" class="people"><i>{{item.nickName1}}</i>
<span v-if="item.provinceName != '' && item.provinceName!==null">{{item.provinceName}}-</span>
{{item.nickName}} <font color="#FA8A00">正在跟进</font></span></div>
{{item.nickName}} <font color="#FA8A00">正在跟进</font></span>
</div>
<div class="det-tips">
<span class="tips tip1" v-for="label in item.labels">{{label}}</span>
<span v-if="item.address" class="tips tip2">{{item.address}}</span></div>
<span v-if="item.address" class="tips tip2">{{item.address}}</span>
</div>
<div class="det-contets">
<div class="det-con" v-if="item.projectType">
<span>项目类型:</span>
......@@ -154,7 +158,8 @@
</div>
<div class="det-con" v-if="item.ownerCompany ">
<span>业主单位:</span>
<span class="wordprimary" v-if="item.ownerCompanyCid||item.ownerCompanyUipId" @click="toEnterprise(item)" v-html="item.ownerCompany"></span>
<span class="wordprimary" v-if="item.ownerCompanyCid||item.ownerCompanyUipId" @click="toEnterprise(item)"
v-html="item.ownerCompany"></span>
<span v-else v-html="item.ownerCompany"></span>
</div>
</div>
......@@ -174,13 +179,8 @@
</div>
</div>
<div class="pagination-box" v-if="total>searchParam.pageSize">
<el-pagination
background
:page-size="searchParam.pageSize"
:current-page="searchParam.pageNum"
@current-change="handleCurrentChange"
layout="prev, pager, next"
:total="total">
<el-pagination background :page-size="searchParam.pageSize" :current-page="searchParam.pageNum" @current-change="handleCurrentChange"
layout="prev, pager, next" :total="total">
</el-pagination>
</div>
</el-card>
......@@ -191,203 +191,207 @@
</template>
<script>
import "@/assets/styles/project.scss"
import "@/assets/styles/public.scss"
import prvinceTree from '@/assets/json/provinceTree'
import {getProjectlist,delProject} from '@/api/project/project'
import {getDictType,} from '@/api/main'
import addproject from './component/addProject'
import batchimport from './component/batchImport'
import skeleton from './component/skeleton'
import {encodeStr} from "@/assets/js/common.js"
import "@/assets/styles/project.scss";
import "@/assets/styles/public.scss";
import prvinceTree from '@/assets/json/provinceTree';
import { getProjectlist, delProject } from '@/api/project/project';
import { getDictType, } from '@/api/main';
import addproject from './component/addProject';
import batchimport from './component/batchImport';
import skeleton from './component/skeleton';
import { encodeStr } from "@/assets/js/common.js";
export default {
name: 'ProjectList',
components:{addproject,batchimport,skeleton},
components: { addproject, batchimport, skeleton },
data() {
return {
encodeStr,
types:'project',
props:{multiple: true},
activeName:'first',
projectStage:[],//项目阶段
isshow:false,//新增商机
pldr:false,//批量导入
types: 'project',
props: { multiple: true },
activeName: 'first',
projectStage: [],//项目阶段
isshow: false,//新增商机
pldr: false,//批量导入
//项目地区
addressList:[],
addressList: [],
addressType: [],
// 查询参数
minAmount:'',//投资估算最小值
maxAmount:'',//投资估算最大值
minAmount: '',//投资估算最小值
maxAmount: '',//投资估算最大值
searchParam: {
isPrivate:1,//0 公司 1 个人
projectName:'',//项目名称
ownerCompany:'',//业主单位
projectType:'',//项目类型
projectStage:'',//项目阶段
minAmount:'',//投资估算最小值
maxAmount:'',//投资估算最大值
Amount:'',//投资估算
isPrivate: 1,//0 公司 1 个人
projectName: '',//项目名称
ownerCompany: '',//业主单位
projectType: '',//项目类型
projectStage: '',//项目阶段
minAmount: '',//投资估算最小值
maxAmount: '',//投资估算最大值
Amount: '',//投资估算
provinceId: [],
cityId: [],
districtId: [],
pageNum:1,
pageSize:20,
status:null,
},
domicile:[],
projectType:[],//项目类型
projectCategory:[],//项目类别
statusList:[
pageNum: 1,
pageSize: 20,
status: null,
},
domicile: [],
projectType: [],//项目类型
projectCategory: [],//项目类别
statusList: [
{
value:'0',
label:'储备中'
value: '0',
label: '储备中'
},
{
value:'1',
label:'跟进中'
value: '1',
label: '跟进中'
},
{
value:'2',
label:'已合作'
value: '2',
label: '已中标'
},
{
value: '3',
label: '未中标'
},
],
amountOptions:[
amountOptions: [
{
label: "5000万以下",
value: [0,5000],
value: [0, 5000],
},
{
label: "5000万-1亿",
value: [5000,10000],
value: [5000, 10000],
},
{
label: "1亿-3亿",
value: [10000,30000],
value: [10000, 30000],
},
{
label: "3亿以上",
value: [30000,''],
value: [30000, ''],
},
],
contractSignTimeValue: "",
transactionPriceShowPopper: false,
datalist:[],//列表数据
ondel:-1,
total:0,
isSkeleton:true
}
datalist: [],//列表数据
ondel: -1,
total: 0,
isSkeleton: true
};
},
created() {
},
mounted(){
this.prvinceTree()
mounted() {
this.prvinceTree();
//项目阶段
getDictType('project_stage_type').then(result=>{
this.projectStage = result.code == 200 ? result.data:[]
})
getDictType('project_stage_type').then(result => {
this.projectStage = result.code == 200 ? result.data : [];
});
//项目类型
getDictType('project_type').then(result=>{
this.projectType = result.code == 200 ? result.data:[]
})
getDictType('project_type').then(result => {
this.projectType = result.code == 200 ? result.data : [];
});
//项目类别
getDictType('project_category').then(result=>{
this.projectCategory = result.code == 200 ? result.data:[]
})
if(this.$route.query.type==1){
getDictType('project_category').then(result => {
this.projectCategory = result.code == 200 ? result.data : [];
});
if (this.$route.query.type == 1) {
this.activeName = 'second';
}
if(this.$route.query.status){
if (this.$route.query.status) {
this.searchParam.status = this.$route.query.status;
}
if(this.$route.query.projectName){
if (this.$route.query.projectName) {
this.searchParam.projectName = this.$route.query.projectName;
}
this.getList(1)
this.getList(1);
},
methods: {
statusBtn(){
statusBtn() {
},
dc(){
this.$message.warning('功能正在开发中')
dc() {
this.$message.warning('功能正在开发中');
},
deldetail(index){
this.ondel = index
deldetail(index) {
this.ondel = index;
},
deleteProject(id){
delProject(id).then(result =>{
if(result.code==200){
this.$message.success('删除成功!')
this.getList(1)
this.ondel = -1
}else{
this.$message.error(result.msg)
deleteProject(id) {
delProject(id).then(result => {
if (result.code == 200) {
this.$message.success('删除成功!');
this.getList(1);
this.ondel = -1;
} else {
this.$message.error(result.msg);
}
})
});
},
getdatas(){
this.getList(1)
getdatas() {
this.getList(1);
},
cancelimport(){
this.pldr = false
cancelimport() {
this.pldr = false;
},
pldrs(){
this.pldr = true
pldrs() {
this.pldr = true;
},
//获取商机列表
getList(pageNum){
this.isSkeleton = true
this.searchParam.pageNum = pageNum
if(this.activeName == 'first'){
this.searchParam.isPrivate = 1
}else{
this.searchParam.isPrivate = 0
}
this.searchParam.ownerCompany = this.searchParam.projectName
getProjectlist(this.searchParam).then(result=>{
this.isSkeleton = false
if(result.code == 200){
this.datalist = result.rows
this.total = result.total
this.datalist.forEach(item=>{
let str = item.provinceName
if(item.cityName != "" && item.cityName != null)
str += '-' +item.cityName
if(item.districtName != ""&& item.districtName != null)
str += '-' +item.districtName
item.address = str
item.nickName1 = item.nickName?item.nickName.slice(0,1):''
item.labels=[]
if(item.label!=null && item.label !=""){
item.labels = item.label.split(',')
getList(pageNum) {
this.isSkeleton = true;
this.searchParam.pageNum = pageNum;
if (this.activeName == 'first') {
this.searchParam.isPrivate = 1;
} else {
this.searchParam.isPrivate = 0;
}
this.searchParam.ownerCompany = this.searchParam.projectName;
getProjectlist(this.searchParam).then(result => {
this.isSkeleton = false;
if (result.code == 200) {
this.datalist = result.rows;
this.total = result.total;
this.datalist.forEach(item => {
let str = item.provinceName;
if (item.cityName != "" && item.cityName != null)
str += '-' + item.cityName;
if (item.districtName != "" && item.districtName != null)
str += '-' + item.districtName;
item.address = str;
item.nickName1 = item.nickName ? item.nickName.slice(0, 1) : '';
item.labels = [];
if (item.label != null && item.label != "") {
item.labels = item.label.split(',');
}
})
});
}
})
});
},
reset(){
reset() {
this.$nextTick(() => {
this.$refs.myCascader.$refs.panel.clearCheckedNodes()
this.$refs.myCascader.$refs.panel.activePath = []
})
this.searchParam ={
isPrivate:1,
projectName:'',//项目名称
ownerCompany:'',//业主单位
projectType:'',//项目类型
projectStage:'',//项目阶段
minAmount:'',//投资估算最小值
maxAmount:'',//投资估算最大值
Amount:'',//投资估算
this.$refs.myCascader.$refs.panel.clearCheckedNodes();
this.$refs.myCascader.$refs.panel.activePath = [];
});
this.searchParam = {
isPrivate: 1,
projectName: '',//项目名称
ownerCompany: '',//业主单位
projectType: '',//项目类型
projectStage: '',//项目阶段
minAmount: '',//投资估算最小值
maxAmount: '',//投资估算最大值
Amount: '',//投资估算
provinceId: [],
cityId: [],
districtId: [],
pageNum:1,
pageSize:20,
status:null
}
this.getList(1)
pageNum: 1,
pageSize: 20,
status: null
};
this.getList(1);
},
//地区
async prvinceTree() {
......@@ -402,44 +406,44 @@ export default {
// })
// console.log(prvinceTree)
this.addressList = prvinceTree;
this.getadd(this.addressList)
this.getadd(this.addressList);
},
//处理项目地区
getadd(row) {
this.addrcallback(row,this.getadd)
this.addrcallback(row, this.getadd);
},
addrcallback(row,callback){
if(row){
addrcallback(row, callback) {
if (row) {
row.forEach(item => {
item.value = item.id
callback && callback(item.children)
})
item.value = item.id;
callback && callback(item.children);
});
}
},
//新建项目
showNew(){
this.isshow = true
showNew() {
this.isshow = true;
},
addNew(isshow){
this.isshow = isshow
addNew(isshow) {
this.isshow = isshow;
},
add(){
this.isshow = false
this.getList(1)
add() {
this.isshow = false;
this.getList(1);
},
toDetail(id,tag){
this.$router.push({ path: '/project/projectList/detail', query: {id:id,tag:tag} });
toDetail(id, tag) {
this.$router.push({ path: '/project/projectList/detail', query: { id: id, tag: tag } });
},
toEnterprise(item){
if(item.ownerCompanyUipId){
this.$router.push({ path: '/enterprise/'+this.encodeStr(item.ownerCompanyCid)});
}else if(item.ownerCompanyCid){
this.$router.push({ path: '/company/'+this.encodeStr(item.ownerCompanyCid)});
toEnterprise(item) {
if (item.ownerCompanyUipId) {
this.$router.push({ path: '/enterprise/' + this.encodeStr(item.ownerCompanyCid) });
} else if (item.ownerCompanyCid) {
this.$router.push({ path: '/company/' + this.encodeStr(item.ownerCompanyCid) });
}
},
handleClick(){
this.reset()
handleClick() {
this.reset();
},
handleChange(value) {
// console.log(value);
......@@ -508,71 +512,74 @@ export default {
//翻页
handleCurrentChange(val) {
this.getList(val)
this.getList(val);
},
}
}
</script>
<style lang="scss" scoped>
.btn_primary{
.btn_primary {
margin-top: 16px;
}
.jabph_popper_box{
}
.jabph_popper_box {
left: 110px;
}
.noborder{
}
.noborder {
position: relative;
}
.btns{
}
.btns {
position: absolute;
top: -6px;
right: 12px;
z-index: 2;
.img.img1{
background: url('../../../../src/assets/images/add.png')no-repeat center center;
.img.img1 {
background: url("../../../../src/assets/images/add.png") no-repeat center
center;
background-size: 100%;
}
.btn_default:hover{
.img1{
background: url('../../../../src/assets/images/add_1.png')no-repeat center center;
.btn_default:hover {
.img1 {
background: url("../../../../src/assets/images/add_1.png") no-repeat
center center;
background-size: 100%;
}
}
.img.img2{
background: url('../../../../src/assets/images/import.png')no-repeat center center;
.img.img2 {
background: url("../../../../src/assets/images/import.png") no-repeat center
center;
background-size: 100%;
}
}
.scbtns{
border-top: 1px solid #EFEFEF;
}
.scbtns {
border-top: 1px solid #efefef;
padding: 24px 0 8px;
.btn{
.btn {
margin: 0 16px 0 0;
}
}
.sellist{
}
.sellist {
width: 100%;
padding: 10px 0;
.selli{
.selli {
width: 100%;
height: 34px;
line-height: 34px;
font-size: 14px;
color: #232323;
>span{
> span {
float: left;
margin-right: 28px;
opacity: 0.8;
}
}
}
.titles{
}
.titles {
color: #232323;
font-size: 16px;
font-weight: bold;
height: 60px;
line-height: 64px;
border-bottom: 1px solid #EFEFEF;
border-bottom: 1px solid #efefef;
padding-left: 2px;
padding-right: 24px;
/*&::after{
......@@ -584,133 +591,133 @@ export default {
margin-left: -10px;
margin-top: 24px;
}*/
.dc{
.dc {
width: 100%;
float: right;
font-size: 12px;
color: #3D3D3D;
color: #3d3d3d;
font-weight: 400;
position: relative;
&::after{
content: ' ';
&::after {
content: " ";
width: 2px;
height: 2px;
background: rgba(35,35,35,0.4);
background: rgba(35, 35, 35, 0.4);
border-radius: 50%;
position: absolute;
top: 30px;
left: 14px;
}
>div{
> div {
display: inline-block;
margin-left: 20px;
}
.btn-export{
.btn-export {
float: right;
margin-top: 18px;
}
}
}
.datalist{
.datali{
}
.datalist {
.datali {
padding: 16px 16px 0;
position: relative;
.operates{
.operates {
position: absolute;
z-index: 1;
right: 0;
top: 24px;
>div{
> div {
padding-right: 16px;
display: inline-block;
font-size: 12px;
>img{
> img {
float: left;
margin-right: 5px;
width: 16px;
}
}
.i1:hover{
color: #3CB4FF;
.i1:hover {
color: #3cb4ff;
}
.i2:hover{
color: #0CBC6D;
.i2:hover {
color: #0cbc6d;
}
.i3:hover{
color: #FF3C3C;
.i3:hover {
color: #ff3c3c;
}
.tits{
.tits {
padding: 12px 0;
}
}
.delform{
.delform {
right: 16px;
top: -94px;
.btnsmall{
.btnsmall {
margin-top: 0;
}
}
&:hover{
background-color: #F6F9FC;
&:hover {
background-color: #f6f9fc;
cursor: pointer;
}
.det-title{
color: #3D3D3D;
.det-title {
color: #3d3d3d;
font-size: 16px;
font-weight: 700;
line-height: 23px;
padding-right: 190px;
.people{
.people {
padding-left: 10px;
color: #4f4f4f;
font-weight: 400;
font-size: 14px;
i{
i {
width: 20px;
height: 20px;
background: #E3EEF9;
background: #e3eef9;
border-radius: 50%;
font-style: initial;
font-size: 12px;
display: inline-block;
color: #0081FF;
color: #0081ff;
text-align: center;
line-height: 20px;
margin-right: 4px;
}
}
}
.det-tips{
padding: 8px 0 ;
.det-tips {
padding: 8px 0;
}
.det-contets{
.det-contets {
padding: 4px 0 16px;
.det-con{
.det-con {
font-size: 14px;
display: inline-block;
padding-right: 32px;
&:last-child{
&:last-child {
padding-right: 0;
}
span:nth-child(2n-1){
span:nth-child(2n-1) {
color: #a7a7a7;
}
}
}
}
}
}
.popbot{
.wordprimary{
.popbot {
.wordprimary {
padding-right: 26px;
float: left;
margin-top: 6px;
}
.btn_primary{
.btn_primary {
padding: 0;
}
}
.btn{
}
.btn {
padding: 0 12px;
}
}
</style>
......@@ -226,6 +226,10 @@
<span>总投资:</span>
<span v-html="item.money+'万元'"></span>
</p>
<p class="list-content-text"v-if="item.handleTime">
<span>最新审批日期:</span>
<span>{{item.handleTime}}</span>
</p>
<p class="list-content-text"v-if="item.planStartTime">
<span>计划开工日期:</span>
<span>{{item.planStartTime}}</span>
......@@ -598,7 +602,7 @@
}else{
this.page = page;
this.search(page, this.limit);
this.jump1();
window.scrollTo(0, 400);
}
},
fieldCommand(command) {
......
......@@ -151,7 +151,7 @@
<el-table-column type="selection" width="50" align="center" />
<el-table-column label="用户编号" align="center" :key='mathkey+1' prop="userId" v-if="columns[0].visible" />
<!--<el-table-column label="用户名称" align="center" key="userName" prop="userName" v-if="columns[1].visible" :show-overflow-tooltip="true" />-->
<el-table-column label="用户称" align="center" :key='mathkey+2' prop="nickName" v-if="columns[2].visible" :show-overflow-tooltip="true" />
<el-table-column label="用户称" align="center" :key='mathkey+2' prop="nickName" v-if="columns[2].visible" :show-overflow-tooltip="true" />
<el-table-column label="组织" align="center" :key='mathkey+3' prop="dept.deptName" v-if="columns[3].visible" :show-overflow-tooltip="true" />
<el-table-column label="手机号码" align="center" :key='mathkey+4' prop="phonenumber" v-if="columns[4].visible" width="120" />
<el-table-column label="状态" align="center" :key='mathkey+5' v-if="columns[5].visible">
......@@ -345,9 +345,6 @@
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
<div class="el-upload__tip text-center" slot="tip">
<!--<div class="el-upload__tip" slot="tip">-->
<!--<el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的用户数据-->
<!--</div>-->
<span>仅允许导入xls、xlsx格式文件。</span>
<el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">下载模板</el-link>
</div>
......
package com.dsk.system.service.impl;
import cn.dev33.satoken.secure.BCrypt;
import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.session.TokenSign;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dsk.common.constant.CacheNames;
......@@ -15,9 +20,11 @@ import com.dsk.common.core.domain.PageQuery;
import com.dsk.common.core.domain.entity.SysDictData;
import com.dsk.common.core.domain.entity.SysDictType;
import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.enums.UserStatus;
import com.dsk.common.exception.ServiceException;
import com.dsk.common.utils.PasswordUtils;
import com.dsk.common.utils.StringUtils;
import com.dsk.common.utils.redis.RedisUtils;
import com.dsk.system.domain.*;
import com.dsk.system.domain.bo.SysTenantBo;
import com.dsk.system.domain.vo.SysTenantVo;
......@@ -201,7 +208,7 @@ public class ISysTenantServiceImpl implements ISysTenantService {
String password = PasswordUtils.generatePwd(8);
user.setPassword(BCrypt.hashpw(password));
user.setDeptId(deptId);
user.setCreateTime(new Date());
user.setCreateTime(new DateTime());
userMapper.insert(user);
//新增系统用户后,默认当前用户为部门的负责人
SysDept sd = new SysDept();
......@@ -394,6 +401,24 @@ public class ISysTenantServiceImpl implements ISysTenantService {
roleMenuMapper.delete(
new LambdaQueryWrapper<SysRoleMenu>().in(SysRoleMenu::getRoleId, roleIds).notIn(!menuIds.isEmpty(), SysRoleMenu::getMenuId, menuIds));
}
try {
//清除企业用户登录信息
List<SysUser> tenantUsers = userMapper.selectList(Wrappers.<SysUser>lambdaQuery()
.eq(SysUser::getTenantId, tenantId).eq(SysUser::getStatus, UserStatus.OK.getCode()));
if (!CollectionUtils.isEmpty(tenantUsers)) {
for (SysUser tenantUser : tenantUsers) {
String key = "global:Authorization:login:session:00:" + tenantUser.getUserId();
if (RedisUtils.hasKey(key)) {
SaSession session = RedisUtils.getCacheObject(key);
List<TokenSign> tokenSignList = session.getTokenSignList();
tokenSignList.forEach(sign -> StpUtil.kickoutByTokenValue(sign.getValue()));
}
}
}
} catch (Exception e) {
log.error("清除企业用户登录信息操作失败!error={}", e.getMessage());
}
return true;
}
......
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