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