消耗功能加班需求分析.md
9.93 KB
消耗功能加班需求分析与设计方案
一、需求分析
核心需求
- 加班标识:标识消耗单是否是加班单
- 加班系数:记录加班系数(如 0.5、1、1.5 等)
- 数据计算:消耗单的项目数和手工费需要加上对应的系数
- 数据保留:保留原始数据、加班数据、最终数据
影响范围
- 项目数:影响
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_OvertimeKdpxNumberF_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_OvertimeHdpxNumberF_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)
计算步骤:
耗卡主表(lq_xh_hyhk)
原始手工费(F_OriginalSgfy)= 用户输入的手工费 加班手工费(F_OvertimeSgfy)= F_OriginalSgfy * F_OvertimeCoefficient(如果 F_OvertimeCoefficient > 0) 最终手工费(sgfy)= F_OriginalSgfy + F_OvertimeSgfy耗卡品项明细表(lq_xh_pxmx)
原始项目次数(F_OriginalProjectNumber)= 用户输入的项目次数 加班项目次数(F_OvertimeProjectNumber)= F_OriginalProjectNumber * F_OvertimeCoefficient(如果 F_OvertimeCoefficient > 0) 最终项目次数(F_ProjectNumber)= F_OriginalProjectNumber + F_OvertimeProjectNumber健康师业绩表(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=加班)