feat(admin,store): landline contact phone and package audit UX
Allow store contactPhone as landline, show pending package audit badge, and split live vs pending packages in HQ review. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -4,6 +4,14 @@
|
||||
"private": true,
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
"exports": {
|
||||
".": {
|
||||
"types": "./dist/index.d.ts",
|
||||
"import": "./src/index.ts",
|
||||
"require": "./dist/index.js",
|
||||
"default": "./dist/index.js"
|
||||
}
|
||||
},
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"dev": "tsc --watch",
|
||||
|
||||
@@ -351,3 +351,4 @@ export function orderTabToStatuses(tab: string): string[] | undefined {
|
||||
export * from './city-partner';
|
||||
export * from './dev-plan';
|
||||
export * from './support-ticket';
|
||||
export * from './phone';
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import {
|
||||
isLandlinePhone,
|
||||
isMobilePhone,
|
||||
isStoreContactPhone,
|
||||
normalizeContactPhone,
|
||||
toDialablePhone,
|
||||
} from './phone';
|
||||
|
||||
describe('store contact phone', () => {
|
||||
it('accepts mainland mobile numbers', () => {
|
||||
expect(isMobilePhone('13800138000')).toBe(true);
|
||||
expect(isStoreContactPhone('13800138000')).toBe(true);
|
||||
expect(isStoreContactPhone(' 13800138000 ')).toBe(true);
|
||||
});
|
||||
|
||||
it('accepts landlines with or without hyphens and optional extension', () => {
|
||||
expect(isLandlinePhone('0379-8888888')).toBe(true);
|
||||
expect(isLandlinePhone('010-12345678')).toBe(true);
|
||||
expect(isLandlinePhone('03798888888')).toBe(true);
|
||||
expect(isLandlinePhone('01012345678')).toBe(true);
|
||||
expect(isLandlinePhone('0379-8888888-12')).toBe(true);
|
||||
expect(isStoreContactPhone('0379-8888 888')).toBe(true);
|
||||
});
|
||||
|
||||
it('rejects login-style invalid and incomplete numbers', () => {
|
||||
expect(isStoreContactPhone('')).toBe(false);
|
||||
expect(isStoreContactPhone('12345678')).toBe(false);
|
||||
expect(isStoreContactPhone('12345678901')).toBe(false);
|
||||
expect(isStoreContactPhone('400-123-4567')).toBe(false);
|
||||
expect(isMobilePhone('0379-8888888')).toBe(false);
|
||||
});
|
||||
|
||||
it('normalizes spaces and strips dial punctuation', () => {
|
||||
expect(normalizeContactPhone(' 0379-8888 888 ')).toBe('0379-8888888');
|
||||
expect(toDialablePhone('0379-8888888')).toBe('03798888888');
|
||||
expect(toDialablePhone('010 1234 5678')).toBe('01012345678');
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,35 @@
|
||||
/** 11 位大陆手机号(登录凭证) */
|
||||
export const MOBILE_PHONE_RE = /^1[3-9]\d{9}$/;
|
||||
|
||||
/**
|
||||
* 国内座机:区号 0 开头(3~4 位),本地号 7~8 位,允许 `-`,可选分机。
|
||||
* 例:0379-8888888、010-12345678、03798888888
|
||||
*/
|
||||
export const LANDLINE_PHONE_RE = /^0\d{2,3}-?\d{7,8}(-\d{1,6})?$/;
|
||||
|
||||
export const STORE_CONTACT_PHONE_HINT = '请输入正确的联系电话(手机号或座机,如 0379-8888888)';
|
||||
|
||||
export function normalizeContactPhone(raw: string): string {
|
||||
return String(raw ?? '')
|
||||
.trim()
|
||||
.replace(/\s+/g, '');
|
||||
}
|
||||
|
||||
export function isMobilePhone(raw: string): boolean {
|
||||
return MOBILE_PHONE_RE.test(normalizeContactPhone(raw));
|
||||
}
|
||||
|
||||
export function isLandlinePhone(raw: string): boolean {
|
||||
return LANDLINE_PHONE_RE.test(normalizeContactPhone(raw));
|
||||
}
|
||||
|
||||
/** 门店对外联系电话:手机号或座机 */
|
||||
export function isStoreContactPhone(raw: string): boolean {
|
||||
const s = normalizeContactPhone(raw);
|
||||
return isMobilePhone(s) || isLandlinePhone(s);
|
||||
}
|
||||
|
||||
/** 拨号用:去掉空格和横线 */
|
||||
export function toDialablePhone(raw: string): string {
|
||||
return String(raw ?? '').replace(/[\s-]/g, '');
|
||||
}
|
||||
@@ -105,6 +105,10 @@ export interface StorePackageAuditAction {
|
||||
rejectReason?: string;
|
||||
}
|
||||
|
||||
export interface StorePackageAuditSummaryDto {
|
||||
pendingCount: number;
|
||||
}
|
||||
|
||||
export interface CreatePackageDisputeRequest {
|
||||
storeId: string;
|
||||
remark?: string;
|
||||
|
||||
Reference in New Issue
Block a user