You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.4 KiB
TypeScript
55 lines
1.4 KiB
TypeScript
import type { AnalyzeBsNsrUrlContext, TaxerTicketForNsr } from "../types/taxerTicket";
|
|
|
|
export const BS_NSR_ABOUT_BLANK = "about:blank";
|
|
|
|
/**
|
|
* 与 WPF `Analize_URL` 一致:按模板替换占位符;`ticket == null` 或空模板时返回 `about:blank`。
|
|
*/
|
|
export function analyzeBsNsrUrl(
|
|
ticket: TaxerTicketForNsr | null,
|
|
ctx: AnalyzeBsNsrUrlContext,
|
|
): string {
|
|
if (!ticket) {
|
|
return BS_NSR_ABOUT_BLANK;
|
|
}
|
|
|
|
const template = ctx.bsNsrUrlTemplate.trim();
|
|
if (!template) {
|
|
return BS_NSR_ABOUT_BLANK;
|
|
}
|
|
|
|
const sflb = ticket.isEnterprise === 1 ? "1" : "2";
|
|
return template
|
|
.replace(/\{djxh\}/g, ticket.enterpriseId)
|
|
.replace(/\{sfzhm\}/g, ctx.taxerIdCard)
|
|
.replace(/\{sflb\}/g, sflb)
|
|
.replace(/\{swjgDm\}/g, ctx.bsTaxAuthorityNum)
|
|
.replace(/\{qhhm\}/g, ticket.tktId)
|
|
.replace(/\{sjhm\}/g, ctx.phoneNo);
|
|
}
|
|
|
|
/** 拼接结果是否为可导航的 http(s) URL */
|
|
export function isNavigableHttpUrl(url: string): boolean {
|
|
if (!url || url === BS_NSR_ABOUT_BLANK) {
|
|
return false;
|
|
}
|
|
try {
|
|
const parsed = new URL(url);
|
|
return parsed.protocol === "http:" || parsed.protocol === "https:";
|
|
} catch {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/** 与 WPF `Source.AbsoluteUri` 比较一致,避免重复导航 */
|
|
export function normalizeUrlForCompare(url: string): string {
|
|
if (!url || url === BS_NSR_ABOUT_BLANK) {
|
|
return BS_NSR_ABOUT_BLANK;
|
|
}
|
|
try {
|
|
return new URL(url).href;
|
|
} catch {
|
|
return url.trim();
|
|
}
|
|
}
|