Browse Source

feat:工程巡查-巡查项目管理

feature-sy-v1.0.0
易浩轩 1 year ago
parent
commit
4fcecf00df
  1. 41
      src/api/management/index.js
  2. 48
      src/layout/components/Navbar.vue
  3. 4
      src/store/index.js
  4. 45
      src/store/modules/permission.js
  5. 19
      src/store/modules/topTab.js
  6. 3
      src/views/runManage/engineering/index.vue
  7. 418
      src/views/runManage/engineering/inspectionItems/Dike.vue
  8. 22
      src/views/runManage/engineering/inspectionItems/Reservoir.vue
  9. 22
      src/views/runManage/engineering/inspectionItems/Sluice.vue
  10. 29
      src/views/runManage/engineering/inspectionItems/index.vue
  11. 72
      src/views/runManage/engineering/inspectionPlan/index.vue
  12. 72
      src/views/runManage/engineering/inspectionRecords/index.vue

41
src/api/management/index.js

@ -0,0 +1,41 @@
import request from '@/utils/request'
// 获取字典类型列表
export function getDictionaryList(dictType) {
return request({
url: `/system/dict/data/type/${dictType}`,
method: 'get'
})
}
// 查询堤防巡视检查列表
export function postEmbankmentInspectionChecklist(data) {
return request({
url: '/run/df/checking/list',
method: 'post',
data
})
}
// 新增堤防巡视检查
export function postEmbankmentInspection(data) {
return request({
url: '/run/df/checking',
method: 'post',
data
})
}
// 修改堤防巡视检查
export function putEmbankmentInspection(data) {
return request({
url: '/run/df/checking',
method: 'put',
data
})
}
// 删除堤防巡视检查
export function deleteEmbankmentInspection(id) {
return request({
url: `/run/df/record/${id}`,
method: 'delete',
})
}

48
src/layout/components/Navbar.vue

