Browse Source

feat: 巡查项目新增

sy-water-data-board-ui
panyuyi 1 month ago
parent
commit
a6b2e9aae5
  1. 53
      src/api/dike/index.js
  2. 42
      src/router/index.js
  3. 1
      src/store/getters.js
  4. 7
      src/store/modules/user.js
  5. 72
      src/views/dike/runManage/patrolMaintenance/overviewAnalysis/index.vue
  6. 519
      src/views/dike/runManage/patrolMaintenance/patrolItemsManage/details.vue
  7. 315
      src/views/dike/runManage/patrolMaintenance/patrolItemsManage/index.vue
  8. 3
      vue.config.js

53
src/api/dike/index.js

@ -930,3 +930,56 @@ export function postYhStatisticsHiddenDanger(data){
data
})
}
/***********************新版巡查养护***********************/
// 保存巡查项 /run/df/v2/checking
export function postV2PatrolChecking(data) {
return request({
url: `/run/df/v2/checking/add`,
method: 'post',
data
})
}
// 更新巡查项 /run/df/v2/checking
export function putV2PatrolChecking(data) {
return request({
url: `/run/df/v2/checking/edit`,
method: 'post',
data
})
}
// 获取巡查项详情 /run/df/v2/checking/{id}
export function getV2PatrolChecking(id) {
return request({
url: `/run/df/v2/checking/${id}`,
method: 'get'
})
}
// 获取巡查项列表 /run/df/v2/checking/list
export function getV2PatrolCheckingList(data) {
return request({
url: `/run/df/v2/checking/list`,
method: 'post',
data
})
}
// 删除巡查项 /run/df/v2/checking/{ids}
export function delV2PatrolChecking(ids) {
return request({
url: `/run/df/v2/checking/${ids}`,
method: 'delete'
})
}
// 获取巡查统计分析数据/run/statistic/chart
export function getV2PatrolStatisticChart(data) {
return request({
url: `/run/statistic/chart`,
method: 'post',
data
})
}

42
src/router/index.js

@ -83,27 +83,27 @@ export const constantRoutes = [
},
//TODO 临时测试路径
{
path: '/reservoir',
component: Layout,
redirect: '/reservoir/safeMonitorSetting',
children: [
{
path: 'safeOperation',
component: () => import('@/views/reservoir/safeOperation/index'),
meta: {
title: '安全运行',
}
},
{
path: 'safeMonitorSetting',
component: () => import('@/views/reservoir/safeMonitorSetting/index'),
meta: {
title: '安全运行监测',
}
}
]
},
// {
// path: '/reservoir',
// component: Layout,
// redirect: '/reservoir/safeMonitorSetting',
// children: [
// {
// path: 'safeOperation',
// component: () => import('@/views/reservoir/safeOperation/index'),
// meta: {
// title: '安全运行',
// }
// },
// {
// path: 'safeMonitorSetting',
// component: () => import('@/views/reservoir/safeMonitorSetting/index'),
// meta: {
// title: '安全运行监测',
// }
// }
// ]
// },
// {
// path: '/user',
// component: Layout,

1
src/store/getters.js

