From 83e25a9eb361b7bace0eb8c2be0cba26d0a24fab Mon Sep 17 00:00:00 2001 From: “wangming” <“wangming@antissoft.com”> Date: Tue, 28 Oct 2025 16:41:16 +0800 Subject: [PATCH] feat: 统一日报服务时间参数格式,支持自定义时间范围 --- netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/BusinessUnitPerformanceCompletionInput.cs | 27 +++++++++++++++++++++++++++ netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/BusinessUnitPerformanceCompletionOutput.cs | 42 ++++++++++++++++++++++++++++++++++++++++++ netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/ManagerPerformanceCompletionInput.cs | 27 +++++++++++++++++++++++++++ netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/ManagerPerformanceCompletionOutput.cs | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/ManagerSummaryPerformanceCompletionOutput.cs | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/StoreDailyStatisticsInput.cs | 27 +++++++++++++++++++++++++++ netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/StoreDailyStatisticsOutput.cs | 47 +++++++++++++++++++++++++++++++++++++++++++++++ netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/StorePerformanceCompletionInput.cs | 27 +++++++++++++++++++++++++++ netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/StorePerformanceCompletionOutput.cs | 37 +++++++++++++++++++++++++++++++++++++ netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/TechTeacherDailyStatisticsInput.cs | 32 ++++++++++++++++++++++++++++++++ netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/TechTeacherDailyStatisticsOutput.cs | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/TianwangGroupPerformanceCompletionInput.cs | 27 +++++++++++++++++++++++++++ netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/TianwangGroupPerformanceCompletionOutput.cs | 42 ++++++++++++++++++++++++++++++++++++++++++ netcore/src/Modularity/Extend/NCC.Extend.Interfaces/LqDailyReport/ILqDailyReportService.cs | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ netcore/src/Modularity/Extend/NCC.Extend/LqDailyReportService.cs | 921 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 15 files changed, 1499 insertions(+), 0 deletions(-) create mode 100644 netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/BusinessUnitPerformanceCompletionInput.cs create mode 100644 netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/BusinessUnitPerformanceCompletionOutput.cs create mode 100644 netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/ManagerPerformanceCompletionInput.cs create mode 100644 netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/ManagerPerformanceCompletionOutput.cs create mode 100644 netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/ManagerSummaryPerformanceCompletionOutput.cs create mode 100644 netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/StoreDailyStatisticsInput.cs create mode 100644 netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/StoreDailyStatisticsOutput.cs create mode 100644 netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/StorePerformanceCompletionInput.cs create mode 100644 netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/StorePerformanceCompletionOutput.cs create mode 100644 netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/TechTeacherDailyStatisticsInput.cs create mode 100644 netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/TechTeacherDailyStatisticsOutput.cs create mode 100644 netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/TianwangGroupPerformanceCompletionInput.cs create mode 100644 netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/TianwangGroupPerformanceCompletionOutput.cs create mode 100644 netcore/src/Modularity/Extend/NCC.Extend.Interfaces/LqDailyReport/ILqDailyReportService.cs create mode 100644 netcore/src/Modularity/Extend/NCC.Extend/LqDailyReportService.cs diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/BusinessUnitPerformanceCompletionInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/BusinessUnitPerformanceCompletionInput.cs new file mode 100644 index 0000000..341cca3 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/BusinessUnitPerformanceCompletionInput.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; + +namespace NCC.Extend.Entitys.Dto.LqDailyReport +{ + /// + /// 事业部业绩完成情况输入参数 + /// + public class BusinessUnitPerformanceCompletionInput + { + /// + /// 开始时间(可选,不传则默认为当月1号) + /// + public DateTime? StartTime { get; set; } + + /// + /// 结束时间(可选,不传则默认为今天) + /// + public DateTime? EndTime { get; set; } + + /// + /// 事业部ID列表(可选,为空则查询所有事业部) + /// + public List BusinessUnitIds { get; set; } + } +} + diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/BusinessUnitPerformanceCompletionOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/BusinessUnitPerformanceCompletionOutput.cs new file mode 100644 index 0000000..1209cba --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/BusinessUnitPerformanceCompletionOutput.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace NCC.Extend.Entitys.Dto.LqDailyReport +{ + /// + /// 事业部业绩完成情况输出结果 + /// + public class BusinessUnitPerformanceCompletionOutput + { + /// + /// 事业部ID + /// + public string BusinessUnitId { get; set; } + + /// + /// 事业部名称 + /// + public string BusinessUnitName { get; set; } + + /// + /// 目标业绩(管理门店的生命线总和) + /// + public decimal TargetPerformance { get; set; } + + /// + /// 完成业绩(管理门店的开单业绩总和) + /// + public decimal CompletedPerformance { get; set; } + + /// + /// 完成率(百分比) + /// + public decimal CompletionRate { get; set; } + + /// + /// 门店数量 + /// + public int StoreCount { get; set; } + } +} + diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/ManagerPerformanceCompletionInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/ManagerPerformanceCompletionInput.cs new file mode 100644 index 0000000..e8f12d2 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/ManagerPerformanceCompletionInput.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; + +namespace NCC.Extend.Entitys.Dto.LqDailyReport +{ + /// + /// 经理业绩完成情况输入参数 + /// + public class ManagerPerformanceCompletionInput + { + /// + /// 开始时间(可选,不传则默认为当月1号) + /// + public DateTime? StartTime { get; set; } + + /// + /// 结束时间(可选,不传则默认为今天) + /// + public DateTime? EndTime { get; set; } + + /// + /// 经理用户ID(可选) + /// + public string ManagerId { get; set; } + } +} + diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/ManagerPerformanceCompletionOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/ManagerPerformanceCompletionOutput.cs new file mode 100644 index 0000000..3f01cc4 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/ManagerPerformanceCompletionOutput.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; + +namespace NCC.Extend.Entitys.Dto.LqDailyReport +{ + /// + /// 经理业绩完成情况输出结果 + /// + public class ManagerPerformanceCompletionOutput + { + /// + /// 经理用户ID + /// + public string ManagerId { get; set; } + + /// + /// 经理姓名 + /// + public string ManagerName { get; set; } + + /// + /// 门店ID + /// + public string StoreId { get; set; } + + /// + /// 门店名称 + /// + public string StoreName { get; set; } + + /// + /// 目标业绩一阶段(smx1) + /// + public decimal Target1 { get; set; } + + /// + /// 目标业绩二阶段(smx2) + /// + public decimal? Target2 { get; set; } + + /// + /// 目标业绩三阶段(smx3) + /// + public decimal? Target3 { get; set; } + + /// + /// 完成业绩 + /// + public decimal CompletedPerformance { get; set; } + + /// + /// 完成率一阶段(%) + /// + public decimal CompletionRate1 { get; set; } + + /// + /// 完成率二阶段(%) + /// + public decimal? CompletionRate2 { get; set; } + + /// + /// 完成率三阶段(%) + /// + public decimal? CompletionRate3 { get; set; } + } +} + diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/ManagerSummaryPerformanceCompletionOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/ManagerSummaryPerformanceCompletionOutput.cs new file mode 100644 index 0000000..20b8242 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/ManagerSummaryPerformanceCompletionOutput.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; + +namespace NCC.Extend.Entitys.Dto.LqDailyReport +{ + /// + /// 经理汇总业绩完成情况输出结果 + /// + public class ManagerSummaryPerformanceCompletionOutput + { + /// + /// 经理用户ID + /// + public string ManagerId { get; set; } + + /// + /// 经理姓名 + /// + public string ManagerName { get; set; } + + /// + /// 总目标业绩一阶段 + /// + public decimal TotalTarget1 { get; set; } + + /// + /// 总目标业绩二阶段 + /// + public decimal TotalTarget2 { get; set; } + + /// + /// 总目标业绩三阶段 + /// + public decimal TotalTarget3 { get; set; } + + /// + /// 总完成业绩 + /// + public decimal TotalCompletedPerformance { get; set; } + + /// + /// 总完成率一阶段(%) + /// + public decimal TotalCompletionRate1 { get; set; } + + /// + /// 总完成率二阶段(%) + /// + public decimal TotalCompletionRate2 { get; set; } + + /// + /// 总完成率三阶段(%) + /// + public decimal TotalCompletionRate3 { get; set; } + + /// + /// 管理门店数量 + /// + public int StoreCount { get; set; } + } +} + diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/StoreDailyStatisticsInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/StoreDailyStatisticsInput.cs new file mode 100644 index 0000000..d25c47d --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/StoreDailyStatisticsInput.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; + +namespace NCC.Extend.Entitys.Dto.LqDailyReport +{ + /// + /// 门店每日统计输入参数 + /// + public class StoreDailyStatisticsInput + { + /// + /// 开始时间(可选,不传则默认为当月1号) + /// + public DateTime? StartTime { get; set; } + + /// + /// 结束时间(可选,不传则默认为今天) + /// + public DateTime? EndTime { get; set; } + + /// + /// 门店ID列表(可选,为空则查询所有门店) + /// + public List StoreIds { get; set; } + } +} + diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/StoreDailyStatisticsOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/StoreDailyStatisticsOutput.cs new file mode 100644 index 0000000..c1830e9 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/StoreDailyStatisticsOutput.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; + +namespace NCC.Extend.Entitys.Dto.LqDailyReport +{ + /// + /// 门店每日统计输出结果 + /// + public class StoreDailyStatisticsOutput + { + /// + /// 门店ID + /// + public string StoreId { get; set; } + + /// + /// 门店名称 + /// + public string StoreName { get; set; } + + /// + /// 在职员工数 + /// + public int EmployeeCount { get; set; } + + /// + /// 人头数(去重后的消费会员数) + /// + public int HeadCount { get; set; } + + /// + /// 人次(日度去重客户数) + /// + public int PersonCount { get; set; } + + /// + /// 项目数(消耗的项目总数) + /// + public int ProjectCount { get; set; } + + /// + /// 消耗业绩(总金额) + /// + public decimal ConsumePerformance { get; set; } + } +} + diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/StorePerformanceCompletionInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/StorePerformanceCompletionInput.cs new file mode 100644 index 0000000..2d833a2 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/StorePerformanceCompletionInput.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; + +namespace NCC.Extend.Entitys.Dto.LqDailyReport +{ + /// + /// 门店业绩完成情况输入参数 + /// + public class StorePerformanceCompletionInput + { + /// + /// 开始时间(可选,不传则默认为当月1号) + /// + public DateTime? StartTime { get; set; } + + /// + /// 结束时间(可选,不传则默认为今天) + /// + public DateTime? EndTime { get; set; } + + /// + /// 门店ID列表(可选,为空则查询所有门店) + /// + public List StoreIds { get; set; } + } +} + diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/StorePerformanceCompletionOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/StorePerformanceCompletionOutput.cs new file mode 100644 index 0000000..29b0936 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/StorePerformanceCompletionOutput.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; + +namespace NCC.Extend.Entitys.Dto.LqDailyReport +{ + /// + /// 门店业绩完成情况输出结果 + /// + public class StorePerformanceCompletionOutput + { + /// + /// 门店ID + /// + public string StoreId { get; set; } + + /// + /// 门店名称 + /// + public string StoreName { get; set; } + + /// + /// 目标业绩(生命线) + /// + public decimal TargetPerformance { get; set; } + + /// + /// 完成业绩(开单业绩) + /// + public decimal CompletedPerformance { get; set; } + + /// + /// 完成率(百分比) + /// + public decimal CompletionRate { get; set; } + } +} + diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/TechTeacherDailyStatisticsInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/TechTeacherDailyStatisticsInput.cs new file mode 100644 index 0000000..60c77b2 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/TechTeacherDailyStatisticsInput.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace NCC.Extend.Entitys.Dto.LqDailyReport +{ + /// + /// 科技部老师统计输入参数 + /// + public class TechTeacherDailyStatisticsInput + { + /// + /// 开始时间(可选,不传则默认为当月1号) + /// + public DateTime? StartTime { get; set; } + + /// + /// 结束时间(可选,不传则默认为今天) + /// + public DateTime? EndTime { get; set; } + + /// + /// 科技部ID(可选,不传则查询所有科技部) + /// + public string TechDepartmentId { get; set; } + + /// + /// 老师ID列表(可选) + /// + public List TeacherIds { get; set; } + } +} + diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/TechTeacherDailyStatisticsOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/TechTeacherDailyStatisticsOutput.cs new file mode 100644 index 0000000..ac3290a --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/TechTeacherDailyStatisticsOutput.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; + +namespace NCC.Extend.Entitys.Dto.LqDailyReport +{ + /// + /// 科技部老师统计输出结果 + /// + public class TechTeacherDailyStatisticsOutput + { + /// + /// 科技部ID + /// + public string TechDepartmentId { get; set; } + + /// + /// 科技部名称 + /// + public string TechDepartmentName { get; set; } + + /// + /// 老师ID + /// + public string TeacherId { get; set; } + + /// + /// 老师姓名 + /// + public string TeacherName { get; set; } + + /// + /// 见客数(不同客户数量) + /// + public int CustomerCount { get; set; } + + /// + /// 消耗项目数 + /// + public int ConsumeProjectCount { get; set; } + + /// + /// 消耗业绩 + /// + public decimal ConsumeAchievement { get; set; } + + /// + /// 开单业绩 + /// + public decimal OrderAchievement { get; set; } + } +} + diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/TianwangGroupPerformanceCompletionInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/TianwangGroupPerformanceCompletionInput.cs new file mode 100644 index 0000000..567f81b --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/TianwangGroupPerformanceCompletionInput.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; + +namespace NCC.Extend.Entitys.Dto.LqDailyReport +{ + /// + /// 天王团业绩完成情况输入参数 + /// + public class TianwangGroupPerformanceCompletionInput + { + /// + /// 开始时间(可选,不传则默认为当月1号) + /// + public DateTime? StartTime { get; set; } + + /// + /// 结束时间(可选,不传则默认为今天) + /// + public DateTime? EndTime { get; set; } + + /// + /// 天王团部门ID列表(可选,为空则查询所有天王团) + /// + public List DepartmentIds { get; set; } + } +} + diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/TianwangGroupPerformanceCompletionOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/TianwangGroupPerformanceCompletionOutput.cs new file mode 100644 index 0000000..b033c17 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqDailyReport/TianwangGroupPerformanceCompletionOutput.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace NCC.Extend.Entitys.Dto.LqDailyReport +{ + /// + /// 天王团业绩完成情况输出结果 + /// + public class TianwangGroupPerformanceCompletionOutput + { + /// + /// 部门ID + /// + public string DepartmentId { get; set; } + + /// + /// 部门名称 + /// + public string DepartmentName { get; set; } + + /// + /// 目标业绩(管理门店的生命线总和) + /// + public decimal TargetPerformance { get; set; } + + /// + /// 完成业绩(管理门店的开单业绩总和) + /// + public decimal CompletedPerformance { get; set; } + + /// + /// 完成率(百分比) + /// + public decimal CompletionRate { get; set; } + + /// + /// 门店数量 + /// + public int StoreCount { get; set; } + } +} + diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Interfaces/LqDailyReport/ILqDailyReportService.cs b/netcore/src/Modularity/Extend/NCC.Extend.Interfaces/LqDailyReport/ILqDailyReportService.cs new file mode 100644 index 0000000..2ef49a6 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Interfaces/LqDailyReport/ILqDailyReportService.cs @@ -0,0 +1,62 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using NCC.Extend.Entitys.Dto.LqDailyReport; + +namespace NCC.Extend.Interfaces.LqDailyReport +{ + /// + /// 日报服务接口 + /// + public interface ILqDailyReportService + { + /// + /// 获取门店每日运营统计数据 + /// + /// 查询参数 + /// 门店统计数据列表 + Task> GetStoreDailyStatistics(StoreDailyStatisticsInput input); + + /// + /// 获取门店业绩完成情况 + /// + /// 查询参数 + /// 门店业绩完成情况列表 + Task> GetStorePerformanceCompletion(StorePerformanceCompletionInput input); + + /// + /// 获取事业部业绩完成情况 + /// + /// 查询参数 + /// 事业部业绩完成情况列表 + Task> GetBusinessUnitPerformanceCompletion(BusinessUnitPerformanceCompletionInput input); + + /// + /// 获取天王团业绩完成情况 + /// + /// 查询参数 + /// 天王团业绩完成情况列表 + Task> GetTianwangGroupPerformanceCompletion(TianwangGroupPerformanceCompletionInput input); + + /// + /// 获取经理业绩完成情况 + /// + /// 查询参数 + /// 经理业绩完成情况列表 + Task> GetManagerPerformanceCompletion(ManagerPerformanceCompletionInput input); + + /// + /// 获取经理汇总业绩完成情况 + /// + /// 查询参数 + /// 经理汇总业绩完成情况列表 + Task> GetManagerSummaryPerformanceCompletion(ManagerPerformanceCompletionInput input); + + /// + /// 获取科技部老师日报统计 + /// + /// 查询参数 + /// 科技部老师统计列表 + Task> GetTechTeacherDailyStatistics(TechTeacherDailyStatisticsInput input); + } +} + diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqDailyReportService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqDailyReportService.cs new file mode 100644 index 0000000..3f1b0a9 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqDailyReportService.cs @@ -0,0 +1,921 @@ +using NCC.Common.Core.Manager; +using NCC.Common.Enum; +using NCC.Common.Extension; +using NCC.Common.Filter; +using NCC.Dependency; +using NCC.DynamicApiController; +using NCC.FriendlyException; +using NCC.Extend.Interfaces.LqDailyReport; +using Mapster; +using Microsoft.AspNetCore.Mvc; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Yitter.IdGenerator; +using NCC.Common.Helper; +using NCC.JsonSerialization; +using NCC.Common.Model.NPOI; +using NCC.Common.Configuration; +using NCC.DataEncryption; +using NCC.ClayObject; +using NCC.Extend.Entitys.Dto.LqDailyReport; +using NCC.Extend.Entitys.lq_kd_kdjlb; + +namespace NCC.Extend +{ + /// + /// 日报服务 + /// + [ApiDescriptionSettings(Tag = "绿纤日报服务", Name = "LqDailyReport", Order = 200)] + [Route("api/Extend/[controller]")] + public class LqDailyReportService : ILqDailyReportService, IDynamicApiController, ITransient + { + private readonly ISqlSugarRepository _repository; + private readonly SqlSugarScope _db; + private readonly IUserManager _userManager; + + /// + /// 初始化一个类型的新实例 + /// + public LqDailyReportService( + ISqlSugarRepository repository, + IUserManager userManager) + { + _repository = repository; + _db = _repository.Context; + _userManager = userManager; + } + + /// + /// 获取时间范围,如果未传入则默认为本月 + /// + private (DateTime startDate, DateTime endDate) GetTimeRange(DateTime? startTime, DateTime? endTime) + { + var now = DateTime.Now; + var start = startTime ?? new DateTime(now.Year, now.Month, 1); + var end = endTime ?? now; + + // 确保开始时间不晚于结束时间 + if (start > end) + { + var temp = start; + start = end; + end = temp; + } + + return (start, end); + } + + #region 获取门店每日运营统计数据 + /// + /// 获取门店每日运营统计数据 + /// + /// + /// 根据指定时间范围统计各门店的运营数据,包括在职员工数、人头数、人次、项目数、消耗业绩等信息 + /// + /// 示例请求: + /// ```json + /// { + /// "startTime": "2025-10-01", + /// "endTime": "2025-10-27", + /// "storeIds": ["门店ID1", "门店ID2"] + /// } + /// ``` + /// + /// 参数说明: + /// - startTime: 开始时间,可选,不传则默认为当月1号 + /// - endTime: 结束时间,可选,不传则默认为今天 + /// - storeIds: 门店ID列表,可选,不传则查询所有门店 + /// + /// 返回说明: + /// - StoreId: 门店ID + /// - StoreName: 门店名称 + /// - EmployeeCount: 在职员工数(F_EnabledMark=1且有岗位) + /// - HeadCount: 人头数(去重后的消费会员数) + /// - PersonCount: 人次(日度去重客户数,同一天同一客户只算一次) + /// - ProjectCount: 项目数(消耗的项目总数) + /// - ConsumePerformance: 消耗业绩(总金额) + /// + /// 查询参数 + /// 门店统计数据列表 + /// 成功返回门店统计列表 + /// 日期格式错误或参数无效 + /// 服务器内部错误 + [HttpPost("get-store-daily-statistics")] + public async Task> GetStoreDailyStatistics(StoreDailyStatisticsInput input) + { + // 获取时间范围 + var (startDate, endDate) = GetTimeRange(input.StartTime, input.EndTime); + + // 构建门店过滤条件 + var storeFilter = ""; + if (input.StoreIds != null && input.StoreIds.Any()) + { + var storeIdsStr = string.Join("','", input.StoreIds); + storeFilter = $"AND consume.Md IN ('{storeIdsStr}')"; + } + + // SQL查询:获取门店每日运营数据 + var sql = $@" + SELECT + consume.Md as StoreId, + MAX(store.dm) as StoreName, + -- 在职员工数 + COALESCE(( + SELECT COUNT(DISTINCT u.F_Id) + FROM BASE_USER u + WHERE u.F_MDID = consume.Md + AND u.F_EnabledMark = 1 + AND (u.F_DeleteMark IS NULL OR u.F_DeleteMark = 0) + AND u.F_GW IS NOT NULL + ), 0) as EmployeeCount, + -- 人头数(去重后的消费会员数) + COALESCE(COUNT(DISTINCT consume.Hy), 0) as HeadCount, + -- 人次(日度去重客户数) + COALESCE(COUNT(DISTINCT CONCAT(consume.Hy, '-', DATE(consume.Hksj))), 0) as PersonCount, + -- 项目数(消耗的项目总数) + COALESCE(SUM(project.F_ProjectNumber), 0) as ProjectCount, + -- 消耗业绩(总金额) + COALESCE(SUM(project.F_TotalPrice), 0) as ConsumePerformance + FROM lq_xh_hyhk consume + LEFT JOIN lq_mdxx store ON consume.Md = store.F_Id + LEFT JOIN lq_xh_pxmx project ON consume.F_Id = project.F_ConsumeInfoId AND project.F_IsEffective = 1 + WHERE consume.F_IsEffective = 1 + AND DATE(consume.Hksj) >= '{startDate:yyyy-MM-dd}' + AND DATE(consume.Hksj) <= '{endDate:yyyy-MM-dd}' + {storeFilter} + GROUP BY consume.Md + ORDER BY ConsumePerformance DESC"; + + var result = await _db.Ado.SqlQueryAsync(sql); + + var outputList = result.Select(item => new StoreDailyStatisticsOutput + { + StoreId = item.StoreId, + StoreName = item.StoreName, + EmployeeCount = Convert.ToInt32(item.EmployeeCount), + HeadCount = Convert.ToInt32(item.HeadCount), + PersonCount = Convert.ToInt32(item.PersonCount), + ProjectCount = Convert.ToInt32(item.ProjectCount), + ConsumePerformance = Convert.ToDecimal(item.ConsumePerformance) + }).ToList(); + return outputList; + } + #endregion + + #region 获取门店业绩完成情况 + /// + /// 获取门店业绩完成情况 + /// + /// + /// 根据指定日期统计各门店的业绩完成情况,包括目标业绩、完成业绩、完成率 + /// + /// 示例请求: + /// ```json + /// { + /// "startTime": "2025-10-01", + /// "endTime": "2025-10-22", + /// "storeIds": ["门店ID1", "门店ID2"] + /// } + /// ``` + /// + /// 参数说明: + /// - startTime: 开始时间,可选,不传则默认为当月1号 + /// - endTime: 结束时间,可选,不传则默认为今天 + /// - storeIds: 门店ID列表,可选,不传则查询所有门店 + /// + /// 返回说明: + /// - StoreId: 门店ID + /// - StoreName: 门店名称 + /// - TargetPerformance: 目标业绩(生命线,来自门店信息表) + /// - CompletedPerformance: 完成业绩(当月1号至统计日期的开单业绩总和) + /// - CompletionRate: 完成率(百分比,CompletedPerformance / TargetPerformance * 100) + /// + /// 查询参数 + /// 门店业绩完成情况列表 + /// 成功返回门店业绩完成情况列表 + /// 日期格式错误或参数无效 + /// 服务器内部错误 + [HttpPost("get-store-performance-completion")] + public async Task> GetStorePerformanceCompletion(StorePerformanceCompletionInput input) + { + // 获取时间范围 + var (startDate, endDate) = GetTimeRange(input.StartTime, input.EndTime); + + // 构建门店过滤条件 + var storeFilter = ""; + if (input.StoreIds != null && input.StoreIds.Any()) + { + var storeIdsStr = string.Join("','", input.StoreIds); + storeFilter = $"AND store.F_Id IN ('{storeIdsStr}')"; + } + + // SQL查询:获取门店业绩完成情况 + var sql = $@" + SELECT + store.F_Id as StoreId, + store.dm as StoreName, + -- 目标业绩(生命线) + COALESCE(store.xsyj, 0) as TargetPerformance, + -- 完成业绩(开单业绩总和) + COALESCE(( + SELECT SUM(billing.sfyj) + FROM lq_kd_kdjlb billing + WHERE billing.djmd = store.F_Id + AND billing.F_IsEffective = 1 + AND DATE(billing.kdrq) >= '{startDate:yyyy-MM-dd}' + AND DATE(billing.kdrq) <= '{endDate:yyyy-MM-dd}' + ), 0) as CompletedPerformance + FROM lq_mdxx store + WHERE 1=1 {storeFilter} + ORDER BY CompletedPerformance DESC"; + + var result = await _db.Ado.SqlQueryAsync(sql); + + var outputList = result.Select(item => + { + var targetPerformance = Convert.ToDecimal(item.TargetPerformance); + var completedPerformance = Convert.ToDecimal(item.CompletedPerformance); + var completionRate = targetPerformance > 0 ? (completedPerformance / targetPerformance * 100m) : 0m; + + return new StorePerformanceCompletionOutput + { + StoreId = item.StoreId, + StoreName = item.StoreName, + TargetPerformance = targetPerformance, + CompletedPerformance = completedPerformance, + CompletionRate = decimal.Round(completionRate, 2) + }; + }).ToList(); + + return outputList; + } + #endregion + + #region 获取事业部业绩完成情况 + /// + /// 获取事业部业绩完成情况 + /// + /// + /// 根据指定日期统计各事业部的业绩完成情况,包括目标业绩、完成业绩、完成率 + /// + /// 示例请求: + /// ```json + /// { + /// "startTime": "2025-10-01", + /// "endTime": "2025-10-22", + /// "businessUnitIds": ["事业部ID1", "事业部ID2"] + /// } + /// ``` + /// + /// 参数说明: + /// - startTime: 开始时间,可选,不传则默认为当月1号 + /// - endTime: 结束时间,可选,不传则默认为今天 + /// - businessUnitIds: 事业部ID列表,可选,不传则查询所有事业部 + /// + /// 返回说明: + /// - BusinessUnitId: 事业部ID + /// - BusinessUnitName: 事业部名称 + /// - TargetPerformance: 目标业绩(管理门店的生命线总和) + /// - CompletedPerformance: 完成业绩(指定时间范围内的开单业绩总和) + /// - CompletionRate: 完成率(百分比,CompletedPerformance / TargetPerformance * 100) + /// - StoreCount: 门店数量 + /// + /// 查询参数 + /// 事业部业绩完成情况列表 + /// 成功返回事业部业绩完成情况列表 + /// 日期格式错误或参数无效 + /// 服务器内部错误 + [HttpPost("get-business-unit-performance-completion")] + public async Task> GetBusinessUnitPerformanceCompletion(BusinessUnitPerformanceCompletionInput input) + { + // 获取时间范围 + var (startDate, endDate) = GetTimeRange(input.StartTime, input.EndTime); + + // 构建事业部过滤条件 + var businessUnitFilter = ""; + if (input.BusinessUnitIds != null && input.BusinessUnitIds.Any()) + { + var filterUnitIdsStr = string.Join("','", input.BusinessUnitIds); + businessUnitFilter = $"AND o.F_Id IN ('{filterUnitIdsStr}')"; + } + + // 分步查询,提高效率 + // 第一步:获取事业部列表及目标业绩(只统计事业一部到事业六部) + var businessUnitSql = $@" + SELECT + o.F_Id as BusinessUnitId, + o.F_FullName as BusinessUnitName, + COALESCE(SUM(store.xsyj), 0) as TargetPerformance, + COUNT(DISTINCT store.F_Id) as StoreCount + FROM base_organize o + LEFT JOIN lq_mdxx store ON store.syb = o.F_Id + WHERE o.F_Category = 'department' + AND (o.F_DeleteMark IS NULL OR o.F_DeleteMark != 1) + AND o.F_FullName IN ('事业一部', '事业二部', '事业三部', '事业四部', '事业五部', '事业六部') + {businessUnitFilter} + GROUP BY o.F_Id, o.F_FullName"; + + var businessUnits = await _db.Ado.SqlQueryAsync(businessUnitSql); + + if (businessUnits == null || !businessUnits.Any()) + { + return new List(); + } + + var businessUnitDict = new Dictionary(); + + foreach (var unit in businessUnits) + { + businessUnitDict[unit.BusinessUnitId.ToString()] = new BusinessUnitPerformanceCompletionOutput + { + BusinessUnitId = unit.BusinessUnitId.ToString(), + BusinessUnitName = unit.BusinessUnitName.ToString(), + TargetPerformance = Convert.ToDecimal(unit.TargetPerformance), + CompletedPerformance = 0, + CompletionRate = 0, + StoreCount = Convert.ToInt32(unit.StoreCount) + }; + } + + // 第二步:统计各事业部的完成业绩 + var businessUnitIds = businessUnitDict.Keys.ToList(); + var unitIdsStr = string.Join("','", businessUnitIds); + + var completedPerformanceSql = $@" + SELECT + store.syb as BusinessUnitId, + COALESCE(SUM(billing.sfyj), 0) as CompletedPerformance + FROM lq_kd_kdjlb billing + INNER JOIN lq_mdxx store ON billing.djmd = store.F_Id + INNER JOIN base_organize o ON store.syb = o.F_Id + WHERE billing.F_IsEffective = 1 + AND o.F_Category = 'department' + AND (o.F_DeleteMark IS NULL OR o.F_DeleteMark != 1) + AND o.F_FullName IN ('事业一部', '事业二部', '事业三部', '事业四部', '事业五部', '事业六部') + AND DATE(billing.kdrq) >= '{startDate:yyyy-MM-dd}' + AND DATE(billing.kdrq) <= '{endDate:yyyy-MM-dd}' + AND store.syb IN ('{unitIdsStr}') + GROUP BY store.syb"; + + var completedPerformanceData = await _db.Ado.SqlQueryAsync(completedPerformanceSql); + + // 第三步:合并数据并计算完成率 + foreach (var item in completedPerformanceData) + { + var businessUnitId = item.BusinessUnitId.ToString(); + if (businessUnitDict.ContainsKey(businessUnitId)) + { + var completedPerformance = Convert.ToDecimal(item.CompletedPerformance); + var unit = businessUnitDict[businessUnitId]; + unit.CompletedPerformance = completedPerformance; + + var completionRate = unit.TargetPerformance > 0 + ? (completedPerformance / unit.TargetPerformance * 100m) + : 0m; + unit.CompletionRate = decimal.Round(completionRate, 2); + } + } + + var outputList = businessUnitDict.Values + .OrderByDescending(x => x.CompletedPerformance) + .ToList(); + + return outputList; + } + #endregion + + #region 获取天王团业绩完成情况 + /// + /// 获取天王团业绩完成情况 + /// + /// + /// 根据指定日期统计各天王团的业绩完成情况,包括目标业绩、完成业绩、完成率 + /// + /// 示例请求: + /// ```json + /// { + /// "startTime": "2025-10-01", + /// "endTime": "2025-10-22", + /// "departmentIds": ["部门ID1", "部门ID2"] + /// } + /// ``` + /// + /// 参数说明: + /// - startTime: 开始时间,可选,不传则默认为当月1号 + /// - endTime: 结束时间,可选,不传则默认为今天 + /// - departmentIds: 天王团部门ID列表,可选,不传则查询所有天王团 + /// + /// 返回说明: + /// - DepartmentId: 部门ID + /// - DepartmentName: 部门名称(教育一部、教育二部、科技一部、科技二部、大项目一部、大项目二部) + /// - TargetPerformance: 目标业绩(管理门店的生命线总和) + /// - CompletedPerformance: 完成业绩(指定时间范围内的开单业绩总和) + /// - CompletionRate: 完成率(百分比,CompletedPerformance / TargetPerformance * 100) + /// - StoreCount: 门店数量 + /// + /// 查询参数 + /// 天王团业绩完成情况列表 + /// 成功返回天王团业绩完成情况列表 + /// 日期格式错误或参数无效 + /// 服务器内部错误 + [HttpPost("get-tianwang-group-performance-completion")] + public async Task> GetTianwangGroupPerformanceCompletion(TianwangGroupPerformanceCompletionInput input) + { + // 获取时间范围 + var (startDate, endDate) = GetTimeRange(input.StartTime, input.EndTime); + + // 构建部门过滤条件 + var departmentFilter = ""; + if (input.DepartmentIds != null && input.DepartmentIds.Any()) + { + var filterDeptIdsStr = string.Join("','", input.DepartmentIds); + departmentFilter = $"AND o.F_Id IN ('{filterDeptIdsStr}')"; + } + + // 天王团部门信息(字段名和部门名称的映射) + var tianwangDepartments = new Dictionary + { + { "jyb", ("jyb", new[] { "教育一部", "教育二部" }) }, + { "kjb", ("kjb", new[] { "科技一部", "科技二部" }) }, + { "dxmb", ("dxmb", new[] { "大项目一部", "大项目二部" }) } + }; + + // 分步查询,提高效率 + var departmentDict = new Dictionary(); + var allDeptNames = new List(); + + // 循环查询每个天王团类型 + foreach (var deptType in tianwangDepartments) + { + var deptNamesStr = string.Join("','", deptType.Value.departmentNames); + allDeptNames.AddRange(deptType.Value.departmentNames); + + // 第一步:获取天王团列表及目标业绩 + var departmentSql = $@" + SELECT + o.F_Id as DepartmentId, + o.F_FullName as DepartmentName, + COALESCE(SUM(store.xsyj), 0) as TargetPerformance, + COUNT(DISTINCT store.F_Id) as StoreCount + FROM base_organize o + LEFT JOIN lq_mdxx store ON store.{deptType.Key} = o.F_Id + WHERE o.F_Category = 'department' + AND (o.F_DeleteMark IS NULL OR o.F_DeleteMark != 1) + AND o.F_FullName IN ('{deptNamesStr}') + {departmentFilter} + GROUP BY o.F_Id, o.F_FullName"; + + var departments = await _db.Ado.SqlQueryAsync(departmentSql); + + foreach (var dept in departments ?? Enumerable.Empty()) + { + if (!departmentDict.ContainsKey(dept.DepartmentId.ToString())) + { + departmentDict[dept.DepartmentId.ToString()] = new TianwangGroupPerformanceCompletionOutput + { + DepartmentId = dept.DepartmentId.ToString(), + DepartmentName = dept.DepartmentName.ToString(), + TargetPerformance = Convert.ToDecimal(dept.TargetPerformance), + CompletedPerformance = 0, + CompletionRate = 0, + StoreCount = Convert.ToInt32(dept.StoreCount) + }; + } + } + } + + if (!departmentDict.Any()) + { + return new List(); + } + + // 第二步:统计各天王团的完成业绩(分类型统计) + var completedPerformanceDataList = new List(); + + foreach (var deptType in tianwangDepartments) + { + var deptIdsStrForQuery = string.Join("','", departmentDict.Keys); + + var completedPerformanceSql = $@" + SELECT + o.F_Id as DepartmentId, + COALESCE(SUM(billing.sfyj), 0) as CompletedPerformance + FROM lq_kd_kdjlb billing + INNER JOIN lq_mdxx store ON billing.djmd = store.F_Id + INNER JOIN base_organize o ON store.{deptType.Key} = o.F_Id + WHERE billing.F_IsEffective = 1 + AND o.F_Category = 'department' + AND (o.F_DeleteMark IS NULL OR o.F_DeleteMark != 1) + AND DATE(billing.kdrq) >= '{startDate:yyyy-MM-dd}' + AND DATE(billing.kdrq) <= '{endDate:yyyy-MM-dd}' + AND o.F_Id IN ('{deptIdsStrForQuery}') + GROUP BY o.F_Id"; + + var completedPerformanceData = await _db.Ado.SqlQueryAsync(completedPerformanceSql); + if (completedPerformanceData != null) + { + completedPerformanceDataList.AddRange(completedPerformanceData); + } + } + + // 第三步:合并数据并计算完成率(按部门ID去重累加) + var departmentPerformanceDict = new Dictionary(); + foreach (var item in completedPerformanceDataList) + { + var departmentId = item.DepartmentId.ToString(); + var completedPerformance = Convert.ToDecimal(item.CompletedPerformance); + + if (departmentPerformanceDict.ContainsKey(departmentId)) + { + departmentPerformanceDict[departmentId] += completedPerformance; + } + else + { + departmentPerformanceDict[departmentId] = completedPerformance; + } + } + + // 计算完成率 + foreach (var kvp in departmentPerformanceDict) + { + if (departmentDict.ContainsKey(kvp.Key)) + { + var dept = departmentDict[kvp.Key]; + dept.CompletedPerformance = kvp.Value; + + var completionRate = dept.TargetPerformance > 0 + ? (kvp.Value / dept.TargetPerformance * 100m) + : 0m; + dept.CompletionRate = decimal.Round(completionRate, 2); + } + } + + var outputList = departmentDict.Values + .OrderByDescending(x => x.CompletedPerformance) + .ToList(); + + return outputList; + } + #endregion + + #region 获取经理业绩完成情况 + /// + /// 获取经理业绩完成情况 + /// + /// + /// 根据指定日期统计各经理在各门店的业绩完成情况,包括目标业绩(三个阶段)、完成业绩、完成率 + /// + /// 示例请求: + /// ```json + /// { + /// "startTime": "2025-10-01", + /// "endTime": "2025-10-22", + /// "managerId": "经理ID" + /// } + /// ``` + /// + /// 参数说明: + /// - startTime: 开始时间,可选,不传则默认为当月1号 + /// - endTime: 结束时间,可选,不传则默认为今天 + /// - managerId: 经理用户ID,可选,不传则查询所有经理 + /// + /// 返回说明: + /// - ManagerId: 经理用户ID + /// - ManagerName: 经理姓名 + /// - StoreId/StoreName: 门店信息 + /// - Target1/2/3: 目标业绩一/二/三阶段(smx1/smx2/smx3) + /// - CompletedPerformance: 完成业绩(指定时间范围内的开单业绩总和) + /// - CompletionRate1/2/3: 完成率各阶段(百分比) + /// + /// 查询参数 + /// 经理业绩完成情况列表 + /// 成功返回经理业绩完成情况列表 + /// 日期格式错误或参数无效 + /// 服务器内部错误 + [HttpPost("get-manager-performance-completion")] + public async Task> GetManagerPerformanceCompletion(ManagerPerformanceCompletionInput input) + { + // 获取时间范围 + var (startDate, endDate) = GetTimeRange(input.StartTime, input.EndTime); + + // 构建经理过滤条件 + var managerFilter = ""; + if (!string.IsNullOrWhiteSpace(input.ManagerId)) + { + managerFilter = $"AND target.zjl_userid = '{input.ManagerId}'"; + } + + // SQL查询:获取经理在各门店的目标业绩和完成业绩 + var sql = $@" + SELECT + target.zjl_userid as ManagerId, + u.F_RealName as ManagerName, + target.md_id as StoreId, + store.dm as StoreName, + target.smx1 as Target1, + target.smx2 as Target2, + target.smx3 as Target3, + -- 完成业绩 + COALESCE(( + SELECT SUM(billing.sfyj) + FROM lq_kd_kdjlb billing + WHERE billing.djmd = target.md_id + AND billing.F_IsEffective = 1 + AND DATE(billing.kdrq) >= '{startDate:yyyy-MM-dd}' + AND DATE(billing.kdrq) <= '{endDate:yyyy-MM-dd}' + ), 0) as CompletedPerformance + FROM lq_zjl_mdsmxsz target + INNER JOIN BASE_USER u ON target.zjl_userid = u.F_Id + INNER JOIN lq_mdxx store ON target.md_id = store.F_Id + WHERE target.deletemark = 0 + {managerFilter} + ORDER BY target.zjl_userid, store.dm"; + + var result = await _db.Ado.SqlQueryAsync(sql); + + var outputList = result.Select(item => + { + var target1 = Convert.ToDecimal(item.Target1); + var target2 = item.Target2 != null ? Convert.ToDecimal(item.Target2) : 0; + var target3 = item.Target3 != null ? Convert.ToDecimal(item.Target3) : 0; + var completed = Convert.ToDecimal(item.CompletedPerformance); + + var rate1 = target1 > 0 ? (completed / target1 * 100m) : 0m; + var rate2 = target2 > 0 ? (completed / target2 * 100m) : 0m; + var rate3 = target3 > 0 ? (completed / target3 * 100m) : 0m; + + return new ManagerPerformanceCompletionOutput + { + ManagerId = item.ManagerId.ToString(), + ManagerName = item.ManagerName.ToString(), + StoreId = item.StoreId.ToString(), + StoreName = item.StoreName.ToString(), + Target1 = target1, + Target2 = target2 > 0 ? target2 : (decimal?)null, + Target3 = target3 > 0 ? target3 : (decimal?)null, + CompletedPerformance = completed, + CompletionRate1 = decimal.Round(rate1, 2), + CompletionRate2 = target2 > 0 ? decimal.Round(rate2, 2) : (decimal?)null, + CompletionRate3 = target3 > 0 ? decimal.Round(rate3, 2) : (decimal?)null + }; + }).ToList(); + + return outputList; + } + + /// + /// 获取经理汇总业绩完成情况 + /// + /// + /// 根据指定日期统计各经理的总业绩完成情况,汇总所有管理门店的数据 + /// + /// 示例请求: + /// ```json + /// { + /// "startTime": "2025-10-01", + /// "endTime": "2025-10-22", + /// "managerId": "经理ID" + /// } + /// ``` + /// + /// 参数说明: + /// - startTime: 开始时间,可选,不传则默认为当月1号 + /// - endTime: 结束时间,可选,不传则默认为今天 + /// - managerId: 经理用户ID,可选,不传则查询所有经理 + /// + /// 返回说明: + /// - ManagerId: 经理用户ID + /// - ManagerName: 经理姓名 + /// - TotalTarget1/2/3: 总目标业绩一/二/三阶段 + /// - TotalCompletedPerformance: 总完成业绩(指定时间范围内的开单业绩总和) + /// - TotalCompletionRate1/2/3: 总完成率各阶段 + /// - StoreCount: 管理门店数量 + /// + /// 查询参数 + /// 经理汇总业绩完成情况列表 + /// 成功返回经理汇总业绩完成情况列表 + /// 日期格式错误或参数无效 + /// 服务器内部错误 + [HttpPost("get-manager-summary-performance-completion")] + public async Task> GetManagerSummaryPerformanceCompletion(ManagerPerformanceCompletionInput input) + { + // 获取时间范围 + var (startDate, endDate) = GetTimeRange(input.StartTime, input.EndTime); + + // 构建经理过滤条件 + var managerFilter = ""; + if (!string.IsNullOrWhiteSpace(input.ManagerId)) + { + managerFilter = $"AND target.zjl_userid = '{input.ManagerId}'"; + } + + // SQL查询:获取经理汇总业绩 + var sql = $@" + SELECT + target.zjl_userid as ManagerId, + u.F_RealName as ManagerName, + SUM(target.smx1) as TotalTarget1, + COALESCE(SUM(target.smx2), 0) as TotalTarget2, + COALESCE(SUM(target.smx3), 0) as TotalTarget3, + COUNT(DISTINCT target.md_id) as StoreCount, + -- 总完成业绩 + SUM(COALESCE(( + SELECT SUM(billing.sfyj) + FROM lq_kd_kdjlb billing + WHERE billing.djmd = target.md_id + AND billing.F_IsEffective = 1 + AND DATE(billing.kdrq) >= '{startDate:yyyy-MM-dd}' + AND DATE(billing.kdrq) <= '{endDate:yyyy-MM-dd}' + ), 0)) as TotalCompletedPerformance + FROM lq_zjl_mdsmxsz target + INNER JOIN BASE_USER u ON target.zjl_userid = u.F_Id + INNER JOIN lq_mdxx store ON target.md_id = store.F_Id + WHERE target.deletemark = 0 + {managerFilter} + GROUP BY target.zjl_userid, u.F_RealName + ORDER BY TotalCompletedPerformance DESC"; + + var result = await _db.Ado.SqlQueryAsync(sql); + + var outputList = result.Select(item => + { + var totalTarget1 = Convert.ToDecimal(item.TotalTarget1); + var totalTarget2 = Convert.ToDecimal(item.TotalTarget2); + var totalTarget3 = Convert.ToDecimal(item.TotalTarget3); + var totalCompleted = Convert.ToDecimal(item.TotalCompletedPerformance); + + var rate1 = totalTarget1 > 0 ? (totalCompleted / totalTarget1 * 100m) : 0m; + var rate2 = totalTarget2 > 0 ? (totalCompleted / totalTarget2 * 100m) : 0m; + var rate3 = totalTarget3 > 0 ? (totalCompleted / totalTarget3 * 100m) : 0m; + + return new ManagerSummaryPerformanceCompletionOutput + { + ManagerId = item.ManagerId.ToString(), + ManagerName = item.ManagerName.ToString(), + TotalTarget1 = totalTarget1, + TotalTarget2 = totalTarget2, + TotalTarget3 = totalTarget3, + TotalCompletedPerformance = totalCompleted, + TotalCompletionRate1 = decimal.Round(rate1, 2), + TotalCompletionRate2 = decimal.Round(rate2, 2), + TotalCompletionRate3 = decimal.Round(rate3, 2), + StoreCount = Convert.ToInt32(item.StoreCount) + }; + }).ToList(); + + return outputList; + } + #endregion + + #region 获取科技部老师统计 + /// + /// 获取科技部老师统计 + /// + /// + /// 根据指定日期统计科技部老师的业绩情况,包括见客数、消耗项目数、消耗业绩、开单业绩 + /// + /// 示例请求: + /// ```json + /// { + /// "startTime": "2025-10-01", + /// "endTime": "2025-10-22", + /// "techDepartmentId": "科技部ID", + /// "teacherIds": ["老师ID1", "老师ID2"] + /// } + /// ``` + /// + /// 参数说明: + /// - startTime: 开始时间,可选,不传则默认为当月1号 + /// - endTime: 结束时间,可选,不传则默认为今天 + /// - techDepartmentId: 科技部ID,可选,不传则查询所有科技部 + /// - teacherIds: 老师ID列表,可选 + /// + /// 返回说明: + /// - TechDepartmentId: 科技部ID + /// - TechDepartmentName: 科技部名称 + /// - TeacherId: 老师ID + /// - TeacherName: 老师姓名 + /// - CustomerCount: 见客数(不同客户数量) + /// - ConsumeProjectCount: 消耗项目数 + /// - ConsumeAchievement: 消耗业绩 + /// - OrderAchievement: 开单业绩 + /// + /// 查询参数 + /// 科技部老师统计列表 + /// 成功返回科技部老师统计列表 + /// 日期格式错误或参数无效 + /// 服务器内部错误 + [HttpPost("get-tech-teacher-daily-statistics")] + public async Task> GetTechTeacherDailyStatistics(TechTeacherDailyStatisticsInput input) + { + // 获取时间范围 + var (startDate, endDate) = GetTimeRange(input.StartTime, input.EndTime); + + // 构建过滤条件 + var techFilter = ""; + if (!string.IsNullOrWhiteSpace(input.TechDepartmentId)) + { + techFilter = $"AND techDept.F_Id = '{input.TechDepartmentId}'"; + } + + var teacherFilter = ""; + if (input.TeacherIds != null && input.TeacherIds.Any()) + { + var teacherIdsStr = string.Join("','", input.TeacherIds); + teacherFilter = $"AND consume.kjbls IN ('{teacherIdsStr}')"; + } + + var teacherFilterForOrder = ""; + if (input.TeacherIds != null && input.TeacherIds.Any()) + { + var teacherIdsStr = string.Join("','", input.TeacherIds); + teacherFilterForOrder = $"AND ord.kjbls IN ('{teacherIdsStr}')"; + } + + // SQL查询:统计科技部老师的消耗业绩、见客数、项目数 + var consumeSql = $@" + SELECT + techDept.F_Id as TechDepartmentId, + techDept.F_FullName as TechDepartmentName, + consume.kjbls as TeacherId, + consume.kjblsxm as TeacherName, + COUNT(DISTINCT hyhk.hy) as CustomerCount, + SUM(consume.F_hdpxNumber) as ConsumeProjectCount, + SUM(consume.kjblsyj) as ConsumeAchievement + FROM lq_xh_kjbsyj consume + INNER JOIN lq_xh_hyhk hyhk ON consume.glkdbh = hyhk.F_Id + INNER JOIN lq_mdxx store ON hyhk.md = store.F_Id + LEFT JOIN base_organize techDept ON store.kjb = techDept.F_Id + WHERE consume.F_IsEffective = 1 + AND hyhk.F_IsEffective = 1 + AND DATE(hyhk.hksj) >= '{startDate:yyyy-MM-dd}' + AND DATE(hyhk.hksj) <= '{endDate:yyyy-MM-dd}' + {techFilter} + {teacherFilter} + GROUP BY techDept.F_Id, techDept.F_FullName, consume.kjbls, consume.kjblsxm"; + + var consumeResult = await _db.Ado.SqlQueryAsync(consumeSql); + + // 查询开单业绩 + var orderSql = $@" + SELECT + techDept.F_Id as TechDepartmentId, + ord.kjbls as TeacherId, + SUM(ord.kjblsyj) as OrderAchievement + FROM lq_kd_kjbsyj ord + INNER JOIN lq_kd_kdjlb kdjlb ON ord.glkdbh = kdjlb.F_Id + INNER JOIN lq_mdxx store ON kdjlb.djmd = store.F_Id + LEFT JOIN base_organize techDept ON store.kjb = techDept.F_Id + WHERE ord.F_IsEffective = 1 + AND kdjlb.F_IsEffective = 1 + AND DATE(kdjlb.kdrq) >= '{startDate:yyyy-MM-dd}' + AND DATE(kdjlb.kdrq) <= '{endDate:yyyy-MM-dd}' + {techFilter} + {teacherFilterForOrder} + GROUP BY techDept.F_Id, ord.kjbls"; + + var orderResult = await _db.Ado.SqlQueryAsync(orderSql); + + // 合并数据 + var teacherDict = new Dictionary(); + + foreach (var item in consumeResult ?? Enumerable.Empty()) + { + var key = $"{item.TechDepartmentId}_{item.TeacherId}"; + teacherDict[key] = new TechTeacherDailyStatisticsOutput + { + TechDepartmentId = item.TechDepartmentId?.ToString(), + TechDepartmentName = item.TechDepartmentName?.ToString(), + TeacherId = item.TeacherId?.ToString(), + TeacherName = item.TeacherName?.ToString(), + CustomerCount = Convert.ToInt32(item.CustomerCount), + ConsumeProjectCount = Convert.ToInt32(item.ConsumeProjectCount), + ConsumeAchievement = Convert.ToDecimal(item.ConsumeAchievement), + OrderAchievement = 0 + }; + } + + // 合并开单业绩 + foreach (var item in orderResult ?? Enumerable.Empty()) + { + var key = $"{item.TechDepartmentId}_{item.TeacherId}"; + if (teacherDict.ContainsKey(key)) + { + teacherDict[key].OrderAchievement = Convert.ToDecimal(item.OrderAchievement); + } + } + + var outputList = teacherDict.Values + .OrderBy(x => x.TechDepartmentName) + .ThenBy(x => x.TeacherName) + .ToList(); + + return outputList; + } + #endregion + } +} + -- libgit2 0.21.4