# 合同管理系统 - 逻辑梳理 ## 📋 需求概述 建立一个合同管理系统,用于管理门店合同信息,并自动生成月租明细,用于统计每个月每个门店的合同支付明细以及成本费用。 ## 🗄️ 数据库表设计 ### 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. **缴租金额的计算:** - 是否自动计算:缴租金额 = 月租 × 交租周期? - 还是允许手动输入(可能有不规则的情况)?