Commit 7a656373d0efa52534803b1976ec46c71ca0c384

Authored by “wangming”
1 parent 769ed4ee

refactor: 营销活动统计改为分页返回开单列表,移除退卡统计

- 移除所有退卡相关统计和输出字段
- 输出改为分页列表,包含开单详情
- 新增Total、BillingList字段,返回开单列表
- 开单列表包含:开单ID、日期、客户信息、门店信息、金额、欠款
- 支持分页参数:pageIndex、pageSize
- 更新接口注释和相关文档
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqPackageInfo/ActivityStatisticsInput.cs
@@ -28,5 +28,15 @@ namespace NCC.Extend.Entitys.Dto.LqPackageInfo @@ -28,5 +28,15 @@ namespace NCC.Extend.Entitys.Dto.LqPackageInfo
28 /// 门店ID列表(可选) 28 /// 门店ID列表(可选)
29 /// </summary> 29 /// </summary>
30 public string[] StoreIds { get; set; } 30 public string[] StoreIds { get; set; }
  31 +
  32 + /// <summary>
  33 + /// 页码(默认1)
  34 + /// </summary>
  35 + public int PageIndex { get; set; } = 1;
  36 +
  37 + /// <summary>
  38 + /// 每页数量(默认20)
  39 + /// </summary>
  40 + public int PageSize { get; set; } = 20;
31 } 41 }
32 } 42 }
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqPackageInfo/ActivityStatisticsOutput.cs
1 using System; 1 using System;
  2 +using System.Collections.Generic;
2 3
3 namespace NCC.Extend.Entitys.Dto.LqPackageInfo 4 namespace NCC.Extend.Entitys.Dto.LqPackageInfo
4 { 5 {
@@ -18,9 +19,9 @@ namespace NCC.Extend.Entitys.Dto.LqPackageInfo @@ -18,9 +19,9 @@ namespace NCC.Extend.Entitys.Dto.LqPackageInfo
18 public string ActivityName { get; set; } 19 public string ActivityName { get; set; }
19 20
20 /// <summary> 21 /// <summary>
21 - /// 开单数量 22 + /// 总记录数
22 /// </summary> 23 /// </summary>
23 - public int BillingCount { get; set; } 24 + public int Total { get; set; }
24 25
25 /// <summary> 26 /// <summary>
26 /// 开单金额 27 /// 开单金额
@@ -28,32 +29,58 @@ namespace NCC.Extend.Entitys.Dto.LqPackageInfo @@ -28,32 +29,58 @@ namespace NCC.Extend.Entitys.Dto.LqPackageInfo
28 public decimal BillingAmount { get; set; } 29 public decimal BillingAmount { get; set; }
29 30
30 /// <summary> 31 /// <summary>
31 - /// 退卡数量 32 + /// 欠款金额(所有开单的欠款总和)
  33 + /// </summary>
  34 + public decimal DebtAmount { get; set; }
  35 +
  36 + /// <summary>
  37 + /// 开单列表
32 /// </summary> 38 /// </summary>
33 - public int RefundCount { get; set; } 39 + public List<ActivityBillingItem> BillingList { get; set; }
  40 + }
34 41
  42 + /// <summary>
  43 + /// 活动开单项
  44 + /// </summary>
  45 + public class ActivityBillingItem
  46 + {
35 /// <summary> 47 /// <summary>
36 - /// 退卡金额 48 + /// 开单ID
37 /// </summary> 49 /// </summary>
38 - public decimal RefundAmount { get; set; } 50 + public string BillingId { get; set; }
39 51
40 /// <summary> 52 /// <summary>
41 - /// 净开单数量(开单数量 - 退卡数量) 53 + /// 开单日期
42 /// </summary> 54 /// </summary>
43 - public int NetBillingCount { get; set; } 55 + public DateTime? BillingDate { get; set; }
44 56
45 /// <summary> 57 /// <summary>
46 - /// 净开单金额(开单金额 - 退卡金额) 58 + /// 客户名称
47 /// </summary> 59 /// </summary>
48 - public decimal NetBillingAmount { get; set; } 60 + public string CustomerName { get; set; }
49 61
50 /// <summary> 62 /// <summary>
51 - /// 退卡率(退卡数量 / 开单数量) 63 + /// 客户电话
52 /// </summary> 64 /// </summary>
53 - public decimal RefundRate { get; set; } 65 + public string CustomerPhone { get; set; }
54 66
55 /// <summary> 67 /// <summary>
56 - /// 欠款金额(所有开单的欠款总和) 68 + /// 门店ID
  69 + /// </summary>
  70 + public string StoreId { get; set; }
  71 +
  72 + /// <summary>
  73 + /// 门店名称
  74 + /// </summary>
  75 + public string StoreName { get; set; }
  76 +
  77 + /// <summary>
  78 + /// 开单金额
  79 + /// </summary>
  80 + public decimal Amount { get; set; }
  81 +
  82 + /// <summary>
  83 + /// 欠款金额
57 /// </summary> 84 /// </summary>
58 public decimal DebtAmount { get; set; } 85 public decimal DebtAmount { get; set; }
59 } 86 }
netcore/src/Modularity/Extend/NCC.Extend/LqPackageInfoService.cs
@@ -557,8 +557,8 @@ namespace NCC.Extend.LqPackageInfo @@ -557,8 +557,8 @@ namespace NCC.Extend.LqPackageInfo
557 /// 获取营销活动统计数据 557 /// 获取营销活动统计数据
558 /// </summary> 558 /// </summary>
559 /// <remarks> 559 /// <remarks>
560 - /// 统计指定营销活动的开单、退卡相关数据  
561 - /// 包括:开单数量、开单金额、退卡数量、退卡金额、净开单数量、净开单金额、退卡率 560 + /// 统计指定营销活动的开单数据,支持分页
  561 + /// 包括:总记录数、开单总金额、欠款总金额、开单列表
