feat(ops,store,partner): 用户权益列 + 门店合同多图上传
- admin 用户列表新增剩余/已用/累计好客权益金额三列(benefitCoupon groupBy 聚合,排除 VOID) - admin/partner 门店入驻合同支持多张照片与 PDF(CommonResource 多记录,复用 ENV 多图逻辑) - 新增 contract-urls.util 归一化工具,向后兼容旧 contractUrl 字段并标记 deprecated 需求1/2/3
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
/**
|
||||
* 门店签约合同(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';
|
||||
}
|
||||
Reference in New Issue
Block a user