Browse Source

应急机构联调完成

wangqin
Joe 1 year ago
parent
commit
b030ebe26e
  1. 4
      ruoyi-ui/src/views/JiHeExpressway/components/Card1/index.vue
  2. 12
      ruoyi-ui/src/views/JiHeExpressway/components/FormConfig/components/MultipleLabelItem.vue
  3. 44
      ruoyi-ui/src/views/JiHeExpressway/components/FormConfig/index.vue
  4. 8
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/index.vue
  5. 266
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/emergencyAgencies/components/AddNEditDialog.vue
  6. 39
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/emergencyAgencies/components/EditEventInformationDialog/data.js
  7. 72
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/emergencyAgencies/components/EditEventInformationDialog/index.vue
  8. 42
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/emergencyAgencies/index.vue
  9. 4
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/firstResponders/components/AddNEditDialog.vue
  10. 28
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/firstResponders/index.vue
  11. 10
      ruoyi-ui/src/views/JiHeExpressway/utils/enum.js

4
ruoyi-ui/src/views/JiHeExpressway/components/Card1/index.vue

@ -19,9 +19,9 @@
</Button>
</slot>
</div>
<div class="status" :style="{ background: 'linear-gradient(123deg, #00B3CC 0%, rgba(0, 179, 204, 0) 100%)' }">
<!-- <div class="status" :style="{ background: 'linear-gradient(123deg, #00B3CC 0%, rgba(0, 179, 204, 0) 100%)' }">
<span class="text">正常</span>
</div>
</div> -->
</BorderRadiusImage>
</template>

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

