feat(shopro_huifu): 完善进件功能支持编辑模式

- 修改Onboard控制器中的saveDraft方法,增加onboardId参数以支持编辑现有记录
- 在前端模板中优化用户和角色显示,添加条件渲染和样式类
- 新增resolveRoleLabel方法用于解析角色标签,优化角色标签显示逻辑
- 调整表单数据处理流程,确保编辑模式下正确获取用户和角色信息
- 增强数据验证逻辑,防止非法操作和数据不一致问题
```
这个提交包含在:
可乐加冰
2026-09-29 15:55:54 +08:00
父节点 767e1a00c5
当前提交 98bd0be5e4
共有 7 个文件被更改,包括 73 次插入 和 31 次删除

查看文件

@@ -145,7 +145,8 @@ class Onboard extends Base
}
try {
$service = new HuifuOnboardAdminService();
$saved = $service->saveDraft($userId, $roleType, $roleRefId, $form);
$onboardId = $row ? intval($row['id']) : 0;
$saved = $service->saveDraft($userId, $roleType, $roleRefId, $form, $onboardId);
$this->success('进件资料已保存,状态为待后台审核', null, [
'id' => $saved ? $saved['id'] : 0,
]);

查看文件

@@ -198,7 +198,7 @@
</div>
</el-form-item>
<el-form-item label="用户" v-else>
<span>{{ userLabel }}</span>
<div>{{ userLabel }}</div>
</el-form-item>
<el-form-item label="进件角色" v-if="!isEdit">
<el-select v-model="roleKey" placeholder="请先选择用户" class="form-input" :disabled="!roleOptions.length" @change="onRoleChange">
@@ -209,7 +209,8 @@
</el-select>
</el-form-item>
<el-form-item label="进件角色" v-else>
<span>{{ roleLabel }}</span>
<span v-if="roleLabel" class="user-role-tag" :class="'user-role-tag--' + roleType">{{ roleLabel }}</span>
<span v-else style="color:#909399;">-</span>
</el-form-item>
</div>

查看文件

@@ -7,20 +7,31 @@ use think\Db;
class HuifuOnboardAdminService
{
public function saveDraft($userId, $roleType, $roleRefId, array $formData)
public function saveDraft($userId, $roleType, $roleRefId, array $formData, $onboardId = 0)
{
$userId = intval($userId);
$roleRefId = intval($roleRefId);
if ($userId <= 0) {
throw new \InvalidArgumentException('请选择用户');
$onboardId = intval($onboardId);
if ($onboardId > 0) {
$row = Onboard::get($onboardId);
if (!$row) {
throw new \InvalidArgumentException('进件记录不存在');
}
$userId = intval($row['user_id']);
$roleType = (string) $row['role_type'];
$roleRefId = intval($row['role_ref_id']);
} else {
$userId = intval($userId);
$roleRefId = intval($roleRefId);
if ($userId <= 0) {
throw new \InvalidArgumentException('请选择用户');
}
if (!in_array($roleType, ['promoter', 'regional_agent'], true)) {
throw new \InvalidArgumentException('请选择进件角色');
}
$this->assertRoleBinding($userId, $roleType, $roleRefId);
}
if (!in_array($roleType, ['promoter', 'regional_agent'], true)) {
throw new \InvalidArgumentException('请选择进件角色');
}
$this->assertRoleBinding($userId, $roleType, $roleRefId);
$service = new HuifuOnboardService();
return $service->saveDraft($userId, $roleType, $roleRefId, $formData);
return $service->saveDraft($userId, $roleType, $roleRefId, $formData, $onboardId);
}
protected function assertRoleBinding($userId, $roleType, $roleRefId)

查看文件

@@ -506,6 +506,27 @@ class HuifuOnboardAdminView
];
}
protected static function resolveRoleLabel($roleType, $roleRefId, array $roles = [])
{
foreach ($roles as $role) {
if ($role['role_type'] === $roleType && intval($role['role_ref_id']) === intval($roleRefId)) {
return $role['role_label'];
}
}
if ($roleType === 'promoter') {
return '分销商';
}
if ($roleType === 'regional_agent') {
$agent = Db::name('shopro_regional_agent')->where('id', $roleRefId)->find();
$label = '区域公司';
if ($agent && !empty($agent['area_name'])) {
$label .= '(' . $agent['area_name'] . ')';
}
return $label;
}
return $roleType;
}
public static function formDataFromRow($row)
{
$data = is_array($row) ? $row : $row->toArray();
@@ -516,22 +537,20 @@ class HuifuOnboardAdminView
$form[$field] = self::fullUrl($form[$field]);
}
}
$user = self::fetchUser($data['user_id'] ?? 0);
$roles = self::listRolesForUser($data['user_id'] ?? 0);
$roleLabel = '';
foreach ($roles as $role) {
if ($role['role_type'] === ($data['role_type'] ?? '') && intval($role['role_ref_id']) === intval($data['role_ref_id'] ?? 0)) {
$roleLabel = $role['role_label'];
break;
}
}
$userId = intval($data['user_id'] ?? 0);
$user = self::fetchUser($userId);
$userOption = self::formatUserOption($user);
$roles = self::listRolesForUser($userId);
$roleType = (string) ($data['role_type'] ?? '');
$roleRefId = intval($data['role_ref_id'] ?? 0);
$roleLabel = self::resolveRoleLabel($roleType, $roleRefId, $roles);
return [
'onboard_id' => intval($data['id'] ?? 0),
'user_id' => intval($data['user_id'] ?? 0),
'user_label' => trim(($user['nickname'] ?? '') . ' (' . ($user['mobile'] ?? $data['user_id']) . ')'),
'role_type' => $data['role_type'] ?? '',
'role_ref_id' => intval($data['role_ref_id'] ?? 0),
'user_id' => $userId,
'user_label' => $userOption['option_label'] ?? trim(($user['nickname'] ?? '') . ' (' . ($user['mobile'] ?? $userId) . ')'),
'role_type' => $roleType,
'role_ref_id' => $roleRefId,
'role_label' => $roleLabel,
'onboard_status' => $data['onboard_status'] ?? '',
'form' => $form,

查看文件

@@ -31,7 +31,7 @@ class HuifuOnboardService
/**
* 用户申请时仅保存进件资料,待后台业务审核通过后再提交汇付
*/
public function saveDraft($userId, $roleType, $roleRefId, array $formData)
public function saveDraft($userId, $roleType, $roleRefId, array $formData, $onboardId = 0)
{
if (!HuifuOnboardGate::isOnboardRequired()) {
return null;
@@ -41,7 +41,15 @@ class HuifuOnboardService
}
$form = HuifuOnboardValidator::validateSubmit($formData);
$row = Onboard::findByRole($userId, $roleType, $roleRefId);
$onboardId = intval($onboardId);
if ($onboardId > 0) {
$row = Onboard::get($onboardId);
if (!$row || intval($row['user_id']) !== intval($userId)) {
throw new \InvalidArgumentException('进件记录不存在');
}
} else {
$row = Onboard::findByRole($userId, $roleType, $roleRefId);
}
if ($row && $row['onboard_status'] === Onboard::STATUS_APPROVED) {
return $row;
}

查看文件

@@ -147,7 +147,8 @@ class Onboard extends Base
}
try {
$service = new HuifuOnboardAdminService();
$saved = $service->saveDraft($userId, $roleType, $roleRefId, $form);
$onboardId = $row ? intval($row['id']) : 0;
$saved = $service->saveDraft($userId, $roleType, $roleRefId, $form, $onboardId);
$this->success('进件资料已保存,状态为待后台审核', null, [
'id' => $saved ? $saved['id'] : 0,
]);

查看文件

@@ -198,7 +198,7 @@
</div>
</el-form-item>
<el-form-item label="用户" v-else>
<span>{{ userLabel }}</span>
<div>{{ userLabel }}</div>
</el-form-item>
<el-form-item label="进件角色" v-if="!isEdit">
<el-select v-model="roleKey" placeholder="请先选择用户" class="form-input" :disabled="!roleOptions.length" @change="onRoleChange">
@@ -209,7 +209,8 @@
</el-select>
</el-form-item>
<el-form-item label="进件角色" v-else>
<span>{{ roleLabel }}</span>
<span v-if="roleLabel" class="user-role-tag" :class="'user-role-tag--' + roleType">{{ roleLabel }}</span>
<span v-else style="color:#909399;">-</span>
</el-form-item>
</div>