From 7f55d647cabae0bdc7164f2e3b21e1efca1fdde0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=9C=8B?= <lbp608@126.com> Date: Thu, 29 Feb 2024 09:35:19 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E8=BE=96=E6=AE=B5=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E6=96=B0=E5=A2=9E,=E5=85=B6=E5=AE=9E=E6=A1=A9=E5=8F=B7?= =?UTF-8?q?=E5=BF=85=E5=A1=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/jurisdictionalManagement/data.js | 72 ++----------------- 1 file changed, 5 insertions(+), 67 deletions(-) diff --git a/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/jurisdictionalManagement/data.js b/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/jurisdictionalManagement/data.js index d4413bf8..23793e1f 100644 --- a/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/jurisdictionalManagement/data.js +++ b/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/jurisdictionalManagement/data.js @@ -36,75 +36,13 @@ export const addEditFormList = [ required: true, }, - merge(cloneDeep(PresetFormItems.station), { - required: false, - label: "起始桩号:", - options: { - options: [ - { - rules: [ - { - message: "请补全桩号", - callback(value, data) { - if (!value?.trim() && data.startStakeMark[1]?.trim()) - return false; - else return true; - }, - }, - ], - key: "startStakeMark[0]", - }, - { - rules: [ - { - message: "请补全桩号", - callback(value, data) { - if (!value?.trim() && data.startStakeMark[0]?.trim()) - return false; - else return true; - }, - }, - ], - key: "startStakeMark[1]", - }, - ], - }, + merge(cloneDeep(PresetFormItems.startStation), { + required: true, }), - - merge(cloneDeep(PresetFormItems.station), { - required: false, - label: "结束桩号:", - options: { - options: [ - { - rules: [ - { - message: "请补全桩号", - callback(value, data) { - if (!value?.trim() && data.endStakeMark[1]?.trim()) - return false; - else return true; - }, - }, - ], - key: "endStakeMark[0]", - }, - { - rules: [ - { - message: "请补全桩号", - callback(value, data) { - if (!value?.trim() && data.endStakeMark[0]?.trim()) - return false; - else return true; - }, - }, - ], - key: "endStakeMark[1]", - }, - ], - }, + merge(cloneDeep(PresetFormItems.endStation), { + required: true, }), + { label: "辖区路段编号:", key: "roadCode", From 6e32265b765e3cbdb4f06d80a99179d44069dbf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=9C=8B?= <lbp608@126.com> Date: Thu, 29 Feb 2024 09:52:05 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E8=BE=96=E6=AE=B5=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=B1=E8=B4=A5=E9=97=AE=E9=A2=98=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/jurisdictionalManagement/index.vue | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/jurisdictionalManagement/index.vue b/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/jurisdictionalManagement/index.vue index 49065515..adc321be 100644 --- a/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/jurisdictionalManagement/index.vue +++ b/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/jurisdictionalManagement/index.vue @@ -88,7 +88,7 @@ export default { AddNEditDialog, Button }, - inject: ['getPagination', 'setTotal'], + inject: ['getPagination', 'setTotal', "setCurrentPage"], data() { return { searchFormList, @@ -172,8 +172,9 @@ export default { Message.success("删除成功") }) - .catch(() => { - Message.error("删除失败") + .catch((e) => { + console.log("辖段删除error:",e); + //Message.error("删除失败") }) }, handleAddEdit(bool, data) { From 18946c6c4f907cf1b542a9f891cffc515a439680 Mon Sep 17 00:00:00 2001 From: zhangzhang <1747194829@qq.com> Date: Thu, 29 Feb 2024 14:43:02 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E6=9B=B4=E6=94=B9bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/assets/styles/JiHeExpressway.scss | 3 +- .../FormConfig/components/ElCheckboxGroup.vue | 42 ++++++++++++------- .../StatsDialogVisible/index.vue | 22 +++++++--- .../pages/service/board/index.vue | 9 ++-- 4 files changed, 48 insertions(+), 28 deletions(-) diff --git a/ruoyi-ui/src/assets/styles/JiHeExpressway.scss b/ruoyi-ui/src/assets/styles/JiHeExpressway.scss index 87fb830d..36e5c973 100644 --- a/ruoyi-ui/src/assets/styles/JiHeExpressway.scss +++ b/ruoyi-ui/src/assets/styles/JiHeExpressway.scss @@ -81,12 +81,13 @@ line-height: $inputHeight; padding: 0; width: 100%; + border: none; .el-input-number__decrease, .el-input-number__increase { width: 22px; height: $inputHeight; - background-color: #004a69; + background-color: #0D5F79; border: none; color: #fff; diff --git a/ruoyi-ui/src/views/JiHeExpressway/components/FormConfig/components/ElCheckboxGroup.vue b/ruoyi-ui/src/views/JiHeExpressway/components/FormConfig/components/ElCheckboxGroup.vue index a67596fa..83fdefe0 100644 --- a/ruoyi-ui/src/views/JiHeExpressway/components/FormConfig/components/ElCheckboxGroup.vue +++ b/ruoyi-ui/src/views/JiHeExpressway/components/FormConfig/components/ElCheckboxGroup.vue @@ -1,15 +1,26 @@ <template> - <ElCheckboxGroup v-bind="$attrs" v-on="$listeners" class='ElCheckboxGroup' :style="{ gap }"> - <ElCheckbox v-for="item in options" :disabled="item.disabled" :label="item[id] || item[label]" - :key="item[id] || item[label]"> - <slot :name="item[id] || item[label]" :data="item">{{ item[label] }}</slot> + <ElCheckboxGroup + v-bind="$attrs" + v-on="$listeners" + class="ElCheckboxGroup" + :style="{ gap }" + > + <ElCheckbox + v-for="item in options" + :disabled="item.disabled" + :label="item[id] || item[label]" + :key="item[id] || item[label]" + > + <slot :name="item[id] || item[label]" :data="item">{{ + item[label] + }}</slot> </ElCheckbox> </ElCheckboxGroup> </template> <script> export default { - name: 'ElCheckboxGroup_', + name: "ElCheckboxGroup_", props: { /** * { @@ -19,24 +30,24 @@ export default { */ options: { type: Array, - default: () => [] + default: () => [], }, id: { type: String, - default: 'key' + default: "key", }, label: { type: String, - default: 'label' + default: "label", }, gap: { - default: "24px" - } - } -} + default: "24px", + }, + }, +}; </script> -<style lang='scss' scoped> +<style lang="scss" scoped> .ElCheckboxGroup { display: flex; flex-wrap: wrap; @@ -47,6 +58,7 @@ export default { display: flex; align-items: center; gap: 6px; + width: 100px; .el-checkbox__input { line-height: 0; @@ -54,10 +66,10 @@ export default { .el-checkbox__inner { width: 16px; height: 16px; - background: #0A3E54; + background: #0a3e54; border-radius: 2px 2px 2px 2px; opacity: 1; - border: 1px solid rgba(98, 224, 254, .6); + border: 1px solid rgba(98, 224, 254, 0.6); &::after { width: 4.5px; diff --git a/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/components/auditAnalytics/StatsDialogVisible/index.vue b/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/components/auditAnalytics/StatsDialogVisible/index.vue index 99ecaa4b..f49551b8 100644 --- a/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/components/auditAnalytics/StatsDialogVisible/index.vue +++ b/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/components/auditAnalytics/StatsDialogVisible/index.vue @@ -359,12 +359,22 @@ export default { }), ]).then((res) => { if (res[0].status === "fulfilled" && res[0].value.code == 200) { - this.searchFormList[2].options.options = res[0].value.data.map( - (item) => ({ - key: item.id, - label: item.facilityName, - }) - ); + // this.searchFormList[2].options.options = res[0].value.data.map( + // (item) => ({ + // key: item.id, + // label: item.facilityName, + // }) + // ); + let dataList = []; + res[0].value.data.forEach((item) => { + if (item.facilityType == 1) { + dataList.push({ + key: item.id, + label: item.facilityName, + }); + } + }); + this.searchFormList[2].options.options = dataList; this.facilityIds = res[0].value.data.map((item) => item.id); // this.searchFormList[2].default = res[0].value.data.map(item => item.id) let currentMonth = moment().format("YYYY-MM"); diff --git a/ruoyi-ui/src/views/JiHeExpressway/pages/service/board/index.vue b/ruoyi-ui/src/views/JiHeExpressway/pages/service/board/index.vue index 05532ebe..5dbddb0c 100644 --- a/ruoyi-ui/src/views/JiHeExpressway/pages/service/board/index.vue +++ b/ruoyi-ui/src/views/JiHeExpressway/pages/service/board/index.vue @@ -32,7 +32,6 @@ </el-select> </el-form-item> <vuescroll :ops="scrollOptions" style="flex: 1; height: 0"> - <!-- {{ boardSizeDic }} --> <el-collapse v-model="selectedSize" accordion @@ -46,8 +45,6 @@ :name="key" > <div v-if="item.list.length > 0"> - <!-- <el-checkbox style="width: 100%" :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange">全选 - </el-checkbox> --> <el-checkbox-group class="checkbox" v-model="checkedDeviceIds" @@ -60,8 +57,6 @@ :key="index" > <div>{{ itm.deviceName }}</div> - <!-- <el-tooltip :content="itm.ip" placement="top"> - </el-tooltip> --> <el-tooltip content="回读当前信息" placement="right"> <el-button class="el-icon-tickets huiduButton" @@ -91,6 +86,7 @@ <el-button class="btnInfoBoard" type="add" + :disabled="!selectedSize" @click.native="____onAddDeviceItem()" >添加信息</el-button > @@ -570,7 +566,7 @@ export default { this.selectedBdMsg = _.cloneDeep(testDeviceInfo.data["3A"].content); } else { if (!deviceFrom.iotDeviceId) { - this.$message.warning("提示设备未接入!"); + this.$message.warning("设备未接入!"); return; } this.selectedBdMsg = []; @@ -811,6 +807,7 @@ export default { // }, // 情报板列表手风琴 ____onChangeSize(val) { + console.log("777777"); this.____setAvailableTemplate(); this.checkedDeviceIds = []; this.selectedDevice = {}; From 55e63db4fad1935e4e603522515fbb2e4fbbd254 Mon Sep 17 00:00:00 2001 From: zhoule <zz221011@163.com> Date: Thu, 29 Feb 2024 15:29:48 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E6=84=9F=E7=9F=A5=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E7=9B=91=E6=B5=8B=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/eventQuery/index.vue | 212 +++++------------- 1 file changed, 50 insertions(+), 162 deletions(-) diff --git a/ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/index.vue b/ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/index.vue index 60366b91..6df8e7ad 100644 --- a/ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/index.vue +++ b/ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/index.vue @@ -1,126 +1,53 @@ <template> <div class="congestion"> <div class="board"> - <ProgressBar - class="keep-ratio" - @selectItem="selectProgress" - :dataList="dataList" - :selectIndex="selectIndex" - /> + <ProgressBar class="keep-ratio" @selectItem="selectProgress" :dataList="dataList" :selectIndex="selectIndex" /> <div class="searchPanel"> - <RadioGroup - :options="[ - { key: '1', label: '菏泽' }, - { key: '3', label: '济南' }, - ]" - v-model="direction" - type="button" - /> - <el-select - v-model="type" - size="mini" - class="selectRoad" - placeholder="请选择" - > - <el-option - v-for="item in typeOptions" - :key="item.value" - :label="item.label" - :value="item.value" - > + <RadioGroup :options="[ + { key: '1', label: '菏泽' }, + { key: '3', label: '济南' }, + ]" v-model="direction" type="button" /> + <el-select v-model="type" size="mini" class="selectRoad" placeholder="请选择" @change="changeType"> + <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> - <el-select - v-model="quarter" - size="medium" - v-if="type == 'quarter'" - class="selectRoad-medium" - placeholder="请选择" - > - <el-option - v-for="item in quarterOptions" - :key="item.value" - :label="item.label" - :value="item.value" - style="width: 140px" - > + <el-select v-model="quarter" size="medium" v-if="type == 'quarter'" class="selectRoad-medium" placeholder="请选择"> + <el-option v-for="item in quarterOptions" :key="item.value" :label="item.label" :value="item.value" + style="width: 140px"> </el-option> </el-select> - <el-date-picker - size="mini" - v-if="type != 'quarter'" - class="selectRoad" - v-model="dateTime" - style="width: 140px" - :type=" - type == 'date' + <el-date-picker size="mini" v-if="type != 'quarter'" class="selectRoad" v-model="dateTime" style="width: 140px" + :type="type == 'date' ? 'date' : type == 'month' - ? 'month' - : type == 'year' - ? 'year' - : '' - " - placeholder="请选择" - :clearable="false" - /> - - <el-button - type="primary" - size="mini" - class="btnSearch" - @click="searchQuery" - icon="el-icon-search" - >查询</el-button - > - <el-button - class="btnReset" - size="mini" - icon="el-icon-refresh-left" - @click="onReset" - >重置</el-button - > + ? 'month' + : type == 'year' + ? 'year' + : '' + " placeholder="请选择" :clearable="false" /> + + <el-button type="primary" size="mini" class="btnSearch" @click="searchQuery" icon="el-icon-search">查询</el-button> + <el-button class="btnReset" size="mini" icon="el-icon-refresh-left" @click="onReset">重置</el-button> </div> </div> <div class="body"> <div> <WgtTitle :title="'感知事件趋势分析'"></WgtTitle> - <Empty - v-show="!chart1List || chart1List.length <= 0" - text="暂无数据..." - ></Empty> - <div - v-show="chart1List || chart1List.length > 0" - id="chart1" - class="btnChart" - /> + <Empty v-show="!chart1List || chart1List.length <= 0" text="暂无数据..."></Empty> + <div v-show="chart1List || chart1List.length > 0" id="chart1" class="btnChart" /> </div> <div> <WgtTitle :title="'感知事件类型分析'"></WgtTitle> - <Empty - v-show="!chart2List || chart2List.length <= 0" - text="暂无数据..." - ></Empty> - <div - v-show="chart2List || chart2List.length > 0" - id="chart2" - class="btnChart" - /> + <Empty v-show="!chart2List || chart2List.length <= 0" text="暂无数据..."></Empty> + <div v-show="chart2List || chart2List.length > 0" id="chart2" class="btnChart" /> </div> <div> <WgtTitle :title="'桩号范围内事件分析趋势'"></WgtTitle> - <Empty - v-show="!chart3List || chart3List.length <= 0" - text="暂无数据..." - ></Empty> - <div - v-show="chart3List || chart3List.length > 0" - id="chart3" - class="btnChart" - /> + <Empty v-show="!chart3List || chart3List.length <= 0" text="暂无数据..."></Empty> + <div v-show="chart3List || chart3List.length > 0" id="chart3" class="btnChart" /> </div> </div> </div> @@ -135,6 +62,7 @@ import chart1 from "./assets/charts"; import chart2 from "./assets/charts2"; import chart3 from "./assets/charts3"; import ElQuarterPicker from "./ElQuarterPicker"; +import moment from 'moment'; import { getWarningTrend, getWarningSectionType, @@ -220,8 +148,8 @@ export default { dateTime: "2024", direction: "1", dataList: [], - selectIndex: 1, - selectId: 1, + selectIndex: 2, + selectId: 2, type: "year", chart1List: [], chart2List: [], @@ -272,7 +200,7 @@ export default { ], }; }, - created() {}, + created() { }, methods: { selectProgress(item, index) { this.selectIndex = index; @@ -284,7 +212,9 @@ export default { this.type = "year"; this.dateTime = "2024"; this.selectId = this.dataList[0].id; - this.selectIndex = 1; + this.selectId = 2; + this.selectIndex = 2; + this.searchQuery() }, searchQuery() { let startTime = ""; @@ -541,6 +471,11 @@ export default { // if (this.type == "day") // this.type = "date"; }, + changeType() { + if (this.type == 'date') { + this.dateTime = moment(new Date()).format("YYYY-MM-DD") + } + } }, mounted() { setTimeout(() => { @@ -660,21 +595,16 @@ export default { justify-content: space-evenly; font-size: 14px; - > div { + >div { width: 33%; height: 470px; - background: linear-gradient( - 180deg, - rgba(6, 66, 88, 0.2) 0%, - #064258 100% - ); + background: linear-gradient(180deg, + rgba(6, 66, 88, 0.2) 0%, + #064258 100%); border: 1px solid; - border-image: linear-gradient( - 360deg, + border-image: linear-gradient(360deg, rgba(55, 231, 255, 0.3), - rgba(55, 231, 255, 0) - ) - 1 1; + rgba(55, 231, 255, 0)) 1 1; } :nth-child(1) { @@ -790,54 +720,12 @@ export default { </style> <style lang="scss"> -div.el-popover:has(> .el-date-picker) - div - .el-picker-panel__body - .el-picker-panel__content - table - tr - td.today - span, -div.el-popover:has(> .el-date-picker) - div - .el-picker-panel__body - .el-picker-panel__content - table - tr - td.today - .cell, -div.el-picker-panel.el-date-picker.el-popper - div - .el-picker-panel__body - .el-picker-panel__content - table - tr - td.today - span, -div.el-picker-panel.el-date-picker.el-popper - div - .el-picker-panel__body - .el-picker-panel__content - table - tr - td.today - .cell, -div.el-picker-panel.el-date-range-picker.el-popper - div - .el-picker-panel__body - .el-picker-panel__content - table - tr - td.today - span, -div.el-picker-panel.el-date-range-picker.el-popper - div - .el-picker-panel__body - .el-picker-panel__content - table - tr - td.today - .cell { +div.el-popover:has(> .el-date-picker) div .el-picker-panel__body .el-picker-panel__content table tr td.today span, +div.el-popover:has(> .el-date-picker) div .el-picker-panel__body .el-picker-panel__content table tr td.today .cell, +div.el-picker-panel.el-date-picker.el-popper div .el-picker-panel__body .el-picker-panel__content table tr td.today span, +div.el-picker-panel.el-date-picker.el-popper div .el-picker-panel__body .el-picker-panel__content table tr td.today .cell, +div.el-picker-panel.el-date-range-picker.el-popper div .el-picker-panel__body .el-picker-panel__content table tr td.today span, +div.el-picker-panel.el-date-range-picker.el-popper div .el-picker-panel__body .el-picker-panel__content table tr td.today .cell { color: #fff; } </style> From 4a43645204228a01c721d3eb985a2f7cd0ddf2e7 Mon Sep 17 00:00:00 2001 From: zhoule <zz221011@163.com> Date: Thu, 29 Feb 2024 15:30:15 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E5=A4=84=E7=BD=AE=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E5=92=8C=E5=B8=B8=E7=94=A8=E8=AF=AD=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TimeLine/LineClick/images/bg-active.svg | 16 + .../TimeLine/LineClick/images/bg.svg | 12 + .../components/TimeLine/LineClick/index.vue | 274 ++++++++++++++++++ .../commonPhrases/index.vue | 183 ++++++++++-- .../disposalProcess/index.vue | 168 ++++++++--- .../emergencyProcessManagement/index.vue | 27 +- 6 files changed, 617 insertions(+), 63 deletions(-) create mode 100644 ruoyi-ui/src/views/JiHeExpressway/components/TimeLine/LineClick/images/bg-active.svg create mode 100644 ruoyi-ui/src/views/JiHeExpressway/components/TimeLine/LineClick/images/bg.svg create mode 100644 ruoyi-ui/src/views/JiHeExpressway/components/TimeLine/LineClick/index.vue diff --git a/ruoyi-ui/src/views/JiHeExpressway/components/TimeLine/LineClick/images/bg-active.svg b/ruoyi-ui/src/views/JiHeExpressway/components/TimeLine/LineClick/images/bg-active.svg new file mode 100644 index 00000000..3cb39038 --- /dev/null +++ b/ruoyi-ui/src/views/JiHeExpressway/components/TimeLine/LineClick/images/bg-active.svg @@ -0,0 +1,16 @@ +<svg width="83" height="26" viewBox = "min-x min-y width height" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g id="Group 1142814474"> +<path id="Rectangle 3602" d="M10.25 25H6C3.23858 25 1 22.7614 1 20V6C1 3.23858 3.23858 1 6 1H10.25M74.75 25H77C79.7614 25 82 22.7614 82 20V6C82 3.23858 79.7614 1 77 1H74.75" stroke="url(#paint0_linear_308_581)" stroke-width="1.5"/> +<path id="Rectangle 3618" d="M82 20V6C82 3.23858 79.7614 1 77 1H74.75H10.25H6C3.23858 1 1 3.23858 1 6V20C1 22.7614 3.23858 25 6 25H10.25H74.75H77C79.7614 25 82 22.7614 82 20Z" fill="url(#paint1_linear_308_581)"/> +</g> +<defs> +<linearGradient id="paint0_linear_308_581" x1="40.0452" y1="5.58015" x2="40.0452" y2="24.4504" gradientUnits="userSpaceOnUse"> +<stop stop-color="#39D5BF"/> +<stop offset="1" stop-color="#1FAED6"/> +</linearGradient> +<linearGradient id="paint1_linear_308_581" x1="41.5" y1="1" x2="41.5" y2="25" gradientUnits="userSpaceOnUse"> +<stop stop-color="#20AFD7" stop-opacity="0"/> +<stop offset="1" stop-color="#39D5BF"/> +</linearGradient> +</defs> +</svg> diff --git a/ruoyi-ui/src/views/JiHeExpressway/components/TimeLine/LineClick/images/bg.svg b/ruoyi-ui/src/views/JiHeExpressway/components/TimeLine/LineClick/images/bg.svg new file mode 100644 index 00000000..f9f3f9ae --- /dev/null +++ b/ruoyi-ui/src/views/JiHeExpressway/components/TimeLine/LineClick/images/bg.svg @@ -0,0 +1,12 @@ +<svg width="83" height="26" viewBox="min-x min-y width height" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g id="Group 1142814479"> +<path id="Rectangle 3602" d="M10.25 25H6C3.23858 25 1 22.7614 1 20V6C1 3.23858 3.23858 1 6 1H10.25M74.75 25H77C79.7614 25 82 22.7614 82 20V6C82 3.23858 79.7614 1 77 1H74.75" stroke="#CACACA" stroke-width="1.5"/> +<path id="Rectangle 3618" d="M82 20V6C82 3.23858 79.7614 1 77 1H74.75H10.25H6C3.23858 1 1 3.23858 1 6V20C1 22.7614 3.23858 25 6 25H10.25H74.75H77C79.7614 25 82 22.7614 82 20Z" fill="url(#paint0_linear_308_590)"/> +</g> +<defs> +<linearGradient id="paint0_linear_308_590" x1="41.5" y1="1" x2="41.5" y2="25" gradientUnits="userSpaceOnUse"> +<stop stop-color="#CACACA" stop-opacity="0"/> +<stop offset="1" stop-color="#CACACA"/> +</linearGradient> +</defs> +</svg> diff --git a/ruoyi-ui/src/views/JiHeExpressway/components/TimeLine/LineClick/index.vue b/ruoyi-ui/src/views/JiHeExpressway/components/TimeLine/LineClick/index.vue new file mode 100644 index 00000000..5a571264 --- /dev/null +++ b/ruoyi-ui/src/views/JiHeExpressway/components/TimeLine/LineClick/index.vue @@ -0,0 +1,274 @@ +<template> + <div :class='["TimeLine1", { "auto-size": autoSize }]' ref="TimeLine1Ref"> + <!-- 节点 --> + <div class="node" v-for="(item, index) in data" :key="index" ref="nodeRefs"> + <span class="top-label keep-ratio-bottom"> + <slot name="bottom-label" :data="item"> + {{ item.time }} + </slot> + </span> + <div class="center"> + <div class="line" v-if="!index" :style="{ width: `${nodeLinesWidth[-1]}px` }" /> + <div class="circle keep-ratio" :style="{ '--active-color': !item.isActive ? normalColor : activeColor }"> + </div> + <div class="line" :style="{ + width: `${nodeLinesWidth[index]}px`, + borderImage: getBorderImageStyle(item), + }" /> + </div> + <slot name="bottom-label" :data="item"> + <div class="bottom keep-ratio" @click="onClick(item)" + :style="{ backgroundImage: `url(${require(`./images/bg${item.isActive ? '-active' : ''}.svg`)})` }"> + {{ item.label }} + </div> + </slot> + </div> + + </div> +</template> + +<script> + +function getPositionAtCenter(element) { + const { top, left } = element.getBoundingClientRect(); + + return { + x: left, + y: top + }; +} + +function getDistanceBetweenElements(domA, domB) { + const domAPosition = getPositionAtCenter(domA); + const domBPosition = getPositionAtCenter(domB); + + return Math.hypot(domAPosition.x - domBPosition.x, domAPosition.y - domBPosition.y); +} + +export default { + name: 'TimeLine1', + props: { + data: { + type: Array, + default: () => Array.from({ length: 15 }).map(() => ({ + time: "16.36", + label: "阿发", + isActive: false + })) + }, + activeColor: { + type: String, + default: "#39D5BF" + }, + normalColor: { + type: String, + default: "#ccc" + }, + lineActiveColor: { + type: String, + default: "linear-gradient(90deg, rgba(59, 216, 188, 1), rgba(29, 171, 215, 1)}) 2 2" + }, + lineNormalColor: { + type: String, + default: null + }, + // 自动适配宽度 + autoSize: { + type: Boolean, + default: true + }, + filterDistance: { + type: Function, + default: null + } + }, + data() { + return { + nodeLinesWidth: {} + } + }, + watch: { + data: { + handler(data) { + let needFilter = false + const nodeLinesWidth = []; + + const filterDistance = num => needFilter ? this.filterDistance(num) : num; + + const removeDistance = 20 + 4 * 2; + + function getDistance(index) { + return filterDistance(getDistanceBetweenElements( + this.$refs.nodeRefs[index].querySelector('.center'), + this.$refs.nodeRefs[index + 1].querySelector('.center')) + ) - removeDistance + }; + + function getSpecialDistance(index) { + return filterDistance(getDistanceBetweenElements( + this.$refs.nodeRefs[index].parentElement, + this.$refs.nodeRefs[index].querySelector('.center')) + ) - removeDistance + } + + const getLineWidths = () => { + nodeLinesWidth.length = 0; + + data.forEach((_, index) => { + if (index === data.length - 1) { + if (this.autoSize) { + nodeLinesWidth[-1] = getSpecialDistance.call(this, 0) + nodeLinesWidth[data.length - 1] = getSpecialDistance.call(this, data.length - 1) + } + + return + }; + + nodeLinesWidth[index] = getDistance.call(this, index); + }); + + this.nodeLinesWidth = nodeLinesWidth; + } + + this.$nextTick(() => { + const timeLine1RefDom = this.$refs.TimeLine1Ref; + if (timeLine1RefDom.clientWidth != timeLine1RefDom.getBoundingClientRect().width) { + needFilter = true + } + getLineWidths(); + }) + }, + immediate: true + } + }, + methods: { + getBorderImageStyle(item) { + const linearColor = item.isActive ? (this.lineActiveColor || `${this.activeColor}, ${this.activeColor}`) : (this.lineNormalColor || `${this.normalColor}, ${this.normalColor}`) + + return `linear-gradient(90deg, ${linearColor}) 2 2` + }, + onClick(item) { + this.data.forEach(it => { + if (it.id == item.id) { + it.isActive = true; + } else { + it.isActive = false; + } + }) + this.$emit('update:tableData', item.id); + // console.log('data', item) + } + } +} +</script> + +<style lang='scss' scoped> +div.auto-size { + justify-content: space-between; + overflow: hidden; + + .node { + flex: 1; + min-width: auto !important; + + &:first-child, + &:last-child { + .line { + width: auto; + } + } + } +} + +.TimeLine1 { + color: #fff; + width: auto; + + font-size: 14px; + font-family: PingFang SC, PingFang SC; + font-weight: 400; + color: #FFFFFF; + display: flex; + flex-wrap: nowrap; + overflow: auto; + gap: 15px; + padding-left: 15px; + + .node { + display: flex; + align-items: center; + // justify-content: center; + flex-direction: column; + gap: 3px; + min-width: 90px; + + .top-label { + line-height: 16px; + height: 24px; + } + + .center { + display: flex; + align-items: center; + justify-content: center; + gap: 6px; + position: relative; + + .circle { + border: 1px solid var(--active-color, #39D5BF); + border-radius: 50%; + width: 15px; + height: 15px; + position: relative; + + &::before { + content: ""; + position: absolute; + width: 72%; + height: 72%; + border-radius: 50%; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + background-color: var(--active-color, #39D5BF); + } + } + + + .line { + position: absolute; + height: 0px; + opacity: 1; + border: 2px solid; + //border-image: linear-gradient(90deg, rgba(59, 216, 188, 1), rgba(29, 171, 215, 1)) 2 2; + border-image: linear-gradient(90deg, rgb(204, 204, 204), rgb(204, 204, 204)) 2 / 1 / 0 stretch; + + &:first-child { + right: calc(50% + 8px + 6px); + } + + &:last-child { + left: calc(50% + 8px + 6px); + } + } + } + + &:first-child, + &:last-child { + .line { + width: 60px; + } + } + + .bottom { + line-height: 16px; + background-repeat: no-repeat; + background-size: 100% 100%; + min-width: 90px; + text-align: center; + padding: 6px 12px; + height: 27px; + } + } +} +</style> diff --git a/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/emergencyProcessManagement/commonPhrases/index.vue b/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/emergencyProcessManagement/commonPhrases/index.vue index 673193e6..f9a39d87 100644 --- a/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/emergencyProcessManagement/commonPhrases/index.vue +++ b/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/emergencyProcessManagement/commonPhrases/index.vue @@ -1,17 +1,38 @@ <template> <Dialog v-model="modelVisible" title="配置常用语"> - <Button style="margin: 10px 0 20px 20px; width: 100px;" @click.native="onAdd">添加</Button> + <!-- <Button style="margin: 10px 0 20px 20px; width: 100px;" @click.native="onAdd">添加</Button> --> + <div class="header"> + <el-form ref="form" label-width="120px"> + <el-form-item label="事件类型"> + <el-select v-model="eventType" placeholder="请选择" style="width: 220px"> + <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"> + </el-option> + </el-select> + </el-form-item> + </el-form> + </div> + <div> + <TimeLine1 :data="process" @update:tableData="updateTableData" /> + </div> <div class="EventDetail"> - <Table :data="tableData"> - <ElTableColumn prop="phrases" label="常用语" width="720" align="center"> + <Table :data="getTableData()" :show-header="false"> + <ElTableColumn label="步骤" width="110" align="center"> <template slot-scope="scope"> - <ElInput type="textarea" v-model="scope.row.phrases" :autosize="{ minRows: 2, maxRows: 2 }" - :maxlength="150" showWordLimit placeholder="请输入常用语内容" /> + {{ `${scope.$index + 1}` }} </template> </ElTableColumn> - <ElTableColumn label="操作" width="110" align="center"> + <ElTableColumn prop="phrases" label="常用语" width="550" align="center"> <template slot-scope="scope"> - <ElButton type="text" style="color: #ea4d2d;" @click.native="onDel(scope.$index)">删除</ElButton> + <ElInput type="textarea" style="margin-top: 5px;" v-model="scope.row.phrases" + :autosize="{ minRows: 2, maxRows: 2 }" :maxlength="150" showWordLimit placeholder="请输入常用语内容" /> + </template> + </ElTableColumn> + <ElTableColumn label="操作" width="160" align="center"> + <template slot-scope="scope"> + <ElButton class="elButton" icon="el-icon-plus" plain size="mini" + @click.native="onAdd(scope.row.id)" /> + <ElButton class="elButton" icon="el-icon-delete" plain size="mini" + @click.native="onDel(scope.$index)" /> </template> </ElTableColumn> </Table> @@ -30,6 +51,7 @@ import Dialog from "@screen/components/Dialog/index"; import Table from '@screen/components/Table.vue'; import Button from '@screen/components/Buttons/Button.vue'; import request from "@/utils/request"; +import TimeLine1 from "@screen/components/TimeLine/LineClick/index"; import { Message } from 'element-ui' @@ -39,6 +61,7 @@ export default { Dialog, Button, Table, + TimeLine1 }, model: { prop: 'visible', @@ -46,11 +69,66 @@ export default { }, props: { visible: Boolean, - eventType: Number + eventType: Number, + // process: { + // type: Array, + // default: () => [] + // } }, data() { return { - tableData: [] + tableData: [{ + phrases: '' + }], + // eventType: 1, + 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: '其他事件' + } + ], + process: [], + id: 0 } }, computed: { @@ -74,31 +152,79 @@ export default { method: "get", }).then(result => { if (result.code != 200) return Message.error(result.msg); - - result.data.processConfigList?.forEach(it => { - const phrs = it.commonPhrases.split(','); - phrs?.forEach(phr => { - if (phr && !this.tableData.find(op => op.phrases == phr)) this.tableData.push({ phrases: phr }) + //流程列表 + this.process = []; + this.tableData = []; + result.data.processConfigList?.forEach((it, index) => { + let commonPhrasesArr = it.commonPhrases ? it.commonPhrases.split(',') : ['']; + let phrs = []; + commonPhrasesArr?.forEach(phr => { + phrs.push({ id: it.id, phrases: phr }) }) - + this.process.push({ + ...it, + phrs: phrs, + label: it.processNode, + isActive: index == 0 ? true : false, + }) + if (index == 0) { + this.id = it.id; + this.tableData = phrs; + } }) }) - - }, - onAdd() { + getTableData() { + let rows = this.process.find(item => item.id == this.id); + return rows?.phrs || []; + }, + updateTableData(id = 1) { + this.id = id; + this.tableData = []; + let pros = this.process.find(item => item.id == id); + this.tableData = pros.phrs; + }, + onAdd(id) { this.tableData.push({ + id: id, phrases: '' }) }, onDel(index) { + if (this.tableData.length <= 1) { + return Message.warning('最后一项不可删除!'); + } this.tableData.splice(index, 1) }, submitTable() { - this.$emit('update:phrasesData', this.tableData) - this.modelVisible = false; - console.log(this.tableData) + let data = [] + this.process.forEach((lc) => { + let commonPhrases = []; + lc.phrs.forEach(phr => { if (phr.phrases) commonPhrases.push(phr.phrases) }) + data.push({ + commonPhrases: commonPhrases.join(','), + id: lc.id, + eventType: lc.eventType, + nodeNode: lc.nodeNode, + processNode: lc.processNode + }) + }) + console.log('data', data) + // return; + request({ + url: `/business/dcEventType/updateDcProcessConfig`, + method: "post", + data: { + eventType: this.eventType, + processConfigList: data + } + }).then(result => { + if (result.code != 200) return Message.error(result.msg); + Message.success(result.msg); + this.modelVisible = false; + this.$emit('reInitData', true) + }) } } } @@ -110,6 +236,7 @@ export default { gap: 9px; width: 836px; height: 768px; + margin-top: 20px; flex-direction: column; .video-pic { @@ -118,5 +245,19 @@ export default { gap: 15px } } + +.elButton { + background: #2ba8c3; + border-radius: 2px 2px 2px 2px; + color: #FFFFFF; +} + +.elButton:hover, +.elButton:focus { + background: #2ba8c3; + border-radius: 2px 2px 2px 2px; + border-color: #FFFFFF; + color: #FFFFFF; +} </style> \ No newline at end of file diff --git a/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/emergencyProcessManagement/disposalProcess/index.vue b/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/emergencyProcessManagement/disposalProcess/index.vue index fdf49cf2..8ac44053 100644 --- a/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/emergencyProcessManagement/disposalProcess/index.vue +++ b/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/emergencyProcessManagement/disposalProcess/index.vue @@ -1,34 +1,46 @@ <template> <Dialog v-model="modelVisible" title="配置处置流程"> - <Button style="margin: 10px 0 20px 20px; width: 100px;" @click.native="onAdd">添加</Button> + <div class="header"> + <el-form ref="form" label-width="120px"> + <el-form-item label="事件类型"> + <el-select v-model="eventType" placeholder="请选择" style="width: 220px"> + <el-option v-for="item in eventTypeOptions" :key="item.value" :label="item.label" + :value="item.value"> + </el-option> + </el-select> + </el-form-item> + </el-form> + </div> <div class="EventDetail"> - <Table :data="tableData"> + <Table :data="tableData" :show-header="false"> <ElTableColumn label="步骤" width="110" align="center"> <template slot-scope="scope"> - {{ `步骤${scope.$index + 1}` }} + {{ `${scope.$index + 1}` }} </template> </ElTableColumn> - <ElTableColumn prop="phrases" label="处置流程" width="610" align="center"> + <ElTableColumn prop="phrases" label="处置流程" width="570" align="center"> <template slot-scope="scope"> - <ElForm :model="scope.row" inline> - <ElFormItem label="流程名称"> + <ElInput v-model="scope.row.processNode" placeholder="请输入流程名称" /> + <ElForm :model="scope.row" inline :ref="'scopeForm' + scope.$index"> + <!-- <ElFormItem label="流程名称" :rules="[{ required: true, message: '流程名称不能为空' }]"> <ElInput v-model="scope.row.processNode" placeholder="请输入流程名称" /> - </ElFormItem> - <ElFormItem label="常用语"> + </ElFormItem> --> + <!-- <ElFormItem label="常用语"> <ElSelect class="disposal-process-select" v-model="scope.row.commonPhrases" multiple :collapse-tags="true"> <ElOption v-for="item in options" :key="item.key || item.value" :label="item.label" :value="item.key || item.value"> </ElOption> </ElSelect> - </ElFormItem> + </ElFormItem> --> </ElForm> <!-- <Form :formList="formList" :dFormData="scope.row" label-width="100px" /> --> </template> </ElTableColumn> - <ElTableColumn label="操作" width="110" align="center"> + <ElTableColumn label="操作" width="150" align="center"> <template slot-scope="scope"> - <ElButton type="text" style="color: #ea4d2d;" @click.native="onDel(scope.$index)">删除</ElButton> + <ElButton class="elButton" icon="el-icon-plus" plain size="mini" @click.native="onAdd" /> + <ElButton class="elButton" icon="el-icon-delete" plain size="mini" @click.native="onDel(scope.$index)" /> </template> </ElTableColumn> </Table> @@ -73,7 +85,13 @@ export default { }, data() { return { - tableData: [], + tableData: [{ + id: '', + eventType: '', + nodeNode: '', + processNode: '', + commonPhrases: '' + }], formList: [ { label: "流程名称:", @@ -93,7 +111,53 @@ export default { } }, ], - options: [] + options: [], + eventTypeOptions: [ + { + 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: '其他事件' + } + ] } }, computed: { @@ -113,33 +177,46 @@ export default { getProcess() { let addFlg = true; this.tableData = []; - this.phrasesData.forEach(it => { - this.options.push({ - key: it.phrases - }) - addFlg = false; - }) + // this.phrasesData.forEach(it => { + // this.options.push({ + // key: it.phrases + // }) + // addFlg = false; + // }) request({ url: `/business/dcEventType/${this.eventType}`, method: "get", }).then(result => { if (result.code != 200) return Message.error(result.msg); - this.eventType = result.data.eventType; - - result.data.processConfigList?.forEach(it => { - const phrs = it.commonPhrases.split(','); - if (addFlg) { - phrs?.forEach(phr => { - if (phr && !this.options.find(op => op.key == phr)) this.options.push({ key: phr }) - }) - } - if (phrs && phrs[0]) { - it.commonPhrases = phrs - } - }) + // this.eventType = result.data.eventType; + + // result.data.processConfigList?.forEach(it => { + // const phrs = it.commonPhrases.split(','); + // if (addFlg) { + // phrs?.forEach(phr => { + // if (phr && !this.options.find(op => op.key == phr)) this.options.push({ key: phr }) + // }) + // } + // if (phrs && phrs[0]) { + // it.commonPhrases = phrs + // } + // }) + + if (result.data.processConfigList.length > 0) { + this.tableData = result.data.processConfigList; + } else { + this.tableData = [ + { + id: '', + eventType: '', + nodeNode: '', + processNode: '', + commonPhrases: '' + } + ] + } - this.tableData = result.data.processConfigList; // console.log('this.tableData', this.tableData) }) @@ -149,26 +226,32 @@ export default { onAdd() { this.tableData.push({ // eventType: this.eventType, - commonPhrases: [], + commonPhrases: '', processNode: '', // nodeNode: 1 }) }, onDel(index) { + if (this.tableData.length <= 1) { + return Message.warning('最后一项不可删除!'); + } this.tableData.splice(index, 1) }, submitTable() { let data = [] + let flg = false; this.tableData.forEach((it, index) => { + if (!it.processNode) return flg = true; data.push({ - commonPhrases: it.commonPhrases.join(','), + commonPhrases: it.commonPhrases, eventType: this.eventType, nodeNode: index + 1, processNode: it.processNode }) }) + if (flg) return Message.error('节点名称不能为空'); // console.log(data) - + // return; request({ url: `/business/dcEventType/updateDcProcessConfig`, method: "post", @@ -202,6 +285,19 @@ export default { gap: 15px } } + +.elButton { + background: #2ba8c3; + border-radius: 2px 2px 2px 2px; + color: #FFFFFF; +} +.elButton:hover, +.elButton:focus { + background: #2ba8c3; + border-radius: 2px 2px 2px 2px; + border-color: #FFFFFF; + color: #FFFFFF; +} </style> <style lang="scss"> diff --git a/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/emergencyProcessManagement/index.vue b/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/emergencyProcessManagement/index.vue index 8e20d1ca..3c3265af 100644 --- a/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/emergencyProcessManagement/index.vue +++ b/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/emergencyProcessManagement/index.vue @@ -28,16 +28,16 @@ <ElTableColumn prop="processConfig" label="处置流程" /> <ElTableColumn label="操作" width="210"> <template slot-scope="scope"> - <ElButton type="text" style="color: #00EBC1;" @click="showPhrases(scope.row.eventType)">常用语</ElButton> <ElButton type="text" style="color: #00D1FF;" @click="showDisposal(scope.row.eventType)">流程配置</ElButton> + <ElButton type="text" style="color: #00EBC1;" @click="showPhrases(scope.row)">常用语</ElButton> </template> </ElTableColumn> </Table> </div> <!-- 配置常用户弹窗 --> - <CommonPhrases :visible="isShowPhrases" :eventType="eventType" @update:value="onClosePhrases" - @update:phrasesData="onUpdatePhrasesData" /> + <CommonPhrases :visible="isShowPhrases" :eventType="eventType" :process="process" @update:value="onClosePhrases" + @update:phrasesData="onUpdatePhrasesData" @reInitData="initData" /> <!-- "流程配置"弹出框 --> <DisposalProcess :visible="isShowDisposal" :eventType="eventType" :phrasesData="phrasesData" @update:value="onCloseDisposal" @reInitData="initData" /> @@ -82,7 +82,8 @@ export default { pageSize: 20, pageNum: 1, }, - phrasesData: [] + phrasesData: [], + process: [] } }, created() { @@ -110,9 +111,23 @@ export default { this.searchData.pageSize = pageSize; this.getData(); }, - showPhrases(eventType) { + showPhrases(data) { + if (data?.processConfigList.length <= 0) { + Message.warning('请先配置流程!'); + return; + } + let process = [] + data.processConfigList.forEach(it => { + process.push({ + id: it.id, + commonPhrases: it.commonPhrases, + label: it.processNode, + isActive: false, + }) + }) + this.process = process; this.isShowPhrases = true; - this.eventType = eventType; + this.eventType = data.eventType; }, showDisposal(eventType) { this.isShowDisposal = true; From 833fdeba42a46066b3a420e455179f1c29230781 Mon Sep 17 00:00:00 2001 From: zhoule <zz221011@163.com> Date: Thu, 29 Feb 2024 18:07:16 +0800 Subject: [PATCH 6/8] bug --- .../components/eventQuery/index.vue | 59 +++++-- .../components/railway/index.vue | 5 +- .../components/railwayDay/assets/charts.js | 2 + .../components/railwayDay/index.vue | 8 +- .../components/IndicatorQuery/index.vue | 162 +++--------------- 5 files changed, 79 insertions(+), 157 deletions(-) diff --git a/ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/index.vue b/ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/index.vue index 6df8e7ad..732221aa 100644 --- a/ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/index.vue +++ b/ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/index.vue @@ -18,12 +18,12 @@ </el-select> <el-date-picker size="mini" v-if="type != 'quarter'" class="selectRoad" v-model="dateTime" style="width: 140px" :type="type == 'date' - ? 'date' - : type == 'month' - ? 'month' - : type == 'year' - ? 'year' - : '' + ? 'date' + : type == 'month' + ? 'month' + : type == 'year' + ? 'year' + : '' " placeholder="请选择" :clearable="false" /> <el-button type="primary" size="mini" class="btnSearch" @click="searchQuery" icon="el-icon-search">查询</el-button> @@ -34,8 +34,9 @@ <div class="body"> <div> <WgtTitle :title="'感知事件趋势分析'"></WgtTitle> - <Empty v-show="!chart1List || chart1List.length <= 0" text="暂无数据..."></Empty> - <div v-show="chart1List || chart1List.length > 0" id="chart1" class="btnChart" /> + <!-- <Empty v-show="!chart1List || chart1List.length <= 0" text="暂无数据..."></Empty> --> + <!-- <div v-show="chart1List || chart1List.length > 0" id="chart1" class="btnChart" />--> + <div id="chart1" class="btnChart" /> </div> <div> @@ -249,6 +250,43 @@ export default { let data = res.data; chart1.series[0].data = []; chart1.xAxis.data = []; + + + //月份的单独处理 + if (this.type == "month") { + let daysInMonth = moment(this.dateTime, "YYYY-MM").daysInMonth(); + let sData = {}; + data.forEach(it => sData[parseInt(it.day.slice(-2))] = it.number) + let pData = [] + for (let index = 1; index <= daysInMonth; index++) { + pData.push({ + day: index, + number: sData[index] || 0 + }) + } + data = pData; + } + //季度单独处理 + if (this.type == "quarter") { + let quarterMap = { + 1: [1, 2, 3], + 2: [4, 5, 6], + 3: [7, 8, 9], + 4: [10, 11, 12], + }; + let sData = {} + data.forEach(it => sData[it.month] = it.number); + let pData = [] + for (let index = 0; index < 3; index++) { + let month = quarterMap[this.quarter][index]; + pData.push({ + month: month, + number: sData[month] || 0 + }) + } + data = pData; + } + if (data.length > 0) { const maxObject = data.reduce((prev, current) => current.number > prev.number ? current : prev @@ -261,10 +299,11 @@ export default { xData.push(it.month + "月"); } if (this.type == "month") { - xData.push(it.day.split("-")[2] + "日"); + // xData.push(it.day.split("-")[2] + "日"); + xData.push(it.day + "日"); } if (this.type == "date") { - xData.push(it.time.split(" ")[1] + "时"); + xData.push(it.time + "时"); } if (this.type == "quarter") { xData.push(it.month + "月"); diff --git a/ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/railway/index.vue b/ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/railway/index.vue index 74e7399f..8138e20b 100644 --- a/ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/railway/index.vue +++ b/ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/railway/index.vue @@ -52,9 +52,10 @@ export default { let texts = []; let datas = []; - data.forEach((it) => { + data.forEach((it,index) => { + if(index > 9) return; texts.push(it.sectionName); - datas.push(it.number); + datas.push(it.number2); }); chartsStatistics.yAxis[0].data = texts; diff --git a/ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/railwayDay/assets/charts.js b/ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/railwayDay/assets/charts.js index 2de31be1..0fb39268 100644 --- a/ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/railwayDay/assets/charts.js +++ b/ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/railwayDay/assets/charts.js @@ -82,6 +82,8 @@ var options = { show: true, color: "#fff", fontSize: 10, + // interval: 0, + // rotate: -20 }, }, yAxis: [ diff --git a/ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/railwayDay/index.vue b/ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/railwayDay/index.vue index 8e043c37..dda2144c 100644 --- a/ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/railwayDay/index.vue +++ b/ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/railwayDay/index.vue @@ -47,15 +47,15 @@ export default { let texts = []; let datas = []; const maxObject = data.reduce((prev, current) => - current.number > prev.number ? current : prev + current.number2 > prev.number2 ? current : prev ); data.forEach((it) => { texts.push(it.sectionName); - if (it.number == maxObject.number) { + if (it.number2 == maxObject.number2) { datas.push({ - value: it.number, + value: it.number2, itemStyle: { color: { type: "linear", @@ -80,7 +80,7 @@ export default { }); } else { datas.push({ - value: it.number, + value: it.number2, itemStyle: { borderRadius: 6, }, diff --git a/ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorQuery/index.vue b/ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorQuery/index.vue index e365ea3e..65b34ee1 100644 --- a/ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorQuery/index.vue +++ b/ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorQuery/index.vue @@ -36,7 +36,7 @@ <!-- 分页 --> <div class="footer"> <Pagination @current-change="getData" @size-change="onSizeChange" width="'100%'" :page-sizes="[10, 20, 30, 40, 50]" - :page-size="pageSize" :current-page.sync="pageNum" layout="total, sizes, prev, pager, next" :total="50"> + :page-size="pageSize" :current-page.sync="pageNum" layout="total, sizes, prev, pager, next" :total="10"> </Pagination> </div> </div> @@ -61,164 +61,44 @@ export default { return { tableData: [{ date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' + name: '畅通', + address: '大学城-长活' }, { date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' + name: '畅通', + address: '长湑-孝里' }, { date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' + name: '畅通', + address: '孝里-平阴北平阴北-平阴' }, { date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' + name: '畅通', + address: '平阴-平阴南' }, { date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' + name: '畅通', + address: '平阴南-东平' }, { date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' + name: '畅通', + address: '平明-平阴南' }, { date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' + name: '畅通', + address: '平明南-东平' }, { date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' + name: '畅通', + address: '孝里-平阴北平明北-平明' }, { date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' + name: '畅通', + address: '平阴-平阴南' }, { date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, , { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, , { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, , { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, , { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, , { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, , { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, , { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, , { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' - }, { - date: '2023-12-31 13:00:00', - name: '2640.78m', - address: 'K100+000-K110+000' + name: '畅通', + address: '平阴-平阴南' }, ], formList: [], From b32b707aa637b51888c7095e913871838cf8289d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=9C=8B?= <lbp608@126.com> Date: Thu, 29 Feb 2024 18:16:00 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8E=86=E5=8F=B2?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E6=97=A0=E6=B3=95=E5=85=B3=E9=97=AD=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/dutyOfficer/components/OperateRecord.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/dutyOfficer/components/OperateRecord.vue b/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/dutyOfficer/components/OperateRecord.vue index d82f3f4e..061f189b 100644 --- a/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/dutyOfficer/components/OperateRecord.vue +++ b/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/dutyOfficer/components/OperateRecord.vue @@ -6,8 +6,8 @@ <div class="no-data" v-else>暂无操作记录</div> <div class="bottom"> - <Button>确认</Button> - <Button :style="{ backgroundColor: '#C9C9C9' }"> 取消</Button> + <Button @click.native="$emit('close')">确认</Button> + <Button :style="{ backgroundColor: '#C9C9C9' }" @click.native="$emit('close')"> 取消</Button> </div> </div> </Dialog> From 56b37d1d9ca98cb6242a05bafaf93448852d61dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=9C=8B?= <lbp608@126.com> Date: Thu, 29 Feb 2024 18:18:18 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=80=BC=E7=8F=AD?= =?UTF-8?q?=E4=BA=BA=E5=91=98=E4=BF=AE=E6=94=B9=E7=9B=B8=E5=85=B3=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/ModifyDutyInformationTable.vue | 160 ++++++++++++------ .../views/dutyOfficer/index.vue | 11 +- 2 files changed, 113 insertions(+), 58 deletions(-) diff --git a/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/dutyOfficer/components/ModifyDutyInformationTable.vue b/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/dutyOfficer/components/ModifyDutyInformationTable.vue index ee7b93cb..17b06b5c 100644 --- a/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/dutyOfficer/components/ModifyDutyInformationTable.vue +++ b/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/dutyOfficer/components/ModifyDutyInformationTable.vue @@ -20,8 +20,9 @@ <div :class="['line', { active: active == 'dayShift' }]"> <p @click="active = 'dayShift'">白天值班:</p> <div> - <p v-for="(item, index) in dayShift" :key="`${item.id}_${index}`" @click="removeDutyPerson(item)">{{ - item.name }}</p> + <p v-for="(item, index) in dayShift" :key="`${item.id}_${index}`" @click="removeDutyPerson(item)"> + {{ item.name }} + </p> <div class="no-data" v-if="!dayShift.length">未添加人员</div> </div> </div> @@ -29,8 +30,9 @@ <div :class="['line', { active: active == 'graveyardShift' }]"> <p @click="active = 'graveyardShift'">晚上值班:</p> <div> - <p v-for="(item, index) in graveyardShift" :key="`${index}_${item.id}`" @click="removeDutyPerson(item)">{{ - item.name }}</p> + <p v-for="(item, index) in graveyardShift" :key="`${index}_${item.id}`" @click="removeDutyPerson(item)"> + {{ item.name }} + </p> <div class="no-data" v-if="!graveyardShift.length">未添加人员</div> </div> </div> @@ -141,7 +143,8 @@ export default { }, methods: { chooseDutyPerson(item) { - const hasInserted = this[this.active].find(_item => _item.id === item.id); + + const hasInserted = this[this.active].find(_item => _item.employeesId === item.id || _item.id === item.id); if (hasInserted) return Message.warning("人员已存在"); @@ -150,11 +153,11 @@ export default { removeDutyPerson(item) { const index = this[this.active].findIndex(_item => _item.id === item.id); - if (index === -1) return Message.warning("人员不存在"); + if (index === -1) return;//Message.warning("人员不存在"); this[this.active].splice(index, 1); }, - getPeopleList(id) { + getPeopleList(stationId) { this.peopleList = []; this.dayShift = []; @@ -163,32 +166,44 @@ export default { const closeMessage = loadingMessage({ message: "人员获取中..." }); request({ - // url: `/business/employees/list`, - // method: "GET", - // params: { - // organizationId: id - // } - url: `/business/shifts/byStation`, - method: "POST", - data: { - station: this.data.station, - date: this.data.date, + url: `/business/employees/list`, + method: "GET", + params: { + organizationId: stationId } - }) - .then((result) => { - if (result.code != 200) return Message.error("人员获取失败"); - if (!result.data?.length) return Message.warning("该驻点下暂无人员"); + }).then((result) => { + if (result.code != 200) return Message.error("人员获取失败"); + if (!result.rows?.length) return Message.warning("该驻点下暂无人员"); - Message.success("人员获取成功") + // Message.success("人员获取成功") - this.peopleList = result.data; - }) - .catch((err) => { + this.peopleList = result.rows; + }).catch((err) => { + Message.error("人员获取失败") + }).finally(() => { + closeMessage(); + }) + + //修改时,获取已排版人员列表 + if (this.data) { + request({ + url: `/business/shifts/byStation`, + method: "POST", + data: { + station: this.data.station, + date: this.data.date, + } + }).then((result) => { + console.log("result.data:", result.data); + this.dayShift = result.data.filter(item => item.scheduling === "1"); + console.log("this.dayShift11:", this.dayShift); + this.graveyardShift = result.data.filter(item => item.scheduling === "2"); + }).catch((err) => { Message.error("人员获取失败") - }) - .finally(() => { + }).finally(() => { closeMessage(); }) + } }, updateData(data) { return request({ @@ -197,13 +212,14 @@ export default { data: { date: data.date, employeesJson: [ - ...this.dayShift.map(({ id }) => ({ - employeesId: id, + ...this.dayShift.map((item) => ({ + //添加和修改时,人员id字段来源不一样 + employeesId: item.employeesId ? item.employeesId : item.id, scheduling: 1, station: data.station })), - ...this.graveyardShift.map(({ id }) => ({ - employeesId: id, + ...this.graveyardShift.map((item) => ({ + employeesId: item.employeesId ? item.employeesId : item.id, scheduling: 2, station: data.station })), @@ -214,26 +230,24 @@ export default { async submit() { let data = this.data; - if (this.$refs.FormRef) + if (this.$refs.FormRef) { data = await this.$refs.FormRef.validate(); - console.log("%c [ data ]-202-「ModifyDutyInformationTable.vue」", "font-size:15px; background:#9afce6; color:#deffff;", data, this.value2); + } + // console.log("%c [ data ]-202-「ModifyDutyInformationTable.vue」", "font-size:15px; background:#9afce6; color:#deffff;", data, this.value2); - const closeMessage = loadingMessage({ message: "正在保存值班信息..." }); + const closeMessage = loadingMessage({ message: "正在保存值班信息111..." }); if (!this.data) { - this.updateData(data) - .then((result) => { - console.log("%c [ result ]-217-「ModifyDutyInformationTable.vue」", "font-size:15px; background:#335cf6; color:#77a0ff;", result); + this.updateData(data).then((result) => { + // console.log("%c [ result ]-217-「ModifyDutyInformationTable.vue」", "font-size:15px; background:#335cf6; color:#77a0ff;", result); if (result.code != 200) return Message.error("保存失败"); Message.success("保存成功"); this.$emit('close') - }) - .catch((err) => { + }).catch((err) => { Message.error("保存失败") - }) - .finally(() => { + }).finally(() => { closeMessage(); }) return; @@ -244,31 +258,71 @@ export default { (this.data.dayShift || []).forEach(item => { const findIndex = this.dayShift.findIndex(_item => _item.id === item.id); - if (findIndex === -1) deleteIds.push(item.delId) + if (findIndex === -1) deleteIds.push(item.id) }); (this.data.graveyardShift || []).forEach(item => { const findIndex = this.graveyardShift.findIndex(_item => _item.id === item.id); - if (findIndex === -1) deleteIds.push(item.delId) + + if (findIndex === -1) deleteIds.push(item.id) }) - Promise.allSettled([ - deleteIds?.length ? request({ + + // Promise.allSettled([ + // deleteIds?.length ? request({ + // url: `/business/shifts/${deleteIds.join()}`, + // method: "DELETE", + // data: {} + // }) : Promise.resolve(), + // this.updateData(this.data) + // ]).then(([del, update]) => { + // if (del.status === 'rejected' && update.status === 'rejected') return Message.error("修改失败"); + // if (del.value?.code != '200' && update.value?.code != '200') return Message.error("修改失败"); + + // this.$emit('close') + // }).finally(() => { + // closeMessage(); + // }) + + //如果有需要删除的人员,先删除,再更新 + if(deleteIds?.length){ + request({ url: `/business/shifts/${deleteIds.join()}`, method: "DELETE", data: {} - }) : Promise.resolve(), - this.updateData(this.data) - ]) - .then(([del, update]) => { - if (del.status === 'rejected' && update.status === 'rejected') return Message.error("修改失败"); - if (del.value?.code != '200' && update.value?.code != '200') return Message.error("修改失败"); + }).then((result) => { + if (result.code != 200) return Message.error("修改失败"); + + this.updateData(this.data).then((result) => { + if (result.code != 200) return Message.error("修改失败"); + + Message.success("修改成功"); + + this.$emit('close') + }).catch((err) => { + Message.error("修改失败") + }).finally(() => { + closeMessage(); + }) + }).catch((err) => { + Message.error("删除失败") + }).finally(() => { + closeMessage(); + }) + }else{ + this.updateData(this.data).then((result) => { + if (result.code != 200) return Message.error("修改失败"); + + Message.success("修改成功"); this.$emit('close') - }) - .finally(() => { + }).catch((err) => { + Message.error("修改失败") + }).finally(() => { closeMessage(); }) + } + } } } diff --git a/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/dutyOfficer/index.vue b/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/dutyOfficer/index.vue index 457d2d21..c5e3b6cc 100644 --- a/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/dutyOfficer/index.vue +++ b/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/dutyOfficer/index.vue @@ -217,11 +217,12 @@ export default { this.modifyDutyInformationTableVisible = bool; - this.dialogData = !data ? null : { - ...data, - dayShift: (data.dayShift || []).map(item => ({ ...item, delId: item.id, id: item.employeesId })), - graveyardShift: (data.graveyardShift || []).map(item => ({ ...item, id: item.employeesId })) - }; + // this.dialogData = !data ? null : { + // ...data, + // dayShift: (data.dayShift || []).map(item => ({ ...item, delId: item.id, id: item.employeesId })), + // graveyardShift: (data.graveyardShift || []).map(item => ({ ...item, id: item.employeesId })) + // }; + this.dialogData = data; }, handleExport() { exportFile({