feat(work-order): 新增一次性补资料链接

This commit is contained in:
2026-11-01 10:46:31 +08:00
parent fba0a13d44
commit 15956e704f
26 changed files with 1768 additions and 4 deletions
@@ -9,17 +9,27 @@ import type { UploadedFile } from '@/types/worker-platform'
import { cameraCaptureInputProps, resolveCameraEntryEnabled } from '@/utils/camera-capture'
import { useIsMobile } from '@/utils/use-is-mobile'
type ImageUploadScope = 'admin' | 'worker' | 'collect'
type ImageUploadUploader = (
file: File,
scene: string,
scope: ImageUploadScope,
) => Promise<UploadedFile>
type ImageUploadProps = {
value?: UploadedFile[]
onChange?: (files: UploadedFile[]) => void
scene: string
scope: 'admin' | 'worker' | 'collect'
scope: ImageUploadScope
maxCount?: number
showPasteHint?: boolean
/** 开启后,页面任意位置粘贴剪贴板截图都会上传到本组件(多实例时以最近点击/挂载的为准) */
captureGlobalPaste?: boolean
/** 是否显示移动端「拍照」入口;不传时按「打手端 + 移动端」自动判断 */
allowCamera?: boolean
/** 自定义上传函数;公开一次性链接用它把文件传到 token 校验过的上传接口。 */
uploader?: ImageUploadUploader
}
type GlobalPasteTarget = {
@@ -67,6 +77,7 @@ export default function ImageUpload({
showPasteHint = false,
captureGlobalPaste = false,
allowCamera,
uploader,
}: ImageUploadProps) {
const { message } = App.useApp()
const isMobile = useIsMobile()
@@ -75,6 +86,7 @@ export default function ImageUpload({
const targetIdRef = useRef(0)
const valueRef = useRef(value)
valueRef.current = value
const uploadFileFn = uploader || uploadFile
const cameraEnabled = resolveCameraEntryEnabled({ isMobile, scope, allowCamera })
const cameraInputProps = cameraCaptureInputProps('image')
@@ -96,7 +108,7 @@ export default function ImageUpload({
const next = [...valueRef.current]
for (const file of images.slice(0, remaining)) {
try {
const uploaded = await uploadFile(file, scene, scope)
const uploaded = await uploadFileFn(file, scene, scope)
next.push(uploaded)
} catch (error) {
message.error(resolveUploadErrorMessage(error, source))
@@ -199,7 +211,7 @@ export default function ImageUpload({
options: Parameters<NonNullable<UploadProps['customRequest']>>[0],
) {
try {
const uploaded = await uploadFile(options.file as File, scene, scope)
const uploaded = await uploadFileFn(options.file as File, scene, scope)
// 多文件选择会并发执行 customRequest,必须以 ref 中的最新列表累加,避免后完成的上传覆盖前面的图片。
const next = [...valueRef.current, uploaded].slice(0, maxCount)
valueRef.current = next