lsun - 项目修改

This commit is contained in:
lSun 2024-11-22 18:32:38 +08:00
parent c29fac9ad8
commit 3b68617a13
3 changed files with 979 additions and 0 deletions

View File

@ -0,0 +1,122 @@
<template>
<el-dialog title="快捷菜单设置" :visible.sync="dialogVisible" width="60%">
<p>已选菜单按住鼠标左键可以对菜单进行排序最多可以设置10个快捷菜单</p>
<el-row>
<el-col :span="24">
<draggable v-model="selectedItems" @end="onDragEnd" class="drag-area">
<el-tag
v-for="(item, index) in selectedItems"
:key="index"
closable
@close="removeItem(index)"
class="tag-item"
>{{ item.name }}</el-tag>
</draggable>
</el-col>
</el-row>
<el-row style="margin-top: 20px;">
<el-col :span="24">
<el-checkbox-group v-model="selectedItemIds">
<el-checkbox
v-for="menuItem in menuItems"
:key="menuItem.id"
:label="menuItem.id"
:disabled="selectedItems.length >= 10 && !selectedItemIds.includes(menuItem.id)"
>{{ menuItem.name }}</el-checkbox>
</el-checkbox-group>
</el-col>
</el-row>
<span slot="footer" class="dialog-footer">
<el-button @click="restoreDefaults" style="margin-right: auto;"> 默认</el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="confirmSelection"> </el-button>
</span>
</el-dialog>
</template>
<script>
import { Dialog, Tag, Row, Col, CheckboxGroup, Checkbox } from 'element-ui';
import draggable from 'vuedraggable';
export default {
components: {
ElDialog: Dialog,
ElTag: Tag,
ElRow: Row,
ElCol: Col,
ElCheckboxGroup: CheckboxGroup,
ElCheckbox: Checkbox,
draggable
},
data() {
return {
dialogVisible: true,
selectedItems: [
{ id: 1, name: '物资首页' },
{ id: 2, name: '客户列表' }
],
defaultSelectedItems: [
{ id: 1, name: '物资首页' },
{ id: 2, name: '客户列表' }
],
menuItems: [
{ id: 1, name: '物资首页' },
{ id: 2, name: '客户列表' },
{ id: 3, name: '客户工具' },
{ id: 4, name: '跟进管理' },
{ id: 5, name: '销售线索' },
// ...
],
selectedItemIds: [1, 2] // ID
};
},
computed: {
availableMenuItems() {
return this.menuItems.filter(item => !this.selectedItems.some(selected => selected.name === item.name));
}
},
methods: {
removeItem(index) {
this.selectedItems.splice(index, 1);
this.selectedItemIds = this.selectedItems.map(item => item.id);
},
onDragEnd(event) {
//
},
confirmSelection() {
//
const selectedMenuItems = this.selectedItems.map(item => ({ id: item.id, name: item.name }));
console.log('Selected Menu Items:', selectedMenuItems);
// selectedMenuItems Vuex
this.dialogVisible = false;
},
restoreDefaults() {
// ID
this.selectedItemIds = this.defaultSelectedItems.map(item => item.id);
//
this.selectedItems = this.defaultSelectedItems.map(item => ({ ...item }));
}
},
watch: {
selectedItemIds: {
handler(newIds) {
this.selectedItems = this.menuItems.filter(item => newIds.includes(item.id));
},
deep: true
}
}
};
</script>
<style scoped>
.drag-area {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-top: 10px;
}
.tag-item {
cursor: move; /* 显示移动光标 */
}
</style>

View File

