合同管理系统-逻辑梳理.md 7.95 KB

合同管理系统 - 逻辑梳理

📋 需求概述

建立一个合同管理系统,用于管理门店合同信息,并自动生成月租明细,用于统计每个月每个门店的合同支付明细以及成本费用。

🗄️ 数据库表设计

1. 合同表(lq_contract)

字段说明:

字段名 类型 说明 必填
F_Id VARCHAR(50) 主键ID
F_StoreId VARCHAR(50) 门店ID(关联lq_mdxx.F_Id)
F_StoreName VARCHAR(200) 店名(冗余字段,便于查询)
F_Title VARCHAR(200) 标题
F_Category VARCHAR(100) 分类(string类型,自己填写)
F_TenantName VARCHAR(200) 户名
F_ContractStartDate DATETIME 合同起始日期
F_ContractEndDate DATETIME 合同结束日期
F_ReminderDays INT 提前多少天提醒 ❌(默认0)
F_Deposit DECIMAL(18,2) 押金 ❌(默认0)
F_NextPaymentDate DATETIME 下次应交时间
F_MonthlyRent DECIMAL(18,2) 月租
F_PaymentAmount DECIMAL(18,2) 缴租金额(每次交租的金额,通常=月租×交租周期)
F_PaymentCycle INT 交租周期(数字,表示几个月,如1、3、6等)
F_Remarks VARCHAR(1000) 备注
F_Attachment VARCHAR(500) 附件(存储附件路径或JSON)
F_CreateUser VARCHAR(50) 创建人ID
F_CreateTime DATETIME 创建时间
F_UpdateUser VARCHAR(50) 更新人ID
F_UpdateTime DATETIME 更新时间
F_IsEffective INT 是否有效(1-有效,0-无效) ✅(默认1)

索引:

  • 主键:F_Id
  • 门店ID索引:F_StoreId
  • 合同起始日期索引:F_ContractStartDate
  • 合同结束日期索引:F_ContractEndDate
  • 下次应交时间索引:F_NextPaymentDate

2. 月租明细表(lq_contract_rent_detail)

字段说明:

字段名 类型 说明 必填
F_Id VARCHAR(50) 主键ID
F_ContractId VARCHAR(50) 合同ID(关联lq_contract.F_Id)
F_PaymentMonth DATETIME 应缴月份(表示哪个月份,格式:YYYY-MM-01)
F_DueDate DATETIME 应缴日期(具体应缴日期)
F_DueAmount DECIMAL(18,2) 应缴金额
F_IsPaid INT 是否已缴(0-未缴,1-已缴) ✅(默认0)
F_ActualPaymentDate DATETIME 实际缴费时间
F_ActualPaymentAmount DECIMAL(18,2) 实际缴费金额
F_Remarks VARCHAR(500) 备注
F_CreateUser VARCHAR(50) 创建人ID
F_CreateTime DATETIME 创建时间
F_UpdateUser VARCHAR(50) 更新人ID
F_UpdateTime DATETIME 更新时间
F_IsEffective INT 是否有效(1-有效,0-无效) ✅(默认1)

索引:

  • 主键:F_Id
  • 合同ID索引:F_ContractId
  • 应缴月份索引:F_PaymentMonth
  • 应缴日期索引:F_DueDate
  • 是否已缴索引:F_IsPaid
  • 联合索引:(F_ContractId, F_PaymentMonth) - 用于查询某个合同的某个月份明细

🔄 业务流程逻辑

1. 创建合同时自动生成月租明细

逻辑:

  1. 用户录入合同信息
  2. 系统根据以下信息自动生成月租明细:
    • 合同起始日期(F_ContractStartDate)
    • 合同结束日期(F_ContractEndDate)
    • 交租周期(F_PaymentCycle,单位:月)
    • 缴租金额(F_PaymentAmount,每次交租的金额)

生成规则:

  • 从合同起始日期开始,每隔 F_PaymentCycle 个月生成一条明细
  • 应缴月份:每次交租对应的月份(格式:YYYY-MM-01)
  • 应缴日期:应缴月份的第一天(或根据业务规则设定)
  • 应缴金额:等于 F_PaymentAmount
  • 生成到合同结束日期为止

示例:

  • 合同起始:2025-01-01
  • 合同结束:2025-12-31
  • 交租周期:3个月
  • 缴租金额:3000元

