文件
xionggeshop/addons/shopro_huifu/library/onboard/HuifuOnboardGate.php
可乐加冰 fec4d58e41 ```
feat(wallet): 用户提交时直连汇付API优化流程

- 移除数据库事务包装汇付API调用,避免长耗时锁表问题
- 用户提交申请时直接连接汇付服务,不再仅保存草稿等待后台处理
- 修改汇付重提交方法名为resubmit以明确区分不同操作
- 更新异常处理机制,增加Throwable捕获确保错误正确处理
- 调整提交成功后的消息提示内容,准确反映当前处理状态

fix(agent): 代理申请流程汇付集成优化

- 统一汇付进件提交失败的消息提示文本
- 优化代理申请状态判断逻辑,根据汇付载荷存在性决定提交方式
- 更新区域代理申请成功提示,区分已提交汇付和待提交场景
- 修复业务审核通过后的汇付提交触发机制

docs(huifu): 更新汇付进件相关文档说明

- 修改后台管理界面描述,体现用户直连汇付的新流程
- 更新业务审核状态下的操作指引说明
- 调整汇付网关类的方法注释,明确各方法职责变化
- 修正canSaveHuifuDraft方法注释,说明字段兼容性和新功能
```
2026-10-08 21:03:04 +08:00

148 行
5.2 KiB
PHP

<?php
namespace addons\shopro_huifu\library\onboard;
use addons\shopro_huifu\library\Bridge;
use addons\shopro_huifu\library\HuifuConfig;
use addons\shopro_huifu\model\Onboard;
use think\Db;
class HuifuOnboardGate
{
/**
* 与 shopro split Config::isHuifuMode 同口径,但不依赖核心是否已升级该方法
*/
public static function isHuifuSplitActive()
{
try {
$split = Db::name('shopro_split_config')->column('value', 'name');
} catch (\Exception $e) {
return false;
}
if (($split['split_enable'] ?? '0') !== '1') {
return false;
}
$mode = $split['split_mode'] ?? 'wechat';
if ($mode === 'huifu' || $mode === 'both') {
return true;
}
$provider = $split['split_provider'] ?? 'auto';
if ($provider === 'huifu') {
return true;
}
if ($provider === 'auto') {
return Bridge::isHuifuMiniProgramChannel('wxMiniProgram');
}
return false;
}
public static function isOnboardRequired()
{
if (!Bridge::isEnabled()) {
return false;
}
if (HuifuConfig::getInstance()->get('onboard_required', '1') === '0') {
return false;
}
return self::isHuifuSplitActive();
}
/**
* 后台业务审核通过后的兜底:若仍有未提交的 draft,则补提交汇付
* (正常路径已由用户提交时直连汇付)
*/
public static function submitOnBusinessApproved($userId, $roleType, $roleRefId)
{
if (!self::isOnboardRequired()) {
return null;
}
try {
$service = new HuifuOnboardService();
return $service->submitFromDraft($userId, $roleType, $roleRefId);
} catch (\Throwable $e) {
\think\Log::error('[shopro_huifu] onboard after admin approve fail uid=' . $userId . ' ' . $e->getMessage());
return null;
}
}
/**
* 用户端是否可重新提交汇付(仅汇付驳回/失败后)
*/
public static function canSubmitOnboard($userId, $roleType, $roleRefId, $agentStatus = '')
{
if (!self::isOnboardRequired()) {
return false;
}
$row = Onboard::findByRole($userId, $roleType, $roleRefId);
if (!$row) {
return false;
}
return in_array($row['onboard_status'], [
Onboard::STATUS_REJECTED,
Onboard::STATUS_FAILED,
], true);
}
/**
* 用户端是否可首次提交进件资料到汇付(字段名 can_save_draft 兼容旧前端)
*/
public static function canSaveHuifuDraft($userId, $roleType, $roleRefId, $agentStatus = '')
{
if (!self::isOnboardRequired()) {
return false;
}
$row = Onboard::findByRole($userId, $roleType, $roleRefId);
if ($row && $row['onboard_status'] === Onboard::STATUS_APPROVED) {
return false;
}
if ($row && in_array($row['onboard_status'], [
Onboard::STATUS_SUBMITTING,
Onboard::STATUS_BASIC_OK,
Onboard::STATUS_BUSI_PENDING,
], true)) {
return false;
}
// 已有 draft 且业务侧仍待审/驳回时,不允许反复改资料占坑(历史规则保留)
if ($row && $row['onboard_status'] === Onboard::STATUS_DRAFT
&& in_array($agentStatus, ['pending', 'needinfo', 'reject'], true)) {
return false;
}
return true;
}
public static function publicStatus($row, $userId = 0, $roleType = 'promoter', $roleRefId = 0, $agentStatus = '')
{
$required = self::isOnboardRequired();
$canSubmit = $required && $userId && self::canSubmitOnboard($userId, $roleType, $roleRefId, $agentStatus);
$canSaveDraft = $required && $userId && self::canSaveHuifuDraft($userId, $roleType, $roleRefId, $agentStatus);
// 仅历史 draft 残留时提示等待(正常已改为用户提交直连汇付)
$awaitAdmin = $required && $row && $row['onboard_status'] === Onboard::STATUS_DRAFT
&& in_array($agentStatus, ['pending', 'needinfo', 'reject'], true);
if (!$row) {
return [
'required' => $required,
'can_submit' => $canSubmit,
'can_save_draft' => $canSaveDraft,
'await_admin' => false,
'audit_first' => false,
'status' => null,
'huifu_id' => '',
'reject_reason' => '',
'draft' => null,
];
}
return [
'required' => $required,
'can_submit' => $canSubmit,
'can_save_draft' => $canSaveDraft,
'await_admin' => $awaitAdmin,
'audit_first' => false,
'status' => $row['onboard_status'],
'huifu_id' => $row['huifu_id'] ? substr($row['huifu_id'], 0, 4) . '****' . substr($row['huifu_id'], -4) : '',
'reject_reason' => $row['reject_reason'] ?? '',
'apply_no' => $row['apply_no'] ?? '',
'draft' => HuifuOnboardAdminView::clientFormFromRow($row),
];
}
}