文件
mashangyoujiu/_ai_archive/docs/electronic_fence_implementation_guide.md

5.8 KiB

电子围栏功能实现说明

功能概述

在门店管理页面(manager.html)中直接集成了电子围栏功能,支持创建、编辑、删除多个自定义多边形围栏,数据暂存在JavaScript变量中,页面保存时通过现有接口将围栏数据提交到后端进行数据库存储。

实现的功能特性

1. 围栏管理

  • ✅ 添加新围栏:支持创建多个自定义围栏
  • ✅ 编辑围栏:修改围栏名称和形状
  • ✅ 删除围栏:移除不需要的围栏
  • ✅ 启用/禁用围栏:切换围栏状态

2. 地图绘制

  • ✅ 腾讯地图集成:使用腾讯地图API进行地图显示
  • ✅ 多边形绘制:支持在地图上绘制自定义多边形围栏
  • ✅ 围栏编辑:支持对已绘制的围栏进行编辑
  • ✅ 围栏显示:在地图上可视化显示所有围栏

3. 数据处理

  • ✅ 坐标存储:将围栏坐标数据以JSON格式存储
  • ✅ 表单集成:围栏数据与门店信息一起提交
  • ✅ 临时存储:围栏数据在页面中临时存储,保存时统一提交

技术实现细节

前端实现

Vue数据结构

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 文件中的表结构:

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='门店配送电子围栏表';

数据提交格式

在表单提交时,围栏数据以以下格式添加到提交数据中:

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格式存储,示例:

[
    {"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 字段