data-model.md 6.4 KB

Data Model: 可配置支付方式(031-pay-method-config)

Date: 2026-09-11 | Spec: spec.md | Research: research.md

所有 DDL 追加到 updatesql/sql.md(标注日期与用途),由开发者手动执行,不在代码/迁移脚本中自动执行。

1. 新表 payment_method_config(平台支付方式开关)

列 类型 说明
id BIGINT AUTO_INCREMENT PK
method_code VARCHAR(32) NOT NULL 支付方式代码:COD / CARD_OMG / LINE_PAY / OFFLINE_TRANSFER(组代码,非 payType 数值)
scope VARCHAR(32) NOT NULL 维度:MERCHANT(商家餐饮单)/ RIDER_FLASH(骑手闪送)
enabled TINYINT NOT NULL DEFAULT 1 1=开 0=关
sort INT NOT NULL DEFAULT 0 平台设置页展示排序
update_by BIGINT 最后操作管理员
update_time / create_time DATETIME
  • 唯一键:uk(method_code, scope)
  • 缺行语义 = 开启:表为空时系统行为与现状完全一致;平台页保存时才 upsert 行;新增支付方式代码无需初始化数据。
  • 方式×维度矩阵初始仅需可配的行;CARD_OMG 组 = payType 2+5,开关联动;COD = payType 1;LINE_PAY = 3;OFFLINE_TRANSFER = 6。现金(4) 不建行不纳入。
  • RIDER_FLASH 维度可配集合:COD / LINE_PAY / OFFLINE_TRANSFER(闪送无线上卡支付)。

2. info_user 加两列(收款方选择)

列 类型 说明
pay_methods VARCHAR(128) NULL 商家接受的支付方式组代码 CSV(如 COD,CARD_OMG);NULL/空 = 全部启用(存量零变化)
flash_pay_methods VARCHAR(128) NULL 骑手接受的闪送收款方式 CSV;NULL/空 = 平台开放的全部
  • 商家主账号级语义:读写在 info_user 主账号行;查询时连锁门店经 pos_store.user_id 定位主账号(与 027 bankInfo 同路径)。
  • 保存时服务端校验值域 ∈ 平台该维度当前开放集合之外仍可保存(平台后关不影响已存值,实时按闸门算),但必须是组合法代码。

3. 新表 info_bank_card(收款银行卡)

列 类型 说明
id BIGINT AUTO_INCREMENT PK
user_id BIGINT NOT NULL 归属(商家主账号 / 骑手),索引
bank_name VARCHAR(64) NOT NULL 银行名称(字典 taiwan_bank_list 中文名)
account_no VARCHAR(64) NOT NULL 银行账号
account_name VARCHAR(64) NOT NULL 户名
is_active TINYINT NOT NULL DEFAULT 0 1=启用;同一 user 同时最多一张启用(服务层事务保证:启用新卡同事务停旧卡)
create_time / update_time DATETIME
  • 商家/骑手通用,不做 user_type 冗余(归属即 info_user)。
  • 不加分行栏位(Assumption,可后补)。

4. flash_delivery_order 加一列(收款状态)

列 类型 说明
payment_status TINYINT NOT NULL DEFAULT 0 0=未收款 1=骑手已确认收款
  • 支付方式复用现有 pay_type 列(值域扩展为平台闪送维度开放集合,当前已存 4/6),不新增支付方式列。
  • 确认收款仅更新 payment_status + 写 flash_delivery_order_log(operator_type=RIDER),不改订单状态,不阻塞送达/完成。

5. 027 存量迁移(一次性 SQL,入 updatesql/sql.md)

-- 031 027银行三字段迁移为启用卡
INSERT INTO info_bank_card (user_id, bank_name, account_no, account_name, is_active, create_time)
SELECT user_id, bank_name, bank_account_no, bank_account_name, 1, NOW()
FROM info_user
WHERE user_id IS NOT NULL AND bank_name IS NOT NULL AND bank_name <> ''
  AND bank_account_no IS NOT NULL AND bank_account_no <> ''
  AND bank_account_name IS NOT NULL AND bank_account_name <> '';
  • 迁移后 bankInfo 改读 info_bank_card is_active=1,info_user 旧三字段保留不删(App 端商家审核资料等仍引用)。
  • 就绪度判据同步切换:OFFLINE_TRANSFER 就绪 = 存在启用卡。

6. 就绪度判定(不落表,服务层实现)

方式 就绪条件(门店/收款方)
CARD_OMG 门店 pos_store_omg 存在启用凭证
LINE_PAY 门店 pos_store_line_pay 存在启用凭证
OFFLINE_TRANSFER 收款方 info_bank_card 存在 is_active=1 的卡
COD 无就绪度要求(恒满足)

7. 实体/映射层级

按全栈字段清单:ruoyi-system domain(新实体 PaymentMethodConfig / InfoBankCard + InfoUser / FlashDeliveryOrder 加字段)→ mapper(MyBatis-Plus BaseMapper + 必要自定义 SQL)→ ruoyi-admin service/controller → 前端。resultMap 如涉及 XML 同步(本表预期纯 MyBatis-Plus,无 XML)。

8. 现金(CASH)增量语义(2026-09-20 变更,US7)

无表结构变更。 现金可用性不落新表/新字段:

  • 商家勾选:复用 info_user.pay_methods(MERCHANT 维度 CSV),值域新增组代码 CASH;NULL/空=全部接受(含现金),存量商家行为零变化。
  • 无 payment_method_config 行:现金无平台开关(allGroups() 不含 CASH,平台矩阵页不渲染)。
  • 无就绪度要求(同 COD,恒满足)。
  • 订单侧:pos_order.pay_type=4 与 type∈{1,2} 组合即现金自取/堂食单,pay_status=1(同到付线下收款语义),无新字段。

9. 夜市摊位独立归属(2026-09-30,US8)

表/列 类型 规则
pos_store.pay_methods VARCHAR(128) NULL 仅 is_stall=1 使用,NULL/空=全部;普通商家仍读 info_user.pay_methods
info_bank_card.store_id BIGINT NULL,索引 摊位卡填写此列,user_id 必须为空
info_bank_card.user_id BIGINT NULL 普通商家和骑手卡保留此列,store_id 必须为空

摊位主 info_user.store_id 是授权关联,不是银行卡归属。夜市主 pos_store.user_id 只表示创建/所有权,不参与摊位支付选择和收款卡判定。存量夜市主卡不自动复制到摊位。SQL 见 updatesql/sql.md 的 US8 节,需在代码部署前手工执行。通用门店编辑接口禁止绑定 pay_methods,仅专用支付设置接口写入该列。

同一摊位可能有多个有效摊位主:新增首张卡和切换启用卡前,在同一事务内对对应 pos_store 行执行 SELECT ... FOR UPDATE,再检查/修改银行卡,保证并发请求按摊位串行处理。普通商家和骑手保持原卡管理事务逻辑。