Files
baiyue-firstleg/deploy/sql

单测试环境数据库空库初始化

migrations/overseas/baiyue_lastleg/V23__align_return_movement_collation.sql 将退货进销存 UNION 涉及的八张表、22 个文本字段及表默认规则显式统一为 utf8mb4_unicode_ci,同步 Lastleg 两份源基线与海外统一空库基线。执行前核对字段长度、默认值、可空性及目标规则下唯一索引无冲突;只修改规则,不回填或删除数据,不重放空库基线。DDL 非事务,失败时停止并复查实际已完成项;可按最终定义重跑。脚本存在不表示测试库已执行,执行后用原始计数/分页查询验证,无需发布查询转换代码。

migrations/overseas/baiyue_lastleg/V22__selfop_warehouse_daily_sales.sql 新增自营仓库每日汇总表及销量版本 warehouse_daily_ready 标记。与匹配 Lastleg 一起发布;汇总随 SKU 日事实批次原子构建,完整性验证后方可发布。已有未构建汇总的销量版本须重新构建发布,不回填旧版本、不回退旧查询;空版本同样必须有就绪证据。源基线与海外空库基线同步。

migrations/overseas/baiyue_lastleg/V21__procurement_fee_confirmation_origin.sql 增加采购费用核定入口,区分业务节点与财务操作,用于独立新增费用、替代核定及其重试权限。同步源基线和海外统一空库基线;不回填测试存量,不表示已执行。

migrations/overseas/baiyue_lastleg/V20__procurement_exception_control.sql 增加采购事实更正/阻断说明、异常关闭及逐来源最终去向三表。服务端保持原收货和发运记录,关闭不产生库存、退款或退货运输;需与采购详情聚合和节点阻断校验的匹配版本发布。源基线和海外统一基线同步,本文件存在不表示已执行。

migrations/overseas/baiyue_lastleg/V19__procurement_fee_correction.sql 保存费用链修正目标、原汇率及确认前净实扣,并关联逐笔正差额/退款费用。同步进入 Lastleg 源基线与海外统一空库基线,不新增资金账本,不重算或回填旧消费;只有匹配版本能够发送本次费用链请求。本文件存在不代表已执行。

采购实物与运输结构分别见 migrations/overseas/baiyue_lastleg/V17__procurement_physical_facts.sql 和 V18__procurement_transport_facts.sql:V17 保存分次实收、差异、装箱及两段整批交寄七表;V18 保存面单版本、逐箱贴单、预估核对和一对一换包装四表,并补齐采购附件的 LABEL/PURCHASE/BUDGET/EXCEPTION 分类约束。源基线及海外统一空库基线同步,节点权限统一维护于采购 V5 权限脚本。File 同时发布对应文件类型约束;不补写历史收货、装箱或发运事实,不代表已执行或已验收。

采购购买节点结构使用 migrations/overseas/baiyue_lastleg/V16__procurement_purchase_facts.sql,新增单批履约事实、节点幂等审计及预算授权历史三表。独立购买/取消权限使用 migrations/cn/baiyue_iam/V5__procurement_node_permissions.sql,源种子为 IAM procurement-permissions.sql,同步进入国内统一空库基线;只给现有平台管理员角色默认授权,不新增岗位。上述结构与权限必须随采购节点匹配版本发布,不补造旧订单购买事实,不代表已执行或已验收。

migrations/overseas/baiyue_lastleg/V15__procurement_fee_versions.sql 为采购费用增加用途、确认版本、原币汇率、原冻结及实际流水引用,并建立 ll_procurement_wallet_attempt 保存每次资金请求及最终结果。零元费用可以落核定事实但不生成资金命令;字段和约束与源基线、海外统一空库基线同步。执行前核对新增列、索引和表均未存在,先发布准备完整匹配版本;不回填旧费用、不释放或重扣测试存量。该脚本仅完成费用结构,后续履约表按相应变更单独核对。

migrations/overseas/baiyue_lastleg/V14__procurement_wallet_reference.sql 为采购已实扣费用来源新增 wallet_settlement JSON 引用,保存 Finance 原资金命令、冻结及消费流水身份。源基线与海外统一空库基线同步维护;指定测试环境执行前核对列不存在,不回填历史费用,不重新收费。需与 Finance 资金回执、费用关联及 Lastleg 采购生产端的匹配版本一起发布;本文件存在不表示已经执行。

