3. 客户信息维护与多账户关联
任务目标
实现客户基本信息(姓名、证件号、手机号)的增删改查,并支持一个客户关联多个银行账户。账户以“账号 + 余额”表示,归属某个客户。删除客户时级联删除其账户。
数据模型与关系
用两个内存表:customers(客户)和 accounts(账户)。账户通过 customerId 外键指向客户,形成一对多关系。所有操作封装为 CustomerService 的方法,便于验证。
完整实现
class CustomerService {
constructor() {
this.customers = new Map(); // id -> {id, name, idCard, phone}
this.accounts = new Map(); // accountNo -> {accountNo, balance, customerId}
this.seq = 1;
}
// 新增客户
addCustomer({ name, idCard, phone }) {
if (!name || !idCard) throw new Error("name 和 idCard 必填");
const id = this.seq++;
const c = { id, name, idCard, phone: phone || "" };
this.customers.set(id, c);
return c;
}
// 查询单个客户
getCustomer(id) {
return this.customers.get(id) || null;
}
// 查询全部客户
listCustomers() {
return [...this.customers.values()];
}
// 修改客户信息
updateCustomer(id, patch) {
const c = this.customers.get(id);
if (!c) throw new Error("客户不存在: " + id);
Object.assign(c, patch, { id }); // 禁止改主键
return c;
}
// 删除客户并级联删除其账户
deleteCustomer(id) {
if (!this.customers.has(id)) throw new Error("客户不存在: " + id);
for (const [no, acc] of this.accounts) {
if (acc.customerId === id) this.accounts.delete(no);
}
this.customers.delete(id);
return true;
}
// 为客户新增账户
addAccount(customerId, accountNo, balance = 0) {
if (!this.customers.has(customerId)) throw new Error("客户不存在: " + customerId);
if (this.accounts.has(accountNo)) throw new Error("账号已存在: " + accountNo);
const acc = { accountNo, balance, customerId };
this.accounts.set(accountNo, acc);
return acc;
}
// 查询某客户的所有账户
listAccounts(customerId) {
return [...this.accounts.values()].filter(a => a.customerId === customerId);
}
}
// ---- 验证 ----
const svc = new CustomerService();
const c1 = svc.addCustomer({ name: "张三", idCard: "110101199001011234", phone: "13800000001" });
const c2 = svc.addCustomer({ name: "李四", idCard: "110101199202022345" });
svc.addAccount(c1.id, "6222001", 1000);
svc.addAccount(c1.id, "6222002", 2500);
svc.addAccount(c2.id, "6222003", 500);
console.log("客户列表:", svc.listCustomers().length); // 2
console.log("张三账户数:", svc.listAccounts(c1.id).length); // 2
svc.updateCustomer(c1.id, { phone: "13900000009" });
console.log("改后手机:", svc.getCustomer(c1.id).phone); // 13900000009
svc.deleteCustomer(c1.id);
console.log("删除后客户数:", svc.listCustomers().length); // 1
console.log("张三账户残留:", svc.listAccounts(c1.id).length); // 0
运行与验证
环境:Node.js(任意 LTS 版本)。将代码保存为 customer.js,执行 node customer.js。
通过条件:控制台依次输出 2、2、13900000009、1、0,即客户增删改查正确,且删除客户后其账户被级联清除。