562 /// 562 ///
563 /// 示例请求: 563 /// 示例请求:
564 /// ```json 564 /// ```json
@@ -566,7 +566,9 @@ namespace NCC.Extend.LqPackageInfo @@ -566,7 +566,9 @@ namespace NCC.Extend.LqPackageInfo
566 /// "activityId": "营销活动ID", 566 /// "activityId": "营销活动ID",
567 /// "startTime": "2025-10-01", 567 /// "startTime": "2025-10-01",
568 /// "endTime": "2025-10-31", 568 /// "endTime": "2025-10-31",
569 - /// "storeIds": ["门店ID1", "门店ID2"] 569 + /// "storeIds": ["门店ID1", "门店ID2"],
  570 + /// "pageIndex": 1,
  571 + /// "pageSize": 20
570 /// } 572 /// }
571 /// ``` 573 /// ```
572 /// 574 ///
@@ -575,18 +577,16 @@ namespace NCC.Extend.LqPackageInfo @@ -575,18 +577,16 @@ namespace NCC.Extend.LqPackageInfo
575 /// - startTime: 开始时间(可选,默认为活动开始时间) 577 /// - startTime: 开始时间(可选,默认为活动开始时间)
576 /// - endTime: 结束时间(可选,默认为活动结束时间) 578 /// - endTime: 结束时间(可选,默认为活动结束时间)
577 /// - storeIds: 门店ID列表(可选) 579 /// - storeIds: 门店ID列表(可选)
  580 + /// - pageIndex: 页码(默认1)
  581 + /// - pageSize: 每页数量(默认20)
578 /// 582 ///
579 /// 返回字段说明: 583 /// 返回字段说明:
580 /// - ActivityId: 营销活动ID 584 /// - ActivityId: 营销活动ID
581 /// - ActivityName: 营销活动名称 585 /// - ActivityName: 营销活动名称
582 - /// - BillingCount: 开单数量  
583 - /// - BillingAmount: 开单金额  
584 - /// - RefundCount: 退卡数量  
585 - /// - RefundAmount: 退卡金额  
586 - /// - NetBillingCount: 净开单数量(开单数量 - 退卡数量)  
587 - /// - NetBillingAmount: 净开单金额(开单金额 - 退卡金额)  
588 - /// - RefundRate: 退卡率(退卡数量 / 开单数量)  
589 - /// - DebtAmount: 欠款金额(所有开单的欠款总和) 586 + /// - Total: 总记录数
  587 + /// - BillingAmount: 开单总金额
  588 + /// - DebtAmount: 欠款总金额
  589 + /// - BillingList: 开单列表(包含开单ID、日期、客户信息、门店信息、金额、欠款等)