@ -10,7 +10,12 @@
<!-- @toggleClick="toggleSideBar"-->
<!-- />-->
<!-- <breadcrumb id="breadcrumb-container" class="breadcrumb-container" />-->
<div class="centerTab">
<!-- <div>安全运行</div> -->
<div class="tab-item" :class="selectTab == 0 ? 'select-item' : ''" @click="SET_SELECT_TAB(0)">水库运行管理</div>
<div class="tab-item" :class="selectTab == 1 ? 'select-item' : ''" @click="SET_SELECT_TAB(1)">水闸运行管理</div>
<div class="tab-item" :class="selectTab == 2 ? 'select-item' : ''" @click="SET_SELECT_TAB(2)">堤防运行管理</div>
</div>
<div class="right-menu">
<template v-if="device !== 'mobile'">
<!-- <search id="header-search" class="right-menu-item" />-->
@ -30,10 +35,7 @@
<!-- </el-tooltip>-->
</template>
<el-dropdown
class="avatar-container right-menu-item hover-effect"
trigger="click"
>
<el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
<div class="avatar-wrapper">
<img v-if="options.img" :src="options.img" class="user-avatar" />
<div v-else style="background-color: white" class="user-avatar">
@ -59,7 +61,7 @@
</template>
<script>
import { mapGetters } from "vuex";
import { mapGetters, mapMutations } from "vuex";
import Breadcrumb from "@/components/Breadcrumb";
import Hamburger from "@/components/Hamburger";
import Screenfull from "@/components/Screenfull";
@ -67,6 +69,7 @@ import SizeSelect from "@/components/SizeSelect";
import Search from "@/components/HeaderSearch";
import { getFile } from "@/api/common";
import Logo from "./Sidebar/Logo";
import { store } from '@/store'
export default {
data() {
@ -74,6 +77,7 @@ export default {
options: {
img: "",
},
selectItem: '0'
};
},
components: {
@ -85,6 +89,9 @@ export default {
Search,
},
computed: {
selectTab() {
return this.$store.state.topTab.selectTab
},
...mapGetters(["sidebar", "avatar", "device"]),
showLogo() {
return this.$store.state.settings.sidebarLogo;
@ -137,6 +144,7 @@ export default {
});
});
},
...mapMutations('topTab', ['SET_SELECT_TAB']),
},
};
</script>
@ -144,11 +152,9 @@ export default {
<style lang="scss" scoped>
.navbar {
// background: #122c7d !important;
background: linear-gradient(
270deg,
background: linear-gradient(270deg,
rgba(61, 156, 204, 1) 1%,
rgba(131, 179, 107, 1) 100%
) !important;
rgba(131, 179, 107, 1) 100%) !important;
// height: 70px;
height: 56px;
overflow: hidden;
@ -182,6 +188,28 @@ export default {
vertical-align: top;
}
.centerTab {
display: flex;
.tab-item {
width: 120px;
height: 56px;
display: flex;
justify-content: center;
align-items: center;
color: #fff;
&:hover {
cursor: pointer;
}
}
.select-item {
padding-top: 4px;
border-bottom: 4px solid #fff;
}
}
.right-menu {
// float: right;
// height: 100%;

4
src/store/index.js

@ -7,6 +7,7 @@ import tagsView from './modules/tagsView'
import permission from './modules/permission'
import settings from './modules/settings'
import getters from './getters'
import topTab from './modules/topTab'
Vue.use(Vuex)
@ -19,6 +20,7 @@ const store = new Vuex.Store({
permission,
settings,
dict,
topTab
},
state: {
paragraph: {},
@ -43,7 +45,7 @@ const store = new Vuex.Store({
},
setPreviewTimeLine(state, obj) {
state.previewTimeLine = obj;
},
}
},
getters
})

45
src/store/modules/permission.js

@ -19,6 +19,51 @@ const permission = {
return new Promise(resolve => {
// 向后端请求路由数据
getRouters().then(res => {
// 临时手动添加路由
res.data.push(
{
component: "Layout",
alwaysShow: true,
hidden: false,
meta: { title: "运行管护", icon: "system" },
name: "RunManage",
path: "/runManage",
redirect: "noRedirect",
children: [
{
component: "runManage/engineering",
alwaysShow: true,
hidden: false,
meta: { title: "工程巡查", icon: "user" },
name: "Engineering",
path: "/engineering",
children: [
{
component: "runManage/engineering/inspectionItems",
hidden: false,
meta: { title: "巡查项管理", icon: "user" },
name: "InspectionItems",
path: "/inspectionItems"
},
{
component: "runManage/engineering/inspectionPlan",
hidden: false,
meta: { title: "巡查计划管理", icon: "user" },
name: "InspectionPlan",
path: "/inspectionPlan"
},
{
component: "runManage/engineering/inspectionRecords",
hidden: false,
meta: { title: "巡查记录", icon: "user" },
name: "InspectionRecords",
path: "/inspectionRecords"
},
],
}
]
}
)
const accessedRoutes = filterAsyncRouter(res.data)
accessedRoutes.push({ path: '*', redirect: '/404', hidden: true })
commit('SET_ROUTES', accessedRoutes)

19
src/store/modules/topTab.js

@ -0,0 +1,19 @@
const state = {
/**
* selectTab = 0 水库运行管理
* selectTab = 1 水闸运行管理
* selectTab = 2 堤防运行管理
*/
selectTab: 0
}
const mutations = {
SET_SELECT_TAB: (state, select) => {
state.selectTab = select
}
}
export default {
namespaced: true,
state,
mutations,
}

3
src/views/runManage/engineering/index.vue

@ -0,0 +1,3 @@
<template >
<router-view />
</template>

418
src/views/runManage/engineering/inspectionItems/Dike.vue

@ -0,0 +1,418 @@
<!-- 巡查项管理-堤防 -->
<script>
import { getDictionaryList, postEmbankmentInspectionChecklist, postEmbankmentInspection, putEmbankmentInspection, deleteEmbankmentInspection } from '@/api/management'
export default {
name: 'InspectionItems',
data() {
return {
searchInput: '',
searchType: 3,
dialogVisible: false,
ContentType: '',
firstType: [], //
secondType: [], //
examType: [], //
tableData: [], //
newOrEditTableData: [
{
inspectionItems: '0',
checkpoint: '0',
inspectionContent: '0',
},
{
inspectionItems: '2',
checkpoint: '2',
inspectionContent: '2',
},
],
pageData: {
pageNum: 1, //
pageSize: 10, //
pageSizes: [10, 20, 50, 100],
total: 0 //
},
ruleForm: {
name: '',
type: '0',
checkContentType: '',
items: [
// {
// id: 111,
// inspectionItems: 'df_xs_c_0_0',
// checkpoint: 'df_xs_c_0_0_1',
// content: '0',
// },
// {
// id: 222,
// inspectionItems: 'df_xs_c_0_2',
// checkpoint: 'df_xs_c_0_2_2',
// content: '',
// },
// {
// id: 111,
// content: '',
// parts: ['sk_xs_c_0', 'sk_xs_c_0_0', 'sk_xs_c_0_0_0']
// },
// {
// id: 222,
// content: '',
// parts: ['sk_xs_c_1', '', '']
// },
// {
// id: 333,
// content: '',
// parts: ['', '', '']
// },
],
},
rules: {
name: [
{ required: true, message: '请输入巡视检查名称', trigger: 'blur' },
{ max: 50, message: '名称最长为50个字符', trigger: 'blur' }
],
type: [
{ required: true, message: '请选择巡查类型', trigger: 'change' }
],
checkContentType: [
{ required: true, message: '请选巡视检查内容', trigger: 'change' }
]
}
}
},
methods: {
//
editTableItem(row) {
putEmbankmentInspection({ id: row.id }).then((res) => {
console.log('🚀res🚀', res)
this.ruleForm.name = res.data.name
this.ruleForm.type = res.data.type
this.dialogVisible = true
console.log(this.examType);
})
},
//
deleteTableItem(row) {
deleteEmbankmentInspection(row.id).then((res) => {
console.log('🚀res🚀', res)
this.getTableData()
})
},
//
addPatrolItem() {
this.ruleForm.items.push(
{
content: '',
parts: ['', '', '']
}
)
},
//
newInspectionItems() {
this.dialogVisible = true
this.ruleForm = {
name: '',
type: '',
checkContentType: '',
items: [
{
content: '',
parts: ['', '', '']
}
]
}
},
//
deletePatrolItem(row) {
console.log('🚀row🚀', row)
},
//
changeContentType(dictValue) {
getDictionaryList(dictValue).then((res) => {
this.secondType = res.data
console.log('🚀一级🚀', res.data)
})
this.ruleForm.items = [
{
content: '',
parts: [this.ruleForm.checkContentType]
}
]
},
//
changeSecondType(row) {
getDictionaryList(row.parts[1]).then((res) => {
console.log('🚀二级🚀', res.data)
row.parts[2] = ''
this.$set(row, 'third', res.data)
})
},
//
changeThirdType(row) {
let value = row.third.find(item => item.dictValue == row.parts[2]).remark
if (value) {
row.content = value
}
},
//
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
console.log(this.ruleForm);
postEmbankmentInspection(this.ruleForm).then((res) => {
getTableData()
this.dialogVisible = false
})
} else {
console.log('校验不通过');
return false;
}
});
},
resetForm(formName) {
this.$refs[formName].resetFields();
this.dialogVisible = false
},
//
addInspectionItems() {
},
getTableData() {
postEmbankmentInspectionChecklist({
data: {
timeView: {
timeField: "create_time"
}
},
cv: {
name: "name",
type: "like",
value: this.searchInput
},
pageSize: this.pageData.pageSize,
pageNum: this.pageData.pageNum
}).then((res) => {
if (res) {
this.tableData = res.records
this.pageData.total = res.total
}
console.log('🚀res1🚀', res)
})
}
},
mounted() {
this.pageData.total = this.tableData.length
getDictionaryList('xs_classfy').then((res) => {
console.log('🚀检查类型🚀', res)
if (res.data && Array.isArray(res.data)) {
res.data.forEach(element => {
element.dictValue = Number(element.dictValue)
});
this.examType = res.data
}
})
getDictionaryList('df_xs_c_classfy').then((res) => {
if (res.data && Array.isArray(res.data)) {
this.firstType = res.data
console.log('🚀res.data🚀', res.data)
}
})
//
postEmbankmentInspectionChecklist({
data: {
timeView: {
timeField: "create_time"
}
},
cv: {
name: "name",
type: "like",
value: this.searchInput
},
pageSize: this.pageData.pageSize,
pageNum: this.pageData.pageNum
}).then((res) => {
if (res) {
this.tableData = res.records
this.pageData.total = res.total
}
console.log('🚀res1🚀', res)
})
},
}
</script>
<template>
<div class="body">
<div class="top-title">
基础信息管理
</div>
<div class="table-box">
<div class="top-search">
<span>巡视检查名称</span>
<el-input class="search-input" v-model="searchInput" placeholder="请输入巡视检查名称" />
<span>巡查类型</span>
<el-select v-model="searchType" placeholder="请选择">
<el-option label="日常检查" :value="0"></el-option>
<el-option label="定期检查" :value="1"></el-option>
<el-option label="特别检查" :value="2"></el-option>
<el-option label="全部" :value="3"></el-option>
</el-select>
<el-button class="search-btn" type="success">搜索</el-button>
</div>
<el-button class="search-btn" style=" margin-right: 16px;margin-bottom: 8px; float: right;" type="success"
@click="newInspectionItems()">添加</el-button>
<el-table class="table" :data="tableData" border>
<el-table-column type="index" align="center" label="序号" width="100">
</el-table-column>
<el-table-column prop="name" align="center" label="巡视检查名称">
</el-table-column>
<el-table-column align="center" label="巡查类型">
<template slot-scope="scope">
<span v-if="examType.length > 0">{{ examType.find(item => item.dictValue == scope.row.type).dictLabel ||
''
}}</span>
</template>
</el-table-column>
<el-table-column prop="createTime" align="center" sortable label="创建时间">
</el-table-column>
<el-table-column prop="updateTime" align="center" sortable label="更新时间">
</el-table-column>
<el-table-column prop="address" align="center" label="操作">
<template slot-scope="scope">
<el-button style=" margin-right: 16px;" @click="editTableItem(scope.row)" type="text"
size="small">编辑</el-button>
<el-popconfirm confirm-button-text='确定' cancel-button-text='取消' icon="el-icon-info" icon-color="red"
title="确定删除吗?" @confirm="deleteTableItem(scope.row)">
<el-button style="color: red;" type="text" size="small" slot="reference">删除</el-button>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
<el-pagination background class="pagination" style="margin-top: 16px;margin-right: 16px;float: right;"
:current-page="pageData.pageNum" :page-sizes="pageData.pageSizes" layout="total, prev, pager, next, sizes, jumper"
:total="pageData.total" @size-change="getTableData()">
</el-pagination>
</div>
<el-dialog title="新增/编辑巡查项" :visible.sync="dialogVisible" width="50%">
<div style="display: flex; margin-bottom: 16px;">
<div style="width: 5px; height: 16px; background-color: #31a08e; margin-right: 8px;"></div><span
style="font-weight: 600;">基础信息</span>
</div>
<el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
<el-form-item label-width="120px" label="巡视检查名称" prop="name">
<el-input style="width: 202px;" v-model="ruleForm.name"></el-input>
</el-form-item>
<el-form-item label-width="120px" label="巡查类型" prop="type">
<el-select v-model="ruleForm.type" placeholder="请选择巡查类型">
<el-option v-for="item in examType" :label="item.dictLabel" :value="item.dictValue"
:key="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label-width="120px" label="巡视检查内容" prop="checkContentType">
<el-select v-model="ruleForm.checkContentType" @change="changeContentType(ruleForm.checkContentType)"
placeholder="请选择巡视检查内容">
<el-option v-for="item in firstType" :label="item.dictLabel" :value="item.dictValue"
:key="item.id"></el-option>
</el-select>
<span style="margin-left: 8px; color: red;">注意切换选项后检查内容将会清空</span>
</el-form-item>
</el-form>
<el-table class="table" height="350" :data="ruleForm.items" border>
<el-table-column type="index" align="center" label="序号" center width="80">
</el-table-column>
<el-table-column align="center" label="检查项目和内容">
<template slot-scope="scope">
<el-select v-model="scope.row.parts[1]" @change="changeSecondType(scope.row)" placeholder="请选择检查项目和内容">
<el-option v-for="item in secondType" :label="item.dictLabel" :value="item.dictValue"
:key="item.id"></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column align="center" label="检查部位">
<template slot-scope="scope">
<el-select v-model="scope.row.parts[2]" @change="changeThirdType(scope.row)" placeholder="请选择检查部位">
<el-option v-for="item in scope.row.third" :label="item.dictLabel" :value="item.dictValue"
:key="item.id"></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column align="center" prop="inspectionContent" label="检查内容">
<template slot-scope="scope">
<el-input maxlength="500" v-model="scope.row.content"></el-input>
</template>
</el-table-column>
<el-table-column prop="address" align="center" label="操作">
<template slot-scope="scope">
<el-button style="margin-right: 8px;" v-if="scope.$index == ruleForm.items.length - 1"
@click="addPatrolItem()" type="text" size="small">添加</el-button>
<el-popconfirm confirm-button-text='确定' cancel-button-text='取消' icon="el-icon-info" icon-color="red"
title="确定删除吗?" @confirm="deletePatrolItem(scope.row)">
<el-button slot="reference" style="color: red;" type="text" size="small">删除</el-button>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
<div slot="footer" class="dialog-footer">
<el-button size="mini" @click="resetForm('ruleForm')"> </el-button>
<el-button size="mini" type="primary" @click="submitForm('ruleForm')">保存</el-button>
</div>
</el-dialog>
</div>
</template>
<style scoped lang="less">
.body {
width: 100%;
min-height: calc(100vh - 56px);
margin-left: 24px;
.top-title {
height: 40px;
background-color: white;
display: flex;
padding-left: 16px;
align-items: center;
font-weight: 600;
}
.table-box {
width: 100%;
min-height: calc(100vh - 56px - 64px);
margin-top: 24px;
padding: 16px;
background-color: white;
.top-search {
display: flex;
align-items: center;
margin-bottom: 8px;
.search-input {
width: 300px;
margin-right: 10px;
}
}
.search-btn {
margin-left: 10px;
background-color: #37b29e;
border: none;
&:hover {
background-color: #5ac6b9;
}
&:active {
background-color: #2b8070;
}
;
}
.table {
height: calc(680px - 34px);
}
}
}
</style>

22
src/views/runManage/engineering/inspectionItems/Reservoir.vue

@ -0,0 +1,22 @@
<!-- 巡查项管理-水库 -->
<script>
export default {
name: '',
data() {
return {
}
},
methods: {
}
}
</script>
<template>
<div>
水库
</div>
</template>
<style scoped lang="less"></style>

22
src/views/runManage/engineering/inspectionItems/Sluice.vue

@ -0,0 +1,22 @@
<!-- 巡查项管理-水闸 -->
<script>
export default {
name: '',
data() {
return {
}
},
methods: {
}
}
</script>
<template>
<div>
水闸
</div>
</template>
<style scoped lang="less"></style>

29
src/views/runManage/engineering/inspectionItems/index.vue

@ -0,0 +1,29 @@
<!-- 巡查项管理 -->
<script>
import Dike from './Dike.vue'
import Reservoir from './Reservoir.vue'
import Sluice from './Sluice.vue'
export default {
name: 'InspectionItems',
components: {
Reservoir, //
Sluice, //
Dike, //
},
computed: {
selectTab() {
return this.$store.state.topTab.selectTab
},
}
}
</script>
<template>
<div>
<Reservoir v-if="selectTab == 0"></Reservoir>
<Sluice v-if="selectTab == 1"></Sluice>
<Dike v-if="selectTab == 2"></Dike>
</div>
</template>
<style scoped lang="less"></style>

72
src/views/runManage/engineering/inspectionPlan/index.vue

@ -0,0 +1,72 @@
<!-- 工程巡查 -->
<script lang="ts">
export default {
name: 'IconSelect',
data() {
return {
name: '',
}
},
methods: {
searchData() {
console.log('搜索内容', this.name);
}
}
}
</script>
<template>
<div class="body">
<div class="top-title">
基础信息管理
</div>
<div class="table-box">
<div class="top-search">
<span>计划名称</span>
<el-input class="search-input" v-model="this.name" placeholder="请输入计划名称" @input="this.searchData" />
<el-button class="search-btn" type="success">搜索</el-button>
</div>
</div>
</div>
</template>
<style scoped lang="less">
.body {
width: 100%;
min-height: calc(100vh - 56px);
margin-left: 24px;
.top-title {
height: 40px;
background-color: white;
display: flex;
padding-left: 16px;
align-items: center;
font-weight: 600;
}
.table-box {
width: 100%;
min-height: calc(100vh - 56px - 64px);
margin-top: 24px;
padding: 16px;
background-color: white;
.top-search{
display: flex;
align-items: center;
.search-input{
width: 300px;
margin-right: 10px;
}
.search-btn{
background-color: #37b29e;
border: none;
&:hover{
background-color: #5ac6b9;
};
&:active{
background-color: #2b8070;
};
}
}
}
}
</style>

72
src/views/runManage/engineering/inspectionRecords/index.vue

@ -0,0 +1,72 @@
<!-- 工程巡查 -->
<script lang="ts">
export default {
name: 'IconSelect',
data() {
return {
name: '',
}
},
methods: {
searchData() {
console.log('搜索内容', this.name);
}
}
}
</script>
<template>
<div class="body">
<div class="top-title">
基础信息管理
</div>
<div class="table-box">
<div class="top-search">
<span>计划名称</span>
<el-input class="search-input" v-model="this.name" placeholder="请输入计划名称" @input="this.searchData" />
<el-button class="search-btn" type="success">搜索</el-button>
</div>
</div>
</div>
</template>
<style scoped lang="less">
.body {
width: 100%;
min-height: calc(100vh - 56px);
margin-left: 24px;
.top-title {
height: 40px;
background-color: white;
display: flex;
padding-left: 16px;
align-items: center;
font-weight: 600;
}
.table-box {
width: 100%;
min-height: calc(100vh - 56px - 64px);
margin-top: 24px;
padding: 16px;
background-color: white;
.top-search{
display: flex;
align-items: center;
.search-input{
width: 300px;
margin-right: 10px;
}
.search-btn{
background-color: #37b29e;
border: none;
&:hover{
background-color: #5ac6b9;
};
&:active{
background-color: #2b8070;
};
}
}
}
}
</style>
Loading…
Cancel
Save