@ -0,0 +1,299 @@
<template>
<div class="app-container">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
v-show="showSearch"
label-width="68px"
>
<el-form-item prop="keyWord">
<el-input
v-model="queryParams.keyWord"
placeholder="请输入关键词"
clearable
@keyup.enter.native="handleQuery"
maxlength="20"
/>
</el-form-item>
<el-form-item>
<el-button
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>搜索</el-button
>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
>重置</el-button
>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
>导出
</el-button>
</el-col>
<right-toolbar
:showSearch.sync="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row>
<el-table
v-loading="loading"
:data="houseList"
ref="multipleTable"
row-key="teamId"
>
<el-table-column label="序号" align="center" width="80" type="index">
<template slot-scope="scope">
<span>{{
(queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1
}}</span>
</template>
</el-table-column>
<el-table-column
label="项目名称"
align="center"
prop="houseName"
sortable
/>
<el-table-column
label="项目地址"
align="center"
prop="physicalName"
sortable
/>
<el-table-column
label="计划开工日期"
align="center"
prop="geoLocation"
sortable
/>
<el-table-column label="计划竣工日期" align="center" prop="deptName" sortable>
</el-table-column>
<el-table-column label="业主单位" align="center" prop="remark" sortable>
</el-table-column>
<el-table-column label="项目状态" align="center" prop="remark" sortable>
</el-table-column>
<el-table-column label="标段工程数量" align="center" prop="remark" sortable>
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleViewDetails(scope.row)"
v-hasPermi="['machinery:type:edit']"
>
</el-button>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="180">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleView(scope.row)"
v-hasPermi="['machinery:type:edit']"
>
详情
</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 标段工程 -->
<el-dialog
:title="title"
:visible.sync="showHouse"
width="70%"
append-to-body
>
<el-table border max-height="1000px" :data="viewCodeList">
<el-table-column label="序号" align="center" type="index" />
<el-table-column align="center" label="标段名称" prop="maTypeName" />
<el-table-column align="center" label="工程类别" prop="typeName" />
<el-table-column align="center" label="电压等级" prop="maCode" />
<el-table-column align="center" label="计划开工时间" prop="createBy" />
<el-table-column align="center" label="计划竣工时间" prop="createTime" />
<el-table-column align="center" label="工程状态" prop="outFacCode" />
<el-table-column align="center" label="分公司" prop="outFacCode" />
<el-table-column label="操作" align="center" width="300">
<template slot-scope="{ row }">
<el-button
size="mini"
type="primary"
icon="el-icon-zoom-in"
@click="handleView(row)"
>
详情
</el-button>
</template>
</el-table-column>
</el-table>
</el-dialog>
</div>
</template>
<script>
import {
getListHouse,
getHouseDetail,
editHouse,
addHouse,
delHouse,
} from "@/api/ma/whHouse";
import { downloadFile } from "@/utils/download";
import { deptTreeSelect } from "@/api/system/user";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
name: "ProManagement",
data() {
return {
//
loading: false,
loadingTwo: false,
//
showSearch: true,
showHouse: false,
//
total: 0,
totalTwo: 0,
//
houseList: [],
viewCodeList: [],
maxLength: 100, //
//
title: "",
//
queryParams: {
pageNum: 1,
pageSize: 10,
keyWord: undefined,
},
//
form: {},
};
},
created() {
this.getList();
},
methods: {
/** 查询岗位列表 */
getList() {
this.loading = true;
getListHouse(this.queryParams).then((response) => {
this.houseList = response.rows;
this.total = response.total;
this.loading = false;
});
},
handleViewDetails (row) {
// this.viewCodeList = row;
this.showHouse = true;
this.title = "标段工程";
// this.loadingTwo = false;
/*getMaCodeInfo({ taskId: row.taskId, typeId: row.typeId }).then(
(response) => {
this.viewCodeList = response.rows;
this.titleBind = "查看";
this.loadingTwo = false;
}
);*/
},
handleView(row) {
this.showHouse = true;
this.title = "修改";
// this.reset();
// const houseId = row.houseId;
// getHouseDetail(houseId).then((response) => {
// this.viewCodeList = response.data;
//
// this.showHouse = true;
// this.title = "";
// });
},
//
reset() {
this.form = {};
this.resetForm("form");
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.queryParams.keyWord = null;
this.handleQuery();
},
//
cancel() {
this.showHouse = false;
this.reset();
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 导出按钮操作 */
handleExport() {
this.download(
'system/role/export',
{
...this.queryParams,
},
`role_${new Date().getTime()}.xlsx`,
)
},
},
};
</script>
<style lang="scss" scoped>
.uploadImg {
padding-top: 20px;
display: flex;
align-items: center;
justify-content: center;
}
.deviceCode {
margin-top: 10px;
padding-bottom: 20px;
font-size: 18px;
}
::v-deep.el-table .fixed-width .el-button--mini {
width: 60px !important;
margin-bottom: 10px;
}
//css
::v-deep.disabled {
.el-upload--picture-card {
display: none;
}
}
</style>

View File

@ -0,0 +1,558 @@
<template>
<div class="app-container">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
v-show="showSearch"
label-width="68px"
>
<el-form-item prop="keyWord">
<el-input
v-model="queryParams.keyWord"
placeholder="请输入关键词"
clearable
@keyup.enter.native="handleQuery"
maxlength="20"
/>
</el-form-item>
<el-form-item>
<el-button
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>搜索
</el-button
>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
>重置
</el-button
>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
>导出
</el-button>
</el-col>
<el-col :span="1.5">
<el-button @click="drawer = true" icon="el-icon-s-open" type="primary" style="margin-left: 16px;" size="mini">
高级筛选
</el-button>
</el-col>
<right-toolbar
:showSearch.sync="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row>
<el-drawer
title="高级筛选"
:visible.sync="drawer"
:with-header="false">
<div>
<div class="filter-container">
<div class="filter-header">
<div class="header-left">
<i class="el-icon-search"></i>
<span>高级筛选</span>
</div>
<el-button
type="text"
class="close-button"
@click="drawer = false"
>
<i class="el-icon-close"></i>
<span>收起</span>
</el-button>
</div>
<div v-for="(section, sectionIndex) in filterSections" :key="sectionIndex" class="filter-section">
<div class="filter-label">{{ section.title }}</div>
<div class="button-container">
<el-button
v-for="(option, index) in section.options"
:key="option.value"
:class="{ 'is-active': isSelected(section.title, option.value) }"
round
size="small"
@click="handleSelect(section.title, option.value)"
>
{{ option.label }}
</el-button>
</div>
</div>
<div class="filter-footer">
<el-button type="primary" @click="handleQuerys">查询</el-button>
<el-button @click="handleReset">重置</el-button>
</div>
</div>
</div>
</el-drawer>
<el-table
v-loading="loading"
:data="houseList"
ref="multipleTable"
row-key="teamId"
>
<el-table-column label="序号" align="center" width="80" type="index">
<template slot-scope="scope">
<span>{{
(queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1
}}</span>
</template>
</el-table-column>
<el-table-column
label="分公司"
align="center"
prop="houseName"
sortable
/>
<el-table-column
label="项目名称"
align="center"
prop="physicalName"
sortable
/>
<el-table-column
label="标段名称"
align="center"
prop="geoLocation"
sortable
/>
<el-table-column label="工程类别" align="center" prop="deptName" sortable>
</el-table-column>
<el-table-column label="电压等级" align="center" prop="remark" sortable>
</el-table-column>
<el-table-column label="施工地点" align="center" prop="remark" sortable>
</el-table-column>
<el-table-column label="计划开工日期" align="center" prop="remark" sortable>
</el-table-column>
<el-table-column label="计划竣工日期" align="center" prop="remark" sortable>
</el-table-column>
<el-table-column label="项目状态" align="center" prop="remark" sortable>
</el-table-column>
<el-table-column label="操作" align="center" width="180">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleView(scope.row)"
v-hasPermi="['machinery:type:edit']"
>
详情
</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 标段工程 -->
<el-dialog
:title="title"
:visible.sync="showHouse"
width="70%"
append-to-body
>
<el-table border max-height="1000px" :data="viewCodeList">
<el-table-column label="序号" align="center" type="index"/>
<el-table-column align="center" label="标段名称" prop="maTypeName"/>
<el-table-column align="center" label="工程类别" prop="typeName"/>
<el-table-column align="center" label="电压等级" prop="maCode"/>
<el-table-column align="center" label="计划开工时间" prop="createBy"/>
<el-table-column align="center" label="计划竣工时间" prop="createTime"/>
<el-table-column align="center" label="工程状态" prop="outFacCode"/>
<el-table-column align="center" label="分公司" prop="outFacCode"/>
<el-table-column label="操作" align="center" width="300">
<template slot-scope="{ row }">
<el-button
size="mini"
type="primary"
icon="el-icon-zoom-in"
@click="handleView(row)"
>
详情
</el-button>
</template>
</el-table-column>
</el-table>
</el-dialog>
</div>
</template>
<script>
import {
getListHouse,
getHouseDetail,
editHouse,
addHouse,
delHouse,
} from "@/api/ma/whHouse";
import {downloadFile} from "@/utils/download";
import {deptTreeSelect} from "@/api/system/user";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
name: "ProManagement",
data() {
return {
//
loading: false,
loadingTwo: false,
//
showSearch: true,
showHouse: false,
//
total: 0,
totalTwo: 0,
//
houseList: [],
viewCodeList: [],
maxLength: 100, //
//
title: "",
//
queryParams: {
pageNum: 1,
pageSize: 10,
keyWord: undefined,
},
//
form: {},
drawer: false,
filterSections: [
{
title: '分公司',
options: [
{value: 'all', label: '全部'},
{value: 'branch1', label: '送一分公司'},
{value: 'branch2', label: '送二分公司'},
{value: 'branch3', label: '变电一公司'},
{value: 'branch4', label: '变电二公司'}
]
},
{
title: '工程类型',
options: [
{value: 'all', label: '全部'},
{value: 'substation', label: '变电工程'},
{value: 'line', label: '线路工程'},
{value: 'adjustment', label: '调试工程'},
{value: 'other', label: '其他工程'}
]
},
{
title: '电压等级',
options: [
{value: 'all', label: '全部'},
{value: '800kv', label: '正负800kV'},
{value: '500kv', label: '500kV'},
{value: '330kv', label: '330kV'},
{value: '220kv', label: '220kV'},
{value: '110kv', label: '110kV'},
{value: '35kv', label: '35kV'},
{value: '10kv', label: '10kV'}
]
}
],
selectedValues: {}
};
},
created() {
this.getList();
//
this.filterSections.forEach(section => {
this.$set(this.selectedValues, section.title, section.options.map(option => option.value))
})
},
methods: {
/** 查询岗位列表 */
getList() {
this.loading = true;
getListHouse(this.queryParams).then((response) => {
this.houseList = response.rows;
this.total = response.total;
this.loading = false;
});
},
handleViewDetails(row) {
// this.viewCodeList = row;
this.showHouse = true;
this.title = "标段工程";
// this.loadingTwo = false;
/*getMaCodeInfo({ taskId: row.taskId, typeId: row.typeId }).then(
(response) => {
this.viewCodeList = response.rows;
this.titleBind = "查看";
this.loadingTwo = false;
}
);*/
},
handleView(row) {
this.showHouse = true;
this.title = "修改";
// this.reset();
// const houseId = row.houseId;
// getHouseDetail(houseId).then((response) => {
// this.viewCodeList = response.data;
//
// this.showHouse = true;
// this.title = "";
// });
},
//
reset() {
this.form = {};
this.resetForm("form");
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.queryParams.keyWord = null;
this.handleQuery();
},
//
cancel() {
this.showHouse = false;
this.reset();
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 导出按钮操作 */
handleExport() {
this.download(
'system/role/export',
{
...this.queryParams,
},
`role_${new Date().getTime()}.xlsx`,
)
},
isSelected(sectionTitle, value) {
return this.selectedValues[sectionTitle].includes(value)
},
handleSelect(sectionTitle, value) {
const currentSelection = [...this.selectedValues[sectionTitle]]
const allOptions = this.filterSections.find(section => section.title === sectionTitle).options
const allValues = allOptions.map(option => option.value)
if (value === 'all') {
// ""
this.$set(this.selectedValues, sectionTitle, allValues)
} else {
if (currentSelection.includes(value)) {
//
const newSelection = currentSelection.filter(v => v !== value && v !== 'all')
// ""
this.$set(this.selectedValues, sectionTitle, newSelection.length === 0 ? allValues : newSelection)
} else {
//
const newSelection = [...currentSelection.filter(v => v !== 'all'), value]
// "" ""
this.$set(this.selectedValues, sectionTitle,
newSelection.length === allOptions.length - 1 ? allValues : newSelection)
}
}
},
handleQuerys() {
//
console.log('查询', this.selectedValues)
},
handleReset() {
//
this.filterSections.forEach(section => {
this.$set(this.selectedValues, section.title, [])
})
}
},
};
</script>
<style lang="scss" scoped>
.uploadImg {
padding-top: 20px;
display: flex;
align-items: center;
justify-content: center;
}
.deviceCode {
margin-top: 10px;
padding-bottom: 20px;
font-size: 18px;
}
::v-deep.el-table .fixed-width .el-button--mini {
width: 60px !important;
margin-bottom: 10px;
}
//css
::v-deep.disabled {
.el-upload--picture-card {
display: none;
}
}
.filter-container {
padding: 20px;
height: 100%;
.filter-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 10px 15px;
border-bottom: 1px solid #e4e7ed;
.header-left {
display: flex;
align-items: center;
i {
color: #409eff;
font-size: 18px;
margin-right: 8px;
}
span {
font-size: 16px;
font-weight: 600;
color: #303133;
}
}
.close-button {
padding: 0;
font-size: 14px;
color: #909399;
i {
margin-right: 4px;
}
&:hover {
color: #409eff;
}
}
}
.filter-section {
padding: 15px 10px;
.filter-label {
display: flex;
align-items: center;
height: 32px;
margin-bottom: 12px;
padding: 0 10px;
font-size: 14px;
font-weight: 600;
color: #409eff;
background: #f5f7fa;
border-radius: 4px;
}
.button-container {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 10px;
.el-button {
width: 100%;
margin: 0;
background: #fff;
border: 1px solid #dcdfe6;
color: #606266;
&:hover {
color: #409eff;
border-color: #409eff;
}
//
&.is-active {
color: #409eff;
border-color: #409eff;
background-color: #ecf5ff;
&:hover {
color: #409eff;
border-color: #409eff;
background-color: #ecf5ff;
}
}
}
}
}
.filter-footer {
position: absolute;
bottom: 0;
left: 0;
right: 0;
padding: 15px 20px;
text-align: center;
background: #fff;
border-top: 1px solid #e4e7ed;
.el-button {
min-width: 100px;
margin: 0 10px;
}
}
}
// padding
::v-deep .el-drawer__body {
padding: 0;
height: 100%;
overflow-y: auto;
}
/* 覆盖 Element UI 的默认样式 */
.el-button--default,
.el-button--primary {
//
}
</style>