feat: 实现设备管理和设备导入功能,修复测试问题
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 5m30s
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 5m30s
主要变更: - 实现设备管理模块(创建、查询、列表、更新状态、删除) - 实现设备批量导入功能(CSV 解析、ICCID 绑定、异步任务处理) - 添加设备-SIM 卡绑定约束(部分唯一索引防止并发问题) - 修复 fee_rate 数据库字段类型(numeric -> bigint) - 修复测试数据隔离问题(基于增量断言) - 修复集成测试中间件顺序问题 - 清理无用测试文件(PersonalCustomer、Email 相关) - 归档 enterprise-card-authorization 变更
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
-- 回滚:删除设备导入任务表
|
||||
|
||||
DROP TABLE IF EXISTS tb_device_import_task;
|
||||
69
migrations/000018_create_device_import_task_table.up.sql
Normal file
69
migrations/000018_create_device_import_task_table.up.sql
Normal file
@@ -0,0 +1,69 @@
|
||||
-- 创建设备导入任务表
|
||||
-- 用于记录设备批量导入的任务状态和处理结果
|
||||
|
||||
CREATE TABLE IF NOT EXISTS tb_device_import_task (
|
||||
-- 基础字段
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
||||
deleted_at TIMESTAMP,
|
||||
creator BIGINT,
|
||||
updater BIGINT,
|
||||
|
||||
-- 任务标识
|
||||
task_no VARCHAR(50) NOT NULL UNIQUE,
|
||||
batch_no VARCHAR(100),
|
||||
|
||||
-- 文件信息
|
||||
storage_key VARCHAR(500),
|
||||
file_name VARCHAR(255),
|
||||
|
||||
-- 任务状态: 1-待处理 2-处理中 3-已完成 4-失败
|
||||
status INT NOT NULL DEFAULT 1,
|
||||
|
||||
-- 处理结果统计
|
||||
total_count INT DEFAULT 0,
|
||||
success_count INT DEFAULT 0,
|
||||
skip_count INT DEFAULT 0,
|
||||
fail_count INT DEFAULT 0,
|
||||
|
||||
-- 处理详情(JSONB 存储跳过和失败的记录)
|
||||
skipped_items JSONB,
|
||||
failed_items JSONB,
|
||||
|
||||
-- 错误信息
|
||||
error_message TEXT,
|
||||
|
||||
-- 时间戳
|
||||
started_at TIMESTAMP,
|
||||
completed_at TIMESTAMP
|
||||
);
|
||||
|
||||
-- 索引
|
||||
CREATE INDEX idx_device_import_task_status ON tb_device_import_task(status);
|
||||
CREATE INDEX idx_device_import_task_batch_no ON tb_device_import_task(batch_no);
|
||||
CREATE INDEX idx_device_import_task_created_at ON tb_device_import_task(created_at);
|
||||
CREATE INDEX idx_device_import_task_deleted_at ON tb_device_import_task(deleted_at);
|
||||
|
||||
-- 字段注释
|
||||
COMMENT ON TABLE tb_device_import_task IS '设备导入任务表';
|
||||
COMMENT ON COLUMN tb_device_import_task.id IS '主键ID';
|
||||
COMMENT ON COLUMN tb_device_import_task.created_at IS '创建时间';
|
||||
COMMENT ON COLUMN tb_device_import_task.updated_at IS '更新时间';
|
||||
COMMENT ON COLUMN tb_device_import_task.deleted_at IS '删除时间(软删除)';
|
||||
COMMENT ON COLUMN tb_device_import_task.creator IS '创建人ID';
|
||||
COMMENT ON COLUMN tb_device_import_task.updater IS '更新人ID';
|
||||
COMMENT ON COLUMN tb_device_import_task.task_no IS '任务编号(唯一)';
|
||||
COMMENT ON COLUMN tb_device_import_task.batch_no IS '批次号';
|
||||
COMMENT ON COLUMN tb_device_import_task.storage_key IS '对象存储文件路径';
|
||||
COMMENT ON COLUMN tb_device_import_task.file_name IS '原始文件名';
|
||||
COMMENT ON COLUMN tb_device_import_task.status IS '任务状态: 1-待处理 2-处理中 3-已完成 4-失败';
|
||||
COMMENT ON COLUMN tb_device_import_task.total_count IS '总记录数';
|
||||
COMMENT ON COLUMN tb_device_import_task.success_count IS '成功数';
|
||||
COMMENT ON COLUMN tb_device_import_task.skip_count IS '跳过数';
|
||||
COMMENT ON COLUMN tb_device_import_task.fail_count IS '失败数';
|
||||
COMMENT ON COLUMN tb_device_import_task.skipped_items IS '跳过记录详情(JSON数组)';
|
||||
COMMENT ON COLUMN tb_device_import_task.failed_items IS '失败记录详情(JSON数组)';
|
||||
COMMENT ON COLUMN tb_device_import_task.error_message IS '错误信息';
|
||||
COMMENT ON COLUMN tb_device_import_task.started_at IS '开始处理时间';
|
||||
COMMENT ON COLUMN tb_device_import_task.completed_at IS '完成时间';
|
||||
@@ -0,0 +1,9 @@
|
||||
-- 回滚:修复设备-SIM卡绑定隐患
|
||||
|
||||
-- 删除设备插槽唯一索引
|
||||
DROP INDEX IF EXISTS idx_active_device_slot;
|
||||
|
||||
-- 删除导入任务表的警告字段
|
||||
ALTER TABLE tb_device_import_task
|
||||
DROP COLUMN IF EXISTS warning_count,
|
||||
DROP COLUMN IF EXISTS warning_items;
|
||||
18
migrations/000019_fix_device_sim_binding_constraints.up.sql
Normal file
18
migrations/000019_fix_device_sim_binding_constraints.up.sql
Normal file
@@ -0,0 +1,18 @@
|
||||
-- 修复设备-SIM卡绑定隐患
|
||||
-- 1. 添加设备插槽唯一索引,防止同一插槽绑定多张卡
|
||||
-- 2. 为导入任务表添加警告字段,支持部分成功反馈
|
||||
|
||||
-- 使用 CONCURRENTLY 避免锁表(注意:需要在事务外执行,此处仅作为参考)
|
||||
-- 生产环境建议手动执行:CREATE UNIQUE INDEX CONCURRENTLY idx_active_device_slot ...
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS idx_active_device_slot
|
||||
ON tb_device_sim_binding (device_id, slot_position)
|
||||
WHERE bind_status = 1 AND deleted_at IS NULL;
|
||||
|
||||
-- 为导入任务表添加警告字段
|
||||
ALTER TABLE tb_device_import_task
|
||||
ADD COLUMN IF NOT EXISTS warning_count INT NOT NULL DEFAULT 0,
|
||||
ADD COLUMN IF NOT EXISTS warning_items JSONB;
|
||||
|
||||
-- 添加字段注释
|
||||
COMMENT ON COLUMN tb_device_import_task.warning_count IS '警告数量(部分成功的设备)';
|
||||
COMMENT ON COLUMN tb_device_import_task.warning_items IS '警告记录详情';
|
||||
3
migrations/000020_fix_fee_rate_column_type.down.sql
Normal file
3
migrations/000020_fix_fee_rate_column_type.down.sql
Normal file
@@ -0,0 +1,3 @@
|
||||
-- 回滚 fee_rate 字段类型变更
|
||||
ALTER TABLE tb_commission_withdrawal_setting
|
||||
ALTER COLUMN fee_rate TYPE numeric(5,4) USING (fee_rate::numeric / 10000);
|
||||
8
migrations/000020_fix_fee_rate_column_type.up.sql
Normal file
8
migrations/000020_fix_fee_rate_column_type.up.sql
Normal file
@@ -0,0 +1,8 @@
|
||||
-- 修复 tb_commission_withdrawal_setting 表的 fee_rate 字段类型
|
||||
-- 原类型 numeric(5,4) 只能存储 0.0000-9.9999,无法存储万分比值(如 100 表示 1%)
|
||||
-- 改为 bigint 与模型定义一致
|
||||
|
||||
ALTER TABLE tb_commission_withdrawal_setting
|
||||
ALTER COLUMN fee_rate TYPE bigint USING (fee_rate * 10000)::bigint;
|
||||
|
||||
COMMENT ON COLUMN tb_commission_withdrawal_setting.fee_rate IS '手续费率(万分比,如100表示1%)';
|
||||
Reference in New Issue
Block a user