Commit 41da425736871efbc388ed1b35349256092ffd45

Authored by “wangming”
1 parent 0170aea1

Refactor LqEventService and related DTOs to enhance event handling, including ne…

…w endpoints for gold triangle statistics and member data retrieval. Update LqKdKdjlbService to incorporate deduct amount calculations and streamline data handling. Modify LqKhxxService to remove obsolete fields and improve data structure. Enhance LqYaoyjlService and LqYcsdJsjService for better data output consistency and clarity. Adjust launch settings to disable browser launch for both NCC.API and NCC.API.Tenant projects.
Showing 26 changed files with 838 additions and 171 deletions
.vscode/settings.json
... ... @@ -7,6 +7,6 @@
7 7 "csharpier.endOfLine": "LF",
8 8 "[csharp]": {
9 9 "editor.formatOnSave": true,
10   - "editor.defaultFormatter": "csharpier.csharpier-vscode"
  10 + "editor.defaultFormatter": "ms-dotnettools.csharp"
11 11 }
12 12 }
... ...
[已用]创建门店每日耗卡统计视图.sql
... ... @@ -23,7 +23,7 @@ SELECT
23 23 COUNT(DISTINCT hk.hy) AS member_count, -- 消费会员数
24 24 hk.hksj AS create_time -- 创建时间
25 25 FROM lq_xh_hyhk hk
26   -LEFT JOIN lq_xh_pxmx px ON hk.F_Id = px.glkdbh
  26 +LEFT JOIN lq_xh_pxmx px ON hk.F_Id = px.F_ConsumeInfoId
