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.
410 lines
11 KiB
410 lines
11 KiB
<template>
|
|
<div class="slider-right">
|
|
<div class="top-title">基础信息管理</div>
|
|
<div class="table-box">
|
|
<div class="top-box">
|
|
<span>巡视检查名称:</span>
|
|
<el-input
|
|
v-model="formData.name"
|
|
size="small"
|
|
class="search-input"
|
|
placeholder="请输入巡视检查名称"
|
|
></el-input>
|
|
<span>巡检类型:</span>
|
|
<el-select 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>
|
|
</div>
|
|
|
|
<div class="xc-form-table">
|
|
<el-row class="flex l-t-border">
|
|
<div
|
|
class="w-240 flex-shrink-0 flex justify-center items-center r-b-border p-4"
|
|
>
|
|
<div>工程部位</div>
|
|
</div>
|
|
<div class="flex flex-1 w-full">
|
|
<div class="flex-1 flex justify-center items-center r-b-border">
|
|
<div>检查内容</div>
|
|
</div>
|
|
<div class="w-120 flex justify-center items-center r-b-border">
|
|
<div>是否检查项</div>
|
|
</div>
|
|
</div>
|
|
</el-row>
|
|
<el-row
|
|
v-for="(item, index) in xcTreeData"
|
|
:key="item.key"
|
|
class="flex font-12"
|
|
>
|
|
<el-col>
|
|
<div class="flex w-full l-t-border">
|
|
<div
|
|
class="flex items-center p-4 r-b-border"
|
|
:class="{
|
|
'w-240 flex-shrink-0': !item.children.length,
|
|
'w-80 flex-shrink-0': item.children.length,
|
|
}"
|
|
>
|
|
{{ index + 1 }},{{ item.value }}
|
|
</div>
|
|
<div v-if="item.children.length" class="flex flex-1 flex-col">
|
|
<div
|
|
class="flex flex-1"
|
|
v-for="item2 in item.children"
|
|
:key="item2.key"
|
|
>
|
|
<div
|
|
class="flex items-center p-4 r-b-border"
|
|
:class="{
|
|
'w-80 flex-shrink-0': item2.children.length,
|
|
'w-160 flex-shrink-0': !item2.children.length,
|
|
}"
|
|
>
|
|
{{ item2.value }}
|
|
</div>
|
|
<div
|
|
v-if="item2.children.length"
|
|
class="flex flex-1 flex-col"
|
|
>
|
|
<div
|
|
class="flex"
|
|
v-for="item3 in item2.children"
|
|
:key="item3.key"
|
|
>
|
|
<div
|
|
class="flex items-center p-4 r-b-border w-80 flex-shrink-0"
|
|
>
|
|
{{ item3.value }}
|
|
</div>
|
|
<!-- 三级项目的问题 -->
|
|
<div class="flex flex-1 items-center">
|
|
<div
|
|
class="flex flex-1 items-center p-4 r-b-border h-full"
|
|
>
|
|
<el-input
|
|
:disabled="!item3.check"
|
|
v-model="item3.content"
|
|
type="textarea"
|
|
:rows="1"
|
|
:maxlength="500"
|
|
placeholder="请输入检查内容"
|
|
></el-input>
|
|
</div>
|
|
<div
|
|
class="w-120 flex justify-center items-center p-4 r-b-border h-full"
|
|
>
|
|
<el-radio-group
|
|
class="inspection-radio-group"
|
|
v-model="item3.check"
|
|
>
|
|
<el-radio :label="true">是</el-radio>
|
|
<el-radio :label="false">否</el-radio>
|
|
</el-radio-group>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!-- 两级项目的问题 -->
|
|
<div v-else class="flex flex-1 items-center">
|
|
<div class="flex-1 flex items-center p-4 r-b-border h-full">
|
|
<el-input
|
|
:disabled="!item2.check"
|
|
v-model="item2.content"
|
|
type="textarea"
|
|
:rows="1"
|
|
:maxlength="500"
|
|
placeholder="请输入检查内容"
|
|
></el-input>
|
|
</div>
|
|
<div
|
|
class="w-120 flex justify-center items-center p-4 r-b-border h-full"
|
|
>
|
|
<el-radio-group
|
|
class="inspection-radio-group"
|
|
v-model="item2.check"
|
|
>
|
|
<el-radio :label="true">是</el-radio>
|
|
<el-radio :label="false">否</el-radio>
|
|
</el-radio-group>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!-- 只有一级项目的问题 -->
|
|
<div v-else class="flex flex-1 items-center">
|
|
<div class="flex-1 flex items-center p-4 r-b-border h-full">
|
|
<el-input
|
|
:disabled="!item.check"
|
|
v-model="item.content"
|
|
type="textarea"
|
|
:rows="1"
|
|
:maxlength="500"
|
|
placeholder="请输入检查内容"
|
|
></el-input>
|
|
</div>
|
|
<div
|
|
class="w-120 flex justify-center items-center p-4 r-b-border h-full"
|
|
>
|
|
<el-radio-group
|
|
class="inspection-radio-group"
|
|
v-model="item.check"
|
|
>
|
|
<el-radio :label="true">是</el-radio>
|
|
<el-radio :label="false">否</el-radio>
|
|
</el-radio-group>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</el-col>
|
|
</el-row>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="bottom-btns">
|
|
<el-button type="primary" @click="handleSave">保存</el-button>
|
|
<el-button @click="$router.go(-1)">返回</el-button>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
<script>
|
|
import { intersection } from "lodash";
|
|
import {
|
|
putInspectionProjectData,
|
|
postInspectionProjectData,
|
|
getCheckingDictTree,
|
|
getInspectionProjectDetails,
|
|
} from "@/api/sluice";
|
|
|
|
export default {
|
|
data() {
|
|
return {
|
|
xcTreeData: [],
|
|
xcTypeOptions: [],
|
|
formData: {
|
|
id: null,
|
|
name: "",
|
|
type: "",
|
|
items: [],
|
|
},
|
|
};
|
|
},
|
|
created() {
|
|
// 获取巡查类型
|
|
this.getDicts("xs_classfy").then((res) => {
|
|
if (res.data && Array.isArray(res.data)) {
|
|
this.xcTypeOptions = res.data;
|
|
}
|
|
});
|
|
},
|
|
methods: {
|
|
// 获取详情信息
|
|
async getDetailsData() {
|
|
const dictData = await getCheckingDictTree("sz_xs_c_classfy");
|
|
let _xcTreeData = this.transformArr(dictData?.data);
|
|
|
|
if (this.$route.query.id) {
|
|
const detailData = await getInspectionProjectDetails(
|
|
this.$route.query.id
|
|
);
|
|
if (detailData?.data?.items) {
|
|
// 匹配xcTreeData
|
|
this.formData.name = detailData.data.name;
|
|
this.formData.type = detailData.data.type;
|
|
this.matchXcTreeData(_xcTreeData, detailData.data.items);
|
|
}
|
|
}
|
|
this.xcTreeData = _xcTreeData;
|
|
},
|
|
// 树转换
|
|
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];
|
|
} else {
|
|
deepCalc(v, item.parts);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
treeList.forEach((item) => {
|
|
deepCalc(item);
|
|
});
|
|
return treeList;
|
|
},
|
|
// 匹配xcTreeData
|
|
matchXcTreeData(treeData, dataList) {
|
|
treeData.forEach((v) => {
|
|
if (!v.children?.length) {
|
|
for (let i = 0; i < dataList.length; i++) {
|
|
const item = dataList[i];
|
|
v.id = item.id;
|
|
if (intersection(v.parts, item.parts).length === v.parts.length) {
|
|
// 证明匹配成功
|
|
v.content = item.content || "";
|
|
v.check = true;
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
this.matchXcTreeData(v.children, dataList);
|
|
}
|
|
});
|
|
},
|
|
|
|
// 获取xcTreeData中的check为true的数据
|
|
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;
|
|
},
|
|
|
|
// 保存
|
|
handleSave() {
|
|
if (!this.formData.name) {
|
|
this.$message.error("请输入巡视检查名称");
|
|
return;
|
|
}
|
|
if (!this.formData.type) {
|
|
this.$message.error("请选择巡检类型");
|
|
return;
|
|
}
|
|
this.formData.items = this.getCheckData(this.xcTreeData);
|
|
|
|
if (this.$route.query.id) {
|
|
this.formData.id = this.$route.query.id;
|
|
}
|
|
|
|
if (this.formData.id){
|
|
putInspectionProjectData(this.formData).then(() => {
|
|
this.$message.success("保存成功");
|
|
});
|
|
}else {
|
|
postInspectionProjectData(this.formData).then((res) => {
|
|
if (res.data?.id) {
|
|
this.formData.id = res.data.id;
|
|
}
|
|
this.$message.success("保存成功");
|
|
});
|
|
}
|
|
|
|
},
|
|
},
|
|
mounted() {
|
|
this.getDetailsData();
|
|
},
|
|
};
|
|
</script>
|
|
<style scoped lang="scss">
|
|
.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;
|
|
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>
|
|
|