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的控制器都能直接使用,无需重复引入或定义。
按照这种方式,你可以在项目的任何业务节点(创建、修改、删除、支付等)快速记录操作日志,便于后期排查问题和数据追踪。
评论区