侧边栏壁纸
博主头像
云BLOG 博主等级

行动起来,活在当下

  • 累计撰写 318 篇文章
  • 累计创建 6 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录
SQL

豆包创建的MYSQL生成语句,积分余额

Administrator
2025-09-23 / 0 评论 / 0 点赞 / 4 阅读 / 0 字
CREATE TABLE `glg_order_deduct_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `order_no` varchar(50) NOT NULL COMMENT '订单号(关联订单表)',
  `cardid` varchar(50) NOT NULL COMMENT '客户ID(关联客户表)',
  `deduct_type` tinyint(1) NOT NULL DEFAULT 0 COMMENT '扣减类型:0=其它,1=仅余额,2=仅积分,3=同时扣减余额和积分',
  `balance_switch` varchar(10) NOT NULL DEFAULT 'off' COMMENT '余额扣减开关状态:on=开启,off=关闭',
  `balance_deduct` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '扣减的余额(单位:元)',
  `point_deduct` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '扣减的积分(单位:分)',
  `balance_before` decimal(10,2) NOT NULL COMMENT '扣减前的余额',
  `balance_after` decimal(10,2) NOT NULL COMMENT '扣减后的余额',
  `point_before` decimal(10,2) NOT NULL COMMENT '扣减前的积分',
  `point_after` decimal(10,2) NOT NULL COMMENT '扣减后的积分',
  `operate_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '扣减时间',
  `operator` varchar(50) DEFAULT NULL COMMENT '操作人(如系统自动扣减则填system)',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注(如“订单支付扣减”)',
  PRIMARY KEY (`id`),
  KEY `idx_cardid` (`cardid`) COMMENT '客户ID索引,支持按客户查询',
  KEY `idx_operate_time` (`operate_time`) COMMENT '操作时间索引,支持按时间查询',
  KEY `idx_deduct_type` (`deduct_type`) COMMENT '扣减类型索引,支持按类型查询',
  KEY `idx_balance_switch` (`balance_switch`) COMMENT '余额开关状态索引,支持按开关状态查询',
  KEY `idx_cardid_time` (`cardid`,`operate_time`) COMMENT '客户+时间联合索引,优化客户历史查询',
  KEY `idx_order_no` (`order_no`) COMMENT '订单号索引,支持按订单查询',
  KEY `idx_balance_deduct` (`balance_deduct`) COMMENT '余额扣减索引,支持按余额扣减金额查询',
  KEY `idx_point_deduct` (`point_deduct`) COMMENT '积分扣减索引,支持按积分扣减数量查询'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单扣减记录表(支持同时记录余额和积分扣减)';

CREATE TABLE `glg_operation_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `module` varchar(50) NOT NULL COMMENT '操作模块(如:order,user,payment)',
  `operation` varchar(50) NOT NULL COMMENT '操作类型(如:create,update,deduct)',
  `business_no` varchar(50) DEFAULT NULL COMMENT '业务编号(如订单号、用户ID)',
  `content` text COMMENT '操作内容(JSON格式存储详细信息)',
  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '操作状态:1=成功,0=失败',
  `operator` varchar(50) DEFAULT NULL COMMENT '操作人(如系统自动则填system)',
  `ip` varchar(50) DEFAULT NULL COMMENT '操作IP地址',
  `operate_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注说明',
  PRIMARY KEY (`id`),
  KEY `idx_module` (`module`) COMMENT '模块索引',
  KEY `idx_operation` (`operation`) COMMENT '操作类型索引',
  KEY `idx_business_no` (`business_no`) COMMENT '业务编号索引',
  KEY `idx_operate_time` (`operate_time`) COMMENT '操作时间索引',
  KEY `idx_module_time` (`module`,`operate_time`) COMMENT '模块+时间联合索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='全局操作日志表(记录系统各类关键操作)';
    

方式 1:记录成功操作(简化方法)


// 例如:订单支付成功后记录日志
public function paySuccess() {
    // 业务逻辑:订单支付处理...
    $orderNo = "ORD20250923001";
    $payData = [
        'order_no' => $orderNo,
        'amount' => 199.99,
        'pay_type' => 'wechat'
    ];
    
    // 调用成功日志方法
    $this->recordSuccessLog(
        'order',               // 模块(如订单模块)
        'pay',                 // 操作类型(如支付)
        $payData,              // 操作详情(数组格式,会自动转JSON)
        $orderNo,              // 业务编号(如订单号,便于后续查询)
        '订单支付成功'         // 备注说明
    );
    
    return ['code' => 0, 'msg' => '支付成功'];
}

方式 2:记录失败操作(简化方法)

// 例如:用户登录失败后记录日志
public function login() {
    try {
        $username = input('username');
        // 业务逻辑:登录验证...
        if (/* 验证失败 */) {
            throw new \Exception("密码错误");
        }
    } catch (\Exception $e) {
        // 调用失败日志方法
        $this->recordFailLog(
            'user',               // 模块(如用户模块)
            'login',              // 操作类型(如登录)
            [
                'username' => $username,
                'error' => $e->getMessage()
            ],                    // 失败详情
            $username,            // 业务编号(如用户名)
            '用户登录失败'         // 备注说明
        );
        
        return ['code' => 1, 'msg' => $e->getMessage()];
    }
}

方式 3:通用日志方法(可自定义状态)

// 例如:库存调整(非成功/失败,而是“调整”状态)
public function adjustStock() {
    $goodsId = 1001;
    $stockData = [
        'goods_id' => $goodsId,
        'old_stock' => 100,
        'new_stock' => 80,
        'adjust_num' => -20
    ];
    
    // 调用通用日志方法,自定义status(1=成功,0=失败,也可扩展其他状态)
    $this->recordLog(
        'goods',               // 模块(如商品模块)
        'adjust_stock',        // 操作类型(如调整库存)
        $stockData,            // 操作详情
        (string)$goodsId,      // 业务编号(如商品ID)
        1,                     // 状态(1=成功)
        '库存调整完成'         // 备注
    );
    
    return ['code' => 0, 'msg' => '库存调整成功'];
}

3. 查看日志记录

日志会自动保存到 glg_operation_log 表中,你可以通过数据库工具(如 Navicat)直接查询:

-- 查看所有订单相关的成功日志
SELECT * FROM glg_operation_log 
WHERE module = 'order' AND status = 1 
ORDER BY operate_time DESC;

-- 查看指定订单号的日志
SELECT * FROM glg_operation_log 
WHERE business_no = 'ORD20250923001';

关键说明

  • 自动填充的信息:操作人(默认 system 或登录用户)、IP 地址、操作时间会自动记录,无需手动传递。

  • 详情数据$data 参数支持任意数组,会自动转为 JSON 存储,方便后续解析(如查看修改前后的对比)。

  • 通用性:所有继承 BaseMethod 的控制器都能直接使用,无需重复引入或定义。

按照这种方式,你可以在项目的任何业务节点(创建、修改、删除、支付等)快速记录操作日志,便于后期排查问题和数据追踪。

0

评论区