# 电子围栏功能实现说明 ## 功能概述 在门店管理页面(`manager.html`)中直接集成了电子围栏功能,支持创建、编辑、删除多个自定义多边形围栏,数据暂存在JavaScript变量中,页面保存时通过现有接口将围栏数据提交到后端进行数据库存储。 ## 实现的功能特性 ### 1. 围栏管理 - ✅ 添加新围栏:支持创建多个自定义围栏 - ✅ 编辑围栏:修改围栏名称和形状 - ✅ 删除围栏:移除不需要的围栏 - ✅ 启用/禁用围栏:切换围栏状态 ### 2. 地图绘制 - ✅ 腾讯地图集成:使用腾讯地图API进行地图显示 - ✅ 多边形绘制:支持在地图上绘制自定义多边形围栏 - ✅ 围栏编辑:支持对已绘制的围栏进行编辑 - ✅ 围栏显示:在地图上可视化显示所有围栏 ### 3. 数据处理 - ✅ 坐标存储:将围栏坐标数据以JSON格式存储 - ✅ 表单集成:围栏数据与门店信息一起提交 - ✅ 临时存储:围栏数据在页面中临时存储,保存时统一提交 ## 技术实现细节 ### 前端实现 #### Vue数据结构 ```javascript data() { return { // 电子围栏相关数据 deliveryFences: [], // 电子围栏列表 currentEditingFence: null, // 当前编辑的围栏索引 editingFenceData: { // 当前编辑的围栏数据 fence_name: '', fence_data: '', fence_type: 1, // 1=多边形,2=圆形 is_active: 1, tempId: null }, isDrawingMode: false, // 是否处于绘制模式 fenceMap: null, // 腾讯地图实例 currentPolygon: null, // 当前绘制的多边形 drawingManager: null, // 绘制管理器 tempFenceId: 1, // 临时ID计数器 mapKey: '', // 腾讯地图API Key } } ``` #### 核心方法 1. **围栏管理方法** - `addNewFence()`: 添加新围栏 - `editFence(index)`: 编辑指定围栏 - `deleteFence(index)`: 删除围栏 - `toggleFenceStatus(index)`: 切换围栏状态 - `saveCurrentFence()`: 保存当前编辑的围栏 - `cancelEditFence()`: 取消编辑 2. **地图相关方法** - `initFenceMap()`: 初始化围栏地图 - `getTencentMapKey()`: 获取腾讯地图API密钥 - `loadTencentMapScript()`: 动态加载腾讯地图脚本 - `initTencentFenceMap()`: 初始化腾讯地图实例 3. **绘制相关方法** - `toggleDrawingMode()`: 切换绘制模式 - `startDrawing()`: 开始绘制围栏 - `stopDrawing()`: 停止绘制 - `clearCurrentDrawing()`: 清除当前绘制 - `displayFenceOnMap(fenceData)`: 在地图上显示围栏 #### UI组件 围栏功能UI直接集成在门店管理表单中,包含: - 围栏列表显示区域 - 围栏编辑表单 - 腾讯地图绘制区域 - 绘制工具按钮 ### 数据库表结构 参考 `fence_table.sql` 文件中的表结构: ```sql CREATE TABLE `ls_store_delivery_fence` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `store_id` int(11) NOT NULL COMMENT '门店ID', `merchant_id` int(11) NOT NULL COMMENT '商户ID', `fence_name` varchar(100) NOT NULL DEFAULT '' COMMENT '围栏名称', `fence_data` longtext NOT NULL COMMENT '围栏坐标数据JSON格式', `fence_type` tinyint(1) NOT NULL DEFAULT 1 COMMENT '围栏类型:1=多边形,2=圆形', `is_active` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否启用:0=禁用,1=启用', `create_time` int(11) NOT NULL DEFAULT 0 COMMENT '创建时间', `update_time` int(11) NOT NULL DEFAULT 0 COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_store_id` (`store_id`), KEY `idx_merchant_id` (`merchant_id`), KEY `idx_is_active` (`is_active`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='门店配送电子围栏表'; ``` ### 数据提交格式 在表单提交时,围栏数据以以下格式添加到提交数据中: ```javascript data.delivery_fences = this.deliveryFences.map(fence => ({ fence_name: fence.fence_name, fence_data: fence.fence_data, // JSON格式的坐标数据 fence_type: fence.fence_type, is_active: fence.is_active })); ``` ### 坐标数据格式 围栏坐标数据以JSON格式存储,示例: ```json [ {"lat": 39.915, "lng": 116.404}, {"lat": 39.916, "lng": 116.405}, {"lat": 39.917, "lng": 116.406}, {"lat": 39.915, "lng": 116.404} ] ``` ## 使用说明 ### 1. 添加围栏 1. 点击"添加围栏"按钮 2. 输入围栏名称 3. 在地图上点击"开始绘制"按钮 4. 在地图上点击多个点绘制多边形 5. 绘制完成后点击"保存围栏" ### 2. 编辑围栏 1. 在围栏列表中点击"编辑"按钮 2. 修改围栏名称或在地图上重新绘制 3. 点击"保存围栏"确认修改 ### 3. 删除围栏 1. 在围栏列表中点击"删除"按钮 2. 确认删除操作 ### 4. 启用/禁用围栏 1. 在围栏列表中点击状态开关 2. 围栏状态会立即更新 ### 5. 保存到数据库 1. 完成所有围栏配置后 2. 点击页面底部的"立即提交"按钮 3. 围栏数据会与门店信息一起保存到数据库 ## 注意事项 1. **地图API密钥**:系统会自动从后端获取腾讯地图API密钥 2. **数据暂存**:围栏数据在页面中临时存储,只有点击"立即提交"才会保存到数据库 3. **坐标精度**:围栏坐标数据保留足够精度以确保准确性 4. **浏览器兼容性**:建议使用现代浏览器以获得最佳体验 5. **网络连接**:需要稳定的网络连接以加载地图和提交数据 ## 后端接口说明 电子围栏数据通过现有的门店设置接口 `storeSet` 进行提交,后端需要处理 `delivery_fences` 字段中的围栏数据,并将其存储到 `ls_store_delivery_fence` 表中。 提交的数据格式: - `delivery_fences`: 围栏数据数组 - 每个围栏包含:`fence_name`, `fence_data`, `fence_type`, `is_active` 字段