Commit 4705ded7 authored by 远方不远's avatar 远方不远
parents da51b9eb a5ae1bfd
......@@ -46,7 +46,7 @@ public class BusinessBacklogController extends BaseController
*/
// @PreAuthorize("@ss.hasPermi('system:backlog:list')")
@GetMapping("/list")
public TableDataInfo list(@RequestBody BusinessBacklog businessBacklog)
public TableDataInfo list(@RequestBody(required=false) BusinessBacklog businessBacklog)
{
startPage();
List<BusinessBacklog> list = businessBacklogService.selectBusinessBacklogList(businessBacklog);
......
......@@ -40,7 +40,7 @@ public class BusinessContactsController extends BaseController
*/
// @PreAuthorize("@ss.hasPermi('system:contacts:list')")
@GetMapping("/list")
public TableDataInfo list(@RequestBody BusinessContacts businessContacts)
public TableDataInfo list(@RequestBody(required=false) BusinessContacts businessContacts)
{
startPage();
List<BusinessContacts> list = businessContactsService.selectBusinessContactsList(businessContacts);
......
......@@ -17,6 +17,10 @@ import com.dsk.common.core.controller.BaseController;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.enums.BusinessType;
import com.dsk.common.core.page.TableDataInfo;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 项目详情Controller
......@@ -31,11 +35,18 @@ public class BusinessInfoController extends BaseController
@Autowired
private IBusinessInfoService businessInfoService;
/**
* 项目批量导入
*/
@PostMapping("/upload")
// public AjaxResult batchUpload(@RequestPart("file") MultipartFile file, HttpServletRequest request, HttpServletResponse response){
public AjaxResult batchUpload(@RequestPart("file") MultipartFile file){
return businessInfoService.batchUpload(file);
}
/**
* 查询所有项目名称(支持模糊查询)
*/
// @PreAuthorize("@ss.hasPermi('system:info:list')")
@PostMapping("/query/project")
public AjaxResult queryprojectName(@RequestBody BusinessListDto dto){
return AjaxResult.success(businessInfoService.selectProjectName(dto));
......@@ -44,9 +55,9 @@ public class BusinessInfoController extends BaseController
/**
* 查询项目列表
*/
// @PreAuthorize("@ss.hasPermi('system:info:list')")
// @PreAuthorize("@ss.hasPermi('system:business:list')")
@GetMapping("/list")
public TableDataInfo list(@RequestBody BusinessListDto dto)
public TableDataInfo list(@RequestBody(required=false) BusinessListDto dto)
{
startPage();
List<BusinessListVo> list = businessInfoService.selectBusinessInfoList(dto);
......@@ -56,7 +67,7 @@ public class BusinessInfoController extends BaseController
/**
* 查询项目速览
*/
// @PreAuthorize("@ss.hasPermi('system:info:list')")
// @PreAuthorize("@ss.hasPermi('system:business:query')")
@GetMapping("/browse/{businessId}")
public AjaxResult browse(@PathVariable Integer id)
{
......@@ -66,7 +77,7 @@ public class BusinessInfoController extends BaseController
/**
* 获取项目建设内容
*/
// @PreAuthorize("@ss.hasPermi('system:info:query')")
// @PreAuthorize("@ss.hasPermi('system:business:query')")
@GetMapping(value = "/construction/{id}")
public AjaxResult getConstruction(@PathVariable("id") Integer id)
{
......@@ -76,8 +87,8 @@ public class BusinessInfoController extends BaseController
/**
* 删除项目列表
*/
// @PreAuthorize("@ss.hasPermi('system:info:remove')")
// @Log(title = "项目详情", businessType = BusinessType.DELETE)
// @PreAuthorize("@ss.hasPermi('system:business:remove')")
@Log(title = "项目管理", businessType = BusinessType.DELETE)
@DeleteMapping("/remove/{ids}")
public AjaxResult remove(@PathVariable(value = "ids",required=false) Long[] ids)
{
......@@ -87,8 +98,8 @@ public class BusinessInfoController extends BaseController
/**
* 新增项目详情
*/
// @PreAuthorize("@ss.hasPermi('system:info:add')")
// @Log(title = "项目详情", businessType = BusinessType.INSERT)
// @PreAuthorize("@ss.hasPermi('system:business:add')")
@Log(title = "项目管理", businessType = BusinessType.INSERT)
@PostMapping("/add")
public AjaxResult add(@RequestBody BusinessAddDto dto)
{
......@@ -98,8 +109,8 @@ public class BusinessInfoController extends BaseController
/**
* 修改项目详情
*/
// @PreAuthorize("@ss.hasPermi('system:info:edit')")
// @Log(title = "项目详情", businessType = BusinessType.UPDATE)
// @PreAuthorize("@ss.hasPermi('system:business:edit')")
@Log(title = "项目管理", businessType = BusinessType.UPDATE)
@PostMapping("/edit")
public AjaxResult edit(@RequestBody BusinessInfo businessInfo)
{
......
......@@ -49,7 +49,7 @@ public class BusinessRelateCompanyController extends BaseController
*/
// @PreAuthorize("@ss.hasPermi('system:company:list')")
@GetMapping("/list")
public TableDataInfo list(BusinessRelateCompany businessRelateCompany)
public TableDataInfo list(@RequestBody(required=false) BusinessRelateCompany businessRelateCompany)
{
startPage();
List<BusinessRelateCompany> list = businessRelateCompanyService.selectBusinessRelateCompanyList(businessRelateCompany);
......
package com.dsk.web.controller.customer;
import cn.hutool.core.bean.BeanException;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.http.HttpException;
......@@ -15,6 +16,7 @@ import com.dsk.system.domain.customer.dto.CustomerBusinessSearchDto;
import com.dsk.system.domain.customer.dto.CustomerSearchDto;
import com.dsk.system.service.ICustomerService;
import com.dsk.web.controller.search.service.BusinessOpportunityRadarService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.util.ObjectUtils;
......@@ -66,6 +68,17 @@ public class CustomerController extends BaseController {
@PostMapping()
@RepeatSubmit
public AjaxResult add(@RequestBody Customer customer) {
if (ObjectUtils.isEmpty(customer.getCompanyName())) throw new BeanException("企业名称不能为空");
if (ObjectUtils.isEmpty(customer.getCompanyId())) {
try {
Map<String, Object> map = opportunityRadarService.enterpriseByName(customer.getCompanyName());
if (!ObjectUtils.isEmpty(map.get("data"))) {
customer.setCompanyId(MapUtil.getInt(BeanUtil.beanToMap(map.get("data")), "jskEid"));
}
} catch (Exception e) {
logger.debug("获取企业id错误!error:{}", e.getMessage());
}
}
return AjaxResult.success(baseService.add(customer));
}
......
......@@ -105,4 +105,16 @@ public class EnterpriseController {
return enterpriseService.financial(vo);
}
@ApiOperation(value = "城投平台企业查询(openApi)")
@PostMapping(value = "uipSerach")
public TableDataInfo uipSerach(@RequestBody @Valid EnterpriseUipSearchBody vo) throws Exception {
return enterpriseService.uipSerach(vo);
}
@ApiOperation(value = "城投平台企业查询选项(openApi)")
@PostMapping(value = "uipGroupData")
public R financial() throws Exception {
return enterpriseService.uipGroupData();
}
}
......@@ -2,6 +2,7 @@ package com.dsk.web.controller.search.macroMarket;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.dtos.OpRegionalEconomicDataV1Dto;
import com.dsk.common.dtos.OpRegionalEconomicDataV1PageDto;
import com.dsk.system.service.EconomicService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
......@@ -29,7 +30,7 @@ public class RegionalEconomicDataController {
*@date: 2023/5/18 10:29
*/
@PostMapping("/national/nationalPage")
public AjaxResult nationalPage(@RequestBody OpRegionalEconomicDataV1Dto dto) {
public AjaxResult nationalPage(@RequestBody OpRegionalEconomicDataV1PageDto dto) {
return economicService.nationalPage(dto);
}
......
......@@ -118,6 +118,78 @@ public class BusinessInfo extends BaseEntity
@Excel(name = "项目状态")
private Integer status;
/** 评标办法 */
@Excel(name = "评标办法")
private String evaluationBidWay;
/** 开标时间 */
@Excel(name = "开标时间")
private String bidOpenTime;
/** 开标地点 */
@Excel(name = "开标地点")
private String bidOpenPlace;
/** 保证金缴纳 */
@Excel(name = "保证金缴纳")
private String earnestMoneyPay;
/** 保证金金额 */
@Excel(name = "保证金金额")
private String earnestMoney;
/** 评标委员会 */
@Excel(name = "评标委员会")
private String evaluationBidCouncil;
public String getEvaluationBidWay() {
return evaluationBidWay;
}
public void setEvaluationBidWay(String evaluationBidWay) {
this.evaluationBidWay = evaluationBidWay;
}
public String getBidOpenTime() {
return bidOpenTime;
}
public void setBidOpenTime(String bidOpenTime) {
this.bidOpenTime = bidOpenTime;
}
public String getBidOpenPlace() {
return bidOpenPlace;
}
public void setBidOpenPlace(String bidOpenPlace) {
this.bidOpenPlace = bidOpenPlace;
}
public String getEarnestMoneyPay() {
return earnestMoneyPay;
}
public void setEarnestMoneyPay(String earnestMoneyPay) {
this.earnestMoneyPay = earnestMoneyPay;
}
public String getEarnestMoney() {
return earnestMoney;
}
public void setEarnestMoney(String earnestMoney) {
this.earnestMoney = earnestMoney;
}
public String getEvaluationBidCouncil() {
return evaluationBidCouncil;
}
public void setEvaluationBidCouncil(String evaluationBidCouncil) {
this.evaluationBidCouncil = evaluationBidCouncil;
}
public Integer getStatus() {
return status;
}
......@@ -359,7 +431,12 @@ public class BusinessInfo extends BaseEntity
.append("createTime", getCreateTime())
.append("updateTime", getUpdateTime())
.append("customerId", getCustomerId())
.append("status", getStatus())
.append("evaluationBidWay", getEvaluationBidWay())
.append("bidOpenTime", getBidOpenTime())
.append("bidOpenPlace", getBidOpenPlace())
.append("earnestMoneyPay", getEarnestMoneyPay())
.append("earnestMoney", getEarnestMoney())
.append("evaluationBidCouncil", getEvaluationBidCouncil())
.toString();
}
}
package com.dsk.common.core.domain.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
@ToString
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class EnterpriseUipSearchBody extends BasePage {
/**
* 查询关键字
*/
private String keys;
/*
* 1金额倒序,2金额正序,3时间倒序,4时间正序
*/
@NotNull(message = "排序条件不能为空")
private Integer sort;
/**
* 省份
*/
private List<Integer> provinceIds;
/**
* 市份
*/
private List<Integer> cityIds;
/**
* 县
*/
private List<Integer> areaIds;
/**
* 城投业务类型
*/
private List<String> uipBusinessType;
/**
* 主体信用等级
*/
private List<String> bratingSubjectLevel;
/**
* 股东背景
*/
private List<String> shareholderBg;
/**
* 股权关系
*/
private List<String> equityRelationship;
}
package com.dsk.common.dtos;
import com.dsk.common.core.domain.model.BasePage;
import lombok.Data;
/**
......@@ -11,27 +10,40 @@ import lombok.Data;
* @Version
*/
@Data
public class OpRegionalEconomicDataV1Dto extends BasePage {
public class OpRegionalEconomicDataV1Dto {
/**
* id
*/
private Integer id;
/**
* 年份
*/
private Integer year;
/**
* 省
* 省Id
*/
private String provinceId;
private Integer provinceId;
/**
* 市
* 市Id
*/
private String cityId;
private Integer cityId;
/**
* 区Id
*/
private Integer areaId;
/**
*
* 城市类型 1:直辖市
*/
private String areaId;
private Integer cityType;
/**
* 全国宏观经济:1 / 辖区经济:2 / 地区对比:3
* 城市类型 1:直辖市
*/
private Integer type;
private Integer provinceType;
}
package com.dsk.common.dtos;
import com.dsk.common.core.domain.model.BasePage;
import lombok.Data;
import java.util.List;
/**
* @ClassName OpRegionalEconomicDataV1PageDto
* @Description 专项债-项目类别统计
* @Author Dgm
* @Date 2023/5/23 14:05
* @Version
*/
@Data
public class OpRegionalEconomicDataV1PageDto extends BasePage {
/**
* 年份
*/
private Integer year;
/**
* 省
*/
private List<String> provinceIds;
/**
* 市
*/
private List<String> cityIds;
/**
* 区
*/
private List<String> areaIds;
/**
* 全国宏观经济:1 / 辖区经济:2 / 地区对比:3
*/
private Integer type;
/**
* 排序字段 默认gdp
*/
private String field = "gdp";
/**
* 排序 (降序desc 升序asc)
*/
private String order = "desc";
}
......@@ -48,6 +48,7 @@
"highlight.js": "9.18.5",
"js-beautify": "1.13.0",
"js-cookie": "3.0.1",
"js-md5": "^0.7.3",
"jsencrypt": "3.0.0-rc.1",
"nprogress": "0.2.0",
"quill": "1.3.7",
......
......@@ -8,3 +8,29 @@ export function getList(data) {
params:data
})
}
// 客户详情
export function customerInfo(data) {
return request({
url: '/customer/'+data,
method: 'get'
})
}
// 编辑客户
export function customerUpdate(data) {
return request({
url: '/customer/',
method: 'put',
data: data
})
}
// 模糊查询项目名称
export function queryProject(data) {
return request({
url: '/business/info/query/project',
method: 'post',
data
})
}
import request from "@/utils/request";
// 获取查询下拉选项
export function getOption() {
return request({
url: '/getInfo',
method: 'get'
})
}
// 获取列表数据
export function getList(data) {
return request({
url: '/getInfo',
method: 'get'
})
}
......@@ -8,7 +8,6 @@ export function penalizePage(data) {
data:data
})
}
// 行政处罚类型
export function penalizeReasonType(data) {
return request({
......@@ -17,3 +16,22 @@ export function penalizeReasonType(data) {
data:data
})
}
// 经营异常列表
export function abnormalPage(data) {
return request({
url: '/enterpriseCredit/abnormalPage',
method: 'post',
data:data
})
}
// 经营异常年份
export function abnormalYears(data) {
return request({
url: '/enterpriseCredit/abnormalYears',
method: 'post',
data:data
})
}
import request from '@/utils/request'
// 土地交易用途
export function landUse(data) {
return request({
url: '/enterpriseProject/landUse',
method: 'post',
data
})
}
// 土地交易列表
export function landTransactionPage(data) {
return request({
url: '/enterpriseProject/landTransactionPage',
method: 'post',
data
})
}
// 区域经济
export function regionalEconomy(data) {
return request({
url: '/economic/regional/list',
method: 'post',
data
})
}
// 同地区城投
export function urbanInvestmentPage(data) {
return request({
url: '/urbanInvestment/page',
method: 'post',
data
})
}
......@@ -15,4 +15,59 @@ export function getProjectlist(param) {
params: param
})
}
//删除项目
export function delProject(param) {
return request({
url: '/business/info/remove/'+param,
method: 'DELETE',
})
}
//建设内容
export function getJSNR(param) {
return request({
url: '/business/info/construction/'+param,
method: 'GET',
})
}
//项目速览
export function getXMSL(param) {
return request({
url: '/business/info/browse/'+param,
method: 'GET',
})
}
//项目速览修改
export function editXMSL(param) {
return request({
url: '/business/info/edit',
method: 'POST',
data:param
})
}
//查询项目联系人
export function getLXR(param) {
return request({
url: '/business/contacts/list',
method: 'GET',
params:param
})
}
//修改项目联系人
export function editLXR(param) {
return request({
url: '/business/contacts/edit',
method: 'POST',
data:param
})
}
//新增项目联系人
export function addLXR(param) {
return request({
url: '/business/contacts/add',
method: 'POST',
data:param
})
}
......@@ -124,6 +124,7 @@
border-radius: 2px;
line-height: 28px;
cursor: pointer;
position: relative;
>span{
padding-left: 8px;
}
......@@ -131,6 +132,15 @@
color: rgba(35,35,32,0.4);
margin-left: 4px;
}
.timeinput{
opacity: 0;
position: absolute;
.el-input__inner{
padding: 0;
margin: 0;
border: 0;
}
}
}
}
}
......@@ -570,7 +580,7 @@
.el-input__prefix{
left: 8px;
top: -2px;
top: 3px;
}
.el-input__suffix{
height: 32px;
......@@ -988,7 +998,7 @@
background: rgba(0, 129, 255, 0.16);
font-size: 12px;
line-height: 22px;
top: 149px;
top: 148px;
right: 61px;
cursor: pointer;
.img{
......@@ -1067,3 +1077,5 @@
white-space: nowrap;
padding-right: 10px;
}
.none{display: none}
......@@ -106,6 +106,12 @@ export const constantRoutes = [
component: () => import('@/views/detail/party-b/index'),
name: 'PartyB',
meta: { title: '已方详情' }
},
{
path: 'structure',
component: () => import('@/views/detail/structure/index'),
name: 'Structure',
meta: { title: '企业链图' }
}
]
},
......@@ -119,7 +125,7 @@ export const constantRoutes = [
path: '/macro/financing/details/:id(\\d+)',
component: () => import('@/views/macro/financing/details'),
name: 'financingDetails',
meta: { title: '区域专项债详情', icon: 'user' }
meta: { title: '区域专项债详情'}
}
]
},
......
......@@ -10,7 +10,7 @@
<div class="empty" v-if="tableData.total==0 && isNew == true">
<img src="@/assets/images/project/empty.png">
<div class="p1">添加你的第一位客户吧</div>
<div class="p2">抱歉,你还未添加客户,快去添加吧</div>
<div class="p2">抱歉你还未添加客户,快去添加吧</div>
<div class="btn btn_primary h36 w88" @click="opennew">添加客户</div>
<div class="btn btn_primary btn_shallow h36 w88" @click="pldrs">批量导入</div>
</div>
......@@ -227,56 +227,7 @@
</el-dialog>
</el-card>
</div>
<div class="uploadwin" v-if="pldr">
<div class="upload" v-if="addfile==false">
<div class="up_title">批量导入客户</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">导入已存在的客户将自动跳过</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">取消</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">成功导入客户信息</div>
<div class="btns">
<div class="btn btn_primary h32" @click="handleCurrentChange(1)">查看</div>
</div>
</div>
</div>
</div>
<batchimport v-if="pldr" :importtype="types" @cancels="importCancel" @getdatas="handleCurrentChange(1)"></batchimport>
</div>
</template>
......@@ -286,12 +237,15 @@
import {getCustomerList,importData,addCustomer} from '@/api/custom/custom'
import {getEnterprise,getDictType,} from '@/api/main'
import prvinceTree from '@/assets/json/provinceTree'
import batchimport from '../../project/projectList/component/batchImport'
import axios from 'axios'
export default {
name: 'CustomList',
components:{batchimport},
data() {
return{
pldr: false,
types:'custom',
searchParam:{
companyName:'',
pageNum:1,
......@@ -304,9 +258,6 @@ export default {
tipslit:[],//项目标签
tipsvalue:"",//标签填写内容
tableData: [],//列表
isUpload:false,//有上传的文件
addfile:false,//已上传文件
addsuccess:false,//已成功加入数据
companData:[],//联想企业列表
customerLevel:[],//客户等级
......@@ -352,9 +303,9 @@ export default {
},
pldrs(){
this.pldr = true
this.addfile = false
this.isUpload = false
this.addsuccess = false
},
importCancel(){
this.pldr = false
},
//获取客户列表
getCustomerList(){
......@@ -372,6 +323,7 @@ export default {
},
//翻页
handleCurrentChange(val) {
this.pldr=false
this.isNew = false
this.searchParam.pageNum=val
this.getCustomerList()
......@@ -472,35 +424,6 @@ export default {
this.dialogVisible = false
this.showlist = false
},
// 批量导入
importConfirmClick() {
if (this.fileList.length > 0) {
this.$refs["upload"].submit();
this.getCustomerList();
this.addfile = true
} else {
this.$message("请先选择文件");
}
},
downloadClick() {
let a = document.createElement("a");
a.setAttribute("href", "/file/Template.xlsx");
a.setAttribute("download", "批量导入模版.xlsx");
document.body.appendChild(a);
a.click();
},
handleFileListChange(file, fileList) {
if (fileList.length > 0) {
this.fileList = [fileList[fileList.length - 1]];
this.isUpload = true
}
},
onSuccess(res, file, fileList) {
if(res.code == 200 )
this.addsuccess = true
else
this.$message.error({message:res.msg,showClose:true})
},
//地区
async prvinceTree() {
......@@ -617,5 +540,4 @@ export default {
padding-right: 26px;
}
}
.none{display: none}
</style>
......@@ -33,9 +33,9 @@
</el-date-picker>
</template>
<!-- 输入框 -->
<template v-if="form.type==3">
<template v-if="form.type==3">
<div class="cooperate-name">
<el-input v-model="form.value" placeholder="请输入关键词"></el-input>
<el-input v-model="form.value" :placeholder="form.placeholder"></el-input>
<span @click="changeSelect">搜索</span>
</div>
</template>
......
<template>
<div id="detailPart" class="detail-container" :style="sideHeight?'height:'+sideHeight+'px':''">
<div id="detailPart" class="sides-container" :style="sideHeight?'height:'+sideHeight+'px':''">
<el-input
placeholder="搜索"
class="side-input"
......@@ -15,9 +15,9 @@
<template slot="title">
<span>{{item.title}}</span>
</template>
<el-menu-item :index="index+'-'+idx" v-for="(it, idx) in item.children" :key="idx" @click="handleItem(it)">{{it.title}}</el-menu-item>
<el-menu-item :index="index+'-'+idx" v-for="(it, idx) in item.children" :key="idx" @click="handleItem(it)" :disabled="it.disabled">{{it.title}}</el-menu-item>
</el-submenu>
<el-menu-item :index="index.toString()" @click="handleItem(item)" v-else>{{item.title}}</el-menu-item>
<el-menu-item :index="index.toString()" @click="handleItem(item)" :disabled="item.disabled" v-else>{{item.title}}</el-menu-item>
</template>
</el-menu>
</div>
......@@ -50,13 +50,13 @@ export default {
]},
{title: '财务简析', pathName: 'financial'},
{title: '项目商机', pathName: '', children: [
{title: '土地交易', pathName: ''},
{title: '拟建项目', pathName: ''},
{title: '专项债项目', pathName: ''},
{title: '招标计划', pathName: ''},
{title: '招标公告', pathName: ''},
{title: '标讯Pro', pathName: ''},
{title: '行政许可', pathName: ''}
{title: '土地交易', pathName: 'landtransaction'},
{title: '拟建项目', pathName: 'proposed'},
{title: '专项债项目', pathName: 'bond'},
{title: '招标计划', pathName: 'biddingplan'},
{title: '招标公告', pathName: 'announcement'},
{title: '标讯Pro', pathName: 'tencent'},
{title: '行政许可', pathName: 'administrative'}
]},
{title: '业务往来', pathName: '', children: [
{title: '客户', pathName: ''},
......@@ -80,7 +80,7 @@ export default {
{title: '开庭公告', pathName: 'openacourtsessionNotice'},
{title: '信用中国', pathName: ''}
]},
{title: '商务信息', pathName: 'business'},
// {title: '商务信息', pathName: 'business'},
{title: '招标偏好', pathName: 'preference'},
{title: '合作情况', pathName: 'cooperate'},
{title: '决策链条', pathName: 'decisionMaking'},
......@@ -134,7 +134,7 @@ export default {
<style lang="scss" scoped>
#app{
.detail-container{
.sides-container{
width: 144px;
min-height: calc(100vh - 170px);
padding-bottom: 20px;
......
......@@ -21,31 +21,29 @@
</el-table-column>
<template v-for="item in forData">
<el-table-column
v-if="item.slot"
:label="item.label"
:prop="item.prop"
:width="item.width"
:min-width="item.minWidth"
align="left"
:fixed="item.fixed"
:sortable="item.sortable"
:resizable="false">
<template v-if="item.slotHeader" slot="header">
<slot :name="item.slotName"></slot>
</template>
<template slot-scope="scope">
<slot :name="item.prop" :row="item" :index="scope.$index" :data="scope.row.punishReason"></slot>
<slot v-if="item.slot" :name="item.prop" :row="scope.row" :index="scope.$index" :data="item"></slot>
<span v-else>
{{ scope.row[item.prop] }}
</span>
</template>
</el-table-column>
<el-table-column
v-else
:label="item.label"
:prop="item.prop"
:width="item.width"
align="left"
:fixed="item.fixed"
:sortable="item.sortable"
:resizable="false" />
</template>
</el-table>
</div>
<div class="pagination-box">
<div class="pagination-box" v-if="paging">
<el-pagination background :current-page="queryParams.pageNum" :page-size="queryParams.pageSize" :total="tableDataTotal" layout="prev, pager, next, jumper" @current-change="handleCurrentChange" @size-change="handleSizeChange" />
</div>
</div>
......@@ -83,6 +81,10 @@ export default {
type: Object,
default: {}
},
paging: {
type: Boolean,
default: true
},
},
data() {
return {
......@@ -104,5 +106,7 @@ export default {
</script>
<style lang="scss" scoped>
::v-deep .el-table__body tr.current-row > td.el-table__cell{
background-color: #ffffff;
}
</style>
<!-- 表格组件 -->
<template>
<div class="infoTable-container">
<el-form v-if="Object.keys(obj).length > 0" class="infoTable-form" label-position="left">
<template v-for="(item, index) in list">
<el-form-item :style="item.span?{width: `${100/(24/item.span)}%`}:{}" :label="item.name" :label-width="labelWidth?labelWidth+'px':'130px'" :key="index" :class="[
{ 'infoTable-form-view': item.style },
{ 'infoTable-form-item': !item.style },
{ 'infoTable-form-row': item.rowstyle }
]">
<div>
<template v-if="item.slot === true">
<slot :name="item.prop" :data="obj"></slot>
</template>
<span v-else> {{ obj[item.prop] ?obj[item.prop] !==""?item.formatter?item.formatter(obj[item.prop]):obj[item.prop]:'--' :'--' }}</span>
</div>
</el-form-item>
</template>
</el-form>
<div v-else class="no-data">
<div class="no-data-box" v-if="show">
<img :src="noData" alt="暂时没有找到相关数据" />
<span>暂时没有找到相关数据</span>
</div>
</div>
</div>
</template>
<script>
export default {
name: "InfoTable",
components: {
},
props: {
list: {
type: Array,
default: () => [],
},
obj: {
type: Object,
default: () => { }
},
labelWidth: {
type: Number,
default: null
}
},
data() {
return {
show:false,
// 当前移入单元格内容
noData: require("@/assets/images/detail/noData.png")
};
},
created() {
},
mounted(){
this.show = true;
},
methods: {
},
};
</script>
<style lang="scss" scoped>
.infoTable-container {
.infoTable-form {
display: flex;
flex-wrap: wrap;
border-left: 1px solid #e5e9f5;
border-top: 1px solid #e5e9f5;
border-collapse: collapse;
.infoTable-form-item {
width: 50%;
flex: auto;
margin-bottom: 0px;
border-right: 1px solid #e5e9f5;
border-bottom: 1px solid #e5e9f5;
font-family: Microsoft YaHei-Regular, Microsoft YaHei;
font-size: 12px;
}
.infoTable-form-view {
width: 100%;
flex: auto;
margin-bottom: 0px;
border-right: 1px solid #e5e9f5;
border-bottom: 1px solid #e5e9f5;
font-family: Microsoft YaHei-Regular, Microsoft YaHei;
font-size: 12px;
}
.infoTable-form-row {
width: 33%;
flex: auto;
margin-bottom: 0px;
border-right: 1px solid #e5e9f5;
border-bottom: 1px solid #e5e9f5;
font-family: Microsoft YaHei-Regular, Microsoft YaHei;
font-size: 12px;
}
::v-deep .el-form-item__label {
height: 100%;
background-color: #F0F3FA;
padding: 8px 12px 8px 12px;
font-size: 12px;
font-weight: normal;
color: rgba(35,35,35,0.8);
display: flex;
align-items: center;
line-height: normal;
}
::v-deep .el-form-item__content {
padding-left: 12px;
font-size: 12px;
color: #232323;
}
::v-deep .el-form-item__content {
border-left: 1px solid #e5e9f5;
height: 100%;
display: flex;
align-items: center;
}
::v-deep .el-col {
border-bottom: 1px solid #e5e9f5;
}
}
.no-data {
font-size: 14px;
font-family: Microsoft YaHei-Regular, Microsoft YaHei;
font-weight: 400;
color: #999999;
text-shadow: 0px 0px 10px rgba(0, 37, 106, 0.10000000149011612);
max-width: 1200px;
height: 328px;
display: flex;
justify-content: center;
align-items: center;
background: #ffffff;
border-radius: 0px 0px 0px 0px;
opacity: 1;
border: 1px solid #eeeeee;
.no-data-box {
display: flex;
flex-direction: column;
align-items: center;
img {
width: 64px;
height: 79px;
margin-bottom: 16px;
}
}
}
::v-deep .el-form-item__content {
line-height: 22px;
padding: 6px 4px;
}
}
</style>
......@@ -24,7 +24,14 @@
:tableDataTotal="tableDataTotal"
:queryParams="queryParams"
@handle-current-change="handleCurrentChange"
/>
>
<template slot="projcetName" slot-scope="scope">
{{scope}}
<!-- <router-link :to="'' + scope.row.dictId" class="link-type">-->
<!-- <span>{{ scope.row.dictType }}</span>-->
<!-- </router-link>-->
</template>
</tables>
</template>
<template v-else>
......@@ -36,10 +43,10 @@
</div>
</template>
<!-- 弹窗添加合作情况 -->
<!-- 弹窗关联项目 -->
<el-drawer
title="添加合作情况"
size="53%"
size="40%"
:visible.sync="drawer"
:direction="direction"
:with-header="false"
......@@ -48,81 +55,62 @@
<div class="addhzqk_top">
<div class="addhzqk_top_t">
<div class="top_t_h1">
<img src="@/assets/images/economies/icon.png" />重庆轨道交通(集团)有限公司
<img src="@/assets/images/economies/icon.png" />{{ info.companyName }}
</div>
<div class="top_t_close"><i class="el-icon-close" @click="handleClose"></i></div>
</div>
<div class="addhzqk_top_d">
<div class="top_d_item">
法定代表人:<span>王志</span>
法定代表人:<span>{{ info.legalPerson }}</span>
</div>
<div class="top_d_item">
注册资本:<span>356889.88</span>
注册资本:<span>{{ info.registerCapital }}</span>
</div>
<div class="top_d_item">
注册地址:<span>重庆市渝北区财富大道19号1幢(财富三号A栋6楼1、2#-1)</span>
注册地址:<span>{{ info.registerAddress }}</span>
</div>
</div>
</div>
<div class="addhzqk_from">
<el-form ref="queryForm" :model="queryParams" size="small" label-width="126px">
<el-form-item label="项目名称:">
<el-input v-model="queryParams.name" placeholder="请输入项目名称"></el-input>
<el-form :model="addParam" :rules="rules" ref="addParam" size="small" label-width="126px">
<el-form-item label="项目名称:" prop="projectName">
<el-input v-model="addParam.projectName" placeholder="请输入项目名称" @input="getCompany1"></el-input>
<div class="resultlist" v-if="showlist1">
<div v-for="(item,index) in companData1" @click="selCompany1(item)"><span v-html="item"></span></div>
</div>
</el-form-item>
<el-form-item label="业主单位:" prop="ownerCompany">
<el-input v-model="addParam.ownerCompany" placeholder="请输入业主单位" @input="getCompany"></el-input>
<div class="resultlist" v-if="showlist">
<div v-for="(item,index) in companData" @click="selCompany(item)"><span v-html="item.name"></span></div>
</div>
</el-form-item>
<el-form-item label="项目阶段:" prop="projectStage">
<el-select v-model="addParam.projectStage" style="width: 100%" class="form-content-width" placeholder="请选择项目状态">
<el-option v-for="(item, index) in projectStage" :key="index" :label="item.dictLabel" :value="item.dictValue" />
</el-select>
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item label="项目状态:">
<el-select v-model="queryParams.status" style="width: 100%" clearable class="form-content-width" placeholder="请选择项目状态">
<el-option v-for="(item, index) in statusOptions" :key="index" :label="item.name" :value="item.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目阶段:">
<el-select v-model="queryParams.stage" style="width: 100%" clearable class="form-content-width" placeholder="请选择项目阶段">
<el-option v-for="(item, index) in stageOptions" :key="index" :label="item.name" :value="item.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="投资金额(万元):">
<el-input v-model="queryParams.name" placeholder="请输入投资金额"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="关键决策人:">
<el-input v-model="queryParams.name" placeholder="请输入关键决策人名称"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="关键决策人电话:">
<el-input v-model="queryParams.name" placeholder="请输入关键决策人电话"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="竞争对手:">
<el-input v-model="queryParams.name" placeholder="请输入竞争对手名称"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="建设内容:">
<el-input v-model="queryParams.key"
type="textarea"
:autosize="{ minRows: 8, maxRows: 8}"
maxlength="500"
show-word-limit
placeholder="请输入建设内容">
</el-input>
<el-form-item label="项目类型:" prop="projectType">
<el-select v-model="addParam.projectType" style="width: 100%" class="form-content-width" placeholder="请选择项目阶段">
<el-option v-for="(item, index) in projectType" :key="index" :label="item.dictLabel" :value="item.dictValue" />
</el-select>
</el-form-item>
<el-form-item label="项目类别:" prop="projectCategory">
<el-select v-model="addParam.projectCategory" style="width: 100%" class="form-content-width" placeholder="请选择项目阶段">
<el-option v-for="(item, index) in projectCategory" :key="index" :label="item.dictLabel" :value="item.dictValue" />
</el-select>
</el-form-item>
<el-form-item label="投资估算(万):" prop="investmentAmount">
<el-input v-model="addParam.investmentAmount" placeholder="请输入投资估算" @input="number"></el-input>
</el-form-item>
<el-form-item label="可见范围:" prop="isPrivate">
<el-select v-model="addParam.isPrivate" style="width: 100%" class="form-content-width" placeholder="请选择">
<el-option v-for="(item, index) in isPrivate" :key="index" :label="item.name" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item style="text-align: right;">
<el-button @click="handleClose">关闭</el-button>
<el-button type="primary">保存内容</el-button>
<el-button type="primary" @click="submitForm">添加</el-button>
</el-form-item>
</el-form>
......@@ -135,10 +123,13 @@
<script>
import mixin from '../mixins/mixin'
import {getDictType,} from '@/api/main'
import {getEnterprise,getDictType,} from '@/api/main'
import {
getList
getList,
customerInfo,
queryProject
} from '@/api/detail/party-a/cooperate'
import {addProject} from '@/api/project/project'
export default {
name: 'Cooperate',
mixins: [mixin],
......@@ -147,17 +138,17 @@ export default {
},
data() {
return {
ifEmpty:true,
ifEmpty:false,
queryParams: {
customerId: 6034,
customerId: 'f25219e73249eea0d9fddc5c7f04f97f',
pageNum: 1,
pageSize: 10
},
forData: [
{label: '项目名称', prop: 'punishReason'},
{label: '项目阶段', prop: 'punishBegin', width: '120'},
{label: '投资金额(万元)', prop: 'punishResult', width: '140'},
{label: '项目状态', prop: 'fileNum', width: '90'}
{label: '项目名称', prop: 'projcetName'},
{label: '项目阶段', prop: 'projectStage', width: '120'},
{label: '投资金额(万元)', prop: 'investmentAmount', width: '140'},
{label: '项目状态', prop: 'status', width: '90'}
],
formData: [
{ type: 1, fieldName: 'projectStage', value: '', placeholder: '项目阶段', options: []},
......@@ -169,20 +160,73 @@ export default {
//列表
tableLoading:false,
tableData:[],
pageIndex:1,
pageSize:10,
tableDataTotal:0,
//弹窗
//弹窗-关联项目
drawer: false,
direction: 'rtl',
//业主单位
showlist:false,
companData:[],
//项目名称
showlist1:false,
companData1:[],
//弹窗-添加项目
dialogVisible: true,
addParam: {
userId:'',
projectName:'',
companyId:'',
ownerCompany:'',
projectStage:'',
projectCategory:'',
investmentAmount:'',
isPrivate:0,
customerId:'',
},
rules: {
projectName: [
{ required: true, message: '请输入项目名称', trigger: 'blur' },
],
ownerCompany: [
{ required: true, message: '请输入业主单位', trigger: 'blur' },
],
},
projectStage:[], //项目阶段
projectType:[], //项目类型
projectCategory:[], //项目类别
isPrivate:[
{
value: 0,
name: '仅自己可见'
},
{
value: 1,
name: '他人可见'
}
],//可见访问
//客户详情
info: {}
}
},
created() {
this.list()
this.customerInfos()
//项目阶段
this.handleOptions('project_stage_type',0)
//项目状态
this.handleOptions('project_status_type',1)
//项目阶段
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_category').then(result=>{
this.projectCategory = result.code == 200 ? result.data:[]
})
},
computed: {
......@@ -191,16 +235,99 @@ export default {
handleQuery(params) {
this.list(params)
},
// 列表
list(params){
let data = params ? params : this.queryParams
this.tableLoading = true
getList(data).then(res=>{
console.log(res)
if(res.code == 200){
if(res.rows.length >0){
this.ifEmpty = true
}
this.tableData = res.rows
this.tableDataTotal = res.total
this.tableLoading = false
}
})
},
// 客户详情
customerInfos(){
customerInfo(this.queryParams.customerId).then(res=>{
this.info = res.data
})
},
//弹窗
handleClose(done) {
//弹窗-添加项目
handleClose(formName) {
this.$refs.addParam.resetFields();
this.drawer = false
this.showlist = false
this.showlist1 = false
},
submitForm(){
this.$refs.addParam.validate((valid) => {
if (valid) {
this.addParam.customerId = this.queryParams.customerId
this.addParam.companyId = this.info.companyId
this.addParam.userId = this.info.userId
console.log(this.addParam)
addProject(this.addParam).then(result=>{
if(result.code == 200){
this.$message.success('添加成功!')
this.handleCurrentChange(1)
this.handleClose()
}else{
this.$message.error(result.msg)
}
})
}
});
},
//获取项目名称
getCompany1(value){
if (value.length>=2){
let param = {
projectName:value,
// page:{
// limit:20,
// page:1
// }
}
queryProject(JSON.stringify(param)).then(result=>{
if(result.code != 200)
return
this.showlist1 = true
this.companData1 = result.data
})
}
},
selCompany1(item){
this.addParam.projectName = item
this.showlist1 = false
},
//获取业主单位
getCompany(value){
if (value.length>=2){
let param = {
keyword:value,
page:{
limit:20,
page:1
}
}
getEnterprise(JSON.stringify(param)).then(result=>{
if(result.code != 200)
return
this.showlist = true
this.companData = result.data.list
})
}
},
selCompany(item){
this.addParam.ownerCompany = item.name.replace(/<[^>]+>/g, '')
this.showlist = false
},
// 处理条件下拉
handleOptions(name,index){
getDictType(name).then(res=>{
if(res.code == 200 && res.data){
......@@ -212,6 +339,10 @@ export default {
}
}
})
},
//输入数字
number(value){
this.addParam.investmentAmount = value.replace(/^\D*(\d*(?:\.\d{0,2})?).*$/g, '$1')//输入2位小数
}
}
}
......@@ -227,6 +358,18 @@ export default {
::v-deep .el-form-item{
margin-right: 8px !important;
}
.resultlist{
position: absolute;
width: 100%;
max-height: 218px;
background: #FFFFFF;
-webkit-box-shadow: 0px 4px 10px 0px rgba(0, 0, 0, 0.1);
box-shadow: 0px 4px 10px 0px rgba(0, 0, 0, 0.1);
overflow: auto;
z-index: 2;
text-indent: 13px;
cursor: pointer;
}
.cooperate-name{
::v-deep .el-form-item__content{
display: flex;
......
......@@ -35,6 +35,7 @@
<el-dialog
class="popups1"
:visible.sync="dialogVisible"
:before-close="cancel"
width="464px">
<div class="poptitle">
<img src="@/assets/images/economies/icon.png">
......@@ -60,8 +61,8 @@
<el-input v-model="addRorm.remark" placeholder="请输入"></el-input>
</el-form-item>
<div class="popbot">
<div class="btn btn_cancel h32" @click="cancel('addRorm')">返回</div>
<div class="btn btn_primary h32" @click="add('addRorm')">保存</div>
<div class="btn btn_cancel h32" @click="cancel">返回</div>
<div class="btn btn_primary h32" @click="add">保存</div>
</div>
</el-form>
</el-dialog>
......@@ -82,23 +83,23 @@ export default {
},
data() {
return {
ifEmpty:true,
ifEmpty:false,
queryParams:{
customerId:6034,
customerId:'f25219e73249eea0d9fddc5c7f04f97f',
pageNum:1,
pageSize:10,
},
forData: [
{label: '姓名', prop: 'punishReason', width: '124'},
{label: '角色', prop: 'punishBegin', width: '110'},
{label: '公司/机关', prop: 'punishResult', width: '268'},
{label: '职位', prop: 'fileNum', width: '110'},
{label: '联系方式', prop: 'cgrdm', width: '105'},
{label: '内部维护人', prop: 'office', width: '88'},
{label: '备注', prop: 'dataId'},
{label: '姓名', prop: 'name', width: '124'},
{label: '角色', prop: 'role', width: '110'},
{label: '公司/机关', prop: 'position', width: '268'},
{label: '职位', prop: 'workUnit', width: '110'},
{label: '联系方式', prop: 'contactInformation', width: '105'},
{label: '内部维护人', prop: 'updateBy', width: '88'},
{label: '备注', prop: 'remark'},
],
addRorm: {
customerId:'',
customerId:'f25219e73249eea0d9fddc5c7f04f97f',
name:'',
role:'',
workUnit:'',
......@@ -116,9 +117,7 @@ export default {
//列表
tableLoading:false,
tableData:[],
pageIndex:1,
pageSize:10,
tableDataTotal:50,
tableDataTotal:0,
//弹窗
dialogVisible: false,
}
......@@ -131,26 +130,46 @@ export default {
},
methods: {
list(){
this.tableLoading = true
getList(this.queryParams).then((res) => {
console.log(res)
if(res.code == 200){
if(res.rows.length >0){
this.tableData = res.rows
this.tableDataTotal = res.total
this.ifEmpty = true
}
this.tableLoading = false
}
})
},
//分页
handleCurrentChange(e){
console.log(e)
this.queryParams.pageNum = e
this.list()
},
add(formName){
this.$refs[formName].validate((valid) => {
add(){
this.$refs.addRorm.validate((valid) => {
if (valid) {
this.addRorm.customerId = 11
addChain(this.addRorm).then((res) => {
console.log(res)
if(res.data){
this.$message({
message: '新增成功',
type: 'success'
});
this.cancel()
this.list()
}else{
this.$message({
message: res.msg,
type: 'error'
});
}
})
}
});
},
cancel(formName){
this.$refs[formName].resetFields();
cancel(){
this.$refs.addRorm.resetFields();
this.dialogVisible = false
},
//打开新建窗口
......
......@@ -193,6 +193,7 @@ export default {
.financial-header{
background: #FFFFFF;
padding: 24px 16px;
border-radius: 4px;
.header-box {
justify-content: space-between;
flex-wrap: wrap;
......@@ -269,6 +270,7 @@ export default {
background: #FFFFFF;
padding: 24px 16px;
margin-top: 12px;
border-radius: 4px;
.zcqk-list{
margin-top: 4px;
overflow: hidden;
......@@ -335,6 +337,7 @@ export default {
background: #FFFFFF;
padding: 24px 16px;
margin-top: 12px;
border-radius: 4px;
.zwqk-box{
padding-top: 20px;
justify-content: normal;
......
......@@ -7,14 +7,23 @@
</div>
<div class="part-right">
<div id="partBox" v-if="companyId">
<Overview v-if="currentPath.pathName=='overview'" />
<Businfo v-if="currentPath.pathName=='businfo'" />
<Holderinfo v-if="currentPath.pathName=='holderinfo'" />
<Execuinfo v-if="currentPath.pathName=='execuinfo'" />
<Overseas v-if="currentPath.pathName=='overseas'" />
<Branch v-if="currentPath.pathName=='branch'" />
<!-- 企业概览 -->
<Overview v-if="currentPath.pathName=='overview'" :company-id="companyId" />
<Businfo v-if="currentPath.pathName=='businfo'" :company-id="companyId" />
<Holderinfo v-if="currentPath.pathName=='holderinfo'" :company-id="companyId" />
<Execuinfo v-if="currentPath.pathName=='execuinfo'" :company-id="companyId" />
<Overseas v-if="currentPath.pathName=='overseas'" :company-id="companyId" />
<Branch v-if="currentPath.pathName=='branch'" :company-id="companyId" />
<Financial v-if="currentPath.pathName=='financial'" :company-id="companyId" />
<Business v-if="currentPath.pathName=='business'" />
<!-- <Business v-if="currentPath.pathName=='business'" /> 商务信息 -->
<!-- 项目商机 -->
<Landtransaction v-if="currentPath.pathName=='landtransaction'" :company-id="companyId" />
<Proposed v-if="currentPath.pathName=='proposed'" :company-id="companyId" />
<Bond v-if="currentPath.pathName=='bond'" :company-id="companyId" />
<Biddingplan v-if="currentPath.pathName=='biddingplan'" :company-id="companyId" />
<Announcement v-if="currentPath.pathName=='announcement'" :company-id="companyId" />
<Tencent v-if="currentPath.pathName=='tencent'" :company-id="companyId" />
<Administrative v-if="currentPath.pathName=='administrative'" :company-id="companyId" />
<!-- 投诚分析 -->
<LandAcquisition v-if="currentPath.pathName=='landAcquisition'" />
<RegionalEconomies v-if="currentPath.pathName=='regionalEconomies'" />
......@@ -53,7 +62,14 @@ import Execuinfo from "./overview/execuinfo" //企业概览-高管信息
import Overseas from "./overview/overseas" //企业概览-对外投资
import Branch from "./overview/branch" //企业概览-分支机构
import Financial from "./financial" //财务简析
import Business from "./business" //商务信息
//import Business from "./business" //商务信息
import Landtransaction from "./opport/landtransaction" //项目商机-土地交易
import Proposed from "./opport/proposed" //项目商机-拟建项目
import Bond from "./opport/bond" //项目商机-专项债项目
import Biddingplan from "./opport/biddingplan" //项目商机-招标计划
import Announcement from "./opport/announcement" //项目商机-招标公告
import Tencent from "./opport/tencent" //项目商机-标讯Pro
import Administrative from "./opport/administrative" //项目商机-行政许可
import LandAcquisition from "./urbanLnvestment/landAcquisition" //投诚分析-城投拿地
import RegionalEconomies from "./urbanLnvestment/regionalEconomies" //投诚分析-区域经济
import SameRegion from "./urbanLnvestment/sameRegion" //投诚分析-同地区城投
......@@ -80,7 +96,14 @@ export default {
Overseas,
Branch,
Financial,
Business,
// Business,
Landtransaction,
Proposed,
Bond,
Biddingplan,
Announcement,
Tencent,
Administrative,
LandAcquisition,
RegionalEconomies,
SameRegion,
......
......@@ -14,6 +14,12 @@ export default {
},
methods: {
// 设置下拉选项数据源
setFormData(fieldName, list) {
this.formData.forEach(item => {
item.fieldName == fieldName ? item.options = list : ''
})
},
formParams(){
let condtion = {}
let reqData = {}
......
<template>
<div class="detail-container">
<head-form
title="行政许可"
:form-data="formData"
:query-params="queryParams"
:total="tableDataTotal"
@handle-search="handleSearch"
/>
<tables
:indexFixed="true"
:tableLoading="tableLoading"
:tableData="tableData"
:forData="forData"
:tableDataTotal="tableDataTotal"
:queryParams="queryParams"
@handle-current-change="handleCurrentChange"
>
<template slot="porjectName" slot-scope="scope">
<span :class="[isOverHiddenFlag(scope.data.width, showList, scope.index, 0, scope.row.porjectName)?'cell-span':'']" :style="{'-webkit-line-clamp': 5}">
{{ scope.row.porjectName }}
<span v-if="isOverHiddenFlag(scope.data.width, showList, scope.index, 0, scope.row.porjectName)" @click="changeShowAll(scope.index, 0)">...<span style="color: #0081FF;">展开</span></span>
</span>
</template>
</tables>
</div>
</template>
<script>
import mixin from '../mixins/mixin'
import { getList } from '@/api/detail/party-a/opport'
export default {
name: 'Administrative',
props: ['companyId'],
mixins: [mixin],
components: {
},
data() {
return {
queryParams: {
companyId: this.companyId,
pageNum: 1,
pageSize: 10
},
forData: [
{label: '许可决定日期', prop: 'use', width: '100'},
{label: '决定文书号', prop: 'type', width: '200'},
{label: '许可编号', prop: 'type', width: '80'},
{label: '决定文书名称', prop: 'type', width: '190'},
{label: '许可内容', prop: 'porjectName', width: '300', slot: true},
{label: '有效期自', prop: 'type', width: '100'},
{label: '有效期至', prop: 'type', width: '100'},
{label: '行政许可类别', prop: 'type', width: '100'},
{label: '许可机关', prop: 'type', width: '180'},
{label: '行政许可机关统一社会信用代码', prop: 'type', width: '200'},
{label: '数据来源单位', prop: 'type', width: '110'},
{label: '数据来源单位统一社会信用代码', prop: 'type', width: '200'},
{label: '来源', prop: 'type', width: '80'}
],
formData: [
{ type: 3, fieldName: 'keys', value: '', placeholder: '输入关键词查询', options: []},
],
//列表
tableLoading:false,
tableData:[],
tableDataTotal:0,
showList:[]
}
},
computed: {
},
created() {
this.handleQuery()
},
methods: {
handleQuery(params) {
this.tableLoading = true
let param = params?params:this.queryParams
getList(param).then((res) => {
this.tableLoading = false
this.tableData = [
{
projectId: '1',
porjectName:'滨州医学院口腔医学大楼铝合金门窗供货及安装滨州医学院口腔医学大楼铝合金门窗供货及安装滨州医学院口腔医学大楼铝合金门窗供货及安装滨州医学院口腔医学大楼铝合金门窗供货及安装滨州医学院口腔医学大楼铝合金门窗供货及安装滨州医学院口腔医学大楼铝合金门窗供货及安装滨州医学院口腔医学大楼铝合金门窗供货及安装滨州医学院口腔医学大楼铝合金门窗供货及安装滨州医学院口腔医学大楼铝合金门窗供货及安装滨州医学院口腔医学大楼铝合金门窗供货及安装2',
use:'城镇住宅用地',
type:'房地产业',
way:'挂牌出让',
state:'重庆',
money:'11234万元',
scale:'222平米',
unit:'江苏省住房和城乡建设厅',
date:'2015-08-06',
}
]
this.tableDataTotal = 100
})
},
changeShowAll(row, column) {
this.showList.push({
row: row,
column: column
})
},
isOverHiddenFlag(data, showList, row, column, value) {
if(value && String(value).length > this.getLenth(data)) {
return !showList.some(item => item.row==row&&item.column==column)
}else {
return false
}
},
getLenth(data) {
return Math.floor(data / 12) * 5
}
}
}
</script>
<style lang="scss" scoped>
.detail-container{
background: #ffffff;
border-radius: 4px;
padding: 16px;
.cell-span {
display: inline-block;
position: relative;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 4;
cursor: pointer;
>span {
display: inline-block;
width: 37px;
position: absolute;
right: 0;
bottom: 0;
background-color: #fff;
z-index: 1;
}
}
}
</style>
<template>
<div class="detail-container">
<head-form
title="招标公告"
:form-data="formData"
:query-params="queryParams"
:total="tableDataTotal"
:isExcel="true"
@handle-search="handleSearch"
/>
<tables
:indexFixed="true"
:tableLoading="tableLoading"
:tableData="tableData"
:forData="forData"
:tableDataTotal="tableDataTotal"
:queryParams="queryParams"
@handle-current-change="handleCurrentChange"
>
<template slot="porjectName" slot-scope="scope">
<router-link to="" tag="a" class="a-link">{{ scope.row.porjectName }}</router-link>
</template>
</tables>
</div>
</template>
<script>
import mixin from '../mixins/mixin'
import {getList, getOption} from '@/api/detail/party-a/opport'
export default {
name: 'Announcement',
props: ['companyId'],
mixins: [mixin],
components: {
},
data() {
return {
queryParams: {
companyId: this.companyId,
pageNum: 1,
pageSize: 10
},
forData: [
{label: '项目名称', prop: 'porjectName', minWidth: '300', slot: true},
{label: '发布日期', prop: 'use', sortable: true, width: '120'},
{label: '预算金额(万元)', prop: 'type', sortable: true, width: '140'},
{label: '项目地区', prop: 'way', width: '120'},
{label: '项目类别', prop: 'state', width: '90'},
{label: '招采单位联系人', prop: 'money', width: '110'},
{label: '招采单位联系方式', prop: 'money', width: '130'},
{label: '代理单位', prop: 'money', width: '170'},
{label: '代理单位联系人', prop: 'money', width: '110'},
{label: '代理单位联系方式', prop: 'money', width: '130'},
{label: '报名截止日期', prop: 'money', width: '100'}
],
formData: [
{ type: 1, fieldName: 'projectStage', value: '', placeholder: '项目地区', options: []},
{ type: 1, fieldName: 'projectType', value: '', placeholder: '项目类型', options: []},
],
//列表
tableLoading:false,
tableData:[],
tableDataTotal:0,
showList:[],
}
},
computed: {
},
created() {
this.handleOption()
this.handleQuery()
},
methods: {
handleOption(){
getOption().then((res) => {
this.setFormData('projectStage', [
{ name: '类别1', value: '1' },
{ name: '类别2', value: '2' },
{ name: '类别3', value: '3' },
{ name: '类别4', value: '4' }
])
this.setFormData('projectType', [
{ name: '类别1', value: '1' },
{ name: '类别2', value: '2' },
{ name: '类别3', value: '3' },
{ name: '类别4', value: '4' }
])
})
},
handleQuery(params) {
this.tableLoading = true
let param = params?params:this.queryParams
getList(param).then((res) => {
this.tableLoading = false
this.tableData = [
{
projectId: '1',
porjectName:'滨州医学院口腔医学大楼铝合金门窗供货及安装',
use:'城镇住宅用地',
type:'房地产业',
way:'挂牌出让',
state:'重庆',
money:'11234万元',
scale:'222平米',
unit:'江苏省住房和城乡建设厅',
date:'2015-08-06',
}
]
this.tableDataTotal = 100
})
}
}
}
</script>
<style lang="scss" scoped>
.detail-container{
background: #ffffff;
border-radius: 4px;
padding: 16px;
}
</style>
<template>
<div class="app-container detail-container">
biddingplan
</div>
</template>
<script>
import mixin from '../mixins/mixin'
export default {
name: 'Biddingplan',
props: ['companyId'],
mixins: [mixin],
data() {
return {
}
},
created() {
},
methods: {
}
}
</script>
<style lang="scss" scoped>
.detail-container{
margin: 0;
padding: 16px;
background: #FFFFFF;
}
</style>
<template>
<div class="detail-container">
<head-form
title="专项债项目"
:form-data="formData"
:query-params="queryParams"
:total="tableDataTotal"
:isExcel="true"
@handle-search="handleSearch"
/>
<tables
:indexFixed="true"
:tableLoading="tableLoading"
:tableData="tableData"
:forData="forData"
:tableDataTotal="tableDataTotal"
:queryParams="queryParams"
@handle-current-change="handleCurrentChange"
>
<template slot="porjectName" slot-scope="scope">
<router-link to="" tag="a" class="a-link">{{ scope.row.porjectName }}</router-link>
</template>
</tables>
</div>
</template>
<script>
import mixin from '../mixins/mixin'
import { getList } from '@/api/detail/party-a/opport'
export default {
name: 'Bond',
props: ['companyId'],
mixins: [mixin],
components: {
},
data() {
return {
queryParams: {
companyId: this.companyId,
pageNum: 1,
pageSize: 10
},
forData: [
{label: '项目名称', prop: 'porjectName', minWidth: '300', slot: true},
{label: '项目总投资(亿元)', prop: 'use', sortable: true, width: '150'},
{label: '项目资本金(亿元)', prop: 'type', sortable: true, width: '150'},
{label: '项目收益倍数(倍)', prop: 'way', sortable: true, width: '150'},
{label: '专项债金额(亿元)', prop: 'state', sortable: true, width: '150'},
{label: '专项债用作资本金(亿元)', prop: 'money', sortable: true, width: '200'}
],
formData: [
{ type: 3, fieldName: 'keys', value: '', placeholder: '输入项目名称关键词查询', options: []},
],
//列表
tableLoading:false,
tableData:[],
tableDataTotal:0,
showList:[],
}
},
computed: {
},
created() {
this.handleQuery()
},
methods: {
handleQuery(params) {
this.tableLoading = true
let param = params?params:this.queryParams
getList(param).then((res) => {
this.tableLoading = false
this.tableData = [
{
projectId: '1',
porjectName:'滨州医学院口腔医学大楼铝合金门窗供货及安装',
use:'城镇住宅用地',
type:'房地产业',
way:'挂牌出让',
state:'重庆',
money:'11234万元',
scale:'222平米',
unit:'江苏省住房和城乡建设厅',
date:'2015-08-06',
}
]
this.tableDataTotal = 100
})
}
}
}
</script>
<style lang="scss" scoped>
.detail-container{
background: #ffffff;
border-radius: 4px;
padding: 16px;
}
</style>
<template>
<div class="detail-container">
<head-form
title="土地交易"
:form-data="formData"
:query-params="queryParams"
:total="tableDataTotal"
:isExcel="true"
@handle-search="handleSearch"
/>
<tables
:indexFixed="true"
:tableLoading="tableLoading"
:tableData="tableData"
:forData="forData"
:tableDataTotal="tableDataTotal"
:queryParams="queryParams"
@handle-current-change="handleCurrentChange"
>
<template slot="porjectName" slot-scope="scope">
<router-link to="" tag="a" class="a-link">{{ scope.row.porjectName }}</router-link>
</template>
</tables>
</div>
</template>
<script>
import mixin from '../mixins/mixin'
import { getOption, getList } from '@/api/detail/party-a/opport'
export default {
name: 'Landtransaction',
props: ['companyId'],
mixins: [mixin],
components: {
},
data() {
return {
queryParams: {
companyId: this.companyId,
pageNum: 1,
pageSize: 10
},
forData: [
{label: '项目名称', prop: 'porjectName', minWidth: '300', slot: true},
{label: '土地用途', prop: 'use', width: '130'},
{label: '行业分类', prop: 'type', width: '100'},
{label: '供地方式', prop: 'way', width: '100'},
{label: '土地坐落', prop: 'state', width: '130'},
{label: '成交金额(万元)', prop: 'money', sortable: true, width: '140'},
{label: '总面积(㎡)', prop: 'scale', sortable: true, width: '130'},
{label: '批准单位', prop: 'unit', width: '130'},
{label: '签订日期', prop: 'date', width: '130'}
],
formData: [
{ type: 1, fieldName: 'penalizeReasonType', value: '', placeholder: '土地用途', options: []},
{ type: 3, fieldName: 'keys', value: '', placeholder: '输入项目名称关键词查询', options: []},
],
//列表
tableLoading:false,
tableData:[],
tableDataTotal:0,
showList:[],
}
},
computed: {
},
created() {
this.handleOption()
this.handleQuery()
},
methods: {
handleOption(){
getOption().then((res) => {
this.setFormData('penalizeReasonType', [
{ name: '类别1', value: '1' },
{ name: '类别2', value: '2' },
{ name: '类别3', value: '3' },
{ name: '类别4', value: '4' }
])
})
},
handleQuery(params) {
this.tableLoading = true
let param = params?params:this.queryParams
getList(param).then((res) => {
this.tableLoading = false
this.tableData = [
{
projectId: '1',
porjectName:'滨州医学院口腔医学大楼铝合金门窗供货及安装',
use:'城镇住宅用地',
type:'房地产业',
way:'挂牌出让',
state:'重庆',
money:'11234万元',
scale:'222平米',
unit:'江苏省住房和城乡建设厅',
date:'2015-08-06',
}
]
this.tableDataTotal = 100
})
}
}
}
</script>
<style lang="scss" scoped>
.detail-container{
background: #ffffff;
border-radius: 4px;
padding: 16px;
}
</style>
<template>
<div class="detail-container">
<head-form
title="拟建项目"
:form-data="formData"
:query-params="queryParams"
:total="tableDataTotal"
:isExcel="true"
@handle-search="handleSearch"
/>
<tables
:indexFixed="true"
:tableLoading="tableLoading"
:tableData="tableData"
:forData="forData"
:tableDataTotal="tableDataTotal"
:queryParams="queryParams"
@handle-current-change="handleCurrentChange"
>
<template slot="porjectName" slot-scope="scope">
<router-link to="" tag="a" class="a-link">{{ scope.row.porjectName }}</router-link>
</template>
</tables>
</div>
</template>
<script>
import mixin from '../mixins/mixin'
import { getList } from '@/api/detail/party-a/opport'
export default {
name: 'Proposed',
props: ['companyId'],
mixins: [mixin],
components: {
},
data() {
return {
queryParams: {
companyId: this.companyId,
pageNum: 1,
pageSize: 10
},
forData: [
{label: '项目名称', prop: 'porjectName', minWidth: '300', slot: true},
{label: '成交金额(万元)', prop: 'use', sortable: true, width: '150'},
{label: '项目类别', prop: 'type', width: '100'},
{label: '计划开工日期', prop: 'way', sortable: true, width: '130'},
{label: '计划完工日期', prop: 'state', sortable: true, width: '130'},
{label: '审批结果', prop: 'money', width: '100'},
{label: '是否为民间推介项目', prop: 'scale', width: '150'}
],
formData: [
{ type: 3, fieldName: 'keys', value: '', placeholder: '输入项目名称关键词查询', options: []},
],
//列表
tableLoading:false,
tableData:[],
tableDataTotal:0,
showList:[],
}
},
computed: {
},
created() {
this.handleQuery()
},
methods: {
handleQuery(params) {
this.tableLoading = true
let param = params?params:this.queryParams
getList(param).then((res) => {
this.tableLoading = false
this.tableData = [
{
projectId: '1',
porjectName:'滨州医学院口腔医学大楼铝合金门窗供货及安装',
use:'城镇住宅用地',
type:'房地产业',
way:'挂牌出让',
state:'重庆',
money:'11234万元',
scale:'222平米',
unit:'江苏省住房和城乡建设厅',
date:'2015-08-06',
}
]
this.tableDataTotal = 100
})
}
}
}
</script>
<style lang="scss" scoped>
.detail-container{
background: #ffffff;
border-radius: 4px;
padding: 16px;
}
</style>
<template>
<div class="app-container detail-container">
tencent
</div>
</template>
<script>
import mixin from '../mixins/mixin'
export default {
name: 'Tencent',
props: ['companyId'],
mixins: [mixin],
data() {
return {
}
},
created() {
},
methods: {
}
}
</script>
<style lang="scss" scoped>
.detail-container{
margin: 0;
padding: 16px;
background: #FFFFFF;
}
</style>
<template>
<div class="app-container part-container">
企业速览
<div class="app-container detail-container">
<head-form
title="分支机构"
:form-data="formData"
:query-params="queryParams"
:total="tableDataTotal"
:isExcel="true"
@handle-search="handleSearch"
/>
<tables
:tableLoading="tableLoading"
:tableData="tableData"
:forData="forData"
:tableDataTotal="tableDataTotal"
:queryParams="queryParams"
@handle-current-change="handleCurrentChange"
>
<template slot="inReason" slot-scope="scope">
<router-link to="" tag="a" class="a-link">{{scope.row.inReason}}</router-link>
<div class="tags" v-if="scope.row.tag">
<span class="tag style1">{{scope.row.tag}}</span>
<span class="tag style1">{{scope.row.tag}}</span>
</div>
</template>
</tables>
</div>
</template>
<script>
import mixin from '../mixins/mixin'
export default {
name: 'Overview',
name: 'Branch',
mixins: [mixin],
data() {
return {
queryParams: {
cid: 6034,
pageNum: 1,
pageSize: 10
},
forData: [
{label: '被投资企业名称', prop: 'inReason', slot: true},
{label: '负责人', prop: 'inDate'},
{label: '成立日期', prop: 'department'}
],
formData: [
{ type: 1, fieldName: 'zbgg', value: '', placeholder: '招标公告',
options: [
{ name: '招标公告类别1', value: '1' },
{ name: '招标公告类别2', value: '2' },
{ name: '招标公告类别3', value: '3' },
{ name: '招标公告类别4', value: '4' }
]
}
],
//列表
tableLoading:false,
tableData:[],
pageIndex:1,
pageSize:10,
tableDataTotal:0,
}
},
created() {
this.dataRegion()
},
methods: {
async dataRegion() {
this.tableData = [
{id:1, inReason:'达萨法达萨法', inDate:'000',tag:'aaa'},
{id:2, inReason:'达萨法达萨法', inDate:'111'},
{id:3, inReason:'达萨法达萨法', inDate:'222'},
{id:4, inReason:'达萨法达萨法', inDate:'333'}
] //测试
},
handleQuery(params) {
console.log(params)
}
}
}
</script>
<style lang="scss" scoped>
.part-container{
.detail-container{
margin: 0;
padding: 0;
padding: 16px;
background: #FFFFFF;
border-radius: 4px;
.tags{
.tag{
display: inline-block;
border-radius: 2px;
padding: 1px 7px;
margin: 4px 8px 0 0;
&.style1{
background: #E4F3FD;
color: #41A1FD;
}
}
}
}
</style>
<template>
<div class="app-container part-container">
企业速览
<div class="app-container detail-container">
<el-tabs v-model="activeName" @tab-click="handleClick" class="detail-tab">
<el-tab-pane label="工商信息" name="first"></el-tab-pane>
<el-tab-pane label="工商变更" name="second"></el-tab-pane>
</el-tabs>
<info-table class="info-tab" :list="defaultList" :obj="forInfo" :labelWidth="labelWidth" v-if="activeName=='first'">
</info-table>
<tables
:tableLoading="tableLoading"
:tableData="tableData"
:forData="forData"
:queryParams="queryParams"
:paging="false"
v-if="activeName=='second'"
/>
</div>
</template>
<script>
import mixin from '../mixins/mixin'
import InfoTable from '../component/infoTable'
export default {
name: 'Overview',
name: 'Businfo',
props: ['companyId'],
components: {
InfoTable
},
mixins: [mixin],
data() {
return {
activeName: 'first',
queryParams: {
cid: 6034,
pageNum: 1,
pageSize: 10
},
labelWidth: 250,
forInfo: {projectType: 'aaa', projectPurposes: '222', projectInvestmentAmounts: '222'},
defaultList: [
{ name: '企业名称', prop: 'projectTypes' },
{ name: '社会信用代码', prop: 'projectPurposes' },
{ name: '法定代表人', prop: 'projectInvestmentAmounts' },
{ name: '登记状态', prop: 'projectInvestmentAmounts' },
{ name: '成立日期', prop: 'projectInvestmentAmounts' },
{ name: '注册资本', prop: 'projectInvestmentAmounts' },
{ name: '实缴资本', prop: 'projectInvestmentAmounts' },
{ name: '核准日期', prop: 'projectInvestmentAmounts' },
{ name: '组织机构代码', prop: 'projectInvestmentAmounts' },
{ name: '工商注册号', prop: 'projectInvestmentAmounts' },
{ name: '纳税人识别号', prop: 'projectInvestmentAmounts' },
{ name: '企业类型', prop: 'projectInvestmentAmounts' },
{ name: '营业期限', prop: 'projectInvestmentAmounts' },
{ name: '纳税人资质', prop: 'projectInvestmentAmounts' },
{ name: '所属地区', prop: 'projectInvestmentAmounts' },
{ name: '登记机关', prop: 'projectInvestmentAmounts' },
{ name: '人员规模', prop: 'projectInvestmentAmounts' },
{ name: '参保人数', prop: 'projectInvestmentAmounts' },
{ name: '经营范围', prop: 'projectInvestmentAmounts', style: true }
],
forData: [
{label: '变更日期', prop: 'inReason', width: '90', slot: true},
{label: '变更事项', prop: 'inDate'},
{label: '变更前', prop: 'department'},
{label: '变更后', prop: 'department'}
],
//列表
tableLoading:false,
tableData:[]
}
},
created() {
this.handleData()
},
methods: {
handleClick(){
this.handleData()
},
async handleData() {
this.tableData = [
{id:1, inReason:'达萨法达萨法', inDate:'000',tag:'aaa'},
{id:2, inReason:'达萨法达萨法', inDate:'111'},
{id:3, inReason:'达萨法达萨法', inDate:'222'},
{id:4, inReason:'达萨法达萨法', inDate:'333'}
] //测试
},
handleQuery(params) {
console.log(params)
}
}
}
</script>
<style lang="scss" scoped>
.part-container{
margin: 0;
padding: 0;
.detail-container{
margin: 0;
padding: 16px;
background: #FFFFFF;
border-radius: 4px;
.detail-tab{
margin: 0 0 0 -16px;
::v-deep .el-tabs__nav-wrap::after{
display: none;
}
::v-deep .el-tabs__item{
font-size: 16px;
height: 30px;
line-height: 30px;
padding: 0 16px;
&.is-active{
font-weight: bold;
}
}
}
}
</style>
......@@ -231,6 +231,7 @@ export default {
padding: 24px 16px;
background: #FFFFFF;
overflow: hidden;
border-radius: 4px;
.zbph-item{
justify-content: space-around;
padding-top: 26px;
......@@ -296,6 +297,7 @@ export default {
width: calc(50% - 8px);
padding: 24px 16px;
background: #FFFFFF;
border-radius: 4px;
.table-item{
margin-top:15px;
.ywwl-ico{
......
......@@ -178,6 +178,7 @@ export default {
margin: 0;
padding: 24px 16px;
background: #FFFFFF;
border-radius: 4px;
.selfTab{
margin: 24px 0 0 -12px;
::v-deep .el-tabs__nav-wrap::after{
......
<template>
<div class="app-container info-container">
<div class="company-box">
<div class="company-nav flex-box">
<div class="company-left">
<img :src="companyInfo.logoUrl" :alt="companyInfo.companyName" :title="companyInfo.companyName" v-if="companyInfo.logoUrl">
<span
:class="companyInfo.nameSimple&&companyInfo.nameSimple.length<3?'conenctLogo textOne bg'+companyInfo.nameSimple.length:'conenctLogo textTwo bg'+companyInfo.nameSimple.length"
v-else-if="companyInfo.nameSimple"
v-html="companyInfo.nameSimple"></span>
<img :src="require('@/assets/images/detail/overview/logo@2x.png')" :alt="companyInfo.companyName" :title="companyInfo.companyName" v-else>
</div>
<div class="company-title">
<div class="company-name">
{{companyInfo.companyName || ''}}
</div>
<div class="company-tag">
<div style="float: left;margin-top: 8px;" class="company-history" v-if="companyInfo.historyNames && companyInfo.historyNames.length>0">
<el-popover
placement="bottom-start"
popper-class="enterpriseLabel-item"
trigger="hover">
<el-button slot="reference">曾用名 <i class="el-icon-caret-bottom"></i></el-button>
<ul class="history-item">
<li v-for="(item, index) in companyInfo.historyNames" :key="index">{{item.value}}</li>
</ul>
</el-popover>
</div>
<span style="float: left;" :class="!labelArr.includes(companyInfo.businessStatus)?'label-bg1':'label-bg3'" v-if="companyInfo.businessStatus">{{companyInfo.businessStatus}}</span>
<span style="float: left;" :class="item.state===0?'label-bg2':'label-bg3'" v-for="(item, index) in labelList" :key="index">{{item.labelName}}</span>
<template v-if="enterpriseLabel.length > 0">
<template v-for="(item,index) in enterpriseLabel">
<template v-if="item.children.length > 0">
<div class="enterpriseLabel-highTech company-highTech">
<el-popover
width="280"
placement="bottom-start"
popper-class="enterpriseLabel-item"
trigger="hover">
<el-button slot="reference" :style="'background:'+item.bgColor+';color:'+item.fontColor+';border:1px solid '+item.bgColor+';margin: 0;'">{{item.labelName}} <span>{{ item.children.length }}</span><i class="el-icon-arrow-right"></i></el-button>
<p class="highTech-item">
<span v-for="(v,i) in item.children" class="enterpriseLabel-children-span" :style="v.linkUri ? 'cursor:pointer;' : ''">{{ v.labelName }}</span>
</p>
</el-popover>
</div>
</template>
<template v-else>
<template v-if="item.remark">
<div class="enterpriseLabel-highTech company-highTech">
<el-popover
width="280"
placement="bottom-start"
popper-class="enterpriseLabel-item"
trigger="hover">
<el-button slot="reference" :style="'background:'+item.bgColor+';color:'+item.fontColor+';border:1px solid '+item.bgColor+';margin: 0;'">{{item.labelName}} <i class="el-icon-arrow-down"></i></el-button>
<p class="highTech-item" style="margin-bottom: 8px">{{item.remark}}</p>
</el-popover>
</div>
</template>
<span v-else class="enterpriseLabel-span" :style="{'background':item.bgColor,'color':item.fontColor,'cursor':item.linkUri ? 'pointer' : ''}">{{item.labelName}}</span>
</template>
</template>
</template>
</div>
</div>
</div>
<div class="company-menu">
<el-button @click="handleClaim" v-if="ifClaim" class="hasClaim" v-loading="claimLoading"><i class="el-ico-claim" alt="已认领" title="已认领"></i> 已认领</el-button>
<el-button @click="handleClaim" v-else class="claim" v-loading="claimLoading"><i class="el-ico-claim" alt="认领客户" title="认领客户"></i> 认领客户</el-button>
</div>
<div class="company-info">
<div class="info-item flex-box">
<div class="item"><label>法定代表人:</label><span>{{companyInfo.corporatePerson || ''}}</span></div>
<div class="item"><label>注册资本:</label><span>{{companyInfo.regCapital || '--'}}</span></div>
<div class="item"><label>统一社会信用代码:</label><span>{{companyInfo.creditCode || ''}}</span></div>
</div>
<div class="info-item flex-box">
<div class="item"><label>成立日期:</label><span>{{companyInfo.regCapital || '--'}}</span></div>
<div class="item"><label>类型:</label><span>{{companyInfo.regCapital || '--'}}</span></div>
<div class="item"><label>企业邮箱:</label><span>{{companyInfo.regCapital || '--'}}</span></div>
</div>
<div class="info-item flex-box">
<div class="item"><label>官网:</label><span>{{companyInfo.regCapital || '--'}}</span></div>
<div class="item"><label>注册地址:</label><span>{{companyInfo.regCapital || '--'}}</span></div>
<div class="item"><label>通信地址:</label><span>{{companyInfo.regCapital || '--'}}</span></div>
</div>
<div class="info-item flex-box" >
<div class="item flex-box item-line" >
<span ref="companyQybj" class="text-cl1" :class="showMore&&showState?'item-all':'item-more'">
<label>企业背景:</label>{{companyInfo.introduction || ''}}
</span>
<span class="item-link ml-4" v-if="companyInfo.introduction&&showMore" @click="handleDetail">{{showState?'收起':'展开'}}</span>
</div>
</div>
</div>
<div class="company-swiper">
<div class="swiper-containers swiper-info" :style="graphList.length<=6?'margin-left:0px; width: 100%;':''">
<ul class="swiper-wrapper">
<template v-for="(item, index) in graphList" >
<li class="swiper-slide" :key="index">
<div class="flex-box" @click="handleGraph(item)">
<img :src="`${item.ico}`" :alt="item.name" :title="item.name" class="swiper-img">
<div class="swiper-item">
<span class="swiper-name">
{{item.name}}
</span>
<template v-for="(it, idx) in item.intro">
<div :key="idx" @click.stop="handleGraphChild(item, it)">
<span v-html="it.name"></span> <i :class="[idx!=item.intro.length-1?'num':'']" :style="it.val>0?'':{color: '#999999',cursor: 'not-allowed'}">{{it.val}}</i>
</div>
</template>
</div>
</div>
</li>
</template>
</ul>
</div>
<div class="swiper-button-prev swiper-info-prev" slot="button-prev" style="left: 0;"><i class="el-icon-arrow-left"></i></div>
<div class="swiper-button-next swiper-info-next" slot="button-next" style="right: 0"><i class="el-icon-arrow-right"></i></div>
</div>
<!-- 分条件:滚动与不滚动 -->
</div>
</div>
</template>
<script>
var Swiper = require('@/assets/lib/swiper/swiper-bundle.min.js')
import "@/assets/lib/swiper/swiper-bundle.css"
import { encodeStr } from '@/assets/js/common.js'
export default {
name: 'Infoheader',
data() {
return {
companyInfo: {
"historyNames": [
{
"name": "",
"value": "中国建筑第八工程局"
}
],
"eid": "a4465fc3-ef1d-470b-834e-3af1975a5692",
"regCapital": "1521800万元人民币",
"registeredDate": "1998-09-29",
"companyName": "中国建筑第八工程局有限公司",
"provinceIdsArea": "310000,360000,500000,450000,420000,320000,370000,330000,510000,150000,610000,230000,460000,210000,440000,130000,120000,630000,430000,410000,350000,340000,650000,640000,140000,540000,520000,530000,620000,110000,220000",
"econKind": "有限责任公司(非自然人投资或控股的法人独资)",
"cityId": 310100,
"addressDetail": "中国(上海)自由贸易试验区世纪大道1568号27层",
"creditCode": "9131000063126503X1",
"metaTime": "2023-05-13",
"contact": {
"cellphone": 266,
"telephone": 158,
"phoneNumber": "0310-8083960"
},
"corporatePerson": "李永明",
"views": 32303,
"introduction": "中国建筑第八工程局有限公司成立于1998-09-29,法定代表人为李永明,注册资本为1521800万元,统一社会信用代码为9131000063126503X1,企业地址位于中国(上海)自由贸易试验区世纪大道1568号27层,经营范围包含房屋建筑、公路、铁路、市政公用、港口与航道、水利水电各类别工程的咨询、设计、施工、总承包和项目管理,化工石油工程,电力工程,基础工程,装饰工程,工业筑炉,城市轨道交通工程,园林绿化工程,线路、管道、设备的安装,混凝土预制构件及制品,非标制作,建筑材料生产、销售,建筑设备销售,建筑机械租赁,房地产开发,自有房屋租赁,物业管理,从事建筑领域内的技术转让、技术咨询、技术服务,企业管理咨询,商务信息咨询,经营各类商品和技术的进出口,但国家限定公司经营或禁止进出口的商品及技术除外。【依法须经批准的项目,经相关部门批准后方可开展经营活动】。该公司目前的经营状态为存续(在营、开业、在册)。企业联系方式为:0310-8083960。",
"businessDateFrom": "1998-09-29",
"isHighTech": 1,
"businessScope": "房屋建筑、公路、铁路、市政公用、港口与航道、水利水电各类别工程的咨询、设计、施工、总承包和项目管理,化工石油工程,电力工程,基础工程,装饰工程,工业筑炉,城市轨道交通工程,园林绿化工程,线路、管道、设备的安装,混凝土预制构件及制品,非标制作,建筑材料生产、销售,建筑设备销售,建筑机械租赁,房地产开发,自有房屋租赁,物业管理,从事建筑领域内的技术转让、技术咨询、技术服务,企业管理咨询,商务信息咨询,经营各类商品和技术的进出口,但国家限定公司经营或禁止进出口的商品及技术除外。【依法须经批准的项目,经相关部门批准后方可开展经营活动】",
"businessStatus": "存续(在营、开业、在册)",
"isFy": false,
"provinceId": 310000,
"logoUrl": "https://qxb-logo-url.oss-cn-hangzhou.aliyuncs.com/OriginalUrl/2cae9ba958e78d719c43fd0f7e4fa514.jpg",
"companyId": 6034,
"simpleName": "中建八局",
"provinceName": "上海"
},
labelList: [], //企业标签
claimLoading: false,
ifClaim: false, //是否认领
showMore: false,
showState: false,
graphList: [
{id: 1, name:'业务往来', intro:[{id: 101, name:'客户', val:44},{id: 102, name:'供应商', val:55}], ico:require('@/assets/images/detail/overview/company_ywwl.png')},
{id: 2, name:'商机线索', intro:[{id: 201, name:'专项债项目', val:66},{id: 202, name:'招标计划', val:66}], ico:require('@/assets/images/detail/overview/company_sjxs.png')},
{id: 3, name:'城投拿地', intro:[{id: 301, name:'土地交易', val:2},{id: 302, name:'行政许可', val:0}], ico:require('@/assets/images/detail/overview/company_ctnd.png')},
{id: 4, name:'对外投资', intro:[{id: 401, name:'企业经营实力展现'}], ico:require('@/assets/images/detail/overview/company_dwtz.png')},
{id: 5, name:'股权穿透', intro:[{id: 501, name:'瞬息掌握企业关系'}], ico:require('@/assets/images/detail/overview/company_gqct.png')},
{id: 6, name:'企业架构', intro:[{id: 601, name:'企业架构关联图'}], ico:require('@/assets/images/detail/overview/company_qyjg.png')},
{id: 7, name:'工商信息', intro:[{id: 701, name:'企业基础工商登记信息'}], ico:require('@/assets/images/detail/overview/company_gsxx.png')}
], //企业链图
//风险扫描
labelArr:['失信联合惩戒企业','司法纠纷','注销'], //负向经营状态
enterpriseLabel:[
{
"labelCode": "4_1_",
"labelName": "严重行政处罚",
"companyId": 6034,
"num": 1,
"pcode": "4_",
"level": 2,
"isLeaf": 1,
"orderNum": 1,
"bgColor": "#FFF3F3",
"fontColor": "#FD5757",
"remark": "严重行政处罚,是指有关行政部门处以企业暂停投标资格、暂停承揽新业务的行政处罚。原因包括但不限于企业存在围标串标、克扣或拖欠劳动者报酬、出现重大安全事故等异常行为导致企业无法承揽工程项目,产生重大经营风险",
"children": [],
"linkUri": "/credit?type=0"
},
{
"labelCode": "2_2_1_",
"labelName": "施工特级资质",
"num": 3,
"pcode": "2_2_",
"level": 3,
"isLeaf": 0,
"orderNum": 6,
"bgColor": "#E4F3FD",
"fontColor": "#41A1FD",
"linkBizId": 209,
"children": [
{
"labelCode": "2_2_1_1_",
"labelName": "建筑工程特级",
"companyId": 6034,
"num": 1,
"pcode": "2_2_1_",
"level": 4,
"isLeaf": 1,
"orderNum": 6,
"bgColor": "#E4F3FD",
"fontColor": "#41A1FD",
"linkBizId": 209,
"children": [],
"linkUri": "?type=0"
},
{
"labelCode": "2_2_1_2_",
"labelName": "公路工程特级",
"companyId": 6034,
"num": 1,
"pcode": "2_2_1_",
"level": 4,
"isLeaf": 1,
"orderNum": 7,
"bgColor": "#E4F3FD",
"fontColor": "#41A1FD",
"linkBizId": 209,
"children": [],
"linkUri": "?type=0"
},
{
"labelCode": "2_2_1_10_",
"labelName": "市政公用工程特级",
"companyId": 6034,
"num": 1,
"pcode": "2_2_1_",
"level": 4,
"isLeaf": 1,
"orderNum": 15,
"bgColor": "#E4F3FD",
"fontColor": "#41A1FD",
"linkBizId": 209,
"children": [],
"linkUri": "?type=0"
}
],
"linkUri": "?type=0"
},
{
"labelCode": "3_2_1_",
"labelName": "高新技术企业",
"companyId": 6034,
"num": 1,
"pcode": "3_2_",
"level": 3,
"isLeaf": 1,
"orderNum": 67,
"bgColor": "#FFF7EC",
"fontColor": "#BFA061",
"remark": "高新技术企业指在国家颁布的《国家重点支持的高新技术领域》范围内,持续进行研究开发与技术成果转化,形成企业核心自主知识产权,并以此为基础开展经营活动的居民企业,是知识密集、技术密集的经济实体。",
"children": []
},
{
"labelCode": "3_2_4_",
"labelName": "省级企业技术中心",
"companyId": 6034,
"num": 1,
"pcode": "3_2_",
"level": 3,
"isLeaf": 1,
"orderNum": 70,
"bgColor": "#FFF7EC",
"fontColor": "#BFA061",
"remark": "企业技术中心是指企业根据市场竞争需要设立的技术研发与创新机构,负责制定企业技术创新规划、开展产业技术研发、创造运用知识产权、建立技术标准体系、凝聚培养创新人才、构建协同创新网络、推进技术创新全过程实施。",
"children": []
},
{
"labelCode": "3_1_1_1_",
"labelName": "国家级荣誉奖项",
"num": 8,
"pcode": "3_1_1_",
"level": 4,
"isLeaf": 0,
"orderNum": 76,
"bgColor": "#FFF7EC",
"fontColor": "#BFA061",
"children": [
{
"labelCode": "3_1_1_1_1_",
"labelName": "鲁班奖",
"companyId": 6034,
"num": 1,
"pcode": "3_1_1_1_",
"level": 5,
"isLeaf": 1,
"orderNum": 76,
"bgColor": "#FFF7EC",
"fontColor": "#BFA061",
"children": [],
"linkUri": "/behavior?type=0"
},
{
"labelCode": "3_1_1_1_2_",
"labelName": "国家优质工程奖",
"companyId": 6034,
"num": 1,
"pcode": "3_1_1_1_",
"level": 5,
"isLeaf": 1,
"orderNum": 77,
"bgColor": "#FFF7EC",
"fontColor": "#BFA061",
"children": [],
"linkUri": "/behavior?type=0"
},
{
"labelCode": "3_1_1_1_3_",
"labelName": "詹天佑奖",
"companyId": 6034,
"num": 1,
"pcode": "3_1_1_1_",
"level": 5,
"isLeaf": 1,
"orderNum": 78,
"bgColor": "#FFF7EC",
"fontColor": "#BFA061",
"children": [],
"linkUri": "/behavior?type=0"
},
{
"labelCode": "3_1_1_1_4_",
"labelName": "建筑装饰优质工程奖",
"companyId": 6034,
"num": 1,
"pcode": "3_1_1_1_",
"level": 5,
"isLeaf": 1,
"orderNum": 79,
"bgColor": "#FFF7EC",
"fontColor": "#BFA061",
"children": [],
"linkUri": "/behavior?type=0"
},
{
"labelCode": "3_1_1_1_5_",
"labelName": "绿色建筑创新奖",
"companyId": 6034,
"num": 1,
"pcode": "3_1_1_1_",
"level": 5,
"isLeaf": 1,
"orderNum": 80,
"bgColor": "#FFF7EC",
"fontColor": "#BFA061",
"children": [],
"linkUri": "/behavior?type=0"
},
{
"labelCode": "3_1_1_1_6_",
"labelName": "钢结构金奖",
"companyId": 6034,
"num": 1,
"pcode": "3_1_1_1_",
"level": 5,
"isLeaf": 1,
"orderNum": 81,
"bgColor": "#FFF7EC",
"fontColor": "#BFA061",
"children": [],
"linkUri": "/behavior?type=0"
},
{
"labelCode": "3_1_1_1_8_",
"labelName": "市政金杯示范工程",
"companyId": 6034,
"num": 1,
"pcode": "3_1_1_1_",
"level": 5,
"isLeaf": 1,
"orderNum": 83,
"bgColor": "#FFF7EC",
"fontColor": "#BFA061",
"children": [],
"linkUri": "/behavior?type=0"
},
{
"labelCode": "3_1_2_1_1_",
"labelName": "华夏建设科学技术奖",
"companyId": 6034,
"num": 1,
"pcode": "3_1_1_1_",
"level": 5,
"isLeaf": 0,
"orderNum": 112,
"bgColor": "#FFF7EC",
"fontColor": "#BFA061",
"children": [],
"linkUri": "/behavior?type=0"
}
],
"linkUri": "/behavior?type=0"
},
{
"labelCode": "1_1_1_",
"labelName": "长三角",
"companyId": 6034,
"num": 1,
"pcode": "1_1_",
"level": 3,
"isLeaf": 1,
"orderNum": 113,
"bgColor": "#F3F3FF",
"fontColor": "#8491E8",
"children": []
},
{
"labelCode": "1_1_5_",
"labelName": "华东",
"companyId": 6034,
"num": 1,
"pcode": "1_1_",
"level": 3,
"isLeaf": 1,
"orderNum": 113,
"bgColor": "#F3F3FF",
"fontColor": "#8491E8",
"children": []
}
],//企业标签
}
},
created() {
this.getCompanyInfo()
},
mounted() {
this.handleWidth()
this.getClaimStatus() //获取企业认领状态
this.companySwiper()
},
methods: {
//认领
async handleClaim(){
let _this = this
_this.claimLoading = true
setTimeout(function (){
_this.claimLoading = false
_this.$confirm(`认领成功,是否完善客户信息`, '提示', {
type: 'warning'
}).then(async () => {
console.log('操作跳转!')
})
}, 1000)
},
companySwiper(){
new Swiper('.swiper-info', {
slidesPerView: 6,
// 设置点击箭头
navigation: {
nextEl: '.swiper-info-next',
prevEl: '.swiper-info-prev',
}
})
},
getCompanyInfo(){
if(this.companyInfo.historyNames && typeof this.companyInfo.historyNames=='string'){ //曾用名
this.companyInfo.historyNames = JSON.parse(this.companyInfo.historyNames)
}
},
//获取认领状态
async getClaimStatus(){
this.ifClaim = false
},
handleWidth(){
this.showMore = this.$refs.companyQybj.scrollWidth - this.$refs.companyQybj.clientWidth
},
handleDetail(){
this.showState = !this.showState
},
jumpToLt(item){
this.$router.push({ path: '/party/structure', query: {eid:this.companyInfo.eid, typeId:item.id} })
},
//swiper项点击
handleGraph(item,it){
switch (item.id) {
case 4:
console.log('jump')
break
case 5:
this.jumpToLt(item)
break
case 6:
this.jumpToLt(item)
break
case 7:
console.log('jump')
break
}
},
//swiper子项点击
handleGraphChild(item, it){
if(it.id==101 && it.val){
console.log('jump')
}
if(it.id==102 && it.val){
console.log('jump')
}
if(it.id==201 && it.val){
console.log('jump')
}
if(it.id==202 && it.val){
console.log('jump')
}
if(it.id==301 && it.val){
console.log('jump')
}
if(it.id==302 && it.val){
console.log('jump')
}
}
}
}
</script>
<style lang="scss" scoped>
.info-container{
margin: 0;
padding: 24px 16px;
background: #FFFFFF;
border-radius: 4px;
.company-swiper{
position: relative;
.swiper-info{
width: calc(100% - 38px);
height: 56px;
margin-top: 13px;
margin-left: 25px;
overflow: hidden;
.swiper-slide{
&.swiper-disn{
display: none;
}
>div{
min-width: 242px;
height: 100%;
padding: 7px 4px 9px 0;
cursor: pointer;
align-items: normal;
.swiper-item{
.swiper-name{
display: block;
font-size: 14px;
color: #232323;
}
div{
display: inline-block;
font-size: 12px;
padding-top: 3px;
span{
color: #232323;
}
i{
font-style: normal;
color: #0081FF;
&.num{
margin-right: 8px;
}
}
}
}
.swiper-img{
width: 40px;
height: 40px;
margin-right: 6px;
}
}
}
}
.swiper-info-prev, .swiper-info-next{
width: 16px;
height: 40px;
background: #F0F5FC;
top: 8px;
margin-top: 0;
&.swiper-button-disabled{
opacity: 1;
color:#AAAAAA;
background: #F5F5F5;
}
i{
color: #AAAAAA;
}
&:hover i{
color:#667199;
}
&:after{
content: "";
}
}
}
.company-box{
width: 100%;
position: relative;
.company-nav{
align-items: normal;
.company-left{
width: 64px;
height: 64px;
margin-right: 12px;
flex-shrink: 0;
img{
width: 100%;
height: 100%;
border-radius: 4px;
overflow: hidden;
}
.conenctLogo{
width: 100%;
height: 100%;
color: #FFFFFF;
border-radius: 4px;
overflow: hidden;
text-align: center;
display: block;
&.textOne{
font-size: 18px;
line-height: 64px;
}
&.textTwo{
font-size: 18px;
padding: 9px 10px;
line-height: 24px;
}
&.bg1{
background: #99BE81;
}
&.bg2{
background: #76B4D4;
}
&.bg3{
background: #7A91D9;
}
&.bg4{
background: #8F8DD2;
}
&.bg5{
background: #C4A89F;
}
}
p{
font-size: 12px;
color: #999999;
text-align: center;
margin-top: 7px;
}
}
.company-title{
.company-name{
font-size: 20px;
color: #000000;
font-weight: bold;
margin-right: 100px;
}
.company-tag{
overflow: hidden;
font-size: 12px;
padding: 2px 0 10px 0;
.company-history, .company-highTech{
display: inline-block;
height: 22px;
background: #EFEFEF;
border-radius: 2px;
margin-right: 8px;
margin-left: 0;
button{
height: 22px;
line-height: 22px;
font-size: 12px;
padding: 0 8px;
background: #EFEFEF;
color: #838383;
border: 1px solid #EFEFEF;
border-radius: 2px;
}
}
.company-highTech{
button{
background: #DFEAFE;
color: #0065F9;
}
}
.enterpriseLabel-highTech{
background: #ffffff;
margin-top: 8px;
margin-right: 8px;
float: left;
}
>span{
display: inline-block;
height: 22px;
line-height: 22px;
padding: 0 8px;
border-radius: 2px;
margin-right: 8px;
margin-top: 8px;
&:last-child{
margin-right: 0;
}
}
.enterpriseLabel-span{
display: inline-block;
height: 22px;
line-height: 22px;
padding: 0 8px;
border-radius: 2px;
margin-right: 8px;
margin-top: 8px;
float: left;
}
.label-bg1{
background: #ECF6E7;
color: #54BC7E;
}
.label-bg2{
background: #DFEAFE;
color: #0065F9;
}
.label-bg3{
background: #fbf2f1;
color: #fa5640;
}
}
}
}
.company-menu{
position: absolute;
right: 0;
top: 0;
font-size: 14px;
.claim{
border: 1px solid #0081FF;
border-radius: 2px;
color:#0081FF;
background: #FFFFFF;
.el-ico-claim{
background: url("~@/assets/images/detail/overview/company_rl.png") no-repeat;
background-size: 16px 16px;
}
}
.claim:hover{
border: 1px solid #006AD1;
border-radius: 2px;
color:#006AD1;
background: #FFFFFF;
.el-ico-claim{
background: url("~@/assets/images/detail/overview/company_hrl.png") no-repeat;
background-size: 16px 16px;
}
}
.hasClaim{
border: 1px solid rgba(0,129,255,0.5);
border-radius: 2px;
color:rgba(0,129,255,0.5);
background: #FFFFFF;
.el-ico-claim{
background: url("~@/assets/images/detail/overview/company_yrl.png") no-repeat;
background-size: 16px 16px;
}
}
button {
padding: 6px 11px;
position: relative;
i{
display: inline-block;
width: 16px;
height: 16px;
margin-bottom: -2px;
}
}
}
.company-info{
background: #F5F9FE;
border-radius: 2px;
padding: 12px 10px 12px 16px;
.info-item{
margin-bottom: 12px;
&:last-child{
margin-bottom: 0;
}
.item-link{
color: #0081FF;
cursor: pointer;
font-size: 12px;
line-height: 20px;
&:hover{
color: #0069D0;
text-decoration: none;
}
}
.item{
font-size: 14px;
color: #333333;
&:first-child{
width: 210px;
}
&:nth-child(2){
width: 250px;
}
&.item-line{
width: 100%;
align-items: flex-end;
.item-all{
width: calc(100% - 50px);
text-overflow: initial;
white-space: initial;
overflow: initial;
}
.item-more{
width: calc(100% - 50px);
}
}
label{
color: #666666;
flex-shrink: 0;
}
span{
display: inline-block;
}
}
}
}
}
.history-item{
padding: 8px 8px;
li{
font-size: 12px;
color: #333333;
padding: 2px 0;
}
}
.enterpriseLabel-item{
padding: 0;
//width: 100%;
max-width: 276px;
margin-top: 8px !important;
}
.highTech-item{
padding: 10px 12px 0;
font-size: 12px;
color: #333333;
.enterpriseLabel-children-span{
display: inline-block;
padding-right: 8px;
margin-right: 8px;
margin-bottom: 8px;
border-right: 1px solid #E1E1E1;
//cursor:pointer;
}
.enterpriseLabel-children-span:last-child{
padding-right: 0;
margin-right: 0;
border-right: 0;
}
}
.ml-4{
margin-left: 4px;
}
}
</style>
......@@ -2,7 +2,7 @@
<div class="app-container operations-container">
<div class="common-title">公司经营</div>
<div class="part-swiper">
<div class="swiper-containers">
<div class="swiper-containers swiper-oper" :style="operList.length<=6?'margin-left:0px; width: 100%;':''">
<ul class="swiper-wrapper">
<li class="swiper-slide" v-for="(item, index) in operList" :key="index">
<div class="swiper-div">
......@@ -15,8 +15,8 @@
</li>
</ul>
</div>
<div class="swiper-button-prev" slot="button-prev" style="left: 0;"><i class="el-icon-arrow-left"></i></div>
<div class="swiper-button-next" slot="button-next" style="right: 0"><i class="el-icon-arrow-right"></i></div>
<div class="swiper-button-prev swiper-oper-prev" slot="button-prev" style="left: 0;"><i class="el-icon-arrow-left"></i></div>
<div class="swiper-button-next swiper-oper-next" slot="button-next" style="right: 0"><i class="el-icon-arrow-right"></i></div>
</div>
<div class="flex-box operations-list">
<div class="list-item" v-for="(item, index) in gsjyList" :key="index">
......@@ -35,7 +35,6 @@ export default {
data() {
return {
operList: [
{name:'债务信用评级', rate:'中国标普信用', range:'AA', year:'2021'},
{name:'债务信用评级', rate:'中国标普信用', range:'AA', year:'2021'},
{name:'债务信用评级', rate:'中国标普信用', range:'AA', year:'2021'},
{name:'债务信用评级', rate:'中国标普信用', range:'AA', year:'2021'},
......@@ -57,12 +56,12 @@ export default {
},
methods: {
companySwiper(){
new Swiper('.swiper-containers', {
slidesPerView: 4,
new Swiper('.swiper-oper', {
slidesPerView: 6,
// 设置点击箭头
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
nextEl: '.swiper-oper-next',
prevEl: '.swiper-oper-prev',
}
})
}
......@@ -75,10 +74,11 @@ export default {
margin: 0;
padding: 24px 16px;
background: #FFFFFF;
border-radius: 4px;
.part-swiper{
position: relative;
margin-top: 16px;
.swiper-containers{
.swiper-oper{
width: calc(100% - 38px);
height: 96px;
margin-top: 8px;
......@@ -117,7 +117,7 @@ export default {
}
}
}
.swiper-button-prev, .swiper-button-next{
.swiper-oper-prev, .swiper-oper-next{
width: 16px;
height: 96px;
background: #F0F5FC;
......
......@@ -92,6 +92,7 @@ export default {
margin: 0;
padding: 24px 16px;
background: #FFFFFF;
border-radius: 4px;
.selfTab{
margin: 24px 0 0 -12px;
::v-deep .el-tabs__nav-wrap::after{
......
......@@ -151,6 +151,7 @@ export default {
margin: 0;
padding: 24px 16px;
background: #FFFFFF;
border-radius: 4px;
.clue-box{
width: 100%;
justify-content: space-between;
......
......@@ -49,6 +49,7 @@ export default {
margin: 0;
padding: 24px 16px;
background: #FFFFFF;
border-radius: 4px;
.table-item{
margin-top: 16px;
::v-deep .el-table--border .el-table__cell{
......
......@@ -60,6 +60,7 @@ export default {
padding: 24px 16px;
background: #FFFFFF;
overflow: hidden;
border-radius: 4px;
.common-title{
margin-bottom: 10px;
}
......
<template>
<div class="app-container part-container">
企业速览
<div class="app-container detail-container">
<head-form
title="高管信息"
:form-data="formData"
:query-params="queryParams"
:total="tableDataTotal"
/>
<tables
:tableLoading="tableLoading"
:tableData="tableData"
:forData="forData"
:queryParams="queryParams"
:paging="false"
/>
</div>
</template>
<script>
import mixin from '../mixins/mixin'
export default {
name: 'Overview',
name: 'Execuinfo',
props: ['companyId'],
mixins: [mixin],
data() {
return {
queryParams: {
cid: 6034,
pageNum: 1,
pageSize: 10
},
forData: [
{label: '姓名', prop: 'inDate'},
{label: '职位', prop: 'department'}
],
formData: [],
//列表
tableLoading:false,
tableData:[],
tableDataTotal:0,
}
},
created() {
this.handleData()
},
methods: {
async handleData() {
this.tableData = [
{id:1, inReason:'达萨法达萨法', inDate:'000',tag:'aaa'},
{id:2, inReason:'达萨法达萨法', inDate:'111'},
{id:3, inReason:'达萨法达萨法', inDate:'222'},
{id:4, inReason:'达萨法达萨法', inDate:'333'}
] //测试
},
handleQuery(params) {
console.log(params)
}
}
}
</script>
<style lang="scss" scoped>
.part-container{
margin: 0;
padding: 0;
}
.detail-container{
margin: 0;
padding: 16px;
background: #FFFFFF;
border-radius: 4px;
}
</style>
<template>
<div class="app-container part-container">
企业速览
<div class="app-container detail-container">
<head-form
title=""
:form-data="formData"
:query-params="queryParams"
:total="tableDataTotal"
/>
<el-tabs v-model="activeName" @tab-click="handleClick" class="detail-tab">
<el-tab-pane label="股东信息" name="first"></el-tab-pane>
<el-tab-pane label="历史股东" name="second"></el-tab-pane>
</el-tabs>
<tables
:tableLoading="tableLoading"
:tableData="tableData"
:forData="forData"
:tableDataTotal="tableDataTotal"
:queryParams="queryParams"
@handle-current-change="handleCurrentChange"
>
<template slot="inReason" slot-scope="scope">
<router-link to="" tag="a" class="a-link">{{scope.row.inReason}}</router-link>
<div class="tags" v-if="scope.row.tag">
<span class="tag style1">{{scope.row.tag}}</span>
<span class="tag style1">{{scope.row.tag}}</span>
</div>
</template>
</tables>
</div>
</template>
<script>
import mixin from '../mixins/mixin'
export default {
name: 'Overview',
name: 'Holderinfo',
props: ['companyId'],
mixins: [mixin],
data() {
return {
activeName: 'first',
queryParams: {
cid: 6034,
pageNum: 1,
pageSize: 10
},
forData: [
{label: '发起人/股东', prop: 'inReason', slot: true},
{label: '持股比例', prop: 'inDate'},
{label: '认缴出资(万)', prop: 'department'},
{label: '实缴出资额', prop: 'department'},
{label: '认缴出资额', prop: 'department'},
{label: '参股日期', prop: 'department', width: '150'}
],
formData: [],
//列表
tableLoading:false,
tableData:[],
pageIndex:1,
pageSize:10,
tableDataTotal:0,
}
},
created() {
this.handleData()
},
methods: {
handleClick(){
this.handleData()
},
async handleData() {
this.tableData = [
{id:1, inReason:'达萨法达萨法', inDate:'000',tag:'aaa'},
{id:2, inReason:'达萨法达萨法', inDate:'111'},
{id:3, inReason:'达萨法达萨法', inDate:'222'},
{id:4, inReason:'达萨法达萨法', inDate:'333'}
] //测试
},
handleQuery(params) {
console.log(params)
}
}
}
</script>
<style lang="scss" scoped>
.part-container{
margin: 0;
padding: 0;
.detail-container{
margin: 0;
padding: 16px;
background: #FFFFFF;
border-radius: 4px;
.detail-tab{
margin: -34px 0 0 -16px;
::v-deep .el-tabs__nav-wrap::after{
display: none;
}
::v-deep .el-tabs__item{
font-size: 16px;
height: 30px;
line-height: 30px;
padding: 0 16px;
&.is-active{
font-weight: bold;
}
}
}
.tags{
.tag{
display: inline-block;
border-radius: 2px;
padding: 1px 7px;
margin: 4px 8px 0 0;
&.style1{
background: #E4F3FD;
color: #41A1FD;
}
}
}
}
</style>
<template>
<div class="app-container part-container">
企业速览
<div class="app-container detail-container">
<head-form
title="对外投资"
:form-data="formData"
:query-params="queryParams"
:total="tableDataTotal"
:isExcel="true"
@handle-search="handleSearch"
/>
<tables
:tableLoading="tableLoading"
:tableData="tableData"
:forData="forData"
:tableDataTotal="tableDataTotal"
:queryParams="queryParams"
@handle-current-change="handleCurrentChange"
>
<template slot="gqzb">
<div class="tab-header">股权占比 <el-popover
placement="top-start"
width="280"
trigger="hover">
<div>
控股67%:绝对控制权67%,相当于100%的权力,修改公司章程/分立、合并、变更主营项目、重大决策<br />
控股51%:相对控制权51%,控制线,绝对控制公司<br />
控股34%:安全控制权,一票否决权</div>
<img src="@/assets/images/detail/overview/zbph_question.png" slot="reference">
</el-popover></div>
</template>
<template slot="inReason" slot-scope="scope">
<router-link to="" tag="a" class="a-link">{{scope.row.inReason}}</router-link>
<div class="tags" v-if="scope.row.tag">
<span class="tag style1">{{scope.row.tag}}</span>
<span class="tag style1">{{scope.row.tag}}</span>
</div>
</template>
</tables>
</div>
</template>
<script>
import mixin from '../mixins/mixin'
export default {
name: 'Overview',
name: 'Overseas',
props: ['companyId'],
mixins: [mixin],
data() {
return {
queryParams: {
cid: 6034,
pageNum: 1,
pageSize: 10
},
forData: [
{label: '被投资企业名称', prop: 'inReason', slot: true},
{label: '法定代表人', prop: 'inDate'},
{label: '注册资本(万元)', prop: 'department'},
{label: '成立日期', prop: 'department'},
{label: '股权占比', prop: 'department', slotHeader: true, slotName: 'gqzb'},
{label: '认缴出资额(万元)', prop: 'department'}
],
formData: [
{ type: 1, fieldName: 'zbgg', value: '', placeholder: '招标公告',
options: [
{ name: '招标公告类别1', value: '1' },
{ name: '招标公告类别2', value: '2' },
{ name: '招标公告类别3', value: '3' },
{ name: '招标公告类别4', value: '4' }
]
},
{ type: 1, fieldName: 'gqzb', value: '', placeholder: '股权占比',
options: [
{ name: '股权占比类别1', value: '1' },
{ name: '股权占比类别2', value: '2' },
{ name: '股权占比类别3', value: '3' },
{ name: '股权占比类别4', value: '4' }
]
}
],
//列表
tableLoading:false,
tableData:[],
pageIndex:1,
pageSize:10,
tableDataTotal:0,
}
},
created() {
this.handleData()
},
methods: {
async handleData() {
this.tableData = [
{id:1, inReason:'达萨法达萨法', inDate:'000',tag:'aaa'},
{id:2, inReason:'达萨法达萨法', inDate:'111'},
{id:3, inReason:'达萨法达萨法', inDate:'222'},
{id:4, inReason:'达萨法达萨法', inDate:'333'}
] //测试
},
handleQuery(params) {
console.log(params)
}
}
}
</script>
<style lang="scss" scoped>
.part-container{
margin: 0;
padding: 0;
.detail-container{
margin: 0;
padding: 16px;
background: #FFFFFF;
border-radius: 4px;
.tab-header{
img{
margin-bottom: -3px;
width: 14px;
height: 14px;
cursor: pointer;
}
}
.tags{
.tag{
display: inline-block;
border-radius: 2px;
padding: 1px 7px;
margin: 4px 8px 0 0;
&.style1{
background: #E4F3FD;
color: #41A1FD;
}
}
}
}
</style>
<template>
<div class="app-container part-container">
企业速览
<div class="view-content"><Infoheader /></div><!-- 企业信息 -->
<div class="view-content"><Operations /></div><!-- 公司经营 -->
<div class="view-content"><Bidding /></div><!--招标偏好、业务往来-->
<div class="view-content"><Busclue /></div><!--商机线索-->
......@@ -12,6 +12,7 @@
</template>
<script>
import Infoheader from "./component/infoheader"
import Operations from "./component/operations"
import Bidding from "./component/bidding"
import Busclue from './component/busclue'
......@@ -23,6 +24,7 @@ export default {
name: 'Overview',
props: ['companyId'],
components: {
Infoheader,
Operations,
Bidding,
Busclue,
......
......@@ -10,7 +10,7 @@
<div class="params-item">
<div class="flex-box item-flex">
<el-input
v-model="queryParams.key"
v-model="queryParams.businessCharacteristic"
@focus="nowedit = 1"
placeholder="请输入商务条件特点"
class="textarea"
......@@ -21,7 +21,7 @@
</el-input>
<div class="flex btns" v-if="nowedit === 1">
<div class="flex">
<div class="btnsmall btn_primary">确定</div>
<div class="btnsmall btn_primary" @click="update('businessCharacteristic')">确定</div>
<div class="cancels " @click="nowedit = 0" style="">取消</div>
</div>
</div>
......@@ -39,7 +39,7 @@
<div class="params-item">
<div class="flex-box item-flex">
<el-input
v-model="queryParams.key"
v-model="queryParams.decisionChain"
@focus="nowedit = 2"
placeholder="请输入决策链条"
class="textarea"
......@@ -50,7 +50,7 @@
</el-input>
<div class="flex btns" v-if="nowedit === 2">
<div class="flex">
<div class="btnsmall btn_primary">确定</div>
<div class="btnsmall btn_primary" @click="update('decisionChain')">确定</div>
<div class="cancels " @click="nowedit = 0" style="">取消</div>
</div>
</div>
......@@ -68,7 +68,7 @@
<div class="params-item">
<div class="flex-box item-flex">
<el-input
v-model="queryParams.key"
v-model="queryParams.bidCharacteristic"
@focus="nowedit = 3"
placeholder="请输入招投标流程特点"
class="textarea"
......@@ -79,7 +79,7 @@
</el-input>
<div class="flex btns" v-if="nowedit === 3">
<div class="flex">
<div class="btnsmall btn_primary">确定</div>
<div class="btnsmall btn_primary" @click="update('bidCharacteristic')">确定</div>
<div class="cancels " @click="nowedit = 0" style="">取消</div>
</div>
</div>
......@@ -97,7 +97,7 @@
<div class="params-item">
<div class="flex-box item-flex">
<el-input
v-model="queryParams.key"
v-model="queryParams.performanceCharacteristic"
@focus="nowedit = 4"
placeholder="请输入履约阶段特点"
class="textarea"
......@@ -108,7 +108,36 @@
</el-input>
<div class="flex btns" v-if="nowedit === 4">
<div class="flex">
<div class="btnsmall btn_primary">确定</div>
<div class="btnsmall btn_primary" @click="update('performanceCharacteristic')">确定</div>
<div class="cancels " @click="nowedit = 0" style="">取消</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="preference-item">
<div class="flex-box query-box">
<div class="flex-box query-params">
<span class="common-title">其它管理体系特点</span>
</div>
</div>
<div class="query-params">
<div class="params-item">
<div class="flex-box item-flex">
<el-input
v-model="queryParams.otherMsCharacteistic"
@focus="nowedit = 5"
placeholder="请输入履约阶段特点"
class="textarea"
type="textarea"
:autosize="autosize"
maxlength="500"
:show-word-limit="true">
</el-input>
<div class="flex btns" v-if="nowedit === 5">
<div class="flex">
<div class="btnsmall btn_primary" @click="update('otherMsCharacteistic')">确定</div>
<div class="cancels " @click="nowedit = 0" style="">取消</div>
</div>
</div>
......@@ -122,6 +151,10 @@
</template>
<script>
import {
customerInfo,
customerUpdate
} from '@/api/detail/party-a/cooperate'
export default {
name: 'Preference',
components: {
......@@ -133,21 +166,47 @@ export default {
minRows: 8,
maxRows: 8
},
customerId: 'f25219e73249eea0d9fddc5c7f04f97f',
queryParams:{
customerId: '',
businessCharacteristic: '',
decisionChain: '',
bidCharacteristic: '',
performanceCharacteristic: '',
otherMsCharacteistic: '',
},
key:'',
nowedit: 0
}
},
created() {
this.customerInfos()
},
computed: {
},
methods: {
// 客户详情
customerInfos(){
customerInfo(this.customerId).then(res=>{
this.queryParams = res.data
})
},
// 编辑客户
update(name){
let data = {
customerId: this.customerId,
[name]: this.queryParams[name],
}
customerUpdate(data).then(res=>{
if(res.data){
this.$message.success(res.msg)
this.nowedit = 0
}else{
this.$message.error(res.msg)
}
})
}
}
}
</script>
......
......@@ -22,6 +22,10 @@
</template>
<script>
import {
abnormalPage,
abnormalYears
} from '@/api/detail/party-a/riskInformation'
import mixin from '../mixins/mixin'
export default {
name: 'BusinessAnomaly',
......@@ -45,14 +49,7 @@ export default {
{label: '做出决定机关(移除)', prop: 'outDepartment', width: '264'}
],
formData: [
{ type: 1, fieldName: 'years', value: '', placeholder: '列入时间',
options: [
{ name: '处罚类别1', value: '1' },
{ name: '处罚类别2', value: '2' },
{ name: '处罚类别3', value: '3' },
{ name: '处罚类别4', value: '4' }
]
}
{ type: 1, fieldName: 'years', value: '', placeholder: '列入时间', options: []}
],
//列表
tableLoading:false,
......@@ -63,26 +60,18 @@ export default {
}
},
created() {
this.dataRegion()
this.handleQuery()
},
computed: {
},
methods: {
async dataRegion() {
// await axios.post("https://files.jiansheku.com/file/json/common/dataRegion.json", {}, {
// headers: {
// 'Content-Type': 'application/json'
// }
// }).then(res => {
// if (res.data.code == 200) {
// console.log(res.data.data)
// }
// })
},
handleQuery(params) {
console.log(params)
}
let data = params ? params : this.queryParams
abnormalPage(data).then(res => {
})
},
}
}
</script>
......
......@@ -19,9 +19,9 @@
@handle-current-change="handleCurrentChange"
>
<template slot="punishReason" slot-scope="scope">
<span :class="[isOverHiddenFlag(scope.row.width, showList, scope.index, 0, scope.data)?'cell-span':'']" :style="{'-webkit-line-clamp': 5}">
{{ scope.data }}
<span v-if="isOverHiddenFlag(scope.row.width, showList, scope.index, 0, scope.data)" @click="changeShowAll(scope.index, 0)">...<span style="color: #0081FF;">更多</span></span>
<span :class="[isOverHiddenFlag(scope.data.width, showList, scope.index, 0, scope.row.punishReason)?'cell-span':'']" :style="{'-webkit-line-clamp': 5}">
{{ scope.row.punishReason }}
<span v-if="isOverHiddenFlag(scope.data.width, showList, scope.index, 0, scope.row.punishReason)" @click="changeShowAll(scope.index, 0)">...<span style="color: #0081FF;">更多</span></span>
</span>
</template>
</tables>
......@@ -34,7 +34,7 @@ import mixin from '../mixins/mixin'
import {
penalizePage,
penalizeReasonType
} from '@/api/riskInformation/punish'
} from '@/api/detail/party-a/riskInformation'
export default {
name: 'Punish',
mixins: [mixin],
......@@ -44,7 +44,7 @@ export default {
data() {
return {
queryParams: {
cid: 6034,
cid: 382724726,
pageNum: 1,
pageSize: 10
},
......@@ -58,14 +58,7 @@ export default {
{label: '处罚结束日期', prop: 'dataId', width: '100'},
],
formData: [
{ type: 1, fieldName: 'penalizeReasonType', value: '', placeholder: '处罚类别',
options: [
{ name: '处罚类别1', value: '1' },
{ name: '处罚类别2', value: '2' },
{ name: '处罚类别3', value: '3' },
{ name: '处罚类别4', value: '4' }
]
},
{ type: 1, fieldName: 'penalizeReasonType', value: '', placeholder: '处罚类别', options: []},
{ type: 3, fieldName: 'keys', value: '', placeholder: '请输入关键词', options: []},
],
//列表
......@@ -86,20 +79,20 @@ export default {
}
},
created() {
this.dataRegion()
this.getList()
this.penalizeReasonTypeData()
},
computed: {
},
methods: {
async dataRegion() {
getList() {
penalizePage(this.queryParams).then((res) => {
console.log(res)
console.log(res.data.rows)
})
},
penalizeReasonTypeData(){
penalizeReasonType({cid:6034}).then((res) => {
penalizeReasonType({cid:this.queryParams.cid}).then((res) => {
console.log(res)
})
},
......@@ -136,9 +129,7 @@ export default {
::v-deep .el-form-item{
margin-right: 8px !important;
}
::v-deep .el-table__body tr.current-row > td.el-table__cell{
background-color: #ffffff;
}
.query-box{
margin: 10px 0 20px;
}
......
......@@ -22,6 +22,10 @@
</template>
<script>
import {
landTransactionPage,
landUse
} from '@/api/detail/party-a/urbanLnvestment'
import mixin from '../mixins/mixin'
export default {
name: 'landAcquisition',
......@@ -32,7 +36,8 @@ export default {
data() {
return {
queryParams: {
cid: 6034,
cid: 3068,
sort: 3,
pageNum: 1,
pageSize: 10
},
......@@ -48,54 +53,40 @@ export default {
{label: '签订日期', prop: 'dataId', width: '120'}
],
formData: [
{ type: 4, fieldName: 'penalizeReasonType', value: [], placeholder: '土地用途',
options: [
{ name: '处罚类别1', value: '1' },
{ name: '处罚类别2', value: '2' },
{ name: '处罚类别3', value: '3' },
{ name: '处罚类别4', value: '4' }
]
},
{ type: 4, fieldName: 'landUse', value: [], placeholder: '土地用途', options: []},
{ type: 3, fieldName: 'keys', value: '', placeholder: '请输入关键词', options: []},
],
//列表
tableLoading:false,
tableData:[],
pageIndex:1,
pageSize:10,
tableDataTotal:0,
}
},
created() {
this.dataRegion()
this.getList()
this.getlandUse()
},
computed: {
},
methods: {
async dataRegion() {
// await axios.post("https://files.jiansheku.com/file/json/common/dataRegion.json", {}, {
// headers: {
// 'Content-Type': 'application/json'
// }
// }).then(res => {
// if (res.data.code == 200) {
// console.log(res.data.data)
// }
// })
getList() {
this.tableLoading = true
landTransactionPage(this.queryParams).then(res=>{
this.tableData = res.data
this.tableDataTotal = res.data.total
this.tableLoading = false
})
},
handleQuery() {
},
resetQuery() {
handleQuery(params) {
console.log(params)
},
//分页
handleCurrentChange(e){
},
handleSizeChange(e){
//土地用途
getlandUse(){
landUse({cid: this.queryParams.cid}).then(res=>{
console.log(res)
// this.formData[0].options = res.data
})
}
}
}
......
......@@ -24,6 +24,9 @@
</template>
<script>
import {
regionalEconomy
} from '@/api/detail/party-a/urbanLnvestment'
export default {
name: 'regionalEconomies',
components: {
......@@ -31,47 +34,14 @@ export default {
},
data() {
return {
tableData: [
{
zb:"2023年",
gdp:'129,118.58',
gdpzs:'124,369.67',
rjgdp:'134,369.67',
},
{
zb:"2022年",
gdp:'129,118.58',
gdpzs:'124,369.67',
rjgdp:'134,369.67',
},
{
zb:"2021年",
gdp:'129,118.58',
gdpzs:'124,369.67',
rjgdp:'134,369.67',
},
{
zb:"2020年",
gdp:'129,118.58',
gdpzs:'124,369.67',
rjgdp:'134,369.67',
},
{
zb:"2019年",
gdp:'129,118.58',
gdpzs:'124,369.67',
rjgdp:'134,369.67',
},
{
zb:"2018年",
gdp:'129,118.58',
gdpzs:'124,369.67',
rjgdp:'134,369.67',
},
],
params: {
provinceId: 500000,
cityId: 500100
},
tableData: [],
headers: [
{
prop: 'zb',
prop: 'year',
label: '指标',
},
{
......@@ -83,51 +53,51 @@ export default {
label: 'GDP(亿元)',
},
{
prop: 'gdpzs',
prop: 'gdpGrowth',
label: 'GDP增速',
},
{
prop: 'rjgdp',
prop: 'gdpPerCapita',
label: '人均GDP(元)',
},
{
prop: 'rjgdp',
prop: 'piAddValue',
label: '第一产业增加值(亿元)',
},
{
prop: 'rjgdp',
prop: 'siAddValue',
label: '第二产业增加值(亿元)',
},
{
prop: 'rjgdp',
prop: 'tiAddValue',
label: '第三产业增加值(亿元)',
},
{
prop: 'rjgdp',
prop: 'population',
label: '人口(万人)',
},
{
prop: 'rjgdp',
prop: 'industryAddValue',
label: '工业增加值(亿元)',
},
{
prop: 'rjgdp',
prop: 'industryTotalValue',
label: '工业总产值(亿元)',
},
{
prop: 'rjgdp',
prop: 'realEstateInvestment',
label: '房地产开发投资(亿元)',
},
{
prop: 'rjgdp',
prop: 'eximTotalValue',
label: '进出口总额(亿美元)',
},
{
prop: 'rjgdp',
prop: 'trscg',
label: '社会消费品零售总额(亿元)',
},
{
prop: 'rjgdp',
prop: 'urbanPcdi',
label: '城镇居民人均可支配收入(元)',
},
{
......@@ -135,47 +105,47 @@ export default {
label: '财政',
},
{
prop: 'rjgdp',
prop: 'gbr',
label: '一般公共预算收入(亿元)',
},
{
prop: 'rjgdp',
label: '般公共预算收入增速',
prop: 'gbrGrowth',
label: '般公共预算收入增速',
},
{
prop: 'rjgdp',
prop: 'taxIncome',
label: '税收收入(亿元)',
},
{
prop: 'rjgdp',
prop: 'transferIncome',
label: '转移性收入(亿元)',
},
{
prop: 'rjgdp',
prop: 'superiorSubsidyIncome',
label: '上级补助收入(亿元)',
},
{
prop: 'rjgdp',
prop: 'gbe',
label: '一般公共预算支出(亿元)',
},
{
prop: 'rjgdp',
prop: 'govFundIncome',
label: '政府性基金收入(亿元)',
},
{
prop: 'rjgdp',
prop: 'landTransferIncome',
label: '土地出让收入(亿元)',
},
{
prop: 'rjgdp',
prop: 'govFundExpenditure',
label: '政府性基金支出(亿元)',
},
{
prop: 'rjgdp',
prop: 'soecoi',
label: '国有资本经营收入(亿元)',
},
{
prop: 'rjgdp',
prop: 'soecoe',
label: '国有资本经营支出(亿元)',
},
{
......@@ -183,49 +153,50 @@ export default {
label: '债务',
},
{
prop: 'rjgdp',
prop: 'govDebtBalance',
label: '地方政府债务余额(亿元)',
},
{
prop: 'rjgdp',
prop: 'generalDebtBalance',
label: '一般债余额(亿元)',
},
{
prop: 'rjgdp',
prop: 'specialDebtBalance',
label: '专项债余额(亿元)',
},
{
prop: 'rjgdp',
prop: 'govDebtLimit',
label: '地方政府债务限额(亿元)',
},
{
prop: 'rjgdp',
prop: 'uipInterestBearingDebt',
label: '城投平台有息债务(亿元)',
},
{
prop: 'rjgdp',
prop: 'fiscalSelfSufficiencyRate',
label: '财政自给率',
},
{
prop: 'rjgdp',
prop: 'govDebtToGdpRate',
label: '负债率',
},
{
prop: 'rjgdp',
prop: 'govDebtToGdpRateWild',
label: '负债率-宽口径',
},
{
prop: 'rjgdp',
prop: 'govDebtRate',
label: '债务率',
},
{
prop: 'rjgdp',
prop: 'govDebtRateWild',
label: '债务率-宽口径',
},
],
}
},
created() {
console.log(11)
this.dataRegion()
},
computed: {
......@@ -240,16 +211,10 @@ export default {
},
methods: {
//地区
async dataRegion() {
// await axios.post("https://files.jiansheku.com/file/json/common/dataRegion.json", {}, {
// headers: {
// 'Content-Type': 'application/json'
// }
// }).then(res => {
// if (res.data.code == 200) {
// console.log(res.data.data)
// }
// })
dataRegion() {
regionalEconomy(this.params).then(res => {
this.tableData = res.data
})
},
}
}
......
......@@ -17,7 +17,11 @@
:queryParams="queryParams"
@handle-current-change="handleCurrentChange"
@sort-change="sortChange"
/>
>
<template slot="companyName" slot-scope="data">
<router-link :to="''+ data.row.companyId" style="color: #0081FF">{{ data.row.companyName }}</router-link>
</template>
</tables>
</div>
</template>
......@@ -25,6 +29,9 @@
<script>
import mixin from '../mixins/mixin'
import dataRegion from '@/assets/json/dataRegion'
import {
urbanInvestmentPage
} from '@/api/detail/party-a/urbanLnvestment'
export default {
name: 'SameRegion',
mixins: [mixin],
......@@ -34,21 +41,36 @@ export default {
data() {
return {
queryParams: {
cid: 6034,
provinceId: 500000,
cityId: 500100,
pageNum: 1,
pageSize: 10
pageSize: 15
},
forData: [
{label: '企业名称', prop: 'punishReason'},
{label: '成员层级', prop: 'punishBegin', width: '120'},
{label: '法定代表人', prop: 'punishResult', width: '120'},
{label: '注册资本', prop: 'fileNum', width: '120', sortable:true},
{label: '成立日期', prop: 'cgrdm', width: '120', sortable:true},
{label: '实控人控股', prop: 'office', width: '130', sortable:true},
{label: '行业类型', prop: 'dataId', width: '120'},
{label: '所属省', prop: 'dataId', width: '120'},
{label: '所属市', prop: 'dataId', width: '120'},
{label: '所属区/县', prop: 'dataId', width: '120'}
{label: '企业名称', prop: 'companyName', width: '369', slot: true},
{label: '区域', prop: 'area', width: '100'},
{label: '主体评级', prop: 'bratingSubjectLevel', width: '110'},
{label: '债劵余额(亿元)', prop: 'bondBalance', width: '130'},
{label: '行政级别', prop: 'uipExecutiveLevel', width: '120'},
{label: '股东背景', prop: 'shareholderBg', width: '120'},
{label: '股权关系', prop: 'equityRelationship', width: '120'},
{label: '平台重要性', prop: 'platformImportance', width: '120'},
{label: '城投业务类型', prop: 'uipBusinessType', width: '120'},
{label: '实控人', prop: 'actualController', width: '280'},
{label: '最新报告期', prop: 'latestReportPeriod', width: '120'},
{label: '总资产(亿元)', prop: 'totalAssets', width: '120'},
{label: '归母净资产(亿元)', prop: 'belongNetAssets', width: '140'},
{label: '货币资金(亿元)', prop: 'monetaryFunds', width: '130'},
{label: '土地资产(亿元)', prop: 'landAssets', width: '130'},
{label: '受限资产(亿元)', prop: 'restrictedAssets', width: '130'},
{label: '应收账款(亿元)', prop: 'accountsReceivable', width: '130'},
{label: '其他应收款(亿元)', prop: 'otherReceivable', width: '140'},
{label: '公益性&准公益性主营占比(%)', prop: 'econData001', width: '200'},
{label: '应收类款项来自政府占比(%)', prop: 'receivableFromGovRatio', width: '200'},
{label: '政府补助(亿元)', prop: 'govSubsidy', width: '130'},
{label: '专项应付款(亿元)', prop: 'specialPayable', width: '140'},
{label: '营业收入(亿元)', prop: 'operatingIncome', width: '130'},
{label: '所属开发区', prop: 'developmentZone', width: '120'}
],
formData: [
{ type: 1, fieldName: 'penalizeReasonType', value: '', placeholder: '筛选',
......@@ -68,13 +90,13 @@ export default {
}
},
created() {
this.dataRegion()
this.handleQuery()
},
computed: {
},
methods: {
async dataRegion() {
dataRegion() {
// await axios.post("https://files.jiansheku.com/file/json/common/dataRegion.json", {}, {
// headers: {
// 'Content-Type': 'application/json'
......@@ -126,18 +148,14 @@ export default {
}
this.addressList = str;
},
handleQuery() {
},
resetQuery() {
},
//分页
handleCurrentChange(e){
},
handleSizeChange(e){
handleQuery(params){
this.tableLoading = true
let data = params ? params : this.queryParams
urbanInvestmentPage(data).then(res => {
this.tableData = res.data.list
this.tableDataTotal = res.data.totalCount
this.tableLoading = false
})
}
}
}
......
......@@ -15,13 +15,13 @@ export default {
loading: false, // 是否加载中
iframeHight: window.innerHeight, // iframe高度
scrollTop: 0, // 滚动条距离内部页面顶部距离
token: this.$store.getters.token // 需要携带的token
secretid: '' // 需要携带的sdkId
}
},
created() {
if (this.$route.query.companyId) { // 获取companyId
this.loading = true
this.src = `https://pre-plug.jiansheku.com/enterprise/${this.$route.query.companyId}?token=${this.token}`
this.src = `https://pre-plug.jiansheku.com/enterprise/${this.$route.query.companyId}?secretid=${this.secretid}`
}
},
mounted() {
......
<template>
<div class="app-container">
<iframe :src="strucUrl" scrolling="no" frameborder="0" :style="{ width: '100%', height: strucHeight + 'px' }" v-if="strucUrl"></iframe>
</div>
</template>
<script>
import { getToken } from '@/utils/auth'
import md5 from 'js-md5'
export default {
name: 'Structure',
data() {
return {
BASE_LT: 'https://b-plugin.qixin.com/third-login?tenant=dsk&returnUrl=/standalone-charts',
eid: '',
strucHeight: 0,
strucUrl: '',
token: getToken()
}
},
created() {
if(this.$route.query.eid){
if(this.$route.query.typeId==5){
this.strucUrl = this.BASE_LT+'/structure?eid='+this.$route.query.eid+'&name='+this.token+'&pas='+md5(this.token)
}else if(this.$route.query.typeId==6){
this.strucUrl = this.BASE_LT+'/relationship?eid='+this.$route.query.eid+'&name='+this.token+'&pas='+md5(this.token)
}
}
},
mounted(){
this.getIframeHeight()
},
methods: {
//iframe高度
getIframeHeight(){
this.strucHeight = document.body.clientHeight
},
}
}
</script>
<style lang="scss" scoped>
</style>
<template>
<div class="app-container home">
<el-row :gutter="20">
<el-col :sm="24" :lg="24">
<blockquote class="text-warning" style="font-size: 14px">
领取阿里云通用云产品1888优惠券
<br />
<el-link
href="https://www.aliyun.com/minisite/goods?userCode=brki8iof"
type="primary"
target="_blank"
>https://www.aliyun.com/minisite/goods?userCode=brki8iof</el-link
>
<br />
领取腾讯云通用云产品2860优惠券
<br />
<el-link
href="https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console"
type="primary"
target="_blank"
>https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console</el-link
>
<br />
阿里云服务器折扣区
<el-link href="http://aly.ruoyi.vip" type="primary" target="_blank"
>>☛☛点我进入☚☚</el-link
>
&nbsp;&nbsp;&nbsp; 腾讯云服务器秒杀区
<el-link href="http://txy.ruoyi.vip" type="primary" target="_blank"
>>☛☛点我进入☚☚</el-link
><br />
<h4 class="text-danger">
云产品通用红包,可叠加官网常规优惠使用。(仅限新用户)
</h4>
</blockquote>
<hr />
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :sm="24" :lg="12" style="padding-left: 20px">
<h2>央企后台经营管理框架</h2>
<p>
一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适自己的。于是利用空闲休息时间开始自己写一套后台系统。如此有了央企经营系统,她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA等等,当然,您也可以对她进行深度定制,以做出更强系统。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。
</p>
<p>
<b>当前版本:</b> <span>v{{ version }}</span>
</p>
<p>
<el-tag type="danger">&yen;免费开源</el-tag>
</p>
<p>
<el-button
type="primary"
size="mini"
icon="el-icon-cloudy"
plain
@click="goTarget('https://gitee.com/y_project/RuoYi-Vue')"
>访问码云</el-button
>
<el-button
size="mini"
icon="el-icon-s-home"
plain
@click="goTarget('http://ruoyi.vip')"
>访问主页</el-button
>
</p>
</el-col>
<el-col :sm="24" :lg="12" style="padding-left: 50px">
<el-row>
<el-col :span="12">
<h2>技术选型</h2>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<h4>后端技术</h4>
<ul>
<li>SpringBoot</li>
<li>Spring Security</li>
<li>JWT</li>
<li>MyBatis</li>
<li>Druid</li>
<li>Fastjson</li>
<li>...</li>
</ul>
</el-col>
<el-col :span="6">
<h4>前端技术</h4>
<ul>
<li>Vue</li>
<li>Vuex</li>
<li>Element-ui</li>
<li>Axios</li>
<li>Sass</li>
<li>Quill</li>
<li>...</li>
</ul>
</el-col>
</el-row>
</el-col>
</el-row>
<el-divider />
<el-row :gutter="20">
<el-col :xs="24" :sm="24" :md="12" :lg="8">
<el-card class="update-log">
<div slot="header" class="clearfix">
<span>联系信息</span>
<el-col :span="18">
<div class="content-left">
<div class="task-wrap">
<div class="item">
<img class="left" src="@/assets/images/index/icon1.png"/>
<div class="right">
<p class="title">即将开标项目</p>
<p class="number">36</p>
<p class="compare">较上月 <span class="up">+3<img src="@/assets/images/index/up.png"/></span></p>
</div>
</div>
<div class="item">
<img class="left" src="@/assets/images/index/icon2.png"/>
<div class="right">
<p class="title">重点关注项目</p>
<p class="number">36</p>
<p class="compare">较上月 <span class="up">+3<img src="@/assets/images/index/up.png"/></span></p>
</div>
</div>
<div class="item">
<img class="left" src="@/assets/images/index/icon3.png"/>
<div class="right">
<p class="title">重点关注客户</p>
<p class="number">36</p>
<p class="compare">较上月 <span class="down">-3<img src="@/assets/images/index/down.png"/></span></p>
</div>
</div>
<div class="item">
<img class="left" src="@/assets/images/index/icon4.png"/>
<div class="right">
<p class="title">储备合作客户</p>
<p class="number">36</p>
<p class="compare">较上月 <span class="up">+3<img src="@/assets/images/index/up.png"/></span></p>
</div>
</div>
<div class="item add">
<span class="yd"><i></i><i></i><i></i><i></i><i></i><i></i></span>
<div class="btn"><i class="el-icon-plus"></i>新建待办任务</div>
</div>
</div>
<div class="body">
<p>
<i class="el-icon-s-promotion"></i> 官网:<el-link
href="http://www.ruoyi.vip"
target="_blank"
>http://www.ruoyi.vip</el-link
>
</p>
<p>
<i class="el-icon-user-solid"></i> QQ群:<s> 满937441 </s> <s> 满887144332 </s>
<s> 满180251782 </s> <s> 满104180207 </s> <s> 满186866453 </s> <s> 满201396349 </s>
<s> 满101456076 </s> <s> 满101539465 </s> <s> 满264312783 </s> <s> 满167385320 </s>
<s> 满104748341 </s> <s> 满160110482 </s> <s> 满170801498 </s> <s> 满108482800 </s>
<s> 满101046199 </s> <a href="https://jq.qq.com/?_wv=1027&k=tKEt51dz" target="_blank">136919097</a>
</p>
<p>
<i class="el-icon-chat-dot-round"></i> 微信:<a
href="javascript:;"
>/ *若依</a
>
</p>
<p>
<i class="el-icon-money"></i> 支付宝:<a
href="javascript:;"
class="支付宝信息"
>/ *若依</a
>
</p>
<!--经理视角-->
<div v-if="user === 1" class="content-wrap">
<el-col :span="12">
<div class="record">
<div class="flex-box query-box">
<div class="flex-box query-params">
<span class="common-title">跟进记录</span>
</div>
<div class="flex-box query-ability">
<div class="area">西南地区<i class="el-icon-caret-bottom"></i></div>
<div class="month">不限<i class="el-icon-caret-bottom"></i></div>
</div>
</div>
<div class="list">
<div class="item" v-for="(item,index) in gjjlData" :key="index">
<h3>{{item.title}}</h3>
<p>
<span>跟进人:{{item.user}}</span>
<span>关联企业:{{item.name}}</span>
</p>
</div>
</div>
<p class="more">更多跟进记录 ></p>
</div>
</el-col>
<el-col :span="12">
<div class="ranking">
<div class="flex-box query-box">
<div class="flex-box query-params">
<span class="common-title">业绩排名</span>
</div>
<div class="flex-box query-ability">
<div class="area">西南地区<i class="el-icon-caret-bottom"></i></div>
<div class="month">不限<i class="el-icon-caret-bottom"></i></div>
</div>
</div>
<div class="main">
<div class="amount">
<p>
<span>产值目标(万元)</span>
<span>实际已完成(万元)</span>
</p>
<p>
<span class="money">359,800.00</span>
<span class="money">359,800.00</span>
</p>
<el-progress :text-inside="true" :stroke-width="10" :percentage="70"></el-progress>
</div>
<div style="background: #ffffff;margin: 0 12px 12px 12px;">
<div id="pm-echarts" style="height: 288px;"></div>
</div>
</div>
</div>
</el-col>
</div>
</el-card>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="8">
<el-card class="update-log">
<div slot="header" class="clearfix">
<span>更新日志</span>
<div v-if="user === 1" class="analysis">
<div class="flex-box query-box">
<div class="flex-box query-params">
<span class="common-title">经营分析</span>
</div>
<div class="flex-box query-ability">
<div class="tabs">
<div class="label" v-for="(item,index) in typeList" :class="typeIndex === index ? 'color':''" @click="handleClick(index)">{{item.name}}</div>
</div>
<div class="area">西南地区<i class="el-icon-caret-bottom"></i></div>
</div>
</div>
<div>
<div id="fx-echarts" style="height: 200px;"></div>
</div>
</div>
<el-collapse accordion>
<el-collapse-item title="v3.8.5 - 2023-01-01">
<ol>
<li>定时任务违规的字符</li>
<li>重置时取消部门选中</li>
<li>新增返回警告消息提示</li>
<li>忽略不必要的属性数据返回</li>
<li>修改参数键名时移除前缓存配置</li>
<li>导入更新用户数据前校验数据权限</li>
<li>兼容Excel下拉框内容过多无法显示的问题</li>
<li>升级echarts到最新版本5.4.0</li>
<li>升级core-js到最新版本3.25.3</li>
<li>升级oshi到最新版本6.4.0</li>
<li>升级kaptcha到最新版2.3.3</li>
<li>升级druid到最新版本1.2.15</li>
<li>升级fastjson到最新版2.0.20</li>
<li>升级pagehelper到最新版1.4.6</li>
<li>优化弹窗内容过多展示不全问题</li>
<li>优化swagger-ui静态资源使用缓存</li>
<li>开启TopNav没有子菜单隐藏侧边栏</li>
<li>删除fuse无效选项maxPatternLength</li>
<li>优化导出对象的子列表为空会出现[]问题</li>
<li>优化编辑头像时透明部分会变成黑色问题</li>
<li>优化小屏幕上修改头像界面布局错位的问题</li>
<li>修复代码生成勾选属性无效问题</li>
<li>修复文件上传组件格式验证问题</li>
<li>修复回显数据字典数组异常问题</li>
<li>修复sheet超出最大行数异常问题</li>
<li>修复Log注解GET请求记录不到参数问题</li>
<li>修复调度日志点击多次数据不变化的问题</li>
<li>修复主题颜色在Drawer组件不会加载问题</li>
<li>修复文件名包含特殊字符的文件无法下载问题</li>
<li>修复table中更多按钮切换主题色未生效修复问题</li>
<li>修复某些特性的环境生成代码变乱码TXT文件问题</li>
<li>修复代码生成图片/文件/单选时选择必填无法校验问题</li>
<li>修复某些特性的情况用户编辑对话框中角色和部门无法修改问题</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.8.4 - 2022-09-26">
<ol>
<li>数据逻辑删除不进行唯一验证</li>
<li>Excel注解支持导出对象的子列表方法</li>
<li>Excel注解支持自定义隐藏属性列</li>
<li>Excel注解支持backgroundColor属性设置背景色</li>
<li>支持配置密码最大错误次数/锁定时间</li>
<li>登录日志新增解锁账户功能</li>
<li>通用下载方法新增config配置选项</li>
<li>支持多权限字符匹配角色数据权限</li>
<li>页面内嵌iframe切换tab不刷新数据</li>
<li>操作日志记录支持排除敏感属性字段</li>
<li>修复多文件上传报错出现的异常问题</li>
<li>修复图片预览组件src属性为null值控制台报错问题</li>
<li>升级oshi到最新版本6.2.2</li>
<li>升级fastjson到最新版2.0.14</li>
<li>升级pagehelper到最新版1.4.3</li>
<li>升级core-js到最新版本3.25.2</li>
<li>升级element-ui到最新版本2.15.10</li>
<li>优化任务过期不执行调度</li>
<li>优化字典数据使用store存取</li>
<li>优化修改资料头像被覆盖的问题</li>
<li>优化修改用户登录账号重复验证</li>
<li>优化代码生成同步后值NULL问题</li>
<li>优化定时任务支持执行父类方法</li>
<li>优化用户个人信息接口防止修改部门</li>
<li>优化布局设置使用el-drawer抽屉显示</li>
<li>优化没有权限的用户编辑部门缺少数据</li>
<li>优化日志注解记录限制请求地址的长度</li>
<li>优化excel/scale属性导出单元格数值类型</li>
<li>优化日志操作中重置按钮时重复查询的问题</li>
<li>优化多个相同角色数据导致权限SQL重复问题</li>
<li>优化表格上右侧工具条(搜索按钮显隐&右侧样式凸出)</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.8.3 - 2022-06-27">
<ol>
<li>新增缓存列表菜单功能</li>
<li>代码生成树表新增(展开/折叠)</li>
<li>Excel注解支持color字体颜色</li>
<li>新增Anonymous匿名访问不鉴权注解</li>
<li>用户头像上传限制只能为图片格式</li>
<li>接口使用泛型使其看到响应属性字段</li>
<li>检查定时任务bean所在包名是否为白名单配置</li>
<li>添加页签openPage支持传递参数</li>
<li>用户缓存信息添加部门ancestors祖级列表</li>
<li>升级element-ui到最新版本2.15.8</li>
<li>升级oshi到最新版本6.1.6</li>
<li>升级druid到最新版本1.2.11</li>
<li>升级fastjson到最新版2.0.8</li>
<li>升级spring-boot到最新版本2.5.14</li>
<li>降级jsencrypt版本兼容IE浏览器</li>
<li>删除多余的salt字段</li>
<li>新增获取不带后缀文件名称方法</li>
<li>新增获取配置文件中的属性值方法</li>
<li>新增内容编码/解码方便插件集成使用</li>
<li>字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)</li>
<li>优化设置分页参数默认值</li>
<li>优化对空字符串参数处理的过滤</li>
<li>优化显示顺序orderNum类型为整型</li>
<li>优化表单构建按钮不显示正则校验</li>
<li>优化字典数据回显样式下拉框显示值</li>
<li>优化R响应成功状态码与全局保持一致</li>
<li>优化druid开启wall过滤器出现的异常问题</li>
<li>优化用户管理左侧树型组件增加选中高亮保持</li>
<li>优化新增用户与角色信息&用户与岗位信息逻辑</li>
<li>优化默认不启用压缩文件缓存防止node_modules过大</li>
<li>修复字典数据显示不全问题</li>
<li>修复操作日志查询类型条件为0时会查到所有数据</li>
<li>修复Excel注解prompt/combo同时使用不生效问题</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.8.2 - 2022-04-01">
<ol>
<li>前端支持设置是否需要防止数据重复提交</li>
<li>开启TopNav没有子菜单情况隐藏侧边栏</li>
<li>侧边栏菜单名称过长悬停显示标题</li>
<li>用户访问控制时校验数据权限,防止越权</li>
<li>导出Excel时屏蔽公式,防止CSV注入风险</li>
<li>组件ImagePreview支持多图预览显示</li>
<li>组件ImageUpload支持多图同时选择上传</li>
<li>组件FileUpload支持多文件同时选择上传</li>
<li>服务监控新增运行参数信息显示</li>
<li>定时任务目标字符串过滤特殊字符</li>
<li>定时任务目标字符串验证包名白名单</li>
<li>代码生成列表图片支持预览</li>
<li>代码生成编辑修改打开新页签</li>
<li>代码生成新增Java类型Boolean</li>
<li>代码生成子表支持日期/字典配置</li>
<li>代码生成同步保留必填/类型选项</li>
<li>升级oshi到最新版本6.1.2</li>
<li>升级fastjson到最新版1.2.80</li>
<li>升级pagehelper到最新版1.4.1</li>
<li>升级spring-boot到最新版本2.5.11</li>
<li>升级spring-boot-mybatis到最新版2.2.2</li>
<li>添加遗漏的分页参数合理化属性</li>
<li>修改npm即将过期的注册源地址</li>
<li>修复分页组件请求两次问题</li>
<li>修复通用文件下载接口跨域问题</li>
<li>修复Xss注解字段值为空时的异常问题</li>
<li>修复选项卡点击右键刷新丢失参数问题</li>
<li>修复表单清除元素位置未垂直居中问题</li>
<li>修复服务监控中运行参数显示条件错误</li>
<li>修复导入Excel时字典字段类型为Long转义为空问题</li>
<li>修复登录超时刷新页面跳转登录页面还提示重新登录问题</li>
<li>优化加载字典缓存数据</li>
<li>优化IP地址获取到多个的问题</li>
<li>优化任务队列满时任务拒绝策略</li>
<li>优化文件上传兼容Weblogic环境</li>
<li>优化定时任务默认保存到内存中执行</li>
<li>优化部门修改缩放后出现的错位问题</li>
<li>优化Excel格式化不同类型的日期对象</li>
<li>优化菜单表关键字导致的插件报错问题</li>
<li>优化Oracle用户头像列为空时不显示问题</li>
<li>优化页面若未匹配到字典标签则返回原字典值</li>
<li>优化修复登录失效后多次请求提示多次弹窗问题</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.8.1 - 2022-01-01">
<ol>
<li>新增Vue3前端代码生成模板</li>
<li>新增图片预览组件</li>
<li>新增压缩插件实现打包Gzip</li>
<li>自定义xss校验注解实现</li>
<li>自定义文字复制剪贴指令</li>
<li>代码生成预览支持复制内容</li>
<li>路由支持单独配置菜单或角色权限</li>
<li>用户管理部门查询选择节点后分页参数初始</li>
<li>修复用户分配角色属性错误</li>
<li>修复打包后字体图标偶现的乱码问题</li>
<li>修复菜单管理重置表单出现的错误</li>
<li>修复版本差异导致的懒加载报错问题</li>
<li>修复Cron组件中周回显问题</li>
<li>修复定时任务多参数逗号分隔的问题</li>
<li>修复根据ID查询列表可能出现的主键溢出问题</li>
<li>修复tomcat配置参数已过期问题</li>
<li>升级clipboard到最新版本2.0.8</li>
<li>升级oshi到最新版本v5.8.6</li>
<li>升级fastjson到最新版1.2.79</li>
<li>升级spring-boot到最新版本2.5.8</li>
<li>升级log4j2到2.17.1,防止漏洞风险</li>
<li>优化下载解析blob异常提示</li>
<li>优化代码生成字典组重复问题</li>
<li>优化查询用户的角色组&岗位组代码</li>
<li>优化定时任务cron表达式小时设置24</li>
<li>优化用户导入提示溢出则显示滚动条</li>
<li>优化防重复提交标识组合为(key+url+header)</li>
<li>优化分页方法设置成通用方便灵活调用</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.8.0 - 2021-12-01">
<ol>
<li>新增配套并同步的Vue3前端版本</li>
<li>新增通用方法简化模态/缓存/下载/权限/页签使用</li>
<li>优化导出数据/使用通用下载方法</li>
<li>Excel注解支持自定义数据处理器</li>
<li>Excel注解支持导入导出标题信息</li>
<li>Excel导入支持@Excels注解</li>
<li>新增组件data-dict,简化数据字典使用</li>
<li>新增Jaxb依赖,防止jdk8以上出现的兼容错误</li>
<li>生产环境使用路由懒加载提升页面响应速度</li>
<li>修复五级以上菜单出现的404问题</li>
<li>防重提交注解支持配置间隔时间/提示消息</li>
<li>日志注解新增是否保存响应参数</li>
<li>任务屏蔽违规字符&参数忽略双引号中的逗号</li>
<li>升级SpringBoot到最新版本2.5.6</li>
<li>升级pagehelper到最新版1.4.0</li>
<li>升级spring-boot-mybatis到最新版2.2.0</li>
<li>升级oshi到最新版本v5.8.2</li>
<li>升级druid到最新版1.2.8</li>
<li>升级velocity到最新版本2.3</li>
<li>升级fastjson到最新版1.2.78</li>
<li>升级axios到最新版本0.24.0</li>
<li>升级dart-sass到版本1.32.13</li>
<li>升级core-js到最新版本3.19.1</li>
<li>升级jsencrypt到最新版本3.2.1</li>
<li>升级js-cookie到最新版本3.0.1</li>
<li>升级file-saver到最新版本2.0.5</li>
<li>升级sass-loader到最新版本10.1.1</li>
<li>升级element-ui到最新版本2.15.6</li>
<li>新增sendGet无参请求方法</li>
<li>禁用el-tag组件的渐变动画</li>
<li>代码生成点击预览重置激活tab</li>
<li>AjaxResult重写put方法,以方便链式调用</li>
<li>优化登录/验证码请求headers不设置token</li>
<li>优化用户个人信息接口防止修改用户名</li>
<li>优化Cron表达式生成器关闭时销毁避免缓存</li>
<li>优化注册成功提示消息类型success</li>
<li>优化aop语法,使用spring自动注入注解</li>
<li>优化记录登录信息,移除不必要的修改</li>
<li>优化mybatis全局默认的执行器</li>
<li>优化Excel导入图片可能出现的异常</li>
<li>修复代码生成模板主子表删除缺少事务</li>
<li>修复日志记录可能出现的转换异常</li>
<li>修复代码生成复选框字典遗漏问题</li>
<li>修复关闭xss功能导致可重复读RepeatableFilter失效</li>
<li>修复字符串无法被反转义问题</li>
<li>修复后端主子表代码模板方法名生成错误问题</li>
<li>修复xss过滤后格式出现的异常</li>
<li>修复swagger没有指定dataTypeClass导致启动出现warn日志</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.7.0 - 2021-09-13">
<ol>
<li>参数管理支持配置验证码开关</li>
<li>新增是否开启用户注册功能</li>
<li>定时任务支持在线生成cron表达式</li>
<li>菜单管理支持配置路由参数</li>
<li>支持自定义注解实现接口限流</li>
<li>Excel注解支持Image图片导入</li>
<li>自定义弹层溢出滚动样式</li>
<li>自定义可拖动弹窗宽度指令</li>
<li>自定义可拖动弹窗高度指令</li>
<li>修复任意账户越权问题</li>
<li>修改时检查用户数据权限范围</li>
<li>修复保存配置主题颜色失效问题</li>
<li>新增暗色菜单风格主题</li>
<li>菜单&部门新增展开/折叠功能</li>
<li>页签新增关闭左侧&添加图标</li>
<li>顶部菜单排除隐藏的默认路由</li>
<li>顶部菜单同步系统主题样式</li>
<li>跳转路由高亮相对应的菜单栏</li>
<li>代码生成主子表多选行数据</li>
<li>日期范围支持添加多组</li>
<li>升级element-ui到最新版本2.15.5</li>
<li>升级oshi到最新版本v5.8.0</li>
<li>升级commons.io到最新版本v2.11.0</li>
<li>定时任务屏蔽ldap远程调用</li>
<li>定时任务屏蔽http(s)远程调用</li>
<li>补充定时任务表字段注释</li>
<li>定时任务对检查异常进行事务回滚</li>
<li>启用父部门状态排除顶级节点</li>
<li>富文本新增上传文件大小限制</li>
<li>默认首页使用keep-alive缓存</li>
<li>修改代码生成字典回显样式</li>
<li>自定义分页合理化传入参数</li>
<li>修复字典组件值为整形不显示问题</li>
<li>修复定时任务日志执行状态显示</li>
<li>角色&菜单新增字段属性提示信息</li>
<li>修复角色分配用户页面参数类型错误提醒</li>
<li>优化布局设置动画特效</li>
<li>优化异常处理信息</li>
<li>优化错误token导致的解析异常</li>
<li>密码框新增显示切换密码图标</li>
<li>定时任务新增更多操作</li>
<li>更多操作按钮添加权限控制</li>
<li>导入用户样式优化</li>
<li>提取通用方法到基类控制器</li>
<li>优化使用权限工具获取用户信息</li>
<li>优化用户不能删除自己</li>
<li>优化XSS跨站脚本过滤</li>
<li>优化代码生成模板</li>
<li>验证码默认20s超时</li>
<li>BLOB下载时清除URL对象引用</li>
<li>代码生成导入表按创建时间排序</li>
<li>修复代码生成页面数据编辑保存之后总是跳转第一页的问题</li>
<li>修复带safari浏览器无法格式化utc日期格式yyyy-MM-dd'T'HH:mm:ss.SSS问题</li>
<li>多图上传组件移除多余的api地址&验证失败导致图片删除问题&无法删除相应图片修复</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.6.0 - 2021-07-12">
<ol>
<li>角色管理新增分配用户功能</li>
<li>用户管理新增分配角色功能</li>
<li>日志列表支持排序操作</li>
<li>优化参数&字典缓存操作</li>
<li>系统布局配置支持动态标题开关</li>
<li>菜单路由配置支持内链访问</li>
<li>默认访问后端首页新增提示语</li>
<li>富文本默认上传返回url类型</li>
<li>新增自定义弹窗拖拽指令</li>
<li>全局注册常用通用组件</li>
<li>全局挂载字典标签组件</li>
<li>ImageUpload组件支持多图片上传</li>
<li>FileUpload组件支持多文件上传</li>
<li>文件上传组件添加数量限制属性</li>
<li>富文本编辑组件添加类型属性</li>
<li>富文本组件工具栏配置视频</li>
<li>封装通用iframe组件</li>
<li>限制超级管理员不允许操作</li>
<li>用户信息长度校验限制</li>
<li>分页组件新增pagerCount属性</li>
<li>添加bat脚本执行应用</li>
<li>升级oshi到最新版本v5.7.4</li>
<li>升级element-ui到最新版本2.15.2</li>
<li>升级pagehelper到最新版1.3.1</li>
<li>升级commons.io到最新版本v2.10.0</li>
<li>升级commons.fileupload到最新版本v1.4</li>
<li>升级swagger到最新版本v3.0.0</li>
<li>修复关闭confirm提示框控制台报错问题</li>
<li>修复存在的SQL注入漏洞问题</li>
<li>定时任务屏蔽rmi远程调用</li>
<li>修复用户搜索分页变量错误</li>
<li>修复导出角色数据范围翻译缺少仅本人</li>
<li>修复表单构建选择下拉选择控制台报错问题</li>
<li>优化图片工具类读取文件</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.5.0 - 2021-05-25">
<ol>
<li>新增菜单导航显示风格TopNav(false为左侧导航菜单,true为顶部导航菜单)</li>
<li>布局设置支持保存&重置配置</li>
<li>修复树表数据显示不全&加载慢问题</li>
<li>新增IE浏览器版本过低提示页面</li>
<li>用户登录后记录最后登录IP&时间</li>
<li>页面导出按钮点击之后添加遮罩</li>
<li>富文本编辑器支持自定义上传地址</li>
<li>富文本编辑组件新增readOnly属性</li>
<li>页签TagsView新增关闭右侧功能</li>
<li>显隐列组件加载初始默认隐藏列</li>
<li>关闭头像上传窗口还原默认图片</li>
<li>个人信息添加手机&邮箱重复验证</li>
<li>代码生成模板导出按钮点击后添加遮罩</li>
<li>代码生成模板树表操作列添加新增按钮</li>
<li>代码生成模板修复主子表字段重名问题</li>
<li>升级fastjson到最新版1.2.76</li>
<li>升级druid到最新版本v1.2.6</li>
<li>升级mybatis到最新版3.5.6 阻止远程代码执行漏洞</li>
<li>升级oshi到最新版本v5.6.0</li>
<li>velocity剔除commons-collections版本,防止3.2.1版本的反序列化漏洞</li>
<li>数据监控页默认账户密码防止越权访问</li>
<li>修复firefox下表单构建拖拽会新打卡一个选项卡</li>
<li>修正后端导入表权限标识</li>
<li>修正前端操作日志&登录日志权限标识</li>
<li>设置Redis配置HashKey序列化</li>
<li>删除操作日志记录信息</li>
<li>上传媒体类型添加视频格式</li>
<li>修复请求形参未传值记录日志异常问题</li>
<li>优化xss校验json请求条件</li>
<li>树级结构更新子节点使用replaceFirst</li>
<li>优化ExcelUtil空值处理</li>
<li>日志记录过滤BindingResult对象,防止异常</li>
<li>修改主题后mini类型按钮无效问题</li>
<li>优化通用下载完成后删除节点</li>
<li>通用Controller添加响应返回消息</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.4.0 - 2021-02-22">
<ol>
<li>代码生成模板支持主子表</li>
<li>表格右侧工具栏组件支持显隐列</li>
<li>图片组件添加预览&移除功能</li>
<li>Excel注解支持Image图片导出</li>
<li>操作按钮组调整为朴素按钮样式</li>
<li>代码生成支持文件上传组件</li>
<li>代码生成日期控件区分范围</li>
<li>代码生成数据库文本类型生成表单文本域</li>
<li>用户手机邮箱&菜单组件修改允许空字符串</li>
<li>升级SpringBoot到最新版本2.2.13 提升启动速度</li>
<li>升级druid到最新版本v1.2.4</li>
<li>升级fastjson到最新版1.2.75</li>
<li>升级element-ui到最新版本2.15.0</li>
<li>修复IE11浏览器报错问题</li>
<li>优化多级菜单之间切换无法缓存的问题</li>
<li>修复四级菜单无法显示问题</li>
<li>修正侧边栏静态路由丢失问题</li>
<li>修复角色管理-编辑角色-功能权限显示异常</li>
<li>配置文件新增redis数据库索引属性</li>
<li>权限工具类增加admin判断</li>
<li>角色非自定义权限范围清空选择值</li>
<li>修复导入数据为负浮点数时丢失精度问题</li>
<li>移除path-to-regexp正则匹配插件</li>
<li>修复生成树表代码异常</li>
<li>修改ip字段长度防止ipv6地址长度不够</li>
<li>防止get请求参数值为false或0等特殊值会导致无法正确的传参</li>
<li>登录后push添加catch防止出现检查错误</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.3.0 - 2020-12-14">
<ol>
<li>新增缓存监控功能</li>
<li>支持主题风格配置</li>
<li>修复多级菜单之间切换无法缓存的问题</li>
<li>多级菜单自动配置组件</li>
<li>代码生成预览支持高亮显示</li>
<li>支持Get请求映射Params参数</li>
<li>删除用户和角色解绑关联</li>
<li>去除用户手机邮箱部门必填验证</li>
<li>Excel支持注解align对齐方式</li>
<li>Excel支持导入Boolean型数据</li>
<li>优化头像样式,鼠标移入悬停遮罩</li>
<li>代码生成预览提供滚动机制</li>
<li>代码生成删除多余的数字float类型</li>
<li>修正转换字符串的目标字符集属性</li>
<li>回显数据字典防止空值报错</li>
<li>日志记录增加过滤多文件场景</li>
<li>修改缓存Set方法可能导致嵌套的问题</li>
<li>移除前端一些多余的依赖</li>
<li>防止安全扫描YUI出现的风险提示</li>
<li>修改node-sass为dart-sass</li>
<li>升级SpringBoot到最新版本2.1.18</li>
<li>升级poi到最新版本4.1.2</li>
<li>升级oshi到最新版本v5.3.6</li>
<li>升级bitwalker到最新版本1.21</li>
<li>升级axios到最新版本0.21.0</li>
<li>升级element-ui到最新版本2.14.1</li>
<li>升级vue到最新版本2.6.12</li>
<li>升级vuex到最新版本3.6.0</li>
<li>升级vue-cli到版本4.5.9</li>
<li>升级vue-router到最新版本3.4.9</li>
<li>升级vue-cli到最新版本4.4.6</li>
<li>升级vue-cropper到最新版本0.5.5</li>
<li>升级clipboard到最新版本2.0.6</li>
<li>升级core-js到最新版本3.8.1</li>
<li>升级echarts到最新版本4.9.0</li>
<li>升级file-saver到最新版本2.0.4</li>
<li>升级fuse.js到最新版本6.4.3</li>
<li>升级js-beautify到最新版本1.13.0</li>
<li>升级js-cookie到最新版本2.2.1</li>
<li>升级path-to-regexp到最新版本6.2.0</li>
<li>升级quill到最新版本1.3.7</li>
<li>升级screenfull到最新版本5.0.2</li>
<li>升级sortablejs到最新版本1.10.2</li>
<li>升级vuedraggable到最新版本2.24.3</li>
<li>升级chalk到最新版本4.1.0</li>
<li>升级eslint到最新版本7.15.0</li>
<li>升级eslint-plugin-vue到最新版本7.2.0</li>
<li>升级lint-staged到最新版本10.5.3</li>
<li>升级runjs到最新版本4.4.2</li>
<li>升级sass-loader到最新版本10.1.0</li>
<li>升级script-ext-html-webpack-plugin到最新版本2.1.5</li>
<li>升级svg-sprite-loader到最新版本5.1.1</li>
<li>升级vue-template-compiler到最新版本2.6.12</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.2.1 - 2020-11-18">
<ol>
<li>阻止任意文件下载漏洞</li>
<li>代码生成支持上传控件</li>
<li>新增图片上传组件</li>
<li>调整默认首页</li>
<li>升级druid到最新版本v1.2.2</li>
<li>mapperLocations配置支持分隔符</li>
<li>权限信息调整</li>
<li>调整sql默认时间</li>
<li>解决代码生成没有bit类型的问题</li>
<li>升级pagehelper到最新版1.3.0</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.2.0 - 2020-10-10">
<ol>
<li>升级springboot版本到2.1.17 提升安全性</li>
<li>升级oshi到最新版本v5.2.5</li>
<li>升级druid到最新版本v1.2.1</li>
<li>升级jjwt到版本0.9.1</li>
<li>升级fastjson到最新版1.2.74</li>
<li>修改sass为node-sass,避免el-icon图标乱码</li>
<li>代码生成支持同步数据库</li>
<li>代码生成支持富文本控件</li>
<li>代码生成页面时不忽略remark属性</li>
<li>代码生成添加select必填选项</li>
<li>Excel导出类型NUMERIC支持精度浮点类型</li>
<li>Excel导出targetAttr优化获取值,防止get方法不规范</li>
<li>Excel注解支持自动统计数据总和</li>
<li>Excel注解支持设置BigDecimal精度&舍入规则</li>
<li>菜单&数据权限新增(展开/折叠 全选/全不选 父子联动)</li>
<li>允许用户分配到部门父节点</li>
<li>菜单新增是否缓存keep-alive</li>
<li>表格操作列间距调整</li>
<li>限制系统内置参数不允许删除</li>
<li>富文本组件优化,支持自定义高度&图片冲突问题</li>
<li>富文本工具栏样式对齐</li>
<li>导入excel整形值校验优化</li>
<li>修复页签关闭所有时固定标签路由不刷新问题</li>
<li>表单构建布局型组件新增按钮</li>
<li>左侧菜单文字过长显示省略号</li>
<li>修正根节点为子部门时,树状结构显示问题</li>
<li>修正调用目标字符串最大长度</li>
<li>修正菜单提示信息错误</li>
<li>修正定时任务执行一次权限标识</li>
<li>修正数据库字符串类型nvarchar</li>
<li>优化递归子节点</li>
<li>优化数据权限判断</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.1.0 - 2020-08-13">
<ol>
<li>表格工具栏右侧添加刷新&显隐查询组件</li>
<li>后端支持CORS跨域请求</li>
<li>代码生成支持选择上级菜单</li>
<li>代码生成支持自定义路径</li>
<li>代码生成支持复选框</li>
<li>Excel导出导入支持dictType字典类型</li>
<li>Excel支持分割字符串组内容</li>
<li>验证码类型支持(数组计算、字符验证)</li>
<li>升级vue-cli版本到4.4.4</li>
<li>修改 node-sass 为 dart-sass</li>
<li>表单类型为Integer/Long设置整形默认值</li>
<li>代码生成器默认mapper路径与默认mapperScan路径不一致</li>
<li>优化防重复提交拦截器</li>
<li>优化上级菜单不能选择自己</li>
<li>修复角色的权限分配后,未实时生效问题</li>
<li>修复在线用户日志记录类型</li>
<li>修复富文本空格和缩进保存后不生效问题</li>
<li>修复在线用户判断逻辑</li>
<li>唯一限制条件只返回单条数据</li>
<li>添加获取当前的环境配置方法</li>
<li>超时登录后页面跳转到首页</li>
<li>全局异常状态汉化拦截处理</li>
<li>HTML过滤器改为将html转义</li>
<li>检查字符支持小数点&降级改成异常提醒</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.0.0 - 2020-07-20">
<ol>
<li>单应用调整为多模块项目</li>
<li>升级element-ui版本到2.13.2</li>
<li>删除babel,提高编译速度。</li>
<li>新增菜单默认主类目</li>
<li>编码文件名修改为uuid方式</li>
<li>定时任务cron表达式验证</li>
<li>角色权限修改时已有权限未自动勾选异常修复</li>
<li>防止切换权限用户后登录出现404</li>
<li>Excel支持sort导出排序</li>
<li>创建用户不允许选择超级管理员角色</li>
<li>修复代码生成导入表结构出现异常页面不提醒问题</li>
<li>修复代码生成点击多次表修改数据不变化的问题</li>
<li>修复头像上传成功二次打开无法改变裁剪框大小和位置问题</li>
<li>修复布局为small者mini用户表单显示错位问题</li>
<li>修复热部署导致的强换异常问题</li>
<li>修改用户管理复选框宽度,防止部分浏览器出现省略号</li>
<li>IpUtils工具,清除Xss特殊字符,防止Xff注入攻击</li>
<li>生成domain 如果是浮点型 统一用BigDecimal</li>
<li>定时任务调整label-width,防止部署出现错位</li>
<li>调整表头固定列默认样式</li>
<li>代码生成模板调整,字段为String并且必填则加空串条件</li>
<li>代码生成字典Integer/Long使用parseInt</li>
<li>
修复dict_sort不可update为0的问题&查询返回增加dict_sort升序排序
</li>
<li>修正岗位导出权限注解</li>
<li>禁止加密密文返回前端</li>
<li>修复代码生成页面中的查询条件创建时间未生效的问题</li>
<li>修复首页搜索菜单外链无法点击跳转问题</li>
<li>修复菜单管理选择图标,backspace删除时不过滤数据</li>
<li>用户管理部门分支节点不可检查&显示计数</li>
<li>数据范围过滤属性调整</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v2.3.0 - 2020-06-01">
<ol>
<li>升级fastjson到最新版1.2.70 修复高危安全漏洞</li>
<li>dev启动默认打开浏览器</li>
<li>vue-cli使用默认source-map</li>
<li>slidebar eslint报错优化</li>
<li>当tags-view滚动关闭右键菜单</li>
<li>字典管理添加缓存读取</li>
<li>参数管理支持缓存操作</li>
<li>支持一级菜单(和主页同级)在main区域显示</li>
<li>限制外链地址必须以http(s)开头</li>
<li>tagview & sidebar 主题颜色与element ui(全局)同步</li>
<li>修改数据源类型优先级,先根据方法,再根据类</li>
<li>支持是否需要设置token属性,自定义返回码消息。</li>
<li>swagger请求前缀加入配置。</li>
<li>登录地点设置内容过长则隐藏显示</li>
<li>修复定时任务执行一次按钮后不提示消息问题</li>
<li>修改上级部门(选择项排除本身和下级)</li>
<li>通用http发送方法增加参数 contentType 编码类型</li>
<li>更换IP地址查询接口</li>
<li>修复页签变量undefined</li>
<li>添加校验部门包含未停用的子部门</li>
<li>修改定时任务详情下次执行时间日期显示错误</li>
<li>角色管理查询设置默认排序字段</li>
<li>swagger添加enable参数控制是否启用</li>
<li>只对json类型请求构建可重复读取inputStream的request</li>
<li>修改代码生成字典字段int类型没有自动选中问题</li>
<li>vuex用户名取值修正</li>
<li>表格树模板去掉多余的)</li>
<li>代码生成序号修正</li>
<li>全屏情况下不调整上外边距</li>
<li>代码生成Date字段添加默认格式</li>
<li>用户管理角色选择权限控制</li>
<li>修复路由懒加载报错问题</li>
<li>模板sql.vm添加菜单状态</li>
<li>设置用户名称不能修改</li>
<li>dialog添加append-to-body属性,防止ie遮罩</li>
<li>菜单区分状态和显示隐藏功能</li>
<li>升级fastjson到最新版1.2.68 修复安全加固</li>
<li>修复代码生成如果选择字典类型缺失逗号问题</li>
<li>登录请求params更换为data,防止暴露url</li>
<li>日志返回时间格式处理</li>
<li>添加handle控制允许拖动的元素</li>
<li>布局设置点击扩大范围</li>
<li>代码生成列属性排序查询</li>
<li>代码生成列支持拖动排序</li>
<li>修复时间格式不支持ios问题</li>
<li>表单构建添加父级class,防止冲突</li>
<li>定时任务并发属性修正</li>
<li>角色禁用&菜单隐藏不查询权限</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v2.2.0 - 2020-03-18">
<ol>
<li>系统监控新增定时任务功能</li>
<li>添加一个打包Web工程bat</li>
<li>修复页签鼠标滚轮按下的时候,可以关闭不可关闭的tag</li>
<li>修复点击退出登录有时会无提示问题</li>
<li>修复防重复提交注解无效问题</li>
<li>修复通知公告批量删除异常问题</li>
<li>添加菜单时路由地址必填限制</li>
<li>代码生成字段描述可编辑</li>
<li>修复用户修改个人信息导致缓存不过期问题</li>
<li>个人信息创建时间获取正确属性值</li>
<li>操作日志详细显示正确类型</li>
<li>导入表单击行数据时选中对应的复选框</li>
<li>批量替换表前缀逻辑调整</li>
<li>固定重定向路径表达式</li>
<li>升级element-ui版本到2.13.0</li>
<li>操作日志排序调整</li>
<li>修复charts切换侧边栏或者缩放窗口显示bug</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v2.1.0 - 2020-02-24">
<ol>
<li>新增表单构建</li>
<li>代码生成支持树表结构</li>
<li>新增用户导入</li>
<li>修复动态加载路由页面刷新问题</li>
<li>修复地址开关无效问题</li>
<li>汉化错误提示页面</li>
<li>代码生成已知问题修改</li>
<li>修复多数据源下配置关闭出现异常处理</li>
<li>添加HTML过滤器,用于去除XSS漏洞隐患</li>
<li>修复上传头像控制台出现异常</li>
<li>修改用户管理分页不正确的问题</li>
<li>修复验证码记录提示错误</li>
<li>修复request.js缺少Message引用</li>
<li>修复表格时间为空出现的异常</li>
<li>添加Jackson日期反序列化时区配置</li>
<li>调整根据用户权限加载菜单数据树形结构</li>
<li>调整成功登录不恢复按钮,防止多次点击</li>
<li>修改用户个人资料同步缓存信息</li>
<li>修复页面同时出现el-upload和Editor不显示处理</li>
<li>修复在角色管理页修改菜单权限偶尔未选中问题</li>
<li>配置文件新增redis密码属性</li>
<li>设置mybatis全局的配置文件</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v2.0.0 - 2019-12-02">
<ol>
<li>新增代码生成</li>
<li>新增@RepeatSubmit注解,防止重复提交</li>
<li>新增菜单主目录添加/删除操作</li>
<li>日志记录过滤特殊对象,防止转换异常</li>
<li>修改代码生成路由脚本错误</li>
<li>用户上传头像实时同步缓存,无需重新登录</li>
<li>调整切换页签后不重新加载数据</li>
<li>添加jsencrypt实现参数的前端加密</li>
<li>系统退出删除用户缓存记录</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v1.1.0 - 2019-11-11">
<ol>
<li>新增在线用户管理</li>
<li>新增按钮组功能实现(批量删除、导出、清空)</li>
<li>新增查询条件重置按钮</li>
<li>新增Swagger全局Token配置</li>
<li>新增后端参数校验</li>
<li>修复字典管理页面的日期查询异常</li>
<li>修改时间函数命名防止冲突</li>
<li>去除菜单上级校验,默认为顶级</li>
<li>修复用户密码无法修改问题</li>
<li>修复菜单类型为按钮时不显示权限标识</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v1.0.0 - 2019-10-08">
<ol>
<li>若依前后端分离系统正式发布</li>
</ol>
</el-collapse-item>
</el-collapse>
</el-card>
<!--员工视角-->
<div v-if="user === 2" class="content-db">
<div class="flex-box query-box">
<div class="flex-box query-params">
<span class="common-title">待办</span>
</div>
<div class="flex-box query-ability"><span>9</span>全部待办 ></div>
</div>
<div class="list">
<div class="item" v-for="(item,index) in gjjlData" :key="index">
<h3>{{item.title}}</h3>
<p>
<span>拜访时间:{{item.time}}</span>
<span>关联企业:{{item.name}}</span>
</p>
<div class="btn">写跟进<i class="el-icon-edit"></i></div>
</div>
</div>
</div>
<div v-if="user === 2" class="trends">
<el-tabs v-model="activeName" @tab-click="handleClickTab">
<el-tab-pane label="甲方舆情" name="first">
<el-timeline>
<el-timeline-item
v-for="(item, index) in trendsList"
:key="index"
icon="el-icon-time">
{{item.main}}
</el-timeline-item>
</el-timeline>
</el-tab-pane>
<el-tab-pane label="监控动态" name="second">监控动态</el-tab-pane>
</el-tabs>
</div>
</div>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="8">
<el-card class="update-log">
<div slot="header" class="clearfix">
<span>捐赠支持</span>
<el-col :span="6">
<div class="content-right">
<div class="user">
<h3>刘毅<span>总经理</span></h3>
<p>您好,祝您工作顺利每一天</p>
</div>
<div class="body">
<img
src="https://oscimg.oschina.net/oscnet/up-d6695f82666e5018f715c41cb7ee60d3b73.png"
alt="donate"
width="100%"
/>
<span style="display: inline-block; height: 30px; line-height: 30px"
>你可以请作者喝杯咖啡表示鼓励</span
>
<div class="search">
<span class="common-title">快捷搜索</span>
<el-input placeholder="找客户/找项目/找甲方">
<i slot="prefix" class="el-icon-search"></i>
</el-input>
<span class="common-title" style="margin-bottom: 10px;">储备项目类</span>
<div class="list">
<div class="item">
<img src="@/assets/images/index/cb_icon1.png"/>
<p>EPC项目</p>
</div>
<div class="item">
<img src="@/assets/images/index/cb_icon2.png"/>
<p>投资项目</p>
</div>
<div class="item">
<img src="@/assets/images/index/cb_icon3.png"/>
<p>房建项目</p>
</div>
</div>
<div class="list">
<div class="item">
<img src="@/assets/images/index/cb_icon4.png"/>
<p>电力项目</p>
</div>
<div class="item">
<img src="@/assets/images/index/cb_icon5.png"/>
<p>市政项目</p>
</div>
<div class="item">
<img src="@/assets/images/index/cb_icon6.png"/>
<p>水利项目</p>
</div>
</div>
</div>
</el-card>
<div class="zbgg">
<span class="common-title">招标公告</span>
<div class="list">
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
<span>中标单位:中铁十二局集团</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
<span>中标单位:中铁十二局集团</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
<span>中标单位:中铁十二局集团</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
<span>中标单位:中铁十二局集团</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
<span>中标单位:中铁十二局集团</span>
</p>
</div>
</div>
</div>
</div>
</el-col>
</el-row>
</div>
</template>
<script>
import * as echarts from 'echarts';
export default {
name: "Index",
data() {
return {
// 版本号
version: "3.8.5"
};
version: "3.8.5",
typeList:[
{name:'待成交项目数'},
{name:'待成交总金额'},
{name:'成交项目金额'},
{name:'成交项目总数'},
{name:'储备项目总数'},
{name:'储备项目总金额'},
],
typeIndex:0,
jyfxData:['1月','2月','3月','4月','5月','6月'],
jyfxData1:[103,256,132,186,210,95],
gjjlData:[
{
title:'今天拜访了重庆交通局杨科长,洽谈比较愉快,预计下月有项目招标,希望能有机会合作。',
user:'李婷婷',
name:'重庆机场集团',
time:'2023-04-12 14: 00'
},
{
title:'今天拜访了重庆机场集团董事长,下个月招标项目预计1.2个亿。争取能拿到项目。',
user:'李婷婷',
name:'重庆机场集团',
time:'2023-04-12 14: 00'
},
{
title:'5月27日早上劳动局去杨局长说希望我们把项目预算清单做出来看一下。',
user:'李婷婷',
name:'重庆机场集团',
time:'2023-04-12 14: 00'
},
{
title:'拜访了重庆交通局杨科长,洽谈比较愉快,预计下月有项目招标,希望能有机会合作。',
user:'李婷婷',
name:'重庆机场集团',
time:'2023-04-12 14: 00'
},
{
title:'5月27日早上劳动局去杨局长说希望我们把项目预算清单做出来看一下。',
user:'李婷婷',
name:'重庆机场集团',
time:'2023-04-12 14: 00'
},
{
title:'拜访了重庆交通局杨科长,洽谈比较愉快,预计下月有项目招标,希望能有机会合作。',
user:'李婷婷',
name:'重庆机场集团',
time:'2023-04-12 14: 00'
},
],
pmData:[
{
name:'朱博',
value:334,
value1:164,
},
{
name:'陈伟',
value:230,
value1:130,
},
{
name:'张天翼',
value:156,
value1:150,
},
{
name:'李晨旭',
value:112,
value1:130,
},
{
name:'徐阳',
value:110,
value1:90,
},
],
rankIconsSize:'24',
rankIcons:[// 排序图标
require('@/assets/images/index/1.png'),
require('@/assets/images/index/2.png'),
require('@/assets/images/index/3.png'),
require('@/assets/images/index/4.png'),
require('@/assets/images/index/5.png'),
],
user:1,
activeName:'first',
trendsList:[
{
time:'2018-04-03 10:20',
name:'重庆轨道交通集团有限公司',
main:'发布招标公告 重庆轨道交通环线鹅公岩轨道专用桥增设防船撞设施项目,项目地区是重庆市-江北区,项目类型为工程建设。'
},
{
time:'2018-04-03 10:20',
name:'重庆轨道交通集团有限公司',
main:'发布招标公告 重庆轨道交通环线鹅公岩轨道专用桥增设防船撞设施项目,项目地区是重庆市-江北区,项目类型为工程建设。'
},
{
time:'2018-04-03 10:20',
name:'重庆轨道交通集团有限公司',
main:'发布招标公告 重庆轨道交通环线鹅公岩轨道专用桥增设防船撞设施项目,项目地区是重庆市-江北区,项目类型为工程建设。'
},
{
time:'2018-04-03 10:20',
name:'重庆轨道交通集团有限公司',
main:'发布招标公告 重庆轨道交通环线鹅公岩轨道专用桥增设防船撞设施项目,项目地区是重庆市-江北区,项目类型为工程建设。'
},
]
};
},
created() {
if(this.user === 1){
this.$nextTick(()=>{
this.initChart()
this.initChart1()
})
}
},
methods: {
goTarget(href) {
window.open(href, "_blank");
handleClick(index){
this.typeIndex=index;
},
initChart() {
let myChart = echarts.init(document.getElementById("fx-echarts"))
let option ={
tooltip: {
show:false
},
xAxis: {
type: 'category',
boundaryGap: false,
data: this.jyfxData,
},
yAxis: {
type: 'value',
},
grid: {
top:20,
left:30,
right:10,
bottom:20,
},
series: [
{
data: this.jyfxData1,
type: 'line',
smooth: true,
emphasis: {
disabled: true,
focus: 'none'
},
//设置折线颜色和粗细
lineStyle: {
width: 1,
color: "#0081FF",
},
itemStyle:{
color: "#4E8EFF",
},
//设置面积区域为渐变效果
areaStyle: {
color: echarts.graphic.LinearGradient(0, 1, 0, 0, [
{
offset: 0.2,
color: "#DFEAFF",
},
{
offset: 1,
color: "#5895FF",
},
]),
},
}
]
}
myChart.setOption(option);
},
initChart1(){
let myChart = echarts.init(document.getElementById("pm-echarts"))
let option ={
legend: {
show: true,
x:'center',
y:'bottom',
padding:[0,0,10,0],
},
yAxis: {
type: 'category',
inverse: true, // 反向坐标
data: this.pmData.map(item => item.name),
axisLine: {
show: false,
},
axisTick: {
show: false,
},
axisPointer: {
label: {
show: true,
margin: 30
}
},
axisLabel: {
color: '#232323',
margin: 50,
// formatter必须,配合rich使用
textStyle: {
align:'left',
},
rich: {
a1: {
backgroundColor: {image: this.rankIcons[0]},
width: this.rankIconsSize,
height: this.rankIconsSize,
align: "left",
// padding: [0, 0, 50, 100]
},
a2: {
backgroundColor: { image: this.rankIcons[1] },
width: this.rankIconsSize,
height: this.rankIconsSize,
align: "center",
},
a3: {
backgroundColor: { image: this.rankIcons[2] },
width: this.rankIconsSize,
height: this.rankIconsSize,
align: "center",
},
a4: {
backgroundColor: { image: this.rankIcons[3] },
width: this.rankIconsSize,
height: this.rankIconsSize,
align: "center",
},
a5: {
backgroundColor: { image: this.rankIcons[4] },
width: this.rankIconsSize,
height: this.rankIconsSize,
align: "center",
},
},
formatter: (params, index) => {
return [`{a${index + 1}|} ${params}`].join('\n')
},
},
},
xAxis: {
type: 'value',
},
grid: {
left: '22%',
top: 20,
right: 20,
bottom: 60,
},
tooltip: {
show: true,
backgroundColor: 'rgba(0,0,0,.7)',
borderWidth: 0,
textStyle: {
color: '#fff',
},
},
series: [
{
// realtimeSort: true,
name:'目标产值',
data: this.pmData.map(item => item.value),
type: 'bar',
stack: 'total',
emphasis: {
focus: 'series'
},
itemStyle:{
color: '#14C9C9',
},
barWidth: 16,
},
{
// realtimeSort: true,
name:'已完成产值',
data: this.pmData.map(item => item.value1),
type: 'bar',
stack: 'total',
emphasis: {
focus: 'series'
},
itemStyle:{
color: '#C3F6F6',
},
barWidth: 16,
},
],
}
myChart.setOption(option);
},
handleClickTab(){
}
}
};
</script>
<style scoped lang="scss">
.home {
blockquote {
padding: 10px 20px;
margin: 0 0 20px;
font-size: 17.5px;
border-left: 5px solid #eee;
}
hr {
margin-top: 20px;
margin-bottom: 20px;
border: 0;
border-top: 1px solid #eee;
}
.col-item {
margin-bottom: 20px;
.app-container{
padding: 0;
}
ul {
p{
padding: 0;
margin: 0;
}
font-family: "open sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 13px;
color: #676a6c;
overflow-x: hidden;
ul {
list-style-type: none;
}
h4 {
margin-top: 0px;
}
h2 {
margin-top: 10px;
font-size: 26px;
font-weight: 100;
}
p {
margin-top: 10px;
b {
font-weight: 700;
.home {
::v-deep .el-row{
.el-col:nth-child(1){
padding-left: 0 !important;
padding-right: 0 !important;
}
.el-col:nth-child(2){
padding-left: 16px !important;
padding-right: 0 !important;
}
}
}
.content-left{
.task-wrap{
height: 88px;
background: #FFFFFF;
border-radius: 4px;
margin-bottom: 12px;
display: flex;
justify-content: space-between;
.item{
width: 20%;
display: flex;
padding-left: 16px;
margin-right: 9px;
margin-top: 14px;
margin-bottom: 14px;
border-right: 1px solid #EFEFEF;
.left{
width: 48px;
height: 48px;
margin-right: 8px;
}
.right{
.title{
font-size: 12px;
color: #3D3D3D;
}
.number{
font-weight: bold;
color: #3D3D3D;
font-size: 18px;
padding: 4px 0;
}
.compare{
color: rgba(35,35,35,0.4);
font-size: 12px;
img{
width: 8px;
height: 10px;
margin-left: 4px;
margin-bottom: -1px;
}
.down{
color:#FF3C3C;
}
.up{
color:#0CBC6D;
}
}
}
}
.item:nth-child(4){
border-right: 0;
}
.item:last-child{
border-right: 0;
}
.add{
padding-left: 0;
.yd{
display: inline-block;
width: 5px;
margin-right: 10%;
i{
width: 5px;
height: 5px;
border-radius: 2px;
background: #E6E6E9;
margin-bottom: 6px;
display: block;
}
}
.btn{
width: 80%;
height: 64px;
background: #FFFFFF;
border-radius: 4px;
border: 1px solid #E6E6E9;
color:#0081FF;
line-height: 64px;
font-size: 14px;
margin-left: 0;
i{
margin-right: 4px;
}
}
}
}
.content-wrap{
margin-bottom: 12px;
height: 460px;
.record{
height: 460px;
background: #FFFFFF;
border-radius: 4px;
padding: 16px;
position: relative;
.list{
height: 375px;
overflow: hidden;
.item{
border-bottom: 1px solid #EEEEEE;
padding: 16px 0;
h3{
color: #232323;
font-size: 14px;
font-weight: 400;
margin: 0;
}
p{
color: rgba(35,35,35,0.4);
font-size: 14px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
margin-top: 8px;
span{
margin-right: 15px;
}
}
}
.item:last-child{
border-bottom: 0;
}
}
.more{
text-align: center;
color: #0081FF;
font-size: 14px;
margin-top: 4px;
cursor: pointer;
position: absolute;
bottom:16px;
left: 50%;
margin-left: -48px;
}
}
.ranking{
height: 460px;
background: #FFFFFF;
border-radius: 4px;
padding: 16px;
.main{
background: url("../assets/images/index/yjpm_bg.png");
background-size: 100% 100%;
height: 399px;
margin-top: 10px;
}
.amount{
padding: 16px 24px;
p{
display: flex;
justify-content: space-between;
}
span{
font-weight: 400;
color: #184280;
font-size: 14px;
}
.money{
font-weight: 700;
color: #184280;
font-size: 18px;
margin-top: 8px;
}
::v-deep .el-progress-bar__outer{
border: 1px solid #A2E8E8;
background-color:#ffffff !important;
border-radius: 2px;
.el-progress-bar__inner{
background: linear-gradient(-270deg, #C3F6F6 0%, #14C9C9 100%);
border-radius:0;
.el-progress-bar__innerText{
color: #ffffff;
opacity: 0;
}
}
}
.update-log {
ol {
display: block;
list-style-type: decimal;
margin-block-start: 1em;
margin-block-end: 1em;
margin-inline-start: 0;
margin-inline-end: 0;
padding-inline-start: 40px;
}
}
.area{
font-size: 14px;
color: #232323;
cursor: pointer;
i{
color:#A7A7A7;
}
}
.month{
font-size: 14px;
color: #232323;
margin-left: 16px;
cursor: pointer;
i{
color:#A7A7A7;
}
}
}
.content-db{
height: 263px;
background: #FFFFFF;
border-radius: 4px;
margin-bottom: 12px;
padding: 16px;
overflow: hidden;
.query-ability{
color: #0081FF;
font-size: 14px;
cursor: pointer;
span{
width: 16px;
height: 16px;
background: #FF3C3C;
display: inline-block;
color:#ffffff;
font-size: 12px;
border-radius: 50%;
line-height: 16px;
text-align: center;
margin-right: 4px;
}
}
.list{
margin-top: 16px;
}
.item{
min-height: 62px;
background: #F6F9FD;
border-radius: 6px;
margin-bottom: 8px;
position: relative;
padding: 10px 16px;
h3{
font-weight: 400;
color: #232323;
font-size: 14px;
margin: 0;
padding-bottom: 6px;
width: 85%;
}
p{
color: rgba(35,35,35,0.4);
font-size: 14px;
span{
margin-right: 24px;
}
}
.btn{
position: absolute;
right: 50px;
top:22px;
color: #0CBC6D;
font-size: 12px;
}
}
}
.analysis{
height: 242px;
background: #FFFFFF;
border-radius: 4px;
padding: 16px;
.tabs{
.label{
display: inline-block;
padding: 0 14px;
height: 22px;
color: rgba(35,35,35,0.8);
font-size: 12px;
line-height: 22px;
border-top: 1px solid #EFEFEF;
border-bottom: 1px solid #EFEFEF;
border-left: 1px solid #EFEFEF;
cursor: pointer;
}
.label:first-child{
border-radius: 2px 0px 0px 2px;
}
.label:last-child{
border-radius: 0px 2px 2px 0px;
border-right: 1px solid #EFEFEF;
}
.color{
background: #0081FF;
color: #FFFFFF;
}
}
.area{
font-size: 14px;
color: #232323;
margin-left: 16px;
cursor: pointer;
i{
color:#A7A7A7;
}
}
}
.trends{
background: #FFFFFF;
border-radius: 4px;
padding: 16px;
height: 440px;
}
}
.content-right{
.user{
height: 88px;
border-radius: 4px;
margin-bottom: 12px;
background-image: url("../assets/images/index/user_bg.png");
background-size: cover;
padding-left: 24px;
h3{
font-weight: 700;
color: #1C1C28;
font-size: 18px;
padding-top: 16px;
padding-bottom: 8px;
margin: 0px;
span{
height: 20px;
background: #FFF2E2;
display: inline-block;
border-radius: 11px;
border: 1px solid #FFB010;
color: #FFB010;
font-size: 12px;
line-height: 20px;
padding: 0 10px;
margin-left: 12px;
font-weight: 400;
}
}
p{
color: #666666;
font-size: 16px;
}
}
.search{
height: 322px;
background: #FFFFFF;
border-radius: 4px;
margin-bottom: 12px;
padding: 16px;
::v-deep .el-input{
height: 32px;
border-radius: 2px;
margin-bottom: 22px;
margin-top: 16px;
.el-input__inner{
height: 32px;
line-height: 32px;
background: #F3F3F4;
padding-left: 37px;
}
.el-icon-search{
font-size: 16px;
line-height: 32px;
color:#0081FF;
margin-left: 10px;
margin-right: 10px;
}
}
.list{
display: flex;
justify-content: space-between;
.item{
margin: 0 auto;
height: 94px;
text-align: center;
img{
width: 40px;
height: 40px;
margin-top: 16px;
}
p{
color: #3D3D3D;
font-size: 12px;
}
}
}
}
.zbgg{
height: 382px;
background: #FFFFFF;
border-radius: 4px;
padding: 16px;
.list{
margin-top: 16px;
}
.item{
border-bottom: 1px solid #EEEEEE;
padding: 10px 0;
h3{
font-weight: 400;
color: rgba(35,35,35,0.8);
font-size: 14px;
padding-bottom: 8px;
margin: 0;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
p{
color: rgba(35,35,35,0.4);
font-size: 14px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
span{
margin-right: 15px;
}
}
}
.item:last-child{
border-bottom: 0;
}
}
}
}
}
</style>
<template>
<div class="login">
<el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
<h3 class="title">若依后台管理系统</h3>
<h3 class="title"><img src="../assets/images/title_icon.png"/>欢迎登录系统</h3>
<el-form-item prop="username">
<el-input
v-model="loginForm.username"
type="text"
auto-complete="off"
placeholder="账号"
placeholder="请输入登录账号"
>
<svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
<img class="img" slot="prefix" src="../assets/images/user.png"/>
</el-input>
</el-form-item>
<el-form-item prop="password">
......@@ -17,33 +17,33 @@
v-model="loginForm.password"
type="password"
auto-complete="off"
placeholder="密码"
placeholder="请输入账号密码"
@keyup.enter.native="handleLogin"
>
<svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
<img class="img" slot="prefix" src="../assets/images/password.png"/>
</el-input>
</el-form-item>
<el-form-item prop="code" v-if="captchaEnabled">
<el-input
v-model="loginForm.code"
auto-complete="off"
placeholder="验证码"
style="width: 63%"
placeholder="请输入验证码"
style="width: 56%;float: left;"
@keyup.enter.native="handleLogin"
>
<svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
<img class="img" slot="prefix" src="../assets/images/validCode.png"/>
</el-input>
<div class="login-code">
<img :src="codeUrl" @click="getCode" class="login-code-img"/>
</div>
</el-form-item>
<el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">记住密码</el-checkbox>
<el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 48px;">记住密码</el-checkbox>
<el-form-item style="width:100%;">
<el-button
:loading="loading"
size="medium"
type="primary"
style="width:100%;"
style="width:100%;height: 48px;border-radius: 4px;font-size: 16px;"
@click.native.prevent="handleLogin"
>
<span v-if="!loading">登 录</span>
......@@ -54,10 +54,6 @@
</div>
</el-form-item>
</el-form>
<!-- 底部 -->
<div class="el-login-footer">
<span>Copyright © 2018-2023 ruoyi.vip All Rights Reserved.</span>
</div>
</div>
</template>
......@@ -161,30 +157,53 @@ export default {
justify-content: center;
align-items: center;
height: 100%;
background-image: url("../assets/images/login_background.jpg");
background-image: url("../assets/images/login_bg.png");
background-size: cover;
}
.title {
margin: 0px auto 30px auto;
text-align: center;
color: #707070;
padding: 46px 0 32px 48px;
border-bottom: 1px solid #F0F0F0;
font-size: 22px;
color: #232323;
margin: 0 0 32px 0;
img{
width: 17px;
height: 17px;
margin-bottom: 3px;
}
}
.login-form {
border-radius: 6px;
background: #ffffff;
width: 400px;
padding: 25px 25px 5px 25px;
width: 420px;
/*padding: 25px 25px 5px 25px;*/
.el-form-item{
padding: 0 48px;
margin-bottom:24px;
}
.el-input {
height: 38px;
width: 324px;
height: 48px;
background: #F2F4F9;
input {
height: 38px;
height: 48px;
background: #F2F4F9;
font-size: 14px;
}
.el-input__inner{
padding-left: 73px;
}
}
.el-input__prefix{
border-right: 1px solid #D8D8D8;
height: 24px;
margin: 12px 0;
}
.input-icon {
height: 39px;
width: 14px;
margin-left: 2px;
.img {
height: 24px;
width: 24px;
margin: 0 14px 0 12px;
}
}
.login-tip {
......@@ -195,7 +214,8 @@ export default {
.login-code {
width: 33%;
height: 38px;
float: right;
float: left;
margin-left: 16px;
img {
cursor: pointer;
vertical-align: middle;
......@@ -214,6 +234,6 @@ export default {
letter-spacing: 1px;
}
.login-code-img {
height: 38px;
height: 48px;
}
</style>
......@@ -164,16 +164,30 @@ export default {
padding: 16px;
.search{
::v-deep .el-cascader{
width: 130px;
width: 180px;
margin-right: 12px;
height: 32px;
.el-input{
width: 100%;
height: 32px;
.el-input__inner{
height: 32px !important;
}
}
.el-cascader__tags{
flex-wrap: inherit;
.el-tag{
max-width: 100px;
margin: 5px 0 2px 6px;
}
}
}
::v-deep .el-input{
width: 250px;
height: 32px;
.el-input__inner{
height: 32px;
}
.el-input-group__append{
width: 59px;
background: #F5F5F5;
......
......@@ -268,6 +268,14 @@
.el-form{
margin-left: 24px;
}
::v-deep .el-cascader{
.el-cascader__tags{
flex-wrap: inherit;
.el-tag{
max-width: 130px;
}
}
}
}
}
.content{
......
......@@ -139,7 +139,7 @@ export default {
},
],
glData:['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'],
glData1:[103,156,132,186,203,143,189,301,211,195,132,176],
glData1:[503,156,132,186,203,143,189,301,211,195,132,176],
tableData1:[
{
area:'1月',
......@@ -263,6 +263,7 @@ export default {
},
initChart1() {
let myChart = echarts.init(document.getElementById("gl-echarts"))
let dataList=this.glData1;
let option = {
tooltip: {
trigger: 'axis', //坐标轴触发,主要在柱状图,折线图等会使用类目轴的图表中使用
......@@ -287,17 +288,41 @@ export default {
series: [
{
data: this.glData1,
markPoint:{
data:[
{type:'max',name:'最大值'},
]
},
// markPoint:{
// data:[
// {type:'max',name:'最大值'},
// {type:'min',name:'最小值'},
// ]
// },
type: 'bar',
barWidth: 20,
itemStyle: {
normal: {
barBorderRadius: [4, 4, 0, 0],
color: '#2ECFCF',
// color: '#2ECFCF',
color: function (params) {
var colorList = [] //定义一个存储颜色的数组
//更改前二位柱形颜色
//定义一个变量 保存柱形图数据 因为sort方法排序会改变原数组 使用JSON方法深拷贝 将原数值暂存
let companyValue1 = JSON.parse(JSON.stringify(dataList))
let arr = dataList.sort((a, b) => {
return b - a
})
//将原数组数据赋值回去 保持数据不变
dataList = JSON.parse(JSON.stringify(companyValue1))
//遍历数据 将原数组和排序后的数组比较
dataList.map(i => {
if (i == arr[0]) {
colorList.push('#F39F35')
} else if (i == arr[1]) {
colorList.push('#6675A5')
}else{
colorList.push('#2ECFCF')
}
})
//返回一个存储着颜色的数组根据数据index顺序渲染到页面
return colorList[params.dataIndex]
}
},
}
}
......
......@@ -58,7 +58,7 @@
</div>
</div>
<el-divider></el-divider>
<div class="cardtitles i">储备项目类</div>
<div class="cardtitles i">储备项目类</div>
<div class="gzlist">
<div>
<img src="@/assets/images/project/EPC.png">
......
......@@ -7,7 +7,7 @@
>
<div class="poptitle">
<img src="@/assets/images/economies/icon.png">
<span>添加客户</span>
<span>添加项目</span>
</div>
<el-form class="popform j" :model="queryParam" :rules="rules" ref="ruleForm" label-width="130px">
<el-form-item label="项目名称:" class="row" prop="projectName">
......
<template>
<div class="uploadwin">
<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">导入已存在的客户将自动跳过</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">成功导入客户信息</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"
import {importData} from '@/api/custom/custom'
export default {
name: 'batchImport',
props:{
importtype:''
},
data(){
return{
isUpload:false,//有上传的文件
addfile:false,//已上传文件
addsuccess:false,//已成功加入数据
//批量导入
action:"",
fileList: [],
headers: {
Authorization: "Bearer " + getToken(),
},
downloadhref:'',//样例地址
titletext:'',
}
},
created(){
console.log(this.importtype )
if(this.importtype == 'project'){//项目管理
this.downloadhref = '/file/projectTemplate.xlsx'
this.titletext = '项目'
this.action = process.env.VUE_APP_BASE_API + '/business/info/upload'
}
if(this.importtype == 'custom'){//客户管理
this.downloadhref = '/file/Template.xlsx'
this.titletext = '客户'
this.action = process.env.VUE_APP_BASE_API + "/customer/importData"
}
},
methods:{
getmsg(){
this.$emit('getdatas')
},
handleFileListChange(file, fileList) {
if (fileList.length > 0) {
this.fileList = [fileList[fileList.length - 1]];
this.isUpload = true
}
},
onSuccess(res, file, fileList) {
if(res.code == 200 )
this.addsuccess = true
else
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();
},
// 批量导入
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>
......@@ -9,26 +9,26 @@
<span>总投资额(万元) :</span>
<div class="inputxt">
<div class="flex" v-if="nowedit == 1">
<el-input placeholder="待添加" v-model="money" @input="number"></el-input>
<el-input placeholder="待添加" v-model="investmentAmount" @input="number"></el-input>
<div class="flex">
<div class="btnsmall btn_primary h28" style="width: 56px">确定</div>
<div class="btnsmall btn_primary h28" style="width: 56px" @click="changes({'investmentAmount':investmentAmount})">确定</div>
<div class="cancels h28" @click="nowedit = -1" style="">取消</div>
</div>
</div>
<span class="txt" v-else @click="nowedit = 1">待添加</span>
<span :class="{'txt':!investmentAmount}" v-else @click="nowedit = 1">{{investmentAmount||'待添加'}}</span>
</div>
</div>
<div class="con i">
<span>资金来源 :</span>
<div class="inputxt">
<div class="flex" v-if="nowedit == 2">
<el-input placeholder="待添加"></el-input>
<el-input placeholder="待添加" v-model="amountSource"></el-input>
<div class="flex">
<div class="btnsmall btn_primary h28" style="width: 56px">确定</div>
<div class="btnsmall btn_primary h28" @click="changes({'amountSource':amountSource})" style="width: 56px">确定</div>
<div class="cancels h28" @click="nowedit = -1" style="">取消</div>
</div>
</div>
<span class="txt" v-else @click="nowedit = 2">待添加</span>
<span :class="{'txt':!amountSource}" v-else @click="nowedit = 2">{{amountSource||'待添加'}}</span>
</div>
</div>
</div>
......@@ -37,27 +37,27 @@
<span>建设性质 :</span>
<div class="inputxt">
<div class="flex" v-if="nowedit == 3">
<el-input placeholder="待添加"></el-input>
<el-input placeholder="待添加" v-model="buildProperty"></el-input>
<div class="flex">
<div class="btnsmall btn_primary h28" style="width: 56px">确定</div>
<div class="btnsmall btn_primary h28" @click="changes({'buildProperty':buildProperty})" style="width: 56px">确定</div>
<div class="cancels h28" @click="nowedit = -1" style="">取消</div>
</div>
</div>
<span class="txt" v-else @click="nowedit = 3">待添加</span>
<span :class="{'txt':!buildProperty}" v-else @click="nowedit = 3">{{buildProperty||'待添加'}}</span>
</div>
</div>
<div class="con i">
<span>计划招标 :</span>
<div class="inputime">
<div class="flex" style="opacity: 0;height: 0">
<el-date-picker v-if="nowedit == 11" showWordLimit="true"
v-model="value1"
<div class="flex" style="">
<el-date-picker class="timeinput"
v-model="planBidTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="待添加" @change="nowedit = -1">
placeholder="待添加" @change="changes({'planBidTime':planBidTime})">
</el-date-picker>
</div>
<span :class="{'txt':!value1}" @click="nowedit = 11">{{value1||"待添加"}}<i class="el-icon-caret-bottom"></i></span>
<span :class="{'txt':!planBidTime}">{{planBidTime||"待添加"}}<i class="el-icon-caret-bottom"></i></span>
</div>
</div>
</div>
......@@ -66,28 +66,28 @@
<span>计划开工 :</span>
<div class="inputime">
<div class="flex" style="opacity: 0;height: 0">
<el-date-picker v-if="nowedit == 12" showWordLimit="true"
v-model="value1"
<el-date-picker class="timeinput"
v-model="planStartTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="待添加" @change="nowedit = -1">
placeholder="待添加" @change="changes({'planStartTime':planStartTime})">
</el-date-picker>
</div>
<span :class="{'txt':!value1}" @click="nowedit = 12">{{value1||"待添加"}}<i class="el-icon-caret-bottom"></i></span>
<span :class="{'txt':!planStartTime}">{{planStartTime||"待添加"}}<i class="el-icon-caret-bottom"></i></span>
</div>
</div>
<div class="con i">
<span>计划竣工 :</span>
<div class="inputime">
<div class="flex" style="opacity: 0;height: 0">
<el-date-picker v-if="nowedit == 13" showWordLimit="true"
v-model="value1"
<el-date-picker class="timeinput"
v-model="planCompleteTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="待添加" @change="nowedit = -1">
placeholder="待添加" @change="changes({'planCompleteTime':planCompleteTime})">
</el-date-picker>
</div>
<span :class="{'txt':!value1}" @click="nowedit = 13">{{value1||"待添加"}}<i class="el-icon-caret-bottom"></i></span>
<span :class="{'txt':!planCompleteTime}">{{planCompleteTime||"待添加"}}<i class="el-icon-caret-bottom"></i></span>
</div>
</div>
</div>
......@@ -96,10 +96,10 @@
<el-card class="box-card noborder">
<div class="cardtitles">项目概况与建设规模</div>
<div class="baseinfo">
<el-input v-model="textarea" @focus="nowedit = 9" class="textarea" type="textarea" placeholder="请输入项目概况与建设规模详细信息" maxlength="500" show-word-limit="true" ></el-input>
<el-input v-model="projectDetails" @focus="nowedit = 9" class="textarea" type="textarea" placeholder="请输入项目概况与建设规模详细信息" maxlength="500" :show-word-limit="true" ></el-input>
<div class="flex btns" v-if="nowedit == 9">
<div class="flex">
<div class="btnsmall btn_primary h28" style="width: 56px">确定</div>
<div class="btnsmall btn_primary h28" @click="changes({'projectDetails':projectDetails})" style="width: 56px">确定</div>
<div class="cancels h28" @click="nowedit = -1" style="">取消</div>
</div>
</div>
......@@ -113,27 +113,27 @@
<span>评标办法 :</span>
<div class="inputxt">
<div class="flex" v-if="nowedit == 4">
<el-input placeholder="待添加"></el-input>
<el-input placeholder="待添加" v-model="evaluationBidWay"></el-input>
<div class="flex">
<div class="btnsmall btn_primary h28" style="width: 56px">确定</div>
<div class="btnsmall btn_primary h28" @click="changes({'evaluationBidWay':evaluationBidWay})" style="width: 56px">确定</div>
<div class="cancels h28" @click="nowedit = -1" style="">取消</div>
</div>
</div>
<span class="txt" v-else @click="nowedit = 4">待添加</span>
<span :class="{'txt':!evaluationBidWay}" v-else @click="nowedit = 4">{{evaluationBidWay||'待添加'}}</span>
</div>
</div>
<div class="con i">
<span>开标时间 :</span>
<div class="inputime">
<div class="flex" style="opacity: 0;height: 0">
<el-date-picker v-if="nowedit == 14" showWordLimit="true"
v-model="value1"
<el-date-picker class="timeinput"
v-model="bidOpenTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="待添加" @change="nowedit = -1">
placeholder="待添加" @change="changes({'bidOpenTime':bidOpenTime})">
</el-date-picker>
</div>
<span :class="{'txt':!value1}" @click="nowedit = 14">{{value1||"待添加"}}<i class="el-icon-caret-bottom"></i></span>
<span :class="{'txt':!bidOpenTime}">{{bidOpenTime||"待添加"}}<i class="el-icon-caret-bottom"></i></span>
</div>
</div>
</div>
......@@ -142,26 +142,26 @@
<span>保证金缴纳 :</span>
<div class="inputxt">
<div class="flex" v-if="nowedit == 5">
<el-input placeholder="待添加"></el-input>
<el-input placeholder="待添加" v-model="earnestMoneyPay"></el-input>
<div class="flex">
<div class="btnsmall btn_primary h28" style="width: 56px">确定</div>
<div class="btnsmall btn_primary h28" @click="changes({'earnestMoneyPay':earnestMoneyPay})" style="width: 56px">确定</div>
<div class="cancels h28" @click="nowedit = -1" style="">取消</div>
</div>
</div>
<span class="txt" v-else @click="nowedit = 5">待添加</span>
<span :class="{'txt':!earnestMoneyPay}" v-else @click="nowedit = 5">{{earnestMoneyPay||'待添加'}}</span>
</div>
</div>
<div class="con i">
<span>保证金金额(万元) :</span>
<div class="inputxt">
<div class="flex" v-if="nowedit == 6">
<el-input placeholder="待添加"></el-input>
<el-input placeholder="待添加" v-model="earnestMoney"></el-input>
<div class="flex">
<div class="btnsmall btn_primary h28" style="width: 56px">确定</div>
<div class="btnsmall btn_primary h28" @click="changes({'earnestMoney':earnestMoney})" style="width: 56px">确定</div>
<div class="cancels h28" @click="nowedit = -1" style="">取消</div>
</div>
</div>
<span class="txt" v-else @click="nowedit = 6">待添加</span>
<span :class="{'txt':!earnestMoney}" v-else @click="nowedit = 6">{{earnestMoney||'待添加'}}</span>
</div>
</div>
</div>
......@@ -170,26 +170,26 @@
<span>开标地点 :</span>
<div class="inputxt">
<div class="flex" v-if="nowedit == 7">
<el-input placeholder="待添加"></el-input>
<el-input placeholder="待添加" v-model="bidOpenPlace"></el-input>
<div class="flex">
<div class="btnsmall btn_primary h28" style="width: 56px">确定</div>
<div class="btnsmall btn_primary h28" @click="changes({'bidOpenPlace':bidOpenPlace})" style="width: 56px">确定</div>
<div class="cancels h28" @click="nowedit = -1" style="">取消</div>
</div>
</div>
<span class="txt" v-else @click="nowedit = 7">待添加</span>
<span :class="{'txt':!bidOpenPlace}" v-else @click="nowedit = 7">{{bidOpenPlace||'待添加'}}</span>
</div>
</div>
<div class="con i">
<span>评标委员会 :</span>
<div class="inputxt">
<div class="flex" v-if="nowedit == 8">
<el-input placeholder="待添加"></el-input>
<el-input placeholder="待添加" v-model="evaluationBidCouncil"></el-input>
<div class="flex">
<div class="btnsmall btn_primary h28" style="width: 56px">确定</div>
<div class="btnsmall btn_primary h28" @click="changes({'evaluationBidCouncil':evaluationBidCouncil})" style="width: 56px">确定</div>
<div class="cancels h28" @click="nowedit = -1" style="">取消</div>
</div>
</div>
<span class="txt" v-else @click="nowedit = 8">待添加</span>
<span :class="{'txt':!evaluationBidCouncil}" v-else @click="nowedit = 8">{{evaluationBidCouncil||'待添加'}}</span>
</div>
</div>
</div>
......@@ -200,28 +200,67 @@
<script>
import "@/assets/styles/project.scss"
import {getJSNR,editXMSL} from '@/api/project/project'
export default {
name: 'jsnr',
data(){
return{
textarea:"",
nowedit:-1,//当前正在编辑的文本
value1:'',
money:'',
id:parseInt(this.$route.query.id),
investmentAmount: '',//总投资额
amountSource: '',//资金来源
buildProperty: '',//建设性质
planBidTime: '',//计划招标
planStartTime: '',//计划开工
planCompleteTime: '',//计划竣工
projectDetails: '',//项目概况与建设规模
evaluationBidWay: '',//评标办法
bidOpenTime: '',//开标时间
bidOpenPlace: '',//开标地点
earnestMoney: '',//保证金金额
earnestMoneyPay: '',//保证金缴纳
evaluationBidCouncil: '',//评标委员会
}
},
watch:{
// nowedit(oldvalue,newvalue){
// if (newvalue == 13){
// this.$ref.newvalue13.=true
// }
// }
},
created(){
this.getJSNR()
},
methods:{
getJSNR(){
getJSNR(this.id).then(result=>{
this.investmentAmount = result.data.investmentAmount//总投资额
this.amountSource = result.data.amountSource//资金来源
this.buildProperty = result.data.buildProperty//建设性质
this.planBidTime = result.data.planBidTime//计划招标
this.planStartTime = result.data.planStartTime//计划开工
this.planCompleteTime = result.data.planCompleteTime//计划竣工
this.projectDetails = result.data.projectDetails//项目概况与建设规模
this.evaluationBidWay = result.data.evaluationBidWay//评标办法
this.bidOpenTime = result.data.bidOpenTime//开标时间
this.bidOpenPlace = result.data.bidOpenPlace//开标地点
this.earnestMoney = result.data.earnestMoney//保证金金额
this.earnestMoneyPay = result.data.earnestMoneyPay//保证金缴纳
this.evaluationBidCouncil = result.data.evaluationBidCouncil//评标委员会
})
},
changes(str){
this.nowedit = -1
let param = str
param.id = this.id
editXMSL(param).then(result=>{
if(result.code == 200)
this.$message.success('修改成功')
else{
this.getJSNR()
}
})
},
//输入数字
number(value){
console.log(value)
this.money = value.replace(/^\D*(\d*(?:\.\d{0,6})?).*$/g, '$1')//输入6位小数
this.investmentAmount = this.investmentAmount == ""||this.investmentAmount == null? value.replace(/^\D*(\d*(?:\.\d{0,6})?).*$/g, '$1'):null//输入6位小数
},
}
}
......
......@@ -13,12 +13,12 @@
<div class="empty">
<img src="@/assets/images/project/empty.png">
<div class="p1">暂无数据展示</div>
<div class="p2">抱歉,你还未添加相关数据,快去添加吧</div>
<div class="p2">抱歉你还未添加相关数据,快去添加吧</div>
<div class="btn btn_primary h36 w102" @click="opennew">新增联系人</div>
</div>
</template>
<el-table-column
prop="date"
prop="name"
label="姓名"
width="113">
</el-table-column>
......@@ -27,34 +27,34 @@
label="操作"
width="118">
<template slot-scope="scope">
<div class="edit">
<div class="edit" @click="getDetail(scope.row)">
<img src="@/assets/images/project/edit.png">
<span>编辑</span>
</div>
</template>
</el-table-column>
<el-table-column
prop="name"
prop="role"
label="角色"
sortable
width="146">
</el-table-column>
<el-table-column
prop="address"
prop="office"
label="公司/机关">
</el-table-column>
<el-table-column
prop="name"
prop="position"
label="职位"
width="125">
</el-table-column>
<el-table-column
prop="name"
prop="phone"
label="联系方式"
width="175">
</el-table-column>
<el-table-column
prop="name"
prop="accendant"
label="内部维护人"
width="146">
</el-table-column>
......@@ -63,11 +63,11 @@
<div class="btn btn_primary h28" @click="opennew"><div class="img img1"></div>新增联系人</div>
<el-pagination
background
:page-size="20"
:current-page="1"
:page-size="searchParam.pageSize"
:current-page="searchParam.pageNum"
@current-change="handleCurrentChange"
layout="prev, pager, next"
:total="1000">
:total="total">
</el-pagination>
</div>
</div>
......@@ -77,33 +77,30 @@
width="464px">
<div class="poptitle">
<img src="@/assets/images/economies/icon.png">
<span>重庆市轨道交通3号线二期工程4标段施工总承包</span>
<span>{{projectname}}</span>
</div>
<el-form class="popform" label-width="137px">
<el-form-item label="联系人姓名:" class="row">
<el-input type="text" placeholder="请输入"></el-input>
<el-input type="text" v-model="queryParam.name" placeholder="请输入"></el-input>
</el-form-item>
<el-form-item label="联系人角色:" class="row">
<el-select placeholder="请选择">
<el-option label="cccc" value="11"></el-option>
<el-option label="cccc" value="121"></el-option>
</el-select>
<el-input type="text" v-model="queryParam.role" placeholder="请输入"></el-input>
</el-form-item>
<el-form-item label="联系人职位:" class="row">
<el-input type="text" placeholder="请输入"></el-input>
<el-input type="text" v-model="queryParam.position" placeholder="请输入"></el-input>
</el-form-item>
<el-form-item label="联系人公司/机关:" class="row">
<el-input type="text" placeholder="请输入"></el-input>
<el-input type="text" v-model="queryParam.office" placeholder="请输入"></el-input>
</el-form-item>
<el-form-item label="内部维护人:" class="row">
<el-input type="text" placeholder="请输入"></el-input>
<el-input type="text" v-model="queryParam.accendant" placeholder="请输入"></el-input>
</el-form-item>
<el-form-item label="联系方式:" class="row">
<el-input type="text" placeholder="请输入"></el-input>
<el-input type="text" v-model="queryParam.phone" placeholder="请输入"></el-input>
</el-form-item>
<div class="popbot">
<div class="btn btn_cancel h32" @click="cancel">返回</div>
<div class="btn btn_primary h32">保存</div>
<div class="btn btn_primary h32" @click="save">保存</div>
</div>
</el-form>
</el-dialog>
......@@ -113,40 +110,68 @@
<script>
import "@/assets/styles/project.scss"
import {getLXR,editLXR,addLXR} from '@/api/project/project'
export default {
name: 'lxr',
data(){
return{
dialogVisible:false,
isnew:true,//是否新增
textarea:"",
nowedit:-1,//当前正在编辑的文本
tipslit:[],//项目标签
tipsvalue:"",//标签填写内容
tableData: [
{
date: '2016-05-02',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}, {
date: '2016-05-04',
name: '王小虎',
address: '上海市普陀区金沙江路 1517 弄'
}, {
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1519 弄'
}, {
date: '2016-05-03',
name: '王小虎',
address: '上海市普陀区金沙江路 1516 弄'
}
]
tableData: [],
searchParam:{
pageNum:1,
pageSize:20,
businessId:this.$route.query.id
},
id:this.$route.query.id,
total:0,
projectname:this.$route.query.projectname,
queryParam:[],
}
},
created(){
this.getList()
},
methods:{
getDetail(item){
this.dialogVisible = true
this.queryParam = item
this.isnew = false
},
getList(){
getLXR(this.searchParam).then(result=>{
this.tableData = result.code == 200?result.rows:[]
this.total = result.code == 200?result.total:0
})
},
save(){
if(this.isnew == false){
editLXR(this.queryParam).then(result=>{
if(result.code == 200){
this.$message.success('保存成功!')
this.getList()
this.dialogVisible = false
}
})
}
if(this.isnew == true){
addLXR(this.queryParam).then(result=>{
if(result.code == 200){
this.$message.success('新增成功!')
this.getList()
this.dialogVisible = false
}
})
}
},
//翻页
handleCurrentChange(val) {
console.log(`当前页: ${val}`);
this.searchParam.pageNum = val
this.getList()
},
cancel(){
this.dialogVisible = false
......@@ -154,6 +179,16 @@
//打开新建窗口
opennew(){
this.dialogVisible = true
this.isnew = true
this.queryParam = {
businessId:this.id,
name:"",
role:"",
office:"",
position:"",
phone:"",
accendant:"",
}
},
}
}
......
......@@ -22,7 +22,7 @@
<div class="empty">
<img src="@/assets/images/project/empty.png">
<div class="p1">暂无数据展示</div>
<div class="p2">抱歉,你还未添加相关数据,快去添加吧</div>
<div class="p2">抱歉你还未添加相关数据,快去添加吧</div>
<div class="btn btn_primary h36 w102" @click="opennew">新增联系人</div>
</div>
</template>
......
......@@ -169,8 +169,12 @@
<script>
import "@/assets/styles/project.scss"
import {getDictType,} from '@/api/main'
import {} from '@/api/project/project'
export default {
name: 'xmsl',
props:{
datas:'',
},
data(){
return{
nowedit:-1,//当前正在编辑的文本
......@@ -178,10 +182,10 @@
tipsvalue:"",//标签填写内容
xmjd:'待添加',
projectStage:[],//项目阶段
sldata:this.datas,
}
},
created(){
//项目阶段
getDictType('project_stage_type').then(result=>{
this.projectStage = result.code == 200 ? result.data:[]
......
......@@ -49,7 +49,7 @@
<div class="empty">
<img src="@/assets/images/project/empty.png">
<div class="p1">暂无数据展示</div>
<div class="p2">抱歉,你还未添加相关数据,快去添加吧</div>
<div class="p2">抱歉你还未添加相关数据,快去添加吧</div>
<div class="btn btn_primary h36 w102" @click="opennew">新增联系人</div>
</div>
</template>
......
......@@ -103,7 +103,7 @@
</div>
</el-card>
<!--项目概览-->
<xmsl v-if="thistag == 'xmsl'"></xmsl>
<xmsl v-if="thistag == 'xmsl'" :datas="ProjectData"></xmsl>
<!--建设内容-->
<jsnr v-if="thistag == 'jsnr'"></jsnr>
<!--联系人-->
......@@ -132,6 +132,7 @@
import zlwd from './component/zlwd.vue'
import xgqy from './component/xgqy.vue'
import prvinceTree from '@/assets/json/provinceTree'
import {getXMSL} from '@/api/project/project'
export default {
name: 'detail',
components: {xmsl,jsnr,lxr,gjjl,gzdb,zlwd,xgqy},
......@@ -148,7 +149,7 @@
{tag:'zlwd',name:'资料文档'},
{tag:'xgqy',name:'相关企业'},
],
thistag:'xgqy',
thistag:'xmsl',
xmlx:'请选择',//项目类型
xmlb:'请选择',//项目类别
islock:true,//仅自己可见
......@@ -161,10 +162,13 @@
addressList:[],
domicile:[],
props:{ checkStrictly: true, expandTrigger: 'hover' },
id:'',
ProjectData:null,
}
},
created(){
this.prvinceTree()
this.id = this.$route.query.id
//项目阶段
getDictType('project_stage_type').then(result=>{
this.projectStage = result.code == 200 ? result.data:[]
......@@ -177,6 +181,12 @@
getDictType('project_category').then(result=>{
this.projectCategory = result.code == 200 ? result.data:[]
})
//获取基本信息
getXMSL(this.id).then(result=>{
this.ProjectData = result.code==200?result.data:[]
this.$route.query.projectname = result.data.projectName
})
},
methods: {
//地区
......
......@@ -3,7 +3,7 @@
<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"><div class="img img2"></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>
......@@ -19,8 +19,8 @@
地区团队
</span>
<div class="select-popper">
<span :class="{ color_text:searchParam.province.length ||searchParam.city.length ||searchParam.area.length,}">
项目地区{{searchParam.province.length ||searchParam.city.length ||searchParam.area.length? searchParam.province.length +searchParam.city.length +searchParam.area.length +"项": ""}}
<span :class="{ color_text:searchParam.provinceId.length ||searchParam.cityId.length ||searchParam.districtId.length,}">
项目地区{{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"
......@@ -98,14 +98,23 @@
<el-card class="box-card noborder overflows">
<div class="titles">项目明细
<div class="dc">
<div class="total">126</div>
<div class="total">{{total}}</div>
<div class="btn-export"><img src="@/assets/images/EXCEL.png">导出EXCEL</div>
</div>
</div>
<div class="tables" v-if="total == 0">
<div class="empty">
<img src="@/assets/images/project/empty.png">
<div class="p1">添加你的第一个项目吧</div>
<div class="p2">抱歉,你还未添加项目,快去添加吧</div>
<div class="btn btn_primary h36 w88" @click="addNew(true)">新建商机</div>
<div class="btn btn_primary btn_shallow h36 w88" @click="pldrs">批量导入</div>
</div>
</div>
<div class="datalist">
<div class="datali">
<div class="det-title" @click="toDetail()">轨道交通13号线扩能提升工程<span class="people"><i>A</i>四川-李丽 <font color="#FA8A00">正在跟进</font></span></div>
<div class="det-tips"><span class="tips tip1">轨道交通</span><span class="tips tip2">江西省-南昌市</span></div>
<div class="datali" v-for="(item,index) in datalist">
<div class="det-title" @click="toDetail(item.id)">{{item.projectName}}<span v-if="activeName!='first'" class="people"><i>A</i>四川-李丽 <font color="#FA8A00" v-if="activeName!='first'">正在跟进</font></span></div>
<div class="det-tips"><span class="tips tip1" v-if="item.label">{{item.label}}</span><span v-if="item.address" class="tips tip2">{{item.address}}</span></div>
<div class="det-contets">
<div class="det-con">
<span>项目类型:</span>
......@@ -113,35 +122,48 @@
</div>
<div class="det-con">
<span>投资估算(万元):</span>
<span>21</span>
<span>{{item.investmentAmount}}</span>
</div>
<div class="det-con">
<span>最后跟进时间:</span>
<span>2013-02-19</span>
<span>{{item.followTime || '--'}}</span>
</div>
<div class="det-con">
<span>业主单位:</span>
<span class="wordprimary">重庆市交通开发投资(集团)有限公司</span>
<span class="wordprimary">{{item.ownerCompany}}</span>
</div>
</div>
<el-divider></el-divider>
<div class="operates">
<div class="operates" v-if="activeName=='first'">
<div class="i1"><img src="@/assets/images/follow.png">跟进</div>
<div class="i2"><img src="@/assets/images/edit.png">编辑</div>
<div class="i3"><img src="@/assets/images/delete.png">删除</div>
<div class="i3" @click="deldetail(index)"><img src="@/assets/images/delete.png">删除</div>
</div>
<div class="delform">
<div class="delform" v-if="activeName=='first' && ondel == index">
<div class="words">是否将项目删除</div>
<div>
<div class="btnsmall btn_primary h28">确定</div>
<div class="btnsmall btn_cancel h28">取消</div>
<div class="btnsmall btn_primary h28" @click="deleteProject(item.id)">确定</div>
<div class="btnsmall btn_cancel h28" @click="ondel = -1">取消</div>
</div>
</div>
</div>
</div>
<div class="tables">
<div class="bottems" v-if="total>0">
<el-pagination
background
:page-size="searchParam.pageSize"
:current-page="searchParam.pageNum"
@current-change="handleCurrentChange"
layout="prev, pager, next"
:total="total">
</el-pagination>
</div>
</div>
</el-card>
<addproject v-if="isshow" @addproject="add" @cancel="addNew"></addproject>
<batchimport v-if="pldr" :importtype="types" @cancels="cancelimport" @getdatas="getdatas"></batchimport>
</div>
</template>
......@@ -149,18 +171,21 @@
import "@/assets/styles/project.scss"
import "@/assets/styles/public.css"
import prvinceTree from '@/assets/json/provinceTree'
import {getProjectlist} from '@/api/project/project'
import {getProjectlist,delProject} from '@/api/project/project'
import {getDictType,} from '@/api/main'
import addproject from './component/addProject'
import batchimport from './component/batchImport'
export default {
name: 'ProjectList',
components:{addproject},
components:{addproject,batchimport},
data() {
return {
types:'project',
props:{multiple: true},
activeName:'first',
projectStage:[],//项目阶段
isshow:false,//新增商机
pldr:false,//批量导入
//项目地区
addressList:[],
addressType: [],
......@@ -168,6 +193,7 @@ export default {
minAmount:'',//投资估算最小值
maxAmount:'',//投资估算最大值
searchParam: {
userId:null,//个人项目需传,公司项目不传
projectName:'',//项目名称
ownerCompany:'',//业主单位
projectType:'',//项目类型
......@@ -175,9 +201,9 @@ export default {
minAmount:'',//投资估算最小值
maxAmount:'',//投资估算最大值
Amount:'',//投资估算
province: [],
city: [],
area: [],
provinceId: [],
cityId: [],
districtId: [],
pageNum:1,
pageSize:10,
},
......@@ -204,6 +230,9 @@ export default {
],
contractSignTimeValue: "",
transactionPriceShowPopper: false,
datalist:[],//列表数据
ondel:-1,
total:0,
}
},
created() {
......@@ -223,17 +252,55 @@ export default {
})
},
methods: {
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)
}
})
},
getdatas(){
this.getList(1)
},
cancelimport(){
this.pldr = false
},
pldrs(){
this.pldr = true
},
//获取商机列表
getList(pageNum){
this.searchParam.pageNum = pageNum
console.log(this.searchParam)
return false
if(this.activeName == 'first'){
this.searchParam.userId = this.$store.state.user.userId
}else{
this.searchParam.userId = null
}
getProjectlist(this.searchParam).then(result=>{
console.log(result)
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
})
}
})
},
reset(){
this.searchParam ={
userId:null,
projectName:'',//项目名称
ownerCompany:'',//业主单位
projectType:'',//项目类型
......@@ -241,9 +308,9 @@ export default {
minAmount:'',//投资估算最小值
maxAmount:'',//投资估算最大值
Amount:'',//投资估算
province: [],
city: [],
area: [],
provinceId: [],
cityId: [],
districtId: [],
pageNum:1,
pageSize:10,
}
......@@ -287,9 +354,8 @@ export default {
this.isshow = false
this.getList(1)
},
toDetail(){
let Id = '111'
this.$router.push({ path: '/project/projectList/detail', query: Id });
toDetail(id){
this.$router.push({ path: '/project/projectList/detail', query: {id:id} });
},
handleClick(){
......@@ -299,27 +365,27 @@ export default {
// var labelString = this.$refs.myCascader.getCheckedNodes()[0].pathLabels;
let arr = this.$refs.myCascader.getCheckedNodes();
// console.log(arr)
let province = [],
city = [],
area = [];
let provinceId = [],
cityId = [],
districtId = [];
this.domicile = [];
for (var i in arr) {
if (arr[i].parent) {
if (!arr[i].parent.checked) {
arr[i].hasChildren && city.push(arr[i].value);
arr[i].hasChildren && cityId.push(arr[i].value);
arr[i].hasChildren && this.domicile.push(arr[i].label);
!arr[i].hasChildren && area.push(arr[i].value);
!arr[i].hasChildren && districtId.push(arr[i].value);
!arr[i].hasChildren && this.domicile.push(arr[i].label);
}
} else {
province.push(arr[i].value);
provinceId.push(arr[i].value);
this.domicile.push(arr[i].label);
}
}
var obj = JSON.parse(JSON.stringify(this.searchParam));
obj.province = province;
obj.city = city;
obj.area = area;
obj.provinceId = provinceId;
obj.cityId = cityId;
obj.districtId = districtId;
this.searchParam = obj;
},
......@@ -358,6 +424,11 @@ export default {
this.searchParam = obj;
}
},
//翻页
handleCurrentChange(val) {
this.getList(val)
},
}
}
</script>
......@@ -542,4 +613,7 @@ export default {
padding: 0;
}
}
.btn{
padding: 0 12px;
}
</style>
package com.dsk.system.domain;
import com.dsk.common.utils.StringUtils;
import lombok.Data;
/**
......@@ -60,6 +61,6 @@ public class BusinessAddDto {
private String customerId;
public Double getInvestmentAmount() {
return Double.parseDouble(investmentAmount);
return StringUtils.isEmpty(investmentAmount) ? 0 :Double.parseDouble(investmentAmount);
}
}
package com.dsk.system.domain;
import com.dsk.common.utils.StringUtils;
import lombok.Data;
/**
* @author lxl
* @Description:
* @Date 2023/6/1 下午 6:41
**/
@Data
public class BusinessExcelDto {
/**
* 项目名称
*/
private String projectName;
/**
* 投资估算(万元)
*/
private String investmentAmount;
/**
* 业主单位
*/
private String ownerCompany;
}
......@@ -2,6 +2,8 @@ package com.dsk.system.domain;
import lombok.Data;
import java.util.List;
/**
* @author lxl
* @Description:
......@@ -28,17 +30,17 @@ public class BusinessListDto {
/**
* 省id
*/
private Integer provinceId;
private List<Integer> provinceId;
/**
* 市id
*/
private Integer cityId;
private List<Integer> cityId;
/**
* 区id
*/
private Integer districtId;
private List<Integer> districtId;
/**
* 项目类型
......
......@@ -29,6 +29,10 @@ public class Customer implements Serializable {
* jsk企业id
*/
private Integer companyId;
/**
* 城投企业id
*/
private String uipId;
/**
* 客户名称(企业名称)
*/
......
......@@ -14,6 +14,10 @@ public class CustomerListVo {
* jsk企业id
*/
private Integer companyId;
/**
* 城投企业id
*/
private String uipId;
/**
* 客户名称(企业名称)
*/
......
package com.dsk.system.domain.customer.vo;
import lombok.Data;
import java.io.Serializable;
/**
* 客户状态列表
*
* @author lcl
* @create 2023/5/22
*/
@Data
public class CustomerStatusListVo implements Serializable {
/**
* 客户id
*/
private String customerId;
/**
* 城投id
*/
private String uipId;
}
......@@ -26,17 +26,17 @@ public class BusinessListVo {
/**
* 省
*/
private Integer provinceName;
private String provinceName;
/**
* 市
*/
private Integer cityName;
private String cityName;
/**
* 区
*/
private Integer districtName;
private String districtName;
/**
* 投资估算
......
......@@ -107,13 +107,13 @@ public class EnterpriseProjectService {
public TableDataInfo bidPlanPage(Object body) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBodyLocal("/operate/enterpriseProject/bidPlanPage", BeanUtil.beanToMap(body, false, false));
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseProject/bidPlanPage", BeanUtil.beanToMap(body, false, false));
return dskOpenApiUtil.responsePage(map);
}
public R bidPlanDetail(Object body) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBodyLocal("/operate/enterpriseProject/bidPlanDetail", BeanUtil.beanToMap(body, false, false));
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterpriseProject/bidPlanDetail", BeanUtil.beanToMap(body, false, false));
Map data = MapUtils.getMap(map, "data", null);
String contentId = MapUtils.getString(data, "contentId");
if (ObjectUtil.isEmpty(contentId)) {
......
package com.dsk.system.dskService;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.json.JSONUtil;
import com.dsk.acc.openapi.client.util.CommonUtils;
import com.dsk.common.core.domain.R;
import com.dsk.common.core.domain.model.*;
import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.utils.DskOpenApiUtil;
import com.dsk.system.domain.customer.vo.CustomerStatusListVo;
import com.dsk.system.service.ICustomerService;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
......@@ -28,6 +37,9 @@ public class EnterpriseService {
@Autowired
private DskOpenApiUtil dskOpenApiUtil;
@Autowired
ICustomerService iCustomerService;
public R infoHeader(EnterpriseInfoHeaderBody body) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/api/jsk/enterprise/infoHeader", BeanUtil.beanToMap(body, false, false));
return BeanUtil.toBean(map, R.class);
......@@ -128,4 +140,52 @@ public class EnterpriseService {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterprise/financial", BeanUtil.beanToMap(body, false, false));
return BeanUtil.toBean(map, R.class);
}
public R getUipId(String companyName) throws Exception {
Map<String, Object> params = new HashMap<>();
params.put("companyName",companyName);
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterprise/getUipId", params);
return BeanUtil.toBean(map, R.class);
}
public TableDataInfo uipSerach(EnterpriseUipSearchBody body) throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterprise/uipSerach", BeanUtil.beanToMap(body, false, false));
Integer code = MapUtils.getInteger(map, "code", 300);
if (200 != code) throw new RuntimeException();
Map data = MapUtils.getMap(map, "data", null);
List<Object> list = CommonUtils.assertAsArray(MapUtils.getObject(data, "list", ""));
if (CollectionUtils.isEmpty(list)) {
return new TableDataInfo(list, 0);
}
ArrayList<String> uipIds = new ArrayList<>();
for (Object dataMap : list) {
uipIds.add(MapUtils.getString(CommonUtils.assertAsMap(dataMap), "uipId"));
}
List<CustomerStatusListVo> claimStatusList = iCustomerService.selectStatusList(uipIds);
//按照城投企业id合并两个list
for (Object companyObj : list) {
Map<String, Object> companyMap = CommonUtils.assertAsMap(companyObj);
String uipId = MapUtils.getString(companyMap, "uipId");
if (CollectionUtils.isEmpty(claimStatusList)) {
companyMap.put("claimStatus", 0);
}
for (CustomerStatusListVo vo : claimStatusList) {
if (uipId.equals(vo.getUipId())) {
companyMap.put("claimStatus", 1);
}
}
}
return new TableDataInfo(list, MapUtils.getInteger(data, "totalCount", 0));
}
public R uipGroupData() throws Exception {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterprise/uipGroupData", null);
return BeanUtil.toBean(map, R.class);
}
}
......@@ -90,7 +90,13 @@ public interface BusinessInfoMapper extends BaseMapper<BusinessInfo>
*/
BusinessBrowseVo selectTotal(Integer business);
/**
* 查询项目名称是否存在
* @param projectName
* @param userId
* @return
*/
int isRepetitionProjectName(@Param("projectName") String projectName,@Param("userId") Integer userId);
int selectCountByStatusAndCustomerId(@Param("status") Integer status,@Param("customerId") String customerId);
......
......@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.system.domain.customer.Customer;
import com.dsk.system.domain.customer.dto.CustomerSearchDto;
import com.dsk.system.domain.customer.vo.CustomerListVo;
import com.dsk.system.domain.customer.vo.CustomerStatusListVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
......@@ -23,7 +24,9 @@ public interface CustomerMapper extends BaseMapper<Customer> {
List<Customer> selectUserList(Long userId);
Customer selectByCompanyIdAndUserId(@Param("companyId")Integer companyId,@Param("userId")Long userId);
Customer selectByCompanyNameAndUserId(@Param("companyName") String companyName, @Param("userId") Long userId);
List<CustomerStatusListVo> selectStatusList(@Param("uipIds") List<String> uipIds, @Param("userId") Long userId);
}
......@@ -2,6 +2,7 @@ package com.dsk.system.service;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.dtos.OpRegionalEconomicDataV1Dto;
import com.dsk.common.dtos.OpRegionalEconomicDataV1PageDto;
/**
* @ClassName EconomicService
......@@ -19,7 +20,7 @@ public interface EconomicService {
*@Author: Dgm
*@date: 2023/5/18 10:25
*/
AjaxResult nationalPage(OpRegionalEconomicDataV1Dto dto);
AjaxResult nationalPage(OpRegionalEconomicDataV1PageDto dto);
/***
*@Description: 全国经济大全详情
......
......@@ -8,7 +8,9 @@ import com.dsk.system.domain.customer.dto.CustomerBusinessSearchDto;
import com.dsk.system.domain.customer.vo.CustomerBusinessListVo;
import com.dsk.system.domain.vo.BusinessBrowseVo;
import com.dsk.system.domain.vo.BusinessListVo;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
......@@ -56,6 +58,11 @@ public interface IBusinessInfoService
*/
List<String> selectProjectName(BusinessListDto dto);
/**
* 项目批量导入
*/
AjaxResult batchUpload(MultipartFile file);
/**
* 新增项目详情
*
......
......@@ -5,6 +5,7 @@ import com.dsk.system.domain.customer.dto.CustomerBusinessSearchDto;
import com.dsk.system.domain.customer.dto.CustomerSearchDto;
import com.dsk.system.domain.customer.vo.CustomerBusinessListVo;
import com.dsk.system.domain.customer.vo.CustomerListVo;
import com.dsk.system.domain.customer.vo.CustomerStatusListVo;
import com.dsk.system.domain.customer.vo.CustomerVo;
import java.util.List;
......@@ -29,4 +30,6 @@ public interface ICustomerService {
List<CustomerBusinessListVo> selectBusinessList(CustomerBusinessSearchDto dto);
List<CustomerStatusListVo> selectStatusList(List<String> uipIds);
}
package com.dsk.system.service.impl;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.dsk.common.constant.HttpStatus;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.core.domain.entity.BusinessInfo;
import com.dsk.common.core.domain.entity.BusinessLabel;
import com.dsk.common.core.domain.entity.BusinessRelateCompany;
import com.dsk.common.core.domain.entity.BusinessUser;
import com.dsk.common.dtos.BusinessInfoDto;
import com.dsk.common.exception.base.BaseException;
import com.dsk.common.utils.DateUtils;
import com.dsk.common.utils.SecurityUtils;
import com.dsk.system.domain.BusinessExcelDto;
import com.dsk.system.domain.BusinessAddDto;
import com.dsk.system.domain.BusinessListDto;
import com.dsk.system.domain.customer.dto.CustomerBusinessSearchDto;
......@@ -24,11 +29,14 @@ import com.dsk.system.mapper.BusinessLabelMapper;
import com.dsk.system.mapper.BusinessRelateCompanyMapper;
import com.dsk.system.mapper.BusinessUserMapper;
import com.dsk.system.service.IBusinessInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
/**
* 项目详情Service业务层处理
......@@ -37,6 +45,7 @@ import javax.annotation.Resource;
* @date 2023-05-17
*/
@Service
@Slf4j
public class BusinessInfoServiceImpl implements IBusinessInfoService {
@Resource
private BusinessInfoMapper businessInfoMapper;
......@@ -46,6 +55,8 @@ public class BusinessInfoServiceImpl implements IBusinessInfoService {
private BusinessRelateCompanyMapper businessRelateCompanyMapper;
@Resource
private BusinessLabelMapper businessLabelMapper;
@Resource
private ReadBusinessInfoExcel readBusinessInfoExcel;
/**
* 查询项目详情
......@@ -71,6 +82,11 @@ public class BusinessInfoServiceImpl implements IBusinessInfoService {
*/
@Override
public List<BusinessListVo> selectBusinessInfoList(BusinessListDto dto) {
if (dto.getUserId() == null) {
Long deptId = SecurityUtils.getLoginUser().getDeptId();
if (deptId == null) throw new BaseException("请登录");
dto.setDeptId(deptId.intValue());
}
return businessInfoMapper.selectBusinessInfoList(dto);
}
......@@ -79,7 +95,7 @@ public class BusinessInfoServiceImpl implements IBusinessInfoService {
BusinessBrowseVo businessBrowseVo = new BusinessBrowseVo();
//查询项目基本信息
BusinessInfo businessInfo = businessInfoMapper.selectBusinessInfoById(businessId);
BeanUtil.copyProperties(businessInfo,businessBrowseVo);
BeanUtil.copyProperties(businessInfo, businessBrowseVo);
//查询项目标签
businessBrowseVo.setLabelList(businessLabelMapper.selectBusinessLabelList(new BusinessLabel(businessId)).stream().map(p -> p.getLabel()).collect(Collectors.toList()));
//查询关键企业
......@@ -97,6 +113,40 @@ public class BusinessInfoServiceImpl implements IBusinessInfoService {
return businessInfoMapper.selectProjectName(dto);
}
@Override
public AjaxResult batchUpload(MultipartFile file) {
//获取当前登录用户id
Long userId = SecurityUtils.getLoginUser().getUserId();
// Long userId = 103L;
if (userId == null) return AjaxResult.error("请登录");
int row = 3;//起始行数
int rowSuccess = 0;//成功条数
Integer errorCount = 0;//失败条数
List<String> result = new LinkedList();//导入结果汇总
List<BusinessExcelDto> businessInfoList = readBusinessInfoExcel.getExcelInfo(file);
for (BusinessExcelDto businessInfo : businessInfoList) {
//查询已有的项目名称
Integer count = businessInfoMapper.isRepetitionProjectName(businessInfo.getProjectName(), userId.intValue());
row++;
if (count > 0) {
//如果存在,跳过该项目,不保存
result.add("第" + row + "行的" + businessInfo.getProjectName() + "的项目已存在,跳过该项目,保存下一条");
errorCount++;
} else {
//保存到数据库
BusinessAddDto businessAddDto = new BusinessAddDto();
BeanUtil.copyProperties(businessInfo, businessAddDto);
businessAddDto.setUserId(userId.intValue());
businessAddDto.setCompanyId(0);
AjaxResult add = insertBusinessInfo(businessAddDto);
if (add.get("code").equals(HttpStatus.SUCCESS)) rowSuccess++;
}
}
result.add("导入项目成功条数" + rowSuccess);
result.add("导入项目失败条数" + errorCount);
return errorCount == businessInfoList.size() ? AjaxResult.error(String.join(",", result)) : AjaxResult.success(String.join(",", result));
}
/**
* 新增项目详情
*
......@@ -106,6 +156,9 @@ public class BusinessInfoServiceImpl implements IBusinessInfoService {
@Override
@Transactional
public AjaxResult insertBusinessInfo(BusinessAddDto dto) {
//新增前查询是否已存在
int count = businessInfoMapper.isRepetitionProjectName(dto.getProjectName(), dto.getUserId());
if (count > 0) return AjaxResult.error("项目名称已存在");
//新增项目主信息
BusinessInfo businessInfo = new BusinessInfo();
BeanUtil.copyProperties(dto, businessInfo);
......@@ -132,8 +185,7 @@ public class BusinessInfoServiceImpl implements IBusinessInfoService {
*/
@Override
@Transactional
public int updateBusinessInfo(BusinessInfo businessInfo)
{
public int updateBusinessInfo(BusinessInfo businessInfo) {
businessInfo.setUpdateTime(DateUtils.getNowDate());
return businessInfoMapper.updateBusinessInfo(businessInfo);
}
......
......@@ -2,7 +2,9 @@ package com.dsk.system.service.impl;
import cn.hutool.core.bean.BeanException;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.map.MapUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.dsk.common.core.domain.R;
import com.dsk.common.exception.ServiceException;
import com.dsk.common.utils.SecurityUtils;
import com.dsk.system.domain.customer.Customer;
......@@ -11,7 +13,9 @@ import com.dsk.system.domain.customer.dto.CustomerBusinessSearchDto;
import com.dsk.system.domain.customer.dto.CustomerSearchDto;
import com.dsk.system.domain.customer.vo.CustomerBusinessListVo;
import com.dsk.system.domain.customer.vo.CustomerListVo;
import com.dsk.system.domain.customer.vo.CustomerStatusListVo;
import com.dsk.system.domain.customer.vo.CustomerVo;
import com.dsk.system.dskService.EnterpriseService;
import com.dsk.system.mapper.CustomerMapper;
import com.dsk.system.mapper.CustomerUserMapper;
import com.dsk.system.service.IBusinessInfoService;
......@@ -41,6 +45,8 @@ public class CustomerServiceImpl implements ICustomerService {
private CustomerUserMapper customerUserMapper;
@Autowired
private IBusinessInfoService businessInfoService;
@Autowired
private EnterpriseService enterpriseService;
@Override
public List<CustomerListVo> selectList(CustomerSearchDto dto) {
......@@ -70,13 +76,20 @@ public class CustomerServiceImpl implements ICustomerService {
@Override
@Transactional(rollbackFor = Exception.class)
public boolean add(Customer customer) {
if (ObjectUtils.isEmpty(customer.getCompanyName())) throw new BeanException("企业名称不能为空");
if (ObjectUtils.isEmpty(customer.getCompanyId())) throw new BeanException("企业id不能为空");
final Long userId = SecurityUtils.getUserId();
try {
R res = enterpriseService.getUipId(customer.getCompanyName());
if (!ObjectUtils.isEmpty(res.getData())) {
customer.setUipId(MapUtil.getStr(BeanUtil.beanToMap(res.getData()), "uipId"));
}
} catch (Exception e) {
log.error("获取城投平台企业id错误!error:{}", e.getMessage());
}
Long userId = SecurityUtils.getUserId();
customer.setCreateId(userId);
customer.setUpdateId(userId);
//查重
Customer verifyCustomer = baseMapper.selectByCompanyIdAndUserId(customer.getCompanyId(), userId);
Customer verifyCustomer = baseMapper.selectByCompanyNameAndUserId(customer.getCompanyName(), userId);
if (!ObjectUtils.isEmpty(verifyCustomer)) {
throw new ServiceException("当前客户信息已存在,请勿重复添加!");
}
......@@ -111,4 +124,9 @@ public class CustomerServiceImpl implements ICustomerService {
return businessInfoService.selectCustomerBusinessList(dto);
}
@Override
public List<CustomerStatusListVo> selectStatusList(List<String> uipIds) {
return baseMapper.selectStatusList(uipIds, SecurityUtils.getUserId());
}
}
......@@ -3,6 +3,7 @@ package com.dsk.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.dtos.OpRegionalEconomicDataV1Dto;
import com.dsk.common.dtos.OpRegionalEconomicDataV1PageDto;
import com.dsk.common.utils.DskOpenApiUtil;
import com.dsk.system.service.EconomicService;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -25,8 +26,8 @@ public class EconomicServiceImpl implements EconomicService {
private DskOpenApiUtil dskOpenApiUtil;
@Override
public AjaxResult nationalPage(OpRegionalEconomicDataV1Dto dto) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/api/economic/national/nationalPage", BeanUtil.beanToMap(dto, false, false));
public AjaxResult nationalPage(OpRegionalEconomicDataV1PageDto dto) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/economic/national/nationalPage", BeanUtil.beanToMap(dto, false, false));
return BeanUtil.toBean(map, AjaxResult.class);
}
......@@ -34,25 +35,25 @@ public class EconomicServiceImpl implements EconomicService {
public AjaxResult details(Integer id) {
Map<String, Object> bodyMap = new HashMap<>(1);
bodyMap.put("id", id);
Map<String, Object> map = dskOpenApiUtil.requestBody("/api/economic/details", bodyMap);
Map<String, Object> map = dskOpenApiUtil.requestBody("/economic/details", bodyMap);
return BeanUtil.toBean(map, AjaxResult.class);
}
@Override
public AjaxResult statisticsRegional(OpRegionalEconomicDataV1Dto dto) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/api/economic/statistics/regional", BeanUtil.beanToMap(dto, false, false));
Map<String, Object> map = dskOpenApiUtil.requestBody("/economic/statistics/regional", BeanUtil.beanToMap(dto, false, false));
return BeanUtil.toBean(map, AjaxResult.class);
}
@Override
public AjaxResult regionalList(OpRegionalEconomicDataV1Dto dto) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/api/economic/regional/list", BeanUtil.beanToMap(dto, false, false));
Map<String, Object> map = dskOpenApiUtil.requestBody("/economic/regional/list", BeanUtil.beanToMap(dto, false, false));
return BeanUtil.toBean(map, AjaxResult.class);
}
@Override
public AjaxResult regionalComparison(OpRegionalEconomicDataV1Dto dto) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/api/economic/xx", BeanUtil.beanToMap(dto, false, false));
Map<String, Object> map = dskOpenApiUtil.requestBody("/economic/xx", BeanUtil.beanToMap(dto, false, false));
return BeanUtil.toBean(map, AjaxResult.class);
}
......
package com.dsk.system.service.impl;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import com.dsk.system.domain.BusinessExcelDto;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
/**
* @author lxl
* @Description:
* @Date 2023/6/1 下午 4:30
**/
@Slf4j
@Service
public class ReadBusinessInfoExcel {
// 总行数
private int totalRows = 0;
// 总条数
private int totalCells = 0;
public int getTotalRows() {
return totalRows;
}
public void setTotalRows(int totalRows) {
this.totalRows = totalRows;
}
public int getTotalCells() {
return totalCells;
}
public void setTotalCells(int totalCells) {
this.totalCells = totalCells;
}
/**
* 读EXCEL文件,获取信息集合
*
* @param mFile
* @return
*/
public List<BusinessExcelDto> getExcelInfo(MultipartFile mFile) {
String fileName = mFile.getOriginalFilename();// 获取文件名
try {
// 验证文件名是否合格
if (!validateExcel(fileName)) return null;
// 根据文件名判断文件是2003版本还是2007版本
boolean isExcel2003 = true;
if (isExcel2007(fileName)) isExcel2003 = false;
return createExcel(mFile.getInputStream(), isExcel2003);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 根据excel里面的内容读取信息
*
* @param is 输入流
* @param isExcel2003 excel是2003还是2007版本
* @return
*/
public List<BusinessExcelDto> createExcel(InputStream is, boolean isExcel2003) {
try {
Workbook wb = null;
// 当excel是2003时,创建excel2003
if (isExcel2003) {
wb = new HSSFWorkbook(is);
} else {
// 当excel是2007时,创建excel2007
wb = new XSSFWorkbook(is);
}
return readExcelValue(wb);// 读取Excel里面客户的信息
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 读取Excel内容
*
* @param wb
* @return
*/
private List<BusinessExcelDto> readExcelValue(Workbook wb) {
//得到第一个shell
Sheet sheet = wb.getSheetAt(0);
//得到Excel的行数
this.totalRows = sheet.getPhysicalNumberOfRows();
//得到Excel的列数(前提是有行数)
if (totalRows > 1 && sheet.getRow(0) != null) {
this.totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
}
// List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
ArrayList<BusinessExcelDto> list = new ArrayList<>();
//循环Excel行数
//
for (int r = 3; r < totalRows; r++) {
Row row = sheet.getRow(r);
if (row == null) {
continue;
}
//循环Excel的列
// Map<String, Object> map = new HashMap<String, Object>();
BusinessExcelDto businessExcelDto = new BusinessExcelDto();
for (int c = 0; c < this.totalCells; c++) {
Cell cell = row.getCell(c);
if (null != cell) {
if (c == 0) {
//如果是纯数字,比如你写的是25,cell.getNumericCellValue()获得是25.0,通过截取字符串去掉.0获得25
if (cell.getCellType() == CellType.NUMERIC) {
String name = String.valueOf(cell.getNumericCellValue());
businessExcelDto.setProjectName(name.substring(0, name.length() - 2 > 0 ? name.length() - 2 : 1));//项目名称
} else {
businessExcelDto.setProjectName(cell.getStringCellValue());//名称
}
} else if (c == 1) {
if (cell.getCellType() == CellType.NUMERIC) {
String company = String.valueOf(cell.getNumericCellValue());
businessExcelDto.setOwnerCompany(company.substring(0, company.length() - 2 > 0 ? company.length() - 2 : 1));//业主单位
} else {
businessExcelDto.setOwnerCompany(cell.getStringCellValue());//性别
}
} else if (c == 2) {
if (cell.getCellType() == CellType.NUMERIC) {
String amount = String.valueOf(cell.getNumericCellValue());
businessExcelDto.setInvestmentAmount(amount.substring(0, amount.length() - 2 > 0 ? amount.length() - 2 : 1));//投资估算(万元)
} else {
businessExcelDto.setInvestmentAmount(cell.getStringCellValue());
}
}
}
}
//添加到list
list.add(businessExcelDto);
}
log.info("项目批量导入Excel数据,{}",list);
return list;
}
/**
* 验证EXCEL文件
* @param filePath
* @return
*/
public boolean validateExcel(String filePath) {
if (filePath == null || !(isExcel2003(filePath) || isExcel2007(filePath))) {
log.info("文件不是excel格式");
return false;
}
return true;
}
// @描述:是否是2003的excel,返回true是2003
public static boolean isExcel2003(String filePath) {
return filePath.matches("^.+\\.(?i)(xls)$");
}
// @描述:是否是2007的excel,返回true是2007
public static boolean isExcel2007(String filePath) {
return filePath.matches("^.+\\.(?i)(xlsx)$");
}
}
......@@ -5,7 +5,6 @@ import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.dtos.ComposeQueryDto;
import com.dsk.common.utils.DskOpenApiUtil;
import com.dsk.system.service.RegionalEnterprisesService;
import com.dsk.system.service.SpecialPurposeBondsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -26,7 +25,7 @@ public class RegionalEnterprisesServiceImpl implements RegionalEnterprisesServic
@Override
public AjaxResult page(ComposeQueryDto compose) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/api/jsk/search/enterprisePage", BeanUtil.beanToMap(compose, false, false));
Map<String, Object> map = dskOpenApiUtil.requestBody("/nationzj/enterprice/page", BeanUtil.beanToMap(compose, false, false));
return BeanUtil.toBean(map, AjaxResult.class);
}
}
......@@ -28,7 +28,7 @@ public class SpecialPurposeBondsServiceImpl implements SpecialPurposeBondsServic
@Override
public AjaxResult page(SpecialPurposeBondsPageDto dto) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/api/specialPurposeBonds/projects/page", BeanUtil.beanToMap(dto, false, false));
Map<String, Object> map = dskOpenApiUtil.requestBody("/specialPurposeBonds/projects/page", BeanUtil.beanToMap(dto, false, false));
return BeanUtil.toBean(map, AjaxResult.class);
}
......@@ -36,19 +36,19 @@ public class SpecialPurposeBondsServiceImpl implements SpecialPurposeBondsServic
public AjaxResult details(String id) {
Map<String, Object> bodyMap = new HashMap<>(1);
bodyMap.put("id", id);
Map<String, Object> map = dskOpenApiUtil.requestBody("/api/specialPurposeBonds/details", bodyMap);
Map<String, Object> map = dskOpenApiUtil.requestBody("/specialPurposeBonds/details", bodyMap);
return BeanUtil.toBean(map, AjaxResult.class);
}
@Override
public AjaxResult bondStatistics(SpecialPurposeBondsDto dto) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/api/specialPurposeBonds/bond/statistics", BeanUtil.beanToMap(dto, false, false));
Map<String, Object> map = dskOpenApiUtil.requestBody("/specialPurposeBonds/bond/statistics", BeanUtil.beanToMap(dto, false, false));
return BeanUtil.toBean(map, AjaxResult.class);
}
@Override
public AjaxResult bondPage(SpecialBondInformationPageDto pageDto) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/api/specialPurposeBonds/bond/page", BeanUtil.beanToMap(pageDto, false, false));
Map<String, Object> map = dskOpenApiUtil.requestBody("/specialPurposeBonds/bond/page", BeanUtil.beanToMap(pageDto, false, false));
return BeanUtil.toBean(map, AjaxResult.class);
}
}
......@@ -26,7 +26,7 @@ public class UrbanInvestmentPlatformServiceImpl implements UrbanInvestmentPlatfo
@Override
public AjaxResult page(UrbanInvestmentPlatformDto pageDto) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/api/urbanInvestment/page", BeanUtil.beanToMap(pageDto, false, false));
Map<String, Object> map = dskOpenApiUtil.requestBody("/urbanInvestment/page", BeanUtil.beanToMap(pageDto, false, false));
return BeanUtil.toBean(map, AjaxResult.class);
}
......@@ -34,13 +34,13 @@ public class UrbanInvestmentPlatformServiceImpl implements UrbanInvestmentPlatfo
public AjaxResult details(String id) {
Map<String, Object> bodyMap = new HashMap<>(1);
bodyMap.put("id", id);
Map<String, Object> map = dskOpenApiUtil.requestBody("/api/urbanInvestment/details", bodyMap);
Map<String, Object> map = dskOpenApiUtil.requestBody("/urbanInvestment/details", bodyMap);
return BeanUtil.toBean(map, AjaxResult.class);
}
@Override
public AjaxResult statistics(UrbanInvestmentPlatformDto dto) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/api/urbanInvestment/statistics", BeanUtil.beanToMap(dto, false, false));
Map<String, Object> map = dskOpenApiUtil.requestBody("/urbanInvestment/statistics", BeanUtil.beanToMap(dto, false, false));
return BeanUtil.toBean(map, AjaxResult.class);
}
}
......@@ -29,7 +29,12 @@
<result property="createTime" column="create_time"/>
<result property="updateTime" column="update_time"/>
<result property="status" column="status"/>
<result property="customerId" column="customer_id"/>
<result property="evaluationBidWay" column="evaluation_bid_way"/>
<result property="bidOpenTime" column="bid_open_time"/>
<result property="bidOpenPlace" column="bid_open_place"/>
<result property="earnestMoneyPay" column="earnest_money_pay"/>
<result property="earnestMoney" column="earnest_money"/>
<result property="evaluationBidCouncil" column="evaluation_bid_council"/>
</resultMap>
<sql id="selectBusinessInfoVo">
......@@ -57,7 +62,13 @@
create_time,
update_time,
status,
customer_id
customer_id,
evaluation_bid_way,
bid_open_time,
bid_open_place,
earnest_money_pay,
earnest_money,
evaluation_bid_council
from business_info
</sql>
......@@ -80,15 +91,6 @@
LEFT JOIN business_user bu on bu.business_id = i.id
LEFT JOIN sys_user u on u.user_id = f.user_id
<where>
<if test="provinceId != null">
and i.province_id = #{provinceId}
</if>
<if test="cityId != null">
and i.city_id = #{cityId}
</if>
<if test="districtId != null">
and i.district_id = #{districtId}
</if>
<if test="projectType != null and projectType != ''">
and i.project_type = #{projectType}
</if>
......@@ -116,6 +118,77 @@
<if test="deptId != null">
and bu.dept_id = #{deptId} and i.is_private = 1
</if>
<if test="provinceId != null and provinceId.size > 0 and cityId == null and districtId == null">
and i.province_id in
<foreach collection="provinceId" item="provinceId" open="(" separator="," close=")">
#{provinceId}
</foreach>
</if>
<if test="cityId != null and cityId.size > 0 and provinceId == null and districtId == null">
and i.city_id in
<foreach collection="cityId" item="cityId" open="(" separator="," close=")">
#{cityId}
</foreach>
</if>
<if test="districtId != null and districtId.size > 0 and provinceId == null and cityId == null">
and i.district_id in
<foreach collection="districtId" item="districtId" open="(" separator="," close=")">
#{districtId}
</foreach>
</if>
<if test="provinceId != null and provinceId.size > 0 and cityId != null and cityId.size > 0 and districtId == null">
and (
i.province_id in
<foreach collection="provinceId" item="provinceId" open="(" separator="," close=")">
#{provinceId}
</foreach>
or i.city_id in
<foreach collection="cityId" item="cityId" open="(" separator="," close=")">
#{cityId}
</foreach>
)
</if>
<if test="provinceId != null and provinceId.size > 0 and districtId != null and districtId.size > 0 and cityId == null">
and (
i.province_id in
<foreach collection="provinceId" item="provinceId" open="(" separator="," close=")">
#{provinceId}
</foreach>
or i.district_id in
<foreach collection="districtId" item="districtId" open="(" separator="," close=")">
#{districtId}
</foreach>
)
</if>
<if test="cityId != null and cityId.size > 0 and districtId != null and districtId.size > 0 and provinceId ==null">
and (
i.city_id in
<foreach collection="cityId" item="cityId" open="(" separator="," close=")">
#{cityId}
</foreach>
or i.district_id in
<foreach collection="districtId" item="districtId" open="(" separator="," close=")">
#{districtId}
</foreach>
)
</if>
<if test="provinceId != null and provinceId.size > 0 and cityId != null and cityId.size > 0 and districtId != null and districtId.size > 0">
and (
i.province_id in
<foreach collection="provinceId" item="provinceId" open="(" separator="," close=")">
#{provinceId}
</foreach>
or i.city_id in
<foreach collection="cityId" item="cityId" open="(" separator="," close=")">
#{cityId}
</foreach>
or i.district_id in
<foreach collection="districtId" item="districtId" open="(" separator="," close=")">
#{districtId}
</foreach>
)
</if>
</where>
GROUP BY i.id
ORDER BY i.create_time DESC
......@@ -178,7 +251,12 @@
<if test="createTime != null">create_time,</if>
<if test="updateTime != null">update_time,</if>
<if test="status != null">status,</if>
<if test="customerId != null">customer_id,</if>
<if test="evaluationBidWay != null">evaluation_bid_way,</if>
<if test="bidOpenTime != null">bid_open_time,</if>
<if test="bidOpenPlace != null">bid_open_place,</if>
<if test="earnestMoneyPay != null">earnest_money_pay,</if>
<if test="earnestMoney != null">earnest_money,</if>
<if test="evaluationBidCouncil != null">evaluation_bid_council,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="projectName != null">#{projectName},</if>
......@@ -205,6 +283,12 @@
<if test="updateTime != null">#{updateTime},</if>
<if test="status != null">#{status},</if>
<if test="customerId != null">#{customerId},</if>
<if test="evaluationBidWay != null">#{evaluationBidWay},</if>
<if test="bidOpenTime != null">#{bidOpenTime},</if>
<if test="bidOpenPlace != null">#{bidOpenPlace},</if>
<if test="earnestMoneyPay != null">#{earnestMoneyPay},</if>
<if test="earnestMoney != null">#{earnestMoney},</if>
<if test="evaluationBidCouncil != null">#{evaluationBidCouncil},</if>
</trim>
</insert>
......@@ -235,6 +319,12 @@
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="status != null">status = #{status},</if>
<if test="customerId != null">customer_id = #{customerId},</if>
<if test="evaluationBidWay != null">evaluation_bid_way = #{evaluationBidWay},</if>
<if test="bidOpenTime != null">bid_open_time = #{bidOpenTime},</if>
<if test="bidOpenPlace != null">bid_open_place = #{bidOpenPlace},</if>
<if test="earnestMoneyPay != null">earnest_money_pay = #{earnestMoneyPay},</if>
<if test="earnestMoney != null">earnest_money = #{earnestMoney},</if>
<if test="evaluationBidCouncil != null">evaluation_bid_council = #{evaluationBidCouncil},</if>
</trim>
where id = #{id}
</update>
......@@ -278,8 +368,21 @@
plan_start_time,
plan_complete_time,
build_property,
project_details
project_details,
evaluation_bid_way,
bid_open_time,
bid_open_place,
earnest_money_pay,
earnest_money,
evaluation_bid_council
from business_info
where id = #{id}
</select>
<select id="isRepetitionProjectName" resultType="java.lang.Integer">
select count(i.id)
from business_info i
inner join business_user u on u.business_id = i.id
where i.project_name = #{projectName}
and u.user_id = #{userId}
</select>
</mapper>
......@@ -3,7 +3,7 @@
<mapper namespace="com.dsk.system.mapper.CustomerMapper">
<sql id="Base_Bean">
ct.customer_id, ct.company_id, ct.company_name, ct.legal_person, ct.credit_code, ct.register_capital,
ct.customer_id, ct.company_id, ct.uip_id, ct.company_name, ct.legal_person, ct.credit_code, ct.register_capital,
ct.province_id, ct.city_id, ct.district_id, ct.register_address, ct.company_nature, ct.company_level,
ct.credit_level, ct.super_company, ct.is_on, ct.is_major, ct.company_attribute, ct.main_business,
ct.business_scope, ct.customer_level, ct.business_characteristic, ct.decision_chain, ct.bid_characteristic,
......@@ -29,12 +29,23 @@
where ctu.user_id = #{userId}
</select>
<select id="selectByCompanyIdAndUserId" resultType="com.dsk.system.domain.customer.Customer">
<select id="selectByCompanyNameAndUserId" resultType="com.dsk.system.domain.customer.Customer">
select
<include refid="Base_Bean"></include>
from customer ct
join customer_user ctu on ct.customer_id = ctu.customer_id
where ct.company_id = ${companyId} and ctu.user_id = #{userId}
where ct.company_name = #{companyName} and ctu.user_id = #{userId}
</select>
<select id="selectStatusList" resultType="com.dsk.system.domain.customer.vo.CustomerStatusListVo">
select
ct.customer_id, ct.uip_id
from customer ct
join customer_user ctu on ct.customer_id = ctu.customer_id
where ctu.user_id = #{userId} and ct.uip_id in
<foreach collection="uipIds" item="uipId" open="(" separator="," close=")">
#{uipId}
</foreach>
</select>
</mapper>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment