文件
xionggeshop/application/admin/controller/shopro_huifu/Onboard.php
可乐加冰 38c66b8f5e ```
feat(shopro_huifu): 完善汇付进件功能的表单验证和错误处理

- 增加支行搜索功能的城市筛选支持,优化搜索逻辑
- 添加前端表单验证机制,包括身份证、银行卡、区域等必填字段校验
- 改进支行选择验证,确保必须从搜索结果中选择带联行号的支行
- 优化后端保存逻辑,添加强制保存参数控制
- 统一异常处理机制,增加HttpResponseException的正确抛出
- 完善用户界面提示信息,明确操作指引和错误反馈
- 修复表单提交前的数据准备逻辑,确保数据完整性
```
2026-09-29 16:08:44 +08:00

189 行
6.6 KiB
PHP

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

<?php
namespace app\admin\controller\shopro_huifu;
use addons\shopro_huifu\library\onboard\HuifuOnboardAdminService;
use addons\shopro_huifu\library\onboard\HuifuOnboardAdminView;
use addons\shopro_huifu\library\onboard\HuifuOnboardBankBranch;
use addons\shopro_huifu\library\onboard\HuifuOnboardError;
use addons\shopro_huifu\library\onboard\HuifuOnboardQuery;
use addons\shopro_huifu\library\onboard\HuifuOnboardService;
use addons\shopro_huifu\model\Onboard as OnboardModel;
use app\admin\controller\shopro\Base;
class Onboard extends Base
{
protected $noNeedRight = ['userRoles', 'searchUser', 'searchBranch'];
public function index()
{
if ($this->request->isAjax()) {
$detailId = intval($this->request->get('detail_id', 0));
if ($detailId > 0) {
return $this->detail($detailId);
}
$status = $this->request->get('status');
$query = OnboardModel::order('id desc');
if ($status) {
$query->where('onboard_status', $status);
}
$total = $query->count();
$list = $query->limit($this->request->get('offset', 0), $this->request->get('limit', 20))->select();
$rows = [];
foreach ($list as $item) {
$rows[] = HuifuOnboardAdminView::enrichListRow($item);
}
return $this->success('ok', null, ['total' => $total, 'rows' => $rows]);
}
return $this->view->fetch();
}
/**
* 进件资料详情(Ajax 请优先走 index?detail_id= 复用 index 权限)
*/
public function detail($ids = null)
{
if (!$this->request->isAjax() && !$this->request->isPost()) {
$this->error('非法请求');
}
$row = OnboardModel::get($ids);
if (!$row) {
$this->error('记录不存在');
}
$this->success('ok', null, HuifuOnboardAdminView::buildDetail($row));
}
public function poll($ids = null)
{
$row = OnboardModel::get($ids);
if (!$row) {
$this->error('记录不存在');
}
$query = new HuifuOnboardQuery();
$query->pollAndUpdate($row);
$this->success('已刷新状态', null, $row);
}
public function submit($ids = null)
{
$row = OnboardModel::get($ids);
if (!$row) {
$this->error('记录不存在');
}
if ($row['onboard_status'] !== OnboardModel::STATUS_DRAFT) {
$this->error('仅待后台审核的记录可提交汇付');
}
try {
$service = new HuifuOnboardService();
$service->submitFromDraft($row['user_id'], $row['role_type'], $row['role_ref_id']);
$this->success('已提交汇付进件');
} catch (\Throwable $e) {
$this->error($e->getMessage());
}
}
public function add()
{
if ($this->request->isPost()) {
return $this->persistDraft();
}
return $this->view->fetch();
}
public function edit($ids = null)
{
$row = OnboardModel::get($ids);
if (!$row) {
$this->error('记录不存在');
}
if ($this->request->isPost()) {
return $this->persistDraft($row);
}
$this->assignconfig('onboardForm', HuifuOnboardAdminView::formDataFromRow($row));
return $this->view->fetch('shopro_huifu/onboard/add');
}
public function userRoles()
{
$userId = intval($this->request->get('user_id', 0));
if ($userId <= 0) {
$this->error('请选择用户');
}
$userRow = HuifuOnboardAdminView::fetchUserPublic($userId);
$this->success('ok', null, [
'user' => HuifuOnboardAdminView::formatUserOption($userRow),
'roles' => HuifuOnboardAdminView::listRolesForUser($userId),
]);
}
public function searchUser()
{
$keyword = trim((string) $this->request->get('keyword', ''));
if ($keyword === '') {
$this->success('ok', null, []);
}
$this->success('ok', null, HuifuOnboardAdminView::searchUsers($keyword, intval($this->request->get('limit', 20))));
}
public function searchBranch()
{
$keyword = trim((string) $this->request->get('keyword', ''));
$areaId = trim((string) $this->request->get('area_id', ''));
$this->success('ok', null, HuifuOnboardBankBranch::search($keyword, $areaId, 20));
}
protected function persistDraft($row = null)
{
$userId = intval($this->request->post('user_id', 0));
$roleType = trim((string) $this->request->post('role_type', ''));
$roleRefId = intval($this->request->post('role_ref_id', 0));
$form = $this->request->post('form/a', []);
if ($row) {
$userId = intval($row['user_id']);
$roleType = $row['role_type'];
$roleRefId = intval($row['role_ref_id']);
}
if (!$form || !is_array($form)) {
$this->error('请填写进件资料');
}
try {
$service = new HuifuOnboardAdminService();
$onboardId = $row ? intval($row['id']) : 0;
$saved = $service->saveDraft($userId, $roleType, $roleRefId, $form, $onboardId);
} catch (\InvalidArgumentException $e) {
$this->error($e->getMessage());
} catch (\think\exception\HttpResponseException $e) {
throw $e;
} catch (\Throwable $e) {
$this->error(HuifuOnboardError::translate($e->getMessage()));
}
if (!$saved) {
$this->error('进件资料保存失败,请检查汇付分账配置是否已启用');
}
$this->success('进件资料已保存,状态为待后台审核', null, [
'id' => intval($saved['id']),
]);
}
public function retry($ids = null)
{
$row = OnboardModel::get($ids);
if (!$row) {
$this->error('记录不存在');
}
if ($row['onboard_status'] === OnboardModel::STATUS_APPROVED) {
$this->error('已通过,无需重试');
}
$payload = json_decode($row['payload'] ?? '', true);
if (!$payload) {
$this->error('缺少原始进件资料,请用户在小程序重新提交');
}
try {
$service = new HuifuOnboardService();
$service->resubmit($row['user_id'], $row['role_type'], $row['role_ref_id'], $payload);
$this->success('已重新提交进件');
} catch (\Throwable $e) {
$this->error($e->getMessage());
}
}
}