Blame view

项目文档相关/docs/消耗功能加班需求分析.md 9.93 KB
fc259a33   “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
  # 消耗功能加班需求分析与设计方案
  
  ## 一、需求分析
  
  ### 核心需求
  1. **加班标识**:标识消耗单是否是加班单
  2. **加班系数**:记录加班系数(如 0.5、1、1.5 等)
  3. **数据计算**:消耗单的项目数和手工费需要加上对应的系数
  4. **数据保留**:保留原始数据、加班数据、最终数据
  
  ### 影响范围
  - **项目数**:影响 `lq_xh_pxmx.F_ProjectNumber`(品项明细项目次数)
  - **手工费**:影响 `lq_xh_hyhk.sgfy`(耗卡主表手工费用)和 `lq_xh_jksyj.F_LaborCost`(健康师业绩手工费)、`lq_xh_kjbsyj.F_LaborCost`(科技部老师业绩手工费)
  
  ## 二、当前表结构分析
  
  ### 1. lq_xh_hyhk(耗卡主表)
  - `xfje` - 消费金额(decimal)
  - `sgfy` - 手工费用(decimal)**← 需要记录原始值、加班计算值、最终值**
  - `hksj` - 耗卡时间
  
  ### 2. lq_xh_pxmx(耗卡品项明细表)
  - `F_ProjectNumber` - 项目次数(int)**← 需要记录原始值、加班计算值、最终值**
  - `F_TotalPrice` - 合计金额(decimal)
  - `pxjg` - 品项价格(decimal)
  
  ### 3. lq_xh_jksyj(耗卡健康师业绩表)
  - `F_kdpxNumber` - 耗卡品项次数(decimal)**← 需要记录原始值、加班计算值、最终值**
  - `F_LaborCost` - 手工费(decimal)**← 需要记录原始值、加班计算值、最终值**
  - `jksyj` - 健康师业绩(decimal)
  
  ### 4. lq_xh_kjbsyj(耗卡科技部老师业绩表)
  - `F_hdpxNumber` - 耗卡品相次数(decimal)**← 需要记录原始值、加班计算值、最终值**
  - `F_LaborCost` - 手工费(decimal)**← 需要记录原始值、加班计算值、最终值**
  - `kjblsyj` - 科技部老师业绩(decimal)
  
  ## 三、设计方案
  
  ### 方案概述
  采用 **主表标识 + 明细表计算** 的设计模式:
  - 加班标识和加班系数存储在 **耗卡主表**`lq_xh_hyhk`
  - 原始数据、加班计算后的数据、最终数据分别存储在相关表中
  
  ### 字段设计
  
  #### 3.1 lq_xh_hyhk(耗卡主表)- 新增字段
  ```
  F_OvertimeCoefficient DECIMAL(18,2) 加班系数(NULL或0表示非加班单,大于0表示加班单,如 0.5、1、1.5)
  F_OriginalSgfy      DECIMAL(18,2) 原始手工费(用户输入的原始值)
  F_OvertimeSgfy      DECIMAL(18,2) 加班手工费(加班计算后的增量值)
  ```
  
  **说明:**
  - `F_OvertimeCoefficient` 存储加班系数,用于判断是否为加班单:
    - `NULL` 或 `0` → 非加班单
    - 大于 `0`(如 0.5、1、1.5)→ 加班单,系数值表示加倍的倍数
  - `F_OriginalSgfy` 存储用户输入的原始手工费
  - `F_OvertimeSgfy = F_OriginalSgfy * F_OvertimeCoefficient`(加班计算后的增量,仅当系数大于0时计算)
  - `sgfy`(最终手工费)= `F_OriginalSgfy + F_OvertimeSgfy`(原始值 + 加班增量)
  
  #### 3.2 lq_xh_pxmx(耗卡品项明细表)- 新增字段
  ```
  F_OriginalProjectNumber   INT         原始项目次数(用户输入的原始值)
  F_OvertimeProjectNumber   DECIMAL(18,2) 加班项目次数(加班计算后的增量值)
  ```
  
  **说明:**
  - `F_OriginalProjectNumber` 存储用户输入的原始项目次数
  - `F_OvertimeProjectNumber = F_OriginalProjectNumber * F_OvertimeCoefficient`(从主表获取系数计算)
  - `F_ProjectNumber`(最终项目次数)= `F_OriginalProjectNumber + F_OvertimeProjectNumber`(原始值 + 加班增量)
  
  #### 3.3 lq_xh_jksyj(耗卡健康师业绩表)- 新增字段
  ```
  F_OriginalKdpxNumber  DECIMAL(18,2) 原始耗卡品项次数(原始值)
  F_OvertimeKdpxNumber  DECIMAL(18,2) 加班耗卡品项次数(加班计算后的增量值)
  F_OriginalLaborCost   DECIMAL(18,2) 原始手工费(原始值)
  F_OvertimeLaborCost   DECIMAL(18,2) 加班手工费(加班计算后的增量值)
  ```
  
  **说明:**
  - `F_OriginalKdpxNumber` 存储原始耗卡品项次数
  - `F_OvertimeKdpxNumber = F_OriginalKdpxNumber * F_OvertimeCoefficient`(从主表获取系数计算)
  - `F_kdpxNumber`(最终耗卡品项次数)= `F_OriginalKdpxNumber + F_OvertimeKdpxNumber`
  - `F_OriginalLaborCost` 存储原始手工费
  - `F_OvertimeLaborCost = F_OriginalLaborCost * F_OvertimeCoefficient`(从主表获取系数计算)
  - `F_LaborCost`(最终手工费)= `F_OriginalLaborCost + F_OvertimeLaborCost`
  
  #### 3.4 lq_xh_kjbsyj(耗卡科技部老师业绩表)- 新增字段
  ```
  F_OriginalHdpxNumber  DECIMAL(18,2) 原始耗卡品相次数(原始值)
  F_OvertimeHdpxNumber  DECIMAL(18,2) 加班耗卡品相次数(加班计算后的增量值)
  F_OriginalLaborCost   DECIMAL(18,2) 原始手工费(原始值)
  F_OvertimeLaborCost   DECIMAL(18,2) 加班手工费(加班计算后的增量值)
  ```
  
  **说明:**
  - `F_OriginalHdpxNumber` 存储原始耗卡品相次数
  - `F_OvertimeHdpxNumber = F_OriginalHdpxNumber * F_OvertimeCoefficient`(从主表获取系数计算)
  - `F_hdpxNumber`(最终耗卡品相次数)= `F_OriginalHdpxNumber + F_OvertimeHdpxNumber`
  - `F_OriginalLaborCost` 存储原始手工费
  - `F_OvertimeLaborCost = F_OriginalLaborCost * F_OvertimeCoefficient`(从主表获取系数计算)
  - `F_LaborCost`(最终手工费)= `F_OriginalLaborCost + F_OvertimeLaborCost`
  
  ## 四、数据计算逻辑
  
  ### 4.1 创建消耗单时的计算流程
  
  **前提条件:**
  - 如果用户输入加班系数(`F_OvertimeCoefficient`),且值大于 0,则视为加班单
  - 加班系数可以为 `NULL`、`0`(非加班单)或大于 `0` 的值(如 0.5、1、1.5)
  
  **计算步骤:**
  
  1. **耗卡主表(lq_xh_hyhk)**
     ```
     原始手工费(F_OriginalSgfy)= 用户输入的手工费
     加班手工费(F_OvertimeSgfy)= F_OriginalSgfy * F_OvertimeCoefficient(如果 F_OvertimeCoefficient > 0)
     最终手工费(sgfy)= F_OriginalSgfy + F_OvertimeSgfy
     ```
  
  2. **耗卡品项明细表(lq_xh_pxmx)**
     ```
     原始项目次数(F_OriginalProjectNumber)= 用户输入的项目次数
     加班项目次数(F_OvertimeProjectNumber)= F_OriginalProjectNumber * F_OvertimeCoefficient(如果 F_OvertimeCoefficient > 0)
     最终项目次数(F_ProjectNumber)= F_OriginalProjectNumber + F_OvertimeProjectNumber
     ```
  
  3. **健康师业绩表(lq_xh_jksyj)**
     ```
     原始耗卡品项次数(F_OriginalKdpxNumber)= 原始项目次数
     加班耗卡品项次数(F_OvertimeKdpxNumber)= F_OriginalKdpxNumber * F_OvertimeCoefficient(如果 F_OvertimeCoefficient > 0)
     最终耗卡品项次数(F_kdpxNumber)= F_OriginalKdpxNumber + F_OvertimeKdpxNumber
     
     原始手工费(F_OriginalLaborCost)= 该健康师的原始手工费
     加班手工费(F_OvertimeLaborCost)= F_OriginalLaborCost * F_OvertimeCoefficient(如果 F_OvertimeCoefficient > 0)
     最终手工费(F_LaborCost)= F_OriginalLaborCost + F_OvertimeLaborCost
     ```
  
  4. **科技部老师业绩表(lq_xh_kjbsyj)**
     ```
     原始耗卡品相次数(F_OriginalHdpxNumber)= 原始项目次数
     加班耗卡品相次数(F_OvertimeHdpxNumber)= F_OriginalHdpxNumber * F_OvertimeCoefficient(如果 F_OvertimeCoefficient > 0)
     最终耗卡品相次数(F_hdpxNumber)= F_OriginalHdpxNumber + F_OvertimeHdpxNumber
     
     原始手工费(F_OriginalLaborCost)= 该科技部老师的原始手工费
     加班手工费(F_OvertimeLaborCost)= F_OriginalLaborCost * F_OvertimeCoefficient(如果 F_OvertimeCoefficient > 0)
     最终手工费(F_LaborCost)= F_OriginalLaborCost + F_OvertimeLaborCost
     ```
  
  ### 4.2 特殊情况处理
  
  - **非加班单(F_OvertimeCoefficient IS NULL 或 F_OvertimeCoefficient = 0)**
    - 所有加班字段(`F_Overtime*`)都等于 `0` 或 `NULL`
    - 最终值 = 原始值
  
  - **加班系数为 0**
    - 加班增量 = 0,最终值 = 原始值(等同于非加班单)
  
  - **加班系数为 NULL**
    - 视为非加班单,不进行任何加班计算
  
  ## 五、数据查询与展示
  
  ### 5.1 查询时展示的数据
  - **原始数据**:所有 `F_Original*` 字段
  - **加班数据**:所有 `F_Overtime*` 字段 + `F_OvertimeCoefficient`
  - **最终数据**:所有最终字段(`sgfy`、`F_ProjectNumber`、`F_kdpxNumber`、`F_LaborCost` 等)
  
  ### 5.2 统计计算
  - 统计时可以分别统计:
    - 原始数据总和
    - 加班数据总和(筛选条件:`F_OvertimeCoefficient > 0`
    - 最终数据总和
  - 查询加班单:`WHERE F_OvertimeCoefficient > 0`
  - 查询非加班单:`WHERE F_OvertimeCoefficient IS NULL OR F_OvertimeCoefficient = 0`
  
  ## 六、实施建议
  
  ### 6.1 数据库变更
  1. 执行 SQL 脚本添加所有新字段
  2. 为现有数据设置默认值:
     - `F_OvertimeCoefficient = NULL`(所有现有数据默认为非加班)
     - `F_OriginalSgfy = sgfy`(现有手工费作为原始值)
     - `F_OvertimeSgfy = 0`(现有数据无加班增量)
     - 类似处理其他原始值字段
  
  ### 6.2 代码变更
  1. **实体类(Entity)**:添加所有新字段属性
  2. **DTO 类**
     - `LqXhHyhkCrInput` - 添加 `F_OvertimeCoefficient`(加班系数)输入字段
     - `LqXhHyhkInfoOutput` - 添加加班相关输出字段(系数、原始值、加班值)
     - `LqXhPxmxInfoOutput` - 添加加班相关输出字段(原始值、加班值)
     - `LqXhJksyjInfoOutput` - 添加加班相关输出字段(原始值、加班值)
     - `LqXhKjbsyjInfoOutput` - 添加加班相关输出字段(原始值、加班值)
  3. **Service 层**
     - `Create` 方法:添加加班计算逻辑
     - `Update` 方法:添加加班计算逻辑
     - `GetInfo` 方法:返回加班相关字段
  
  ## 七、总结
  
  本设计方案实现了:
  **原始数据保留**:所有原始值存储在 `F_Original*` 字段
  **加班数据保留**:所有加班计算值存储在 `F_Overtime*` 字段
  **最终数据展示**:最终值 = 原始值 + 加班增量
  **数据可追溯**:可以查看任意时刻的原始值、加班值、最终值
  **灵活扩展**:加班系数可配置,支持不同场景(0.5、1、1.5 等)
  **简化设计**:通过 `F_OvertimeCoefficient` 一个字段即可判断是否为加班单(NULL/0=非加班,>0=加班)