Commit 0b87d248b185391a1875e29f9f2fad51f0fa36f7

Authored by “wangming”
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.
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,25 +729,49 @@ namespace NCC.Extend.LqEvent
729 729
730 try 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 (eventUser, store, tkjlb) => eventUser.EventId == eventId && eventUser.StoreId == store.Id && eventUser.UserId == tkjlb.ExpansionUserId && tkjlb.EventId == eventId 750 (eventUser, store, tkjlb) => eventUser.EventId == eventId && eventUser.StoreId == store.Id && eventUser.UserId == tkjlb.ExpansionUserId && tkjlb.EventId == eventId
735 ) 751 )
736 .GroupBy((eventUser, store, tkjlb) => new { StoreId = store.Id, StoreName = store.Dm }) 752 .GroupBy((eventUser, store, tkjlb) => new { StoreId = store.Id, StoreName = store.Dm })
737 .Select( 753 .Select(
738 (eventUser, store, tkjlb) => 754 (eventUser, store, tkjlb) =>
739 - new StoreDataOutput 755 + new
740 { 756 {
741 StoreId = store.Id, 757 StoreId = store.Id,
742 StoreName = store.Dm, 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 .ToListAsync(); 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 foreach (var store in storeData) 776 foreach (var store in storeData)
753 { 777 {
netcore/src/Modularity/Extend/NCC.Extend/LqStatisticsService.cs
@@ -13,6 +13,7 @@ using NCC.Dependency; @@ -13,6 +13,7 @@ using NCC.Dependency;
13 using NCC.DynamicApiController; 13 using NCC.DynamicApiController;
14 using NCC.Extend.Entitys.Dto.LqMdxx; 14 using NCC.Extend.Entitys.Dto.LqMdxx;
15 using NCC.Extend.Entitys.Dto.LqStatistics; 15 using NCC.Extend.Entitys.Dto.LqStatistics;
  16 +using NCC.Extend.Entitys.Dto.LqStatisticsTechPerformance;
16 using NCC.Extend.Entitys.Dto.LqYcsdJsj; 17 using NCC.Extend.Entitys.Dto.LqYcsdJsj;
17 using NCC.Extend.Entitys.lq_hytk_kjbsyj; 18 using NCC.Extend.Entitys.lq_hytk_kjbsyj;
18 using NCC.Extend.Entitys.lq_jinsanjiao_user; 19 using NCC.Extend.Entitys.lq_jinsanjiao_user;
@@ -25,6 +26,7 @@ using NCC.Extend.Entitys.lq_ycsd_jsj; @@ -25,6 +26,7 @@ using NCC.Extend.Entitys.lq_ycsd_jsj;
25 using NCC.Extend.Entitys.lq_yjmxb; 26 using NCC.Extend.Entitys.lq_yjmxb;
26 using NCC.Extend.Entitys.lq_statistics_gold_triangle; 27 using NCC.Extend.Entitys.lq_statistics_gold_triangle;
27 using NCC.Extend.Entitys.lq_statistics_personal_performance; 28 using NCC.Extend.Entitys.lq_statistics_personal_performance;
  29 +using NCC.Extend.Entitys.lq_statistics_tech_performance;
28 using NCC.Extend.Entitys.lq_xmzl; 30 using NCC.Extend.Entitys.lq_xmzl;
29 using NCC.Extend.Entitys.Dto.LqStatisticsPersonalPerformance; 31 using NCC.Extend.Entitys.Dto.LqStatisticsPersonalPerformance;
30 using NCC.Extend.Entitys.v_tech_teacher_flow; 32 using NCC.Extend.Entitys.v_tech_teacher_flow;
@@ -1190,7 +1192,7 @@ namespace NCC.Extend.LqStatistics @@ -1190,7 +1192,7 @@ namespace NCC.Extend.LqStatistics
1190 #region 金三角统计数据保存 1192 #region 金三角统计数据保存
1191 1193
1192 /// <summary> 1194 /// <summary>
1193 - /// 1、保存金三角开卡业绩统计数据 1195 + /// 【1】保存金三角开卡业绩统计数据
1194 /// </summary> 1196 /// </summary>
1195 /// <remarks> 1197 /// <remarks>
1196 /// 根据金三角设定和开单记录统计金三角的业绩数据 1198 /// 根据金三角设定和开单记录统计金三角的业绩数据
@@ -1366,7 +1368,7 @@ namespace NCC.Extend.LqStatistics @@ -1366,7 +1368,7 @@ namespace NCC.Extend.LqStatistics
1366 #region 个人开单业绩统计 1368 #region 个人开单业绩统计
1367 1369
1368 /// <summary> 1370 /// <summary>
1369 - /// 保存个人开单业绩统计数据 1371 + /// 【2】保存健康师个人开单业绩统计数据
1370 /// </summary> 1372 /// </summary>
1371 /// <remarks> 1373 /// <remarks>
1372 /// 根据开单记录统计个人的业绩数据,包括基础业绩和合作业绩 1374 /// 根据开单记录统计个人的业绩数据,包括基础业绩和合作业绩
@@ -1654,5 +1656,242 @@ namespace NCC.Extend.LqStatistics @@ -1654,5 +1656,242 @@ namespace NCC.Extend.LqStatistics
1654 /// </summary> 1656 /// </summary>
1655 public string ParentId { get; set; } 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&amp;PageSize=10&amp;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,6 +182,7 @@ namespace NCC.Extend.LqTkjlb
182 MemberInfo.Sjh = input.customerPhone; // 设置手机号 182 MemberInfo.Sjh = input.customerPhone; // 设置手机号
183 MemberInfo.Khlx = "线索"; 183 MemberInfo.Khlx = "线索";
184 MemberInfo.Dah = "GK" + DateTime.Now.ToString("yyyyMMddHHmmss"); 184 MemberInfo.Dah = "GK" + DateTime.Now.ToString("yyyyMMddHHmmss");
  185 + MemberInfo.Gsmd = eventUserInfo.StoreId;
185 var memberResult = await _db.Insertable(MemberInfo).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync(); 186 var memberResult = await _db.Insertable(MemberInfo).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync();
186 if (!(memberResult > 0)) 187 if (!(memberResult > 0))
187 { 188 {
netcore/src/Modularity/Extend/NCC.Extend/Utils/LqKdKdjlbStringGenerator.cs
@@ -47,35 +47,35 @@ namespace NCC.Extend.Utils @@ -47,35 +47,35 @@ namespace NCC.Extend.Utils
47 // 健康师:王维 47 // 健康师:王维
48 var healthTeachers = GetHealthTeachers(entity.lqKdJksyjList); 48 var healthTeachers = GetHealthTeachers(entity.lqKdJksyjList);
49 sb.AppendLine($"⏩健康师:{healthTeachers}"); 49 sb.AppendLine($"⏩健康师:{healthTeachers}");
50 - 50 +
51 // 活动方案:532工程 51 // 活动方案:532工程
52 sb.AppendLine($"⏩活动方案:{entity.pxxx ?? "无"}"); 52 sb.AppendLine($"⏩活动方案:{entity.pxxx ?? "无"}");
53 - 53 +
54 // 跟单配合:王经理 竹主任 陈思思老师 54 // 跟单配合:王经理 竹主任 陈思思老师
55 var techTeachers = GetTechTeachers(entity.lqKdKjbsyjList); 55 var techTeachers = GetTechTeachers(entity.lqKdKjbsyjList);
56 sb.AppendLine($"⏩跟单配合:{techTeachers}"); 56 sb.AppendLine($"⏩跟单配合:{techTeachers}");
57 - 57 +
58 // 业绩:4800 58 // 业绩:4800
59 sb.AppendLine($"⏩业绩:{entity.zdyj}"); 59 sb.AppendLine($"⏩业绩:{entity.zdyj}");
60 - 60 +
61 // 实付:4800 61 // 实付:4800
62 sb.AppendLine($"⏩实付:{entity.sfyj}"); 62 sb.AppendLine($"⏩实付:{entity.sfyj}");
63 - 63 +
64 // 欠款: 64 // 欠款:
65 sb.AppendLine($"⏩欠款: {entity.qk}"); 65 sb.AppendLine($"⏩欠款: {entity.qk}");
66 - 66 +
67 // 抵扣: 67 // 抵扣:
68 sb.AppendLine($"⏩抵扣:{entity.ckmx ?? "无"}"); 68 sb.AppendLine($"⏩抵扣:{entity.ckmx ?? "无"}");
69 - 69 +
70 // 来源:售后 70 // 来源:售后
71 sb.AppendLine($"⏩来源:{entity.khly ?? "无"}"); 71 sb.AppendLine($"⏩来源:{entity.khly ?? "无"}");
72 - 72 +
73 // 是否属于升单: 73 // 是否属于升单:
74 sb.AppendLine($"⏩是否属于升单:{entity.sfskdd ?? "无"}"); 74 sb.AppendLine($"⏩是否属于升单:{entity.sfskdd ?? "无"}");
75 - 75 +
76 // 简介:高姐是我们的老客,今天邀约到犀浦店做532,维维全程陪同,陈思思老师在操作过程中给姐姐分享企业文化,找到顾客需求、邀请王经理 竹主任 给到顾客福利、顾客爽快成交,私密档案已了解到70%,感谢顾客的信任与支持 ,王经理 竹主任 陈老师辛苦了[玫瑰]维维真棒[强]龙城国际店加油!我们还在努力中!家人们给我们打气加油👏👏👏👏等待我们的捷报👍👍 76 // 简介:高姐是我们的老客,今天邀约到犀浦店做532,维维全程陪同,陈思思老师在操作过程中给姐姐分享企业文化,找到顾客需求、邀请王经理 竹主任 给到顾客福利、顾客爽快成交,私密档案已了解到70%,感谢顾客的信任与支持 ,王经理 竹主任 陈老师辛苦了[玫瑰]维维真棒[强]龙城国际店加油!我们还在努力中!家人们给我们打气加油👏👏👏👏等待我们的捷报👍👍
77 sb.AppendLine($"⏩简介:{entity.jj ?? "无"}"); 77 sb.AppendLine($"⏩简介:{entity.jj ?? "无"}");
78 - 78 +
79 return sb.ToString(); 79 return sb.ToString();
80 } 80 }
81 81
@@ -94,9 +94,9 @@ namespace NCC.Extend.Utils @@ -94,9 +94,9 @@ namespace NCC.Extend.Utils
94 try 94 try
95 { 95 {
96 var store = _db.Queryable<LqMdxxEntity>() 96 var store = _db.Queryable<LqMdxxEntity>()
97 - .Where(x => x.Mdbm == storeCode) 97 + .Where(x => x.Id == storeCode)
98 .First(); 98 .First();
99 - 99 +
100 return store?.Dm ?? storeCode; 100 return store?.Dm ?? storeCode;
101 } 101 }
102 catch 102 catch
@@ -122,7 +122,7 @@ namespace NCC.Extend.Utils @@ -122,7 +122,7 @@ namespace NCC.Extend.Utils
122 var department = _db.Queryable<LqYcsdJsjEntity>() 122 var department = _db.Queryable<LqYcsdJsjEntity>()
123 .Where(x => x.Id == departmentCode) 123 .Where(x => x.Id == departmentCode)
124 .First(); 124 .First();
125 - 125 +
126 return department?.Jsj ?? departmentCode; 126 return department?.Jsj ?? departmentCode;
127 } 127 }
128 catch 128 catch
@@ -216,7 +216,7 @@ namespace NCC.Extend.Utils @@ -216,7 +216,7 @@ namespace NCC.Extend.Utils
216 var customer = _db.Queryable<LqKhxxEntity>() 216 var customer = _db.Queryable<LqKhxxEntity>()
217 .Where(x => x.Id == customerId) 217 .Where(x => x.Id == customerId)
218 .First(); 218 .First();
219 - 219 +
220 return customer?.Khmc ?? "无"; 220 return customer?.Khmc ?? "无";
221 } 221 }
222 catch 222 catch
@@ -242,7 +242,7 @@ namespace NCC.Extend.Utils @@ -242,7 +242,7 @@ namespace NCC.Extend.Utils
242 var user = _db.Queryable<UserEntity>() 242 var user = _db.Queryable<UserEntity>()
243 .Where(x => x.Account == account && x.DeleteMark == null) 243 .Where(x => x.Account == account && x.DeleteMark == null)
244 .First(); 244 .First();
245 - 245 +
246 return user?.RealName ?? string.Empty; 246 return user?.RealName ?? string.Empty;
247 } 247 }
248 catch 248 catch