Commit fc259a33b33c8f2aff38ea3113f3acce9888cdc0

Authored by “wangming”
1 parent d19ef8a5

feat: 添加消耗功能加班相关字段和退卡明细会员ID字段

- 为lq_hytk_mx表添加会员ID字段(F_MemberId)
- 为消耗功能添加加班相关字段:
  - lq_xh_hyhk: 加班系数、原始手工费、加班手工费
  - lq_xh_pxmx: 原始项目次数、加班项目次数
  - lq_xh_jksyj: 原始耗卡品项次数、加班耗卡品项次数、原始手工费、加班手工费
  - lq_xh_kjbsyj: 原始耗卡品相次数、加班耗卡品相次数、原始手工费、加班手工费
- 更新相关实体类和DTO类
- 将lq_xh_pxmx和lq_hytk_mx表的项目次数字段改为DECIMAL类型
- 添加消耗功能加班需求分析文档和SQL脚本
Showing 23 changed files with 505 additions and 17 deletions
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkMx/LqHytkMxCrInput.cs
... ... @@ -48,7 +48,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkMx
48 48 /// <summary>
49 49 /// 项目次数
50 50 /// </summary>
51   - public int? F_ProjectNumber { get; set; }
  51 + public decimal? F_ProjectNumber { get; set; }
52 52  
53 53 /// <summary>
54 54 /// 是否有效
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkMx/LqHytkMxInfoOutput.cs
... ... @@ -48,7 +48,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkMx
48 48 /// <summary>
49 49 /// 项目次数
50 50 /// </summary>
51   - public int projectNumber { get; set; }
  51 + public decimal projectNumber { get; set; }
52 52  
53 53  
54 54 /// <summary>
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkMx/LqHytkMxUpInput.cs
... ... @@ -40,7 +40,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkMx
40 40 /// <summary>
41 41 /// 项目次数
42 42 /// </summary>
43   - public int? F_ProjectNumber { get; set; }
  43 + public decimal? F_ProjectNumber { get; set; }
44 44  
45 45 /// <summary>
46 46 /// 是否有效
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhHyhk/LqXhHyhkCrInput.cs
... ... @@ -80,6 +80,16 @@ namespace NCC.Extend.Entitys.Dto.LqXhHyhk
80 80 public string signatureFile { get; set; }
81 81  
82 82 /// <summary>
  83 + /// 加班系数(NULL或0表示非加班单,大于0表示加班单,如 0.5、1、1.5)
  84 + /// </summary>
  85 + public decimal? overtimeCoefficient { get; set; }
  86 +
  87 + /// <summary>
  88 + /// 原始手工费(用户输入的原始值)
  89 + /// </summary>
  90 + public decimal? originalSgfy { get; set; }
  91 +
  92 + /// <summary>
83 93 /// 耗卡_品项明细
84 94 /// </summary>
85 95 public List<LqXhPxmxCrInput> lqXhPxmxList { get; set; }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhHyhk/LqXhHyhkInfoOutput.cs
... ... @@ -112,6 +112,21 @@ namespace NCC.Extend.Entitys.Dto.LqXhHyhk
112 112 public string cancelRemark { get; set; }
113 113  
114 114 /// <summary>
  115 + /// 加班系数(NULL或0表示非加班单,大于0表示加班单,如 0.5、1、1.5)
  116 + /// </summary>
  117 + public decimal? overtimeCoefficient { get; set; }
  118 +
  119 + /// <summary>
  120 + /// 原始手工费(用户输入的原始值)
  121 + /// </summary>
  122 + public decimal? originalSgfy { get; set; }
  123 +
  124 + /// <summary>
  125 + /// 加班手工费(加班计算后的增量值)
  126 + /// </summary>
  127 + public decimal? overtimeSgfy { get; set; }
  128 +
  129 + /// <summary>
115 130 /// 健康师业绩
116 131 /// </summary>
117 132 public List<LqXhJksyjInfoOutput> lqXhJksyjList { get; set; }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhHyhk/LqXhHyhkListOutput.cs
... ... @@ -95,5 +95,20 @@ namespace NCC.Extend.Entitys.Dto.LqXhHyhk
95 95 /// </summary>
96 96 public int isEffective { get; set; }
97 97  
  98 + /// <summary>
  99 + /// 加班系数(NULL或0表示非加班单,大于0表示加班单,如 0.5、1、1.5)
  100 + /// </summary>
  101 + public decimal? overtimeCoefficient { get; set; }
  102 +
  103 + /// <summary>
  104 + /// 原始手工费(用户输入的原始值)
  105 + /// </summary>
  106 + public decimal? originalSgfy { get; set; }
  107 +
  108 + /// <summary>
  109 + /// 加班手工费(加班计算后的增量值)
  110 + /// </summary>
  111 + public decimal? overtimeSgfy { get; set; }
  112 +
98 113 }
99 114 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhHyhk/LqXhHyhkMemberCardUsageOutput.cs
... ... @@ -87,7 +87,7 @@ namespace NCC.Extend.Entitys.Dto.LqXhHyhk
87 87 /// <summary>
88 88 /// 项目次数
89 89 /// </summary>
90   - public int? ProjectNumber { get; set; }
  90 + public decimal? ProjectNumber { get; set; }
