-- =============================================================================
-- 应用图标库表（app_icon）
--
-- 设计目标：
--   1. 全局图标库：同一应用包名（package_name）的所有设备共用图标，按包名维度维护
--   2. 历史版本：同一包名可保存多个历史图标版本（status 区分当前生效/历史），
--      支持从历史版本中选取并锁定，规避三方 App 活动期换图标带广告等风险
--   3. 锁定机制：locked=1 的版本不可被设备端/管理端上传覆盖，需先解锁
--   4. 内容指纹：icon_md5 用于内容去重（同一图标不同包名复用同一文件）
--
-- 约定：
--   - 同一 package_name 下 status=1（当前生效）的记录有且仅有一条
--   - 历史版本（status=0）仅用于展示与选取锁定，不物理删除
--   - 图标文件按 {md5}.{ext} 内容寻址存储，访问路径由后端拼接为 /static/app_icon/{md5}.{ext}
--     （该前缀与 WebMvcConfig 注册的静态资源映射一致；内容变更必然导致文件名变更，故可长缓存）
--
-- 部署规范：不直连库，由 DBA 执行；先 DROP 再 CREATE 确保结构与实体完全一致
--           （DROP 会清空历史图标数据，可由设备端重新上报补齐）。
-- =============================================================================

DROP TABLE IF EXISTS `app_icon`;

CREATE TABLE `app_icon`
(
    `id`           BIGINT       NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    `package_name` VARCHAR(255) NOT NULL COMMENT '应用包名（全局唯一维度，同包名多版本共存）',
    `app_name`     VARCHAR(128) DEFAULT NULL COMMENT '应用名称（上报时的展示名，可为空；新版本上报时刷新）',
    `icon_url`     VARCHAR(500) NOT NULL COMMENT '图标访问地址（相对路径，如 /static/app_icon/{md5}.png）',
    `icon_md5`     VARCHAR(64)  DEFAULT NULL COMMENT '图标文件MD5（内容指纹，用于去重与换图标检测）',
    `version`      INT          NOT NULL DEFAULT 1 COMMENT '版本号（同包名内自增，从1开始）',
    `status`       TINYINT      NOT NULL DEFAULT 1 COMMENT '状态（1当前生效 0历史版本）',
    `locked`       TINYINT      NOT NULL DEFAULT 0 COMMENT '是否锁定（0未锁定 1已锁定，锁定后不可上传覆盖）',
    `source`       VARCHAR(20)  NOT NULL DEFAULT 'device' COMMENT '图标来源（device设备端上报 admin管理端上传）',
    `create_by`    BIGINT       DEFAULT NULL COMMENT '创建人ID',
    `create_time`  DATETIME     DEFAULT NULL COMMENT '创建时间',
    `update_by`    BIGINT       DEFAULT NULL COMMENT '更新人ID',
    `update_time`  DATETIME     DEFAULT NULL COMMENT '更新时间',
    `is_deleted`   TINYINT      NOT NULL DEFAULT 0 COMMENT '逻辑删除（0未删 1已删）',

    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_package_version` (`package_name`, `version`),
    KEY `idx_package_status` (`package_name`, `status`),
    KEY `idx_md5` (`icon_md5`),
    KEY `idx_is_deleted` (`is_deleted`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  COMMENT = '应用图标库（含历史版本）';
