Files
along_django/yonghu/xiugai_log.py
XingQue d3f6ff34bb 统一记录后台敏感操作到 xiugaijilu,并提供管理员操作日志查询接口。
覆盖商家/管事/组长资金与封禁、冻结解冻、后台账号变更;列表接口权限 000001。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-17 01:41:35 +08:00

103 lines
3.1 KiB
Python
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.
"""
后台敏感操作统一写入 xiugaijilu修改/操作日志)。
leixing 约定:
0=系统配置, 2=打手, 3=管事, 4=商家, 5=组长, 9=后台账号
"""
from __future__ import annotations
from decimal import Decimal
from typing import Any, Optional
from .models import Xiugaijilu
LEIXING_SYSTEM = 0
LEIXING_DASHOU = 2
LEIXING_GUANSHI = 3
LEIXING_SHANGJIA = 4
LEIXING_ZUZHANG = 5
LEIXING_KEFU = 9
LEIXING_NAME = {
LEIXING_SYSTEM: '系统配置',
LEIXING_DASHOU: '打手',
LEIXING_GUANSHI: '管事',
LEIXING_SHANGJIA: '商家',
LEIXING_ZUZHANG: '组长',
LEIXING_KEFU: '后台账号',
}
# 冻结提现类型 → 操作日志用户类型
FREEZE_TO_XIUGAI_LEIXING = {
1: LEIXING_DASHOU, # 打手佣金
2: LEIXING_GUANSHI, # 管事
5: LEIXING_DASHOU, # 打手押金
6: LEIXING_SHANGJIA, # 商家
}
FREEZE_LEIXING_NAME = {
1: '打手佣金',
2: '管事分红',
5: '打手押金',
6: '商家余额',
}
def _d(v: Any) -> Decimal:
if v is None:
return Decimal('0.00')
if isinstance(v, Decimal):
return v
return Decimal(str(v))
def write_xiugai_log(
*,
yonghuid: str,
operator_phone: str,
leixing: int,
qitashuoming: str = '',
dashou_yue_before=None,
dashou_yue_after=None,
jifen_before=None,
jifen_after=None,
yajin_before=None,
yajin_after=None,
shangjia_yue_before=None,
shangjia_yue_after=None,
guanshi_yue_before=None,
guanshi_yue_after=None,
zuzhang_yue_before=None,
zuzhang_yue_after=None,
huiyuants: int = 0,
huiyuan_id: Optional[str] = None,
) -> Xiugaijilu:
"""写入一条操作日志;金额类字段仅在传入时覆盖默认 0。"""
kwargs = {
'yonghuid': str(yonghuid or '')[:7],
'xiugaiid': str(operator_phone or '')[:30],
'leixing': int(leixing),
'qitashuoming': (qitashuoming or '')[:2000] or None,
'huiyuants': int(huiyuants or 0),
'huiyuan_id': (str(huiyuan_id)[:6] if huiyuan_id else None),
}
if dashou_yue_before is not None or dashou_yue_after is not None:
kwargs['xiugaitijiaoq'] = _d(dashou_yue_before)
kwargs['xiugaitijiao'] = _d(dashou_yue_after)
if jifen_before is not None or jifen_after is not None:
kwargs['yjifen'] = int(jifen_before or 0)
kwargs['jifen'] = int(jifen_after or 0)
if yajin_before is not None or yajin_after is not None:
kwargs['yyajin'] = _d(yajin_before)
kwargs['yajin'] = _d(yajin_after)
if shangjia_yue_before is not None or shangjia_yue_after is not None:
kwargs['shangjiayueq'] = _d(shangjia_yue_before)
kwargs['shangjiayue'] = _d(shangjia_yue_after)
if guanshi_yue_before is not None or guanshi_yue_after is not None:
kwargs['guanshiyueq'] = _d(guanshi_yue_before)
kwargs['guanshiyue'] = _d(guanshi_yue_after)
if zuzhang_yue_before is not None or zuzhang_yue_after is not None:
kwargs['zuzhangyueq'] = _d(zuzhang_yue_before)
kwargs['zuzhangyue'] = _d(zuzhang_yue_after)
return Xiugaijilu.objects.create(**kwargs)