-- =============================================================================
-- 闲管家 ERP：erp_open_config / erp_goofish_order 一键升级脚本
-- =============================================================================
-- 用法：
--   1. 先备份数据库；连接目标库后执行（或在文件开头加 USE your_database;）
--   2. 可重复执行：已存在的列/索引会自动跳过
--   3. ADD COLUMN 一律不指定 AFTER，避免旧表缺中间列时升级失败（新列落在表尾，不影响业务）
-- 环境：MySQL 5.7+ / 8.x（MariaDB 未逐项验证）
-- =============================================================================

SET @schema := DATABASE();

-- ----------------------------------------------------------------------------- 
-- 1) 表不存在时创建完整结构（与 erp_goofish_init.sql 一致）
-- ----------------------------------------------------------------------------- 
CREATE TABLE IF NOT EXISTS erp_open_config (
  id              bigint(20)   NOT NULL AUTO_INCREMENT COMMENT '主键',
  app_key         varchar(64)  NOT NULL COMMENT '开放平台 AppKey(appid)',
  app_secret      varchar(128) NOT NULL COMMENT '开放平台 AppSecret',
  xy_user_name    varchar(128)          DEFAULT NULL COMMENT '默认闲鱼会员名（展示）',
  express_code    varchar(64)           DEFAULT NULL COMMENT '发货用快递公司编码（日日顺物流在官方列表中为 rrs）',
  express_name    varchar(64)           DEFAULT NULL COMMENT '快递公司名称（展示）',
  status          char(1)      NOT NULL DEFAULT '0' COMMENT '0正常 1停用',
  order_num       int(11)      NOT NULL DEFAULT 0 COMMENT '排序（小优先）',
  create_by       varchar(64)           DEFAULT '',
  create_time     datetime              DEFAULT NULL,
  update_by       varchar(64)           DEFAULT '',
  update_time     datetime              DEFAULT NULL,
  remark          varchar(500)          DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (id),
  UNIQUE KEY uk_app_key (app_key)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='闲管家开放平台应用配置';

CREATE TABLE IF NOT EXISTS erp_goofish_order (
  id               bigint(20)   NOT NULL AUTO_INCREMENT COMMENT '主键',
  app_key          varchar(64)  NOT NULL COMMENT 'AppKey',
  seller_id        bigint(20)            DEFAULT NULL COMMENT '商家ID',
  user_name        varchar(128)          DEFAULT NULL COMMENT '闲鱼会员名',
  order_no         varchar(64)  NOT NULL COMMENT '闲鱼订单号',
  order_type       int(11)               DEFAULT NULL COMMENT '订单类型',
  order_status     int(11)               DEFAULT NULL COMMENT '订单状态(推送/列表)',
  refund_status    int(11)               DEFAULT NULL COMMENT '退款状态',
  modify_time      bigint(20)            DEFAULT NULL COMMENT '订单更新时间(秒)',
  product_id       bigint(20)            DEFAULT NULL COMMENT '管家商品ID',
  item_id          bigint(20)            DEFAULT NULL COMMENT '闲鱼商品ID',
  goods_title      varchar(512)          DEFAULT NULL COMMENT '商品标题(详情 goods.title)',
  goods_image_url  varchar(1024)         DEFAULT NULL COMMENT '商品主图 URL(goods.images 首图)',
  buyer_nick       varchar(256)          DEFAULT NULL COMMENT '买家昵称(详情 buyer_nick)',
  pay_amount       bigint(20)            DEFAULT NULL COMMENT '实付金额(分) pay_amount',
  detail_waybill_no varchar(128)         DEFAULT NULL COMMENT '闲管家详情回传运单号 waybill_no',
  detail_express_code varchar(64)       DEFAULT NULL COMMENT '详情快递编码 express_code',
  detail_express_name varchar(128)      DEFAULT NULL COMMENT '详情快递名称 express_name',
  receiver_name    varchar(128)          DEFAULT NULL COMMENT '收货人(详情有则落库)',
  receiver_mobile  varchar(64)           DEFAULT NULL COMMENT '收货手机',
  receiver_address varchar(1000)         DEFAULT NULL COMMENT '收货详细地址(address)',
  receiver_region  varchar(256)          DEFAULT NULL COMMENT '省市区街道等拼接展示',
  recv_prov_name   varchar(64)           DEFAULT NULL COMMENT 'prov_name',
  recv_city_name   varchar(64)           DEFAULT NULL COMMENT 'city_name',
  recv_area_name   varchar(64)           DEFAULT NULL COMMENT 'area_name',
  recv_town_name   varchar(128)          DEFAULT NULL COMMENT 'town_name',
  detail_json      longtext COMMENT '订单详情接口全量 JSON',
  last_notify_json longtext COMMENT '最近一次推送原文 JSON',
  jd_order_id      bigint(20)            DEFAULT NULL COMMENT '关联 jd_order.id（第三方单号=闲鱼单号）',
  local_waybill_no varchar(128)          DEFAULT NULL COMMENT '本地物流扫描得到的运单号',
  ship_status      tinyint(4)   NOT NULL DEFAULT '0' COMMENT '0未发货 1已调用发货成功 2发货失败',
  ship_error       varchar(500)          DEFAULT NULL COMMENT '发货失败原因',
  ship_time        datetime              DEFAULT NULL COMMENT '发货调用成功时间',
  ship_express_code varchar(64)          DEFAULT NULL COMMENT '实际发货使用的快递编码',
  create_time      datetime              DEFAULT NULL,
  update_time      datetime              DEFAULT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY uk_app_order (app_key, order_no),
  KEY idx_jd_order (jd_order_id),
  KEY idx_order_status (order_status),
  KEY idx_modify_time (modify_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='闲管家 ERP 订单（全量跟踪）';

-- ----------------------------------------------------------------------------- 
-- 2) 存储过程：列不存在则 ADD
-- ----------------------------------------------------------------------------- 
DROP PROCEDURE IF EXISTS jarvis_erp_goofish_add_column;
DROP PROCEDURE IF EXISTS jarvis_erp_goofish_add_index;

DELIMITER $$

CREATE PROCEDURE jarvis_erp_goofish_add_column(
  IN p_table  VARCHAR(64),
  IN p_column VARCHAR(64),
  IN p_ddl    TEXT
)
BEGIN
  DECLARE col_exists INT DEFAULT 0;
  SELECT COUNT(*) INTO col_exists
    FROM information_schema.COLUMNS
   WHERE TABLE_SCHEMA = @schema
     AND TABLE_NAME = p_table
     AND COLUMN_NAME = p_column;
  IF col_exists = 0 THEN
    SET @stmt := CONCAT('ALTER TABLE `', p_table, '` ADD COLUMN `', p_column, '` ', p_ddl);
    PREPARE ps FROM @stmt;
    EXECUTE ps;
    DEALLOCATE PREPARE ps;
  END IF;
END$$

CREATE PROCEDURE jarvis_erp_goofish_add_index(
  IN p_table   VARCHAR(64),
  IN p_index   VARCHAR(64),
  IN p_columns VARCHAR(200)
)
BEGIN
  DECLARE idx_exists INT DEFAULT 0;
  SELECT COUNT(*) INTO idx_exists
    FROM information_schema.statistics
   WHERE TABLE_SCHEMA = @schema
     AND TABLE_NAME = p_table
     AND INDEX_NAME = p_index;
  IF idx_exists = 0 THEN
    SET @stmt := CONCAT('ALTER TABLE `', p_table, '` ADD INDEX `', p_index, '` (', p_columns, ')');
    PREPARE ps FROM @stmt;
    EXECUTE ps;
    DEALLOCATE PREPARE ps;
  END IF;
END$$

DELIMITER ;

-- ----------------------------------------------------------------------------- 
-- 3) erp_goofish_order：补齐缺列（与当前 Java 实体 / erp_goofish_init.sql 一致）
-- ----------------------------------------------------------------------------- 
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'seller_id', 'bigint(20) NULL COMMENT ''商家ID''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'user_name', 'varchar(128) NULL COMMENT ''闲鱼会员名''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'order_type', 'int(11) NULL COMMENT ''订单类型''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'order_status', 'int(11) NULL COMMENT ''订单状态(推送/列表)''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'refund_status', 'int(11) NULL COMMENT ''退款状态''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'modify_time', 'bigint(20) NULL COMMENT ''订单更新时间(秒)''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'product_id', 'bigint(20) NULL COMMENT ''管家商品ID''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'item_id', 'bigint(20) NULL COMMENT ''闲鱼商品ID''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'goods_title', 'varchar(512) NULL COMMENT ''商品标题(详情 goods.title)''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'goods_image_url', 'varchar(1024) NULL COMMENT ''商品主图 URL(goods.images 首图)''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'buyer_nick', 'varchar(256) NULL COMMENT ''买家昵称(详情 buyer_nick)''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'pay_amount', 'bigint(20) NULL COMMENT ''实付金额(分) pay_amount''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'detail_waybill_no', 'varchar(128) NULL COMMENT ''闲管家详情回传运单号 waybill_no''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'detail_express_code', 'varchar(64) NULL COMMENT ''详情快递编码 express_code''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'detail_express_name', 'varchar(128) NULL COMMENT ''详情快递名称 express_name''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'receiver_name', 'varchar(128) NULL COMMENT ''收货人(详情有则落库)''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'receiver_mobile', 'varchar(64) NULL COMMENT ''收货手机''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'receiver_address', 'varchar(1000) NULL COMMENT ''收货详细地址(address)''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'receiver_region', 'varchar(256) NULL COMMENT ''省市区街道等拼接展示''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'recv_prov_name', 'varchar(64) NULL COMMENT ''prov_name''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'recv_city_name', 'varchar(64) NULL COMMENT ''city_name''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'recv_area_name', 'varchar(64) NULL COMMENT ''area_name''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'recv_town_name', 'varchar(128) NULL COMMENT ''town_name''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'detail_json', 'longtext NULL COMMENT ''订单详情接口全量 JSON''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'last_notify_json', 'longtext NULL COMMENT ''最近一次推送原文 JSON''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'jd_order_id', 'bigint(20) NULL COMMENT ''关联 jd_order.id（第三方单号=闲鱼单号）''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'local_waybill_no', 'varchar(128) NULL COMMENT ''本地物流扫描得到的运单号''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'ship_status', 'tinyint(4) NOT NULL DEFAULT 0 COMMENT ''0未发货 1已调用发货成功 2发货失败''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'ship_error', 'varchar(500) NULL COMMENT ''发货失败原因''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'ship_time', 'datetime NULL COMMENT ''发货调用成功时间''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'ship_express_code', 'varchar(64) NULL COMMENT ''实际发货使用的快递编码''');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'create_time', 'datetime NULL');
CALL jarvis_erp_goofish_add_column('erp_goofish_order', 'update_time', 'datetime NULL');