27 27 WHERE hk.hksj IS NOT NULL
28 28 GROUP BY hk.md, hk.mdbh, hk.mdmc, DATE(hk.hksj), hk.hksj
29 29 ORDER BY hk.md, DATE(hk.hksj) DESC;
... ...
netcore/src/Application/NCC.API.Tenant/NCC.API.Tenant/Properties/launchSettings.json
... ... @@ -17,7 +17,7 @@
17 17 },
18 18 "NCC.API.Tenant": {
19 19 "commandName": "Project",
20   - "launchBrowser": true,
  20 + "launchBrowser": false,
21 21 "environmentVariables": {
22 22 "ASPNETCORE_ENVIRONMENT": "Development"
23 23 },
... ...
netcore/src/Application/NCC.API/Properties/launchSettings.json
... ... @@ -18,7 +18,7 @@
18 18 "NCC.API": {
19 19 "commandName": "Project",
20 20 "dotnetRunMessages": "true",
21   - "launchBrowser": true,
  21 + "launchBrowser": false,
22 22 "applicationUrl": "http://localhost:2011", //58504
23 23 "environmentVariables": {
24 24 "ASPNETCORE_ENVIRONMENT": "Development"
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/PersonDataOutput.cs 0 → 100644
  1 +using System;
  2 +
  3 +namespace NCC.Extend.Entitys.Dto.LqEvent
  4 +{
  5 + /// <summary>
  6 + /// 人员统计数据输出
  7 + /// </summary>
  8 + public class PersonDataOutput
  9 + {
  10 + /// <summary>
  11 + /// 用户ID
  12 + /// </summary>
  13 + public string UserId { get; set; }
  14 +
  15 + /// <summary>
  16 + /// 用户姓名
  17 + /// </summary>
  18 + public string UserName { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 门店ID
  22 + /// </summary>
  23 + public string StoreId { get; set; }
  24 +
  25 + /// <summary>
  26 + /// 门店名称
  27 + /// </summary>
  28 + public string StoreName { get; set; }
  29 +
  30 + /// <summary>
  31 + /// 战队名称
  32 + /// </summary>
  33 + public string TeamName { get; set; }
  34 +
  35 + /// <summary>
  36 + /// 个人目标数
  37 + /// </summary>
  38 + public int PersonalTarget { get; set; }
  39 +
  40 + /// <summary>
  41 + /// 完成目标数
  42 + /// </summary>
  43 + public int CompletedTarget { get; set; }
  44 +
  45 + /// <summary>
  46 + /// 完成率(百分比)
  47 + /// </summary>
  48 + public decimal CompletionRate { get; set; }
  49 +
  50 + /// <summary>
  51 + /// 排名
  52 + /// </summary>
  53 + public int Ranking { get; set; }
  54 +
  55 + /// <summary>
  56 + /// 最后拓客时间
  57 + /// </summary>
  58 + public DateTime? LastExpansionTime { get; set; }
  59 + }
  60 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/StoreDataOutput.cs 0 → 100644
  1 +using System;
  2 +
  3 +namespace NCC.Extend.Entitys.Dto.LqEvent
  4 +{
  5 + /// <summary>
  6 + /// 门店统计数据输出
  7 + /// </summary>
  8 + public class StoreDataOutput
  9 + {
  10 + /// <summary>
  11 + /// 门店ID
  12 + /// </summary>
  13 + public string StoreId { get; set; }
  14 +
  15 + /// <summary>
  16 + /// 门店名称
  17 + /// </summary>
  18 + public string StoreName { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 目前总目标数
  22 + /// </summary>
  23 + public int TotalTarget { get; set; }
  24 +
  25 + /// <summary>
  26 + /// 门店完成目标数
  27 + /// </summary>
  28 + public int CompletedTarget { get; set; }
  29 +
  30 + /// <summary>
  31 + /// 完成率(百分比)
  32 + /// </summary>
  33 + public decimal CompletionRate { get; set; }
  34 +
  35 + /// <summary>
  36 + /// 排名
  37 + /// </summary>
  38 + public int Ranking { get; set; }
  39 + }
  40 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbCrInput.cs
... ... @@ -49,7 +49,6 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
49 49 /// 实付业绩
50 50 /// </summary>
51 51 public decimal sfyj { get; set; }
52   -
53 52 /// <summary>
54 53 /// 欠款
55 54 /// </summary>
... ... @@ -60,10 +59,6 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
60 59 /// </summary>
61 60 public string ckfs { get; set; }
62 61  
63   - /// <summary>
64   - /// 储扣明细
65   - /// </summary>
66   - public string ckmx { get; set; }
67 62  
68 63 /// <summary>
69 64 /// 付款方式
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbListOutput.cs
... ... @@ -58,10 +58,10 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
58 58 public string ckfs { get; set; }
59 59  
60 60 /// <summary>
61   - /// 储扣明细
  61 + /// 储扣总金额
62 62 /// </summary>
63   - public string ckmx { get; set; }
64   -
  63 + public decimal deductAmount { get; set; }
  64 +
65 65 /// <summary>
66 66 /// 付款方式
67 67 /// </summary>
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbListQueryInput.cs
... ... @@ -68,12 +68,7 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
68 68 /// 储扣方式
69 69 /// </summary>
70 70 public string ckfs { get; set; }
71   -
72   - /// <summary>
73   - /// 储扣明细
74   - /// </summary>
75   - public string ckmx { get; set; }
76   -
  71 +
77 72 /// <summary>
78 73 /// 付款方式
79 74 /// </summary>
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxCrInput.cs
... ... @@ -53,10 +53,6 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx
53 53 /// </summary>
54 54 public string zjdlsj { get; set; }
55 55  
56   - /// <summary>
57   - /// 客户目前归属
58   - /// </summary>
59   - public string khmqgs { get; set; }
60 56  
61 57 /// <summary>
62 58 /// 归属门店
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxInfoOutput.cs
... ... @@ -53,10 +53,6 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx
53 53 /// </summary>
54 54 public string zjdlsj { get; set; }
55 55  
56   - /// <summary>
57   - /// 客户目前归属
58   - /// </summary>
59   - public string khmqgs { get; set; }
60 56  
61 57 /// <summary>
62 58 /// 归属门店
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxListOutput.cs
... ... @@ -53,11 +53,6 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx
53 53 public string zjdlsj { get; set; }
54 54  
55 55 /// <summary>
56   - /// 客户目前归属
57   - /// </summary>
58   - public string khmqgs { get; set; }
59   -
60   - /// <summary>
61 56 /// 归属门店
62 57 /// </summary>
63 58 public string gsmd { get; set; }
... ... @@ -135,6 +130,6 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx
135 130 /// <summary>
136 131 /// 添加时间
137 132 /// </summary>
138   - public string createTime { get; set; }
  133 + public DateTime createTime { get; set; }
139 134 }
140 135 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxListQueryInput.cs
... ... @@ -64,11 +64,6 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx
64 64 public string zjdlsj { get; set; }
65 65  
66 66 /// <summary>
67   - /// 客户目前归属
68   - /// </summary>
69   - public string khmqgs { get; set; }
70   -
71   - /// <summary>
72 67 /// 归属门店
73 68 /// </summary>
74 69 public string gsmd { get; set; }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYcsdJsj/LqYcsdJsjByUserMonthOutput.cs
... ... @@ -8,51 +8,51 @@ namespace NCC.Extend.Entitys.Dto.LqYcsdJsj
8 8 /// <summary>
9 9 /// 金三角ID
10 10 /// </summary>
11   - public string JsjId { get; set; }
  11 + public string jsjId { get; set; }
12 12  
13 13 /// <summary>
14 14 /// 金三角名称
15 15 /// </summary>
16   - public string JsjName { get; set; }
  16 + public string jsjName { get; set; }
17 17  
18 18 /// <summary>
19 19 /// 月份
20 20 /// </summary>
21   - public string Month { get; set; }
  21 + public string month { get; set; }
22 22  
23 23 /// <summary>
24 24 /// 门店ID
25 25 /// </summary>
26   - public string StoreId { get; set; }
  26 + public string storeId { get; set; }
27 27  
28 28 /// <summary>
29 29 /// 门店名称
30 30 /// </summary>
31   - public string StoreName { get; set; }
  31 + public string storeName { get; set; }
32 32  
33 33 /// <summary>
34 34 /// 用户ID
35 35 /// </summary>
36   - public string UserId { get; set; }
  36 + public string userId { get; set; }
37 37  
38 38 /// <summary>
39 39 /// 用户姓名
40 40 /// </summary>
41   - public string UserName { get; set; }
  41 + public string userName { get; set; }
42 42  
43 43 /// <summary>
44 44 /// 是否顾问
45 45 /// </summary>
46   - public int IsLeader { get; set; }
  46 + public int isLeader { get; set; }
47 47  
48 48 /// <summary>
49 49 /// 状态
50 50 /// </summary>
51   - public string Status { get; set; }
  51 + public string status { get; set; }
52 52  
53 53 /// <summary>
54 54 /// 排序
55 55 /// </summary>
56   - public int SortOrder { get; set; }
  56 + public int sortOrder { get; set; }
57 57 }
58 58 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_kdjlb/LqKdKdjlbEntity.cs
... ... @@ -52,6 +52,7 @@ namespace NCC.Extend.Entitys.lq_kd_kdjlb
52 52 /// </summary>
53 53 [SugarColumn(ColumnName = "zdyj")]
54 54 public decimal Zdyj { get; set; }
  55 +
55 56  
56 57 /// <summary>
57 58 /// 实付业绩
... ... @@ -60,6 +61,12 @@ namespace NCC.Extend.Entitys.lq_kd_kdjlb
60 61 public decimal Sfyj { get; set; }
61 62  
62 63 /// <summary>
  64 + /// 储扣总金额
  65 + /// </summary>
  66 + [SugarColumn(ColumnName = "F_DeductAmount")]
  67 + public decimal DeductAmount { get; set; }
  68 +
  69 + /// <summary>
63 70 /// 欠款
64 71 /// </summary>
65 72 [SugarColumn(ColumnName = "qk")]
... ... @@ -72,12 +79,6 @@ namespace NCC.Extend.Entitys.lq_kd_kdjlb
72 79 public string Ckfs { get; set; }
73 80  
74 81 /// <summary>
75   - /// 储扣明细
76   - /// </summary>
77   - [SugarColumn(ColumnName = "ckmx")]
78   - public string Ckmx { get; set; }
79   -
80   - /// <summary>
81 82 /// 付款方式
82 83 /// </summary>
83 84 [SugarColumn(ColumnName = "fkfs")]
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_khxx/LqKhxxEntity.cs
... ... @@ -66,12 +66,6 @@ namespace NCC.Extend.Entitys.lq_khxx
66 66 public string Zjdlsj { get; set; }
67 67  
68 68 /// <summary>
69   - /// 客户目前归属
70   - /// </summary>
71   - [SugarColumn(ColumnName = "khmqgs")]
72   - public string Khmqgs { get; set; }
73   -
74   - /// <summary>
75 69 /// 归属门店
76 70 /// </summary>
77 71 [SugarColumn(ColumnName = "gsmd")]
... ... @@ -165,6 +159,6 @@ namespace NCC.Extend.Entitys.lq_khxx
165 159 /// 添加时间
166 160 /// </summary>
167 161 [SugarColumn(ColumnName = "F_CreateTime")]
168   - public string CreateTime { get; set; }
  162 + public DateTime CreateTime { get; set; } = DateTime.Now;
169 163 }
170 164 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_statistics_gold_triangle/LqStatisticsGoldTriangleEntity.cs 0 → 100644
  1 +using NCC.Common.Const;
  2 +using SqlSugar;
  3 +using System;
  4 +
  5 +namespace NCC.Extend.Entitys.lq_statistics_gold_triangle
  6 +{
  7 + /// <summary>
  8 + /// 金三角开卡业绩统计数据表
  9 + /// </summary>
  10 + [SugarTable("lq_statistics_gold_triangle")]
  11 + [Tenant(ClaimConst.TENANT_ID)]
  12 + public class LqStatisticsGoldTriangleEntity
  13 + {
  14 + /// <summary>
  15 + /// 主键ID
  16 + /// </summary>
  17 + [SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true)]
  18 + public string Id { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 金三角ID
  22 + /// </summary>
  23 + [SugarColumn(ColumnName = "F_GoldTriangleId")]
  24 + public string GoldTriangleId { get; set; }
  25 +
  26 + /// <summary>
  27 + /// 金三角名称
  28 + /// </summary>
  29 + [SugarColumn(ColumnName = "F_GoldTriangleName")]
  30 + public string GoldTriangleName { get; set; }
  31 +
  32 + /// <summary>
  33 + /// 统计月份(YYYYMM)
  34 + /// </summary>
  35 + [SugarColumn(ColumnName = "F_StatisticsMonth")]
  36 + public string StatisticsMonth { get; set; }
  37 +
  38 + /// <summary>
  39 + /// 门店ID
  40 + /// </summary>
  41 + [SugarColumn(ColumnName = "F_StoreId")]
  42 + public string StoreId { get; set; }
  43 +
  44 + /// <summary>
  45 + /// 门店名称
  46 + /// </summary>
  47 + [SugarColumn(ColumnName = "F_StoreName")]
  48 + public string StoreName { get; set; }
  49 +
  50 + /// <summary>
  51 + /// 订单数量
  52 + /// </summary>
  53 + [SugarColumn(ColumnName = "F_OrderCount")]
  54 + public int OrderCount { get; set; }
  55 +
  56 + /// <summary>
  57 + /// 总业绩金额
  58 + /// </summary>
  59 + [SugarColumn(ColumnName = "F_TotalPerformance")]
  60 + public decimal TotalPerformance { get; set; }
  61 +
  62 + /// <summary>
  63 + /// 最后订单日期
  64 + /// </summary>
  65 + [SugarColumn(ColumnName = "F_LastOrderDate")]
  66 + public DateTime? LastOrderDate { get; set; }
  67 +
  68 + /// <summary>
  69 + /// 首次订单日期
  70 + /// </summary>
  71 + [SugarColumn(ColumnName = "F_FirstOrderDate")]
  72 + public DateTime? FirstOrderDate { get; set; }
  73 +
  74 + /// <summary>
  75 + /// 创建时间
  76 + /// </summary>
  77 + [SugarColumn(ColumnName = "F_CreateTime")]
  78 + public DateTime CreateTime { get; set; } = DateTime.Now;
  79 + }
  80 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Enum/MemberTypeEnum.cs 0 → 100644
  1 +using System.ComponentModel;
  2 +
  3 +namespace NCC.Extend.Entitys.Enum
  4 +{
  5 + /// <summary>
  6 + /// 会员类型
  7 + /// </summary>
  8 + public enum MemberTypeEnum
  9 + {
  10 + /// <summary>
  11 + /// 线索
  12 + /// </summary>
  13 + [Description("线索")]
  14 + 线索 = 0,
  15 +
  16 + /// <summary>
  17 + /// 潜客
  18 + /// </summary>
  19 + [Description("潜客")]
  20 + 潜客 = 1,
  21 +
  22 + /// <summary>
  23 + /// 新客
  24 + /// </summary>
  25 + [Description("新客")]
  26 + 新客 = 2,
  27 +
  28 + /// <summary>
  29 + /// 老客
  30 + /// </summary>
  31 + [Description("老客")]
  32 + 老客 = 3,
  33 +
  34 + }
  35 +}
0 36 \ No newline at end of file
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqEventService.cs
... ... @@ -694,6 +694,212 @@ namespace NCC.Extend.LqEvent
694 694 }
695 695 #endregion
696 696  
  697 + #region 根据活动ID获取门店的统计数据
  698 + /// <summary>
  699 + /// 根据活动ID获取门店的统计数据
  700 + /// </summary>
  701 + /// <remarks>
  702 + /// 根据活动ID查询该活动下所有门店的统计数据
  703 + /// 返回门店的目标完成情况、完成率和排名信息
  704 + ///
  705 + /// 示例请求:
  706 + /// ```json
  707 + /// GET /api/Extend/LqEvent/store-data/{eventId}
  708 + /// ```
  709 + ///
  710 + /// 参数说明:
  711 + /// - eventId: 活动ID,必填参数
  712 + ///
  713 + /// 返回信息包括:
  714 + /// - 门店信息(门店ID、门店名称)
  715 + /// - 目标统计(总目标数、完成目标数、完成率)
  716 + /// - 排名信息(按完成率排序)
  717 + /// </remarks>
  718 + /// <param name="eventId">活动ID</param>
  719 + /// <returns>门店统计数据列表</returns>
  720 + /// <response code="200">成功返回门店统计数据</response>
  721 + /// <response code="400">参数错误,活动ID不能为空</response>
  722 + [HttpGet("store-data/{eventId}")]
  723 + public async Task<dynamic> GetStoreDataByEventId(string eventId)
  724 + {
  725 + if (string.IsNullOrEmpty(eventId))
  726 + {
  727 + throw NCCException.Oh("活动ID不能为空");
  728 + }
  729 +
  730 + try
  731 + {
  732 + // 使用多表查询获取门店统计数据
  733 + var storeData = await _db.Queryable<LqEventUserEntity, LqMdxxEntity, LqTkjlbEntity>(
  734 + (eventUser, store, tkjlb) => eventUser.EventId == eventId && eventUser.StoreId == store.Id && eventUser.UserId == tkjlb.ExpansionUserId && tkjlb.EventId == eventId
  735 + )
  736 + .GroupBy((eventUser, store, tkjlb) => new { StoreId = store.Id, StoreName = store.Dm })
  737 + .Select(
  738 + (eventUser, store, tkjlb) =>
  739 + new StoreDataOutput
  740 + {
  741 + StoreId = store.Id,
  742 + StoreName = store.Dm,
  743 + TotalTarget = SqlFunc.AggregateSum(eventUser.EventTarget),
  744 + CompletedTarget = SqlFunc.AggregateCount(tkjlb.Id),
  745 + CompletionRate = 0, // 将在内存中计算
  746 + Ranking = 0, // 将在内存中计算
  747 + }
  748 + )
  749 + .ToListAsync();
  750 +
  751 + // 计算完成率和排名
  752 + foreach (var store in storeData)
  753 + {
  754 + if (store.TotalTarget > 0)
  755 + {
  756 + store.CompletionRate = Math.Round((decimal)store.CompletedTarget / store.TotalTarget * 100, 2);
  757 + }
  758 + }
  759 +
  760 + // 按完成率降序排序并设置排名
  761 + var rankedStores = storeData.OrderByDescending(s => s.CompletionRate).ThenByDescending(s => s.CompletedTarget).ToList();
  762 +
  763 + for (int i = 0; i < rankedStores.Count; i++)
  764 + {
  765 + rankedStores[i].Ranking = i + 1;
  766 + }
  767 +
  768 + return rankedStores;
  769 + }
  770 + catch (Exception ex)
  771 + {
  772 + throw NCCException.Oh($"查询活动 {eventId} 门店统计数据失败: {ex.Message}", ex);
  773 + }
  774 + }
  775 + #endregion
  776 +
  777 + #region 根据活动ID获取人员统计数据
  778 +
  779 + /// <summary>
  780 + /// 根据活动ID获取人员统计数据
  781 + /// </summary>
  782 + /// <remarks>
  783 + /// 根据活动ID查询该活动下所有参与人员的统计数据
  784 + /// 返回人员的个人目标完成情况、完成率和排名信息
  785 + ///
  786 + /// 示例请求:
  787 + /// ```json
  788 + /// GET /api/Extend/LqEvent/person-data/{eventId}
  789 + /// ```
  790 + ///
  791 + /// 参数说明:
  792 + /// - eventId: 活动ID,必填参数
  793 + ///
  794 + /// 返回信息包括:
  795 + /// - 人员信息(用户ID、用户姓名、门店信息、战队信息)
  796 + /// - 目标统计(个人目标数、完成目标数、完成率)
  797 + /// - 排名信息(按完成率排序)
  798 + /// - 最后拓客时间
  799 + /// </remarks>
  800 + /// <param name="eventId">活动ID</param>
  801 + /// <returns>人员统计数据列表</returns>
  802 + /// <response code="200">成功返回人员统计数据</response>
  803 + /// <response code="400">参数错误,活动ID不能为空</response>
  804 + [HttpGet("person-data/{eventId}")]
  805 + public async Task<dynamic> GetPersonDataByEventId(string eventId)
  806 + {
  807 + if (string.IsNullOrEmpty(eventId))
  808 + {
  809 + throw NCCException.Oh("活动ID不能为空");
  810 + }
  811 +
  812 + try
  813 + {
  814 + // 第一步:获取所有参与活动的人员基本信息
  815 + var eventUsers = await _db.Queryable<LqEventUserEntity, UserEntity, LqMdxxEntity>(
  816 + (eventUser, user, store) => eventUser.EventId == eventId && eventUser.UserId == user.Id && eventUser.StoreId == store.Id
  817 + )
  818 + .Select(
  819 + (eventUser, user, store) =>
  820 + new
  821 + {
  822 + UserId = user.Id,
  823 + UserName = user.RealName,
  824 + StoreId = store.Id,
  825 + StoreName = store.Dm,
  826 + TeamName = eventUser.TeamName,
  827 + PersonalTarget = eventUser.EventTarget,
  828 + }
  829 + )
  830 + .ToListAsync();
  831 + // 第二步:获取每个用户的拓客统计数据
  832 + var userIds = eventUsers.Select(u => u.UserId).ToList();
  833 + var expansionStats = new Dictionary<string, (int Count, DateTime? LastTime)>();
  834 + if (userIds.Any())
  835 + {
  836 + // 分批查询拓客数据,避免IN查询过大
  837 + const int batchSize = 500;
  838 + for (int i = 0; i < userIds.Count; i += batchSize)
  839 + {
  840 + var batch = userIds.Skip(i).Take(batchSize).ToList();
  841 + var stats = await _db.Queryable<LqTkjlbEntity>()
  842 + .Where(tkjlb => tkjlb.EventId == eventId && batch.Contains(tkjlb.ExpansionUserId))
  843 + .GroupBy(tkjlb => tkjlb.ExpansionUserId)
  844 + .Select(tkjlb => new
  845 + {
  846 + UserId = tkjlb.ExpansionUserId,
  847 + Count = SqlFunc.AggregateCount(tkjlb.Id),
  848 + LastTime = SqlFunc.AggregateMax(tkjlb.CreateTime),
  849 + })
  850 + .ToListAsync();
  851 +
  852 + foreach (var stat in stats)
  853 + {
  854 + expansionStats[stat.UserId] = (stat.Count, stat.LastTime);
  855 + }
  856 + }
  857 + }
  858 +
  859 + // 第三步:合并数据
  860 + var personData = eventUsers
  861 + .Select(eventUser => new PersonDataOutput
  862 + {
  863 + UserId = eventUser.UserId,
  864 + UserName = eventUser.UserName,
  865 + StoreId = eventUser.StoreId,
  866 + StoreName = eventUser.StoreName,
  867 + TeamName = eventUser.TeamName,
  868 + PersonalTarget = eventUser.PersonalTarget,
  869 + CompletedTarget = expansionStats.ContainsKey(eventUser.UserId) ? expansionStats[eventUser.UserId].Count : 0,
  870 + CompletionRate = 0, // 将在内存中计算
  871 + Ranking = 0, // 将在内存中计算
  872 + LastExpansionTime = expansionStats.ContainsKey(eventUser.UserId) ? expansionStats[eventUser.UserId].LastTime : null,
  873 + })
  874 + .ToList();
  875 +
  876 + // 计算完成率和排名
  877 + foreach (var person in personData)
  878 + {
  879 + if (person.PersonalTarget > 0)
  880 + {
  881 + person.CompletionRate = Math.Round((decimal)person.CompletedTarget / person.PersonalTarget * 100, 2);
  882 + }
  883 + }
  884 +
  885 + // 按完成率降序排序并设置排名
  886 + var rankedPersons = personData.OrderByDescending(p => p.CompletionRate).ThenByDescending(p => p.CompletedTarget).ToList();
  887 +
  888 + for (int i = 0; i < rankedPersons.Count; i++)
  889 + {
  890 + rankedPersons[i].Ranking = i + 1;
  891 + }
  892 +
  893 + return rankedPersons;
  894 + }
  895 + catch (Exception ex)
  896 + {
  897 + throw NCCException.Oh($"查询活动 {eventId} 人员统计数据失败: {ex.Message}", ex);
  898 + }
  899 + }
  900 +
  901 + #endregion
  902 +
697 903 #region Excel导入拓客活动用户
698 904  
699 905 /// <summary>
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqGzService.cs
... ... @@ -26,6 +26,7 @@ using NCC.Extend.Entitys.lq_kd_pxmx;
26 26 using NCC.Extend.Entitys.lq_mdxx;
27 27 using NCC.Extend.Entitys.lq_xmzl;
28 28 using NCC.Extend.Entitys.lq_ycsd_jsj;
  29 +using NCC.Extend.Entitys.lq_statistics_gold_triangle;
29 30 using NCC.Extend.Interfaces.LqGz;
30 31 using NCC.FriendlyException;
31 32 using NCC.JsonSerialization;
... ... @@ -57,6 +58,7 @@ namespace NCC.Extend.LqGz
57 58 _logger = logger;
58 59 }
59 60  
  61 + #region 获取工资全字段
60 62 /// <summary>
61 63 /// 获取工资全字段
62 64 /// </summary>
... ... @@ -69,7 +71,9 @@ namespace NCC.Extend.LqGz
69 71 var output = entity.Adapt<LqGzInfoOutput>();
70 72 return output;
71 73 }
  74 + #endregion
72 75  
  76 + #region 获取工资全字段列表
73 77 /// <summary>
74 78 /// 获取工资全字段列表
75 79 /// </summary>
... ... @@ -286,7 +290,9 @@ namespace NCC.Extend.LqGz
286 290 .ToPagedListAsync(input.currentPage, input.pageSize);
287 291 return PageResult<LqGzListOutput>.SqlSugarPageResult(data);
288 292 }
  293 + #endregion
289 294  
  295 + #region 新建工资全字段
290 296 /// <summary>
291 297 /// 新建工资全字段
292 298 /// </summary>
... ... @@ -302,7 +308,9 @@ namespace NCC.Extend.LqGz
302 308 if (!(isOk > 0))
303 309 throw NCCException.Oh(ErrorCode.COM1000);
304 310 }
  311 + #endregion
