This commit is contained in:
dzc committed 2026-11-11 19:38:55 +08:00
1 parent 25b7f38df8
commit f744e2b9b8
16 files changed
+3425 -126

No files matched your search

+91
View File
@@ -0,0 +1,91 @@
import request from '@/config/axios'
export type PushSource = 'AUTO' | 'MANUAL'
export type PushTargetType = 'USER' | 'ALL'
export type PushTaskStatus =
'WAITING' | 'RUNNING' | 'COMPLETED' | 'PARTIAL_FAILED' | 'FAILED' | 'SKIPPED'
export type PushRecordStatus = 'WAITING' | 'SENDING' | 'SUBMITTED' | 'FAILED' | 'SKIPPED'
export interface PushTask {
id: number
source: PushSource
targetType: PushTargetType
title: string
content: string
messageId?: number
senderId?: number
receiverId?: number
status: PushTaskStatus
totalMembers: number
totalDevices: number
submittedCount: number
failedCount: number
skippedCount: number
processedCount: number
createTime: string | number
finishTime?: string | number
lastError?: string
}
export interface PushRecord {
id: number
taskId: number
memberId: number
nickname?: string
userCode?: string
platform?: string
registrationId?: string
status: PushRecordStatus
attemptCount: number
cid?: string
jpushMsgId?: string
errorCode?: string
errorMessage?: string
createTime: string | number
sendTime?: string | number
}
export interface PushMember {
id: number
nickname?: string
userCode?: string
mobile?: string
deviceCount: number
}
export interface PushSendRequest {
requestId: string
targetType: PushTargetType
memberIds: number[]
title: string
content: string
}
export interface PushTaskPageRequest {
pageNo: number
pageSize: number
source?: PushSource
memberId?: number
status?: PushTaskStatus
createTime?: string[]
}
export const sendPush = (data: PushSendRequest) =>
request.post<{ taskId: number }>({ url: '/member/push/send', data })
export const getPushTaskPage = (params: PushTaskPageRequest) =>
request.get<{ list: PushTask[]; total: number }>({ url: '/member/push/page', params })
export const getPushTask = (id: number) =>
request.get<PushTask>({ url: '/member/push/get', params: { id } })
export const getPushRecordPage = (params: { taskId: number; pageNo: number; pageSize: number }) =>
request.get<{ list: PushRecord[]; total: number }>({ url: '/member/push/record-page', params })
export const getPushMemberPage = (params: {
pageNo: number
pageSize: number
nickname?: string
userCode?: string
mobile?: string
}) => request.get<{ list: PushMember[]; total: number }>({ url: '/member/push/user-page', params })
+148
View File
@@ -0,0 +1,148 @@
import request from '@/config/axios'
import type { AxiosProgressEvent } from 'axios'
/** 安装包适用的运行平台。 */
export type AppPlatform = 'android' | 'ios' | 'harmony'
/** 发布生命周期,下架版本可编辑后重新发布。 */
export type VersionStatus = 'draft' | 'published' | 'offline'
/** 全量发布或指定会员灰测。 */
export type ReleaseScope = 'all' | 'members'
/** 后台从安装包解析的可信元数据,版本与校验值均由服务端生成。 */
export interface VersionPackage {
id: number
appId: string
/** 兼容旧数据的目标平台,可能为逗号分隔的多平台值。 */
platform: string
/** 发布目标平台集合,管理端优先使用此字段。 */
platforms: AppPlatform[]
packageType: 'apk' | 'wgt'
fileName: string
fileSize: number
sha256: string
md5: string
downloadUrl: string
versionCode: number
versionName: string
nativeVersionCode?: number
resourceVersionCode: number
packageName?: string
}
/** 灰测名单中的会员简要资料,id 是内部会员编号。 */
export interface GrayMember {
id: number
userCode?: string | null
nickname?: string | null
avatar?: string | null
mobile?: string | null
status?: number
}
/** 版本列表和详情使用同一份发布字段,详情额外返回灰测会员。 */
export interface AppVersion extends Omit<VersionPackage, 'id'> {
id: number
packageId: number
updateContent: string
forceUpdate: boolean
releaseScope: ReleaseScope
status: VersionStatus
minNativeVersionCode?: number
maxNativeVersionCode?: number
memberCount: number
memberIds?: number[]
members?: GrayMember[]
createTime?: string | number
publishTime?: string | number
}
/** 保存草稿和下架版本时允许修改的内容,包内版本信息保持只读。 */
export interface VersionSaveRequest {
id?: number
packageId: number
platforms: AppPlatform[]
updateContent: string
forceUpdate: boolean
releaseScope: ReleaseScope
minNativeVersionCode?: number
maxNativeVersionCode?: number
memberIds: number[]
}
/** 发布列表使用服务端分页与组合筛选。 */
export interface VersionPageRequest {
pageNo: number
pageSize: number
keyword?: string
platform?: AppPlatform
packageType?: 'apk' | 'wgt'
status?: VersionStatus
releaseScope?: ReleaseScope
}
/** 统一读取发布目标,兼容改造前的单平台和逗号分隔平台字段。 */
export const getTargetPlatforms = (version: {
platforms?: AppPlatform[]
platform?: string
}): AppPlatform[] => {
const declared = version.platforms?.length
? version.platforms
: version.platform?.split(',') || []
const supported: AppPlatform[] = ['android', 'ios', 'harmony']
return supported.filter((platform) => declared.includes(platform))
}
/** 查询版本列表,默认由后台按编号倒序排列。 */
export const getVersionPage = (params: VersionPageRequest) =>
request.get<{ list: AppVersion[]; total: number }>({ url: '/member/app-version/page', params })
/** 读取发布详情及该版本的灰测会员名单。 */
export const getVersion = (id: number) =>
request.get<AppVersion>({ url: '/member/app-version/get', params: { id } })
/** 新建草稿,发布动作由单独接口确认。 */
export const createVersion = (data: VersionSaveRequest) =>
request.post<number>({ url: '/member/app-version/create', data })
/** 保存草稿或下架版本。 */
export const updateVersion = (data: VersionSaveRequest) =>
request.put<boolean>({ url: '/member/app-version/update', data })
/** 删除允许删除的发布记录。 */
export const deleteVersion = (id: number) =>
request.delete<boolean>({ url: '/member/app-version/delete', params: { id } })
/** 将草稿或下架版本发布到保存的目标人群。 */
export const publishVersion = (id: number) =>
request.put<boolean>({ url: '/member/app-version/publish', params: { id } })
/** 下架已发布版本,停止向客户端提供该版本。 */
export const offlineVersion = (id: number) =>
request.put<boolean>({ url: '/member/app-version/offline', params: { id } })
/** 将当前灰测版本提升为全量发布。 */
export const promoteVersion = (id: number) =>
request.put<boolean>({ url: '/member/app-version/promote', params: { id } })
/** 在版本管理权限内检索可参与灰测的有效会员。 */
export const getMemberPage = (params: { pageNo: number; pageSize: number; keyword?: string }) =>
request.get<{ list: GrayMember[]; total: number }>({
url: '/member/app-version/member-page',
params
})
/** 上传安装包并等待服务端校验,返回完整响应包装中的包元数据。 */
export const uploadPackage = async (
file: File,
onUploadProgress: (event: AxiosProgressEvent) => void
) => {
const data = new FormData()
data.append('file', file)
const result = await request.upload<{ data: VersionPackage }>({
url: '/member/app-version/upload-package',
data,
timeout: 600000,
onUploadProgress
})
return result.data
}
@@ -23,6 +23,7 @@ export interface BrokerageRecordPageParams {
pageNo: number
pageSize: number
userId?: number | string | null
userNickname?: string
sourceUserId?: number | string | null
sourceUserLevel?: number
bizType?: number