feat:场景配置中新增、编辑、查看,对于已选区域回显处理
4 files modified
13 files renamed
1 files added
| | |
| | | # @Author : yuan |
| | | # @Date : 2026-01-07 14:58:30 |
| | | # @LastEditors : yuan |
| | | # @LastEditTime : 2026-01-29 15:22:54 |
| | | # @LastEditTime : 2026-01-30 09:29:25 |
| | | # @FilePath : \applications\drone-command\env\.env.development |
| | | # @Description : |
| | | # Copyright 2026 OBKoro1, All Rights Reserved. |
| | |
| | | |
| | | #开发环境代理地址(推荐本地新建文件 .env.development.local 来进行覆盖) |
| | | # VITE_APP_URL = https://wrj.shuixiongit.com/api |
| | | VITE_APP_URL= http://192.168.1.168 |
| | | VITE_APP_URL= http://192.168.1.204 |
| | | |
| | | #新大屏地址 |
| | | VITE_APP_DASHBOARD_URL = 'https://wrj.shuixiongit.com/command-center-dashboard/' |
| New file |
| | |
| | | export { DrawManager } from './DrawManager' |
| | | export { EditManager } from './EditManager' |
| | | export { buildEllipsePositions, getBoundsFromCartesians, getBoundsFromLngLats, rectanglePositionsFromBounds, getCenterFromBounds, getMetersBetween, cartesianToLocal } from './shapeUtils' |
| | | export { DrawPolygonTool } from './draw/DrawPolygonTool' |
| | | export { DrawRectangleTool } from './draw/DrawRectangleTool' |
| | | export { DrawEllipseTool } from './draw/DrawEllipseTool' |
| | | export { DrawBufferCircleTool } from './draw/DrawBufferCircleTool' |
| | | export { EditPolygonTool } from './edit/EditPolygonTool' |
| | | export { EditRectangleTool } from './edit/EditRectangleTool' |
| | | export { EditEllipseTool } from './edit/EditEllipseTool' |
| | | export { EditBufferCircleTool } from './edit/EditBufferCircleTool' |
| | | export { ToolBase } from './ToolBase' |
| | | export { MapTooltip as Tooltip } from './Tooltip' |
| | |
| | | |
| | | |
| | | ## 新增或修改 |
| | | ## 列表-不带分页 |
| | | |
| | | |
| | | **接口地址**:`/area/fwAreaDivide/submit` |
| | | |
| | | |
| | | **请求方式**:`POST` |
| | | |
| | | |
| | | **请求数据类型**:`application/json` |
| | | |
| | | |
| | | **响应数据类型**:`*/*` |
| | | |
| | | |
| | | **接口描述**:<p>传入主表对象与扩展面列表</p> |
| | | |
| | | |
| | | |
| | | **请求示例**: |
| | | |
| | | |
| | | ```javascript |
| | | { |
| | | "areaDivide": { |
| | | "areaCode": "", |
| | | "areaName": "", |
| | | "controlLevel": "", |
| | | "createDept": 0, |
| | | "createTime": "", |
| | | "createUser": 0, |
| | | "deviceIds": "", |
| | | "flyDateEnd": "", |
| | | "flyDateStart": "", |
| | | "id": 0, |
| | | "isDeleted": 0, |
| | | "policeStationId": 0, |
| | | "responseMechanism": "", |
| | | "status": 0, |
| | | "triggerCondition": "", |
| | | "updateTime": "", |
| | | "updateUser": 0 |
| | | }, |
| | | "areaDivideExtList": [ |
| | | { |
| | | "areaCode": "", |
| | | "areaDivideId": 0, |
| | | "areaTypeKey": "", |
| | | "areaTypeValue": "", |
| | | "createDept": 0, |
| | | "createTime": "", |
| | | "createUser": 0, |
| | | "geomJson": "", |
| | | "id": 0, |
| | | "isDeleted": 0, |
| | | "status": 0, |
| | | "updateTime": "", |
| | | "updateUser": 0 |
| | | } |
| | | ] |
| | | } |
| | | ``` |
| | | |
| | | |
| | | **请求参数**: |
| | | |
| | | |
| | | **请求参数**: |
| | | |
| | | |
| | | | 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | |
| | | | -------- | -------- | ----- | -------- | -------- | ------ | |
| | | |fwAreaDivideSubmit|fwAreaDivideSubmit|body|true|FwAreaDivideSubmitDTO|FwAreaDivideSubmitDTO| |
| | | |  areaDivide|区域划分表||false|FwAreaDivide对象|FwAreaDivide对象| |
| | | |    areaCode|区域编码||false|string|| |
| | | |    areaName|区域名称||false|string|| |
| | | |    controlLevel|管控级别:日常/重点/严密||false|string|| |
| | | |    createDept|创建部门||false|integer|| |
| | | |    createTime|创建时间||false|string|| |
| | | |    createUser|创建人||false|integer|| |
| | | |    deviceIds|关联设备ID,逗号分隔||false|string|| |
| | | |    flyDateEnd|可飞行日期时间-结束||false|string|| |
| | | |    flyDateStart|可飞行日期时间-开始||false|string|| |
| | | |    id|主键id||false|integer|| |
| | | |    isDeleted|是否已删除||false|integer|| |
| | | |    policeStationId|关联派出所id||false|integer|| |
| | | |    responseMechanism|响应机制内容||false|string|| |
| | | |    status|业务状态||false|integer|| |
| | | |    triggerCondition|触发条件||false|string|| |
| | | |    updateTime|更新时间||false|string|| |
| | | |    updateUser|更新人||false|integer|| |
| | | |  areaDivideExtList|区域划分扩展表(多面数据/多区域类型)||false|array|FwAreaDivideExt对象| |
| | | |    areaCode|区域编码||false|string|| |
| | | |    areaDivideId|关联主表区域划分ID||false|integer|| |
| | | |    areaTypeKey|区域类型数字字典key||false|string|| |
| | | |    areaTypeValue|区域类型数字字典value||false|string|| |
| | | |    createDept|创建部门||false|integer|| |
| | | |    createTime|创建时间||false|string|| |
| | | |    createUser|创建人||false|integer|| |
| | | |    geomJson|几何JSON||false|string|| |
| | | |    id|主键id||false|integer|| |
| | | |    isDeleted|是否已删除||false|integer|| |
| | | |    status|业务状态||false|integer|| |
| | | |    updateTime|更新时间||false|string|| |
| | | |    updateUser|更新人||false|integer|| |
| | | |
| | | |
| | | **响应状态**: |
| | | |
| | | |
| | | | 状态码 | 说明 | schema | |
| | | | -------- | -------- | ----- | |
| | | |200|OK|R| |
| | | |201|Created|| |
| | | |401|Unauthorized|| |
| | | |403|Forbidden|| |
| | | |404|Not Found|| |
| | | |
| | | |
| | | **响应参数**: |
| | | |
| | | |
| | | | 参数名称 | 参数说明 | 类型 | schema | |
| | | | -------- | -------- | ----- |----- | |
| | | |code|状态码|integer(int32)|integer(int32)| |
| | | |data|承载数据|object|| |
| | | |msg|返回消息|string|| |
| | | |success|是否成功|boolean|| |
| | | |
| | | |
| | | **响应示例**: |
| | | ```javascript |
| | | { |
| | | "code": 0, |
| | | "data": {}, |
| | | "msg": "", |
| | | "success": true |
| | | } |
| | | ``` |
| | | |
| | | |
| | | |
| | | |
| | | ## 详情 |
| | | |
| | | |
| | | **接口地址**:`/area/fwAreaDivide/detail` |
| | | **接口地址**:`/drone-fw/area/fwAreaDivide/list` |
| | | |
| | | |
| | | **请求方式**:`GET` |
| | |
| | | **响应数据类型**:`*/*` |
| | | |
| | | |
| | | **接口描述**:<p>传入id</p> |
| | | **接口描述**:<p>传入filterSelected或sceneId或areaTypeKeys</p> |
| | | |
| | | |
| | | |
| | |
| | | |
| | | | 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | |
| | | | -------- | -------- | ----- | -------- | -------- | ------ | |
| | | |id|主键id|query|true|integer(int64)|| |
| | | |areaTypeKeys|区域类型key集合(逗号分隔)|query|false|string|| |
| | | |filterSelected|是否过滤已被选择的数据(1过滤 0不过滤)|query|false|integer(int32)|| |
| | | |sceneId|场景id|query|false|integer(int64)|| |
| | | |
| | | |
| | | **响应状态**: |
| | |
| | | |
| | | | 状态码 | 说明 | schema | |
| | | | -------- | -------- | ----- | |
| | | |200|OK|R«FwAreaDivideVO»| |
| | | |200|OK|R«List«FwAreaDivideVO»»| |
| | | |401|Unauthorized|| |
| | | |403|Forbidden|| |
| | | |404|Not Found|| |
| | |
| | | | 参数名称 | 参数说明 | 类型 | schema | |
| | | | -------- | -------- | ----- |----- | |
| | | |code|状态码|integer(int32)|integer(int32)| |
| | | |data|承载数据|FwAreaDivideVO|FwAreaDivideVO| |
| | | |data|承载数据|array|FwAreaDivideVO| |
| | | |  areaCode|区域编码|string|| |
| | | |  areaName|区域名称|string|| |
| | | |  areaTypeKeys|区域面的类型集合逗号隔开|string|| |
| | | |  controlLevel|管控级别:日常/重点/严密|string|| |
| | | |  deviceIds|关联设备ID,逗号分隔|string|| |
| | | |  flyDateEnd|可飞行日期时间-结束|string(date-time)|| |
| | |
| | | |    geomJson|几何JSON|string|| |
| | | |    id|主键id|integer|| |
| | | |  id|主键id|integer(int64)|| |
| | | |  policeStationContactPerson|派出所联系人|string|| |
| | | |  policeStationContactPhone|派出所联系电话|string|| |
| | | |  policeStationId|关联派出所id|string|| |
| | | |  policeStationName|派出所名称|string|| |
| | | |  responseMechanism|响应机制内容|string|| |
| | | |  triggerCondition|触发条件|string|| |
| | | |msg|返回消息|string|| |
| | |
| | | **响应示例**: |
| | | ```javascript |
| | | { |
| | | "code": 200, |
| | | "success": true, |
| | | "data": { |
| | | "id": "2016778024413888513", |
| | | "areaName": "新版测试1", |
| | | "triggerCondition": "1", |
| | | "responseMechanism": "1", |
| | | "controlLevel": "1", |
| | | "policeStationId": "6000000000001", |
| | | "deviceIds": "", |
| | | "flyDateStart": "2026-01-29 00:00:00", |
| | | "flyDateEnd": "2026-01-31 00:00:00", |
| | | "areaCode": "", |
| | | "fwAreaDivideExtList": [ |
| | | { |
| | | "id": "21", |
| | | "areaDivideId": "2016778024413888513", |
| | | "areaTypeKey": "1", |
| | | "areaTypeValue": "侦测区", |
| | | "geomJson": "{\"id\": \"shape_1769672288759_0bdd\", \"meta\": null, \"points\": [{\"lat\": 27.131594958673237, \"lng\": 114.97629628660002, \"height\": 0, \"latitude\": 27.131594958673237, \"longitude\": 114.97629628660002}, {\"lat\": 27.08982649211561, \"lng\": 114.95070164271222, \"height\": 0, \"latitude\": 27.08982649211561, \"longitude\": 114.95070164271222}, {\"lat\": 27.078929811185212, \"lng\": 114.9933846220512, \"height\": 0, \"latitude\": 27.078929811185212, \"longitude\": 114.9933846220512}, {\"lat\": 27.107909998247127, \"lng\": 115.02860852426171, \"height\": 0, \"latitude\": 27.107909998247127, \"longitude\": 115.02860852426171}], \"areaType\": \"1\", \"drawType\": \"polygon\", \"displayPoints\": null}", |
| | | "areaCode": "" |
| | | }, |
| | | { |
| | | "id": "22", |
| | | "areaDivideId": "2016778024413888513", |
| | | "areaTypeKey": "1", |
| | | "areaTypeValue": "侦测区", |
| | | "geomJson": "{\"id\": \"shape_1769672293742_947a\", \"meta\": {\"center\": {\"lat\": 27.117257447017685, \"lng\": 115.1020385237064, \"height\": 238.8343626960753}, \"semiMajor\": 6700.514105765581, \"semiMinor\": 1943.840234046766, \"majorPoint\": {\"lat\": 27.10775369958058, \"lng\": 115.168774284004, \"height\": 104.8557871185756}, \"minorPoint\": {\"lat\": 27.10046558321718, \"lng\": 115.1077128183224, \"height\": 184.11135376718033}, \"controlPoints\": [{\"lat\": 27.117257447017685, \"lng\": 115.1020385237064, \"height\": 238.8343626960753}, {\"lat\": 27.10775369958058, \"lng\": 115.168774284004, \"height\": 104.8557871185756}, {\"lat\": 27.10046558321718, \"lng\": 115.1077128183224, \"height\": 184.11135376718033}]}, \"points\": [{\"lat\": 27.117257447017685, \"lng\": 115.1020385237064, \"height\": 238.8343626960753}, {\"lat\": 27.10775369958058, \"lng\": 115.168774284004, \"height\": 104.8557871185756}, {\"lat\": 27.10046558321718, \"lng\": 115.1077128183224, \"height\": 184.11135376718033}], \"areaType\": \"1\", \"drawType\": \"ellipse\", \"displayPoints\": [{\"lat\": 27.1172411931675, \"lng\": 115.16961434879582, \"height\": 242.35137437266533, \"latitude\": 27.1172411931675, \"longitude\": 115.16961434879582}, {\"lat\": 27.11907502581333, \"lng\": 115.16924525730374, \"height\": 242.3161770455558, \"latitude\": 27.11907502581333, \"longitude\": 115.16924525730374}, {\"lat\": 27.120889115581708, \"lng\": 115.16813979957712, \"height\": 242.2121648606328, \"latitude\": 27.120889115581708, \"longitude\": 115.16813979957712}, {\"lat\": 27.12266356982587, \"lng\": 115.1663100528295, \"height\": 242.0438829806018, \"latitude\": 27.12266356982587, \"longitude\": 115.1663100528295}, {\"lat\": 27.124378919527693, \"lng\": 115.16377603274732, \"height\": 241.81868547594897, \"latitude\": 27.124378919527693, \"longitude\": 115.16377603274732}, {\"lat\": 27.12601633381306, \"lng\": 115.16056547557488, \"height\": 241.54641391722672, \"latitude\": 27.12601633381306, \"longitude\": 115.16056547557488}, {\"lat\": 27.127557827888296, \"lng\": 115.15671353542164, \"height\": 241.238967263203, \"latitude\": 27.127557827888296, \"longitude\": 115.15671353542164}, {\"lat\": 27.128986462048708, \"lng\": 115.1522624000547, \"height\": 240.9097818279928, \"latitude\": 27.128986462048708, \"longitude\": 115.1522624000547}, {\"lat\": 27.130286529493247, \"lng\": 115.14726082934388, \"height\": 240.57324405610856, \"latitude\": 27.130286529493247, \"longitude\": 115.14726082934388}, {\"lat\": 27.131443730790306, \"lng\": 115.14176362138588, \"height\": 240.24406177058316, \"latitude\": 27.131443730790306, \"longitude\": 115.14176362138588}, {\"lat\": 27.132445332979348, \"lng\": 115.13583101214034, \"height\": 239.93662137804984, \"latitude\": 27.132445332979348, \"longitude\": 115.13583101214034}, {\"lat\": 27.13328031145803, \"lng\": 115.12952801515418, \"height\": 239.66435911715624, \"latitude\": 27.13328031145803, \"longitude\": 115.12952801515418}, {\"lat\": 27.133939472996364, \"lng\": 115.12292370862173, \"height\": 239.43917383966289, \"latitude\": 27.133939472996364, \"longitude\": 115.12292370862173}, {\"lat\": 27.134415558431908, \"lng\": 115.1160904776194, \"height\": 239.27090697284905, \"latitude\": 27.134415558431908, \"longitude\": 115.1160904776194}, {\"lat\": 27.13470332383455, \"lng\": 115.10910321985791, \"height\": 239.16691240515263, \"latitude\": 27.13470332383455, \"longitude\": 115.10910321985791}, {\"lat\": 27.134799599179868, \"lng\": 115.1020385237064, \"height\": 239.131735087732, \"latitude\": 27.134799599179868, \"longitude\": 115.1020385237064}, {\"lat\": 27.13470332383455, \"lng\": 115.09497382755488, \"height\": 239.16691240471368, \"latitude\": 27.13470332383455, \"longitude\": 115.09497382755488}, {\"lat\": 27.134415558431908, \"lng\": 115.08798656979342, \"height\": 239.27090697166375, \"latitude\": 27.134415558431908, \"longitude\": 115.08798656979342}, {\"lat\": 27.133939472996364, \"lng\": 115.08115333879108, \"height\": 239.43917384027625, \"latitude\": 27.133939472996364, \"longitude\": 115.08115333879108}, {\"lat\": 27.13328031145803, \"lng\": 115.0745490322586, \"height\": 239.66435911740945, \"latitude\": 27.13328031145803, \"longitude\": 115.0745490322586}, {\"lat\": 27.132445332979348, \"lng\": 115.0682460352724, \"height\": 239.9366213773679, \"latitude\": 27.132445332979348, \"longitude\": 115.0682460352724}, {\"lat\": 27.1314437307903, \"lng\": 115.06231342602688, \"height\": 240.24406177080297, \"latitude\": 27.1314437307903, \"longitude\": 115.06231342602688}, {\"lat\": 27.130286529493247, \"lng\": 115.0568162180689, \"height\": 240.57324405754517, \"latitude\": 27.130286529493247, \"longitude\": 115.0568162180689}, {\"lat\": 27.128986462048708, \"lng\": 115.0518146473581, \"height\": 240.9097818281966, \"latitude\": 27.128986462048708, \"longitude\": 115.0518146473581}, {\"lat\": 27.127557827888293, \"lng\": 115.04736351199114, \"height\": 241.238967262521, \"latitude\": 27.127557827888293, \"longitude\": 115.04736351199114}, {\"lat\": 27.126016333813062, \"lng\": 115.04351157183788, \"height\": 241.54641391765136, \"latitude\": 27.126016333813062, \"longitude\": 115.04351157183788}, {\"lat\": 27.12437891952769, \"lng\": 115.04030101466547, \"height\": 241.81868547645408, \"latitude\": 27.12437891952769, \"longitude\": 115.04030101466547}, {\"lat\": 27.122663569825875, \"lng\": 115.03776699458332, \"height\": 242.04388298107517, \"latitude\": 27.122663569825875, \"longitude\": 115.03776699458332}, {\"lat\": 27.120889115581715, \"lng\": 115.03593724783563, \"height\": 242.2121648595728, \"latitude\": 27.120889115581715, \"longitude\": 115.03593724783563}, {\"lat\": 27.119075025813327, \"lng\": 115.03483179010902, \"height\": 242.3161770439311, \"latitude\": 27.119075025813327, \"longitude\": 115.03483179010902}, {\"lat\": 27.117241193167494, \"lng\": 115.03446269861692, \"height\": 242.35137437283345, \"latitude\": 27.117241193167494, \"longitude\": 115.03446269861692}, {\"lat\": 27.11540771522819, \"lng\": 115.03483398128904, \"height\": 242.31621922677547, \"latitude\": 27.11540771522819, \"longitude\": 115.03483398128904}, {\"lat\": 27.11359467407704, \"lng\": 115.03594153443072, \"height\": 242.2122487268214, \"latitude\": 27.11359467407704, \"longitude\": 115.03594153443072}, {\"lat\": 27.111821916531323, \"lng\": 115.03777318924902, \"height\": 242.04400754760337, \"latitude\": 27.111821916531323, \"longitude\": 115.03777318924902}, {\"lat\": 27.110108837455485, \"lng\": 115.04030884666572, \"height\": 241.81884927999585, \"latitude\": 27.110108837455485, \"longitude\": 115.04030884666572}, {\"lat\": 27.10847416848657, \"lng\": 115.04352069887712, \"height\": 241.5466150531188, \"latitude\": 27.10847416848657, \"longitude\": 115.04352069887712}, {\"lat\": 27.106935774434948, \"lng\": 115.0473735351744, \"height\": 241.23920341133748, \"latitude\": 27.106935774434948, \"longitude\": 115.0473735351744}, {\"lat\": 27.10551045951957, \"lng\": 115.05182512862444, \"height\": 240.91005029162608, \"latitude\": 27.10551045951957, \"longitude\": 115.05182512862444}, {\"lat\": 27.104213785474624, \"lng\": 115.05682669933678, \"height\": 240.57354179818523, \"latitude\": 27.104213785474624, \"longitude\": 115.05682669933678}, {\"lat\": 27.10305990342386, \"lng\": 115.06232344921456, \"height\": 240.24438546029003, \"latitude\": 27.10305990342386, \"longitude\": 115.06232344921456}, {\"lat\": 27.10206140126076, \"lng\": 115.06825516231812, \"height\": 239.93696743263703, \"latitude\": 27.10206140126076, \"longitude\": 115.06825516231812}, {\"lat\": 27.10122916810148, \"lng\": 115.07455686426626, \"height\": 239.66472374787935, \"latitude\": 27.10122916810148, \"longitude\": 115.07455686426626}, {\"lat\": 27.100572277192217, \"lng\": 115.0811595334639, \"height\": 239.43955308582795, \"latitude\": 27.100572277192217, \"longitude\": 115.0811595334639}, {\"lat\": 27.10009788845782, \"lng\": 115.087990856394, \"height\": 239.2712967482805, \"latitude\": 27.10009788845782, \"longitude\": 115.087990856394}, {\"lat\": 27.099811171674233, \"lng\": 115.0949760187379, \"height\": 239.16730853166112, \"latitude\": 27.099811171674233, \"longitude\": 115.0949760187379}, {\"lat\": 27.09971525103608, \"lng\": 115.1020385237064, \"height\": 239.13213333836975, \"latitude\": 27.09971525103608, \"longitude\": 115.1020385237064}, {\"lat\": 27.099811171674233, \"lng\": 115.10910102867491, \"height\": 239.167308531655, \"latitude\": 27.099811171674233, \"longitude\": 115.10910102867491}, {\"lat\": 27.10009788845782, \"lng\": 115.11608619101878, \"height\": 239.27129674685, \"latitude\": 27.10009788845782, \"longitude\": 115.11608619101878}, {\"lat\": 27.10057227719222, \"lng\": 115.1229175139489, \"height\": 239.43955308551512, \"latitude\": 27.10057227719222, \"longitude\": 115.1229175139489}, {\"lat\": 27.10122916810148, \"lng\": 115.12952018314652, \"height\": 239.66472374829976, \"latitude\": 27.10122916810148, \"longitude\": 115.12952018314652}, {\"lat\": 27.10206140126076, \"lng\": 115.13582188509464, \"height\": 239.93696743312785, \"latitude\": 27.10206140126076, \"longitude\": 115.13582188509464}, {\"lat\": 27.10305990342386, \"lng\": 115.14175359819826, \"height\": 240.2443854608264, \"latitude\": 27.10305990342386, \"longitude\": 115.14175359819826}, {\"lat\": 27.104213785474617, \"lng\": 115.14725034807596, \"height\": 240.5735417970414, \"latitude\": 27.104213785474617, \"longitude\": 115.14725034807596}, {\"lat\": 27.105510459519557, \"lng\": 115.15225191878834, \"height\": 240.91005029170333, \"latitude\": 27.105510459519557, \"longitude\": 115.15225191878834}, {\"lat\": 27.106935774434948, \"lng\": 115.15670351223838, \"height\": 241.23920341122712, \"latitude\": 27.106935774434948, \"longitude\": 115.15670351223838}, {\"lat\": 27.10847416848657, \"lng\": 115.16055634853564, \"height\": 241.5466150535108, \"latitude\": 27.10847416848657, \"longitude\": 115.16055634853564}, {\"lat\": 27.110108837455485, \"lng\": 115.16376820074704, \"height\": 241.81884927874424, \"latitude\": 27.110108837455485, \"longitude\": 115.16376820074704}, {\"lat\": 27.11182191653132, \"lng\": 115.16630385816376, \"height\": 242.04400754640932, \"latitude\": 27.11182191653132, \"longitude\": 115.16630385816376}, {\"lat\": 27.11359467407704, \"lng\": 115.16813551298206, \"height\": 242.2122487283748, \"latitude\": 27.11359467407704, \"longitude\": 115.16813551298206}, {\"lat\": 27.11540771522819, \"lng\": 115.16924306612378, \"height\": 242.31621922659275, \"latitude\": 27.11540771522819, \"longitude\": 115.16924306612378}]}", |
| | | "areaCode": "" |
| | | } |
| | | ] |
| | | }, |
| | | "msg": "操作成功" |
| | | "code": 0, |
| | | "data": [ |
| | | { |
| | | "areaCode": "", |
| | | "areaName": "", |
| | | "areaTypeKeys": "", |
| | | "controlLevel": "", |
| | | "deviceIds": "", |
| | | "flyDateEnd": "", |
| | | "flyDateStart": "", |
| | | "fwAreaDivideExtList": [ |
| | | { |
| | | "areaCode": "", |
| | | "areaDivideId": 0, |
| | | "areaTypeKey": "", |
| | | "areaTypeValue": "", |
| | | "geomJson": "", |
| | | "id": 0 |
| | | } |
| | | ], |
| | | "id": 0, |
| | | "policeStationContactPerson": "", |
| | | "policeStationContactPhone": "", |
| | | "policeStationId": "", |
| | | "policeStationName": "", |
| | | "responseMechanism": "", |
| | | "triggerCondition": "" |
| | | } |
| | | ], |
| | | "msg": "", |
| | | "success": true |
| | | } |
| | | ``` |
| | |
| | | import { useRoute } from 'vue-router' |
| | | import { fieldRules, geomAnalysis, getDictLabel } from '@ztzf/utils' |
| | | import CommonCesiumMap from '@/components/map-container/common-cesium-map.vue' |
| | | import { DrawManager } from './shapeTools/DrawManager' |
| | | import { EditManager } from './shapeTools/EditManager' |
| | | import { DrawManager, EditManager, buildEllipsePositions } from '@/utils/cesium/shapeTools' |
| | | import { cartesian3Convert } from '@/utils/cesium/mapUtil' |
| | | import { buildEllipsePositions } from './shapeTools/shapeUtils' |
| | | import * as Cesium from 'cesium' |
| | | import { fwPoliceStationListApi } from '@/views/areaManage/precinctInfo/precinctInfoApi' |
| | | import { fwDeviceListApi } from '@/views/basicManage/deviceStock/fwDevice' |
| | |
| | | <script setup> |
| | | import { Close } from '@element-plus/icons-vue' |
| | | |
| | | import { computed, inject, nextTick, onMounted, ref, watch } from 'vue' |
| | | import { computed, inject, nextTick, ref, watch } from 'vue' |
| | | import { ElMessage } from 'element-plus' |
| | | import { fwDefenseSceneDetailApi, fwDefenseSceneSubmitApi } from './sceneConfigApi' |
| | | import { fieldRules, geomAnalysis, getDictLabel } from '@ztzf/utils' |
| | | import { fieldRules, getDictLabel } from '@ztzf/utils' |
| | | import CommonCesiumMap from '@/components/map-container/common-cesium-map.vue' |
| | | import * as Cesium from 'cesium' |
| | | import { fwAreaDivideDetailApi, fwAreaDivideListApi } from '../partition/partitionApi' |
| | | import { DrawPolygon } from '@/utils/cesium/DrawPolygon' |
| | | import commandPost from '@/assets/images/dataCockpit/legend/command-post.png' |
| | | import { buildEllipsePositions } from '@/utils/cesium/shapeTools' |
| | | import { saveOperationLog } from '@ztzf/apis' |
| | | import { useRoute } from 'vue-router' |
| | | |
| | |
| | | const mapRef = ref(null) |
| | | const route = useRoute() |
| | | let viewer |
| | | let redPointEntity |
| | | let leftClickBound = false |
| | | let areaDisplaySource |
| | | const areaTypeStyleMap = { |
| | | '1': { |
| | | fill: Cesium.Color.fromBytes(25, 178, 230, 128), |
| | | outline: Cesium.Color.fromBytes(0, 251, 255, 255), |
| | | }, |
| | | '2': { |
| | | fill: Cesium.Color.fromBytes(255, 235, 59, 128), |
| | | outline: Cesium.Color.fromBytes(255, 235, 59, 255), |
| | | }, |
| | | '3': { |
| | | fill: Cesium.Color.fromBytes(247, 20, 20, 128), |
| | | outline: Cesium.Color.fromBytes(255, 0, 0, 255), |
| | | }, |
| | | } |
| | | |
| | | const rules = { |
| | | sceneName: fieldRules(true, 50), |
| | |
| | | |
| | | // 关联区域变更 |
| | | async function handleAreaSelectionChange(rows) { |
| | | const selectedRows = await ensureAreaGeom(rows) |
| | | const selectedRows = await ensureAreaExtList(rows) |
| | | selectedAreaRows.value = selectedRows |
| | | const ids = selectedRows.map(item => item.id) |
| | | formData.value.areaDivideIds = ids.join(',') |
| | |
| | | } |
| | | |
| | | // 渲染面 |
| | | function renderingSurface() { |
| | | if (!geometricSource) { |
| | | initMap() |
| | | function ensureAreaDisplaySource() { |
| | | if (!viewer) return null |
| | | if (!areaDisplaySource) { |
| | | areaDisplaySource = new Cesium.CustomDataSource('scene-area-display') |
| | | viewer.dataSources.add(areaDisplaySource) |
| | | } |
| | | if (!geometricSource) return |
| | | geometricSource && geometricSource.entities.removeAll() |
| | | selectedAreaRows.value.forEach(item => { |
| | | if (item.geom) { |
| | | const pointList = geomAnalysis(item.geom) |
| | | const result = pointList.map(item => [item.longitude, item.latitude]).flat() |
| | | geometricSource.entities?.add({ |
| | | customType: 'control_group', |
| | | position: Cesium.Cartesian3.fromDegrees(result[0], result[1]), |
| | | return areaDisplaySource |
| | | } |
| | | |
| | | function clearAreaDisplay() { |
| | | if (!areaDisplaySource) return |
| | | areaDisplaySource.entities.removeAll() |
| | | } |
| | | |
| | | function normalizeShapePoint(point) { |
| | | if (!point) return null |
| | | const lng = point?.lng ?? point?.longitude |
| | | const lat = point?.lat ?? point?.latitude |
| | | const height = Number.isFinite(Number(point?.height)) ? Number(point.height) : 0 |
| | | if (!Number.isFinite(Number(lng)) || !Number.isFinite(Number(lat))) return null |
| | | return { lng: Number(lng), lat: Number(lat), height } |
| | | } |
| | | |
| | | function buildShapePositions(points = []) { |
| | | const normalized = points.map(normalizeShapePoint).filter(Boolean) |
| | | return normalized.map(point => Cesium.Cartesian3.fromDegrees(point.lng, point.lat, point.height)) |
| | | } |
| | | |
| | | function getShapeDisplayPoints(shape) { |
| | | if (Array.isArray(shape?.displayPoints) && shape.displayPoints.length) { |
| | | return shape.displayPoints |
| | | } |
| | | return shape?.points || [] |
| | | } |
| | | |
| | | function getAreaTypeStyle(areaType) { |
| | | return areaTypeStyleMap?.[String(areaType)] || { |
| | | fill: Cesium.Color.fromBytes(45, 140, 240, 99), |
| | | outline: Cesium.Color.fromBytes(45, 140, 240, 255), |
| | | } |
| | | } |
| | | |
| | | function parseGeomJson(geomJson) { |
| | | if (!geomJson) return null |
| | | if (typeof geomJson === 'object') return geomJson |
| | | if (typeof geomJson !== 'string') return null |
| | | const trimmed = geomJson.trim() |
| | | if (!trimmed) return null |
| | | try { |
| | | return JSON.parse(trimmed) |
| | | } catch (error) { |
| | | return null |
| | | } |
| | | } |
| | | |
| | | function resolveAreaShapes(area) { |
| | | const extList = Array.isArray(area?.fwAreaDivideExtList) ? area.fwAreaDivideExtList : [] |
| | | if (!extList.length) return [] |
| | | return extList |
| | | .map((item, index) => { |
| | | const isShapePayload = item?.drawType || item?.points |
| | | if (isShapePayload) { |
| | | return { |
| | | id: item?.id || `shape_${Date.now()}_${index}_${Math.random().toString(16).slice(2, 6)}`, |
| | | drawType: item?.drawType ?? 'polygon', |
| | | areaType: item?.areaType ?? item?.areaTypeKey ?? '', |
| | | points: Array.isArray(item?.points) ? item.points : [], |
| | | displayPoints: Array.isArray(item?.displayPoints) ? item.displayPoints : null, |
| | | meta: item?.meta ?? null, |
| | | } |
| | | } |
| | | const parsed = parseGeomJson(item?.geomJson) |
| | | if (!parsed) return null |
| | | return { |
| | | id: parsed?.id || `shape_${Date.now()}_${index}_${Math.random().toString(16).slice(2, 6)}`, |
| | | drawType: parsed?.drawType ?? 'polygon', |
| | | areaType: item?.areaTypeKey ?? parsed?.areaType ?? '', |
| | | points: Array.isArray(parsed?.points) ? parsed.points : [], |
| | | displayPoints: Array.isArray(parsed?.displayPoints) ? parsed.displayPoints : null, |
| | | meta: parsed?.meta ?? null, |
| | | } |
| | | }) |
| | | .filter(Boolean) |
| | | } |
| | | |
| | | function renderSelectedAreas() { |
| | | if (!visible.value) { |
| | | clearAreaDisplay() |
| | | return |
| | | } |
| | | if (!viewer) initMap() |
| | | const dataSource = ensureAreaDisplaySource() |
| | | if (!dataSource) return |
| | | dataSource.entities.removeAll() |
| | | selectedAreaRows.value.forEach(area => { |
| | | const shapes = resolveAreaShapes(area) |
| | | shapes.forEach(shape => { |
| | | if (shape.drawType === 'buffer' && shape.meta?.bufferRadii?.length && shape.meta?.center) { |
| | | const center = shape.meta.center |
| | | const centerCartesian = Cesium.Cartesian3.fromDegrees(center.lng, center.lat, center.height || 0) |
| | | const radii = shape.meta.bufferRadii |
| | | .map(radius => Number(radius)) |
| | | .filter(radius => Number.isFinite(radius) && radius > 0) |
| | | const styles = [ |
| | | { |
| | | fill: Cesium.Color.fromBytes(247, 20, 20, 128), |
| | | outline: Cesium.Color.fromBytes(255, 0, 0, 255), |
| | | }, |
| | | { |
| | | fill: Cesium.Color.fromBytes(255, 235, 59, 128), |
| | | outline: Cesium.Color.fromBytes(255, 235, 59, 255), |
| | | }, |
| | | { |
| | | fill: Cesium.Color.fromBytes(25, 178, 230, 128), |
| | | outline: Cesium.Color.fromBytes(0, 251, 255, 255), |
| | | }, |
| | | ] |
| | | radii.forEach((radius, index) => { |
| | | const style = styles[index] || styles[styles.length - 1] |
| | | dataSource.entities.add({ |
| | | name: 'scene-area-display', |
| | | customData: { drawType: shape.drawType, level: index + 1 }, |
| | | position: centerCartesian, |
| | | ellipse: { |
| | | semiMajorAxis: radius, |
| | | semiMinorAxis: radius, |
| | | material: style.fill, |
| | | outline: false, |
| | | heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, |
| | | }, |
| | | }) |
| | | const positions = buildEllipsePositions(centerCartesian, radius, radius) |
| | | dataSource.entities.add({ |
| | | name: 'scene-area-display', |
| | | customData: { drawType: shape.drawType, level: index + 1, outline: true }, |
| | | polyline: { |
| | | positions: positions.length ? [...positions, positions[0]] : positions, |
| | | clampToGround: true, |
| | | width: 2, |
| | | material: style.outline, |
| | | }, |
| | | }) |
| | | }) |
| | | return |
| | | } |
| | | const positions = buildShapePositions(getShapeDisplayPoints(shape)) |
| | | if (positions.length < 3) return |
| | | const style = getAreaTypeStyle(shape.areaType) |
| | | dataSource.entities.add({ |
| | | name: 'scene-area-display', |
| | | customData: { drawType: shape.drawType }, |
| | | polygon: { |
| | | hierarchy: new Cesium.PolygonHierarchy(positions), |
| | | material: style.fill, |
| | | outline: false, |
| | | heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, |
| | | }, |
| | | polyline: { |
| | | positions: Cesium.Cartesian3.fromDegreesArray(result), |
| | | positions: positions.length ? [...positions, positions[0]] : positions, |
| | | clampToGround: true, |
| | | width: 3, |
| | | material: Cesium.Color.RED, |
| | | width: 2, |
| | | material: style.outline, |
| | | }, |
| | | }) |
| | | } |
| | | }) |
| | | }) |
| | | } |
| | | |
| | | watch(() => selectedAreaRows.value, renderingSurface) |
| | | watch(() => selectedAreaRows.value, renderSelectedAreas) |
| | | watch( |
| | | () => visible.value, |
| | | val => { |
| | | if (!val) clearAreaDisplay() |
| | | } |
| | | ) |
| | | |
| | | async function ensureAreaGeom(rows) { |
| | | const missingRows = rows.filter(row => row?.id && !row.geom) |
| | | async function ensureAreaExtList(rows) { |
| | | const missingRows = rows.filter(row => row?.id && !Array.isArray(row?.fwAreaDivideExtList)) |
| | | if (!missingRows.length) return rows |
| | | const detailList = await Promise.all( |
| | | missingRows.map(row => |
| | |
| | | } |
| | | |
| | | // 同步关联区域 |
| | | function syncAreaSelection() { |
| | | async function syncAreaSelection() { |
| | | if (!areaTableRef.value) return |
| | | areaTableRef.value.clearSelection() |
| | | const rows = [] |
| | |
| | | rows.push(row) |
| | | } |
| | | }) |
| | | selectedAreaRows.value = rows |
| | | if (!rows.length) return |
| | | formData.value.areaCount = rows.length |
| | | const ensuredRows = await ensureAreaExtList(rows) |
| | | selectedAreaRows.value = ensuredRows |
| | | if (!ensuredRows.length) return |
| | | formData.value.areaCount = ensuredRows.length |
| | | } |
| | | |
| | | let geometricSource |
| | | // 初始化地图实例 |
| | | function initMap() { |
| | | if (viewer) return |
| | | const map = mapRef.value?.getMap() |
| | | if (!map?.viewer) return |
| | | viewer = map.viewer |
| | | if (!geometricSource) { |
| | | geometricSource = new Cesium.CustomDataSource('geometricSource') |
| | | viewer.dataSources.add(geometricSource) |
| | | } |
| | | } |
| | | |
| | | // 打开弹框 |
| | | async function open({ mode, row } = {}) { |
| | | dialogMode.value = mode || 'add' |
| | | formData.value = dialogMode.value === 'add' ? initForm() : row |
| | | selectedAreaRows.value = [] |
| | | redPointEntity = null |
| | | await nextTick() |
| | | initMap() |
| | | await getAreaList() |
| | |
| | | await loadDetail() |
| | | } |
| | | await nextTick() |
| | | syncAreaSelection() |
| | | await syncAreaSelection() |
| | | } |
| | | defineExpose({ |
| | | open, |