租户费用模块SQL.sql 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. -- 租户费用模块 SQL(MVP)
  2. -- 适用数据库:MySQL 8.x
  3. -- 说明:
  4. -- 1) 先执行租户扩展字段,再执行计费基础表;
  5. -- 2) 初始化示例数据可按需执行;
  6. -- 3) 所有金额统一使用 DECIMAL,避免浮点误差。
  7. -- 4) 已按库类型拆分为:
  8. -- - docs/租户费用模块SQL-master.sql(总库执行)
  9. -- - docs/租户费用模块SQL-tenant.sql(租户库执行)
  10. /* =========================================================
  11. 0. 租户表扩展(tenant_info)
  12. ========================================================= */
  13. ALTER TABLE tenant_info
  14. ADD COLUMN tenant_type VARCHAR(16) NOT NULL DEFAULT 'NON_AI' COMMENT '租户类型: NON_AI/AI',
  15. ADD COLUMN billing_mode VARCHAR(16) NOT NULL DEFAULT 'PREPAID' COMMENT '计费模式: PREPAID/POSTPAID',
  16. ADD COLUMN fee_plan_code VARCHAR(64) DEFAULT NULL COMMENT '绑定计费方案编码',
  17. ADD COLUMN fee_plan_version INT DEFAULT NULL COMMENT '绑定计费方案版本';
  18. /* =========================================================
  19. 1. 计费方案
  20. ========================================================= */
  21. CREATE TABLE IF NOT EXISTS fee_plan (
  22. id BIGINT NOT NULL AUTO_INCREMENT,
  23. plan_code VARCHAR(64) NOT NULL COMMENT '方案编码',
  24. plan_name VARCHAR(128) NOT NULL COMMENT '方案名称',
  25. version INT NOT NULL COMMENT '版本号',
  26. status VARCHAR(16) NOT NULL DEFAULT 'DRAFT' COMMENT 'DRAFT/PUBLISHED/ARCHIVED',
  27. effective_time DATETIME DEFAULT NULL COMMENT '生效时间',
  28. expire_time DATETIME DEFAULT NULL COMMENT '失效时间',
  29. remark VARCHAR(500) DEFAULT NULL,
  30. create_by VARCHAR(64) DEFAULT NULL,
  31. create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  32. update_by VARCHAR(64) DEFAULT NULL,
  33. update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  34. PRIMARY KEY (id),
  35. UNIQUE KEY uk_plan_ver (plan_code, version),
  36. KEY idx_status (status)
  37. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='计费方案主表';
  38. CREATE TABLE IF NOT EXISTS fee_plan_item (
  39. id BIGINT NOT NULL AUTO_INCREMENT,
  40. plan_code VARCHAR(64) NOT NULL,
  41. version INT NOT NULL,
  42. item_code VARCHAR(64) NOT NULL COMMENT 'FLOW_POSTPAID/CALL_OUT/CALL_IN/AI_CALL/SOP_TOKEN/AI_REPLY_TOKEN/ADD_WECHAT/OPEN_ACCOUNT_NON_AI/OPEN_ACCOUNT_AI',
  43. unit VARCHAR(32) NOT NULL COMMENT 'GB/MIN/TOKEN/COUNT/TIME',
  44. unit_price DECIMAL(18,6) NOT NULL DEFAULT 0 COMMENT '单价',
  45. token_unit BIGINT DEFAULT NULL COMMENT 'token计费单位(如100000)',
  46. min_charge_unit INT DEFAULT NULL COMMENT '最小计费单位(如通话最小1分钟)',
  47. enabled TINYINT NOT NULL DEFAULT 1,
  48. create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  49. update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  50. PRIMARY KEY (id),
  51. UNIQUE KEY uk_plan_item (plan_code, version, item_code)
  52. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='计费项配置';
  53. CREATE TABLE IF NOT EXISTS fee_plan_flow_tier (
  54. id BIGINT NOT NULL AUTO_INCREMENT,
  55. plan_code VARCHAR(64) NOT NULL,
  56. version INT NOT NULL,
  57. min_prepay_amount DECIMAL(18,2) NOT NULL COMMENT '最低预存金额(含)',
  58. max_prepay_amount DECIMAL(18,2) DEFAULT NULL COMMENT '最高预存金额(不含,空为无上限)',
  59. unit_price DECIMAL(18,6) NOT NULL COMMENT '流量单价(元/GB)',
  60. sort_no INT NOT NULL DEFAULT 0,
  61. create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  62. PRIMARY KEY (id),
  63. UNIQUE KEY uk_tier (plan_code, version, min_prepay_amount)
  64. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流量阶梯配置';
  65. /* =========================================================
  66. 2. 钱包与流水
  67. ========================================================= */
  68. CREATE TABLE IF NOT EXISTS tenant_wallet (
  69. id BIGINT NOT NULL AUTO_INCREMENT,
  70. tenant_id BIGINT NOT NULL,
  71. balance_amount DECIMAL(18,2) NOT NULL DEFAULT 0 COMMENT '可用余额',
  72. frozen_amount DECIMAL(18,2) NOT NULL DEFAULT 0 COMMENT '冻结金额',
  73. credit_limit DECIMAL(18,2) NOT NULL DEFAULT 0 COMMENT '授信额度(后付费可用)',
  74. total_recharge DECIMAL(18,2) NOT NULL DEFAULT 0 COMMENT '累计充值',
  75. total_cost DECIMAL(18,2) NOT NULL DEFAULT 0 COMMENT '累计消费',
  76. update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  77. create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  78. PRIMARY KEY (id),
  79. UNIQUE KEY uk_tenant_wallet (tenant_id)
  80. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租户钱包';
  81. CREATE TABLE IF NOT EXISTS tenant_wallet_txn (
  82. id BIGINT NOT NULL AUTO_INCREMENT,
  83. tenant_id BIGINT NOT NULL,
  84. txn_no VARCHAR(64) NOT NULL,
  85. txn_type VARCHAR(32) NOT NULL COMMENT 'RECHARGE/CONSUME/ADJUST/REFUND',
  86. amount DECIMAL(18,2) NOT NULL COMMENT '消费建议记录为负数',
  87. balance_after DECIMAL(18,2) NOT NULL,
  88. biz_type VARCHAR(64) DEFAULT NULL COMMENT 'FLOW/CALL/TOKEN/ADD_WECHAT/OPEN_ACCOUNT',
  89. biz_id VARCHAR(64) DEFAULT NULL COMMENT '关联业务ID',
  90. remark VARCHAR(500) DEFAULT NULL,
  91. create_by VARCHAR(64) DEFAULT NULL,
  92. create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  93. PRIMARY KEY (id),
  94. UNIQUE KEY uk_txn_no (txn_no),
  95. KEY idx_tenant_time (tenant_id, create_time)
  96. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='钱包流水';
  97. /* =========================================================
  98. 3. 用量事件与计费明细
  99. ========================================================= */
  100. CREATE TABLE IF NOT EXISTS usage_event (
  101. id BIGINT NOT NULL AUTO_INCREMENT,
  102. event_id VARCHAR(64) NOT NULL COMMENT '幂等ID',
  103. tenant_id BIGINT NOT NULL,
  104. event_type VARCHAR(32) NOT NULL COMMENT 'FLOW/CALL/TOKEN_SOP/TOKEN_AI_REPLY/ADD_WECHAT/OPEN_ACCOUNT',
  105. sub_type VARCHAR(32) DEFAULT NULL COMMENT 'CALL_IN/CALL_OUT/AI_CALL 等',
  106. biz_id VARCHAR(64) DEFAULT NULL,
  107. usage_value DECIMAL(20,6) NOT NULL,
  108. usage_unit VARCHAR(32) NOT NULL COMMENT 'GB/MB/SECOND/TOKEN/COUNT',
  109. occurred_at DATETIME NOT NULL,
  110. ext_json JSON DEFAULT NULL,
  111. create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  112. PRIMARY KEY (id),
  113. UNIQUE KEY uk_event_id (event_id),
  114. KEY idx_tenant_type_time (tenant_id, event_type, occurred_at)
  115. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用量事件';
  116. CREATE TABLE IF NOT EXISTS billing_detail (
  117. id BIGINT NOT NULL AUTO_INCREMENT,
  118. tenant_id BIGINT NOT NULL,
  119. statement_id BIGINT DEFAULT NULL,
  120. event_id VARCHAR(64) NOT NULL,
  121. event_type VARCHAR(32) NOT NULL,
  122. sub_type VARCHAR(32) DEFAULT NULL,
  123. plan_code VARCHAR(64) NOT NULL,
  124. plan_version INT NOT NULL,
  125. unit_price DECIMAL(18,6) NOT NULL,
  126. usage_value DECIMAL(20,6) NOT NULL,
  127. charge_value DECIMAL(20,6) NOT NULL COMMENT '计费量,如向上取整后的分钟',
  128. amount DECIMAL(18,2) NOT NULL,
  129. billing_mode VARCHAR(16) NOT NULL COMMENT 'PREPAID/POSTPAID',
  130. occurred_at DATETIME NOT NULL,
  131. create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  132. PRIMARY KEY (id),
  133. UNIQUE KEY uk_event_type_sub (event_id, event_type, sub_type),
  134. KEY idx_tenant_time (tenant_id, occurred_at),
  135. KEY idx_statement (statement_id)
  136. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='计费明细';
  137. /* =========================================================
  138. 4. 账单
  139. ========================================================= */
  140. CREATE TABLE IF NOT EXISTS billing_statement (
  141. id BIGINT NOT NULL AUTO_INCREMENT,
  142. statement_no VARCHAR(64) NOT NULL,
  143. tenant_id BIGINT NOT NULL,
  144. period_type VARCHAR(16) NOT NULL COMMENT 'DAILY/MONTHLY',
  145. period_start DATETIME NOT NULL,
  146. period_end DATETIME NOT NULL,
  147. total_amount DECIMAL(18,2) NOT NULL DEFAULT 0,
  148. paid_amount DECIMAL(18,2) NOT NULL DEFAULT 0,
  149. unpaid_amount DECIMAL(18,2) NOT NULL DEFAULT 0,
  150. status VARCHAR(16) NOT NULL DEFAULT 'INIT' COMMENT 'INIT/CONFIRMED/PAID/PARTIAL',
  151. create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  152. update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  153. PRIMARY KEY (id),
  154. UNIQUE KEY uk_statement_no (statement_no),
  155. KEY idx_tenant_period (tenant_id, period_start, period_end)
  156. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='账单主表';
  157. CREATE TABLE IF NOT EXISTS billing_statement_item (
  158. id BIGINT NOT NULL AUTO_INCREMENT,
  159. statement_id BIGINT NOT NULL,
  160. item_code VARCHAR(64) NOT NULL,
  161. amount DECIMAL(18,2) NOT NULL DEFAULT 0,
  162. usage_value DECIMAL(20,6) NOT NULL DEFAULT 0,
  163. unit VARCHAR(32) DEFAULT NULL,
  164. create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  165. PRIMARY KEY (id),
  166. UNIQUE KEY uk_stmt_item (statement_id, item_code),
  167. KEY idx_statement_id (statement_id)
  168. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='账单项汇总';
  169. /* =========================================================
  170. 5. 初始化示例数据(可选)
  171. ========================================================= */
  172. INSERT INTO fee_plan(plan_code, plan_name, version, status, effective_time, remark)
  173. VALUES ('STANDARD', '标准计费方案', 1, 'PUBLISHED', NOW(), '默认方案')
  174. ON DUPLICATE KEY UPDATE plan_name=VALUES(plan_name), status=VALUES(status), effective_time=VALUES(effective_time), remark=VALUES(remark);
  175. INSERT INTO fee_plan_item(plan_code, version, item_code, unit, unit_price, min_charge_unit, token_unit, enabled) VALUES
  176. ('STANDARD',1,'FLOW_POSTPAID','GB',0.20,NULL,NULL,1),
  177. ('STANDARD',1,'CALL_OUT','MIN',0.30,1,NULL,1),
  178. ('STANDARD',1,'CALL_IN','MIN',0.20,1,NULL,1),
  179. ('STANDARD',1,'AI_CALL','MIN',0.15,1,NULL,1),
  180. ('STANDARD',1,'SOP_TOKEN','TOKEN',1.00,NULL,100000,1),
  181. ('STANDARD',1,'AI_REPLY_TOKEN','TOKEN',1.00,NULL,100000,1),
  182. ('STANDARD',1,'ADD_WECHAT','COUNT',0.50,NULL,NULL,1),
  183. ('STANDARD',1,'OPEN_ACCOUNT_NON_AI','TIME',1000.00,NULL,NULL,1),
  184. ('STANDARD',1,'OPEN_ACCOUNT_AI','TIME',3000.00,NULL,NULL,1)
  185. ON DUPLICATE KEY UPDATE unit=VALUES(unit), unit_price=VALUES(unit_price), min_charge_unit=VALUES(min_charge_unit), token_unit=VALUES(token_unit), enabled=VALUES(enabled);
  186. INSERT INTO fee_plan_flow_tier(plan_code, version, min_prepay_amount, max_prepay_amount, unit_price, sort_no) VALUES
  187. ('STANDARD',1,100000,200000,0.10,1),
  188. ('STANDARD',1,200000,NULL,0.08,2)
  189. ON DUPLICATE KEY UPDATE max_prepay_amount=VALUES(max_prepay_amount), unit_price=VALUES(unit_price), sort_no=VALUES(sort_no);