Browse Source

Merge branch 'develop' of http://39.106.31.193:9211/mengff/jihe-hs into develop

wangqin
hui 2 years ago
parent
commit
8b1e82b74c
  1. 16
      ruoyi-ui/src/api/commandDispatch/index.js
  2. 12
      ruoyi-ui/src/common/menuData.js
  3. 30
      ruoyi-ui/src/components/eventDialogTable/eventDialog.vue
  4. 1
      ruoyi-ui/src/views/JiHeExpressway/common/PresetFormItems.js
  5. 2
      ruoyi-ui/src/views/JiHeExpressway/components/Dialog/index.vue
  6. 8
      ruoyi-ui/src/views/JiHeExpressway/components/RoadStateCard/data.js
  7. 31
      ruoyi-ui/src/views/JiHeExpressway/components/RoadStateCard/images/confirmed22.svg
  8. 30
      ruoyi-ui/src/views/JiHeExpressway/components/RoadStateCard/images/processed24.svg
  9. 32
      ruoyi-ui/src/views/JiHeExpressway/components/RoadStateCard/images/processing21.svg
  10. 31
      ruoyi-ui/src/views/JiHeExpressway/components/RoadStateCard/images/toBeConfirmed23.svg
  11. 2
      ruoyi-ui/src/views/JiHeExpressway/components/Table.vue
  12. 336
      ruoyi-ui/src/views/JiHeExpressway/components/TimeLine/TimeLine2/DescCard.vue
  13. 2
      ruoyi-ui/src/views/JiHeExpressway/components/Video/Video.vue
  14. 3
      ruoyi-ui/src/views/JiHeExpressway/components/Video/index.vue
  15. 1
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/Camera/index.vue
  16. 6
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/MeteorologicalDetection/components/DeviceControlDialog.vue
  17. 345
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/PerceiveEvent/index.vue
  18. 146
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/RoadNetworkFacilities/chart.js
  19. 60
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/RoadNetworkFacilities/data.js
  20. 91
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/RoadNetworkFacilities/index.vue
  21. 5
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/TrafficIncidents/index.vue
  22. 10
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/mixin.js
  23. 26
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/HomeFrameControl/index.vue
  24. 1
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/index.vue
  25. 10
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/utils/map.js
  26. 6
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/CrowdnessIndicatorRankings/index.vue
  27. 139
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DeviceControl/components/ScopeTable.vue
  28. 1
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DeviceControl/data.js
  29. 64
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DeviceControl/index.vue
  30. 4
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DispatchLiaison/index.vue
  31. 55
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DisposalProcess/DialogVisible/index.vue
  32. 8
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DisposalProcess/index.vue
  33. 4636
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/EventInformation/components/EditEventInformationDialog/data.js
  34. 2572
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/EventInformation/components/EditEventInformationDialog/data_back.js
  35. 77
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/EventInformation/components/EditEventInformationDialog/index.vue
  36. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/EventInformation/images/congestion.svg
  37. 6
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/TrafficControl/components/AddControlEventInfoDialog/data.js
  38. 11
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/index.vue
  39. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/EventDetailDialog/data.js
  40. 139
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/EventDetailDialog/index.vue
  41. 5
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/FormEvent/PresetFormItems.js
  42. 6
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/FormEvent/data.js
  43. 19
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/FormEvent/index.vue
  44. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/plan/addAndEditDialog/ScopeTable.vue
  45. 28
      ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/smart/analysis/data.js
  46. 22
      ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/smart/analysis/images/refresh.svg
  47. 315
      ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/smart/analysis/index.vue
  48. 1
      ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/smart/manage/index.vue
  49. 36
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventAnalysis/EventDetailDialog/Carousel/images/arrow.svg
  50. 126
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventAnalysis/EventDetailDialog/Carousel/index.vue
  51. 177
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventAnalysis/EventDetailDialog/data.js
  52. 101
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventAnalysis/EventDetailDialog/index.vue
  53. 1227
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventAnalysis/FormEvent/PresetFormItems.js
  54. 2536
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventAnalysis/FormEvent/data.js
  55. 258
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventAnalysis/FormEvent/index.vue
  56. 275
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventAnalysis/data.js
  57. 14
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventAnalysis/images/export.svg
  58. 9
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventAnalysis/images/insert.svg
  59. 22
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventAnalysis/images/refresh.svg
  60. 287
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventAnalysis/index.vue
  61. 3
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/ElQuarterPicker.vue
  62. 3
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/trafficIndicators/ElQuarterPicker.vue
  63. 1
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/trafficIndicators/index.vue
  64. 54
      ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/nucleusThrough/assets/charts3.js
  65. 19
      ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/nucleusThrough/index.vue
  66. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/postTrendsDay/assets/charts.js
  67. 1
      ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/postTrendsDay/index.vue
  68. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/postTrendsMonth/assets/charts.js
  69. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/postTrendsMonth/index.vue
  70. 37
      ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/record/index.vue

16
ruoyi-ui/src/api/commandDispatch/index.js

@ -141,3 +141,19 @@ export function importantFileStatus(eventId) {
method: "get",
});
}
// 事件预案详情
export function eventDetails(assocId) {
return request({
url: `/business/plans/event/assocId/${assocId}`,
method: "get",
});
}
// 获取重要文件内容详情
export function getEventImportantFileDetails(id) {
return request({
url: `/business/eventImportantFile/${id}`,
method: "get",
});
}

12
ruoyi-ui/src/common/menuData.js