590 /// </remarks> 590 /// </remarks>
591 /// <param name="input">查询参数</param> 591 /// <param name="input">查询参数</param>
592 /// <returns>营销活动统计数据</returns> 592 /// <returns>营销活动统计数据</returns>
@@ -614,21 +614,19 @@ namespace NCC.Extend.LqPackageInfo @@ -614,21 +614,19 @@ namespace NCC.Extend.LqPackageInfo
614 614
615 // 3. 构建门店过滤条件 615 // 3. 构建门店过滤条件
616 string storeFilter = ""; 616 string storeFilter = "";
617 - string storeFilterRefund = "";  
618 617
619 if (input.StoreIds != null && input.StoreIds.Any()) 618 if (input.StoreIds != null && input.StoreIds.Any())
620 { 619 {
621 var storeIdsStr = string.Join("','", input.StoreIds); 620 var storeIdsStr = string.Join("','", input.StoreIds);
622 storeFilter = $"AND kd.djmd IN ('{storeIdsStr}')"; 621 storeFilter = $"AND kd.djmd IN ('{storeIdsStr}')";
623 - storeFilterRefund = $"AND hytk.md IN ('{storeIdsStr}')";  
624 } 622 }
625 623
626 - // 4. 开单统计 - 直接从开单主表查询,通过F_ActivityId过滤  
627 - var billingSql = $@" 624 + // 4. 获取总记录数和总金额
  625 + var totalSql = $@"
628 SELECT 626 SELECT
629 - COUNT(DISTINCT kd.F_Id) as billing_count,  
630 - SUM(CAST(kd.sfyj AS DECIMAL(18,2))) as billing_amount,  
631 - SUM(CAST(kd.qk AS DECIMAL(18,2))) as debt_amount 627 + COUNT(*) as total,
  628 + COALESCE(SUM(CAST(kd.sfyj AS DECIMAL(18,2))), 0) as billing_amount,
  629 + COALESCE(SUM(CAST(kd.qk AS DECIMAL(18,2))), 0) as debt_amount
632 FROM lq_kd_kdjlb kd 630 FROM lq_kd_kdjlb kd
633 WHERE kd.F_IsEffective = 1 631 WHERE kd.F_IsEffective = 1
634 AND kd.F_ActivityId = '{input.ActivityId}' 632 AND kd.F_ActivityId = '{input.ActivityId}'
@@ -636,44 +634,56 @@ namespace NCC.Extend.LqPackageInfo @@ -636,44 +634,56 @@ namespace NCC.Extend.LqPackageInfo
636 AND kd.kdrq <= '{endTime:yyyy-MM-dd HH:mm:ss}' 634 AND kd.kdrq <= '{endTime:yyyy-MM-dd HH:mm:ss}'
637 {storeFilter}"; 635 {storeFilter}";
638 636
639 - var billingData = await _db.Ado.SqlQueryAsync<dynamic>(billingSql);  
640 - var billingCount = Convert.ToInt32(billingData.FirstOrDefault()?.billing_count ?? 0);  
641 - var billingAmount = Convert.ToDecimal(billingData.FirstOrDefault()?.billing_amount ?? 0);  
642 - var debtAmount = Convert.ToDecimal(billingData.FirstOrDefault()?.debt_amount ?? 0); 637 + var totalData = await _db.Ado.SqlQueryAsync<dynamic>(totalSql);
  638 + var total = Convert.ToInt32(totalData.FirstOrDefault()?.total ?? 0);
  639 + var billingAmount = Convert.ToDecimal(totalData.FirstOrDefault()?.billing_amount ?? 0);
  640 + var debtAmount = Convert.ToDecimal(totalData.FirstOrDefault()?.debt_amount ?? 0);
643 641
644 - // 5. 退卡统计 - 直接从退卡主表查询  
645 - var refundSql = $@" 642 + // 5. 分页查询开单列表
  643 + var offset = (input.PageIndex - 1) * input.PageSize;
  644 + var billingListSql = $@"
