Browse Source

辖段管理完成

wangqin
Joe 1 year ago
parent
commit
030c6b5238
  1. 4
      ruoyi-ui/src/views/JiHeExpressway/components/FormConfig/components/MultipleLabelItem.vue
  2. 25
      ruoyi-ui/src/views/JiHeExpressway/components/FormConfig/index.vue
  3. 4
      ruoyi-ui/src/views/JiHeExpressway/components/FormConfig/utils/defaultValue.js
  4. 8
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/emergencyAgencies/components/AddNEditDialog.vue
  5. 8
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/firstResponders/components/AddNEditDialog.vue
  6. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/firstResponders/index.vue
  7. 243
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/jurisdictionalManagement/components/AddDialog.vue
  8. 156
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/jurisdictionalManagement/components/AddNEditDialog.vue
  9. 126
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/jurisdictionalManagement/data.js
  10. 46
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/jurisdictionalManagement/index.vue
  11. 27
      ruoyi-ui/src/views/JiHeExpressway/scss/el-reset.scss
  12. 2
      ruoyi-ui/src/views/JiHeExpressway/utils/enum.js
  13. 41
      ruoyi-ui/src/views/JiHeExpressway/utils/index.js

4
ruoyi-ui/src/views/JiHeExpressway/components/FormConfig/components/MultipleLabelItem.vue

