# 消耗功能加班需求分析与设计方案 ## 一、需求分析 ### 核心需求 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=加班)