拆分打手输入规范化
This commit is contained in:
@@ -20,7 +20,6 @@ import type { OrderItemRow, OrderRow } from '../../types/repository/rows.js'
|
||||
import { createHttpError } from '../../utils/http.js'
|
||||
import { safeParseJson } from '../admin/admin-query-utils.js'
|
||||
import {
|
||||
normalizeStoredFileUrl,
|
||||
refreshStoredFileUrl,
|
||||
refreshUploadedFileUrls,
|
||||
} from '../file-storage/file-storage-service.js'
|
||||
@@ -41,6 +40,12 @@ import {
|
||||
normalizeRequirementFields,
|
||||
resolveRequirementFields,
|
||||
} from './work-order-requirement-fields.js'
|
||||
import {
|
||||
normalizeStringArray,
|
||||
normalizeSubmittedFields,
|
||||
normalizeStatuses,
|
||||
normalizeUploadedFiles,
|
||||
} from './worker-input-normalizers.js'
|
||||
export {
|
||||
normalizeRequirementFields,
|
||||
normalizeRequirementFieldsFromPayload,
|
||||
@@ -68,6 +73,12 @@ export {
|
||||
normalizePositiveInteger,
|
||||
normalizeSessionVersion,
|
||||
} from './worker-normalizers.js'
|
||||
export {
|
||||
normalizeStringArray,
|
||||
normalizeSubmittedFields,
|
||||
normalizeStatuses,
|
||||
normalizeUploadedFiles,
|
||||
} from './worker-input-normalizers.js'
|
||||
export {
|
||||
canWorkerAutoAcceptWholeOrder,
|
||||
resolveFreezeDepositAmount,
|
||||
@@ -1088,73 +1099,6 @@ export function matchesOptionalText(ruleValue: unknown, sourceValue: unknown) {
|
||||
)
|
||||
}
|
||||
|
||||
export function normalizeSubmittedFields(value: unknown) {
|
||||
const source =
|
||||
value && typeof value === 'object' && !Array.isArray(value) ? (value as JsonObject) : {}
|
||||
return Object.fromEntries(
|
||||
Object.entries(source)
|
||||
.filter(([key]) => !['orderNo', 'platformOrderId', 'fields', 'material'].includes(key))
|
||||
.map(([key, currentValue]) => [key, String(currentValue || '').trim()]),
|
||||
)
|
||||
}
|
||||
|
||||
export function normalizeStringArray(value: unknown): string[] {
|
||||
if (!Array.isArray(value)) return []
|
||||
return value.map((item) => String(item || '').trim()).filter(Boolean)
|
||||
}
|
||||
|
||||
/**
|
||||
* 将查询参数中的状态过滤解析为去重后的状态数组。
|
||||
* 支持:逗号分隔的字符串(如 "open,in_progress")、字符串数组、单个字符串。
|
||||
*/
|
||||
export function normalizeStatuses(value: unknown): string[] {
|
||||
const rawList: unknown[] = Array.isArray(value)
|
||||
? value
|
||||
: typeof value === 'string' && value.trim()
|
||||
? value.split(',')
|
||||
: value === undefined || value === null
|
||||
? []
|
||||
: [value]
|
||||
return [...new Set(rawList.map((item) => String(item || '').trim()).filter(Boolean))]
|
||||
}
|
||||
|
||||
export function normalizeUploadedFiles(value: unknown) {
|
||||
if (!Array.isArray(value)) return []
|
||||
return value
|
||||
.map((item) => {
|
||||
const source =
|
||||
item && typeof item === 'object' && !Array.isArray(item) ? (item as JsonObject) : {}
|
||||
const objectKey = String(source.objectKey || source.object_key || '').trim()
|
||||
const url = String(source.url || '').trim()
|
||||
if (!objectKey && !url) return null
|
||||
return {
|
||||
objectKey,
|
||||
url: normalizeStoredFileUrl(url, objectKey),
|
||||
thumbnailUrl: normalizeStoredFileUrl(
|
||||
source.thumbnailUrl || source.thumbnail_url || url,
|
||||
objectKey,
|
||||
),
|
||||
mediumUrl: normalizeStoredFileUrl(source.mediumUrl || source.medium_url || url, objectKey),
|
||||
filename: String(source.filename || '').trim(),
|
||||
contentType: String(source.contentType || source.content_type || '').trim(),
|
||||
size: normalizeInteger(source.size, 0),
|
||||
}
|
||||
})
|
||||
.filter(
|
||||
(
|
||||
item,
|
||||
): item is {
|
||||
objectKey: string
|
||||
url: string
|
||||
thumbnailUrl: string
|
||||
mediumUrl: string
|
||||
filename: string
|
||||
contentType: string
|
||||
size: number
|
||||
} => Boolean(item),
|
||||
)
|
||||
}
|
||||
|
||||
export function mapAcceptanceForResponse(value: unknown) {
|
||||
const acceptance = safeParseJson(value)
|
||||
const files = normalizeUploadedFiles(acceptance.files).map((file) =>
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
import type { JsonObject } from '../../types/json.js'
|
||||
import { normalizeStoredFileUrl } from '../file-storage/file-storage-service.js'
|
||||
import { normalizeInteger } from './worker-normalizers.js'
|
||||
|
||||
export function normalizeSubmittedFields(value: unknown) {
|
||||
const source =
|
||||
value && typeof value === 'object' && !Array.isArray(value) ? (value as JsonObject) : {}
|
||||
return Object.fromEntries(
|
||||
Object.entries(source)
|
||||
.filter(([key]) => !['orderNo', 'platformOrderId', 'fields', 'material'].includes(key))
|
||||
.map(([key, currentValue]) => [key, String(currentValue || '').trim()]),
|
||||
)
|
||||
}
|
||||
|
||||
export function normalizeStringArray(value: unknown): string[] {
|
||||
if (!Array.isArray(value)) return []
|
||||
return value.map((item) => String(item || '').trim()).filter(Boolean)
|
||||
}
|
||||
|
||||
/** 将查询参数中的状态过滤解析为去重后的状态数组。 */
|
||||
export function normalizeStatuses(value: unknown): string[] {
|
||||
const rawList: unknown[] = Array.isArray(value)
|
||||
? value
|
||||
: typeof value === 'string' && value.trim()
|
||||
? value.split(',')
|
||||
: value === undefined || value === null
|
||||
? []
|
||||
: [value]
|
||||
return [...new Set(rawList.map((item) => String(item || '').trim()).filter(Boolean))]
|
||||
}
|
||||
|
||||
export function normalizeUploadedFiles(value: unknown) {
|
||||
if (!Array.isArray(value)) return []
|
||||
return value
|
||||
.map((item) => {
|
||||
const source =
|
||||
item && typeof item === 'object' && !Array.isArray(item) ? (item as JsonObject) : {}
|
||||
const objectKey = String(source.objectKey || source.object_key || '').trim()
|
||||
const url = String(source.url || '').trim()
|
||||
if (!objectKey && !url) return null
|
||||
return {
|
||||
objectKey,
|
||||
url: normalizeStoredFileUrl(url, objectKey),
|
||||
thumbnailUrl: normalizeStoredFileUrl(
|
||||
source.thumbnailUrl || source.thumbnail_url || url,
|
||||
objectKey,
|
||||
),
|
||||
mediumUrl: normalizeStoredFileUrl(source.mediumUrl || source.medium_url || url, objectKey),
|
||||
filename: String(source.filename || '').trim(),
|
||||
contentType: String(source.contentType || source.content_type || '').trim(),
|
||||
size: normalizeInteger(source.size, 0),
|
||||
}
|
||||
})
|
||||
.filter(
|
||||
(
|
||||
item,
|
||||
): item is {
|
||||
objectKey: string
|
||||
url: string
|
||||
thumbnailUrl: string
|
||||
mediumUrl: string
|
||||
filename: string
|
||||
contentType: string
|
||||
size: number
|
||||
} => Boolean(item),
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user