让凭证数组与套餐作废任务进入可联调状态
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 7m52s
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 7m52s
Constraint: 后端订单套餐作废接口使用 /api/admin/order-package-invalidate-tasks,上传 purpose 只能使用 attachment。 Rejected: 继续提交逗号拼接凭证字符串 | 新提交路径必须使用 string[],历史字符串只做读取归一化。 Confidence: high Scope-risk: broad Directive: 新增订单套餐作废权限时需同时配置菜单 URL 与 order_package_invalidate_task:create/detail 按钮权限。 Tested: bun run build;development 真实后端联调上传、创建、列表、详情通过;复机接口未触发。 Not-tested: 未逐一手工覆盖所有历史凭证数据、全部角色权限组合和所有文件扩展名预览
This commit is contained in:
@@ -5,3 +5,4 @@
|
||||
export * from './format'
|
||||
export * from './validate'
|
||||
export * from './calculate'
|
||||
export * from './voucher'
|
||||
|
||||
37
src/utils/business/voucher.ts
Normal file
37
src/utils/business/voucher.ts
Normal file
@@ -0,0 +1,37 @@
|
||||
/**
|
||||
* 凭证附件相关业务工具
|
||||
*/
|
||||
|
||||
export const toVoucherKeyList = (value?: string | string[]): string[] => {
|
||||
const values = Array.isArray(value) ? value : value?.split(',') || []
|
||||
|
||||
return values.map((key) => key.trim()).filter(Boolean)
|
||||
}
|
||||
|
||||
export const hasVoucherKeys = (value?: string | string[]): boolean =>
|
||||
toVoucherKeyList(value).length > 0
|
||||
|
||||
export const getErrorMessage = (error: unknown, fallback: string): string => {
|
||||
if (!error || typeof error !== 'object') return fallback
|
||||
|
||||
const maybeError = error as {
|
||||
msg?: unknown
|
||||
message?: unknown
|
||||
response?: {
|
||||
data?: {
|
||||
msg?: unknown
|
||||
message?: unknown
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const candidates = [
|
||||
maybeError.response?.data?.msg,
|
||||
maybeError.response?.data?.message,
|
||||
maybeError.msg,
|
||||
maybeError.message
|
||||
]
|
||||
|
||||
const message = candidates.find((item): item is string => typeof item === 'string' && !!item)
|
||||
return message || fallback
|
||||
}
|
||||
Reference in New Issue
Block a user