Commit 4b74fde5c0f9a59082ffba1b1955c69e8cc82c39

Authored by “wangming”
1 parent da3042f7

Refactor overtime calculation logic to exclude 科技部 from overtime fees, ensuring …

…accurate computation based on 健康师's original labor costs. Added refund achievement tracking in daily report statistics for comprehensive performance analysis.
docs/加班系数逻辑说明及修改方案.md
... ... @@ -19,16 +19,19 @@
19 19  
20 20 #### 📊 **主表(lq_xh_hyhk)计算**
21 21  
  22 +**重要**:科技部老师不参与加班,主表加班手工费仅来自健康师。
  23 +
22 24 ```
23   -加班手工费(F_OvertimeSgfy)= 原始手工费(F_OriginalSgfy)× 加班系数(F_OvertimeCoefficient)
  25 +加班手工费(F_OvertimeSgfy)= 健康师原始手工费之和 × 加班系数(F_OvertimeCoefficient)
24 26 最终手工费(sgfy)= 原始手工费(F_OriginalSgfy)+ 加班手工费(F_OvertimeSgfy)
25 27 ```
26 28  
27   -**示例**:
28   -- 原始手工费 = 100元
  29 +**示例**(健康师12元 + 科技部40元 = 整单原始52元):
  30 +- 原始手工费 = 52元(健康师12 + 科技部40)
  31 +- 健康师原始手工费之和 = 12元
29 32 - 加班系数 = 0.5
30   -- 加班手工费 = 100 × 0.5 = 50元
31   -- 最终手工费 = 100 + 50 = 150元
  33 +- 加班手工费 = 12 × 0.5 = 6元(仅健康师参与)
  34 +- 最终手工费 = 52 + 6 = 58元(= 健康师18 + 科技部40)
32 35  
33 36 ---
34 37  
... ... @@ -94,8 +97,8 @@ LaborCost = ikjbs_tem.laborCost,
94 97 ┌─────────────────────────────────────────────────────────────┐
95 98 │ lq_xh_hyhk(耗卡主表) │
96 99 │ F_OvertimeCoefficient(加班系数) │
97   -│ F_OriginalSgfy(原始手工费) │
98   -│ F_OvertimeSgfy(加班手工费)= OriginalSgfy × Coefficient │
  100 +│ F_OriginalSgfy(原始手工费 = 健康师+科技部) │
  101 +│ F_OvertimeSgfy(加班手工费)= Σ健康师原始手工费 × 系数 │
99 102 │ sgfy(最终手工费)= OriginalSgfy + OvertimeSgfy │
100 103 └─────────────────────────────────────────────────────────────┘
101 104
... ... @@ -127,11 +130,12 @@ LaborCost = ikjbs_tem.laborCost,
127 130  
128 131 **流程**:
129 132 1. 接收 `LqXhHyhkCrInput` 参数,包含 `overtimeCoefficient`
130   -2. 计算主表加班字段
  133 +2. 计算主表加班字段(科技部不参与加班,主表加班手工费 = 健康师加班手工费之和)
