Files
kami_backend/tools/create_tables.go
danial f358aa0745 feat(jd-cookie): 引入用户订单号支持并重构订单创建逻辑
- 新增用户订单号字段以区分内部订单号
- 修改订单表结构添加 user_order_id 字段及索引
- 更新 CreateOrder 接口支持用户订单号参数-重构 CreateOrder 和 GetPaymentUrl 方法返回统一结果对象
- 新增模型定义用于封装订单创建与支付结果
- 调整相关逻辑方法签名与调用方式适配新结构- 优化订单创建流程增加内部订单号生成逻辑
- 完善订单查询逻辑确保正确关联用户订单号- 更新控制器层对接新版服务接口- 升级 Cookie 状态及订单状态管理枚举类型使用
2025-10-13 15:00:11 +08:00

234 lines
9.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"database/sql"
"fmt"
"log"
"strings"
_ "github.com/go-sql-driver/mysql"
)
func main() {
// 数据库连接信息
dsn := "root:Woaizixkie!123@tcp(localhost:3306)/kami?charset=utf8mb4&parseTime=True&loc=Local"
db, err := sql.Open("mysql", dsn)
if err != nil {
log.Fatal("连接数据库失败:", err)
}
defer db.Close()
// 测试连接
if err := db.Ping(); err != nil {
log.Fatal("数据库连接测试失败:", err)
}
fmt.Println("数据库连接成功!")
// 查看现有的cookie相关表
fmt.Println("\n现有的cookie相关表:")
rows, err := db.Query("SHOW TABLES LIKE '%cookie%'")
if err != nil {
log.Fatal("查询表失败:", err)
}
defer rows.Close()
for rows.Next() {
var tableName string
if err := rows.Scan(&tableName); err != nil {
log.Fatal("扫描结果失败:", err)
}
fmt.Println("-", tableName)
}
// 创建新的jd_cookie相关表
fmt.Println("\n开始创建新的jd_cookie表...")
// 读取SQL文件内容并执行
sqlStatements := []string{
// 1. Cookie账户表
`DROP TABLE IF EXISTS jd_cookie_account`,
`CREATE TABLE jd_cookie_account (
id bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
cookie_id varchar(64) NOT NULL COMMENT 'Cookie唯一标识',
cookie_value text NOT NULL COMMENT 'Cookie内容',
account_name varchar(100) DEFAULT NULL COMMENT '账户名称',
status tinyint NOT NULL DEFAULT 1 COMMENT '状态1正常 2暂停 3失效',
failure_count int DEFAULT 0 COMMENT '连续失败次数',
last_used_at datetime DEFAULT NULL COMMENT '最后使用时间',
suspend_until datetime DEFAULT NULL COMMENT '暂停解除时间',
remark varchar(500) DEFAULT NULL COMMENT '备注信息',
created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted_at datetime DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (id),
UNIQUE KEY uk_cookie_id (cookie_id),
KEY idx_status (status),
KEY idx_last_used (last_used_at),
KEY idx_suspend_until (suspend_until),
KEY idx_deleted_at (deleted_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='京东Cookie账户表'`,
// 2. 京东订单表
`DROP TABLE IF EXISTS jd_cookie_jd_order`,
`CREATE TABLE jd_cookie_jd_order (
id bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
jd_order_id varchar(64) NOT NULL COMMENT '京东订单号',
pay_id varchar(64) NOT NULL COMMENT '支付ID',
amount decimal(10,2) NOT NULL COMMENT '订单金额',
category varchar(50) NOT NULL COMMENT '商品品类',
cookie_id varchar(64) NOT NULL COMMENT '使用的Cookie ID',
status tinyint NOT NULL DEFAULT 1 COMMENT '状态1待支付 2已支付 3已过期 4已取消',
wx_pay_url text DEFAULT NULL COMMENT '微信支付链接',
wx_pay_expire_at datetime DEFAULT NULL COMMENT '微信支付链接过期时间',
order_expire_at datetime NOT NULL COMMENT '订单过期时间(默认24小时)',
current_order_id bigint DEFAULT NULL COMMENT '当前关联的订单ID',
paid_at datetime DEFAULT NULL COMMENT '支付完成时间',
card_no varchar(100) DEFAULT NULL COMMENT '卡号',
card_password varchar(100) DEFAULT NULL COMMENT '卡密',
card_extracted_at datetime DEFAULT NULL COMMENT '卡密提取时间',
created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted_at datetime DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (id),
KEY uk_jd_order_id (jd_order_id),
KEY idx_status (status),
KEY idx_cookie_id (cookie_id),
KEY idx_order_expire (order_expire_at),
KEY idx_current_order (current_order_id),
KEY idx_deleted_at (deleted_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='京东订单表'`,
// 3. 订单表
`DROP TABLE IF EXISTS jd_cookie_order`,
`CREATE TABLE jd_cookie_order (
id bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
order_id varchar(64) NOT NULL COMMENT '内部订单号',
user_order_id varchar(64) DEFAULT NULL COMMENT '用户订单号',
amount decimal(10,2) NOT NULL COMMENT '订单金额',
category varchar(50) NOT NULL COMMENT '商品品类',
jd_order_id varchar(64) DEFAULT NULL COMMENT '关联的京东订单号',
status tinyint NOT NULL DEFAULT 1 COMMENT '状态1待支付 2已支付 3已过期 4已取消',
wx_pay_url text DEFAULT NULL COMMENT '当前有效的微信支付链接',
last_request_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后请求时间',
created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted_at datetime DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (id),
UNIQUE KEY uk_order_id (order_id),
KEY idx_user_order_id (user_order_id),
KEY idx_status (status),
KEY idx_jd_order_id (jd_order_id),
KEY idx_last_request (last_request_at),
KEY idx_deleted_at (deleted_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单表'`,
// 4. Cookie变更历史表 - 根据记忆中的历史记录表简化原则进行优化
`DROP TABLE IF EXISTS jd_cookie_change_history`,
`CREATE TABLE jd_cookie_change_history (
id bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
history_uuid varchar(36) NOT NULL COMMENT '历史记录唯一标识',
cookie_id varchar(64) NOT NULL COMMENT 'Cookie ID',
change_type varchar(20) NOT NULL COMMENT '变更类型create,suspend,resume,fail,use,refresh_fail,replaced',
status_before tinyint DEFAULT NULL COMMENT '变更前状态',
status_after tinyint DEFAULT NULL COMMENT '变更后状态',
user_order_id varchar(64) DEFAULT NULL COMMENT '关联的订单号',
failure_count int DEFAULT NULL COMMENT '失败次数',
created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted_at datetime DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (id),
UNIQUE KEY uk_history_uuid (history_uuid),
KEY idx_cookie_id (cookie_id),
KEY idx_change_type (change_type),
KEY idx_created_at (created_at),
KEY idx_deleted_at (deleted_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Cookie变更历史表'`,
// 5. 京东订单变更历史表
`DROP TABLE IF EXISTS jd_cookie_jd_order_change_history`,
`CREATE TABLE jd_cookie_jd_order_change_history (
id bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
history_uuid varchar(36) NOT NULL COMMENT '历史记录唯一标识',
jd_order_id varchar(64) NOT NULL COMMENT '京东订单号',
change_type varchar(20) NOT NULL COMMENT '变更类型create,bind,unbind,pay,expire,invalid,replace',
order_id varchar(64) DEFAULT NULL COMMENT '关联的订单号',
wx_pay_url text DEFAULT NULL COMMENT '微信支付链接',
created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted_at datetime DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (id),
UNIQUE KEY uk_history_uuid (history_uuid),
KEY idx_jd_order_id (jd_order_id),
KEY idx_change_type (change_type),
KEY idx_created_at (created_at),
KEY idx_deleted_at (deleted_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='京东订单变更历史表'`,
// 6. 订单变更历史表
`DROP TABLE IF EXISTS jd_cookie_order_change_history`,
`CREATE TABLE jd_cookie_order_change_history (
id bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
history_uuid varchar(36) NOT NULL COMMENT '历史记录唯一标识',
order_id varchar(64) NOT NULL COMMENT '订单号',
change_type varchar(20) NOT NULL COMMENT '变更类型create,bind,pay,expire,rebind',
jd_order_id varchar(64) DEFAULT NULL COMMENT '关联的京东订单号',
created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted_at datetime DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (id),
UNIQUE KEY uk_history_uuid (history_uuid),
KEY idx_order_id (order_id),
KEY idx_change_type (change_type),
KEY idx_created_at (created_at),
KEY idx_deleted_at (deleted_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单变更历史表'`,
}
// 执行SQL语句
for i, stmt := range sqlStatements {
if strings.TrimSpace(stmt) == "" {
continue
}
fmt.Printf("执行SQL语句 %d/%d...\n", i+1, len(sqlStatements))
if _, err := db.Exec(stmt); err != nil {
fmt.Printf("执行SQL失败: %s\n错误: %v\n", stmt[:50]+"...", err)
continue
}
if strings.Contains(strings.ToUpper(stmt), "CREATE TABLE") {
// 提取表名
parts := strings.Fields(stmt)
for j, part := range parts {
if strings.ToUpper(part) == "TABLE" && j+1 < len(parts) {
tableName := parts[j+1]
fmt.Printf("✓ 成功创建表: %s\n", tableName)
break
}
}
}
}
// 验证表创建结果
fmt.Println("\n验证新创建的jd_cookie表:")
rows, err = db.Query("SHOW TABLES LIKE 'jd_cookie%'")
if err != nil {
log.Fatal("查询新表失败:", err)
}
defer rows.Close()
tableCount := 0
for rows.Next() {
var tableName string
if err := rows.Scan(&tableName); err != nil {
log.Fatal("扫描结果失败:", err)
}
fmt.Println("✓", tableName)
tableCount++
}
fmt.Printf("\n数据库表创建完成共创建了 %d 个新表。\n", tableCount)
}