diff --git a/wwwroot/transfer_check.dspy b/wwwroot/transfer_check.dspy index d82312a..dd9fbf4 100644 --- a/wwwroot/transfer_check.dspy +++ b/wwwroot/transfer_check.dspy @@ -1,21 +1,32 @@ -"""扫描所有转账邮件,完成全部待入账转账""" +"""扫描邮箱检查指定转账码是否已到账,如匹配则入账""" +tcode = str(params_kw.tcode) env = request._run_ns -debug(f'transfer_check.dspy: checking all mails') +debug(f'transfer_check.dspy: tcode={tcode}') try: provider = env.PROVIDERS.get('transfer') if provider is None: 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() 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): try: mail = ec.get_mail(i) @@ -26,52 +37,55 @@ try: data = provider.get_transfer_data(mail) if data is None: 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) - amount = data.amount - debug(f'transfer_check: mail[{i}] code={code} amount={amount}') + if matched is None: + return {"widgettype": "Message", "options": { + "timeout": 5, "title": "尚未到账", + "message": f"暂未收到转账码 {tcode} 的到账通知,请确认已转账并稍后重试" + }} - async with db.sqlorContext(dbname) as sor: - recs = await sor.R('transfercode', {'tcode': code, 'status': '0'}) - if len(recs) < 1: - skipped.append(f'转账码{code} (已处理/不存在)') - continue + # 匹配到邮件,执行入账 + async with db.sqlorContext(dbname) as sor: + recs = await sor.R('transfercode', {'tcode': tcode, 'status': '0'}) + if len(recs) < 1: + return {"widgettype": "Message", "options": { + "timeout": 3, "title": "已处理", "message": f"转账码 {tcode} 已处理或不存在" + }} - tc = recs[0] - diff = abs(float(amount) - float(tc.amount)) - if diff > 0.01: - await sor.U('transfercode', {'id': tc.id, 'status': '9', - 'remark': f'金额不匹配: 到账{amount} 期望{tc.amount}'}) - skipped.append(f'转账码{code} (金额不匹配: {amount}≠{tc.amount})') - continue + tc = recs[0] + diff = abs(float(matched.amount) - float(tc.amount)) + if diff > 0.01: + await sor.U('transfercode', {'id': tc.id, 'status': '9', + 'remark': f'金额不匹配: 到账{matched.amount} 期望{tc.amount}'}) + return {"widgettype": "Message", "options": { + "timeout": 5, "title": "金额不匹配", + "message": f"到账金额 {matched.amount} 与充值金额 {tc.amount} 不一致,请联系客服" + }} - biz_date = await env.get_business_date(sor) - await sor.U('transfercode', {'id': tc.id, 'status': '1'}) + biz_date = await env.get_business_date(sor) + await sor.U('transfercode', {'id': tc.id, 'status': '1'}) - recs2 = await sor.R('payment_log', {'id': tc.id, 'payment_status': '0'}) - if len(recs2) > 0: - plog = recs2[0] - await env.recharge_accounting(sor, - plog.customerid, 'RECHARGE', plog.id, - biz_date, plog.amount_total, plog.pay_feerate) - await sor.U('payment_log', { - 'id': plog.id, - 'payment_status': '1', - 'payed_timestamp': timestampstr() - }) + recs2 = await sor.R('payment_log', {'id': tc.id, 'payment_status': '0'}) + if len(recs2) > 0: + plog = recs2[0] + await env.recharge_accounting(sor, + plog.customerid, 'RECHARGE', plog.id, + biz_date, plog.amount_total, plog.pay_feerate) + await sor.U('payment_log', { + 'id': plog.id, + 'payment_status': '1', + 'payed_timestamp': timestampstr() + }) - processed.append(f'转账码{code} 到账{amount}元') - - except Exception as e2: - 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}} + return {"widgettype": "Message", "options": { + "timeout": 5, "title": "充值成功", + "message": f"转账码 {tcode} 已确认到账 {matched.amount} 元,充值完成" + }} except Exception as e: exception(f'transfer_check.dspy error: {e}') diff --git a/wwwroot/transfer_info.ui b/wwwroot/transfer_info.ui index cbcba09..035eda8 100644 --- a/wwwroot/transfer_info.ui +++ b/wwwroot/transfer_info.ui @@ -43,14 +43,17 @@ "event": "click", "actiontype": "urlwidget", "options": { - "url": "{{entire_url('transfer_check.dspy')}}" + "url": "{{entire_url('transfer_check.dspy')}}", + "params": { + "tcode": "{{params_kw.tcode}}" + } } }] }, { "widgettype": "Text", "options": { - "text": "点击上方按钮检查转账到账状态,系统将自动匹配转账码并完成充值。如有疑问请联系客服。" + "text": "转账完成后点击上方按钮检查到账状态,系统将自动匹配并完成充值。如有疑问请联系客服。" } } ]