# 扩展属性管理接口文档

## 概述

扩展属性管理接口用于管理动作点（库位）的扩展属性定义。通过这些接口，您可以创建、查询和删除扩展属性配置，为库位提供灵活的自定义字段支持。

## 接口列表

### 1. 创建扩展属性

**接口地址：** `POST /api/vwed-operate-point/extended-properties`

**功能说明：** 创建新的扩展属性定义

**重要提示：** 创建扩展属性后，会自动将该属性添加到所有现有的库位层中，每个库位层的config_json会自动更新，包含新的扩展属性配置。

**请求参数：**
```json
{
  "property_name": "温度",
  "property_type": "float",
  "is_required": false,
  "is_enabled": true,
  "description": "库位温度监控",
  "placeholder": "请输入温度值",
  "default_value": "25.0",
  "options": null,
  "validation_rules": {
    "min": -50,
    "max": 100
  },
  "category": "环境监控",
  "sort_order": 10,
  "display_width": 150,
  "display_format": "{{value}}°C"
}
```

**响应示例：**
```json
{
  "code": 200,
  "message": "扩展属性创建成功",
  "data": {
    "id": "1",
    "property_name": "温度",
    "message": "扩展属性创建成功，已应用到所有库位层"
  }
}
```

### 2. 获取扩展属性列表

**接口地址：** `GET /api/vwed-operate-point/extended-properties`

**功能说明：** 获取扩展属性列表，支持多种筛选条件

**请求参数：**
- `property_name` (可选): 属性名称，支持模糊搜索
- `property_type` (可选): 属性类型
- `category` (可选): 属性分类
- `is_enabled` (可选): 是否启用
- `page` (可选): 页码，默认1
- `page_size` (可选): 每页数量，默认20

**响应示例：**
```json
{
  "code": 200,
  "message": "查询成功",
  "data": {
    "total": 5,
    "page": 1,
    "page_size": 20,
    "total_pages": 1,
    "properties": [
      {
        "id": "1",
        "property_name": "温度",
        "property_type": "float",
        "is_required": false,
        "is_enabled": true,
        "description": "库位温度监控",
        "placeholder": "请输入温度值",
        "default_value": "25.0",
        "options": null,
        "validation_rules": {
          "min": -50,
          "max": 100
        },
        "category": "环境监控",
        "sort_order": 10,
        "display_width": 150,
        "display_format": "{{value}}°C",
        "created_at": "2024-12-20T10:00:00",
        "updated_at": "2024-12-20T10:00:00"
      }
    ]
  }
}
```

### 3. 删除扩展属性

**接口地址：** `DELETE /api/vwed-operate-point/extended-properties/{property_id}`

**功能说明：** 删除指定的扩展属性（软删除）

**重要提示：** 删除扩展属性后，会自动从所有现有的库位层中移除该属性，每个库位层的config_json会自动更新，清除已删除的扩展属性配置。此操作不可逆，请谨慎使用。

**请求参数：**
- `property_id` (路径参数): 属性ID

**响应示例：**
```json
{
  "code": 200,
  "message": "扩展属性删除成功",
  "data": {
    "property_id": "1",
    "property_name": "温度",
    "message": "扩展属性删除成功，已从所有库位层移除"
  }
}
```

### 4. 获取扩展属性类型列表

**接口地址：** `GET /api/vwed-operate-point/extended-properties/types`

**功能说明：** 获取系统支持的扩展属性类型列表

**响应示例：**
```json
{
  "code": 200,
  "message": "获取扩展属性类型成功",
  "data": {
    "types": [
      {
        "value": "string",
        "description": "字符串 - 适用于短文本输入"
      },
      {
        "value": "integer",
        "description": "整数 - 适用于整数值"
      },
      {
        "value": "float",
        "description": "浮点数 - 适用于小数值"
      },
      {
        "value": "boolean",
        "description": "布尔值 - 适用于是/否选择"
      },
      {
        "value": "date",
        "description": "日期 - 适用于日期选择"
      },
      {
        "value": "datetime",
        "description": "日期时间 - 适用于日期和时间选择"
      },
      {
        "value": "text",
        "description": "长文本 - 适用于多行文本输入"
      },
      {
        "value": "select",
        "description": "下拉选择 - 适用于单选择"
      },
      {
        "value": "multiselect",
        "description": "多选 - 适用于多选择"
      }
    ],
    "count": 9
  }
}
```

## 属性类型详细说明

### 1. string（字符串）
- 适用于短文本输入
- 支持长度限制验证
- 支持正则表达式验证

### 2. integer（整数）
- 适用于整数值
- 支持最小值/最大值验证
- 支持数值范围验证

### 3. float（浮点数）
- 适用于小数值
- 支持最小值/最大值验证
- 支持精度设置

### 4. boolean（布尔值）
- 适用于是/否选择
- 显示为复选框或开关

### 5. date（日期）
- 适用于日期选择
- 格式：YYYY-MM-DD
- 支持日期范围验证

### 6. datetime（日期时间）
- 适用于日期和时间选择
- 格式：YYYY-MM-DD HH:MM:SS
- 支持日期时间范围验证

### 7. text（长文本）
- 适用于多行文本输入
- 支持最大长度限制
- 显示为文本区域

### 8. select（下拉选择）
- 适用于单选择
- 需要配置选项列表
- 选项格式：`[{"label": "选项1", "value": "value1"}, ...]`

### 9. multiselect（多选）
- 适用于多选择
- 需要配置选项列表
- 选项格式：`[{"label": "选项1", "value": "value1"}, ...]`