305 312  
  313 + #region 获取工资全字段无分页列表
306 314 /// <summary>
307 315 /// 获取工资全字段无分页列表
308 316 /// </summary>
... ... @@ -519,6 +527,9 @@ namespace NCC.Extend.LqGz
519 527 .ToListAsync();
520 528 return data;
521 529 }
  530 + #endregion
  531 +
  532 + #region 导出工资全字段
522 533  
523 534 /// <summary>
524 535 /// 导出工资全字段
... ... @@ -562,7 +573,9 @@ namespace NCC.Extend.LqGz
562 573 var output = new { name = excelconfig.FileName, url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fileName, "NCC") };
563 574 return output;
564 575 }
  576 + #endregion
565 577  
  578 + #region 批量删除工资全字段
566 579 /// <summary>
567 580 /// 批量删除工资全字段
568 581 /// </summary>
... ... @@ -591,7 +604,9 @@ namespace NCC.Extend.LqGz
591 604 }
592 605 }
593 606 }
  607 + #endregion
594 608  
  609 + #region 更新工资全字段
595 610 /// <summary>
596 611 /// 更新工资全字段
597 612 /// </summary>
... ... @@ -606,7 +621,9 @@ namespace NCC.Extend.LqGz
606 621 if (!(isOk > 0))
607 622 throw NCCException.Oh(ErrorCode.COM1001);
608 623 }
  624 + #endregion
