diff --git a/ruoyi-ui/src/views/JiHeExpressway/components/FormConfig/components/FormSelect.vue b/ruoyi-ui/src/views/JiHeExpressway/components/FormConfig/components/FormSelect.vue new file mode 100644 index 00000000..0188941d --- /dev/null +++ b/ruoyi-ui/src/views/JiHeExpressway/components/FormConfig/components/FormSelect.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/ruoyi-ui/src/views/JiHeExpressway/components/Popover/index.vue b/ruoyi-ui/src/views/JiHeExpressway/components/Popover/index.vue new file mode 100644 index 00000000..39971bd4 --- /dev/null +++ b/ruoyi-ui/src/views/JiHeExpressway/components/Popover/index.vue @@ -0,0 +1,47 @@ + + + + + + diff --git a/ruoyi-ui/src/views/JiHeExpressway/components/Scrollbar/BlackBar.vue b/ruoyi-ui/src/views/JiHeExpressway/components/Scrollbar/BlackBar.vue index 709d5280..8ab21435 100644 --- a/ruoyi-ui/src/views/JiHeExpressway/components/Scrollbar/BlackBar.vue +++ b/ruoyi-ui/src/views/JiHeExpressway/components/Scrollbar/BlackBar.vue @@ -18,7 +18,9 @@ export default { height: 100%; overflow: hidden; padding: 6px; - background: #000000; + // background: #000000; + border: 1px solid; + border-image: linear-gradient(72deg, rgba(55, 231, 255, .6), rgba(55, 231, 255, 0)) 1 1; .BlackBar { width: 100%; diff --git a/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/CrowdnessIndicatorRankings/index.vue b/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/CrowdnessIndicatorRankings/index.vue index c2b26d80..aaef0c16 100644 --- a/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/CrowdnessIndicatorRankings/index.vue +++ b/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/CrowdnessIndicatorRankings/index.vue @@ -1,20 +1,123 @@ diff --git a/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DisposalPlan/index.vue b/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DisposalPlan/index.vue index c60fe9ce..877f2903 100644 --- a/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DisposalPlan/index.vue +++ b/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DisposalPlan/index.vue @@ -1,20 +1,234 @@ diff --git a/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DisposalPlan/utils.js b/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DisposalPlan/utils.js new file mode 100644 index 00000000..e8904032 --- /dev/null +++ b/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DisposalPlan/utils.js @@ -0,0 +1,202 @@ +export function getQuadrant(angle) { + angle %= 360.0; + if (angle < 0) angle += 360.0; + var quadrant = Math.floor(angle / 90) + 1; + return quadrant; +} + +export function calcPoint(x0, y0, width, height, angle) { + const parseAngle = parseFloat(angle); + + angle = (Math.PI / 180) * parseFloat(parseAngle); + + x0 += width / 2; + y0 += height / 2; + + const hypotenuse = width / 2 > height / 2 ? width / 2 : height / 2; + + // 对边 + let oppositeEdge = Math.abs(hypotenuse * Math.sin(angle)); + + // 邻边 + let adjacentEdge = Math.abs(hypotenuse * Math.cos(angle)); + + let point0 = [], + point1 = []; + + switch (parseFloat(parseAngle) % 360.0) { + case 180: + oppositeEdge = adjacentEdge; + adjacentEdge = 0; + break; + case 90: + case 270: + adjacentEdge = oppositeEdge; + oppositeEdge = 0; + break; + } + + switch (getQuadrant(parseAngle)) { + case 1: + point0 = [x0 - adjacentEdge, y0 + oppositeEdge]; + point1 = [x0 + adjacentEdge, y0 - oppositeEdge]; + break; + case 2: + point0 = [x0 - adjacentEdge, y0 - oppositeEdge]; + point1 = [x0 + adjacentEdge, y0 + oppositeEdge]; + break; + case 3: + point0 = [x0 + adjacentEdge, y0 - oppositeEdge]; + point1 = [x0 - adjacentEdge, y0 + oppositeEdge]; + break; + case 4: + point0 = [x0 + adjacentEdge, y0 + oppositeEdge]; + point1 = [x0 - adjacentEdge, y0 - oppositeEdge]; + break; + } + + return angle > 0 ? [point0, point1] : [point1, point0]; +} + +export class CanvasFlow { + canvas = null; + context = null; + zoom = 3; + constructor(canvas) { + this.canvas = canvas; + this.context = canvas.getContext("2d"); + + this.canvas.width = canvas.clientWidth * this.zoom; + this.canvas.height = canvas.clientHeight * this.zoom; + } + + drawRectangle({ + x, + y, + width, + height, + borderWidth, + borderColor, + backgroundColor, + radius, + }) { + if (backgroundColor) this.context.fillStyle = backgroundColor; + + x *= this.zoom; + y *= this.zoom; + width *= this.zoom; + height *= this.zoom; + + if (radius) { + this.context.beginPath(); + this.context.roundRect(x, y, width, height, radius); + this.context.fill(); + } else { + this.context.fillRect(x, y, width, height); + } + + if (typeof borderWidth === "number") { + borderWidth *= this.zoom; + + this.context.lineWidth = borderWidth; + this.context.strokeStyle = borderColor; + + this.context.stroke(); + } + } + + transformCssLinearGradient(x, y, width, height, linearGradient) { + const [_, deg, ...stopStrings] = linearGradient.match(/[^,()]+/g); + + const stops = stopStrings.map((stop) => { + const [color, offset] = stop.trim().split(" "); + + return { + color, + offset: parseFloat(offset) * 0.01, + }; + }); + + const [point0, point1] = calcPoint(x, y, width, height, deg); + + return [ + { + x0: point0[0], + y0: point0[1], + x1: point1[0], + y1: point1[1], + }, + stops, + ]; + } + + setLinearGradient({ x0, y0, x1, y1 }, stops) { + x0 *= this.zoom; + x1 *= this.zoom; + y0 *= this.zoom; + y1 *= this.zoom; + + const gradient = this.context.createLinearGradient(x0, y0, x1, y1); + + stops.forEach(({ offset, color }) => { + gradient.addColorStop(offset, color); + }); + + this.context.fillStyle = gradient; + } + + drawLine({ startX, endX, color }, vertices) { + startX *= this.zoom; + endX *= this.zoom; + + ctx.beginPath(); + + ctx.moveTo(startX, endX); + + vertices.forEach(({ x, y }) => { + ctx.lineTo(x * this.zoom, y * this.zoom); + }); + + this.context.strokeStyle = color; + + ctx.stroke(); + } + + fillText( + text, + { + x, + y, + fontSize = 15, + color, + align = "center", + fontWeight = "normal", + fontFamily = "微软雅黑", + } = {}, + { width: rectWidth = 0, height: rectHeight = 0 } = {} + ) { + this.context.font = `${fontWeight} ${fontSize * this.zoom}px ${fontFamily}`; + + this.context.textBaseline = "middle"; + + const textWidth = this.context.measureText(text).width; + + x *= this.zoom; + + switch (align) { + case "center": + x += (rectWidth * this.zoom - textWidth) / 2; + + y += rectHeight / 2; + break; + } + + this.context.fillStyle = color; + + this.context.fillText(text, x, y * this.zoom); + } + + clear() { + this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); + } +} diff --git a/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/index.vue b/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/index.vue index fd3ac562..77e14e3f 100644 --- a/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/index.vue +++ b/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/index.vue @@ -80,7 +80,7 @@ export default { gap: 18px; >div { - transition: all .3s linear; + transition: all .18s linear; } ::v-deep { diff --git a/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/dispatch/EventDetailDialog/index.vue b/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/dispatch/EventDetailDialog/index.vue index 36e3e352..d7e8b863 100644 --- a/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/dispatch/EventDetailDialog/index.vue +++ b/ruoyi-ui/src/views/JiHeExpressway/pages/control/event/dispatch/EventDetailDialog/index.vue @@ -2,7 +2,25 @@
- + +
+
+

调度记录

+ + 2024年01月12日 00时00分00秒 至 2024年01月12日 23时59分59秒 + +
+
+

2024-01-12 08:59,山东高速济南发展有限公司,集团账号:由出行转接上报了一起交通事故事件;

+

2024-01-12 09:08,山东高速济南发展有限公司,系统消息:自动分配路管人员陈清泉,救援车辆鲁AJ7K68参与事件处置;

+

2024-01-12 09:08,山东高速济南发展有限公司,晋雪艳1;

+

2024-01-12 09:00,山东高速济南发展有限公司,三雪艳2;

+

2024-01-12 09:11,山东高速济南发展有限公司,晋雪艳2;

+

2024-01-12 09:11,山东高速济南发展有限公司,晋雪艳3;

+

2024-01-12 09:12.山东高速济南发展有限公司,晋雪艳4;

+

2024-01-12 09:12,山东高速济南发展有限公司,晋雪艳4;

+
+
@@ -52,6 +70,28 @@ export default { flex: 1; width: 600px; height: 720px; + + .example { + display: flex; + flex-direction: column; + gap: 9px; + + >div { + display: flex; + flex-direction: column; + } + + >.body { + gap: 6px; + font-size: 13px; + } + + >.title { + align-items: center; + border-bottom: 1px solid white; + padding-bottom: 6px; + } + } } .right { diff --git a/ruoyi-ui/vue.config.js b/ruoyi-ui/vue.config.js index 32af6f6f..205f8d2d 100644 --- a/ruoyi-ui/vue.config.js +++ b/ruoyi-ui/vue.config.js @@ -40,12 +40,13 @@ module.exports = { // target: `http://192.168.0.182:8080`, // target: `http://192.168.0.194:8080`, // target: `http://10.0.81.201:8080`, - target: `http://10.168.77.209:8080`,// 刘朋 + target: `http://10.168.77.209:8080`, // 刘朋 + target: `http://10.168.73.36:8080`, // 周乐 changeOrigin: true, pathRewrite: { - ['^' + process.env.VUE_APP_BASE_API]: '' - } - } + ["^" + process.env.VUE_APP_BASE_API]: "", + }, + }, }, disableHostCheck: true,