diff --git a/.vscode/settings.json b/.vscode/settings.json
index 3411ca7..e93ba44 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -7,6 +7,6 @@
"csharpier.endOfLine": "LF",
"[csharp]": {
"editor.formatOnSave": true,
- "editor.defaultFormatter": "csharpier.csharpier-vscode"
+ "editor.defaultFormatter": "ms-dotnettools.csharp"
}
}
diff --git a/[已用]创建门店每日耗卡统计视图.sql b/[已用]创建门店每日耗卡统计视图.sql
index 5f95f66..f573474 100644
--- a/[已用]创建门店每日耗卡统计视图.sql
+++ b/[已用]创建门店每日耗卡统计视图.sql
@@ -23,7 +23,7 @@ SELECT
COUNT(DISTINCT hk.hy) AS member_count, -- 消费会员数
hk.hksj AS create_time -- 创建时间
FROM lq_xh_hyhk hk
-LEFT JOIN lq_xh_pxmx px ON hk.F_Id = px.glkdbh
+LEFT JOIN lq_xh_pxmx px ON hk.F_Id = px.F_ConsumeInfoId
WHERE hk.hksj IS NOT NULL
GROUP BY hk.md, hk.mdbh, hk.mdmc, DATE(hk.hksj), hk.hksj
ORDER BY hk.md, DATE(hk.hksj) DESC;
diff --git a/netcore/src/Application/NCC.API.Tenant/NCC.API.Tenant/Properties/launchSettings.json b/netcore/src/Application/NCC.API.Tenant/NCC.API.Tenant/Properties/launchSettings.json
index 2039622..5e5090b 100644
--- a/netcore/src/Application/NCC.API.Tenant/NCC.API.Tenant/Properties/launchSettings.json
+++ b/netcore/src/Application/NCC.API.Tenant/NCC.API.Tenant/Properties/launchSettings.json
@@ -17,7 +17,7 @@
},
"NCC.API.Tenant": {
"commandName": "Project",
- "launchBrowser": true,
+ "launchBrowser": false,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
diff --git a/netcore/src/Application/NCC.API/Properties/launchSettings.json b/netcore/src/Application/NCC.API/Properties/launchSettings.json
index 35b2b58..589b2a6 100644
--- a/netcore/src/Application/NCC.API/Properties/launchSettings.json
+++ b/netcore/src/Application/NCC.API/Properties/launchSettings.json
@@ -18,7 +18,7 @@
"NCC.API": {
"commandName": "Project",
"dotnetRunMessages": "true",
- "launchBrowser": true,
+ "launchBrowser": false,
"applicationUrl": "http://localhost:2011", //58504
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/PersonDataOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/PersonDataOutput.cs
new file mode 100644
index 0000000..13105f6
--- /dev/null
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/PersonDataOutput.cs
@@ -0,0 +1,60 @@
+using System;
+
+namespace NCC.Extend.Entitys.Dto.LqEvent
+{
+ ///
+ /// 人员统计数据输出
+ ///
+ public class PersonDataOutput
+ {
+ ///
+ /// 用户ID
+ ///
+ public string UserId { get; set; }
+
+ ///
+ /// 用户姓名
+ ///
+ public string UserName { get; set; }
+
+ ///
+ /// 门店ID
+ ///
+ public string StoreId { get; set; }
+
+ ///
+ /// 门店名称
+ ///
+ public string StoreName { get; set; }
+
+ ///
+ /// 战队名称
+ ///
+ public string TeamName { get; set; }
+
+ ///
+ /// 个人目标数
+ ///
+ public int PersonalTarget { get; set; }
+
+ ///
+ /// 完成目标数
+ ///
+ public int CompletedTarget { get; set; }
+
+ ///
+ /// 完成率(百分比)
+ ///
+ public decimal CompletionRate { get; set; }
+
+ ///
+ /// 排名
+ ///
+ public int Ranking { get; set; }
+
+ ///
+ /// 最后拓客时间
+ ///
+ public DateTime? LastExpansionTime { get; set; }
+ }
+}
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/StoreDataOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/StoreDataOutput.cs
new file mode 100644
index 0000000..897ede4
--- /dev/null
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/StoreDataOutput.cs
@@ -0,0 +1,40 @@
+using System;
+
+namespace NCC.Extend.Entitys.Dto.LqEvent
+{
+ ///
+ /// 门店统计数据输出
+ ///
+ public class StoreDataOutput
+ {
+ ///
+ /// 门店ID
+ ///
+ public string StoreId { get; set; }
+
+ ///
+ /// 门店名称
+ ///
+ public string StoreName { get; set; }
+
+ ///
+ /// 目前总目标数
+ ///
+ public int TotalTarget { get; set; }
+
+ ///
+ /// 门店完成目标数
+ ///
+ public int CompletedTarget { get; set; }
+
+ ///
+ /// 完成率(百分比)
+ ///
+ public decimal CompletionRate { get; set; }
+
+ ///
+ /// 排名
+ ///
+ public int Ranking { get; set; }
+ }
+}
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbCrInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbCrInput.cs
index 481ba5d..d389f03 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbCrInput.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbCrInput.cs
@@ -49,7 +49,6 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
/// 实付业绩
///
public decimal sfyj { get; set; }
-
///
/// 欠款
///
@@ -60,10 +59,6 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
///
public string ckfs { get; set; }
- ///
- /// 储扣明细
- ///
- public string ckmx { get; set; }
///
/// 付款方式
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbListOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbListOutput.cs
index caa07fa..1ac182f 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbListOutput.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbListOutput.cs
@@ -58,10 +58,10 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
public string ckfs { get; set; }
///
- /// 储扣明细
+ /// 储扣总金额
///
- public string ckmx { get; set; }
-
+ public decimal deductAmount { get; set; }
+
///
/// 付款方式
///
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbListQueryInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbListQueryInput.cs
index c471e4d..3ed6afb 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbListQueryInput.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbListQueryInput.cs
@@ -68,12 +68,7 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
/// 储扣方式
///
public string ckfs { get; set; }
-
- ///
- /// 储扣明细
- ///
- public string ckmx { get; set; }
-
+
///
/// 付款方式
///
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxCrInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxCrInput.cs
index 74336e2..5a3e6d2 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxCrInput.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxCrInput.cs
@@ -53,10 +53,6 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx
///
public string zjdlsj { get; set; }
- ///
- /// 客户目前归属
- ///
- public string khmqgs { get; set; }
///
/// 归属门店
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxInfoOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxInfoOutput.cs
index 7da1058..b03f8b7 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxInfoOutput.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxInfoOutput.cs
@@ -53,10 +53,6 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx
///
public string zjdlsj { get; set; }
- ///
- /// 客户目前归属
- ///
- public string khmqgs { get; set; }
///
/// 归属门店
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxListOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxListOutput.cs
index 8b4e5e7..2199d47 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxListOutput.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxListOutput.cs
@@ -53,11 +53,6 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx
public string zjdlsj { get; set; }
///
- /// 客户目前归属
- ///
- public string khmqgs { get; set; }
-
- ///
/// 归属门店
///
public string gsmd { get; set; }
@@ -135,6 +130,6 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx
///
/// 添加时间
///
- public string createTime { get; set; }
+ public DateTime createTime { get; set; }
}
}
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxListQueryInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxListQueryInput.cs
index 66b02bb..012cb17 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxListQueryInput.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxListQueryInput.cs
@@ -64,11 +64,6 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx
public string zjdlsj { get; set; }
///
- /// 客户目前归属
- ///
- public string khmqgs { get; set; }
-
- ///
/// 归属门店
///
public string gsmd { get; set; }
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYcsdJsj/LqYcsdJsjByUserMonthOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYcsdJsj/LqYcsdJsjByUserMonthOutput.cs
index d751a3b..1fc3c1b 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYcsdJsj/LqYcsdJsjByUserMonthOutput.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYcsdJsj/LqYcsdJsjByUserMonthOutput.cs
@@ -8,51 +8,51 @@ namespace NCC.Extend.Entitys.Dto.LqYcsdJsj
///
/// 金三角ID
///
- public string JsjId { get; set; }
+ public string jsjId { get; set; }
///
/// 金三角名称
///
- public string JsjName { get; set; }
+ public string jsjName { get; set; }
///
/// 月份
///
- public string Month { get; set; }
+ public string month { get; set; }
///
/// 门店ID
///
- public string StoreId { get; set; }
+ public string storeId { get; set; }
///
/// 门店名称
///
- public string StoreName { get; set; }
+ public string storeName { get; set; }
///
/// 用户ID
///
- public string UserId { get; set; }
+ public string userId { get; set; }
///
/// 用户姓名
///
- public string UserName { get; set; }
+ public string userName { get; set; }
///
/// 是否顾问
///
- public int IsLeader { get; set; }
+ public int isLeader { get; set; }
///
/// 状态
///
- public string Status { get; set; }
+ public string status { get; set; }
///
/// 排序
///
- public int SortOrder { get; set; }
+ public int sortOrder { get; set; }
}
}
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_kdjlb/LqKdKdjlbEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_kdjlb/LqKdKdjlbEntity.cs
index 2421d72..d50cb3a 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_kdjlb/LqKdKdjlbEntity.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_kdjlb/LqKdKdjlbEntity.cs
@@ -52,6 +52,7 @@ namespace NCC.Extend.Entitys.lq_kd_kdjlb
///
[SugarColumn(ColumnName = "zdyj")]
public decimal Zdyj { get; set; }
+
///
/// 实付业绩
@@ -60,6 +61,12 @@ namespace NCC.Extend.Entitys.lq_kd_kdjlb
public decimal Sfyj { get; set; }
///
+ /// 储扣总金额
+ ///
+ [SugarColumn(ColumnName = "F_DeductAmount")]
+ public decimal DeductAmount { get; set; }
+
+ ///
/// 欠款
///
[SugarColumn(ColumnName = "qk")]
@@ -72,12 +79,6 @@ namespace NCC.Extend.Entitys.lq_kd_kdjlb
public string Ckfs { get; set; }
///
- /// 储扣明细
- ///
- [SugarColumn(ColumnName = "ckmx")]
- public string Ckmx { get; set; }
-
- ///
/// 付款方式
///
[SugarColumn(ColumnName = "fkfs")]
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_khxx/LqKhxxEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_khxx/LqKhxxEntity.cs
index 23d62d4..e80fee5 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_khxx/LqKhxxEntity.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_khxx/LqKhxxEntity.cs
@@ -66,12 +66,6 @@ namespace NCC.Extend.Entitys.lq_khxx
public string Zjdlsj { get; set; }
///
- /// 客户目前归属
- ///
- [SugarColumn(ColumnName = "khmqgs")]
- public string Khmqgs { get; set; }
-
- ///
/// 归属门店
///
[SugarColumn(ColumnName = "gsmd")]
@@ -165,6 +159,6 @@ namespace NCC.Extend.Entitys.lq_khxx
/// 添加时间
///
[SugarColumn(ColumnName = "F_CreateTime")]
- public string CreateTime { get; set; }
+ public DateTime CreateTime { get; set; } = DateTime.Now;
}
}
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_statistics_gold_triangle/LqStatisticsGoldTriangleEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_statistics_gold_triangle/LqStatisticsGoldTriangleEntity.cs
new file mode 100644
index 0000000..4df28f4
--- /dev/null
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_statistics_gold_triangle/LqStatisticsGoldTriangleEntity.cs
@@ -0,0 +1,80 @@
+using NCC.Common.Const;
+using SqlSugar;
+using System;
+
+namespace NCC.Extend.Entitys.lq_statistics_gold_triangle
+{
+ ///
+ /// 金三角开卡业绩统计数据表
+ ///
+ [SugarTable("lq_statistics_gold_triangle")]
+ [Tenant(ClaimConst.TENANT_ID)]
+ public class LqStatisticsGoldTriangleEntity
+ {
+ ///
+ /// 主键ID
+ ///
+ [SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true)]
+ public string Id { get; set; }
+
+ ///
+ /// 金三角ID
+ ///
+ [SugarColumn(ColumnName = "F_GoldTriangleId")]
+ public string GoldTriangleId { get; set; }
+
+ ///
+ /// 金三角名称
+ ///
+ [SugarColumn(ColumnName = "F_GoldTriangleName")]
+ public string GoldTriangleName { 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; }
+
+ ///
+ /// 订单数量
+ ///
+ [SugarColumn(ColumnName = "F_OrderCount")]
+ public int OrderCount { get; set; }
+
+ ///
+ /// 总业绩金额
+ ///
+ [SugarColumn(ColumnName = "F_TotalPerformance")]
+ public decimal TotalPerformance { 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; } = DateTime.Now;
+ }
+}
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Enum/MemberTypeEnum.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Enum/MemberTypeEnum.cs
new file mode 100644
index 0000000..f7e8b33
--- /dev/null
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Enum/MemberTypeEnum.cs
@@ -0,0 +1,35 @@
+using System.ComponentModel;
+
+namespace NCC.Extend.Entitys.Enum
+{
+ ///
+ /// 会员类型
+ ///
+ public enum MemberTypeEnum
+ {
+ ///
+ /// 线索
+ ///
+ [Description("线索")]
+ 线索 = 0,
+
+ ///
+ /// 潜客
+ ///
+ [Description("潜客")]
+ 潜客 = 1,
+
+ ///
+ /// 新客
+ ///
+ [Description("新客")]
+ 新客 = 2,
+
+ ///
+ /// 老客
+ ///
+ [Description("老客")]
+ 老客 = 3,
+
+ }
+}
\ No newline at end of file
diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqEventService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqEventService.cs
index 4196825..7185b0d 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend/LqEventService.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend/LqEventService.cs
@@ -694,6 +694,212 @@ namespace NCC.Extend.LqEvent
}
#endregion
+ #region 根据活动ID获取门店的统计数据
+ ///
+ /// 根据活动ID获取门店的统计数据
+ ///
+ ///
+ /// 根据活动ID查询该活动下所有门店的统计数据
+ /// 返回门店的目标完成情况、完成率和排名信息
+ ///
+ /// 示例请求:
+ /// ```json
+ /// GET /api/Extend/LqEvent/store-data/{eventId}
+ /// ```
+ ///
+ /// 参数说明:
+ /// - eventId: 活动ID,必填参数
+ ///
+ /// 返回信息包括:
+ /// - 门店信息(门店ID、门店名称)
+ /// - 目标统计(总目标数、完成目标数、完成率)
+ /// - 排名信息(按完成率排序)
+ ///
+ /// 活动ID
+ /// 门店统计数据列表
+ /// 成功返回门店统计数据
+ /// 参数错误,活动ID不能为空
+ [HttpGet("store-data/{eventId}")]
+ public async Task GetStoreDataByEventId(string eventId)
+ {
+ if (string.IsNullOrEmpty(eventId))
+ {
+ throw NCCException.Oh("活动ID不能为空");
+ }
+
+ try
+ {
+ // 使用多表查询获取门店统计数据
+ var storeData = await _db.Queryable(
+ (eventUser, store, tkjlb) => eventUser.EventId == eventId && eventUser.StoreId == store.Id && eventUser.UserId == tkjlb.ExpansionUserId && tkjlb.EventId == eventId
+ )
+ .GroupBy((eventUser, store, tkjlb) => new { StoreId = store.Id, StoreName = store.Dm })
+ .Select(
+ (eventUser, store, tkjlb) =>
+ new StoreDataOutput
+ {
+ StoreId = store.Id,
+ StoreName = store.Dm,
+ TotalTarget = SqlFunc.AggregateSum(eventUser.EventTarget),
+ CompletedTarget = SqlFunc.AggregateCount(tkjlb.Id),
+ CompletionRate = 0, // 将在内存中计算
+ Ranking = 0, // 将在内存中计算
+ }
+ )
+ .ToListAsync();
+
+ // 计算完成率和排名
+ foreach (var store in storeData)
+ {
+ if (store.TotalTarget > 0)
+ {
+ store.CompletionRate = Math.Round((decimal)store.CompletedTarget / store.TotalTarget * 100, 2);
+ }
+ }
+
+ // 按完成率降序排序并设置排名
+ var rankedStores = storeData.OrderByDescending(s => s.CompletionRate).ThenByDescending(s => s.CompletedTarget).ToList();
+
+ for (int i = 0; i < rankedStores.Count; i++)
+ {
+ rankedStores[i].Ranking = i + 1;
+ }
+
+ return rankedStores;
+ }
+ catch (Exception ex)
+ {
+ throw NCCException.Oh($"查询活动 {eventId} 门店统计数据失败: {ex.Message}", ex);
+ }
+ }
+ #endregion
+
+ #region 根据活动ID获取人员统计数据
+
+ ///
+ /// 根据活动ID获取人员统计数据
+ ///
+ ///
+ /// 根据活动ID查询该活动下所有参与人员的统计数据
+ /// 返回人员的个人目标完成情况、完成率和排名信息
+ ///
+ /// 示例请求:
+ /// ```json
+ /// GET /api/Extend/LqEvent/person-data/{eventId}
+ /// ```
+ ///
+ /// 参数说明:
+ /// - eventId: 活动ID,必填参数
+ ///
+ /// 返回信息包括:
+ /// - 人员信息(用户ID、用户姓名、门店信息、战队信息)
+ /// - 目标统计(个人目标数、完成目标数、完成率)
+ /// - 排名信息(按完成率排序)
+ /// - 最后拓客时间
+ ///
+ /// 活动ID
+ /// 人员统计数据列表
+ /// 成功返回人员统计数据
+ /// 参数错误,活动ID不能为空
+ [HttpGet("person-data/{eventId}")]
+ public async Task GetPersonDataByEventId(string eventId)
+ {
+ if (string.IsNullOrEmpty(eventId))
+ {
+ throw NCCException.Oh("活动ID不能为空");
+ }
+
+ try
+ {
+ // 第一步:获取所有参与活动的人员基本信息
+ var eventUsers = await _db.Queryable(
+ (eventUser, user, store) => eventUser.EventId == eventId && eventUser.UserId == user.Id && eventUser.StoreId == store.Id
+ )
+ .Select(
+ (eventUser, user, store) =>
+ new
+ {
+ UserId = user.Id,
+ UserName = user.RealName,
+ StoreId = store.Id,
+ StoreName = store.Dm,
+ TeamName = eventUser.TeamName,
+ PersonalTarget = eventUser.EventTarget,
+ }
+ )
+ .ToListAsync();
+ // 第二步:获取每个用户的拓客统计数据
+ var userIds = eventUsers.Select(u => u.UserId).ToList();
+ var expansionStats = new Dictionary();
+ if (userIds.Any())
+ {
+ // 分批查询拓客数据,避免IN查询过大
+ const int batchSize = 500;
+ for (int i = 0; i < userIds.Count; i += batchSize)
+ {
+ var batch = userIds.Skip(i).Take(batchSize).ToList();
+ var stats = await _db.Queryable()
+ .Where(tkjlb => tkjlb.EventId == eventId && batch.Contains(tkjlb.ExpansionUserId))
+ .GroupBy(tkjlb => tkjlb.ExpansionUserId)
+ .Select(tkjlb => new
+ {
+ UserId = tkjlb.ExpansionUserId,
+ Count = SqlFunc.AggregateCount(tkjlb.Id),
+ LastTime = SqlFunc.AggregateMax(tkjlb.CreateTime),
+ })
+ .ToListAsync();
+
+ foreach (var stat in stats)
+ {
+ expansionStats[stat.UserId] = (stat.Count, stat.LastTime);
+ }
+ }
+ }
+
+ // 第三步:合并数据
+ var personData = eventUsers
+ .Select(eventUser => new PersonDataOutput
+ {
+ UserId = eventUser.UserId,
+ UserName = eventUser.UserName,
+ StoreId = eventUser.StoreId,
+ StoreName = eventUser.StoreName,
+ TeamName = eventUser.TeamName,
+ PersonalTarget = eventUser.PersonalTarget,
+ CompletedTarget = expansionStats.ContainsKey(eventUser.UserId) ? expansionStats[eventUser.UserId].Count : 0,
+ CompletionRate = 0, // 将在内存中计算
+ Ranking = 0, // 将在内存中计算
+ LastExpansionTime = expansionStats.ContainsKey(eventUser.UserId) ? expansionStats[eventUser.UserId].LastTime : null,
+ })
+ .ToList();
+
+ // 计算完成率和排名
+ foreach (var person in personData)
+ {
+ if (person.PersonalTarget > 0)
+ {
+ person.CompletionRate = Math.Round((decimal)person.CompletedTarget / person.PersonalTarget * 100, 2);
+ }
+ }
+
+ // 按完成率降序排序并设置排名
+ var rankedPersons = personData.OrderByDescending(p => p.CompletionRate).ThenByDescending(p => p.CompletedTarget).ToList();
+
+ for (int i = 0; i < rankedPersons.Count; i++)
+ {
+ rankedPersons[i].Ranking = i + 1;
+ }
+
+ return rankedPersons;
+ }
+ catch (Exception ex)
+ {
+ throw NCCException.Oh($"查询活动 {eventId} 人员统计数据失败: {ex.Message}", ex);
+ }
+ }
+
+ #endregion
+
#region Excel导入拓客活动用户
///
diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqGzService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqGzService.cs
index 37fd74a..f64da8e 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend/LqGzService.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend/LqGzService.cs
@@ -26,6 +26,7 @@ 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;
@@ -57,6 +58,7 @@ namespace NCC.Extend.LqGz
_logger = logger;
}
+ #region 获取工资全字段
///
/// 获取工资全字段
///
@@ -69,7 +71,9 @@ namespace NCC.Extend.LqGz
var output = entity.Adapt();
return output;
}
+ #endregion
+ #region 获取工资全字段列表
///
/// 获取工资全字段列表
///
@@ -286,7 +290,9 @@ namespace NCC.Extend.LqGz
.ToPagedListAsync(input.currentPage, input.pageSize);
return PageResult.SqlSugarPageResult(data);
}
+ #endregion
+ #region 新建工资全字段
///
/// 新建工资全字段
///
@@ -302,7 +308,9 @@ namespace NCC.Extend.LqGz
if (!(isOk > 0))
throw NCCException.Oh(ErrorCode.COM1000);
}
+ #endregion
+ #region 获取工资全字段无分页列表
///
/// 获取工资全字段无分页列表
///
@@ -519,6 +527,9 @@ namespace NCC.Extend.LqGz
.ToListAsync();
return data;
}
+ #endregion
+
+ #region 导出工资全字段
///
/// 导出工资全字段
@@ -562,7 +573,9 @@ namespace NCC.Extend.LqGz
var output = new { name = excelconfig.FileName, url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fileName, "NCC") };
return output;
}
+ #endregion
+ #region 批量删除工资全字段
///
/// 批量删除工资全字段
///
@@ -591,7 +604,9 @@ namespace NCC.Extend.LqGz
}
}
}
+ #endregion
+ #region 更新工资全字段
///
/// 更新工资全字段
///
@@ -606,7 +621,9 @@ namespace NCC.Extend.LqGz
if (!(isOk > 0))
throw NCCException.Oh(ErrorCode.COM1001);
}
+ #endregion
+ #region 删除工资全字段
///
/// 删除工资全字段
///
@@ -620,6 +637,7 @@ namespace NCC.Extend.LqGz
if (!(isOk > 0))
throw NCCException.Oh(ErrorCode.COM1002);
}
+ #endregion
#region 业绩计算相关方法
@@ -896,5 +914,237 @@ 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/LqHzfService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqHzfService.cs
index 96187a2..4a3b36a 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend/LqHzfService.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend/LqHzfService.cs
@@ -1,34 +1,34 @@
-using NCC.Common.Core.Manager;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using Mapster;
+using Microsoft.AspNetCore.Mvc;
+using NCC.ClayObject;
+using NCC.Common.Configuration;
+using NCC.Common.Core.Manager;
using NCC.Common.Enum;
using NCC.Common.Extension;
using NCC.Common.Filter;
+using NCC.Common.Helper;
+using NCC.Common.Model.NPOI;
+using NCC.DataEncryption;
using NCC.Dependency;
using NCC.DynamicApiController;
-using NCC.FriendlyException;
+using NCC.Extend.Entitys.Dto.LqHzf;
+using NCC.Extend.Entitys.lq_hzf;
using NCC.Extend.Interfaces.LqHzf;
-using Mapster;
-using Microsoft.AspNetCore.Mvc;
+using NCC.FriendlyException;
+using NCC.JsonSerialization;
using SqlSugar;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-using NCC.Extend.Entitys.lq_hzf;
-using NCC.Extend.Entitys.Dto.LqHzf;
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;
namespace NCC.Extend.LqHzf
{
///
/// 合作方服务
///
- [ApiDescriptionSettings(Tag = "Extend",Name = "LqHzf", Order = 200)]
+ [ApiDescriptionSettings(Tag = "Extend", Name = "LqHzf", Order = 200)]
[Route("api/Extend/[controller]")]
public class LqHzfService : ILqHzfService, IDynamicApiController, ITransient
{
@@ -39,11 +39,9 @@ namespace NCC.Extend.LqHzf
///
/// 初始化一个类型的新实例
///
- public LqHzfService(
- ISqlSugarRepository lqHzfRepository,
- IUserManager userManager)
+ public LqHzfService(ISqlSugarRepository lqHzfRepository, IUserManager userManager)
{
- _lqHzfRepository = lqHzfRepository;
+ _lqHzfRepository = lqHzfRepository;
_db = _lqHzfRepository.Context;
_userManager = userManager;
}
@@ -62,10 +60,10 @@ namespace NCC.Extend.LqHzf
}
///
- /// 获取合作方列表
- ///
- /// 请求参数
- ///
+ /// 获取合作方列表
+ ///
+ /// 请求参数
+ ///
[HttpGet("")]
public async Task GetList([FromQuery] LqHzfListQueryInput input)
{
@@ -75,14 +73,17 @@ namespace NCC.Extend.LqHzf
.WhereIF(!string.IsNullOrEmpty(input.hzmc), p => p.Hzmc.Contains(input.hzmc))
.WhereIF(!string.IsNullOrEmpty(input.hzfczb), p => p.Hzfczb.Equals(input.hzfczb))
.WhereIF(!string.IsNullOrEmpty(input.skf), p => p.Skf.Contains(input.skf))
- .Select(it=> new LqHzfListOutput
+ .Select(it => new LqHzfListOutput
{
id = it.Id,
- hzmc=it.Hzmc,
- hzfczb=it.Hzfczb,
- skf=it.Skf,
- }).MergeTable().OrderBy(sidx+" "+input.sort).ToPagedListAsync(input.currentPage, input.pageSize);
- return PageResult.SqlSugarPageResult(data);
+ hzmc = it.Hzmc,
+ hzfczb = it.Hzfczb,
+ skf = it.Skf,
+ })
+ .MergeTable()
+ .OrderBy(sidx + " " + input.sort)
+ .ToPagedListAsync(input.currentPage, input.pageSize);
+ return PageResult.SqlSugarPageResult(data);
}
///
@@ -97,14 +98,15 @@ namespace NCC.Extend.LqHzf
var entity = input.Adapt();
entity.Id = YitIdHelper.NextId().ToString();
var isOk = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync();
- if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1000);
+ if (!(isOk > 0))
+ throw NCCException.Oh(ErrorCode.COM1000);
}
///
- /// 获取合作方无分页列表
- ///
- /// 请求参数
- ///
+ /// 获取合作方无分页列表
+ ///
+ /// 请求参数
+ ///
[NonAction]
public async Task GetNoPagingList([FromQuery] LqHzfListQueryInput input)
{
@@ -114,21 +116,24 @@ namespace NCC.Extend.LqHzf
.WhereIF(!string.IsNullOrEmpty(input.hzmc), p => p.Hzmc.Contains(input.hzmc))
.WhereIF(!string.IsNullOrEmpty(input.hzfczb), p => p.Hzfczb.Equals(input.hzfczb))
.WhereIF(!string.IsNullOrEmpty(input.skf), p => p.Skf.Contains(input.skf))
- .Select(it=> new LqHzfListOutput
+ .Select(it => new LqHzfListOutput
{
id = it.Id,
- hzmc=it.Hzmc,
- hzfczb=it.Hzfczb,
- skf=it.Skf,
- }).MergeTable().OrderBy(sidx+" "+input.sort).ToListAsync();
- return data;
+ hzmc = it.Hzmc,
+ hzfczb = it.Hzfczb,
+ skf = it.Skf,
+ })
+ .MergeTable()
+ .OrderBy(sidx + " " + input.sort)
+ .ToListAsync();
+ return data;
}
///
- /// 导出合作方
- ///
- /// 请求参数
- ///
+ /// 导出合作方
+ ///
+ /// 请求参数
+ ///
[HttpGet("Actions/Export")]
public async Task Export([FromQuery] LqHzfListQueryInput input)
{
@@ -143,7 +148,8 @@ namespace NCC.Extend.LqHzf
{
exportData = await this.GetNoPagingList(input);
}
- List paramList = "[{\"value\":\"合作编号\",\"field\":\"id\"},{\"value\":\"合作名称\",\"field\":\"hzmc\"},{\"value\":\"合作分成占比\",\"field\":\"hzfczb\"},{\"value\":\"收款方\",\"field\":\"skf\"},]".ToList();
+ List paramList =
+ "[{\"value\":\"合作编号\",\"field\":\"id\"},{\"value\":\"合作名称\",\"field\":\"hzmc\"},{\"value\":\"合作分成占比\",\"field\":\"hzfczb\"},{\"value\":\"收款方\",\"field\":\"skf\"},]".ToList();
ExcelConfig excelconfig = new ExcelConfig();
excelconfig.FileName = "合作方.xls";
excelconfig.HeadFont = "微软雅黑";
@@ -162,11 +168,7 @@ namespace NCC.Extend.LqHzf
var addPath = FileVariable.TemporaryFilePath + excelconfig.FileName;
ExcelExportHelper.Export(exportData, excelconfig, addPath);
var fileName = _userManager.UserId + "|" + addPath + "|xls";
- var output = new
- {
- name = excelconfig.FileName,
- url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fileName, "NCC")
- };
+ var output = new { name = excelconfig.FileName, url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fileName, "NCC") };
return output;
}
@@ -186,7 +188,7 @@ namespace NCC.Extend.LqHzf
//开启事务
_db.BeginTran();
//批量删除合作方
- await _db.Deleteable().In(d => d.Id,ids).ExecuteCommandAsync();
+ await _db.Deleteable().In(d => d.Id, ids).ExecuteCommandAsync();
//关闭事务
_db.CommitTran();
}
@@ -210,7 +212,8 @@ namespace NCC.Extend.LqHzf
{
var entity = input.Adapt();
var isOk = await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
- if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1001);
+ if (!(isOk > 0))
+ throw NCCException.Oh(ErrorCode.COM1001);
}
///
@@ -223,7 +226,8 @@ namespace NCC.Extend.LqHzf
var entity = await _db.Queryable().FirstAsync(p => p.Id == id);
_ = entity ?? throw NCCException.Oh(ErrorCode.COM1005);
var isOk = await _db.Deleteable().Where(d => d.Id == id).ExecuteCommandAsync();
- if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1002);
+ if (!(isOk > 0))
+ throw NCCException.Oh(ErrorCode.COM1002);
}
}
}
diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs
index 9a16689..5ad398a 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs
@@ -25,6 +25,7 @@ using NCC.Extend.Entitys.lq_kd_jksyj;
using NCC.Extend.Entitys.lq_kd_kdjlb;
using NCC.Extend.Entitys.lq_kd_kjbsyj;
using NCC.Extend.Entitys.lq_kd_pxmx;
+using NCC.Extend.Entitys.lq_khxx;
using NCC.Extend.Entitys.lq_xmzl;
using NCC.Extend.Interfaces.LqKdKdjlb;
using NCC.Extend.Utils;
@@ -191,7 +192,6 @@ namespace NCC.Extend.LqKdKdjlb
.WhereIF(!string.IsNullOrEmpty(input.sfyj), p => p.Sfyj.Equals(input.sfyj))
.WhereIF(!string.IsNullOrEmpty(input.qk), p => p.Qk.Equals(input.qk))
.WhereIF(!string.IsNullOrEmpty(input.ckfs), p => p.Ckfs.Equals(input.ckfs))
- .WhereIF(!string.IsNullOrEmpty(input.ckmx), p => p.Ckmx.Contains(input.ckmx))
.WhereIF(!string.IsNullOrEmpty(input.fkfs), p => p.Fkfs.Equals(input.fkfs))
.WhereIF(!string.IsNullOrEmpty(input.fkyy), p => p.Fkyy.Equals(input.fkyy))
.WhereIF(!string.IsNullOrEmpty(input.fkpd), p => p.Fkpd.Contains(input.fkpd))
@@ -219,12 +219,12 @@ namespace NCC.Extend.LqKdKdjlb
sfyj = it.Sfyj,
qk = it.Qk,
ckfs = it.Ckfs,
- ckmx = it.Ckmx,
fkfs = it.Fkfs,
fkyy = it.Fkyy,
fkpd = it.Fkpd,
khly = it.Khly,
tjr = it.Tjr,
+ deductAmount = it.DeductAmount,
sfskdd = it.Sfskdd,
jj = it.Jj,
bz = it.Bz,
@@ -263,6 +263,7 @@ namespace NCC.Extend.LqKdKdjlb
_db.BeginTran();
//新增开单记录表记录
entity.CreateUser = userInfo.userId;
+ entity.DeductAmount = input.lqKdKdjlbDeductList.Sum(x => x.Amount ?? 0);//计算储扣总金额
var newEntity = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteReturnEntityAsync();
//循环品相信息
// 收集所有需要插入的实体,然后批量插入
@@ -347,6 +348,10 @@ namespace NCC.Extend.LqKdKdjlb
}
}
}
+ //通过会员id查询会员信息
+ var memberInfo = await _db.Queryable().Where(u => u.Id == entity.Kdhy).FirstAsync();
+ memberInfo.Khlx = "老客";
+ await _db.Updateable(memberInfo).ExecuteCommandAsync();
// 批量插入扣款信息
if (allDeductEntities.Any())
{
@@ -442,7 +447,6 @@ namespace NCC.Extend.LqKdKdjlb
.WhereIF(!string.IsNullOrEmpty(input.sfyj), p => p.Sfyj.Equals(input.sfyj))
.WhereIF(!string.IsNullOrEmpty(input.qk), p => p.Qk.Equals(input.qk))
.WhereIF(!string.IsNullOrEmpty(input.ckfs), p => p.Ckfs.Equals(input.ckfs))
- .WhereIF(!string.IsNullOrEmpty(input.ckmx), p => p.Ckmx.Contains(input.ckmx))
.WhereIF(!string.IsNullOrEmpty(input.fkfs), p => p.Fkfs.Equals(input.fkfs))
.WhereIF(!string.IsNullOrEmpty(input.fkyy), p => p.Fkyy.Equals(input.fkyy))
.WhereIF(!string.IsNullOrEmpty(input.fkpd), p => p.Fkpd.Contains(input.fkpd))
@@ -470,7 +474,7 @@ namespace NCC.Extend.LqKdKdjlb
sfyj = it.Sfyj,
qk = it.Qk,
ckfs = it.Ckfs,
- ckmx = it.Ckmx,
+ deductAmount = it.DeductAmount,
fkfs = it.Fkfs,
fkyy = it.Fkyy,
fkpd = it.Fkpd,
diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs
index b396a74..a7e0613 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs
@@ -16,8 +16,10 @@ using NCC.Common.Model.NPOI;
using NCC.DataEncryption;
using NCC.Dependency;
using NCC.DynamicApiController;
+using NCC.Extend.Entitys.Dto.Common;
using NCC.Extend.Entitys.Dto.LqKhxx;
using NCC.Extend.Entitys.Dto.LqXhHyhk;
+using NCC.Extend.Entitys.Enum;
using NCC.Extend.Entitys.lq_hytk_hytk;
using NCC.Extend.Entitys.lq_hytk_mx;
using NCC.Extend.Entitys.lq_kd_kdjlb;
@@ -90,7 +92,6 @@ namespace NCC.Extend.LqKhxx
.WhereIF(!string.IsNullOrEmpty(input.gzhzt), p => p.Gzhzt.Equals(input.gzhzt))
.WhereIF(!string.IsNullOrEmpty(input.wxnc), p => p.Wxnc.Contains(input.wxnc))
.WhereIF(!string.IsNullOrEmpty(input.wxxcxzt), p => p.Wxxcxzt.Equals(input.wxxcxzt))
- .WhereIF(!string.IsNullOrEmpty(input.khmqgs), p => p.Khmqgs.Equals(input.khmqgs))
.WhereIF(!string.IsNullOrEmpty(input.gsmd), p => p.Gsmd.Contains(input.gsmd))
.WhereIF(!string.IsNullOrEmpty(input.khlx), p => p.Khlx.Equals(input.khlx))
.WhereIF(!string.IsNullOrEmpty(input.khjd), p => p.Khjd.Equals(input.khjd))
@@ -114,7 +115,6 @@ namespace NCC.Extend.LqKhxx
wxnc = it.Wxnc,
wxxcxzt = it.Wxxcxzt,
zjdlsj = it.Zjdlsj,
- khmqgs = it.Khmqgs,
gsmd = it.Gsmd,
zcsj = it.Zcsj,
khlx = it.Khlx,
@@ -157,7 +157,6 @@ namespace NCC.Extend.LqKhxx
}
var entity = input.Adapt();
entity.Id = YitIdHelper.NextId().ToString();
-
// 处理客户消费字段:将数组转换为逗号分隔的字符串
if (input.khxf != null && input.khxf.Count > 0)
{
@@ -203,7 +202,6 @@ namespace NCC.Extend.LqKhxx
.WhereIF(!string.IsNullOrEmpty(input.wxxcxzt), p => p.Wxxcxzt.Equals(input.wxxcxzt))
// .WhereIF(queryZjdlsj != null, p => p.Zjdlsj >= new DateTime(startZjdlsj.ToDate().Year, startZjdlsj.ToDate().Month, startZjdlsj.ToDate().Day, 0, 0, 0))
// .WhereIF(queryZjdlsj != null, p => p.Zjdlsj <= new DateTime(endZjdlsj.ToDate().Year, endZjdlsj.ToDate().Month, endZjdlsj.ToDate().Day, 23, 59, 59))
- .WhereIF(!string.IsNullOrEmpty(input.khmqgs), p => p.Khmqgs.Equals(input.khmqgs))
.WhereIF(!string.IsNullOrEmpty(input.gsmd), p => p.Gsmd.Contains(input.gsmd))
.WhereIF(queryZcsj != null, p => p.Zcsj >= new DateTime(startZcsj.ToDate().Year, startZcsj.ToDate().Month, startZcsj.ToDate().Day, 0, 0, 0))
.WhereIF(queryZcsj != null, p => p.Zcsj <= new DateTime(endZcsj.ToDate().Year, endZcsj.ToDate().Month, endZcsj.ToDate().Day, 23, 59, 59))
@@ -233,7 +231,6 @@ namespace NCC.Extend.LqKhxx
wxnc = it.Wxnc,
wxxcxzt = it.Wxxcxzt,
zjdlsj = it.Zjdlsj,
- khmqgs = it.Khmqgs,
gsmd = it.Gsmd,
zcsj = it.Zcsj,
khlx = it.Khlx,
@@ -282,7 +279,7 @@ namespace NCC.Extend.LqKhxx
DateTime? endYinlsr = queryYinlsr != null ? Ext.GetDateTime(queryYinlsr.Last()) : null;
var data = await _db.Queryable()
- .Where(p => p.Khmqgs == "线索池") // 固定查询线索池客户
+ .Where(p => p.Khlx == "线索") // 固定查询线索池客户
.WhereIF(!string.IsNullOrEmpty(input.id), p => p.Id.Contains(input.id))
.WhereIF(!string.IsNullOrEmpty(input.khmc), p => p.Khmc.Contains(input.khmc))
.WhereIF(!string.IsNullOrEmpty(input.sjh), p => p.Sjh.Contains(input.sjh))
@@ -291,7 +288,6 @@ namespace NCC.Extend.LqKhxx
.WhereIF(!string.IsNullOrEmpty(input.gzhzt), p => p.Gzhzt.Equals(input.gzhzt))
.WhereIF(!string.IsNullOrEmpty(input.wxnc), p => p.Wxnc.Contains(input.wxnc))
.WhereIF(!string.IsNullOrEmpty(input.wxxcxzt), p => p.Wxxcxzt.Equals(input.wxxcxzt))
- .WhereIF(!string.IsNullOrEmpty(input.khmqgs), p => p.Khmqgs.Equals(input.khmqgs))
.WhereIF(!string.IsNullOrEmpty(input.gsmd), p => p.Gsmd.Contains(input.gsmd))
.WhereIF(queryZcsj != null, p => p.Zcsj >= new DateTime(startZcsj.ToDate().Year, startZcsj.ToDate().Month, startZcsj.ToDate().Day, 0, 0, 0))
.WhereIF(queryZcsj != null, p => p.Zcsj <= new DateTime(endZcsj.ToDate().Year, endZcsj.ToDate().Month, endZcsj.ToDate().Day, 23, 59, 59))
@@ -321,7 +317,6 @@ namespace NCC.Extend.LqKhxx
wxnc = it.Wxnc,
wxxcxzt = it.Wxxcxzt,
zjdlsj = it.Zjdlsj,
- khmqgs = it.Khmqgs,
gsmd = it.Gsmd,
zcsj = it.Zcsj,
khlx = it.Khlx,
@@ -570,10 +565,10 @@ namespace NCC.Extend.LqKhxx
TotalPurchased = x.ProjectNumber,
ConsumedCount = SqlFunc.Subqueryable().Where(y => y.BillingItemId == x.Id).Sum(y => SqlFunc.ToDecimal(y.ProjectNumber)),
RefundedCount = SqlFunc.Subqueryable().Where(y => y.BillingItemId == x.Id).Sum(y => SqlFunc.ToDecimal(y.ProjectNumber)),
- RemainingCount =
- x.ProjectNumber
- - SqlFunc.Subqueryable().Where(y => y.BillingItemId == x.Id).Sum(y => SqlFunc.ToDecimal(y.ProjectNumber))
- - SqlFunc.Subqueryable().Where(y => y.BillingItemId == x.Id).Sum(y => SqlFunc.ToDecimal(y.ProjectNumber)),
+ })
+ .Mapper(x =>
+ {
+ x.RemainingCount = x.TotalPurchased - x.ConsumedCount - x.RefundedCount;
})
.ToListAsync();
return new MemberRemainingItemsOutput
@@ -590,5 +585,25 @@ namespace NCC.Extend.LqKhxx
}
}
#endregion
+
+ #region 获取会员类型枚举内容
+ ///
+ /// 获取会员类型枚举内容
+ ///
+ /// 扣款类型枚举列表
+ [HttpGet("deduct-types")]
+ public List GetDeductTypes()
+ {
+ return Enum.GetValues()
+ .Select(e => new EnumOutput
+ {
+ Value = (int)e,
+ Name = e.ToString(),
+ Description = e.GetDescription(),
+ })
+ .ToList();
+ }
+ #endregion
+
}
}
diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs
index d1026f3..912eceb 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs
@@ -19,6 +19,7 @@ using NCC.Extend.Entitys.Dto.LqTkjlb;
using NCC.Extend.Entitys.lq_event;
using NCC.Extend.Entitys.lq_eventuser;
using NCC.Extend.Entitys.lq_khxx;
+using NCC.Extend.Entitys.lq_mdxx;
using NCC.Extend.Entitys.lq_ryzl;
using NCC.Extend.Entitys.lq_tkjlb;
using NCC.Extend.Interfaces.LqTkjlb;
@@ -145,14 +146,14 @@ namespace NCC.Extend.LqTkjlb
/// 参数
///
[HttpPost("")]
- public async Task Create([FromBody] LqTkjlbCrInput input)
+ public async Task Create([FromBody] LqTkjlbCrInput input)
{
var userInfo = await _userManager.GetUserInfo();
//通过input.dhhm去查询用户信息
var user = _db.Queryable().Where(u => u.Sjh == input.customerPhone).Any();
if (user)
{
- throw NCCException.Oh("该手机号码已存在于会员或线索池中");
+ return NCCException.Oh("该手机号码已存在于会员或线索池中");
}
// 使用事务确保数据一致性
var result = await _db.Ado.UseTranAsync(async () =>
@@ -179,18 +180,22 @@ namespace NCC.Extend.LqTkjlb
MemberInfo.Id = YitIdHelper.NextId().ToString();
MemberInfo.Khmc = entity.CustomerName;
MemberInfo.Sjh = input.customerPhone; // 设置手机号
- MemberInfo.Khmqgs = "线索池";
+ MemberInfo.Khlx = "线索";
MemberInfo.Dah = "GK" + DateTime.Now.ToString("yyyyMMddHHmmss");
var memberResult = await _db.Insertable(MemberInfo).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync();
if (!(memberResult > 0))
+ {
throw NCCException.Oh("创建客户信息失败");
- return true;
+ }
+ var storeinfo = await _db.Queryable().Where(u => u.Id == eventUserInfo.StoreId).FirstAsync();
+ return new { entity = entity, storeinfo = storeinfo };
});
if (!result.IsSuccess)
{
- throw NCCException.Oh($"创建拓客记录失败:{result.ErrorMessage}");
+ return NCCException.Oh($"创建拓客记录失败:{result.ErrorMessage}");
}
+ return result.Data;
}
#endregion
diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqYaoyjlService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqYaoyjlService.cs
index f2dee24..3a493e6 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend/LqYaoyjlService.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend/LqYaoyjlService.cs
@@ -28,7 +28,7 @@ namespace NCC.Extend.LqYaoyjl
///
/// 邀约记录服务
///
- [ApiDescriptionSettings(Tag = "Extend",Name = "LqYaoyjl", Order = 200)]
+ [ApiDescriptionSettings(Tag = "Extend", Name = "LqYaoyjl", Order = 200)]
[Route("api/Extend/[controller]")]
public class LqYaoyjlService : ILqYaoyjlService, IDynamicApiController, ITransient
{
@@ -43,7 +43,7 @@ namespace NCC.Extend.LqYaoyjl
ISqlSugarRepository lqYaoyjlRepository,
IUserManager userManager)
{
- _lqYaoyjlRepository = lqYaoyjlRepository;
+ _lqYaoyjlRepository = lqYaoyjlRepository;
_db = _lqYaoyjlRepository.Context;
_userManager = userManager;
}
@@ -87,18 +87,18 @@ namespace NCC.Extend.LqYaoyjl
.WhereIF(queryLxsj != null, p => p.Lxsj >= new DateTime(startLxsj.ToDate().Year, startLxsj.ToDate().Month, startLxsj.ToDate().Day, 0, 0, 0))
.WhereIF(queryLxsj != null, p => p.Lxsj <= new DateTime(endLxsj.ToDate().Year, endLxsj.ToDate().Month, endLxsj.ToDate().Day, 23, 59, 59))
.WhereIF(!string.IsNullOrEmpty(input.lxjl), p => p.Lxjl.Contains(input.lxjl))
- .Select(it=> new LqYaoyjlListOutput
+ .Select(it => new LqYaoyjlListOutput
{
id = it.Id,
- yyr=it.Yyr,
- yysj=it.Yysj,
- yykh=it.Yykh,
- yykhxm=it.Yykhxm,
- dhsfyx=it.Dhsfyx,
- lxsj=it.Lxsj,
- lxjl=it.Lxjl,
- }).MergeTable().OrderBy(sidx+" "+input.sort).ToPagedListAsync(input.currentPage, input.pageSize);
- return PageResult.SqlSugarPageResult(data);
+ yyr = it.Yyr,
+ yysj = it.Yysj,
+ yykh = it.Yykh,
+ yykhxm = it.Yykhxm,
+ dhsfyx = it.Dhsfyx,
+ lxsj = it.Lxsj,
+ lxjl = it.Lxjl,
+ }).MergeTable().OrderBy(sidx + " " + input.sort).ToPagedListAsync(input.currentPage, input.pageSize);
+ return PageResult.SqlSugarPageResult(data);
}
///
@@ -142,18 +142,18 @@ namespace NCC.Extend.LqYaoyjl
.WhereIF(queryLxsj != null, p => p.Lxsj >= new DateTime(startLxsj.ToDate().Year, startLxsj.ToDate().Month, startLxsj.ToDate().Day, 0, 0, 0))
.WhereIF(queryLxsj != null, p => p.Lxsj <= new DateTime(endLxsj.ToDate().Year, endLxsj.ToDate().Month, endLxsj.ToDate().Day, 23, 59, 59))
.WhereIF(!string.IsNullOrEmpty(input.lxjl), p => p.Lxjl.Contains(input.lxjl))
- .Select(it=> new LqYaoyjlListOutput
+ .Select(it => new LqYaoyjlListOutput
{
id = it.Id,
- yyr=it.Yyr,
- yysj=it.Yysj,
- yykh=it.Yykh,
- yykhxm=it.Yykhxm,
- dhsfyx=it.Dhsfyx,
- lxsj=it.Lxsj,
- lxjl=it.Lxjl,
- }).MergeTable().OrderBy(sidx+" "+input.sort).ToListAsync();
- return data;
+ yyr = it.Yyr,
+ yysj = it.Yysj,
+ yykh = it.Yykh,
+ yykhxm = it.Yykhxm,
+ dhsfyx = it.Dhsfyx,
+ lxsj = it.Lxsj,
+ lxjl = it.Lxjl,
+ }).MergeTable().OrderBy(sidx + " " + input.sort).ToListAsync();
+ return data;
}
///
@@ -175,7 +175,7 @@ namespace NCC.Extend.LqYaoyjl
{
exportData = await this.GetNoPagingList(input);
}
- List paramList = "[{\"value\":\"邀约编号\",\"field\":\"id\"},{\"value\":\"邀约人\",\"field\":\"yyr\"},{\"value\":\"邀约时间\",\"field\":\"yysj\"},{\"value\":\"邀约客户\",\"field\":\"yykh\"},{\"value\":\"邀约客户姓名\",\"field\":\"yykhxm\"},{\"value\":\"电话是否有效\",\"field\":\"dhsfyx\"},{\"value\":\"联系时间\",\"field\":\"lxsj\"},{\"value\":\"联系记录\",\"field\":\"lxjl\"},]".ToList();
+ List paramList = "[{\"value\":\"邀约编号\",\"field\":\"id\"},{\"value\":\"邀约人\",\"field\":\"yyr\"},{\"value\":\"邀约时间\",\"field\":\"yysj\"},{\"value\":\"邀约客户\",\"field\":\"yykh\"},{\"value\":\"邀约客户姓名\",\"field\":\"yykhxm\"},{\"value\":\"电话是否有效\",\"field\":\"dhsfyx\"},{\"value\":\"联系时间\",\"field\":\"lxsj\"},{\"value\":\"联系记录\",\"field\":\"lxjl\"},]".ToList();
ExcelConfig excelconfig = new ExcelConfig();
excelconfig.FileName = "邀约记录.xls";
excelconfig.HeadFont = "微软雅黑";
@@ -218,7 +218,7 @@ namespace NCC.Extend.LqYaoyjl
//开启事务
_db.BeginTran();
//批量删除邀约记录
- await _db.Deleteable().In(d => d.Id,ids).ExecuteCommandAsync();
+ await _db.Deleteable().In(d => d.Id, ids).ExecuteCommandAsync();
//关闭事务
_db.CommitTran();
}
diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs
index ad88e2f..8a180ce 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs
@@ -180,13 +180,14 @@ namespace NCC.Extend.LqYcsdJsj
}
// 查询门店信息
var store = await _db.Queryable().Where(x => x.Id == jsj.Md).FirstAsync();
- return new
+ return new LqYcsdJsjByUserMonthOutput
{
jsjId = jsj.Id,
jsjName = jsj.Jsj,
month = jsj.Yf,
storeId = jsj.Md,
storeName = store?.Dm,
+ userId = jsjUser.UserId,
userName = jsjUser.UserName,
isLeader = jsjUser.IsLeader,
status = jsjUser.Status,
@@ -256,16 +257,16 @@ namespace NCC.Extend.LqYcsdJsj
return new LqYcsdJsjByUserMonthOutput
{
- JsjId = jsj.Id,
- JsjName = jsj.Jsj,
- Month = jsj.Yf,
- StoreId = jsj.Md,
- StoreName = store?.Dm,
- UserId = jsjUser.UserId,
- UserName = jsjUser.UserName,
- IsLeader = jsjUser.IsLeader,
- Status = jsjUser.Status,
- SortOrder = jsjUser.SortOrder,
+ jsjId = jsj.Id,
+ jsjName = jsj.Jsj,
+ month = jsj.Yf,
+ storeId = jsj.Md,
+ storeName = store?.Dm,
+ userId = jsjUser.UserId,
+ userName = jsjUser.UserName,
+ isLeader = jsjUser.IsLeader,
+ status = jsjUser.Status,
+ sortOrder = jsjUser.SortOrder,
};
}
#endregion