消耗功能加班需求分析.md 9.93 KB

消耗功能加班需求分析与设计方案

一、需求分析

核心需求

  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 存储加班系数,用于判断是否为加班单:
    • NULL0 → 非加班单
    • 大于 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,则视为加班单
  • 加班系数可以为 NULL0(非加班单)或大于 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=加班)