609 625  
  626 + #region 删除工资全字段
610 627 /// <summary>
611 628 /// 删除工资全字段
612 629 /// </summary>
... ... @@ -620,6 +637,7 @@ namespace NCC.Extend.LqGz
620 637 if (!(isOk > 0))
621 638 throw NCCException.Oh(ErrorCode.COM1002);
622 639 }
  640 + #endregion
623 641  
624 642 #region 业绩计算相关方法
625 643  
... ... @@ -896,5 +914,237 @@ namespace NCC.Extend.LqGz
896 914 }
897 915  
898 916 #endregion
  917 +
  918 + #region 金三角统计数据保存
  919 +
  920 + /// <summary>
  921 + /// 保存金三角开卡业绩统计数据
  922 + /// </summary>
  923 + /// <remarks>
  924 + /// 根据金三角设定和开单记录统计金三角的业绩数据
  925 + /// 使用直接SQL查询提高效率,完全按照原始SQL逻辑实现
  926 + ///
  927 + /// 示例请求:
  928 + /// ```json
  929 + /// POST /api/Extend/LqGz/save-gold-triangle-statistics
  930 + /// {
  931 + /// "statisticsMonth": "202401"
  932 + /// }
  933 + /// ```
  934 + /// </remarks>
  935 + /// <param name="statisticsMonth">统计月份(YYYYMM格式)</param>
  936 + /// <returns>保存结果</returns>
  937 + /// <response code="200">成功保存统计数据</response>
  938 + /// <response code="400">参数错误</response>
  939 + /// <response code="500">服务器内部错误</response>
  940 + [HttpPost("save-gold-triangle-statistics")]
  941 + public async Task<dynamic> SaveGoldTriangleStatistics(string statisticsMonth)
  942 + {
  943 + if (string.IsNullOrEmpty(statisticsMonth) || statisticsMonth.Length != 6)
  944 + {
  945 + throw NCCException.Oh("统计月份格式错误,请使用YYYYMM格式");
  946 + }
  947 +
  948 + try
  949 + {
  950 + // 使用直接SQL查询,完全按照原始SQL逻辑
  951 + var sql = @"
  952 + SELECT
  953 + jsj.F_Id AS JsjId,
  954 + jsj.jsj AS JsjName,
  955 + jsj.yf AS Month,
  956 + jsj.md AS StoreId,
  957 + md.dm AS StoreName,
  958 + COUNT(DISTINCT jksyj.glkdbh) AS OrderCount,
  959 + SUM(CAST(jksyj.jksyj AS DECIMAL(18,2))) AS TotalPerformance,
  960 + MAX(jksyj.yjsj) AS LastOrderDate,
  961 + MIN(jksyj.yjsj) AS FirstOrderDate
  962 + FROM lq_ycsd_jsj jsj
  963 + LEFT JOIN lq_kd_jksyj jksyj ON (
  964 + jsj.F_Id = jksyj.jsj_id
  965 + AND YEAR(jksyj.yjsj) = SUBSTRING(jsj.yf, 1, 4)
  966 + AND MONTH(jksyj.yjsj) = SUBSTRING(jsj.yf, 5, 2)
  967 + )
  968 + LEFT JOIN lq_mdxx md ON jsj.md = md.F_Id
  969 + WHERE jsj.yf = @statisticsMonth
  970 + AND jksyj.yjsj IS NOT NULL
  971 + AND jksyj.jksyj IS NOT NULL
  972 + AND jksyj.jksyj <> ''
  973 + AND jksyj.jksyj <> '0'
  974 + GROUP BY jsj.F_Id, jsj.jsj, jsj.yf, jsj.md, md.dm
  975 + ORDER BY jsj.yf DESC, TotalPerformance DESC";
  976 +
  977 + var statisticsData = await _db.Ado.SqlQueryAsync<dynamic>(sql, new { statisticsMonth });
  978 +
  979 + if (!statisticsData.Any())
  980 + {
  981 + return new
  982 + {
  983 + Success = true,
  984 + Message = $"未找到 {statisticsMonth} 月份的金三角统计数据",
  985 + SavedCount = 0
  986 + };
  987 + }
  988 +
  989 + // 转换为实体对象并保存
  990 + var entities = statisticsData.Select(data => new LqStatisticsGoldTriangleEntity
  991 + {
  992 + Id = YitIdHelper.NextId().ToString(),
  993 + GoldTriangleId = data.JsjId?.ToString(),
  994 + GoldTriangleName = data.JsjName?.ToString(),
  995 + StatisticsMonth = data.Month?.ToString(),
  996 + StoreId = data.StoreId?.ToString(),
  997 + StoreName = data.StoreName?.ToString(),
  998 + OrderCount = Convert.ToInt32(data.OrderCount),
  999 + TotalPerformance = Convert.ToDecimal(data.TotalPerformance),
  1000 + LastOrderDate = data.LastOrderDate as DateTime?,
  1001 + FirstOrderDate = data.FirstOrderDate as DateTime?,
  1002 + CreateTime = DateTime.Now
  1003 + }).ToList();
  1004 +
  1005 + // 先删除该月份的历史数据
  1006 + await _db.Deleteable<LqStatisticsGoldTriangleEntity>()
  1007 + .Where(x => x.StatisticsMonth == statisticsMonth)
  1008 + .ExecuteCommandAsync();
  1009 +
  1010 + // 批量插入新数据
  1011 + var savedCount = await _db.Insertable(entities).ExecuteCommandAsync();
  1012 +
  1013 + _logger.LogInformation($"成功保存金三角统计数据 - 月份: {statisticsMonth}, 记录数: {savedCount}");
  1014 +
  1015 + return new
  1016 + {
  1017 + Success = true,
  1018 + Message = $"成功保存 {savedCount} 条金三角统计数据",
  1019 + SavedCount = savedCount,
  1020 + StatisticsMonth = statisticsMonth
  1021 + };
  1022 + }
  1023 + catch (Exception ex)
  1024 + {
  1025 + _logger.LogError(ex, $"保存金三角统计数据失败 - 月份: {statisticsMonth}");
  1026 + throw NCCException.Oh($"保存金三角统计数据失败: {ex.Message}");
  1027 + }
  1028 + }
  1029 +
  1030 + /// <summary>
  1031 + /// 测试金三角统计SQL查询
  1032 + /// </summary>
  1033 + /// <remarks>
  1034 + /// 直接执行SQL查询,验证统计逻辑是否正确
  1035 + ///
  1036 + /// 示例请求:
  1037 + /// ```json
  1038 + /// GET /api/Extend/LqGz/test-gold-triangle-sql?statisticsMonth=202401
  1039 + /// ```
  1040 + /// </remarks>
  1041 + /// <param name="statisticsMonth">统计月份(YYYYMM格式)</param>
  1042 + /// <returns>原始SQL查询结果</returns>
  1043 + /// <response code="200">成功返回查询结果</response>
  1044 + /// <response code="400">参数错误</response>
  1045 + [HttpGet("test-gold-triangle-sql")]
  1046 + public async Task<dynamic> TestGoldTriangleSql(string statisticsMonth)
  1047 + {
  1048 + if (string.IsNullOrEmpty(statisticsMonth) || statisticsMonth.Length != 6)
  1049 + {
  1050 + throw NCCException.Oh("统计月份格式错误,请使用YYYYMM格式");
  1051 + }
  1052 +
  1053 + try
  1054 + {
  1055 + var sql = @"
  1056 + SELECT
  1057 + jsj.F_Id AS JsjId,
  1058 + jsj.jsj AS JsjName,
  1059 + jsj.yf AS Month,
  1060 + jsj.md AS StoreId,
  1061 + md.dm AS StoreName,
  1062 + COUNT(DISTINCT jksyj.glkdbh) AS OrderCount,
  1063 + SUM(CAST(jksyj.jksyj AS DECIMAL(18,2))) AS TotalPerformance,
  1064 + MAX(jksyj.yjsj) AS LastOrderDate,
  1065 + MIN(jksyj.yjsj) AS FirstOrderDate
  1066 + FROM lq_ycsd_jsj jsj
  1067 + LEFT JOIN lq_kd_jksyj jksyj ON (
  1068 + jsj.F_Id = jksyj.jsj_id
  1069 + AND YEAR(jksyj.yjsj) = SUBSTRING(jsj.yf, 1, 4)
  1070 + AND MONTH(jksyj.yjsj) = SUBSTRING(jsj.yf, 5, 2)
  1071 + )
  1072 + LEFT JOIN lq_mdxx md ON jsj.md = md.F_Id
  1073 + WHERE jsj.yf = @statisticsMonth
  1074 + AND jksyj.yjsj IS NOT NULL
  1075 + AND jksyj.jksyj IS NOT NULL
  1076 + AND jksyj.jksyj <> ''
  1077 + AND jksyj.jksyj <> '0'
  1078 + GROUP BY jsj.F_Id, jsj.jsj, jsj.yf, jsj.md, md.dm
  1079 + ORDER BY jsj.yf DESC, TotalPerformance DESC";
  1080 +
  1081 + var result = await _db.Ado.SqlQueryAsync<dynamic>(sql, new { statisticsMonth });
  1082 +
  1083 + return new
  1084 + {
  1085 + Success = true,
  1086 + Data = result,
  1087 + Count = result.Count,
  1088 + StatisticsMonth = statisticsMonth,
  1089 + Sql = sql
  1090 + };
  1091 + }
  1092 + catch (Exception ex)
  1093 + {
  1094 + _logger.LogError(ex, $"测试金三角统计SQL失败 - 月份: {statisticsMonth}");
  1095 + throw NCCException.Oh($"测试金三角统计SQL失败: {ex.Message}");
  1096 + }
  1097 + }
  1098 +
  1099 + /// <summary>
  1100 + /// 获取金三角统计数据
  1101 + /// </summary>
  1102 + /// <remarks>
  1103 + /// 查询指定月份的金三角统计数据
  1104 + ///
  1105 + /// 示例请求:
  1106 + /// ```json
  1107 + /// GET /api/Extend/LqGz/get-gold-triangle-statistics?statisticsMonth=202401
  1108 + /// ```
  1109 + /// </remarks>
  1110 + /// <param name="statisticsMonth">统计月份(YYYYMM格式)</param>
  1111 + /// <returns>统计数据列表</returns>
  1112 + /// <response code="200">成功返回统计数据</response>
  1113 + /// <response code="400">参数错误</response>
  1114 + [HttpGet("get-gold-triangle-statistics")]
  1115 + public async Task<dynamic> GetGoldTriangleStatistics(string statisticsMonth)
  1116 + {
  1117 + if (string.IsNullOrEmpty(statisticsMonth))
  1118 + {
  1119 + throw NCCException.Oh("统计月份不能为空");
  1120 + }
  1121 +
  1122 + try
  1123 + {
  1124 + var statistics = await _db.Queryable<LqStatisticsGoldTriangleEntity>()
  1125 + .Where(x => x.StatisticsMonth == statisticsMonth)
  1126 + .OrderBy(x => x.TotalPerformance, OrderByType.Desc)
  1127 + .ToListAsync();
  1128 +
  1129 + return new
  1130 + {
  1131 + Success = true,
  1132 + Data = statistics,
  1133 + Count = statistics.Count,
  1134 + StatisticsMonth = statisticsMonth
  1135 + };
  1136 + }
  1137 + catch (Exception ex)
  1138 + {
  1139 + _logger.LogError(ex, $"查询金三角统计数据失败 - 月份: {statisticsMonth}");
  1140 + throw NCCException.Oh($"查询金三角统计数据失败: {ex.Message}");
  1141 + }
  1142 + }
  1143 +
  1144 + #endregion
  1145 +
  1146 +
  1147 +
  1148 +
