Commit a85e3b7e authored by danfuman's avatar danfuman

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

parents d49d0ca1 d96a96bf
......@@ -36,6 +36,7 @@
"url": "https://gitee.com/y_project/RuoYi-Vue.git"
},
"dependencies": {
"@cell-x/el-table-sticky": "^1.0.2",
"@riophae/vue-treeselect": "0.4.0",
"axios": "0.24.0",
"clipboard": "2.0.8",
......
import request from '@/utils/request'
import request from '@/utils/request';
//新增项目
export function addProject(param) {
return request({
url: '/business/info/add',
method: 'POST',
data: param
})
});
}
//商机列表
export function getProjectlist(param) {
......@@ -13,52 +13,52 @@ export function getProjectlist(param) {
url: '/business/info/list',
method: 'GET',
params: param
})
});
}
//删除项目
export function delProject(param) {
return request({
url: '/business/info/remove/'+param,
url: '/business/info/remove/' + param,
method: 'DELETE',
})
});
}
//建设内容
export function getJSNR(param) {
return request({
url: '/business/info/construction/'+param,
url: '/business/info/construction/' + param,
method: 'GET',
})
});
}
//项目速览
export function getXMSL(param) {
return request({
url: '/business/info/browse/'+param,
url: '/business/info/browse/' + param,
method: 'GET',
})
});
}
//项目内容修改
export function editXMNR(param) {
return request({
url: '/business/info/edit',
method: 'POST',
data:param
})
data: param
});
}
//项目标签新增
export function addLabel(param) {
return request({
url: '/business/label/add',
method: 'POST',
data:param
})
data: param
});
}
//项目标签删除
export function removeLabel(param) {
return request({
url: '/business/label/remove',
method: 'POST',
data:param
})
data: param
});
}
......@@ -68,8 +68,8 @@ export function getLXR(param) {
// url: '/business/contacts/list',
url: '/contact/info/list',
method: 'GET',
params:param
})
params: param
});
}
//修改项目联系人
export function editLXR(param) {
......@@ -77,8 +77,8 @@ export function editLXR(param) {
// url: '/business/contacts/edit',
url: '/contact/info',
method: 'PUT',
data:param
})
data: param
});
}
//新增项目联系人
......@@ -87,16 +87,16 @@ export function addLXR(param) {
// url: '/business/contacts/add',
url: '/contact/info',
method: 'POST',
data:param
})
data: param
});
}
//删除项目联系人
export function delLXR(param) {
return request({
url: '/contact/info/'+param,
url: '/contact/info/' + param,
method: 'DELETE',
})
});
}
//跟进记录
......@@ -104,8 +104,8 @@ export function getGJJL(param) {
return request({
url: '/business/record/list',
method: 'get',
params:param
})
params: param
});
}
//新增跟进记录
......@@ -113,15 +113,15 @@ export function addGJJL(param) {
return request({
url: '/business/record/add',
method: 'POST',
data:param
})
data: param
});
}
//删除跟进记录
export function delGJJL(param) {
return request({
url: '/business/record/remove/'+param,
url: '/business/record/remove/' + param,
method: 'DELETE',
})
});
}
......@@ -130,8 +130,8 @@ export function getGZDB(param) {
return request({
url: '/business/backlog/list',
method: 'GET',
params:param
})
params: param
});
}
//添加工作待办
......@@ -139,8 +139,8 @@ export function addGZDB(param) {
return request({
url: '/business/backlog/add',
method: 'post',
data:param
})
data: param
});
}
//修改工作待办
......@@ -148,16 +148,16 @@ export function editGZDB(param) {
return request({
url: '/business/backlog/edit',
method: 'post',
data:param
})
data: param
});
}
//查询相关企业
export function getXGQY(param) {
return request({
url: '/business/company/list',
method: 'GET',
params:param
})
params: param
});
}
//新增相关企业
......@@ -165,8 +165,8 @@ export function addXGQY(param) {
return request({
url: '/business/company/add',
method: 'POST',
data:param
})
data: param
});
}
//编辑相关企业
......@@ -174,24 +174,24 @@ export function saveXGQY(param) {
return request({
url: '/business/company/edit',
method: 'POST',
data:param
})
data: param
});
}
//删除相关企业
export function delXGQY(param) {
return request({
url: '/business/company/remove/'+param,
url: '/business/company/remove/' + param,
method: 'DELETE',
})
});
}
//查询资料文档
export function getZLWD(param) {
return request({
url: '/business/file/list',
method: 'GET',
params:param
})
params: param
});
}
//删除资料文档
......@@ -199,16 +199,16 @@ export function delZLWD(param) {
return request({
url: '/business/file/remove',
method: 'POST',
data:param
})
data: param
});
}
//查询关联项目
export function relateProject(param) {
return request({
url: '/business/record/relate/project/'+param,
url: '/business/record/relate/project/' + param,
method: 'get',
})
});
}
//查询跟进动态
......@@ -216,8 +216,8 @@ export function allRecord(param) {
return request({
url: '/business/record/all/list',
method: 'get',
params:param,
})
params: param,
});
}
//项目状态统计
......@@ -225,46 +225,92 @@ export function getStatistics(param) {
return request({
url: '/business/overview/status/statistics',
method: 'get',
params:param,
})
params: param,
});
}
//储备项目统计
export function getCount(param) {
return request({
url: '/business/overview/category/analyze/'+param,
url: '/business/overview/category/analyze/' + param,
method: 'get',
params:param,
})
params: param,
});
}
//储备项目资金
export function getAmount(param) {
return request({
url: '/business/overview/amount/analyze',
method: 'get',
params:param,
})
params: param,
});
}
//跟进动态
export function getAllRecord(param) {
return request({
url: '/business/record/all/list',
method: 'get',
params:param,
})
params: param,
});
}
//公招项目地区统计
export function countGroupByProvince(param) {
return request({
url: '/business/overview/countGroupByProvince',
method: 'post',
data:param
})
data: param
});
}
//公招项目投资金额统计
export function rangByMoney(param) {
return request({
url: '/business/overview/rangByMoney',
method: 'post',
data:param
})
data: param
});
}
/**
* 获取项目管理 商机列表 详情页开标记录列表
* @param {object} params
* @returns
*/
export const getBidOpeningRecordListApi = (params) => request({
method: "get",
url: "/business/open/tender/list",
params
});
/**
* 新增项目管理 商机列表 详情页开标记录
* @param {object} data
* @returns
*/
export const addBidOpeningRecordApi = (data) => request({
method: "post",
url: "/business/open/tender",
data
});
/**
* 修改项目管理 商机列表 详情页开标记录
* @param {object} data
* @returns
*/
export const modifyBidOpeningRecordApi = (data) => request({
method: "put",
url: "/business/open/tender",
data
});
/**
* 删除项目管理 商机列表 详情页开标记录
* @param {object} data
* @returns
*/
export const removeBidOpeningRecordApi = (params) => request({
method: "DELETE",
url: "/business/open/tender",
params
});
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="14" height="14" viewBox="0 0 14 14"><g transform="matrix(1,5.551115123125783e-17,-5.551115123125783e-17,1,0,0)"><g><path d="M1.166015625,7.0003221875C1.166015625,3.7786621875,3.777685625,1.1669921875,6.999345625,1.1669921875C10.221015625,1.1669921875,12.832715625,3.7786621875,12.832715625,7.0003221875C12.832715625,10.2219921875,10.221015625,12.8336921875,6.999345625,12.8336921875C3.777685625,12.8336921875,1.166015625,10.2219921875,1.166015625,7.0003221875C1.166015625,7.0003221875,1.166015625,7.0003221875,1.166015625,7.0003221875ZM4.732635625,5.5586421875C4.732635625,5.5586421875,6.176295625,7.0023121875,6.176295625,7.0023121875C6.176295625,7.0023121875,4.732635625,8.4460021875,4.732635625,8.4460021875C4.732635625,8.4460021875,5.557585625,9.2709521875,5.557585625,9.2709521875C5.557585625,9.2709521875,7.001245625,7.8272621875,7.001245625,7.8272621875C7.001245625,7.8272621875,8.444935625,9.2709521875,8.444935625,9.2709521875C8.444935625,9.2709521875,9.269885625,8.4460021875,9.269885625,8.4460021875C9.269885625,8.4460021875,7.826225625,7.0023121875,7.826225625,7.0023121875C7.826225625,7.0023121875,9.269885625,5.5586421875,9.269885625,5.5586421875C9.269885625,5.5586421875,8.444935625,4.7336621875,8.444935625,4.7336621875C8.444935625,4.7336621875,7.001245625,6.1773621875,7.001245625,6.1773621875C7.001245625,6.1773621875,5.557585625,4.7336621875,5.557585625,4.7336621875C5.557585625,4.7336621875,4.732635625,5.5586421875,4.732635625,5.5586421875C4.732635625,5.5586421875,4.732635625,5.5586421875,4.732635625,5.5586421875Z" fill-rule="evenodd" fill="#BFBFBF" fill-opacity="1"/></g></g></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="14" height="14" viewBox="0 0 14 14"><defs><clipPath id="master_svg0_1539_143431/829_061997"><rect x="0" y="0" width="14" height="14" rx="0"/></clipPath></defs><g clip-path="url(#master_svg0_1539_143431/829_061997)"><g><path d="M6.417314375,6.4163378125C6.417314375,6.4163378125,6.417314375,1.4580078125,6.417314375,1.4580078125C6.417314375,1.4580078125,7.583984375,1.4580078125,7.583984375,1.4580078125C7.583984375,1.4580078125,7.583984375,6.4163378125,7.583984375,6.4163378125C7.583984375,6.4163378125,12.542284375,6.4163378125,12.542284375,6.4163378125C12.542284375,6.4163378125,12.542284375,7.5830078125,12.542284375,7.5830078125C12.542284375,7.5830078125,7.583984375,7.5830078125,7.583984375,7.5830078125C7.583984375,7.5830078125,7.583984375,12.5413078125,7.583984375,12.5413078125C7.583984375,12.5413078125,6.417314375,12.5413078125,6.417314375,12.5413078125C6.417314375,12.5413078125,6.417314375,7.5830078125,6.417314375,7.5830078125C6.417314375,7.5830078125,1.458984375,7.5830078125,1.458984375,7.5830078125C1.458984375,7.5830078125,1.458984375,6.4163378125,1.458984375,6.4163378125C1.458984375,6.4163378125,6.417314375,6.4163378125,6.417314375,6.4163378125C6.417314375,6.4163378125,6.417314375,6.4163378125,6.417314375,6.4163378125Z" fill-rule="evenodd" fill="#FFFFFF" fill-opacity="1"/></g></g></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="14" height="14" viewBox="0 0 14 14"><defs><clipPath id="master_svg0_1539_143591"><rect x="0" y="0" width="14" height="14" rx="0"/></clipPath></defs><g clip-path="url(#master_svg0_1539_143591)"><g><path d="M7.00035,1.508544921875C7.00035,1.508544921875,10.05856,4.566754921875,10.05856,4.566754921875C10.05856,4.566754921875,9.233609999999999,5.391704921875,9.233609999999999,5.391704921875C9.233609999999999,5.391704921875,7.584,3.742104921875,7.584,3.742104921875C7.584,3.742104921875,7.584,9.666634921875,7.584,9.666634921875C7.584,9.666634921875,6.41734,9.666634921875,6.41734,9.666634921875C6.41734,9.666634921875,6.41734,3.741484921875,6.41734,3.741484921875C6.41734,3.741484921875,4.76709,5.391704921875,4.76709,5.391704921875C4.76709,5.391704921875,3.94214,4.566754921875,3.94214,4.566754921875C3.94214,4.566754921875,7.00035,1.508544921875,7.00035,1.508544921875C7.00035,1.508544921875,7.00035,1.508544921875,7.00035,1.508544921875ZM2.91667,11.375164921875C2.91667,11.375164921875,2.91667,10.208494921875,2.91667,10.208494921875C2.91667,10.208494921875,1.75,10.208494921875,1.75,10.208494921875C1.75,10.208494921875,1.75,12.541844921875,1.75,12.541844921875C1.75,12.541844921875,12.25,12.541844921875,12.25,12.541844921875C12.25,12.541844921875,12.25,10.208494921875,12.25,10.208494921875C12.25,10.208494921875,11.08333,10.208494921875,11.08333,10.208494921875C11.08333,10.208494921875,11.08333,11.375164921875,11.08333,11.375164921875C11.08333,11.375164921875,2.91667,11.375164921875,2.91667,11.375164921875C2.91667,11.375164921875,2.91667,11.375164921875,2.91667,11.375164921875Z" fill-rule="evenodd" fill="#232323" fill-opacity="1"/></g></g></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="14" height="14" viewBox="0 0 14 14"><g><g><path d="M9.91682609375,2.624921953125C9.91682609375,2.624921953125,9.91682609375,1.458251953125,9.91682609375,1.458251953125C9.91682609375,1.458251953125,4.08349609375,1.458253204825,4.08349609375,1.458253204825C4.08349609375,1.458253204825,4.08349609375,2.624921953125,4.08349609375,2.624921953125C4.08349609375,2.624921953125,1.45849609375,2.624921953125,1.45849609375,2.624921953125C1.45849609375,2.624921953125,1.45849609375,3.791581953125,1.45849609375,3.791581953125C1.45849609375,3.791581953125,2.47932609375,3.791581953125,2.47932609375,3.791581953125C2.47932609375,3.791581953125,2.47932609375,11.666551953125,2.47932609375,11.666551953125C2.47932609375,12.149851953125,2.87107609375,12.541551953125,3.35432609375,12.541551953125C3.35432609375,12.541551953125,10.64599609375,12.541551953125,10.64599609375,12.541551953125C11.12925609375,12.541551953125,11.52099609375,12.149851953125,11.52099609375,11.666551953125C11.52099609375,11.666551953125,11.52099609375,3.791591953125,11.52099609375,3.791591953125C11.52099609375,3.791591953125,12.54179609375,3.791591953125,12.54179609375,3.791591953125C12.54179609375,3.791591953125,12.54179609375,2.624921953125,12.54179609375,2.624921953125C12.54179609375,2.624921953125,9.91682609375,2.624921953125,9.91682609375,2.624921953125C9.91682609375,2.624921953125,9.91682609375,2.624921953125,9.91682609375,2.624921953125ZM3.64599609375,11.374921953125C3.64599609375,11.374921953125,3.64599609375,3.791581953125,3.64599609375,3.791581953125C3.64599609375,3.791581953125,10.35432609375,3.791591953125,10.35432609375,3.791591953125C10.35432609375,3.791591953125,10.35432609375,11.374921953125,10.35432609375,11.374921953125C10.35432609375,11.374921953125,3.64599609375,11.374921953125,3.64599609375,11.374921953125C3.64599609375,11.374921953125,3.64599609375,11.374921953125,3.64599609375,11.374921953125ZM5.25016609375,5.249921953125C5.25016609375,5.249921953125,5.25016609375,9.624921953125,5.25016609375,9.624921953125C5.25016609375,9.624921953125,6.41682609375,9.624921953125,6.41682609375,9.624921953125C6.41682609375,9.624921953125,6.41682609375,5.249921953125,6.41682609375,5.249921953125C6.41682609375,5.249921953125,5.25016609375,5.249921953125,5.25016609375,5.249921953125C5.25016609375,5.249921953125,5.25016609375,5.249921953125,5.25016609375,5.249921953125ZM7.58349609375,5.249921953125C7.58349609375,5.249921953125,7.58349609375,9.624921953125,7.58349609375,9.624921953125C7.58349609375,9.624921953125,8.75016609375,9.624921953125,8.75016609375,9.624921953125C8.75016609375,9.624921953125,8.75016609375,5.249921953125,8.75016609375,5.249921953125C8.75016609375,5.249921953125,7.58349609375,5.249921953125,7.58349609375,5.249921953125C7.58349609375,5.249921953125,7.58349609375,5.249921953125,7.58349609375,5.249921953125Z" fill-rule="evenodd" fill="#FF3C3C" fill-opacity="1"/></g></g></svg>
\ No newline at end of file
......@@ -227,15 +227,17 @@ li {
}
.app-main {
position: relative;
background-color: #f5f5f5;
>div{
width: calc(100% - 48px);
}
// >div{
// width: calc(100% - 48px);
// }
}
.app-container {
margin: 16px 24px;
padding: 16px 24px;
background-color: #f5f5f5;
box-sizing: border-box;
width: 100%;
.el-input__inner {
border-color: #d9d9d9;
color: #232323;
......
<template>
<div class="no-data">
<div class="no-data-box">
<img :src="noData" alt="抱歉,没找到相关数据" />
<div v-if="record">抱歉,您还未添加跟进动态</div>
<template v-else>
<div v-if="text">抱歉,您还未添加{{text}}项目</div>
<div v-else>抱歉,没找到相关数据</div>
</template>
<span v-if="condition">建议调整关键词或筛选条件,重新搜索</span>
</div>
</div>
</template>
<script>
export default {
name: "noData",
props: {
record: {
type: Boolean,
default: false
},
condition: {
type: Boolean,
default: false
},
text: {
type: String,
default: ''
}
},
data() {
return {
noData: require("@/assets/images/detail/noData.png")
};
},
methods: {
}
}
</script>
<style lang="scss" scoped>
.no-data {
font-size: 14px;
color: #999999;
width: 100%;
height: 100%;
min-height: 120px;
display: flex;
justify-content: center;
align-items: center;
background: #ffffff;
//border: 1px solid #eeeeee;
.no-data-box {
display: flex;
flex-direction: column;
align-items: center;
img {
width: 108px;
height: 109px;
margin-bottom: 22px;
}
div {
font-size: 16px;
line-height: 1;
color: #333333;
}
span {
margin-top: 4px;
}
}
}
</style>
<template>
<div class="Tables table-list-com-ins">
<div class="table-item">
<el-table v-if="tableDataTotal>0" class="fixed-table" :class="headerFixed ? 'headerFixed':''" v-loading="tableLoading" :data="tableData"
element-loading-text="Loading" ref="tableRef" border fit highlight-current-row v-sticky-header.always="stickyHeader"
:default-sort="defaultSort?defaultSort:{}" @sort-change="sortChange" @selection-change="selectionChange">
<el-table-column type="selection" :width="needSelection.width ? needSelection.width : '38px'" v-if="needSelection.flag"
:fixed="needSelection.fixed" :align="needSelection.align">
</el-table-column>
<el-table-column v-if="isIndex" label="序号" :width="flexWidth(tableData)" align="left" :fixed="indexFixed" :resizable="false">
<template slot-scope="scope">{{ queryParams.pageNum * queryParams.pageSize - queryParams.pageSize + scope.$index + 1 }}</template>
</el-table-column>
<template>
<el-table-column v-for="(item,index) in formColum" :key="index" :label="item.label" :prop="item.prop" :width="item.width"
:min-width="item.minWidth" :align="item.align?item.align:'left'" :fixed="item.fixed"
:sortable="item.sortable ?item.sortable=='custom'? 'custom':true : false" :resizable="false">
<template v-if="item.children&&item.children.length">
<el-table-column v-for="(cld, i) in item.children" :key="i" :prop="cld.prop" :label="cld.label" :width="cld.width" :resizable="false">
<template slot-scope="cldscope">
<template v-if="cld.slot">
<slot :name="cld.prop" :row="cldscope.row" :data="cld"></slot>
</template>
<template v-else>
<span>{{cldscope.row[cld.prop] || '--'}}</span>
</template>
</template>
</el-table-column>
</template>
<template v-else-if="item.slotHeader" slot="header">
<slot :name="item.slotName"></slot>
</template>
<template slot-scope="scope">
<slot v-if="item.slot" :name="item.prop" :row="scope.row" :index="scope.$index" :data="item"></slot>
<!-- 操作栏 -->
<slot v-else-if="item.prop == 'action-field-bar'" name="action-field-bar" :row="scope.row" :index="scope.$index" :data="item"></slot>
<span v-else>
{{ scope.row[item.prop] || '--' }}
</span>
</template>
</el-table-column>
</template>
<template slot="empty">
</template>
</el-table>
<div style="padding: 30px 0" v-else>
<no-data />
</div>
</div>
<div class="pagination-box" v-if="show_page && tableDataTotal>queryParams.pageSize">
<el-pagination background :current-page="current_page" :page-size="queryParams.pageSize" :total="tableDataTotal"
layout="prev, pager, next, jumper" @current-change="handleCurrentChange" @size-change="handleSizeChange" />
</div>
</div>
</template>
<script>
import NoData from '@/components/NoData';
export default {
name: "tableListCom",
props: {
isIndex: {
type: Boolean,
default: true
},
needSelection: {
type: Object,
default: () => ({
flag: false,
width: "39px",
fixed: false,
align: "left"
})
},
// 吸顶偏移量
stickyHeader: {
type: Object,
default: () => ({
offsetBottom: '10px',
offsetTop: "0px"
})
},
headerFixed: {
type: Boolean,
default: false
},
indexFixed: {
type: Boolean,
default: false
},
tableLoading: {
type: Boolean,
default: false
},
defaultSort: {
type: Object,
default: null
},
tableData: {
type: Array,
default: () => []
},
formColum: {
type: Array,
default: () => []
},
tableDataTotal: {
type: Number,
default: 0
},
queryParams: {
type: Object,
default: () => ({})
},
paging: {
type: Boolean,
default: true
},
MaxPage: { //最大页码
type: Number,
default: 500
},
},
components: {
NoData
},
data() {
return {
current_page: this.queryParams.pageNum,
show_page: this.paging
};
},
watch: {
'queryParams.pageNum'(newVal, oldVal) {
this.current_page = newVal;
}
},
created() {
},
methods: {
handleCurrentChange(e) {
if (this.MaxPage < e) {
this.show_page = false;
this.$nextTick(() => {
this.current_page = this.queryParams.pageNum;
this.$message.warning(`对不起,最多只能访问${this.MaxPage}页`);
this.show_page = true;
});
} else {
this.$emit('handle-current-change', e);
}
},
handleSizeChange(e) {
this.$emit('handle-current-change', e);
},
sortChange(e) {
this.$emit('sort-change', e);
},
selectionChange(selectionArray) {
this.$emit("selectionChange", selectionArray);
},
flexWidth(tableData) {
let currentMax = this.queryParams.pageNum * this.queryParams.pageSize - this.queryParams.pageSize + tableData.length, wdth = 59;
if (currentMax.toString().length > 3) {
wdth = wdth + (currentMax.toString().length - 3) * 10;
}
return wdth + 'px';
}
}
}
</script>
<style lang="scss" scoped>
.Tables {
::v-deep .el-table__body tr.current-row > td.el-table__cell {
background-color: #ffffff;
}
/*::v-deep .el-table__fixed{
height: calc(100% - 16px) !important;
}*/
::v-deep .el-table__row {
&:nth-child(even) {
background-color: #f9fcff;
.more {
background: #f8fbff;
span {
color: #0081ff;
}
}
}
&:nth-child(odd) {
.more {
span {
color: #0081ff;
}
}
}
}
.table-item {
::v-deep .el-table td.el-table__cell {
border-bottom: 0;
}
}
::v-deep .el-table th.el-table__cell.is-leaf,
::v-deep .el-table td.el-table__cell {
border-bottom: 1px solid #e6eaf1;
}
::v-deep .el-table--border .el-table__cell {
border-right: 1px solid #e6eaf1;
}
::v-deep .el-table__body tr.hover-row.current-row > td,
::v-deep .el-table__body tr.hover-row.el-table__row--striped.current-row > td,
::v-deep .el-table__body tr.hover-row.el-table__row--striped > td,
::v-deep .el-table__body tr.hover-row > td {
background-color: #dcebff !important;
.more {
background: #dcebff;
}
}
::v-deep .el-table--enable-row-hover .el-table__body tr:hover > td {
background-color: #dcebff;
}
::v-deep .el-table__header-wrapper {
position: sticky;
top: 0;
z-index: 99;
}
::v-deep .el-table__fixed {
overflow-x: clip;
overflow-y: clip;
}
}
.table-list-com-ins {
::v-deep .el-table {
.el-table__fixed-header-wrapper {
top: 0px;
}
}
}
</style>
......@@ -15,6 +15,7 @@ import directive from './directive'; // directive
import plugins from './plugins'; // plugins
import { download } from '@/utils/request';
import horizontalScroll from 'el-table-horizontal-scroll';
import elTableSticky from '@cell-x/el-table-sticky';
import './assets/icons'; // icon
import './permission'; // permission control
......@@ -61,6 +62,7 @@ Vue.component('ImageUpload', ImageUpload);
Vue.component('ImagePreview', ImagePreview);
Vue.use(horizontalScroll);
Vue.use(elTableSticky);
Vue.use(directive);
Vue.use(plugins);
Vue.use(VueMeta);
......
......@@ -21,18 +21,26 @@
<!-- 输入框 -->
<template v-if="form.type==3">
<!-- 未点击前的输入框样式 -->
<div class="normal-search-container" @click="showSearchBox = true" v-if="!showSearchBox">
<div class="normal-search-container" :class="{'is-hover-search' : form.hover}" @mouseover="searchHover($event,form)"
@mouseleave="searchUnHover($event,form)">
<img src="@/assets/images/enterprise/enterprise-search-icon.svg" alt="">
<span>搜索</span>
</div>
<!-- 输入框展开后样式 -->
<transition @enter="onEnter" appear mode="out-in">
<div class="cooperate-name enterprise-search-container" :id="'focus'+i" v-if="showSearchBox">
<span v-show="!form.hover && !form.value">搜索</span>
<el-input v-model="form.value" :placeholder="form.placeholder ? form.placeholder : '输入关键词查询'"
:style="form.width?'width:'+form.width+'px':'width:180px'" @focus="searchFocus($event,form)" @blur="searchBlur($event,form)"
@input="value => searchInput(value,form)" v-show="form.hover || form.value">
<template slot="suffix">
<transition mode="out-in" appear name="fade">
<img src="@/assets/images/enterprise/search-input-clear-icon.svg" alt="" @click.stop="form.value = '';changeSelect()"
v-show="form.showClearIcon">
</transition>
</template>
</el-input>
<!-- <div class="cooperate-name enterprise-search-container" :id="'focus'+i">
<el-input clearable @clear="changeSelect" @focus="clickFocus('focus'+i)" @blur="clickFocus('focus'+i)" v-model="form.value"
:placeholder="form.placeholder" :style="form.width?'width:'+form.width+'px':'width:180px'"></el-input>
<span @click="changeSelect">搜索</span>
</div>
</transition>
</div> -->
</div>
</template>
<!-- 多选 -->
<template v-if="form.type==4">
......@@ -135,6 +143,28 @@ export default {
CustomMoneySelect
},
methods: {
searchFocus(event, formData) {
const { target } = event;
if (target?.value?.length) {
this.$set(formData, "showClearIcon", true);
}
},
searchBlur(event, formData) {
this.$set(formData, "showClearIcon", false);
},
searchInput(value, formData) {
if (value?.length) {
this.$set(formData, "showClearIcon", true);
}
},
searchHover(event, formData) {
this.$set(formData, "hover", true);
},
searchUnHover(event, formData) {
if (!formData.value) {
this.$set(formData, "hover", false);
}
},
async getPlaceholder() {
try {
await this.$nextTick();
......@@ -284,7 +314,7 @@ export default {
::v-deep .el-popper[x-placement^="bottom"] {
margin-top: 5px;
}
.headerFixed{
.headerFixed {
position: sticky;
top: 0;
z-index: 10;
......@@ -401,10 +431,19 @@ export default {
}
}
.normal-search-container {
::v-deep .normal-search-container {
display: flex;
align-items: center;
cursor: pointer;
&.is-hover-search {
width: 238px;
background: #f4f6f9;
border-radius: 4px 4px 4px 4px;
& > img {
cursor: unset;
}
}
&:hover {
& > span {
......@@ -416,6 +455,7 @@ export default {
width: 16px;
height: 16px;
margin-left: 12px;
cursor: pointer;
}
& > span {
......@@ -424,6 +464,42 @@ export default {
margin-left: 8px;
line-height: 22px;
font-size: 14px;
cursor: pointer;
}
.el-input {
& > .el-input__inner {
border: none;
height: 32px;
line-height: 32px;
caret-color: #0081ff;
color: rgba(35, 35, 35, 0.8);
font-size: 14px;
background: #f4f6f9;
padding-right: 26px;
padding-left: 8px;
&::placeholder {
color: rgba(35, 35, 35, 0.4) !important;
font-size: 14px !important;
line-height: 32px;
}
}
.el-input__suffix {
right: 12px;
display: flex;
align-items: center;
.el-input__suffix-inner {
height: 14px;
width: 14px;
}
img {
cursor: pointer;
vertical-align: unset;
}
}
}
}
}
......
......@@ -112,9 +112,10 @@
<skeleton style="margin-left:16px;" v-if="isSkeleton"></skeleton>
<div class="table-item-jf table-item" v-if="!isSkeleton&&tableData.length>0">
<el-table :data="tableData" :header-cell-style="{ background:'#f0f3fa',color: 'rgba(35,35,35,0.8)'}" v-horizontal-scroll="'hover'"
class="table-item1 fixed-table" border highlight-current-row :header-row-class-name="setHeaderRow" :cell-class-name="setCellClass"
:row-class-name="setRowClass" :header-cell-class-name="setCellClass" @sort-change="sortChange" ref="theOwnerListTable">
<el-table :data="tableData" :header-cell-style="{ background:'#f0f3fa',color: 'rgba(35,35,35,0.8)'}"
v-sticky-header.always="{offsetTop : '56px',offsetBottom : '10px'}" class="table-item1 fixed-table" border highlight-current-row
:header-row-class-name="setHeaderRow" :cell-class-name="setCellClass" :row-class-name="setRowClass" :header-cell-class-name="setCellClass"
@sort-change="sortChange" ref="theOwnerListTable">
<el-table-column type="index" label="序号" :fixed="tableColumnFixed" width="60" :resizable="false">
<template slot-scope="scope">
......@@ -180,7 +181,8 @@
<el-table-column label="历史发包总金额" min-width="120" :resizable="false" :sortable="'custom'" prop="inviteTenderSumAmount">
<template slot-scope="scope">
<div style="text-align:right;white-space: nowrap;">{{parseFloat(scope.row.inviteTenderSumAmount) ? `${scope.row.inviteTenderSumAmount}万元`:"--"}}
<div style="text-align:right;white-space: nowrap;">
{{parseFloat(scope.row.inviteTenderSumAmount) ? `${scope.row.inviteTenderSumAmount}万元`:"--"}}
</div>
</template>
</el-table-column>
......
<template>
<el-dialog :visible="dialogShow" width="464px" custom-class="add-bid-opening-record" :show-close="false">
<div class="add-bid-opening-record-inner">
<slot name="dialog-main">
<!-- 弹窗header -->
<slot name="dialog-header">
<div class="add-header">
<div class="header-left-container">
<slot name="dialog-header-icon">
<img src="@/assets/images/economies/icon.png" alt="" class="header-icon">
</slot>
<slot name="dialog-header-title">
<span class="header-title">{{title}}</span>
</slot>
</div>
<div class="header-right-container">
<slot name="dialog-header-close-icon">
<i class="el-icon-close dialog-header-close-icon" @click="dialogClose('contentFormIns')"></i>
</slot>
</div>
</div>
</slot>
<!-- 弹窗表单 -->
<slot name="dialog-content">
<div class="add-content-form">
<el-form :model="formData" :rules="formRules" label-width="auto" class="content-form-ins" ref="contentFormIns">
<el-form-item label="投标人 :" prop="tenderer">
<el-input v-model="formData.tenderer" placeholder="请输入投标人"></el-input>
</el-form-item>
<el-form-item label="企业性质 :" prop="tendererNature">
<el-input v-model="formData.tendererNature" placeholder="请输入企业性质"></el-input>
</el-form-item>
<el-form-item label="项目经理 :" prop="businessManager">
<el-input v-model="formData.businessManager" placeholder="请输入项目经理"></el-input>
</el-form-item>
<el-form-item label="联系方式 :" prop="contact">
<el-input v-model="formData.contact" placeholder="请输入联系方式"></el-input>
</el-form-item>
<el-form-item label="投标金额 :" class="has-unit" prop="tenderAmount">
<el-input v-model="formData.tenderAmount" placeholder="请输入投标金额" @input="(value) => tenderAmountInput(value,formData)"></el-input>
<span class="content-form-item-unit">万元</span>
</el-form-item>
</el-form>
</div>
</slot>
<!-- 底部按钮 -->
<slot name="dialog-footer">
<div class="add-footer">
<div class="add-footer-btn cancel-btn" @click="dialogClose('contentFormIns')">{{cancelText}}</div>
<div class="add-footer-btn ok-btn" @click="ok('contentFormIns')">{{okText}}</div>
</div>
</slot>
</slot>
</div>
</el-dialog>
</template>
<script>
export default {
name: "addBidOpeningRecord",
props: {
show: {
type: Boolean,
default: false
},
title: {
type: String,
default: ""
},
formData: {
type: Object,
default: () => ({})
},
formRules: {
type: Object,
default: () => ({})
},
okText: {
type: String,
default: "确定"
},
cancelText: {
type: String,
default: "取消"
}
},
watch: {
"show": {
handler(newValue, oldValue) {
this.dialogShow = newValue;
}
}
},
data() {
return {
dialogShow: this.show
};
},
//可访问data属性
created() {
},
//计算集
computed: {
},
//方法集
methods: {
dialogClose(refStr) {
Object.assign(this.$data, this.$options.data.call(this));
this.$refs[refStr].clearValidate();
this.$emit("dialogClose");
},
ok(refStr) {
this.$refs[refStr].validate(flag => {
console.log(flag);
if (flag) {
this.$emit("validatorSuccess");
}
});
},
tenderAmountInput(value, data) {
data.tenderAmount = value.replace(/[^\d.]/g, "")
.replace(/\.{2,}/g, ".")
.replace(".", "$#$")
.replace(/\./g, "")
.replace("$#$", ".")
.replace(/^(\-)*(\d+)\.(\d+).*$/, '$1$2.$3')
.replace(/^\./g, "").replace(/^0+(\d)/, '');
}
},
}
</script>
<style lang="scss" scoped>
::v-deep .add-bid-opening-record {
.el-dialog__body,
.el-dialog__header {
padding: 0px;
}
.add-bid-opening-record-inner {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
.add-header {
width: 100%;
height: 48px;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0px 16px;
box-sizing: border-box;
border-bottom: 1px solid #e1e1e1;
.header-left-container {
display: flex;
align-items: center;
& > .header-icon {
width: 17px;
height: 17px;
}
& > .header-title {
margin-left: 8px;
color: #232323;
font-size: 16px;
font-weight: bold;
}
}
.header-right-container {
.dialog-header-close-icon {
font-size: 16px;
color: #999999;
cursor: pointer;
&:hover {
color: #0081ff;
}
}
}
}
.add-content-form {
padding: 24px;
box-sizing: border-box;
.content-form-ins {
.el-form-item {
margin-bottom: 16px;
display: flex;
align-items: center;
.el-form-item__label {
padding: 0px;
line-height: 32px;
font-size: 14px;
font-weight: 400;
color: rgba(35, 35, 35, 0.8);
white-space: nowrap;
}
.el-form-item__content {
width: 100%;
margin-left: 0px !important;
line-height: 32px;
.el-input {
.el-input__inner {
height: 32px;
line-height: 32px;
padding: 0px 8px;
box-sizing: border-box;
&:focus {
border-color: #0081ff;
}
&::placeholder {
color: rgba(35, 35, 35, 0.4) !important;
font-size: 14px;
}
}
}
.el-form-item__error {
padding-top: 2px;
}
}
&.has-unit {
.el-form-item__content {
display: flex;
align-items: center;
.content-form-item-unit {
white-space: nowrap;
margin-left: 8px;
}
}
}
}
}
}
.add-footer {
display: flex;
justify-content: flex-end;
align-items: center;
padding: 24px;
padding-top: 0px;
box-sizing: border-box;
.add-footer-btn {
min-width: 80px;
padding: 0px 13px;
height: 32px;
line-height: 32px;
text-align: center;
border-radius: 2px;
color: rgba(35, 35, 35, 0.8);
font-size: 14px;
font-weight: 400;
cursor: pointer;
box-sizing: border-box;
&.cancel-btn {
background: #fff;
border: 1px solid #d9d9d9;
}
&.ok-btn {
background: #0081ff;
color: #fff;
margin-left: 8px;
}
}
}
}
}
</style>
<template>
<div class="uploadwin batch-import-reset">
<div class="upload" v-if="addfile==false">
<div class="up_title">批量导入{{titletext}}</div>
<div class="up_box">
<el-upload :class="{'none':isUpload == true}" class="upload-demo" :action="action" :multiple="false" accept=".xls,.xlsx" drag ref="upload"
:auto-upload="false" :file-list="fileList" :on-change="handleFileListChange" :headers="headers" :on-success="onSuccess">
<img class="up_img" src="@/assets/images/project/upload.png">
<div class="up_text">点击选择或将文件(xls,xlsx)拖拽至此上传项目表格</div>
<div class="up_tip">导入的文件内容必须依照下载模板的要求填写</div>
<div class="up_tip">上传文件最大为2M,仅支持Excel表格文件(xls,xlsx)</div>
<div class="up_tip">导入已存在的{{titletext}}将自动跳过</div>
</el-upload>
<div class="up_success" v-if="isUpload == true">
<img src="@/assets/images/project/success.png">上传成功
</div>
<div class="btn_download" v-if="isUpload == false" @click="downloadClick">
<div class="img"></div>点击下载
</div>
</div>
<div class="btns">
<div class="btn btn_primary btn_disabled h34" v-if="isUpload==false">确定导入</div>
<div class="btn btn_primary h34" @click="importConfirmClick" v-else>确定导入</div>
<div class="btn btn_default h34" @click="importCancel">取消</div>
</div>
</div>
<div class="success" v-if="addfile==true">
<div v-if="addsuccess==false">
<img class="img" src="@/assets/images/project/clock.png">
<div class="p1">查询数据中...</div>
<div class="p2">请耐心等待,过程大概30秒</div>
</div>
<div v-if="addsuccess == true">
<div class="p3">
<img src="@/assets/images/project/success.png">查询成功
</div>
<!--<div class="p2">导入成功,已为您去掉重复{{titletext}}{{successCount}}</div>-->
<div class="p2">{{messages}}</div>
<div class="btns">
<div class="btn btn_primary h32" @click="getmsg">查看</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { getToken } from "@/utils/auth";
import "@/assets/styles/project.scss";
export default {
name: 'batchImportReset',
props: {
importtype: ''
},
data() {
return {
isUpload: false,//有上传的文件
addfile: false,//已上传文件
addsuccess: false,//已成功加入数据
//批量导入
action: "",
fileList: [],
headers: {
Authorization: "Bearer " + getToken(),
},
downloadhref: '',//样例地址
titletext: '',
successCount: 0,//成功条数
messages: '',
};
},
created() {
this.downloadhref = '/file/bidOpeningRecordTemplate.xlsx';
this.titletext = '开标记录';
this.action = process.env.VUE_APP_BASE_API + `/business/open/tender/importData/${this.$route.query.id}`;
},
methods: {
getmsg() {
this.importCancel();
this.$emit('getdatas');
},
handleFileListChange(file, fileList) {
var testmsg = file.name.substring(file.name.lastIndexOf(".") + 1);
const extension = testmsg === "xlsx";
const extension1 = testmsg === "xls";
if (!extension && !extension1) {
this.$message({
message: "上传文件只能是.xls,.xlsx格式!",
type: "warning",
});
return false;
}
const isLt2M = file.size / 1024 / 1024 < 2;
if (!isLt2M) {
this.$refs.upload.clearFiles();
this.$message({
message: '上传文件大小不能超过 2MB!',
type: 'warning'
});
return false;
}
if (fileList.length > 0) {
this.fileList = [fileList[fileList.length - 1]];
this.isUpload = true;
}
},
onSuccess(res, file, fileList) {
if (res.code == 200) {
this.successCount = res.successCount;
let str = '成功导入条数' + res.successCount + ',失败条数' + res.errorCount;
this.messages = str;
this.addsuccess = true;
} else {
this.importCancel();
this.$message.error({ message: res.msg, showClose: true });
}
},
downloadClick() {
let a = document.createElement("a");
a.setAttribute("href", this.downloadhref);
a.setAttribute("download", "批量导入模版.xlsx");
document.body.appendChild(a);
a.click();
a.remove();
},
// 批量导入
importConfirmClick() {
if (this.fileList.length > 0) {
this.$refs["upload"].submit();
this.addfile = true;
} else {
this.$message("请先选择文件");
}
},
importCancel() {
this.addfile = false;
this.isUpload = false;
this.addsuccess = false;
this.$emit('cancels');
},
}
}
</script>
<style scoped>
</style>
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