Files
dukang/server/dukang-api/src/common/store/store-bank.util.ts
T
jacy 3afbdfe6b9
CI / verify (pull_request) Waiting to run
v3.5.11企业微信通知调整
2026-08-26 09:55:19 +08:00

101 lines
3.1 KiB
TypeScript

import type { PrismaClient } from '@prisma/client';
export type StoreBankAccountSnapshot = {
bankAccountName: string | null;
bankAccountNo: string | null;
bankBranch: string | null;
};
export async function loadStorePrimaryBank(
prisma: PrismaClient,
storeId: bigint,
): Promise<StoreBankAccountSnapshot | null> {
const binding = await prisma.storeAccountStore.findFirst({
where: { storeId, storeAccount: { isPrimary: 1 } },
include: {
storeAccount: {
select: { bankAccountName: true, bankAccountNo: true, bankBranch: true },
},
},
});
if (binding) return binding.storeAccount;
const fallback = await prisma.storeAccountStore.findFirst({
where: { storeId },
orderBy: { storeAccountId: 'asc' },
include: {
storeAccount: {
select: { bankAccountName: true, bankAccountNo: true, bankBranch: true },
},
},
});
return fallback?.storeAccount ?? null;
}
export async function loadStorePrimaryBanksMap(
prisma: PrismaClient,
storeIds: bigint[],
): Promise<Map<string, StoreBankAccountSnapshot>> {
const map = new Map<string, StoreBankAccountSnapshot>();
if (!storeIds.length) return map;
const bindings = await prisma.storeAccountStore.findMany({
where: { storeId: { in: storeIds } },
include: {
storeAccount: {
select: {
isPrimary: true,
bankAccountName: true,
bankAccountNo: true,
bankBranch: true,
},
},
},
orderBy: [{ storeAccount: { isPrimary: 'desc' } }, { storeAccountId: 'asc' }],
});
for (const binding of bindings) {
const key = String(binding.storeId);
if (map.has(key)) continue;
map.set(key, {
bankAccountName: binding.storeAccount.bankAccountName,
bankAccountNo: binding.storeAccount.bankAccountNo,
bankBranch: binding.storeAccount.bankBranch,
});
}
return map;
}
export function formatWecomBankAccount(bank?: {
bankAccountName?: string | null;
bankName?: string | null;
bankBranch?: string | null;
bankAccountNo?: string | null;
} | null): string {
if (!bank) return '未登记收款账户';
const name = bank.bankAccountName?.trim() || '';
const no = bank.bankAccountNo?.trim() || '';
if (!name && !no) return '未登记收款账户';
const bankLine = bank.bankName?.trim() || bank.bankBranch?.trim() || '';
return [name, bankLine, no].filter(Boolean).join(' / ');
}
export async function loadWineryBankConfig(
prisma: PrismaClient,
): Promise<StoreBankAccountSnapshot & { bankName?: string | null }> {
const keys = [
'WINERY_BANK_ACCOUNT_NAME',
'WINERY_BANK_NAME',
'WINERY_BANK_BRANCH',
'WINERY_BANK_ACCOUNT_NO',
];
const rows = await prisma.systemConfig.findMany({
where: { configKey: { in: keys } },
select: { configKey: true, value: true },
});
const map = new Map(rows.map((r) => [r.configKey, r.value]));
return {
bankAccountName: map.get('WINERY_BANK_ACCOUNT_NAME') ?? null,
bankName: map.get('WINERY_BANK_NAME') ?? null,
bankBranch: map.get('WINERY_BANK_BRANCH') ?? null,
bankAccountNo: map.get('WINERY_BANK_ACCOUNT_NO') ?? null,
};
}