899 1149 }
900 1150 }
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqHzfService.cs
1   -using NCC.Common.Core.Manager;
  1 +using System;
  2 +using System.Collections.Generic;
  3 +using System.Linq;
  4 +using System.Threading.Tasks;
  5 +using Mapster;
  6 +using Microsoft.AspNetCore.Mvc;
  7 +using NCC.ClayObject;
  8 +using NCC.Common.Configuration;
  9 +using NCC.Common.Core.Manager;
2 10 using NCC.Common.Enum;
3 11 using NCC.Common.Extension;
4 12 using NCC.Common.Filter;
  13 +using NCC.Common.Helper;
  14 +using NCC.Common.Model.NPOI;
  15 +using NCC.DataEncryption;
5 16 using NCC.Dependency;
6 17 using NCC.DynamicApiController;
7   -using NCC.FriendlyException;
  18 +using NCC.Extend.Entitys.Dto.LqHzf;
  19 +using NCC.Extend.Entitys.lq_hzf;
8 20 using NCC.Extend.Interfaces.LqHzf;
9   -using Mapster;
10   -using Microsoft.AspNetCore.Mvc;
  21 +using NCC.FriendlyException;
  22 +using NCC.JsonSerialization;
11 23 using SqlSugar;
12   -using System;
13   -using System.Collections.Generic;
14   -using System.Linq;
15   -using System.Threading.Tasks;
16   -using NCC.Extend.Entitys.lq_hzf;
17   -using NCC.Extend.Entitys.Dto.LqHzf;
18 24 using Yitter.IdGenerator;
19   -using NCC.Common.Helper;
20   -using NCC.JsonSerialization;
21   -using NCC.Common.Model.NPOI;
22   -using NCC.Common.Configuration;
23   -using NCC.DataEncryption;
24   -using NCC.ClayObject;
25 25  
26 26 namespace NCC.Extend.LqHzf
27 27 {
28 28 /// <summary>
29 29 /// 合作方服务
30 30 /// </summary>
31   - [ApiDescriptionSettings(Tag = "Extend",Name = "LqHzf", Order = 200)]
  31 + [ApiDescriptionSettings(Tag = "Extend", Name = "LqHzf", Order = 200)]
32 32 [Route("api/Extend/[controller]")]
33 33 public class LqHzfService : ILqHzfService, IDynamicApiController, ITransient
34 34 {
... ... @@ -39,11 +39,9 @@ namespace NCC.Extend.LqHzf
39 39 /// <summary>
40 40 /// 初始化一个<see cref="LqHzfService"/>类型的新实例
41 41 /// </summary>
42   - public LqHzfService(
43   - ISqlSugarRepository<LqHzfEntity> lqHzfRepository,
44   - IUserManager userManager)
  42 + public LqHzfService(ISqlSugarRepository<LqHzfEntity> lqHzfRepository, IUserManager userManager)
45 43 {
46   - _lqHzfRepository = lqHzfRepository;
  44 + _lqHzfRepository = lqHzfRepository;
47 45 _db = _lqHzfRepository.Context;
48 46 _userManager = userManager;
49 47 }
... ... @@ -62,10 +60,10 @@ namespace NCC.Extend.LqHzf
62 60 }
63 61  
64 62 /// <summary>
65   - /// 获取合作方列表
66   - /// </summary>
67   - /// <param name="input">请求参数</param>
68   - /// <returns></returns>
  63 + /// 获取合作方列表
  64 + /// </summary>
  65 + /// <param name="input">请求参数</param>
  66 + /// <returns></returns>
69 67 [HttpGet("")]
70 68 public async Task<dynamic> GetList([FromQuery] LqHzfListQueryInput input)
71 69 {
... ... @@ -75,14 +73,17 @@ namespace NCC.Extend.LqHzf
75 73 .WhereIF(!string.IsNullOrEmpty(input.hzmc), p => p.Hzmc.Contains(input.hzmc))
76 74 .WhereIF(!string.IsNullOrEmpty(input.hzfczb), p => p.Hzfczb.Equals(input.hzfczb))
77 75 .WhereIF(!string.IsNullOrEmpty(input.skf), p => p.Skf.Contains(input.skf))
78   - .Select(it=> new LqHzfListOutput
  76 + .Select(it => new LqHzfListOutput
79 77 {
80 78 id = it.Id,
81   - hzmc=it.Hzmc,
82   - hzfczb=it.Hzfczb,
83   - skf=it.Skf,
84   - }).MergeTable().OrderBy(sidx+" "+input.sort).ToPagedListAsync(input.currentPage, input.pageSize);
85   - return PageResult<LqHzfListOutput>.SqlSugarPageResult(data);
  79 + hzmc = it.Hzmc,
  80 + hzfczb = it.Hzfczb,
  81 + skf = it.Skf,
  82 + })
  83 + .MergeTable()
  84 + .OrderBy(sidx + " " + input.sort)
  85 + .ToPagedListAsync(input.currentPage, input.pageSize);
  86 + return PageResult<LqHzfListOutput>.SqlSugarPageResult(data);
86 87 }
87 88  
88 89 /// <summary>
... ... @@ -97,14 +98,15 @@ namespace NCC.Extend.LqHzf
97 98 var entity = input.Adapt<LqHzfEntity>();
98 99 entity.Id = YitIdHelper.NextId().ToString();
99 100 var isOk = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync();
100   - if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1000);
  101 + if (!(isOk > 0))
  102 + throw NCCException.Oh(ErrorCode.COM1000);
101 103 }
102 104  
103 105 /// <summary>
104   - /// 获取合作方无分页列表
105   - /// </summary>
106   - /// <param name="input">请求参数</param>
107   - /// <returns></returns>
  106 + /// 获取合作方无分页列表
  107 + /// </summary>
  108 + /// <param name="input">请求参数</param>
  109 + /// <returns></returns>