@ -8,6 +8,7 @@ const getters = {
adcd: state => state.user.adcd,
avatar: state => state.user.avatar,
name: state => state.user.name,
uid: state => state.user.uid,
logo: state => state.user.logo,
introduction: state => state.user.introduction,
roles: state => state.user.roles,

7
src/store/modules/user.js

@ -5,6 +5,7 @@ const user = {
state: {
token: getToken(),
name: '',
uid: '',
adcd: '',
avatar: '',
roles: [],
@ -22,6 +23,9 @@ const user = {
SET_NAME: (state, name) => {
state.name = name
},
SET_UID: (state, id) => {
state.uid = id
},
SET_AVATAR: (state, avatar) => {
state.avatar = avatar
},
@ -72,8 +76,9 @@ const user = {
} else {
commit('SET_ROLES', ['ROLE_DEFAULT'])
}
console.log(user)
console.log('user >>>>>>>>> ', user)
commit('SET_NAME', user.userName)
commit('SET_UID', user.id)
commit('SET_ADCD', res.adcd)
commit('SET_AVATAR', avatar)
// commit('SET_LOGO', res.user.dept.adminLogo)

72
src/views/dike/runManage/patrolMaintenance/overviewAnalysis/index.vue

@ -0,0 +1,72 @@
<template>
<div class="overview-analysis-page slider-right">
<TopBackTitle :showBackBtn="false"></TopBackTitle>
<div class="slider-right-body">
<div class="top-search">
<span class="ml-10">巡查周期</span>
<el-date-picker
v-model="paramsData.timeRange"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd"
></el-date-picker>
<span class="ml-10">行政区划</span>
<el-cascader
v-model="paramsData.adcd"
:props="areasOptionProps"
placeholder="请选择行政区划"
clearable
size="small"
>
</el-cascader>
<el-button
class="search-btn !ml-16"
type="success"
@click="handleSearch()"
>查询</el-button
>
<el-button @click="resetSearch()">重置</el-button>
</div>
</div>
</div>
</template>
<script>
import TopBackTitle from "@/components/TopBackTitle/index.vue";
import { cascaderLazyLoad } from "@/utils/elUtils";
export default {
components: {
TopBackTitle,
},
data() {
return {
paramsData: {
timeRange: [],
adcd: [],
},
areasOptionProps: {
emitPath: false,
checkStrictly: true, //
expandTrigger: "hover",
lazy: true,
lazyLoad: cascaderLazyLoad,
},
};
},
created() {},
methods: {
handleSearch() {},
resetSearch() {
this.paramsData.timeRange = [];
this.paramsData.adcd = [];
},
},
};
</script>
<style scoped lang="scss">
.overview-analysis-page {
}
</style>

519
src/views/dike/runManage/patrolMaintenance/patrolItemsManage/details.vue

@ -1,17 +1,524 @@
<!-- 巡查项详情 -->
<!-- 巡查项 -->
<template>
<div class="patrol-items-details">巡查项详情</div>
<div class="slider-right">
<TopBackTitle></TopBackTitle>
<div class="table-box">
<div class="top-box">
<el-form
:inline="true"
:model="formData"
:rules="rules"
:disabled="!canEdit"
ref="ruleForm"
label-width="120px"
>
<el-form-item label="巡查堤防名称" prop="dikeName">
<el-select
:disabled="!canEdit"
class="w-240"
size="small"
remote
filterable
reserve-keyword
:maxlength="50"
:remote-method="handleGetRemoteDikeMethod"
@focus="handleGetRemoteDikeMethod('')"
@change="handleChangeDike"
v-model="formData.dikeCode"
placeholder="请选择堤防"
>
<el-option
v-for="item in dikeList"
:key="item.id"
:label="item.dikeName"
:value="item.dikeCode"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="巡查堤防编码" prop="dikeCode">
<el-input
v-model="formData.dikeCode"
:disabled="true"
placeholder="请选择堤防"
></el-input>
</el-form-item>
<el-form-item label="巡查项目名称" prop="name">
<el-input
v-model="formData.name"
:disable="true"
placeholder="请输入"
></el-input>
</el-form-item>
<el-form-item label="巡查类别" prop="category">
<el-select
:disabled="!canEdit"
v-model="formData.category"
placeholder="请选择"
>
<el-option
v-for="item in xcCategoryList"
:key="item.dictValue"
:label="item.dictLabel"
:value="item.dictValue"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="巡查类型" prop="type">
<el-select
:disabled="!canEdit"
v-model="formData.type"
placeholder="请选择"
>
<el-option
v-for="item in xcTypeOptions"
:key="item.dictValue"
:label="item.dictLabel"
:value="item.dictValue"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="创建人" prop="createUid">
<el-input
v-model="formData.createName"
:disabled="true"
placeholder="请输入"
></el-input>
</el-form-item>
</el-form>
</div>
<div>
<el-table :data="tableData" border>
<el-table-column prop="parts" label="工程部位" width="320">
<template slot-scope="scope">
<el-cascader
:disabled="!canEdit"
class="w-full"
v-model="scope.row.parts"
@change="(val) => handleChangeCascader(val, scope.row)"
:options="xcTreeData"
:props="{
checkStrictly: true,
expandTrigger: 'hover',
label: 'value',
value: 'key',
}"
clearable
></el-cascader>
</template>
</el-table-column>
<el-table-column prop="content" label="检查内容">
<template slot-scope="scope">
<el-input
:disabled="!canEdit"
v-model="scope.row.content"
placeholder="请输入"
></el-input>
</template>
</el-table-column>
<el-table-column label="操作" width="180">
<template slot-scope="scope">
<el-button
:disabled="!canEdit"
type="text"
@click="handleAddNew(scope.$index)"
>新增</el-button
>
<el-button :disabled="!canEdit" type="text">删除</el-button>
</template>
</el-table-column>
<template #empty>
<el-button
:disabled="!canEdit"
type="primary"
@click="handleAddNew(null)"
>新增</el-button
>
</template>
</el-table>
</div>
</div>
<div class="bottom-btns">
<el-button :disabled="!canEdit" type="primary" @click="handleSave"
>保存</el-button
>
<el-button @click="$router.go(-1)">返回</el-button>
</div>
</div>
</template>
<script>
import { intersection } from "lodash";
import {
checkUsed,
getCheckingDictTree,
postV2PatrolChecking,
putV2PatrolChecking,
getV2PatrolChecking,
getRunProjectList,
} from "@/api/dike";
import TopBackTitle from "@/components/TopBackTitle/index.vue";
import { mapGetters } from "vuex";
export default {
components: {
TopBackTitle,
},
data() {
return {};
return {
tableData: [
{
id: null,
parts: [],
content: "",
},
],
xcTreeData: [],
xcTypeOptions: [],
xcCategoryList: [],
dikeList: [],
formData: {
id: null,
dikeCode: "",
dikeName: "",
name: "",
type: "",
category: "",
createUid: "",
createName: "",
items: [],
},
rules: {
dikeCode: [{ required: true, message: "请选择", trigger: "change" }],
dikeName: [{ required: true, message: "请选择", trigger: "change" }],
name: [{ required: true, message: "请输入", trigger: "blur" }],
category: [{ required: true, message: "请选择", trigger: "change" }],
type: [{ required: true, message: "请选择", trigger: "change" }],
createUid: [
{
required: true,
message: "未能识别当前登录用户",
trigger: "change",
},
],
},
};
},
computed: {
...mapGetters({
userId: "uid",
userName: "name",
}),
canEdit: function () {
return (
this.$route.query.type === "edit" || this.$route.query.type === "add"
);
},
},
created() {
//
this.getDicts("patrol_maintenance_type").then((res) => {
if (res.data && Array.isArray(res.data)) {
this.xcTypeOptions = res.data;
}
});
this.getDicts("patrol_maintenance_category").then((res) => {
if (res.data && Array.isArray(res.data)) {
this.xcCategoryList = res.data;
}
});
},
mounted() {
this.getDetailsData();
},
methods: {
handleGetRemoteDikeMethod(query) {
getRunProjectList({
pageSize: 10,
pageNum: 1,
data: {
dikeName: query,
},
}).then((res) => {
if (res) {
this.dikeList = res.records;
}
});
},
handleChangeDike() {
let res = this.dikeList.find(
(v) => v.dikeCode === this.formData.dikeCode
);
this.formData.dikeType = res.dikeType;
this.formData.dikeName = res.dikeName;
},
//
async getDetailsData() {
const dictData = await getCheckingDictTree("df_xs_c_classfy");
let _xcTreeData = this.transformArr(dictData?.data);
const checkId = this.$route.query.id;
if (checkId) {
const { data } = await getV2PatrolChecking(checkId);
if (data?.items) {
this.formData.id = data.id;
this.formData.name = data.name;
this.formData.type = data.type;
this.formData.category = data.category;
this.formData.dikeCode = data.dikeCode;
this.formData.dikeName = data.dikeName;
this.formData.createUid = data.createUid;
this.formData.createName = data.createName;
// xcTreeData
this.matchXcTreeData(_xcTreeData, data.items);
this.tableData = data.items;
}
} else {
this.formData.createUid = this.userId;
this.formData.createName = this.userName;
}
this.xcTreeData = _xcTreeData;
},
// content
handleChangeCascader(val, row) {
if (val?.length) {
let resObj = this.xcTreeData.find((v) => v.key === val[0]);
for (let i = 1; i < val.length; i++) {
let resDict = resObj.children?.find((v) => v.key === val[i]);
if (resDict) {
resObj = resDict;
} else {
break;
}
}
if (!row.content) row.content = resObj.content;
}
},
handleChangeSelectDike(val) {
let res = this.dikeList.find((v) => v.dikeCode === val);
if (res) this.formData.dikeName = res.dikeName;
},
//
transformArr(treeList) {
//
function deepCalc(item, part = []) {
item.parts = [...part, item.key];
if (item.children?.length) {
item.children.forEach((v) => {
if (!v.children || v.children.length === 0) {
v.parts = [...item.parts, v.key];
v.content = v.remark || "";
delete v.children;
} else {
deepCalc(v, item.parts);
}
});
} else {
delete item.children;
}
}
treeList.forEach((item) => {
deepCalc(item);
});
return treeList;
},
//
matchXcTreeData(treeData, dataList) {
treeData.forEach((v) => {
if (!v.children?.length) {
for (const item of dataList) {
v.id = item.id;
if (intersection(v.parts, item.parts).length === v.parts.length) {
//
v.content = item.content || "";
break;
}
}
} else {
this.matchXcTreeData(v.children, dataList);
}
});
},
// xcTreeDatachecktrue
getCheckData(treeData) {
let res = [];
treeData.forEach((v) => {
if (v.check) {
res.push({
parts: v.parts,
id: v.id || null,
content: v.content,
});
}
if (v.children?.length) {
res = res.concat(this.getCheckData(v.children));
}
});
return res;
},
handleAddNew(index) {
console.log("index >>>>> ", index);
if (index !== null) {
this.tableData.splice(index + 1, 0, {
id: null,
parts: [],
content: "",
});
} else {
this.tableData.push({
id: null,
parts: [],
content: "",
});
}
},
//
handleSave() {
console.log("保存 >>> ", {
...this.formData,
items: this.tableData,
});
if (this.$route.query.id) {
this.formData.id = this.$route.query.id;
}
this.$refs.ruleForm.validate().then((valid) => {
if (valid) {
console.log("valid >>>>> ", valid);
if (this.tableData.length) {
if (
this.tableData.some(
(v) => !v.content || !v.parts || !v.parts.length
)
) {
this.$message.error("请完善巡查部位或检车内容");
return;
}
} else {
this.$message.error("请至少新增一条巡查项目");
return;
}
if (this.formData.id) {
putV2PatrolChecking({
...this.formData,
items: this.tableData,
}).then((res) => {
this.$message.success("更新成功");
setTimeout(() => {
this.$router.go(-1);
}, 500);
});
} else {
postV2PatrolChecking({
...this.formData,
items: this.tableData,
}).then((res) => {
if (res.data?.id) {
this.formData.id = res.data.id;
}
this.$message.success("保存成功");
setTimeout(() => {
this.$router.go(-1);
}, 500);
});
}
}
});
},
},
created() {},
methods: {},
};
</script>
<style scoped lang="scss">
.patrol-items-details {
.top-title {
height: 50px;
background-color: white;
display: flex;
padding-left: 16px;
align-items: center;
font-weight: 600;
}
.table-box {
width: 100%;
height: calc(100% - 50px - 24px);
margin-top: 24px;
padding: 16px;
padding-bottom: 80px;
background-color: white;
overflow: auto;
.top-box {
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;
}
}
}
.xc-form-table {
}
.l-t-border {
border-left: 1px solid #eee;
border-top: 1px solid #eee;
}
.r-b-border {
border-right: 1px solid #eee;
border-bottom: 1px solid #eee;
}
.w-p-20 {
width: 20%;
}
.w-p-80 {
width: 80%;
}
.w-p-50 {
width: 50%;
}
.w-80 {
width: 80px !important;
}
.w-120 {
width: 120px !important;
}
.w-160 {
width: 160px !important;
}
.w-240 {
width: 240px !important;
}
</style>
<style lang="scss">
.inspection-radio-group {
.el-radio {
margin-right: 10px;
.el-radio__label {
padding-left: 4px;
}
&:last-child {
margin-right: 0;
}
}
}
</style>

315
src/views/dike/runManage/patrolMaintenance/patrolItemsManage/index.vue

@ -1,17 +1,314 @@
<!-- 巡查项管理 -->
<template>
<div class="patrol-items-manage">巡查项管理</div>
</template>
<!-- 巡查项目管理-堤防 -->
<script>
import { getDicts } from "@/api/management";
import { getV2PatrolCheckingList, delV2PatrolChecking } from "@/api/dike";
import TopBackTitle from "@/components/TopBackTitle/index.vue";
import { calcTableHeight } from "@/mixins/calcTableHeight";
export default {
name: "patrolItemsManage",
components: {
TopBackTitle,
},
mixins: [calcTableHeight],
data() {
return {};
return {
paramsData: {
name: "",
type: "",
category: "",
},
xcTypeOptions: [], //
xcCategoryOptions: [], //
tableData: [], //
pageData: {
pageNum: 1, //
pageSize: 10, //
pageSizes: [10, 20, 50, 100],
total: 0, //
},
};
},
methods: {
handleCurrentPageChange(page) {
this.pageData.pageNum = page;
this.getTableData();
},
handlePageSizeChange(pageSize) {
this.pageData.pageSize = pageSize;
this.getTableData();
},
deleteTableItem(row) {
console.log("deleteTableItem删除 >>>>> ", row);
delV2PatrolChecking(row.id).then((res) => {
this.getTableData();
this.$message.success("删除成功");
});
},
//
searchTableList() {
this.getTableData();
},
//
resetSearch() {
this.paramsData.name = "";
this.paramsData.type = "";
this.paramsData.category = "";
this.pageData.pageNum = 1;
this.getTableData();
},
//
handleAddItem() {
this.$router.push({
path: "patrolItemsDetails",
query: {
type: "add",
},
});
},
//
handleOperateTableItem(row, mode) {
this.$router.push({
path: "patrolItemsDetails",
query: {
id: row.id,
type: mode,
},
});
},
//
getTableData() {
getV2PatrolCheckingList({
data: {
category: this.paramsData.category,
dikeCode: "",
name: this.paramsData.name,
type: this.paramsData.type,
},
cv: {
name: "name",
type: "like",
},
pageSize: this.pageData.pageSize,
pageNum: this.pageData.pageNum,
}).then((res) => {
if (res) {
this.tableData = res.records;
this.pageData.total = res.total;
}
});
},
//
handleGetInvoices(row) {
this.$router.push({
path: "/",
query: {
id: row.id,
},
});
},
},
mounted() {
//
this.getTableData();
//
getDicts("patrol_maintenance_type").then((res) => {
if (res.data && Array.isArray(res.data)) {
this.xcTypeOptions = res.data;
}
});
getDicts("patrol_maintenance_category").then((res) => {
if (res.data && Array.isArray(res.data)) {
this.xcCategoryOptions = res.data;
}
});
},
created() {},
methods: {},
};
</script>
<style scoped lang="scss">
.patrol-items-manage {
<template>
<div class="slider-right">
<TopBackTitle :showBackBtn="false" />
<div class="table-box slider-right-body" ref="tableBoxRef">
<div class="" ref="topBoxRef">
<div class="top-search">
<span>巡视检查名称</span>
<el-input
class="search-input"
v-model="paramsData.name"
placeholder="请输入巡视检查名称"
/>
<span class="ml-10">巡查类型</span>
<el-select v-model="paramsData.type" placeholder="请选择">
<el-option label="全部" value=""></el-option>
<el-option
v-for="item in xcTypeOptions"
:label="item.dictLabel"
:value="item.dictValue"
:key="item.dictValue"
></el-option>
</el-select>
<span class="ml-10">巡查类别</span>
<el-select v-model="paramsData.category" placeholder="请选择">
<el-option label="全部" value=""></el-option>
<el-option
v-for="item in xcCategoryOptions"
:label="item.dictLabel"
:value="item.dictValue"
:key="item.dictValue"
></el-option>
</el-select>
<el-button
class="search-btn !ml-16"
type="success"
@click="searchTableList()"
>搜索</el-button
>
<el-button @click="resetSearch()">重置</el-button>
<el-button
class="search-btn"
style="float: right"
type="success"
v-hasPermi="['df:run:checking:item:add']"
@click="handleAddItem"
>添加</el-button
>
</div>
</div>
<el-table :height="tableHeight" :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="xcTypeOptions.length > 0 && scope.row.type !== null">{{
xcTypeOptions.find((item) => item.dictValue == scope.row.type)
.dictLabel || ""
}}</span>
</template>
</el-table-column>
<el-table-column align="center" label="巡查类别">
<template slot-scope="scope">
<span
v-if="xcCategoryOptions.length > 0 && scope.row.category !== null"
>{{
xcCategoryOptions.find(
(item) => item.dictValue == scope.row.category
).dictLabel || ""
}}</span
>
</template>
</el-table-column>
<el-table-column
prop="createName"
align="center"
sortable
label="创建人"
>
</el-table-column>
<el-table-column
prop="createTime"
align="center"
sortable
label="创建时间"
>
</el-table-column>
<el-table-column
prop="address"
align="center"
label="操作"
fixed="right"
width="100"
>
<template slot-scope="scope">
<el-button
style="margin-right: 16px"
v-hasPermi="['df:run:patrol:list:item:getInvoices']"
type="text"
size="small"
@click="handleGetInvoices(scope.row)"
>领单</el-button
>
<el-button
style="margin-right: 16px"
@click="handleOperateTableItem(scope.row, 'view')"
v-hasPermi="['df:run:patrol:list:item:check']"
type="text"
size="small"
>查看</el-button
>
<el-button
style="margin-right: 16px"
@click="handleOperateTableItem(scope.row, 'edit')"
v-hasPermi="['df:run:patrol:list:item:edit']"
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"
v-hasPermi="['df:run:patrol:list:item:delete']"
>删除</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"
@current-change="(e) => handleCurrentPageChange(e)"
@size-change="(e) => handlePageSizeChange(e)"
>
</el-pagination>
</div>
</div>
</template>
<style scoped lang="less">
.top-title {
height: 50px;
background-color: white;
display: flex;
padding-left: 16px;
align-items: center;
font-weight: 600;
}
.table-box {
width: 100%;
margin-top: 24px;
padding: 16px;
background-color: white;
.top-search {
// display: flex;
align-items: center;
margin-bottom: 8px;
.search-input {
width: 240px;
}
}
}
</style>

3
vue.config.js

@ -81,7 +81,8 @@ module.exports = {
},
[process.env.VUE_APP_BASE_API]: {
// target: "http://shuili-admin.product.dev.com:30115",
target: "http://shuili.product.dev.com:30115/",
// target: "http://shuili.product.dev.com:30115/",
target: 'http://172.16.34.80:18082/',
// target: 'http://172.16.32.62:18888/',
// target: "http://172.16.34.27:18082",
changeOrigin: true,

Loading…
Cancel
Save