feat(frontend): owner identity profile admin page

- train/owner-profiles.vue: table + create/edit dialog + enable/disable
  with confirm; project options from org snapshot with manual fallback;
  concerns limited to 500 chars with content-discipline notice
- route registered under 训练运营 with operationsConsoleRoles
This commit is contained in:
2026-08-05 03:18:50 +08:00
parent 6b8c89bcdb
commit 8e288e67e9
3 changed files with 230 additions and 0 deletions
@@ -0,0 +1,59 @@
import request from '@/utils/request';
type ApiResult<T> = { code: number; msg: string; data: T };
/**
* 业主身份档案(实时对练 persona 的运营数据),moderator 角色门,与 question-admin 同口径。
* 后端契约:/api/aihr/realtime/owner-profiles
* - GET / 列表(本租户,含 enabled/version/审计字段)
* - POST / 创建(同 projectCode 重复返回冲突)
* - PUT /{id} 全量覆盖更新(联调时若后端改乐观锁可在此集中调整)
* - POST /{id}/enable、POST /{id}/disable 启停(若后端改为 PUT /{id}/status 或全量带 enabled,
* 只需调整下方 setOwnerProfileEnabled 一处封装)
*/
export type OwnerProfile = {
id: number;
projectCode: string;
projectName: string;
ageRange: string;
incomeLevel: string;
familyStructure: string;
concerns: string;
enabled: boolean;
version?: number;
createBy?: string;
createTime?: string;
updateBy?: string;
updateTime?: string;
};
export type OwnerProfilePayload = {
projectCode: string;
projectName: string;
ageRange: string;
incomeLevel: string;
familyStructure: string;
concerns: string;
};
export const listOwnerProfiles = (): Promise<ApiResult<OwnerProfile[]>> => request({
url: '/api/aihr/realtime/owner-profiles', method: 'get'
});
export const createOwnerProfile = (data: OwnerProfilePayload): Promise<ApiResult<OwnerProfile>> => request({
url: '/api/aihr/realtime/owner-profiles', method: 'post', data, headers: { repeatSubmit: false }
});
export const updateOwnerProfile = (id: number, data: OwnerProfilePayload): Promise<ApiResult<OwnerProfile>> => request({
url: `/api/aihr/realtime/owner-profiles/${id}`, method: 'put', data, headers: { repeatSubmit: false }
});
/**
* 启停统一入口:先按独立 enable/disable 端点实现;
* 若后端实际提供 PUT /{id}/status(带 enabled)或仅支持 PUT 全量带 enabled 字段,
* 联调时只改这一个函数即可。
*/
export const setOwnerProfileEnabled = (id: number, enabled: boolean): Promise<ApiResult<OwnerProfile>> => request({
url: `/api/aihr/realtime/owner-profiles/${id}/${enabled ? 'enable' : 'disable'}`, method: 'post', headers: { repeatSubmit: false }
});