88053353ab
- admin 用户列表新增剩余/已用/累计好客权益金额三列(benefitCoupon groupBy 聚合,排除 VOID) - admin/partner 门店入驻合同支持多张照片与 PDF(CommonResource 多记录,复用 ENV 多图逻辑) - 新增 contract-urls.util 归一化工具,向后兼容旧 contractUrl 字段并标记 deprecated 需求1/2/3
41 lines
1.2 KiB
TypeScript
41 lines
1.2 KiB
TypeScript
/**
|
|
* 门店签约合同(CommonResource bizType='CONTRACT')多附件工具。
|
|
*
|
|
* 历史上合同只存单条记录(字段 contractUrl:string),现改为支持多张照片 / PDF。
|
|
* 入参同时兼容新的 contractUrls:string[] 与旧的 contractUrl:string。
|
|
*/
|
|
|
|
export const MAX_CONTRACT_FILES = 20;
|
|
|
|
/**
|
|
* 归一化合同附件地址:去空白、去重、限制数量。
|
|
* @param urls 新字段 contractUrls
|
|
* @param legacy 旧字段 contractUrl(仅在 urls 未提供时生效)
|
|
*/
|
|
export function normalizeContractUrls(
|
|
urls?: unknown,
|
|
legacy?: string | null,
|
|
): string[] {
|
|
const raw: unknown[] = Array.isArray(urls)
|
|
? urls
|
|
: legacy != null
|
|
? [legacy]
|
|
: [];
|
|
|
|
const seen = new Set<string>();
|
|
const out: string[] = [];
|
|
for (const item of raw) {
|
|
const url = String(item ?? '').trim();
|
|
if (!url || seen.has(url)) continue;
|
|
seen.add(url);
|
|
out.push(url);
|
|
if (out.length >= MAX_CONTRACT_FILES) break;
|
|
}
|
|
return out;
|
|
}
|
|
|
|
/** PDF 存 FILE,其余(合同照片)存 IMAGE,便于前端按图片预览 */
|
|
export function contractMediaType(url: string): 'FILE' | 'IMAGE' {
|
|
return /\.pdf(\?|$)/i.test(url) ? 'FILE' : 'IMAGE';
|
|
}
|