Commit 9d931208 authored by 远方不远's avatar 远方不远
parents a6889c07 a112ab76
...@@ -16,7 +16,6 @@ import com.dsk.system.domain.customer.dto.CustomerBusinessSearchDto; ...@@ -16,7 +16,6 @@ import com.dsk.system.domain.customer.dto.CustomerBusinessSearchDto;
import com.dsk.system.domain.customer.dto.CustomerSearchDto; import com.dsk.system.domain.customer.dto.CustomerSearchDto;
import com.dsk.system.service.ICustomerService; import com.dsk.system.service.ICustomerService;
import com.dsk.web.controller.search.service.BusinessOpportunityRadarService; import com.dsk.web.controller.search.service.BusinessOpportunityRadarService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
...@@ -68,6 +67,23 @@ public class CustomerController extends BaseController { ...@@ -68,6 +67,23 @@ public class CustomerController extends BaseController {
@PostMapping() @PostMapping()
@RepeatSubmit @RepeatSubmit
public AjaxResult add(@RequestBody Customer customer) { public AjaxResult add(@RequestBody Customer customer) {
dealWithcustomerData(customer);
return AjaxResult.success(baseService.add(customer));
}
/**
* 认领客户
*/
// @PreAuthorize("@ss.hasPermi('customer:claim')")
@PostMapping("/claim")
@RepeatSubmit
public AjaxResult claim(@RequestBody Customer customer) {
if (ObjectUtils.isEmpty(customer.getUipId())) throw new BeanException("城投uipId不能为空");
dealWithcustomerData(customer);
return AjaxResult.success(baseService.add(customer));
}
private void dealWithcustomerData(Customer customer){
if (ObjectUtils.isEmpty(customer.getCompanyName())) throw new BeanException("企业名称不能为空"); if (ObjectUtils.isEmpty(customer.getCompanyName())) throw new BeanException("企业名称不能为空");
if (ObjectUtils.isEmpty(customer.getCompanyId())) { if (ObjectUtils.isEmpty(customer.getCompanyId())) {
try { try {
...@@ -79,7 +95,6 @@ public class CustomerController extends BaseController { ...@@ -79,7 +95,6 @@ public class CustomerController extends BaseController {
logger.debug("获取企业id错误!error:{}", e.getMessage()); logger.debug("获取企业id错误!error:{}", e.getMessage());
} }
} }
return AjaxResult.success(baseService.add(customer));
} }
/** /**
......
package com.dsk.web.controller.search.macroMarket; package com.dsk.web.controller.search.macroMarket;
import com.dsk.common.core.domain.AjaxResult; import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.dtos.OpRegionalEconomicDataV1Dto; import com.dsk.common.dtos.OpRegionalEconomicDataRegionalListDto;
import com.dsk.common.dtos.OpRegionalEconomicDataStatisticsRegionalDto;
import com.dsk.common.dtos.OpRegionalEconomicDataV1PageDto; import com.dsk.common.dtos.OpRegionalEconomicDataV1PageDto;
import com.dsk.system.service.EconomicService; import com.dsk.system.service.EconomicService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
/** /**
* @ClassName RegionalEconomicDataController * @ClassName RegionalEconomicDataController
...@@ -30,7 +33,7 @@ public class RegionalEconomicDataController { ...@@ -30,7 +33,7 @@ public class RegionalEconomicDataController {
*@date: 2023/5/18 10:29 *@date: 2023/5/18 10:29
*/ */
@PostMapping("/national/nationalPage") @PostMapping("/national/nationalPage")
public AjaxResult nationalPage(@RequestBody OpRegionalEconomicDataV1PageDto dto) { public AjaxResult nationalPage(@RequestBody @Valid OpRegionalEconomicDataV1PageDto dto) {
return economicService.nationalPage(dto); return economicService.nationalPage(dto);
} }
...@@ -55,7 +58,7 @@ public class RegionalEconomicDataController { ...@@ -55,7 +58,7 @@ public class RegionalEconomicDataController {
*@date: 2023/5/18 10:29 *@date: 2023/5/18 10:29
*/ */
@PostMapping("/statistics/regional") @PostMapping("/statistics/regional")
public AjaxResult statisticsRegional(@RequestBody OpRegionalEconomicDataV1Dto dto) { public AjaxResult statisticsRegional(@RequestBody OpRegionalEconomicDataStatisticsRegionalDto dto) {
return economicService.statisticsRegional(dto); return economicService.statisticsRegional(dto);
} }
...@@ -67,7 +70,7 @@ public class RegionalEconomicDataController { ...@@ -67,7 +70,7 @@ public class RegionalEconomicDataController {
*@date: 2023/5/18 10:29 *@date: 2023/5/18 10:29
*/ */
@PostMapping("/regional/list") @PostMapping("/regional/list")
public AjaxResult regionalList(@RequestBody OpRegionalEconomicDataV1Dto dto) { public AjaxResult regionalList(@RequestBody OpRegionalEconomicDataRegionalListDto dto) {
return economicService.regionalList(dto); return economicService.regionalList(dto);
} }
......
package com.dsk.common.dtos;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* @ClassName OpRegionalEconomicDataV1Dto
* @Description 专项债-项目类别统计
* @Author Dgm
* @Date 2023/5/23 14:05
* @Version
*/
@Data
public class OpRegionalEconomicDataRegionalListDto {
/**
* 省Id
*/
@NotNull(message = "provinceId 不能为空")
private Integer provinceId;
/**
* 市Id
*/
private Integer cityId;
/**
* 区Id
*/
private Integer areaId;
}
package com.dsk.common.dtos;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* @ClassName OpRegionalEconomicDataV1Dto
* @Description 专项债-项目类别统计
* @Author Dgm
* @Date 2023/5/23 14:05
* @Version
*/
@Data
public class OpRegionalEconomicDataStatisticsRegionalDto {
/**
* id
*/
@NotNull(message = "id 不能为空")
private Integer id;
/**
* 年份
*/
private Integer year;
/**
* 省Id
*/
private Integer provinceId;
/**
* 市Id
*/
private Integer cityId;
/**
* 区Id
*/
private Integer areaId;
}
...@@ -3,6 +3,7 @@ package com.dsk.common.dtos; ...@@ -3,6 +3,7 @@ package com.dsk.common.dtos;
import com.dsk.common.core.domain.model.BasePage; import com.dsk.common.core.domain.model.BasePage;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.List; import java.util.List;
/** /**
...@@ -18,6 +19,7 @@ public class OpRegionalEconomicDataV1PageDto extends BasePage { ...@@ -18,6 +19,7 @@ public class OpRegionalEconomicDataV1PageDto extends BasePage {
/** /**
* 年份 * 年份
*/ */
@NotNull(message = "year 不能为空")
private Integer year; private Integer year;
/** /**
* 省 * 省
......
...@@ -3,6 +3,8 @@ package com.dsk.common.dtos; ...@@ -3,6 +3,8 @@ package com.dsk.common.dtos;
import com.dsk.common.core.domain.model.BasePage; import com.dsk.common.core.domain.model.BasePage;
import lombok.Data; import lombok.Data;
import java.util.List;
/** /**
* @ClassName UrbanInvestmentPlatformDto * @ClassName UrbanInvestmentPlatformDto
...@@ -21,41 +23,41 @@ public class UrbanInvestmentPlatformDto extends BasePage { ...@@ -21,41 +23,41 @@ public class UrbanInvestmentPlatformDto extends BasePage {
/** /**
* 城投业务类型 * 城投业务类型
*/ */
private String uipBusinessType; private List<String> uipBusinessType;
/** /**
* 主体评级 * 主体评级
*/ */
private String bratingSubjectLevel; private List<String> bratingSubjectLevel;
/** /**
* 股东背景 * 股东背景
*/ */
private String shareholderBg; private List<String> shareholderBg;
/** /**
* 股权关系 * 股权关系
*/ */
private String equityRelationship; private List<String> equityRelationship;
/** /**
* 平台重要性 * 平台重要性
*/ */
private String platformImportance; private List<String> platformImportance;
/** /**
* 所属开发区 * 所属开发区
*/ */
private String developmentZone; private List<String> developmentZone;
/** /**
* 省 * 省
*/ */
private Integer provinceId; private List<Integer> provinceIds;
/** /**
* 市 * 市
*/ */
private Integer cityId; private List<Integer> cityIds;
/** /**
* 区 * 区
*/ */
private Integer areaId; private List<Integer> areaIds;
/** /**
* 关键词 * 关键词
......
...@@ -36,8 +36,8 @@ export function getXMSL(param) { ...@@ -36,8 +36,8 @@ export function getXMSL(param) {
method: 'GET', method: 'GET',
}) })
} }
//项目速览修改 //项目内容修改
export function editXMSL(param) { export function editXMNR(param) {
return request({ return request({
url: '/business/info/edit', url: '/business/info/edit',
method: 'POST', method: 'POST',
...@@ -71,3 +71,56 @@ export function addLXR(param) { ...@@ -71,3 +71,56 @@ export function addLXR(param) {
}) })
} }
//跟进记录
export function getGJJL(param) {
return request({
url: '/business/record/list',
method: 'get',
params:param
})
}
//新增跟进记录
export function addGJJL(param) {
return request({
url: '/business/record/add',
method: 'POST',
data:param
})
}
//删除跟进记录
export function delGJJL(param) {
return request({
url: '/business/record/remove/',
method: 'DELETE',
params:param
})
}
//工作待办
export function getGZDB(param) {
return request({
url: '/business/backlog/list',
method: 'GET',
params:param
})
}
//添加工作待办
export function addGZDB(param) {
return request({
url: '/business/backlog/add',
method: 'post',
data:param
})
}
//修改工作待办
export function editGZDB(param) {
return request({
url: '/business/backlog/edit',
method: 'post',
data:param
})
}
...@@ -530,7 +530,7 @@ ul, li { ...@@ -530,7 +530,7 @@ ul, li {
line-height: 32px; line-height: 32px;
} }
&:hover{ &:hover{
color: #006AD1; color: #f;
border-color: #006AD1; border-color: #006AD1;
} }
} }
......
...@@ -568,6 +568,7 @@ ...@@ -568,6 +568,7 @@
.el-input{ .el-input{
display: inline-block; display: inline-block;
margin-right: 12px; margin-right: 12px;
position: relative;
.el-input__inner{ .el-input__inner{
height: 32px; height: 32px;
padding: 0; padding: 0;
...@@ -580,7 +581,8 @@ ...@@ -580,7 +581,8 @@
.el-input__prefix{ .el-input__prefix{
left: 8px; left: 8px;
top: 3px; top: -2px;
position: absolute;
} }
.el-input__suffix{ .el-input__suffix{
height: 32px; height: 32px;
......
...@@ -50,8 +50,18 @@ ...@@ -50,8 +50,18 @@
<span class="common-title">跟进记录</span> <span class="common-title">跟进记录</span>
</div> </div>
<div class="flex-box query-ability"> <div class="flex-box query-ability">
<div class="area">西南地区<i class="el-icon-caret-bottom"></i></div> <div class="select-popper">
<div class="month">不限<i class="el-icon-caret-bottom"></i></div> <div class="area">{{area}}<i class="sjx"></i></div>
<el-select v-model="area" class="select-multiple" placeholder="请选择">
<el-option v-for="(item,index) in areaList" :key="index" :label="item.name" :value="item.name"></el-option>
</el-select>
</div>
<div class="select-popper">
<div class="month">{{date}}<i class="sjx"></i></div>
<el-select v-model="date" class="select-multiple" placeholder="请选择">
<el-option v-for="(item,index) in dateList" :key="index" :label="item" :value="item"></el-option>
</el-select>
</div>
</div> </div>
</div> </div>
<div class="list"> <div class="list">
...@@ -73,8 +83,18 @@ ...@@ -73,8 +83,18 @@
<span class="common-title">业绩排名</span> <span class="common-title">业绩排名</span>
</div> </div>
<div class="flex-box query-ability"> <div class="flex-box query-ability">
<div class="area">西南地区<i class="el-icon-caret-bottom"></i></div> <div class="select-popper">
<div class="month">不限<i class="el-icon-caret-bottom"></i></div> <div class="area">{{area}}<i class="sjx"></i></div>
<el-select v-model="area" class="select-multiple" placeholder="请选择">
<el-option v-for="(item,index) in areaList" :key="index" :label="item.name" :value="item.name"></el-option>
</el-select>
</div>
<div class="select-popper">
<div class="month">{{date}}<i class="sjx"></i></div>
<el-select v-model="date" class="select-multiple" placeholder="请选择">
<el-option v-for="(item,index) in dateList" :key="index" :label="item" :value="item"></el-option>
</el-select>
</div>
</div> </div>
</div> </div>
<div class="main"> <div class="main">
...@@ -103,9 +123,14 @@ ...@@ -103,9 +123,14 @@
</div> </div>
<div class="flex-box query-ability"> <div class="flex-box query-ability">
<div class="tabs"> <div class="tabs">
<div class="label" v-for="(item,index) in typeList" :class="typeIndex === index ? 'color':''" @click="handleClick(index)">{{item.name}}</div> <!--<div class="label" v-for="(item,index) in typeList" :class="typeIndex === index ? 'color':''" @click="handleClick(index)">{{item.name}}</div>-->
</div>
<div class="select-popper">
<div class="area">{{area}}<i class="sjx"></i></div>
<el-select v-model="area" class="select-multiple" placeholder="请选择">
<el-option v-for="(item,index) in areaList" :key="index" :label="item.name" :value="item.name"></el-option>
</el-select>
</div> </div>
<div class="area">西南地区<i class="el-icon-caret-bottom"></i></div>
</div> </div>
</div> </div>
<div> <div>
...@@ -135,24 +160,42 @@ ...@@ -135,24 +160,42 @@
<div v-if="user === 2" class="trends"> <div v-if="user === 2" class="trends">
<el-tabs v-model="activeName" @tab-click="handleClickTab"> <el-tabs v-model="activeName" @tab-click="handleClickTab">
<el-tab-pane label="甲方舆情" name="first"> <el-tab-pane label="甲方舆情" name="first">
<el-timeline> <div class="main-box">
<el-timeline-item <el-timeline>
v-for="(item, index) in trendsList" <el-timeline-item
:key="index" v-for="(item, index) in trendsList"
icon="el-icon-time"> :key="index"
{{item.main}} icon="el-icon-time">
</el-timeline-item> <div class="time">{{item.time}}<span class="company">{{item.name}}</span></div>
</el-timeline> <div class="cont">{{item.main}}</div>
</el-timeline-item>
</el-timeline>
</div>
<!--<div class="check">全部甲方舆情 ></div>-->
</el-tab-pane>
<el-tab-pane label="监控动态" name="second">
<div class="main-box">
<el-timeline>
<el-timeline-item
v-for="(item, index) in trendsList"
:key="index"
icon="el-icon-time">
<div class="time">{{item.time}}<span class="company">{{item.name}}</span></div>
<div class="cont">{{item.main}}</div>
</el-timeline-item>
</el-timeline>
</div>
<!--<div class="check">全部监控动态 ></div>-->
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="监控动态" name="second">监控动态</el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>
</div> </div>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<div class="content-right"> <div class="content-right">
<div class="user"> <div class="user" @click="handleChange">
<h3>刘毅<span>总经理</span></h3> <h3 v-if="user === 1">刘毅<span>总经理</span></h3>
<h3 v-if="user === 2">李婷婷<span>营销员</span></h3>
<p>您好,祝您工作顺利每一天</p> <p>您好,祝您工作顺利每一天</p>
</div> </div>
<div class="search"> <div class="search">
...@@ -160,8 +203,8 @@ ...@@ -160,8 +203,8 @@
<el-input placeholder="找客户/找项目/找甲方"> <el-input placeholder="找客户/找项目/找甲方">
<i slot="prefix" class="el-icon-search"></i> <i slot="prefix" class="el-icon-search"></i>
</el-input> </el-input>
<span class="common-title" style="margin-bottom: 10px;">储备项目类</span> <span class="common-title">储备项目类</span>
<div class="list"> <div class="list" style="margin-top: 8px;">
<div class="item"> <div class="item">
<img src="@/assets/images/index/cb_icon1.png"/> <img src="@/assets/images/index/cb_icon1.png"/>
<p>EPC项目</p> <p>EPC项目</p>
...@@ -190,8 +233,8 @@ ...@@ -190,8 +233,8 @@
</div> </div>
</div> </div>
</div> </div>
<div class="zbgg"> <div class="zbgg" v-if="user === 1">
<span class="common-title">标公告</span> <span class="common-title">标公告</span>
<div class="list"> <div class="list">
<div class="item"> <div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3> <h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
...@@ -230,6 +273,41 @@ ...@@ -230,6 +273,41 @@
</div> </div>
</div> </div>
</div> </div>
<div v-if="user === 2" class="zbhxr">
<span class="common-title">竞争对手中标候选人公告</span>
<div class="list">
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
</p>
</div>
<div class="item">
<h3>太原市万柏林区2023年兴华街道老旧小区改造项目</h3>
<p>
<span>中标金额:4754.34</span>
</p>
</div>
</div>
</div>
</div> </div>
</el-col> </el-col>
</el-row> </el-row>
...@@ -238,6 +316,7 @@ ...@@ -238,6 +316,7 @@
<script> <script>
import * as echarts from 'echarts'; import * as echarts from 'echarts';
import "@/assets/styles/public.css";
export default { export default {
name: "Index", name: "Index",
data() { data() {
...@@ -254,7 +333,57 @@ export default { ...@@ -254,7 +333,57 @@ export default {
], ],
typeIndex:0, typeIndex:0,
jyfxData:['1月','2月','3月','4月','5月','6月'], jyfxData:['1月','2月','3月','4月','5月','6月'],
jyfxData1:[103,256,132,186,210,95], jyfxData1:[
{
dcjxm:'103',
dcjzje:'123',
cjxmje:'153',
cjxmzs:'113',
cbxmzs:'93',
cbxmzje:'193',
},
{
dcjxm:'256',
dcjzje:'223',
cjxmje:'113',
cjxmzs:'163',
cbxmzs:'193',
cbxmzje:'123',
},
{
dcjxm:'103',
dcjzje:'123',
cjxmje:'153',
cjxmzs:'113',
cbxmzs:'93',
cbxmzje:'193',
},
{
dcjxm:'256',
dcjzje:'223',
cjxmje:'113',
cjxmzs:'163',
cbxmzs:'193',
cbxmzje:'123',
},
{
dcjxm:'103',
dcjzje:'123',
cjxmje:'153',
cjxmzs:'113',
cbxmzs:'93',
cbxmzje:'193',
},
{
dcjxm:'256',
dcjzje:'223',
cjxmje:'113',
cjxmzs:'163',
cbxmzs:'193',
cbxmzje:'123',
},
],
gjjlData:[ gjjlData:[
{ {
title:'今天拜访了重庆交通局杨科长,洽谈比较愉快,预计下月有项目招标,希望能有机会合作。', title:'今天拜访了重庆交通局杨科长,洽谈比较愉快,预计下月有项目招标,希望能有机会合作。',
...@@ -351,7 +480,53 @@ export default { ...@@ -351,7 +480,53 @@ export default {
name:'重庆轨道交通集团有限公司', name:'重庆轨道交通集团有限公司',
main:'发布招标公告 重庆轨道交通环线鹅公岩轨道专用桥增设防船撞设施项目,项目地区是重庆市-江北区,项目类型为工程建设。' 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:'发布招标公告 重庆轨道交通环线鹅公岩轨道专用桥增设防船撞设施项目,项目地区是重庆市-江北区,项目类型为工程建设。'
},
{
time:'2018-04-03 10:20',
name:'重庆轨道交通集团有限公司',
main:'发布招标公告 重庆轨道交通环线鹅公岩轨道专用桥增设防船撞设施项目,项目地区是重庆市-江北区,项目类型为工程建设。'
},
],
area:'西南地区',
areaList:[
{
name:'西南地区'
},
{
name:'华中地区'
},
{
name:'华南地区'
},
{
name:'华东地区'
},
{
name:'华北地区'
},
{
name:'东北地区'
},
{
name:'西北地区'
},
],
date:'不限',
dateList:['不限','今日','昨日','近三天','近七天']
}; };
}, },
created() { created() {
...@@ -370,8 +545,18 @@ export default { ...@@ -370,8 +545,18 @@ export default {
initChart() { initChart() {
let myChart = echarts.init(document.getElementById("fx-echarts")) let myChart = echarts.init(document.getElementById("fx-echarts"))
let option ={ let option ={
legend: {
x:'right',
padding:[0,120,0,0],
},
tooltip: { tooltip: {
show:false trigger: 'axis',
axisPointer: {
type: 'line',
label: {
backgroundColor: '#FFFFFF'
}
}
}, },
xAxis: { xAxis: {
type: 'category', type: 'category',
...@@ -382,14 +567,21 @@ export default { ...@@ -382,14 +567,21 @@ export default {
type: 'value', type: 'value',
}, },
grid: { grid: {
top:20, top:35,
left:30, left:30,
right:10, right:10,
bottom:20, bottom:20,
}, },
// dcjxm:'256',
// dcjzje:'223',
// cjxmje:'113',
// cjxmzs:'163',
// cbxmzs:'193',
// cbxmzje:'123',
series: [ series: [
{ {
data: this.jyfxData1, data: this.jyfxData1.map(item => item.dcjxm),
name:'待成交项目数',
type: 'line', type: 'line',
smooth: true, smooth: true,
emphasis: { emphasis: {
...@@ -398,7 +590,39 @@ export default { ...@@ -398,7 +590,39 @@ export default {
}, },
//设置折线颜色和粗细 //设置折线颜色和粗细
lineStyle: { lineStyle: {
width: 1, width: 2,
color: "#0CBC6D",
},
itemStyle:{
color: "#0CBC6D",
},
//设置面积区域为渐变效果
areaStyle: {
opacity:0.8,
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
{
offset: 0.2,
color: "#EFFAF6",
},
{
offset: 1,
color: "#0CBC6D",
},
]),
},
},
{
data: this.jyfxData1.map(item => item.dcjzje),
name:'待成交总金额',
type: 'line',
smooth: true,
emphasis: {
disabled: true,
focus: 'none'
},
//设置折线颜色和粗细
lineStyle: {
width: 2,
color: "#0081FF", color: "#0081FF",
}, },
itemStyle:{ itemStyle:{
...@@ -406,7 +630,8 @@ export default { ...@@ -406,7 +630,8 @@ export default {
}, },
//设置面积区域为渐变效果 //设置面积区域为渐变效果
areaStyle: { areaStyle: {
color: echarts.graphic.LinearGradient(0, 1, 0, 0, [ opacity:0.8,
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
{ {
offset: 0.2, offset: 0.2,
color: "#DFEAFF", color: "#DFEAFF",
...@@ -417,13 +642,149 @@ export default { ...@@ -417,13 +642,149 @@ export default {
}, },
]), ]),
}, },
} },
{
data: this.jyfxData1.map(item => item.cjxmje),
name:'成交项目金额',
type: 'line',
smooth: true,
emphasis: {
disabled: true,
focus: 'none'
},
//设置折线颜色和粗细
lineStyle: {
width: 2,
color: "#8077F2",
},
itemStyle:{
color: "#8077F2",
},
//设置面积区域为渐变效果
areaStyle: {
opacity:0.8,
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
{
offset: 0.2,
color: "#ECE8FF",
},
{
offset: 1,
color: "#BCC0FF",
},
]),
},
},
{
data: this.jyfxData1.map(item => item.cjxmzs),
name:'成交项目总数',
type: 'line',
smooth: true,
emphasis: {
disabled: true,
focus: 'none'
},
//设置折线颜色和粗细
lineStyle: {
width: 2,
color: "#FA6C6C",
},
itemStyle:{
color: "#FA6C6C",
},
//设置面积区域为渐变效果
areaStyle: {
opacity:0.8,
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
{
offset: 0.2,
color: "#FDEAE8",
},
{
offset: 1,
color: "#FDB2AE",
},
]),
},
},
{
data: this.jyfxData1.map(item => item.cbxmzs),
name:'储备项目总数',
type: 'line',
smooth: true,
emphasis: {
disabled: true,
focus: 'none'
},
//设置折线颜色和粗细
lineStyle: {
width: 2,
color: "#FA936C",
},
itemStyle:{
color: "#FA936C",
},
//设置面积区域为渐变效果
areaStyle: {
opacity:0.8,
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
{
offset: 0.2,
color: "#FCE8E0",
},
{
offset: 1,
color: "#FBC4AF",
},
]),
},
},
{
data: this.jyfxData1.map(item => item.cbxmzje),
name:'储备项目总金额',
type: 'line',
smooth: true,
emphasis: {
disabled: true,
focus: 'none'
},
//设置折线颜色和粗细
lineStyle: {
width: 2,
color: "#FDD85E",
},
itemStyle:{
color: "#FDD85E",
},
//设置面积区域为渐变效果
areaStyle: {
opacity:0.8,
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
{
offset: 0.2,
color: "#FCF8EF",
},
{
offset: 1,
color: "#FEEBAA",
},
]),
},
},
] ]
} }
myChart.setOption(option); myChart.setOption(option);
}, },
initChart1(){ initChart1(){
var rankPic = [
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'),
]
let myChart = echarts.init(document.getElementById("pm-echarts")) let myChart = echarts.init(document.getElementById("pm-echarts"))
let option ={ let option ={
legend: { legend: {
show: true, show: true,
...@@ -448,56 +809,63 @@ export default { ...@@ -448,56 +809,63 @@ export default {
} }
}, },
axisLabel: { axisLabel: {
color: '#232323', margin: 80,
margin: 50,
// formatter必须,配合rich使用
textStyle: { textStyle: {
align:'left', align: 'left',
},
formatter: function (value,index) {
let idx=index+1;
return '{' + idx + '|} {s|' + value + '}'
}, },
rich: { rich: {
a1: { 1: {
backgroundColor: {image: this.rankIcons[0]}, height: 24,
width: this.rankIconsSize, width: 24,
height: this.rankIconsSize, align: 'center',
align: "left", backgroundColor: {
// padding: [0, 0, 50, 100] image: rankPic[0]
},
}, },
a2: { 2: {
backgroundColor: { image: this.rankIcons[1] }, height: 24,
width: this.rankIconsSize, width: 24,
height: this.rankIconsSize, align: 'center',
align: "center", backgroundColor: {
image: rankPic[1]
}
}, },
a3: { 3: {
backgroundColor: { image: this.rankIcons[2] }, height: 24,
width: this.rankIconsSize, width: 24,
height: this.rankIconsSize, align: 'center',
align: "center", backgroundColor: {
image: rankPic[2]
}
}, },
a4: { 4: {
backgroundColor: { image: this.rankIcons[3] }, height: 24,
width: this.rankIconsSize, width: 24,
height: this.rankIconsSize, align: 'center',
align: "center", backgroundColor: {
image: rankPic[3]
}
}, },
a5: { 5: {
backgroundColor: { image: this.rankIcons[4] }, height: 24,
width: this.rankIconsSize, width: 24,
height: this.rankIconsSize, align: 'center',
align: "center", backgroundColor: {
image: rankPic[4]
}
}, },
}, }
formatter: (params, index) => {
return [`{a${index + 1}|} ${params}`].join('\n')
},
}, },
}, },
xAxis: { xAxis: {
type: 'value', type: 'value',
}, },
grid: { grid: {
left: '22%', left: '16%',
top: 20, top: 20,
right: 20, right: 20,
bottom: 60, bottom: 60,
...@@ -545,6 +913,15 @@ export default { ...@@ -545,6 +913,15 @@ export default {
}, },
handleClickTab(){ handleClickTab(){
},
handleChange(){
this.user = this.user === 1 ? 2 : 1;
if(this.user === 1){
this.$nextTick(()=>{
this.initChart()
this.initChart1()
})
}
} }
} }
}; };
...@@ -585,6 +962,7 @@ export default { ...@@ -585,6 +962,7 @@ export default {
margin-top: 14px; margin-top: 14px;
margin-bottom: 14px; margin-bottom: 14px;
border-right: 1px solid #EFEFEF; border-right: 1px solid #EFEFEF;
cursor: pointer;
.left{ .left{
width: 48px; width: 48px;
height: 48px; height: 48px;
...@@ -625,6 +1003,16 @@ export default { ...@@ -625,6 +1003,16 @@ export default {
.item:last-child{ .item:last-child{
border-right: 0; border-right: 0;
} }
.item:hover{
.right{
.title{
color: #0081FF;
}
.number{
color: #0081FF;
}
}
}
.add{ .add{
padding-left: 0; padding-left: 0;
.yd{ .yd{
...@@ -654,11 +1042,17 @@ export default { ...@@ -654,11 +1042,17 @@ export default {
margin-right: 4px; margin-right: 4px;
} }
} }
.btn:hover{
background: #F6F9FC;
}
} }
} }
.content-wrap{ .content-wrap{
margin-bottom: 12px; margin-bottom: 12px;
height: 460px; height: 460px;
.select-popper{
margin-right:0;
}
.record{ .record{
height: 460px; height: 460px;
background: #FFFFFF; background: #FFFFFF;
...@@ -749,23 +1143,54 @@ export default { ...@@ -749,23 +1143,54 @@ export default {
} }
} }
.area{ .select-popper{
font-size: 14px; .area{
color: #232323; font-size: 14px;
cursor: pointer; color: #232323;
i{ cursor: pointer;
color:#A7A7A7; i{
background: url("../assets/images/index/sjx.png");
background-size: 100% 100%;
width: 10px;
height: 6px;
display: inline-block;
margin-bottom: 2px;
margin-left: 4px;
}
}
.month{
font-size: 14px;
color: #232323;
margin-left: 16px;
cursor: pointer;
i{
background: url("../assets/images/index/sjx.png");
background-size: 100% 100%;
width: 10px;
height: 6px;
display: inline-block;
margin-bottom: 2px;
margin-left: 4px;
}
}
.color{
color: #0081FF;
i{
background: url("../assets/images/index/sjx2.png");
background-size: 100% 100%;
}
} }
} }
.month{ .select-popper:hover{
font-size: 14px; .area,.month{
color: #232323; color: #0081FF;
margin-left: 16px; i{
cursor: pointer; background: url("../assets/images/index/sjx1.png");
i{ background-size: 100% 100%;
color:#A7A7A7; }
} }
} }
} }
.content-db{ .content-db{
height: 263px; height: 263px;
...@@ -830,6 +1255,7 @@ export default { ...@@ -830,6 +1255,7 @@ export default {
background: #FFFFFF; background: #FFFFFF;
border-radius: 4px; border-radius: 4px;
padding: 16px; padding: 16px;
position: relative;
.tabs{ .tabs{
.label{ .label{
display: inline-block; display: inline-block;
...@@ -855,13 +1281,34 @@ export default { ...@@ -855,13 +1281,34 @@ export default {
color: #FFFFFF; color: #FFFFFF;
} }
} }
.area{ .select-popper{
font-size: 14px; position: absolute;
color: #232323; right: 0;
margin-left: 16px; top: 27px;
cursor: pointer; z-index: 99;
i{ .area{
color:#A7A7A7; font-size: 14px;
color: #232323;
margin-left: 16px;
cursor: pointer;
i{
background: url("../assets/images/index/sjx.png");
background-size: 100% 100%;
width: 10px;
height: 6px;
display: inline-block;
margin-bottom: 2px;
margin-left: 4px;
}
}
}
.select-popper:hover{
.area,.month{
color: #0081FF;
i{
background: url("../assets/images/index/sjx1.png");
background-size: 100% 100%;
}
} }
} }
} }
...@@ -870,6 +1317,66 @@ export default { ...@@ -870,6 +1317,66 @@ export default {
border-radius: 4px; border-radius: 4px;
padding: 16px; padding: 16px;
height: 440px; height: 440px;
overflow: hidden;
position: relative;
::v-deep .el-tabs__header{
margin: 0 0 18px;
}
::v-deep .el-tabs__content{
overflow-y: auto;
height: 368px;
}
::v-deep .el-timeline{
.el-timeline-item{
padding-bottom: 18px;
}
.el-timeline-item__tail{
left: 7px;
border-left: 2px dotted rgba(0,129,255,0.5);
}
.el-timeline-item__node{
background-color:#ffffff;
.el-timeline-item__icon{
color:#0081FF;
font-size: 14px;
}
}
.el-timeline-item__node--normal{
left: 0px;
width: 16px;
height: 16px;
}
}
.time{
font-size: 14px;
color: rgba(35,35,35,0.8);
.company{
color: #0081FF;
margin-left: 16px;
}
}
.cont{
background: #F6F9FD;
border-radius: 6px;
padding: 16px;
margin-top: 8px;
font-size: 14px;
color: rgba(35,35,35,0.8);
margin-right: 16px;
}
.check{
height: 60px;
background: linear-gradient(360deg, #FFFFFF 0%, #FFFFFF 17%, rgba(255,255,255,0.6) 100%);
font-size: 16px;
color: #0CBC6D;
line-height: 60px;
text-align: center;
width: 100%;
position: absolute;
bottom: 46px;
cursor: pointer;
}
} }
} }
.content-right{ .content-right{
...@@ -915,8 +1422,8 @@ export default { ...@@ -915,8 +1422,8 @@ export default {
::v-deep .el-input{ ::v-deep .el-input{
height: 32px; height: 32px;
border-radius: 2px; border-radius: 2px;
margin-bottom: 22px; margin-bottom: 20px;
margin-top: 16px; margin-top: 14px;
.el-input__inner{ .el-input__inner{
height: 32px; height: 32px;
line-height: 32px; line-height: 32px;
...@@ -936,8 +1443,10 @@ export default { ...@@ -936,8 +1443,10 @@ export default {
justify-content: space-between; justify-content: space-between;
.item{ .item{
margin: 0 auto; margin: 0 auto;
width: 33.3%;
height: 94px; height: 94px;
text-align: center; text-align: center;
cursor: pointer;
img{ img{
width: 40px; width: 40px;
height: 40px; height: 40px;
...@@ -948,6 +1457,9 @@ export default { ...@@ -948,6 +1457,9 @@ export default {
font-size: 12px; font-size: 12px;
} }
} }
.item:hover{
background: #F6F9FC;
}
} }
} }
.zbgg{ .zbgg{
...@@ -986,6 +1498,42 @@ export default { ...@@ -986,6 +1498,42 @@ export default {
border-bottom: 0; border-bottom: 0;
} }
} }
.zbhxr{
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> </style>
......
<template> <template>
<div class="login"> <div class="login">
<el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form"> <div class="content">
<h3 class="title"><img src="../assets/images/title_icon.png"/>欢迎登录系统</h3> <div class="left">
<el-form-item prop="username"> <img class="logo" src="../assets/images/logo1.png" />
<el-input <img class="img" src="../assets/images/login/img.png" />
v-model="loginForm.username" </div>
type="text" <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
auto-complete="off" <h3 class="title"><img src="../assets/images/title_icon.png"/>欢迎登录系统</h3>
placeholder="请输入登录账号" <el-form-item prop="username">
> <el-input
<img class="img" slot="prefix" src="../assets/images/user.png"/> v-model="loginForm.username"
</el-input> type="text"
</el-form-item> auto-complete="off"
<el-form-item prop="password"> placeholder="请输入登录账号"
<el-input >
v-model="loginForm.password" <img class="img" slot="prefix" src="../assets/images/user.png"/>
type="password" </el-input>
auto-complete="off" </el-form-item>
placeholder="请输入账号密码" <el-form-item prop="password">
@keyup.enter.native="handleLogin" <el-input
> v-model="loginForm.password"
<img class="img" slot="prefix" src="../assets/images/password.png"/> type="password"
</el-input> auto-complete="off"
</el-form-item> placeholder="请输入账号密码"
<el-form-item prop="code" v-if="captchaEnabled"> @keyup.enter.native="handleLogin"
<el-input >
v-model="loginForm.code" <img class="img" slot="prefix" src="../assets/images/password.png"/>
auto-complete="off" </el-input>
placeholder="请输入验证码" </el-form-item>
style="width: 56%;float: left;" <el-form-item prop="code" v-if="captchaEnabled">
@keyup.enter.native="handleLogin" <el-input
> v-model="loginForm.code"
<img class="img" slot="prefix" src="../assets/images/validCode.png"/> auto-complete="off"
</el-input> placeholder="请输入验证码"
<div class="login-code"> style="width: 56%;float: left;"
<img :src="codeUrl" @click="getCode" class="login-code-img"/> @keyup.enter.native="handleLogin"
</div> >
</el-form-item> <img class="img" slot="prefix" src="../assets/images/validCode.png"/>
<el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 48px;">记住密码</el-checkbox> </el-input>
<el-form-item style="width:100%;"> <div class="login-code">
<el-button <img :src="codeUrl" @click="getCode" class="login-code-img"/>
:loading="loading" </div>
size="medium" </el-form-item>
type="primary" <el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 48px;">记住密码</el-checkbox>
style="width:100%;height: 48px;border-radius: 4px;font-size: 16px;" <el-form-item style="width:100%;">
@click.native.prevent="handleLogin" <el-button
> :loading="loading"
<span v-if="!loading">登 录</span> size="medium"
<span v-else>登 录 中...</span> type="primary"
</el-button> style="width:100%;height: 48px;border-radius: 4px;font-size: 16px;"
<div style="float: right;" v-if="register"> @click.native.prevent="handleLogin"
<router-link class="link-type" :to="'/register'">立即注册</router-link> >
</div> <span v-if="!loading">登 录</span>
</el-form-item> <span v-else>登 录 中...</span>
</el-form> </el-button>
<div style="float: right;" v-if="register">
<router-link class="link-type" :to="'/register'">立即注册</router-link>
</div>
</el-form-item>
</el-form>
</div>
</div> </div>
</template> </template>
...@@ -153,12 +159,32 @@ export default { ...@@ -153,12 +159,32 @@ export default {
<style rel="stylesheet/scss" lang="scss"> <style rel="stylesheet/scss" lang="scss">
.login { .login {
display: flex; /*display: flex;*/
justify-content: center; justify-content: center;
align-items: center; align-items: center;
height: 100%; height: 100%;
background-image: url("../assets/images/login_bg.png"); background-image: url("../assets/images/login_bg.png");
background-size: cover; background-size: cover;
overflow-y: hidden;
.content{
width: 1320px;
margin: 0 auto;
padding-top: 160px;
}
.left{
float: left;
width: 730px;
margin-right: 170px;
}
.logo{
width: 317px;
height: 69px;
margin-bottom: 58px;
}
.img{
width: 730px;
height: 624px;
}
} }
.title { .title {
padding: 46px 0 32px 48px; padding: 46px 0 32px 48px;
...@@ -177,6 +203,8 @@ export default { ...@@ -177,6 +203,8 @@ export default {
border-radius: 6px; border-radius: 6px;
background: #ffffff; background: #ffffff;
width: 420px; width: 420px;
float: right;
margin-top: 70px;
/*padding: 25px 25px 5px 25px;*/ /*padding: 25px 25px 5px 25px;*/
.el-form-item{ .el-form-item{
padding: 0 48px; padding: 0 48px;
......
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="recordlist"> <div class="recordlist" v-if="showtype=='gjdt'">
<div class="rec_detail" v-for="(item,index) in recordlist.rows"> <div class="rec_detail" v-for="(item,index) in recordlist.rows">
<div class="rec_time"> <div class="rec_time">
...@@ -54,17 +54,39 @@ ...@@ -54,17 +54,39 @@
<div><strong>{{item.nickName}}</strong> <span v-if="item.visitMode">({{item.visitMode}})</span></div> <div><strong>{{item.nickName}}</strong> <span v-if="item.visitMode">({{item.visitMode}})</span></div>
<div><span>{{item.content}}</span></div> <div><span>{{item.content}}</span></div>
<div class="rec_text"> <div class="rec_text">
<span>拜访对象:{{item.name||'--'}}</span> <span v-if="item.name">拜访对象:{{item.name||'--'}}</span>
<span v-if="showtype == 'gjdt'">关联企业:{{item.companyName||'--'}}</span> <span v-if="showtype == 'gjdt' && companyName != ''">关联企业:{{item.companyName}}</span>
<span>职位:{{item.position||'--'}}</span> <span v-if="item.position">职位:{{item.position}}</span>
<span>拜访时间:{{item.createTime && item.createTime.slice(0, 10)}}</span> <span v-if="item.createTime">拜访时间:{{item.createTime.slice(0, 10)}}</span>
<span>下次拜访时间:{{item.nextVisitTime == null?'--': item.createTime.slice(0, 10)}}</span> <span v-if="item.nextVisitTime">下次拜访时间:{{item.createTime.slice(0, 10)}}</span>
</div> </div>
</div> </div>
</div> </div>
</div>
<div class="recordlist" v-if="showtype=='gjjl' && recordlist.total>0">
<div class="rec_detail" v-for="(item,index) in recordlist.rows">
<div class="rec_time">
<i class="el-icon-time"></i>
<div>{{item.creatTime}}</div>
<div class="operate">
<!--<img src="@/assets/images/edit.png">第一期不做编辑-->
<img @click="delRecord(item.id)" src="@/assets/images/delete.png">
</div>
</div>
<div class="rec_con">
<div><strong>{{item.nickName}}</strong> <span v-if="item.visitWay">({{item.visitWay}})</span></div>
<div><span>{{item.recordInfo}}</span></div>
<div class="rec_text">
<span v-if="item.visitPerson">拜访对象:{{item.visitPerson||'--'}}</span>
<span v-if="item.position">职位:{{item.position||'--'}}</span>
<span v-if="item.creatTime">拜访时间:{{item.creatTime}}</span>
<span v-if="item.nextVisitTime">下次拜访时间:{{item.nextVisitTime || '--'}}</span>
</div>
</div>
</div>
</div> </div>
<div class="tables" v-if="recordlist.total>0"> <div class="tables" v-if="recordlist.total>pageSize">
<div class="bottems"> <div class="bottems">
<el-pagination <el-pagination
background background
...@@ -92,6 +114,7 @@ ...@@ -92,6 +114,7 @@
<script> <script>
import "@/assets/styles/project.scss" import "@/assets/styles/project.scss"
import {getFollowList,addFollowRecord,getUserList,delFollowRecord} from '@/api/custom/custom' import {getFollowList,addFollowRecord,getUserList,delFollowRecord} from '@/api/custom/custom'
import {getGJJL,addGJJL,delGJJL} from '@/api/project/project'
import {getEnterprise,getDictType,} from '@/api/main' import {getEnterprise,getDictType,} from '@/api/main'
export default { export default {
props:{ props:{
...@@ -123,6 +146,7 @@ ...@@ -123,6 +146,7 @@
recordlist:[],//列表数据源 recordlist:[],//列表数据源
isdel:false, isdel:false,
delID:'',//删除记录的ID delID:'',//删除记录的ID
projectId:parseInt(this.$route.query.id),//项目详情id
} }
}, },
computed: { computed: {
...@@ -140,6 +164,10 @@ ...@@ -140,6 +164,10 @@
}) })
this.getGJDTlist() this.getGJDTlist()
} }
//项目详情跟进记录
if(this.showtype == 'gjjl'){
this.getGJJL()
}
console.log(this.types) console.log(this.types)
}, },
methods:{ methods:{
...@@ -156,6 +184,26 @@ ...@@ -156,6 +184,26 @@
} }
}) })
} }
if(this.types == 'gjjl'){
let param = {
businessId:this.projectId,
userId:this.$store.state.user.userId,
visitPerson:this.addParam.name,
position:this.addParam.position,
nextVisitTime: this.addParam.nextVisitTime,
recordInfo:this.addParam.content,
visitWay:this.addParam.visitMode,
}
addGJJL(param).then(result=>{
if(result.code == 200){
this.$message.success(result.msg)
this.handleCurrentChange(1)
this.isEdit = false
}else{
this.$message.error(result.msg)
}
})
}
}, },
//删除跟进动态 //删除跟进动态
delRecord(id){ delRecord(id){
...@@ -172,6 +220,15 @@ ...@@ -172,6 +220,15 @@
} }
}) })
} }
if(this.types == 'gjjl') {
delGJJL(this.delID).then(result => {
if (result.code == 200) {
this.handleCurrentChange(1)
this.$message.success('删除成功')
this.isdel = false
}
})
}
}, },
//跟进动态列表 //跟进动态列表
getGJDTlist(){ getGJDTlist(){
...@@ -184,15 +241,27 @@ ...@@ -184,15 +241,27 @@
this.recordlist.rows.forEach(item=>{ this.recordlist.rows.forEach(item=>{
item.createTime = this.gettime(item.createTime) item.createTime = this.gettime(item.createTime)
item.nextVisitTime = this.gettime(item.nextVisitTime) item.nextVisitTime = this.gettime(item.nextVisitTime)
console.log(item.nextVisitTime )
}) })
}) })
}, },
getGJJL(){
let param = {
pageNum:this.pageNum,//页码
pageSize:this.pageSize,
businessId:this.projectId
}
getGJJL(param).then(result=>{
this.recordlist = result.code == 200?result:[]
})
},
handleCurrentChange(val){ handleCurrentChange(val){
this.pageNum = val this.pageNum = val
if(this.showtype == 'gjdt'){ if(this.showtype == 'gjdt'){
this.getGJDTlist() this.getGJDTlist()
} }
if(this.showtype == 'gjjl'){
this.getGJJL()
}
}, },
getEdit(){ getEdit(){
this.isEdit = true; this.isEdit = true;
......
<template> <template>
<div> <div>
<el-card class="box-card noborder"> <el-card class="box-card noborder">
<div class="cardtitles">跟进记录</div> <div class="cardtitles">工作待办</div>
<div class="records"> <div class="records">
<div class="writeIn"> <div class="writeIn">
<div class="default" v-if="isEdit == false" @click="getEdit"> <div class="default" v-if="isEdit == false" @click="getEdit">
...@@ -11,53 +11,52 @@ ...@@ -11,53 +11,52 @@
<div class="writting" v-if="isEdit == true"> <div class="writting" v-if="isEdit == true">
<div class="wri_top"> <div class="wri_top">
<img src="@/assets/images/project/add_3.png"> <img src="@/assets/images/project/add_3.png">
<el-input placeholder="新建一条跟进记录,如:周五上午预约客户上门拜访"></el-input> <el-input v-model="queryParam.task" placeholder="新建一条跟进记录,如:周五上午预约客户上门拜访"></el-input>
</div> </div>
<div class="wr_bot"> <div class="wr_bot">
<div class="times"><img src="@/assets/images/project/ico_4.png"> <div class="times"><img src="@/assets/images/project/ico_4.png">
<el-date-picker <el-date-picker
v-model="value" v-model="queryParam.finishTime"
type="date" type="date"
placeholder="待办时间"> placeholder="完成时间">
</el-date-picker> </el-date-picker>
</div> </div>
<el-input v-model="value" placeholder="拜访对象" style="width: 100px;"> <el-input v-model="queryParam.target" placeholder="拜访对象" style="width: 100px;">
<i slot="prefix" class="el-input__icon"><img src="@/assets/images/project/ico_2.png"></i> <i slot="prefix" class="el-input__icon"><img src="@/assets/images/project/ico_2.png"></i>
</el-input> </el-input>
<div class="btn btn_primary h32 wc" :class="{'btn_disabled':value == ''}">完成</div> <div class="btn btn_primary h32 wc" @click="add" :disabled="queryParam.task == ''" :class="{'btn_disabled':queryParam.task == ''}">完成</div>
</div> </div>
</div> </div>
</div> </div>
<div class="tasktitle"><strong>我的任务</strong><span>4条已逾期</span><!--<span class="on">4条已逾期</span>--></div> <div class="tasktitle"><strong>我的任务</strong><span @click="getYQ">4条已逾期</span><!--<span class="on">4条已逾期</span>--></div>
<div class="tasklist"> <div class="tasklist" v-for="(item,index) in datalist.rows">
<div class="task_name">周二拜访交通局李主任</div> <div class="task_name">{{item.task}}</div>
<div class="task_con"><span>发起时间:2023-01-24</span><span>关联客户:<font class="wordprimary">重庆市交通局</font></span><span>完成时间:2023-0.-03</span></div> <div class="task_con"><span>发起时间:{{item.createTime}}</span><span v-if="item.target">关联客户:<font class="wordprimary">{{item.target}}</font></span><span v-if="item.finishTime">完成时间:{{item.finishTime}}</span></div>
<div class="select" :class="{'on':status == 1}"> <div class="select" :class="{'on':item.state == 2}">
<div class="select-popper"> <div class="select-popper">
<span class="color_text"> <span class="color_text">
{{status == 0?"未完成":"已完成"}} {{item.state == 2?"已完成":"未完成"}}
<i class="el-icon-caret-bottom"></i> <i class="el-icon-caret-bottom"></i>
</span> </span>
<el-select placeholder="请选择" v-model="status" class="select-multiple"> <el-select placeholder="请选择" v-model="item.state" class="select-multiple" @change="changes(item.id,$event)">
<el-option label="未完成" value="0"></el-option> <el-option label="未完成" value="0"></el-option>
<el-option label="已完成" value="1"></el-option> <el-option label="未完成" value="1"></el-option>
<el-option label="已完成" value="2"></el-option>
</el-select> </el-select>
</div></div> </div></div>
</div> </div>
<div class="tasklist">
<div class="task_name">周二拜访交通局李主任</div> <div class="tables" v-if="datalist.total>searchPram.pageSize">
<div class="task_con"><span>发起时间:2023-01-24</span><span>关联客户:<font class="wordprimary">重庆市交通局</font></span><span>完成时间:2023-0.-03</span></div> <div class="bottems">
<div class="select" :class="{'on':status == 1}"> <el-pagination
<div class="select-popper"> background
<span class="color_text"> :page-size="searchPram.pageSize"
{{status == 0?"未完成":"已完成"}} :current-page="searchPram.pageNum"
<i class="el-icon-caret-bottom"></i> @current-change="handleCurrentChange"
</span> layout="prev, pager, next"
<el-select placeholder="请选择" v-model="status" class="select-multiple"> :total="datalist.total">
<el-option label="未完成" value="0"></el-option> </el-pagination>
<el-option label="已完成" value="1"></el-option> </div>
</el-select>
</div></div>
</div> </div>
</div> </div>
</el-card> </el-card>
...@@ -67,6 +66,8 @@ ...@@ -67,6 +66,8 @@
<script> <script>
import "@/assets/styles/project.scss" import "@/assets/styles/project.scss"
import "@/assets/styles/public.css" import "@/assets/styles/public.css"
import {addGZDB,getGZDB,editGZDB} from '@/api/project/project'
export default { export default {
name: 'gjjl', name: 'gjjl',
data(){ data(){
...@@ -74,13 +75,67 @@ ...@@ -74,13 +75,67 @@
isEdit:false, isEdit:false,
value:'', value:'',
status:0, status:0,
queryParam:{
businessId:parseInt(this.$route.query.id),//项目详情id
target:'',
task:'',
finishTime:'',
},
searchPram:{
businessId:parseInt(this.$route.query.id),
pageSize:10,
pageNum:1,
state:null,
},
datalist:[],
} }
}, },
created(){
this.getList()
},
methods:{ methods:{
getEdit(){ getEdit(){
this.isEdit = true; this.isEdit = true;
this.value = "" this.value = ""
}, },
add(){
addGZDB(this.queryParam).then(result=>{
if(result.code == 200){
this.$message.success("添加成功!")
this.getList()
}else{
this.$message.error(result.msg)
}
})
},
getList(){
getGZDB(this.searchPram).then(result=>{
this.datalist = result.code == 200?result:[]
})
},
handleCurrentChange(val){
this.searchPram.pageNum = val
this.getList()
},
changes(id,state){
let param={
id:id,
state:state
}
editGZDB(param).then(result=>{
if(result.code == 200){
this.$message.success('修改成功!')
this.getList()
}else{
this.$message.error(result.msg)
}
})
},
getYQ(){
let state = this.searchPram.state
this.searchPram.state = state == 0?null:0
this.handleCurrentChange(1)
},
} }
} }
</script> </script>
......
...@@ -200,7 +200,7 @@ ...@@ -200,7 +200,7 @@
<script> <script>
import "@/assets/styles/project.scss" import "@/assets/styles/project.scss"
import {getJSNR,editXMSL} from '@/api/project/project' import {getJSNR,editXMNR} from '@/api/project/project'
export default { export default {
name: 'jsnr', name: 'jsnr',
data(){ data(){
...@@ -249,7 +249,7 @@ ...@@ -249,7 +249,7 @@
this.nowedit = -1 this.nowedit = -1
let param = str let param = str
param.id = this.id param.id = this.id
editXMSL(param).then(result=>{ editXMNR(param).then(result=>{
if(result.code == 200) if(result.code == 200)
this.$message.success('修改成功') this.$message.success('修改成功')
else{ else{
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
<div class="cancels h28" @click="nowedit = -1" style="">取消</div> <div class="cancels h28" @click="nowedit = -1" style="">取消</div>
</div> </div>
</div> </div>
<span class="txt" v-else @click="nowedit = 1">待添加</span> <span class="txt" v-else @click="nowedit = 1">{{datas.projectLevel||'待添加'}}</span>
</div> </div>
</div> </div>
<div class="con i"> <div class="con i">
...@@ -138,27 +138,27 @@ ...@@ -138,27 +138,27 @@
<div class="otherdata"> <div class="otherdata">
<div class="det"> <div class="det">
<img src="@/assets/images/project/xgsj_1.png"> <img src="@/assets/images/project/xgsj_1.png">
<div class="i">0</div> <div class="i">{{datas.contactsCount}}</div>
<div class="j">联系人</div> <div class="j">联系人</div>
</div> </div>
<div class="det"> <div class="det">
<img src="@/assets/images/project/xgsj_2.png"> <img src="@/assets/images/project/xgsj_2.png">
<div class="i">0</div> <div class="i">{{datas.followRecordCount}}</div>
<div class="j">跟进记录</div> <div class="j">跟进记录</div>
</div> </div>
<div class="det"> <div class="det">
<img src="@/assets/images/project/xgsj_3.png"> <img src="@/assets/images/project/xgsj_3.png">
<div class="i">0</div> <div class="i">{{datas.backlogCount}}</div>
<div class="j">工作待办</div> <div class="j">工作待办</div>
</div> </div>
<div class="det"> <div class="det">
<img src="@/assets/images/project/xgsj_4.png"> <img src="@/assets/images/project/xgsj_4.png">
<div class="i">0</div> <div class="i">{{datas.fileCount}}</div>
<div class="j">资料文档</div> <div class="j">资料文档</div>
</div> </div>
<div class="det"> <div class="det">
<img src="@/assets/images/project/xgsj_5.png"> <img src="@/assets/images/project/xgsj_5.png">
<div class="i">0</div> <div class="i">{{datas.relateCompanyCount}}</div>
<div class="j">相关企业</div> <div class="j">相关企业</div>
</div> </div>
</div> </div>
...@@ -190,6 +190,8 @@ ...@@ -190,6 +190,8 @@
getDictType('project_stage_type').then(result=>{ getDictType('project_stage_type').then(result=>{
this.projectStage = result.code == 200 ? result.data:[] this.projectStage = result.code == 200 ? result.data:[]
}) })
this.xmjd = this.datas.projectStage
this.tipslit = this.datas.labelList
}, },
methods:{ methods:{
//验证电话号码 //验证电话号码
......
...@@ -5,18 +5,19 @@ ...@@ -5,18 +5,19 @@
<span> / 商机列表</span> <span> / 商机列表</span>
<span> / 项目详情</span> <span> / 项目详情</span>
</div> </div>
<div class="app-container"> <div class="app-container" v-if="ProjectData">
<el-card class="box-card noborder pad16 overflows"> <el-card class="box-card noborder pad16 overflows">
<div class="head baseinfo"> <div class="head baseinfo">
<div class="titles"> <div class="titles">
<img src="@/assets/images/project/headimg.png" class="headimg"> <img src="@/assets/images/project/headimg.png" class="headimg">
<strong class="text">重庆市轨道交通3号线二期工程4标段施工总承包</strong> <strong class="text">{{ProjectData.projectName}}</strong>
<div class="locks"> <div class="locks">
<img v-if="islock == true" src="@/assets/images/project/lock.png"> <img v-if="ProjectData.isPrivate == 0" src="@/assets/images/project/lock.png">
<img v-else src="@/assets/images/project/lockopen.png"> <img v-else src="@/assets/images/project/lockopen.png">
仅自己可见 {{ProjectData.isPrivate == 0?"仅自己可见":"他人可见"}}
<!--<div class="delform">--> <!--<div class="delform">-->
<!--<div class="words">{{islock==true?"是否将项目权限修改为他人可见?":"是否将项目权限修改为仅自己可见?"}}</div>--> <!--<div class="words">{{ProjectData.isPrivate == 0?"是否将项目权限修改为他人可见?":"是否将项目权限修改为仅自己可见?"}}</div>-->
<!--<div>--> <!--<div>-->
<!--<div class="btnsmall btn_primary h28">确定</div>--> <!--<div class="btnsmall btn_primary h28">确定</div>-->
<!--<div class="btnsmall btn_cancel h28">取消</div>--> <!--<div class="btnsmall btn_cancel h28">取消</div>-->
...@@ -32,7 +33,7 @@ ...@@ -32,7 +33,7 @@
{{xmlx}} {{xmlx}}
<i class="el-icon-caret-bottom"></i> <i class="el-icon-caret-bottom"></i>
</span> </span>
<el-select v-model="xmlx" class="select-multiple" placeholder="请选择"> <el-select v-model="xmlx" class="select-multiple" placeholder="请选择" @change="{}">
<el-option v-for="(item,index) in projectType" :key="index" :label="item.dictLabel" :value="item.dictValue"></el-option> <el-option v-for="(item,index) in projectType" :key="index" :label="item.dictLabel" :value="item.dictValue"></el-option>
</el-select> </el-select>
</div> </div>
...@@ -55,20 +56,20 @@ ...@@ -55,20 +56,20 @@
<span>投资估算(万元):</span> <span>投资估算(万元):</span>
<div class="inputxt i" :class="{'nomar':nowedit != 3}"> <div class="inputxt i" :class="{'nomar':nowedit != 3}">
<div class="flex" v-if="nowedit == 3"> <div class="flex" v-if="nowedit == 3">
<el-input placeholder="待添加" @input="number"></el-input> <el-input v-model="ProjectData.investmentAmount" placeholder="待添加" @input="number"></el-input>
<div class="flex"> <div class="flex">
<div class="btnsmall btn_primary h28" style="width: 56px">确定</div> <div class="btnsmall btn_primary h28" style="width: 56px">确定</div>
<div class="cancels h28" @click="nowedit = -1" style="">取消</div> <div class="cancels h28" @click="nowedit = -1" style="">取消</div>
</div> </div>
</div> </div>
<span class="txt" v-else @click="nowedit = 3">待添加</span> <span :class="{txt:ProjectData.investmentAmoun==''}" v-else @click="nowedit = 3">{{ProjectData.investmentAmount||'待添加'}}</span>
</div> </div>
</div> </div>
<div class="det-con"> <div class="det-con">
<span>建设地点:</span> <span>建设地点:</span>
<div class="select-popper"> <div class="select-popper">
<span :class="{ color_text:address != 'address'}"> <span :class="{ color_text:address != '待添加'}">
{{address}} {{address}}
<i class="el-icon-caret-bottom"></i> <i class="el-icon-caret-bottom"></i>
</span> </span>
...@@ -80,15 +81,15 @@ ...@@ -80,15 +81,15 @@
</div> </div>
<div class="det-con"> <div class="det-con">
<span>商务团队:</span> <span>商务团队:</span>
<span>李力</span> <span>{{ProjectData.team}}</span>
</div> </div>
</div> </div>
<div class="schedule"> <div class="schedule">
<div class="child" v-for="(item,index) in projectStage" @mouseover="hover(index)" @mouseleave="hover(-1)" @click="choose(index,item.dictValue)"> <div class="child" v-for="(item,index) in projectStage" @mouseover="hover(item.dictValue)" @mouseleave="hover(-1)" @click="choose(item.dictValue)">
<img v-if="index == lastindex" src="@/assets/images/project/pro_2.png"> <img v-if="item.dictValue == lastindex" src="@/assets/images/project/pro_2.png">
<img v-else-if="index == thisindex" src="@/assets/images/project/pro_3.png"> <img v-else-if="item.dictValue == thisindex" src="@/assets/images/project/pro_3.png">
<img v-else src="@/assets/images/project/pro_1.png"> <img v-else src="@/assets/images/project/pro_1.png">
<span :class="{'now':index == thisindex}">{{item.dictLabel}}</span> <span :class="{'now':item.dictValue == thisindex}">{{item.dictLabel}}</span>
</div> </div>
</div> </div>
...@@ -163,7 +164,7 @@ ...@@ -163,7 +164,7 @@
domicile:[], domicile:[],
props:{ checkStrictly: true, expandTrigger: 'hover' }, props:{ checkStrictly: true, expandTrigger: 'hover' },
id:'', id:'',
ProjectData:null, ProjectData:{},
} }
}, },
created(){ created(){
...@@ -183,9 +184,23 @@ ...@@ -183,9 +184,23 @@
}) })
//获取基本信息 //获取基本信息
getXMSL(this.id).then(result=>{ getXMSL(this.id).then(result=>{
this.ProjectData = result.code==200?result.data:[] this.ProjectData = result.code==200?result.data:{}
this.$route.query.projectname = result.data.projectName this.$route.query.projectname = result.data.projectName
this.xmlx = result.data.projectType==""||result.data.projectType==null?"请选择":result.data.projectType
this.xmlb = result.data.projectCategory==""||result.data.projectCategory==null?"请选择":result.data.projectCategory
this.thisindex = result.data.projectStage
let list = []
if(result.data.provinceName){
list.push(result.data.provinceName)
}
if(result.data.cityName){
list.push(result.data.cityName)
}
if(result.data.districtName){
list.push(result.data.districtName)
}
this.address = list
console.log(this.ProjectData.team)
}) })
}, },
methods: { methods: {
...@@ -218,11 +233,11 @@ ...@@ -218,11 +233,11 @@
}, },
//进度条悬浮、点击事件 //进度条悬浮、点击事件
hover(index){ hover(value){
this.lastindex = index this.lastindex = value
}, },
choose(index,value){ choose(value){
this.thisindex = index this.thisindex = value
console.log(value) console.log(value)
}, },
//内容组件切换 //内容组件切换
...@@ -236,7 +251,7 @@ ...@@ -236,7 +251,7 @@
}, },
handleChange(value) { handleChange(value) {
// console.log(value); console.log(value);
let str = '' let str = ''
var labelString = this.$refs.myCascader.getCheckedNodes()[0].pathLabels; var labelString = this.$refs.myCascader.getCheckedNodes()[0].pathLabels;
labelString.forEach((item,index)=>{ labelString.forEach((item,index)=>{
......
package com.dsk.system.service; package com.dsk.system.service;
import com.dsk.common.core.domain.AjaxResult; import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.dtos.OpRegionalEconomicDataRegionalListDto;
import com.dsk.common.dtos.OpRegionalEconomicDataStatisticsRegionalDto;
import com.dsk.common.dtos.OpRegionalEconomicDataV1Dto; import com.dsk.common.dtos.OpRegionalEconomicDataV1Dto;
import com.dsk.common.dtos.OpRegionalEconomicDataV1PageDto; import com.dsk.common.dtos.OpRegionalEconomicDataV1PageDto;
...@@ -39,7 +41,7 @@ public interface EconomicService { ...@@ -39,7 +41,7 @@ public interface EconomicService {
*@Author: Dgm *@Author: Dgm
*@date: 2023/5/18 10:25 *@date: 2023/5/18 10:25
*/ */
AjaxResult statisticsRegional(OpRegionalEconomicDataV1Dto dto); AjaxResult statisticsRegional(OpRegionalEconomicDataStatisticsRegionalDto dto);
/*** /***
*@Description: 地区经济-分页列表 *@Description: 地区经济-分页列表
...@@ -48,7 +50,7 @@ public interface EconomicService { ...@@ -48,7 +50,7 @@ public interface EconomicService {
*@Author: Dgm *@Author: Dgm
*@date: 2023/5/18 10:25 *@date: 2023/5/18 10:25
*/ */
AjaxResult regionalList(OpRegionalEconomicDataV1Dto dto); AjaxResult regionalList(OpRegionalEconomicDataRegionalListDto dto);
/*** /***
*@Description: 地区经济-分页列表 *@Description: 地区经济-分页列表
......
...@@ -76,15 +76,16 @@ public class CustomerServiceImpl implements ICustomerService { ...@@ -76,15 +76,16 @@ public class CustomerServiceImpl implements ICustomerService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean add(Customer customer) { public boolean add(Customer customer) {
try { if (ObjectUtils.isEmpty(customer.getUipId())) {
R res = enterpriseService.getUipId(customer.getCompanyName()); try {
if (!ObjectUtils.isEmpty(res.getData())) { R res = enterpriseService.getUipId(customer.getCompanyName());
customer.setUipId(MapUtil.getStr(BeanUtil.beanToMap(res.getData()), "uipId")); if (!ObjectUtils.isEmpty(res.getData())) {
customer.setUipId(MapUtil.getStr(BeanUtil.beanToMap(res.getData()), "uipId"));
}
} catch (Exception e) {
log.error("获取城投平台企业id错误!error:{}", e.getMessage());
} }
} catch (Exception e) {
log.error("获取城投平台企业id错误!error:{}", e.getMessage());
} }
Long userId = SecurityUtils.getUserId(); Long userId = SecurityUtils.getUserId();
customer.setCreateId(userId); customer.setCreateId(userId);
customer.setUpdateId(userId); customer.setUpdateId(userId);
......
...@@ -2,6 +2,8 @@ package com.dsk.system.service.impl; ...@@ -2,6 +2,8 @@ package com.dsk.system.service.impl;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import com.dsk.common.core.domain.AjaxResult; import com.dsk.common.core.domain.AjaxResult;
import com.dsk.common.dtos.OpRegionalEconomicDataRegionalListDto;
import com.dsk.common.dtos.OpRegionalEconomicDataStatisticsRegionalDto;
import com.dsk.common.dtos.OpRegionalEconomicDataV1Dto; import com.dsk.common.dtos.OpRegionalEconomicDataV1Dto;
import com.dsk.common.dtos.OpRegionalEconomicDataV1PageDto; import com.dsk.common.dtos.OpRegionalEconomicDataV1PageDto;
import com.dsk.common.utils.DskOpenApiUtil; import com.dsk.common.utils.DskOpenApiUtil;
...@@ -40,13 +42,13 @@ public class EconomicServiceImpl implements EconomicService { ...@@ -40,13 +42,13 @@ public class EconomicServiceImpl implements EconomicService {
} }
@Override @Override
public AjaxResult statisticsRegional(OpRegionalEconomicDataV1Dto dto) { public AjaxResult statisticsRegional(OpRegionalEconomicDataStatisticsRegionalDto dto) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/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); return BeanUtil.toBean(map, AjaxResult.class);
} }
@Override @Override
public AjaxResult regionalList(OpRegionalEconomicDataV1Dto dto) { public AjaxResult regionalList(OpRegionalEconomicDataRegionalListDto dto) {
Map<String, Object> map = dskOpenApiUtil.requestBody("/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); return BeanUtil.toBean(map, AjaxResult.class);
} }
......
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