91 91  
92 92 /// <summary>
93 93 /// 合计金额
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhJksyj/LqXhJksyjInfoOutput.cs
... ... @@ -68,6 +68,26 @@ namespace NCC.Extend.Entitys.Dto.LqXhJksyj
68 68 public decimal? kdpxNumber { get; set; }
69 69  
70 70 /// <summary>
  71 + /// 原始耗卡品项次数(原始值)
  72 + /// </summary>
  73 + public decimal? originalKdpxNumber { get; set; }
  74 +
  75 + /// <summary>
  76 + /// 加班耗卡品项次数(加班计算后的增量值)
  77 + /// </summary>
  78 + public decimal? overtimeKdpxNumber { get; set; }
  79 +
  80 + /// <summary>
  81 + /// 原始手工费(原始值)
  82 + /// </summary>
  83 + public decimal? originalLaborCost { get; set; }
  84 +
  85 + /// <summary>
  86 + /// 加班手工费(加班计算后的增量值)
  87 + /// </summary>
  88 + public decimal? overtimeLaborCost { get; set; }
  89 +
  90 + /// <summary>
71 91 /// 会员id
72 92 /// </summary>
73 93 public string memberId { get; set; }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhKjbsyj/LqXhKjbsyjInfoOutput.cs
... ... @@ -56,5 +56,25 @@ namespace NCC.Extend.Entitys.Dto.LqXhKjbsyj
56 56 /// 耗卡品相次数
57 57 /// </summary>
58 58 public decimal? hdpxNumber { get; set; }
  59 +
  60 + /// <summary>
  61 + /// 原始耗卡品相次数(原始值)
  62 + /// </summary>
  63 + public decimal? originalHdpxNumber { get; set; }
  64 +
  65 + /// <summary>
  66 + /// 加班耗卡品相次数(加班计算后的增量值)
  67 + /// </summary>
  68 + public decimal? overtimeHdpxNumber { get; set; }
  69 +
  70 + /// <summary>
  71 + /// 原始手工费(原始值)
  72 + /// </summary>
  73 + public decimal? originalLaborCost { get; set; }
  74 +
  75 + /// <summary>
  76 + /// 加班手工费(加班计算后的增量值)
  77 + /// </summary>
  78 + public decimal? overtimeLaborCost { get; set; }
59 79 }
60 80 }
61 81 \ No newline at end of file
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhPxmx/LqXhPxmxCrInput.cs
... ... @@ -46,7 +46,7 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx
46 46 /// <summary>
47 47 /// 项目次数
48 48 /// </summary>
49   - public int? projectNumber { get; set; }
  49 + public decimal? projectNumber { get; set; }
50 50  
51 51 /// <summary>
52 52 /// 是否有效
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhPxmx/LqXhPxmxInfoOutput.cs
... ... @@ -53,7 +53,17 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx
53 53 /// <summary>
54 54 /// 项目次数
55 55 /// </summary>
56   - public int? projectNumber { get; set; }
  56 + public decimal? projectNumber { get; set; }
  57 +
  58 + /// <summary>
  59 + /// 原始项目次数(用户输入的原始值)
  60 + /// </summary>
  61 + public decimal? originalProjectNumber { get; set; }
  62 +
  63 + /// <summary>
  64 + /// 加班项目次数(加班计算后的增量值)
  65 + /// </summary>
  66 + public decimal? overtimeProjectNumber { get; set; }
57 67  
58 68 /// <summary>
59 69 /// 来源类型(开卡/赠送/其他)
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhPxmx/LqXhPxmxUpInput.cs
... ... @@ -51,7 +51,7 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx
51 51 /// <summary>
52 52 /// 项目次数
53 53 /// </summary>
54   - public int? projectNumber { get; set; }
  54 + public decimal? projectNumber { get; set; }
55 55  
56 56 /// <summary>
57 57 /// 是否有效
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXmzl/LqXmzlStatisticsOutput.cs
... ... @@ -65,17 +65,17 @@ namespace NCC.Extend.Entitys.Dto.LqXmzl
65 65 /// <summary>
66 66 /// 消耗购买次数
67 67 /// </summary>
68   - public int ConsumePurchaseCount { get; set; }
  68 + public decimal ConsumePurchaseCount { get; set; }
69 69  
70 70 /// <summary>
71 71 /// 消耗赠送次数
72 72 /// </summary>
73   - public int ConsumeGiftCount { get; set; }
  73 + public decimal ConsumeGiftCount { get; set; }
74 74  
75 75 /// <summary>
76 76 /// 消耗体验次数
77 77 /// </summary>
78   - public int ConsumeExperienceCount { get; set; }
  78 + public decimal ConsumeExperienceCount { get; set; }
79 79  
80 80 /// <summary>
81 81 /// 退卡业绩
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_mx/LqHytkMxEntity.cs
... ... @@ -71,7 +71,7 @@ namespace NCC.Extend.Entitys.lq_hytk_mx
71 71 /// 项目次数
72 72 /// </summary>
73 73 [SugarColumn(ColumnName = "F_ProjectNumber")]
74   - public int ProjectNumber { get; set; }
  74 + public decimal ProjectNumber { get; set; }