reset-test-fba-appointments.sql 仅用于明确授权的 TEST 预约模型重建:删除并按当前基线重建 ll_inbound_fba_appointment、ll_inbound_fba_appointment_item,并首次创建 ll_fba_appointment_command 保存同事务幂等结果与历史。执行任何DROP前必须确认命令表尚不存在;若已存在,先核对上次执行结果,本脚本不清空命令历史、不支持盲目重试。它会丢弃旧预约及关联明细,但不修改订单、入仓计划、库存和排车。调用者必须核对测试连接及两张表的具体重置授权;不得作为自动启动脚本或用于生产。主单区分计划日期/时段、系统单号、外部确认号和确认UTC/IANA时区;明细按稳定货源占用,不再依赖入仓计划明细。结构必须与匹配Lastleg和Admin一同发布,失败立即停止,不回填旧数据。权限从IAM种子核对;文件存在不表示已执行。

migrations/overseas/baiyue_lastleg/V13__widen_inbound_plan_creation_mode.sql 仅将 ll_inbound_plan.creation_mode 从旧统一基线的 VARCHAR(16) 扩至模块基线已有的 VARCHAR(32),容纳实际来货审核写入的 WAREHOUSE_TRANSFER(18字符)。保留 utf8mb4_unicode_ci、非空及 AUTO 默认值;不更新已有计划或状态。执行前核对目标库该列的长度、排序规则、可空性和默认值,已符合最终定义则核对后跳过;执行结果不确定时先只读复查,不盲目重试。统一空库基线同步最终定义,不重放模块历史初始化脚本。

migrations/overseas/baiyue_lastleg/V12__preserve_unknown_pool_order_fields.sql 仅放开散板打盘需求及两类本土订单柜型三列为空、默认空,供未提供这些事实的拼车商业订单使用;普通订单输入校验仍由原服务端请求合同执行。对应源及统一空库基线同步最终定义,不回填已生成订单或把托盘数量解释成打盘服务需求。

内部拼车需求池的当前结构在 Lastleg 源基线和海外统一空库基线同步维护,独立五项权限在 IAM 源种子和国内统一基线维护。已存在基础表的指定环境结构补齐使用 migrations/overseas/baiyue_lastleg/V10__fleet_capacity_pool.sql 与 migrations/cn/baiyue_iam/V4__fleet_capacity_offer_permissions.sql;执行前确认三张新表、六个新增字段均未存在,并单独核对目标环境。随后 V11__align_capacity_pool_collation.sql 将预订与商业桥的客户关联字段显式统一为 utf8mb4_unicode_ci,与原订单域一致,避免依赖MySQL实例默认排序规则导致JOIN失败。它们不回填、删除或重置业务数据,不能重放整个空库基线。候选文件存在不表示已经执行。

平台自营领星统计十张 ll_selfop_* 表直接同步 Lastleg 源基线及海外统一空库基线;时间使用 UTC 存储及已确认北京时间业务日,数量使用 DECIMAL 保留 PCS 精度,维持独立发布版本。包含账号共享预算/冷却、验证根用途与硬预算、TEST BUSINESS 根会话持久预算、稳定任务号、阶段进度/心跳和旧版替代时间;任务的 business_root_task_id 标记共享根,只有根保存 business_budget_json,生产任务不使用该测试预算。库存 run 包含每日代表日期、选择规则及账号/仓库/日期唯一约束,代表库存与 profile 不适用销量副本淘汰。IAM 权限源为 iam/src/main/resources/db/selfoperated-analytics-permissions.sql,自营业务下经营总览、销量分析、库存分析、数据采集的菜单资源与独立读写权限同步国内统一基线,仅平台管理员默认授权。执行和部署状态只维护于工作区测试环境主契约;真实采集模式默认 OFF。

客户/商品资料基线为 lastleg-service/src/main/resources/db/selfop-master-data.sql,仅新增 ll_selfop_owner、ll_selfop_product 两表,并同步在 Lastleg 和海外统一空库基线。按来源账号、货主编码、SKU 和完整资料版本关联,不创建平台客户、收费对象或独立映射表;未知实测尺寸保持 NULL。对 TEST 已有库只审阅并授权这两张新表的 CREATE,不能重放统一初始化文件,也不重置采集数据。

