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 28 /// 门店ID列表(可选)
29 29 /// </summary>
30 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 1 using System;
  2 +using System.Collections.Generic;
2 3  
3 4 namespace NCC.Extend.Entitys.Dto.LqPackageInfo
4 5 {
... ... @@ -18,9 +19,9 @@ namespace NCC.Extend.Entitys.Dto.LqPackageInfo
18 19 public string ActivityName { get; set; }
19 20  
20 21 /// <summary>
21   - /// 开单数量
  22 + /// 总记录数
22 23 /// </summary>
23   - public int BillingCount { get; set; }
  24 + public int Total { get; set; }
24 25  
25 26 /// <summary>
26 27 /// 开单金额
... ... @@ -28,32 +29,58 @@ namespace NCC.Extend.Entitys.Dto.LqPackageInfo
28 29 public decimal BillingAmount { get; set; }
29 30  
30 31 /// <summary>
31   - /// 退卡数量
  32 + /// 欠款金额(所有开单的欠款总和)
  33 + /// </summary>
  34 + public decimal DebtAmount { get; set; }
  35 +
  36 + /// <summary>
  37 + /// 开单列表
32 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 47 /// <summary>
36   - /// 退卡金额
  48 + /// 开单ID
37 49 /// </summary>
38   - public decimal RefundAmount { get; set; }
  50 + public string BillingId { get; set; }
39 51  
40 52 /// <summary>
41   - /// 净开单数量(开单数量 - 退卡数量)
  53 + /// 开单日期
42 54 /// </summary>
43   - public int NetBillingCount { get; set; }
  55 + public DateTime? BillingDate { get; set; }
44 56  
45 57 /// <summary>
46   - /// 净开单金额(开单金额 - 退卡金额)
  58 + /// 客户名称
47 59 /// </summary>
48   - public decimal NetBillingAmount { get; set; }
  60 + public string CustomerName { get; set; }
49 61  
50 62 /// <summary>
51   - /// 退卡率(退卡数量 / 开单数量)
  63 + /// 客户电话
52 64 /// </summary>
53   - public decimal RefundRate { get; set; }
  65 + public string CustomerPhone { get; set; }
54 66  
55 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 84 /// </summary>
58 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 557 /// 获取营销活动统计数据
558 558 /// </summary>
559 559 /// <remarks>
560   - /// 统计指定营销活动的开单、退卡相关数据
561   - /// 包括:开单数量、开单金额、退卡数量、退卡金额、净开单数量、净开单金额、退卡率
  560 + /// 统计指定营销活动的开单数据,支持分页
  561 + /// 包括:总记录数、开单总金额、欠款总金额、开单列表
562 562 ///
563 563 /// 示例请求:
564 564 /// ```json
... ... @@ -566,7 +566,9 @@ namespace NCC.Extend.LqPackageInfo
566 566 /// "activityId": "营销活动ID",
567 567 /// "startTime": "2025-10-01",
568 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 577 /// - startTime: 开始时间(可选,默认为活动开始时间)
576 578 /// - endTime: 结束时间(可选,默认为活动结束时间)
577 579 /// - storeIds: 门店ID列表(可选)
  580 + /// - pageIndex: 页码(默认1)
  581 + /// - pageSize: 每页数量(默认20)
578 582 ///
579 583 /// 返回字段说明:
580 584 /// - ActivityId: 营销活动ID
581 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 590 /// </remarks>
591 591 /// <param name="input">查询参数</param>
592 592 /// <returns>营销活动统计数据</returns>
... ... @@ -614,21 +614,19 @@ namespace NCC.Extend.LqPackageInfo
614 614  
615 615 // 3. 构建门店过滤条件
616 616 string storeFilter = "";
617   - string storeFilterRefund = "";
618 617  
619 618 if (input.StoreIds != null && input.StoreIds.Any())
620 619 {
621 620 var storeIdsStr = string.Join("','", input.StoreIds);
622 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 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 630 FROM lq_kd_kdjlb kd
633 631 WHERE kd.F_IsEffective = 1
634 632 AND kd.F_ActivityId = '{input.ActivityId}'
... ... @@ -636,44 +634,56 @@ namespace NCC.Extend.LqPackageInfo
636 634 AND kd.kdrq <= '{endTime:yyyy-MM-dd HH:mm:ss}'
637 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 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 679 return new ActivityStatisticsOutput
666 680 {
667 681 ActivityId = input.ActivityId,
668 682 ActivityName = activity.ActivityName,
669   - BillingCount = billingCount,
  683 + Total = total,
670 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 689 catch (Exception ex)
... ...