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();
}