108 110 [NonAction]
109 111 public async Task<dynamic> GetNoPagingList([FromQuery] LqHzfListQueryInput input)
110 112 {
... ... @@ -114,21 +116,24 @@ namespace NCC.Extend.LqHzf
114 116 .WhereIF(!string.IsNullOrEmpty(input.hzmc), p => p.Hzmc.Contains(input.hzmc))
115 117 .WhereIF(!string.IsNullOrEmpty(input.hzfczb), p => p.Hzfczb.Equals(input.hzfczb))
116 118 .WhereIF(!string.IsNullOrEmpty(input.skf), p => p.Skf.Contains(input.skf))
117   - .Select(it=> new LqHzfListOutput
  119 + .Select(it => new LqHzfListOutput
118 120 {
119 121 id = it.Id,
120   - hzmc=it.Hzmc,
121   - hzfczb=it.Hzfczb,
122   - skf=it.Skf,
123   - }).MergeTable().OrderBy(sidx+" "+input.sort).ToListAsync();
124   - return data;
  122 + hzmc = it.Hzmc,
  123 + hzfczb = it.Hzfczb,
  124 + skf = it.Skf,
  125 + })
  126 + .MergeTable()
  127 + .OrderBy(sidx + " " + input.sort)
  128 + .ToListAsync();
  129 + return data;
125 130 }
126 131  
127 132 /// <summary>
128   - /// 导出合作方
129   - /// </summary>
130   - /// <param name="input">请求参数</param>
131   - /// <returns></returns>
  133 + /// 导出合作方
  134 + /// </summary>
  135 + /// <param name="input">请求参数</param>
  136 + /// <returns></returns>
132 137 [HttpGet("Actions/Export")]
133 138 public async Task<dynamic> Export([FromQuery] LqHzfListQueryInput input)
134 139 {
... ... @@ -143,7 +148,8 @@ namespace NCC.Extend.LqHzf
143 148 {
144 149 exportData = await this.GetNoPagingList(input);
145 150 }
146   - List<ParamsModel> paramList = "[{\"value\":\"合作编号\",\"field\":\"id\"},{\"value\":\"合作名称\",\"field\":\"hzmc\"},{\"value\":\"合作分成占比\",\"field\":\"hzfczb\"},{\"value\":\"收款方\",\"field\":\"skf\"},]".ToList<ParamsModel>();
  151 + List<ParamsModel> paramList =
  152 + "[{\"value\":\"合作编号\",\"field\":\"id\"},{\"value\":\"合作名称\",\"field\":\"hzmc\"},{\"value\":\"合作分成占比\",\"field\":\"hzfczb\"},{\"value\":\"收款方\",\"field\":\"skf\"},]".ToList<ParamsModel>();
147 153 ExcelConfig excelconfig = new ExcelConfig();
148 154 excelconfig.FileName = "合作方.xls";
149 155 excelconfig.HeadFont = "微软雅黑";
... ... @@ -162,11 +168,7 @@ namespace NCC.Extend.LqHzf
162 168 var addPath = FileVariable.TemporaryFilePath + excelconfig.FileName;
163 169 ExcelExportHelper<LqHzfListOutput>.Export(exportData, excelconfig, addPath);
164 170 var fileName = _userManager.UserId + "|" + addPath + "|xls";
165   - var output = new
166   - {
167   - name = excelconfig.FileName,
168   - url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fileName, "NCC")
169   - };
  171 + var output = new { name = excelconfig.FileName, url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fileName, "NCC") };
170 172 return output;
171 173 }
172 174  
... ... @@ -186,7 +188,7 @@ namespace NCC.Extend.LqHzf
186 188 //开启事务
187 189 _db.BeginTran();
188 190 //批量删除合作方
189   - await _db.Deleteable<LqHzfEntity>().In(d => d.Id,ids).ExecuteCommandAsync();
  191 + await _db.Deleteable<LqHzfEntity>().In(d => d.Id, ids).ExecuteCommandAsync();
190 192 //关闭事务
191 193 _db.CommitTran();
192 194 }
... ... @@ -210,7 +212,8 @@ namespace NCC.Extend.LqHzf
210 212 {
211 213 var entity = input.Adapt<LqHzfEntity>();
212 214 var isOk = await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
213   - if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1001);
  215 + if (!(isOk > 0))
  216 + throw NCCException.Oh(ErrorCode.COM1001);
214 217 }
215 218  
216 219 /// <summary>
... ... @@ -223,7 +226,8 @@ namespace NCC.Extend.LqHzf
223 226 var entity = await _db.Queryable<LqHzfEntity>().FirstAsync(p => p.Id == id);
224 227 _ = entity ?? throw NCCException.Oh(ErrorCode.COM1005);
225 228 var isOk = await _db.Deleteable<LqHzfEntity>().Where(d => d.Id == id).ExecuteCommandAsync();
226   - if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1002);
  229 + if (!(isOk > 0))
  230 + throw NCCException.Oh(ErrorCode.COM1002);
227 231 }
228 232 }
229 233 }
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs
... ... @@ -25,6 +25,7 @@ using NCC.Extend.Entitys.lq_kd_jksyj;
25 25 using NCC.Extend.Entitys.lq_kd_kdjlb;
26 26 using NCC.Extend.Entitys.lq_kd_kjbsyj;
27 27 using NCC.Extend.Entitys.lq_kd_pxmx;
  28 +using NCC.Extend.Entitys.lq_khxx;
28 29 using NCC.Extend.Entitys.lq_xmzl;
29 30 using NCC.Extend.Interfaces.LqKdKdjlb;
30 31 using NCC.Extend.Utils;
... ... @@ -191,7 +192,6 @@ namespace NCC.Extend.LqKdKdjlb
191 192 .WhereIF(!string.IsNullOrEmpty(input.sfyj), p => p.Sfyj.Equals(input.sfyj))
192 193 .WhereIF(!string.IsNullOrEmpty(input.qk), p => p.Qk.Equals(input.qk))
193 194 .WhereIF(!string.IsNullOrEmpty(input.ckfs), p => p.Ckfs.Equals(input.ckfs))
194   - .WhereIF(!string.IsNullOrEmpty(input.ckmx), p => p.Ckmx.Contains(input.ckmx))
195 195 .WhereIF(!string.IsNullOrEmpty(input.fkfs), p => p.Fkfs.Equals(input.fkfs))
196 196 .WhereIF(!string.IsNullOrEmpty(input.fkyy), p => p.Fkyy.Equals(input.fkyy))
197 197 .WhereIF(!string.IsNullOrEmpty(input.fkpd), p => p.Fkpd.Contains(input.fkpd))
... ... @@ -219,12 +219,12 @@ namespace NCC.Extend.LqKdKdjlb
219 219 sfyj = it.Sfyj,
220 220 qk = it.Qk,
221 221 ckfs = it.Ckfs,
222   - ckmx = it.Ckmx,
223 222 fkfs = it.Fkfs,
224 223 fkyy = it.Fkyy,
225 224 fkpd = it.Fkpd,
226 225 khly = it.Khly,
227 226 tjr = it.Tjr,
  227 + deductAmount = it.DeductAmount,
228 228 sfskdd = it.Sfskdd,
229 229 jj = it.Jj,
230 230 bz = it.Bz,
... ... @@ -263,6 +263,7 @@ namespace NCC.Extend.LqKdKdjlb
263 263 _db.BeginTran();
264 264 //新增开单记录表记录
265 265 entity.CreateUser = userInfo.userId;
  266 + entity.DeductAmount = input.lqKdKdjlbDeductList.Sum(x => x.Amount ?? 0);//计算储扣总金额
266 267 var newEntity = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteReturnEntityAsync();
267 268 //循环品相信息
268 269 // 收集所有需要插入的实体,然后批量插入
... ... @@ -347,6 +348,10 @@ namespace NCC.Extend.LqKdKdjlb
347 348 }
348 349 }
349 350 }
  351 + //通过会员id查询会员信息
  352 + var memberInfo = await _db.Queryable<LqKhxxEntity>().Where(u => u.Id == entity.Kdhy).FirstAsync();
  353 + memberInfo.Khlx = "老客";
  354 + await _db.Updateable(memberInfo).ExecuteCommandAsync();