生成的明细:

  • 2025-01-01,应缴金额:3000元(1-3月)
  • 2025-04-01,应缴金额:3000元(4-6月)
  • 2025-07-01,应缴金额:3000元(7-9月)
  • 2025-10-01,应缴金额:3000元(10-12月)

2. 计算下次应交时间

逻辑:

  • 根据当前时间、提前多少天提醒(F_ReminderDays),计算下次应交时间(F_NextPaymentDate)
  • 查找该合同未缴费的明细中,应缴日期最早的一条
  • 下次应交时间 = 最早应缴日期 - 提前提醒天数

示例:

  • 当前时间:2025-01-15
  • 提前提醒天数:7天
  • 最早未缴费明细的应缴日期:2025-02-01
  • 下次应交时间 = 2025-02-01 - 7天 = 2025-01-25

3. 删除合同时级联删除明细

逻辑:

  • 删除合同时,需要同时删除该合同的所有月租明细
  • 使用事务确保数据一致性
  • 物理删除或逻辑删除(设置 F_IsEffective = 0)

4. 更新合同时的处理

逻辑:

  • 如果修改了以下字段,需要重新生成月租明细:
    • 合同起始日期
    • 合同结束日期
    • 交租周期
    • 缴租金额
  • 删除旧的明细,重新生成新的明细
  • 如果只是修改其他字段(如备注、附件等),不需要重新生成明细

📊 统计功能

1. 按月统计每个门店的合同支付明细

查询逻辑:

  • 根据月份筛选月租明细表
  • 按门店分组统计
  • 统计字段:
    • 门店ID、门店名称
    • 应缴金额合计
    • 已缴金额合计
    • 未缴金额合计
    • 明细数量

2. 成本费用统计

查询逻辑:

  • 统计已缴费的明细
  • 按月份、门店分组
  • 用于成本费用核算

🔧 功能方法

1. 自动生成月租明细方法

方法名: GenerateRentDetailsAsync(string contractId)

逻辑:

  1. 查询合同信息
  2. 计算需要生成的明细数量
  3. 从合同起始日期开始,每隔交租周期生成一条明细
  4. 批量插入明细记录

2. 计算下次应交时间方法(匿名方法)

方法名: CalculateNextPaymentDate(string contractId)

逻辑:

  1. 查询合同信息(获取提前提醒天数)
  2. 查询该合同未缴费的明细,按应缴日期升序排列
  3. 取最早的一条明细
  4. 计算:下次应交时间 = 最早应缴日期 - 提前提醒天数
  5. 更新合同的 F_NextPaymentDate 字段

3. 删除合同方法

方法名: DeleteContractAsync(string contractId)

逻辑:

  1. 开启事务
  2. 删除该合同的所有月租明细(逻辑删除或物理删除)
  3. 删除合同(逻辑删除或物理删除)
  4. 提交事务

⚠️ 注意事项

  1. 交租周期说明:

    • 1 = 每月交租
    • 3 = 每3个月交租(季度)
    • 6 = 每6个月交租(半年)
    • 12 = 每年交租
  2. 缴租金额说明:

    • 缴租金额 = 月租 × 交租周期
    • 例如:月租1000元,交租周期3个月,则缴租金额 = 3000元
  3. 应缴日期计算:

    • 建议:应缴日期 = 应缴月份的第一天
    • 或者:根据合同起始日期推算(如合同起始是每月15日,则应缴日期也是每月15日)
  4. 数据一致性:

    • 删除合同时必须级联删除明细
    • 更新合同时如果影响明细,需要重新生成
  5. 性能考虑:

    • 明细表数据量可能较大,需要建立合适的索引
    • 批量生成明细时使用批量插入

📝 待确认问题

  1. 应缴日期的计算规则:

    • 是固定为每月1日,还是根据合同起始日期推算?
    • 例如:合同起始是2025-01-15,交租周期3个月,第一次应缴日期是2025-01-15还是2025-01-01?
  2. 删除方式:

    • 物理删除还是逻辑删除?
    • 建议使用逻辑删除(设置 F_IsEffective = 0),保留历史数据
  3. 附件存储方式:

    • 存储文件路径?
    • 还是存储JSON格式的附件信息(多个附件)?
  4. 缴租金额的计算:

    • 是否自动计算:缴租金额 = 月租 × 交租周期?
    • 还是允许手动输入(可能有不规则的情况)?