@ -3,8 +3,7 @@
<div v-for="(item, index) in options" :key="`${item.key}|${index}`" class="item">
<span v-if="item.prefix" class="prefix" :style="item.prefix.style">{{ item.prefix.text }}</span>
<!-- <component class="unknown" :is="getComponent(item.type)" v-bind="getBindData(item)" v-model="data[item.key]" /> -->
<ElFormItem :prop="item.key"
:rules="getRules({ ...item, label: item.label || _config.label, required: _config.required })">
<ElFormItem :rules="getRules({ ...item, label: item.label || _config.label, required: _config.required })">
<ProxyCom class="unknown" :value="getValue(item)" :item="item" @update:value="data => updateValue(item, data)" />
</ElFormItem>
@ -51,6 +50,7 @@ export default {
.item {
display: flex;
gap: 6px;
flex: 1;
.suffix {}

25
ruoyi-ui/src/views/JiHeExpressway/components/FormConfig/index.vue

@ -64,6 +64,18 @@ export default {
type: Object,
default: () => { }
},
/**
* {
* label: String;
* key: String;
* type: 'input' | 'timePicker',
* gridArea?: "",
* gridColumn?: "",
* gridRow?: "",
* options?: {}
* }[]
*/
value: Object,
formList: {
type: Array,
default: () => []
@ -79,8 +91,7 @@ export default {
column: {
type: [String, Number],
default: "3"
},
value: Object
}
},
model: {
prop: 'value',
@ -97,13 +108,10 @@ export default {
handler() {
this.reset(true);
}
},
}
},
created() {
this.reset(true);
if (this.dFormData) {
this.modelFormData = this.dFormData;
}
},
computed: {
modelFormData: {
@ -143,7 +151,7 @@ export default {
this.modelFormData = { ...pathSet(this.modelFormData, item.key, data) }
},
reset(isFirst) {
return this.modelFormData = reduceDefaultValue(this.formList, isFirst ? this.value : {});
return this.modelFormData = reduceDefaultValue(this.formList, isFirst ? this.value || this.dFormData : {});
},
getStyle() {
return {
@ -206,7 +214,7 @@ export default {
validator: (_, __, callback) => {
const value = pathGet(this.modelFormData, item.key)
if (!value && typeof value === 'object' || typeof value === 'string' && !value.trim()) return callback(new Error(`${item.options?.placeholder || `${item.label}不能为空`}`))
if (!value && typeof value != 'number' || typeof value === 'string' && !value.trim()) return callback(new Error(`${item.options?.placeholder || `${item.label}不能为空`}`))
const err = ruleMatch(value);
@ -283,6 +291,7 @@ export default {
align-items: center;
margin: 0;
height: 100%;
width: 100%;
&:first-child {
.el-form-item__label-wrap {

4
ruoyi-ui/src/views/JiHeExpressway/components/FormConfig/utils/defaultValue.js

@ -21,8 +21,6 @@ export const presetDefaultValue = {
};
export function getDefaultValue(item, data) {
if (data && typeof data !== "object") return data;
if (item.hasOwnProperty("default")) return item.default;
const getValue = presetDefaultValue[resolveName(item.type)];
@ -41,7 +39,7 @@ export function reduceDefaultValue(formList, data, total = {}) {
pathSet(
prev,
cur.key,
getDefaultValue(cur, pathGet(data || {}, cur.key))
pathGet(data || {}, cur.key) ?? getDefaultValue(cur)
);
// prev[cur.key] = getDefaultValue(cur, pathGet(data || {}, cur.key));

8
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/emergencyAgencies/components/AddNEditDialog.vue

@ -1,6 +1,6 @@
<template>
<Dialog v-model="modelVisible" :title="data ? '编辑' : '新增'">
<div class='DeviceControlDialog'>
<Dialog v-model="modelVisible" :title="data ? '修改' : '新增'">
<div class='AddNEditDialog'>
<Form v-model="formData" class="form" ref="FormConfigRef" :formList="formList" column="1" labelWidth="90px" />
</div>
@ -28,7 +28,7 @@ import { cloneDeep, merge } from 'lodash';
import { getSelectOptionsStation } from "@screen/pages/control/event/businessDataManagement/utils.js";
export default {
name: 'DeviceControlDialog',
name: 'AddNEditDialog',
components: {
Dialog,
Button,
@ -231,7 +231,7 @@ export default {
</script>
<style lang='scss' scoped>
.DeviceControlDialog {
.AddNEditDialog {
width: 450px;
display: flex;
flex-direction: column;

8
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/firstResponders/components/AddNEditDialog.vue

@ -1,6 +1,6 @@
<template>
<Dialog v-model="modelVisible" :title="data ? '编辑' : '新增'">
<div class='DeviceControlDialog'>
<Dialog v-model="modelVisible" :title="data ? '修改' : '新增'">
<div class='AddNEditDialog'>
<Form v-model="formData" class="form" ref="FormConfigRef" :formList="formList" column="1" labelWidth="90px" />
</div>
@ -25,7 +25,7 @@ import { getSelectOptionsStation } from "@screen/pages/control/event/businessDat
import { Message } from "element-ui";
export default {
name: 'DeviceControlDialog',
name: 'AddNEditDialog',
components: {
Dialog,
Button,
@ -170,7 +170,7 @@ export default {
</script>
<style lang='scss' scoped>
.DeviceControlDialog {
.AddNEditDialog {
width: 450px;
height: 150px;
display: flex;

2
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/firstResponders/index.vue

@ -114,8 +114,8 @@ export default {
label: item.postName,
}))
}
if (organization.status === 'fulfilled' && Array.isArray(organization.value)) {
console.log("%c [ organization ]-119-「index.vue」", "font-size:15px; background:#317507; color:#75b94b;", organization);
this.searchFormList[1].options.options = organization.value;
}
})

243
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/jurisdictionalManagement/components/AddDialog.vue

@ -1,243 +0,0 @@
<template>
<Dialog v-model="modelVisible" :title="data ? '编辑' : '新增'">
<div class='DeviceControlDialog'>
<Form v-model="formData" class="form" ref="FormConfigRef" :formList="formList" column="1" labelWidth="90px" />
</div>
<template #footer>
<Button style="background-color: rgba(0, 179, 204, .3);" @click.native="modelVisible = false, submitting = false">
取消
</Button>
<Button @click.native="handleSubmit" :loading="submitting">
确定
</Button>
</template>
</Dialog>
</template>
<script>
import Dialog from "@screen/components/Dialog/index.vue";
import Button from "@screen/components/Buttons/Button.vue"
import Form from '@screen/components/FormConfig';
import * as PresetFormItems from "@screen/pages/control/event/event/FormEvent/PresetFormItems.js";
import request from "@/utils/request";
import { CameraDirectionEnumList } from "@screen/utils/enum.js"
import { Message } from "element-ui";
import { cloneDeep, merge } from 'lodash';
import { getSelectOptionsStation } from "@screen/pages/control/event/businessDataManagement/utils.js";
export default {
name: 'DeviceControlDialog',
components: {
Dialog,
Button,
Form
},
model: {
prop: 'visible',
event: "update:value"
},
props: {
visible: Boolean,
data: Object
},
inject: ['setCurrentPage'],
data() {
return {
submitting: false,
formData: {},
formList: [
{
label: "父级:",
key: "parentId",
type: 'select',
options: {
clearable: true,
options: []
}
},
{
label: "机构类型:",
key: "organizationType",
required: true,
type: 'select',
ons: {
change: (value, { data }) => {
if (value == 1) {
data.parentId = null;
}
this.formList[0].options.options.forEach((item, index) => {
item.disabled = value == 1
})
}
},
options: {
options: [
{
key: 1,
label: "路管中心"
},
{
key: 2,
label: "驻点"
},
]
}
},
{
label: "机构名称:",
key: "organizationName",
required: true
},
{
label: "方向:",
key: "direction",
required: true,
type: 'select',
options: {
options: CameraDirectionEnumList,
}
},
{
label: "地址:",
key: "organizationAddress",
},
merge(cloneDeep(PresetFormItems.station), {
required: false,
options: {
options: [
{
rules: [
{
message: "请补全桩号",
callback(value, data) {
if (!value?.trim() && data.stakeMark[1]?.trim()) return false
else return true
}
}
]
},
{
rules: [
{
message: "请补全桩号",
callback(value, data) {
if (!value?.trim() && data.stakeMark[0]?.trim()) return false
else return true
}
}
]
},
]
}
}),
{
label: "救援单位:",
key: "rescueUnit"
},
{
label: "描述:",
key: "description",
isAlone: true,
options: {
type: "textarea",
autosize: true,
maxlength: 150,
autosize: { minRows: 6, maxRows: 6 },
showWordLimit: true,
},
}
]
}
},
computed: {
modelVisible: {
get() {
return this.visible
},
set(val) {
this.$emit('update:value', val)
}
}
},
watch: {
modelVisible: {
immediate: true,
handler(bool) {
if (!bool) return;
if (this.data) {
this.formData =
{
"parentId": this.data.dcOrganizations.parentId,
"organizationType": this.data.dcOrganizations.organizationType,
"organizationName": this.data.dcOrganizations.organizationName,
"direction": this.data.dcOrganizations.direction,
"organizationAddress": this.data.dcOrganizations.organizationAddress,
"stakeMark": [...(this.data.dcOrganizations.stakeMark || "").match(/[0-9]+/g)],
"rescueUnit": this.data.dcOrganizations.rescueUnit,
"description": this.data.dcOrganizations.description
}
}
this.getOptions();
}
}
},
methods: {
async getOptions() {
const result = await getSelectOptionsStation(1)
this.formList[0].options.options = result || [];
},
handleSubmit() {
this.$refs.FormConfigRef.validate()
.then((data) => {
this.submitting = true;
if (this.data) data.id = this.data.dcOrganizations.id;
if (typeof data.parentId != 'number') data.parentId = 0;
if (data.stakeMark[0]) data.stakeMark = `K${data.stakeMark[0]}+${data.stakeMark[1]}`;
request({
url: `/business/organization`,
method: this.data ? 'PUT' : 'POST',
data
})
.then(result => {
if (result.code != 200) return Message.error(`提交失败!`);
Message.success(`提交成功!`);
this.modelVisible = false;
this.setCurrentPage(1)
})
.catch((err) => {
console.log("%c [ err ]-110-「DeviceControlDialog.vue」", "font-size:15px; background:#547bf2; color:#98bfff;", err);
Message.error(`提交失败!`);
})
.finally(() => {
this.submitting = false;
})
})
}
},
}
</script>
<style lang='scss' scoped>
.DeviceControlDialog {
width: 450px;
display: flex;
flex-direction: column;
gap: 15px;
.tips {
font-size: 12px;
}
}
</style>

156
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/jurisdictionalManagement/components/AddNEditDialog.vue

@ -0,0 +1,156 @@
<template>
<Dialog v-model="modelVisible" :title="data ? '修改' : '新增'">
<div class='AddNEditDialog'>
<Form :value="formData" class="form" ref="FormConfigRef" :formList="formList" column="1" labelWidth="120px" />
</div>
<template #footer>
<Button style="background-color: rgba(0, 179, 204, .3);" @click.native="modelVisible = false, submitting = false">
取消
</Button>
<Button @click.native="handleSubmit" :loading="submitting">
确定
</Button>
</template>
</Dialog>
</template>
<script>
import Dialog from "@screen/components/Dialog/index.vue";
import Button from "@screen/components/Buttons/Button.vue"
import Form from '@screen/components/FormConfig';
import request from "@/utils/request";
import { Message } from "element-ui";
import { addEditFormList } from "./../data"
import { stakeMarkToArray, findPathIdByTreeId } from "@screen/utils/index.js"
export default {
name: 'AddNEditDialog',
components: {
Dialog,
Button,
Form
},
model: {
prop: 'visible',
event: "update:value"
},
props: {
visible: Boolean,
data: Object
},
inject: ['setCurrentPage'],
data() {
return {
submitting: false,
formData: {},
formList: addEditFormList
}
},
computed: {
modelVisible: {
get() {
return this.visible
},
set(val) {
this.$emit('update:value', val)
}
}
},
watch: {
modelVisible: {
immediate: true,
handler(bool) {
if (!bool) return;
if (this.data) {
this.formData = {
...this.data,
deptId: [],
endStakeMark: stakeMarkToArray(this.data.endStakeMark),
startStakeMark: stakeMarkToArray(this.data.startStakeMark),
}
}
this.getSelectOptions();
}
}
},
methods: {
getSelectOptions() {
Promise.allSettled([
request({
url: `/system/dept/treeselect`,
method: "GET",
}),
request({
url: `/business/roadSection/roadList`,
method: "POST",
data: {}
}),
])
.then(([departmentData, roadData]) => {
if (departmentData.status != 'rejected' && departmentData.value.code == 200) {
this.formList[0].options.options = departmentData.value.data;
this.formData.deptId = findPathIdByTreeId(departmentData.value.data, this.data.deptId);
this.$refs.FormConfigRef.reset(true)
}
if (roadData.status != 'rejected' && roadData.value.code == 200) {
this.formList[1].options.options = roadData.value.data.map(item => ({ key: item.id, label: item.roadName }));
}
});
},
handleSubmit() {
this.$refs.FormConfigRef.validate()
.then((data) => {
this.submitting = true;
if (data.startStakeMark?.[0]) data.startStakeMark = `K${data.startStakeMark[0]}+${data.startStakeMark[1]}`;
if (data.endStakeMark?.[0]) data.endStakeMark = `K${data.endStakeMark[0]}+${data.endStakeMark[1]}`;
if (data.deptId) data.deptId = data.deptId.slice(-1)[0];
if (this.data) data.id = this.data.id;
request({
url: `/business/roadSection`,
method: this.data ? 'PUT' : 'POST',
data
})
.then(result => {
if (result.code != 200) return Message.error(`提交失败!`);
Message.success(`提交成功!`);
this.modelVisible = false;
this.setCurrentPage(1)
})
.catch((err) => {
console.log("%c [ err ]-110-「DeviceControlDialog.vue」", "font-size:15px; background:#547bf2; color:#98bfff;", err);
Message.error(`提交失败!`);
})
.finally(() => {
this.submitting = false;
})
})
}
},
}
</script>
<style lang='scss' scoped>
.AddNEditDialog {
width: 450px;
display: flex;
flex-direction: column;
gap: 15px;
.tips {
font-size: 12px;
}
}
</style>

126
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/jurisdictionalManagement/data.js

@ -1,4 +1,5 @@
// import * as PresetFormItems from "@screen/pages/control/event/event/FormEvent/PresetFormItems.js";
import { cloneDeep, merge } from "lodash";
import * as PresetFormItems from "@screen/pages/control/event/event/FormEvent/PresetFormItems.js";
export const searchFormList = [
// {
@ -20,3 +21,126 @@ export const searchFormList = [
// },
// },
];
export const addEditFormList = [
{
label: "部门:",
key: "deptId",
type: "cascader",
required: true,
options: {
props: {
value: "id",
},
filterable: true,
options: [],
showAllLevels: false,
},
},
{
label: "路线:",
key: "roadId",
required: true,
type: "select",
options: {
options: [],
},
},
{
label: "辖区路段名称:",
key: "sectionName",
required: true,
},
merge(cloneDeep(PresetFormItems.station), {
required: false,
label: "起始桩号:",
options: {
options: [
{
rules: [
{
message: "请补全桩号",
callback(value, data) {
if (!value?.trim() && data.startStakeMark[1]?.trim())
return false;
else return true;
},
},
],
key: "startStakeMark[0]",
},
{
rules: [
{
message: "请补全桩号",
callback(value, data) {
if (!value?.trim() && data.startStakeMark[0]?.trim())
return false;
else return true;
},
},
],
key: "startStakeMark[1]",
},
],
},
}),
merge(cloneDeep(PresetFormItems.station), {
required: false,
label: "结束桩号:",
options: {
options: [
{
rules: [
{
message: "请补全桩号",
callback(value, data) {
if (!value?.trim() && data.endStakeMark[1]?.trim())
return false;
else return true;
},
},
],
key: "endStakeMark[0]",
},
{
rules: [
{
message: "请补全桩号",
callback(value, data) {
if (!value?.trim() && data.endStakeMark[0]?.trim())
return false;
else return true;
},
},
],
key: "endStakeMark[1]",
},
],
},
}),
{
label: "辖区路段编号:",
key: "roadCode",
},
{
label: "里程:",
type: "MultipleLabelItem",
options: {
options: [
{
suffix: {
text: "千米",
style: {
color: "#3DE8FF",
},
},
type: "InputNumber",
key: "mileage",
},
],
},
},
];

46
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/jurisdictionalManagement/index.vue

@ -2,7 +2,7 @@
<div class='JurisdictionalManagement'>
<div class="filter">
<div>
<ButtonGradient @click.native="editEventInformationDialogVisible = true">
<ButtonGradient @click.native="handleAddEdit(true)">
<template #prefix>
<img src="@screen/images/insert.svg" />
</template>
@ -44,23 +44,33 @@
</span>
</div>
</template>
<template #button>
<Button @click.native="() => handleAddEdit(true, item)">
修改
</Button>
<Button style="background-color: #FF5F5F;" @click.native="handleDelete(item)">
删除
</Button>
</template>
</Card>
</template>
</div>
<AddDialog v-model="editEventInformationDialogVisible" />
<AddNEditDialog v-model="editEventInformationDialogVisible" :data="dialogData" />
</div>
</template>
<script>
import Card from "@screen/components/Card1/index.vue"
import AddDialog from "./components/AddDialog.vue"
import AddNEditDialog from "./components/AddNEditDialog.vue"
import InputSearch from '@screen/components/InputSearch/index.vue';
import ButtonGradient from '@screen/components/Buttons/ButtonGradient.vue';
import Button from '@screen/components/Buttons/Button.vue';
import { searchFormList } from "./data";
import request from "@/utils/request";
import { setLoading } from "@screen/utils/index.js"
import { delay, exportFile } from "@screen/utils/common";
import { delay, exportFile, confirm } from "@screen/utils/common";
import { Message } from "element-ui";
//
export default {
@ -68,7 +78,9 @@ export default {
components: {
Card,
ButtonGradient,
InputSearch
InputSearch,
AddNEditDialog,
Button
},
inject: ['getPagination', 'setTotal'],
data() {
@ -105,6 +117,7 @@ export default {
// })()
// })),
data: [],
dialogData: null,
editEventInformationDialogVisible: false
}
},
@ -113,6 +126,29 @@ export default {
// this.getSearchOptions();
},
methods: {
async handleDelete(data) {
await confirm({ message: "是否要删除该辖段信息?" });
request({
url: `/business/roadSection/${data.id}`,
method: "DELETE",
data: {}
})
.then(result => {
if (result.code != 200) return Message.error("删除失败");
this.setCurrentPage(1)
Message.success("删除成功")
})
.catch(() => {
Message.error("删除失败")
})
},
handleAddEdit(bool, data) {
this.editEventInformationDialogVisible = bool
this.dialogData = data
},
handleExport() {
exportFile({
url: "/business/roadSection/export",

27
ruoyi-ui/src/views/JiHeExpressway/scss/el-reset.scss

@ -555,3 +555,30 @@ div.el-popper.global-input-search-popover {
}
}
}
div.el-popper.el-cascader__dropdown {
background: #1a3442;
.el-cascader-panel {
.el-cascader-menu {
color: #fff;
border-right: 1px solid rgba(0, 179, 204, 0.3);
.el-cascader-node {
&:hover {
background-color: rgba(13, 95, 121, 0.6);
}
&.in-active-path {
color: #fff;
background-color: #275e79;
}
&.is-active {
color: #fff;
background-color: #275e79;
}
}
}
}
}
.el-cascader {
width: 100%;
}

2
ruoyi-ui/src/views/JiHeExpressway/utils/enum.js

@ -142,6 +142,8 @@ export const WarningType = {
7: "撒落物",
8: "异常天气",
9: "护栏碰撞",
10: "交通事故",
11: "车辆故障",
};
export const WarningTypeList = Object.keys(WarningType).map((key) => {

41
ruoyi-ui/src/views/JiHeExpressway/utils/index.js

@ -15,3 +15,44 @@ export function setLoading(options) {
return () => loadingInstance.close();
}
/**
* "K72+600" -> [72, 600]
* @param {*} str
* @returns
*/
export function stakeMarkToArray(str) {
if (!str) return [];
return [...str.match(/[0-9]+/g)];
}
/**
* 通过 最后一级 id 返回 所有父级 id的数组
* @param {*} treeList
* @param {*} id
*/
export function findPathIdByTreeId(treeList, id) {
const path = [];
const findPath = (treeList, id) => {
if (!Array.isArray(treeList)) return;
for (let index = 0; index < treeList.length; index++) {
const item = treeList[index];
if (item.id == id) {
path.push(item.id);
return true;
}
path.push(item.id);
if (findPath(item.children, id)) return true;
else path.pop();
}
};
findPath(treeList, id);
return path;
}

Loading…
Cancel
Save