3. 客户信息维护与多账户关联

客户信息维护与多账户关联 学习卡片

任务目标

实现客户基本信息(姓名、证件号、手机号)的增删改查,并支持一个客户关联多个银行账户。账户以“账号 + 余额”表示,归属某个客户。删除客户时级联删除其账户。

数据模型与关系

用两个内存表:customers(客户)和 accounts(账户)。账户通过 customerId 外键指向客户,形成一对多关系。所有操作封装为 CustomerService 的方法,便于验证。

customers id / name idCard / phone (主键 id) accounts accountNo / balance customerId(外键) (主键 accountNo) 1 : N 增 / 删 / 改 / 查 客户 → 级联维护其账户

完整实现

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,即客户增删改查正确,且删除客户后其账户被级联清除。