让凭证数组与套餐作废任务进入可联调状态
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:
2026-06-23 09:50:12 +08:00
parent ebf9739f06
commit 0c3065f970
71 changed files with 4264 additions and 240 deletions

View File

@@ -5,3 +5,4 @@
export * from './format'
export * from './validate'
export * from './calculate'
export * from './voucher'

View 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
}