From 7a656373d0efa52534803b1976ec46c71ca0c384 Mon Sep 17 00:00:00 2001 From: “wangming” <“wangming@antissoft.com”> Date: Tue, 28 Oct 2025 17:51:34 +0800 Subject: [PATCH] refactor: 营销活动统计改为分页返回开单列表,移除退卡统计 --- netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqPackageInfo/ActivityStatisticsInput.cs | 10 ++++++++++ netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqPackageInfo/ActivityStatisticsOutput.cs | 53 ++++++++++++++++++++++++++++++++++++++++------------- netcore/src/Modularity/Extend/NCC.Extend/LqPackageInfoService.cs | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------- 3 files changed, 109 insertions(+), 62 deletions(-) diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqPackageInfo/ActivityStatisticsInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqPackageInfo/ActivityStatisticsInput.cs index be246de..e958e3a 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqPackageInfo/ActivityStatisticsInput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqPackageInfo/ActivityStatisticsInput.cs @@ -28,5 +28,15 @@ namespace NCC.Extend.Entitys.Dto.LqPackageInfo /// 门店ID列表(可选) /// public string[] StoreIds { get; set; } + + /// + /// 页码(默认1) + /// + public int PageIndex { get; set; } = 1; + + /// + /// 每页数量(默认20) + /// + public int PageSize { get; set; } = 20; } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqPackageInfo/ActivityStatisticsOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqPackageInfo/ActivityStatisticsOutput.cs index 4d46dec..84bb9cf 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqPackageInfo/ActivityStatisticsOutput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqPackageInfo/ActivityStatisticsOutput.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; namespace NCC.Extend.Entitys.Dto.LqPackageInfo { @@ -18,9 +19,9 @@ namespace NCC.Extend.Entitys.Dto.LqPackageInfo public string ActivityName { get; set; } /// - /// 开单数量 + /// 总记录数 /// - public int BillingCount { get; set; } + public int Total { get; set; } /// /// 开单金额 @@ -28,32 +29,58 @@ namespace NCC.Extend.Entitys.Dto.LqPackageInfo public decimal BillingAmount { get; set; } /// - /// 退卡数量 + /// 欠款金额(所有开单的欠款总和) + /// + public decimal DebtAmount { get; set; } + + /// + /// 开单列表 /// - public int RefundCount { get; set; } + public List BillingList { get; set; } + } + /// + /// 活动开单项 + /// + public class ActivityBillingItem + { /// - /// 退卡金额 + /// 开单ID /// - public decimal RefundAmount { get; set; } + public string BillingId { get; set; } /// - /// 净开单数量(开单数量 - 退卡数量) + /// 开单日期 /// - public int NetBillingCount { get; set; } + public DateTime? BillingDate { get; set; } /// - /// 净开单金额(开单金额 - 退卡金额) + /// 客户名称 /// - public decimal NetBillingAmount { get; set; } + public string CustomerName { get; set; } /// - /// 退卡率(退卡数量 / 开单数量) + /// 客户电话 /// - public decimal RefundRate { get; set; } + public string CustomerPhone { get; set; } /// - /// 欠款金额(所有开单的欠款总和) + /// 门店ID + /// + public string StoreId { get; set; } + + /// + /// 门店名称 + /// + public string StoreName { get; set; } + + /// + /// 开单金额 + /// + public decimal Amount { get; set; } + + /// + /// 欠款金额 /// public decimal DebtAmount { get; set; } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqPackageInfoService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqPackageInfoService.cs index 6ef5529..cf00b62 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqPackageInfoService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqPackageInfoService.cs @@ -557,8 +557,8 @@ namespace NCC.Extend.LqPackageInfo /// 获取营销活动统计数据 /// /// - /// 统计指定营销活动的开单、退卡相关数据 - /// 包括:开单数量、开单金额、退卡数量、退卡金额、净开单数量、净开单金额、退卡率 + /// 统计指定营销活动的开单数据,支持分页 + /// 包括:总记录数、开单总金额、欠款总金额、开单列表 /// /// 示例请求: /// ```json @@ -566,7 +566,9 @@ namespace NCC.Extend.LqPackageInfo /// "activityId": "营销活动ID", /// "startTime": "2025-10-01", /// "endTime": "2025-10-31", - /// "storeIds": ["门店ID1", "门店ID2"] + /// "storeIds": ["门店ID1", "门店ID2"], + /// "pageIndex": 1, + /// "pageSize": 20 /// } /// ``` /// @@ -575,18 +577,16 @@ namespace NCC.Extend.LqPackageInfo /// - startTime: 开始时间(可选,默认为活动开始时间) /// - endTime: 结束时间(可选,默认为活动结束时间) /// - storeIds: 门店ID列表(可选) + /// - pageIndex: 页码(默认1) + /// - pageSize: 每页数量(默认20) /// /// 返回字段说明: /// - ActivityId: 营销活动ID /// - ActivityName: 营销活动名称 - /// - BillingCount: 开单数量 - /// - BillingAmount: 开单金额 - /// - RefundCount: 退卡数量 - /// - RefundAmount: 退卡金额 - /// - NetBillingCount: 净开单数量(开单数量 - 退卡数量) - /// - NetBillingAmount: 净开单金额(开单金额 - 退卡金额) - /// - RefundRate: 退卡率(退卡数量 / 开单数量) - /// - DebtAmount: 欠款金额(所有开单的欠款总和) + /// - Total: 总记录数 + /// - BillingAmount: 开单总金额 + /// - DebtAmount: 欠款总金额 + /// - BillingList: 开单列表(包含开单ID、日期、客户信息、门店信息、金额、欠款等) /// /// 查询参数 /// 营销活动统计数据 @@ -614,21 +614,19 @@ namespace NCC.Extend.LqPackageInfo // 3. 构建门店过滤条件 string storeFilter = ""; - string storeFilterRefund = ""; if (input.StoreIds != null && input.StoreIds.Any()) { var storeIdsStr = string.Join("','", input.StoreIds); storeFilter = $"AND kd.djmd IN ('{storeIdsStr}')"; - storeFilterRefund = $"AND hytk.md IN ('{storeIdsStr}')"; } - // 4. 开单统计 - 直接从开单主表查询,通过F_ActivityId过滤 - var billingSql = $@" + // 4. 获取总记录数和总金额 + var totalSql = $@" SELECT - COUNT(DISTINCT kd.F_Id) as billing_count, - SUM(CAST(kd.sfyj AS DECIMAL(18,2))) as billing_amount, - SUM(CAST(kd.qk AS DECIMAL(18,2))) as debt_amount + COUNT(*) as total, + COALESCE(SUM(CAST(kd.sfyj AS DECIMAL(18,2))), 0) as billing_amount, + COALESCE(SUM(CAST(kd.qk AS DECIMAL(18,2))), 0) as debt_amount FROM lq_kd_kdjlb kd WHERE kd.F_IsEffective = 1 AND kd.F_ActivityId = '{input.ActivityId}' @@ -636,44 +634,56 @@ namespace NCC.Extend.LqPackageInfo AND kd.kdrq <= '{endTime:yyyy-MM-dd HH:mm:ss}' {storeFilter}"; - var billingData = await _db.Ado.SqlQueryAsync(billingSql); - var billingCount = Convert.ToInt32(billingData.FirstOrDefault()?.billing_count ?? 0); - var billingAmount = Convert.ToDecimal(billingData.FirstOrDefault()?.billing_amount ?? 0); - var debtAmount = Convert.ToDecimal(billingData.FirstOrDefault()?.debt_amount ?? 0); + var totalData = await _db.Ado.SqlQueryAsync(totalSql); + var total = Convert.ToInt32(totalData.FirstOrDefault()?.total ?? 0); + var billingAmount = Convert.ToDecimal(totalData.FirstOrDefault()?.billing_amount ?? 0); + var debtAmount = Convert.ToDecimal(totalData.FirstOrDefault()?.debt_amount ?? 0); - // 5. 退卡统计 - 直接从退卡主表查询 - var refundSql = $@" + // 5. 分页查询开单列表 + var offset = (input.PageIndex - 1) * input.PageSize; + var billingListSql = $@" SELECT - COUNT(DISTINCT hytk.F_Id) as refund_count, - SUM(CAST(hytk.tkje AS DECIMAL(18,2))) as refund_amount - FROM lq_hytk_hytk hytk - WHERE hytk.F_IsEffective = 1 - AND hytk.tksj >= '{startTime:yyyy-MM-dd HH:mm:ss}' - AND hytk.tksj <= '{endTime:yyyy-MM-dd HH:mm:ss}' - {storeFilterRefund}"; - - var refundData = await _db.Ado.SqlQueryAsync(refundSql); - var refundCount = Convert.ToInt32(refundData.FirstOrDefault()?.refund_count ?? 0); - var refundAmount = Convert.ToDecimal(refundData.FirstOrDefault()?.refund_amount ?? 0); - - // 8. 计算净值和退卡率 - var netBillingCount = billingCount - refundCount; - var netBillingAmount = billingAmount - refundAmount; - var refundRate = billingCount > 0 ? Math.Round((decimal)refundCount / billingCount * 100, 2) : 0; - - // 9. 返回统计结果 + kd.F_Id as BillingId, + kd.kdrq as BillingDate, + COALESCE(kh.khmc, '') as CustomerName, + COALESCE(kh.sjh, '') as CustomerPhone, + kd.djmd as StoreId, + COALESCE(md.dm, '') as StoreName, + CAST(kd.sfyj AS DECIMAL(18,2)) as Amount, + CAST(kd.qk AS DECIMAL(18,2)) as DebtAmount + FROM lq_kd_kdjlb kd + LEFT JOIN lq_khxx kh ON kd.kdhy = kh.F_Id + LEFT JOIN lq_mdxx md ON kd.djmd = md.F_Id + WHERE kd.F_IsEffective = 1 + AND kd.F_ActivityId = '{input.ActivityId}' + AND kd.kdrq >= '{startTime:yyyy-MM-dd HH:mm:ss}' + AND kd.kdrq <= '{endTime:yyyy-MM-dd HH:mm:ss}' + {storeFilter} + ORDER BY kd.kdrq DESC + LIMIT {input.PageSize} OFFSET {offset}"; + + var billingListData = await _db.Ado.SqlQueryAsync(billingListSql); + var billingList = billingListData?.Select(item => new ActivityBillingItem + { + BillingId = item.BillingId?.ToString(), + BillingDate = item.BillingDate != null ? (DateTime?)item.BillingDate : null, + CustomerName = item.CustomerName?.ToString(), + CustomerPhone = item.CustomerPhone?.ToString(), + StoreId = item.StoreId?.ToString(), + StoreName = item.StoreName?.ToString(), + Amount = Convert.ToDecimal(item.Amount ?? 0), + DebtAmount = Convert.ToDecimal(item.DebtAmount ?? 0) + }).ToList() ?? new List(); + + // 6. 返回统计结果 return new ActivityStatisticsOutput { ActivityId = input.ActivityId, ActivityName = activity.ActivityName, - BillingCount = billingCount, + Total = total, BillingAmount = billingAmount, - RefundCount = refundCount, - RefundAmount = refundAmount, - NetBillingCount = netBillingCount, - NetBillingAmount = netBillingAmount, - RefundRate = refundRate, - DebtAmount = debtAmount + DebtAmount = debtAmount, + BillingList = billingList }; } catch (Exception ex) -- libgit2 0.21.4