diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqStatisticsPersonalPerformance/LqStatisticsPersonalPerformanceListOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqStatisticsPersonalPerformance/LqStatisticsPersonalPerformanceListOutput.cs new file mode 100644 index 0000000..ca01219 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqStatisticsPersonalPerformance/LqStatisticsPersonalPerformanceListOutput.cs @@ -0,0 +1,90 @@ +using System; + +namespace NCC.Extend.Entitys.Dto.LqStatisticsPersonalPerformance +{ + /// + /// 个人开单业绩统计列表输出 + /// + public class LqStatisticsPersonalPerformanceListOutput + { + /// + /// 主键ID + /// + public string Id { get; set; } + + /// + /// 统计月份(YYYYMM) + /// + public string StatisticsMonth { get; set; } + + /// + /// 门店ID + /// + public string StoreId { get; set; } + + /// + /// 门店名称 + /// + public string StoreName { get; set; } + + /// + /// 金三角ID + /// + public string GoldTriangleId { get; set; } + + /// + /// 金三角名称 + /// + public string GoldTriangleName { get; set; } + + /// + /// 岗位 + /// + public string Position { get; set; } + + /// + /// 员工ID + /// + public string EmployeeId { get; set; } + + /// + /// 员工姓名 + /// + public string EmployeeName { get; set; } + + /// + /// 总业绩 + /// + public decimal TotalPerformance { get; set; } + + /// + /// 基础业绩 + /// + public decimal BasePerformance { get; set; } + + /// + /// 合作业绩 + /// + public decimal CooperationPerformance { get; set; } + + /// + /// 订单数量 + /// + public int OrderCount { get; set; } + + /// + /// 最后订单日期 + /// + public DateTime? LastOrderDate { get; set; } + + /// + /// 首次订单日期 + /// + public DateTime? FirstOrderDate { get; set; } + + /// + /// 创建时间 + /// + public DateTime CreateTime { get; set; } + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqStatisticsPersonalPerformance/LqStatisticsPersonalPerformanceListQueryInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqStatisticsPersonalPerformance/LqStatisticsPersonalPerformanceListQueryInput.cs new file mode 100644 index 0000000..f24e5ad --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqStatisticsPersonalPerformance/LqStatisticsPersonalPerformanceListQueryInput.cs @@ -0,0 +1,41 @@ +using System; +using NCC.Common.Filter; + +namespace NCC.Extend.Entitys.Dto.LqStatisticsPersonalPerformance +{ + /// + /// 个人开单业绩统计列表查询输入 + /// + public class LqStatisticsPersonalPerformanceListQueryInput : PageInputBase + { + /// + /// 统计月份(YYYYMM) + /// + public string StatisticsMonth { get; set; } + + /// + /// 门店ID + /// + public string StoreId { get; set; } + + /// + /// 员工ID + /// + public string EmployeeId { get; set; } + + /// + /// 员工姓名 + /// + public string EmployeeName { get; set; } + + /// + /// 金三角ID + /// + public string GoldTriangleId { get; set; } + + /// + /// 岗位 + /// + public string Position { get; set; } + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_statistics_personal_performance/LqStatisticsPersonalPerformanceEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_statistics_personal_performance/LqStatisticsPersonalPerformanceEntity.cs new file mode 100644 index 0000000..58164c3 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_statistics_personal_performance/LqStatisticsPersonalPerformanceEntity.cs @@ -0,0 +1,110 @@ +using NCC.Common.Const; +using SqlSugar; +using System; + +namespace NCC.Extend.Entitys.lq_statistics_personal_performance +{ + /// + /// 个人开单业绩统计表 + /// + [SugarTable("lq_statistics_personal_performance")] + [Tenant(ClaimConst.TENANT_ID)] + public class LqStatisticsPersonalPerformanceEntity + { + /// + /// 主键ID + /// + [SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true)] + public string Id { get; set; } + + /// + /// 统计月份(YYYYMM) + /// + [SugarColumn(ColumnName = "F_StatisticsMonth")] + public string StatisticsMonth { get; set; } + + /// + /// 门店ID + /// + [SugarColumn(ColumnName = "F_StoreId")] + public string StoreId { get; set; } + + /// + /// 门店名称 + /// + [SugarColumn(ColumnName = "F_StoreName")] + public string StoreName { get; set; } + + /// + /// 金三角ID + /// + [SugarColumn(ColumnName = "F_GoldTriangleId")] + public string GoldTriangleId { get; set; } + + /// + /// 金三角名称 + /// + [SugarColumn(ColumnName = "F_GoldTriangleName")] + public string GoldTriangleName { get; set; } + + /// + /// 岗位 + /// + [SugarColumn(ColumnName = "F_Position")] + public string Position { get; set; } + + /// + /// 员工ID + /// + [SugarColumn(ColumnName = "F_EmployeeId")] + public string EmployeeId { get; set; } + + /// + /// 员工姓名 + /// + [SugarColumn(ColumnName = "F_EmployeeName")] + public string EmployeeName { get; set; } + + /// + /// 总业绩 + /// + [SugarColumn(ColumnName = "F_TotalPerformance")] + public decimal TotalPerformance { get; set; } + + /// + /// 基础业绩 + /// + [SugarColumn(ColumnName = "F_BasePerformance")] + public decimal BasePerformance { get; set; } + + /// + /// 合作业绩 + /// + [SugarColumn(ColumnName = "F_CooperationPerformance")] + public decimal CooperationPerformance { get; set; } + + /// + /// 订单数量 + /// + [SugarColumn(ColumnName = "F_OrderCount")] + public int OrderCount { get; set; } + + /// + /// 最后订单日期 + /// + [SugarColumn(ColumnName = "F_LastOrderDate")] + public DateTime? LastOrderDate { get; set; } + + /// + /// 首次订单日期 + /// + [SugarColumn(ColumnName = "F_FirstOrderDate")] + public DateTime? FirstOrderDate { get; set; } + + /// + /// 创建时间 + /// + [SugarColumn(ColumnName = "F_CreateTime")] + public DateTime CreateTime { get; set; } + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqGzService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqGzService.cs index f64da8e..191c9fd 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqGzService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqGzService.cs @@ -26,7 +26,6 @@ using NCC.Extend.Entitys.lq_kd_pxmx; using NCC.Extend.Entitys.lq_mdxx; using NCC.Extend.Entitys.lq_xmzl; using NCC.Extend.Entitys.lq_ycsd_jsj; -using NCC.Extend.Entitys.lq_statistics_gold_triangle; using NCC.Extend.Interfaces.LqGz; using NCC.FriendlyException; using NCC.JsonSerialization; @@ -915,233 +914,6 @@ namespace NCC.Extend.LqGz #endregion - #region 金三角统计数据保存 - - /// - /// 保存金三角开卡业绩统计数据 - /// - /// - /// 根据金三角设定和开单记录统计金三角的业绩数据 - /// 使用直接SQL查询提高效率,完全按照原始SQL逻辑实现 - /// - /// 示例请求: - /// ```json - /// POST /api/Extend/LqGz/save-gold-triangle-statistics - /// { - /// "statisticsMonth": "202401" - /// } - /// ``` - /// - /// 统计月份(YYYYMM格式) - /// 保存结果 - /// 成功保存统计数据 - /// 参数错误 - /// 服务器内部错误 - [HttpPost("save-gold-triangle-statistics")] - public async Task SaveGoldTriangleStatistics(string statisticsMonth) - { - if (string.IsNullOrEmpty(statisticsMonth) || statisticsMonth.Length != 6) - { - throw NCCException.Oh("统计月份格式错误,请使用YYYYMM格式"); - } - - try - { - // 使用直接SQL查询,完全按照原始SQL逻辑 - var sql = @" - SELECT - jsj.F_Id AS JsjId, - jsj.jsj AS JsjName, - jsj.yf AS Month, - jsj.md AS StoreId, - md.dm AS StoreName, - COUNT(DISTINCT jksyj.glkdbh) AS OrderCount, - SUM(CAST(jksyj.jksyj AS DECIMAL(18,2))) AS TotalPerformance, - MAX(jksyj.yjsj) AS LastOrderDate, - MIN(jksyj.yjsj) AS FirstOrderDate - FROM lq_ycsd_jsj jsj - LEFT JOIN lq_kd_jksyj jksyj ON ( - jsj.F_Id = jksyj.jsj_id - AND YEAR(jksyj.yjsj) = SUBSTRING(jsj.yf, 1, 4) - AND MONTH(jksyj.yjsj) = SUBSTRING(jsj.yf, 5, 2) - ) - LEFT JOIN lq_mdxx md ON jsj.md = md.F_Id - WHERE jsj.yf = @statisticsMonth - AND jksyj.yjsj IS NOT NULL - AND jksyj.jksyj IS NOT NULL - AND jksyj.jksyj <> '' - AND jksyj.jksyj <> '0' - GROUP BY jsj.F_Id, jsj.jsj, jsj.yf, jsj.md, md.dm - ORDER BY jsj.yf DESC, TotalPerformance DESC"; - - var statisticsData = await _db.Ado.SqlQueryAsync(sql, new { statisticsMonth }); - - if (!statisticsData.Any()) - { - return new - { - Success = true, - Message = $"未找到 {statisticsMonth} 月份的金三角统计数据", - SavedCount = 0 - }; - } - - // 转换为实体对象并保存 - var entities = statisticsData.Select(data => new LqStatisticsGoldTriangleEntity - { - Id = YitIdHelper.NextId().ToString(), - GoldTriangleId = data.JsjId?.ToString(), - GoldTriangleName = data.JsjName?.ToString(), - StatisticsMonth = data.Month?.ToString(), - StoreId = data.StoreId?.ToString(), - StoreName = data.StoreName?.ToString(), - OrderCount = Convert.ToInt32(data.OrderCount), - TotalPerformance = Convert.ToDecimal(data.TotalPerformance), - LastOrderDate = data.LastOrderDate as DateTime?, - FirstOrderDate = data.FirstOrderDate as DateTime?, - CreateTime = DateTime.Now - }).ToList(); - - // 先删除该月份的历史数据 - await _db.Deleteable() - .Where(x => x.StatisticsMonth == statisticsMonth) - .ExecuteCommandAsync(); - - // 批量插入新数据 - var savedCount = await _db.Insertable(entities).ExecuteCommandAsync(); - - _logger.LogInformation($"成功保存金三角统计数据 - 月份: {statisticsMonth}, 记录数: {savedCount}"); - - return new - { - Success = true, - Message = $"成功保存 {savedCount} 条金三角统计数据", - SavedCount = savedCount, - StatisticsMonth = statisticsMonth - }; - } - catch (Exception ex) - { - _logger.LogError(ex, $"保存金三角统计数据失败 - 月份: {statisticsMonth}"); - throw NCCException.Oh($"保存金三角统计数据失败: {ex.Message}"); - } - } - - /// - /// 测试金三角统计SQL查询 - /// - /// - /// 直接执行SQL查询,验证统计逻辑是否正确 - /// - /// 示例请求: - /// ```json - /// GET /api/Extend/LqGz/test-gold-triangle-sql?statisticsMonth=202401 - /// ``` - /// - /// 统计月份(YYYYMM格式) - /// 原始SQL查询结果 - /// 成功返回查询结果 - /// 参数错误 - [HttpGet("test-gold-triangle-sql")] - public async Task TestGoldTriangleSql(string statisticsMonth) - { - if (string.IsNullOrEmpty(statisticsMonth) || statisticsMonth.Length != 6) - { - throw NCCException.Oh("统计月份格式错误,请使用YYYYMM格式"); - } - - try - { - var sql = @" - SELECT - jsj.F_Id AS JsjId, - jsj.jsj AS JsjName, - jsj.yf AS Month, - jsj.md AS StoreId, - md.dm AS StoreName, - COUNT(DISTINCT jksyj.glkdbh) AS OrderCount, - SUM(CAST(jksyj.jksyj AS DECIMAL(18,2))) AS TotalPerformance, - MAX(jksyj.yjsj) AS LastOrderDate, - MIN(jksyj.yjsj) AS FirstOrderDate - FROM lq_ycsd_jsj jsj - LEFT JOIN lq_kd_jksyj jksyj ON ( - jsj.F_Id = jksyj.jsj_id - AND YEAR(jksyj.yjsj) = SUBSTRING(jsj.yf, 1, 4) - AND MONTH(jksyj.yjsj) = SUBSTRING(jsj.yf, 5, 2) - ) - LEFT JOIN lq_mdxx md ON jsj.md = md.F_Id - WHERE jsj.yf = @statisticsMonth - AND jksyj.yjsj IS NOT NULL - AND jksyj.jksyj IS NOT NULL - AND jksyj.jksyj <> '' - AND jksyj.jksyj <> '0' - GROUP BY jsj.F_Id, jsj.jsj, jsj.yf, jsj.md, md.dm - ORDER BY jsj.yf DESC, TotalPerformance DESC"; - - var result = await _db.Ado.SqlQueryAsync(sql, new { statisticsMonth }); - - return new - { - Success = true, - Data = result, - Count = result.Count, - StatisticsMonth = statisticsMonth, - Sql = sql - }; - } - catch (Exception ex) - { - _logger.LogError(ex, $"测试金三角统计SQL失败 - 月份: {statisticsMonth}"); - throw NCCException.Oh($"测试金三角统计SQL失败: {ex.Message}"); - } - } - - /// - /// 获取金三角统计数据 - /// - /// - /// 查询指定月份的金三角统计数据 - /// - /// 示例请求: - /// ```json - /// GET /api/Extend/LqGz/get-gold-triangle-statistics?statisticsMonth=202401 - /// ``` - /// - /// 统计月份(YYYYMM格式) - /// 统计数据列表 - /// 成功返回统计数据 - /// 参数错误 - [HttpGet("get-gold-triangle-statistics")] - public async Task GetGoldTriangleStatistics(string statisticsMonth) - { - if (string.IsNullOrEmpty(statisticsMonth)) - { - throw NCCException.Oh("统计月份不能为空"); - } - - try - { - var statistics = await _db.Queryable() - .Where(x => x.StatisticsMonth == statisticsMonth) - .OrderBy(x => x.TotalPerformance, OrderByType.Desc) - .ToListAsync(); - - return new - { - Success = true, - Data = statistics, - Count = statistics.Count, - StatisticsMonth = statisticsMonth - }; - } - catch (Exception ex) - { - _logger.LogError(ex, $"查询金三角统计数据失败 - 月份: {statisticsMonth}"); - throw NCCException.Oh($"查询金三角统计数据失败: {ex.Message}"); - } - } - - #endregion diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqStatisticsService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqStatisticsService.cs index 291c93d..1d80468 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqStatisticsService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqStatisticsService.cs @@ -23,12 +23,18 @@ using NCC.Extend.Entitys.lq_mdxx; using NCC.Extend.Entitys.lq_xh_kjbsyj; using NCC.Extend.Entitys.lq_ycsd_jsj; using NCC.Extend.Entitys.lq_yjmxb; +using NCC.Extend.Entitys.lq_statistics_gold_triangle; +using NCC.Extend.Entitys.lq_statistics_personal_performance; +using NCC.Extend.Entitys.lq_xmzl; +using NCC.Extend.Entitys.Dto.LqStatisticsPersonalPerformance; using NCC.Extend.Entitys.v_tech_teacher_flow; using NCC.Extend.Interfaces.LqStatistics; using NCC.Extend.Utils; using NCC.FriendlyException; using NCC.System.Entitys.Permission; using SqlSugar; +using Yitter.IdGenerator; +using NCC.Extend.Entitys.lq_kd_pxmx; namespace NCC.Extend.LqStatistics { @@ -1178,27 +1184,475 @@ namespace NCC.Extend.LqStatistics throw NCCException.Oh(ErrorCode.COM1001, "查询金三角业绩统计失败"); } } + #endregion - } - /// - /// 部门信息 - /// - public class DepartmentInfo - { + #region 金三角统计数据保存 + + /// + /// 1、保存金三角开卡业绩统计数据 + /// + /// + /// 根据金三角设定和开单记录统计金三角的业绩数据 + /// 使用SqlSugar框架实现,优化查询性能 + /// + /// 示例请求: + /// ```json + /// POST /api/Extend/LqStatistics/save-gold-triangle-statistics + /// { + /// "statisticsMonth": "202401" + /// } + /// ``` + /// + /// 统计月份(YYYYMM格式) + /// 保存结果 + /// 成功保存统计数据 + /// 参数错误 + /// 服务器内部错误 + [HttpPost("save-gold-triangle-statistics")] + public async Task SaveGoldTriangleStatistics(string statisticsMonth) + { + if (string.IsNullOrEmpty(statisticsMonth) || statisticsMonth.Length != 6) + { + throw NCCException.Oh("统计月份格式错误,请使用YYYYMM格式"); + } + + try + { + // 使用数据库聚合方式,直接在数据库中完成所有统计计算 + var sql = @" + SELECT + jsj.F_Id AS GoldTriangleId, + jsj.jsj AS GoldTriangleName, + jsj.yf AS StatisticsMonth, + jsj.md AS StoreId, + COALESCE(md.dm, '') AS StoreName, + COUNT(DISTINCT jksyj.glkdbh) AS OrderCount, + SUM(CAST(jksyj.jksyj AS DECIMAL(18,2))) AS TotalPerformance, + MAX(jksyj.yjsj) AS LastOrderDate, + MIN(jksyj.yjsj) AS FirstOrderDate + FROM lq_ycsd_jsj jsj + LEFT JOIN lq_kd_jksyj jksyj ON ( + jsj.F_Id = jksyj.jsj_id + AND YEAR(jksyj.yjsj) = SUBSTRING(jsj.yf, 1, 4) + AND MONTH(jksyj.yjsj) = SUBSTRING(jsj.yf, 5, 2) + ) + LEFT JOIN lq_mdxx md ON jsj.md = md.F_Id + WHERE jsj.yf = @statisticsMonth + AND (jksyj.yjsj IS NULL OR ( + jksyj.yjsj IS NOT NULL + AND jksyj.jksyj IS NOT NULL + AND jksyj.jksyj != '' + AND jksyj.jksyj != '0' + )) + GROUP BY + jsj.F_Id, + jsj.jsj, + jsj.yf, + jsj.md, + md.dm + ORDER BY TotalPerformance DESC"; + + // 解析统计月份 + var year = int.Parse(statisticsMonth.Substring(0, 4)); + var month = int.Parse(statisticsMonth.Substring(4, 2)); + + // 执行SQL查询 + var statisticsData = await _db.Ado.SqlQueryAsync(sql, new { statisticsMonth }); + + if (!statisticsData.Any()) + { + return new + { + Success = true, + Message = $"未找到 {statisticsMonth} 月份的金三角统计数据", + SavedCount = 0 + }; + } + + // 转换为实体对象 + var entities = statisticsData.Select(data => new LqStatisticsGoldTriangleEntity + { + Id = YitIdHelper.NextId().ToString(), + GoldTriangleId = data.GoldTriangleId?.ToString() ?? "", + GoldTriangleName = data.GoldTriangleName?.ToString() ?? "", + StatisticsMonth = data.StatisticsMonth?.ToString() ?? statisticsMonth, + StoreId = data.StoreId?.ToString() ?? "", + StoreName = data.StoreName?.ToString() ?? "", + OrderCount = Convert.ToInt32(data.OrderCount ?? 0), + TotalPerformance = Convert.ToDecimal(data.TotalPerformance ?? 0), + LastOrderDate = data.LastOrderDate as DateTime?, + FirstOrderDate = data.FirstOrderDate as DateTime?, + CreateTime = DateTime.Now + }).ToList(); + + // 使用事务确保数据一致性 + var result = await _db.Ado.UseTranAsync(async () => + { + // 先删除该月份的历史数据 + await _db.Deleteable() + .Where(x => x.StatisticsMonth == statisticsMonth) + .ExecuteCommandAsync(); + + // 批量插入新数据 + return await _db.Insertable(entities).ExecuteCommandAsync(); + }); + + var savedCount = result.IsSuccess ? result.Data : 0; + _logger.LogInformation($"成功保存金三角统计数据 - 月份: {statisticsMonth}, 记录数: {savedCount}"); + + return new + { + Success = true, + Message = $"成功保存 {savedCount} 条金三角统计数据", + SavedCount = savedCount, + StatisticsMonth = statisticsMonth + }; + } + catch (Exception ex) + { + _logger.LogError(ex, $"保存金三角统计数据失败 - 月份: {statisticsMonth}"); + throw NCCException.Oh($"保存金三角统计数据失败: {ex.Message}"); + } + } + + /// + /// 获取金三角统计数据 + /// + /// + /// 查询指定月份的金三角统计数据 + /// + /// 示例请求: + /// ```json + /// GET /api/Extend/LqStatistics/get-gold-triangle-statistics?statisticsMonth=202401 + /// ``` + /// + /// 统计月份(YYYYMM格式) + /// 统计数据列表 + /// 成功返回统计数据 + /// 参数错误 + [HttpGet("get-gold-triangle-statistics")] + public async Task GetGoldTriangleStatistics(string statisticsMonth) + { + if (string.IsNullOrEmpty(statisticsMonth)) + { + throw NCCException.Oh("统计月份不能为空"); + } + + try + { + var statistics = await _db.Queryable() + .Where(x => x.StatisticsMonth == statisticsMonth) + .OrderBy(x => x.TotalPerformance, OrderByType.Desc) + .ToListAsync(); + + return new + { + Success = true, + Data = statistics, + Count = statistics.Count, + StatisticsMonth = statisticsMonth + }; + } + catch (Exception ex) + { + _logger.LogError(ex, $"查询金三角统计数据失败 - 月份: {statisticsMonth}"); + throw NCCException.Oh($"查询金三角统计数据失败: {ex.Message}"); + } + } + + #endregion + + #region 个人开单业绩统计 + + /// + /// 保存个人开单业绩统计数据 + /// + /// + /// 根据开单记录统计个人的业绩数据,包括基础业绩和合作业绩 + /// 基础业绩和合作业绩的划分根据品项ID查询lq_xmzl表的fl3字段 + /// 使用数据库聚合方式优化性能,避免大量数据加载到内存 + /// + /// 示例请求: + /// ```json + /// POST /api/Extend/LqStatistics/save-personal-performance-statistics + /// { + /// "statisticsMonth": "202401" + /// } + /// ``` + /// + /// 统计月份(YYYYMM格式) + /// 保存结果 + /// 成功保存统计数据 + /// 参数错误 + /// 服务器内部错误 + [HttpPost("save-personal-performance-statistics")] + public async Task SavePersonalPerformanceStatistics(string statisticsMonth) + { + if (string.IsNullOrEmpty(statisticsMonth) || statisticsMonth.Length != 6) + { + throw NCCException.Oh("统计月份格式错误,请使用YYYYMM格式"); + } + + try + { + // 使用数据库聚合方式,直接在数据库中完成所有统计计算 + // 按照开单记录统计,避免重复计算 + var sql = @" + SELECT + jksyj.jkszh AS EmployeeId, + u.F_REALNAME AS EmployeeName, + u.F_MDID AS StoreId, + COALESCE(md.dm, '') AS StoreName, + COALESCE(jsj.F_Id, '') AS GoldTriangleId, + COALESCE(jsj.jsj, '') AS GoldTriangleName, + CASE + WHEN jsjUser.is_leader = 1 THEN '顾问' + ELSE COALESCE(u.F_GW, '') + END AS Position, + COUNT(DISTINCT jksyj.glkdbh) AS OrderCount, + MAX(jksyj.yjsj) AS LastOrderDate, + MIN(jksyj.yjsj) AS FirstOrderDate, + SUM( + CASE + WHEN xmzl.fl3 = '合作业绩' THEN CAST(jksyj.jksyj AS DECIMAL(18,2)) + ELSE 0 + END + ) AS CooperationPerformance, + SUM( + CASE + WHEN xmzl.fl3 IS NULL OR xmzl.fl3 != '合作业绩' THEN CAST(jksyj.jksyj AS DECIMAL(18,2)) + ELSE 0 + END + ) AS BasePerformance, + SUM(CAST(jksyj.jksyj AS DECIMAL(18,2))) AS TotalPerformance + FROM lq_kd_jksyj jksyj + INNER JOIN lq_kd_pxmx pxmx ON jksyj.F_kdpxid = pxmx.F_Id + INNER JOIN lq_xmzl xmzl ON pxmx.px = xmzl.F_Id + INNER JOIN BASE_USER u ON jksyj.jkszh = u.F_Id + LEFT JOIN lq_mdxx md ON u.F_MDID = md.F_Id + LEFT JOIN lq_ycsd_jsj jsj ON jksyj.jsj_id = jsj.F_Id AND jsj.yf = @statisticsMonth + LEFT JOIN ( + SELECT DISTINCT user_id, F_Month, MAX(is_leader) as is_leader + FROM lq_jinsanjiao_user + WHERE F_Month = @statisticsMonth + GROUP BY user_id, F_Month + ) jsjUser ON jksyj.jkszh = jsjUser.user_id + WHERE jksyj.yjsj IS NOT NULL + AND jksyj.jksyj IS NOT NULL + AND jksyj.jksyj != '' + AND jksyj.jksyj != '0' + AND jksyj.F_kdpxid IS NOT NULL + AND jksyj.F_kdpxid != '' + AND YEAR(jksyj.yjsj) = @year + AND MONTH(jksyj.yjsj) = @month + GROUP BY + jksyj.jkszh, + u.F_REALNAME, + u.F_MDID, + md.dm, + jsj.F_Id, + jsj.jsj, + jsjUser.is_leader, + u.F_GW + ORDER BY TotalPerformance DESC"; + + // 解析统计月份 + var year = int.Parse(statisticsMonth.Substring(0, 4)); + var month = int.Parse(statisticsMonth.Substring(4, 2)); + + var parameters = new Dictionary + { + { "@statisticsMonth", statisticsMonth }, + { "@year", year }, + { "@month", month } + }; + + _logger.LogInformation($"执行个人业绩统计SQL - 月份: {statisticsMonth}"); + + var statisticsData = await _db.Ado.SqlQueryAsync(sql, parameters); + + if (!statisticsData.Any()) + { + return new + { + Success = true, + Message = $"未找到 {statisticsMonth} 月份的开单记录数据", + SavedCount = 0 + }; + } + + _logger.LogInformation($"查询到个人业绩统计数据: {statisticsData.Count} 条"); + + // 创建实体列表 + var entities = statisticsData.Select(stats => new LqStatisticsPersonalPerformanceEntity + { + Id = YitIdHelper.NextId().ToString(), + StatisticsMonth = statisticsMonth, + StoreId = stats.StoreId?.ToString() ?? "", + StoreName = stats.StoreName?.ToString() ?? "", + GoldTriangleId = stats.GoldTriangleId?.ToString() ?? "", + GoldTriangleName = stats.GoldTriangleName?.ToString() ?? "", + Position = stats.Position?.ToString() ?? "", + EmployeeId = stats.EmployeeId?.ToString() ?? "", + EmployeeName = stats.EmployeeName?.ToString() ?? "", + TotalPerformance = Convert.ToDecimal(stats.TotalPerformance ?? 0), + BasePerformance = Convert.ToDecimal(stats.BasePerformance ?? 0), + CooperationPerformance = Convert.ToDecimal(stats.CooperationPerformance ?? 0), + OrderCount = Convert.ToInt32(stats.OrderCount ?? 0), + LastOrderDate = stats.LastOrderDate as DateTime?, + FirstOrderDate = stats.FirstOrderDate as DateTime?, + CreateTime = DateTime.Now + }).ToList(); + + // 使用事务确保数据一致性 + var result = await _db.Ado.UseTranAsync(async () => + { + // 先删除该月份的历史数据 + await _db.Deleteable() + .Where(x => x.StatisticsMonth == statisticsMonth) + .ExecuteCommandAsync(); + + // 批量插入新数据 + return await _db.Insertable(entities).ExecuteCommandAsync(); + }); + + var savedCount = result.IsSuccess ? result.Data : 0; + _logger.LogInformation($"成功保存个人业绩统计数据 - 月份: {statisticsMonth}, 记录数: {savedCount}"); + + return new + { + Success = true, + Message = $"成功保存 {savedCount} 条个人业绩统计数据", + SavedCount = savedCount, + StatisticsMonth = statisticsMonth + }; + } + catch (Exception ex) + { + _logger.LogError(ex, $"保存个人业绩统计数据失败 - 月份: {statisticsMonth}"); + throw NCCException.Oh($"保存个人业绩统计数据失败: {ex.Message}"); + } + } + /// - /// 部门ID + /// 获取个人开单业绩统计数据 /// - public string DepartmentId { get; set; } + /// + /// 查询指定月份的个人业绩统计数据 + /// + /// 示例请求: + /// ```json + /// GET /api/Extend/LqStatistics/get-personal-performance-statistics?statisticsMonth=202401 + /// ``` + /// + /// 统计月份(YYYYMM格式) + /// 统计数据列表 + /// 成功返回统计数据 + /// 参数错误 + [HttpGet("get-personal-performance-statistics")] + public async Task GetPersonalPerformanceStatistics(string statisticsMonth) + { + if (string.IsNullOrEmpty(statisticsMonth)) + { + throw NCCException.Oh("统计月份不能为空"); + } + + try + { + var statistics = await _db.Queryable() + .Where(x => x.StatisticsMonth == statisticsMonth) + .OrderBy(x => x.TotalPerformance, OrderByType.Desc) + .ToListAsync(); + + return statistics; + } + catch (Exception ex) + { + _logger.LogError(ex, $"查询个人业绩统计数据失败 - 月份: {statisticsMonth}"); + throw NCCException.Oh($"查询个人业绩统计数据失败: {ex.Message}"); + } + } /// - /// 部门名称 + /// 分页查询个人开单业绩统计数据 /// - public string DepartmentName { get; set; } + /// + /// 分页查询个人业绩统计数据,支持多条件筛选 + /// + /// 示例请求: + /// ```json + /// POST /api/Extend/LqStatistics/get-personal-performance-statistics-list + /// { + /// "statisticsMonth": "202401", + /// "storeId": "store123", + /// "employeeName": "张三", + /// "pageIndex": 1, + /// "pageSize": 20 + /// } + /// ``` + /// + /// 查询条件 + /// 分页统计数据 + /// 成功返回分页数据 + /// 参数错误 + [HttpPost("get-personal-performance-statistics-list")] + public async Task GetPersonalPerformanceStatisticsList(LqStatisticsPersonalPerformanceListQueryInput input) + { + try + { + var query = _db.Queryable(); + + // 添加查询条件 + query = query.WhereIF(!string.IsNullOrEmpty(input.StatisticsMonth), x => x.StatisticsMonth == input.StatisticsMonth); + query = query.WhereIF(!string.IsNullOrEmpty(input.StoreId), x => x.StoreId == input.StoreId); + query = query.WhereIF(!string.IsNullOrEmpty(input.EmployeeId), x => x.EmployeeId == input.EmployeeId); + query = query.WhereIF(!string.IsNullOrEmpty(input.EmployeeName), x => x.EmployeeName.Contains(input.EmployeeName)); + query = query.WhereIF(!string.IsNullOrEmpty(input.GoldTriangleId), x => x.GoldTriangleId == input.GoldTriangleId); + query = query.WhereIF(!string.IsNullOrEmpty(input.Position), x => x.Position == input.Position); + + // 按总业绩降序排序 + query = query.OrderBy(x => x.TotalPerformance, OrderByType.Desc); + + // 分页查询 + var result = await query.ToPagedListAsync(input.currentPage, input.pageSize); + + return new + { + Records = result.list, + Total = result.pagination.Total, + PageIndex = input.currentPage, + PageSize = input.pageSize + }; + } + catch (Exception ex) + { + _logger.LogError(ex, "查询个人业绩统计数据列表失败"); + throw NCCException.Oh($"查询个人业绩统计数据列表失败: {ex.Message}"); + } + } + + #endregion /// - /// 父部门ID + /// 部门信息 /// - public string ParentId { get; set; } + public class DepartmentInfo + { + /// + /// 部门ID + /// + public string DepartmentId { get; set; } + + /// + /// 部门名称 + /// + public string DepartmentName { get; set; } + + /// + /// 父部门ID + /// + public string ParentId { get; set; } + } } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs index 8a180ce..6333c0d 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs @@ -327,11 +327,11 @@ namespace NCC.Extend.LqYcsdJsj { await CreateJsjMembers(entity.Id, input.members, userInfo.userId); } - // 3. 创建站点战队T区(如果金三角不是T区且不是单人) - if (!input.jsj.EndsWith("T区") && input.members != null && input.members.Count > 1) - { - await CreateOrUpdateTeamTArea(input.yf, input.jsj, input.md, userInfo.userId); - } + // 3. 创建站点战队T区(如果金三角不是T区且不是单人),暂时不用创建金三角的T区,等待业务部门确认逻辑后进行 + // if (!input.jsj.EndsWith("T区") && input.members != null && input.members.Count > 1) + // { + // await CreateOrUpdateTeamTArea(input.yf, input.jsj, input.md, userInfo.userId); + // } // 提交事务 _db.CommitTran(); }