diff --git a/antis-ncc-admin/.env.development b/antis-ncc-admin/.env.development
index 4c02e12..e9a4583 100644
--- a/antis-ncc-admin/.env.development
+++ b/antis-ncc-admin/.env.development
@@ -2,6 +2,6 @@
VUE_CLI_BABEL_TRANSPILE_MODULES = true
# VUE_APP_BASE_API = 'https://erp.lvqianmeiye.com'
-VUE_APP_BASE_API = 'http://erp_test.lvqianmeiye.com'
-# VUE_APP_BASE_API = 'http://localhost:2011'
+# VUE_APP_BASE_API = 'http://erp_test.lvqianmeiye.com'
+VUE_APP_BASE_API = 'http://localhost:2011'
VUE_APP_BASE_WSS = 'ws://192.168.110.45:2011/websocket'
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqJinsanjiaoUser/LqJinsanjiaoUserDeleteInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqJinsanjiaoUser/LqJinsanjiaoUserDeleteInput.cs
new file mode 100644
index 0000000..11dbef0
--- /dev/null
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqJinsanjiaoUser/LqJinsanjiaoUserDeleteInput.cs
@@ -0,0 +1,17 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace NCC.Extend.Entitys.Dto.LqJinsanjiaoUser
+{
+ ///
+ /// 删除金三角用户绑定关系输入
+ ///
+ public class LqJinsanjiaoUserDeleteInput
+ {
+ ///
+ /// 金三角用户关系ID
+ ///
+ [Required(ErrorMessage = "ID不能为空")]
+ public string Id { get; set; }
+ }
+}
+
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/CustomerVisitFrequencyInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/CustomerVisitFrequencyInput.cs
new file mode 100644
index 0000000..a90c11a
--- /dev/null
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/CustomerVisitFrequencyInput.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+
+namespace NCC.Extend.Entitys.Dto.LqReport
+{
+ ///
+ /// 客户到店次数统计输入
+ ///
+ public class CustomerVisitFrequencyInput
+ {
+ ///
+ /// 开始时间(可选,默认为当月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/LqReport/CustomerVisitFrequencyOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/CustomerVisitFrequencyOutput.cs
new file mode 100644
index 0000000..7d60b68
--- /dev/null
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/CustomerVisitFrequencyOutput.cs
@@ -0,0 +1,19 @@
+namespace NCC.Extend.Entitys.Dto.LqReport
+{
+ ///
+ /// 客户到店次数统计输出
+ ///
+ public class CustomerVisitFrequencyOutput
+ {
+ ///
+ /// 消耗次数(客户到店次数)
+ ///
+ public int VisitCount { get; set; }
+
+ ///
+ /// 人数(达到该次数的客户人数)
+ ///
+ public int CustomerCount { get; set; }
+ }
+}
+
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/HealthCoachRankingOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/HealthCoachRankingOutput.cs
new file mode 100644
index 0000000..984c93b
--- /dev/null
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/HealthCoachRankingOutput.cs
@@ -0,0 +1,26 @@
+using System.Collections.Generic;
+
+namespace NCC.Extend.Entitys.Dto.LqReport
+{
+ ///
+ /// 健康师排行榜输出
+ ///
+ public class HealthCoachRankingOutput
+ {
+ ///
+ /// 开单业绩排行榜(前20名)
+ ///
+ public List BillingRanking { get; set; }
+
+ ///
+ /// 耗卡业绩排行榜(前20名)
+ ///
+ public List ConsumeRanking { get; set; }
+
+ ///
+ /// 退卡业绩排行榜(前20名)
+ ///
+ public List RefundRanking { get; set; }
+ }
+}
+
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/HealthCoachStatisticsInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/HealthCoachStatisticsInput.cs
new file mode 100644
index 0000000..8fb2e1b
--- /dev/null
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/HealthCoachStatisticsInput.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+
+namespace NCC.Extend.Entitys.Dto.LqReport
+{
+ ///
+ /// 健康师统计数据输入
+ ///
+ public class HealthCoachStatisticsInput
+ {
+ ///
+ /// 开始时间(可选,默认为当月1号)
+ ///
+ public DateTime? StartTime { get; set; }
+
+ ///
+ /// 结束时间(可选,默认为当前时间)
+ ///
+ public DateTime? EndTime { get; set; }
+
+ ///
+ /// 门店ID列表(可选)
+ ///
+ public List StoreIds { get; set; }
+
+ ///
+ /// 健康师ID列表(可选)
+ ///
+ public List HealthCoachIds { get; set; }
+ }
+}
+
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/HealthCoachStatisticsOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/HealthCoachStatisticsOutput.cs
new file mode 100644
index 0000000..0d4c896
--- /dev/null
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/HealthCoachStatisticsOutput.cs
@@ -0,0 +1,49 @@
+namespace NCC.Extend.Entitys.Dto.LqReport
+{
+ ///
+ /// 健康师统计数据输出
+ ///
+ public class HealthCoachStatisticsOutput
+ {
+ ///
+ /// 健康师ID
+ ///
+ public string HealthCoachId { get; set; }
+
+ ///
+ /// 健康师姓名
+ ///
+ public string HealthCoachName { get; set; }
+
+ ///
+ /// 开单业绩
+ ///
+ public decimal BillingPerformance { get; set; }
+
+ ///
+ /// 消耗业绩
+ ///
+ public decimal ConsumePerformance { get; set; }
+
+ ///
+ /// 退单业绩
+ ///
+ public decimal RefundPerformance { get; set; }
+
+ ///
+ /// 开单项目数
+ ///
+ public int BillingProjectCount { get; set; }
+
+ ///
+ /// 消耗项目数
+ ///
+ public int ConsumeProjectCount { get; set; }
+
+ ///
+ /// 退单项目数
+ ///
+ public int RefundProjectCount { get; set; }
+ }
+}
+
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/StoreItemStatisticsInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/StoreItemStatisticsInput.cs
new file mode 100644
index 0000000..602a70c
--- /dev/null
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/StoreItemStatisticsInput.cs
@@ -0,0 +1,25 @@
+using System;
+
+namespace NCC.Extend.Entitys.Dto.LqReport
+{
+ ///
+ /// 门店项目指标统计输入
+ ///
+ public class StoreItemStatisticsInput
+ {
+ ///
+ /// 开始时间
+ ///
+ public DateTime? StartTime { get; set; }
+
+ ///
+ /// 结束时间
+ ///
+ public DateTime? EndTime { get; set; }
+
+ ///
+ /// 门店ID列表
+ ///
+ public string[] StoreIds { get; set; }
+ }
+}
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/StoreItemStatisticsOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/StoreItemStatisticsOutput.cs
new file mode 100644
index 0000000..2cb351a
--- /dev/null
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/StoreItemStatisticsOutput.cs
@@ -0,0 +1,53 @@
+namespace NCC.Extend.Entitys.Dto.LqReport
+{
+ ///
+ /// 门店项目指标统计输出
+ ///
+ public class StoreItemStatisticsOutput
+ {
+ ///
+ /// 门店ID
+ ///
+ public string StoreId { get; set; }
+
+ ///
+ /// 门店名称
+ ///
+ public string StoreName { get; set; }
+
+ ///
+ /// 消耗项目数(项目次数总和)
+ ///
+ public int ConsumeProjectCount { get; set; }
+
+ ///
+ /// 消耗率(消耗金额/开单金额 × 100%)
+ ///
+ public decimal ConsumeRate { get; set; }
+
+ ///
+ /// 客单项目数(项目数/消耗人次)
+ ///
+ public decimal AvgProjectPerConsume { get; set; }
+
+ ///
+ /// 消耗客单价(消耗业绩/消耗人次)
+ ///
+ public decimal AvgAmountPerConsume { get; set; }
+
+ ///
+ /// 开单金额
+ ///
+ public decimal BillingAmount { get; set; }
+
+ ///
+ /// 消耗金额
+ ///
+ public decimal ConsumeAmount { get; set; }
+
+ ///
+ /// 消耗人次
+ ///
+ public int ConsumePersonCount { get; set; }
+ }
+}
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/StorePerformanceComparisonOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/StorePerformanceComparisonOutput.cs
index c6c17bb..1bd9983 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/StorePerformanceComparisonOutput.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/StorePerformanceComparisonOutput.cs
@@ -39,5 +39,10 @@ namespace NCC.Extend.Entitys.Dto.LqReport
/// 是否达标(实际业绩 >= 目标业绩)
///
public bool IsTargetAchieved { get; set; }
+
+ ///
+ /// 实际消耗业绩
+ ///
+ public decimal ActualConsumePerformance { get; set; }
}
}
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/StoreRemainingRightsInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/StoreRemainingRightsInput.cs
new file mode 100644
index 0000000..a41abc3
--- /dev/null
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/StoreRemainingRightsInput.cs
@@ -0,0 +1,26 @@
+using System;
+
+namespace NCC.Extend.Entitys.Dto.LqReport
+{
+ ///
+ /// 门店剩余权益统计输入
+ ///
+ public class StoreRemainingRightsInput
+ {
+ ///
+ /// 开始时间(可选,默认为当月1号)
+ ///
+ public DateTime? StartTime { get; set; }
+
+ ///
+ /// 结束时间(可选,默认为当前时间)
+ ///
+ public DateTime? EndTime { get; set; }
+
+ ///
+ /// 门店ID列表(可选,不传则统计所有门店)
+ ///
+ public string[] StoreIds { get; set; }
+ }
+}
+
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/StoreRemainingRightsOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/StoreRemainingRightsOutput.cs
new file mode 100644
index 0000000..f188aff
--- /dev/null
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqReport/StoreRemainingRightsOutput.cs
@@ -0,0 +1,29 @@
+namespace NCC.Extend.Entitys.Dto.LqReport
+{
+ ///
+ /// 门店剩余权益统计输出
+ ///
+ public class StoreRemainingRightsOutput
+ {
+ ///
+ /// 门店ID
+ ///
+ public string StoreId { get; set; }
+
+ ///
+ /// 门店名称
+ ///
+ public string StoreName { get; set; }
+
+ ///
+ /// 剩余权益累计金额(开单总金额 - 消耗总金额 - 退卡总金额)
+ ///
+ public decimal RemainingRightsAmount { get; set; }
+
+ ///
+ /// 剩余权益累计人数(有剩余权益的会员数量)
+ ///
+ public int RemainingRightsPersonCount { get; set; }
+ }
+}
+
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/TkStatisticsInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/TkStatisticsInput.cs
index 3850358..c82c199 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/TkStatisticsInput.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/TkStatisticsInput.cs
@@ -21,6 +21,11 @@ namespace NCC.Extend.Entitys.Dto.LqTkjlb
/// 活动ID(可选)
///
public string EventId { get; set; }
+
+ ///
+ /// 门店ID(可选)
+ ///
+ public string[] StoreId { get; set; }
}
}
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_mx/LqHytkMxEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_mx/LqHytkMxEntity.cs
index 051cc2b..8786f9b 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_mx/LqHytkMxEntity.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_mx/LqHytkMxEntity.cs
@@ -31,6 +31,12 @@ namespace NCC.Extend.Entitys.lq_hytk_mx
public string BillingItemId { get; set; }
///
+ /// 会员id
+ ///
+ [SugarColumn(ColumnName = "F_MemberId")]
+ public string MemberId { get; set; }
+
+ ///
/// 品项
///
[SugarColumn(ColumnName = "px")]
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Enum/StatusEnum.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Enum/StatusEnum.cs
index b2b34c5..59e8dc1 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Enum/StatusEnum.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Enum/StatusEnum.cs
@@ -19,10 +19,5 @@ namespace NCC.Extend.Entitys.Enum
[Description("有效")]
有效 = 1,
- ///
- /// 删除
- ///
- [Description("删除")]
- 删除 = 99,
}
}
diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqCardTransferLogService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqCardTransferLogService.cs
index ac0f8d4..0b4f4f7 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend/LqCardTransferLogService.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend/LqCardTransferLogService.cs
@@ -18,7 +18,7 @@ namespace NCC.Extend.LqCardTransferLog
///
/// 转卡日志服务
///
- [ApiDescriptionSettings(Tag = "绿纤转卡日志服务", Name = "LqCardTransferLog", Order = 100)]
+ [ApiDescriptionSettings(Tag = "绿纤转卡日志服务", Name = "LqCardTransferLog", Order = 200)]
[Route("api/Extend/[controller]")]
public class LqCardTransferLogService : IDynamicApiController, ILqCardTransferLogService, ITransient
{
diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqDailyReportService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqDailyReportService.cs
index 3f1b0a9..13d618e 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend/LqDailyReportService.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend/LqDailyReportService.cs
@@ -22,6 +22,7 @@ using NCC.DataEncryption;
using NCC.ClayObject;
using NCC.Extend.Entitys.Dto.LqDailyReport;
using NCC.Extend.Entitys.lq_kd_kdjlb;
+using Microsoft.AspNetCore.Authorization;
namespace NCC.Extend
{
@@ -103,6 +104,7 @@ namespace NCC.Extend
/// 成功返回门店统计列表
/// 日期格式错误或参数无效
/// 服务器内部错误
+ [AllowAnonymous]
[HttpPost("get-store-daily-statistics")]
public async Task> GetStoreDailyStatistics(StoreDailyStatisticsInput input)
{
@@ -198,6 +200,7 @@ namespace NCC.Extend
/// 成功返回门店业绩完成情况列表
/// 日期格式错误或参数无效
/// 服务器内部错误
+ [AllowAnonymous]
[HttpPost("get-store-performance-completion")]
public async Task> GetStorePerformanceCompletion(StorePerformanceCompletionInput input)
{
@@ -288,6 +291,7 @@ namespace NCC.Extend
/// 成功返回事业部业绩完成情况列表
/// 日期格式错误或参数无效
/// 服务器内部错误
+ [AllowAnonymous]
[HttpPost("get-business-unit-performance-completion")]
public async Task> GetBusinessUnitPerformanceCompletion(BusinessUnitPerformanceCompletionInput input)
{
@@ -421,6 +425,7 @@ namespace NCC.Extend
/// 成功返回天王团业绩完成情况列表
/// 日期格式错误或参数无效
/// 服务器内部错误
+ [AllowAnonymous]
[HttpPost("get-tianwang-group-performance-completion")]
public async Task> GetTianwangGroupPerformanceCompletion(TianwangGroupPerformanceCompletionInput input)
{
@@ -595,6 +600,7 @@ namespace NCC.Extend
/// 成功返回经理业绩完成情况列表
/// 日期格式错误或参数无效
/// 服务器内部错误
+ [AllowAnonymous]
[HttpPost("get-manager-performance-completion")]
public async Task> GetManagerPerformanceCompletion(ManagerPerformanceCompletionInput input)
{
@@ -699,6 +705,7 @@ namespace NCC.Extend
/// 成功返回经理汇总业绩完成情况列表
/// 日期格式错误或参数无效
/// 服务器内部错误
+ [AllowAnonymous]
[HttpPost("get-manager-summary-performance-completion")]
public async Task> GetManagerSummaryPerformanceCompletion(ManagerPerformanceCompletionInput input)
{
@@ -808,6 +815,7 @@ namespace NCC.Extend
/// 成功返回科技部老师统计列表
/// 日期格式错误或参数无效
/// 服务器内部错误
+ [AllowAnonymous]
[HttpPost("get-tech-teacher-daily-statistics")]
public async Task> GetTechTeacherDailyStatistics(TechTeacherDailyStatisticsInput input)
{
@@ -841,7 +849,7 @@ namespace NCC.Extend
techDept.F_Id as TechDepartmentId,
techDept.F_FullName as TechDepartmentName,
consume.kjbls as TeacherId,
- consume.kjblsxm as TeacherName,
+ user.F_RealName as TeacherName,
COUNT(DISTINCT hyhk.hy) as CustomerCount,
SUM(consume.F_hdpxNumber) as ConsumeProjectCount,
SUM(consume.kjblsyj) as ConsumeAchievement
@@ -849,13 +857,14 @@ namespace NCC.Extend
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
+ LEFT JOIN BASE_USER user ON consume.kjbls = user.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";
+ GROUP BY techDept.F_Id, techDept.F_FullName, consume.kjbls, user.F_RealName";
var consumeResult = await _db.Ado.SqlQueryAsync(consumeSql);
diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqGzService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqGzService.cs
index 191c9fd..a1f2419 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend/LqGzService.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend/LqGzService.cs
@@ -913,10 +913,5 @@ namespace NCC.Extend.LqGz
}
#endregion
-
-
-
-
-
}
}
diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqHytkHytkService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqHytkHytkService.cs
index fad3d6d..ce5fd82 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend/LqHytkHytkService.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend/LqHytkHytkService.cs
@@ -24,6 +24,7 @@ using NCC.Extend.Entitys.lq_hytk_hytk;
using NCC.Extend.Entitys.lq_hytk_jksyj;
using NCC.Extend.Entitys.lq_hytk_kjbsyj;
using NCC.Extend.Entitys.lq_hytk_mx;
+using NCC.Extend.Entitys.lq_kd_pxmx;
using NCC.Extend.Interfaces.LqHytkHytk;
using NCC.FriendlyException;
using NCC.JsonSerialization;
@@ -230,6 +231,7 @@ namespace NCC.Extend.LqHytkHytk
Id = YitIdHelper.NextId().ToString(),
RefundInfoId = newEntity.Id,
BillingItemId = item.billingItemId,
+ MemberId = newEntity.Hy,
CreateTime = DateTime.Now,
CreateUser = userInfo.userId,
Px = item.px,
@@ -368,18 +370,19 @@ namespace NCC.Extend.LqHytkHytk
var allMxEntities = new List();
var allJksyjEntities = new List();
var allKjbsyjEntities = new List();
-
// 处理品项明细列表
if (input.lqHytkMxList != null && input.lqHytkMxList.Any())
{
foreach (var item in input.lqHytkMxList)
{
+
// 创建品项明细实体
var lqHytkMxEntity = new LqHytkMxEntity
{
Id = YitIdHelper.NextId().ToString(),
RefundInfoId = id,
BillingItemId = item.billingItemId,
+ MemberId = entity.Hy,
CreateTime = DateTime.Now,
CreateUser = userInfo.userId,
Tksj = input.tksj,
diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs
index 0969449..9b25335 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs
@@ -2478,6 +2478,7 @@ namespace NCC.Extend.LqKdKdjlb
Id = YitIdHelper.NextId().ToString(),
RefundInfoId = refundId,
BillingItemId = item.BillingItemId,
+ MemberId = input.FromMemberId, // 转卡时使用转出方会员ID
CreateTime = transferTime,
CreateUser = userInfo.userId,
Px = refundPxmxEntity.Px,
diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqReportService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqReportService.cs
index ba5ec9e..eca335d 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend/LqReportService.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend/LqReportService.cs
@@ -106,8 +106,8 @@ namespace NCC.Extend
if (input.StoreIds != null && input.StoreIds.Any())
{
- sql += " AND s.F_StoreId IN @storeIds";
- parameters = new { startMonth = input.StartMonth, endMonth = input.EndMonth, storeIds = input.StoreIds };
+ var storeIdsStr = string.Join("','", input.StoreIds);
+ sql += $" AND s.F_StoreId IN ('{storeIdsStr}')";
}
sql += " ORDER BY s.F_StoreName, s.F_StatisticsMonth";
@@ -751,15 +751,12 @@ namespace NCC.Extend
AND kd.kdrq >= @startTime
AND kd.kdrq <= @endTime";
- object billingParameters;
+ object billingParameters = new { startTime, endTime };
+
if (input.StoreIds != null && input.StoreIds.Any())
{
- billingSql += " AND kd.djmd IN @storeIds";
- billingParameters = new { startTime, endTime, storeIds = input.StoreIds };
- }
- else
- {
- billingParameters = new { startTime, endTime };
+ var storeIdsStr = string.Join("','", input.StoreIds);
+ billingSql += $" AND kd.djmd IN ('{storeIdsStr}')";
}
var billingResult = await _db.Ado.SqlQueryAsync(billingSql, billingParameters);
@@ -776,15 +773,12 @@ namespace NCC.Extend
AND xh.hksj >= @startTime
AND xh.hksj <= @endTime";
- object consumeParameters;
+ object consumeParameters = new { startTime, endTime };
+
if (input.StoreIds != null && input.StoreIds.Any())
{
- consumeSql += " AND xh.md IN @storeIds";
- consumeParameters = new { startTime, endTime, storeIds = input.StoreIds };
- }
- else
- {
- consumeParameters = new { startTime, endTime };
+ var storeIdsStr = string.Join("','", input.StoreIds);
+ consumeSql += $" AND xh.md IN ('{storeIdsStr}')";
}
var consumeResult = await _db.Ado.SqlQueryAsync(consumeSql, consumeParameters);
@@ -801,15 +795,12 @@ namespace NCC.Extend
AND hytk.tksj >= @startTime
AND hytk.tksj <= @endTime";
- object refundParameters;
+ object refundParameters = new { startTime, endTime };
+
if (input.StoreIds != null && input.StoreIds.Any())
{
- refundSql += " AND hytk.md IN @storeIds";
- refundParameters = new { startTime, endTime, storeIds = input.StoreIds };
- }
- else
- {
- refundParameters = new { startTime, endTime };
+ var storeIdsStr = string.Join("','", input.StoreIds);
+ refundSql += $" AND hytk.md IN ('{storeIdsStr}')";
}
var refundResult = await _db.Ado.SqlQueryAsync(refundSql, refundParameters);
@@ -818,28 +809,26 @@ namespace NCC.Extend
// 第四步:获取消耗目标业绩(所有门店xhyj字段的总和)
var targetConsumeSql = "SELECT COALESCE(SUM(CAST(md.xhyj AS DECIMAL(18,2))), 0) as target_consume_amount FROM lq_mdxx md WHERE 1=1";
- object targetConsumeParameters = null;
if (input.StoreIds != null && input.StoreIds.Any())
{
- targetConsumeSql += " AND md.F_Id IN @storeIds";
- targetConsumeParameters = new { storeIds = input.StoreIds };
+ var storeIdsStr = string.Join("','", input.StoreIds);
+ targetConsumeSql += $" AND md.F_Id IN ('{storeIdsStr}')";
}
- var targetConsumeResult = await _db.Ado.SqlQueryAsync(targetConsumeSql, targetConsumeParameters);
+ var targetConsumeResult = await _db.Ado.SqlQueryAsync(targetConsumeSql);
var targetConsumeAmount = Convert.ToDecimal(targetConsumeResult?.FirstOrDefault()?.target_consume_amount ?? 0m);
// 第五步:获取开单目标业绩(所有门店xsyj字段的总和)
var targetBillingSql = "SELECT COALESCE(SUM(CAST(md.xsyj AS DECIMAL(18,2))), 0) as target_billing_amount FROM lq_mdxx md WHERE 1=1";
- object targetBillingParameters = null;
if (input.StoreIds != null && input.StoreIds.Any())
{
- targetBillingSql += " AND md.F_Id IN @storeIds";
- targetBillingParameters = new { storeIds = input.StoreIds };
+ var storeIdsStr = string.Join("','", input.StoreIds);
+ targetBillingSql += $" AND md.F_Id IN ('{storeIdsStr}')";
}
- var targetBillingResult = await _db.Ado.SqlQueryAsync(targetBillingSql, targetBillingParameters);
+ var targetBillingResult = await _db.Ado.SqlQueryAsync(targetBillingSql);
var targetBillingAmount = Convert.ToDecimal(targetBillingResult?.FirstOrDefault()?.target_billing_amount ?? 0m);
// 计算开单完成业绩(开单总金额 - 退卡总金额)
@@ -958,15 +947,12 @@ namespace NCC.Extend
WHERE tk.F_CreateTime >= @startTime
AND tk.F_CreateTime <= @endTime";
- object inviteParameters;
+ object inviteParameters = new { startTime, endTime };
+
if (input.StoreIds != null && input.StoreIds.Any())
{
- inviteSql += " AND tk.F_StoreId IN @storeIds";
- inviteParameters = new { startTime, endTime, storeIds = input.StoreIds };
- }
- else
- {
- inviteParameters = new { startTime, endTime };
+ var storeIdsStr = string.Join("','", input.StoreIds);
+ inviteSql += $" AND tk.F_StoreId IN ('{storeIdsStr}')";
}
var inviteResult = await _db.Ado.SqlQueryAsync(inviteSql, inviteParameters);
@@ -981,15 +967,12 @@ namespace NCC.Extend
AND xh.hksj <= @endTime
AND xh.xfje > 0";
- object consumeParameters;
+ object consumeParameters = new { startTime, endTime };
+
if (input.StoreIds != null && input.StoreIds.Any())
{
- consumeSql += " AND xh.md IN @storeIds";
- consumeParameters = new { startTime, endTime, storeIds = input.StoreIds };
- }
- else
- {
- consumeParameters = new { startTime, endTime };
+ var storeIdsStr = string.Join("','", input.StoreIds);
+ consumeSql += $" AND xh.md IN ('{storeIdsStr}')";
}
var consumeResult = await _db.Ado.SqlQueryAsync(consumeSql, consumeParameters);
@@ -1047,6 +1030,7 @@ namespace NCC.Extend
/// - StoreName: 门店名称
/// - TargetPerformance: 目标业绩(来自门店资料表xsyj字段)
/// - ActualPerformance: 实际开单业绩(统计期间内的开单业绩总和)
+ /// - ActualConsumePerformance: 实际消耗业绩(统计期间内的消耗业绩总和)
/// - CompletionRate: 完成率(实际业绩/目标业绩 × 100%)
/// - Difference: 差额(实际业绩-目标业绩)
/// - IsTargetAchieved: 是否达标(实际业绩 >= 目标业绩)
@@ -1065,42 +1049,106 @@ namespace NCC.Extend
var startTime = input.StartTime ?? new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
var endTime = input.EndTime ?? DateTime.Now;
- // 构建SQL查询
- var sql = @"
+ // 先获取门店基础信息和目标业绩
+ var storeSql = "SELECT F_Id, dm, xsyj FROM lq_mdxx WHERE 1=1";
+
+ if (input.StoreIds != null && input.StoreIds.Any())
+ {
+ var storeIdsStr = string.Join("','", input.StoreIds);
+ storeSql += $" AND F_Id IN ('{storeIdsStr}')";
+ }
+
+ var stores = await _db.Ado.SqlQueryAsync(storeSql);
+
+ // 构建门店字典
+ var storeDict = new Dictionary();
+ var targetDict = new Dictionary();
+ foreach (var store in stores)
+ {
+ var storeId = store.F_Id?.ToString();
+ if (!string.IsNullOrEmpty(storeId))
+ {
+ storeDict[storeId] = store.dm?.ToString() ?? "未知门店";
+ targetDict[storeId] = Convert.ToDecimal(store.xsyj ?? 0);
+ }
+ }
+
+ // 统计开单业绩
+ var billingSql = @"
SELECT
- md.F_Id as store_id,
- md.dm as store_name,
- COALESCE(CAST(md.xsyj AS DECIMAL(18,2)), 0) as target_performance,
+ kd.djmd as store_id,
COALESCE(SUM(CAST(kd.sfyj AS DECIMAL(18,2))), 0) as actual_performance
- FROM lq_mdxx md
- LEFT JOIN lq_kd_kdjlb kd ON md.F_Id = kd.djmd
- AND kd.F_IsEffective = 1
+ FROM lq_kd_kdjlb kd
+ WHERE kd.F_IsEffective = 1
AND kd.kdrq >= @startTime
AND kd.kdrq <= @endTime";
- object parameters;
+ object billingParameters = new { startTime, endTime };
+
if (input.StoreIds != null && input.StoreIds.Any())
{
- sql += " AND md.F_Id IN @storeIds";
- parameters = new { startTime, endTime, storeIds = input.StoreIds };
+ var storeIdsStr = string.Join("','", input.StoreIds);
+ billingSql += $" AND kd.djmd IN ('{storeIdsStr}')";
}
- else
+
+ billingSql += " GROUP BY kd.djmd";
+
+ var billingResults = await _db.Ado.SqlQueryAsync(billingSql, billingParameters);
+
+ // 构建开单业绩字典
+ var billingDict = new Dictionary();
+ foreach (var item in billingResults)
{
- parameters = new { startTime, endTime };
+ var storeId = item.store_id?.ToString();
+ if (!string.IsNullOrEmpty(storeId))
+ {
+ billingDict[storeId] = Convert.ToDecimal(item.actual_performance ?? 0);
+ }
}
- sql += " GROUP BY md.F_Id, md.dm, md.xsyj ORDER BY actual_performance DESC";
+ // 统计消耗业绩
+ var consumeSql = @"
+ SELECT
+ xh.md as store_id,
+ COALESCE(SUM(CAST(xh.xfje AS DECIMAL(18,2))), 0) as actual_consume_performance
+ FROM lq_xh_hyhk xh
+ WHERE xh.F_IsEffective = 1
+ AND xh.hksj >= @startTime
+ AND xh.hksj <= @endTime";
- var results = await _db.Ado.SqlQueryAsync(sql, parameters);
+ object consumeParameters = new { startTime, endTime };
- var storePerformanceList = new List();
+ if (input.StoreIds != null && input.StoreIds.Any())
+ {
+ var storeIdsStr = string.Join("','", input.StoreIds);
+ consumeSql += $" AND xh.md IN ('{storeIdsStr}')";
+ }
+
+ consumeSql += " GROUP BY xh.md";
- foreach (var item in results)
+ var consumeResults = await _db.Ado.SqlQueryAsync(consumeSql, consumeParameters);
+
+ // 构建消耗业绩字典
+ var consumeDict = new Dictionary();
+ foreach (var item in consumeResults)
{
var storeId = item.store_id?.ToString();
- var storeName = item.store_name?.ToString();
- var targetPerformance = Convert.ToDecimal(item.target_performance ?? 0);
- var actualPerformance = Convert.ToDecimal(item.actual_performance ?? 0);
+ if (!string.IsNullOrEmpty(storeId))
+ {
+ consumeDict[storeId] = Convert.ToDecimal(item.actual_consume_performance ?? 0);
+ }
+ }
+
+ // 合并数据
+ var storePerformanceList = new List();
+
+ foreach (var kvp in storeDict)
+ {
+ var storeId = kvp.Key;
+ var storeName = kvp.Value;
+ var targetPerformance = targetDict.ContainsKey(storeId) ? targetDict[storeId] : 0;
+ var actualPerformance = billingDict.ContainsKey(storeId) ? billingDict[storeId] : 0;
+ var actualConsumePerformance = consumeDict.ContainsKey(storeId) ? consumeDict[storeId] : 0;
// 计算完成率
var completionRate = targetPerformance > 0
@@ -1119,12 +1167,16 @@ namespace NCC.Extend
StoreName = storeName,
TargetPerformance = targetPerformance,
ActualPerformance = actualPerformance,
+ ActualConsumePerformance = actualConsumePerformance,
CompletionRate = completionRate,
Difference = difference,
IsTargetAchieved = isTargetAchieved
});
}
+ // 按实际业绩排序
+ storePerformanceList = storePerformanceList.OrderByDescending(x => x.ActualPerformance).ToList();
+
return storePerformanceList;
}
catch (Exception ex)
@@ -1266,7 +1318,7 @@ namespace NCC.Extend
SELECT F_Id FROM lq_xh_hyhk
WHERE hksj >= '{startTime:yyyy-MM-dd HH:mm:ss}'
AND hksj <= '{endTime:yyyy-MM-dd HH:mm:ss}'
- {(input.StoreIds != null && input.StoreIds.Any() ? $"AND F_StoreId IN ('{string.Join("','", input.StoreIds)}')" : "")}
+ {(input.StoreIds != null && input.StoreIds.Any() ? $"AND md IN ('{string.Join("','", input.StoreIds)}')" : "")}
)
GROUP BY xh.px";
@@ -1325,5 +1377,1537 @@ namespace NCC.Extend
}
#endregion
+
+ #region 获取门店项目指标统计数据
+
+ ///
+ /// 获取门店项目指标统计数据
+ ///
+ ///
+ /// 统计指定时间范围内各门店的项目指标数据
+ /// 包括:消耗项目数、消耗率、客单项目数、消耗客单价、开单金额、消耗人次
+ ///
+ /// 示例请求:
+ /// ```json
+ /// {
+ /// "startTime": "2025-10-01",
+ /// "endTime": "2025-10-31",
+ /// "storeIds": ["门店ID1", "门店ID2"]
+ /// }
+ /// ```
+ ///
+ /// 参数说明:
+ /// - startTime: 开始时间(可选,默认为当月1号)
+ /// - endTime: 结束时间(可选,默认为当前时间)
+ /// - storeIds: 门店ID列表(可选)
+ ///
+ /// 返回字段说明:
+ /// - StoreId: 门店ID
+ /// - StoreName: 门店名称
+ /// - ConsumeProjectCount: 消耗项目数(项目次数总和)
+ /// - ConsumeRate: 消耗率(消耗金额/开单金额 × 100%)
+ /// - AvgProjectPerConsume: 客单项目数(项目数/消耗人次)
+ /// - AvgAmountPerConsume: 消耗客单价(消耗业绩/消耗人次)
+ /// - BillingAmount: 开单金额
+ /// - ConsumeAmount: 消耗金额
+ /// - ConsumePersonCount: 消耗人次(去重客户数)
+ ///
+ /// 查询参数
+ /// 门店项目指标统计数据列表
+ /// 成功返回统计数据
+ /// 参数错误
+ /// 服务器错误
+ [HttpPost("get-store-item-statistics")]
+ public async Task