升鲜宝生鲜配送供应链管理系统 · 仓储式收银系统(多公司多门店 · POS+会员+钱包+权益+门店WMS+库存成本+离线同步)

-- 升鲜宝 · 仓储式收银系统(多公司多门店 · POS+会员+钱包+权益+门店WMS+库存成本+离线同步)
-- MySQL 8.x / InnoDB / utf8mb4
-- 说明:本文件为“主干可上线版本”,覆盖组织、商品、会员、钱包、权益、POS、门店WMS、库存台账、成本台账、离线同步、配送、订货、对账报表等域。
-- 执行建议:
-- CREATE DATABASE IF NOT EXISTS sxb_pos_wholesale DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

 

--   CREATE DATABASE IF NOT EXISTS sxb_pos_wholesale DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
--   USE sxb_pos_wholesale;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- =========================================================
-- 0. 组织域 org_*
-- =========================================================
DROP TABLE IF EXISTS org_company;
CREATE TABLE org_company (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_code VARCHAR(32) NOT NULL COMMENT '公司编码',
  company_name VARCHAR(100) NOT NULL COMMENT '公司名称',
  enabled TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用 0否1是',
  del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标记 0否1是',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  update_time BIGINT DEFAULT NULL COMMENT '更新时间(毫秒)',
  remark VARCHAR(200) DEFAULT NULL COMMENT '备注',
  UNIQUE KEY uk_company_code (company_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='老板/公司(多租户)';

DROP TABLE IF EXISTS org_shop;
CREATE TABLE org_shop (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  shop_code VARCHAR(32) NOT NULL COMMENT '门店编码',
  shop_name VARCHAR(100) NOT NULL COMMENT '门店名称',
  shop_type TINYINT NOT NULL DEFAULT 1 COMMENT '门店类型 1仓储式超市 2便利店…',
  address VARCHAR(200) DEFAULT NULL COMMENT '地址',
  contact_name VARCHAR(50) DEFAULT NULL COMMENT '联系人',
  contact_phone VARCHAR(30) DEFAULT NULL COMMENT '联系电话',
  longitude DECIMAL(18,10) DEFAULT NULL COMMENT '经度',
  latitude DECIMAL(18,10) DEFAULT NULL COMMENT '纬度',
  enabled TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用 0否1是',
  del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标记 0否1是',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  update_time BIGINT DEFAULT NULL COMMENT '更新时间(毫秒)',
  remark VARCHAR(200) DEFAULT NULL COMMENT '备注',
  UNIQUE KEY uk_company_shop_code (company_id, shop_code),
  KEY idx_company (company_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='门店';

DROP TABLE IF EXISTS org_shop_user;
CREATE TABLE org_shop_user (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  shop_id BIGINT NOT NULL COMMENT '门店ID',
  user_name VARCHAR(60) NOT NULL COMMENT '用户名',
  password_hash VARCHAR(120) NOT NULL COMMENT '密码hash',
  real_name VARCHAR(60) DEFAULT NULL COMMENT '真实姓名',
  phone VARCHAR(30) DEFAULT NULL COMMENT '手机号',
  user_type TINYINT NOT NULL DEFAULT 1 COMMENT '用户类型 1收银员 2店长 3仓管 9管理员',
  enabled TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用 0否1是',
  del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标记 0否1是',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  update_time BIGINT DEFAULT NULL COMMENT '更新时间(毫秒)',
  UNIQUE KEY uk_shop_username (shop_id, user_name),
  KEY idx_company_shop (company_id, shop_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='门店用户/员工';

DROP TABLE IF EXISTS org_role;
CREATE TABLE org_role (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  role_code VARCHAR(60) NOT NULL COMMENT '角色编码',
  role_name VARCHAR(60) NOT NULL COMMENT '角色名称',
  enabled TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用 0否1是',
  del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标记 0否1是',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  update_time BIGINT DEFAULT NULL COMMENT '更新时间(毫秒)',
  UNIQUE KEY uk_company_role_code (company_id, role_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色(公司维度)';

DROP TABLE IF EXISTS org_user_role;
CREATE TABLE org_user_role (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  user_id BIGINT NOT NULL COMMENT '用户ID',
  role_id BIGINT NOT NULL COMMENT '角色ID',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  UNIQUE KEY uk_user_role (company_id, user_id, role_id),
  KEY idx_user (user_id),
  KEY idx_role (role_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户角色关系';

DROP TABLE IF EXISTS org_shop_device;
CREATE TABLE org_shop_device (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  shop_id BIGINT NOT NULL COMMENT '门店ID',
  device_id VARCHAR(64) NOT NULL COMMENT '设备ID(POS-门店-序号)',
  device_type TINYINT NOT NULL DEFAULT 1 COMMENT '设备类型 1收银机 2PDA 3自助机',
  device_name VARCHAR(80) DEFAULT NULL COMMENT '设备名称',
  secret_key VARCHAR(120) DEFAULT NULL COMMENT '设备密钥(签名/鉴权)',
  enabled TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用 0否1是',
  del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标记 0否1是',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  update_time BIGINT DEFAULT NULL COMMENT '更新时间(毫秒)',
  UNIQUE KEY uk_shop_device (shop_id, device_id),
  KEY idx_company_shop (company_id, shop_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='门店设备(收银机/离线同步主体)';

-- =========================================================
-- 1. 门店商品中心 sh_*(离线商品关键)
-- =========================================================
DROP TABLE IF EXISTS sh_good_category;
CREATE TABLE sh_good_category (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  shop_id BIGINT NOT NULL COMMENT '门店ID',
  parent_id BIGINT NOT NULL DEFAULT 0 COMMENT '父级ID',
  category_code VARCHAR(50) DEFAULT NULL COMMENT '分类编码',
  category_name VARCHAR(80) NOT NULL COMMENT '分类名称',
  sort_no INT NOT NULL DEFAULT 0 COMMENT '排序',
  enabled TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用 0否1是',
  del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标记 0否1是',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  update_time BIGINT DEFAULT NULL COMMENT '更新时间(毫秒)',
  UNIQUE KEY uk_shop_parent_name (shop_id, parent_id, category_name),
  KEY idx_shop_parent (shop_id, parent_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='门店商品分类(树)';

DROP TABLE IF EXISTS sh_good_unit;
CREATE TABLE sh_good_unit (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  unit_name VARCHAR(30) NOT NULL COMMENT '单位名称',
  unit_code VARCHAR(30) DEFAULT NULL COMMENT '单位编码',
  enabled TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用 0否1是',
  del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标记 0否1是',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  update_time BIGINT DEFAULT NULL COMMENT '更新时间(毫秒)',
  UNIQUE KEY uk_company_unit_name (company_id, unit_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='单位(公司维度)';

DROP TABLE IF EXISTS sh_good;
CREATE TABLE sh_good (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  goods_code VARCHAR(50) NOT NULL COMMENT '商品编码',
  goods_name VARCHAR(120) NOT NULL COMMENT '商品名称',
  category_id BIGINT DEFAULT NULL COMMENT '分类ID',
  brand_name VARCHAR(60) DEFAULT NULL COMMENT '品牌',
  origin_place VARCHAR(80) DEFAULT NULL COMMENT '产地',
  goods_attr VARCHAR(60) DEFAULT NULL COMMENT '属性(生鲜/标品等)',
  shelf_life_days INT DEFAULT NULL COMMENT '保质期天数(可选)',
  source_type TINYINT NOT NULL DEFAULT 1 COMMENT '来源 1门店自建 2平台继承',
  source_goods_id BIGINT DEFAULT NULL COMMENT '平台商品ID(继承时)',
  enabled TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用 0否1是',
  del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标记 0否1是',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  update_time BIGINT DEFAULT NULL COMMENT '更新时间(毫秒)',
  remark VARCHAR(200) DEFAULT NULL COMMENT '备注',
  UNIQUE KEY uk_company_goods_code (company_id, goods_code),
  KEY idx_company_category (company_id, category_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='门店商品主档';

DROP TABLE IF EXISTS sh_good_sku;
CREATE TABLE sh_good_sku (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  goods_id BIGINT NOT NULL COMMENT '商品ID',
  sku_code VARCHAR(50) DEFAULT NULL COMMENT '规格编码',
  sku_name VARCHAR(80) NOT NULL COMMENT '规格名称',
  bar_code VARCHAR(64) DEFAULT NULL COMMENT '默认条码(可选)',
  enabled TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用 0否1是',
  del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标记 0否1是',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  update_time BIGINT DEFAULT NULL COMMENT '更新时间(毫秒)',
  UNIQUE KEY uk_goods_sku_name (goods_id, sku_name),
  KEY idx_goods (goods_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='门店商品规格(SKU)';

DROP TABLE IF EXISTS sh_good_sku_unit;
CREATE TABLE sh_good_sku_unit (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  shop_id BIGINT NOT NULL COMMENT '门店ID',
  goods_id BIGINT NOT NULL COMMENT '商品ID',
  sku_id BIGINT NOT NULL COMMENT '规格ID',
  unit_id BIGINT NOT NULL COMMENT '单位ID',
  sku_code VARCHAR(50) DEFAULT NULL COMMENT 'SKU编码',
  bar_code VARCHAR(64) DEFAULT NULL COMMENT '条码(离线收银查码关键)',
  unit_ratio DECIMAL(18,6) NOT NULL DEFAULT 1 COMMENT '换算比例',
  enabled TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用 0否1是',
  del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标记 0否1是',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  update_time BIGINT DEFAULT NULL COMMENT '更新时间(毫秒)',
  UNIQUE KEY uk_shop_sku_unit (shop_id, sku_id, unit_id),
  KEY idx_shop_barcode (shop_id, bar_code),
  KEY idx_shop_goods (shop_id, goods_id),
  KEY idx_shop_sku (shop_id, sku_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='门店SKU+单位';

DROP TABLE IF EXISTS sh_good_price;
CREATE TABLE sh_good_price (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  shop_id BIGINT NOT NULL COMMENT '门店ID',
  sku_unit_id BIGINT NOT NULL COMMENT 'SKU单位ID',
  sale_price DECIMAL(18,6) NOT NULL COMMENT '销售价',
  price_version VARCHAR(32) NOT NULL COMMENT '价格版本',
  protect_start BIGINT DEFAULT NULL COMMENT '保护期开始(毫秒)',
  protect_end BIGINT DEFAULT NULL COMMENT '保护期结束(毫秒)',
  enabled TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用 0否1是',
  del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标记 0否1是',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  update_time BIGINT DEFAULT NULL COMMENT '更新时间(毫秒)',
  UNIQUE KEY uk_shop_sku_unit_version (shop_id, sku_unit_id, price_version),
  KEY idx_shop_version (shop_id, price_version),
  KEY idx_shop_sku_unit (shop_id, sku_unit_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='门店售价(含版本/价格保护期)';

DROP TABLE IF EXISTS sh_good_media;
CREATE TABLE sh_good_media (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  goods_id BIGINT NOT NULL COMMENT '商品ID',
  media_type TINYINT NOT NULL DEFAULT 1 COMMENT '媒体类型 1图片 2视频 3文件',
  media_url VARCHAR(300) NOT NULL COMMENT '媒体地址',
  sort_no INT NOT NULL DEFAULT 0 COMMENT '排序',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  KEY idx_goods (goods_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品媒体';

-- =========================================================
-- 2. 会员域 mem_*
-- =========================================================
DROP TABLE IF EXISTS mem_member;
CREATE TABLE mem_member (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  member_no VARCHAR(32) NOT NULL COMMENT '会员号',
  phone VARCHAR(30) DEFAULT NULL COMMENT '手机号',
  nick_name VARCHAR(60) DEFAULT NULL COMMENT '昵称',
  avatar_url VARCHAR(200) DEFAULT NULL COMMENT '头像',
  enabled TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用 0否1是',
  del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标记 0否1是',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  update_time BIGINT DEFAULT NULL COMMENT '更新时间(毫秒)',
  UNIQUE KEY uk_member_no (member_no),
  KEY idx_phone (phone)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='平台会员';

DROP TABLE IF EXISTS mem_company_member;
CREATE TABLE mem_company_member (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  member_id BIGINT NOT NULL COMMENT '会员ID',
  register_shop_id BIGINT DEFAULT NULL COMMENT '首次归属门店ID',
  register_time BIGINT NOT NULL COMMENT '加入公司时间(毫秒)',
  enabled TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用 0否1是',
  del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标记 0否1是',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  update_time BIGINT DEFAULT NULL COMMENT '更新时间(毫秒)',
  UNIQUE KEY uk_company_member (company_id, member_id),
  KEY idx_company (company_id),
  KEY idx_member (member_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='公司维度会员关系';

DROP TABLE IF EXISTS mem_level;
CREATE TABLE mem_level (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  level_code VARCHAR(32) NOT NULL COMMENT '等级编码',
  level_name VARCHAR(50) NOT NULL COMMENT '等级名称',
  discount_rate DECIMAL(18,6) NOT NULL DEFAULT 1 COMMENT '折扣系数(0.95等)',
  enabled TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用 0否1是',
  del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标记 0否1是',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  update_time BIGINT DEFAULT NULL COMMENT '更新时间(毫秒)',
  UNIQUE KEY uk_company_level_code (company_id, level_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='公司会员等级';

DROP TABLE IF EXISTS mem_member_level;
CREATE TABLE mem_member_level (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  member_id BIGINT NOT NULL COMMENT '会员ID',
  level_id BIGINT NOT NULL COMMENT '等级ID',
  effective_time BIGINT NOT NULL COMMENT '生效时间(毫秒)',
  expire_time BIGINT DEFAULT NULL COMMENT '失效时间(毫秒)',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  UNIQUE KEY uk_company_member_level (company_id, member_id),
  KEY idx_level (level_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员等级归属';

DROP TABLE IF EXISTS mem_member_address;
CREATE TABLE mem_member_address (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  member_id BIGINT NOT NULL COMMENT '会员ID',
  receiver_name VARCHAR(60) NOT NULL COMMENT '收货人',
  receiver_phone VARCHAR(30) NOT NULL COMMENT '手机号',
  province VARCHAR(60) DEFAULT NULL COMMENT '省',
  city VARCHAR(60) DEFAULT NULL COMMENT '市',
  district VARCHAR(60) DEFAULT NULL COMMENT '区',
  address_detail VARCHAR(200) NOT NULL COMMENT '详细地址',
  is_default TINYINT NOT NULL DEFAULT 0 COMMENT '是否默认 0否1是',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  update_time BIGINT DEFAULT NULL COMMENT '更新时间(毫秒)',
  KEY idx_member (member_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员地址';

-- =========================================================
-- 3. 钱包域 wal_*
-- =========================================================
DROP TABLE IF EXISTS wal_account;
CREATE TABLE wal_account (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  member_id BIGINT NOT NULL COMMENT '会员ID',
  balance DECIMAL(18,6) NOT NULL DEFAULT 0 COMMENT '余额',
  version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本',
  enabled TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用 0否1是',
  del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标记 0否1是',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  update_time BIGINT DEFAULT NULL COMMENT '更新时间(毫秒)',
  UNIQUE KEY uk_company_member (company_id, member_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='钱包账户(公司维度)';

DROP TABLE IF EXISTS wal_recharge_order;
CREATE TABLE wal_recharge_order (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  shop_id BIGINT NOT NULL COMMENT '门店ID',
  member_id BIGINT NOT NULL COMMENT '会员ID',
  recharge_no VARCHAR(64) NOT NULL COMMENT '充值单号',
  recharge_amount DECIMAL(18,6) NOT NULL COMMENT '充值金额',
  pay_state TINYINT NOT NULL DEFAULT 0 COMMENT '支付状态 0待付1成功2失败',
  pay_time BIGINT DEFAULT NULL COMMENT '支付时间(毫秒)',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  UNIQUE KEY uk_company_recharge_no (company_id, recharge_no),
  KEY idx_shop (shop_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='充值单';

DROP TABLE IF EXISTS wal_trade_flow;
CREATE TABLE wal_trade_flow (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  shop_id BIGINT NOT NULL COMMENT '门店ID',
  member_id BIGINT NOT NULL COMMENT '会员ID',
  trade_type TINYINT NOT NULL COMMENT '1充值 2消费 3退款 4冲正',
  amount DECIMAL(18,6) NOT NULL COMMENT '金额',
  source_type VARCHAR(40) NOT NULL COMMENT '来源类型 POS_ORDER/REFUND/RECHARGE',
  source_no VARCHAR(64) NOT NULL COMMENT '来源单号',
  idempotent_key VARCHAR(64) NOT NULL COMMENT '幂等键(建议用eventId)',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  UNIQUE KEY uk_idempotent (company_id, idempotent_key),
  KEY idx_source (company_id, source_type, source_no),
  KEY idx_member (company_id, member_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='钱包流水(幂等)';

-- =========================================================
-- 4. 权益域 ben_*(券/卡/积分/抵现)
-- =========================================================
DROP TABLE IF EXISTS ben_rule;
CREATE TABLE ben_rule (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  rule_version VARCHAR(32) NOT NULL COMMENT '规则版本',
  rule_name VARCHAR(80) NOT NULL COMMENT '规则名称',
  rule_json MEDIUMTEXT NOT NULL COMMENT '规则配置JSON',
  enabled TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用 0否1是',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  UNIQUE KEY uk_company_rule_version (company_id, rule_version)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='权益规则(版本化)';

DROP TABLE IF EXISTS ben_coupon_template;
CREATE TABLE ben_coupon_template (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  template_code VARCHAR(32) NOT NULL COMMENT '模板编码',
  template_name VARCHAR(80) NOT NULL COMMENT '模板名称',
  coupon_type TINYINT NOT NULL COMMENT '券类型 1满减 2折扣 3立减',
  threshold_amount DECIMAL(18,6) DEFAULT NULL COMMENT '门槛金额',
  discount_amount DECIMAL(18,6) DEFAULT NULL COMMENT '优惠金额',
  discount_rate DECIMAL(18,6) DEFAULT NULL COMMENT '折扣率',
  valid_days INT DEFAULT NULL COMMENT '发放后有效天数',
  start_time BIGINT DEFAULT NULL COMMENT '固定开始时间',
  end_time BIGINT DEFAULT NULL COMMENT '固定结束时间',
  enabled TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用 0否1是',
  del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标记 0否1是',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  update_time BIGINT DEFAULT NULL COMMENT '更新时间(毫秒)',
  UNIQUE KEY uk_company_template_code (company_id, template_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='优惠券模板';

DROP TABLE IF EXISTS ben_coupon;
CREATE TABLE ben_coupon (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  member_id BIGINT NOT NULL COMMENT '会员ID',
  template_id BIGINT NOT NULL COMMENT '模板ID',
  coupon_code VARCHAR(64) NOT NULL COMMENT '券码',
  state TINYINT NOT NULL DEFAULT 0 COMMENT '状态 0未用1已用2已过期3已作废',
  receive_time BIGINT NOT NULL COMMENT '领取时间(毫秒)',
  use_time BIGINT DEFAULT NULL COMMENT '使用时间(毫秒)',
  expire_time BIGINT NOT NULL COMMENT '过期时间(毫秒)',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  UNIQUE KEY uk_company_coupon_code (company_id, coupon_code),
  KEY idx_member_state (company_id, member_id, state)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='优惠券实例(发放到会员)';

DROP TABLE IF EXISTS ben_coupon_use;
CREATE TABLE ben_coupon_use (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  coupon_id BIGINT NOT NULL COMMENT '券ID',
  order_no VARCHAR(64) NOT NULL COMMENT '订单号',
  discount_amount DECIMAL(18,6) NOT NULL COMMENT '优惠金额',
  idempotent_key VARCHAR(64) NOT NULL COMMENT '幂等键(eventId/支付流水号)',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  UNIQUE KEY uk_coupon_order (company_id, coupon_id, order_no),
  UNIQUE KEY uk_coupon_idempotent (company_id, idempotent_key),
  KEY idx_order (company_id, order_no)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='优惠券核销记录(幂等)';

DROP TABLE IF EXISTS ben_giftcard;
CREATE TABLE ben_giftcard (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  card_code VARCHAR(64) NOT NULL COMMENT '卡号',
  card_name VARCHAR(80) NOT NULL COMMENT '卡名称',
  card_type TINYINT NOT NULL COMMENT '1储值卡 2礼品卡(绑商品)',
  face_value DECIMAL(18,6) DEFAULT NULL COMMENT '面值金额',
  balance DECIMAL(18,6) NOT NULL DEFAULT 0 COMMENT '当前余额(储值卡)',
  bind_goods_id BIGINT DEFAULT NULL COMMENT '绑定商品ID(礼品卡)',
  bind_sku_unit_id BIGINT DEFAULT NULL COMMENT '绑定SKU单位ID(礼品卡)',
  bind_quantity DECIMAL(18,6) DEFAULT NULL COMMENT '可兑换数量(礼品卡)',
  state TINYINT NOT NULL DEFAULT 0 COMMENT '状态 0未激活1正常2用尽3作废',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  UNIQUE KEY uk_company_card_code (company_id, card_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='储值卡/礼品卡';

DROP TABLE IF EXISTS ben_giftcard_tx;
CREATE TABLE ben_giftcard_tx (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  shop_id BIGINT NOT NULL COMMENT '门店ID',
  card_id BIGINT NOT NULL COMMENT '卡ID',
  member_id BIGINT DEFAULT NULL COMMENT '会员ID(可选)',
  tx_type TINYINT NOT NULL COMMENT '1激活 2消费 3退款 4冲正',
  amount DECIMAL(18,6) NOT NULL DEFAULT 0 COMMENT '金额变动',
  quantity DECIMAL(18,6) NOT NULL DEFAULT 0 COMMENT '数量变动(礼品卡)',
  source_type VARCHAR(40) NOT NULL COMMENT 'POS_ORDER/REFUND',
  source_no VARCHAR(64) NOT NULL COMMENT '来源单号',
  idempotent_key VARCHAR(64) NOT NULL COMMENT '幂等键',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  UNIQUE KEY uk_idempotent (company_id, idempotent_key),
  KEY idx_source (company_id, source_type, source_no)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='储值卡/礼品卡交易流水(幂等)';

DROP TABLE IF EXISTS ben_point_account;
CREATE TABLE ben_point_account (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  member_id BIGINT NOT NULL COMMENT '会员ID',
  points BIGINT NOT NULL DEFAULT 0 COMMENT '积分余额',
  version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  update_time BIGINT DEFAULT NULL COMMENT '更新时间(毫秒)',
  UNIQUE KEY uk_company_member (company_id, member_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='积分账户(公司维度)';

DROP TABLE IF EXISTS ben_point_flow;
CREATE TABLE ben_point_flow (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  shop_id BIGINT NOT NULL COMMENT '门店ID',
  member_id BIGINT NOT NULL COMMENT '会员ID',
  flow_type TINYINT NOT NULL COMMENT '1获得 2消耗 3退回 4冲正',
  points BIGINT NOT NULL COMMENT '积分变动',
  source_type VARCHAR(40) NOT NULL COMMENT 'POS_ORDER/REFUND',
  source_no VARCHAR(64) NOT NULL COMMENT '来源单号',
  idempotent_key VARCHAR(64) NOT NULL COMMENT '幂等键',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  UNIQUE KEY uk_idempotent (company_id, idempotent_key),
  KEY idx_member (company_id, member_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='积分流水(幂等)';

DROP TABLE IF EXISTS ben_deduct_rule;
CREATE TABLE ben_deduct_rule (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  rule_version VARCHAR(32) NOT NULL COMMENT '规则版本',
  points_per_yuan INT NOT NULL DEFAULT 100 COMMENT '多少积分抵1元',
  max_deduct_rate DECIMAL(18,6) NOT NULL DEFAULT 1 COMMENT '最大抵扣比例(1=100%)',
  enabled TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用 0否1是',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  UNIQUE KEY uk_company_version (company_id, rule_version)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='积分抵现规则';

-- =========================================================
-- 5. POS 域 pos_*
-- =========================================================
DROP TABLE IF EXISTS pos_order;
CREATE TABLE pos_order (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  shop_id BIGINT NOT NULL COMMENT '门店ID',
  order_no VARCHAR(64) NOT NULL COMMENT '订单号',
  order_source TINYINT NOT NULL COMMENT '订单来源 1POS 2会员商城',
  fulfill_type TINYINT NOT NULL COMMENT '履约方式 1自提 2配送',
  member_id BIGINT DEFAULT NULL COMMENT '会员ID',
  total_amount DECIMAL(18,6) NOT NULL COMMENT '原价合计',
  discount_amount DECIMAL(18,6) NOT NULL DEFAULT 0 COMMENT '优惠合计',
  payable_amount DECIMAL(18,6) NOT NULL COMMENT '应付金额',
  pay_amount DECIMAL(18,6) NOT NULL DEFAULT 0 COMMENT '实付金额',
  order_state TINYINT NOT NULL COMMENT '订单状态 0创建 1已支付 2已取消 3已完成 4退款中 5已退款',
  price_version VARCHAR(32) DEFAULT NULL COMMENT '价格版本',
  benefit_version VARCHAR(32) DEFAULT NULL COMMENT '权益版本',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  pay_time BIGINT DEFAULT NULL COMMENT '支付时间(毫秒)',
  update_time BIGINT DEFAULT NULL COMMENT '更新时间(毫秒)',
  UNIQUE KEY uk_shop_order_no (shop_id, order_no),
  KEY idx_company_shop_time (company_id, shop_id, create_time),
  KEY idx_member (company_id, member_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='POS订单';

DROP TABLE IF EXISTS pos_order_item;
CREATE TABLE pos_order_item (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  shop_id BIGINT NOT NULL COMMENT '门店ID',
  order_no VARCHAR(64) NOT NULL COMMENT '订单号',
  line_no INT NOT NULL COMMENT '行号',
  sku_unit_id BIGINT NOT NULL COMMENT 'SKU单位ID',
  goods_name VARCHAR(120) NOT NULL COMMENT '商品名称快照',
  bar_code VARCHAR(64) DEFAULT NULL COMMENT '条码快照',
  quantity DECIMAL(18,6) NOT NULL COMMENT '数量',
  sale_price DECIMAL(18,6) NOT NULL COMMENT '成交单价',
  origin_price DECIMAL(18,6) DEFAULT NULL COMMENT '原价单价',
  amount DECIMAL(18,6) NOT NULL COMMENT '成交金额',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  UNIQUE KEY uk_order_line (shop_id, order_no, line_no),
  KEY idx_order (shop_id, order_no),
  KEY idx_sku (shop_id, sku_unit_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='POS订单明细';

DROP TABLE IF EXISTS pos_order_payment;
CREATE TABLE pos_order_payment (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  shop_id BIGINT NOT NULL COMMENT '门店ID',
  order_no VARCHAR(64) NOT NULL COMMENT '订单号',
  pay_type VARCHAR(20) NOT NULL COMMENT '支付方式 CASH/WECHAT/ALIPAY/BALANCE/CARD',
  pay_amount DECIMAL(18,6) NOT NULL COMMENT '支付金额',
  pay_ref_no VARCHAR(80) DEFAULT NULL COMMENT '支付参考号/流水号',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  KEY idx_order (shop_id, order_no)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单支付明细';

DROP TABLE IF EXISTS pos_order_benefit;
CREATE TABLE pos_order_benefit (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  shop_id BIGINT NOT NULL COMMENT '门店ID',
  order_no VARCHAR(64) NOT NULL COMMENT '订单号',
  benefit_version VARCHAR(32) DEFAULT NULL COMMENT '权益版本',
  member_discount_amount DECIMAL(18,6) NOT NULL DEFAULT 0 COMMENT '会员折扣金额',
  coupon_discount_amount DECIMAL(18,6) NOT NULL DEFAULT 0 COMMENT '优惠券金额',
  points_deduct_amount DECIMAL(18,6) NOT NULL DEFAULT 0 COMMENT '积分抵扣金额',
  giftcard_amount DECIMAL(18,6) NOT NULL DEFAULT 0 COMMENT '储值卡/礼品卡抵扣金额',
  rounding_amount DECIMAL(18,6) NOT NULL DEFAULT 0 COMMENT '抹零金额(负数表示减少应付)',
  detail_json MEDIUMTEXT DEFAULT NULL COMMENT '权益明细JSON(券id/积分等)',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  UNIQUE KEY uk_order (shop_id, order_no)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单权益快照(离线/重放锚点)';

DROP TABLE IF EXISTS pos_refund;
CREATE TABLE pos_refund (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  shop_id BIGINT NOT NULL COMMENT '门店ID',
  refund_no VARCHAR(64) NOT NULL COMMENT '退款单号',
  order_no VARCHAR(64) NOT NULL COMMENT '原订单号',
  refund_amount DECIMAL(18,6) NOT NULL COMMENT '退款金额',
  refund_state TINYINT NOT NULL COMMENT '状态 0申请 1完成 2失败',
  reason VARCHAR(200) DEFAULT NULL COMMENT '原因',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  confirm_time BIGINT DEFAULT NULL COMMENT '完成时间(毫秒)',
  UNIQUE KEY uk_shop_refund_no (shop_id, refund_no),
  KEY idx_order (shop_id, order_no)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='退款单';

DROP TABLE IF EXISTS pos_pickup_code;
CREATE TABLE pos_pickup_code (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  shop_id BIGINT NOT NULL COMMENT '门店ID',
  order_no VARCHAR(64) NOT NULL COMMENT '订单号',
  pickup_code VARCHAR(6) NOT NULL COMMENT '自提码(6位)',
  expire_time BIGINT NOT NULL COMMENT '过期时间(毫秒)',
  used_flag TINYINT NOT NULL DEFAULT 0 COMMENT '是否已核销 0否1是',
  used_time BIGINT DEFAULT NULL COMMENT '核销时间(毫秒)',
  resend_count INT NOT NULL DEFAULT 0 COMMENT '重发次数',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  UNIQUE KEY uk_shop_order (shop_id, order_no),
  UNIQUE KEY uk_shop_code (shop_id, pickup_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='自提码/核销';

DROP TABLE IF EXISTS pos_shift;
CREATE TABLE pos_shift (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  shop_id BIGINT NOT NULL COMMENT '门店ID',
  cashier_id BIGINT NOT NULL COMMENT '收银员ID',
  shift_no VARCHAR(64) NOT NULL COMMENT '班次号',
  start_time BIGINT NOT NULL COMMENT '开始时间(毫秒)',
  end_time BIGINT DEFAULT NULL COMMENT '结束时间(毫秒)',
  shift_state TINYINT NOT NULL DEFAULT 0 COMMENT '状态 0进行中 1已交班',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  UNIQUE KEY uk_shop_shift_no (shop_id, shift_no),
  KEY idx_shop_cashier (shop_id, cashier_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='收银班次';

DROP TABLE IF EXISTS pos_shift_settlement;
CREATE TABLE pos_shift_settlement (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  shop_id BIGINT NOT NULL COMMENT '门店ID',
  shift_no VARCHAR(64) NOT NULL COMMENT '班次号',
  total_order_amount DECIMAL(18,6) NOT NULL DEFAULT 0 COMMENT '订单总额',
  total_pay_amount DECIMAL(18,6) NOT NULL DEFAULT 0 COMMENT '实收总额',
  total_refund_amount DECIMAL(18,6) NOT NULL DEFAULT 0 COMMENT '退款总额',
  cash_amount DECIMAL(18,6) NOT NULL DEFAULT 0 COMMENT '现金',
  wechat_amount DECIMAL(18,6) NOT NULL DEFAULT 0 COMMENT '微信',
  alipay_amount DECIMAL(18,6) NOT NULL DEFAULT 0 COMMENT '支付宝',
  other_amount DECIMAL(18,6) NOT NULL DEFAULT 0 COMMENT '其他',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  UNIQUE KEY uk_shop_shift (shop_id, shift_no)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='班次交班汇总';

DROP TABLE IF EXISTS pos_day_settlement;
CREATE TABLE pos_day_settlement (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  shop_id BIGINT NOT NULL COMMENT '门店ID',
  biz_date INT NOT NULL COMMENT '业务日期yyyyMMdd',
  total_order_count INT NOT NULL DEFAULT 0 COMMENT '订单数',
  total_pay_amount DECIMAL(18,6) NOT NULL DEFAULT 0 COMMENT '实收',
  total_refund_amount DECIMAL(18,6) NOT NULL DEFAULT 0 COMMENT '退款',
  net_amount DECIMAL(18,6) NOT NULL DEFAULT 0 COMMENT '净收=实收-退款',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  UNIQUE KEY uk_shop_date (shop_id, biz_date),
  KEY idx_company_date (company_id, biz_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='门店日结汇总(POS侧)';

-- =========================================================
-- 6. 门店WMS域 hwms_*(仓库基础资料 + 单据)
-- =========================================================
DROP TABLE IF EXISTS hwms_workhouse;
CREATE TABLE hwms_workhouse (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  shop_id BIGINT NOT NULL COMMENT '门店ID',
  workhouse_code VARCHAR(32) NOT NULL COMMENT '仓库编码',
  workhouse_name VARCHAR(80) NOT NULL COMMENT '仓库名称',
  enabled TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用 0否1是',
  del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标记 0否1是',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  update_time BIGINT DEFAULT NULL COMMENT '更新时间(毫秒)',
  UNIQUE KEY uk_shop_workhouse_code (shop_id, workhouse_code),
  KEY idx_shop (shop_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='门店仓库';

DROP TABLE IF EXISTS hwms_workhouse_area;
CREATE TABLE hwms_workhouse_area (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  shop_id BIGINT NOT NULL COMMENT '门店ID',
  workhouse_id BIGINT NOT NULL COMMENT '仓库ID',
  area_code VARCHAR(32) NOT NULL COMMENT '库区编码',
  area_name VARCHAR(80) NOT NULL COMMENT '库区名称',
  sort_no INT NOT NULL DEFAULT 0 COMMENT '排序',
  enabled TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用 0否1是',
  del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标记 0否1是',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  update_time BIGINT DEFAULT NULL COMMENT '更新时间(毫秒)',
  UNIQUE KEY uk_workhouse_area_code (workhouse_id, area_code),
  KEY idx_workhouse (workhouse_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='库区';

DROP TABLE IF EXISTS hwms_shelves;
CREATE TABLE hwms_shelves (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  shop_id BIGINT NOT NULL COMMENT '门店ID',
  workhouse_id BIGINT NOT NULL COMMENT '仓库ID',
  area_id BIGINT NOT NULL COMMENT '库区ID',
  shelves_code VARCHAR(32) NOT NULL COMMENT '货架编码',
  shelves_name VARCHAR(80) NOT NULL COMMENT '货架名称',
  enabled TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用 0否1是',
  del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标记 0否1是',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  update_time BIGINT DEFAULT NULL COMMENT '更新时间(毫秒)',
  UNIQUE KEY uk_area_shelves_code (area_id, shelves_code),
  KEY idx_area (area_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='货架';

DROP TABLE IF EXISTS hwms_bin;
CREATE TABLE hwms_bin (
  id BIGINT PRIMARY KEY COMMENT '主键ID',
  company_id BIGINT NOT NULL COMMENT '公司ID',
  shop_id BIGINT NOT NULL COMMENT '门店ID',
  workhouse_id BIGINT NOT NULL COMMENT '仓库ID',
  area_id BIGINT NOT NULL COMMENT '库区ID',
  shelves_id BIGINT DEFAULT NULL COMMENT '货架ID',
  bin_code VARCHAR(32) NOT NULL COMMENT '库位编码',
  bin_name VARCHAR(80) NOT NULL COMMENT '库位名称',
  length_cm DECIMAL(18,6) DEFAULT NULL COMMENT '长(cm)',
  width_cm DECIMAL(18,6) DEFAULT NULL COMMENT '宽(cm)',
  height_cm DECIMAL(18,6) DEFAULT NULL COMMENT '高(cm)',
  max_weight DECIMAL(18,6) DEFAULT NULL COMMENT '最大承重(kg)',
  enabled TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用 0否1是',
  del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标记 0否1是',
  create_time BIGINT NOT NULL COMMENT '创建时间(毫秒)',
  update_time BIGINT DEFAULT NULL COMMENT '更新时间(毫秒)',
  UNIQUE KEY uk_workhouse_bin_code (workhouse_id, bin_code),
  KEY idx_workhouse (workhouse_id),
  KEY idx_area (area_id),
  KEY idx_shelves (shelves_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='库位';

DROP TABLE IF EXISTS hwms_stockin;
CREATE TABLE hwms_stockin (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  workhouse_id BIGINT NOT NULL,
  stockin_no VARCHAR(64) NOT NULL,
  source_type VARCHAR(40) DEFAULT NULL,
  source_no VARCHAR(64) DEFAULT NULL,
  bill_state TINYINT NOT NULL DEFAULT 0,
  audit_state TINYINT NOT NULL DEFAULT 0,
  audit_time BIGINT DEFAULT NULL,
  reverse_state TINYINT NOT NULL DEFAULT 0,
  reverse_time BIGINT DEFAULT NULL,
  sync_state TINYINT NOT NULL DEFAULT 0,
  create_time BIGINT NOT NULL,
  update_time BIGINT DEFAULT NULL,
  UNIQUE KEY uk_shop_stockin_no (shop_id, stockin_no),
  KEY idx_shop_audit_time (shop_id, audit_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='入库单';

DROP TABLE IF EXISTS hwms_stockin_item;
CREATE TABLE hwms_stockin_item (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  stockin_no VARCHAR(64) NOT NULL,
  line_no INT NOT NULL,
  sku_unit_id BIGINT NOT NULL,
  quantity DECIMAL(18,6) NOT NULL,
  bin_id BIGINT DEFAULT NULL,
  create_time BIGINT NOT NULL,
  UNIQUE KEY uk_stockin_line (shop_id, stockin_no, line_no),
  KEY idx_stockin (shop_id, stockin_no),
  KEY idx_sku (shop_id, sku_unit_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='入库单明细';

DROP TABLE IF EXISTS hwms_stockout;
CREATE TABLE hwms_stockout (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  workhouse_id BIGINT NOT NULL,
  stockout_no VARCHAR(64) NOT NULL,
  source_type VARCHAR(40) DEFAULT NULL,
  source_no VARCHAR(64) DEFAULT NULL,
  bill_state TINYINT NOT NULL DEFAULT 0,
  audit_state TINYINT NOT NULL DEFAULT 0,
  audit_time BIGINT DEFAULT NULL,
  reverse_state TINYINT NOT NULL DEFAULT 0,
  reverse_time BIGINT DEFAULT NULL,
  sync_state TINYINT NOT NULL DEFAULT 0,
  create_time BIGINT NOT NULL,
  update_time BIGINT DEFAULT NULL,
  UNIQUE KEY uk_shop_stockout_no (shop_id, stockout_no),
  KEY idx_shop_audit_time (shop_id, audit_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='出库单';

DROP TABLE IF EXISTS hwms_stockout_item;
CREATE TABLE hwms_stockout_item (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  stockout_no VARCHAR(64) NOT NULL,
  line_no INT NOT NULL,
  sku_unit_id BIGINT NOT NULL,
  quantity DECIMAL(18,6) NOT NULL,
  bin_id BIGINT DEFAULT NULL,
  create_time BIGINT NOT NULL,
  UNIQUE KEY uk_stockout_line (shop_id, stockout_no, line_no),
  KEY idx_stockout (shop_id, stockout_no),
  KEY idx_sku (shop_id, sku_unit_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='出库单明细';

DROP TABLE IF EXISTS hwms_stocktake;
CREATE TABLE hwms_stocktake (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  workhouse_id BIGINT NOT NULL,
  stocktake_no VARCHAR(64) NOT NULL,
  bill_state TINYINT NOT NULL DEFAULT 0,
  audit_state TINYINT NOT NULL DEFAULT 0,
  audit_time BIGINT DEFAULT NULL,
  reverse_state TINYINT NOT NULL DEFAULT 0,
  reverse_time BIGINT DEFAULT NULL,
  create_time BIGINT NOT NULL,
  update_time BIGINT DEFAULT NULL,
  UNIQUE KEY uk_shop_stocktake_no (shop_id, stocktake_no),
  KEY idx_shop_audit_time (shop_id, audit_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='盘点单';

DROP TABLE IF EXISTS hwms_stocktake_item;
CREATE TABLE hwms_stocktake_item (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  stocktake_no VARCHAR(64) NOT NULL,
  line_no INT NOT NULL,
  sku_unit_id BIGINT NOT NULL,
  book_qty DECIMAL(18,6) NOT NULL,
  actual_qty DECIMAL(18,6) NOT NULL,
  bin_id BIGINT DEFAULT NULL,
  create_time BIGINT NOT NULL,
  UNIQUE KEY uk_stocktake_line (shop_id, stocktake_no, line_no),
  KEY idx_stocktake (shop_id, stocktake_no),
  KEY idx_sku (shop_id, sku_unit_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='盘点单明细';

DROP TABLE IF EXISTS hwms_loss;
CREATE TABLE hwms_loss (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  workhouse_id BIGINT NOT NULL,
  loss_no VARCHAR(64) NOT NULL,
  bill_state TINYINT NOT NULL DEFAULT 0,
  audit_state TINYINT NOT NULL DEFAULT 0,
  audit_time BIGINT DEFAULT NULL,
  reverse_state TINYINT NOT NULL DEFAULT 0,
  reverse_time BIGINT DEFAULT NULL,
  create_time BIGINT NOT NULL,
  update_time BIGINT DEFAULT NULL,
  UNIQUE KEY uk_shop_loss_no (shop_id, loss_no),
  KEY idx_shop_audit_time (shop_id, audit_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='报损单';

DROP TABLE IF EXISTS hwms_loss_item;
CREATE TABLE hwms_loss_item (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  loss_no VARCHAR(64) NOT NULL,
  line_no INT NOT NULL,
  sku_unit_id BIGINT NOT NULL,
  quantity DECIMAL(18,6) NOT NULL,
  bin_id BIGINT DEFAULT NULL,
  create_time BIGINT NOT NULL,
  UNIQUE KEY uk_loss_line (shop_id, loss_no, line_no),
  KEY idx_loss (shop_id, loss_no),
  KEY idx_sku (shop_id, sku_unit_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='报损单明细';

DROP TABLE IF EXISTS hwms_overflow;
CREATE TABLE hwms_overflow (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  workhouse_id BIGINT NOT NULL,
  overflow_no VARCHAR(64) NOT NULL,
  bill_state TINYINT NOT NULL DEFAULT 0,
  audit_state TINYINT NOT NULL DEFAULT 0,
  audit_time BIGINT DEFAULT NULL,
  reverse_state TINYINT NOT NULL DEFAULT 0,
  reverse_time BIGINT DEFAULT NULL,
  create_time BIGINT NOT NULL,
  update_time BIGINT DEFAULT NULL,
  UNIQUE KEY uk_shop_overflow_no (shop_id, overflow_no),
  KEY idx_shop_audit_time (shop_id, audit_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='报溢单';

DROP TABLE IF EXISTS hwms_overflow_item;
CREATE TABLE hwms_overflow_item (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  overflow_no VARCHAR(64) NOT NULL,
  line_no INT NOT NULL,
  sku_unit_id BIGINT NOT NULL,
  quantity DECIMAL(18,6) NOT NULL,
  bin_id BIGINT DEFAULT NULL,
  create_time BIGINT NOT NULL,
  UNIQUE KEY uk_overflow_line (shop_id, overflow_no, line_no),
  KEY idx_overflow (shop_id, overflow_no),
  KEY idx_sku (shop_id, sku_unit_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='报溢单明细';

DROP TABLE IF EXISTS hwms_move;
CREATE TABLE hwms_move (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  workhouse_id BIGINT NOT NULL,
  move_no VARCHAR(64) NOT NULL,
  bill_state TINYINT NOT NULL DEFAULT 0,
  audit_state TINYINT NOT NULL DEFAULT 0,
  audit_time BIGINT DEFAULT NULL,
  reverse_state TINYINT NOT NULL DEFAULT 0,
  reverse_time BIGINT DEFAULT NULL,
  create_time BIGINT NOT NULL,
  update_time BIGINT DEFAULT NULL,
  UNIQUE KEY uk_shop_move_no (shop_id, move_no),
  KEY idx_shop_audit_time (shop_id, audit_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='移库单';

DROP TABLE IF EXISTS hwms_move_item;
CREATE TABLE hwms_move_item (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  move_no VARCHAR(64) NOT NULL,
  line_no INT NOT NULL,
  sku_unit_id BIGINT NOT NULL,
  quantity DECIMAL(18,6) NOT NULL,
  from_bin_id BIGINT NOT NULL,
  to_bin_id BIGINT NOT NULL,
  create_time BIGINT NOT NULL,
  UNIQUE KEY uk_move_line (shop_id, move_no, line_no),
  KEY idx_move (shop_id, move_no),
  KEY idx_sku (shop_id, sku_unit_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='移库单明细';

DROP TABLE IF EXISTS hwms_bill_log;
CREATE TABLE hwms_bill_log (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  bill_type VARCHAR(40) NOT NULL,
  bill_no VARCHAR(64) NOT NULL,
  operate_type VARCHAR(40) NOT NULL,
  operate_user BIGINT DEFAULT NULL,
  operate_time BIGINT NOT NULL,
  remark VARCHAR(200) DEFAULT NULL,
  KEY idx_bill (shop_id, bill_type, bill_no)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='HWMS单据日志';

-- =========================================================
-- 7. 门店库存台账 hinv_*
-- =========================================================
DROP TABLE IF EXISTS hinv_inventory;
CREATE TABLE hinv_inventory (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  sku_unit_id BIGINT NOT NULL,
  quantity DECIMAL(18,6) NOT NULL DEFAULT 0,
  update_time BIGINT NOT NULL,
  version INT NOT NULL DEFAULT 0,
  UNIQUE KEY uk_sku (company_id, shop_id, sku_unit_id),
  KEY idx_shop (shop_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='库存结存(SKU单位级)';

DROP TABLE IF EXISTS hinv_inventory_bin;
CREATE TABLE hinv_inventory_bin (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  bin_id BIGINT NOT NULL,
  sku_unit_id BIGINT NOT NULL,
  quantity DECIMAL(18,6) NOT NULL DEFAULT 0,
  update_time BIGINT NOT NULL,
  version INT NOT NULL DEFAULT 0,
  UNIQUE KEY uk_bin_sku (company_id, shop_id, bin_id, sku_unit_id),
  KEY idx_shop_bin (shop_id, bin_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='库存结存(库位级)';

DROP TABLE IF EXISTS hinv_inventory_flow;
CREATE TABLE hinv_inventory_flow (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  sku_unit_id BIGINT NOT NULL,
  change_qty DECIMAL(18,6) NOT NULL,
  after_qty DECIMAL(18,6) NOT NULL,
  source_type VARCHAR(40) NOT NULL,
  source_no VARCHAR(64) NOT NULL,
  source_line_no INT NOT NULL,
  posting_side TINYINT NOT NULL DEFAULT 0,
  biz_time BIGINT NOT NULL,
  reverse_state TINYINT NOT NULL DEFAULT 0,
  reverse_time BIGINT DEFAULT NULL,
  reverse_event_id VARCHAR(64) DEFAULT NULL,
  create_time BIGINT NOT NULL,
  UNIQUE KEY uk_posting (company_id, shop_id, source_type, source_no, source_line_no, posting_side),
  KEY idx_shop_sku_time (shop_id, sku_unit_id, biz_time),
  KEY idx_source (source_type, source_no),
  KEY idx_reverse (reverse_state)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='库存流水(唯一键防重复过账)';

-- =========================================================
-- 8. 门店成本台账 hcost_*
-- =========================================================
DROP TABLE IF EXISTS hcost_stock;
CREATE TABLE hcost_stock (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  sku_unit_id BIGINT NOT NULL,
  quantity DECIMAL(18,6) NOT NULL DEFAULT 0,
  amount DECIMAL(18,6) NOT NULL DEFAULT 0,
  update_time BIGINT NOT NULL,
  version INT NOT NULL DEFAULT 0,
  UNIQUE KEY uk_sku (company_id, shop_id, sku_unit_id),
  KEY idx_shop (shop_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='成本结存(数量+金额)';

DROP TABLE IF EXISTS hcost_flow;
CREATE TABLE hcost_flow (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  sku_unit_id BIGINT NOT NULL,
  change_qty DECIMAL(18,6) NOT NULL,
  cost_amount DECIMAL(18,6) NOT NULL,
  cost_method VARCHAR(20) NOT NULL,
  source_type VARCHAR(40) NOT NULL,
  source_no VARCHAR(64) NOT NULL,
  source_line_no INT NOT NULL,
  posting_side TINYINT NOT NULL DEFAULT 0,
  biz_time BIGINT NOT NULL,
  reverse_state TINYINT NOT NULL DEFAULT 0,
  reverse_time BIGINT DEFAULT NULL,
  reverse_event_id VARCHAR(64) DEFAULT NULL,
  create_time BIGINT NOT NULL,
  UNIQUE KEY uk_posting (company_id, shop_id, source_type, source_no, source_line_no, posting_side),
  KEY idx_shop_sku_time (shop_id, sku_unit_id, biz_time),
  KEY idx_source (source_type, source_no),
  KEY idx_reverse (reverse_state)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='成本流水(唯一键防重复过账)';

DROP TABLE IF EXISTS hcost_fifo_layer;
CREATE TABLE hcost_fifo_layer (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  sku_unit_id BIGINT NOT NULL,
  init_qty DECIMAL(18,6) NOT NULL DEFAULT 0,
  remain_qty DECIMAL(18,6) NOT NULL DEFAULT 0,
  unit_cost DECIMAL(18,6) NOT NULL DEFAULT 0,
  source_type VARCHAR(40) NOT NULL,
  source_no VARCHAR(64) NOT NULL,
  source_line_no INT NOT NULL,
  posting_side TINYINT NOT NULL DEFAULT 0,
  create_time BIGINT NOT NULL,
  UNIQUE KEY uk_layer (company_id, shop_id, sku_unit_id, source_type, source_no, source_line_no, posting_side),
  KEY idx_shop_sku (shop_id, sku_unit_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='FIFO分层(唯一键防重复建层)';

DROP TABLE IF EXISTS hcost_fifo_consume;
CREATE TABLE hcost_fifo_consume (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  sku_unit_id BIGINT NOT NULL,
  source_type VARCHAR(40) NOT NULL,
  source_no VARCHAR(64) NOT NULL,
  source_line_no INT NOT NULL,
  posting_side TINYINT NOT NULL DEFAULT 0,
  layer_id BIGINT NOT NULL,
  consume_qty DECIMAL(18,6) NOT NULL,
  unit_cost DECIMAL(18,6) NOT NULL,
  consume_amount DECIMAL(18,6) NOT NULL,
  reverse_state TINYINT NOT NULL DEFAULT 0,
  reverse_time BIGINT DEFAULT NULL,
  reverse_event_id VARCHAR(64) DEFAULT NULL,
  create_time BIGINT NOT NULL,
  UNIQUE KEY uk_consume (company_id, shop_id, source_type, source_no, source_line_no, posting_side, layer_id),
  KEY idx_source (company_id, shop_id, source_type, source_no),
  KEY idx_layer (layer_id),
  KEY idx_reverse (reverse_state)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='FIFO扣层明细(出库回滚锚点)';

-- =========================================================
-- 9. 离线同步域 sync_*
-- =========================================================
DROP TABLE IF EXISTS sync_event_log;
CREATE TABLE sync_event_log (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  device_id VARCHAR(64) NOT NULL,
  event_id VARCHAR(64) NOT NULL,
  event_type VARCHAR(64) NOT NULL,
  biz_key VARCHAR(80) NOT NULL,
  event_time BIGINT NOT NULL,
  recv_time BIGINT NOT NULL,
  handle_state TINYINT NOT NULL,
  reject_code VARCHAR(64) DEFAULT NULL,
  reject_msg VARCHAR(200) DEFAULT NULL,
  payload_json MEDIUMTEXT DEFAULT NULL,
  create_time BIGINT NOT NULL,
  UNIQUE KEY uk_event (company_id, shop_id, event_id),
  KEY idx_company_time (company_id, recv_time),
  KEY idx_event_type (event_type),
  KEY idx_biz_key (biz_key)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='同步事件日志(幂等/审计)';

DROP TABLE IF EXISTS sync_conflict;
CREATE TABLE sync_conflict (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  conflict_id VARCHAR(64) NOT NULL,
  event_id VARCHAR(64) NOT NULL,
  event_type VARCHAR(64) NOT NULL,
  biz_key VARCHAR(80) NOT NULL,
  reason_code VARCHAR(64) NOT NULL,
  reason_msg VARCHAR(200) NOT NULL,
  state TINYINT NOT NULL DEFAULT 0,
  create_time BIGINT NOT NULL,
  UNIQUE KEY uk_conflict (conflict_id),
  KEY idx_event (company_id, shop_id, event_id),
  KEY idx_state (state)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='同步冲突处理单';

DROP TABLE IF EXISTS sync_checkpoint;
CREATE TABLE sync_checkpoint (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  device_id VARCHAR(64) NOT NULL,
  last_event_time BIGINT NOT NULL DEFAULT 0,
  last_event_id VARCHAR(64) DEFAULT NULL,
  update_time BIGINT NOT NULL,
  UNIQUE KEY uk_shop_device (shop_id, device_id),
  KEY idx_company_shop (company_id, shop_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='同步水位(按门店设备)';

-- =========================================================
-- 10. 对账/重放任务 fin_reconcile_*
-- =========================================================
DROP TABLE IF EXISTS fin_reconcile_task;
CREATE TABLE fin_reconcile_task (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  biz_date INT NOT NULL,
  task_type TINYINT NOT NULL COMMENT '1对账 2重放 3对账+重放',
  task_state TINYINT NOT NULL COMMENT '0待执行 1执行中 2成功 3失败',
  fail_msg VARCHAR(200) DEFAULT NULL,
  start_time BIGINT DEFAULT NULL,
  end_time BIGINT DEFAULT NULL,
  create_time BIGINT NOT NULL,
  UNIQUE KEY uk_shop_date_type (shop_id, biz_date, task_type),
  KEY idx_company_state (company_id, task_state)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='云端对账/重放任务表';

DROP TABLE IF EXISTS fin_reconcile_result;
CREATE TABLE fin_reconcile_result (
  id BIGINT PRIMARY KEY,
  task_id BIGINT NOT NULL,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  biz_date INT NOT NULL,
  result_state TINYINT NOT NULL COMMENT '0一致 1不一致 2已修复',
  pos_ok TINYINT NOT NULL DEFAULT 1,
  inv_ok TINYINT NOT NULL DEFAULT 1,
  cost_ok TINYINT NOT NULL DEFAULT 1,
  pos_diff_msg VARCHAR(200) DEFAULT NULL,
  inv_diff_msg VARCHAR(200) DEFAULT NULL,
  cost_diff_msg VARCHAR(200) DEFAULT NULL,
  create_time BIGINT NOT NULL,
  KEY idx_task (task_id),
  KEY idx_shop_date (shop_id, biz_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='云端对账结果主表';

DROP TABLE IF EXISTS fin_reconcile_diff;
CREATE TABLE fin_reconcile_diff (
  id BIGINT PRIMARY KEY,
  task_id BIGINT NOT NULL,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  biz_date INT NOT NULL,
  diff_type TINYINT NOT NULL COMMENT '1POS 2库存 3成本',
  sku_unit_id BIGINT DEFAULT NULL,
  cloud_value DECIMAL(18,6) DEFAULT NULL,
  local_value DECIMAL(18,6) DEFAULT NULL,
  diff_value DECIMAL(18,6) DEFAULT NULL,
  remark VARCHAR(200) DEFAULT NULL,
  create_time BIGINT NOT NULL,
  KEY idx_task_type (task_id, diff_type),
  KEY idx_sku (shop_id, sku_unit_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='对账差异明细(到SKU)';

-- =========================================================
-- 11. 门店配送域 del_*
-- =========================================================
DROP TABLE IF EXISTS del_task;
CREATE TABLE del_task (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  task_no VARCHAR(64) NOT NULL,
  order_no VARCHAR(64) DEFAULT NULL,
  stockout_no VARCHAR(64) DEFAULT NULL,
  deliver_type TINYINT NOT NULL,
  task_state TINYINT NOT NULL,
  receiver_name VARCHAR(60) DEFAULT NULL,
  receiver_phone VARCHAR(30) DEFAULT NULL,
  address VARCHAR(200) DEFAULT NULL,
  plan_time BIGINT DEFAULT NULL,
  driver_user_id BIGINT DEFAULT NULL,
  create_time BIGINT NOT NULL,
  update_time BIGINT DEFAULT NULL,
  UNIQUE KEY uk_shop_task_no (shop_id, task_no),
  KEY idx_shop_state (shop_id, task_state)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='门店配送任务';

DROP TABLE IF EXISTS del_task_trace;
CREATE TABLE del_task_trace (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  task_no VARCHAR(64) NOT NULL,
  from_state TINYINT DEFAULT NULL,
  to_state TINYINT NOT NULL,
  operate_user BIGINT DEFAULT NULL,
  operate_time BIGINT NOT NULL,
  remark VARCHAR(200) DEFAULT NULL,
  KEY idx_task (shop_id, task_no)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='配送任务状态轨迹';

DROP TABLE IF EXISTS del_sign;
CREATE TABLE del_sign (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  task_no VARCHAR(64) NOT NULL,
  sign_type TINYINT NOT NULL,
  sign_url VARCHAR(300) NOT NULL,
  sign_time BIGINT NOT NULL,
  create_time BIGINT NOT NULL,
  KEY idx_task (shop_id, task_no)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='签收凭证';

-- =========================================================
-- 12. 门店订货 sh_purchase_*
-- =========================================================
DROP TABLE IF EXISTS sh_purchase_order;
CREATE TABLE sh_purchase_order (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  purchase_no VARCHAR(64) NOT NULL,
  supplier_company_id BIGINT DEFAULT NULL,
  order_state TINYINT NOT NULL DEFAULT 0,
  total_amount DECIMAL(18,6) NOT NULL DEFAULT 0,
  create_time BIGINT NOT NULL,
  update_time BIGINT DEFAULT NULL,
  UNIQUE KEY uk_shop_purchase_no (shop_id, purchase_no),
  KEY idx_company_shop (company_id, shop_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='门店订货主表';

DROP TABLE IF EXISTS sh_purchase_order_item;
CREATE TABLE sh_purchase_order_item (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  purchase_no VARCHAR(64) NOT NULL,
  line_no INT NOT NULL,
  sku_unit_id BIGINT NOT NULL,
  quantity DECIMAL(18,6) NOT NULL,
  unit_price DECIMAL(18,6) DEFAULT NULL,
  amount DECIMAL(18,6) DEFAULT NULL,
  create_time BIGINT NOT NULL,
  UNIQUE KEY uk_purchase_line (shop_id, purchase_no, line_no),
  KEY idx_purchase (shop_id, purchase_no)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='门店订货明细';

DROP TABLE IF EXISTS sh_purchase_order_log;
CREATE TABLE sh_purchase_order_log (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  purchase_no VARCHAR(64) NOT NULL,
  operate_type VARCHAR(40) NOT NULL,
  operate_user BIGINT DEFAULT NULL,
  operate_time BIGINT NOT NULL,
  remark VARCHAR(200) DEFAULT NULL,
  KEY idx_purchase (shop_id, purchase_no)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='门店订货日志';

-- =========================================================
-- 13. 报表 rpt_*
-- =========================================================
DROP TABLE IF EXISTS rpt_shop_day_settlement;
CREATE TABLE rpt_shop_day_settlement (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  shop_id BIGINT NOT NULL,
  biz_date INT NOT NULL,
  total_order_count INT NOT NULL DEFAULT 0,
  total_pay_amount DECIMAL(18,6) NOT NULL DEFAULT 0,
  total_refund_amount DECIMAL(18,6) NOT NULL DEFAULT 0,
  net_amount DECIMAL(18,6) NOT NULL DEFAULT 0,
  create_time BIGINT NOT NULL,
  UNIQUE KEY uk_shop_date (shop_id, biz_date),
  KEY idx_company_date (company_id, biz_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='门店日汇总报表';

DROP TABLE IF EXISTS rpt_company_day_summary;
CREATE TABLE rpt_company_day_summary (
  id BIGINT PRIMARY KEY,
  company_id BIGINT NOT NULL,
  biz_date INT NOT NULL,
  shop_count INT NOT NULL DEFAULT 0,
  total_order_count INT NOT NULL DEFAULT 0,
  total_pay_amount DECIMAL(18,6) NOT NULL DEFAULT 0,
  total_refund_amount DECIMAL(18,6) NOT NULL DEFAULT 0,
  net_amount DECIMAL(18,6) NOT NULL DEFAULT 0,
  create_time BIGINT NOT NULL,
  UNIQUE KEY uk_company_date (company_id, biz_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='公司汇总日报(老板视角)';

SET FOREIGN_KEY_CHECKS = 1;

  

 

posted @ 2026-02-08 18:07  升鲜宝生鲜供应链系统  阅读(15)  评论(0)    收藏  举报