75 75  
76 76 /// <summary>
77 77 /// 来源类型
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_xh_hyhk/LqXhHyhkEntity.cs
... ... @@ -126,5 +126,23 @@ namespace NCC.Extend.Entitys.lq_xh_hyhk
126 126 /// </summary>
127 127 [SugarColumn(ColumnName = "F_CancelRemark")]
128 128 public string CancelRemark { get; set; }
  129 +
  130 + /// <summary>
  131 + /// 加班系数(NULL或0表示非加班单,大于0表示加班单,如 0.5、1、1.5)
  132 + /// </summary>
  133 + [SugarColumn(ColumnName = "F_OvertimeCoefficient")]
  134 + public decimal? OvertimeCoefficient { get; set; }
  135 +
  136 + /// <summary>
  137 + /// 原始手工费(用户输入的原始值)
  138 + /// </summary>
  139 + [SugarColumn(ColumnName = "F_OriginalSgfy")]
  140 + public decimal? OriginalSgfy { get; set; }
  141 +
  142 + /// <summary>
  143 + /// 加班手工费(加班计算后的增量值)
  144 + /// </summary>
  145 + [SugarColumn(ColumnName = "F_OvertimeSgfy")]
  146 + public decimal? OvertimeSgfy { get; set; }
129 147 }
130 148 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_xh_jksyj/LqXhJksyjEntity.cs
... ... @@ -78,6 +78,30 @@ namespace NCC.Extend.Entitys.lq_xh_jksyj
78 78 public decimal? KdpxNumber { get; set; }
79 79  
80 80 /// <summary>
  81 + /// 原始耗卡品项次数(原始值)
  82 + /// </summary>
  83 + [SugarColumn(ColumnName = "F_OriginalKdpxNumber")]
  84 + public decimal? OriginalKdpxNumber { get; set; }
  85 +
  86 + /// <summary>
  87 + /// 加班耗卡品项次数(加班计算后的增量值)
  88 + /// </summary>
  89 + [SugarColumn(ColumnName = "F_OvertimeKdpxNumber")]
  90 + public decimal? OvertimeKdpxNumber { get; set; }
  91 +
  92 + /// <summary>
  93 + /// 原始手工费(原始值)
  94 + /// </summary>
  95 + [SugarColumn(ColumnName = "F_OriginalLaborCost")]
  96 + public decimal? OriginalLaborCost { get; set; }
  97 +
  98 + /// <summary>
  99 + /// 加班手工费(加班计算后的增量值)
  100 + /// </summary>
  101 + [SugarColumn(ColumnName = "F_OvertimeLaborCost")]
  102 + public decimal? OvertimeLaborCost { get; set; }
  103 +
  104 + /// <summary>
81 105 /// 是否有效
82 106 /// </summary>
83 107 [SugarColumn(ColumnName = "F_IsEffective")]
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_xh_kjbsyj/LqXhKjbsyjEntity.cs
... ... @@ -72,6 +72,30 @@ namespace NCC.Extend.Entitys.lq_xh_kjbsyj
72 72 public decimal? HdpxNumber { get; set; }
73 73  
74 74 /// <summary>
  75 + /// 原始耗卡品相次数(原始值)
  76 + /// </summary>
  77 + [SugarColumn(ColumnName = "F_OriginalHdpxNumber")]
  78 + public decimal? OriginalHdpxNumber { get; set; }
  79 +
  80 + /// <summary>
  81 + /// 加班耗卡品相次数(加班计算后的增量值)
  82 + /// </summary>
  83 + [SugarColumn(ColumnName = "F_OvertimeHdpxNumber")]
  84 + public decimal? OvertimeHdpxNumber { get; set; }
  85 +
  86 + /// <summary>
  87 + /// 原始手工费(原始值)
  88 + /// </summary>
  89 + [SugarColumn(ColumnName = "F_OriginalLaborCost")]
  90 + public decimal? OriginalLaborCost { get; set; }
  91 +
  92 + /// <summary>
  93 + /// 加班手工费(加班计算后的增量值)
  94 + /// </summary>
  95 + [SugarColumn(ColumnName = "F_OvertimeLaborCost")]
  96 + public decimal? OvertimeLaborCost { get; set; }
  97 +
  98 + /// <summary>
75 99 /// 是否有效
76 100 /// </summary>
77 101 [SugarColumn(ColumnName = "F_IsEffective")]
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_xh_pxmx/LqXhPxmxEntity.cs
... ... @@ -63,7 +63,19 @@ namespace NCC.Extend.Entitys.lq_xh_pxmx
63 63 /// 项目次数
64 64 /// </summary>
65 65 [SugarColumn(ColumnName = "F_ProjectNumber")]
66   - public int ProjectNumber { get; set; }
  66 + public decimal ProjectNumber { get; set; }
  67 +
  68 + /// <summary>
  69 + /// 原始项目次数(用户输入的原始值)
  70 + /// </summary>
  71 + [SugarColumn(ColumnName = "F_OriginalProjectNumber")]
  72 + public decimal? OriginalProjectNumber { get; set; }
  73 +
  74 + /// <summary>
  75 + /// 加班项目次数(加班计算后的增量值)
  76 + /// </summary>
  77 + [SugarColumn(ColumnName = "F_OvertimeProjectNumber")]
  78 + public decimal? OvertimeProjectNumber { get; set; }
