-
Notifications
You must be signed in to change notification settings - Fork 0
15 v1 data model draft
本文档把已确认的业务规则转换为数据库实体、关键字段和约束,供后续技术评审使用。它不是建表 SQL,不会直接修改数据库;最终表名、字段类型和索引需结合 CRMEB 现有模型、命名规范和数据量再次确认。
- 复用 CRMEB 的用户、商户、商品、SKU、订单、支付、退款、物流、余额和基础财务能力。
- 农业资产、生产批次、云仓批次和用户持仓使用独立业务表,不硬塞进普通商品表。
- 云仓扩展优先通过独立表关联
eb_store_order和eb_store_order_product,避免直接扩大现有product_type、activity_type对全系统的影响。 - 配置与历史快照分开保存。配置修改不影响已付款订单。
- 汇总字段用于查询,流水表用于证明事实;汇总可重算,流水不可物理删除。
- 金额、数量、比例、时间和状态均使用明确字段,不把核心结算事实只存在 JSON 中。
- JSON 只用于低频扩展快照、展示材料或第三方原始回执。
- 所有支付回调、库存变化、节点结算、回购和冲正都有业务唯一键,支持幂等。
- 法律、税务和会计科目不在本轮建模范围;支付、退款、结算和账本技术事实仍需完整记录。
| CRMEB 对象 | 复用目的 | 智慧农业关联方式 |
|---|---|---|
| 用户 | 购买人、租地/认养参与者、云仓持仓人 | 保存 user_id
|
| 商户 | 普通商品与云仓商品供货方 | 保存 merchant_id
|
| 商品/SPU | 普通销售和活动商品来源 | 保存 product_id
|
| SKU/规格 | 库存和活动批次最小商品粒度 | 保存来源 SKU 当前主键和 unique 快照;业务使用独立 activity_sku_id
|
eb_store_order |
支付、订单汇总、退款、物流入口 | 通过业务扩展表一对一/一对多关联 |
eb_store_order_product |
订单明细和商品金额 | 通过订单明细扩展表一对一关联 |
| 退款/售后单 | 首次交易、二次零售、农业履约售后 | 保存退款单 ID 和影响金额 |
| 地址/物流 | 邮寄到家与普通商品履约 | 复用地址快照、发货和物流轨迹 |
| 用户余额/账单 | 用户本金、收益和回购款入账 | 账本审核后调用,不替代业务账本 |
| 商户财务 | 商户供货货款结算和提现 | 关联独立供货账本 |
除纯关联流水外,新增主表建议统一包含:
| 字段 | 建议 | 说明 |
|---|---|---|
<entity>_id |
bigint unsigned |
领域主键,沿用 CRMEB 显式主键命名 |
status |
小整数或稳定字符串码 | 业务状态 |
is_del / delete_time
|
布尔/时间 | 仅业务主数据软删除;流水表不设删除入口 |
create_time |
datetime |
创建时间,沿用现有 CRMEB 字段名 |
update_time |
datetime |
更新时间;现有 BaseModel 默认关闭自动更新时间,写服务需显式维护 |
create_admin_id |
bigint 可空 |
后台创建人;用户/商户对象使用对应操作者字段 |
update_admin_id |
bigint 可空 |
最后后台修改人 |
version |
整数 | 乐观锁或规则版本 |
金额字段统一使用 decimal(14,2),不使用 float/double 保存应付金额。比例保存为整数基点,例如 1250 表示 12.50%;收益计算中间值至少使用 decimal(20,8) 或等价高精度字符串运算,最终入账按分舍入。数量根据商品单位使用 decimal(14,3),不可一律假定整数。
上线前将 eb_user.now_money、eb_user_bill.number/balance、eb_merchant.mer_money 和 eb_financial_record.number 扩为 decimal(14,2),并写入升级前后验证脚本。当前数据库未启用严格 SQL 模式,所有入账服务仍必须显式校验金额、字段容量与更新后的目标余额,不能依赖数据库溢出报错。
业务发生时间继续使用语义明确的 *_at,如 paid_at、maturity_at。物理类型、时区和空值规则已在 34-v1-database-field-dictionary.md 统一冻结,不能在同一业务域混用 Unix 秒和日期字符串。
所有会影响历史交易、金额、权益或公开内容的 JSON 快照统一附带:
| 字段 | 规则 |
|---|---|
snapshot_schema_version |
快照结构版本,smallint unsigned,从 1 开始 |
snapshot_hash |
规范化 JSON 的 SHA-256,char(64)
|
source_version |
生成快照时来源聚合的版本 |
snapshot_created_at |
快照生成时间 |
业务编号字段如 supply_no、holding_no、ledger_no、buyback_no、land_order_no、adoption_order_no、fulfillment_no、event_no、trace_no 均建立唯一索引;编号只用于展示和跨系统定位,不代替数值主键。
地图点位统一使用:
| 字段 | 类型 | 规则 |
|---|---|---|
longitude |
decimal(10,7) |
经度,可空;非空时范围 -180 至 180
|
latitude |
decimal(10,7) |
纬度,可空;非空时范围 -90 至 90
|
coordinate_system |
varchar(8) |
点位存在时固定为 GCJ02
|
经度和纬度必须同时为空或同时非空,禁止以 0,0 代表未配置。新农业表、API 和前端状态只使用 longitude/latitude/coordinate_system;lng、long、lat 只允许出现在旧 CRMEB 适配边界。接口使用十进制字符串返回坐标,不因 JSON 浮点序列化改变有效精度。V1 不保存 GIS 多边形,不建立空间索引,地块面积和占用容量仍以业务数值与事务校验为准。
一条记录表示一场云仓秒杀活动。
| 关键字段 | 说明 |
|---|---|
activity_no |
业务唯一编号 |
name |
活动名称 |
preview_at |
预热时间 |
start_at / end_at
|
抢购开始与结束时间 |
payment_timeout_minutes |
支付超时 |
choice_days_default |
默认去向选择天数 |
status |
草稿、待发布、未开始、进行中、已结束、已关闭 |
publish_at |
发布时间 |
closed_at |
关闭时间 |
索引建议:activity_no 唯一索引,status + start_at + end_at 组合索引。
| 表 | 作用 | 关键字段与约束 |
|---|---|---|
eb_farm_product_agriculture_profile |
CRMEB 商品的一对一农业扩展 |
product_id 唯一、来源类型、农场/供应商、产地、公开说明、供货资格、当前溯源档案、资料状态、提交/审核人和时间、审核备注、版本 |
eb_farm_product_material |
商品资质、报告和证书 | 商品、材料类型、编号、文件附件、出具机构、生效/失效时间、审核状态、版本;索引 product_id + material_type + status + expire_at
|
商品资料保存当前可编辑事实;活动、订单和溯源发布均保存独立快照,不能用商品资料后续修改覆盖历史。
平台/商户商品材料、供货材料、溯源材料和异步结果文件的 attachment_id 逻辑引用 CRMEB 现有 eb_system_attachment.attachment_id,沿用现有租户归属和附件仓库。只有服务/现场端为离线草稿、临时媒体和范围绑定新增 eb_farm_evidence_attachment;两个同名主键属于不同 ID 域,接口不得混收。
商户或平台提交的云仓供货关系。
| 关键字段 | 说明 |
|---|---|
supply_no |
供货申请编号 |
source_type |
平台自营、商户供货 |
merchant_id |
商户供货时必填 |
product_id / source_sku_value_id
|
来源商品与 CRMEB 当前规格值主键 |
source_sku_unique_snapshot |
申请时的规格唯一值快照 |
source_sku_snapshot |
规格名称、图片、编码和单位快照 |
supply_price |
商户供货价 |
proposed_qty |
商户或平台申请的拟供数量;提交阶段不改变库存 |
approved_qty |
平台审核批准数量 |
source_reserved_qty |
已从来源 SKU 可售库存预占、待交付的数量 |
delivered_qty |
已送达平台仓或等价验收点数量 |
accepted_qty |
已验收数量 |
pending_inspection_qty / rejected_qty / shortage_qty
|
待检、拒收与交付短少数量 |
allocated_activity_qty |
已分配给未结束云仓活动的验收数量 |
cloud_available_qty |
已验收且当前未被活动占用的供货库存 |
cancelled_qty / return_pending_qty / returned_qty
|
审核后取消、待实物退回和已恢复来源库存数量 |
platform_acquired_qty |
经明确确认转为平台自有库存的数量 |
fulfillment_type |
预入云仓、平台仓、其他已确认方式 |
shipping_responsible_party |
邮寄履约责任方:平台或商户 |
quality_responsible_party |
质量责任方:平台或商户 |
after_sale_responsible_party |
首次履约售后责任方:平台或商户 |
responsibility_snapshot |
平台审核确认后的责任、时限和扣减规则快照 |
after_sale_days |
首次交易售后观察期 |
status |
草稿、待审核、已驳回、待预占、待交付、验收中、部分验收、已验收、退回中、已关闭、异常 |
audit_by / audit_at / audit_remark
|
审核信息 |
accepted_at |
入库/供货验收完成时间 |
一张供货申请只允许关联一个来源 SKU;批量选择 SKU 时生成多张独立草稿。数量守恒至少满足:
approved_qty
= source_reserved_qty + delivered_qty + shortage_qty + cancelled_qty
delivered_qty
= accepted_qty + rejected_qty + pending_inspection_qty
accepted_qty
= allocated_activity_qty + cloud_available_qty
+ return_pending_qty + returned_qty + platform_acquired_qty
具体等式按当前状态取非负项,不能依赖一个含义模糊的 available_qty。商户实物已进入平台仓时,活动未抢完只先释放活动占用并进入退回流程;完成实物退回或等价库存移交后才增加来源 SKU 可售库存。
| 表 | 作用 | 关键字段与约束 |
|---|---|---|
eb_farm_cloud_supply_delivery |
一次发货/送达事实 |
delivery_no 唯一、supply_id、发出/送达数量、承运信息、发货/送达时间、证据、状态、版本 |
eb_farm_cloud_supply_inspection |
一次收货与质量验收 |
inspection_no 唯一、supply_id、delivery_id、收货量、合格/待检/拒收/短少量、单位、仓库/库位、审核人、状态、版本 |
eb_farm_cloud_supply_material |
供货申请责任和资质材料快照 |
supply_id、材料类型、来源材料 ID、附件、有效期、审核状态、快照版本 |
送达、收货、待检转合格/拒收、实物退回和平台承接必须分别产生业务记录与库存流水。验收数量满足 received_qty = accepted_qty + pending_inspection_qty + rejected_qty;短少量针对批准/发出与实际收货差额单独记录。
| 表 | 作用 | 关键字段与约束 |
|---|---|---|
eb_farm_cloud_supply_return |
一次供货实物退回及商户签收事实 |
return_no 唯一、supply_id、merchant_id、退回原因、退回/发出/签收/差异/恢复来源库存数量、交接方式、承运信息、平台发出和商户确认信息、证据快照、状态、版本 |
eb_farm_cloud_supply_acquisition |
一次平台承接剩余供货并转入平台库存的事实 |
acquisition_no 唯一、supply_id、来源商户、承接数量/单价/总额、目标平台商品与 SKU、计算和证据快照、制单/复核/执行信息、平台库存流水、确定性结果键、状态、版本 |
退回状态固定为 pending_dispatch → in_transit → received/completed,发生数量或质量差异时进入 disputed,不得先恢复来源库存再等待商户确认。returned_qty 只汇总已完成退回记录的 restored_source_qty。
平台承接采用制单、独立复核、执行三段式;只有执行事务成功后才累计 platform_acquired_qty。同一供货可以按不同原因分多次退回或承接,但每次都有独立编号、结果键、数量方程和库存流水,不能仅更新供货汇总字段。
一条记录表示某来源商品参加某场活动的 SPU 级展示和公共去向配置,不直接承担 SKU 价格、库存和结算事实。
| 关键字段 | 说明 |
|---|---|
activity_id |
云仓活动 |
product_id |
CRMEB 商品 |
display_title / cover_image
|
活动展示快照 |
supports_shipping |
是否支持邮寄 |
supports_pickup |
是否支持自提 |
supports_consign |
V1 必须为是 |
choice_days |
选择期限 |
pickup_days |
开放自提时的核销期限 |
rule_version |
规则版本 |
status |
草稿、已发布、已下架 |
唯一约束:同一 activity_id + product_id 不重复。供货来源绑定在活动 SKU,SPU 展示层不得假定多个规格一定来自同一供货申请。
一条记录是用户可抢购的最小活动商品,也是规则冻结和生成批次的稳定来源。CRMEB 商品编辑可能重建规格值,因此历史订单、批次和账本统一关联本表主键,不把来源 value_id 当永久业务主键。
| 关键字段 | 说明 |
|---|---|
activity_sku_id |
云仓活动 SKU 稳定主键;批次、订单、持仓和账本只关联该身份 |
activity_product_id / supply_id
|
活动商品与供货来源 |
source_product_id / source_value_id
|
最近一次核验到的 CRMEB 来源商品和当前规格值行;仅用于来源定位 |
source_unique / source_sku_text
|
最近一次核验的 unique 与规范化规格组合;不作为历史外键 |
source_snapshot / source_snapshot_hash
|
商品名、规格、编码、图片、单位和来源价格快照及其校验摘要 |
source_sync_status / source_checked_at
|
matched、changed、missing、ambiguous、unresolved 及最近核验时间 |
activity_unit_price |
用户首次抢购单价 |
supply_unit_price |
商户供货价快照 |
activity_qty |
本活动 SKU 可抢购数量 |
per_user_limit |
每人限购数量 |
expected_sale_days / maturity_resolution_days
|
预计代销周期,以及到期后在途订单处置宽限期(7 至 60 天,默认 30 天) |
settlement_mode |
final_all、profit_periodic_principal_final、principal_profit_periodic
|
user_profit_rate / platform_profit_rate
|
利润分成基点,合计 10000
|
platform_cost_policy_snapshot |
仓储、物流、营销等平台运营成本由平台承担且不从用户账本扣减的规则说明快照 |
buyback_rate |
到期回购基点 |
primary_after_sale_days |
首次交易观察期 |
secondary_after_sale_days |
二次零售观察期 |
resale_product_id / resale_sku_value_id
|
二次普通商城销售映射,发布前可为空 |
rule_version |
规则版本 |
status |
草稿、可发布、已发布、已关闭 |
唯一约束建议:草稿期使用 activity_product_id + source_snapshot_hash 防止重复选入同一来源规格;activity_sku_id 一经生成永久不复用。发布前必须重新核验来源,missing、ambiguous、unresolved 均禁止发布。发布后页面和业务计算只读活动快照,来源商品变化只产生告警,不得覆盖订单金额、周期、分成和回购规则。
按活动 SKU 与用户锁定限购额度,避免只在下单前统计历史订单造成并发超购。
| 关键字段 | 说明 |
|---|---|
activity_sku_id / user_id
|
限购主体,组合唯一 |
limit_qty |
下单时规则快照限额 |
locked_unpaid_qty / paid_qty / refunded_qty
|
未支付锁定、已付款和已退数量 |
version |
条件更新版本 |
可继续购买量按 limit_qty - locked_unpaid_qty - paid_qty + refunded_qty 计算,并与批次库存锁在同一创建订单事务。V1 首次抢购优惠固定关闭,订单仍保存 gross_goods_amount、discount_amount=0 和 principal_amount=gross_goods_amount 供审计。
每场活动的每个 SKU 一条记录,是云仓经营核心表。
| 关键字段 | 说明 |
|---|---|
batch_no |
批次唯一编号 |
activity_id / activity_product_id / activity_sku_id
|
来源活动与稳定活动 SKU |
source_product_id / source_value_id
|
CRMEB 来源商品和发布时规格值诊断引用 |
source_unique / source_snapshot
|
来源规格标识与发布展示快照 |
supply_id / merchant_id
|
供货来源 |
resale_stock_id |
批次开始后关联的二次销售库存桥接 |
purchase_unit_price |
用户云仓抢购单价快照 |
supply_unit_price |
商户供货价快照 |
activity_qty |
活动预占数量 |
locked_unpaid_qty |
未付款锁定数量汇总 |
gross_paid_qty / primary_refunded_qty / net_paid_qty
|
首次付款毛量、首次退款量和净有效付款量 |
shipping_qty |
邮寄去向数量 |
pickup_qty |
自提去向数量 |
consign_qty |
冻结代销数量 |
secondary_locked_qty |
二次零售锁定数量 |
gross_effective_sold_qty / secondary_reversed_qty / net_effective_sold_qty
|
二次有效销售毛量、后续退款/冲减量和净有效销售量 |
buyback_qty |
到期回购数量 |
remaining_qty |
二次可售池的冗余汇总,以库存池余额为准 |
confirmed_sales_amount |
累计确认销售收入 |
distributable_profit |
累计可分配销售利润 |
platform_operating_cost_amount |
已确认的平台经营成本汇总,仅用于平台经营分析,不参与用户应得金额扣减 |
platform_cost_snapshot |
成本类型、来源和更新时间说明;不得混入用户账本 total_amount 公式 |
choice_deadline_at |
去向选择截止 |
consign_start_at |
代销开始 |
maturity_at |
到期时间 |
maturity_grace_deadline_at / ownership_cutover_at
|
在途处置宽限截止和平台承接未生效销售的所有权切换点 |
platform_assumed_inflight_qty |
宽限截止仍未成为有效售出的二次订单数量,由平台承接后续收入与退款风险 |
closed_at |
批次关闭时间 |
current_milestone |
已处理的最高触发节点:0、25、50、75、100;不等同于真实 progress_rate
|
settlement_mode / user_profit_rate / buyback_rate
|
批次快照 |
status |
批次状态 |
索引建议:
-
batch_no唯一索引。 -
resale_stock_id + status + maturity_at用于最早到期分配。 -
activity_id + activity_product_id用于活动汇总。 - 汇总数量更新使用版本号或数据库原子条件,防止超卖。
每个批次按明确库存池保存当前余额,批次主表只保留页面高频汇总。
| 关键字段 | 说明 |
|---|---|
batch_id / pool_code
|
批次与库存池,组合唯一 |
qty |
当前非负余额 |
version |
条件更新版本 |
last_flow_id |
最近库存流水 |
V1 固定库存池至少包括:activity_available、primary_unpaid_locked、paid_waiting_choice、shipping_fulfillment、pickup_fulfillment、consign_frozen、resale_available、resale_locked、resale_observing、after_sale_frozen、buyback_pending、platform_buyback_stock、released_to_source。池间转移必须通过同一事务中的不可变流水完成,不直接修改一个含义模糊的“库存”字段。
记录每次库存事实变化。
| 关键字段 | 说明 |
|---|---|
flow_no |
流水唯一编号 |
supply_id / activity_sku_id / batch_id
|
所属供货、活动 SKU 和批次,按阶段可空;批次生成前也可记录供货事实 |
warehouse_id / location_id
|
平台仓或等价验收位置,可空 |
pool_from / pool_to
|
来源库存池和目标库存池 |
unit_code / change_qty
|
单位与变化数量,数量为正数 |
before_qty / after_qty
|
本次目标池或约定核对池的前后余额快照 |
business_type |
活动预占、下单锁定、支付确认、超时释放、去向冻结、二次锁定、有效售出、退款、回购等 |
business_id |
对应订单、明细、退款或回购 ID |
idempotency_key |
幂等唯一键 |
occurred_at |
业务发生时间 |
idempotency_key 必须唯一。supply_id、activity_sku_id、batch_id 至少有一个非空;同一流水的单位不得与来源供货或活动 SKU 快照不一致。
与 eb_store_order_product 一对一,保存云仓首次购买快照和去向状态。
| 关键字段 | 说明 |
|---|---|
group_order_id / order_id / order_product_id
|
CRMEB 订单组、子订单和明细 |
user_id |
首次购买用户 |
activity_id / activity_product_id / activity_sku_id / batch_id
|
云仓来源 |
product_id / source_sku_value_id
|
来源商品与规格值关联 |
sku_snapshot |
下单时规格、编码、图片和单位快照 |
purchase_unit_price |
抢购单价 |
purchase_qty |
本明细购买数量 |
gross_goods_amount / discount_amount / principal_amount
|
原商品额、首次优惠和用户本金;V1 强制 discount_amount=0
|
goods_paid_amount |
用户商品实付,不含后补运费,V1 等于 principal_amount
|
disposition |
未选择、邮寄、自提、代销 |
choice_status |
待选择、用户已选、系统自动选择 |
choice_version |
去向命令乐观锁版本 |
choice_deadline_at |
选择截止 |
choice_at / choice_operator_type
|
选择时间和操作者 |
current_freight_order_id |
当前待支付/已生效运费单;历史单通过反向关系查询 |
freight_status / freight_amount
|
当前补运费状态和最终实付快照 |
pickup_deadline_at |
自提截止时间,按去向最终确认后 1 至 30 个自然日计算 |
primary_completed_at |
整个明细的全部数量均完成邮寄、自提核销、退款、改寄、异常回购或代销入批次后的完成时间 |
primary_settlement_eligible_at |
首次售后观察期到期时间 |
primary_refund_status / primary_refund_qty
|
首次退款状态与数量 |
shipping_fulfillment_id / pickup_id
|
邮寄履约或云仓自提关联,按最终去向二选一 |
holding_id |
代销时关联用户持仓 |
rule_snapshot |
页面展示所需完整规则 JSON 快照 |
status |
首次明细状态 |
唯一约束:order_product_id 唯一。数据库约束或服务校验确保 disposition 只能有一个值。
邮寄到家时的补运费支付单。
| 关键字段 | 说明 |
|---|---|
freight_order_no |
全局唯一商户订单号,同时作为支付 order_sn
|
cloud_order_item_id |
云仓首次明细 |
user_id |
付款用户 |
choice_version / quote_version
|
创建时的去向版本与报价版本 |
address_snapshot |
地址快照 |
freight_template_id / freight_rule_snapshot
|
CRMEB 运费模板和命中规则快照 |
charge_basis_snapshot / quote_hash
|
数量、重量、体积、区域和报价防篡改摘要 |
freight_amount |
应付运费 |
paid_amount |
实付运费 |
business_status |
待支付、邮寄已确认、已取消、已超时、异常 |
pay_status / pay_time
|
未支付、支付中、已支付、迟到支付、退款处理中、已退款 |
pay_type / pay_driver
|
用户支付方式与微信/支付宝/余额驱动 |
provider_transaction_id |
渠道交易号;余额支付为空 |
callback_amount / callback_at
|
规范化回调金额和首次有效回调时间 |
close_status |
无需关单、待关单、已关单、关单失败、不支持 |
expired_at |
min(创建时间 + 活动支付超时, choice_deadline_at);超过该点的成功回调只进入迟到退款 |
refund_status / refund_amount
|
无退款、处理中、成功、失败待重试、人工复核及累计退款额 |
version / error_code / error_message
|
并发版本与最后异常 |
created_at / updated_at / cancelled_at
|
审计时间 |
唯一约束:freight_order_no、非空 provider_transaction_id 分别唯一。服务在锁定 eb_farm_cloud_order_item 后替换 current_freight_order_id,确保同一明细任一时刻只有一张当前待支付运费单;切换渠道必须取消旧单并生成新单号。
支付回调标识固定为 farm_cloud_freight。原云仓商品订单金额、优惠、供货货款和用户本金均不包含本表金额。
补运费全额退款记录。V1 一张运费单最多存在一张有效退款单,失败重试复用同一退款单号。
| 关键字段 | 说明 |
|---|---|
freight_refund_no |
全局唯一退款单号,渠道重试幂等键 |
freight_order_id |
原运费单 |
user_id |
退款用户 |
reason_type / reason_snapshot
|
迟到支付、首次订单退款、平台取消、重复/错误支付等 |
refund_amount |
固定等于该运费单有效实付金额 |
pay_type / pay_driver
|
复用原支付方式与驱动 |
provider_refund_id |
渠道退款编号 |
status |
待提交、处理中、成功、失败待重试、人工复核 |
attempt_count / next_retry_at
|
重试控制 |
requested_at / completed_at
|
提交与完成时间 |
operator_type / operator_id
|
系统、平台客服或管理员 |
error_code / error_message
|
最后失败信息 |
唯一约束:freight_refund_no、freight_order_id。余额退款在本地事务内增加用户余额并写 UserBill(type=farm_cloud_freight_refund);在线退款按原支付商户订单号和本退款单号调用 CRMEB 支付驱动。
云仓首次购买的自提履约和核销凭证。农业租地/认养产出在 V1 只邮寄,不复用本表。
| 关键字段 | 说明 |
|---|---|
pickup_no |
自提履约编号,唯一 |
cloud_order_item_id / user_id
|
一条首次明细与本人 |
pickup_point_id / pickup_point_snapshot
|
网点及确认时快照 |
pickup_qty / verified_qty / remaining_qty
|
应提、累计已核销和当前剩余数量 |
refunded_qty / converted_shipping_qty / exception_buyback_qty
|
逾期剩余量通过退款、改寄或异常回购完成的数量 |
voucher_code_hash / voucher_version
|
不保存明文核销码;重新签发递增版本 |
valid_from / expires_at
|
凭证有效期 |
last_verified_by_type / last_verified_by_id / last_verified_at
|
最近一次核销主体与时间;完整历史见核销流水 |
overdue_at / exception_event_id
|
逾期事实及协同异常 |
status / version
|
待生效、待核销、部分已核销、已核销、逾期、异常、已取消 |
自提表自身状态码固定为 pending/partially_verified/verified/overdue/exception/cancelled;首次订单明细使用对应的 pickup_pending/pickup_partially_verified/completed/pickup_overdue,两张表不得混用状态字符串。唯一约束:cloud_order_item_id 只能有一张未取消的有效自提记录,voucher_code_hash + voucher_version 唯一。remaining_qty = pickup_qty - verified_qty - refunded_qty - converted_shipping_qty - exception_buyback_qty;核销接口同时校验本人订单、凭证版本、有效期、状态、服务人员范围、剩余量和幂等键。
保存每次自提核销的不可变事实:pickup_id、verification_no、verified_qty、核销前后累计量、凭证版本、服务人员、网点、幂等键、发生时间和证据摘要。verification_no、idempotency_key 分别唯一;任何冲销均新增反向核销记录,不覆盖原记录。
用户在一个云仓批次中的代销持仓。一个订单明细对应一条持仓;不建议把同批次多订单强行合并,以保留各自规则快照和退款来源。
| 关键字段 | 说明 |
|---|---|
holding_no |
持仓编号 |
user_id |
持仓用户 |
batch_id |
云仓批次 |
cloud_order_item_id |
来源首次订单明细 |
initial_qty |
初始代销数量 |
active_qty |
当前有效参与分摊数量 |
sold_equivalent_qty |
按批次整数有效售出量和持仓占比计算的累计已售经济等价数量,decimal(20,6)
|
unsold_equivalent_qty |
按批次最终整数未售量和持仓占比计算的最终未售经济等价数量,decimal(20,6)
|
buyback_equivalent_qty |
参与回购金额池分配的经济等价数量,decimal(20,6)
|
unit_principal |
单位本金 |
total_principal |
初始本金 |
returned_principal |
累计已返本金 |
recognized_profit |
累计已确认用户收益 |
settled_profit |
累计已结算收益 |
buyback_amount |
累计回购款 |
normal_refund_offset_amount / platform_risk_absorbed_amount
|
二次正常售后先抵扣同持仓未来应付,最终不足由平台承担的金额 |
settlement_mode / user_profit_rate / buyback_rate
|
规则快照 |
status |
待入批次、代销中、结算中、已完成、冻结 |
索引建议:user_id + status、batch_id + status、cloud_order_item_id 唯一。
实体库存、批次有效售出和批次回购量必须为整数;持仓的三个经济等价数量只参与比例、展示和金额分配。金额先形成批次池,再按持仓占比和最大余数法分到分,不能由经济等价数量先舍入反推实物。
把 CRMEB 首次退款与活动/来源库存、供货货款和去向冻结的影响拆成不可变记录。
| 关键字段 | 说明 |
|---|---|
refund_order_id / cloud_order_item_id
|
CRMEB 退款与云仓明细 |
refund_qty / refund_principal_amount
|
首次退款数量与本金 |
activity_return_qty / source_return_qty
|
回活动池或来源退回流程的数量 |
merchant_ledger_adjustment_id |
商户货款扣减/冲正关联 |
disposition_snapshot / inventory_snapshot
|
退款时去向和库存阶段 |
idempotency_key / status / occurred_at
|
唯一结果、处理状态和时间 |
唯一约束:refund_order_id + cloud_order_item_id。原退款单变化时新增版本/冲正记录,不覆盖已生效影响。
连接 CRMEB 普通商品 SKU 与一个或多个云仓批次的二次可售库存桥接表。它只提供普通商城销售入口和库存汇总,不能代替批次库存流水。
| 关键字段 | 说明 |
|---|---|
resale_stock_no |
业务唯一编号 |
resale_product_id / resale_sku_value_id
|
普通商城二次代销商品与规格值 |
resale_sku_unique_snapshot |
映射时规格唯一值快照 |
stock_source |
V1 固定为 cloud_only
|
published_qty |
已从代销批次发布到普通商城的累计数量 |
available_qty |
当前可供普通订单锁定的云仓数量 |
locked_qty |
已创建普通订单但尚未释放/生效的数量 |
effective_sold_qty |
已过二次售后观察期的有效数量 |
returned_qty |
退款、释放或回购后退出二次销售的数量 |
is_visible / is_saleable
|
普通商城展示与下单开关 |
last_reconciled_at |
与 CRMEB SKU 库存最近对账时间 |
version |
并发版本 |
status |
草稿、可售、暂停、到期清理、关闭 |
唯一约束建议:resale_product_id + resale_sku_value_id。V1 禁止同一映射 SKU 同时销售普通库存和云仓库存;普通商城展示库存与本表 available_qty 必须可对账。
把普通 CRMEB 二次零售订单明细分配到云仓批次。
| 关键字段 | 说明 |
|---|---|
secondary_group_order_id / secondary_order_id / secondary_order_product_id
|
二次零售订单组、子订单与明细 |
resale_stock_id |
下单时命中的 cloud_only 映射库存 |
batch_id |
被分配的云仓批次 |
allocated_qty |
分配数量 |
goods_paid_amount |
该分配对应商品实付金额 |
platform_subsidy_amount |
平台券/补贴加回金额 |
recognized_sales_amount |
售后观察期结束后确认的销售收入 |
gross_effective_qty / reversed_qty / net_effective_qty
|
有效销售毛量、后续冲减量和净量 |
effective_at |
转为有效代销售出的时间 |
status |
已锁定、履约中、观察期、有效、退款、已释放 |
一个二次订单明细可拆分到多个批次,因此唯一键建议使用 secondary_order_product_id + batch_id。
二次退款按原 FEFO 分配反向落到批次,不能只修改分配表累计字段。
| 关键字段 | 说明 |
|---|---|
secondary_refund_order_id / secondary_order_product_id
|
CRMEB 二次退款来源 |
resale_allocation_id / batch_id
|
原分配和批次 |
refund_qty / refund_goods_amount / platform_subsidy_reversal
|
数量、商品退款和补贴冲减 |
recognized_sales_reversal |
批次确认收入冲减 |
status / effective_at / idempotency_key
|
冻结、已完成、作废及唯一结果 |
唯一约束:secondary_refund_order_id + resale_allocation_id。
记录每次累计进度快照,便于审计和重算对比。
| 关键字段 | 说明 |
|---|---|
batch_id |
云仓批次 |
trigger_type / trigger_id
|
二次订单生效、退款、回购、人工复核等 |
effective_sold_qty |
当时累计有效销售数量 |
consign_qty |
冻结代销数量 |
progress_rate |
累计进度 |
confirmed_sales_amount |
累计确认销售收入 |
sold_principal_amount |
累计已售本金 |
distributable_profit |
累计可分配利润 |
previous_milestone / reached_milestone
|
本次计算前已处理节点、本次达到的最高节点 |
crossed_milestones |
本次跨越的节点快照,如 [25,50,75];只用于审计,不驱动多笔重复账本 |
is_settlement_trigger |
是否首次跨过尚未处理节点 |
calculation_version |
计算规则版本 |
idempotency_key |
唯一幂等键 |
progress_rate 始终保存真实累计销售进度。节点只负责触发:例如 20% → 80% 的进度快照保存 progress_rate=80%、previous_milestone=0、reached_milestone=75 和 crossed_milestones=[25,50,75],结算任务只按真实 80% 累计结果生成一组差额账本。
用户云仓业务账本,不直接等同于 CRMEB 用户余额流水。
| 关键字段 | 说明 |
|---|---|
ledger_no |
账本编号 |
user_id / holding_id / batch_id
|
结算主体和来源 |
ledger_type |
本金返还、收益、回购款、贷记调整、借方冲正;一行只表达一种经济类型 |
milestone |
最高触发节点:0、25、50、75、100、最终 |
direction / amount
|
贷记或借记及本次正数金额 |
cumulative_effective_qty / cumulative_due_amount
|
本次计算时累计有效数量与该类型累计应得 |
historical_ledger_amount / pending_posting_amount
|
已生成历史账本及尚未正式入账金额 |
rounding_adjustment_amount |
最终节点吸收的合法尾差 |
calculation_version |
计算规则与重算版本 |
calculation_snapshot |
真实累计进度、跨越节点、输入、公式结果和版本 |
platform_cost_policy_snapshot |
只读说明平台运营成本承担口径;不得作为用户借方扣减项 |
ledger_status |
待校验、可入账、待审核、冻结、已结算、已冲正、作废 |
posting_status |
未入账、处理中、成功、失败、待追偿 |
posting_id |
对应 eb_farm_financial_posting
|
balance_bill_id |
成功入用户余额后的 CRMEB 流水冗余关联 |
idempotency_key |
批次+持仓+最高触发节点+计算版本+账本类型唯一 |
settled_at |
完成时间 |
本金累计值不直接使用“单位价 × 本次分摊小数数量”反复舍入,而按 total_principal × cumulative_effective_qty ÷ initial_qty 高精度计算,再用累计差额生成账本,最终节点吸收尾差。数据库约束和领域服务共同保证 amount > 0,一个账本行只对应一个 ledger_type;冻结/解冻属于账本状态迁移和状态历史,不伪装成零金额经济账本。
| 关键字段 | 说明 |
|---|---|
buyback_no |
回购单号 |
batch_id / holding_id / user_id
|
来源 |
remaining_equivalent_qty |
用户最终未售经济等价数量,decimal(20,6);批次级实物回购量仍为整数 |
unit_principal |
用户抢购单价 |
buyback_rate |
快照比例 |
buyback_amount |
回购金额 |
calculation_snapshot / calculation_version
|
最终未售、比例、尾差和规则版本 |
target_platform_product_id / target_platform_sku_id
|
回购后平台库存目标 |
platform_stock_flow_id |
转入平台库存流水 |
ledger_id |
用户回购账本 |
prepared_by / prepared_at
|
自动计算或人工重算事实 |
reviewed_by / reviewed_at / review_remark
|
审核 |
executed_by / executed_at
|
执行 |
failure_step / last_error
|
失败步骤和诊断 |
status |
prepared、pending_review、approved、rejected、executing、execution_failed、posting_pending、succeeded、frozen、void
|
version / completed_at
|
乐观锁与完成时间 |
唯一约束:holding_id。批次到期停止新分配,在 maturity_grace_deadline_at 后把仍未成为有效售出的整数实物量转入不可售 buyback_pending 池并自动生成回购预案;V1 必须人工审核。驳回只允许修正数量事实、订单关联或计算版本,禁止修改发布规则快照。审核通过后的回购业务账本、平台库存转入、所有权切换、回购状态和 Outbox 在同一数据库事务完成;事务失败全部回滚并保持可用原幂等键重试,正式余额 posting 和通知在提交后执行。普通小额自动入账阈值只影响已审核回购账本的资金映射,不跳过回购审核。
商户云仓供货货款账本。
| 关键字段 | 说明 |
|---|---|
ledger_no |
账本编号 |
merchant_id / supply_id / batch_id
|
结算主体和来源 |
cloud_order_item_id |
首次购买明细 |
effective_qty |
有效首次购买数量 |
supply_unit_price |
供货价快照 |
gross_supply_amount |
供货价 × 有效数量 |
refund_deduction |
首次退款扣减 |
merchant_charge_amount |
约定由商户承担的履约扣减 |
settle_amount |
应结算货款 |
warehouse_accepted_at |
入库/验收时间 |
primary_completed_at / after_sale_end_at
|
首次购买按去向完成及观察期结束时间 |
eligible_at / eligible_reason
|
实际取得结算资格时间与原因 |
freeze_reason / dispute_status
|
冻结、退款争议和责任扣减状态 |
calculation_snapshot / ledger_version
|
数量、供货价、责任扣减与规则快照 |
ledger_status |
待条件、可入单、已入单、冻结、已结算、已冲正、作废 |
statement_item_id |
商户结单明细 |
posting_id |
结单成功入账时对应的统一入账记录 |
financial_record_id |
CRMEB 商户财务流水冗余关联 |
idempotency_key |
唯一 |
settled_at |
实际进入商户可用余额的时间 |
商户供货货款按自然日生成结单,不复用普通订单对账单。
| 表 | 核心字段与约束 |
|---|---|
eb_farm_merchant_supply_statement |
statement_no 唯一、merchant_id、period_start/end、ledger_count、gross_amount、deduction_amount、settle_amount、posting_id、financial_record_id、version、status、generated_at、posted_at
|
eb_farm_merchant_supply_statement_item |
statement_id、merchant_supply_ledger_id 唯一、数量、供货价、毛额、扣减、结算额和账本快照 |
默认每日 02:00 汇总前一自然日 eligible_at 已到且未入单的账本。结单生成后不替换明细;差异进入调整单和后续结单。
用户和商户业务账本映射 CRMEB 最终账户的统一入账桥接。
| 关键字段 | 说明 |
|---|---|
posting_no / posting_key
|
展示编号与全局唯一幂等键 |
source_type / source_id / source_version
|
用户账本或商户结单来源 |
target_account_type / target_id
|
user_now_money 或 merchant_mer_money
|
direction |
贷记、借记 |
amount |
本次入账金额 |
reversal_of_posting_id |
冲正时关联原成功记录 |
status |
待处理、处理中、成功、失败、待追偿、作废 |
balance_before / balance_after
|
目标账户入账前后余额 |
crm_bill_type / crm_bill_id
|
user_bill 或 financial_record 及其主键 |
attempt_count / last_error_code / last_error_message
|
重试与失败诊断 |
next_retry_at / lease_owner / lease_until
|
扫描重试与处理租约 |
requested_at / processing_at / posted_at
|
生命周期时间 |
operator_type / operator_id
|
自动任务或人工复核操作者 |
唯一约束:posting_key。同一 reversal_of_posting_id 的同版本反向入账也需唯一。成功记录不可更新金额或物理删除。
账本冲正、补记和人工差异修复申请。它保存“申请与审核事实”,最终金额由后端基于目标账本和当前数据重算,不能由前端直接指定后落账。
| 关键字段 | 说明 |
|---|---|
adjustment_no |
唯一申请编号 |
target_type / target_id
|
用户账本、商户账本、回购单等 |
adjustment_type |
冲正、补记、解冻、作废 |
reason / evidence
|
原因和证据 |
preview_snapshot |
申请时差异和公式预览 |
requested_by / requested_at
|
申请人和时间 |
audited_by / audited_at
|
审核人和时间 |
audit_remark |
审核意见 |
executed_ledger_id |
实际生成的差额/冲正账本 |
version |
乐观锁 |
status |
待审核、通过、驳回、执行中、已执行、失败、作废 |
同一申请只能执行一次;申请人与审核人应按高风险权限矩阵分离。
| 表 | 核心字段 | 点位与公开规则 |
|---|---|---|
eb_farm_farm |
farm_no、名称、省市区编码、公开地址、详细地址、介绍、封面、负责人、longitude、latitude、coordinate_system、状态、版本 |
启用前必须有真实 GCJ02 点位;用户端只返回公开地址和公开点位 |
eb_farm_zone |
农场 ID、区域编号、名称、用途、面积、示意图、可选中心点、状态、版本 | 默认继承农场公开点位;中心点仅供内部定位,不作为容量依据 |
eb_farm_plot |
农场 ID、区域 ID、地块编号、面积、可租面积、土壤/用途、位置描述、示意图、可选中心点、状态、版本 | 用户展示地块编号和示意图,默认不公开精确中心点 |
farm_no 全局唯一,区域编号和地块编号分别在同一农场内唯一。所有可选中心点也必须遵守公共坐标规范;没有点位时通过农场点位、位置描述和示意图完成展示。
V1 不把 warehouse_id 或 warehouse_location_id 当作无来源数字。仓库和库位作为农场详情中的管理标签页维护,不新增独立 P0 页面编号。
| 表 | 核心字段与约束 |
|---|---|
eb_farm_warehouse |
warehouse_no 全局唯一、农场、名称、类型、负责人、内部地址、可选 GCJ02 点位、温控/用途说明、状态、版本 |
eb_farm_warehouse_location |
仓库、location_no、名称、区域/货架/层位、允许品类、容量说明、状态、版本;warehouse_id + location_no 唯一 |
启用中的库存、产出、履约或退回任务引用仓库/库位时不得删除,只能停用;停用前必须确认没有待入库、待拣货、待退回和有效库存。仓库精确地址、库位和容量只供平台/现场端按范围使用,不进入用户公开接口。
V1 仅承载云仓首次购买自提。租地和认养产出只支持邮寄,不开放农业产出自提。
| 关键字段 | 建议类型/规则 |
|---|---|
pickup_point_no |
varchar(32),业务唯一编号 |
owner_type / owner_id
|
预留平台或商户归属;V1 只开放平台维护 |
business_types |
V1 固定为 cloud;保留结构扩展能力但不得配置 farm_output
|
name |
对用户展示的自提点名称 |
province_code / city_code / district_code
|
复用 CRMEB 行政区域编码 |
public_address / detail_address
|
公开地址与内部补充地址 |
business_hours |
结构化营业时段,不只保存自由文本 |
contact_name / contact_phone
|
内部原值;用户接口按规则脱敏 |
longitude / latitude / coordinate_system
|
启用前必须为有效 GCJ02 点位 |
status / version
|
草稿、启用、停用及乐观锁版本 |
云仓活动和履约单只保存 pickup_point_id 及下单/确认时的名称、地址、营业时间、联系方式和点位快照。后续网点修改不得改变已生成凭证。索引建议:pickup_point_no 唯一索引,status + owner_type + owner_id 组合索引。
物理地块的一次占用周期。
| 关键字段 | 说明 |
|---|---|
occupancy_no |
占用/预留业务编号,唯一 |
plot_id |
真实地块 |
land_order_id |
租地业务订单 |
planting_batch_id |
种植批次 |
allocation_type |
整块、面积份额 |
occupied_area |
占用面积 |
start_at / end_at
|
计划占用时间 |
reservation_token_hash / reserved_by
|
临时预留令牌摘要和操作者 |
locked_at / lock_expires_at
|
预留开始和默认 5 分钟失效时间 |
actual_end_at |
实际释放时间 |
status / version
|
预留、已确认、使用中、已释放、已过期、冻结、取消及乐观锁 |
候选查询不占容量;用户点击“锁定”后创建 5 分钟预留,确认时锁定租地订单和地块主行、校验令牌/订单版本/占用版本并重查时间重叠与容量,再把预留转为已确认。用户可显式释放,超时任务按 status + lock_expires_at + occupancy_id 游标释放。索引 plot_id + status + start_at + end_at 支持重叠检查;服务仍必须在事务中锁地块主行,不能只依赖查询结果。
| 表 | 核心字段 |
|---|---|
eb_farm_crop |
作物名称、品种、预计周期、单位、图片、状态 |
eb_farm_land_plan |
套餐名称、农场/区域范围、分配方式、面积、周期、价格、服务/交付价值拆分、交付数量/最低数量、交付单位、延期容忍期、邮寄和异常规则、状态、版本 |
套餐与可选作物建议使用关联表 eb_farm_land_plan_crop。
与 CRMEB 订单/订单明细关联的租地业务扩展。
| 关键字段 | 说明 |
|---|---|
land_order_no |
业务编号 |
order_id / order_product_id
|
CRMEB 交易关联 |
user_id / plan_id / crop_id
|
用户选择 |
current_occupancy_id |
当前有效地块占用 |
promised_qty / promised_unit
|
交付承诺快照 |
delivered_qty / refunded_unfulfilled_qty
|
已履约与未履约退款 |
service_refund_base_amount / delivery_refund_base_amount
|
按订单商品实付和套餐价值比例冻结的服务、交付退款基数 |
refunded_unfulfilled_amount |
已完成的农业未履约退款金额累计 |
delay_tolerance_days / exception_confirmation_days
|
套餐延期容忍期与异常方案确认期快照 |
allocated_at |
地块分配时间 |
expected_harvest_at |
预计采收 |
status |
租地订单状态 |
rule_snapshot |
套餐完整快照 |
| 表 | 核心字段 |
|---|---|
eb_farm_adoption_category |
分类名称、分配模式建议、状态 |
eb_farm_breed |
分类、品种、预计周期、预计产出、状态 |
eb_farm_enclosure |
农场、区域、栏舍/蜂场编号、容量、状态 |
eb_farm_animal_asset |
品种、唯一资产编号、耳标、出生/入场日期、栏舍、健康状态、当前状态 |
eb_farm_breeding_batch |
品种、栏舍、总数量、可分配份额、开始/结束时间、状态 |
eb_farm_adoption_plan |
套餐、分配模式、周期、价格、服务/交付价值拆分、交付数量/最低数量、单位、延期容忍期、邮寄和异常规则、版本 |
| 关键字段 | 说明 |
|---|---|
adoption_order_no |
业务编号 |
order_id / order_product_id
|
CRMEB 交易关联 |
user_id / plan_id
|
用户与套餐 |
allocation_mode |
单体、批次份额 |
current_allocation_id |
当前有效分配关系 |
promised_qty / promised_unit
|
交付承诺 |
delivered_qty / refunded_unfulfilled_qty
|
履约汇总 |
service_refund_base_amount / delivery_refund_base_amount
|
按订单商品实付和套餐价值比例冻结的服务、交付退款基数 |
refunded_unfulfilled_amount |
已完成的农业未履约退款金额累计 |
delay_tolerance_days / exception_confirmation_days
|
套餐延期容忍期与异常方案确认期快照 |
allocated_at / expected_output_at
|
分配与预计产出 |
status |
认养订单状态 |
rule_snapshot |
套餐完整快照 |
保留认养资产/份额的预留、确认、替换和释放历史,不用订单当前字段覆盖旧关系。
| 关键字段 | 说明 |
|---|---|
allocation_no / adoption_order_id
|
分配编号与订单 |
allocation_mode |
单体、批次份额 |
animal_asset_id |
单体模式必填 |
breeding_batch_id / share_qty
|
份额模式必填 |
reservation_token_hash / reserved_by
|
临时预留令牌摘要与操作者 |
locked_at / lock_expires_at
|
默认 5 分钟预留 |
effective_from / effective_to
|
有效周期 |
replaces_allocation_id / replacement_reason
|
替换链 |
status / version
|
预留、已确认、有效、已替换、已释放、已过期、冻结、取消 |
候选查询不改变容量;预留和确认分别使用 reserve/confirm 命令。单体模式在事务中锁资产主行并保证同一资产只有一条有效/预留分配;份额模式锁养殖批次主行并保证有效+预留份额不超过可分配份额。显式释放和过期任务均保留原记录,替换时新增分配并关联 replaces_allocation_id。
统一主表承载种植或养殖的公共周期、状态和汇总,类型差异进入一对一扩展表。
| 关键字段 | 说明 |
|---|---|
batch_no |
生产批次编号 |
production_type |
种植、养殖 |
farm_id / zone_id
|
农场与区域 |
plan_start_at / plan_end_at
|
计划周期 |
actual_start_at / actual_end_at
|
实际周期 |
expected_output_qty / actual_output_qty
|
预计与实际产出 |
manager_id |
负责人 |
current_stage_code |
当前生长/养殖阶段摘要 |
has_open_exception |
是否有未关闭异常 |
status / version
|
计划、进行中、暂停、采收/产出中、完成、异常及乐观锁 |
| 表 | 关键字段与约束 |
|---|---|
eb_farm_production_plant_detail |
production_batch_id 唯一、plot_occupancy_id、crop_id、种植面积/单位、种植方式、当前生长阶段 |
eb_farm_production_livestock_detail |
production_batch_id 唯一、enclosure_id、breeding_batch_id、breed_id、个体/批次模式、当前数量、当前生长阶段 |
eb_farm_production_right_link |
生产批次、business_type、租地/认养订单、占用/认养分配、权益比例、承诺数量/单位、状态;组合唯一防止重复关联 |
公共查询先读主表,类型详情按 production_type 联表;禁止把高频查询字段只塞入 JSON。
| 表 | 关键字段与约束 |
|---|---|
eb_farm_task |
task_no 唯一、任务类型、农场/区域、业务对象、生产/产出/履约关联、计划/截止时间、要求快照、当前服务人员、优先级、状态、版本、完成时间 |
eb_farm_task_assignment |
任务、原/新服务人员、职责、范围快照、分派原因、分派人、开始/结束时间;历史不可覆盖 |
任务列表扫描索引使用 assignee_service_id + status + due_at + task_id。转派、范围撤销或对象版本变化不删除现场草稿;最终提交仍重新校验当前任务、权限、范围和对象版本。
| 关键字段 | 说明 |
|---|---|
event_no |
过程记录编号,唯一 |
production_batch_id |
生产批次 |
task_id |
来源现场任务,可空 |
animal_asset_id |
个体事件可选 |
event_type |
播种、浇水、施肥、饲喂、防疫、采收等 |
current_version_id |
当前业务版本 |
review_status |
草稿、待审核、通过、驳回 |
publish_status |
未公开、已发布、已撤回 |
version |
聚合乐观锁 |
eb_farm_production_event_version 保存不可变内容版本:production_event_id + version_no 唯一,包含发生时间、现场操作人、内容、物料/用量快照、可见性、提交人/时间、审核人/时间、审核意见和内容哈希。图片/视频通过 eb_farm_evidence_attachment.business_type=production_event_version 绑定;已发布版本不得原地修改,新编辑生成下一版本。
| 关键字段 | 说明 |
|---|---|
output_no |
采收/产出批次编号 |
production_batch_id |
来源生产批次 |
output_type / product_name / spec
|
产出信息 |
unit_code |
统一数量单位 |
total_qty / pending_inspection_qty / qualified_qty / rejected_qty / loss_qty
|
总量、待检、合格、不合格和损耗 |
available_qty / allocated_qty
|
可履约与已分配 |
produced_at / expire_at
|
生产与保质期 |
quality_status |
待检、合格、不合格 |
warehouse_id / warehouse_location_id
|
入库位置 |
status / version
|
待检、可分配、已分配完、冻结、关闭及乐观锁 |
数量必须满足 total_qty = pending_inspection_qty + qualified_qty + rejected_qty + loss_qty,且 qualified_qty = available_qty + allocated_qty + shipped_qty + cancelled_qty 的阶段守恒。
保存产出待检、合格、拒收、分配、取消、出库、退回和损耗的不可变数量流水,核心字段为产出批次、单位、来源/目标池、数量、前后余额、业务类型/ID、幂等键和发生时间。idempotency_key 唯一。
把实际产出分配到租地/认养订单和普通商品。
| 关键字段 | 说明 |
|---|---|
output_batch_id |
产出批次 |
business_type / business_id
|
租地订单、认养订单、商品批次等 |
allocated_qty |
分配数量 |
fulfillment_id |
邮寄履约关联 |
allocation_sequence / idempotency_key
|
同一权益的分批序号和唯一结果键 |
status / version
|
已分配、已出库、已取消、已退回及乐观锁 |
| 关键字段 | 说明 |
|---|---|
fulfillment_no |
履约编号 |
business_type / business_id
|
租地、认养、云仓邮寄 |
user_id |
收件用户 |
sequence_no |
第几次分批履约 |
planned_qty / shipped_qty
|
本次计划和实际数量 |
address_status / address_version
|
待确认、已确认、已锁定及地址版本 |
address_snapshot |
本次确认后的独立地址快照 |
freight_rule_snapshot |
运费规则 |
split_reason / freight_payer
|
正常一次交付、平台生产分批、用户主动拆包/升级;平台主动分批的新增运费固定由平台承担 |
delivery_type |
V1 固定为快递;云仓自提使用 eb_farm_cloud_pickup
|
current_freight_order_id |
农业产出需补运费时的当前支付单 |
address_due_at / receive_due_at
|
地址确认和收货提醒的明确业务截止;不以更新时间推断 |
next_reminder_at |
下一次可扫描提醒时间;每次成功发送后推进,终态清空 |
status / version
|
待地址、待补运费、待出库、部分发货、已发货、已签收、售后、完成及乐观锁 |
唯一约束:business_type + business_id + sequence_no。
| 表 | 关键字段与约束 |
|---|---|
eb_farm_fulfillment_item |
履约、产出分配、产出批次、单位、计划/出库/退回/退款数量;fulfillment_id + output_allocation_id 唯一 |
eb_farm_fulfillment_package |
package_no 唯一、履约、承运商编码、运单号、包裹数量、发货/签收时间、状态、版本;承运商+非空运单号组合唯一 |
eb_farm_fulfillment_package_item |
包裹与履约明细、数量;组合唯一并校验包裹分配不超明细可发数量 |
eb_farm_fulfillment_freight_order |
freight_order_no 唯一、履约、用户、地址/报价版本、金额、支付/退款状态、渠道交易号、过期时间、版本和错误诊断 |
农业产出运费不回写原租地/认养订单金额。支付、结果查询、超时、迟到退款与云仓补运费复用同一支付适配器和安全规则,但使用独立业务类型 farm_output_freight。
| 表 | 核心字段与约束 |
|---|---|
eb_farm_trace_archive |
trace_no、public_code 均唯一,档案类型、生产/产出批次、current_published_version_id、状态、版本 |
eb_farm_trace_version |
档案、版本号、标题、公开展示快照、内容哈希、审核/发布/撤回信息和状态;archive_id + version_no 唯一 |
eb_farm_trace_material |
档案/版本、材料类型、报告/证书编号、附件 ID、出具机构、生效/失效时间、内容哈希 |
eb_farm_trace_link |
档案、版本、目标类型/ID、关系类型;archive_id + version_id + target_type + target_id + relation_type 唯一 |
发布事务必须同时锁档案、确认待发布版本与材料有效、把版本设为已发布、更新 current_published_version_id 并写 Outbox。公开二维码只编码稳定 public_code,不直接编码内部 ID 或临时 URL;撤回只改变公开解析结果,不复用旧版本号。
| 关键字段 | 说明 |
|---|---|
event_no |
异常编号 |
event_type |
减产、绝收、疾病、死亡、延期、品质、包裹、物流等 |
farm_id / production_batch_id
|
生产关联 |
severity / sla_due_at
|
严重度和处理时限 |
owner_type / owner_id
|
当前责任角色与负责人 |
reason / fact_snapshot
|
已确认事实、原因与证据摘要 |
freeze_flags |
需要冻结的分配、履约、批次或账本 |
current_plan_version_id |
当前处理方案版本 |
status / version
|
已上报、待确认、待方案、待审核、执行中、部分失败、已解决、已关闭及乐观锁 |
resolved_at / closed_at
|
事实解决和审计关闭时间 |
异常主表不直接塞入单一资产、单一订单和一个可覆盖方案,关联事实拆分如下:
| 表 | 作用 | 关键约束 |
|---|---|---|
eb_farm_exception_impact |
受影响的地块、动物、批次、订单、履约、持仓或账本及数量/金额 |
exception_id + target_type + target_id + impact_type 唯一 |
eb_farm_exception_plan_version |
补足、替换、延期、补发、退款、继续自提、补运费改寄、回购等方案;含等价校验、影响数量、服务/交付退款基数、累计应退/本次应退、确认截止、超时策略和短缺分配快照 |
exception_id + version_no 唯一;提交审核后不可改,确认或超时后记录结果 |
eb_farm_exception_execution_step |
每个可重试执行步骤、前后快照、补偿动作、错误码和幂等键 |
exception_id + plan_version_id + step_code 唯一 |
eb_farm_asset_replacement |
原资产、替代资产、关联认养分配、原因、生效时间和异常来源 | 原关系保留,不覆盖订单历史 |
方案执行前重新预检当前状态、版本、资金和库存。步骤允许部分失败,但只有全部必需步骤成功、通知结果已记录且数量/金额重新闭合后才能关闭异常;失败步骤按原幂等键重试,方案已失效时生成新版本而不是覆盖旧计划。
这些表不替代云仓、订单、账本或农业业务表,只声明核心订单策略,并保障跨事务流程可恢复、可审计和可对账。
统一声明 CRMEB 订单明细属于哪一种农业业务,以及核心订单在财务、库存和履约上的处理策略。支付、取消和退款适配器只查询本表,不在多个扩展表或 JSON 中猜测业务类型。
| 关键字段 | 说明 |
|---|---|
binding_id |
主键 |
group_order_id / order_id / order_product_id
|
CRMEB 订单三层关联 |
user_id / merchant_id
|
下单用户与订单所属履约商户 |
business_type |
cloud_primary、cloud_resale、land、adoption 等 |
aggregate_type / aggregate_id
|
对应农业聚合类型与主键 |
finance_policy |
normal 或 farm_managed
|
stock_policy |
normal、cloud_primary、cloud_resale、asset_capacity
|
fulfillment_policy |
normal、deferred_choice、farm_fulfillment
|
payment_status / refund_status
|
核心交易事实同步状态 |
version |
乐观并发版本 |
status |
有效、关闭、冲正 |
唯一约束:order_product_id。索引建议:group_order_id、order_id、business_type + aggregate_id、payment_status + status。
同一个 CRMEB group_order_id 下所有子订单和明细必须使用同一种 finance_policy;V1 不允许普通商品与 farm_managed 商品进入同一个订单组。确认订单阶段必须拆组或拒绝,不能只保证单个子订单内部一致,因为 CRMEB 的支付统计、赠券、会员值和部分提交后副作用按订单组执行。
| 关键字段 | 说明 |
|---|---|
operation_code / actor_type / actor_id
|
HTTP 写操作稳定编码及操作者 |
request_id |
客户端/调用方幂等键 |
request_hash |
规范化请求摘要 |
response_status / response_snapshot
|
首次处理结果 |
target_type / target_id
|
请求目标对象,可空 |
result_type / result_id
|
首次成功产生的业务对象 |
locked_until / expired_at
|
执行租约与记录有效期 |
status |
处理中、成功、失败、冲突 |
唯一约束:operation_code + actor_type + actor_id + request_id。相同键但请求摘要不同必须返回幂等冲突;不把 target_id 放入唯一键,避免同一请求键被错误复用于另一个对象。支付/退款回调使用业务单号和渠道交易号,事件消费者使用 event_id + consumer_name,定时任务使用 job_name + run_key 与业务结果唯一键,均不伪造 HTTP request_id。
| 关键字段 | 说明 |
|---|---|
event_id |
全局唯一事件 ID |
event_type / event_version
|
事件名和版本 |
aggregate_type / aggregate_id
|
聚合定位 |
trace_id / source
|
链路和来源 |
payload |
最小事件载荷 |
occurred_at |
业务事实发生时间 |
published_at / retry_count / next_retry_at
|
投递状态 |
lease_owner / lease_until
|
投递租约 |
last_error |
最后失败摘要 |
status |
待投递、投递中、已投递、失败、作废 |
唯一约束:event_id。
| 关键字段 | 说明 |
|---|---|
event_id / consumer_name
|
事件和消费者 |
event_type / event_version
|
消费版本 |
started_at / finished_at / duration_ms
|
执行时间 |
retry_count / next_retry_at
|
重试 |
result_business_key |
业务结果幂等键 |
last_error |
错误摘要 |
status |
处理中、成功、待重试、失败、忽略 |
唯一约束:event_id + consumer_name。
| 关键字段 | 说明 |
|---|---|
job_name / run_key
|
任务和本次运行键 |
scheduled_for / timezone / shard_key
|
计划时间、固定时区和分片 |
selector_snapshot / cursor_value
|
本次查询条件与本次/下次游标 |
lease_owner / lease_until
|
并发租约 |
timeout_at / retry_count / next_retry_at
|
超时和重试 |
scanned_count / success_count / failed_count
|
处理汇总 |
started_at / finished_at
|
运行时间 |
last_error |
失败摘要 |
status |
运行中、成功、部分失败、失败、取消 |
唯一约束:job_name + run_key。
| 关键字段 | 说明 |
|---|---|
template_code / channel
|
通知模板和渠道 |
receiver_type / receiver_id
|
接收人 |
business_type / business_id / business_key
|
业务来源 |
content_snapshot |
实际发送内容快照 |
provider_message_id |
第三方消息 ID |
scheduled_at / sent_at
|
计划和发送时间 |
retry_count / last_error
|
重试与错误 |
status |
待发、发送中、成功、失败、取消 |
唯一约束建议:template_code + channel + receiver_type + receiver_id + business_key。
| 关键字段 | 说明 |
|---|---|
operator_type / operator_id
|
平台、商户、服务人员或系统 |
action_code |
稳定操作码 |
target_type / target_id
|
操作对象 |
before_snapshot / after_snapshot
|
关键字段前后值 |
reason / request_id / trace_id
|
原因和链路 |
ip / user_agent
|
操作来源 |
occurred_at |
发生时间 |
审计日志不可物理删除,不允许通过普通 CRUD 接口修改。
与业务状态更新在同一事务写入的不可变迁移事实,不能只依赖通用后台审计日志。
| 关键字段 | 说明 |
|---|---|
aggregate_type / aggregate_id
|
订单、批次、供货、履约、异常、账本等聚合 |
from_status / to_status
|
原状态和目标状态 |
event_code / operation_code
|
业务事件与命令 |
aggregate_version |
迁移后的聚合版本 |
idempotency_key |
HTTP、事件或任务的确定性结果键 |
operator_type / operator_id
|
用户、商户、平台、服务人员或系统 |
reason_code / reason_snapshot
|
原因及不可变说明 |
occurred_at |
业务发生时间 |
唯一约束:aggregate_type + aggregate_id + idempotency_key。合法迁移由版本化代码常量和状态矩阵共同维护,数据库历史只记录实际发生结果。
统一承载导入、导出、批量预检、对账、重算、回购执行和修复等异步命令的查询状态。
| 关键字段 | 说明 |
|---|---|
operation_no / operation_type
|
对外编号和类型 |
target_type / target_id
|
业务目标 |
requested_by_type / requested_by_id
|
发起人 |
progress_total / progress_done / success_count / failure_count
|
对外同名进度;progress_done = success_count + failure_count,不得由前端推算 |
current_step / result_summary
|
当前步骤和脱敏最终摘要 |
result_file_id |
可空 eb_system_attachment.attachment_id;API 通过现有附件/存储服务换取短时地址,不保存物理路径 |
error_code / error_message
|
失败诊断 |
lease_owner / lease_until / next_retry_at
|
执行租约和重试 |
started_at / finished_at
|
首次开始与终态时间 |
status / version
|
排队、执行中、部分失败、成功、失败、取消 |
operation_no 唯一;同一业务命令另有确定性幂等键。前端收到 202 后只凭操作编号查询,不轮询内部 Job 记录。
现有 eb_store_service 的农业工作区一对一扩展,不保存密码或第二套登录身份。
| 关键字段 | 类型建议 | 说明 |
|---|---|---|
profile_id |
bigint unsigned |
主键 |
service_id |
int unsigned |
现有客服/服务人员 ID,唯一 |
farm_enabled |
tinyint unsigned |
是否允许进入农业工作区 |
mobile_enabled |
tinyint unsigned |
是否允许进入移动现场工作区 |
default_workspace |
varchar(20) |
chat、farm_desk、farm_work
|
scope_version |
int unsigned |
职责或范围每次变更递增 |
last_scope_change_at |
datetime |
最近授权变化时间 |
created_at / updated_at
|
datetime |
创建与更新时间 |
唯一索引:uk_service_id(service_id)。default_workspace 只能选择当前人员实际拥有的工作区;前端记住的入口不具有授权作用。
现有 eb_store_service 上线前执行非空账号重复检查,确认无冲突后新增唯一索引 uk_service_account(account)。同时加固 Token 请求校验:is_open=1、status=1、is_del=0 必须同时成立。
服务端客服、现场人员、审核人员和仓库人员的职责及对象范围。
| 关键字段 | 类型建议 | 说明 |
|---|---|---|
scope_id |
bigint unsigned |
主键 |
service_id |
int unsigned |
现有服务人员 ID |
merchant_id |
int unsigned |
授权时租户边界快照,平台人员为 0 或明确商户 |
duty_code |
varchar(40) |
平台客服、商户客服、农事、养殖、仓储、审核 |
scope_type |
varchar(32) |
all、商户、农场、区域、地块、栏舍、资产、仓库、生产/产出批次、履约或任务 |
scope_object_id |
bigint unsigned |
范围对象 ID;all 时为 0
|
valid_from / valid_to
|
datetime |
授权有效期,valid_to 可空 |
status |
tinyint unsigned |
1 有效、0 停用 |
created_by_type / created_by_id
|
varchar(20) / bigint unsigned
|
授权主体 |
revoke_reason |
varchar(255) |
停用或调岗原因 |
created_at / updated_at
|
datetime |
创建与更新时间 |
约束与索引:
- 唯一索引
uk_service_duty_scope(service_id,duty_code,scope_type,scope_object_id);重新授权更新原关系,历史变化写审计日志。 - 查询索引
idx_service_valid(service_id,status,valid_from,valid_to)。 - 反查索引
idx_scope_object(scope_type,scope_object_id,status)。 - 商户服务人员的有效范围不能越过
eb_store_service.mer_id;平台人员是否可跨商户由职责和显式范围共同决定。 - 范围解析只允许沿业务对象已定义的归属链向上匹配,禁止信任客户端提交的农场或仓库 ID。
- 职责到权限码的映射由版本化代码配置维护;写接口每次校验当前权限和范围,不把长期范围只存入 Token。
- 任一授权变化同时递增
eb_farm_service_profile.scope_version,用于前端上下文失效提示,不替代后端实时校验。
现有平台角色/菜单解决“能否调用路由”,不直接表达“只能操作哪些农场、仓库或业务域”。V1 为非超级管理员增加对象范围关系;超级管理员也通过解析后的 all 范围进入同一查询约束,不在 Repository 到处写账号特判。
| 关键字段 | 类型建议 | 说明 |
|---|---|---|
scope_id |
bigint unsigned |
主键 |
admin_id |
int unsigned |
CRMEB 平台管理员 ID |
domain_code |
varchar(32) |
agriculture、cloud、finance、trace 等业务域 |
scope_type |
varchar(32) |
all、农场、区域、仓库、自提点或指定业务对象 |
scope_object_id |
bigint unsigned |
all 时为 0
|
valid_from / valid_to
|
datetime |
授权有效期 |
status / version
|
tinyint unsigned / int unsigned
|
单行启停和乐观锁 |
scope_set_version |
int unsigned |
该管理员本次完整范围集合的版本;同一次保存写相同新版本 |
created_by / updated_by / created_at / updated_at
|
审计字段 | 授权与最近变更来源 |
约束与索引:
- 唯一索引
uk_admin_domain_scope(admin_id,domain_code,scope_type,scope_object_id)。 - 查询索引
idx_admin_scope_valid(admin_id,domain_code,status,valid_from,valid_to)。 - 路由权限与数据范围分别校验;拥有菜单操作权限但无有效范围时,列表返回空集合,详情按不存在处理。
- 全平台范围只允许超级管理员或具有独立范围授权权限的管理员授予,变更必须写审计日志。
- 云仓财务仍按业务域权限与高风险动作权限控制;农场范围不能自动授予账本执行、回购审核或冲正权限。
- 全量保存先锁定目标 CRMEB 管理员主行和其当前 scope 行,以当前最大
scope_set_version做集合级乐观锁;这样即使目标此前没有范围行,也不会出现并发首次授权互相覆盖。
现场端现有 app/controller/service/Service::upload() 只调用 UploadService 并返回 URL,没有附件主键、临时/已绑定状态或业务范围校验,不能直接作为农业证据契约。V1 复用 UploadService 的存储驱动和校验能力,新增薄业务附件表,不复制后台素材库分类体系。
| 关键字段 | 类型建议 | 说明 |
|---|---|---|
attachment_id |
bigint unsigned |
农业证据附件主键 |
attachment_no |
varchar(32) |
对外稳定编号,唯一 |
service_id |
int unsigned |
上传服务人员 |
merchant_id |
int unsigned |
上传时租户上限快照,平台人员为 0
|
task_id |
bigint unsigned |
可空;上传时关联的现场任务 |
scope_object_type / scope_object_id
|
varchar(32) / bigint unsigned
|
上传时已校验的业务对象 |
storage_type |
tinyint unsigned |
CRMEB 上传驱动类型快照 |
storage_path |
varchar(512) |
规范化存储路径,不保存带时效签名 URL |
original_name |
varchar(255) |
原文件名清理后快照 |
mime_type |
varchar(100) |
服务端检测 MIME |
file_ext |
varchar(20) |
规范化扩展名 |
file_size |
bigint unsigned |
字节数 |
content_hash |
char(64) |
SHA-256,用于完整性与重复诊断 |
business_type / business_id
|
varchar(40) / bigint unsigned
|
正式绑定后的过程记录、产出、履约或异常;临时时为空 |
status |
varchar(20) |
temporary、bound、expired、deleted
|
expires_at |
datetime |
临时附件清理时间 |
bound_at / created_at / updated_at
|
datetime |
生命周期时间 |
约束与索引:
- 唯一索引
uk_attachment_no(attachment_no)。 - 查询索引
idx_attachment_owner(service_id,status,created_at)和idx_attachment_expire(status,expires_at)。 - 同一附件只能绑定一次;业务提交事务锁定附件并验证当前服务人员、任务、对象范围、状态和 MIME。
- 业务记录只引用
bound附件;删除业务记录时按保留策略标记,不立即物理删除审计证据。 - 现有通用客服聊天上传保持原行为;农业工作区使用新接口返回
attachment_id,不能把 URL 当永久绑定凭证。
稳定的业务状态码应在代码常量/枚举和文档中维护,不建议让运营随意新增。以下内容可使用系统字典:
- 作物、认养分类和品种。
- 农事/养殖事件类型。
- 异常事件类型和处理方式。
- 产出单位和规格。
- 报告/证书类型。
以下内容不得仅依赖可删除字典:
- 订单状态。
- 批次状态。
- 账本状态。
- 结算模式。
- 库存池类型。
- 去向类型。
- 首次云仓订单明细只能存在一个最终去向。
- 每个已发布活动 SKU 只能生成一个对应活动批次。
- 活动 SKU、历史订单和批次以独立
activity_sku_id关联,来源规格重建不得改变历史关系。 - 需要补运费的邮寄选择只有在补运费成功后才能成为最终去向。
- 补运费金额不得回写原云仓商品订单,不参与用户本金、商户货款、优惠或佣金计算。
- 运费成功回调必须同时校验本地订单号、规范化金额、渠道交易号和选择版本;超时后迟到支付不得改变已生效去向,只能进入全额退款。
- 同一运费单的在线退款重试必须复用唯一退款单号,余额退款与用户余额账单在同一事务内完成。
- 代销批次开始后的持仓不得退回普通首次退款状态。
- 用户收益分成率与平台收益分成率之和必须等于 100%,回购比例必须在
(0, 100%]。 - 代销持仓数量必须等于来源订单明细全部有效数量。
- 批次各库存池数量之和必须与批次总量闭合。
- 二次销售桥接 SKU 的 V1 库存来源必须为
cloud_only,不得与普通库存混合。 - 同一 CRMEB
group_order_id覆盖的整组订单不得混合normal与farm_managed财务策略;混合购物车必须在创建订单组前拆分,无法拆分时拒绝提交。 -
cloud_primary不扣减或恢复 CRMEB 来源商品库存;cloud_resale同时维护 CRMEB 镜像库存与云仓分配。 -
farm_managed订单不得生成普通商户锁定款或普通订单净收入,退款也不得扣减不存在的普通商户锁定款。 - 二次桥接表、批次二次库存和 CRMEB 对外展示库存必须可对账。
- 有效代销售出数量不得超过代销冻结数量。
- 用户持仓累计分摊有效售出数量之和等于批次有效售出数量,允许最后一笔尾差调整。
- 已返本金不得超过已售可返本金与回购款允许范围。
- 用户已正式入账收益不得超过累计应得收益。
- 批次
current_milestone只能单向前进;一次跨越多个节点只生成一组按真实累计进度计算的差额账本。 - 回购完成数量不得超过最终未售数量。
- 商户有效首次购买数量不依赖二次零售数量。
- 地块有效占用容量不得超过物理地块可用容量。
- 单体认养资产有效周期内不得重复分配。
- 批次认养有效份额不得超过可分配份额。
- 产出分配数量不得超过合格可用数量。
- 租地/认养累计履约数量、未履约退款数量和剩余权益必须闭合。
- 已发布溯源内容修改时必须新增版本。
- 每个领域事件的同一消费者最多产生一次同业务结果。
- 账本、库存和回购的历史流水不得通过更新原金额代替冲正。
- 用户业务账本和商户结单只通过
eb_farm_financial_posting映射最终账户;UserBill、FinancialRecord的普通索引不能替代入账唯一键。 - 同一成功入账的余额变化、CRMEB 流水、入账记录和来源状态必须在一个事务内完成。
- 借方冲正只处理审核确认的重复/错误入账或外部支付最终撤销,不转嫁正常经营损失;不得使用户或商户最终账户小于零,余额不足时转待追偿并冻结后续同主体农业入账。
同一事务涉及多类记录时固定按以下顺序获取行锁,Repository 和 Domain Service 不得自行交换:
幂等/回调事实
→ CRMEB 订单组、订单、订单明细或支付/退款单
→ 农业聚合主表
→ 物理资源主表(SKU、批次、地块、资产、产出)
→ 分配/占用/履约子表
→ 业务账本或结单
→ 用户/商户账户
→ 库存/财务不可变流水
→ 状态迁移、审计和 Outbox
数据库死锁允许按同一请求键重试;不得通过删减行锁、先写账户再补业务事实或把 Outbox 放到事务外规避冲突。
| 操作码 | 必须锁定 | 同事务写入 | 结果幂等键 | 事务后动作 |
|---|---|---|---|---|
CW_ORDER_CREATE |
校验令牌、活动 SKU、批次库存 | CRMEB 三层订单、绑定、首次明细、库存流水、Outbox | 用户 + request_id;库存流水业务键 |
发起支付由客户端调用现有入口 |
CRM_ORDER_PAID_ADAPT |
CRMEB 订单、绑定、农业扩展 | 付款事实、状态迁移、Outbox | 业务单号 + 渠道交易事实 | 状态推进、通知 |
CRM_ORDER_CANCEL_ADAPT |
核心订单明细、绑定、首次/二次分配 | 按策略释放库存、流水、Outbox | 取消任务 + 订单明细 + 目标状态 | 对账修复 |
CW_CHOICE_CONFIRM |
首次明细、批次池或履约候选 | 最终去向、持仓/自提/履约、库存流水、Outbox | 明细 + 选择版本 | 通知、仓储待办 |
CW_FREIGHT_PAID |
运费单、首次明细、地址版本 | 支付事实、最终邮寄、履约、Outbox | 运费单 + 渠道交易事实 | 物流待办;迟到支付走退款 |
SYS_CW_INVENTORY_CLOSE |
活动、活动 SKU、未付款汇总、供货库存 | 未抢库存释放/退回待办/平台承接、流水、Outbox | 活动 SKU + 闭合版本 | 批次准备检查 |
SYS_CW_BATCH_START |
批次、库存池、全部有效选择 | 持仓生效、代销池冻结、状态迁移、Outbox | 批次 + 启动版本 | 发布二次可售库存 |
SYS_CW_RESALE_ALLOCATE |
普通订单明细、映射 SKU、候选批次 | FEFO 分配、CRMEB 镜像库存、批次流水、绑定 | 普通订单明细 + 分配版本 | 支付/关闭适配 |
SYS_CW_RESALE_EFFECTIVE |
二次分配、退款事实、批次 | 有效销售、持仓分摊、进度快照、Outbox | 分配 + 观察期版本 | 节点检查 |
SYS_CW_MILESTONE |
批次、进度快照、持仓、历史账本 | 按真实累计进度生成差额账本、Outbox | 持仓 + 最高节点 + 计算版本 + 账本类型 | 自动校验或人工待审 |
CW_BUYBACK_EXECUTE |
已审核回购单、批次、持仓、平台库存 | 回购数量、平台库存、用户回购账本、状态迁移、Outbox | 回购单 + 审核版本 | 用户账本入账、通知 |
CW_USER_POSTING |
用户账本、入账记录、用户账户 | 余额、UserBill、成功状态、Outbox |
posting_key |
通知、对账 |
CW_MERCHANT_POSTING |
结单、明细、入账记录、商户账户 | 商户余额、FinancialRecord、明细状态、Outbox |
posting_key |
通知、对账 |
LAND_ALLOCATION_CONFIRM / ADOPTION_ALLOCATION_CONFIRM
|
订单、未过期预留、地块/资产/批次 | 占用/分配、订单当前关系、历史、Outbox | 订单 + 预留编号 | 生产批次准备、通知 |
OUTPUT_ALLOCATION_CONFIRM |
产出批次、权益订单、已有分配 | 产出分配、库存流水、履约、Outbox | 产出批次 + 分配计算版本 | 地址确认通知 |
SYS_FARM_EXCEPTION_STEP |
异常、方案版本、执行步骤和受影响对象 | 单步骤业务结果、状态迁移、Outbox | 异常 + 方案版本 + 步骤码 | 下一步骤或失败告警 |
TRACE_VERSION_PUBLISH |
档案、待发布版本、材料 | 发布状态、当前公开指针、状态迁移、Outbox | 档案 + 版本号 | 刷新公开缓存/二维码解析 |
所有金额、数量和目标账户必须从锁定后的事实重算。前端预览值只用于冲突提示,不能作为正式写入来源。通知、缓存、导出和第三方查询均在提交后执行,失败不得回滚已提交事实。
除各表唯一约束外,物理字段字典必须至少包含:
| 扫描/查询 | 组合索引前缀 |
|---|---|
| 待选择与超时 | status + choice_deadline_at + cloud_order_item_id |
| 待到期批次 | status + maturity_at + batch_id |
| 商户货款资格 | status + eligible_at + merchant_id + ledger_id |
| 用户/商户入账重试 | status + next_retry_at + posting_id |
| Outbox 投递 | status + next_retry_at + event_id |
| 任务租约回收 | status + lease_until + job_run_id |
| 分配预留过期 | status + lock_expires_at + occupancy/allocation_id |
| 异常 SLA | status + sla_due_at + exception_id |
| 产出待分配 | status + available_qty + output_batch_id |
| 履约待地址/收货提醒 |
status + next_reminder_at + fulfillment_id;业务截止分别使用 address_due_at/receive_due_at
|
| 商品农业材料到期 | status + expire_at + product_material_id |
| 溯源材料到期 | status + expire_at + trace_material_id |
大表列表的筛选字段顺序以真实 SQL where + order 为准,建表前必须使用代表数据执行 EXPLAIN;不得为了“看起来完整”给每个字段单独建索引。
- 新表和新列全部通过
install/upgrade/farm_v1版本化脚本建立,脚本同时提供up、verify和可逆范围说明。 - 第一阶段只做新增表、可空列、索引和兼容读取;字段扩容先校验现有最大值和异常数据,再使用在线或低峰变更方案。
- 新旧代码并行窗口中,旧流程继续处理普通商城订单;农业入口由功能开关关闭,升级完成并通过验证后才开放。
-
verify至少检查表/索引存在、金额精度、业务编号唯一性、CRMEB 账号重复、订单绑定孤儿、库存和账本初始恒等式。 - 数据已产生后,回滚只关闭农业入口、停止新任务并保留事实表;不得通过
down删除订单、库存、账本、溯源或审计历史。 - 代码回退前必须确认旧版本不会误处理
farm_managed订单;无法兼容时先启用只读维护模式并完成队列排空。 - 每次升级记录脚本版本、执行人、开始/完成时间、校验摘要和回滚点,生产执行仍属于后续上线门,不在当前设计阶段运行。
以下原评审项已按源码专项验证和低保真反向校准形成统一口径:
| 关联编号 | 冻结结论 |
|---|---|
G3-INV-001 |
活动 SKU 使用独立主键;来源 value_id/unique 仅作同步定位和告警,不作历史身份 |
G3-ARCH-001 |
独立农业编排入口复用 CRMEB 订单、支付和退款载体,以 farm_order_binding 声明处理策略 |
G3-CODE-001 |
二次代销使用 cloud_only 专用映射 SKU,不与普通商户库存混合 |
G3-DATA-001 |
生产使用统一主表、种植/养殖一对一扩展和权益关联表 |
G3-CODE-005 |
升级采用版本化 up + verify + 回滚边界,产生业务事实后不删表回滚 |
G3-DATA-002 |
业务事件实时推进汇总,任务负责重算、补偿和对账,页面默认读取汇总 |
物理字段类型、默认值、注释、索引和迁移顺序已在 34-v1-database-field-dictionary.md 展开;实际 DDL 必须逐表照此生成,并通过迁移审查,不得改变上述业务实体、唯一约束、事务边界和历史保留原则。
- 首页
- 项目总览
- 项目立项
- 端与角色
- 供应链经营闭环
- 模块地图
- V1 范围 PRD
- 任务拆解
- 结算与账本
- V1 结算口径
- 云仓秒杀
- CRMEB 底座能力映射
- 当前菜单页面审计
- V1 决策与术语
- 云仓流程与状态机
- 租地认养与溯源 PRD
- V1 数据模型草案
- 开发前设计计划
- V1 信息架构
- 页面与原型规格
- V1 API 契约草案
- 事件任务权限通知
- 五项目代码改造蓝图
- 测试验收发布与手册计划
- CRMEB 视觉基线审计
- G3/G4 决策登记表
- 用户端 uni-app 复用审计
- 开发前主清单
- 自主设计工作指引
- V1 需求追踪矩阵
- G3 技术专项验证报告
- V1 P0 页面矩阵
- 写操作契约注册表
- 事件任务操作注册表
- 状态异常事务矩阵
- 数据库字段字典
- 页面 API 文件追踪
- V1 ER 图
- API 字段契约注册表
- 平台管理员手册
- 商户手册
- 用户帮助
- 服务与现场手册
- 开发任务包
- 测试目录与 Fixtures
- 发布与运维手册
- 设计交付与研发交接