租户费用模块SQL-master.sql 9.7 KB

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