历史库存还原基线为 lastleg-service/src/main/resources/db/selfop-inventory-history.sql,新增流水事实、历史日版本和日库存三表;同步 Lastleg 与海外空库基线。仅执行这三表 CREATE,不重放原始库存或销量表。匹配版本复用 sync_task/run/stage 的 INVENTORY_FLOW_HISTORY、INVENTORY_HISTORY_BUILD 与 INVENTORY_FLOW/HISTORY_INPUT,原库存快照不改写。完成三表并部署 Integration、Lastleg、Admin 后,才启用 baiyue.self-operated-analytics.inventory-history-enabled=true;默认关闭,历史目标30日优先再60日。保留当前账号出口、1200ms间隔和所有被历史版本引用的证据;现有销量副本淘汰不得删除这些引用。

预约工作事项新增结构由 lastleg-service/src/main/resources/db/appointment-work.sql 提供五张表:完整范围协调锁、工作关系、不可变历史、承诺影响版本与逐票批次实物分配,已同步 Lastleg 和海外空库初始化入口;对已有 TEST 仅审阅并授权这五表 CREATE 及协调锁初始行。直送目的仓实际卸货独立表由 firstleg/src/main/resources/db/phase3-direct-delivery-schema.sql 提供并同步国内空库入口,不产生海外库存。两项独立写权限见 iam/src/main/resources/db/appointment-work-permissions.sql,先校验精确权限身份再写入;默认只授权平台管理员。旧预约表的有损重建只允许单独审阅 reset-test-fba-appointments.sql;若历史、核实或工作/分配表已存在,前置检查会在 DROP 前拒绝,不能重放或擅自扩大重置范围。以上只维护脚本,不代表已执行或已部署。

唯一入口与区域边界

两个统一 SQL 文件仍只用于空库初始化,名称中的“增量”不表示可向已有业务库重放。已有生产库的受控结构补齐单独放在 migrations/,只允许明确审阅过的增量变更;不提供存量数据回填、清理或兼容入口。

区域 完整入口 服务 schema 表数
国内 头程数据库统一增量-MySQL8.sql baiyue_auth、baiyue_iam、baiyue_order、baiyue_warehouse、baiyue_firstleg、baiyue_file、baiyue_audit、baiyue_finance 226
海外 海外区域统一增量-MySQL8.sql baiyue_lastleg、baiyue_lastlag_warehouse 202
  • 所有服务位于同一测试环境;两份文件只分组组织服务 schema,不代表两个部署区域。baiyue_lastlag_warehouse 保留当前正式的 lastlag 拼写。
  • 两份文件必须在同一测试数据库实例中完成初始化;业务服务仍只访问本服务 schema,经内部接口访问 IAM/Warehouse。已移除事件桥两个 schema 的创建,不对已有数据库执行 DROP。
  • 国内 IAM 是全部平台与客户权限的唯一权威,包括海外仓、海外业务、海外主数据及财务权限;这些权限保留在国内种子中。
  • 车辆成本、报价、出车实测及在途交接表对应Lastleg模块基线;公司车辆费用三表对应Finance模块基线。公司财务权限源为iam/src/main/resources/db/fleet-finance-permissions.sql,已合入国内统一种子,不以模块文件代替完整空库初始化。
  • 外接预订的quote_source_json保存可选销售报价来源版本快照,实际成交价仍在货物快照及agreed_amount中;手填成交价时无报价来源。该字段随Lastleg模块基线与海外统一入口维护,执行状态只见正式部署契约。
  • 异常退回的return_context_json保存取消时所需的原始业务状态;逐来源received_packages累计实际入仓量且不得超过批准退回量。同一派送可以保留多张已取消/已结束的历史退回单,活动退回仍由派送行锁内校验;普通idx_ll_exception_delivery_return替代跨全部历史的唯一索引。数量和状态不能通过回填旧单据伪造。
  • 派送ll_delivery_order.signed_packages保存签收资料确认时冻结的实际签收箱数;NULL表示未确认,不当作全量签收,数量须在0到本次实发箱数之间。后续退回保留原签收历史,不用当前退回量倒改实签。
  • ll_return_stock_receipt与真实退回库存入账同事务保存,按客户/入账流水唯一,保留原订单和出库位置以及实际入仓位置。重派候选、草稿锁及拣货显式引用该凭据;拣货receipt_id与return_receipt_id恰有一个非空。退回不增加原订单箱数,不回退历史出库流水;可重新发运量由实际退回及已消耗凭据核平。
  • 国内 Warehouse 管理包括海外仓在内的公共仓库主档;海外 Warehouse 只保存资源与主档 ID 引用。
  • Gateway、Print、Integration 不新增数据库。Compose 继续使用 SPRING_SQL_INIT_MODE=never,服务启动不执行这些文件。

执行前提与失败边界

  1. 获得目标环境、精确数据库范围的当轮授权。初始化授权不等于清库授权;两个 SQL 本身不删除数据库、表或业务数据。
  2. MySQL 8.0+,目标区域 schema 必须不存在或为空。已有同名表时报错,不使用 CREATE TABLE IF NOT EXISTS 绕过旧结构。
  3. 执行用户需要目标区域建库、建表、索引、引用、触发器及种子插入权限,不需要另一地区的访问权。
  4. 客户端须支持 DELIMITER。完整执行文件,关闭“遇错继续”,禁止 mysql --force。不要选中片段执行,不要前后串行执行模块 SQL。
  5. DDL 隐式提交,不可整体回滚。失败后停止并保留错误;经另行授权准备空库后从头执行,不针对半初始化库追加迁移或从失败行续跑。
  6. Firstleg 测量项与拆分项互为外键:建空表期间暂设会话 foreign_key_checks=0,随后立即恢复 1,再插入种子。失败时关闭连接。两边外键完整保留在 CREATE TABLE 内。

成功时只在最末输出一行 initialization_status=PASS,并带 region=CN/OVERSEAS、initialized_tables=226/199。必须同时确认客户端退出码 0;忽略错误后出现的 PASS 不算成功。

平台管理员密码

国内只初始化一个 platform_admin 及对应 IAM 用户、成员和角色关系,不创建测试客户或客户账号。密码不在源码内置。

在同一连接中,先由安全外部配置设置会话变量 @platform_admin_password_hash,再执行国内文件。值须为实际初始密码生成的 bcrypt 哈希(60 字符);不要传明文、示例哈希或把真实值存进仓库。password_change_required=1,初次登录必须改密。

变量缺失或格式错误会在 Auth 账号插入时被非空约束拒绝;Auth 表可能已创建,属于失败的半初始化,应停止。海外文件不需要密码变量。

本地验收入口读取当前进程环境变量 INIT_PLATFORM_ADMIN_PASSWORD_HASH,经标准输入传入同一 MySQL 会话,不写入命令行、暂存 SQL 或日志。数据库连接认证独立由外部登录配置或 MYSQL_PWD 提供,不要与平台账号密码混淆。

审核保留的系统种子

所属库 保留内容 不包含
Auth / IAM 平台主体、唯一平台管理员、8 个系统角色及企业管理员模板、419 个权限、600 条角色权限、7 个数据范围、客户编号起点;无人工完成订单权限 测试客户、固定客户账号、额外扩权
Warehouse 既有公共仓目录 318 条及地址;义乌、东莞、洛杉矶、纽约 4 个作业仓收货能力 示例供应商、快递、往来单位、托盘、库位、预占、库存
Firstleg 112 个费用项目、15 个渠道目录、7 个始发地别名、4 个公共仓映射 客户报价、订单、入库、实测或履约记录
File / Finance 导出互斥键 GLOBAL_CREATE、默认平台财务主体 文件任务、资金、账单或交易流水
Lastleg 无身份或授权种子;复用统一Auth/IAM会话 客户、订单、库存、发运门禁事实或独立账号

IAM保留subject/tenant持久版本表;安全事件专用Outbox及Lastleg授权投影表已退出新空库基线。旧库不在本次脚本中执行删除或历史回填。

扣货写权限只默认授予平台管理员,与 IAM 扣货权限合同一致;旧脚本重放时通过范围授权额外授予订单运营的那一条关联不进入新基线。

示例 TP-001、TP-002、YW-TP-002、DG-TP-002、A1/A0 库位、EXP-TEST、CAR-001 不再初始化。验收资源通过业务入口配置;既有只复用托盘和库位的造数脚本须先满足各自前置条件,不能默认清库后已存在。

维护规则

  • 空库基线的最终字段、类型、默认值、索引、外键、CHECK、注释直接维护在 CREATE TABLE;64 个国内业务触发器保留最终定义。统一初始化文件不追加 ALTER、迁移过程、动态 DDL、UPDATE 回填或 DELETE 清理段;已有库的受控增量只能放入对应 schema 的 migrations/ 文件,并保持不删数据。
  • 系统种子直接维护最终 INSERT,不保留退役 ID 清理或 ON DUPLICATE KEY UPDATE 升级。权限变更联查 IAM 来源、Controller、OpenAPI 与调用端。
  • 原 权限点初始化-MySQL8.sql 独立补丁已撤销,订单申报权限和默认授权已纳入国内 IAM 基线,不另设存量权限发布入口。
  • 模块 src/main/resources/db/ 用作结构来源和开发追溯,不是区域部署前置;不再向历史迁移文件追加发布步骤。修改当前字段时同步模块有效建表定义及其合同。
  • 不在 SQL 中写入真实客户数据、环境地址、固定密码或 Token。

后续迁移工具(已开始实施)

机制启用前,以上两份统一 SQL 仍是空库初始化入口;本节工具不会把当前可丢弃的开发/测试存量自动转换成迁移链。现有候选迁移包括:

区域 / schema 迁移 目的
CN / baiyue_iam migrations/cn/baiyue_iam/V1__align_schema_baseline.sql、V2__add_pda_release_permissions.sql、V3__align_domestic_pda_mojia_sailing_permissions.sql 收敛客户编号、昵称和资质原文件名定义;补齐 PDA 发布、国内作业仓绑定、墨家 SKU 同步、仓管 PDA 和船期日历权限
CN / baiyue_firstleg migrations/cn/baiyue_firstleg/V1__align_schema_baseline.sql、V2__align_measurement_and_fee_schema.sql、V3__add_customs_receipt_declaration_schema.sql、V4__add_sailing_calendar_schema.sql、V5__event_delivery_retry_audit.sql、V6__event_delivery_attempt.sql、V7__settle_partial_loaded_cargo.sql 收敛一件代发托盘码非空定义;补齐测量/报价、报关、船期和事件重试审计;V7 仅更新装柜明细保护触发器,允许普通箱件按冻结分配和实际拣货精确收敛件数、重量、体积和托数,保留身份及已完成冻结保护,不回填原事件或库存
CN / baiyue_file migrations/cn/baiyue_file/V1__align_schema_baseline.sql、V2__widen_business_type.sql 补齐 PDA 发布表和固定渠道,并支持正式长业务类型
OVERSEAS / baiyue_lastleg migrations/overseas/baiyue_lastleg/V1__align_lastleg_production_schema.sql、V2__align_schema_baseline.sql、V3__relax_valid_nullable_fields.sql、V4__cargo_discard_return_inventory.sql、V5__allow_multiple_relabel_applications.sql、V6__event_delivery_retry_audit.sql、V7__event_delivery_attempt.sql、V8__bind_stock_transfer_relabel_sources.sql 补齐尾程字段、退货/换标/废弃结构与事件投递审计;V8 保存已有库存转运的实际 SKU、原分配和换标明细关联,允许同位置历史与当前分配共存,保留活动占用唯一约束,不回填旧业务或库存
OVERSEAS / baiyue_lastlag_warehouse migrations/overseas/baiyue_lastlag_warehouse/V1__add_shared_overflow_location.sql、V2__retire_location_zone_and_rebuild_query_index.sql 补齐共享溢出库位并移除退役 zone_code;V2 含 DROP COLUMN,生产执行必须单独授权并确认无外部依赖

候选编写和离线检查不证明环境已执行;测试环境执行事实只维护在 ../../../docs/测试环境单机部署与配置契约.md,生产执行须另有明确授权。db-migrations.mjs plan --services iam,firstleg,lastleg-service,warehouse-overseas-service --regions CN,OVERSEAS 生成的 manifest 目标版本应为 baiyue_iam=3、baiyue_firstleg=7、baiyue_lastleg=8、baiyue_lastlag_warehouse=2。测试通过后必须复用同一份 SQL 和 manifest 晋级生产,不得重新生成或修改候选。scripts/prod-database-schema-acceptance.mjs 仍只负责历史尾程 V1 的专用只读核对/受控执行,不代表本批跨 schema 发布入口;本批按迁移 manifest 管理,实际执行须等待环境执行器接入或当前轮明确授权后的受控人工执行。

迁移范围映射位于 migration-scopes.json,按区域、schema、所属服务和顺序登记。迁移文件位于 migrations/{cn|overseas}/<schema>/,一个文件只允许修改一个 schema。目录中的 .gitkeep 仅用于保留空目录,不是迁移文件。

完整操作请先读 数据库迁移操作手册。离线入口为 scripts/db-migrations.mjs:

编号统一采用每个 schema 独立递增的 V1、V2、V3……,有 SQL 变更才由工具新增,成功执行后不改内容和编号。功能分支从最新 main 创建,进入测试前同步 main 并解决草稿编号冲突。生产发布另记 release-1、release-2……;该发布编号及分支门禁尚待流水线实现,完整流程见操作手册“编号与功能分支规则”。

# 自动取得该 schema 的下一个整数序号并创建草稿;不连接数据库
node deploy/sql/scripts/db-migrations.mjs new --region CN --schema baiyue_auth --description add_login_audit

# 校验范围、文件名、跨 schema 引用及受保护文件;不连接数据库
node deploy/sql/scripts/db-migrations.mjs check

# 由选中服务自动生成逐库目标和 SQL 哈希;不手填发布 JSON
node deploy/sql/scripts/db-migrations.mjs plan --services auth,iam --regions CN --out release-manifest.json

# 当前只提供安全的只读计划;实际 Flyway 执行需后续阶段显式配置并授权
node deploy/sql/scripts/db-migrations.mjs run --manifest release-manifest.json --dry-run

new 使用独占创建避免并发覆盖;成功历史或已冻结制品不能由普通命令改写。plan 只打包选中服务及评审确认的 schema,不会因为同一提交存在其他区域或服务 SQL 就自动扩大范围。run 的真实 Flyway 执行仍未接入测试数据库和 Jenkins;生产增量由专用验收脚本在当前轮明确授权后执行,不把统一初始化文件用于生产。

墨家原始收件表允许未收到的 weight_kg 为空,不把未知重量补成 0。数据库可空仅用于如实保存收件数据,不代表 SKU 同步已支持无重量;当前上传及 SKU 编辑接口仍要求正数重量,向领星推送也需要完整测量值。

本地验证

离线合同不连接数据库:

node --test scripts/admin-test-env-modules/initialization-baseline-contract.test.mjs scripts/inbound-fee-unified-sql-contract.test.mjs scripts/inbound-hold-unified-sql-contract.test.mjs
.\scripts\local-db-full-acceptance.ps1 -DryRun

获得精确本地库清理授权并配置认证、管理员哈希后,可用 local-db-full-acceptance.ps1 -Port <已授权端口> -ConfirmResetProjectSchemas -Rounds 2。它删除列出的 12 个项目 schema,不得在有待保留数据的实例运行;详见 scripts/README.md。该入口不会自动启动隔离实例。

本次整理使用隔离 MySQL 8.4,国内与海外分别在不存在对方区域 schema 的空库执行两轮,逐表比对整理前最终字段、默认值、索引、约束、注释及业务触发器。SHOW CREATE 的冗余字符集显示与运行态自增计数不视为结构差异;移除示例种子和强制改密是明确行为变更。这不代表已部署或完成真实 HTTP 验收。

码头车队邮件配置见 Firstleg 车队邮件。

migrations/overseas/baiyue_lastleg/V24__cargo_discard_photos.sql 仅新增废弃照片关联表,按客户、申请和托盘关联文件及提交时间。与 Lastleg、File 和三端照片功能共同发布;不回填历史废弃单,不修改库存。脚本存在不表示目标环境已执行。

自营库存周转后端导出权限见 selfop-turnover-export-permission.sql,仅新增 platform:self-operated-analytics:export 并授予平台管理员;同步 IAM 自营权限源及国内统一基线。配套部署 Lastleg、File、Admin,File 注册 SELFOP_INVENTORY_TURNOVER(Nacos同名配置同步);无业务建表及采集配置变更。执行前须逐项授权。

货物废弃通用库存与散箱字段迁移:migrations/overseas/baiyue_lastleg/V25__cargo_discard_generic_inventory.sql。新增库存仓位关联及箱唛快照,须先迁移再部署 Lastleg;不回填历史废弃单。