Commit 0dd5c96f authored by danfuman's avatar danfuman

代码合并

parent e36ed880
...@@ -40,7 +40,8 @@ ...@@ -40,7 +40,8 @@
"axios": "0.24.0", "axios": "0.24.0",
"clipboard": "2.0.8", "clipboard": "2.0.8",
"core-js": "3.25.3", "core-js": "3.25.3",
"echarts": "^5.4.0", "echarts": "^5.0.0",
"el-table-horizontal-scroll": "^1.2.5",
"element-resize-detector": "^1.2.4", "element-resize-detector": "^1.2.4",
"element-ui": "2.15.12", "element-ui": "2.15.12",
"file-saver": "2.0.5", "file-saver": "2.0.5",
...@@ -60,7 +61,7 @@ ...@@ -60,7 +61,7 @@
"vue-cropper": "0.5.5", "vue-cropper": "0.5.5",
"vue-meta": "2.4.0", "vue-meta": "2.4.0",
"vue-router": "3.4.9", "vue-router": "3.4.9",
"vuedraggable": "2.24.3", "vuedraggable": "^2.24.3",
"vuex": "3.6.0" "vuex": "3.6.0"
}, },
"devDependencies": { "devDependencies": {
......
import request from '@/utils/request' import request from '@/utils/request'
// 客户概览-客户统计
export function statistics() {
return request({
url: '/customer/overview/statistics',
method: 'get',
})
}
// 客户概览-客户合作情况
export function cooperationTop() {
return request({
url: '/customer/overview/cooperation/top',
method: 'get',
})
}
// 客户概览-客户信资评级
export function creditLevel() {
return request({
url: '/customer/overview/credit/level',
method: 'get',
})
}
// 导入客户列表 // 导入客户列表
export function importData(param) { export function importData(param) {
return request({ return request({
......
...@@ -50,3 +50,20 @@ export function businessList(data) { ...@@ -50,3 +50,20 @@ export function businessList(data) {
data: data data: data
}) })
} }
// 集团招标
export function bidPage(data) {
return request({
url: '/combine/info/bidPage',
method: 'post',
data: data
})
}
// 集团招标导出
export function exportBid(data) {
return request({
url: '/combine/info/export/bid',
method: 'post',
data: data
})
}
...@@ -80,3 +80,35 @@ export function tenderPage(data) { ...@@ -80,3 +80,35 @@ export function tenderPage(data) {
data: data data: data
}) })
} }
// 客户-供应商下拉框
export function getSelect(data) {
return request({
url: '/enterpriseBussiness/select',
method: 'post',
data: data
})
}
// 中标公示来源链接
export function bidWinMergeDetail(data) {
return request({
url: '/enterpriseBussiness/bidWinMergeDetail',
method: 'post',
data: data
})
}
// 四库业绩来源链接
export function skyProjectDetail(data) {
return request({
url: '/enterpriseBussiness/skyProjectDetail',
method: 'post',
data: data
})
}
// 荣誉奖项来源链接
export function awardDetail(data) {
return request({
url: '/enterpriseBussiness/awardDetail',
method: 'post',
data: data
})
}
...@@ -147,7 +147,7 @@ let centralEnterprselocalPage= function centralEnterprselocalPage(param) { ...@@ -147,7 +147,7 @@ let centralEnterprselocalPage= function centralEnterprselocalPage(param) {
data: param data: param
}) })
} }
// 民营集团 // 其他集团
let centralEnterprsesocial= function centralEnterprsesocial(param) { let centralEnterprsesocial= function centralEnterprsesocial(param) {
return request({ return request({
url: '/combine/info/centralEnterprse/social', url: '/combine/info/centralEnterprse/social',
...@@ -155,7 +155,7 @@ let centralEnterprsesocial= function centralEnterprsesocial(param) { ...@@ -155,7 +155,7 @@ let centralEnterprsesocial= function centralEnterprsesocial(param) {
data: param data: param
}) })
} }
// 民营集团更多 // 其他集团更多
let centralEnterprsesocialPage= function centralEnterprsesocialPage(param) { let centralEnterprsesocialPage= function centralEnterprsesocialPage(param) {
return request({ return request({
url: '/combine/info/centralEnterprse/social/page', url: '/combine/info/centralEnterprse/social/page',
......
import request from "@/utils/request"; import request from "@/utils/request";
// 集团中标统计
export function countByCompany(data) {
return request({
url: '/index/countByCompany',
method: 'post',
data: data
})
}
// 企业中标排行榜
export function bidRank(data) {
return request({
url: '/index/bidRank',
method: 'post',
data: data
})
}
// 大项目最新中标 // 大项目最新中标
export function bigWinningBidsPage(data) { export function bigWinningBidsPage(data) {
return request({ return request({
......
...@@ -219,3 +219,52 @@ export function allRecord(param) { ...@@ -219,3 +219,52 @@ export function allRecord(param) {
params:param, params:param,
}) })
} }
//项目状态统计
export function getStatistics(param) {
return request({
url: '/business/overview/status/statistics',
method: 'get',
params:param,
})
}
//储备项目统计
export function getCount(param) {
return request({
url: '/business/overview/category/analyze/'+param,
method: 'get',
params:param,
})
}
//储备项目资金
export function getAmount(param) {
return request({
url: '/business/overview/amount/analyze',
method: 'get',
params:param,
})
}
//跟进动态
export function getAllRecord(param) {
return request({
url: '/business/record/all/list',
method: 'get',
params:param,
})
}
//公招项目地区统计
export function countGroupByProvince(param) {
return request({
url: '/business/overview/countGroupByProvince',
method: 'post',
data:param
})
}
//公招项目投资金额统计
export function rangByMoney(param) {
return request({
url: '/business/overview/rangByMoney',
method: 'post',
data:param
})
}
...@@ -196,8 +196,55 @@ let getUipIdByCid = function getUipIdByCid(param) { ...@@ -196,8 +196,55 @@ let getUipIdByCid = function getUipIdByCid(param) {
data: param data: param
}) })
} }
// 重点项目清单查询
let getImportantPage = function getImportantPage(param) {
return request({
url: '/radar/importantPage',
method: 'post',
data: param
})
}
// 重点项目清单筛选
let getImportantCondition = function getImportantCondition(param) {
return request({
url: '/radar/importantCondition',
method: 'post',
data: param
})
}
// 重点项目清单关联列表
let getImportantSelect = function getImportantSelect(param) {
return request({
url: '/radar/importantSelect',
method: 'post',
data: param
})
}
//重点项目清单详情
let getImportantDetail = function getImportantDetail(param) {
return request({
url: '/enterpriseProject/importantDetail',
method: 'post',
data: param
})
}
//项目清单导出
let radarExport = function radarExport(param) {
return request({
url: '/radar/export/important',
method: 'post',
data: param
})
}
export default { export default {
radarExport,
getImportantDetail,
getImportantSelect,
getImportantCondition,
getImportantPage,
importData, importData,
searchDic, searchDic,
bondProjectPage, bondProjectPage,
......
This diff is collapsed.
...@@ -121,7 +121,7 @@ aside { ...@@ -121,7 +121,7 @@ aside {
//main-container全局样式 //main-container全局样式
.app-container { .app-container {
padding: 16px; //padding: 16px;
//margin-top: 56px; //margin-top: 56px;
} }
...@@ -223,6 +223,7 @@ ul, li { ...@@ -223,6 +223,7 @@ ul, li {
.app-container { .app-container {
margin: 12px 24px; margin: 12px 24px;
background-color: #f5f5f5; background-color: #f5f5f5;
padding-bottom: 16px !important;
.el-input__inner{ .el-input__inner{
border-color: #D9D9D9; border-color: #D9D9D9;
color: #232323; color: #232323;
...@@ -262,6 +263,19 @@ ul, li { ...@@ -262,6 +263,19 @@ ul, li {
} }
} }
.query-ability{ .query-ability{
.total{
display: flex !important;
flex-direction: row;
align-items: center;
&:before {
content: "";
display: inline-block;
width: 2px;
height: 2px;
background: rgba(35, 35, 35, 0.4);
margin-right: 4px;
}
}
span{ span{
font-size: 14px; font-size: 14px;
color: #232323; color: #232323;
...@@ -407,6 +421,18 @@ ul, li { ...@@ -407,6 +421,18 @@ ul, li {
background: #566380; background: #566380;
} }
} }
.el-scrollbar{
height: 16px;
.el-scrollbar__bar.is-horizontal{
height: 8px;
}
.el-scrollbar__thumb{
background: rgba(98,110,126,0.4);
&:hover{
background: #566380;
}
}
}
} }
} }
......
...@@ -977,6 +977,11 @@ ...@@ -977,6 +977,11 @@
font-size: 12px; font-size: 12px;
} }
} }
.el-form {
.el-form-item--small.el-form-item {
margin-bottom: 0;
}
}
} }
.p10{ .p10{
padding: 0 10px; padding: 0 10px;
...@@ -1171,9 +1176,6 @@ ...@@ -1171,9 +1176,6 @@
} }
.none{display: none} .none{display: none}
.el-popper[x-placement^=bottom]{
margin-top: 0 !important;
}
.el-dialog__body{ .el-dialog__body{
padding-top: 14px; padding-top: 14px;
padding-bottom: 18px; padding-bottom: 18px;
......
This diff is collapsed.
...@@ -43,7 +43,7 @@ export default { ...@@ -43,7 +43,7 @@ export default {
.app-main { .app-main {
/* 84 = navbar + tags-view = 50 + 34 */ /* 84 = navbar + tags-view = 50 + 34 */
min-height: calc(100vh - 68px); min-height: calc(100vh - 68px);
min-width:1440px; min-width:1240px;
background: #F5F5F5; background: #F5F5F5;
overflow: initial; overflow: initial;
} }
......
...@@ -126,7 +126,7 @@ export default { ...@@ -126,7 +126,7 @@ export default {
overflow: inherit; overflow: inherit;
/*position: relative;*/ /*position: relative;*/
background: #fff; background: #fff;
box-shadow: 0 1px 4px rgba(0,21,41,.08); /*box-shadow: 0 1px 4px rgba(0,21,41,.08);*/
position: fixed; position: fixed;
top:0; top:0;
z-index: 999; z-index: 999;
......
...@@ -7,13 +7,29 @@ ...@@ -7,13 +7,29 @@
<!--<i class="el-icon-arrow-down" v-if="!showall"></i> <i class="el-icon-arrow-up" v-if="showall"></i>--> <!--<i class="el-icon-arrow-down" v-if="!showall"></i> <i class="el-icon-arrow-up" v-if="showall"></i>-->
</div> </div>
<div class="tagslist" v-if="showall"> <div class="tagslist" v-if="showall">
<!--<div v-for="(tag, index) in visitedViews"--> <draggable v-model="visitedViews" :options="dragOptions" @end="end">
<!--:key="tag.path"--> <router-link
<!--:class="isActive(tag)?'active':''"--> v-for="(tag, index) in visitedViews"
<!--&gt;--> ref="tag"
<!--<i class="el-icon-check"></i>--> :key="tag.path"
:class="isActive(tag)?'active':''"
:to="{ path: tag.path, query: tag.query, fullPath: tag.fullPath }"
tag="span"
class="tags-view-item"
@contextmenu.prevent.native="openMenu(tag,$event)"
>
<div @click="changetags">
<i class="el-icon-check"></i>
<span :id="isActive(tag)?'tagTitle':''">{{ tag.title }}</span>
</div>
</router-link>
<div class="clasall" @click="closeAllTag(selectedTag)">关闭全部标签</div>
<!--</div>--> </draggable>
</div>
</div>
<scroll-pane ref="scrollPane" class="tags-view-wrapper" @scroll="handleScroll">
<draggable v-model="visitedViews" :options="dragOptions" @end="end">
<router-link <router-link
v-for="(tag, index) in visitedViews" v-for="(tag, index) in visitedViews"
ref="tag" ref="tag"
...@@ -22,35 +38,17 @@ ...@@ -22,35 +38,17 @@
:to="{ path: tag.path, query: tag.query, fullPath: tag.fullPath }" :to="{ path: tag.path, query: tag.query, fullPath: tag.fullPath }"
tag="span" tag="span"
class="tags-view-item" class="tags-view-item"
@click.middle.native="!isAffix(tag)?closeSelectedTag(tag):''"
@contextmenu.prevent.native="openMenu(tag,$event)" @contextmenu.prevent.native="openMenu(tag,$event)"
> >
<div @click="changetags"> <svg :class="isActive(tag)?'tags-icon tags-icon-active':'tags-icon'" aria-hidden="true">
<i class="el-icon-check"></i> <use :xlink:href="iconName(tag)" />
<span :id="isActive(tag)?'tagTitle':''">{{ tag.title }}</span> </svg>
</div> <span :id="isActive(tag)?'tagTitle':''">{{ tag.title }}</span>
<span v-if="!isAffix(tag)" class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)" />
<i :class="index!=visitedViews.length-1 && index != isActiveIndex() && index != isActiveIndex()-1?'tags-item-line':'tags-item-line item-color'" />
</router-link> </router-link>
<div class="clasall" @click="closeAllTag(selectedTag)">关闭全部标签</div> </draggable>
</div>
</div>
<scroll-pane ref="scrollPane" class="tags-view-wrapper" @scroll="handleScroll">
<router-link
v-for="(tag, index) in visitedViews"
ref="tag"
:key="tag.path"
:class="isActive(tag)?'active':''"
:to="{ path: tag.path, query: tag.query, fullPath: tag.fullPath }"
tag="span"
class="tags-view-item"
@click.middle.native="!isAffix(tag)?closeSelectedTag(tag):''"
@contextmenu.prevent.native="openMenu(tag,$event)"
>
<svg :class="isActive(tag)?'tags-icon tags-icon-active':'tags-icon'" aria-hidden="true">
<use :xlink:href="iconName(tag)" />
</svg>
<span :id="isActive(tag)?'tagTitle':''">{{ tag.title }}</span>
<span v-if="!isAffix(tag)" class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)" />
<i :class="index!=visitedViews.length-1 && index != isActiveIndex() && index != isActiveIndex()-1?'tags-item-line':'tags-item-line item-color'" />
</router-link>
</scroll-pane> </scroll-pane>
<ul v-show="visible" :style="{left:left+'px',top:top+'px'}" class="contextmenu"> <ul v-show="visible" :style="{left:left+'px',top:top+'px'}" class="contextmenu">
<li @click="refreshSelectedTag(selectedTag)"><i class="el-icon-refresh-right"></i> 刷新页面</li> <li @click="refreshSelectedTag(selectedTag)"><i class="el-icon-refresh-right"></i> 刷新页面</li>
...@@ -64,11 +62,12 @@ ...@@ -64,11 +62,12 @@
</template> </template>
<script> <script>
import draggable from 'vuedraggable'
import ScrollPane from './ScrollPane' import ScrollPane from './ScrollPane'
import path from 'path' import path from 'path'
export default { export default {
components: { ScrollPane }, components: { ScrollPane,draggable },
data() { data() {
return { return {
visible: false, visible: false,
...@@ -77,11 +76,21 @@ export default { ...@@ -77,11 +76,21 @@ export default {
selectedTag: {}, selectedTag: {},
affixTags: [], affixTags: [],
showall:false, showall:false,
dragOptions: {
animation: 200, // 动画时间,单位毫秒
group: 'items', // 分组,同一分组内的元素可以互相拖拽
ghostClass: 'ghost', // 拖拽过程中占位元素的class名称
sort: true, // 是否启用排序功能
draggable: '.tags-view-item', // 可拖拽元素的选择器
}
} }
}, },
computed: { computed: {
visitedViews() { visitedViews:{
return this.$store.state.tagsView.visitedViews get() {
return this.$store.state.tagsView.visitedViews
},
set() {}
}, },
iconName() { iconName() {
return function(val) { return function(val) {
...@@ -124,7 +133,6 @@ export default { ...@@ -124,7 +133,6 @@ export default {
}, },
methods: { methods: {
changetags(){ changetags(){
console.log(88)
this.showall = false this.showall = false
}, },
closeall(){ closeall(){
...@@ -297,7 +305,26 @@ export default { ...@@ -297,7 +305,26 @@ export default {
}, },
handleScroll() { handleScroll() {
this.closeMenu() this.closeMenu()
} },
end (event) {
//调换顺序
let oldIndex = event.oldIndex//移动初始位置
let newIndex = event.newIndex//运动终止位置
let diff = Math.abs(newIndex - oldIndex)//插值绝对值
let index = this.visitedViews[oldIndex]
if (eval(oldIndex) > eval(newIndex)) {
for (let i = 0; i < diff; i++) {
this.visitedViews[oldIndex - i] = this.visitedViews[oldIndex - i - 1]
}
this.visitedViews[newIndex] = index
} else {
for (let i = 0; i < diff; i++) {
this.visitedViews[oldIndex + i] = this.visitedViews[oldIndex + i + 1]
}
this.visitedViews[newIndex] = index
}
this.$forceUpdate()
},
} }
} }
</script> </script>
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<div :class="classObj" class="app-wrapper" :style="{'--current-color': theme}"> <div :class="classObj" class="app-wrapper" :style="{'--current-color': theme}">
<div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside"/> <div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside"/>
<sidebar v-if="!sidebar.hide" class="sidebar-container" @handleBar="handleSideBar" id="sidebar"/> <sidebar v-if="!sidebar.hide" class="sidebar-container" @handleBar="handleSideBar" id="sidebar"/>
<div :class="{hasTagsView:needTagsView,sidebarHide:sidebar.hide,EnterpriseData:$route.name=='EnterpriseData'}" class="main-container"> <div :class="{hasTagsView:needTagsView,sidebarHide:sidebar.hide,EnterpriseData:$route.name=='Group',width1350:$route.name=='Radar',width1240:$route.name=='Overview'}" class="main-container">
<div :class="{'fixed-header':fixedHeader}"> <div :class="{'fixed-header':fixedHeader}">
<navbar :offsetWidth="offsetWidth"/> <navbar :offsetWidth="offsetWidth"/>
</div> </div>
...@@ -128,4 +128,13 @@ export default { ...@@ -128,4 +128,13 @@ export default {
.mobile .fixed-header { .mobile .fixed-header {
width: 100%; width: 100%;
} }
.EnterpriseData{
min-width: 1710px;
}
.width1350{
min-width: 1350px;
}
.width1240{
min-width: 1240px;
}
</style> </style>
...@@ -13,7 +13,7 @@ import router from './router' ...@@ -13,7 +13,7 @@ import router from './router'
import directive from './directive' // directive import directive from './directive' // directive
import plugins from './plugins' // plugins import plugins from './plugins' // plugins
import { download } from '@/utils/request' import { download } from '@/utils/request'
import horizontalScroll from 'el-table-horizontal-scroll'
import './assets/icons' // icon import './assets/icons' // icon
import './permission' // permission control import './permission' // permission control
...@@ -59,6 +59,7 @@ Vue.component('FileUpload', FileUpload) ...@@ -59,6 +59,7 @@ Vue.component('FileUpload', FileUpload)
Vue.component('ImageUpload', ImageUpload) Vue.component('ImageUpload', ImageUpload)
Vue.component('ImagePreview', ImagePreview) Vue.component('ImagePreview', ImagePreview)
Vue.use(horizontalScroll)
Vue.use(directive) Vue.use(directive)
Vue.use(plugins) Vue.use(plugins)
Vue.use(VueMeta) Vue.use(VueMeta)
......
...@@ -63,7 +63,7 @@ export default { ...@@ -63,7 +63,7 @@ export default {
saveAs(text, name, opts); saveAs(text, name, opts);
}, },
exportByPost(url, params){ exportByPost(url, params,name){
var url = baseURL + url var url = baseURL + url
axios({ axios({
method: 'post', method: 'post',
...@@ -72,8 +72,12 @@ export default { ...@@ -72,8 +72,12 @@ export default {
data: params, data: params,
headers: { 'Authorization': 'Bearer ' + getToken() } headers: { 'Authorization': 'Bearer ' + getToken() }
}).then(res => { }).then(res => {
const blob = new Blob([res.data], { type: 'application/octet-stream/pdf/doc/xlsx/xls/docx' }) const blob = new Blob([res.data], { type: 'application/octet-stream/pdf/doc/xlsx/xls/docx/excel' })
this.saveAs(blob, decodeURI(res.headers['download-filename'])) if(name){
this.saveAs(blob, name)
}else {
this.saveAs(blob, decodeURI(res.headers['download-filename']))
}
}) })
}, },
async printErrMsg(data) { async printErrMsg(data) {
......
...@@ -70,7 +70,7 @@ export const constantRoutes = [ ...@@ -70,7 +70,7 @@ export const constantRoutes = [
path: 'index', path: 'index',
component: () => import('@/views/index'), component: () => import('@/views/index'),
name: 'Index', name: 'Index',
meta: { title: '首页', icon: 'index', } meta: { title: '首页', icon: 'index',noCache: false }
} }
] ]
}, },
...@@ -88,6 +88,34 @@ export const constantRoutes = [ ...@@ -88,6 +88,34 @@ export const constantRoutes = [
} }
] ]
}, },
// {
// path: '',
// component: Layout,
// hidden: true,
// redirect: 'economies',
// children: [
// {
// path: '/macro/economies',
// component: () => import('@/views/macro/economies'),
// name: 'Economies',
// meta: { title: '区域经济', icon: 'macro' }
// }
// ]
// },
{
path: '',
component: Layout,
hidden: true,
redirect: 'urban',
children: [
{
path: '/macro/urban',
component: () => import('@/views/macro/urban'),
name: 'Urban',
meta: { title: '城投平台', icon: 'macro' }
}
]
},
{ {
path: '/user', path: '/user',
component: Layout, component: Layout,
...@@ -127,7 +155,7 @@ export const constantRoutes = [ ...@@ -127,7 +155,7 @@ export const constantRoutes = [
path: '/enterprise/:id', path: '/enterprise/:id',
component: () => import('@/views/detail/party-a/index'), component: () => import('@/views/detail/party-a/index'),
name: 'PartyA', name: 'PartyA',
meta: { title: '企业详情', icon: 'enterprise', noCache: false }, meta: { title: '甲方详情', icon: 'enterpriseData', noCache: false },
} }
] ]
}, },
...@@ -291,6 +319,20 @@ export const constantRoutes = [ ...@@ -291,6 +319,20 @@ export const constantRoutes = [
} }
] ]
}, },
{
path: '/MajorProject',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: '/radar/MajorProject/details/:id',
component: () => import('@/views/radar/MajorProject/details'),
name: 'MajorProjectDetails',
meta: { title: '重点项目详情', icon: 'radar' }
}
]
},
{ {
path: '/Bidding', path: '/Bidding',
component: Layout, component: Layout,
......
...@@ -37,6 +37,10 @@ service.interceptors.request.use(config => { ...@@ -37,6 +37,10 @@ service.interceptors.request.use(config => {
config.params = {}; config.params = {};
config.url = url; config.url = url;
} }
cancelPending(config)
config.cancelToken = new CancelToken(res => {
pending.push({'UrlPath': config.url, 'Cancel': res})
})
if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) { if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
const requestObj = { const requestObj = {
url: config.url, url: config.url,
...@@ -68,6 +72,24 @@ service.interceptors.request.use(config => { ...@@ -68,6 +72,24 @@ service.interceptors.request.use(config => {
} }
}) })
//频繁发送请求时,返回慢的数据覆盖了返回快的数据
let pending = []
let CancelToken = axios.CancelToken
let cancelPending = (config) => {
pending.forEach((item, index) => {
if (config) {
// if (item.UrlPath === '/combine/info/memberList' || item.UrlPath === '/combine/info/businessList' || item.UrlPath === '/combine/info/bidPage') {
if (item.UrlPath === config.url && ['/combine/info/memberList','/combine/info/businessList','/combine/info/bidPage'].includes(config.url)) {
item.Cancel() // 取消请求
pending.splice(index, 1) // 移除当前请求记录
};
} else {
item.Cancel() // 取消请求
pending.splice(index, 1) // 移除当前请求记录
}
})
}
// 响应拦截器 // 响应拦截器
service.interceptors.response.use(res => { service.interceptors.response.use(res => {
const apiList = ['/login', '/system/user/profile/updatePwd'] //需要提示错误的接口 const apiList = ['/login', '/system/user/profile/updatePwd'] //需要提示错误的接口
...@@ -102,6 +124,7 @@ service.interceptors.response.use(res => { ...@@ -102,6 +124,7 @@ service.interceptors.response.use(res => {
Notification.error({ title: msg }) Notification.error({ title: msg })
return Promise.reject('error') return Promise.reject('error')
} else { } else {
cancelPending(res.config)
return res.data return res.data
} }
},error => { },error => {
...@@ -117,7 +140,7 @@ service.interceptors.response.use(res => { ...@@ -117,7 +140,7 @@ service.interceptors.response.use(res => {
if(message=='数据正在处理,请勿重复提交'){ //重复提交,提示样式特殊处理 if(message=='数据正在处理,请勿重复提交'){ //重复提交,提示样式特殊处理
Message({ message: message, type: 'warning', duration: 5 * 1000 }) Message({ message: message, type: 'warning', duration: 5 * 1000 })
}else{ }else{
Message({ message: message, type: 'error', duration: 5 * 1000 }) // Message({ message: message, type: 'error', duration: 5 * 1000 })
} }
if(error.message.indexOf('timeout')<0 ){ //超时报错不提示 if(error.message.indexOf('timeout')<0 ){ //超时报错不提示
......
...@@ -51,6 +51,10 @@ export default { ...@@ -51,6 +51,10 @@ export default {
type: String, type: String,
default: '请选择' default: '请选择'
}, },
'moneyValue': {
type: String,
default: ''
},
'ref-str': { 'ref-str': {
type: String, type: String,
default: `timeselect${String(Math.random(0, 100)).slice(2)}`, default: `timeselect${String(Math.random(0, 100)).slice(2)}`,
...@@ -92,6 +96,9 @@ export default { ...@@ -92,6 +96,9 @@ export default {
if(this.moneyList&&this.moneyList.length>0){ if(this.moneyList&&this.moneyList.length>0){
this.options = this.moneyList this.options = this.moneyList
} }
if(this.moneyValue){
this.value = this.moneyValue
}
}, },
destroyed() { destroyed() {
const app = document.getElementById('app') const app = document.getElementById('app')
...@@ -278,7 +285,7 @@ export default { ...@@ -278,7 +285,7 @@ export default {
.options-block { .options-block {
position: absolute; position: absolute;
margin-top: 12px; margin-top: 3px;
min-width: 120px; min-width: 120px;
font-size: 14px; font-size: 14px;
color: #666666; color: #666666;
...@@ -411,20 +418,20 @@ export default { ...@@ -411,20 +418,20 @@ export default {
width: 186px; width: 186px;
color: #606266; color: #606266;
text-indent: 0; text-indent: 0;
padding: 16px; padding: 14px;
padding-top: 0px; padding-top: 0px;
border: 1px solid #e0e0e0; border: 1px solid #e0e0e0;
.popper_wrap { .popper_wrap {
margin-top: 16px; margin-top: 16px;
display: inline-block; display: inline-block;
.popper_input { .popper_input {
width: 100px; width: 90px;
display: inline-block; display: inline-block;
margin: 0px 8px; margin: 0px 8px;
line-height: 34px; line-height: 34px;
} }
.el-input__inner { .el-input__inner {
width: 100px; width: 90px;
} }
} }
input::-webkit-outer-spin-button, input::-webkit-outer-spin-button,
......
...@@ -46,6 +46,10 @@ export default { ...@@ -46,6 +46,10 @@ export default {
type: String, type: String,
default: '请选择', default: '请选择',
}, },
'timeValue': {
type: String,
default: '',
},
'ref-str': { 'ref-str': {
type: String, type: String,
default: `timeselect${String(Math.random(0, 100)).slice(2)}`, default: `timeselect${String(Math.random(0, 100)).slice(2)}`,
...@@ -61,7 +65,7 @@ export default { ...@@ -61,7 +65,7 @@ export default {
timeList: { timeList: {
type: Array, type: Array,
default: () => [], default: () => [],
} },
}, },
computed: { computed: {
isClear() { isClear() {
...@@ -106,6 +110,9 @@ export default { ...@@ -106,6 +110,9 @@ export default {
if(this.dateTo){ if(this.dateTo){
this.defaultValue = new Date(this.dateTo) this.defaultValue = new Date(this.dateTo)
} }
if(this.timeValue){
this.value = this.timeValue
}
this.handleAppClick() this.handleAppClick()
if(this.timeList&&this.timeList.length>0){ if(this.timeList&&this.timeList.length>0){
this.options = this.timeList this.options = this.timeList
...@@ -319,6 +326,9 @@ export default { ...@@ -319,6 +326,9 @@ export default {
left: -400px; left: -400px;
} }
} }
.el-date-editor{
left: -400px;
}
} }
.picker-block { .picker-block {
......
<template>
<div class="no-data">
<div class="no-data-box">
<img :src="noData" alt="抱歉,没找到相关数据" />
<div v-if="text">抱歉,您还未添加{{text}}项目</div>
<div v-else>抱歉,没找到相关数据</div>
<span v-if="condition">建议调整关键词或筛选条件,重新搜索</span>
</div>
</div>
</template>
<script>
export default {
name: "NoData",
props: {
condition: {
type: Boolean,
default: false
},
text: {
type: String,
default: ''
}
},
data() {
return {
noData: require("@/assets/images/detail/noData.png")
}
},
methods:{
}
}
</script>
<style lang="scss" scoped>
.no-data {
font-size: 14px;
color: #999999;
width: 100%;
height: 100%;
min-height: 120px;
display: flex;
justify-content: center;
align-items: center;
background: #ffffff;
//border: 1px solid #eeeeee;
.no-data-box {
display: flex;
flex-direction: column;
align-items: center;
img {
width: 108px;
height: 109px;
margin-bottom: 22px;
}
div{
font-size: 16px;
line-height: 1;
color: #333333;
}
span{
margin-top: 4px;
}
}
}
</style>
<template>
<div>
<el-dialog
class="popups"
:visible.sync="dialogVisible"
width="534px"
:close-on-click-modal="false"
@close="resetForm('ruleForm')"
>
<div class="poptitle">
<img src="@/assets/images/economies/icon.png">
<span>添加客户</span>
</div>
<el-form class="popform j" :model="queryParam" :rules="rules" ref="ruleForm" label-width="130px">
<el-form-item label="企业名称:" class="row" prop="companyName">
<el-input type="text" placeholder="请输入" v-model="queryParam.companyName" @input="getCompany(1)"></el-input>
<div class="resultlist infinite-list" v-if="showlist" id="box" v-infinite-scroll="load" style="overflow:auto">
<div class="infinite-list-item" v-for="(item,index) in companData" @click="selCompany(item)"><span v-html="item.name" :key="companypage"></span></div>
</div>
</el-form-item>
<el-form-item label="客户等级:" class="row">
<el-select placeholder="请选择" v-model="queryParam.customerLevel">
<el-option v-for="(item,index) in customerLevel" :key="index" :label="item.dictLabel" :value="item.dictValue"></el-option>
</el-select>
</el-form-item>
<el-form-item label="法定代表人:" class="row">
<el-input type="text" placeholder="请输入" v-model="queryParam.legalPerson"></el-input>
</el-form-item>
<el-form-item label="注册资本(万):" class="row">
<el-input type="text" placeholder="请输入" v-model="queryParam.registerCapital" @input='number'></el-input>
</el-form-item>
<el-form-item label="企业注册地:" class="row">
<el-cascader :props="props" @change="getAddr($event)" ref="address" v-model="queryParam.address" :options="addressList" clearable></el-cascader>
</el-form-item>
<el-form-item label="统一社会信用代码:" class="row">
<el-input type="text" placeholder="请输入" v-model="queryParam.creditCode"></el-input>
</el-form-item>
<div class="popbot">
<div class="wordprimary" @click="toct">前往城投平台寻找客户线索></div>
<div class="btn btn_cancel h32" @click="resetForm('ruleForm')">返回</div>
<div class="btn btn_primary h32" @click="submitForm('ruleForm')">添加</div>
</div>
</el-form>
</el-dialog>
</div>
</template>
<script>
import { getDictType, getEnterprise } from '@/api/main'
import { addCustomer, getCustomerList, importData } from '@/api/custom/custom'
import prvinceTree from '@/assets/json/provinceTree'
export default {
name: '',
components: {
},
props: {
data:{}
},
data() {
return {
props:{ checkStrictly: true, expandTrigger: 'hover' },
dialogVisible: this.data.open,
//添加客户
queryParam:{
companyId:'',//jsk企业id
companyName:'',//客户名称(企业名称
customerLevel:'',//客户等级
legalPerson:'',//法定代表人
registerCapital:'',//注册资本
registerAddress:'',//企业注册地址
creditCode:'',//社会统一信用代码
address:'',//选择的地址
provinceId:'',
cityId:'',
districtId:'',
},
rules:{
companyName:[{ required: true, message: '请输入非空格字符!', trigger: 'blur' },]
},
showlist:false,
customerLevel:[]
}
},
created() {
this.prvinceTree()
this.getDictType()
console.log(this.dialogVisible)
console.log('1111111111')
},
computed: {},
methods:{
async prvinceTree() {
this.addressList = prvinceTree;
this.getadd(this.addressList)
},
getDictType(){
//获取客户等级
getDictType('customer_level_type').then(result=>{
this.customerLevel = result.code == 200 ? result.data:[]
})
},
open() {
// this.dialogVisible = true;
},
resetForm(formName) {
this.queryParam = {
companyId:'',//jsk企业id
companyName:'',//客户名称(企业名称
customerLevel:'',//客户等级
legalPerson:'',//法定代表人
registerCapital:'',//注册资本
registerAddress:'',//企业注册地址
creditCode:'',//社会统一信用代码
address:'',//选择的地址
provinceId:'',
cityId:'',
districtId:'',
},
this.dialogVisible = false
this.showlist = false
},
getAddr(obj){
if(obj.length == 0){
this.queryParam.provinceId = ''
this.queryParam.cityId = ''
this.queryParam.districtId = ''
return false
}
let labelString = this.$refs.address.getCheckedNodes()[0].pathLabels.join("-");
this.queryParam.registerAddress = labelString
this.queryParam.provinceId = obj[0]
this.queryParam.cityId = obj.length>=1 ? obj[1]:''
this.queryParam.districtId = obj.length>=2 ? obj[2]:''
},
//获取建设库客户
getCompany(value){
this.queryParam.companyId = null
if(value == 1){
this.companData = []
this.companypage = 1
}
if (this.queryParam.companyName.length>=2){
let param = {
keyword:this.queryParam.companyName,
page:{
limit:20,
page:this.companypage
}
}
getEnterprise(JSON.stringify(param)).then(result=>{
if(result.code != 200){
return false
}
if(result.data.list != null && result.data.list.length>0){
this.isscroll = true
if (this.companData.length===0) {
this.companData = result.data.list
} else {
let arr2 = result.data.list
arr2.unshift(2, 0);
Array.prototype.splice.apply(this.companData, arr2);
}
if(this.companData.length===0) {
this.showlist = false
}else{
this.showlist = true
}
this.companypage += 1
}else{
this.isscroll = false
}
})
}
},
load(){
if(this.isscroll){
this.getCompany(2)
}
},
selCompany(item){
this.queryParam.companyId = item.jskEid
this.queryParam.companyName = item.name.replace(/<[^>]+>/g, '')
this.queryParam.legalPerson = item.legalPerson
let registeredCapitalStr = ""
if(item.registeredCapitalStr == "0" || item.registeredCapitalStr == 0){
registeredCapitalStr = ''
}else{
registeredCapitalStr = item.registeredCapitalStr
}
this.queryParam.registerCapital = registeredCapitalStr
this.queryParam.creditCode = item.creditCode
this.queryParam.provinceId = item.provinceId
this.queryParam.cityId = item.cityId
this.queryParam.districtId = item.cityId
let list = []
if(item.provinceId != null && item.provinceId != "")
list.push(item.provinceId)
if(item.cityId != null && item.cityId != "")
list.push(item.cityId)
if(item.districtId != null && item.districtId != "")
list.push(item.districtId)
this.$nextTick(()=>{
this.queryParam.address = list
let _this = this
setTimeout(function() {
if(_this.$refs.address){
_this.queryParam.registerAddress = _this.$refs.address.getCheckedNodes()[0].pathLabels.join("-")
}
},1000)
})
this.showlist = false
},
//添加客户
submitForm(formName) {
// if(this.queryParam.companyId=="" || this.queryParam.companyId == null){
// this.$message.error({message:'请选择企业!',showClose:true})
//
// return;
// }
this.$refs[formName].validate((valid) => {
if (valid) {
addCustomer(this.queryParam).then(result=>{
if(result.code == 200){
this.$message.success('添加成功!')
this.dialogVisible = false
this.resetForm('ruleForm')
}else{
this.$message.error(result.msg)
}
})
} else {
}
});
},
toct(){
this.$router.push({path:'/macro/urban'})
},
//输入数字
number(value){
if(value == '')
this.queryParam.registerCapital = value
else
this.queryParam.registerCapital = value.replace(/^\D*(\d*(?:\.\d{0,6})?).*$/g, '$1')//输入6位小数
},
//处理注册地数据
getadd(row) {
this.addrcallback(row,this.getadd)
},
addrcallback(row,callback){
if(row){
row.forEach(item => {
item.value = item.id
callback && callback(item.children)
})
}
},
},
}
</script>
<style scoped>
</style>
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
</div> </div>
</div> </div>
<skeleton v-if="isSkeleton"></skeleton> <skeleton v-if="isSkeleton"></skeleton>
<el-table v-if="!isSkeleton&&tableData.total > 0" class="fixed-table" max-height="640" <el-table v-if="!isSkeleton&&tableData.total > 0" class="fixed-table" v-horizontal-scroll="tableData.total > 10 ? 'hover' : '1'" max-height="640"
:data="tableData.rows" :data="tableData.rows"
stripe border stripe border
style="width: 100%"> style="width: 100%">
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
prop="index" prop="index"
label="序号" label="序号"
fixed="left" fixed="left"
width="47"> width="60">
<template slot-scope='scope'> <template slot-scope='scope'>
<span>{{ (searchParam.pageNum - 1) * searchParam.pageSize + scope.$index + 1 }}</span> <span>{{ (searchParam.pageNum - 1) * searchParam.pageSize + scope.$index + 1 }}</span>
</template> </template>
...@@ -51,7 +51,7 @@ ...@@ -51,7 +51,7 @@
<el-table-column <el-table-column
prop="cooperationProject" prop="cooperationProject"
label="合作项目" label="合作项目"
width="76"> width="90">
<template slot-scope="scope"> <template slot-scope="scope">
{{scope.row.cooperationProject || '--'}} {{scope.row.cooperationProject || '--'}}
</template> </template>
...@@ -59,7 +59,7 @@ ...@@ -59,7 +59,7 @@
<el-table-column <el-table-column
prop="followProject" prop="followProject"
label="跟进项目" label="跟进项目"
width="76"> width="90">
<template slot-scope="scope"> <template slot-scope="scope">
{{scope.row.followProject || '--'}} {{scope.row.followProject || '--'}}
</template> </template>
...@@ -67,7 +67,7 @@ ...@@ -67,7 +67,7 @@
<el-table-column <el-table-column
prop="reserveProject" prop="reserveProject"
label="储备项目" label="储备项目"
width="76"> width="90">
<template slot-scope="scope"> <template slot-scope="scope">
{{scope.row.reserveProject || '--'}} {{scope.row.reserveProject || '--'}}
</template> </template>
...@@ -91,7 +91,7 @@ ...@@ -91,7 +91,7 @@
<el-table-column <el-table-column
prop="registerCapitalStr" prop="registerCapitalStr"
label="注册资本金(万元)" label="注册资本金(万元)"
width="140"> width="160">
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.registerCapital && scope.row.registerCapital>0">{{scope.row.registerCapital}}</span><span v-else>--</span> <span v-if="scope.row.registerCapital && scope.row.registerCapital>0">{{scope.row.registerCapital}}</span><span v-else>--</span>
</template> </template>
......
...@@ -54,17 +54,24 @@ ...@@ -54,17 +54,24 @@
<label class="label">建设性质</label> <label class="label">建设性质</label>
<span>{{info.projectNature||"--"}}</span> <span>{{info.projectNature||"--"}}</span>
</p> </p>
<p>
<label class="label">招标公告</label>
<span class="span2">
<router-link :to="`/radar/Notice/details/${info.bId}`" tag="a" class="a-link" v-if="info.bId" >查看招标公告</router-link>
<span v-else>--</span>
</span>
</p>
</div> </div>
<div class="biddetail-title">招标信息</div> <div class="biddetail-title">招标信息</div>
<div class="main31-box"> <div class="main31-box">
<p> <p>
<label class="label">招标单位</label> <label class="label">招标单位</label>
<span class="span1"> <span class="span1">
<router-link v-if="info.projectUnit" :to="info.uipId?'/enterprise/' + encodeStr(info.projectUnitId) :'/company/' + encodeStr(info.projectUnitId) " tag="a" class="list-titel-a blue" v-html="info.projectUnit"></router-link> <router-link v-if="info.projectUnit" :to="info.uipId?'/enterprise/' + encodeStr(info.projectUnitId) :'/company/' + encodeStr(info.projectUnitId) " tag="a" class="list-titel-a blue" v-html="info.projectUnit"></router-link>
<span v-else>--</span> <span v-else>--</span>
</span> </span>
<label class="label label1">招标代理机构</label> <label class="label label1">招标代理机构</label>
<span class="span1">{{info.agency||"--"}}</span> <span class="span1">{{info.agency||"--"}}</span>
</p> </p>
</div> </div>
...@@ -91,7 +98,7 @@ ...@@ -91,7 +98,7 @@
</template> </template>
<script> <script>
import "@/assets/styles/public.css"; import "@/assets/styles/public.scss";
import {encodeStr} from "@/assets/js/common.js" import {encodeStr} from "@/assets/js/common.js"
import {getBiddetail} from '@/api/detail/party-a/biddetail.js'; import {getBiddetail} from '@/api/detail/party-a/biddetail.js';
export default { export default {
...@@ -409,9 +416,12 @@ export default { ...@@ -409,9 +416,12 @@ export default {
font-size: 12px; font-size: 12px;
background: #fff; background: #fff;
} }
.span1{ .span1{
width: 40%; width: 40%;
} }
.span2{
width: 88.9%;
}
.span-one { .span-one {
width: 90%; width: 90%;
} }
......
...@@ -53,12 +53,14 @@ export default { ...@@ -53,12 +53,14 @@ export default {
{title: '集团成员', pathName: 'members'}, {title: '集团成员', pathName: 'members'},
{title: '集团资质', pathName: 'qualifications'}, {title: '集团资质', pathName: 'qualifications'},
{title: '集团业绩', pathName: 'performance'}, {title: '集团业绩', pathName: 'performance'},
{title: '集团招标', pathName: 'zhaobiao'},
], ],
defaultRoute: [], defaultRoute: [],
customer:[ customer:[
'members', 'members',
'qualifications', 'qualifications',
'performance', 'performance',
'zhaobiao',
], ],
uniqueOpened:false, uniqueOpened:false,
searchIndex: '' searchIndex: ''
......
...@@ -171,7 +171,7 @@ ...@@ -171,7 +171,7 @@
qyType:[], qyType:[],
cgblList:['100%','50%以上','20%以上','5%以上','1%-5%'], cgblList:['100%','50%以上','20%以上','5%以上','1%-5%'],
cgblName:'', cgblName:'',
paramsData:[], //储存组件筛选的条件 paramsData:{}, //储存组件筛选的条件
} }
}, },
watch:{ watch:{
...@@ -244,8 +244,8 @@ ...@@ -244,8 +244,8 @@
} }
}, },
handleQuery(params){ handleQuery(params){
this.paramsData=params; this.paramsData=params || {};
this.tableLoading=true this.tableLoading=true;
let data = this.getAreaList(params || this.queryParams) let data = this.getAreaList(params || this.queryParams)
memberList(data).then(res=>{ memberList(data).then(res=>{
this.isSkeleton = false this.isSkeleton = false
...@@ -363,8 +363,9 @@ ...@@ -363,8 +363,9 @@
this.queryParams.maxStockPercent='' this.queryParams.maxStockPercent=''
} }
if(this.paramsData){ if(this.paramsData){
this.paramsData.minStockPercent=this.queryParams.minStockPercent if(!this.paramsData.combineId){
this.paramsData.maxStockPercent=this.queryParams.maxStockPercent this.paramsData=this.queryParams
}
this.paramsData.pageNum =1 this.paramsData.pageNum =1
this.queryParams.pageNum =1 this.queryParams.pageNum =1
} }
...@@ -400,16 +401,26 @@ ...@@ -400,16 +401,26 @@
}, },
sortChange({ column, prop, order }){ sortChange({ column, prop, order }){
this.queryParams.orderName = prop this.queryParams.orderName = prop
this.paramsData.orderName = prop;
this.paramsData.combineId = this.customerId;
this.paramsData.pageNum = 1;
this.paramsData.pageSize = 20;
if(column.order === "ascending"){ if(column.order === "ascending"){
this.queryParams.orderType = 'asc' this.queryParams.orderType = 'asc'
this.paramsData.orderType = 'asc'
}else if(column.order === "descending"){ }else if(column.order === "descending"){
this.queryParams.orderType = 'desc' this.queryParams.orderType = 'desc'
this.paramsData.orderType = 'desc'
}else { }else {
this.queryParams.orderType='' this.queryParams.orderType=''
this.queryParams.orderName='' this.queryParams.orderName=''
this.paramsData.orderType=''
this.paramsData.orderName=''
} }
this.pageIndex = 1; this.queryParams.pageNum =1
this.handleQuery() this.paramsData.pageNum =1
this.handleQuery(this.paramsData)
}, },
//分页 //分页
handleCurrentChange(e){ handleCurrentChange(e){
......
...@@ -5,8 +5,9 @@ ...@@ -5,8 +5,9 @@
:form-data="formData" :form-data="formData"
:query-params="queryParams" :query-params="queryParams"
:total="tableDataTotal" :total="tableDataTotal"
:isExcel="false" :isExcel="true"
@handle-search="handleSearch" @handle-search="handleSearch"
@handle-excel="clickEXCEL"
> >
<template slot="slot"> <template slot="slot">
...@@ -57,7 +58,7 @@ ...@@ -57,7 +58,7 @@
import { getDictType } from '@/api/main' import { getDictType } from '@/api/main'
export default { export default {
name: 'qualifications', name: 'qualifications',
props: ['customerId'], props: ['customerId','combineName'],
mixins: [mixin], mixins: [mixin],
components:{}, components:{},
data(){ data(){
...@@ -74,17 +75,17 @@ ...@@ -74,17 +75,17 @@
forData: [ forData: [
{label: '中标时间', prop: 'bidTime',slot: true,minWidth: '80'}, {label: '中标时间', prop: 'bidTime',slot: true,minWidth: '80'},
{label: '中标成员', prop: 'companyName', slot: true,minWidth: '190'}, {label: '中标成员', prop: 'companyName', slot: true,minWidth: '190'},
{label: '持股比例', prop: 'stockPercent',slot: true,minWidth: '95'}, {label: '持股比例', prop: 'stockPercent',slot: true,minWidth: '80'},
{label: '项目名称', prop: 'projectName', slot: true,minWidth: '260'}, {label: '项目名称', prop: 'projectName', slot: true,minWidth: '260'},
{label: '中标金额', prop: 'bidAmount',slot: true,minWidth: '110'}, {label: '中标金额', prop: 'bidAmount',slot: true,minWidth: '110'},
{label: '中标地区', prop: 'address',minWidth: '80'}, {label: '中标地区', prop: 'address',minWidth: '130'},
{label: '业绩类型', prop: 'boundType',minWidth: '100'}, {label: '业绩类型', prop: 'boundType',minWidth: '80'},
{label: '项目类型', prop: 'projectType',minWidth: '100'}, {label: '项目类型', prop: 'projectType',minWidth: '80'},
{label: '业主单位', prop: 'projectUnit', slot: true,minWidth: '190'}, {label: '业主单位', prop: 'projectUnit', slot: true,minWidth: '190'},
], ],
formData: [ formData: [
{ type: 7, fieldName: 'province', value: '',props: {multiple: true,value: 'id',expandTrigger: 'hover'}, placeholder: '项目地区', options:[]}, { type: 7, fieldName: 'province', value: '',props: {multiple: true,value: 'id',expandTrigger: 'hover'}, placeholder: '项目地区', options:[]},
{ type: 5, fieldName: 'time', value: '', placeholder: '中标时间', startTime: 'startBidTime', endTime: 'endBidTime',timeList:[] }, { type: 5, fieldName: 'time', value: '', placeholder: '中标时间', startTime: 'startBidTime', endTime: 'endBidTime',timeList:[],dateTo:this.formatDate(new Date()) },
{ type: 6, fieldName: 'money', value: '', placeholder: '中标金额', startMoney: 'minAmount', endMoney: 'maxAmount',moneyList:[] }, { type: 6, fieldName: 'money', value: '', placeholder: '中标金额', startMoney: 'minAmount', endMoney: 'maxAmount',moneyList:[] },
{ type: 4, fieldName: 'boundTypes', value: '', placeholder: '业绩类型', options: [],width:150}, { type: 4, fieldName: 'boundTypes', value: '', placeholder: '业绩类型', options: [],width:150},
{ type: 4, fieldName: 'projectTypes', value: '', placeholder: '项目类型', options: [],width:150}, { type: 4, fieldName: 'projectTypes', value: '', placeholder: '项目类型', options: [],width:150},
...@@ -103,6 +104,7 @@ ...@@ -103,6 +104,7 @@
], ],
timeList: ['近三天', '近七天', '近半月', '自定义'], timeList: ['近三天', '近七天', '近半月', '自定义'],
moneyList: ['5000万以下', '5000万-1亿', '1亿-5亿', '5亿-10亿','10亿以上', '自定义'], moneyList: ['5000万以下', '5000万-1亿', '1亿-5亿', '5亿-10亿','10亿以上', '自定义'],
dataEXCEL:{}
} }
}, },
created() { created() {
...@@ -162,6 +164,7 @@ ...@@ -162,6 +164,7 @@
} }
delete data.cgbl delete data.cgbl
} }
this.dataEXCEL=JSON.parse(JSON.stringify(data));
businessList(data).then(res=>{ businessList(data).then(res=>{
this.tableData = res.code == 200 ? res.rows:[] this.tableData = res.code == 200 ? res.rows:[]
this.tableDataTotal = res.total this.tableDataTotal = res.total
...@@ -263,6 +266,16 @@ ...@@ -263,6 +266,16 @@
// this.$children[1].$refs.tableRef.bodyWrapper.scrollTop = 0 // this.$children[1].$refs.tableRef.bodyWrapper.scrollTop = 0
}, 500); }, 500);
}, },
clickEXCEL() {
this.dataEXCEL.combineName=this.combineName;
if(this.tableDataTotal > 2000){
this.dataEXCEL.pageSize=2000;
}else {
this.dataEXCEL.pageSize=this.tableDataTotal;
}
delete this.dataEXCEL.pageNum
this.$download.exportByPost('/combine/info/export/win/bid',this.dataEXCEL,'集团中标.xlsx');
},
} }
} }
</script> </script>
......
...@@ -8,6 +8,14 @@ ...@@ -8,6 +8,14 @@
:isExcel="false" :isExcel="false"
@handle-search="handleSearch" @handle-search="handleSearch"
/> />
<div>
<!--certificateList-->
<div class="item_ckquery">
<template v-for="(item,index) in certificateList">
<span :class="{'color_text':queryParams.qualificationType === item.qualificationType}" @click="changeType(item.qualificationType)">{{item.qualificationName}}{{item.companyCount}}</span>
</template>
</div>
</div>
<skeleton style="margin-left:16px;" v-if="isSkeleton"></skeleton> <skeleton style="margin-left:16px;" v-if="isSkeleton"></skeleton>
<tables <tables
v-if="!isSkeleton" v-if="!isSkeleton"
...@@ -39,7 +47,7 @@ ...@@ -39,7 +47,7 @@
import QualificationsDetail from './qualificationsDetail' import QualificationsDetail from './qualificationsDetail'
export default { export default {
name: 'qualifications', name: 'qualifications',
props: ['customerId','name'], props: ['customerId','combineName'],
mixins: [mixin], mixins: [mixin],
components:{ components:{
QualificationsDetail QualificationsDetail
...@@ -53,29 +61,30 @@ ...@@ -53,29 +61,30 @@
queryParams: { queryParams: {
combineId:this.customerId, combineId:this.customerId,
pageNum: 1, pageNum: 1,
pageSize: 20 pageSize: 20,
qualificationType:''
}, },
forData: [ forData: [
{label: '资质名称', prop: 'qualificationName'}, {label: '资质名称', prop: 'qualificationName'},
{label: '拥有该资质成员', prop: 'companyCount', slot: true}, {label: '拥有该资质成员', prop: 'companyCount', slot: true},
], ],
formData: [ formData: [
{ type: 1, fieldName: 'qualificationType', value: '', placeholder: '筛选', options:[],width:260}, // { type: 1, fieldName: 'qualificationType', value: '', placeholder: '筛选', options:[],width:260},
], ],
tableData:[], tableData:[],
tableDataTotal:0, tableDataTotal:0,
title:'', title:'',
rowData:'' rowData:'',
certificateList:[]
} }
}, },
created() { created() {
this.handleQuery()
this.getCertificateList() this.getCertificateList()
}, },
methods: { methods: {
handleQuery(params){ handleQuery(params){
this.isSkeleton = true this.isSkeleton = true
let data = params ? params : this.queryParams let data = params ? params : this.queryParams;
certificateList(data).then(res=>{ certificateList(data).then(res=>{
this.isSkeleton = false this.isSkeleton = false
if(res.code === 200){ if(res.code === 200){
...@@ -89,19 +98,29 @@ ...@@ -89,19 +98,29 @@
getCertificateList(){ getCertificateList(){
certificateCount({combineId: this.queryParams.combineId}).then(res=>{ certificateCount({combineId: this.queryParams.combineId}).then(res=>{
let data = res.data let data = res.data
this.certificateList=res.data;
this.queryParams.qualificationType=res.data[0].qualificationType;
this.handleQuery()
for(let i=0; i<data.length; i++){ for(let i=0; i<data.length; i++){
this.formData[0].options.push({ // this.formData[0].options.push({
name: data[i].qualificationName+ '(' + data[i].companyCount + ')', // name: data[i].qualificationName+ '(' + data[i].companyCount + ')',
value: data[i].qualificationType, // value: data[i].qualificationType,
}) // })
} }
}) })
}, },
handleClick(e, data) { handleClick(e, data) {
this.title=this.name+'-'+data.qualificationName+'(共'+ data.companyCount +'条)' this.title=this.combineName+'-'+data.qualificationName+'(共'+ data.companyCount +'条)'
this.rowData = data this.rowData = data
this.isDetails = true this.isDetails = true
}, },
changeType(value){
this.queryParams.qualificationType=value;
this.queryParams.pageNum=1;
this.queryParams.pageSize=20;
this.handleQuery()
},
} }
} }
</script> </script>
...@@ -117,6 +136,32 @@ ...@@ -117,6 +136,32 @@
margin-right: 24px; margin-right: 24px;
} }
} }
.item_ckquery{
position: relative;
margin-bottom: 10px;
span{
color: #232323;
padding: 3px 10px;
margin-bottom: 4px;
display: inline-block;
font-size: 14px;
cursor: pointer;
width: 20%;
}
span:hover{
background: #F3F4F5;
border-radius: 4px;
color:#0081FF;
}
.color_text{
background: #F3F4F5;
border-radius: 4px;
color: #0081FF;
}
.select-active{
color: #0081FF;
}
}
::v-deep .el-table{ ::v-deep .el-table{
.has-gutter{ .has-gutter{
tr{ tr{
......
...@@ -6,11 +6,17 @@ ...@@ -6,11 +6,17 @@
custom-class="client-drawer" custom-class="client-drawer"
:with-header="false" :with-header="false"
@closed="cancel"> @closed="cancel">
<skeleton style="margin-left:16px;" v-if="isSkeleton"></skeleton> <div class="head">
<div class="head" v-if="!isSkeleton">
<img class="tip-img" src="@/assets/images/icon.png" /> <img class="tip-img" src="@/assets/images/icon.png" />
<span>{{title}}</span> <span>{{title}}</span>
</div> </div>
<div style="height: 34px;margin: 12px">
<div class="cooperate-name" id="focus01">
<el-input clearable @clear="changeSelect" style="width: 300px;" @focus="clickFocus('focus01')" @blur="clickFocus('focus01')" v-model="queryParams.companyName" placeholder="成员名称查询"></el-input>
<span @click="changeSelect">搜索</span>
</div>
</div>
<skeleton style="margin-left:16px;" v-if="isSkeleton"></skeleton>
<tables <tables
v-if="!isSkeleton" v-if="!isSkeleton"
:tableLoading="tableLoading" :tableLoading="tableLoading"
...@@ -18,6 +24,7 @@ ...@@ -18,6 +24,7 @@
:forData="forData" :forData="forData"
:tableDataTotal="tableDataTotal" :tableDataTotal="tableDataTotal"
:queryParams="queryParams" :queryParams="queryParams"
:MaxPage=500
@handle-current-change="handleCurrentChange" @handle-current-change="handleCurrentChange"
style="margin: 12px;" style="margin: 12px;"
> >
...@@ -50,11 +57,9 @@ export default { ...@@ -50,11 +57,9 @@ export default {
queryParams: { queryParams: {
id: this.data.id, id: this.data.id,
pageNum: 1, pageNum: 1,
pageSize: 10 pageSize: 10,
companyName:''
}, },
formData: [
{ type: 3, fieldName: 'keys', value: '', placeholder: '输入项目/工程名称查询', options: []},
],
forData: [ forData: [
{label: '拥有该资质成员', prop: 'companyName', slot: true}, {label: '拥有该资质成员', prop: 'companyName', slot: true},
{label: '成员共有资质(个)', prop: 'certificateCount'}, {label: '成员共有资质(个)', prop: 'certificateCount'},
...@@ -73,7 +78,8 @@ export default { ...@@ -73,7 +78,8 @@ export default {
methods: { methods: {
async handleQuery(params) { async handleQuery(params) {
this.isSkeleton = true this.isSkeleton = true
let param = params?params:this.queryParams let param = params?params:this.queryParams;
console.log(param)
let res = await memberCertificateList(param) let res = await memberCertificateList(param)
this.isSkeleton = false this.isSkeleton = false
if(res.code==200){ if(res.code==200){
...@@ -94,7 +100,19 @@ export default { ...@@ -94,7 +100,19 @@ export default {
}, },
cancel() { cancel() {
this.$emit('cancel') this.$emit('cancel')
} },
changeSelect(){
this.queryParams.pageNum = 1
this.handleQuery()
},
clickFocus(e){
document.getElementById(e).classList.toggle('span-ba')
},
//分页
handleCurrentChange(e){
this.queryParams.pageNum = e
this.handleQuery()
},
} }
} }
</script> </script>
...@@ -114,5 +132,47 @@ export default { ...@@ -114,5 +132,47 @@ export default {
height: 17px; height: 17px;
margin: 0 8px -2px 12px; margin: 0 8px -2px 12px;
} }
.cooperate-name {
display: flex;
border-radius: 2px 0px 0px 2px;
border: 1px solid #D9D9D9;
line-height: 34px;
height: 34px;
width: 300px;
float: right;
span {
width: 80px;
height: 32px;
line-height: 32px;
font-size: 14px;
background: #F5F5F5;
text-align: center;
color: #0081FF;
border: 1px solid #EFEFEF;
border-left: 0;
cursor: pointer;
}
&.span-ba{
border: 1px solid #0081FF;
span{
color: #ffffff;
background: #0081FF;
border: 1px solid #0081FF;
}
}
::v-deep .el-input{
flex: 1;
}
::v-deep .el-input__inner {
border: 0;
line-height: 32px;
height: 32px;
position: absolute;
top: 0;
padding-right: 22px;
font-size: 12px;
padding-left: 8px;
}
}
} }
</style> </style>
...@@ -12,9 +12,10 @@ ...@@ -12,9 +12,10 @@
</div> </div>
<div class="group-right"> <div class="group-right">
<div id="groupBox" v-if="customerId"> <div id="groupBox" v-if="customerId">
<Members v-if="currentPath.pathName=='members'" :customer-id="customerId" :isSkeleton="isSkeleton" /> <Members v-if="currentPath.pathName=='members'" :customer-id="customerId" :isSkeleton="isSkeleton" :combineName="name"/>
<Qualifications v-if="currentPath.pathName=='qualifications'" :customer-id="customerId" :isSkeleton="isSkeleton" :name="name"/> <Qualifications v-if="currentPath.pathName=='qualifications'" :customer-id="customerId" :isSkeleton="isSkeleton" :combineName="name"/>
<Performance v-if="currentPath.pathName=='performance'" :customer-id="customerId" :isSkeleton="isSkeleton"/> <Performance v-if="currentPath.pathName=='performance'" :customer-id="customerId" :isSkeleton="isSkeleton" :combineName="name"/>
<Zhaobiao v-if="currentPath.pathName=='zhaobiao'" :customer-id="customerId" :isSkeleton="isSkeleton" :combineName="name"/>
</div> </div>
</div> </div>
</div> </div>
...@@ -27,12 +28,13 @@ ...@@ -27,12 +28,13 @@
import Members from "./component/members" import Members from "./component/members"
import Qualifications from "./component/qualifications" import Qualifications from "./component/qualifications"
import Performance from "./component/performance" import Performance from "./component/performance"
import Zhaobiao from "./component/zhaobiao"
import { infoHeader } from '@/api/detail/party-a/index' import { infoHeader } from '@/api/detail/party-a/index'
import elementResizeDetectorMaker from "element-resize-detector" import elementResizeDetectorMaker from "element-resize-detector"
export default { export default {
name: 'GroupAccount', name: 'GroupAccount',
components:{ components:{
SideBar,Members,Qualifications,Performance SideBar,Members,Qualifications,Performance,Zhaobiao
}, },
data(){ data(){
return{ return{
...@@ -77,6 +79,8 @@ ...@@ -77,6 +79,8 @@
} }
.group-left{ .group-left{
margin-right: 16px; margin-right: 16px;
padding-bottom: 16px;
background: #FFFFFF;
} }
.group-right{ .group-right{
min-width: 1088px; min-width: 1088px;
......
...@@ -272,7 +272,7 @@ export default { ...@@ -272,7 +272,7 @@ export default {
.options-block { .options-block {
position: absolute; position: absolute;
margin-top: 12px; margin-top: 5px;
min-width: 120px; min-width: 120px;
font-size: 14px; font-size: 14px;
color: #666666; color: #666666;
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
:min-width="item.minWidth" :min-width="item.minWidth"
:align="item.align?item.align:'left'" :align="item.align?item.align:'left'"
:fixed="item.fixed" :fixed="item.fixed"
:sortable="item.sortable ? 'custom' : false" :sortable="item.sortable ?item.sortable=='custom'? 'custom':true : false"
:resizable="false"> :resizable="false">
<template v-if="item.children&&item.children.length"> <template v-if="item.children&&item.children.length">
<el-table-column <el-table-column
...@@ -197,6 +197,12 @@ export default { ...@@ -197,6 +197,12 @@ export default {
} }
} }
} }
.table-item{
::v-deep .el-table td.el-table__cell{
border-bottom: 0;
}
}
::v-deep .el-table th.el-table__cell.is-leaf,::v-deep .el-table td.el-table__cell { ::v-deep .el-table th.el-table__cell.is-leaf,::v-deep .el-table td.el-table__cell {
border-bottom: 1px solid #E6EAF1; border-bottom: 1px solid #E6EAF1;
} }
...@@ -216,5 +222,4 @@ export default { ...@@ -216,5 +222,4 @@ export default {
::v-deep .el-table--enable-row-hover .el-table__body tr:hover > td { ::v-deep .el-table--enable-row-hover .el-table__body tr:hover > td {
background-color: #DCEBFF; background-color: #DCEBFF;
} }
</style> </style>
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
> >
<template slot="slot"> <template slot="slot">
<div class="flex-box query-add"> <div class="flex-box query-add">
<el-button type="primary" icon="el-icon-plus" @click="drawer = true">添加商务信息</el-button> <el-button type="primary" icon="el-icon-plus" @click="drawer = true">添加合作情况</el-button>
</div> </div>
</template> </template>
</head-form> </head-form>
......
...@@ -82,7 +82,6 @@ export default { ...@@ -82,7 +82,6 @@ export default {
}, },
methods: { methods: {
async handleQuery(params) { async handleQuery(params) {
this.isSkeleton = true;
this.tableLoading = true this.tableLoading = true
let param = params?params:this.queryParams let param = params?params:this.queryParams
let res = await oftenAgencyPage(param) let res = await oftenAgencyPage(param)
......
...@@ -71,7 +71,6 @@ export default { ...@@ -71,7 +71,6 @@ export default {
}, },
methods: { methods: {
async handleQuery(params) { async handleQuery(params) {
this.isSkeleton = true;
this.tableLoading = true this.tableLoading = true
let param = params?params:this.queryParams let param = params?params:this.queryParams
let res = await tenderPage(param) let res = await tenderPage(param)
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment