You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
640 lines
18 KiB
640 lines
18 KiB
<template>
|
|
<div class="route-detail-page">
|
|
<el-form
|
|
ref="formRef"
|
|
label-position="top"
|
|
:model="formData"
|
|
:rules="rules"
|
|
label-width="120px"
|
|
>
|
|
<div class="form-row-title">水闸选择</div>
|
|
<div class="flex items-start">
|
|
<el-form-item label="选择水闸" prop="wagaName">
|
|
<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.wagaName"
|
|
placeholder="请选择水闸"
|
|
>
|
|
<el-option
|
|
v-for="item in dikeList"
|
|
:key="item.id"
|
|
:label="item.wagaName"
|
|
:value="item.wagaName"
|
|
></el-option>
|
|
</el-select>
|
|
</el-form-item>
|
|
<el-form-item label="水闸类型" prop="wagaType" class="ml-24">
|
|
<el-select
|
|
v-model="formData.wagaType"
|
|
:disabled="true"
|
|
class="w-240"
|
|
size="small"
|
|
placeholder="请选择"
|
|
>
|
|
<el-option
|
|
v-for="item in projectTypeOptions"
|
|
:key="item.dictValue"
|
|
:label="item.dictLabel"
|
|
:value="item.dictValue"
|
|
></el-option>
|
|
</el-select>
|
|
</el-form-item>
|
|
<el-form-item label="水闸巡查责任人" prop="dutyHolder" class="ml-24">
|
|
<el-input
|
|
class="w-240"
|
|
size="small"
|
|
v-model="formData.dutyHolder"
|
|
:disabled="true"
|
|
placeholder=""
|
|
></el-input>
|
|
</el-form-item>
|
|
</div>
|
|
<div class="form-row-title">巡查路线设置</div>
|
|
<div class="flex items-start">
|
|
<el-form-item label="巡查路线名称" prop="name">
|
|
<el-input
|
|
:disabled="!canEdit"
|
|
class="w-240"
|
|
size="small"
|
|
v-model="formData.name"
|
|
placeholder="请输入名称"
|
|
:maxlength="50"
|
|
></el-input>
|
|
</el-form-item>
|
|
<el-form-item label="巡查路线类型" prop="type" class="ml-24">
|
|
<el-select
|
|
:disabled="!canEdit"
|
|
class="w-240"
|
|
v-model="formData.type"
|
|
@change="handleChangeLineType"
|
|
>
|
|
<el-option
|
|
v-for="(item, index) in xcClassfyOptions"
|
|
:key="index"
|
|
:label="item.dictLabel"
|
|
:value="item.dictValue"
|
|
></el-option>
|
|
</el-select>
|
|
</el-form-item>
|
|
<el-form-item
|
|
label="巡查责任人类型"
|
|
prop="dutyHolderType"
|
|
class="ml-24"
|
|
>
|
|
<el-select
|
|
:disabled="!canEdit"
|
|
class="w-240"
|
|
v-model="formData.dutyHolderType"
|
|
>
|
|
<el-option label="巡查责任人" value="0"></el-option>
|
|
<el-option label="行政责任人" value="2"></el-option>
|
|
<el-option label="技术责任人" value="1"></el-option>
|
|
</el-select>
|
|
</el-form-item>
|
|
</div>
|
|
<div class="map-box">
|
|
<SyMixMap ref="syMapRef" :canEdit="canEdit" :entries="entries">
|
|
<div class="tool-box">
|
|
<div>
|
|
<div class="font-700 tc-text1 mb-12">路线标定</div>
|
|
<div class="flex flex-wrap">
|
|
<div
|
|
class="tool-item cursor-pointer"
|
|
:class="{ 'cursor-not-allowed': !canEdit }"
|
|
@click="handleDraw('billboard', 'pos_start.svg')"
|
|
>
|
|
<img
|
|
class="icon"
|
|
:src="`${baseUrl}icons/pos_start.svg`"
|
|
alt=""
|
|
/>
|
|
设定起点
|
|
</div>
|
|
<div
|
|
class="tool-item cursor-pointer"
|
|
:class="{ 'cursor-not-allowed': !canEdit }"
|
|
@click="handleDraw('billboard', 'pos_end.svg')"
|
|
>
|
|
<img
|
|
class="icon"
|
|
:src="`${baseUrl}icons/pos_end.svg`"
|
|
alt=""
|
|
/>
|
|
设定终点
|
|
</div>
|
|
<div
|
|
class="tool-item cursor-pointer"
|
|
:class="{ 'cursor-not-allowed': !canEdit }"
|
|
@click="handleDraw('polyline', '')"
|
|
>
|
|
<div class="line-path"></div>
|
|
路线方向
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="mt-12">
|
|
<el-form-item label="巡查项目选择" prop="xcName">
|
|
<el-select
|
|
class="w-full"
|
|
v-model="formData.xcName"
|
|
:disabled="!canEdit"
|
|
filterable
|
|
remote
|
|
reserve-keyword
|
|
@change="handleChangeXcItem"
|
|
@focus="handleGetRemoteProjectMethod('')"
|
|
placeholder="请输入关键词搜索"
|
|
:remote-method="handleGetRemoteProjectMethod"
|
|
>
|
|
<el-option
|
|
v-for="item in xcProjectList"
|
|
:key="item.id"
|
|
:label="item.name"
|
|
:value="item.name"
|
|
>
|
|
</el-option>
|
|
</el-select>
|
|
</el-form-item>
|
|
<div class="mt-8 tree-style">
|
|
<el-tree
|
|
:data="checkTreeData"
|
|
:default-expand-all="true"
|
|
ref="treeRef"
|
|
node-key="id"
|
|
:filter-node-method="filterNode"
|
|
:props="{
|
|
children: 'children',
|
|
label: 'value',
|
|
}"
|
|
>
|
|
</el-tree>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</SyMixMap>
|
|
</div>
|
|
</el-form>
|
|
</div>
|
|
</template>
|
|
<script>
|
|
import SyMixMap from "@/views/components/SyMixMap.vue";
|
|
import { postDFInspectionProjectList } from "@/api/management";
|
|
import {
|
|
getCheckingDictTree,
|
|
getProjectCheckingLineRouteDetails,
|
|
getInspectionProjectDetails,
|
|
getRunProjectList,
|
|
postProjectCheckingLineRoute,
|
|
putProjectCheckingLineRoute,
|
|
} from "@/api/sluice";
|
|
|
|
export default {
|
|
components: {
|
|
SyMixMap,
|
|
},
|
|
props: {
|
|
id: String,
|
|
canEdit: Boolean,
|
|
},
|
|
data() {
|
|
return {
|
|
baseUrl: process.env.BASE_URL,
|
|
formData: {
|
|
wagaName: "",
|
|
wagaCode: "",
|
|
wagaType: "",
|
|
name: "",
|
|
points: [],
|
|
status: "1",
|
|
type: "", //巡查路线类型
|
|
dutyHolder: "",
|
|
// entries: "",
|
|
xcId: "",
|
|
checkingDetail: {},
|
|
},
|
|
rules: {
|
|
wagaName: [
|
|
{ required: true, message: "请选择水闸", trigger: "change" },
|
|
],
|
|
name: [{ required: true, message: "请输入路线名称", trigger: "blur" }],
|
|
type: [
|
|
{ required: true, message: "请选择路线类型", trigger: "change" },
|
|
],
|
|
dutyHolderType: [
|
|
{ required: true, message: "请选择责任人类型", trigger: "change" },
|
|
],
|
|
xcName: [
|
|
{ required: true, message: "请选择巡查项目", trigger: "change" },
|
|
],
|
|
},
|
|
entries: {},
|
|
filterText: "",
|
|
xcProjectList: [],
|
|
projectTypeOptions: [],
|
|
xcClassfyOptions: [],
|
|
dikeList: [],
|
|
treeData: [],
|
|
checkTreeData: [],
|
|
};
|
|
},
|
|
watch: {
|
|
id: {
|
|
handler(val) {
|
|
if (val) {
|
|
getProjectCheckingLineRouteDetails(val).then((response) => {
|
|
this.formData = response.data;
|
|
this.dealXcProject(response.data.xcId);
|
|
this.entries =
|
|
response.data.entries && typeof response.data.entries === "string"
|
|
? JSON.parse(response.data.entries)
|
|
: [];
|
|
});
|
|
}
|
|
},
|
|
immediate: true,
|
|
},
|
|
filterText(val) {
|
|
this.$refs.treeRef?.filter(val);
|
|
},
|
|
},
|
|
created() {
|
|
getCheckingDictTree("df_xs_c_classfy").then((response) => {
|
|
this.treeData = this.transformArr(response.data);
|
|
});
|
|
this.getDicts("sluice_type").then((response) => {
|
|
this.projectTypeOptions = response.data;
|
|
});
|
|
this.getDicts("xs_classfy").then((response) => {
|
|
this.xcClassfyOptions = response.data;
|
|
});
|
|
},
|
|
mounted() {},
|
|
methods: {
|
|
handleDraw(type, iconName) {
|
|
if (!this.canEdit) return;
|
|
this.$refs.syMapRef.draw(type, iconName);
|
|
},
|
|
handleChangeDike() {
|
|
let res = this.dikeList.find(
|
|
(v) => v.wagaName === this.formData.wagaName
|
|
);
|
|
if (res) {
|
|
const { dikeStartLat, dikeStartLong } = res;
|
|
if (dikeStartLat && dikeStartLong) {
|
|
this.$refs.syMapRef.setMapCenter(dikeStartLong, dikeStartLat);
|
|
}
|
|
this.formData.wagaCode = res.wagaCode;
|
|
this.formData.wagaType = res.wagaType;
|
|
this.formData.wagaName = res.wagaName;
|
|
|
|
this.formData.dutyHolder = res.dutyHolders.find(
|
|
(v) => v.dutyHolderType === "0"
|
|
)?.name;
|
|
}
|
|
},
|
|
handleGetRemoteDikeMethod(query) {
|
|
getRunProjectList({
|
|
pageSize: 10,
|
|
pageNum: 1,
|
|
data: {
|
|
wagaName: query,
|
|
},
|
|
}).then((res) => {
|
|
if (res) {
|
|
this.dikeList = res.records;
|
|
}
|
|
});
|
|
},
|
|
handleGetRemoteProjectMethod(query) {
|
|
postDFInspectionProjectList({
|
|
data: {
|
|
timeView: {
|
|
timeField: "create_time",
|
|
},
|
|
type: this.formData.type || "",
|
|
},
|
|
cv: {
|
|
name: "name",
|
|
type: "like",
|
|
value: query,
|
|
},
|
|
pageSize: 10,
|
|
pageNum: 1,
|
|
}).then((res) => {
|
|
if (res) {
|
|
this.xcProjectList = res.records;
|
|
}
|
|
});
|
|
},
|
|
// 树转换
|
|
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 || "";
|
|
} else {
|
|
deepCalc(v, item.parts);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
treeList.forEach((item) => {
|
|
deepCalc(item);
|
|
});
|
|
return treeList;
|
|
},
|
|
|
|
// 获取巡查项目
|
|
dealXcProject(id) {
|
|
getInspectionProjectDetails(id).then((response) => {
|
|
this.formData.checkingDetail = response.data;
|
|
this.formData.xcName = response.data.name;
|
|
let _treeData = [];
|
|
// 处理三级节点,最多三级
|
|
for (let i = 0; i < response.data.items.length; i++) {
|
|
const item = response.data.items[i];
|
|
if (item.parts && item.parts[0]) {
|
|
// 一级节点处理
|
|
let exitTreeItem1 = _treeData.find((v) => v.key === item.parts[0]);
|
|
if (exitTreeItem1) {
|
|
let treeItem = this.treeData.find((v) => v.key === item.parts[0]);
|
|
// 已存在一级节点
|
|
if (item.parts[1]) {
|
|
let exitTreeItem2 = exitTreeItem1.children.find(
|
|
(v) => v.key === item.parts[1]
|
|
);
|
|
if (exitTreeItem2) {
|
|
let treeItem2 = treeItem.children.find(
|
|
(v) => v.key === item.parts[1]
|
|
);
|
|
// 已存在二级节点
|
|
if (item.parts[2]) {
|
|
let exitTreeItem3 = exitTreeItem2.children.find(
|
|
(v) => v.key === item.parts[2]
|
|
);
|
|
if (!exitTreeItem3) {
|
|
let _treeItem3 = treeItem2.children.find(
|
|
(v) => v.key === item.parts[2]
|
|
);
|
|
exitTreeItem2.children.push({
|
|
key: _treeItem3.key,
|
|
value: _treeItem3.value,
|
|
children: [],
|
|
});
|
|
}
|
|
}
|
|
} else {
|
|
// 不存在二级节点
|
|
let _treeItem2 = treeItem.children.find(
|
|
(v) => v.key === item.parts[1]
|
|
);
|
|
exitTreeItem1.children.push({
|
|
key: _treeItem2.key,
|
|
value: _treeItem2.value,
|
|
children: [],
|
|
});
|
|
}
|
|
}
|
|
} else {
|
|
// 不存在一级节点
|
|
let treeItem = this.treeData.find((v) => v.key === item.parts[0]);
|
|
if (treeItem) {
|
|
let _treeItem1 = {
|
|
key: treeItem.key,
|
|
value: treeItem.value,
|
|
children: [],
|
|
};
|
|
_treeData.push(_treeItem1);
|
|
if (item.parts[1]) {
|
|
let treeItem2 = treeItem.children.find(
|
|
(v) => v.key === item.parts[1]
|
|
);
|
|
if (treeItem2) {
|
|
let _treeItem2 = {
|
|
key: treeItem2.key,
|
|
value: treeItem2.value,
|
|
children: [],
|
|
};
|
|
_treeItem1.children.push(_treeItem2);
|
|
if (item.parts[2]) {
|
|
let treeItem3 = treeItem2.children.find(
|
|
(v) => v.key === item.parts[2]
|
|
);
|
|
if (treeItem3) {
|
|
let _treeItem3 = {
|
|
key: treeItem3.key,
|
|
value: treeItem3.value,
|
|
children: [],
|
|
};
|
|
_treeItem2.children.push(_treeItem3);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
this.checkTreeData = _treeData;
|
|
});
|
|
},
|
|
// 修改路线类型
|
|
handleChangeLineType() {
|
|
if (this.formData.xcId) {
|
|
this.formData.xcName = "";
|
|
this.formData.xcId = "";
|
|
this.xcProjectList = [];
|
|
this.checkTreeData = [];
|
|
}
|
|
},
|
|
handleChangeXcItem(val) {
|
|
const res = this.xcProjectList.find((item) => item.name === val);
|
|
if (res.id) {
|
|
this.formData.xcId = res.id;
|
|
this.dealXcProject(res.id);
|
|
}
|
|
},
|
|
handleAddNewPlan() {
|
|
this.formData.planList.push({
|
|
planDateTimeArr: [],
|
|
xcUsers: [],
|
|
scScope: "",
|
|
});
|
|
},
|
|
handleDelPlanItem(index) {
|
|
this.formData.planList.splice(index, 1);
|
|
},
|
|
filterNode(value, data) {
|
|
if (!value) return true;
|
|
return data.label.indexOf(value) !== -1;
|
|
},
|
|
submit(reset) {
|
|
return new Promise((r, j) => {
|
|
this.$refs.formRef.validate((valid) => {
|
|
if (valid) {
|
|
this.$confirm("确认提交吗?", "提示", {
|
|
confirmButtonText: "确定",
|
|
cancelButtonText: "取消",
|
|
type: "warning",
|
|
})
|
|
.then(() => {
|
|
let entries = this.$refs.syMapRef.submit();
|
|
(this.id
|
|
? putProjectCheckingLineRoute
|
|
: postProjectCheckingLineRoute)({
|
|
id: this.id || null,
|
|
...this.formData,
|
|
entries: JSON.stringify(entries),
|
|
})
|
|
.then((res) => {
|
|
this.$message.success("提交成功");
|
|
if (reset) {
|
|
this.reset();
|
|
}
|
|
r();
|
|
})
|
|
.catch(() => {
|
|
j();
|
|
});
|
|
})
|
|
.catch(() => {
|
|
j();
|
|
});
|
|
} else {
|
|
j();
|
|
}
|
|
});
|
|
});
|
|
},
|
|
reset() {
|
|
this.$refs.formRef.resetFields();
|
|
this.$refs.syMapRef.reset();
|
|
this.checkTreeData = [];
|
|
this.formData.xcName = "";
|
|
this.formData.xcId = "";
|
|
},
|
|
},
|
|
};
|
|
</script>
|
|
<style scoped lang="scss">
|
|
.route-detail-page {
|
|
font-size: 14px;
|
|
width: 100%;
|
|
max-width: 1232px;
|
|
padding: 16px;
|
|
padding-bottom: 78px;
|
|
border-radius: 6px;
|
|
.form-row-title {
|
|
font-size: 16px;
|
|
font-weight: bold;
|
|
margin-bottom: 10px;
|
|
border-left: 4px solid #36b29e;
|
|
padding-left: 8px;
|
|
}
|
|
.w-100 {
|
|
width: 100px !important;
|
|
}
|
|
.w-240 {
|
|
width: 240px !important;
|
|
}
|
|
|
|
.plan-list-item {
|
|
position: relative;
|
|
border: 1px solid #ebeef5;
|
|
border-radius: 4px;
|
|
padding: 16px;
|
|
margin-top: 16px;
|
|
}
|
|
|
|
.del-btn {
|
|
position: absolute;
|
|
cursor: pointer;
|
|
z-index: 1;
|
|
width: 18px;
|
|
top: 8px;
|
|
right: 8px;
|
|
font-size: 18px;
|
|
}
|
|
|
|
.map-box {
|
|
position: relative;
|
|
width: 100%;
|
|
height: 610px;
|
|
padding: 12px;
|
|
background: #f4f4f4;
|
|
border-radius: 6px;
|
|
#routeCesiumContainer {
|
|
position: relative;
|
|
width: 100%;
|
|
height: 100%;
|
|
}
|
|
.tool-box {
|
|
position: absolute;
|
|
z-index: 1;
|
|
top: 15px;
|
|
left: 15px;
|
|
background-color: #fff;
|
|
padding: 12px 16px;
|
|
box-sizing: border-box;
|
|
height: 534px;
|
|
width: 224px;
|
|
border-radius: 6px;
|
|
.tool-item {
|
|
width: 86px;
|
|
height: 26px;
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
border-radius: 4px;
|
|
border: 1px solid #dcdcdc;
|
|
margin-right: 16px;
|
|
margin-bottom: 16px;
|
|
.line-path {
|
|
width: 16px;
|
|
height: 6px;
|
|
background: #36b29e;
|
|
}
|
|
.icon {
|
|
width: 16px;
|
|
height: 16px;
|
|
margin-right: 6px;
|
|
}
|
|
|
|
&:nth-child(even) {
|
|
margin-right: 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
.tree-style {
|
|
height: 280px;
|
|
width: 100%;
|
|
overflow: auto;
|
|
}
|
|
|
|
.position-box {
|
|
position: absolute;
|
|
top: 2px;
|
|
right: 2px;
|
|
padding: 6px 12px;
|
|
background: rgba($color: #000000, $alpha: 0.4);
|
|
color: #fff;
|
|
border-radius: 4px;
|
|
}
|
|
}
|
|
}
|
|
</style>
|
|
|