代码迁移

This commit is contained in:
Neo
2025-11-18 02:28:47 +08:00
parent ccf3baca2b
commit 84e80841cd
86 changed files with 185483 additions and 0 deletions

View File

View File

@@ -0,0 +1,73 @@
# -*- coding: utf-8 -*-
"""余额一致性检查器"""
from .base_checker import BaseDataQualityChecker
class BalanceChecker(BaseDataQualityChecker):
"""检查订单、支付、退款的金额一致性"""
def check(self, store_id: int, start_date: str, end_date: str) -> dict:
"""
检查指定时间范围内的余额一致性
验证: 订单总额 = 支付总额 - 退款总额
"""
checks = []
# 查询订单总额
sql_orders = """
SELECT COALESCE(SUM(final_amount), 0) AS total
FROM billiards.fact_order
WHERE store_id = %s
AND order_time >= %s
AND order_time < %s
AND order_status = 'COMPLETED'
"""
order_total = self.db.query(sql_orders, (store_id, start_date, end_date))[0]["total"]
# 查询支付总额
sql_payments = """
SELECT COALESCE(SUM(pay_amount), 0) AS total
FROM billiards.fact_payment
WHERE store_id = %s
AND pay_time >= %s
AND pay_time < %s
AND pay_status = 'SUCCESS'
"""
payment_total = self.db.query(sql_payments, (store_id, start_date, end_date))[0]["total"]
# 查询退款总额
sql_refunds = """
SELECT COALESCE(SUM(refund_amount), 0) AS total
FROM billiards.fact_refund
WHERE store_id = %s
AND refund_time >= %s
AND refund_time < %s
AND refund_status = 'SUCCESS'
"""
refund_total = self.db.query(sql_refunds, (store_id, start_date, end_date))[0]["total"]
# 验证余额
expected_total = payment_total - refund_total
diff = abs(float(order_total) - float(expected_total))
threshold = 0.01 # 1分钱的容差
passed = diff < threshold
checks.append({
"name": "balance_consistency",
"passed": passed,
"message": f"订单总额: {order_total}, 支付-退款: {expected_total}, 差异: {diff}",
"details": {
"order_total": float(order_total),
"payment_total": float(payment_total),
"refund_total": float(refund_total),
"diff": diff
}
})
all_passed = all(c["passed"] for c in checks)
return {
"passed": all_passed,
"checks": checks
}

View File

@@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
"""数据质量检查器基类"""
class BaseDataQualityChecker:
"""数据质量检查器基类"""
def __init__(self, db_connection, logger):
self.db = db_connection
self.logger = logger
def check(self) -> dict:
"""
执行质量检查
返回: {
"passed": bool,
"checks": [{"name": str, "passed": bool, "message": str}]
}
"""
raise NotImplementedError("子类需实现 check 方法")