Blame view

项目文档相关/docs/合同管理系统-逻辑梳理.md 7.95 KB
33860a93   “wangming”   feat: 新增合同管理系统功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
  # 合同管理系统 - 逻辑梳理
  
  ## 📋 需求概述
  
  建立一个合同管理系统,用于管理门店合同信息,并自动生成月租明细,用于统计每个月每个门店的合同支付明细以及成本费用。
  
  ## 🗄️ 数据库表设计
  
  ### 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. **缴租金额的计算:**
     - 是否自动计算:缴租金额 = 月租 × 交租周期?
     - 还是允许手动输入(可能有不规则的情况)?