131 134 ```csharp
132 135 entity.OvertimeCoefficient = input.overtimeCoefficient ?? 0;
133 136 entity.OriginalSgfy = input.sgfy;
134   - entity.OvertimeSgfy = entity.OriginalSgfy * entity.OvertimeCoefficient;
  137 + var jksOriginalLaborCostSum = input.lqXhPxmxList?.SelectMany(p => p.lqXhJksyjList ?? ...).Sum(j => j.laborCost ?? 0) ?? 0;
  138 + entity.OvertimeSgfy = (decimal)(jksOriginalLaborCostSum * entity.OvertimeCoefficient);
135 139 entity.Sgfy = entity.OriginalSgfy + entity.OvertimeSgfy;
136 140 ```
137 141 3. 遍历品项明细,计算每个品项的加班字段:
... ... @@ -236,7 +240,7 @@ LaborCost = ikjbs_tem.laborCost,
236 240 ```
237 241  
238 242 3. **计算逻辑**:
239   - - 主表:重新计算 `F_OvertimeSgfy` 和 `sgfy`
  243 + - 主表:重新计算 `F_OvertimeSgfy`(= 健康师原始手工费之和 × 系数)和 `sgfy`(科技部不参与加班)
240 244 - 品项明细表:重新计算 `F_OvertimeProjectNumber` 和 `F_ProjectNumber`
241 245 - 健康师业绩表:重新计算 `F_OvertimeKdpxNumber`、`F_kdpxNumber`、`F_OvertimeLaborCost`、`F_LaborCost`
242 246 - 科技部老师业绩表:如果需要支持,重新计算相关字段
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/TechTeacherDailyStatisticsOutput.cs
... ... @@ -47,6 +47,11 @@ namespace NCC.Extend.Entitys.Dto.LqDailyReport
47 47 /// 开单业绩
48 48 /// </summary>
49 49 public decimal OrderAchievement { get; set; }
  50 +
  51 + /// <summary>
  52 + /// 退卡业绩(用于计算净业绩:净业绩 = 耗卡业绩 - 退卡业绩)
  53 + /// </summary>
  54 + public decimal RefundAchievement { get; set; }
50 55 }
51 56 }
52 57  
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Mapper/LqReimbursementApplicationMapper.cs
1   -using NCC.Common.Helper;
  1 +using NCC.Common.Helper;
  2 +using NCC.Extend.Entitys;
2 3 using NCC.Extend.Entitys.Dto.LqReimbursementApplication;
3 4 using Mapster;
4 5 using System.Collections.Generic;
... ... @@ -9,6 +10,9 @@ namespace NCC.Extend.Entitys.Mapper.LqReimbursementApplication
9 10 {
10 11 public void Register(TypeAdapterConfig config)
11 12 {
  13 + // 确保 camelCase 的 workflowConfigId 正确映射到 Entity 的 WorkflowConfigId
  14 + config.NewConfig<LqReimbursementApplicationCrInput, LqReimbursementApplicationEntity>()
  15 + .Map(d => d.WorkflowConfigId, s => s.workflowConfigId);
12 16 }
13 17 }
14 18 }
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqDailyReportService.cs
... ... @@ -1159,6 +1159,7 @@ namespace NCC.Extend
1159 1159 /// - ConsumeProjectCount: 消耗项目数
1160 1160 /// - ConsumeAchievement: 消耗业绩
1161 1161 /// - OrderAchievement: 开单业绩
  1162 + /// - RefundAchievement: 退卡业绩(净业绩 = 耗卡业绩 - 退卡业绩)
1162 1163 /// </remarks>
1163 1164 /// <param name="input">查询参数</param>
1164 1165 /// <returns>科技部老师统计列表</returns>
... ... @@ -1193,6 +1194,13 @@ namespace NCC.Extend
1193 1194 teacherFilterForOrder = $"AND ord.kjbls IN ('{teacherIdsStr}')";
1194 1195 }
1195 1196  
  1197 + var teacherFilterForRefund = "";
  1198 + if (input.TeacherIds != null && input.TeacherIds.Any())
  1199 + {
  1200 + var teacherIdsStr = string.Join("','", input.TeacherIds);
  1201 + teacherFilterForRefund = $"AND refund.kjbls IN ('{teacherIdsStr}')";
  1202 + }
  1203 +
1196 1204 // SQL查询:统计科技部老师的消耗业绩、见客数、项目数
1197 1205 // 注意:GROUP BY 中移除了 user.F_RealName,避免同一老师ID因姓名不同产生重复记录
1198 1206 var consumeSql = $@"
... ... @@ -1242,6 +1250,29 @@ namespace NCC.Extend
1242 1250  
1243 1251 var orderResult = await _db.Ado.SqlQueryAsync<dynamic>(orderSql);
1244 1252  
  1253 + // 查询退卡业绩(与耗卡使用相同过滤条件:门店、时间、人员、科技部)
  1254 + var refundSql = $@"
  1255 + SELECT
  1256 + techDept.F_Id as TechDepartmentId,
  1257 + techDept.F_FullName as TechDepartmentName,
  1258 + refund.kjbls as TeacherId,
  1259 + MAX(user.F_RealName) as TeacherName,
  1260 + SUM(refund.kjblsyj) as RefundAchievement
  1261 + FROM lq_hytk_kjbsyj refund
  1262 + INNER JOIN lq_hytk_hytk hytk ON refund.gltkbh = hytk.F_Id
  1263 + INNER JOIN lq_mdxx store ON hytk.md = store.F_Id
  1264 + LEFT JOIN base_organize techDept ON store.kjb = techDept.F_Id
  1265 + LEFT JOIN BASE_USER user ON refund.kjbls = user.F_Id
  1266 + WHERE refund.F_IsEffective = 1
  1267 + AND hytk.F_IsEffective = 1
  1268 + AND DATE(hytk.tksj) >= '{startDate:yyyy-MM-dd}'
  1269 + AND DATE(hytk.tksj) <= '{endDate:yyyy-MM-dd}'
  1270 + {techFilter}
  1271 + {teacherFilterForRefund}
  1272 + GROUP BY techDept.F_Id, techDept.F_FullName, refund.kjbls";
  1273 +
  1274 + var refundResult = await _db.Ado.SqlQueryAsync<dynamic>(refundSql);
  1275 +
1245 1276 // 合并数据:按员工ID汇总,避免同一员工在多个科技部重复出现
1246 1277 // 使用 TeacherId 作为唯一键,汇总所有科技部的数据
1247 1278 var teacherDict = new Dictionary<string, TechTeacherDailyStatisticsOutput>();
... ... @@ -1287,7 +1318,8 @@ namespace NCC.Extend
1287 1318 CustomerCount = 0,
1288 1319 ConsumeProjectCount = 0,
1289 1320 ConsumeAchievement = 0,
1290   - OrderAchievement = 0
  1321 + OrderAchievement = 0,
  1322 + RefundAchievement = 0
1291 1323 };
1292 1324 }
1293 1325  
... ... @@ -1334,7 +1366,8 @@ namespace NCC.Extend
1334 1366 CustomerCount = 0,
1335 1367 ConsumeProjectCount = 0,
1336 1368 ConsumeAchievement = 0,
1337   - OrderAchievement = 0
  1369 + OrderAchievement = 0,
  1370 + RefundAchievement = 0
1338 1371 };
1339 1372 }
1340 1373 else
... ... @@ -1349,7 +1382,38 @@ namespace NCC.Extend
1349 1382 teacherDict[teacherId].OrderAchievement += orderAchievement;
1350 1383 }
1351 1384  
1352   - // 第三步:确定每个员工的主要科技部
  1385 + // 第三步:处理退卡业绩,按员工ID汇总
  1386 + foreach (var item in refundResult ?? Enumerable.Empty<dynamic>())
  1387 + {
  1388 + var teacherId = item.TeacherId?.ToString();
  1389 + var techDeptId = item.TechDepartmentId?.ToString();
  1390 + var techDeptName = item.TechDepartmentName?.ToString();
  1391 + var refundAchievement = Convert.ToDecimal(item.RefundAchievement);
  1392 +
  1393 + if (string.IsNullOrEmpty(teacherId))
  1394 + continue;
  1395 +
  1396 + if (!teacherDict.ContainsKey(teacherId))
  1397 + {
  1398 + // 仅有退卡数据、无消耗和开单时,也创建记录
  1399 + teacherDict[teacherId] = new TechTeacherDailyStatisticsOutput
  1400 + {
  1401 + TechDepartmentId = techDeptId,
  1402 + TechDepartmentName = techDeptName,
  1403 + TeacherId = teacherId,
  1404 + TeacherName = item.TeacherName?.ToString(),
  1405 + CustomerCount = 0,
  1406 + ConsumeProjectCount = 0,
  1407 + ConsumeAchievement = 0,
  1408 + OrderAchievement = 0,
  1409 + RefundAchievement = 0
  1410 + };
  1411 + }
  1412 +
  1413 + teacherDict[teacherId].RefundAchievement += refundAchievement;
  1414 + }
  1415 +
  1416 + // 第四步:确定每个员工的主要科技部
1353 1417 // 优先按消耗业绩最多的科技部,如果消耗业绩为0,则按开单业绩最多的科技部
1354 1418 foreach (var teacherId in teacherDict.Keys.ToList())
1355 1419 {
... ... @@ -1424,7 +1488,7 @@ namespace NCC.Extend
1424 1488 }
1425 1489 }
1426 1490  
1427   - // 第步:重新计算见客数(去重,因为同一个客户可能在多个科技部被统计)
  1491 + // 第步:重新计算见客数(去重,因为同一个客户可能在多个科技部被统计)
1428 1492 // 由于已经汇总了数据,这里需要重新查询去重后的见客数
1429 1493 var teacherIds = teacherDict.Keys.ToList();
1430 1494 if (teacherIds.Any())
... ... @@ -1453,7 +1517,7 @@ namespace NCC.Extend
1453 1517 }
1454 1518 }
1455 1519  
1456   - // 第步:统一查询所有用户名称,确保所有用户都能获取到名称
  1520 + // 第步:统一查询所有用户名称,确保所有用户都能获取到名称
1457 1521 var teacherNamesSql = $@"
1458 1522 SELECT
1459 1523 F_Id as TeacherId,
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqReimbursementApplicationService.cs
... ... @@ -282,8 +282,8 @@ namespace NCC.Extend.LqReimbursementApplication
282 282  
283 283 // 先查询实体类中有CompletionTime字段且符合条件的申请ID
284 284 var entitiesWithCompletionTime = await _db.Queryable<LqReimbursementApplicationEntity>()
285   - .Where(x => x.CompletionTime.HasValue
286   - && x.CompletionTime.Value >= startDate
  285 + .Where(x => x.CompletionTime.HasValue
  286 + && x.CompletionTime.Value >= startDate
287 287 && x.CompletionTime.Value <= endDate)
288 288 .Select(x => x.Id)
289 289 .ToListAsync();
... ... @@ -528,11 +528,8 @@ namespace NCC.Extend.LqReimbursementApplication
528 528 }
529 529 }
530 530  
531   - // 2. 设置报销申请初始状态
532   - if (!string.IsNullOrEmpty(input.workflowConfigId))
533   - {
534   - entity.WorkflowConfigId = input.workflowConfigId.Trim();
535   - }
  531 + // 2. 设置报销申请初始状态(含流程配置ID,确保入库)
  532 + entity.WorkflowConfigId = !string.IsNullOrEmpty(input.workflowConfigId) ? input.workflowConfigId.Trim() : null;
536 533 entity.NodeCount = input.nodes.Count;
537 534 entity.CurrentNodeOrder = 0;
538 535 entity.ApprovalStatus = "待审批";
... ... @@ -546,8 +543,8 @@ namespace NCC.Extend.LqReimbursementApplication
546 543 entity.ApplicationUserName = userInfo.userName;
547 544 }
548 545  
549   - // 3. 保存报销申请表(不使用IgnoreColumns,确保新字段被保存)
550   - var isOk = await _db.Insertable(entity).ExecuteCommandAsync();
  546 + // 3. 保存报销申请表(ignoreNullColumn: false 确保 WorkflowConfigId 等可选字段能正确入库)
  547 + var isOk = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: false).ExecuteCommandAsync();
551 548 if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1000);
552 549  
553 550 // 4. 创建节点配置
... ... @@ -825,8 +822,10 @@ namespace NCC.Extend.LqReimbursementApplication
825 822 .ExecuteCommandAsync();
826 823 }
827 824  
828   - // 更新报销申请表(确保 purchaseRecordsId 字段被正确更新)
  825 + // 更新报销申请表(确保 purchaseRecordsId、WorkflowConfigId 等字段被正确更新)
829 826 var entity = input.Adapt<LqReimbursementApplicationEntity>();
  827 + entity.Id = id; // 确保使用路由参数中的主键
  828 + entity.WorkflowConfigId = !string.IsNullOrEmpty(input.workflowConfigId) ? input.workflowConfigId.Trim() : oldEntity?.WorkflowConfigId;
830 829 var isOk = await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
831 830 if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1001);
832 831  
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqXhHyhkService.cs
... ... @@ -1104,9 +1104,12 @@ namespace NCC.Extend.LqXhHyhk
1104 1104 entity.OvertimeCoefficient = input.overtimeCoefficient ?? 0;
1105 1105 entity.OriginalSgfy = input.sgfy;
1106 1106 entity.AppointmentId = input.appointmentId;
1107   - //加班手工费 = 原始手工费 * 加班系数
1108   - entity.OvertimeSgfy = entity.OriginalSgfy * entity.OvertimeCoefficient;
1109   - //最终手工费 = 原始手工费 + 加班手工费
  1107 + // 加班手工费 = 健康师原始手工费之和 × 加班系数(科技部不参与加班)
  1108 + var jksOriginalLaborCostSum = input.lqXhPxmxList?
  1109 + .SelectMany(p => p.lqXhJksyjList ?? Enumerable.Empty<LqXhJksyjCrInput>())
  1110 + .Sum(j => j.laborCost ?? 0) ?? 0;
  1111 + entity.OvertimeSgfy = (decimal)(jksOriginalLaborCostSum * entity.OvertimeCoefficient);
  1112 + // 最终手工费 = 原始手工费 + 加班手工费
1110 1113 entity.Sgfy = entity.OriginalSgfy + entity.OvertimeSgfy;
1111 1114 try
1112 1115 {
... ... @@ -1489,9 +1492,13 @@ namespace NCC.Extend.LqXhHyhk
1489 1492 throw NCCException.Oh(ErrorCode.COM1005, "耗卡记录不存在或已作废");
1490 1493 }
1491 1494 entity.UpdateTime = DateTime.Now;
1492   - entity.OvertimeCoefficient = input.overtimeCoefficient;
  1495 + entity.OvertimeCoefficient = input.overtimeCoefficient ?? 0;
1493 1496 entity.OriginalSgfy = input.sgfy;
1494   - entity.OvertimeSgfy = (decimal)(entity.OvertimeCoefficient * input.sgfy);
  1497 + // 加班手工费 = 健康师原始手工费之和 × 加班系数(科技部不参与加班)
  1498 + var jksOriginalLaborCostSum = input.lqXhPxmxList?
  1499 + .SelectMany(p => p.lqXhJksyjList ?? Enumerable.Empty<LqXhJksyjCrInput>())
  1500 + .Sum(j => j.laborCost ?? 0) ?? 0;
  1501 + entity.OvertimeSgfy = (decimal)(jksOriginalLaborCostSum * (entity.OvertimeCoefficient ?? 0));
1495 1502 entity.Sgfy = entity.OriginalSgfy + entity.OvertimeSgfy;
1496 1503 entity.AppointmentId = input.appointmentId;
1497 1504 //更新会员耗卡记录
... ... @@ -1823,7 +1830,7 @@ namespace NCC.Extend.LqXhHyhk
1823 1830 ///
1824 1831 /// 计算逻辑:
1825 1832 /// 1. 主表(lq_xh_hyhk):
1826   - /// - 加班手工费 = 原始手工费 × 新加班系数
  1833 + /// - 加班手工费 = 健康师原始手工费之和 × 新加班系数(科技部不参与加班)
1827 1834 /// - 最终手工费 = 原始手工费 + 加班手工费
1828 1835 ///
1829 1836 /// 2. 品项明细表(lq_xh_pxmx):
... ... @@ -1881,11 +1888,26 @@ namespace NCC.Extend.LqXhHyhk
1881 1888 }
1882 1889 }
1883 1890  
1884   - // 2. 更新主表加班系数和相关字段
  1891 + // 2. 查询健康师业绩,计算主表加班手工费(科技部不参与加班)
  1892 + var jksyjList = await _db.Queryable<LqXhJksyjEntity>()
  1893 + .Where(x => x.Glkdbh == id && x.IsEffective == StatusEnum.有效.GetHashCode())
  1894 + .ToListAsync();
  1895 + var jksOriginalLaborCostSum = jksyjList.Sum(j =>
  1896 + {
  1897 + var original = j.OriginalLaborCost ?? 0;
  1898 + if (original == 0 && (j.LaborCost ?? 0) > 0)
  1899 + {
  1900 + original = (j.LaborCost ?? 0) - (j.OvertimeLaborCost ?? 0);
  1901 + if (original < 0) original = 0;
  1902 + }
  1903 + return original;
  1904 + });
  1905 +
  1906 + // 3. 更新主表加班系数和相关字段
1885 1907 var newCoefficient = input.overtimeCoefficient ?? 0;
1886 1908 var originalSgfy = entity.OriginalSgfy ?? 0;
1887 1909 entity.OvertimeCoefficient = newCoefficient;
1888   - entity.OvertimeSgfy = (decimal)(originalSgfy * newCoefficient);
  1910 + entity.OvertimeSgfy = (decimal)(jksOriginalLaborCostSum * newCoefficient);
1889 1911 entity.Sgfy = originalSgfy + (entity.OvertimeSgfy ?? 0);
1890 1912 entity.UpdateTime = DateTime.Now;
1891 1913  
... ... @@ -1893,7 +1915,7 @@ namespace NCC.Extend.LqXhHyhk
1893 1915 .UpdateColumns(x => new { x.OvertimeCoefficient, x.OvertimeSgfy, x.Sgfy, x.UpdateTime })
1894 1916 .ExecuteCommandAsync();
1895 1917  
1896   - // 3. 查询所有品项明细,更新加班字段
  1918 + // 4. 查询所有品项明细,更新加班字段
1897 1919 var pxmxList = await _db.Queryable<LqXhPxmxEntity>()
1898 1920 .Where(x => x.ConsumeInfoId == id && x.IsEffective == StatusEnum.有效.GetHashCode())
1899 1921 .ToListAsync();
... ... @@ -1922,11 +1944,7 @@ namespace NCC.Extend.LqXhHyhk
1922 1944 .ExecuteCommandAsync();
1923 1945 }
1924 1946  
1925   - // 4. 查询所有健康师业绩,更新加班字段
1926   - var jksyjList = await _db.Queryable<LqXhJksyjEntity>()
1927   - .Where(x => x.Glkdbh == id && x.IsEffective == StatusEnum.有效.GetHashCode())
1928   - .ToListAsync();
1929   -
  1947 + // 5. 更新健康师业绩加班字段(jksyjList 已在步骤2查询)
1930 1948 foreach (var jksyj in jksyjList)
1931 1949 {
1932 1950 // 如果原始耗卡品项次数为空,使用当前值作为原始值
... ... @@ -1969,7 +1987,7 @@ namespace NCC.Extend.LqXhHyhk
1969 1987 .ExecuteCommandAsync();
1970 1988 }
1971 1989  
1972   - // 5. 科技部老师业绩表:当前代码中不参与加班计算,保持原值不变
  1990 + // 6. 科技部老师业绩表:当前代码中不参与加班计算,保持原值不变
1973 1991 // 如果需要支持,可以取消注释以下代码
1974 1992 /*
1975 1993 var kjbsyjList = await _db.Queryable<LqXhKjbsyjEntity>()
... ...
netcore/src/Modularity/Message/NCC.Message.Entitys/D:/wesley/project/git/antis-food-alliance/netcore/src/Modularity/Message/NCC.Message.Entitys/NCC.Message.Entitys.xml 0 → 100644
  1 +<?xml version="1.0"?>
  2 +<doc>
  3 + <assembly>
  4 + <name>NCC.Message.Entitys</name>
  5 + </assembly>
  6 + <members>
  7 + <member name="P:NCC.Message.Entitys.Dto.IM.IMContentListOutput.id">
  8 + <summary>
  9 + 主键
  10 + </summary>
  11 + </member>
  12 + <member name="P:NCC.Message.Entitys.Dto.IM.IMContentListOutput.sendUserId">
  13 + <summary>
  14 + 发送者
  15 + </summary>
  16 + <returns></returns>
  17 + </member>
  18 + <member name="P:NCC.Message.Entitys.Dto.IM.IMContentListOutput.sendTime">
  19 + <summary>
  20 + 发送时间
  21 + </summary>
  22 + <returns></returns>
  23 + </member>
  24 + <member name="P:NCC.Message.Entitys.Dto.IM.IMContentListOutput.receiveUserId">
  25 + <summary>
  26 + 接收者
  27 + </summary>
  28 + <returns></returns>
  29 + </member>
  30 + <member name="P:NCC.Message.Entitys.Dto.IM.IMContentListOutput.receiveTime">
  31 + <summary>
  32 + 接收时间
  33 + </summary>
  34 + <returns></returns>
  35 + </member>
  36 + <member name="P:NCC.Message.Entitys.Dto.IM.IMContentListOutput.content">
  37 + <summary>
  38 + 内容
  39 + </summary>
  40 + <returns></returns>
  41 + </member>
  42 + <member name="P:NCC.Message.Entitys.Dto.IM.IMContentListOutput.contentType">
  43 + <summary>
  44 + 内容类型:text、img、file
  45 + </summary>
  46 + </member>
  47 + <member name="P:NCC.Message.Entitys.Dto.IM.IMContentListOutput.state">
  48 + <summary>
  49 + 状态(0:未读、1:已读)
  50 + </summary>
  51 + <returns></returns>
  52 + </member>
  53 + <member name="T:NCC.Message.Entitys.Dto.IM.MessageInput">
  54 + <summary>
  55 + 消息接收类
  56 + </summary>
  57 + </member>
  58 + <member name="P:NCC.Message.Entitys.Dto.IM.MessageInput.sendClientId">
  59 + <summary>
  60 + 发送发送客户端ID
  61 + </summary>
  62 + </member>
  63 + <member name="P:NCC.Message.Entitys.Dto.IM.MessageInput.method">
  64 + <summary>
  65 + 方法
  66 + </summary>
  67 + </member>
  68 + <member name="P:NCC.Message.Entitys.Dto.IM.MessageInput.mobileDevice">
  69 + <summary>
  70 + 移动设备
  71 + </summary>
  72 + </member>
  73 + <member name="P:NCC.Message.Entitys.Dto.IM.MessageInput.token">
  74 + <summary>
  75 + Token
  76 + </summary>
  77 + </member>
  78 + <member name="P:NCC.Message.Entitys.Dto.IM.MessageInput.toUserId">
  79 + <summary>
  80 + 发送者ID
  81 + </summary>
  82 + </member>
  83 + <member name="P:NCC.Message.Entitys.Dto.IM.MessageInput.formUserId">
  84 + <summary>
  85 + 接收者ID
  86 + </summary>
  87 + </member>
  88 + <member name="P:NCC.Message.Entitys.Dto.IM.MessageInput.messageType">
  89 + <summary>
  90 + 消息类型
  91 + </summary>
  92 + </member>
  93 + <member name="P:NCC.Message.Entitys.Dto.IM.MessageInput.messageContent">
  94 + <summary>
  95 + 消息内容
  96 + </summary>
  97 + </member>
  98 + <member name="P:NCC.Message.Entitys.Dto.IM.MessageInput.currentPage">
  99 + <summary>
  100 + 当前页数
  101 + </summary>
  102 + </member>
  103 + <member name="P:NCC.Message.Entitys.Dto.IM.MessageInput.pageSize">
  104 + <summary>
  105 + 分页大小
  106 + </summary>
  107 + </member>
  108 + <member name="P:NCC.Message.Entitys.Dto.IM.MessageInput.sord">
  109 + <summary>
  110 + 排序
  111 + </summary>
  112 + </member>
  113 + <member name="P:NCC.Message.Entitys.Dto.IM.MessageInput.keyword">
  114 + <summary>
  115 + 关键字
  116 + </summary>
  117 + </member>
  118 + <member name="P:NCC.Message.Entitys.Dto.IM.MessageInput.RoomNo">
  119 + <summary>
  120 + 房间号
  121 + </summary>
  122 + </member>
  123 + <member name="P:NCC.Message.Entitys.Dto.IM.MessageInput.RoomName">
  124 + <summary>
  125 + 房间名称
  126 + </summary>
  127 + </member>
  128 + <member name="P:NCC.Message.Entitys.Dto.IM.MessageInput.IsRoom">
  129 + <summary>
  130 + 是否群组/房间消息
  131 + </summary>
  132 + </member>
  133 + <member name="T:NCC.Message.Entitys.Dto.IM.MessagetImageInput">
  134 + <summary>
  135 + 信息图片输入
  136 + </summary>
  137 + </member>
  138 + <member name="P:NCC.Message.Entitys.Dto.IM.MessagetImageInput.name">
  139 + <summary>
  140 + 64进制图片
  141 + </summary>
  142 + </member>
  143 + <member name="P:NCC.Message.Entitys.Dto.IM.MessagetImageInput.height">
  144 + <summary>
  145 + 高度
  146 + </summary>
  147 + </member>
  148 + <member name="P:NCC.Message.Entitys.Dto.IM.MessagetImageInput.width">
  149 + <summary>
  150 + 宽度
  151 + </summary>
  152 + </member>
  153 + <member name="T:NCC.Message.Entitys.Dto.IM.OnlineUserListOutput">
  154 + <summary>
  155 + 在线用户
  156 + 版 本:V1.20.15.0
  157 + 版 权:Wesley(https://www.NCCsoft.com)
  158 + 作 者:NCC开发平台组
  159 + 日 期:2017.09.20
  160 + </summary>
  161 + </member>
  162 + <member name="P:NCC.Message.Entitys.Dto.IM.OnlineUserListOutput.userId">
  163 + <summary>
  164 + 用户ID
  165 + </summary>
  166 + </member>
  167 + <member name="P:NCC.Message.Entitys.Dto.IM.OnlineUserListOutput.userAccount">
  168 + <summary>
  169 + 用户账号
  170 + </summary>
  171 + </member>
  172 + <member name="P:NCC.Message.Entitys.Dto.IM.OnlineUserListOutput.userName">
  173 + <summary>
  174 + 用户名称
  175 + </summary>
  176 + </member>
  177 + <member name="P:NCC.Message.Entitys.Dto.IM.OnlineUserListOutput.loginTime">
  178 + <summary>
  179 + 登录时间
  180 + </summary>
  181 + </member>
  182 + <member name="P:NCC.Message.Entitys.Dto.IM.OnlineUserListOutput.loginIPAddress">
  183 + <summary>
  184 + 登录IP地址
  185 + </summary>
  186 + </member>
  187 + <member name="P:NCC.Message.Entitys.Dto.IM.OnlineUserListOutput.loginPlatForm">
  188 + <summary>
  189 + 登录平台设备
  190 + </summary>
  191 + </member>
  192 + <member name="P:NCC.Message.Entitys.Dto.IM.OnlineUserListOutput.tenantId">
  193 + <summary>
  194 + 租户ID
  195 + </summary>
  196 + </member>
  197 + <member name="P:NCC.Message.Entitys.Dto.IM.RoomIMContentListOutput.id">
  198 + <summary>
  199 + 主键
  200 + </summary>
  201 + </member>
  202 + <member name="P:NCC.Message.Entitys.Dto.IM.RoomIMContentListOutput.sendUserId">
  203 + <summary>
  204 + 发送者
  205 + </summary>
  206 + <returns></returns>
  207 + </member>
  208 + <member name="P:NCC.Message.Entitys.Dto.IM.RoomIMContentListOutput.sendTime">
  209 + <summary>
  210 + 发送时间
  211 + </summary>
  212 + <returns></returns>
  213 + </member>
  214 + <member name="P:NCC.Message.Entitys.Dto.IM.RoomIMContentListOutput.roomNo">
  215 + <summary>
  216 + 房间 /群组好
  217 + </summary>
  218 + <returns></returns>
  219 + </member>
  220 + <member name="P:NCC.Message.Entitys.Dto.IM.RoomIMContentListOutput.content">
  221 + <summary>
  222 + 内容
  223 + </summary>
  224 + <returns></returns>
  225 + </member>
  226 + <member name="P:NCC.Message.Entitys.Dto.IM.RoomIMContentListOutput.contentType">
  227 + <summary>
  228 + 内容类型:text、img、file
  229 + </summary>
  230 + </member>
  231 + <member name="P:NCC.Message.Entitys.Dto.IM.RoomIMContentListOutput.state">
  232 + <summary>
  233 + 状态(0:未读、1:已读)
  234 + </summary>
  235 + <returns></returns>
  236 + </member>
  237 + <member name="T:NCC.Message.Entitys.Dto.ImReply.ImReplyListOutput">
  238 + <summary>
  239 + 聊天会话列表输出
  240 + </summary>
  241 + </member>
  242 + <member name="F:NCC.Message.Entitys.Dto.ImReply.ImReplyListOutput.id">
  243 + <summary>
  244 + 主键
  245 + </summary>
  246 + </member>
  247 + <member name="P:NCC.Message.Entitys.Dto.ImReply.ImReplyListOutput.sendUserId">
  248 + <summary>
  249 + 发送者
  250 + </summary>
  251 + </member>
  252 + <member name="F:NCC.Message.Entitys.Dto.ImReply.ImReplyListOutput.userId">
  253 + <summary>
  254 + 接受者
  255 + </summary>
  256 + </member>
  257 + <member name="F:NCC.Message.Entitys.Dto.ImReply.ImReplyListOutput.realName">
  258 + <summary>
  259 + 名称
  260 + </summary>
  261 + </member>
  262 + <member name="F:NCC.Message.Entitys.Dto.ImReply.ImReplyListOutput.headIcon">
  263 + <summary>
  264 + 头像
  265 + </summary>
  266 + </member>
  267 + <member name="F:NCC.Message.Entitys.Dto.ImReply.ImReplyListOutput.latestMessage">
  268 + <summary>
  269 + 最新消息
  270 + </summary>
  271 + </member>
  272 + <member name="F:NCC.Message.Entitys.Dto.ImReply.ImReplyListOutput.latestDate">
  273 + <summary>
  274 + 最新时间
  275 + </summary>
  276 + </member>
  277 + <member name="F:NCC.Message.Entitys.Dto.ImReply.ImReplyListOutput.unreadMessage">
  278 + <summary>
  279 + 未读消息
  280 + </summary>
  281 + </member>
  282 + <member name="F:NCC.Message.Entitys.Dto.ImReply.ImReplyListOutput.messageType">
  283 + <summary>
  284 + 消息类型
  285 + </summary>
  286 + </member>
  287 + <member name="F:NCC.Message.Entitys.Dto.ImReply.ImReplyListOutput.account">
  288 + <summary>
  289 + 账号
  290 + </summary>
  291 + </member>
  292 + <member name="T:NCC.Message.Entitys.Dto.ImReply.ImReplyObjectIdOutput">
  293 + <summary>
  294 + 聊天会话对象ID
  295 + </summary>
  296 + </member>
  297 + <member name="P:NCC.Message.Entitys.Dto.ImReply.ImReplyObjectIdOutput.userId">
  298 + <summary>
  299 + 对象id
  300 + </summary>
  301 + </member>
  302 + <member name="P:NCC.Message.Entitys.Dto.ImReply.ImReplyObjectIdOutput.latestDate">
  303 + <summary>
  304 + 最新时间
  305 + </summary>
  306 + </member>
  307 + <member name="P:NCC.Message.Entitys.Dto.Message.GroupMessageCrInput.name">
  308 + <summary>
  309 + 标题
  310 + </summary>
  311 + </member>
  312 + <member name="P:NCC.Message.Entitys.Dto.Message.GroupMessageCrInput.bodyText">
  313 + <summary>
  314 + 正文内容
  315 + </summary>
  316 + </member>
  317 + <member name="P:NCC.Message.Entitys.Dto.Message.GroupMessageCrInput.roomNo">
  318 + <summary>
  319 + 房间号
  320 + </summary>
  321 + </member>
  322 + <member name="P:NCC.Message.Entitys.Dto.Message.GroupMessageCrInput.description">
  323 + <summary>
  324 + 描述
  325 + </summary>
  326 + </member>
  327 + <member name="P:NCC.Message.Entitys.Dto.Message.GroupMessageCrInput.clientId">
  328 + <summary>
  329 + 消息实例ID
  330 + </summary>
  331 + </member>
  332 + <member name="P:NCC.Message.Entitys.Dto.Message.GroupMessageCrInput.productId">
  333 + <summary>
  334 + 商品ID
  335 + </summary>
  336 + </member>
  337 + <member name="P:NCC.Message.Entitys.Dto.Message.GroupMessageCrInput.shopId">
  338 + <summary>
  339 + 店铺Id
  340 + </summary>
  341 + </member>
  342 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageCrInput.title">
  343 + <summary>
  344 + 标题
  345 + </summary>
  346 + </member>
  347 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageCrInput.bodyText">
  348 + <summary>
  349 + 正文内容
  350 + </summary>
  351 + </member>
  352 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageInfoOutput.id">
  353 + <summary>
  354 + id
  355 + </summary>
  356 + </member>
  357 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageInfoOutput.title">
  358 + <summary>
  359 + 标题
  360 + </summary>
  361 + </member>
  362 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageInfoOutput.bodyText">
  363 + <summary>
  364 + 正文内容
  365 + </summary>
  366 + </member>
  367 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageInfoOutput.creatorUser">
  368 + <summary>
  369 + 发送人员
  370 + </summary>
  371 + </member>
  372 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageInfoOutput.lastModifyTime">
  373 + <summary>
  374 + 发送时间
  375 + </summary>
  376 + </member>
  377 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageInfoOutput.deleteMark">
  378 + <summary>
  379 +
  380 + </summary>
  381 + </member>
  382 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageListInput.type">
  383 + <summary>
  384 + 类型
  385 + </summary>
  386 + </member>
  387 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageListOutput.id">
  388 + <summary>
  389 + id
  390 + </summary>
  391 + </member>
  392 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageListOutput.title">
  393 + <summary>
  394 + 标题
  395 + </summary>
  396 + </member>
  397 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageListOutput.type">
  398 + <summary>
  399 + 正文内容
  400 + </summary>
  401 + </member>
  402 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageListOutput.creatorUser">
  403 + <summary>
  404 + 发送人员
  405 + </summary>
  406 + </member>
  407 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageListOutput.lastModifyTime">
  408 + <summary>
  409 + 发送时间
  410 + </summary>
  411 + </member>
  412 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageListOutput.isRead">
  413 + <summary>
  414 + 是否已读(0-未读,1-已读)
  415 + </summary>
  416 + </member>
  417 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageListOutput.deleteMark">
  418 + <summary>
  419 +
  420 + </summary>
  421 + </member>
  422 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageListOutput.enabledMark">
  423 + <summary>
  424 +
  425 + </summary>
  426 + </member>
  427 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageListOutput.userId">
  428 + <summary>
  429 +
  430 + </summary>
  431 + </member>
  432 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageNoticeOutput.id">
  433 + <summary>
  434 + id
  435 + </summary>
  436 + </member>
  437 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageNoticeOutput.title">
  438 + <summary>
  439 + 标题
  440 + </summary>
  441 + </member>
  442 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageNoticeOutput.creatorUser">
  443 + <summary>
  444 + 发布人员
  445 + </summary>
  446 + </member>
  447 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageNoticeOutput.lastModifyTime">
  448 + <summary>
  449 + 发布时间
  450 + </summary>
  451 + </member>
  452 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageNoticeOutput.enabledMark">
  453 + <summary>
  454 + 状态(0-存草稿,1-已发布)
  455 + </summary>
  456 + </member>
  457 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageNoticeOutput.type">
  458 + <summary>
  459 + 类型
  460 + </summary>
  461 + </member>
  462 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageNoticeOutput.deleteMark">
  463 + <summary>
  464 + 删除标记
  465 + </summary>
  466 + </member>
  467 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageReadInfoOutput.id">
  468 + <summary>
  469 + id
  470 + </summary>
  471 + </member>
  472 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageReadInfoOutput.title">
  473 + <summary>
  474 + 标题
  475 + </summary>
  476 + </member>
  477 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageReadInfoOutput.bodyText">
  478 + <summary>
  479 + 正文内容
  480 + </summary>
  481 + </member>
  482 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageReadInfoOutput.creatorUser">
  483 + <summary>
  484 + 发送人员
  485 + </summary>
  486 + </member>
  487 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageReadInfoOutput.lastModifyTime">
  488 + <summary>
  489 + 发送时间
  490 + </summary>
  491 + </member>
  492 + <member name="P:NCC.Message.Entitys.Dto.Message.MessageUpInput.id">
  493 + <summary>
  494 + id
  495 + </summary>
  496 + </member>
  497 + <member name="T:NCC.Message.Entitys.RoomIMContentEntity">
  498 + <summary>
  499 + 群组/房间 消息在线聊天
  500 + 版 本:V1.20.15
  501 + 版 权:Wesley(https://www.NCCsoft.com)
  502 + 作 者:NCC开发平台组
  503 + 日 期:2022-03-16
  504 + </summary>
  505 + </member>
  506 + <member name="P:NCC.Message.Entitys.RoomIMContentEntity.GroupId">
  507 + <summary>
  508 + 群组/房间ID
  509 + </summary>
  510 + </member>
  511 + <member name="P:NCC.Message.Entitys.RoomIMContentEntity.SendUserId">
  512 + <summary>
  513 + 发送者
  514 + </summary>
  515 + <returns></returns>
  516 + </member>
  517 + <member name="P:NCC.Message.Entitys.RoomIMContentEntity.SendTime">
  518 + <summary>
  519 + 发送时间
  520 + </summary>
  521 + <returns></returns>
  522 + </member>
  523 + <member name="P:NCC.Message.Entitys.RoomIMContentEntity.RoomNo">
  524 + <summary>
  525 + 房间号
  526 + </summary>
  527 + <returns></returns>
  528 + </member>
  529 + <member name="P:NCC.Message.Entitys.RoomIMContentEntity.Content">
  530 + <summary>
  531 + 内容
  532 + </summary>
  533 + <returns></returns>
  534 + </member>
  535 + <member name="P:NCC.Message.Entitys.RoomIMContentEntity.ContentType">
  536 + <summary>
  537 + 内容类型:text、img、file
  538 + </summary>
  539 + </member>
  540 + <member name="P:NCC.Message.Entitys.RoomIMContentEntity.State">
  541 + <summary>
  542 + 状态(0:未读、1:已读)
  543 + </summary>
  544 + <returns></returns>
  545 + </member>
  546 + <member name="P:NCC.Message.Entitys.RoomIMContentEntity.ClientId">
  547 + <summary>
  548 + 消息实例ID
  549 + </summary>
  550 + </member>
  551 + <member name="P:NCC.Message.Entitys.RoomIMContentEntity.MessageType">
  552 + <summary>
  553 + 消息实例ID
  554 + </summary>
  555 + </member>
  556 + <member name="T:NCC.Message.Entitys.RoomMessageEntity">
  557 + <summary>
  558 + 群组/房间消息
  559 + 版 本:V1.20.15
  560 + 版 权:Wesley(https://www.NCCsoft.com)
  561 + 作 者:NCC开发平台组
  562 + 日 期:2022-03-16
  563 + </summary>
  564 + </member>
  565 + <member name="P:NCC.Message.Entitys.RoomMessageEntity.Name">
  566 + <summary>
  567 + 房间/群组名
  568 + </summary>
  569 + </member>
  570 + <member name="P:NCC.Message.Entitys.RoomMessageEntity.BodyText">
  571 + <summary>
  572 + 正文
  573 + </summary>
  574 + </member>
  575 + <member name="P:NCC.Message.Entitys.RoomMessageEntity.PriorityLevel">
  576 + <summary>
  577 + 优先
  578 + </summary>
  579 + </member>
  580 + <member name="P:NCC.Message.Entitys.RoomMessageEntity.RoomNo">
  581 + <summary>
  582 + 房间号
  583 + </summary>
  584 + </member>
  585 + <member name="P:NCC.Message.Entitys.RoomMessageEntity.IsRead">
  586 + <summary>
  587 + 是否阅读
  588 + </summary>
  589 + </member>
  590 + <member name="P:NCC.Message.Entitys.RoomMessageEntity.Description">
  591 + <summary>
  592 + 描述
  593 + </summary>
  594 + </member>
  595 + <member name="P:NCC.Message.Entitys.RoomMessageEntity.SortCode">
  596 + <summary>
  597 + 排序码
  598 + </summary>
  599 + </member>
  600 + <member name="P:NCC.Message.Entitys.RoomMessageEntity.ClientId">
  601 + <summary>
  602 + 消息实例ID
  603 + </summary>
  604 + </member>
  605 + <member name="P:NCC.Message.Entitys.RoomMessageEntity.ProductId">
  606 + <summary>
  607 + 商品ID
  608 + </summary>
  609 + </member>
  610 + <member name="P:NCC.Message.Entitys.RoomMessageEntity.ShopId">
  611 + <summary>
  612 + 店铺Id
  613 + </summary>
  614 + </member>
  615 + <member name="T:NCC.Message.Entitys.IMContentEntity">
  616 + <summary>
  617 + 在线聊天
  618 + 版 本:V1.20.15
  619 + 版 权:Wesley(https://www.NCCsoft.com)
  620 + 作 者:NCC开发平台组
  621 + 日 期:2022-03-16
  622 + </summary>
  623 + </member>
  624 + <member name="P:NCC.Message.Entitys.IMContentEntity.SendUserId">
  625 + <summary>
  626 + 发送者
  627 + </summary>
  628 + <returns></returns>
  629 + </member>
  630 + <member name="P:NCC.Message.Entitys.IMContentEntity.SendTime">
  631 + <summary>
  632 + 发送时间
  633 + </summary>
  634 + <returns></returns>
  635 + </member>
  636 + <member name="P:NCC.Message.Entitys.IMContentEntity.ReceiveUserId">
  637 + <summary>
  638 + 接收者
  639 + </summary>
  640 + <returns></returns>
  641 + </member>
  642 + <member name="P:NCC.Message.Entitys.IMContentEntity.ReceiveTime">
  643 + <summary>
  644 + 接收时间
  645 + </summary>
  646 + <returns></returns>
  647 + </member>
  648 + <member name="P:NCC.Message.Entitys.IMContentEntity.Content">
  649 + <summary>
  650 + 内容
  651 + </summary>
  652 + <returns></returns>
  653 + </member>
  654 + <member name="P:NCC.Message.Entitys.IMContentEntity.ContentType">
  655 + <summary>
  656 + 内容类型:text、img、file
  657 + </summary>
  658 + </member>
  659 + <member name="P:NCC.Message.Entitys.IMContentEntity.State">
  660 + <summary>
  661 + 状态(0:未读、1:已读)
  662 + </summary>
  663 + <returns></returns>
  664 + </member>
  665 + <member name="T:NCC.Message.Entitys.ImReplyEntity">
  666 + <summary>
  667 + 聊天会话
  668 + </summary>
  669 + </member>
  670 + <member name="P:NCC.Message.Entitys.ImReplyEntity.UserId">
  671 + <summary>
  672 + 发送者
  673 + </summary>
  674 + <returns></returns>
  675 + </member>
  676 + <member name="P:NCC.Message.Entitys.ImReplyEntity.ReceiveUserId">
  677 + <summary>
  678 + 接收用户
  679 + </summary>
  680 + <returns></returns>
  681 + </member>
  682 + <member name="P:NCC.Message.Entitys.ImReplyEntity.ReceiveTime">
  683 + <summary>
  684 + 接收用户时间
  685 + </summary>
  686 + <returns></returns>
  687 + </member>
  688 + <member name="T:NCC.Message.Entitys.MessageEntity">
  689 + <summary>
  690 + 消息实例
  691 + 版 本:V1.20.15
  692 + 版 权:Wesley(https://www.NCCsoft.com)
  693 + 作 者:NCC开发平台组
  694 + 日 期:2022-03-16
  695 + </summary>
  696 + </member>
  697 + <member name="P:NCC.Message.Entitys.MessageEntity.Type">
  698 + <summary>
  699 + 类别:1-通知公告,2-系统消息、3-私信消息
  700 + </summary>
  701 + </member>
  702 + <member name="P:NCC.Message.Entitys.MessageEntity.Title">
  703 + <summary>
  704 + 标题
  705 + </summary>
  706 + </member>
  707 + <member name="P:NCC.Message.Entitys.MessageEntity.BodyText">
  708 + <summary>
  709 + 正文
  710 + </summary>
  711 + </member>
  712 + <member name="P:NCC.Message.Entitys.MessageEntity.PriorityLevel">
  713 + <summary>
  714 + 优先
  715 + </summary>
  716 + </member>
  717 + <member name="P:NCC.Message.Entitys.MessageEntity.ToUserIds">
  718 + <summary>
  719 + 收件用户
  720 + </summary>
  721 + </member>
  722 + <member name="P:NCC.Message.Entitys.MessageEntity.IsRead">
  723 + <summary>
  724 + 是否阅读
  725 + </summary>
  726 + </member>
  727 + <member name="P:NCC.Message.Entitys.MessageEntity.Description">
  728 + <summary>
  729 + 描述
  730 + </summary>
  731 + </member>
  732 + <member name="P:NCC.Message.Entitys.MessageEntity.SortCode">
  733 + <summary>
  734 + 排序码
  735 + </summary>
  736 + </member>
  737 + <member name="T:NCC.Message.Entitys.MessageReceiveEntity">
  738 + <summary>
  739 + 消息接收
  740 + 版 本:V1.20.15
  741 + 版 权:Wesley(https://www.NCCsoft.com)
  742 + 作 者:NCC开发平台组
  743 + 日 期:2022-03-16
  744 + </summary>
  745 + </member>
  746 + <member name="P:NCC.Message.Entitys.MessageReceiveEntity.MessageId">
  747 + <summary>
  748 + 消息主键
  749 + </summary>
  750 + </member>
  751 + <member name="P:NCC.Message.Entitys.MessageReceiveEntity.UserId">
  752 + <summary>
  753 + 用户主键
  754 + </summary>
  755 + </member>
  756 + <member name="P:NCC.Message.Entitys.MessageReceiveEntity.IsRead">
  757 + <summary>
  758 + 是否阅读
  759 + </summary>
  760 + </member>
  761 + <member name="P:NCC.Message.Entitys.MessageReceiveEntity.ReadTime">
  762 + <summary>
  763 + 阅读时间
  764 + </summary>
  765 + </member>
  766 + <member name="P:NCC.Message.Entitys.MessageReceiveEntity.ReadCount">
  767 + <summary>
  768 + 阅读次数
  769 + </summary>
  770 + </member>
  771 + <member name="P:NCC.Message.Entitys.Model.IM.IMUnreadNumModel.sendUserId">
  772 + <summary>
  773 + 发送者Id
  774 + </summary>
  775 + </member>
  776 + <member name="P:NCC.Message.Entitys.Model.IM.IMUnreadNumModel.receiveUserId">
  777 + <summary>
  778 + 接收者Id
  779 + </summary>
  780 + </member>
  781 + <member name="P:NCC.Message.Entitys.Model.IM.IMUnreadNumModel.unreadNum">
  782 + <summary>
  783 + 未读数量
  784 + </summary>
  785 + </member>
  786 + <member name="P:NCC.Message.Entitys.Model.IM.IMUnreadNumModel.defaultMessage">
  787 + <summary>
  788 + 默认消息
  789 + </summary>
  790 + </member>
  791 + <member name="P:NCC.Message.Entitys.Model.IM.IMUnreadNumModel.defaultMessageType">
  792 + <summary>
  793 + 默认消息类型
  794 + </summary>
  795 + </member>
  796 + <member name="P:NCC.Message.Entitys.Model.IM.IMUnreadNumModel.defaultMessageTime">
  797 + <summary>
  798 + 默认消息时间
  799 + </summary>
  800 + </member>
  801 + <member name="T:NCC.Message.Entitys.Model.IM.UserOnlineModel">
  802 + <summary>
  803 + 在线用户模型
  804 + </summary>
  805 + </member>
  806 + <member name="P:NCC.Message.Entitys.Model.IM.UserOnlineModel.connectionId">
  807 + <summary>
  808 + 连接ID
  809 + </summary>
  810 + </member>
  811 + <member name="P:NCC.Message.Entitys.Model.IM.UserOnlineModel.userId">
  812 + <summary>
  813 + 用户ID
  814 + </summary>
  815 + </member>
  816 + <member name="P:NCC.Message.Entitys.Model.IM.UserOnlineModel.lastTime">
  817 + <summary>
  818 + 最后连接时间
  819 + </summary>
  820 + </member>
  821 + <member name="P:NCC.Message.Entitys.Model.IM.UserOnlineModel.lastLoginIp">
  822 + <summary>
  823 + 最后登录IP
  824 + </summary>
  825 + </member>
  826 + <member name="P:NCC.Message.Entitys.Model.IM.UserOnlineModel.lastLoginPlatForm">
  827 + <summary>
  828 + 登录平台设备
  829 + </summary>
  830 + </member>
  831 + <member name="P:NCC.Message.Entitys.Model.IM.UserOnlineModel.account">
  832 + <summary>
  833 + 账号
  834 + </summary>
  835 + </member>
  836 + <member name="P:NCC.Message.Entitys.Model.IM.UserOnlineModel.userName">
  837 + <summary>
  838 + 用户名称
  839 + </summary>
  840 + </member>
  841 + <member name="P:NCC.Message.Entitys.Model.IM.UserOnlineModel.tenantId">
  842 + <summary>
  843 + 租户id
  844 + </summary>
  845 + </member>
  846 + <member name="T:NCC.Message.Entitys.Model.IM.WebSocketClient">
  847 + <summary>
  848 + WebSocket客户端信息
  849 + </summary>
  850 + </member>
  851 + <member name="P:NCC.Message.Entitys.Model.IM.WebSocketClient.ConnectionId">
  852 + <summary>
  853 + 连接Id
  854 + </summary>
  855 + </member>
  856 + <member name="P:NCC.Message.Entitys.Model.IM.WebSocketClient.UserId">
  857 + <summary>
  858 + 用户Id
  859 + </summary>
  860 + </member>
  861 + <member name="P:NCC.Message.Entitys.Model.IM.WebSocketClient.Account">
  862 + <summary>
  863 + 用户账号
  864 + </summary>
  865 + </member>
  866 + <member name="P:NCC.Message.Entitys.Model.IM.WebSocketClient.HeadIcon">
  867 + <summary>
  868 + 头像
  869 + </summary>
  870 + </member>
  871 + <member name="P:NCC.Message.Entitys.Model.IM.WebSocketClient.UserName">
  872 + <summary>
  873 + 用户名称
  874 + </summary>
  875 + </member>
  876 + <member name="P:NCC.Message.Entitys.Model.IM.WebSocketClient.LoginIpAddress">
  877 + <summary>
  878 + 登录IP
  879 + </summary>
  880 + </member>
  881 + <member name="P:NCC.Message.Entitys.Model.IM.WebSocketClient.LoginPlatForm">
  882 + <summary>
  883 + 登录设备
  884 + </summary>
  885 + </member>
  886 + <member name="P:NCC.Message.Entitys.Model.IM.WebSocketClient.LoginTime">
  887 + <summary>
  888 + 登录时间
  889 + </summary>
  890 + </member>
  891 + <member name="P:NCC.Message.Entitys.Model.IM.WebSocketClient.TenantId">
  892 + <summary>
  893 + 租户Id
  894 + </summary>
  895 + </member>
  896 + <member name="P:NCC.Message.Entitys.Model.IM.WebSocketClient.IsMobileDevice">
  897 + <summary>
  898 + 移动端
  899 + </summary>
  900 + </member>
  901 + <member name="P:NCC.Message.Entitys.Model.IM.WebSocketClient.WebSocket">
  902 + <summary>
  903 + WebSocket对象
  904 + </summary>
  905 + </member>
  906 + <member name="P:NCC.Message.Entitys.Model.IM.WebSocketClient.RoomNo">
  907 + <summary>
  908 + 房间ID
  909 + </summary>
  910 + </member>
  911 + <member name="P:NCC.Message.Entitys.Model.IM.WebSocketClient.RoomName">
  912 + <summary>
  913 + 房间名
  914 + </summary>
  915 + </member>
  916 + <member name="M:NCC.Message.Entitys.Model.IM.WebSocketClient.SendMessageAsync(System.String)">
  917 + <summary>
  918 + 发送消息
  919 + </summary>
  920 + <param name="message"></param>
  921 + <returns></returns>
  922 + </member>
  923 + </members>
  924 +</doc>
... ...
sql/修复消耗单主表加班手工费历史数据.sql 0 → 100644
  1 +-- ============================================
  2 +-- 修复消耗单主表(lq_xh_hyhk)F_OvertimeSgfy 和 sgfy 历史数据
  3 +-- ============================================
  4 +-- 背景:主表加班手工费已改为「健康师原始手工费之和 × 加班系数」,科技部不参与加班。
  5 +-- 本脚本修复历史数据,使 F_OvertimeSgfy 和 sgfy 符合新逻辑。
  6 +--
  7 +-- 修复逻辑:
  8 +-- F_OvertimeSgfy = 健康师原始手工费之和 × F_OvertimeCoefficient
  9 +-- sgfy = F_OriginalSgfy + F_OvertimeSgfy
  10 +--
  11 +-- 健康师原始手工费:优先用 F_OriginalLaborCost,为空时用 F_LaborCost - F_OvertimeLaborCost
  12 +-- F_OriginalSgfy 为空时:用 健康师原始之和 + 科技部原始之和 补全
  13 +--
  14 +-- 执行前请先备份!建议在测试环境验证后再在生产环境执行。
  15 +
  16 +-- ============================================
  17 +-- 1. 预览:查看需要修复的记录(只读,可先执行验证)
  18 +-- ============================================
  19 +/*
  20 +SELECT
  21 + h.F_Id,
  22 + h.F_OriginalSgfy AS 当前原始手工费,
  23 + h.F_OvertimeSgfy AS 当前加班手工费,
  24 + h.sgfy AS 当前最终手工费,
  25 + h.F_OvertimeCoefficient AS 加班系数,
  26 + COALESCE(j.jks_sum, 0) AS 健康师原始手工费之和,
  27 + COALESCE(j.jks_sum, 0) * COALESCE(h.F_OvertimeCoefficient, 0) AS 新加班手工费,
  28 + COALESCE(h.F_OriginalSgfy, COALESCE(j.jks_sum, 0) + COALESCE(k.kjb_sum, 0)) + (COALESCE(j.jks_sum, 0) * COALESCE(h.F_OvertimeCoefficient, 0)) AS 新最终手工费
  29 +FROM lq_xh_hyhk h
  30 +LEFT JOIN (
  31 + SELECT glkdbh,
  32 + SUM(COALESCE(F_OriginalLaborCost, GREATEST(0, COALESCE(F_LaborCost, 0) - COALESCE(F_OvertimeLaborCost, 0)))) AS jks_sum
  33 + FROM lq_xh_jksyj
  34 + WHERE F_IsEffective = 1
  35 + GROUP BY glkdbh
  36 +) j ON h.F_Id = j.glkdbh
  37 +LEFT JOIN (
  38 + SELECT glkdbh,
  39 + SUM(COALESCE(F_OriginalLaborCost, F_LaborCost)) AS kjb_sum
  40 + FROM lq_xh_kjbsyj
  41 + WHERE F_IsEffective = 1
  42 + GROUP BY glkdbh
  43 +) k ON h.F_Id = k.glkdbh
  44 +WHERE h.F_IsEffective = 1
  45 + AND (
  46 + COALESCE(h.F_OvertimeSgfy, 0) != COALESCE(j.jks_sum, 0) * COALESCE(h.F_OvertimeCoefficient, 0)
  47 + OR COALESCE(h.sgfy, 0) != COALESCE(h.F_OriginalSgfy, COALESCE(j.jks_sum, 0) + COALESCE(k.kjb_sum, 0)) + (COALESCE(j.jks_sum, 0) * COALESCE(h.F_OvertimeCoefficient, 0))
  48 + )
  49 +LIMIT 50;
  50 +*/
  51 +
  52 +-- ============================================
  53 +-- 2. 执行修复:更新 F_OvertimeSgfy 和 sgfy
  54 +-- ============================================
  55 +UPDATE lq_xh_hyhk h
  56 +INNER JOIN (
  57 + SELECT glkdbh,
  58 + SUM(COALESCE(F_OriginalLaborCost, GREATEST(0, COALESCE(F_LaborCost, 0) - COALESCE(F_OvertimeLaborCost, 0)))) AS jks_sum
  59 + FROM lq_xh_jksyj
  60 + WHERE F_IsEffective = 1
  61 + GROUP BY glkdbh
  62 +) j ON h.F_Id = j.glkdbh
  63 +LEFT JOIN (
  64 + SELECT glkdbh,
  65 + SUM(COALESCE(F_OriginalLaborCost, F_LaborCost)) AS kjb_sum
  66 + FROM lq_xh_kjbsyj
  67 + WHERE F_IsEffective = 1
  68 + GROUP BY glkdbh
  69 +) k ON h.F_Id = k.glkdbh
  70 +SET
  71 + h.F_OvertimeSgfy = COALESCE(j.jks_sum, 0) * COALESCE(h.F_OvertimeCoefficient, 0),
  72 + h.sgfy = COALESCE(h.F_OriginalSgfy, COALESCE(j.jks_sum, 0) + COALESCE(k.kjb_sum, 0)) + (COALESCE(j.jks_sum, 0) * COALESCE(h.F_OvertimeCoefficient, 0))
  73 +WHERE h.F_IsEffective = 1;
  74 +
  75 +-- 说明:上述 UPDATE 使用 INNER JOIN j,因此仅更新「存在健康师业绩」的耗卡记录。
  76 +-- 若耗卡仅有科技部、无健康师,则 j 子查询无结果,该记录不会被更新。
  77 +-- 对于「仅科技部」的耗卡,正确逻辑应为:F_OvertimeSgfy=0,sgfy=F_OriginalSgfy,需单独处理。
  78 +
  79 +-- ============================================
  80 +-- 3. 补充修复:仅科技部、无健康师的耗卡(F_OvertimeSgfy 应为 0,sgfy = 原始手工费)
  81 +-- ============================================
  82 +UPDATE lq_xh_hyhk h
  83 +LEFT JOIN (
  84 + SELECT glkdbh
  85 + FROM lq_xh_jksyj
  86 + WHERE F_IsEffective = 1
  87 + GROUP BY glkdbh
  88 +) j ON h.F_Id = j.glkdbh
  89 +LEFT JOIN (
  90 + SELECT glkdbh,
  91 + SUM(COALESCE(F_OriginalLaborCost, F_LaborCost)) AS kjb_sum
  92 + FROM lq_xh_kjbsyj
  93 + WHERE F_IsEffective = 1
  94 + GROUP BY glkdbh
  95 +) k ON h.F_Id = k.glkdbh
  96 +SET
  97 + h.F_OvertimeSgfy = 0,
  98 + h.sgfy = COALESCE(h.F_OriginalSgfy, COALESCE(k.kjb_sum, 0), h.sgfy)
  99 +WHERE h.F_IsEffective = 1
  100 + AND j.glkdbh IS NULL
  101 + AND (COALESCE(h.F_OvertimeSgfy, 0) != 0);
  102 +
  103 +-- ============================================
  104 +-- 4. 验证修复结果(可选)
  105 +-- ============================================
  106 +-- 检查是否仍有不一致记录(应返回 0)
  107 +/*
  108 +SELECT COUNT(*) AS 仍不一致记录数
  109 +FROM lq_xh_hyhk h
  110 +LEFT JOIN (
  111 + SELECT glkdbh,
  112 + SUM(COALESCE(F_OriginalLaborCost, GREATEST(0, COALESCE(F_LaborCost, 0) - COALESCE(F_OvertimeLaborCost, 0)))) AS jks_sum
  113 + FROM lq_xh_jksyj
  114 + WHERE F_IsEffective = 1
  115 + GROUP BY glkdbh
  116 +) j ON h.F_Id = j.glkdbh
  117 +LEFT JOIN (
  118 + SELECT glkdbh,
  119 + SUM(COALESCE(F_OriginalLaborCost, F_LaborCost)) AS kjb_sum
  120 + FROM lq_xh_kjbsyj
  121 + WHERE F_IsEffective = 1
  122 + GROUP BY glkdbh
  123 +) k ON h.F_Id = k.glkdbh
  124 +WHERE h.F_IsEffective = 1
  125 + AND (
  126 + COALESCE(h.F_OvertimeSgfy, 0) != COALESCE(j.jks_sum, 0) * COALESCE(h.F_OvertimeCoefficient, 0)
  127 + OR COALESCE(h.sgfy, 0) != COALESCE(h.F_OriginalSgfy, COALESCE(j.jks_sum, 0) + COALESCE(k.kjb_sum, 0)) + (COALESCE(j.jks_sum, 0) * COALESCE(h.F_OvertimeCoefficient, 0))
  128 + );
  129 +*/
... ...
test-get-tech-teacher-daily-statistics.sh 0 → 100755
  1 +#!/bin/bash
  2 +# GetTechTeacherDailyStatistics 接口测试脚本
  3 +# 使用方式: ./test-get-tech-teacher-daily-statistics.sh [BASE_URL],默认 http://localhost:2011
  4 +# 前置:API 需已启动且已重新编译(含 RefundAchievement 的 DTO 变更)
  5 +
  6 +BASE_URL="${1:-http://localhost:2011}"
  7 +
  8 +echo "=== 1. 获取 Token ==="
  9 +TOKEN=$(curl -s -X POST "$BASE_URL/api/oauth/Login" \
  10 + -H "Content-Type: application/x-www-form-urlencoded" \
  11 + -d "account=admin&password=e10adc3949ba59abbe56e057f20f883e" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('data',{}).get('token','') if d.get('code')==200 else '')" 2>/dev/null)
  12 +if [ -z "$TOKEN" ]; then
  13 + echo "获取 Token 失败,请检查 API 是否启动"
  14 + exit 1
  15 +fi
  16 +echo "Token 获取成功"
  17 +
  18 +echo ""
  19 +echo "=== 2. 调用 GetTechTeacherDailyStatistics 接口 ==="
  20 +echo "时间范围: 2026-03-01 ~ 2026-03-16"
  21 +RESP=$(curl -s -X POST "$BASE_URL/api/Extend/LqDailyReport/get-tech-teacher-daily-statistics" \
  22 + -H "Authorization: $TOKEN" \
  23 + -H "Content-Type: application/json" \
  24 + -d '{"startTime":"2026-03-01T00:00:00","endTime":"2026-03-16T23:59:59"}')
  25 +echo "$RESP" | python3 -m json.tool 2>/dev/null || echo "$RESP"
  26 +
  27 +CODE=$(echo "$RESP" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('code',-1))" 2>/dev/null)
  28 +if [ "$CODE" != "200" ]; then
  29 + echo ""
  30 + echo "接口返回非 200,若为 500 且提示 set_RefundAchievement,请重启 API 服务后重试"
  31 + exit 1
  32 +fi
  33 +
  34 +echo ""
  35 +echo "=== 3. 数据库验证 SQL(MCP MySQL 或手动执行)==="
  36 +echo "耗卡业绩汇总(lq_xh_kjbsyj + lq_xh_hyhk):"
  37 +echo "SELECT consume.kjbls as TeacherId, SUM(consume.kjblsyj) as ConsumeAchievement"
  38 +echo "FROM lq_xh_kjbsyj consume"
  39 +echo "INNER JOIN lq_xh_hyhk hyhk ON consume.glkdbh = hyhk.F_Id"
  40 +echo "WHERE consume.F_IsEffective = 1 AND hyhk.F_IsEffective = 1"
  41 +echo " AND DATE(hyhk.hksj) >= '2026-03-01' AND DATE(hyhk.hksj) <= '2026-03-16'"
  42 +echo "GROUP BY consume.kjbls;"
  43 +echo ""
  44 +echo "退卡业绩汇总(lq_hytk_kjbsyj + lq_hytk_hytk):"
  45 +echo "SELECT refund.kjbls as TeacherId, SUM(refund.kjblsyj) as RefundAchievement"
  46 +echo "FROM lq_hytk_kjbsyj refund"
  47 +echo "INNER JOIN lq_hytk_hytk hytk ON refund.gltkbh = hytk.F_Id"
  48 +echo "WHERE refund.F_IsEffective = 1 AND hytk.F_IsEffective = 1"
  49 +echo " AND DATE(hytk.tksj) >= '2026-03-01' AND DATE(hytk.tksj) <= '2026-03-16'"
  50 +echo "GROUP BY refund.kjbls;"
... ...
test-xh-overtime-apis.sh 0 → 100644
  1 +#!/bin/bash
  2 +# 消耗单(会员耗卡)加班手工费接口测试脚本
  3 +# 使用方式: ./test-xh-overtime-apis.sh [BASE_URL],默认 http://localhost:2011
  4 +# 前置:API 需已启动
  5 +
  6 +BASE_URL="${1:-http://localhost:2011}"
  7 +
  8 +echo "=== 1. 获取 Token ==="
  9 +TOKEN=$(curl -s -X POST "$BASE_URL/api/oauth/Login" \
  10 + -H "Content-Type: application/x-www-form-urlencoded" \
  11 + -d "account=admin&password=e10adc3949ba59abbe56e057f20f883e" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('data',{}).get('token','') if d.get('code')==200 else '')" 2>/dev/null)
  12 +if [ -z "$TOKEN" ]; then
  13 + echo "获取 Token 失败,请检查 API 是否启动"
  14 + exit 1
  15 +fi
  16 +echo "Token 获取成功"
  17 +
  18 +echo ""
  19 +echo "=== 2. Create 消耗单(健康师12+科技部40=52,系数0.5)==="
  20 +echo "预期:F_OvertimeSgfy=6, sgfy=58"
  21 +CREATE_BODY='{"hy":"742276000326354181","md":"1649328471923847174","mdbh":"001","mdmc":"绿纤优品道店","hyzh":"17882541236","hymc":"咕噜","xfje":100,"sgfy":52,"hksj":"2026-03-16T10:00:00","overtimeCoefficient":0.5,"lqXhPxmxList":[{"px":"1","pxmc":"活动陪同","pxjg":100,"projectNumber":1,"sourceType":"耗卡","lqXhJksyjList":[{"jks":"13032810387","jksxm":"范时依","jkszh":"13032810387","jksyj":50,"laborCost":12,"kdpxNumber":1}],"lqXhKjbsyjList":[{"kjbls":"13110190690","kjblsxm":"刘雨佳","kjblszh":"13110190690","kjblsyj":50,"laborCost":40,"hdpxNumber":1}]}]}'
  22 +curl -s -X POST "$BASE_URL/api/Extend/LqXhHyhk" -H "Authorization: $TOKEN" -H "Content-Type: application/json" -d "$CREATE_BODY" | python3 -m json.tool 2>/dev/null || echo "请求失败"
  23 +
  24 +echo ""
  25 +echo "=== 3. 创建后需查库验证主表 F_OvertimeSgfy、sgfy ==="
  26 +echo "SQL: SELECT F_Id, sgfy, F_OriginalSgfy, F_OvertimeSgfy FROM lq_xh_hyhk WHERE hy='742276000326354181' ORDER BY F_CreateTime DESC LIMIT 1"
  27 +
  28 +echo ""
  29 +echo "=== 4. Update 消耗单(需替换 {id} 为实际耗卡ID,body 必须包含 id 字段)==="
  30 +echo "curl -X PUT \"$BASE_URL/api/Extend/LqXhHyhk/{id}\" -H \"Authorization: \$TOKEN\" -H \"Content-Type: application/json\" -d '{\"id\":\"{id}\",\"hy\":\"742276000326354181\",\"md\":\"1649328471923847174\",\"sgfy\":52,\"overtimeCoefficient\":0.5,\"lqXhPxmxList\":[...]}'"
  31 +
  32 +echo ""
  33 +echo "=== 5. UpdateOvertimeCoefficient(需替换 {id} 为实际耗卡ID)==="
  34 +echo "curl -X PUT \"$BASE_URL/api/Extend/LqXhHyhk/{id}/overtime-coefficient\" -H \"Authorization: \$TOKEN\" -H \"Content-Type: application/json\" -d '{\"overtimeCoefficient\":1.0}'"
... ...