@ -1,14 +1,14 @@
<template>
<div class='MultipleLabelItem'>
<div v-for="(item, index) in options" :key="`${item.key}|${index}`" class="item">
<span v-if="item.prefix" :style="item.prefix.style">{{ item.prefix.text }}</span>
<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 })">
<ProxyCom class="unknown" :value="getValue(item)" :item="item" @update:value="data => updateValue(item, data)" />
</ElFormItem>
<span v-if="item.suffix" :style="item.suffix.style">{{ item.suffix.text }}</span>
<span v-if="item.suffix" class="suffix" :style="item.suffix.style">{{ item.suffix.text }}</span>
</div>
</div>
</template>
@ -52,6 +52,14 @@ export default {
display: flex;
gap: 6px;
.suffix {}
.prefix {}
span {
min-width: fit-content;
}
>.unknown {
flex: 1;
}

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

@ -183,6 +183,23 @@ export default {
* config
* })
*/
const ruleMatch = (value) => {
/**
* @type {{ callback?: (value: any) => boolean; type?: "phone"; message: string; }[]}
*/
const rules = item.rules || [];
for (let index = 0; index < rules.length; index++) {
const rule = rules[index];
// true false
if (typeof rule.callback === 'function') {
if (!rule.callback(value, this.modelFormData)) return new Error(rule.message || "内容错误");
}
else if (RegexpMap[rule.type]) {
if (!RegexpMap[rule.type].reg.test(value)) return new Error(rule.message || RegexpMap[rule.type].message)
}
}
}
if (item.required) return [
{
@ -191,20 +208,25 @@ export default {
if (!value && typeof value === 'object' || typeof value === 'string' && !value.trim()) return callback(new Error(`${item.options?.placeholder || `${item.label}不能为空`}`))
const err = ruleMatch(value);
if (err) return callback(err)
callback()
},
trigger: ["blur", "change"],
},
]
else if (item.rules?.length) return [
{
validator: (_, __, callback) => {
/**
* @type {{ callback?: (value: any) => boolean; type?: "phone"; message: string; }[]}
*/
const rules = item.rules || [];
for (let index = 0; index < rules.length; index++) {
const rule = rules[index];
if (typeof rule.callback === 'function') {
if (!rule.callback(value)) return new Error(rule.message || "内容错误");
}
else if (RegexpMap[rule.type]) {
if (!RegexpMap[rule.type].reg.test(value)) return callback(new Error(rule.message || RegexpMap[rule.type].message))
}
}
const err = ruleMatch(pathGet(this.modelFormData, item.key));
if (err) return callback(err)
callback()
},

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

@ -44,12 +44,12 @@ export default {
pageNum: this.currentPage || 1
}),
setTotal: (total) => this.total = total,
setCurrentPage: page => this.currentPage = page
setCurrentPage: page => this.handleCurrentChange(page)
}
},
data() {
return {
activeName: "FirstResponders",
activeName: "EmergencyAgencies",
panels: [
{
label: "应急人员",
@ -79,8 +79,10 @@ export default {
},
handleSizeChange(size) {
this.pageSize = size;
this.$refs.viewRef.getData();
},
handleCurrentChange() {
handleCurrentChange(currentPage) {
this.currentPage = currentPage;
this.$refs.viewRef.getData();
},
}

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

@ -0,0 +1,266 @@
<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';
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: {
getOptions() {
//
request({
url: `/business/employees/organization`,
method: "post",
data: {}
})
.then((result) => {
if (result.code != 200) return;
const data = [];
result.data.forEach(item => {
if (item.organizationType == 1) {
data.push({
key: item.id,
label: item.organizationName,
disabled: false
})
}
})
this.formList[0].options.options = data;
})
.catch((err) => {
});
},
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>

39
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/emergencyAgencies/components/EditEventInformationDialog/data.js

@ -1,39 +0,0 @@
import * as PresetFormItems from "@screen/pages/control/event/event/FormEvent/PresetFormItems.js";
export const formConfigList = [
{
label: "事故类型:",
key: "key13",
type: "select",
},
PresetFormItems.trafficAccidentType,
PresetFormItems.callPolicePersonName,
PresetFormItems.callPolicePersonPhone,
PresetFormItems.route,
PresetFormItems.direction,
PresetFormItems.eventLevel,
PresetFormItems.station,
PresetFormItems.locationMode,
PresetFormItems.pressure,
PresetFormItems.eventHappenTime,
PresetFormItems.aEstimatedReleaseTime,
PresetFormItems.weatherConditions,
PresetFormItems.effect,
PresetFormItems.isMaintenanceAccident,
PresetFormItems.isCongestionAhead,
PresetFormItems.isCurveRoad,
PresetFormItems.isInTunnel,
PresetFormItems.isArrives,
PresetFormItems.isForkRoad,
PresetFormItems.emptyLine,
PresetFormItems.trafficPolicePhone,
{
...PresetFormItems.emptyLine,
key: "096993",
},
PresetFormItems.wreckerCalls,
PresetFormItems.spillName,
PresetFormItems.ownerPhone,
PresetFormItems.laneOccupancy,
PresetFormItems.vehicleCondition,
];

72
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/emergencyAgencies/components/EditEventInformationDialog/index.vue

@ -1,72 +0,0 @@
<template>
<Dialog v-model="modelVisible" title="修改事件信息">
<div class="EditEventInformationDialog">
<Form class="form" :formList="formConfigList" column="2" labelWidth="120px" />
<div class="footer">
<Button>保存</Button>
<Button style="background: #C9C9C9;">关闭</Button>
</div>
</div>
</Dialog>
</template>
<script>
import Dialog from "@screen/components/Dialog/index";
import Form from '@screen/components/FormConfig';
import Button from '@screen/components/Buttons/Button.vue';
import { formConfigList } from "./data.js"
export default {
name: 'EditEventInformationDialog',
components: {
Dialog,
Form,
Button
},
model: {
prop: 'visible',
event: 'close'
},
props: {
visible: Boolean
},
data() {
return {
formConfigList
}
},
computed: {
modelVisible: {
get() {
return this.visible;
},
set(val) {
this.$emit('close', val)
}
},
}
}
</script>
<style lang='scss' scoped>
.EditEventInformationDialog {
gap: 9px;
width: 810px;
height: 771px;
display: flex;
flex-direction: column;
.form {
flex: 1;
overflow-y: auto;
}
.footer {
display: flex;
justify-content: end;
gap: 15px;
}
}
</style>

42
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/emergencyAgencies/index.vue

@ -2,7 +2,7 @@
<div class='EmergencyAgencies'>
<div class="filter">
<div>
<ButtonGradient>
<ButtonGradient @click.native="handleOpenDialogAddEdit()">
<template #prefix>
<img src="@screen/images/insert.svg" />
</template>
@ -14,7 +14,7 @@
</template>
导出
</ButtonGradient>
<ButtonGradient @click.native="getData">
<ButtonGradient @click.native="setCurrentPage(1)">
<template #prefix>
<img src="@screen/images/refresh.svg" />
</template>
@ -32,16 +32,18 @@
<template v-else>
<Card v-for="(item, index) in data" :keyMap="keyMap" :cardData="item" :key="index">
<template #button>
<Button>
<Button @click.native="() => handleOpenDialogAddEdit(item)">
修改
</Button>
<Button style="background-color: #FF5F5F;">
<Button style="background-color: #FF5F5F;" @click.native="handleDelete(item)">
删除
</Button>
</template>
</Card>
</template>
</div>
<AddNEditDialog v-model="addNEditDialogVisible" :data="dialogData" />
</div>
</template>
@ -50,6 +52,7 @@ import Card from "@screen/components/Card1/index.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 AddNEditDialog from "./components/AddNEditDialog.vue"
import { searchFormList } from "./data";
import request from "@/utils/request";
@ -59,16 +62,19 @@ import { delay, exportFile } from "@screen/utils/common";
//
export default {
name: 'EmergencyAgencies',
inject: ['getPagination', 'setTotal'],
inject: ['getPagination', 'setTotal', 'setCurrentPage'],
components: {
Card,
ButtonGradient,
InputSearch,
Button
Button,
AddNEditDialog
},
data() {
return {
searchFormList,
addNEditDialogVisible: false,
dialogData: null,
// data: Array.from({ length: 20 }).map(() => ({
// source: "",
// location: "",
@ -96,13 +102,35 @@ export default {
{
key: "dcOrganizations.latitude",
label: "救援外协单位"
}]
}
]
}
},
created() {
this.getData();
},
methods: {
handleDelete(data) {
request({
url: `/business/shifts/${data.dcOrganizations.id}`,
method: "DELETE",
data: {}
})
.then((result) => {
if (result.code != 200) return Message.error(`删除失败!`);
this.setCurrentPage(1)
Message.success(`删除成功!`);
})
.catch((err) => {
Message.error(`删除失败!`);
});
},
handleOpenDialogAddEdit(data) {
this.addNEditDialogVisible = true;
this.dialogData = data;
},
handleSearch(data) {
this.searchData = data;
this.getData();

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

@ -149,8 +149,8 @@ export default {
method: this.data ? 'PUT' : 'POST',
data
})
.then(() => {
this.$parent.getData();
.then(result => {
if (result.code != 200) return Message.error(`提交失败!`);
Message.success(`提交成功!`);

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

@ -14,7 +14,7 @@
</template>
导出
</ButtonGradient>
<ButtonGradient @click.native="getData">
<ButtonGradient @click.native="setCurrentPage(1)">
<template #prefix>
<img src="@screen/images/refresh.svg" />
</template>
@ -44,6 +44,7 @@ import InputSearch from '@screen/components/InputSearch/index.vue';
import ButtonGradient from '@screen/components/Buttons/ButtonGradient.vue';
import AddNEditDialog from "./components/AddNEditDialog.vue"
import { Message } from "element-ui";
import { searchFormList } from "./data";
import request from "@/utils/request";
import { setLoading } from "@screen/utils/index.js"
@ -58,7 +59,7 @@ export default {
InputSearch,
AddNEditDialog
},
inject: ['getPagination', 'setTotal'],
inject: ['getPagination', 'setTotal', 'setCurrentPage'],
data() {
return {
searchFormList,
@ -72,12 +73,20 @@ export default {
this.getSearchOptions();
},
methods: {
handleDelete() {
// request({
// url: `/business/employees/sysPost`,
// method: "post",
// data: {}
// })
handleDelete(data) {
request({
url: `/business/employees/${data.id}`,
method: "DELETE",
data: {}
})
.then((result) => {
if (result.code != 200) return Message.error(`删除失败!`);
this.setCurrentPage(1)
Message.success(`删除成功!`);
})
.catch((err) => {
Message.error(`删除失败!`);
});
},
handleOpenDialogAddEdit(data) {
this.addNEditDialogVisible = true;
@ -142,9 +151,10 @@ export default {
}
}).then(result => {
if (result.code != 200) return;
this.data = result.rows;
this.setTotal(result.total)
// this.setTotal(90)
}).finally(() => {
closeLoading();
})

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

@ -50,6 +50,16 @@ export const CameraDirectionEnum = {
},
};
export const CameraDirectionEnumList = Object.keys(CameraDirectionEnum).map(
(key) => {
return {
value: key,
key,
label: CameraDirectionEnum[key].text,
};
}
);
// 设备的状态
export const DeviceTypeEnum = {
0: {

Loading…
Cancel
Save