receive-code.sql 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. -- 收款工作台 —— 长期收款码(2026-09-22)
  2. -- 手工执行: psycopg2 连接 payment_platform_java 库
  3. --
  4. -- 背景: 用户口径(design 文档 §0.9)—— 商户拿**一个长期固定的二维码**发到群里,
  5. -- 群里任何人扫这个码进收银台,**顾客自己输金额**、点确认,直接唤起支付 App。
  6. -- 码可建多个、可命名、可停用,绑定到某个商户。
  7. --
  8. -- ★ 不分渠道(2026-09-22 定): 一个码微信和支付宝都能扫。码里编的是**我们自己的地址**
  9. -- /payment/cashier/{code_no},分流按扫码环境的 UA 做,与码本身无关 —— 所以没有 channel 列。
  10. -- 理由与证据链见 design 文档 §4.2。**普通浏览器(系统相机扫)那条腿的渠道由顾客点选**(§4.4)。
  11. --
  12. -- ★ 与旧设计的根本区别: **不是一单一码**。码只承载「入口」,不承载金额;
  13. -- 订单在顾客点「确认支付」那一刻才创建。
  14. --
  15. -- 本脚本只建表,**不动任何存量表**,可安全重复执行(全部 IF NOT EXISTS)。
  16. CREATE TABLE IF NOT EXISTS pay_receive_code (
  17. id BIGINT PRIMARY KEY,
  18. tenant_id BIGINT NOT NULL,
  19. code_no VARCHAR(64) NOT NULL,
  20. name VARCHAR(64) NOT NULL,
  21. merchant_id BIGINT NOT NULL,
  22. status VARCHAR(32) NOT NULL DEFAULT 'ENABLED',
  23. remark VARCHAR(255),
  24. created_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
  25. updated_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now()
  26. );
  27. -- code_no 出现在**公开 URL** 上(/payment/cashier/{code_no}),必须全局唯一:
  28. -- 不带 tenant_id 的全局唯一索引。若改成 (tenant_id, code_no),两个租户撞码就是串户 ——
  29. -- 顾客扫 A 商户的码,钱进了 B 商户的账。
  30. CREATE UNIQUE INDEX IF NOT EXISTS uk_receive_code_no
  31. ON pay_receive_code (code_no);
  32. -- 同租户内不允许重名:不然商户在列表里看到两个「前台」没法选。
  33. CREATE UNIQUE INDEX IF NOT EXISTS uk_receive_code_name
  34. ON pay_receive_code (tenant_id, name);
  35. CREATE INDEX IF NOT EXISTS idx_receive_code_mch
  36. ON pay_receive_code (merchant_id);
  37. COMMENT ON TABLE pay_receive_code IS '收款码(长期固定码,商户可建多个、可命名、可停用;只承载入口不承载金额,订单由顾客在收银台确认时创建)';
  38. COMMENT ON COLUMN pay_receive_code.id IS '主键ID(应用侧雪花生成)';
  39. COMMENT ON COLUMN pay_receive_code.tenant_id IS '租户ID(由 MyBatis-Plus 拦截器填,归属只来自认证上下文)';
  40. COMMENT ON COLUMN pay_receive_code.code_no IS 'URL 短码(32 位随机,不可枚举;出现在公开收银台地址上,全局唯一)';
  41. COMMENT ON COLUMN pay_receive_code.name IS '码名称(商户自取,如「前台」「3号桌」;同租户内唯一)';
  42. COMMENT ON COLUMN pay_receive_code.merchant_id IS '绑定的商户,指向 pay_lsy_merchant.id';
  43. COMMENT ON COLUMN pay_receive_code.status IS '状态(ENABLED 启用 / DISABLED 停用;停用后收银台返回「链接无效」页)';
  44. COMMENT ON COLUMN pay_receive_code.remark IS '备注';
  45. COMMENT ON COLUMN pay_receive_code.created_time IS '创建时间';
  46. COMMENT ON COLUMN pay_receive_code.updated_time IS '更新时间';
  47. -- 只读核对(执行后可手工跑一遍确认)
  48. -- SELECT column_name, data_type, is_nullable FROM information_schema.columns
  49. -- WHERE table_name = 'pay_receive_code' ORDER BY ordinal_position; -- 期望 9 列
  50. -- SELECT indexname FROM pg_indexes WHERE tablename = 'pay_receive_code'; -- 期望含上述三条