67 79  
68 80 /// <summary>
69 81 /// 来源类型
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqMdxxService.cs
... ... @@ -346,7 +346,7 @@ namespace NCC.Extend.LqMdxx
346 346 var entity = await _db.Queryable<LqMdxxEntity>().FirstAsync(p => p.Id == id);
347 347 _ = entity ?? throw NCCException.Oh(ErrorCode.COM1005);
348 348 //直接修改status为0
349   - entity.Status = StatusEnum.删除.GetHashCode();
  349 + entity.Status = StatusEnum.无效.GetHashCode();
350 350 var isOk = await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
351 351 if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1001);
352 352 }
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqXhHyhkService.cs
... ... @@ -305,6 +305,7 @@ namespace NCC.Extend.LqXhHyhk
305 305 public async Task Create([FromBody] LqXhHyhkCrInput input)
306 306 {
307 307 var userInfo = await _userManager.GetUserInfo();
  308 + //首先判断当前时间是否是加班时间
308 309 var entity = input.Adapt<LqXhHyhkEntity>();
309 310 entity.Id = YitIdHelper.NextId().ToString();
310 311 entity.Czry = _userManager.UserId;
... ... @@ -312,6 +313,15 @@ namespace NCC.Extend.LqXhHyhk
312 313 entity.CreateTime = DateTime.Now;
313 314 entity.IsEffective = StatusEnum.有效.GetHashCode();
314 315 entity.UpdateTime = DateTime.Now;
  316 + entity.OvertimeCoefficient = input.overtimeCoefficient ?? 0;
  317 + entity.OriginalSgfy = entity.Sgfy;
  318 + if (entity.OvertimeCoefficient > 0)
  319 + {
  320 + //加班手工费 = 原始手工费 * 加班系数
  321 + entity.OvertimeSgfy = entity.OriginalSgfy * entity.OvertimeCoefficient;
  322 + //最终手工费 = 原始手工费 + 加班手工费
  323 + entity.Sgfy = entity.OriginalSgfy + entity.OvertimeSgfy;
  324 + }
315 325 try
316 326 {
317 327 // 开启事务
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqXmzlService.cs
... ... @@ -498,7 +498,6 @@ namespace NCC.Extend.LqXmzl
498 498 RefundAmount = refundData?.RefundAmount ?? 0,
499 499 RefundCount = refundData?.RefundCount ?? 0
500 500 };
501   -
502 501 result.Add(output);
503 502 }
504 503  
... ... @@ -691,9 +690,9 @@ namespace NCC.Extend.LqXmzl
691 690 {
692 691 public string ItemId { get; set; }
693 692 public decimal ConsumeAmount { get; set; }
694   - public int ConsumePurchaseCount { get; set; }
695   - public int ConsumeGiftCount { get; set; }
696   - public int ConsumeExperienceCount { get; set; }
  693 + public decimal ConsumePurchaseCount { get; set; }
  694 + public decimal ConsumeGiftCount { get; set; }
  695 + public decimal ConsumeExperienceCount { get; set; }
697 696 }
698 697  
699 698 /// <summary>
... ...
消耗功能加班需求分析.md 0 → 100644
  1 +# 消耗功能加班需求分析与设计方案
  2 +
  3 +## 一、需求分析
  4 +
  5 +### 核心需求
  6 +1. **加班标识**:标识消耗单是否是加班单
  7 +2. **加班系数**:记录加班系数(如 0.5、1、1.5 等)
  8 +3. **数据计算**:消耗单的项目数和手工费需要加上对应的系数
  9 +4. **数据保留**:保留原始数据、加班数据、最终数据
  10 +
  11 +### 影响范围
  12 +- **项目数**:影响 `lq_xh_pxmx.F_ProjectNumber`(品项明细项目次数)
  13 +- **手工费**:影响 `lq_xh_hyhk.sgfy`(耗卡主表手工费用)和 `lq_xh_jksyj.F_LaborCost`(健康师业绩手工费)、`lq_xh_kjbsyj.F_LaborCost`(科技部老师业绩手工费)
  14 +
  15 +## 二、当前表结构分析
  16 +
  17 +### 1. lq_xh_hyhk(耗卡主表)
  18 +- `xfje` - 消费金额(decimal)
  19 +- `sgfy` - 手工费用(decimal)**← 需要记录原始值、加班计算值、最终值**
  20 +- `hksj` - 耗卡时间
  21 +
  22 +### 2. lq_xh_pxmx(耗卡品项明细表)
  23 +- `F_ProjectNumber` - 项目次数(int)**← 需要记录原始值、加班计算值、最终值**
  24 +- `F_TotalPrice` - 合计金额(decimal)
  25 +- `pxjg` - 品项价格(decimal)
  26 +
  27 +### 3. lq_xh_jksyj(耗卡健康师业绩表)
  28 +- `F_kdpxNumber` - 耗卡品项次数(decimal)**← 需要记录原始值、加班计算值、最终值**
  29 +- `F_LaborCost` - 手工费(decimal)**← 需要记录原始值、加班计算值、最终值**
  30 +- `jksyj` - 健康师业绩(decimal)
  31 +
  32 +### 4. lq_xh_kjbsyj(耗卡科技部老师业绩表)
  33 +- `F_hdpxNumber` - 耗卡品相次数(decimal)**← 需要记录原始值、加班计算值、最终值**
  34 +- `F_LaborCost` - 手工费(decimal)**← 需要记录原始值、加班计算值、最终值**
  35 +- `kjblsyj` - 科技部老师业绩(decimal)
  36 +
  37 +## 三、设计方案
  38 +
  39 +### 方案概述
  40 +采用 **主表标识 + 明细表计算** 的设计模式:
  41 +- 加班标识和加班系数存储在 **耗卡主表**(`lq_xh_hyhk`)
  42 +- 原始数据、加班计算后的数据、最终数据分别存储在相关表中
  43 +
  44 +### 字段设计
  45 +
  46 +#### 3.1 lq_xh_hyhk(耗卡主表)- 新增字段
  47 +```
  48 +F_OvertimeCoefficient DECIMAL(18,2) 加班系数(NULL或0表示非加班单,大于0表示加班单,如 0.5、1、1.5)
  49 +F_OriginalSgfy DECIMAL(18,2) 原始手工费(用户输入的原始值)
  50 +F_OvertimeSgfy DECIMAL(18,2) 加班手工费(加班计算后的增量值)
  51 +```
  52 +
  53 +**说明:**
  54 +- `F_OvertimeCoefficient` 存储加班系数,用于判断是否为加班单:
  55 + - `NULL` 或 `0` → 非加班单
  56 + - 大于 `0`(如 0.5、1、1.5)→ 加班单,系数值表示加倍的倍数
  57 +- `F_OriginalSgfy` 存储用户输入的原始手工费
  58 +- `F_OvertimeSgfy = F_OriginalSgfy * F_OvertimeCoefficient`(加班计算后的增量,仅当系数大于0时计算)
  59 +- `sgfy`(最终手工费)= `F_OriginalSgfy + F_OvertimeSgfy`(原始值 + 加班增量)
  60 +
  61 +#### 3.2 lq_xh_pxmx(耗卡品项明细表)- 新增字段
  62 +```
  63 +F_OriginalProjectNumber INT 原始项目次数(用户输入的原始值)
  64 +F_OvertimeProjectNumber DECIMAL(18,2) 加班项目次数(加班计算后的增量值)
  65 +```
  66 +
  67 +**说明:**
  68 +- `F_OriginalProjectNumber` 存储用户输入的原始项目次数
  69 +- `F_OvertimeProjectNumber = F_OriginalProjectNumber * F_OvertimeCoefficient`(从主表获取系数计算)
  70 +- `F_ProjectNumber`(最终项目次数)= `F_OriginalProjectNumber + F_OvertimeProjectNumber`(原始值 + 加班增量)
  71 +
  72 +#### 3.3 lq_xh_jksyj(耗卡健康师业绩表)- 新增字段
  73 +```
  74 +F_OriginalKdpxNumber DECIMAL(18,2) 原始耗卡品项次数(原始值)
  75 +F_OvertimeKdpxNumber DECIMAL(18,2) 加班耗卡品项次数(加班计算后的增量值)
  76 +F_OriginalLaborCost DECIMAL(18,2) 原始手工费(原始值)
  77 +F_OvertimeLaborCost DECIMAL(18,2) 加班手工费(加班计算后的增量值)
  78 +```
  79 +
  80 +**说明:**
  81 +- `F_OriginalKdpxNumber` 存储原始耗卡品项次数
  82 +- `F_OvertimeKdpxNumber = F_OriginalKdpxNumber * F_OvertimeCoefficient`(从主表获取系数计算)
  83 +- `F_kdpxNumber`(最终耗卡品项次数)= `F_OriginalKdpxNumber + F_OvertimeKdpxNumber`
  84 +- `F_OriginalLaborCost` 存储原始手工费
  85 +- `F_OvertimeLaborCost = F_OriginalLaborCost * F_OvertimeCoefficient`(从主表获取系数计算)
  86 +- `F_LaborCost`(最终手工费)= `F_OriginalLaborCost + F_OvertimeLaborCost`
  87 +
  88 +#### 3.4 lq_xh_kjbsyj(耗卡科技部老师业绩表)- 新增字段
  89 +```
  90 +F_OriginalHdpxNumber DECIMAL(18,2) 原始耗卡品相次数(原始值)
  91 +F_OvertimeHdpxNumber DECIMAL(18,2) 加班耗卡品相次数(加班计算后的增量值)
  92 +F_OriginalLaborCost DECIMAL(18,2) 原始手工费(原始值)
  93 +F_OvertimeLaborCost DECIMAL(18,2) 加班手工费(加班计算后的增量值)
  94 +```
  95 +
  96 +**说明:**
  97 +- `F_OriginalHdpxNumber` 存储原始耗卡品相次数
  98 +- `F_OvertimeHdpxNumber = F_OriginalHdpxNumber * F_OvertimeCoefficient`(从主表获取系数计算)
  99 +- `F_hdpxNumber`(最终耗卡品相次数)= `F_OriginalHdpxNumber + F_OvertimeHdpxNumber`
  100 +- `F_OriginalLaborCost` 存储原始手工费
  101 +- `F_OvertimeLaborCost = F_OriginalLaborCost * F_OvertimeCoefficient`(从主表获取系数计算)
  102 +- `F_LaborCost`(最终手工费)= `F_OriginalLaborCost + F_OvertimeLaborCost`
  103 +
  104 +## 四、数据计算逻辑
  105 +
  106 +### 4.1 创建消耗单时的计算流程
  107 +
  108 +**前提条件:**
  109 +- 如果用户输入加班系数(`F_OvertimeCoefficient`),且值大于 0,则视为加班单
  110 +- 加班系数可以为 `NULL`、`0`(非加班单)或大于 `0` 的值(如 0.5、1、1.5)
  111 +
  112 +**计算步骤:**
  113 +
  114 +1. **耗卡主表(lq_xh_hyhk)**
  115 + ```
  116 + 原始手工费(F_OriginalSgfy)= 用户输入的手工费
  117 + 加班手工费(F_OvertimeSgfy)= F_OriginalSgfy * F_OvertimeCoefficient(如果 F_OvertimeCoefficient > 0)
  118 + 最终手工费(sgfy)= F_OriginalSgfy + F_OvertimeSgfy
  119 + ```
  120 +
  121 +2. **耗卡品项明细表(lq_xh_pxmx)**
  122 + ```
  123 + 原始项目次数(F_OriginalProjectNumber)= 用户输入的项目次数
  124 + 加班项目次数(F_OvertimeProjectNumber)= F_OriginalProjectNumber * F_OvertimeCoefficient(如果 F_OvertimeCoefficient > 0)
  125 + 最终项目次数(F_ProjectNumber)= F_OriginalProjectNumber + F_OvertimeProjectNumber
  126 + ```
  127 +
  128 +3. **健康师业绩表(lq_xh_jksyj)**
  129 + ```
  130 + 原始耗卡品项次数(F_OriginalKdpxNumber)= 原始项目次数
  131 + 加班耗卡品项次数(F_OvertimeKdpxNumber)= F_OriginalKdpxNumber * F_OvertimeCoefficient(如果 F_OvertimeCoefficient > 0)
  132 + 最终耗卡品项次数(F_kdpxNumber)= F_OriginalKdpxNumber + F_OvertimeKdpxNumber
  133 +
  134 + 原始手工费(F_OriginalLaborCost)= 该健康师的原始手工费
  135 + 加班手工费(F_OvertimeLaborCost)= F_OriginalLaborCost * F_OvertimeCoefficient(如果 F_OvertimeCoefficient > 0)
  136 + 最终手工费(F_LaborCost)= F_OriginalLaborCost + F_OvertimeLaborCost
  137 + ```
  138 +
  139 +4. **科技部老师业绩表(lq_xh_kjbsyj)**
  140 + ```
  141 + 原始耗卡品相次数(F_OriginalHdpxNumber)= 原始项目次数
  142 + 加班耗卡品相次数(F_OvertimeHdpxNumber)= F_OriginalHdpxNumber * F_OvertimeCoefficient(如果 F_OvertimeCoefficient > 0)
  143 + 最终耗卡品相次数(F_hdpxNumber)= F_OriginalHdpxNumber + F_OvertimeHdpxNumber
  144 +
  145 + 原始手工费(F_OriginalLaborCost)= 该科技部老师的原始手工费
  146 + 加班手工费(F_OvertimeLaborCost)= F_OriginalLaborCost * F_OvertimeCoefficient(如果 F_OvertimeCoefficient > 0)
  147 + 最终手工费(F_LaborCost)= F_OriginalLaborCost + F_OvertimeLaborCost
  148 + ```
  149 +
  150 +### 4.2 特殊情况处理
  151 +
  152 +- **非加班单(F_OvertimeCoefficient IS NULL 或 F_OvertimeCoefficient = 0)**:
  153 + - 所有加班字段(`F_Overtime*`)都等于 `0` 或 `NULL`
  154 + - 最终值 = 原始值
  155 +
  156 +- **加班系数为 0**:
  157 + - 加班增量 = 0,最终值 = 原始值(等同于非加班单)
  158 +
  159 +- **加班系数为 NULL**:
  160 + - 视为非加班单,不进行任何加班计算
  161 +
  162 +## 五、数据查询与展示
  163 +
  164 +### 5.1 查询时展示的数据
  165 +- **原始数据**:所有 `F_Original*` 字段
  166 +- **加班数据**:所有 `F_Overtime*` 字段 + `F_OvertimeCoefficient`
  167 +- **最终数据**:所有最终字段(`sgfy`、`F_ProjectNumber`、`F_kdpxNumber`、`F_LaborCost` 等)
  168 +
  169 +### 5.2 统计计算
  170 +- 统计时可以分别统计:
  171 + - 原始数据总和
  172 + - 加班数据总和(筛选条件:`F_OvertimeCoefficient > 0`)
  173 + - 最终数据总和
  174 +- 查询加班单:`WHERE F_OvertimeCoefficient > 0`
  175 +- 查询非加班单:`WHERE F_OvertimeCoefficient IS NULL OR F_OvertimeCoefficient = 0`
  176 +
  177 +## 六、实施建议
  178 +
  179 +### 6.1 数据库变更
  180 +1. 执行 SQL 脚本添加所有新字段
  181 +2. 为现有数据设置默认值:
  182 + - `F_OvertimeCoefficient = NULL`(所有现有数据默认为非加班)
  183 + - `F_OriginalSgfy = sgfy`(现有手工费作为原始值)
  184 + - `F_OvertimeSgfy = 0`(现有数据无加班增量)
  185 + - 类似处理其他原始值字段
  186 +
  187 +### 6.2 代码变更
  188 +1. **实体类(Entity)**:添加所有新字段属性
  189 +2. **DTO 类**:
  190 + - `LqXhHyhkCrInput` - 添加 `F_OvertimeCoefficient`(加班系数)输入字段
  191 + - `LqXhHyhkInfoOutput` - 添加加班相关输出字段(系数、原始值、加班值)
  192 + - `LqXhPxmxInfoOutput` - 添加加班相关输出字段(原始值、加班值)
  193 + - `LqXhJksyjInfoOutput` - 添加加班相关输出字段(原始值、加班值)
  194 + - `LqXhKjbsyjInfoOutput` - 添加加班相关输出字段(原始值、加班值)
  195 +3. **Service 层**:
  196 + - `Create` 方法:添加加班计算逻辑
  197 + - `Update` 方法:添加加班计算逻辑
  198 + - `GetInfo` 方法:返回加班相关字段
  199 +
  200 +## 七、总结
  201 +
  202 +本设计方案实现了:
  203 +✅ **原始数据保留**:所有原始值存储在 `F_Original*` 字段
  204 +✅ **加班数据保留**:所有加班计算值存储在 `F_Overtime*` 字段
  205 +✅ **最终数据展示**:最终值 = 原始值 + 加班增量
  206 +✅ **数据可追溯**:可以查看任意时刻的原始值、加班值、最终值
  207 +✅ **灵活扩展**:加班系数可配置,支持不同场景(0.5、1、1.5 等)
  208 +✅ **简化设计**:通过 `F_OvertimeCoefficient` 一个字段即可判断是否为加班单(NULL/0=非加班,>0=加班)
  209 +
