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