Commit 0b87d248b185391a1875e29f9f2fad51f0fa36f7
1 parent
66be4819
Enhance LqEventService to improve store data retrieval with aggregated target an…
…d completion statistics. Introduce new LqStatisticsService methods for saving and querying technology department performance statistics. Update LqTkjlbService to associate member information with store IDs. Refactor LqKdKdjlbStringGenerator for cleaner output formatting.
Showing
7 changed files
with
511 additions
and
24 deletions
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqStatisticsTechPerformance/LqStatisticsTechPerformanceListOutput.cs
0 → 100644
| 1 | +using System; | |
| 2 | + | |
| 3 | +namespace NCC.Extend.Entitys.Dto.LqStatisticsTechPerformance | |
| 4 | +{ | |
| 5 | + /// <summary> | |
| 6 | + /// 科技部开单业绩统计列表输出 | |
| 7 | + /// </summary> | |
| 8 | + public class LqStatisticsTechPerformanceListOutput | |
| 9 | + { | |
| 10 | + /// <summary> | |
| 11 | + /// 主键ID | |
| 12 | + /// </summary> | |
| 13 | + public string Id { get; set; } | |
| 14 | + | |
| 15 | + /// <summary> | |
| 16 | + /// 统计月份(YYYYMM) | |
| 17 | + /// </summary> | |
| 18 | + public string StatisticsMonth { get; set; } | |
| 19 | + | |
| 20 | + /// <summary> | |
| 21 | + /// 科技部老师ID | |
| 22 | + /// </summary> | |
| 23 | + public string TeacherId { get; set; } | |
| 24 | + | |
| 25 | + /// <summary> | |
| 26 | + /// 科技部老师姓名 | |
| 27 | + /// </summary> | |
| 28 | + public string TeacherName { get; set; } | |
| 29 | + | |
| 30 | + /// <summary> | |
| 31 | + /// 科技部老师账号 | |
| 32 | + /// </summary> | |
| 33 | + public string TeacherAccount { get; set; } | |
| 34 | + | |
| 35 | + /// <summary> | |
| 36 | + /// 门店ID | |
| 37 | + /// </summary> | |
| 38 | + public string StoreId { get; set; } | |
| 39 | + | |
| 40 | + /// <summary> | |
| 41 | + /// 门店名称 | |
| 42 | + /// </summary> | |
| 43 | + public string StoreName { get; set; } | |
| 44 | + | |
| 45 | + /// <summary> | |
| 46 | + /// 订单数量 | |
| 47 | + /// </summary> | |
| 48 | + public int OrderCount { get; set; } | |
| 49 | + | |
| 50 | + /// <summary> | |
| 51 | + /// 总业绩金额 | |
| 52 | + /// </summary> | |
| 53 | + public decimal TotalPerformance { get; set; } | |
| 54 | + | |
| 55 | + /// <summary> | |
| 56 | + /// 人工成本 | |
| 57 | + /// </summary> | |
| 58 | + public decimal LaborCost { get; set; } | |
| 59 | + | |
| 60 | + /// <summary> | |
| 61 | + /// 项目次数 | |
| 62 | + /// </summary> | |
| 63 | + public decimal ProjectCount { get; set; } | |
| 64 | + | |
| 65 | + /// <summary> | |
| 66 | + /// 最后订单日期 | |
| 67 | + /// </summary> | |
| 68 | + public DateTime? LastOrderDate { get; set; } | |
| 69 | + | |
| 70 | + /// <summary> | |
| 71 | + /// 首次订单日期 | |
| 72 | + /// </summary> | |
| 73 | + public DateTime? FirstOrderDate { get; set; } | |
| 74 | + | |
| 75 | + /// <summary> | |
| 76 | + /// 创建时间 | |
| 77 | + /// </summary> | |
| 78 | + public DateTime CreateTime { get; set; } | |
| 79 | + } | |
| 80 | +} | ... | ... |
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqStatisticsTechPerformance/LqStatisticsTechPerformanceListQueryInput.cs
0 → 100644
| 1 | +using NCC.Common.Filter; | |
| 2 | + | |
| 3 | +namespace NCC.Extend.Entitys.Dto.LqStatisticsTechPerformance | |
| 4 | +{ | |
| 5 | + /// <summary> | |
| 6 | + /// 科技部开单业绩统计列表查询输入 | |
| 7 | + /// </summary> | |
| 8 | + public class LqStatisticsTechPerformanceListQueryInput : PageInputBase | |
| 9 | + { | |
| 10 | + /// <summary> | |
| 11 | + /// 统计月份(YYYYMM) | |
| 12 | + /// </summary> | |
| 13 | + public string StatisticsMonth { get; set; } | |
| 14 | + | |
| 15 | + /// <summary> | |
| 16 | + /// 科技部老师ID | |
| 17 | + /// </summary> | |
| 18 | + public string TeacherId { get; set; } | |
| 19 | + | |
| 20 | + /// <summary> | |
| 21 | + /// 科技部老师姓名 | |
| 22 | + /// </summary> | |
| 23 | + public string TeacherName { get; set; } | |
| 24 | + | |
| 25 | + /// <summary> | |
| 26 | + /// 门店ID | |
| 27 | + /// </summary> | |
| 28 | + public string StoreId { get; set; } | |
| 29 | + | |
| 30 | + /// <summary> | |
| 31 | + /// 门店名称 | |
| 32 | + /// </summary> | |
| 33 | + public string StoreName { get; set; } | |
| 34 | + } | |
| 35 | +} | ... | ... |
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_statistics_tech_performance/LqStatisticsTechPerformanceEntity.cs
0 → 100644
| 1 | +using System; | |
| 2 | +using System.ComponentModel.DataAnnotations; | |
| 3 | +using System.ComponentModel.DataAnnotations.Schema; | |
| 4 | +using SqlSugar; | |
| 5 | + | |
| 6 | +namespace NCC.Extend.Entitys.lq_statistics_tech_performance | |
| 7 | +{ | |
| 8 | + /// <summary> | |
| 9 | + /// 科技部开单业绩统计数据表 | |
| 10 | + /// </summary> | |
| 11 | + [SugarTable("lq_statistics_tech_performance")] | |
| 12 | + public class LqStatisticsTechPerformanceEntity | |
| 13 | + { | |
| 14 | + /// <summary> | |
| 15 | + /// 主键ID | |
| 16 | + /// </summary> | |
| 17 | + [SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true, Length = 50)] | |
| 18 | + | |
| 19 | + public string Id { get; set; } | |
| 20 | + | |
| 21 | + /// <summary> | |
| 22 | + /// 统计月份(YYYYMM) | |
| 23 | + /// </summary> | |
| 24 | + [Required] | |
| 25 | + [StringLength(6)] | |
| 26 | + [SugarColumn(ColumnName = "F_StatisticsMonth", Length = 6, IsNullable = false)] | |
| 27 | + public string StatisticsMonth { get; set; } | |
| 28 | + | |
| 29 | + /// <summary> | |
| 30 | + /// 科技部老师ID | |
| 31 | + /// </summary> | |
| 32 | + [Required] | |
| 33 | + [StringLength(50)] | |
| 34 | + [SugarColumn(ColumnName = "F_TeacherId", Length = 50, IsNullable = false)] | |
| 35 | + public string TeacherId { get; set; } | |
| 36 | + | |
| 37 | + /// <summary> | |
| 38 | + /// 科技部老师姓名 | |
| 39 | + /// </summary> | |
| 40 | + [Required] | |
| 41 | + [StringLength(100)] | |
| 42 | + [SugarColumn(ColumnName = "F_TeacherName", Length = 100, IsNullable = false)] | |
| 43 | + public string TeacherName { get; set; } | |
| 44 | + | |
| 45 | + /// <summary> | |
| 46 | + /// 科技部老师账号 | |
| 47 | + /// </summary> | |
| 48 | + [StringLength(100)] | |
| 49 | + [SugarColumn(ColumnName = "F_TeacherAccount", Length = 100, IsNullable = true)] | |
| 50 | + public string TeacherAccount { get; set; } | |
| 51 | + | |
| 52 | + /// <summary> | |
| 53 | + /// 门店ID | |
| 54 | + /// </summary> | |
| 55 | + [StringLength(50)] | |
| 56 | + [SugarColumn(ColumnName = "F_StoreId", Length = 50, IsNullable = true)] | |
| 57 | + public string StoreId { get; set; } | |
| 58 | + | |
| 59 | + /// <summary> | |
| 60 | + /// 门店名称 | |
| 61 | + /// </summary> | |
| 62 | + [StringLength(100)] | |
| 63 | + [SugarColumn(ColumnName = "F_StoreName", Length = 100, IsNullable = true)] | |
| 64 | + public string StoreName { get; set; } | |
| 65 | + | |
| 66 | + /// <summary> | |
| 67 | + /// 订单数量 | |
| 68 | + /// </summary> | |
| 69 | + [SugarColumn(ColumnName = "F_OrderCount", IsNullable = false)] | |
| 70 | + public int OrderCount { get; set; } = 0; | |
| 71 | + | |
| 72 | + /// <summary> | |
| 73 | + /// 总业绩金额 | |
| 74 | + /// </summary> | |
| 75 | + [SugarColumn(ColumnName = "F_TotalPerformance", DecimalDigits = 2, IsNullable = false)] | |
| 76 | + public decimal TotalPerformance { get; set; } = 0.00m; | |
| 77 | + | |
| 78 | + /// <summary> | |
| 79 | + /// 人工成本 | |
| 80 | + /// </summary> | |
| 81 | + [SugarColumn(ColumnName = "F_LaborCost", DecimalDigits = 2, IsNullable = false)] | |
| 82 | + public decimal LaborCost { get; set; } = 0.00m; | |
| 83 | + | |
| 84 | + /// <summary> | |
| 85 | + /// 项目次数 | |
| 86 | + /// </summary> | |
| 87 | + [SugarColumn(ColumnName = "F_ProjectCount", DecimalDigits = 2, IsNullable = false)] | |
| 88 | + public decimal ProjectCount { get; set; } = 0.00m; | |
| 89 | + | |
| 90 | + /// <summary> | |
| 91 | + /// 最后订单日期 | |
| 92 | + /// </summary> | |
| 93 | + [SugarColumn(ColumnName = "F_LastOrderDate", IsNullable = true)] | |
| 94 | + public DateTime? LastOrderDate { get; set; } | |
| 95 | + | |
| 96 | + /// <summary> | |
| 97 | + /// 首次订单日期 | |
| 98 | + /// </summary> | |
| 99 | + [SugarColumn(ColumnName = "F_FirstOrderDate", IsNullable = true)] | |
| 100 | + public DateTime? FirstOrderDate { get; set; } | |
| 101 | + | |
| 102 | + /// <summary> | |
| 103 | + /// 创建时间 | |
| 104 | + /// </summary> | |
| 105 | + [SugarColumn(ColumnName = "F_CreateTime", IsNullable = false)] | |
| 106 | + public DateTime CreateTime { get; set; } = DateTime.Now; | |
| 107 | + } | |
| 108 | +} | ... | ... |
netcore/src/Modularity/Extend/NCC.Extend/LqEventService.cs
| ... | ... | @@ -729,25 +729,49 @@ namespace NCC.Extend.LqEvent |
| 729 | 729 | |
| 730 | 730 | try |
| 731 | 731 | { |
| 732 | - // 使用多表查询获取门店统计数据 | |
| 733 | - var storeData = await _db.Queryable<LqEventUserEntity, LqMdxxEntity, LqTkjlbEntity>( | |
| 732 | + // 第一步:获取门店的目标数据(所有参与活动的用户目标总和) | |
| 733 | + var storeTargets = await _db.Queryable<LqEventUserEntity, LqMdxxEntity>( | |
| 734 | + (eventUser, store) => eventUser.EventId == eventId && eventUser.StoreId == store.Id | |
| 735 | + ) | |
| 736 | + .GroupBy((eventUser, store) => new { StoreId = store.Id, StoreName = store.Dm }) | |
| 737 | + .Select( | |
| 738 | + (eventUser, store) => | |
| 739 | + new | |
| 740 | + { | |
| 741 | + StoreId = store.Id, | |
| 742 | + StoreName = store.Dm, | |
| 743 | + TotalTarget = SqlFunc.AggregateSum(eventUser.EventTarget) | |
| 744 | + } | |
| 745 | + ) | |
| 746 | + .ToListAsync(); | |
| 747 | + | |
| 748 | + // 第二步:获取门店的完成数据(拓客记录数量) | |
| 749 | + var storeCompletions = await _db.Queryable<LqEventUserEntity, LqMdxxEntity, LqTkjlbEntity>( | |
| 734 | 750 | (eventUser, store, tkjlb) => eventUser.EventId == eventId && eventUser.StoreId == store.Id && eventUser.UserId == tkjlb.ExpansionUserId && tkjlb.EventId == eventId |
| 735 | 751 | ) |
| 736 | 752 | .GroupBy((eventUser, store, tkjlb) => new { StoreId = store.Id, StoreName = store.Dm }) |
| 737 | 753 | .Select( |
| 738 | 754 | (eventUser, store, tkjlb) => |
| 739 | - new StoreDataOutput | |
| 755 | + new | |
| 740 | 756 | { |
| 741 | 757 | StoreId = store.Id, |
| 742 | 758 | StoreName = store.Dm, |
| 743 | - TotalTarget = SqlFunc.AggregateSum(eventUser.EventTarget), | |
| 744 | - CompletedTarget = SqlFunc.AggregateCount(tkjlb.Id), | |
| 745 | - CompletionRate = 0, // 将在内存中计算 | |
| 746 | - Ranking = 0, // 将在内存中计算 | |
| 759 | + CompletedTarget = SqlFunc.AggregateCount(tkjlb.Id) | |
| 747 | 760 | } |
| 748 | 761 | ) |
| 749 | 762 | .ToListAsync(); |
| 750 | 763 | |
| 764 | + // 第三步:合并数据 | |
| 765 | + var storeData = storeTargets.Select(target => new StoreDataOutput | |
| 766 | + { | |
| 767 | + StoreId = target.StoreId, | |
| 768 | + StoreName = target.StoreName, | |
| 769 | + TotalTarget = target.TotalTarget, | |
| 770 | + CompletedTarget = storeCompletions.FirstOrDefault(c => c.StoreId == target.StoreId)?.CompletedTarget ?? 0, | |
| 771 | + CompletionRate = 0, // 将在内存中计算 | |
| 772 | + Ranking = 0, // 将在内存中计算 | |
| 773 | + }).ToList(); | |
| 774 | + | |
| 751 | 775 | // 计算完成率和排名 |
| 752 | 776 | foreach (var store in storeData) |
| 753 | 777 | { | ... | ... |
netcore/src/Modularity/Extend/NCC.Extend/LqStatisticsService.cs
| ... | ... | @@ -13,6 +13,7 @@ using NCC.Dependency; |
| 13 | 13 | using NCC.DynamicApiController; |
| 14 | 14 | using NCC.Extend.Entitys.Dto.LqMdxx; |
| 15 | 15 | using NCC.Extend.Entitys.Dto.LqStatistics; |
| 16 | +using NCC.Extend.Entitys.Dto.LqStatisticsTechPerformance; | |
| 16 | 17 | using NCC.Extend.Entitys.Dto.LqYcsdJsj; |
| 17 | 18 | using NCC.Extend.Entitys.lq_hytk_kjbsyj; |
| 18 | 19 | using NCC.Extend.Entitys.lq_jinsanjiao_user; |
| ... | ... | @@ -25,6 +26,7 @@ using NCC.Extend.Entitys.lq_ycsd_jsj; |
| 25 | 26 | using NCC.Extend.Entitys.lq_yjmxb; |
| 26 | 27 | using NCC.Extend.Entitys.lq_statistics_gold_triangle; |
| 27 | 28 | using NCC.Extend.Entitys.lq_statistics_personal_performance; |
| 29 | +using NCC.Extend.Entitys.lq_statistics_tech_performance; | |
| 28 | 30 | using NCC.Extend.Entitys.lq_xmzl; |
| 29 | 31 | using NCC.Extend.Entitys.Dto.LqStatisticsPersonalPerformance; |
| 30 | 32 | using NCC.Extend.Entitys.v_tech_teacher_flow; |
| ... | ... | @@ -1190,7 +1192,7 @@ namespace NCC.Extend.LqStatistics |
| 1190 | 1192 | #region 金三角统计数据保存 |
| 1191 | 1193 | |
| 1192 | 1194 | /// <summary> |
| 1193 | - /// 1、保存金三角开卡业绩统计数据 | |
| 1195 | + /// 【1】保存金三角开卡业绩统计数据 | |
| 1194 | 1196 | /// </summary> |
| 1195 | 1197 | /// <remarks> |
| 1196 | 1198 | /// 根据金三角设定和开单记录统计金三角的业绩数据 |
| ... | ... | @@ -1366,7 +1368,7 @@ namespace NCC.Extend.LqStatistics |
| 1366 | 1368 | #region 个人开单业绩统计 |
| 1367 | 1369 | |
| 1368 | 1370 | /// <summary> |
| 1369 | - /// 保存个人开单业绩统计数据 | |
| 1371 | + /// 【2】保存健康师个人开单业绩统计数据 | |
| 1370 | 1372 | /// </summary> |
| 1371 | 1373 | /// <remarks> |
| 1372 | 1374 | /// 根据开单记录统计个人的业绩数据,包括基础业绩和合作业绩 |
| ... | ... | @@ -1654,5 +1656,242 @@ namespace NCC.Extend.LqStatistics |
| 1654 | 1656 | /// </summary> |
| 1655 | 1657 | public string ParentId { get; set; } |
| 1656 | 1658 | } |
| 1659 | + | |
| 1660 | + #region 科技部开单业绩统计 | |
| 1661 | + | |
| 1662 | + /// <summary> | |
| 1663 | + /// 【3】保存科技部开单业绩统计数据 | |
| 1664 | + /// </summary> | |
| 1665 | + /// <remarks> | |
| 1666 | + /// 根据指定月份统计科技部老师的开单业绩数据,只统计开卡业绩,不包含耗卡和退卡业绩 | |
| 1667 | + /// | |
| 1668 | + /// 示例请求: | |
| 1669 | + /// ```json | |
| 1670 | + /// POST /api/Extend/LqStatistics/save-tech-performance-statistics | |
| 1671 | + /// { | |
| 1672 | + /// "statisticsMonth": "202401" | |
| 1673 | + /// } | |
| 1674 | + /// ``` | |
| 1675 | + /// | |
| 1676 | + /// 参数说明: | |
| 1677 | + /// - statisticsMonth: 统计月份,格式为YYYYMM | |
| 1678 | + /// </remarks> | |
| 1679 | + /// <param name="statisticsMonth">统计月份(YYYYMM格式)</param> | |
| 1680 | + /// <returns>保存结果</returns> | |
| 1681 | + /// <response code="200">成功保存统计数据</response> | |
| 1682 | + /// <response code="400">参数错误</response> | |
| 1683 | + /// <response code="500">服务器内部错误</response> | |
| 1684 | + [HttpPost("save-tech-performance-statistics")] | |
| 1685 | + public async Task<dynamic> SaveTechPerformanceStatistics(string statisticsMonth) | |
| 1686 | + { | |
| 1687 | + if (string.IsNullOrEmpty(statisticsMonth) || statisticsMonth.Length != 6) | |
| 1688 | + { | |
| 1689 | + throw NCCException.Oh("统计月份格式错误,请使用YYYYMM格式"); | |
| 1690 | + } | |
| 1691 | + | |
| 1692 | + try | |
| 1693 | + { | |
| 1694 | + // 使用数据库聚合方式,只统计开单业绩(开卡流水) | |
| 1695 | + var sql = @" | |
| 1696 | + SELECT | |
| 1697 | + k.kjbls AS TeacherId, | |
| 1698 | + k.kjblsxm AS TeacherName, | |
| 1699 | + k.kjblszh AS TeacherAccount, | |
| 1700 | + NULL AS StoreId, | |
| 1701 | + NULL AS StoreName, | |
| 1702 | + COUNT(DISTINCT k.F_kdpxid) AS OrderCount, | |
| 1703 | + SUM(CAST(COALESCE(k.kjblsyj, 0) AS DECIMAL(18,2))) AS TotalPerformance, | |
| 1704 | + SUM(CAST(COALESCE(k.F_LaborCost, 0) AS DECIMAL(18,2))) AS LaborCost, | |
| 1705 | + SUM(CAST(COALESCE(pm.F_ProjectNumber, 0) AS DECIMAL(18,2))) AS ProjectCount, | |
| 1706 | + MAX(k.yjsj) AS LastOrderDate, | |
| 1707 | + MIN(k.yjsj) AS FirstOrderDate | |
| 1708 | + FROM lq_kd_kjbsyj k | |
| 1709 | + LEFT JOIN lq_kd_pxmx pm ON k.F_kdpxid = pm.F_Id | |
| 1710 | + WHERE k.kjbls IS NOT NULL | |
| 1711 | + AND k.kjblsxm IS NOT NULL | |
| 1712 | + AND k.yjsj IS NOT NULL | |
| 1713 | + AND k.kjblsyj IS NOT NULL | |
| 1714 | + AND k.kjblsyj != '' | |
| 1715 | + AND k.kjblsyj != '0' | |
| 1716 | + AND YEAR(k.yjsj) = @year | |
| 1717 | + AND MONTH(k.yjsj) = @month | |
| 1718 | + GROUP BY | |
| 1719 | + k.kjbls, | |
| 1720 | + k.kjblsxm, | |
| 1721 | + k.kjblszh | |
| 1722 | + ORDER BY TotalPerformance DESC"; | |
| 1723 | + | |
| 1724 | + // 解析统计月份 | |
| 1725 | + var year = int.Parse(statisticsMonth.Substring(0, 4)); | |
| 1726 | + var month = int.Parse(statisticsMonth.Substring(4, 2)); | |
| 1727 | + | |
| 1728 | + // 执行SQL查询 | |
| 1729 | + var statisticsData = await _db.Ado.SqlQueryAsync<dynamic>(sql, new { year, month }); | |
| 1730 | + | |
| 1731 | + _logger.LogInformation($"SQL查询结果数量: {statisticsData?.Count ?? 0}"); | |
| 1732 | + if (statisticsData?.Any() == true) | |
| 1733 | + { | |
| 1734 | + var firstData = statisticsData.First(); | |
| 1735 | + _logger.LogInformation($"第一条数据: TeacherId={firstData.TeacherId}, TeacherName={firstData.TeacherName}, TotalPerformance={firstData.TotalPerformance}"); | |
| 1736 | + } | |
| 1737 | + | |
| 1738 | + if (!statisticsData.Any()) | |
| 1739 | + { | |
| 1740 | + return new | |
| 1741 | + { | |
| 1742 | + Success = true, | |
| 1743 | + Message = $"未找到 {statisticsMonth} 月份的科技部开单业绩统计数据", | |
| 1744 | + SavedCount = 0 | |
| 1745 | + }; | |
| 1746 | + } | |
| 1747 | + | |
| 1748 | + // 转换为实体对象 | |
| 1749 | + var entities = new List<LqStatisticsTechPerformanceEntity>(); | |
| 1750 | + foreach (var data in statisticsData) | |
| 1751 | + { | |
| 1752 | + try | |
| 1753 | + { | |
| 1754 | + var entity = new LqStatisticsTechPerformanceEntity | |
| 1755 | + { | |
| 1756 | + Id = YitIdHelper.NextId().ToString(), | |
| 1757 | + StatisticsMonth = statisticsMonth, | |
| 1758 | + TeacherId = data.TeacherId?.ToString() ?? "", | |
| 1759 | + TeacherName = data.TeacherName?.ToString() ?? "", | |
| 1760 | + TeacherAccount = data.TeacherAccount?.ToString() ?? "", | |
| 1761 | + StoreId = data.StoreId?.ToString() ?? "", | |
| 1762 | + StoreName = data.StoreName?.ToString() ?? "", | |
| 1763 | + OrderCount = Convert.ToInt32(data.OrderCount ?? 0), | |
| 1764 | + TotalPerformance = Convert.ToDecimal(data.TotalPerformance ?? 0), | |
| 1765 | + LaborCost = Convert.ToDecimal(data.LaborCost ?? 0), | |
| 1766 | + ProjectCount = Convert.ToDecimal(data.ProjectCount ?? 0), | |
| 1767 | + LastOrderDate = data.LastOrderDate as DateTime?, | |
| 1768 | + FirstOrderDate = data.FirstOrderDate as DateTime?, | |
| 1769 | + CreateTime = DateTime.Now | |
| 1770 | + }; | |
| 1771 | + entities.Add(entity); | |
| 1772 | + _logger.LogInformation($"成功转换实体: TeacherId={entity.TeacherId}, TotalPerformance={entity.TotalPerformance}"); | |
| 1773 | + } | |
| 1774 | + catch (Exception ex) | |
| 1775 | + { | |
| 1776 | + _logger.LogError($"转换实体失败: TeacherId={data.TeacherId}, Error={ex.Message}"); | |
| 1777 | + } | |
| 1778 | + } | |
| 1779 | + | |
| 1780 | + _logger.LogInformation($"准备插入 {entities.Count} 条实体数据"); | |
| 1781 | + | |
| 1782 | + // 使用事务确保数据一致性 | |
| 1783 | + var result = await _db.Ado.UseTranAsync(async () => | |
| 1784 | + { | |
| 1785 | + try | |
| 1786 | + { | |
| 1787 | + // 先删除该月份的历史数据 | |
| 1788 | + var deleteResult = await _db.Deleteable<LqStatisticsTechPerformanceEntity>() | |
| 1789 | + .Where(x => x.StatisticsMonth == statisticsMonth) | |
| 1790 | + .ExecuteCommandAsync(); | |
| 1791 | + _logger.LogInformation($"删除历史数据结果: {deleteResult}"); | |
| 1792 | + | |
| 1793 | + // 批量插入新数据 | |
| 1794 | + var insertResult = await _db.Insertable(entities).ExecuteCommandAsync(); | |
| 1795 | + _logger.LogInformation($"插入新数据结果: {insertResult}"); | |
| 1796 | + return insertResult; | |
| 1797 | + } | |
| 1798 | + catch (Exception ex) | |
| 1799 | + { | |
| 1800 | + _logger.LogError($"事务执行失败: {ex.Message}"); | |
| 1801 | + throw; | |
| 1802 | + } | |
| 1803 | + }); | |
| 1804 | + | |
| 1805 | + _logger.LogInformation($"事务执行结果: IsSuccess={result.IsSuccess}, Data={result.Data}, ErrorMessage={result.ErrorMessage}"); | |
| 1806 | + var savedCount = result.IsSuccess ? result.Data : 0; | |
| 1807 | + _logger.LogInformation($"成功保存科技部开单业绩统计数据 - 月份: {statisticsMonth}, 记录数: {savedCount}"); | |
| 1808 | + | |
| 1809 | + return new | |
| 1810 | + { | |
| 1811 | + Success = true, | |
| 1812 | + Message = $"成功保存 {savedCount} 条科技部开单业绩统计数据", | |
| 1813 | + SavedCount = savedCount, | |
| 1814 | + StatisticsMonth = statisticsMonth | |
| 1815 | + }; | |
| 1816 | + } | |
| 1817 | + catch (Exception ex) | |
| 1818 | + { | |
| 1819 | + _logger.LogError(ex, $"保存科技部开单业绩统计数据失败 - 月份: {statisticsMonth}"); | |
| 1820 | + throw NCCException.Oh($"保存科技部开单业绩统计数据失败: {ex.Message}"); | |
| 1821 | + } | |
| 1822 | + } | |
| 1823 | + | |
| 1824 | + /// <summary> | |
| 1825 | + /// 获取科技部开单业绩统计数据 | |
| 1826 | + /// </summary> | |
| 1827 | + /// <remarks> | |
| 1828 | + /// 分页查询科技部开单业绩统计数据 | |
| 1829 | + /// | |
| 1830 | + /// 示例请求: | |
| 1831 | + /// ```json | |
| 1832 | + /// GET /api/Extend/LqStatistics/get-tech-performance-statistics?PageIndex=1&PageSize=10&StatisticsMonth=202401 | |
| 1833 | + /// ``` | |
| 1834 | + /// </remarks> | |
| 1835 | + /// <param name="input">查询参数</param> | |
| 1836 | + /// <returns>分页数据</returns> | |
| 1837 | + /// <response code="200">查询成功</response> | |
| 1838 | + /// <response code="400">参数错误</response> | |
| 1839 | + /// <response code="500">服务器内部错误</response> | |
| 1840 | + [HttpGet("get-tech-performance-statistics")] | |
| 1841 | + public async Task<dynamic> GetTechPerformanceStatistics([FromQuery] LqStatisticsTechPerformanceListQueryInput input) | |
| 1842 | + { | |
| 1843 | + try | |
| 1844 | + { | |
| 1845 | + var query = _db.Queryable<LqStatisticsTechPerformanceEntity>(); | |
| 1846 | + | |
| 1847 | + // 添加查询条件 | |
| 1848 | + query = query.WhereIF(!string.IsNullOrEmpty(input.StatisticsMonth), x => x.StatisticsMonth == input.StatisticsMonth); | |
| 1849 | + query = query.WhereIF(!string.IsNullOrEmpty(input.TeacherId), x => x.TeacherId == input.TeacherId); | |
| 1850 | + query = query.WhereIF(!string.IsNullOrEmpty(input.TeacherName), x => x.TeacherName.Contains(input.TeacherName)); | |
| 1851 | + query = query.WhereIF(!string.IsNullOrEmpty(input.StoreId), x => x.StoreId == input.StoreId); | |
| 1852 | + query = query.WhereIF(!string.IsNullOrEmpty(input.StoreName), x => x.StoreName.Contains(input.StoreName)); | |
| 1853 | + | |
| 1854 | + // 按业绩降序排序 | |
| 1855 | + query = query.OrderBy(x => x.TotalPerformance, OrderByType.Desc); | |
| 1856 | + | |
| 1857 | + // 分页查询 | |
| 1858 | + var result = await query.ToPagedListAsync(input.currentPage, input.pageSize); | |
| 1859 | + | |
| 1860 | + return new | |
| 1861 | + { | |
| 1862 | + Success = true, | |
| 1863 | + Data = new | |
| 1864 | + { | |
| 1865 | + Records = result.list.Select(x => new LqStatisticsTechPerformanceListOutput | |
| 1866 | + { | |
| 1867 | + Id = x.Id, | |
| 1868 | + StatisticsMonth = x.StatisticsMonth, | |
| 1869 | + TeacherId = x.TeacherId, | |
| 1870 | + TeacherName = x.TeacherName, | |
| 1871 | + TeacherAccount = x.TeacherAccount, | |
| 1872 | + StoreId = x.StoreId, | |
| 1873 | + StoreName = x.StoreName, | |
| 1874 | + OrderCount = x.OrderCount, | |
| 1875 | + TotalPerformance = x.TotalPerformance, | |
| 1876 | + LaborCost = x.LaborCost, | |
| 1877 | + ProjectCount = x.ProjectCount, | |
| 1878 | + LastOrderDate = x.LastOrderDate, | |
| 1879 | + FirstOrderDate = x.FirstOrderDate, | |
| 1880 | + CreateTime = x.CreateTime | |
| 1881 | + }).ToList(), | |
| 1882 | + Total = result.pagination.Total, | |
| 1883 | + PageIndex = input.currentPage, | |
| 1884 | + PageSize = input.pageSize | |
| 1885 | + } | |
| 1886 | + }; | |
| 1887 | + } | |
| 1888 | + catch (Exception ex) | |
| 1889 | + { | |
| 1890 | + _logger.LogError(ex, "查询科技部开单业绩统计数据失败"); | |
| 1891 | + throw NCCException.Oh($"查询科技部开单业绩统计数据失败: {ex.Message}"); | |
| 1892 | + } | |
| 1893 | + } | |
| 1894 | + | |
| 1895 | + #endregion | |
| 1657 | 1896 | } |
| 1658 | 1897 | } | ... | ... |
netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs
| ... | ... | @@ -182,6 +182,7 @@ namespace NCC.Extend.LqTkjlb |
| 182 | 182 | MemberInfo.Sjh = input.customerPhone; // 设置手机号 |
| 183 | 183 | MemberInfo.Khlx = "线索"; |
| 184 | 184 | MemberInfo.Dah = "GK" + DateTime.Now.ToString("yyyyMMddHHmmss"); |
| 185 | + MemberInfo.Gsmd = eventUserInfo.StoreId; | |
| 185 | 186 | var memberResult = await _db.Insertable(MemberInfo).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync(); |
| 186 | 187 | if (!(memberResult > 0)) |
| 187 | 188 | { | ... | ... |
netcore/src/Modularity/Extend/NCC.Extend/Utils/LqKdKdjlbStringGenerator.cs
| ... | ... | @@ -47,35 +47,35 @@ namespace NCC.Extend.Utils |
| 47 | 47 | // 健康师:王维 |
| 48 | 48 | var healthTeachers = GetHealthTeachers(entity.lqKdJksyjList); |
| 49 | 49 | sb.AppendLine($"⏩健康师:{healthTeachers}"); |
| 50 | - | |
| 50 | + | |
| 51 | 51 | // 活动方案:532工程 |
| 52 | 52 | sb.AppendLine($"⏩活动方案:{entity.pxxx ?? "无"}"); |
| 53 | - | |
| 53 | + | |
| 54 | 54 | // 跟单配合:王经理 竹主任 陈思思老师 |
| 55 | 55 | var techTeachers = GetTechTeachers(entity.lqKdKjbsyjList); |
| 56 | 56 | sb.AppendLine($"⏩跟单配合:{techTeachers}"); |
| 57 | - | |
| 57 | + | |
| 58 | 58 | // 业绩:4800 |
| 59 | 59 | sb.AppendLine($"⏩业绩:{entity.zdyj}"); |
| 60 | - | |
| 60 | + | |
| 61 | 61 | // 实付:4800 |
| 62 | 62 | sb.AppendLine($"⏩实付:{entity.sfyj}"); |
| 63 | - | |
| 63 | + | |
| 64 | 64 | // 欠款: |
| 65 | 65 | sb.AppendLine($"⏩欠款: {entity.qk}"); |
| 66 | - | |
| 66 | + | |
| 67 | 67 | // 抵扣: |
| 68 | 68 | sb.AppendLine($"⏩抵扣:{entity.ckmx ?? "无"}"); |
| 69 | - | |
| 69 | + | |
| 70 | 70 | // 来源:售后 |
| 71 | 71 | sb.AppendLine($"⏩来源:{entity.khly ?? "无"}"); |
| 72 | - | |
| 72 | + | |
| 73 | 73 | // 是否属于升单: |
| 74 | 74 | sb.AppendLine($"⏩是否属于升单:{entity.sfskdd ?? "无"}"); |
| 75 | - | |
| 75 | + | |
| 76 | 76 | // 简介:高姐是我们的老客,今天邀约到犀浦店做532,维维全程陪同,陈思思老师在操作过程中给姐姐分享企业文化,找到顾客需求、邀请王经理 竹主任 给到顾客福利、顾客爽快成交,私密档案已了解到70%,感谢顾客的信任与支持 ,王经理 竹主任 陈老师辛苦了[玫瑰]维维真棒[强]龙城国际店加油!我们还在努力中!家人们给我们打气加油👏👏👏👏等待我们的捷报👍👍 |
| 77 | 77 | sb.AppendLine($"⏩简介:{entity.jj ?? "无"}"); |
| 78 | - | |
| 78 | + | |
| 79 | 79 | return sb.ToString(); |
| 80 | 80 | } |
| 81 | 81 | |
| ... | ... | @@ -94,9 +94,9 @@ namespace NCC.Extend.Utils |
| 94 | 94 | try |
| 95 | 95 | { |
| 96 | 96 | var store = _db.Queryable<LqMdxxEntity>() |
| 97 | - .Where(x => x.Mdbm == storeCode) | |
| 97 | + .Where(x => x.Id == storeCode) | |
| 98 | 98 | .First(); |
| 99 | - | |
| 99 | + | |
| 100 | 100 | return store?.Dm ?? storeCode; |
| 101 | 101 | } |
| 102 | 102 | catch |
| ... | ... | @@ -122,7 +122,7 @@ namespace NCC.Extend.Utils |
| 122 | 122 | var department = _db.Queryable<LqYcsdJsjEntity>() |
| 123 | 123 | .Where(x => x.Id == departmentCode) |
| 124 | 124 | .First(); |
| 125 | - | |
| 125 | + | |
| 126 | 126 | return department?.Jsj ?? departmentCode; |
| 127 | 127 | } |
| 128 | 128 | catch |
| ... | ... | @@ -216,7 +216,7 @@ namespace NCC.Extend.Utils |
| 216 | 216 | var customer = _db.Queryable<LqKhxxEntity>() |
| 217 | 217 | .Where(x => x.Id == customerId) |
| 218 | 218 | .First(); |
| 219 | - | |
| 219 | + | |
| 220 | 220 | return customer?.Khmc ?? "无"; |
| 221 | 221 | } |
| 222 | 222 | catch |
| ... | ... | @@ -242,7 +242,7 @@ namespace NCC.Extend.Utils |
| 242 | 242 | var user = _db.Queryable<UserEntity>() |
| 243 | 243 | .Where(x => x.Account == account && x.DeleteMark == null) |
| 244 | 244 | .First(); |
| 245 | - | |
| 245 | + | |
| 246 | 246 | return user?.RealName ?? string.Empty; |
| 247 | 247 | } |
| 248 | 248 | catch | ... | ... |