646 SELECT 645 SELECT
647 - COUNT(DISTINCT hytk.F_Id) as refund_count,  
648 - SUM(CAST(hytk.tkje AS DECIMAL(18,2))) as refund_amount  
649 - FROM lq_hytk_hytk hytk  
650 - WHERE hytk.F_IsEffective = 1  
651 - AND hytk.tksj >= '{startTime:yyyy-MM-dd HH:mm:ss}'  
652 - AND hytk.tksj <= '{endTime:yyyy-MM-dd HH:mm:ss}'  
653 - {storeFilterRefund}";  
654 -  
655 - var refundData = await _db.Ado.SqlQueryAsync<dynamic>(refundSql);  
656 - var refundCount = Convert.ToInt32(refundData.FirstOrDefault()?.refund_count ?? 0);  
657 - var refundAmount = Convert.ToDecimal(refundData.FirstOrDefault()?.refund_amount ?? 0);  
658 -  
659 - // 8. 计算净值和退卡率  
660 - var netBillingCount = billingCount - refundCount;  
661 - var netBillingAmount = billingAmount - refundAmount;  
662 - var refundRate = billingCount > 0 ? Math.Round((decimal)refundCount / billingCount * 100, 2) : 0;  
663 -  
664 - // 9. 返回统计结果 646 + kd.F_Id as BillingId,
  647 + kd.kdrq as BillingDate,
  648 + COALESCE(kh.khmc, '') as CustomerName,
  649 + COALESCE(kh.sjh, '') as CustomerPhone,
  650 + kd.djmd as StoreId,
  651 + COALESCE(md.dm, '') as StoreName,
  652 + CAST(kd.sfyj AS DECIMAL(18,2)) as Amount,
  653 + CAST(kd.qk AS DECIMAL(18,2)) as DebtAmount
  654 + FROM lq_kd_kdjlb kd
  655 + LEFT JOIN lq_khxx kh ON kd.kdhy = kh.F_Id
  656 + LEFT JOIN lq_mdxx md ON kd.djmd = md.F_Id
  657 + WHERE kd.F_IsEffective = 1
  658 + AND kd.F_ActivityId = '{input.ActivityId}'
  659 + AND kd.kdrq >= '{startTime:yyyy-MM-dd HH:mm:ss}'
  660 + AND kd.kdrq <= '{endTime:yyyy-MM-dd HH:mm:ss}'
  661 + {storeFilter}
  662 + ORDER BY kd.kdrq DESC
  663 + LIMIT {input.PageSize} OFFSET {offset}";
  664 +
  665 + var billingListData = await _db.Ado.SqlQueryAsync<dynamic>(billingListSql);
  666 + var billingList = billingListData?.Select(item => new ActivityBillingItem
  667 + {
  668 + BillingId = item.BillingId?.ToString(),
  669 + BillingDate = item.BillingDate != null ? (DateTime?)item.BillingDate : null,
  670 + CustomerName = item.CustomerName?.ToString(),
  671 + CustomerPhone = item.CustomerPhone?.ToString(),
  672 + StoreId = item.StoreId?.ToString(),
  673 + StoreName = item.StoreName?.ToString(),
  674 + Amount = Convert.ToDecimal(item.Amount ?? 0),
  675 + DebtAmount = Convert.ToDecimal(item.DebtAmount ?? 0)
  676 + }).ToList() ?? new List<ActivityBillingItem>();
  677 +
  678 + // 6. 返回统计结果
665 return new ActivityStatisticsOutput 679 return new ActivityStatisticsOutput
666 { 680 {
667 ActivityId = input.ActivityId, 681 ActivityId = input.ActivityId,
668 ActivityName = activity.ActivityName, 682 ActivityName = activity.ActivityName,
669 - BillingCount = billingCount, 683 + Total = total,
670 BillingAmount = billingAmount, 684 BillingAmount = billingAmount,
671 - RefundCount = refundCount,  
672 - RefundAmount = refundAmount,  
673 - NetBillingCount = netBillingCount,  
674 - NetBillingAmount = netBillingAmount,  
675 - RefundRate = refundRate,  
676 - DebtAmount = debtAmount 685 + DebtAmount = debtAmount,
  686 + BillingList = billingList
677 }; 687 };
678 } 688 }
679 catch (Exception ex) 689 catch (Exception ex)