350 355 // 批量插入扣款信息
351 356 if (allDeductEntities.Any())
352 357 {
... ... @@ -442,7 +447,6 @@ namespace NCC.Extend.LqKdKdjlb
442 447 .WhereIF(!string.IsNullOrEmpty(input.sfyj), p => p.Sfyj.Equals(input.sfyj))
443 448 .WhereIF(!string.IsNullOrEmpty(input.qk), p => p.Qk.Equals(input.qk))
444 449 .WhereIF(!string.IsNullOrEmpty(input.ckfs), p => p.Ckfs.Equals(input.ckfs))
445   - .WhereIF(!string.IsNullOrEmpty(input.ckmx), p => p.Ckmx.Contains(input.ckmx))
446 450 .WhereIF(!string.IsNullOrEmpty(input.fkfs), p => p.Fkfs.Equals(input.fkfs))
447 451 .WhereIF(!string.IsNullOrEmpty(input.fkyy), p => p.Fkyy.Equals(input.fkyy))
448 452 .WhereIF(!string.IsNullOrEmpty(input.fkpd), p => p.Fkpd.Contains(input.fkpd))
... ... @@ -470,7 +474,7 @@ namespace NCC.Extend.LqKdKdjlb
470 474 sfyj = it.Sfyj,
471 475 qk = it.Qk,
472 476 ckfs = it.Ckfs,
473   - ckmx = it.Ckmx,
  477 + deductAmount = it.DeductAmount,
474 478 fkfs = it.Fkfs,
475 479 fkyy = it.Fkyy,
476 480 fkpd = it.Fkpd,
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs
... ... @@ -16,8 +16,10 @@ using NCC.Common.Model.NPOI;
16 16 using NCC.DataEncryption;
17 17 using NCC.Dependency;
18 18 using NCC.DynamicApiController;
  19 +using NCC.Extend.Entitys.Dto.Common;
19 20 using NCC.Extend.Entitys.Dto.LqKhxx;
20 21 using NCC.Extend.Entitys.Dto.LqXhHyhk;
  22 +using NCC.Extend.Entitys.Enum;
21 23 using NCC.Extend.Entitys.lq_hytk_hytk;
22 24 using NCC.Extend.Entitys.lq_hytk_mx;
23 25 using NCC.Extend.Entitys.lq_kd_kdjlb;
... ... @@ -90,7 +92,6 @@ namespace NCC.Extend.LqKhxx
90 92 .WhereIF(!string.IsNullOrEmpty(input.gzhzt), p => p.Gzhzt.Equals(input.gzhzt))
91 93 .WhereIF(!string.IsNullOrEmpty(input.wxnc), p => p.Wxnc.Contains(input.wxnc))
92 94 .WhereIF(!string.IsNullOrEmpty(input.wxxcxzt), p => p.Wxxcxzt.Equals(input.wxxcxzt))
93   - .WhereIF(!string.IsNullOrEmpty(input.khmqgs), p => p.Khmqgs.Equals(input.khmqgs))
94 95 .WhereIF(!string.IsNullOrEmpty(input.gsmd), p => p.Gsmd.Contains(input.gsmd))
95 96 .WhereIF(!string.IsNullOrEmpty(input.khlx), p => p.Khlx.Equals(input.khlx))
96 97 .WhereIF(!string.IsNullOrEmpty(input.khjd), p => p.Khjd.Equals(input.khjd))
... ... @@ -114,7 +115,6 @@ namespace NCC.Extend.LqKhxx
114 115 wxnc = it.Wxnc,
115 116 wxxcxzt = it.Wxxcxzt,
116 117 zjdlsj = it.Zjdlsj,
117   - khmqgs = it.Khmqgs,
118 118 gsmd = it.Gsmd,
119 119 zcsj = it.Zcsj,
120 120 khlx = it.Khlx,
... ... @@ -157,7 +157,6 @@ namespace NCC.Extend.LqKhxx
157 157 }
158 158 var entity = input.Adapt<LqKhxxEntity>();
159 159 entity.Id = YitIdHelper.NextId().ToString();
160   -
161 160 // 处理客户消费字段:将数组转换为逗号分隔的字符串
162 161 if (input.khxf != null && input.khxf.Count > 0)
163 162 {
... ... @@ -203,7 +202,6 @@ namespace NCC.Extend.LqKhxx
203 202 .WhereIF(!string.IsNullOrEmpty(input.wxxcxzt), p => p.Wxxcxzt.Equals(input.wxxcxzt))
204 203 // .WhereIF(queryZjdlsj != null, p => p.Zjdlsj >= new DateTime(startZjdlsj.ToDate().Year, startZjdlsj.ToDate().Month, startZjdlsj.ToDate().Day, 0, 0, 0))
205 204 // .WhereIF(queryZjdlsj != null, p => p.Zjdlsj <= new DateTime(endZjdlsj.ToDate().Year, endZjdlsj.ToDate().Month, endZjdlsj.ToDate().Day, 23, 59, 59))
206   - .WhereIF(!string.IsNullOrEmpty(input.khmqgs), p => p.Khmqgs.Equals(input.khmqgs))
207 205 .WhereIF(!string.IsNullOrEmpty(input.gsmd), p => p.Gsmd.Contains(input.gsmd))
208 206 .WhereIF(queryZcsj != null, p => p.Zcsj >= new DateTime(startZcsj.ToDate().Year, startZcsj.ToDate().Month, startZcsj.ToDate().Day, 0, 0, 0))
209 207 .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
233 231 wxnc = it.Wxnc,
234 232 wxxcxzt = it.Wxxcxzt,
235 233 zjdlsj = it.Zjdlsj,
236   - khmqgs = it.Khmqgs,
237 234 gsmd = it.Gsmd,
238 235 zcsj = it.Zcsj,
239 236 khlx = it.Khlx,
... ... @@ -282,7 +279,7 @@ namespace NCC.Extend.LqKhxx
282 279 DateTime? endYinlsr = queryYinlsr != null ? Ext.GetDateTime(queryYinlsr.Last()) : null;
283 280  
284 281 var data = await _db.Queryable<LqKhxxEntity>()
285   - .Where(p => p.Khmqgs == "线索池") // 固定查询线索池客户
  282 + .Where(p => p.Khlx == "线索") // 固定查询线索池客户
286 283 .WhereIF(!string.IsNullOrEmpty(input.id), p => p.Id.Contains(input.id))
287 284 .WhereIF(!string.IsNullOrEmpty(input.khmc), p => p.Khmc.Contains(input.khmc))
288 285 .WhereIF(!string.IsNullOrEmpty(input.sjh), p => p.Sjh.Contains(input.sjh))
... ... @@ -291,7 +288,6 @@ namespace NCC.Extend.LqKhxx
291 288 .WhereIF(!string.IsNullOrEmpty(input.gzhzt), p => p.Gzhzt.Equals(input.gzhzt))
292 289 .WhereIF(!string.IsNullOrEmpty(input.wxnc), p => p.Wxnc.Contains(input.wxnc))
293 290 .WhereIF(!string.IsNullOrEmpty(input.wxxcxzt), p => p.Wxxcxzt.Equals(input.wxxcxzt))
294   - .WhereIF(!string.IsNullOrEmpty(input.khmqgs), p => p.Khmqgs.Equals(input.khmqgs))
295 291 .WhereIF(!string.IsNullOrEmpty(input.gsmd), p => p.Gsmd.Contains(input.gsmd))
296 292 .WhereIF(queryZcsj != null, p => p.Zcsj >= new DateTime(startZcsj.ToDate().Year, startZcsj.ToDate().Month, startZcsj.ToDate().Day, 0, 0, 0))
297 293 .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
321 317 wxnc = it.Wxnc,
322 318 wxxcxzt = it.Wxxcxzt,
323 319 zjdlsj = it.Zjdlsj,
324   - khmqgs = it.Khmqgs,
325 320 gsmd = it.Gsmd,
326 321 zcsj = it.Zcsj,
327 322 khlx = it.Khlx,
... ... @@ -570,10 +565,10 @@ namespace NCC.Extend.LqKhxx
570 565 TotalPurchased = x.ProjectNumber,
571 566 ConsumedCount = SqlFunc.Subqueryable<LqXhPxmxEntity>().Where(y => y.BillingItemId == x.Id).Sum(y => SqlFunc.ToDecimal(y.ProjectNumber)),
572 567 RefundedCount = SqlFunc.Subqueryable<LqHytkMxEntity>().Where(y => y.BillingItemId == x.Id).Sum(y => SqlFunc.ToDecimal(y.ProjectNumber)),
573   - RemainingCount =
574   - x.ProjectNumber
575   - - SqlFunc.Subqueryable<LqXhPxmxEntity>().Where(y => y.BillingItemId == x.Id).Sum(y => SqlFunc.ToDecimal(y.ProjectNumber))
576   - - SqlFunc.Subqueryable<LqHytkMxEntity>().Where(y => y.BillingItemId == x.Id).Sum(y => SqlFunc.ToDecimal(y.ProjectNumber)),
  568 + })
  569 + .Mapper(x =>
  570 + {
  571 + x.RemainingCount = x.TotalPurchased - x.ConsumedCount - x.RefundedCount;
577 572 })
578 573 .ToListAsync();
579 574 return new MemberRemainingItemsOutput
... ... @@ -590,5 +585,25 @@ namespace NCC.Extend.LqKhxx
590 585 }
591 586 }
592 587 #endregion
  588 +
  589 + #region 获取会员类型枚举内容
  590 + /// <summary>
  591 + /// 获取会员类型枚举内容
  592 + /// </summary>
  593 + /// <returns>扣款类型枚举列表</returns>
  594 + [HttpGet("deduct-types")]
  595 + public List<EnumOutput> GetDeductTypes()
  596 + {
  597 + return Enum.GetValues<MemberTypeEnum>()
  598 + .Select(e => new EnumOutput
  599 + {
  600 + Value = (int)e,
  601 + Name = e.ToString(),
  602 + Description = e.GetDescription(),
  603 + })
  604 + .ToList();
  605 + }
  606 + #endregion
  607 +
593 608 }
594 609 }
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs
... ... @@ -19,6 +19,7 @@ using NCC.Extend.Entitys.Dto.LqTkjlb;
19 19 using NCC.Extend.Entitys.lq_event;
20 20 using NCC.Extend.Entitys.lq_eventuser;
21 21 using NCC.Extend.Entitys.lq_khxx;
  22 +using NCC.Extend.Entitys.lq_mdxx;
22 23 using NCC.Extend.Entitys.lq_ryzl;
23 24 using NCC.Extend.Entitys.lq_tkjlb;
24 25 using NCC.Extend.Interfaces.LqTkjlb;
... ... @@ -145,14 +146,14 @@ namespace NCC.Extend.LqTkjlb
145 146 /// <param name="input">参数</param>
146 147 /// <returns></returns>
147 148 [HttpPost("")]
148   - public async Task Create([FromBody] LqTkjlbCrInput input)
  149 + public async Task<dynamic> Create([FromBody] LqTkjlbCrInput input)