## 验证规则配置

验证规则使用JSON格式配置，支持以下规则：

```json
{
  "min": 0,                    // 最小值（数字类型）
  "max": 100,                  // 最大值（数字类型）
  "minLength": 1,              // 最小长度（字符串类型）
  "maxLength": 255,            // 最大长度（字符串类型）
  "pattern": "^[a-zA-Z0-9]+$", // 正则表达式（字符串类型）
  "required": true,            // 是否必填
  "decimal": 2                 // 小数位数（浮点数类型）
}
```

## 选项配置示例

对于select和multiselect类型，选项配置示例：

```json
[
  {
    "label": "选项1",
    "value": "option1",
    "description": "选项1的描述"
  },
  {
    "label": "选项2",
    "value": "option2",
    "description": "选项2的描述"
  }
]
```

## 使用示例

### 创建温度监控属性

```bash
curl -X POST "http://localhost:8000/api/vwed-operate-point/extended-properties" \
  -H "Content-Type: application/json" \
  -d '{
    "property_name": "温度",
    "property_type": "float",
    "description": "库位温度监控",
    "validation_rules": {
      "min": -50,
      "max": 100,
      "decimal": 1
    },
    "category": "环境监控",
    "display_format": "{{value}}°C"
  }'
```

### 创建库位状态选择属性

```bash
curl -X POST "http://localhost:8000/api/vwed-operate-point/extended-properties" \
  -H "Content-Type: application/json" \
  -d '{
    "property_name": "维护状态",
    "property_type": "select",
    "is_required": true,
    "options": [
      {"label": "正常", "value": "normal"},
      {"label": "维护中", "value": "maintenance"},
      {"label": "故障", "value": "fault"}
    ],
    "category": "设备管理"
  }'
```

## 扩展属性在库位层中的存储

### config_json结构

每个库位层的扩展属性值存储在 `config_json` 字段中，结构如下：

```json
{
  "extended_fields": {
    "温度": {
      "value": "25.0",
      "type": "float",
      "is_required": false,
      "updated_at": "2024-12-20T10:00:00"
    },
    "维护状态": {
      "value": "normal",
      "type": "select",
      "is_required": true,
      "updated_at": "2024-12-20T10:00:00"
    }
  }
}
```

### 自动同步机制

1. **创建扩展属性时：** 自动为所有现有库位层添加该属性，使用默认值进行初始化
2. **删除扩展属性时：** 自动从所有库位层中移除该属性的配置和数据
3. **新建库位层时：** 自动同步所有已启用的扩展属性到新库位层
4. **地图推送时：** 推送地图数据创建新库位层时，自动为每个新层同步扩展属性

### 数据完整性保证

- 扩展属性定义与库位层数据保持同步
- 删除扩展属性会清理所有相关数据
- 支持批量操作，确保数据一致性

## 与地图推送的集成

### 地图推送时的自动同步

当通过地图推送接口 `POST /api/vwed-map-data/push` 创建新的地图数据时：

1. **自动检测扩展属性：** 系统会查询所有已启用的扩展属性
2. **同步到新库位层：** 为每个新创建的库位层自动添加扩展属性配置
3. **使用默认值：** 新库位层的扩展属性会使用定义时的默认值进行初始化
4. **错误处理：** 即使扩展属性同步失败，地图推送也能正常完成

### 推荐工作流程

1. **先配置扩展属性：** 在推送地图前，先创建所需的扩展属性定义
2. **推送地图数据：** 地图推送时会自动为新库位层同步扩展属性
3. **验证结果：** 通过库位列表接口查看扩展属性是否正确同步

### 示例场景

```bash
# 1. 创建温度监控属性
curl -X POST "http://localhost:8000/api/vwed-operate-point/extended-properties" \
  -H "Content-Type: application/json" \
  -d '{
    "property_name": "温度",
    "property_type": "float",
    "default_value": "25.0"
  }'

# 2. 推送地图数据
curl -X POST "http://localhost:8000/api/vwed-map-data/push" \
  -H "Content-Type: application/json" \
  -d '{
    "scene_id": "scene_001",
    "storage_areas": [...],
    "operate_points": [...]
  }'

# 3. 查看库位列表（新库位层会自动包含温度属性）
curl "http://localhost:8000/api/vwed-operate-point/list?include_extended_fields=true"
```

## 注意事项

1. **属性名称唯一性：** `property_name` 必须在系统中唯一
2. **软删除：** 删除操作是软删除，不会真正删除数据
3. **数据类型验证：** 创建时会验证数据类型和格式
4. **选项配置：** select和multiselect类型需要配置选项列表
5. **验证规则：** 验证规则必须符合JSON格式且类型匹配
6. **自动同步：** 扩展属性的创建和删除会自动影响所有库位层的配置
7. **地图推送集成：** 新推送的地图数据会自动包含已定义的扩展属性
8. **操作顺序：** 建议先创建扩展属性，再进行地图推送，以确保新库位层包含完整的属性配置
9. **性能考虑：** 扩展属性数量较多时，地图推送可能需要更多时间来同步属性

## 错误码说明

- `200`: 操作成功
- `400`: 请求参数错误
- `404`: 资源不存在
- `500`: 服务器内部错误

## 数据库迁移

在使用这些接口前，请确保已执行数据库迁移：

```bash
# 执行迁移
python scripts/run_migration.py
```

迁移将创建 `extended_properties` 表及相关索引。 