... ...
添加消耗功能加班字段.sql 0 → 100644
  1 +-- ============================================
  2 +-- 为消耗功能添加加班相关字段
  3 +-- ============================================
  4 +-- 说明:此脚本为消耗功能添加加班标识、加班系数以及原始值、加班值、最终值的字段
  5 +-- 执行顺序:按照表的主从关系依次执行
  6 +
  7 +-- ============================================
  8 +-- 1. lq_xh_hyhk(耗卡主表) - 添加加班相关字段
  9 +-- ============================================
  10 +-- 说明:F_OvertimeCoefficient 为 NULL 或 0 表示非加班单,大于 0 表示加班单
  11 +ALTER TABLE lq_xh_hyhk
  12 +ADD COLUMN F_OvertimeCoefficient DECIMAL(18,2) NULL DEFAULT NULL COMMENT '加班系数(NULL或0表示非加班单,大于0表示加班单,如 0.5、1、1.5)' AFTER F_CancelRemark,
  13 +ADD COLUMN F_OriginalSgfy DECIMAL(18,2) NULL COMMENT '原始手工费(用户输入的原始值)' AFTER F_OvertimeCoefficient,
  14 +ADD COLUMN F_OvertimeSgfy DECIMAL(18,2) NULL DEFAULT 0 COMMENT '加班手工费(加班计算后的增量值)' AFTER F_OriginalSgfy;
  15 +
  16 +-- 为现有数据设置默认值
  17 +UPDATE lq_xh_hyhk
  18 +SET F_OvertimeCoefficient = NULL,
  19 + F_OriginalSgfy = COALESCE(sgfy, 0),
  20 + F_OvertimeSgfy = 0
  21 +WHERE F_OvertimeCoefficient IS NULL;
  22 +
  23 +-- ============================================
  24 +-- 2. lq_xh_pxmx(耗卡品项明细表) - 添加加班相关字段
  25 +-- ============================================
  26 +ALTER TABLE lq_xh_pxmx
  27 +ADD COLUMN F_OriginalProjectNumber DECIMAL(18,2) NULL COMMENT '原始项目次数(用户输入的原始值)' AFTER F_ProjectNumber,
  28 +ADD COLUMN F_OvertimeProjectNumber DECIMAL(18,2) NULL DEFAULT 0 COMMENT '加班项目次数(加班计算后的增量值)' AFTER F_OriginalProjectNumber;
  29 +
  30 +-- 为现有数据设置默认值
  31 +UPDATE lq_xh_pxmx
  32 +SET F_OriginalProjectNumber = COALESCE(F_ProjectNumber, 0),
  33 + F_OvertimeProjectNumber = 0
  34 +WHERE F_OriginalProjectNumber IS NULL;
  35 +
  36 +-- ============================================
  37 +-- 3. lq_xh_jksyj(耗卡健康师业绩表) - 添加加班相关字段
  38 +-- ============================================
  39 +ALTER TABLE lq_xh_jksyj
  40 +ADD COLUMN F_OriginalKdpxNumber DECIMAL(18,2) NULL COMMENT '原始耗卡品项次数(原始值)' AFTER F_kdpxNumber,
  41 +ADD COLUMN F_OvertimeKdpxNumber DECIMAL(18,2) NULL DEFAULT 0 COMMENT '加班耗卡品项次数(加班计算后的增量值)' AFTER F_OriginalKdpxNumber,
  42 +ADD COLUMN F_OriginalLaborCost DECIMAL(18,2) NULL COMMENT '原始手工费(原始值)' AFTER F_LaborCost,
  43 +ADD COLUMN F_OvertimeLaborCost DECIMAL(18,2) NULL DEFAULT 0 COMMENT '加班手工费(加班计算后的增量值)' AFTER F_OriginalLaborCost;
  44 +
  45 +-- 为现有数据设置默认值
  46 +UPDATE lq_xh_jksyj
  47 +SET F_OriginalKdpxNumber = COALESCE(F_kdpxNumber, 0),
  48 + F_OvertimeKdpxNumber = 0,
  49 + F_OriginalLaborCost = COALESCE(F_LaborCost, 0),
  50 + F_OvertimeLaborCost = 0
  51 +WHERE F_OriginalKdpxNumber IS NULL;
  52 +
  53 +-- ============================================
  54 +-- 4. lq_xh_kjbsyj(耗卡科技部老师业绩表) - 添加加班相关字段
  55 +-- ============================================
  56 +ALTER TABLE lq_xh_kjbsyj
  57 +ADD COLUMN F_OriginalHdpxNumber DECIMAL(18,2) NULL COMMENT '原始耗卡品相次数(原始值)' AFTER F_hdpxNumber,
  58 +ADD COLUMN F_OvertimeHdpxNumber DECIMAL(18,2) NULL DEFAULT 0 COMMENT '加班耗卡品相次数(加班计算后的增量值)' AFTER F_OriginalHdpxNumber,
  59 +ADD COLUMN F_OriginalLaborCost DECIMAL(18,2) NULL COMMENT '原始手工费(原始值)' AFTER F_LaborCost,
  60 +ADD COLUMN F_OvertimeLaborCost DECIMAL(18,2) NULL DEFAULT 0 COMMENT '加班手工费(加班计算后的增量值)' AFTER F_OriginalLaborCost;
  61 +
  62 +-- 为现有数据设置默认值
  63 +UPDATE lq_xh_kjbsyj
  64 +SET F_OriginalHdpxNumber = COALESCE(F_hdpxNumber, 0),
  65 + F_OvertimeHdpxNumber = 0,
  66 + F_OriginalLaborCost = COALESCE(F_LaborCost, 0),
  67 + F_OvertimeLaborCost = 0
  68 +WHERE F_OriginalHdpxNumber IS NULL;
  69 +
  70 +-- ============================================
  71 +-- 5. 创建索引(可选,用于优化查询)
  72 +-- ============================================
  73 +-- 为加班系数创建索引,方便查询加班单(系数大于0的记录)
  74 +CREATE INDEX idx_xh_hyhk_overtime_coefficient ON lq_xh_hyhk(F_OvertimeCoefficient);
  75 +
  76 +-- ============================================
  77 +-- 6. 验证字段创建
  78 +-- ============================================
  79 +-- 验证 lq_xh_hyhk 表
  80 +-- SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_COMMENT
  81 +-- FROM INFORMATION_SCHEMA.COLUMNS
  82 +-- WHERE TABLE_NAME = 'lq_xh_hyhk'
  83 +-- AND (COLUMN_NAME LIKE 'F_%Overtime%' OR COLUMN_NAME LIKE 'F_Original%');
  84 +
  85 +-- 验证 lq_xh_pxmx 表
  86 +-- SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_COMMENT
  87 +-- FROM INFORMATION_SCHEMA.COLUMNS
  88 +-- WHERE TABLE_NAME = 'lq_xh_pxmx'
  89 +-- AND (COLUMN_NAME LIKE 'F_%Overtime%' OR COLUMN_NAME LIKE 'F_Original%');
  90 +
  91 +-- 验证 lq_xh_jksyj 表
  92 +-- SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_COMMENT
  93 +-- FROM INFORMATION_SCHEMA.COLUMNS
  94 +-- WHERE TABLE_NAME = 'lq_xh_jksyj'
  95 +-- AND (COLUMN_NAME LIKE 'F_%Overtime%' OR COLUMN_NAME LIKE 'F_Original%');
  96 +
  97 +-- 验证 lq_xh_kjbsyj 表
  98 +-- SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_COMMENT
  99 +-- FROM INFORMATION_SCHEMA.COLUMNS
  100 +-- WHERE TABLE_NAME = 'lq_xh_kjbsyj'
  101 +-- AND (COLUMN_NAME LIKE 'F_%Overtime%' OR COLUMN_NAME LIKE 'F_Original%');
  102 +
... ...