149 150 {
150 151 var userInfo = await _userManager.GetUserInfo();
151 152 //通过input.dhhm去查询用户信息
152 153 var user = _db.Queryable<LqKhxxEntity>().Where(u => u.Sjh == input.customerPhone).Any();
153 154 if (user)
154 155 {
155   - throw NCCException.Oh("该手机号码已存在于会员或线索池中");
  156 + return NCCException.Oh("该手机号码已存在于会员或线索池中");
156 157 }
157 158 // 使用事务确保数据一致性
158 159 var result = await _db.Ado.UseTranAsync(async () =>
... ... @@ -179,18 +180,22 @@ namespace NCC.Extend.LqTkjlb
179 180 MemberInfo.Id = YitIdHelper.NextId().ToString();
180 181 MemberInfo.Khmc = entity.CustomerName;
181 182 MemberInfo.Sjh = input.customerPhone; // 设置手机号
182   - MemberInfo.Khmqgs = "线索池";
  183 + MemberInfo.Khlx = "线索";
183 184 MemberInfo.Dah = "GK" + DateTime.Now.ToString("yyyyMMddHHmmss");
184 185 var memberResult = await _db.Insertable(MemberInfo).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync();
185 186 if (!(memberResult > 0))
  187 + {
186 188 throw NCCException.Oh("创建客户信息失败");
187   - return true;
  189 + }
  190 + var storeinfo = await _db.Queryable<LqMdxxEntity>().Where(u => u.Id == eventUserInfo.StoreId).FirstAsync();
  191 + return new { entity = entity, storeinfo = storeinfo };
188 192 });
189 193  
190 194 if (!result.IsSuccess)
191 195 {
192   - throw NCCException.Oh($"创建拓客记录失败:{result.ErrorMessage}");
  196 + return NCCException.Oh($"创建拓客记录失败:{result.ErrorMessage}");
193 197 }
  198 + return result.Data;
194 199 }
195 200 #endregion
196 201  
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqYaoyjlService.cs
... ... @@ -28,7 +28,7 @@ namespace NCC.Extend.LqYaoyjl
28 28 /// <summary>
29 29 /// 邀约记录服务
30 30 /// </summary>
31   - [ApiDescriptionSettings(Tag = "Extend",Name = "LqYaoyjl", Order = 200)]
  31 + [ApiDescriptionSettings(Tag = "Extend", Name = "LqYaoyjl", Order = 200)]
32 32 [Route("api/Extend/[controller]")]
33 33 public class LqYaoyjlService : ILqYaoyjlService, IDynamicApiController, ITransient
34 34 {
... ... @@ -43,7 +43,7 @@ namespace NCC.Extend.LqYaoyjl
43 43 ISqlSugarRepository<LqYaoyjlEntity> lqYaoyjlRepository,
44 44 IUserManager userManager)
45 45 {
46   - _lqYaoyjlRepository = lqYaoyjlRepository;
  46 + _lqYaoyjlRepository = lqYaoyjlRepository;
47 47 _db = _lqYaoyjlRepository.Context;
48 48 _userManager = userManager;
49 49 }
... ... @@ -87,18 +87,18 @@ namespace NCC.Extend.LqYaoyjl
87 87 .WhereIF(queryLxsj != null, p => p.Lxsj >= new DateTime(startLxsj.ToDate().Year, startLxsj.ToDate().Month, startLxsj.ToDate().Day, 0, 0, 0))
88 88 .WhereIF(queryLxsj != null, p => p.Lxsj <= new DateTime(endLxsj.ToDate().Year, endLxsj.ToDate().Month, endLxsj.ToDate().Day, 23, 59, 59))
89 89 .WhereIF(!string.IsNullOrEmpty(input.lxjl), p => p.Lxjl.Contains(input.lxjl))
90   - .Select(it=> new LqYaoyjlListOutput
  90 + .Select(it => new LqYaoyjlListOutput
91 91 {
92 92 id = it.Id,
93   - yyr=it.Yyr,
94   - yysj=it.Yysj,
95   - yykh=it.Yykh,
96   - yykhxm=it.Yykhxm,
97   - dhsfyx=it.Dhsfyx,
98   - lxsj=it.Lxsj,
99   - lxjl=it.Lxjl,
100   - }).MergeTable().OrderBy(sidx+" "+input.sort).ToPagedListAsync(input.currentPage, input.pageSize);
101   - return PageResult<LqYaoyjlListOutput>.SqlSugarPageResult(data);
  93 + yyr = it.Yyr,
  94 + yysj = it.Yysj,
  95 + yykh = it.Yykh,
  96 + yykhxm = it.Yykhxm,
  97 + dhsfyx = it.Dhsfyx,
  98 + lxsj = it.Lxsj,
  99 + lxjl = it.Lxjl,
  100 + }).MergeTable().OrderBy(sidx + " " + input.sort).ToPagedListAsync(input.currentPage, input.pageSize);
  101 + return PageResult<LqYaoyjlListOutput>.SqlSugarPageResult(data);
102 102 }
103 103  
104 104 /// <summary>
... ... @@ -142,18 +142,18 @@ namespace NCC.Extend.LqYaoyjl
142 142 .WhereIF(queryLxsj != null, p => p.Lxsj >= new DateTime(startLxsj.ToDate().Year, startLxsj.ToDate().Month, startLxsj.ToDate().Day, 0, 0, 0))
143 143 .WhereIF(queryLxsj != null, p => p.Lxsj <= new DateTime(endLxsj.ToDate().Year, endLxsj.ToDate().Month, endLxsj.ToDate().Day, 23, 59, 59))
144 144 .WhereIF(!string.IsNullOrEmpty(input.lxjl), p => p.Lxjl.Contains(input.lxjl))
145   - .Select(it=> new LqYaoyjlListOutput
  145 + .Select(it => new LqYaoyjlListOutput
146 146 {
147 147 id = it.Id,
148   - yyr=it.Yyr,
149   - yysj=it.Yysj,
150   - yykh=it.Yykh,
151   - yykhxm=it.Yykhxm,
152   - dhsfyx=it.Dhsfyx,
153   - lxsj=it.Lxsj,
154   - lxjl=it.Lxjl,
155   - }).MergeTable().OrderBy(sidx+" "+input.sort).ToListAsync();
156   - return data;
  148 + yyr = it.Yyr,
  149 + yysj = it.Yysj,
  150 + yykh = it.Yykh,
  151 + yykhxm = it.Yykhxm,
  152 + dhsfyx = it.Dhsfyx,
  153 + lxsj = it.Lxsj,
  154 + lxjl = it.Lxjl,
  155 + }).MergeTable().OrderBy(sidx + " " + input.sort).ToListAsync();
  156 + return data;
157 157 }
158 158  
159 159 /// <summary>
... ... @@ -175,7 +175,7 @@ namespace NCC.Extend.LqYaoyjl
175 175 {
176 176 exportData = await this.GetNoPagingList(input);
177 177 }
178   - List<ParamsModel> 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<ParamsModel>();
  178 + List<ParamsModel> 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<ParamsModel>();
179 179 ExcelConfig excelconfig = new ExcelConfig();
180 180 excelconfig.FileName = "邀约记录.xls";
181 181 excelconfig.HeadFont = "微软雅黑";
... ... @@ -218,7 +218,7 @@ namespace NCC.Extend.LqYaoyjl
218 218 //开启事务
219 219 _db.BeginTran();
220 220 //批量删除邀约记录
221   - await _db.Deleteable<LqYaoyjlEntity>().In(d => d.Id,ids).ExecuteCommandAsync();
  221 + await _db.Deleteable<LqYaoyjlEntity>().In(d => d.Id, ids).ExecuteCommandAsync();
222 222 //关闭事务
223 223 _db.CommitTran();
224 224 }
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs
... ... @@ -180,13 +180,14 @@ namespace NCC.Extend.LqYcsdJsj
180 180 }
181 181 // 查询门店信息
182 182 var store = await _db.Queryable<LqMdxxEntity>().Where(x => x.Id == jsj.Md).FirstAsync();
183   - return new
  183 + return new LqYcsdJsjByUserMonthOutput
184 184 {
185 185 jsjId = jsj.Id,
186 186 jsjName = jsj.Jsj,
187 187 month = jsj.Yf,
188 188 storeId = jsj.Md,
189 189 storeName = store?.Dm,
  190 + userId = jsjUser.UserId,
190 191 userName = jsjUser.UserName,
191 192 isLeader = jsjUser.IsLeader,
192 193 status = jsjUser.Status,
... ... @@ -256,16 +257,16 @@ namespace NCC.Extend.LqYcsdJsj
256 257  
257 258 return new LqYcsdJsjByUserMonthOutput
258 259 {
259   - JsjId = jsj.Id,
260   - JsjName = jsj.Jsj,
261   - Month = jsj.Yf,
262   - StoreId = jsj.Md,
263   - StoreName = store?.Dm,
264   - UserId = jsjUser.UserId,
265   - UserName = jsjUser.UserName,
266   - IsLeader = jsjUser.IsLeader,
267   - Status = jsjUser.Status,
268   - SortOrder = jsjUser.SortOrder,
  260 + jsjId = jsj.Id,
  261 + jsjName = jsj.Jsj,
  262 + month = jsj.Yf,
  263 + storeId = jsj.Md,
  264 + storeName = store?.Dm,
  265 + userId = jsjUser.UserId,
  266 + userName = jsjUser.UserName,
  267 + isLeader = jsjUser.IsLeader,
  268 + status = jsjUser.Status,
  269 + sortOrder = jsjUser.SortOrder,
269 270 };
270 271 }
271 272 #endregion
... ...