合同管理系统-逻辑梳理.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. 创建合同时自动生成月租明细
逻辑:
- 用户录入合同信息
- 系统根据以下信息自动生成月租明细:
- 合同起始日期(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)
逻辑:
- 查询合同信息
- 计算需要生成的明细数量
- 从合同起始日期开始,每隔交租周期生成一条明细
- 批量插入明细记录
2. 计算下次应交时间方法(匿名方法)
方法名: CalculateNextPaymentDate(string contractId)
逻辑:
- 查询合同信息(获取提前提醒天数)
- 查询该合同未缴费的明细,按应缴日期升序排列
- 取最早的一条明细
- 计算:下次应交时间 = 最早应缴日期 - 提前提醒天数
- 更新合同的 F_NextPaymentDate 字段
3. 删除合同方法
方法名: DeleteContractAsync(string contractId)
逻辑:
- 开启事务
- 删除该合同的所有月租明细(逻辑删除或物理删除)
- 删除合同(逻辑删除或物理删除)
- 提交事务
⚠️ 注意事项
交租周期说明:
- 1 = 每月交租
- 3 = 每3个月交租(季度)
- 6 = 每6个月交租(半年)
- 12 = 每年交租
缴租金额说明:
- 缴租金额 = 月租 × 交租周期
- 例如:月租1000元,交租周期3个月,则缴租金额 = 3000元
应缴日期计算:
- 建议:应缴日期 = 应缴月份的第一天
- 或者:根据合同起始日期推算(如合同起始是每月15日,则应缴日期也是每月15日)
数据一致性:
- 删除合同时必须级联删除明细
- 更新合同时如果影响明细,需要重新生成
性能考虑:
- 明细表数据量可能较大,需要建立合适的索引
- 批量生成明细时使用批量插入
📝 待确认问题
应缴日期的计算规则:
- 是固定为每月1日,还是根据合同起始日期推算?
- 例如:合同起始是2025-01-15,交租周期3个月,第一次应缴日期是2025-01-15还是2025-01-01?
删除方式:
- 物理删除还是逻辑删除?
- 建议使用逻辑删除(设置 F_IsEffective = 0),保留历史数据
附件存储方式:
- 存储文件路径?
- 还是存储JSON格式的附件信息(多个附件)?
缴租金额的计算:
- 是否自动计算:缴租金额 = 月租 × 交租周期?
- 还是允许手动输入(可能有不规则的情况)?