-- ----------------------------------------------------------------------------- 
-- 4) 索引（手工建表可能缺）
-- ----------------------------------------------------------------------------- 
CALL jarvis_erp_goofish_add_index('erp_goofish_order', 'idx_jd_order', '`jd_order_id`');
CALL jarvis_erp_goofish_add_index('erp_goofish_order', 'idx_order_status', '`order_status`');
CALL jarvis_erp_goofish_add_index('erp_goofish_order', 'idx_modify_time', '`modify_time`');

-- ----------------------------------------------------------------------------- 
-- 5) 唯一键 uk_app_order
--     若已存在同名约束则跳过；若 (app_key,order_no) 有重复行会报错，需先清洗数据。
--     若已通过其它名称建了 (app_key,order_no) 唯一索引，请勿重复执行本节（可能报 Duplicate key）。
-- ----------------------------------------------------------------------------- 
SET @uk := (
  SELECT COUNT(*) FROM information_schema.table_constraints
   WHERE table_schema = @schema AND table_name = 'erp_goofish_order'
     AND constraint_name = 'uk_app_order' AND constraint_type = 'UNIQUE'
);
SET @sql_uk := IF(@uk = 0,
  'ALTER TABLE erp_goofish_order ADD UNIQUE KEY uk_app_order (app_key, order_no)',
  'SELECT ''uk_app_order 已存在，跳过'' AS note');
PREPARE puk FROM @sql_uk;
EXECUTE puk;
DEALLOCATE PREPARE puk;

-- ----------------------------------------------------------------------------- 
-- 6) 清理存储过程
-- ----------------------------------------------------------------------------- 
DROP PROCEDURE IF EXISTS jarvis_erp_goofish_add_column;
DROP PROCEDURE IF EXISTS jarvis_erp_goofish_add_index;

SELECT 'erp_goofish_upgrade.sql 执行结束' AS message;
