fix(transfer): restore tcode param, check done→show msg, matched→do accounting

This commit is contained in:
yumoqing 2026-07-17 13:08:34 +08:00
parent 455d873167
commit 24337faa55
2 changed files with 67 additions and 50 deletions

View File

@ -1,21 +1,32 @@
"""扫描所有转账邮件,完成全部待入账转账""" """扫描邮箱检查指定转账码是否已到账,如匹配则入账"""
tcode = str(params_kw.tcode)
env = request._run_ns env = request._run_ns
debug(f'transfer_check.dspy: checking all mails') debug(f'transfer_check.dspy: tcode={tcode}')
try: try:
provider = env.PROVIDERS.get('transfer') provider = env.PROVIDERS.get('transfer')
if provider is None: if provider is None:
return {"widgettype": "Message", "options": {"timeout": 3, "title": "错误", "message": "转账渠道未初始化"}} return {"widgettype": "Message", "options": {"timeout": 3, "title": "错误", "message": "转账渠道未初始化"}}
ec = EmailClient(provider.pop3server, provider.email, provider.password)
count, _ = ec.stat()
debug(f'transfer_check: got {count} mails')
db = DBPools() db = DBPools()
dbname = get_module_dbname('unipay') dbname = get_module_dbname('unipay')
processed = []
skipped = []
# 先检查是否已入账
async with db.sqlorContext(dbname) as sor:
recs = await sor.R('transfercode', {'tcode': tcode})
if recs and recs[0].status == '1':
tc = recs[0]
return {"widgettype": "Message", "options": {
"timeout": 5, "title": "已入账",
"message": f"转账码 {tcode} 已入账 {tc.amount} 元"
}}
# 扫描邮件匹配转账码
ec = EmailClient(provider.pop3server, provider.email, provider.password)
count, _ = ec.stat()
debug(f'transfer_check: got {count} mails, searching for tcode={tcode}')
matched = None
for i in range(count, 0, -1): for i in range(count, 0, -1):
try: try:
mail = ec.get_mail(i) mail = ec.get_mail(i)
@ -26,52 +37,55 @@ try:
data = provider.get_transfer_data(mail) data = provider.get_transfer_data(mail)
if data is None: if data is None:
continue continue
if str(data.code) == tcode:
matched = data
break
except Exception as e:
debug(f'transfer_check: skip mail {i}: {e}')
code = str(data.code) if matched is None:
amount = data.amount return {"widgettype": "Message", "options": {
debug(f'transfer_check: mail[{i}] code={code} amount={amount}') "timeout": 5, "title": "尚未到账",
"message": f"暂未收到转账码 {tcode} 的到账通知,请确认已转账并稍后重试"
}}
async with db.sqlorContext(dbname) as sor: # 匹配到邮件,执行入账
recs = await sor.R('transfercode', {'tcode': code, 'status': '0'}) async with db.sqlorContext(dbname) as sor:
if len(recs) < 1: recs = await sor.R('transfercode', {'tcode': tcode, 'status': '0'})
skipped.append(f'转账码{code} (已处理/不存在)') if len(recs) < 1:
continue return {"widgettype": "Message", "options": {
"timeout": 3, "title": "已处理", "message": f"转账码 {tcode} 已处理或不存在"
}}
tc = recs[0] tc = recs[0]
diff = abs(float(amount) - float(tc.amount)) diff = abs(float(matched.amount) - float(tc.amount))
if diff > 0.01: if diff > 0.01:
await sor.U('transfercode', {'id': tc.id, 'status': '9', await sor.U('transfercode', {'id': tc.id, 'status': '9',
'remark': f'金额不匹配: 到账{amount} 期望{tc.amount}'}) 'remark': f'金额不匹配: 到账{matched.amount} 期望{tc.amount}'})
skipped.append(f'转账码{code} (金额不匹配: {amount}≠{tc.amount})') return {"widgettype": "Message", "options": {
continue "timeout": 5, "title": "金额不匹配",
"message": f"到账金额 {matched.amount} 与充值金额 {tc.amount} 不一致,请联系客服"
}}
biz_date = await env.get_business_date(sor) biz_date = await env.get_business_date(sor)
await sor.U('transfercode', {'id': tc.id, 'status': '1'}) await sor.U('transfercode', {'id': tc.id, 'status': '1'})
recs2 = await sor.R('payment_log', {'id': tc.id, 'payment_status': '0'}) recs2 = await sor.R('payment_log', {'id': tc.id, 'payment_status': '0'})
if len(recs2) > 0: if len(recs2) > 0:
plog = recs2[0] plog = recs2[0]
await env.recharge_accounting(sor, await env.recharge_accounting(sor,
plog.customerid, 'RECHARGE', plog.id, plog.customerid, 'RECHARGE', plog.id,
biz_date, plog.amount_total, plog.pay_feerate) biz_date, plog.amount_total, plog.pay_feerate)
await sor.U('payment_log', { await sor.U('payment_log', {
'id': plog.id, 'id': plog.id,
'payment_status': '1', 'payment_status': '1',
'payed_timestamp': timestampstr() 'payed_timestamp': timestampstr()
}) })
processed.append(f'转账码{code} 到账{amount}元') return {"widgettype": "Message", "options": {
"timeout": 5, "title": "充值成功",
except Exception as e2: "message": f"转账码 {tcode} 已确认到账 {matched.amount} 元,充值完成"
debug(f'transfer_check: mail[{i}] error: {e2}') }}
msg = f'处理完成: {len(processed)} 笔入账'
if processed:
msg += '\n' + '\n'.join(processed)
if skipped:
msg += '\n跳过: ' + ', '.join(skipped)
return {"widgettype": "Message", "options": {"timeout": 5, "title": "转账检查结果", "message": msg}}
except Exception as e: except Exception as e:
exception(f'transfer_check.dspy error: {e}') exception(f'transfer_check.dspy error: {e}')

View File

@ -43,14 +43,17 @@
"event": "click", "event": "click",
"actiontype": "urlwidget", "actiontype": "urlwidget",
"options": { "options": {
"url": "{{entire_url('transfer_check.dspy')}}" "url": "{{entire_url('transfer_check.dspy')}}",
"params": {
"tcode": "{{params_kw.tcode}}"
}
} }
}] }]
}, },
{ {
"widgettype": "Text", "widgettype": "Text",
"options": { "options": {
"text": "点击上方按钮检查转账到账状态,系统将自动匹配转账码并完成充值。如有疑问请联系客服。" "text": "转账完成后点击上方按钮检查到账状态,系统将自动匹配并完成充值。如有疑问请联系客服。"
} }
} }
] ]