@ -37,6 +37,12 @@ export default [
name: "perceptionTrafficSituation",
component: "perception/trafficSituation/index.vue",
},
{
title: "感知事件分析",
path: "/perception/eventAnalysis",
name: "perceptionEventAnalysis",
component: "perception/eventAnalysis/index.vue",
},
],
},
{
@ -177,6 +183,12 @@ export default [
path: "/maintain/smart/manage",
component: "maintenanceOperations/smart/manage/index.vue",
},
{
title: "设备数据分析",
name: "deviceDataAnalysis",
path: "/maintain/smart/analysis",
component: "maintenanceOperations/smart/analysis/index.vue",
},
],
},
{

30
ruoyi-ui/src/components/eventDialogTable/eventDialog.vue

@ -561,7 +561,9 @@
</el-row>
</el-form>
<div class="dialogFooterButton">
<div @click="submitDialog" v-hasPermi="['system:event:check']">复核提交</div>
<div @click="submitDialog" v-hasPermi="['system:event:check']">
复核提交
</div>
<!-- <div
@click="openProcess(1, eventFormDetail.id)"
>
@ -577,10 +579,10 @@
title="事件视频"
class="videoDialog"
>
<div class="dialogStyleBox">
<div class="dialogLine"></div>
<div class="dialogCloseButton"></div>
</div>
<div class="dialogStyleBox">
<div class="dialogLine"></div>
<div class="dialogCloseButton"></div>
</div>
<div class="videoDialogClass">
<video :src="videoUrl" controls muted loop fluid autoplay></video>
</div>
@ -592,10 +594,10 @@
width="60%"
:before-close="handleCloseImg"
>
<div class="dialogStyleBox">
<div class="dialogLine"></div>
<div class="dialogCloseButton"></div>
</div>
<div class="dialogStyleBox">
<div class="dialogLine"></div>
<div class="dialogCloseButton"></div>
</div>
<img :src="alongImgUrl" style="width: 100%" />
<!-- <span slot="footer" class="dialog-footer">
<el-button @click="dialogVisibleImg = false"> </el-button>
@ -968,7 +970,7 @@ export default {
} else {
callback(new Error("请输入正确的车牌号,字母大写"));
}
}else{
} else {
callback();
}
},
@ -1324,9 +1326,9 @@ export default {
//
// getEventList() {
// eventFlowList({ eventId: this.eventForm.id }).then((res) => {
// this.eventWarnList = res.rows;
// });
// eventFlowList({ eventId: this.eventForm.id }).then((res) => {
// this.eventWarnList = res.rows;
// });
// },
getReservePlanData() {
this.ReservePlanList = [];
@ -2321,7 +2323,7 @@ hr {
video {
width: 100%;
height: auto;
max-height:550px;
max-height: 550px;
}
}
.el-carousel {

1
ruoyi-ui/src/views/JiHeExpressway/common/PresetFormItems.js

@ -806,7 +806,6 @@ export const locationMode = {
key: "dcEventAccident.locationType",
required: true,
type: "select",
default: "1",
options: {
options: [
{ key: "1", label: "高速主线" },

2
ruoyi-ui/src/views/JiHeExpressway/components/Dialog/index.vue

@ -211,7 +211,7 @@ export default {
}
.dialog-content {
padding: 9px 21px 27px 21px;
padding: 9px 21px 9px 21px;
max-height: 95vh;
overflow-y: auto;
}

8
ruoyi-ui/src/views/JiHeExpressway/components/RoadStateCard/data.js

@ -10,4 +10,12 @@ export const statusMap = {
4: "processing",
// 待确认
5: "toBeConfirmed",
// 上报
21: "processing21",
// 已完成
22: "confirmed22",
// 已终止
23: "toBeConfirmed23",
// 自动结束
24: "processed24",
};

31
ruoyi-ui/src/views/JiHeExpressway/components/RoadStateCard/images/confirmed22.svg

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 27.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="69" height="67" viewBox="0 0 69 67" fill="none" xml:space="preserve">
<style type="text/css">
.st0{fill:url(#Rectangle_3543_00000027573242941979377840000008498132700452433310_);}
.st1{fill:url(#Rectangle_3545_00000108306831714505799710000016481210161124509350_);}
.st2{fill:#FFFFFF;}
.st3{font-family:'SimHei';}
.st4{font-size:12px;}
</style>
<g id="Group_1142814579">
<linearGradient id="Rectangle_3543_00000061472896844591682200000006038025238129988743_" gradientUnits="userSpaceOnUse" x1="11.787" y1="77.9443" x2="79.1132" y2="9.5398" gradientTransform="matrix(1 0 0 -1 0 67.8898)">
<stop offset="0" style="stop-color:#01E3AD"/>
<stop offset="1" style="stop-color:#01E3C8;stop-opacity:0"/>
</linearGradient>
<path id="Rectangle_3543" style="fill:url(#Rectangle_3543_00000061472896844591682200000006038025238129988743_);" d="M4.8-0.4
c-0.8-0.8-0.8-2,0-2.8l13.6-13.4c0.8-0.8,2.1-0.8,2.8,0l64.8,65.3c0.8,0.8,0.8,2,0,2.8L72.5,64.9c-0.8,0.8-2.1,0.8-2.8,0L4.8-0.4z"
/>
<linearGradient id="Rectangle_3545_00000114777316930785617910000013239311134280107166_" gradientUnits="userSpaceOnUse" x1="3.2789" y1="70.8921" x2="69.4573" y2="4.1666" gradientTransform="matrix(1 0 0 -1 0 67.8898)">
<stop offset="0" style="stop-color:#FFFFFF"/>
<stop offset="1.000000e-04" style="stop-color:#FFFFFF;stop-opacity:0"/>
<stop offset="0.4554" style="stop-color:#FFFFFF"/>
<stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0"/>
</linearGradient>
<path id="Rectangle_3545" style="fill:url(#Rectangle_3545_00000114777316930785617910000013239311134280107166_);" d="M0.9-4.4
c-0.3-0.3-0.3-0.7,0-1c0.3-0.3,0.7-0.3,1,0l69.6,70.2c0.3,0.3,0.3,0.7,0,1c-0.3,0.3-0.7,0.3-1,0L0.9-4.4z"/>
</g>
<text transform="matrix(0.6974 0.7166 -0.7166 0.6974 28.0888 11.4371)" class="st2 st3 st4">已完成</text>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

30
ruoyi-ui/src/views/JiHeExpressway/components/RoadStateCard/images/processed24.svg

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 27.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="69" height="67" viewBox="0 0 69 67" fill="none" xml:space="preserve">
<style type="text/css">
.st0{fill:url(#Rectangle_3543_00000135670463380124271900000010923522838896704945_);}
.st1{fill:url(#Rectangle_3545_00000149381956171071755920000000984320330230580101_);}
.st2{fill:#FFFFFF;}
.st3{font-family:'SimHei';}
.st4{font-size:12px;}
</style>
<g id="Group_1142814576">
<linearGradient id="Rectangle_3543_00000078740831148408449340000013198996239226044321_" gradientUnits="userSpaceOnUse" x1="9.9588" y1="77.9443" x2="77.2851" y2="9.5397" gradientTransform="matrix(1 0 0 -1 0 67.8898)">
<stop offset="0" style="stop-color:#8B8B8B"/>
<stop offset="1" style="stop-color:#8B8B8B;stop-opacity:0"/>
</linearGradient>
<path id="Rectangle_3543" style="fill:url(#Rectangle_3543_00000078740831148408449340000013198996239226044321_);" d="M3-0.4
c-0.8-0.8-0.8-2,0-2.8l13.6-13.4c0.8-0.8,2.1-0.8,2.8,0l64.8,65.3c0.8,0.8,0.8,2,0,2.8L70.6,64.9c-0.8,0.8-2.1,0.8-2.8,0L3-0.4z"/>
<linearGradient id="Rectangle_3545_00000147204908212795541760000007381703714348779156_" gradientUnits="userSpaceOnUse" x1="3.5468" y1="68.7865" x2="67.689" y2="4.099" gradientTransform="matrix(1 0 0 -1 0 67.8898)">
<stop offset="0" style="stop-color:#FFFFFF"/>
<stop offset="1.000000e-04" style="stop-color:#FFFFFF;stop-opacity:0"/>
<stop offset="0.4554" style="stop-color:#FFFFFF"/>
<stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0"/>
</linearGradient>
<path id="Rectangle_3545" style="fill:url(#Rectangle_3545_00000147204908212795541760000007381703714348779156_);" d="M1.3-2.2
C1-2.4,1-2.9,1.3-3.2c0.3-0.3,0.7-0.3,1,0l67.5,68c0.3,0.3,0.3,0.7,0,1c-0.3,0.3-0.7,0.3-1,0L1.3-2.2z"/>
</g>
<text transform="matrix(0.6947 0.7193 -0.7193 0.6947 22.8984 7.1791)" class="st2 st3 st4">自动结束</text>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

32
ruoyi-ui/src/views/JiHeExpressway/components/RoadStateCard/images/processing21.svg

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 27.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="69" height="67" viewBox="0 0 69 67" fill="none" xml:space="preserve">
<style type="text/css">
.st0{fill:url(#Rectangle_3543_00000053538272738649842960000009181435203724315524_);}
.st1{fill:url(#Rectangle_3545_00000042731925473050420680000005354543093107188619_);}
.st2{fill:#FFFFFF;}
.st3{font-family:'SimHei';}
.st4{font-size:12px;}
.st5{letter-spacing:1;}
</style>
<g id="Group_1142814575">
<linearGradient id="Rectangle_3543_00000014623357134123876150000007078429270906634410_" gradientUnits="userSpaceOnUse" x1="9.7959" y1="77.9317" x2="77.1225" y2="9.5524" gradientTransform="matrix(1 0 0 -1 0 67.8898)">
<stop offset="0" style="stop-color:#00B3CC"/>
<stop offset="1" style="stop-color:#00B3CC;stop-opacity:0"/>
</linearGradient>
<path id="Rectangle_3543" style="fill:url(#Rectangle_3543_00000014623357134123876150000007078429270906634410_);" d="M2.9-0.4
c-0.8-0.8-0.8-2,0-2.8l13.6-13.4c0.8-0.8,2.1-0.8,2.8,0l64.8,65.3c0.8,0.8,0.8,2,0,2.8L70.5,64.9c-0.8,0.8-2.1,0.8-2.8,0L2.9-0.4z"
/>
<linearGradient id="Rectangle_3545_00000053537988499499213120000008969392740421215395_" gradientUnits="userSpaceOnUse" x1="2.8341" y1="69.3302" x2="67.5137" y2="4.1291" gradientTransform="matrix(1 0 0 -1 0 67.8898)">
<stop offset="0" style="stop-color:#FFFFFF"/>
<stop offset="1.000000e-04" style="stop-color:#FFFFFF;stop-opacity:0"/>
<stop offset="0.4554" style="stop-color:#FFFFFF"/>
<stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0"/>
</linearGradient>
<path id="Rectangle_3545" style="fill:url(#Rectangle_3545_00000053537988499499213120000008969392740421215395_);" d="M0.5-2.8
c-0.3-0.3-0.3-0.7,0-1c0.3-0.3,0.7-0.3,1,0l68,68.5c0.3,0.3,0.3,0.7,0,1c-0.3,0.3-0.7,0.3-1,0L0.5-2.8z"/>
</g>
<text transform="matrix(0.703 0.7112 -0.7112 0.703 28.8203 14.2373)" class="st2 st3 st4 st5">上报</text>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

31
ruoyi-ui/src/views/JiHeExpressway/components/RoadStateCard/images/toBeConfirmed23.svg

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 27.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="69" height="67" viewBox="0 0 69 67" fill="none" xml:space="preserve">
<style type="text/css">
.st0{fill:url(#Rectangle_3543_00000051376741410994204160000013762924089411596164_);}
.st1{fill:url(#Rectangle_3545_00000044885868572866352330000017989187333113817249_);}
.st2{fill:#FFFFFF;}
.st3{font-family:'SimHei';}
.st4{font-size:12px;}
</style>
<g id="Group_1142814578">
<linearGradient id="Rectangle_3543_00000100377943266825359860000014707726126855785879_" gradientUnits="userSpaceOnUse" x1="12.8443" y1="77.9443" x2="80.1706" y2="9.5397" gradientTransform="matrix(1 0 0 -1 0 67.8898)">
<stop offset="0" style="stop-color:#CB7A00"/>
<stop offset="1" style="stop-color:#CB7A00;stop-opacity:0"/>
</linearGradient>
<path id="Rectangle_3543" style="fill:url(#Rectangle_3543_00000100377943266825359860000014707726126855785879_);" d="M5.9-0.4
c-0.8-0.8-0.8-2,0-2.8l13.6-13.4c0.8-0.8,2.1-0.8,2.8,0l64.8,65.3c0.8,0.8,0.8,2,0,2.8L73.5,64.9c-0.8,0.8-2.1,0.8-2.8,0L5.9-0.4z"
/>
<linearGradient id="Rectangle_3545_00000006680004188661637840000018048924972681788824_" gradientUnits="userSpaceOnUse" x1="3.5846" y1="71.6466" x2="70.493" y2="4.1908" gradientTransform="matrix(1 0 0 -1 0 67.8898)">
<stop offset="0" style="stop-color:#FFFFFF"/>
<stop offset="1.000000e-04" style="stop-color:#FFFFFF;stop-opacity:0"/>
<stop offset="0.4554" style="stop-color:#FFFFFF"/>
<stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0"/>
</linearGradient>
<path id="Rectangle_3545" style="fill:url(#Rectangle_3545_00000006680004188661637840000018048924972681788824_);" d="M1.2-5.1
c-0.3-0.3-0.3-0.7,0-1c0.3-0.3,0.7-0.3,1,0l70.4,70.9c0.3,0.3,0.3,0.7,0,1c-0.3,0.3-0.7,0.3-1,0L1.2-5.1z"/>
</g>
<text transform="matrix(0.6909 0.7229 -0.7229 0.6909 30.053 12.0698)" class="st2 st3 st4">已终止</text>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

2
ruoyi-ui/src/views/JiHeExpressway/components/Table.vue

@ -32,7 +32,7 @@ div.Table {
font-size: 16px;
background-color: unset;
color: #fff;
width:100%;
::v-deep {
tr {
background-color: rgba(6, 66, 88, 0);

336
ruoyi-ui/src/views/JiHeExpressway/components/TimeLine/TimeLine2/DescCard.vue

@ -6,8 +6,9 @@
<span class="name">{{ data.name }}</span>
<span class="posts">{{ data.posts }}</span>
</div>
<div class="desc" v-if="data.processId">节点{{ data.processName }}</div>
<img
<div class="node" v-if="data.processId">节点{{ data.processName }}</div>
<el-image
style="width: 100px; height: 100px"
v-if="
data.type == 'bmp' ||
data.type == 'jpg' ||
@ -15,21 +16,264 @@
data.type == 'png'
"
:src="data.url"
/>
{{ data.url }}
>
</el-image>
<video
v-if="data.type == 'mp4' || data.type == 'avi' || data.type == 'xmvb'"
class="videoClass"
:src="data.url"
:poster="data.url"
muted
controls
></video>
<div v-if="data.type == 'text'">
<div class="desc" v-html="data.desc" />
</div>
<el-popover
trigger="click"
placement="right"
v-if="data.processType == '3'"
style="color: red; cursor: pointer"
>
<span slot="reference" @click="handleDetails(data)">详情</span>
<div class="detailsBox" v-if="data.processType == '3'">
<div class="item" v-for="item in controlResult" :key="item.deviceName">
<span class="label"> {{ item.deviceName }}</span>
<span class="value"> {{ item.content }}</span>
</div>
</div>
</el-popover>
<div
v-if="data.processType == '4'"
style="color: red; cursor: pointer"
@click="openDetailsDialog(data)"
>
<!-- <source :src="data.desc" /> -->
</video>
<!-- <div class="desc">{{ data.desc }}</div> -->
<div v-if="data.type == 'text'" class="desc" v-html="data.desc" />
详情
</div>
<Dialog style="" v-model="detailsDialog" width="1085px" top="60px">
<div v-if="data.processType == '4'" class="docx-wrapper">
<section
ref="initFile"
class="docx"
style="
padding: 72pt 90.15pt;
width: 595.3pt;
min-height: 741.9pt;
column-count: 1;
column-gap: 36pt;
"
>
<article>
<p
style="
line-height: 1;
text-align: center;
vertical-align: baseline;
margin-bottom: 10px;
"
>
<span
lang="en-US"
style="
font-family: 方正小标宋简体;
color: rgb(255, 0, 0);
min-height: 46pt;
font-size: 46pt;
font-weight: 700;
"
>重要事件</span
>
</p>
<p
style="
margin-bottom: 2pt;
min-height: 15pt;
line-height: 15pt;
text-align: center;
vertical-align: baseline;
"
>
<span
lang="null"
style="
font-family: 仿宋_GB2312;
font-weight: normal;
min-height: 10.5pt;
font-size: 10.5pt;
"
>报送单位</span
><span
lang="en-US"
style="
font-family: 仿宋_GB2312;
font-weight: normal;
min-height: 10.5pt;
font-size: 10.5pt;
"
>
{{ formFileData.fromDept }}</span
><span
lang="null"
style="
font-family: 仿宋_GB2312;
font-weight: normal;
min-height: 10.5pt;
font-size: 10.5pt;
"
>报送时间</span
><span
lang="en-US"
style="
font-family: 仿宋_GB2312;
font-weight: normal;
min-height: 10.5pt;
font-size: 10.5pt;
"
>{{ formFileData.createTime }}</span
>
</p>
<p
style="
margin-bottom: 1pt;
min-height: 10pt;
line-height: 10pt;
text-align: center;
vertical-align: baseline;
"
>
<span
style="
font-family: 'Times New Roman';
font-weight: bold;
color: rgb(255, 0, 0);
min-height: 22pt;
font-size: 22pt;
"
></span
>
</p>
<p
style="
margin-bottom: 6pt;
min-height: 25pt;
line-height: 25pt;
text-align: center;
vertical-align: baseline;
"
>
<span
lang="en-US"
style="
font-family: 方正小标宋简体;
min-height: 22pt;
font-size: 22pt;
font-weight: bold;
"
>{{ formFileData.title }}</span
>
</p>
<p
style="
text-indent: 0pt;
text-align: left;
vertical-align: baseline;
"
>
<span
lang="en-US"
style="
font-family: 仿宋_GB2312;
font-weight: normal;
color: black;
min-height: 16pt;
font-size: 16pt;
"
>智慧管理中心</span
>
</p>
<textarea
v-model="formFileData.content"
disabled
style="
width: 100%;
height: 40vh;
line-height: 1.5;
text-indent: 0pt;
vertical-align: baseline;
font-family: 仿宋_GB2312;
font-weight: normal;
color: black;
min-height: 16pt;
font-size: 16pt;
background: #fff;
border: none;
"
>
{{ formFileData.content }}
</textarea
>
<p
style="line-height: 1; text-indent: 0pt; vertical-align: baseline"
></p>
<p style="vertical-align: baseline"></p>
<p
style="
margin-bottom: 1pt;
min-height: 10pt;
line-height: 10pt;
text-align: center;
vertical-align: baseline;
"
>
<span
style="
font-family: 'Times New Roman';
font-weight: bold;
color: rgb(255, 0, 0);
min-height: 22pt;
font-size: 22pt;
"
></span
>
</p>
<p
class="docx-num-0-0"
style="
display: flex;
justify-content: space-between;
margin-top: 0pt;
text-align: center;
vertical-align: baseline;
font-family: 仿宋_GB2312;
font-weight: normal;
min-height: 14pt;
font-size: 14pt;
"
>
<span lang="en-US">填报人:{{ formFileData.createName }} </span>
<span>联系电话:{{ formFileData.phoneNumber }}</span>
<span> 签发人{{ formFileData.issued }}</span>
</p>
</article>
</section>
<!-- <button @click="handleDownload">下载</button> -->
</div>
<div></div>
</Dialog>
</div>
</template>
<script>
import Video from "@screen/components/VideoMulti";
import Dialog from "@screen/components/Dialog/index";
import {
eventDetails,
getEventImportantFileDetails,
} from "@/api/commandDispatch";
export default {
name: "DescCard",
props: {
@ -43,7 +287,6 @@ export default {
handler(newValue, oldValue) {
if (newValue != "text") {
this.data.url = process.env.VUE_APP_BASE_API + this.data.desc;
console.log("this.data.url", this.data.url);
}
},
deep: true,
@ -52,6 +295,40 @@ export default {
},
components: {
Video,
Dialog,
},
data() {
return {
detailsDialog: false,
controlResult: [],
formFileData: {
fromDept: "齐鲁高速股份有限公司",
createTime: "2024年04月24日17时22分",
title: "关于G20青银高速K305+208交通事故的续报1",
toDept: "智慧管理中心",
content: "路管等单位及清障救援车辆已到达现场。预计结束时间为12时44分。",
createName: "张三",
phoneNumber: "18678866677",
issued: "康传刚",
status: 0,
id: null,
},
};
},
methods: {
handleDetails(data) {
eventDetails(data.id).then((res) => {
if (res.data?.controlResult) {
this.controlResult = JSON.parse(res.data.controlResult);
}
});
},
openDetailsDialog(data) {
this.detailsDialog = true;
getEventImportantFileDetails(data.id).then((res) => {
this.formFileData = res.data;
});
},
},
};
</script>
@ -94,9 +371,50 @@ export default {
}
}
.node {
color: #ffbf00;
font-size: 16px;
line-height: 19px;
}
.desc {
font-size: 16px;
line-height: 19px;
}
}
.videoClass {
width: 300px;
height: 180px;
}
.docx-wrapper {
background: #fff;
padding: 30px;
display: flex;
flex-flow: column;
align-items: center;
> section.docx {
background: white;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
margin-bottom: 30px;
}
.docx p,
p.docx_1 span {
font-family: var(--docx-minorHAnsi-font);
color: #00000a;
min-height: 11pt;
font-size: 11pt;
}
button {
cursor: pointer;
width: 100px;
height: 35px;
line-height: 35px;
color: #fff;
background: #00b3cc;
border-radius: 48px;
display: flex;
justify-content: center;
align-items: center;
border: none;
}
}
</style>

2
ruoyi-ui/src/views/JiHeExpressway/components/Video/Video.vue

@ -33,7 +33,7 @@ export default {
default: 'flv'
},
rangeIndex: {
default: 0
type: [String,Number],
}
},
watch: {

3
ruoyi-ui/src/views/JiHeExpressway/components/Video/index.vue

@ -49,8 +49,7 @@ export default {
default: 'flv'
},
rangeIndex: {
type: Number,
default: 0
type: [String,Number]
},
showHeader: {
type: Boolean,

1
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/Camera/index.vue

@ -171,7 +171,6 @@ export default {
}, 150),
visibleClose(bool) {
if (bool) return;
this.controlDialogVisible = false;
},
},

6
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/MeteorologicalDetection/components/DeviceControlDialog.vue

@ -103,15 +103,15 @@ export default {
qsData.rows.forEach(item => {
if (lastPath == 'deviceHour') {
times.push(item.date);
datas.push(this.btnType == 1 ? item.temperature : item.visibility)
} else if (lastPath == 'deviceDay') {
times.push(new Date(item.date).format('dd'));
datas.push(this.btnType == 1 ? item.avgTemperature : item.avgVisibility)
} else if (lastPath == 'deviceYears') {
times.push(new Date(item.month).format('MM'));
datas.push(this.btnType == 1 ? item.avgTemperature : item.avgVisibility)
}
datas.push(this.btnType == 1 ? item.temperature : item.visibility)
})
// console.log('datas',datas)
if (lastPath == 'deviceHour') {
lineChartOption.xAxis.name = '时'

345
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/PerceiveEvent/index.vue

@ -13,7 +13,7 @@
</div>
<template #footer>
<Button @click.native="onDelete">误报</Button>
<Button @click.native="onDelete" :loading="loading">误报</Button>
<Button style="background-color: rgba(0, 179, 204, 0.3)" @click.native="obverseVisible = false">取消</Button>
<Button @click.native="updateEvent" :loading="btnLoading">确定</Button>
</template>
@ -43,7 +43,91 @@ import { markerClusterIns } from "@screen/pages/Home/components/RoadAndEvents/ut
import { eventMap } from "@screen/pages/Home/components/RoadAndEvents/utils/buttonEvent";
let vehicleTypeList = [];
const _formList = [{
label: "报警时间:",
key: "warningTime",
type: "text",
},
{
label: "事件地点:",
key: "stakeMark",
type: "text",
},
{
label: "路段方向:",
key: "direction",
type: "text",
isAlone: true,
},
{
label: "事件来源:",
key: "warningSource",
type: "text",
enum: "InfoWarningSource",
},
{
label: "事件类型:",
key: "warningType",
type: "select",
options: {
disabled: true,
options: WarningTypeList,
},
ons: {
change: (value, { data }) => {
this.formList[5].options.options =
WarningSubclassList[value] || [];
data.warningSubclass = null;
},
},
},
{
label: "细分类型:",
key: "warningSubclass",
type: "select",
options: {
options: [],
},
},
// {
// label: ":",
// key: "vehicleType",
// type: "select",
// options: {
// options: vehicleTypeList
// },
// },
{
label: "事件描述:",
key: "remark",
options: {
type: "textarea",
maxlength: 100,
autosize: { minRows: 3, maxRows: 3 },
showWordLimit: true,
},
},
{
label: "影响车道:",
key: "lane",
type: "CheckboxGroup",
options: {
// activeColor: "linear-gradient(180deg, #37E7FF 0%, #009BCC 100%)",
options: LaneOccupancyList,
gap: "12px",
},
},
{
label: "持续时长:",
key: "duration",
type: "text",
},
// {
// label: ":",
// key: "weather",
// type: "text",
// },
]
function getDuration(warningTime) {
const currentTime = moment();
const specifiedTime = moment(warningTime);
@ -94,92 +178,8 @@ export default {
// deviceVendors: "XXX",
// time: "2023/01/02 09:09:09"
},
formList: [
{
label: "报警时间:",
key: "warningTime",
type: "text",
},
{
label: "事件地点:",
key: "stakeMark",
type: "text",
},
{
label: "路段方向:",
key: "direction",
type: "text",
isAlone: true,
},
{
label: "事件来源:",
key: "warningSource",
type: "text",
enum: "InfoWarningSource",
},
{
label: "事件类型:",
key: "warningType",
type: "select",
options: {
disabled: true,
options: WarningTypeList,
},
ons: {
change: (value, { data }) => {
this.formList[5].options.options =
WarningSubclassList[value] || [];
data.warningSubclass = null;
},
},
},
{
label: "细分类型:",
key: "warningSubclass",
type: "select",
options: {
options: [],
},
},
// {
// label: ":",
// key: "vehicleType",
// type: "select",
// options: {
// options: vehicleTypeList
// },
// },
{
label: "事件描述:",
key: "remark",
options: {
type: "textarea",
maxlength: 100,
autosize: { minRows: 6, maxRows: 6 },
showWordLimit: true,
},
},
{
label: "影响车道:",
key: "lane",
type: "CheckboxGroup",
options: {
// activeColor: "linear-gradient(180deg, #37E7FF 0%, #009BCC 100%)",
options: LaneOccupancyList,
gap: "12px",
},
},
{
label: "持续时长:",
key: "duration",
type: "text",
},
// {
// label: ":",
// key: "weather",
// type: "text",
// },
],
formList: [],
loading:false,
};
},
async created() {
@ -196,42 +196,116 @@ export default {
this.dialogData.pictures = otherConfig.pictures
}
console.log(1122, this.dialogData, 3344);
this.formList = [..._formList]
},
beforeDestroy() {
clearInterval(this.interval);
},
methods: {
onDelete() {
const id = this.dialogData.id;
id &&
this.$confirm("确定误报吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
request({
url: `/business/warning/delete`,
method: "post",
data: { id },
}).then((result) => {
if (result.code == 200) Message.success("成功!");
else Message.error(result?.msg);
const item = { title: "感知事件" };
eventMap[`事件专题/${item.title}_close`]?.call(
this,
item,
(item) => {
return item?.extData?.id == id;
const self = this;
if(this.formList.length === _formList.length ){
this.formList.splice(6,0,{
label: "解除类型:",
key: "relieveType",
type: "RadioGroup",
isAlone: true,
required: true,
options: {
activeColor: "linear-gradient(180deg, #37E7FF 0%, #009BCC 100%)",
options: [
{
key: "1",
label: "误报解除",
},
{
key: "2",
label: "已结束",
},
"special"
);
//
this.$root.$emit('refresh-event');
// markerClusterIns.setData();
{
key: "3",
label: "无需处理",
},
{
key: "4",
label: "其它",
}
],
},
})
this.formList.splice(7,0,{
label: "解除原因:", //
key: "relieveReason", //
isAlone: true, //
type: "input", //(el-input el-) input
options: { //elementformItem
type: "textarea",
autosize: true,
maxlength: 200,
autosize: { minRows: 3, maxRows: 3 },
showWordLimit: true,
}
})
} else {
this.$refs.FormConfigRef.validate()
.then((result) => {
this.loading = true;
request({
url: `/business/warning/falseAlarm`,
method: "post",
data: {
id: this.dialogData.id,
relieveType: result.relieveType,
relieveReason: result.relieveReason
},
}).then((result) => {
if (result.code == 200) Message.success("成功!");
else Message.error(result?.msg);
this.obverseVisible = false;
this.loading = false;
setTimeout(() => {
self.$root.$emit('delete-event');
//
self.$root.$emit('refresh-event');
}, 500);
});
})
.catch((err) => {
});
});
}
// 2024-05-18
// const id = this.dialogData.id;
// id &&
// this.$confirm("", "", {
// confirmButtonText: "",
// cancelButtonText: "",
// type: "warning",
// }).then(() => {
// request({
// url: `/business/warning/delete`,
// method: "post",
// data: { id },
// }).then((result) => {
// if (result.code == 200) Message.success("");
// else Message.error(result?.msg);
// const item = { title: "" };
// eventMap[`/${item.title}_close`]?.call(
// this,
// item,
// (item) => {
// return item?.extData?.id == id;
// },
// "special"
// );
// //
// this.$root.$emit('refresh-event');
// // markerClusterIns.setData();
// });
// });
},
getVehicleTypeList(fn) {
if (vehicleTypeList.length) {
@ -275,35 +349,6 @@ export default {
.then(({ data, code }) => {
if (code != 200) return Message.error("详情获取失败");
// data = {
// "searchValue": null,
// "createBy": null,
// "createTime": "2024-07-23 14:18:58",
// "updateBy": null,
// "updateTime": "2024-02-01 15:55:34",
// "remark": "111",
// "params": {},
// "id": "1",
// "stakeMark": "k103+900",
// "direction": "1",
// "deptId": null,
// "warningState": 1,
// "warningTime": null,
// "userId": null,
// "warningSource": 1,
// "warningLevel": null,
// "warningType": 1,
// "warningSubclass": null,
// "warningTitle": null,
// "otherConfig": null,
// "lane": null,
// "sectionName": null,
// "number": 0,
// "type": null,
// "sectionId": null,
// "longitude": "116.493888",
// "latitude": "36.291145"
// };
data.duration = this.convertSecToHHmmss(data.duration);
this.data = {
...data,
@ -334,16 +379,6 @@ export default {
},
updateEvent() {
this.btnLoading = true;
// console.log({
// id: this.dialogData.id,
// warningType: this.data.warningType,
// warningSubclass: this.data.warningSubclass,
// remark: this.data.remark,
// vehicleType: this.data.vehicleType,
// lane: this.data.lane
// })
request({
url: `/perceivedEvents/warning/updateWarning`,
method: "post",

146
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/RoadNetworkFacilities/chart.js

@ -0,0 +1,146 @@
import * as echarts from "echarts";
export const chartOption ={
color: ["#2AD9FD"],
xAxis: {
name: "日",
type: "category",
// boundaryGap: ["15%", "15%"],
nameTextStyle: {
color: "#2AD9FD",
align: "right",
fontSize: 15,
padding: [0, -15, 0, 0],
},
boundaryGap: false,
data: ['00:00','02:00','04:00','06:00'],
axisTick: {
show: false,
},
axisLabel: {
color: "#fff",
fontSize: 12,
},
axisLine: {
lineStyle: {
color: "#668598",
},
},
},
yAxis: [{
name: "雨量日计",
type: "value",
nameTextStyle: {
color: "#2AD9FD",
// align: "right",
fontSize: 15,
// padding: [0, -15, 0, 0],
},
// nameGap: 24,
splitLine: {
lineStyle: {
type: [6, 9],
color: "rgba(255,255,255, .3)",
// dashOffset: [10, 10],
// cap: 21,
// width: 2
},
},
axisLabel: {
color: "#fff",
fontSize: 12,
formatter: "{value}",
},
},{
name: "雨量累计",
type: "value",
nameTextStyle: {
color: "#2AD9FD",
// align: "right",
fontSize: 15,
// padding: [0, -15, 0, 0],
},
// nameGap: 24,
splitLine: {
lineStyle: {
type: [6, 9],
color: "rgba(255,255,255, .3)",
// dashOffset: [10, 10],
// cap: 21,
// width: 2
},
},
axisLabel: {
color: "#fff",
fontSize: 12,
formatter: "{value}",
},
}],
grid: {
left: 33,
top: 33,
bottom: 24,
right: 36,
},
tooltip: {
trigger: "axis",
backgroundColor: "rgba(0,0,0,0.36)",
borderWidth: 0,
textStyle: {
color: "#fff",
},
formatter: "{b}:{c}",
},
legend: {
textStyle: {
color: '#2AD9FD'
}
},
series: [
{
data: [1,2,3,4],
type: "line",
showSymbol: false,
smooth: true,
name: '计数',
lineStyle: {
color: "#2AD9FD",
},
areaStyle: {
opacity: 0.8,
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "rgb(90, 227, 255, .9)",
},
{
offset: 1,
color: "rgba(42,217,253,0)",
},
]),
},
}, {
data: [1,2,3,4],
type: "line",
showSymbol: false,
smooth: true,
name: '计数',
lineStyle: {
color: "#2AD9FD",
},
areaStyle: {
opacity: 0.8,
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "rgb(90, 227, 255, .9)",
},
{
offset: 1,
color: "rgba(42,217,253,0)",
},
]),
},
},
],
};

60
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/RoadNetworkFacilities/data.js

@ -419,33 +419,28 @@ export const tabList = {
labelWidth: "70px",
list: [
{
label: "道路编码",
key: "roadCode",
gridColumn: "3",
},
{
label: "道路名称",
key: "roadName",
gridColumn: "3",
label:"名称",
key: "crossingType",
gridColumn: "3"
},
{
label: "变坡点桩号",
key: "stakeMark1",
label: "方向",
key: "direction",
gridColumn: "3",
},
{
label: "方向",
key: "direction",
label: "所属机构",
key: "branchCenterFullName",
gridColumn: "3",
},
{
label: "起点桩号",
key: "startPileNumber",
label: "单位",
key: "groupCompany",
gridColumn: "3",
},
{
label: "终点桩号",
key: "endPileNumber",
label: "桩号",
key: "end_mark",
gridColumn: "3",
},
{
@ -458,31 +453,40 @@ export const tabList = {
key: "latitude",
gridColumn: "3",
},
],
},
{
name: "边坡测点数据",
key: "second",
labelWidth: "70px",
list: [
{
label: "直坡段长",
key: "segmentLength",
gridColumn: "3",
label:"醒目编号",
key: "pro_code",
gridColumn: "3"
},
{
label: "横坡",
key: "lateralSlope",
label: "标段编号",
key: "con_code",
gridColumn: "3",
},
{
label: "竖曲线半径",
key: "verticalCurveRadius",
label: "项目单位工程编号",
key: "unit_code",
gridColumn: "3",
},
{
label: "纵坡",
key: "longitudinalSlope",
label: "测点编号",
key: "meaPointNum",
gridColumn: "3",
},
{
label: "管养单位",
key: "managementAndMaintenanceUnit",
gridColumn: "6",
label: "测点名称",
key: "meaPointName",
gridColumn: "3",
},
],
},
],

91
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/RoadNetworkFacilities/index.vue

@ -5,12 +5,24 @@
<Video class="video-stream" :pileNum="dialogData.stakeMark" rangeIndex="upCamera" :showHeader="false" />
<!-- <Video class="video-stream" :pileNum="dialogData.stakeMark" /> -->
</div>
<div class="SolarEnergy">
<ElTabs v-model="activeName" class="tabs">
<ElTabPane v-for="item in formList" :key="item.key" :label="item.name" :name="item.key">
<Descriptions :labelWidth="item.labelWidth" :list="item.list" :data="data" style="gap: 12px" column="6" />
</ElTabPane>
<ElTabPane label="测点历史数据">
<el-date-picker
v-model="daterangeChangeTime"
size="mini"
style="width: 320px;float:right;margin-bottom: 10px;"
value-format="yyyy-MM-dd"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
></el-date-picker>
<div class='chart LineChart' ref="chartRef" />
</ElTabPane>
</ElTabs>
</div>
@ -27,6 +39,10 @@ import Video from "@screen/components/VideoMulti";
import request from "@/utils/request";
import { dialogDelayVisible } from "./../mixin";
import { tabList } from './data'
import { DirectionTypes } from "@screen/utils/enum.js"
import * as echarts from "echarts";
import { chartOption } from "./chart"
import moment from "moment";
//
export default {
@ -50,28 +66,91 @@ export default {
deviceState: "0",
deviceVendors: "XXX厂家",
},
formList: []
formList: [],
dateRange:[],
daterangeChangeTime:[]
};
},
watch: {
daterangeChangeTime: {
handler(val) {
this.dateRange = [moment(val[0]).valueOf(),moment(val[1]).valueOf()];
this.bindListAsync();
},
},
},
async created() {
let dData = { ...this.dialogData };
this.formList = tabList[dData.facilityType]
if (dData.facilityType)
if (dData.otherConfig) {
let otherConfig = JSON.parse(dData.otherConfig);
dData.latitude = otherConfig.dimension
dData = { ...dData, ...otherConfig }
if(dData.direction){
dData.direction = DirectionTypes[dData.direction]
}
let resPointList = await request({
url: `sideSlope/GetMeasurePointList`,
method: "get",
});
if (resPointList.code != 200) return Message.error(resPointList?.msg);
let pointList = {};
if(resPointList.data && resPointList.data.result && resPointList.data.result.length > 0){
pointList = resPointList.data.result[0]
}
dData = { ...dData, ...otherConfig,...pointList }
//echart
}
this.data = dData;
// console.log('this.data', this.data)
this.daterangeChangeTime = [moment().startOf('months').format('YYYY-MM-DD'),moment().endOf('months').format('YYYY-MM-DD')]
console.log('this.data', this.data)
},
methods: {
async bindListAsync(){
let res = await request({
url: `sideSlope/GetPointDataListAsync`,
method: "get",
params:{
projCode: this.data.pro_code,
unitCode: this.data.unit_code,
meaPointNum: this.data.meaPointNum,
starttime: this.dateRange[0],
endtime: this.dateRange[1],
}
});
if (res.code != 200) return Message.error(res?.msg);
const cdata = [];
const cseries1 = [];
const cseries2 = [];
res.data.forEach(e => {
cdata.push((moment(e.measureTime).format('YYYY-MM-DD')))
cseries1.push(e.data[0].value)
cseries2.push(e.data[0].cum)
});
chartOption.xAxis.data = cdata;
chartOption.series[0].data = cseries1;
chartOption.series[1].data = cseries2;
const chartIns = echarts.init(this.$refs.chartRef);
chartIns.setOption(chartOption);
}
},
};
</script>
<style lang="scss" scoped>
.LineChart {
width: 450px !important;
height: 160px;
overflow: hidden;
}
.RoadNetworkFacilities {
width: 452px;
color: #fff;
@ -103,7 +182,7 @@ export default {
flex: 1;
display: flex;
flex-direction: column;
height: 260px;
::v-deep {
.el-tabs__content {
flex: 1;

5
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/TrafficIncidents/index.vue

@ -163,7 +163,6 @@ export default {
// let data = new FormData();
// data.append("eventId", this.dialogData.id);
// postCompleteEvent(data).then((result) => {
// console.log('--------', result)
// if (result.code != 200) return [];
// this.$message.success("");
// this.$emit('traffic-relieve', this.data);
@ -190,6 +189,7 @@ export default {
<style lang="scss" scoped>
.TrafficIncidents {
width: 600px;
color: #fff;
display: flex;
flex-direction: column;
@ -244,7 +244,8 @@ export default {
gap: 9px;
width: 100%;
justify-content: flex-end;
margin: 20px 0px -20px 0px;
// margin: 20px 0px -20px 0px;
height: 40px;
}
</style>

10
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/mixin.js

@ -25,13 +25,9 @@ export const dialogDelayVisible = {
computed: {
obverseVisible: {
set(bool) {
if(this.visibleClose){
try {
typeof this.visibleClose === "function" && this.visibleClose?.(bool);
} catch (error) {}
}
try {
typeof this.visibleClose === "function" && this.visibleClose?.(bool);
} catch (error) {}
setTimeout(() => {
this.$emit("change", bool);
}, 180);

26
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/HomeFrameControl/index.vue

@ -21,7 +21,8 @@
<span class="close" @click="() => { this.activeIcon = null; }">
<i class="el-icon-close" />
</span>
<div v-if="tabAction === '1'" style="width:70vw; min-height: 500px;">
<!-- 批量管控 -->
<div v-if="tabAction === '1'" style="width:800px; min-height: 320px;">
<Form v-model="data" labelWidth="90px" column="2" class="form" ref="FormConfigRef" :formList="formList" />
<component ref="ControlComponent" :is="componentMap[DeviceTopics[data.deviceType]]" :isMultiControl="true"
:visible="true" :selectItems="data.childType" @update:activeIcon="(val) => { this.activeIcon = val }"
@ -33,7 +34,8 @@
<Button style="background-color: rgba(0, 179, 204, 0.3)" @click.native="cancelClick"> 取消 </Button>
</div>
</div>
<div v-if="tabAction === '2'" style="width:70vw; height: 500px; overflow-y:auto" class="cardPanel">
<!-- 定时管控 -->
<div v-if="tabAction === '2'" style="width:800px; height: 320px; overflow-y:auto" class="cardPanel">
<Empty v-if="!data2.length" class="no-data" style="position: absolute">暂无数据</Empty>
<template v-else>
<div class="cardBox" v-for="(item, index) in data2" :key="index">
@ -55,20 +57,21 @@
</div>
</template>
</div>
<div v-if="tabAction === '3'" style="width:70vw;height: 500px;display: flex;flex-direction: column; justify-content: center;align-items: flex-start;" >
<!-- 管控记录 -->
<div v-if="tabAction === '3'" style="width:800px;height: 320px;display: flex;flex-direction: column; justify-content: center;align-items: flex-start;" >
<Form v-model="dataRecord" style="width:100%;" labelWidth="90px" column="2" class="form" ref="FormRecordRef" :formList="formRecord" />
<Table :data="tableData" height="500px" style="margin: 20px;width:95%">
<ElTableColumn label="管控时间" prop="operTime" width="300"/>
<ElTableColumn label="管控时间" prop="operTime" width="200"/>
<ElTableColumn label="设备名称" prop="dcDeviceName"/>
<ElTableColumn label="管控方式" prop="operType" width="200"/>
<ElTableColumn label="操作人" prop="operName" width="200"/>
<ElTableColumn label="执行结果" prop="remark" width="150" >
<ElTableColumn label="管控方式" prop="operType" width="100"/>
<ElTableColumn label="操作人" prop="operName" width="100"/>
<ElTableColumn label="执行结果" prop="remark" width="80" >
<template slot-scope="scope">
<el-popover
placement="top-start"
width="400"
width="120"
trigger="hover"
:content="scope.row.jsonResult">
:content="scope.row.remark||'暂无结果'">
<el-button slot="reference" class="btnResult">查看</el-button>
</el-popover>
</template>
@ -76,7 +79,7 @@
</Table>
<!-- 分页 -->
<div class="footer" style="margin-top:-20px;margin-bottom: 30px">
<div class="footer">
<ElPagination @current-change="bindRecord" @size-change="onSizeChange" width="'100%'" :page-sizes="[10, 20, 30, 40, 50]"
:page-size="searchData.pageSize" :current-page.sync="searchData.pageNum" layout="total, sizes, prev, pager, next"
:total="tableTotal" class="Pagination">
@ -482,6 +485,7 @@ export default {
})
.then((result) => {
if (result.code != 200) return;
console.log('########',result)
result.rows.forEach(e => {
e.operTime = moment(e.operTime).format('YYYY-MM-DD HH:mm:ss')
e.operType = _.find(this.Enum_ControlType,{key:e.operType}).label
@ -515,6 +519,7 @@ div.el-popper.global-input-search-popover {
// margin-top: 6vh;
.body {
width: 800px;
.title {
background: linear-gradient(90deg,
#237e9b 0%,
@ -523,7 +528,6 @@ div.el-popper.global-input-search-popover {
position: absolute;
top: 0;
left: 0;
width: 100%;
}
.close {

1
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/index.vue

@ -248,7 +248,6 @@ export default {
const key = getHandleDeviceType(item) || `${this.active}/${item.title}`;
const status = item.status;
console.log(item.status,'------------')
if (!status) { //
this.nowSelected = item.title;
this.nowSelectedCompleted = false;

10
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/utils/map.js

@ -57,19 +57,16 @@ export class MarkerCluster {
if (!Array.isArray(data)) data = [data];
this.data.push(...data);
if (
!this.markerCluster ||
this.markerCluster.getMap() !== Vue.prototype.mapIns
)
){
await this.setMarkerCluster();
const map = this.getMap();
}
console.log(
"%c [ data ]-227-「map.js」",
"font-size:15px; background:#641f14; color:#a86358;",
data
"font-size:15px; background:#641f14; color:#a86358;"
);
this.markerCluster.addData(data);
console.log(
@ -78,6 +75,7 @@ export class MarkerCluster {
this.markerCluster
);
const map = this.getMap();
map.setZoom(10);
setTimeout(() => {

6
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/CrowdnessIndicatorRankings/index.vue

@ -287,7 +287,6 @@ export default {
}
const self = this;
setTimeout(() => {
console.log(self.detailData,'---------------')
// map
const { AMap, mapIns } = self.$refs.AMapContainerRef.getMapInstance();
const { longitude, dimension, eventName } = self.detailData;
@ -298,8 +297,6 @@ export default {
);
self.addMarker(center, icon, 1);
mapIns.setZoomAndCenter(12, center);
//
// console.log(self.detailData,mapIns, AMap, "############");
}, 500);
},
addMarker(position, icon, state, fn = null) {
@ -409,6 +406,9 @@ export default {
}
}
}
::v-deep .el-popover {
z-index: 2 !important; /* 请根据你的项目需求设置合适的值 */
}
.weather {
width: 435px;
span {

139
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DeviceControl/components/ScopeTable.vue

@ -4,17 +4,16 @@
<el-col :span="7">
<!-- 设备类型 -->
<el-select v-model="tableInfo.deviceType" placeholder="" @change="changeDeviceType" transfer="true"
style="width: 123px;">
style="width: 120px;">
<el-option v-for="item in deviceOptions" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
</el-col>
<el-col :span="1">
</el-col>
<el-col :span="7">
<!-- 规则条件 -->
<el-select v-model="tableInfo.searchRule" placeholder="" style="width: 123px;">
<el-select v-model="tableInfo.searchRule" placeholder="" style="width: 120px;">
<el-option v-for="item in zyOptions" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
@ -28,10 +27,33 @@
<!-- 公里 -->
<el-input-number v-if="tableInfo.searchRule == 4" v-model="tableInfo.number" :min="0" :max="9999"
style="width: 75px;"></el-input-number>
<span v-if="tableInfo.searchRule == 4" style="width: 56px;">公里</span>
<span v-if="tableInfo.searchRule == 4" style="width: 56px;"></span>
</el-col>
<el-col :span="4" v-if=" (tableInfo.deviceType == '2' || tableInfo.deviceType == 5)">
<div class="firstBtns">
<ButtonGradient class="title-button" @click.native="$emit('onConfirm', index)">
<i class="el-icon-check"></i>
</ButtonGradient>
<el-dropdown>
<span class="el-dropdown-link">
<ButtonGradient class="title-button">
<i class="el-icon-more"></i>
</ButtonGradient>
</span>
<el-dropdown-menu slot="dropdown"
style="background-color: #102833;border: solid 1px #0b5575;">
<el-dropdown-item icon="el-icon-plus" @click.native="$emit('onAdd', index)">
新增
</el-dropdown-item>
<el-dropdown-item icon="el-icon-delete" @click.native="$emit('onDel', index)">
删除
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<el-col :span="4">
</div>
</el-col>
<el-col :span="4" v-else>
<div class="firstBtns">
<ButtonGradient class="title-button" @click.native="$emit('onAdd')">
<i class="el-icon-plus"></i>
@ -42,7 +64,7 @@
</div>
</el-col>
</el-row>
<!-- 设备列表 -->
<el-row v-if="tableInfo.searchRule == 1">
<!-- 设备列表 -->
<el-select v-model="tableInfo.devList" placeholder="请选择设备" multiple collapse-tags>
@ -57,17 +79,11 @@
</el-col>
<!-- 可变信息标识 -->
<el-col v-if="tableInfo.deviceType == 2" :span="8">
<el-select v-model="tableInfo.zx_operationType" placeholder="请选择">
<el-select v-model="tableInfo.zx_operationType" disabled placeholder="请选择">
<el-option label="自定义发布" :value="1"></el-option>
<el-option label="智能发布" :value="2"></el-option>
</el-select>
</el-col>
<el-col v-if="tableInfo.deviceType == 2 && tableInfo.zx_operationType == 1" :span="8">
<el-input @click.native="clickQbb('zx_content')" placeholder="请选择" v-model="tableInfo.zx_content"
readonly>
<i slot="suffix" class="el-input__icon el-icon-search"></i>
</el-input>
</el-col>
<!-- 疲劳唤醒 -->
<el-col v-if="tableInfo.deviceType == 10" :span="8">
<el-select v-model="tableInfo.zx_name" placeholder="工作模式">
@ -104,33 +120,49 @@
</el-col>
<!-- 语音广播 -->
<el-col v-if="tableInfo.deviceType == 5" :span="8">
<el-select v-model="tableInfo.zx_operationType" placeholder="请选择">
<el-select v-model="tableInfo.zx_operationType" disabled placeholder="请选择">
<el-option label="自定义发布" :value="1"></el-option>
<el-option label="智能发布" :value="2"></el-option>
</el-select>
</el-col>
<el-col v-if="tableInfo.deviceType == 5 && tableInfo.zx_operationType == 1" :span="10">
<!-- <el-col v-if="tableInfo.deviceType == 5 && tableInfo.zx_operationType == 1" :span="10">
<el-input v-model="tableInfo.zx_content" placeholder="请输入发布内容"></el-input>
</el-col>
</el-col> -->
</el-row>
<el-row v-if="(tableInfo.deviceType == 2 || tableInfo.deviceType == 5) && tableInfo.executeConfig && tableInfo.executeConfig.contentList">
<el-col :span="24">
<div class="keep-ratio" origin="top" v-for="(itm,idx) of tableInfo.executeConfig.contentList">
<div class="contentLabel" >{{ itm.deviceName }}</div>
<div class="contentValue" v-if="itm.isEditor === undefined">
<div class="contentBoard" >{{ itm.content }}</div>
<ButtonGradient class="btn" @click.native="$emit('onContentEdit', {field:'executeConfig',index,idx,type:'edit'})">
<i class="el-icon-edit"></i>
</ButtonGradient>
</div>
<div class="contentValue" v-else>
<input class="contentBoard" placeholder="请输入文字" v-model="itm.content"></input>
<ButtonGradient class="btn" style="margin-left: 5px;" @click.native="$emit('onContentEdit', {field:'executeConfig',index,idx,type:'cancel'})">
<i class="el-icon-refresh-left"></i>
</ButtonGradient>
<ButtonGradient class="btn" style="margin-left: 5px;" @click.native="$emit('onContentEdit', {field:'executeConfig',index,idx,type:'confirm'})">
<i class="el-icon-check"></i>
</ButtonGradient>
</div>
</div>
</el-col>
</el-row>
<el-row v-if="tableInfo.deviceType !== 5">
<el-col :span="3">
<p>恢复:</p>
</el-col>
<!-- 可变信息标识 -->
<el-col v-if="tableInfo.deviceType == 2" :span="8">
<el-select v-model="tableInfo.hf_operationType" placeholder="请选择">
<el-select v-model="tableInfo.hf_operationType" disabled placeholder="请选择">
<el-option label="自定义发布" :value="1"></el-option>
<el-option label="还原上次" :value="2"></el-option>
</el-select>
</el-col>
<el-col v-if="tableInfo.deviceType == 2 && tableInfo.hf_operationType == 1" :span="8">
<el-input @click.native="clickQbb('hf_content')" placeholder="请选择" v-model="tableInfo.hf_content"
readonly>
<i slot="suffix" class="el-input__icon el-icon-search"></i>
</el-input>
</el-col>
<!-- 疲劳唤醒 -->
<el-col v-if="tableInfo.deviceType == 10" :span="8">
<el-select v-model="tableInfo.hf_name" placeholder="工作模式">
@ -166,17 +198,18 @@
</el-select>
</el-col>
<!-- 语音广播 -->
<!-- <el-col v-if="tableInfo.deviceType == 5" :span="4">
<el-select v-model="tableInfo.hf_operationType" placeholder="请选择">
<el-option label="自定义发布" :value="1"></el-option>
<el-option label="智能发布" :value="2"></el-option>
</el-select>
</el-col> -->
<el-col v-if="tableInfo.deviceType == 5" :span="12">
<el-input v-model="tableInfo.hf_content" placeholder="请输入发布内容"></el-input>
</el-col>
</el-row>
<el-row v-if="tableInfo.deviceType == 2 && tableInfo.recoverConfig && tableInfo.recoverConfig.contentList">
<el-col :span="24">
<div class="keep-ratio" origin="top" v-for="(item,index) of tableInfo.recoverConfig.contentList">
<div class="contentLabel" >{{ item.deviceName }}</div>
<div class="contentValue"><div class="contentBoard" >{{ item.content }}</div><el-button icon="el-icon-edit"></el-button></div>
</div>
</el-col>
</el-row>
<!-- 情报板弹窗 -->
<QbbDialog :visible="isShowDialog" :info="qbbData" @close="onCloseDialog" @dialogSubmit="dialogSubmit" />
</div>
@ -229,7 +262,7 @@ export default {
label: '事发上游最近'
},
{
value: 3,
value: 4,
label: '最近公里数'
},
],
@ -309,12 +342,9 @@ export default {
}
},
async mounted() {
// this.loadData(2);
},
methods: {
initData() {
},
initData() { },
async loadData(deviceType = 1) {
this.sbOptions = [];
let result = await request({
@ -347,14 +377,30 @@ export default {
this.isShowDialog = false;
},
dialogSubmit(data) {
console.log('qbbData', data)
this.tableInfo[this.clickQbbName] = data.content;
// this.tableData[this.index].otherConfig = JSON.stringify(data);
}
},
}
}
</script>
<style>
.el-dropdown-menu__item {
color: #fff !important;
&:hover {
background-color: #2ca5ad !important;
}
}
.el-dropdown-menu__item.is-active {
color: #409EFF;
background-color: #ecf5ff;
}
.el-dropdown-menu__item.is-disabled {
color: #409EFF;
background-color: #ecf5ff;
}
</style>
<style lang="scss" scoped>
.ScopeTable {
display: flex;
@ -382,5 +428,24 @@ export default {
}
.dropmenu {
color: white !important;
}
}
.contentValue{
display: flex;
width:100%;
align-items: center;
margin-bottom: 10px;
}
.contentBoard{
flex:1;
background-color: #000;
color:yellow;
padding: 9px 0px;
text-align: center;
}
.btn{
height:40px;
}
</style>

1
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DeviceControl/data.js

@ -4,6 +4,7 @@ export const defaultTableInfo = {
deviceType: 2,
searchRule: 1,
number: 0,
isDefault: true
// zx_operationType: 2,
// hf_operationType: 2,
};

64
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DeviceControl/index.vue

@ -7,6 +7,8 @@
:index="index"
@onAdd="onAdd"
@onDel="onDel"
@onConfirm="onConfirm"
@onContentEdit="onContentEdit"
></ScopeTable>
</el-row>
</div>
@ -59,7 +61,6 @@ export default {
this.initData(this.detailData);
},
initData(eventInfo) {
console.log("eventInfo", eventInfo);
request({
url: `business/plans/list/event/type`,
method: "post",
@ -72,7 +73,6 @@ export default {
this.tableData = [{ ...defaultTableInfo }];
return Message.warning("该事件暂无处置预案");
}
let dcExecuteAction = data[0].dcExecuteAction || [];
this.planId = data[0].id;
@ -81,13 +81,14 @@ export default {
let action = { ...it };
if (it.executeConfig) {
let executeConfig = JSON.parse(it.executeConfig);
let execute = this.mapKeys(executeConfig, "zx_");
action = { ...action, ...execute };
action = { ...action, ...execute,...{executeConfig} };
}
if (it.recoverConfig) {
let recoverConfig = JSON.parse(it.recoverConfig);
let recover = this.mapKeys(recoverConfig, "hf_");
action = { ...action, ...recover };
action = { ...action, ...recover,...{recoverConfig} };
}
if (it.deviceList) {
action.devList = it.deviceList.split(",").map((str) => str);
@ -120,6 +121,53 @@ export default {
}
this.tableData.splice(index, 1);
},
onConfirm(index){
const param = {
"dcEvent": this.detailData,
"dcExecuteAction": {
"id": "",
"emergencyPlansId": "",
"deviceType": this.tableData[index].deviceType,
"searchRule": this.tableData[index].searchRule,
"number": this.tableData[index].number,
"deviceList": this.tableData[index].devList.join(','),
"executeConfig": "{\"operationType\":2}",
"recoverConfig": "{\"operationType\":2}"
}
}
if(this.tableData[index].isDefault !== true){
param['dcExecuteAction']['executeConfig'] = JSON.stringify(this.tableData[index]['executeConfig'])
param['dcExecuteAction']['recoverConfig'] = JSON.stringify(this.tableData[index]['recoverConfig'])
}
request({
url: `business/plans/list/event/emergencyPlans`,
method: "post",
data: param,
}).then(result=>{
if (result.code != 200) return Message.error(result?.msg);
console.log(this.tableData[index])
let data = result.data;
this.tableData[index].executeConfig = JSON.parse(data.executeConfig)
this.tableData[index].recoverConfig = JSON.parse(data.recoverConfig)
if(this.tableData[index].isDefault === true){
this.tableData[index].zx_operationType = this.tableData[index].executeConfig?.operationType;
this.tableData[index].hf_operationType = this.tableData[index].recoverConfig?.operationType;
}
this.tableData = _.cloneDeep(this.tableData)
})
},
onContentEdit({field,index,idx,type}){
if(type==='edit'){
this.tableData[index][field]['contentList'][idx]['isEditor'] = this.tableData[index][field]['contentList'][idx].content;
} else if(type === 'cancel'){
this.tableData[index][field]['contentList'][idx]['content'] = this.tableData[index][field]['contentList'][idx].isEditor;
delete this.tableData[index][field]['contentList'][idx].isEditor
} else if(type === 'confirm'){
delete this.tableData[index][field]['contentList'][idx].isEditor
}
this.tableData = _.cloneDeep(this.tableData)
},
handleSubmit(value = 1) {
let dcArr = [];
this.tableData.forEach((item) => {
@ -133,6 +181,12 @@ export default {
}
let zxData = {},
hfData = {};
if(item.executeConfig){
zxData['executeConfig'] = item.executeConfig
}
if(item.recoverConfig){
zxData['recoverConfig'] = item.recoverConfig
}
Object.keys(item).forEach((key) => {
if (/^zx_/.test(key)) {
let keyName = key.substring(3);
@ -163,12 +217,12 @@ export default {
id: this.detailData.id,
eventType: this.detailData.eventType,
stakeMark: this.detailData.stakeMark,
subclass: this.detailData.subclass,
direction: this.detailData.direction == "菏泽方向" ? "1" : "3",
},
};
console.log("reqData", reqData);
// return;
request({
url: "/business/plans/event/confirm",
method: "post",

4
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DispatchLiaison/index.vue

@ -100,7 +100,7 @@ export default {
watch: {
"provideData.detail"(newValue, oldValue) {
this.provideDetail = newValue;
this.getCommandDispatch();
this.getVehicleTypeList();
// console.log("", this.provideDetail);
},
@ -130,7 +130,6 @@ export default {
}
});
this.dispatchList = res.data.listData;
console.log("调度联络返回============", res.data);
this.dispatchData = res.data.resource ? res.data.resource : {};
this.staff = [];
this.vehicle = [];
@ -174,6 +173,7 @@ export default {
.then(({ data, code }) => {
if (code != 200) return; //Message.error("");
this.vehicleTypeList = data;
this.getCommandDispatch();
})
.catch((err) => {});
},

55
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DisposalProcess/DialogVisible/index.vue

@ -17,7 +17,7 @@
ref="FormReportRef"
:formList="reportList"
v-model="reportData"
label-width="100px"
label-width="150px"
/>
<div class="footer">
<Button @click.native="onSubmit">保存</Button>
@ -574,7 +574,7 @@ import htmlDocx from "html-docx-js/dist/html-docx";
import Dialog from "@screen/components/Dialog/index";
import Form from "@screen/components/FormConfig";
import { formList, reportList } from "./data";
import { tabConfigList } from "../../EventInformation/components/EditEventInformationDialog/data.js";
import { configList } from "../../EventInformation/components/EditEventInformationDialog/data.js";
import Button from "@screen/components/Buttons/Button.vue";
import request from "@/utils/request";
import Pagination from "@screen/components/Pagination.vue";
@ -680,7 +680,7 @@ export default {
url: `/dc/system/event/eventSubclass/${this.eventId}`, //
method: "get",
});
if (infoData.code != 200) return Message.error(infoData?.msg);
let info = infoData.data;
if (typeof info.stakeMark == "string") {
@ -689,42 +689,9 @@ export default {
}
this.fData = info;
let configList = tabConfigList.find(
(item) => item.label == this.fData.eventName
);
this.formConfigList = configList.formConfig.list;
this.formConfigList = configList[info.eventName];
await Promise.all([
//
request({
url: `/business/road/query`,
method: "get",
})
.then((result) => {
if (result.code != 200) return Message.error(result?.msg);
this.roads = [];
result.data.forEach((it) => {
this.roads.push({ key: it.id, label: it.roadName });
});
})
.catch((err) => {
Message.error("查询失败4", err);
}),
//
request({
url: `/system/dict/data/type/iot_event_direction`,
method: "get",
})
.then((result) => {
if (result.code != 200) return Message.error(result?.msg);
this.direction = [];
result.data.forEach((it) => {
this.direction.push({ key: it.dictValue, label: it.dictLabel });
});
})
.catch((err) => {
Message.error("查询失败5", err);
}),
// 1 2 3 4 5 6
request({
url: `/business/facility/query`,
@ -747,12 +714,6 @@ export default {
]);
this.formConfigList.forEach((it) => {
if (it.key == "direction") {
it.options.options = this.direction;
}
if (it.key == "roadId") {
it.options.options = this.roads;
}
if (it.key == "dcEventServiceArea.facilityId") {
it.options.options = this.lwss.filter((ss) => ss.type == 6);
}
@ -992,18 +953,16 @@ export default {
padding: 0;
}
.el-textarea__inner {
caret-color: #000;
caret-color: #000 !important;
margin-bottom: 20px;
font-size: 1.14583vw;
font-family: 仿宋;
margin: 0 20px;
height: 400px !important;
border-width: initial;
border-style: none;
border-color: initial;
border-image: initial;
border: none !important;
background: #fff;
color: #000;
color: #000 !important;
padding: 0;
}
}

8
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DisposalProcess/index.vue

@ -133,12 +133,12 @@
</div>
</Card>
<DialogVisible
v-if="dialogVisible !== null"
:visible="dialogVisible"
@update:value="handleClose"
@update:type="handleUpdate"
:eventId="eventId"
/>
<!-- :data="dispatchList" -->
</div>
</template>
@ -181,7 +181,7 @@ export default {
return {
provideDetail: {},
dialogType: "",
dialogVisible: false,
dialogVisible: null,
eventId: "",
test: null,
testRadio: "input",
@ -278,6 +278,7 @@ export default {
return {
// title: "",
id: item.processId,
time: item.operationTime
? new Date(item.operationTime).toLocaleString()
: null,
@ -287,6 +288,7 @@ export default {
processId: item.processId,
processName: item.processName,
type: item.type,
processType: item.processType,
// posts: ''
};
});
@ -324,7 +326,7 @@ export default {
processName: this.processName,
context: content,
// file: this.imageUrl,
type: type ? type.join(",") : "text",
type: type && type.length > 0 ? type.join(",") : "text",
source: 1,
processType: this.processType,
};

4636
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/EventInformation/components/EditEventInformationDialog/data.js

File diff suppressed because it is too large

2572
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/EventInformation/components/EditEventInformationDialog/data_back.js

File diff suppressed because it is too large

77
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/EventInformation/components/EditEventInformationDialog/index.vue

@ -1,5 +1,5 @@
<template>
<Dialog v-model="modelVisible" title="修改事件信息" width="1100px" top="10%">
<Dialog v-model="modelVisible" title="修改事件信息" width="1100px" top="5%">
<div class="EditEventInformationDialog">
<Form
class="form"
@ -24,7 +24,7 @@ import Dialog from "@screen/components/Dialog/index";
import Form from "@screen/components/FormConfig";
import Button from "@screen/components/Buttons/Button.vue";
import request from "@/utils/request";
import { tabConfigList } from "./data.js";
import { configList } from "./data.js";
import { Message } from "element-ui";
import { provideMixin } from "./../../../../mixin";
@ -65,7 +65,6 @@ export default {
return this.visible;
},
set(val) {
console.log("val", val);
this.$emit("close", val);
},
},
@ -77,57 +76,29 @@ export default {
url: `/dc/system/event/eventSubclass/${this.detailData.id}`, //
method: "get",
});
console.log('-----',infoData)
if (infoData.code != 200) return Message.error(infoData?.msg);
this.resultEventData = { ...infoData.data };
let info = infoData.data;
if (typeof info.stakeMark == "string") {
let numbers = info.stakeMark.match(/\d+/g).map(Number);
// console.log('numbers', numbers);
let numbers = info.stakeMark.match(/\d+/g).map(String);
info.stakeMark = numbers;
}
if (typeof info.lang == "string") {
info.lang = info.lang.split(",");
}
if(info.eventSource){
info.eventSource = info.eventSource.toString()
}
if(info.dcEventVehicleAccident && info.dcEventVehicleAccident.weatherCondition){
info.dcEventVehicleAccident.weatherCondition = info.dcEventVehicleAccident.weatherCondition.toString()
}
this.fData = info;
let configList = tabConfigList.find(
(item) => item.label == this.fData.eventName
);
this.formConfigList = configList.formConfig.list;
this.formConfigList = configList[info.eventName];
await Promise.all([
//
request({
url: `/business/road/query`,
method: "get",
})
.then((result) => {
if (result.code != 200) return Message.error(result?.msg);
this.roads = [];
result.data.forEach((it) => {
this.roads.push({ key: it.id, label: it.roadName });
});
})
.catch((err) => {
Message.error("查询失败4", err);
}),
//
request({
url: `/system/dict/data/type/iot_event_direction`,
method: "get",
})
.then((result) => {
if (result.code != 200) return Message.error(result?.msg);
this.direction = [];
result.data.forEach((it) => {
this.direction.push({ key: it.dictValue, label: it.dictLabel });
});
})
.catch((err) => {
Message.error("查询失败5", err);
}),
// 1 2 3 4 5 6
request({
url: `/business/facility/query`,
@ -149,14 +120,7 @@ export default {
Message.error("查询失败6", err);
}),
]);
this.formConfigList.forEach((it) => {
if (it.key == "direction") {
it.options.options = this.direction;
}
if (it.key == "roadId") {
it.options.options = this.roads;
}
if (it.key == "dcEventServiceArea.facilityId") {
it.options.options = this.lwss.filter((ss) => ss.type == 6);
}
@ -164,10 +128,10 @@ export default {
},
onSubmit() {
this.$refs.FormConfigRef.validate().then((formData) => {
this.submitting = true;
let eventType = this.resultEventData.eventType;
formData.eventType = eventType;
if (
(eventType == 1 || eventType == 2) &&
Array.isArray(formData.lang)
@ -189,7 +153,7 @@ export default {
let endStakeMark = formData.endStakeMark;
let strMark =
endStakeMark && endStakeMark.length > 0
? "K" + endStakeMark[0] + "+" + endStakeMark[1]
? "K" + endStakeMark[0].padStart(3,'0') + "+" + endStakeMark[1]
: "";
if (eventType == 4) {
formData.dcEventTrafficCongestion.endStakeMark = strMark;
@ -210,11 +174,10 @@ export default {
// ...formData,
// id: this.resultEventData.id,
// eventState: this.resultEventData.eventState,
// stakeMark: (stakeMark && stakeMark[0] != null) ? ((stakeMark && stakeMark.length > 0) ? ('K' + stakeMark[0] + '+' + stakeMark[1]) : '') : '',
// stakeMark: (stakeMark && stakeMark[0] != null) ? ((stakeMark && stakeMark.length > 0) ? ('K' + stakeMark[0].padStart(3,'0') + '+' + stakeMark[1]) : '') : '',
// })
// this.submitting = false;
// return;
request({
url: `/dc/system/event`,
method: "put",
@ -250,11 +213,10 @@ export default {
<style lang="scss" scoped>
.EditEventInformationDialog {
gap: 9px;
width: 1050px;
height: 850px;
width: 100%;
height: 700px;
display: flex;
flex-direction: column;
.form {
flex: 1;
overflow-y: auto;
@ -264,6 +226,7 @@ export default {
display: flex;
justify-content: end;
gap: 15px;
margin-top: 9px;
}
}
</style>

2
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/EventInformation/images/congestion.svg

@ -1,3 +1,3 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path id="Vector" d="M9 0C4.02945 0 0 4.02942 0 9C0 13.9706 4.02945 18 9 18C13.9706 18 18 13.9706 18 9C18 4.02944 13.9707 0 9 0ZM13.9486 6.84275L8.15496 12.7718C7.88844 13.0446 7.45606 13.0446 7.18957 12.7718L4.05145 9.56015C3.78475 9.28735 3.78475 8.84498 4.05145 8.5721C4.31795 8.2992 4.75035 8.2992 5.01684 8.5721L7.67229 11.2896L12.983 5.85462C13.2497 5.58174 13.6821 5.58174 13.9486 5.85462C14.2153 6.12747 14.2153 6.56987 13.9486 6.84275H13.9486Z" fill="#FF5F5F"/>
<path id="Subtract" fill-rule="evenodd" clip-rule="evenodd" d="M9 18C13.9706 18 18 13.9706 18 9C18 4.02944 13.9706 0 9 0C4.02944 0 0 4.02944 0 9C0 13.9706 4.02944 18 9 18ZM13.5184 4.429C13.782 4.67715 13.7889 5.09389 13.5337 5.35067L9.90677 8.99979L13.5341 12.6493C13.7894 12.9061 13.7824 13.3229 13.5188 13.571C13.2651 13.8098 12.8674 13.8032 12.6218 13.5561L9 9.9121L5.37816 13.5561C5.13256 13.8032 4.73487 13.8098 4.48119 13.571C4.21758 13.3229 4.21065 12.9061 4.46586 12.6493L8.09323 8.99979L4.46628 5.35067C4.21107 5.09389 4.218 4.67715 4.48161 4.429C4.73529 4.19021 5.13298 4.19682 5.37857 4.44392L9 8.08748L12.6214 4.44392C12.867 4.19682 13.2647 4.19021 13.5184 4.429Z" fill="#FF5F5F"/>
</svg>

Before

Width:  |  Height:  |  Size: 574 B

After

Width:  |  Height:  |  Size: 797 B

6
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/TrafficControl/components/AddControlEventInfoDialog/data.js

@ -91,7 +91,7 @@ export const tabConfigList = [
if (value == "3-2") {
facilityType = 1;
} else if (value == "3-3") {
facilityType = 3;
facilityType = 4;
} else if (value == "3-4") {
facilityType = 6;
}
@ -404,8 +404,7 @@ export const tabConfigList = [
isAlone: false,
required: true,
options: {
options: [],
multiple: true,
options: []
},
visible: (data) => {
if (data?.eventSubclass == "3-3") {
@ -451,6 +450,7 @@ export const tabConfigList = [
required: true,
options: {
options: [],
multiple: true,
},
visible: (data) => {
if (data?.eventSubclass == "3-3") {

11
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/index.vue

@ -63,8 +63,14 @@ export default {
let h = window.location.href.split("=");
if (h.length === 2) {
this.detailId = window.location.href.split("=")[1];
localStorage.setItem('commandDispatch',this.detailId)
} else {
this.detailId = "b825c7bbf4de43cdb8f689e270adf7a1";
let id = localStorage.getItem('commandDispatch')
if(id && id !== ''){
this.detailId = id;
} else {
this.detailId = "b825c7bbf4de43cdb8f689e270adf7a1";
}
}
this.getDetail();
},
@ -72,12 +78,11 @@ export default {
getDetail() {
// -
request({
url: `/dc/system/event/${this.detailId}`,
url: `/dc/system/event/eventSubclass/${this.detailId}`,
method: "GET",
})
.then((result) => {
if (result.code != 200) return;
this.provideData.detail = result.data;
console.log("这里是事件详情", this.provideData.detail);
if (

2
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/EventDetailDialog/data.js

@ -1,4 +1,4 @@
export const formList = [
export const _formList = [
{
label: "事件源:",
key: "stringEventSource",

139
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/EventDetailDialog/index.vue

@ -3,7 +3,7 @@
<div class="EventDetail" :style="{
height: activeName == '-1' || activeName == '0' ? '380px' : '698px',
}">
<Form :formList="formList" :dFormData="formData" label-width="100px" />
<Form ref="FormConfigRef" :formList="formList" :dFormData="formData" label-width="100px" />
<div class="video-pic" :style="{
height: formData.component === 'VideoMulti' ? '242px' : undefined,
@ -53,7 +53,7 @@ import Dialog from "@screen/components/Dialog/index";
import TimeLine1 from "@screen/components/TimeLine/TimeLine1/index";
import TimeLine2 from "@screen/components/TimeLine/TimeLine2/index";
import Form from "@screen/components/FormConfig";
import { formList } from "./data";
import { _formList } from "./data";
// import { timeLine2List } from "@screen/pages/control/event/commandDispatch/Cards/DisposalProcess/data.js"
import Video from "@screen/components/Video";
import VideoMulti from "@screen/components/VideoMulti";
@ -98,7 +98,7 @@ export default {
},
data() {
return {
formList,
formList:[..._formList],
isShowDialog: false,
info: [],
timeLine1List: [
@ -128,6 +128,8 @@ export default {
return this.visible;
},
set(val) {
console.log(111)
this.formList = [..._formList]
this.$emit("update:value", val);
},
},
@ -169,14 +171,25 @@ export default {
rows.forEach(item =>{
this.timeLine2List.push({
time: moment(item.operationTime || new Date()).format(
id: item.processId,
time: item.operationTime
? new Date(item.operationTime).toLocaleString()
: null,
name: item.operatorName,
desc: item.context,
source: item.source,
processId: item.processId,
processName: item.processName,
type: item.type,
processType: item.processType,
/*time: moment(item.operationTime || new Date()).format(
"yyyy-MM-DD HH:mm:ss"
),
name: item.operatorName,
desc: item.context,
source: item.source,
posts: "",
direction: item.source == 1 ? "right" : "left",
direction: item.source == 1 ? "right" : "left",*/
});
})
@ -208,32 +221,59 @@ export default {
this.isShowDialog = false;
},
onDelete() {
if (this.formData.id) {
this.$confirm("确定误报吗1?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
// this.modelVisible = false;
// this.$emit('queryData', true);
// return;
if (this.activeName == "-1") {
if(this.formList[this.formList.length-1].key !== 'relieveReason' ){
this.formList.push({
label: "解除类型:",
key: "relieveType",
type: "RadioGroup",
isAlone: true,
required: true,
options: {
activeColor: "linear-gradient(180deg, #37E7FF 0%, #009BCC 100%)",
options: [
{
key: "1",
label: "误报解除",
},
{
key: "2",
label: "事件已结束",
},
{
key: "3",
label: "无需处理事件",
},
{
key: "4",
label: "其它",
}
],
},
})
this.formList.push({
label: "解除原因:", //
key: "relieveReason", //
isAlone: true, //
type: "input", //(el-input el-) input
options: { //elementformItem
type: "textarea",
autosize: true,
maxlength: 200,
autosize: { minRows: 3, maxRows: 3 },
showWordLimit: true,
}
})
} else {
this.$refs.FormConfigRef.validate()
.then((result) => {
request({
url: `/business/warning/delete`,
url: `/business/warning/falseAlarm`,
method: "post",
data: { id: this.formData.id },
}).then((result) => {
if (result.code == 200) Message.success("成功!");
else Message.error(result?.msg);
this.modelVisible = false;
this.$emit("queryData", true);
//
this.$root.$emit('delete-event');
});
} else {
request({
url: `dc/system/event/${this.formData.id}`,
method: "delete",
data: {
id: this.formData.id,
relieveType: result.relieveType,
relieveReason: result.relieveReason
},
}).then((result) => {
if (result.code == 200) Message.success("成功!");
else Message.error(result?.msg);
@ -242,9 +282,46 @@ export default {
//
this.$root.$emit('delete-event');
});
}
});
})
.catch((err) => {
});
}
// 2024-05-18
// if (this.formData.id) {
// this.$confirm("", "", {
// confirmButtonText: "",
// cancelButtonText: "",
// type: "warning",
// }).then(() => {
// if (this.activeName == "-1") {
// request({
// url: `/business/warning/delete`,
// method: "post",
// data: { id: this.formData.id },
// }).then((result) => {
// if (result.code == 200) Message.success("");
// else Message.error(result?.msg);
// this.modelVisible = false;
// this.$emit("queryData", true);
// //
// this.$root.$emit('delete-event');
// });
// } else {
// request({
// url: `dc/system/event/${this.formData.id}`,
// method: "delete",
// }).then((result) => {
// if (result.code == 200) Message.success("");
// else Message.error(result?.msg);
// this.modelVisible = false;
// this.$emit("queryData", true);
// //
// this.$root.$emit('delete-event');
// });
// }
// });
// }
},
onSubmit() {
// let url = "/business/plans/list/warning/type";

5
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/FormEvent/PresetFormItems.js

@ -540,11 +540,11 @@ export const isInTunnel = {
activeColor: "linear-gradient(180deg, #37E7FF 0%, #009BCC 100%)",
options: [
{
key: "1",
key: 1,
label: "是",
},
{
key: "0",
key: 0,
label: "否",
},
],
@ -728,7 +728,6 @@ export const locationMode = {
key: "dcEventAccident.locationType",
required: true,
type: "select",
default: "1",
options: {
options: [
{ key: 1, label: "高速主线" },

6
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/FormEvent/data.js

@ -546,7 +546,7 @@ export const tabConfigList = [
if (value == "3-2") {
facilityType = 1;
} else if (value == "3-3") {
facilityType = 3;
facilityType = 4;
} else if (value == "3-4") {
facilityType = 6;
}
@ -858,8 +858,7 @@ export const tabConfigList = [
isAlone: false,
required: true,
options: {
options: [],
multiple: true,
options: []
},
visible: (data) => {
if (data?.eventSubclass == "3-3") {
@ -905,6 +904,7 @@ export const tabConfigList = [
required: true,
options: {
options: [],
multiple: true,
},
visible: (data) => {
if (data?.eventSubclass == "3-3") {

19
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/FormEvent/index.vue

@ -4,16 +4,18 @@
<ElTabs v-model="activeName" @tab-click="handleChange">
<ElTabPane v-for="(item, index) in tabConfigList" :key="index" :label="item.label" :name="item.key" />
</ElTabs>
<Transition name="fade">
<Form class="form" ref="FormConfigRef" :formList="formConfig.list" v-bind="getFormOptions" labelWidth="120px" />
</Transition>
<div class="fader">
<Transition name="fade">
<Form class="form" ref="FormConfigRef" :formList="formConfig.list" v-bind="getFormOptions"
labelWidth="120px" />
</Transition>
</div>
</div>
<template #footer>
<Button style="background: #c9c9c9; padding: 0 24px"
<Button style="background: #c9c9c9; padding: 0 24px;margin-top: 24px;"
@click.native="(modelVisible = false), (submitting = false)">取消</Button>
<Button style="padding: 0 24px" @click.native="handleSubmit" :loading="submitting">保存</Button>
<Button style="padding: 0 24px;margin-top: 24px;" @click.native="handleSubmit" :loading="submitting">保存</Button>
</template>
</Dialog>
</template>
@ -244,6 +246,11 @@ export default {
display: flex;
flex-direction: column;
.fader {
height: 500px;
overflow-y: auto;
}
.form {
flex: 1;
overflow-y: auto;

2
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/plan/addAndEditDialog/ScopeTable.vue

@ -214,7 +214,7 @@ export default {
label: '事发上游最近'
},
{
value: 3,
value: 4,
label: '最近公里数'
},
],

28
ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/smart/analysis/data.js

@ -0,0 +1,28 @@
// import * as PresetFormItems from "@screen/pages/control/event/event/FormEvent/PresetFormItems.js";
import * as PresetFormItems from "@screen/common/PresetFormItems.js";
// import { merge, cloneDeep } from "lodash";
import {directionOptions} from '@screen/utils/enum.js';
export const searchFormList = [
{
label: "设备名称:",
key: "deviceName",
type: "input",
default: ""
},
{
label: "物联编号:",
key: "iotDeviceId",
type: "input",
default: ""
}, {
label: "设备方向:",
key: "direction",
type: "select",
options: {
options: directionOptions,
},
},
];

22
ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/smart/analysis/images/refresh.svg

@ -0,0 +1,22 @@
<svg width="16" height="14" viewBox="0 0 16 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Group 1142814398">
<g id="Group 1142814396">
<path id="Rectangle 1304" d="M1.0437 2.41495L4.5636 2.01738L4.91112 6.00562" stroke="white" stroke-linecap="round"/>
<g id="Ellipse 835">
<mask id="path-2-inside-1_290_77" fill="white">
<path d="M4.29579 2.52494C4.09359 2.27296 3.71712 2.25216 3.51748 2.50144C2.86315 3.31847 2.39514 4.30903 2.15904 5.38649C1.87758 6.67096 1.93836 8.02122 2.3337 9.26652C2.72904 10.5118 3.44118 11.5962 4.38007 12.3826C5.16561 13.0406 6.08036 13.4652 7.0411 13.6229C7.35243 13.674 7.61901 13.4293 7.63212 13.1145C7.64523 12.7997 7.39954 12.5346 7.08935 12.4765C6.32757 12.3339 5.60349 11.9884 4.97813 11.4646C4.19938 10.8124 3.6087 9.91289 3.28078 8.87998C2.95287 7.84706 2.90245 6.72709 3.13591 5.66169C3.33404 4.75752 3.72906 3.92712 4.28182 3.24492C4.4503 3.03698 4.46523 2.7361 4.29579 2.52494Z"/>
</mask>
<path d="M4.29579 2.52494C4.09359 2.27296 3.71712 2.25216 3.51748 2.50144C2.86315 3.31847 2.39514 4.30903 2.15904 5.38649C1.87758 6.67096 1.93836 8.02122 2.3337 9.26652C2.72904 10.5118 3.44118 11.5962 4.38007 12.3826C5.16561 13.0406 6.08036 13.4652 7.0411 13.6229C7.35243 13.674 7.61901 13.4293 7.63212 13.1145C7.64523 12.7997 7.39954 12.5346 7.08935 12.4765C6.32757 12.3339 5.60349 11.9884 4.97813 11.4646C4.19938 10.8124 3.6087 9.91289 3.28078 8.87998C2.95287 7.84706 2.90245 6.72709 3.13591 5.66169C3.33404 4.75752 3.72906 3.92712 4.28182 3.24492C4.4503 3.03698 4.46523 2.7361 4.29579 2.52494Z" stroke="white" stroke-width="2" mask="url(#path-2-inside-1_290_77)"/>
</g>
</g>
<g id="Group 1142814397">
<path id="Rectangle 1304_2" d="M15.0437 11.585L11.5238 11.9826L11.1763 7.99438" stroke="white" stroke-linecap="round"/>
<g id="Ellipse 835_2">
<mask id="path-4-inside-2_290_77" fill="white">
<path d="M11.7916 11.4751C11.9938 11.727 12.3703 11.7478 12.5699 11.4986C13.2242 10.6815 13.6923 9.69097 13.9284 8.61351C14.2098 7.32904 14.149 5.97878 13.7537 4.73348C13.3584 3.48817 12.6462 2.40376 11.7073 1.61737C10.9218 0.95942 10.007 0.534814 9.0463 0.377109C8.73497 0.326006 8.46839 0.570722 8.45528 0.885536C8.44218 1.20035 8.68786 1.46544 8.99805 1.5235C9.75983 1.6661 10.4839 2.01159 11.1093 2.53538C11.888 3.18765 12.4787 4.08711 12.8066 5.12002C13.1345 6.15294 13.1849 7.27291 12.9515 8.33831C12.7534 9.24248 12.3583 10.0729 11.8056 10.7551C11.6371 10.963 11.6222 11.2639 11.7916 11.4751Z"/>
</mask>
<path d="M11.7916 11.4751C11.9938 11.727 12.3703 11.7478 12.5699 11.4986C13.2242 10.6815 13.6923 9.69097 13.9284 8.61351C14.2098 7.32904 14.149 5.97878 13.7537 4.73348C13.3584 3.48817 12.6462 2.40376 11.7073 1.61737C10.9218 0.95942 10.007 0.534814 9.0463 0.377109C8.73497 0.326006 8.46839 0.570722 8.45528 0.885536C8.44218 1.20035 8.68786 1.46544 8.99805 1.5235C9.75983 1.6661 10.4839 2.01159 11.1093 2.53538C11.888 3.18765 12.4787 4.08711 12.8066 5.12002C13.1345 6.15294 13.1849 7.27291 12.9515 8.33831C12.7534 9.24248 12.3583 10.0729 11.8056 10.7551C11.6371 10.963 11.6222 11.2639 11.7916 11.4751Z" stroke="white" stroke-width="2" mask="url(#path-4-inside-2_290_77)"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

315
ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/smart/analysis/index.vue

@ -0,0 +1,315 @@
<template>
<div class='content'>
<div class="left">
<WgtTitle :title="'设备列表'"></WgtTitle>
<el-form :model="form" class="formSearch keep-ratio" size="mini">
<el-form-item>
<el-col :span="11">
<el-input v-model="form.deviceName" size="medium" placeholder="设备名称" class="direction"></el-input>
</el-col>
<el-col :span="10" :offset="1">
<el-checkbox-group v-model="form.deviceState" style="height:26px">
<el-checkbox :label="1">在线</el-checkbox>
<el-checkbox :label="0">异常</el-checkbox>
</el-checkbox-group>
</el-col>
</el-form-item>
<el-form-item style="display: flex; justify-content: center;">
<el-button class="btnInfoBoard" type="add" @click.native="onSearch()">搜索</el-button>
<el-button type="publish" @click.native="onResetSearch()">重置</el-button>
</el-form-item>
</el-form>
<div class="body">
<vuescroll :ops="scrollOptions">
<div class="device keep-ratio" v-for="(item, index) of list">
<div>{{ item.deviceName }}</div>
<el-tooltip :content="(item.deviceState == 0 || item.deviceState == null) ? '异常' : '在线'" placement="top">
<img src="@/assets/jihe/images/offline.svg" class="state"
v-if="item.deviceState == '0' || item.deviceState == null">
<img src="@/assets/jihe/images/online.svg" class="state" v-else>
</el-tooltip>
</div>
<div v-if="list.length === 0" style="color: #fff; text-align: center; line-height: 60px">
暂无数据
</div>
</vuescroll>
</div>
<div class="footer">
<ElPagination @current-change="bindList" @size-change="onSizeChange" width="'100%'"
:page-sizes="[10, 20, 30, 40, 50]" :page-size="page.pageSize" :current-page.sync="page.pageNum"
layout="total, prev, pager, next" :total="total" class="Pagination">
</ElPagination>
</div>
</div>
<div class="right">
<div class="top">
<div class="search">
<el-date-picker
size="small"
type="date"
class="selectDate"
v-model="date"
style="width: 140px"
placeholder="请选择"
/>
</div>
</div>
<div class="bottom"></div>
</div>
</div>
</template>
<script>
import request from "@/utils/request";
import vuescroll from "vuescroll";
import scrollOptions from "@/common/scrollbar.js";
import { Message } from "element-ui";
import WgtTitle from "@screen/pages/perception/widgets/title";
export default {
name: 'smartAnalysis',
components: {
vuescroll,
WgtTitle
},
data() {
return {
form: {
deviceName: '',
deviceState: [1, 0]
},
page: {
pageNum: 0,
pageSize: 20
},
total: 0,
list: [],
scrollOptions,
date:''
}
},
created() {
},
mounted() {
this.bindList();
this.date = moment().format('YYYY-MM-DD')
},
methods: {
onSizeChange(pageSize) {
this.page.pageSize = pageSize;
this.bindList();
},
bindList() {
const params = {
...this.form, ...this.page,
};
if (params.deviceState.length === 2) {
delete params.deviceState;
} else {
params.deviceState = params.deviceState.join('')
}
if (params.deviceName === '') {
delete params.deviceName
}
request({
url: 'business/device/selectDeviceNameList',
method: 'get',
params
}).then(result => {
if (result.code != 200) return Message.error(result?.msg);
this.list = result.rows;
this.total = result.total;
})
},
onResetSearch() {
this.form = {
deviceName: '',
deviceState: [1, 0]
};
this.pageNum = 0;
this.bindList();
},
onSearch() {
this.pageNum = 0;
this.bindList();
},
}
}
</script>
<style lang='scss' scoped>
.content {
width: 100%;
height: 100%;
display: flex;
flex-direction: row;
background-color: #101d23;
padding: 20px;
.left {
width: 400px;
background-color: #112533;
height: 100%;
display: flex;
flex-direction: column;
.body {
flex: 1;
height: 0;
padding: 0 10px 10px;
}
.footer {
display: flex;
justify-content: center;
align-items: center;
margin: 10px;
}
}
.right {
flex: 1;
margin-left: 30px;
}
}
::v-deep .formSearch {
padding: 20px 20px 0;
.el-form-item__label {
color: #fff;
}
}
.direction {
::v-deep .el-input {
.el-input__inner {
font-size: 14px !important;
padding: 8px 5px;
}
}
}
.device {
padding: 7.5px 15px;
cursor: pointer;
display: flex;
justify-content: space-between;
}
.device:hover {
background-color: #1d647f;
}
.state {
width: 18px;
height: 18px;
}
.top{
.search{
display: flex;
justify-content: flex-end;
}
}
</style>
<style lang="scss" scoped>
.Pagination {
// color: #fff;
::v-deep {
>button,
>ul li {
background: #064258;
border-radius: 2px 2px 2px 2px;
opacity: 1;
color: #fff;
}
>button {
padding: 0 3px;
border: 1px solid #00b3cc;
}
>ul li {
background: linear-gradient(180deg, #004960 0%, #004b62 100%);
margin: 0 1.5px;
&.active {
background: linear-gradient(180deg, #005c79 0%, #009bcc 100%);
}
}
.el-pagination__total {
color: #fff;
}
.el-pagination__sizes {
.el-select {
.el-input {
width: 81px;
.el-input__inner {
font-size: 12px;
height: 23px;
background-color: #064258 !important;
}
}
.el-input__suffix {
.el-input__icon {
line-height: 23px;
}
}
}
}
.el-pagination__jump {
margin-left: 10px;
color: #fff;
font-size: 12px;
.el-input {
width: 27px;
margin: 0 3px;
.el-input__inner {
font-size: 12px;
background-color: #064258 !important;
border-radius: 2px 2px 2px 2px;
}
}
}
.btn-next {
margin-left: 6px;
}
.btn-prev {
margin-right: 6px;
}
}
::v-deep .el-pagination__total {
margin-left: 10px;
}
}
.selectDate {
width: 89px;
border: 1px solid #00b3cc;
::v-deep {
.el-input__prefix{
top:-4px;
}
.el-input__inner {
background-color: #064258 !important;
border-width: 0px !important;
}
}
}
</style>

1
ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/smart/manage/index.vue

@ -342,7 +342,6 @@ export default {
},
/** 修改按钮操作 */
handleUpdate(row) {
console.log(row,'-------------------')
this.formData = row;
this.modelVisible = true;
},

36
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventAnalysis/EventDetailDialog/Carousel/images/arrow.svg

@ -0,0 +1,36 @@
<svg width="13" height="15" viewBox="0 0 13 15" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Group 1142814550">
<g id="Group 1142814473">
<g id="Polygon 87">
<path d="M6.16667 1.3635L12 7.49987L6.16667 13.6362" stroke="white" stroke-linecap="round"/>
<path d="M6.16667 1.3635L12 7.49987L6.16667 13.6362" stroke="url(#paint0_linear_308_1272)" stroke-linecap="round"/>
</g>
<path id="Polygon 88" d="M5 -3.57639e-07L12 7.5L5 15L5 -3.57639e-07Z" fill="url(#paint1_linear_308_1272)"/>
</g>
<g id="Group 1142814478">
<g id="Polygon 87_2">
<path d="M1.16667 1.3635L7 7.49987L1.16667 13.6362" stroke="white" stroke-linecap="round"/>
<path d="M1.16667 1.3635L7 7.49987L1.16667 13.6362" stroke="url(#paint2_linear_308_1272)" stroke-linecap="round"/>
</g>
<path id="Polygon 88_2" d="M1.0378e-06 -3.57639e-07L7 7.5L4.76837e-07 15L1.0378e-06 -3.57639e-07Z" fill="url(#paint3_linear_308_1272)"/>
</g>
</g>
<defs>
<linearGradient id="paint0_linear_308_1272" x1="10.8868" y1="7.72029" x2="6.30026" y2="7.72029" gradientUnits="userSpaceOnUse">
<stop stop-color="#39D5BF"/>
<stop offset="1" stop-color="#1FAED6"/>
</linearGradient>
<linearGradient id="paint1_linear_308_1272" x1="12" y1="7.5" x2="5" y2="7.5" gradientUnits="userSpaceOnUse">
<stop stop-color="#3AD6C0"/>
<stop offset="1" stop-color="#20AFD7" stop-opacity="0"/>
</linearGradient>
<linearGradient id="paint2_linear_308_1272" x1="5.88677" y1="7.72029" x2="1.30026" y2="7.72029" gradientUnits="userSpaceOnUse">
<stop stop-color="#39D5BF"/>
<stop offset="1" stop-color="#1FAED6"/>
</linearGradient>
<linearGradient id="paint3_linear_308_1272" x1="7" y1="7.5" x2="7.57319e-07" y2="7.5" gradientUnits="userSpaceOnUse">
<stop stop-color="#3AD6C0"/>
<stop offset="1" stop-color="#20AFD7" stop-opacity="0"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

126
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventAnalysis/EventDetailDialog/Carousel/index.vue

@ -0,0 +1,126 @@
<template>
<div class="Carousel">
<img src="./images/arrow.svg" @click="prevSlide" class="arrow" />
<VueSlickCarousel v-if="pictures.length > 0" v-bind="settings" ref="CarouselRef" class="vueSlickCarousel">
<div v-for="(item, index) in pictures" :key="index" class="item">
<!-- <img :src="require(`@screen/images/${item}`)" style="height: 100%"> -->
<!-- <img :src="item" style="height: 100%"> -->
<el-image style="height: 100%" :src="item" :preview-src-list="pictures">
</el-image>
</div>
</VueSlickCarousel>
<VueSlickCarousel v-if="videos.length > 0" v-bind="videoSettings" ref="CarouselRef" class="vueSlickCarousel">
<div v-for="(item, index) in videos " :key="index" class="item">
<Video style="height: 100%;" :showHeader="false" :url="item || ''" videoType="mp4" />
</div>
</VueSlickCarousel>
<img src="./images/arrow.svg" @click="nextSlide" class="arrow" />
</div>
</template>
<script>
import VueSlickCarousel from 'vue-slick-carousel'
import 'vue-slick-carousel/dist/vue-slick-carousel.css'
// optional style for arrows & dots
import 'vue-slick-carousel/dist/vue-slick-carousel-theme.css'
import Video from "@screen/components/Video";
export default {
name: "Carousel",
components: { VueSlickCarousel, Video },
props: {
pictures: {
type: Array,
default: () => [
// "https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg",
// "https://cube.elemecdn.com/6/94/4d3ea53c084bad6931a56d5158a48jpeg.jpeg",
// "require('@screen/images/shareWith/message-active.svg')",
// "require('@screen/images/shareWith/message.svg')",
// "require('@screen/images/shareWith/website-active.svg')",
// "require('@screen/images/shareWith/website.svg')",
// "require('@screen/images/shareWith/weChat-active.svg')",
// "require('@screen/images/shareWith/weChat-active.svg')"
]
},
videos: {
type: Array,
default: () => []
},
},
data() {
return {
carouselItems: [],
settings: {
infinite: true,
arrows: false,
speed: 600,
slidesToShow: 1,
slidesToScroll: 1,
autoplay: true,
autoplaySpeed: 1800,
},
videoSettings: {
infinite: true,
arrows: false,
speed: 600,
slidesToShow: 1,
slidesToScroll: 1,
autoplay: false,
autoplaySpeed: 1800,
}
}
},
methods: {
prevSlide() {
this.$refs.CarouselRef.prev()
},
nextSlide() {
// console.log('pics',this.pictures)
this.$refs.CarouselRef.next()
},
},
}
</script>
<style lang="scss" scoped>
.Carousel {
width: 100%;
overflow: hidden;
display: flex;
gap: 9px;
.vueSlickCarousel {
flex: 1;
overflow: hidden;
::v-deep {
.slick-list {
height: 100%;
div {
height: 100%;
}
}
}
.item {
img {
height: 100%;
}
}
}
.arrow {
cursor: pointer;
width: 15px;
&:first-child {
transform: rotate(-180deg)
}
}
}
</style>

177
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventAnalysis/EventDetailDialog/data.js

@ -0,0 +1,177 @@
export const _formList = [
{
label: "事件源:",
key: "stringEventSource",
type: "input",
options: {
disabled: true,
placeholder: "",
},
},
{
label: "桩号:",
key: "stakeMark",
type: "input",
options: {
disabled: true,
placeholder: "",
},
},
{
label: "行驶方向:",
key: "direction",
type: "input",
options: {
disabled: true,
placeholder: "",
},
},
{
label: "事件类型:",
key: "stringEventType",
type: "input",
options: {
disabled: true,
placeholder: "",
},
},
{
label: "高速名称:",
key: "roadName",
type: "input",
options: {
disabled: true,
placeholder: "",
},
},
{
label: "事件状态:",
key: "stringEventState",
type: "input",
options: {
disabled: true,
placeholder: "",
},
},
{
label: "操作员:",
key: "nickName",
type: "input",
options: {
disabled: true,
placeholder: "",
},
},
{
label: "发生时间:",
key: "startTime",
type: "input",
options: {
disabled: true,
placeholder: "",
},
},
{
label: "预计结束时间:",
key: "estimatedEndTime",
type: "input",
options: {
disabled: true,
placeholder: "",
},
},
{
label: "水膜厚度(mm):",
key: "waterFilmThickness",
type: "input",
options: {
disabled: true,
placeholder: "",
},
visible: (data) => {
if (data?.waterFilmThickness) {
return true;
}
return false;
},
},
{
label: "风速:",
key: "windSpeed",
type: "input",
options: {
disabled: true,
placeholder: "",
},
visible: (data) => {
if (data?.windSpeed) {
return true;
}
return false;
},
},
{
label: "能见度(m):",
key: "visibility",
type: "input",
options: {
disabled: true,
placeholder: "",
},
visible: (data) => {
if (data?.visibility) {
return true;
}
return false;
},
},
{
label: "事件描述:",
key: "remark",
type: "input",
isAlone: true,
gridColumn: 3,
options: {
disabled: true,
placeholder: "",
},
},
];
export const timeLine1List = [
{
time: "16.36",
label: "接警记录",
isActive: false,
},
{
time: "16.36",
label: "指令下达",
isActive: false,
},
{
time: "16.36",
label: "清障到达",
isActive: false,
},
{
time: "",
label: "安全防护",
isActive: false,
},
{
time: "",
label: "开始清障",
isActive: false,
},
{
time: "",
label: "清障结束",
isActive: false,
},
{
time: "",
label: "恢复畅通",
isActive: false,
},
];

101
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventAnalysis/EventDetailDialog/index.vue

@ -0,0 +1,101 @@
<template>
<Dialog v-model="modelVisible" title="事件详情" width="890px" top="11%">
<div class="EventDetail" style="height:380px">
<Form ref="FormConfigRef" :formList="formList" :dFormData="formData" label-width="100px" />
<div class="video-pic" :style="{
height: formData.component === 'VideoMulti' ? '242px' : undefined,
}">
<component :is="formData.component" style="height: 100%; width: 380px"
:showHeader="false" :url="formData.videoList && formData.videoList.length > 0
? formData.videoList[1]
: ''
" :camId="formData.downCamId" :pileNum="formData.stakeMark" rangeIndex="downCamera"
:videoType="formData.videoType" />
<Carousel style="flex: 1" :videos="formData.videoList" :pictures="[]" />
<Carousel style="flex: 1" :pictures="formData.pictures" :videos="[]" />
</div>
</div>
<template #footer>
<Button :style="{ padding: '0 24px' }"
@click.native="modelVisible = false">关闭</Button>
</template>
</Dialog>
</template>
<script>
import Dialog from "@screen/components/Dialog/index";
import Form from "@screen/components/FormConfig";
import { _formList } from "./data";
import Video from "@screen/components/Video";
import VideoMulti from "@screen/components/VideoMulti";
import Carousel from "./Carousel/index.vue";
import Button from "@screen/components/Buttons/Button.vue";
var moment = require("moment");
export default {
name: "EventDetail",
components: {
Dialog,
Form,
Video,
VideoMulti,
Carousel,
Button,
},
model: {
prop: "visible",
event: "update:value",
},
props: {
visible: Boolean,
formData: {
type: Object,
default: () => { },
},
},
data() {
return {
formList:[..._formList],
isShowDialog: false,
info: [],
};
},
computed: {
modelVisible: {
get() {
return this.visible;
},
set(val) {
this.formList = [..._formList]
this.$emit("update:value", val);
},
},
},
methods: {
},
};
</script>
<style lang="scss" scoped>
.EventDetail {
display: flex;
gap: 9px;
width: 836px;
// height: 768px;
flex-direction: column;
.video-pic {
display: flex;
height: 190px;
gap: 15px;
justify-content: space-around;
}
}
</style>

1227
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventAnalysis/FormEvent/PresetFormItems.js

File diff suppressed because it is too large

2536
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventAnalysis/FormEvent/data.js

File diff suppressed because it is too large

258
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventAnalysis/FormEvent/index.vue

@ -0,0 +1,258 @@
<template>
<Dialog v-model="modelVisible" title="交通事故录入" width="1100px" top="14%">
<div class="EventDetailDialog">
<ElTabs v-model="activeName" @tab-click="handleChange">
<ElTabPane v-for="(item, index) in tabConfigList" :key="index" :label="item.label" :name="item.key" />
</ElTabs>
<Transition name="fade">
<Form class="form" ref="FormConfigRef" :formList="formConfig.list" v-bind="getFormOptions" labelWidth="120px" />
</Transition>
</div>
<template #footer>
<Button style="background: #c9c9c9; padding: 0 24px"
@click.native="(modelVisible = false), (submitting = false)">取消</Button>
<Button style="padding: 0 24px" @click.native="handleSubmit" :loading="submitting">保存</Button>
</template>
</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 request from "@/utils/request";
import { Message } from "element-ui";
import { tabConfigList } from "./data.js";
export default {
name: "EventDetailDialog",
components: {
Dialog,
Form,
Button,
},
model: {
prop: "visible",
event: "close",
},
props: {
visible: Boolean,
},
data() {
return {
activeName: "TrafficAccident",
submitting: false,
formConfig: {},
tabConfigList,
index: 1,
roads: [],
direction: [],
lwss: [],
};
},
created() {
// this.formConfig = tabConfigList[0].formConfig;
this.initData().then(() => {
this.handleChange({ index: 0 });
});
},
computed: {
modelVisible: {
get() {
return this.visible;
},
set(val) {
this.$emit("close", val);
},
},
getFormOptions() {
return {
column: 3,
...this.formConfig.formOptions,
};
},
},
methods: {
initData() {
return Promise.all([
//
request({
url: `/business/road/query`,
method: "get",
})
.then((result) => {
if (result.code != 200) return Message.error(result?.msg);
result.data.forEach((it) => {
this.roads.push({ key: it.id, label: it.roadName });
});
})
.catch((err) => {
Message.error("查询失败4", err);
}),
//
request({
url: `/system/dict/data/type/iot_event_direction`,
method: "get",
})
.then((result) => {
if (result.code != 200) return Message.error(result?.msg);
result.data.forEach((it) => {
this.direction.push({ key: it.dictValue, label: it.dictLabel });
});
})
.catch((err) => {
Message.error("查询失败5", err);
}),
// 1 2 3 4 5 6
request({
url: `/business/facility/query`,
method: "get",
})
.then((result) => {
if (result.code != 200) return Message.error(result?.msg);
result.data.forEach((it) =>
this.lwss.push({
key: it.id,
label: it.facilityName,
type: it.facilityType,
})
);
})
.catch((err) => {
console.log("err", err);
Message.error("查询失败6", err);
}),
]);
},
handleChange({ index }) {
// console.log('index',index)
this.index = index;
let formConfig = tabConfigList[index].formConfig;
console.log("formConfig", formConfig);
formConfig.list.forEach((it) => {
if (it.key == "direction") {
it.options.options = this.direction;
}
if (it.key == "roadId") {
it.options.options = this.roads;
}
if (index == 7 && it.key == "dcEventServiceArea.facilityId") {
it.options.options = this.lwss.filter((ss) => ss.type == 6);
}
// if (index == 0 || index == 1 || index == 7) {
// if (it.key === 'dcEventAccident.facilityId' || it.key === 'dcEventVehicleAccident.facilityId' || it.key === 'dcEventServiceArea.facilityId') {
// it.options.options = this.lwss.filter(ss => ss.type == 6);
// }
// }
});
this.formConfig = formConfig;
},
handleSubmit() {
// return
this.$refs.FormConfigRef.validate().then((formData) => {
this.submitting = true;
if (this.index == 0 || this.index == 1) {
formData.lang = formData.lang.join(",");
} else {
formData.lang = "";
}
if (this.index == 2 && formData.dcEventTrafficControl.facilityId instanceof Array) {
let ids = formData.dcEventTrafficControl.facilityId;
formData.dcEventTrafficControl.facilityIds = ids
formData.dcEventTrafficControl.facilityId = ''
}
if (formData.endStakeMark && formData.endStakeMark[0] != null) {
let endStakeMark = formData.endStakeMark;
let strMark = endStakeMark && endStakeMark.length > 0 ? "K" + endStakeMark[0] + "+" + endStakeMark[1] : "";
if (this.index == 3) {
formData.dcEventTrafficCongestion.endStakeMark = strMark;
}
if (this.index == 6) {
formData.dcEventConstruction.endStakeMark = strMark;
}
if (this.index == 9) {
formData.dcEventAbnormalWeather.endStakeMark = strMark;
}
formData.endStakeMark = "";
} else {
formData.endStakeMark = "";
}
let stakeMark = formData.stakeMark;
// console.log('formData', {
// ...formData,
// eventType: Number(this.index) + 1,
// stakeMark: (stakeMark && stakeMark[0] != null) ? ((stakeMark && stakeMark.length > 0) ? ('K' + stakeMark[0] + '+' + stakeMark[1]) : '') : '',
// })
// this.modelVisible = false;
// this.submitting = false;
// this.$emit('queryData',true)
// return;
request({
url: `/dc/system/event`,
method: "post",
data: {
...formData,
eventType: Number(this.index) + 1,
eventState: 0,
stakeMark:
stakeMark && stakeMark[0] != null
? stakeMark && stakeMark.length > 0
? "K" + stakeMark[0] + "+" + stakeMark[1]
: ""
: "",
},
})
.then((result) => {
if (result.code != 200) return Message.error(result?.msg);
Message.success("提交成功");
this.modelVisible = false;
})
.catch(() => {
Message.error("提交失败");
})
.finally(() => {
this.submitting = false;
this.$emit("queryData", true);
});
});
},
},
};
</script>
<style lang="scss" scoped>
.fade-enter-active,
.fade-leave-active {
transition: opacity 0.24s;
}
.fade-enter,
.fade-leave-to {
opacity: 0;
}
.EventDetailDialog {
gap: 9px;
width: 1050px;
// height: 810px;
display: flex;
flex-direction: column;
.form {
flex: 1;
overflow-y: auto;
}
.footer {
display: flex;
justify-content: end;
gap: 15px;
}
}
</style>

275
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventAnalysis/data.js

@ -0,0 +1,275 @@
import * as PresetFormItems from "@screen/pages/control/event/event/FormEvent/PresetFormItems.js";
import { merge, cloneDeep } from "lodash";
const station = {
label: "桩号:",
key: "stakeMark",
required: true,
type: "MultipleLabelItem",
options: {
options: [
{
prefix: {
text: "K",
style: {
color: "#3DE8FF",
},
},
key: "stakeMark[0]",
rules: [
{
message: "请补全桩号",
callback(value, data) {
if (value || data.stakeMark[1]){
return /^0\d{2}|\d{3}$/.test(value);
} else {
return true
}
},
}
],
},
{
prefix: {
text: "+",
style: {
color: "#3DE8FF",
},
},
key: "stakeMark[1]",
rules: [
{
message: "请补全桩号",
callback(value, data) {
if (value || data.stakeMark[0]){
return /^0\d{2}|\d{3}$/.test(value);
} else {
return true
}
},
}
],
},
],
},
};
export const tabMap = {
"1": {
state: 21,
textColor: "#007FF4",
text: "上报",
},
"2": {
state: 22,
textColor: "#007FF4",
text: "已完成",
},
"3": {
state: 23,
textColor: "#007FF4",
text: "已终止",
},
"4": {
state: 24,
textColor: "#007FF4",
text: "自动结束",
},
};
export const searchFormList = [
{
label: "事件状态:",
key: "warningState",
type: "select",
options: {
clearable: true,
options: [
{
value: 1,
label: "上报",
},
{
value: 2,
label: "已完成",
},
{
value: 3,
label: "已终止",
},
{
value: 4,
label: "自动结束",
}
],
},
},
{
label: "事件来源:",
key: "warningSource",
type: "select",
options: {
clearable: true,
options: [
{
key: "1",
label: "视频AI",
},
{
key: "2",
label: "雷达识别",
},
{
key: "3",
label: "锥桶",
},
{
key: "4",
label: "护栏碰撞",
},
{
key: "5",
label: "扫码报警",
},
// {
// key: "6",
// label: "非机预警",
// },
{
key: "7",
label: "气象监测器",
},
],
},
},
{
label: "方向:",
key: "direction",
type: "RadioGroup",
options: {
options: [
{
key: "1",
label: "菏泽方向",
},
{
key: "3",
label: "济南方向",
},
],
},
},
{
label: "事件主类:",
key: "warningType",
type: "select",
options: {
clearable: true,
options: [
{
value: 1,
label: "交通拥堵",
},
{
value: 2,
label: "行人",
},
{
value: 3,
label: "非机动车",
},
{
value: 4,
label: "停车",
},
{
value: 5,
label: "违规驾驶",
},
{
value: 6,
label: "路障",
},
{
value: 7,
label: "道路施工",
},
{
value: 8,
label: "异常天气",
},
{
value: 9,
label: "护栏碰撞",
},
{
value: 10,
label: "交通事故",
},
{
value: 11,
label: "车辆故障",
},
{
value: 99,
label: "其他事件",
},
],
},
},
{
label: "时间范围:",
key: "daterange",
required: false,
type: "datePicker",
options: {
style: "width: auto",
type: "datetimerange",
format: "yyyy-MM-dd HH:mm:ss",
valueFormat: "yyyy-MM-dd HH:mm:ss",
},
},
{
...station,
label: "开始桩号:",
required: false,
},
merge(cloneDeep(station), {
options: {
options: [
{
key: "endStakeMark[0]",
rules: [
{
message: "请补全桩号",
callback(value, data) {
if (value || data.endStakeMark[1]){
return /^0\d{2}|\d{3}$/.test(value);
} else {
return true
}
},
}
],
},
{
key: "endStakeMark[1]",
rules: [
{
message: "请补全桩号",
callback(value, data) {
if (value || data.endStakeMark[0]){
return /^0\d{2}|\d{3}$/.test(value);
} else {
return true
}
},
}
],
},
],
},
label: "结束桩号:",
required: false,
}),
];

14
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventAnalysis/images/export.svg

@ -0,0 +1,14 @@
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Frame 10065" clip-path="url(#clip0_308_1276)">
<g id="Group 1142814551">
<path id="Rectangle 1282" d="M1 7V11C1 12.1046 1.89543 13 3 13H11C12.1046 13 13 12.1046 13 11V7" stroke="white" stroke-linecap="round"/>
<path id="Rectangle 1304" d="M4.27282 4.05153L7.04691 1.00002L9.81656 4.05155" stroke="white" stroke-linecap="round"/>
<path id="Line 513" d="M7 9L7 2" stroke="white" stroke-linecap="round"/>
</g>
</g>
<defs>
<clipPath id="clip0_308_1276">
<rect width="14" height="14" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 624 B

9
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventAnalysis/images/insert.svg

@ -0,0 +1,9 @@
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Group 1142814395">
<g id="Group 1142814394">
<circle id="Ellipse 835" cx="7" cy="7" r="6.5" stroke="white"/>
</g>
<path id="Line 514" d="M7 3.5L7 10.5" stroke="white" stroke-linecap="round"/>
<path id="Line 515" d="M10.5 7L3.5 7" stroke="white" stroke-linecap="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 385 B

22
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventAnalysis/images/refresh.svg

@ -0,0 +1,22 @@
<svg width="16" height="14" viewBox="0 0 16 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Group 1142814398">
<g id="Group 1142814396">
<path id="Rectangle 1304" d="M1.0437 2.41495L4.5636 2.01738L4.91112 6.00562" stroke="white" stroke-linecap="round"/>
<g id="Ellipse 835">
<mask id="path-2-inside-1_290_77" fill="white">
<path d="M4.29579 2.52494C4.09359 2.27296 3.71712 2.25216 3.51748 2.50144C2.86315 3.31847 2.39514 4.30903 2.15904 5.38649C1.87758 6.67096 1.93836 8.02122 2.3337 9.26652C2.72904 10.5118 3.44118 11.5962 4.38007 12.3826C5.16561 13.0406 6.08036 13.4652 7.0411 13.6229C7.35243 13.674 7.61901 13.4293 7.63212 13.1145C7.64523 12.7997 7.39954 12.5346 7.08935 12.4765C6.32757 12.3339 5.60349 11.9884 4.97813 11.4646C4.19938 10.8124 3.6087 9.91289 3.28078 8.87998C2.95287 7.84706 2.90245 6.72709 3.13591 5.66169C3.33404 4.75752 3.72906 3.92712 4.28182 3.24492C4.4503 3.03698 4.46523 2.7361 4.29579 2.52494Z"/>
</mask>
<path d="M4.29579 2.52494C4.09359 2.27296 3.71712 2.25216 3.51748 2.50144C2.86315 3.31847 2.39514 4.30903 2.15904 5.38649C1.87758 6.67096 1.93836 8.02122 2.3337 9.26652C2.72904 10.5118 3.44118 11.5962 4.38007 12.3826C5.16561 13.0406 6.08036 13.4652 7.0411 13.6229C7.35243 13.674 7.61901 13.4293 7.63212 13.1145C7.64523 12.7997 7.39954 12.5346 7.08935 12.4765C6.32757 12.3339 5.60349 11.9884 4.97813 11.4646C4.19938 10.8124 3.6087 9.91289 3.28078 8.87998C2.95287 7.84706 2.90245 6.72709 3.13591 5.66169C3.33404 4.75752 3.72906 3.92712 4.28182 3.24492C4.4503 3.03698 4.46523 2.7361 4.29579 2.52494Z" stroke="white" stroke-width="2" mask="url(#path-2-inside-1_290_77)"/>
</g>
</g>
<g id="Group 1142814397">
<path id="Rectangle 1304_2" d="M15.0437 11.585L11.5238 11.9826L11.1763 7.99438" stroke="white" stroke-linecap="round"/>
<g id="Ellipse 835_2">
<mask id="path-4-inside-2_290_77" fill="white">
<path d="M11.7916 11.4751C11.9938 11.727 12.3703 11.7478 12.5699 11.4986C13.2242 10.6815 13.6923 9.69097 13.9284 8.61351C14.2098 7.32904 14.149 5.97878 13.7537 4.73348C13.3584 3.48817 12.6462 2.40376 11.7073 1.61737C10.9218 0.95942 10.007 0.534814 9.0463 0.377109C8.73497 0.326006 8.46839 0.570722 8.45528 0.885536C8.44218 1.20035 8.68786 1.46544 8.99805 1.5235C9.75983 1.6661 10.4839 2.01159 11.1093 2.53538C11.888 3.18765 12.4787 4.08711 12.8066 5.12002C13.1345 6.15294 13.1849 7.27291 12.9515 8.33831C12.7534 9.24248 12.3583 10.0729 11.8056 10.7551C11.6371 10.963 11.6222 11.2639 11.7916 11.4751Z"/>
</mask>
<path d="M11.7916 11.4751C11.9938 11.727 12.3703 11.7478 12.5699 11.4986C13.2242 10.6815 13.6923 9.69097 13.9284 8.61351C14.2098 7.32904 14.149 5.97878 13.7537 4.73348C13.3584 3.48817 12.6462 2.40376 11.7073 1.61737C10.9218 0.95942 10.007 0.534814 9.0463 0.377109C8.73497 0.326006 8.46839 0.570722 8.45528 0.885536C8.44218 1.20035 8.68786 1.46544 8.99805 1.5235C9.75983 1.6661 10.4839 2.01159 11.1093 2.53538C11.888 3.18765 12.4787 4.08711 12.8066 5.12002C13.1345 6.15294 13.1849 7.27291 12.9515 8.33831C12.7534 9.24248 12.3583 10.0729 11.8056 10.7551C11.6371 10.963 11.6222 11.2639 11.7916 11.4751Z" stroke="white" stroke-width="2" mask="url(#path-4-inside-2_290_77)"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

287
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventAnalysis/index.vue

@ -0,0 +1,287 @@
<template>
<div class="RoadNetworkMonitoring2">
<!-- 搜索栏 -->
<div class="filter">
<div>
<ButtonGradient @click="onExport">
<template #prefix>
<img src="./images/export.svg" />
</template>
导出
</ButtonGradient>
<ButtonGradient @click="onRefresh">
<template #prefix>
<img src="./images/refresh.svg" />
</template>
刷新
</ButtonGradient>
</div>
<InputSearch ref="searchComp" style="width: 402px" :formList="searchFormList" @handleSearch="handleSearch" />
</div>
<!-- 内容 -->
<div class="body" v-loading>
<RoadStateCard v-for="(item, index) in data" :key="index" v-bind="getStateCardBind(item)"
@firstBtnClick="firstBtnClick" @lastBtnClick="onLastBtnClick" />
</div>
<!-- 分页 -->
<div class="footer">
<Pagination @current-change="getData" @size-change="onSizeChange" width="'100%'"
:page-sizes="[12, 16, 20, 30, 50]" :page-size="searchData.pageSize" :current-page.sync="searchData.pageNum"
layout="total, sizes, prev, pager, next" :total="total">
</Pagination>
</div>
<!-- "详情"弹出框 -->
<EventDetailDialog @update:value="handleDialogClose" :visible="eventDetailDialogVisible" :formData="detailDialogFormData" />
</div>
</template>
<script>
import ButtonGradient from "@screen/components/Buttons/ButtonGradient.vue";
import Tabs from "@screen/components/Tabs/index.vue";
import RoadStateCard from "@screen/components/RoadStateCard/index.vue";
import Pagination from "@screen/components/Pagination.vue";
import InputSearch from "@screen/components/InputSearch/index.vue";
import EventDetailDialog from "./EventDetailDialog/index";
import FormEvent from "./FormEvent/index";
import { tabMap,searchFormList } from "./data";
import request from "@/utils/request";
import { Message } from "element-ui";
import { Loading } from 'element-ui';
import { WarningType as warningTypeMapping, WarningSubclass as warningSubclassTypeMapping, DirectionTypes as gzDirectionMapping, warningSourceMapping, warningStateMapping } from "@screen/utils/enum.js"
export default {
name: "RoadNetworkMonitoring2",
components: {
ButtonGradient,
Tabs,
Pagination,
RoadStateCard,
InputSearch,
EventDetailDialog,
FormEvent,
},
data() {
return {
data: [],
total: 0,
searchFormList,
eventDetailDialogVisible: false,
isShowAddNew: false,
searchData: {
pageSize: 12,
pageNum: 1
},
detailDialogFormData: {},
};
},
created() {
this.getData();
},
methods: {
getStateCardBind(item) {
const { state, textColor, text } = tabMap[item.warningState];
return {
cardData: { ...item, state },
lastBtnColor: textColor,
lastBtnText: text,
};
},
queryData(flag) {
this.getData()
},
getData() { //
request({
url: `/perceivedEvents/warning/perceivedEventsList`,//
method: "post",
params: { pageNum: this.searchData.pageNum, pageSize: this.searchData.pageSize },
data: { ...this.searchData }
}).then((result) => {
if (result.code != 200) return Message.error(result?.msg);
result.rows.forEach(it => {
it.stringEventSource = it?.warningSource ? warningSourceMapping[it?.warningSource] : '';
it.stringDirection = gzDirectionMapping[it.direction] || it.direction;
let strSub = '';
if (it.warningSubclass && warningSubclassTypeMapping[it.warningType][it.warningSubclass] || '') {
strSub = `(${warningSubclassTypeMapping[it.warningType][it.warningSubclass] || ''})`
}
it.stringEventType = warningTypeMapping[it.warningType] + strSub;
it.startTime = it.warningTime;
if (it.otherConfig) {
let otherConfig = JSON.parse(it.otherConfig);
it.pictures = otherConfig.pictures || [];
}
})
this.data = result.rows;
this.total = result.total;
});
},
onRefresh() {
this.searchData.pageNum = 1;
this.$refs.searchComp.handleResetForm();
},
onSizeChange(pageSize) {
this.searchData.pageSize = pageSize;
this.getData();
},
onExport() {
let url ='/business/warning/export'
let loadingInstance = Loading.service({
fullscreen: true,
background: "#00000052",
text: "文件正在下载...",
});
// request.post(url, {}, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, responseType: 'blob' })
request({
url: url,//
method: "post",
data: { ...this.searchData, warningState: 1 },
responseType: 'blob'
})
.then((res) => {
console.log(res);
const url = window.URL.createObjectURL(new Blob([res]));
let link = document.createElement("a");
link.style.display = "none";
link.href = url;
link.setAttribute("download", "事件信息列表.xlsx");
document.body.appendChild(link);
link.click();
URL.revokeObjectURL(link.href); // URL
document.body.removeChild(link);
link = null;
loadingInstance.close();
})
.catch((err) => {
Message.error(err);
loadingInstance.close();
});
},
firstBtnClick(id) {////
console.log("id", id);
request({
url: `/perceivedEvents/warning/getWarningById`,//
method: "post",
data: { id }
}).then((result) => {
if (result.code != 200) return Message.error(result?.msg);
let data = result.data;
data.stringEventSource = data?.warningSource ? warningSourceMapping[data.warningSource] : '';
data.nickName = data.userName;
data.direction = gzDirectionMapping[data.direction] || data.direction;
data.startTime = data.warningTime;
data.stringEventState = warningStateMapping[data.warningState];
data.stringEventType = warningTypeMapping[data.warningType];
data.videoList = [];
if (data.otherConfig) {
let otherConfig = JSON.parse(data.otherConfig);
data.waterFilmThickness = otherConfig.waterFilmThickness;
data.windSpeed = otherConfig.windSpeed;
data.visibility = otherConfig.visibility;
data.pictures = otherConfig.pictures || [];
data.videoList = otherConfig.videoList || [];
// data.videoList = ['https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-480p.mp4',
// 'https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-480p.mp4']
}
data.videoType = "mp4";
data.component = "Video";
this.detailDialogFormData = data;
// console.log('data', this.detailDialogFormData)
this.eventDetailDialogVisible = true;
});
},
onLastBtnClick(id) {
this.$router.push(`/control/event/commandDispatch?eventId=${id}`);
},
handleDialogClose() {
this.eventDetailDialogVisible = false;
},
handleSearch(data) {
let daterange = data.daterange;
let dStakeMark = data.stakeMark;
let dendStakeMark = data.endStakeMark;
let stakeMark = dStakeMark[0] ? `K${dStakeMark[0]}+${dStakeMark[1]}` : '';
let endStakeMark = '';
if (dendStakeMark) {
endStakeMark = dendStakeMark[0] ? `K${dendStakeMark[0]}+${dendStakeMark[1]}` : '';
}
this.searchData = {
...this.searchData,
warningState: data.warningState,
warningType: data.warningType,
warningSource: data?.warningSource || '',
direction: data.direction,
startTime: daterange && daterange.length > 0 ? daterange[0] : "",
// endTime: this.activeName != "-1" && daterange && daterange.length > 0 ? daterange[1] : "",
completeTime: daterange && daterange.length > 0 ? daterange[1] : "",
startStakeMark: stakeMark,
endStakeMark: endStakeMark,
};
console.log(this.searchData)
this.getData();
}
},
};
</script>
<style lang="scss" scoped>
.RoadNetworkMonitoring2 {
padding: 0px 21px 21px 21px;
height: 100%;
display: flex;
flex-direction: column;
z-index: 6;
width: 100%;
height: 100%;
.filter {
height: 60px;
display: flex;
justify-content: space-between;
align-items: center;
>div {
display: flex;
gap: 6px;
}
}
.body {
flex: 1;
overflow: auto;
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-gap: 24px;
// grid-row-gap: 9px;
// grid-column-gap: 9px;
grid-auto-rows: min-content;
}
.footer {
margin-top: 15px;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
}
}
</style>

3
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/ElQuarterPicker.vue

@ -101,7 +101,6 @@
},
watch: {
value(val) {
// console.log('change-------', val)
this.changeValue(val)
},
readonly(val) {
@ -131,7 +130,6 @@
}
},
mounted() {
// console.log('mounted--------', this.value)
this.changeValue(this.value)
//
@ -345,7 +343,6 @@
},
//
clickItem(item) {
// console.log('select--------', item)
if (this.viewType === 1) {
//
this.$emit('change', this.formatTo([item.year, item.quarter], this.valueFormat))

3
ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/trafficIndicators/ElQuarterPicker.vue

@ -101,7 +101,6 @@
},
watch: {
value(val) {
// console.log('change-------', val)
this.changeValue(val)
},
readonly(val) {
@ -131,7 +130,6 @@
}
},
mounted() {
// console.log('mounted--------', this.value)
this.changeValue(this.value)
//
@ -345,7 +343,6 @@
},
//
clickItem(item) {
// console.log('select--------', item)
if (this.viewType === 1) {
//
this.$emit('change', this.formatTo([item.year, item.quarter], this.valueFormat))

1
ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/trafficIndicators/index.vue

@ -456,6 +456,7 @@ export default {
align-items: center;
flex-direction: column;
--keep-ratio: scaleX(1);
pointer-events: auto;
.body-l {
width: 70%;

54
ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/nucleusThrough/assets/charts3.js

@ -36,7 +36,7 @@ const series = event_channel.map((name, sid) => {
} else {
return Math.round(params.value * 1000) / 10 + '%'
}
}
},
data: []
@ -68,7 +68,11 @@ var options = {
containLabel: true,
},
yAxis: {
type: 'value'
type: 'value',
axisLabel: {
fontSize: 10,
color: "#fff",
},
},
@ -84,30 +88,30 @@ var options = {
fontSize: 10,
color: "#fff",
},
formatter:function(value)
{
var ret = "";//拼接加\n返回的类目项
var maxLength = 2;//每项显示文字个数
var valLength = value.length;//X轴类目项的文字个数
var rowN = Math.ceil(valLength / maxLength); //类目项需要换行的行数
if (rowN > 1)//如果类目项的文字大于3,
{
for (var i = 0; i < rowN; i++) {
var temp = "";//每次截取的字符串
var start = i * maxLength;//开始截取的位置
var end = start + maxLength;//结束截取的位置
//这里也可以加一个是否是最后一行的判断,但是不加也没有影响,那就不加吧
temp = value.substring(start, end) + "\n";
ret += temp; //凭借最终的字符串
}
return ret;
}
else {
return value;
}
}
formatter:function(value)
{
var ret = "";//拼接加\n返回的类目项
var maxLength = 2;//每项显示文字个数
var valLength = value.length;//X轴类目项的文字个数
var rowN = Math.ceil(valLength / maxLength); //类目项需要换行的行数
if (rowN > 1)//如果类目项的文字大于3,
{
for (var i = 0; i < rowN; i++) {
var temp = "";//每次截取的字符串
var start = i * maxLength;//开始截取的位置
var end = start + maxLength;//结束截取的位置
//这里也可以加一个是否是最后一行的判断,但是不加也没有影响,那就不加吧
temp = value.substring(start, end) + "\n";
ret += temp; //凭借最终的字符串
}
return ret;
}
else {
return value;
}
}
},
},
series
};
export default options;
export default options;

19
ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/nucleusThrough/index.vue

@ -25,13 +25,15 @@
size="mini"
class="btnSearch"
icon="el-icon-search"
@click="bindEventTypePublishManageMonth"
>查询</el-button
>
<el-button class="btnReset" size="mini" icon="el-icon-refresh-left"
>重置</el-button
@click="init"
>重置</el-button
>
</div>
<div class="charts keep-ratio" id="nucleusThrough"></div>
<div class="charts" id="nucleusThrough"></div>
</div>
</div>
</template>
@ -59,6 +61,9 @@ export default {
this.bindEventTypePublishManageMonth();
},
bindEventTypePublishManageMonth(){
if (!this.dateTime){
return this.$modal.msgWarning("请选择日期");
}
request({
url: `/business/manage/eventTypePublishManageMonth`,
method: "post",
@ -88,11 +93,11 @@ export default {
// });
// var myChart = echarts.init(document.getElementById("postTrendsMonth"));
// myChart.setOption(chartsStatistics);
})
})
},
},
mounted() {
this.init();
// setTimeout(() => {
// this.$nextTick(() => {
@ -131,11 +136,11 @@ export default {
display: flex;
align-items: center;
height: 40px;
width: 50%;
width: 35%;
font-size: 14px;
margin-bottom: 10px;
left: 20px;
top: 2px;
left: 10px;
top: 5px;
z-index: 9;
div {

2
ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/postTrendsDay/assets/charts.js

@ -92,7 +92,7 @@ var options = {
grid: {
top: "75px", //上边距
right: "0", //右边距
left: "0", //左边距
left: "3px", //左边距
bottom: "20px", //下边距
containLabel: true,
},

1
ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/postTrendsDay/index.vue

@ -35,7 +35,6 @@ export default {
})
.then((result) => {
if (result.code != 200) return;
// console.log(result,'-----------------')
let sdata = [[],[],[],[],[],[],[]]
for(let i of result.data){
sdata[i.publishChannels-1].push(i.number)

2
ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/postTrendsMonth/assets/charts.js

@ -91,7 +91,7 @@ var options = {
grid: {
top: "80px", //上边距
right: "0", //右边距
left: "0", //左边距
left: "3px", //左边距
bottom: "20px", //下边距
containLabel: true,
},

2
ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/postTrendsMonth/index.vue

@ -65,7 +65,7 @@ export default {
});
var myChart = echarts.init(document.getElementById("postTrendsMonth"));
myChart.setOption(chartsStatistics);
})
})
},
init(){
this.dateTime = new Date();

37
ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/record/index.vue

@ -20,10 +20,12 @@
:formConfigOptions="{ dFormData: { eventState: '0' } }" @handleSearch="handleSearch" />
</div>
<!-- 内容 -->
<Table :data="tableData" height="100%" style="width:500">
<div class="body">
<Table :data="tableData">
<el-table-column label="序号" type="index" :index="indexMethod" width="100" align="center"
header-align="center" />
<ElTableColumn label="发布渠道" prop="publishChannels" width="120" align="center" header-align="center">
<template slot-scope="scope">
{{ enum_channels[scope.row.publishChannels-1] }}
@ -31,7 +33,7 @@
</ElTableColumn>
<ElTableColumn label="发布时间" prop="publishTime" align="center" width="200" header-align="center" />
<ElTableColumn label="位置/设备" prop="position" align="center" width="200" header-align="center" />
<ElTableColumn label="发布内容" prop="contentDetails" align="center" header-align="center" />
<ElTableColumn label="发布内容" prop="contentDetails" align="center" header-align="center" />
<ElTableColumn label="发布人" prop="publisher" width="120" align="center" header-align="center" />
<ElTableColumn label="发布结果" prop="status" width="140" align="center" header-align="center">
<template slot-scope="scope">
@ -45,7 +47,7 @@
</template>
</ElTableColumn>
</Table>
</div>
<!-- 分页 -->
<div class="footer">
<Pagination @current-change="initData" @size-change="onSizeChange" width="'100%'"
@ -114,7 +116,7 @@ export default {
},
onDelete(id){
const self = this;
this.$confirm("是否删除?"+id, "警告", {
this.$confirm("是否删除?", "警告", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
@ -152,7 +154,7 @@ export default {
responseType: 'blob',
}).then((res) => {
console.log(res)
const url = window.URL.createObjectURL(new Blob([res]));
let link = document.createElement("a");
link.style.display = "none";
@ -173,7 +175,7 @@ export default {
},
handleSearch(data) {
let daterange = data.daterange;
let _searchData = {
pageSize: 20,
pageNum: 1
@ -199,8 +201,9 @@ export default {
},
initData() {
request({
url: `/business/manage/statisticsList`,
url: `/business/manage/statisticsList?pageNum=${this.searchData.pageNum}&pageSize=${this.searchData.pageSize}`,
method: "post",
params: { pageNum: this.searchData.pageNum, pageSize: this.searchData.pageSize },
data: this.searchData,
}).then((result) => {
if (result.code != 200) return Message.error(result?.msg);
@ -208,7 +211,7 @@ export default {
this.total = result.total;
});
},
onSizeChange(pageSize) {
this.tableData = [];
this.searchData.pageSize = pageSize;
@ -222,7 +225,7 @@ export default {
<style lang='scss' scoped>
.board_record {
padding: 0 14px 14px;
width:100%;
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
@ -240,9 +243,17 @@ export default {
}
.body {
flex:1;
height: 0;
}
flex: 1;
position: relative;
overflow-y: auto;
overflow-x: hidden;
.content {
position: absolute;
width: 100%;
height: 100%;
overflow: auto;
}
}
.footer {
margin-top: 15px;

Loading…
Cancel
Save