Commit 0170aea1112e7e5e316266ad36471034a1eb23b6

Authored by 李宇
2 parents 557dc5cd d880edb3

Merge branch 'master' of http://39.98.150.180/antissoft/lvqianmeiye_ERP

Showing 63 changed files with 2415 additions and 1154 deletions
[已用]创建金三角统计视图.sql 0 → 100644
  1 +-- 创建金三角统计视图
  2 +-- 用于统计金三角的订单数量、业绩总额、首次和最后订单日期等信息
  3 +-- 按月份和业绩总额降序排列
  4 +
  5 +CREATE VIEW v_jsj_monthly_performance AS
  6 +SELECT
  7 + `jsj`.`F_Id` AS `jsj_id`,
  8 + `jsj`.`jsj` AS `jsj_name`,
  9 + `jsj`.`yf` AS `month`,
  10 + `jsj`.`md` AS `store_id`,
  11 + `md`.`dm` AS `store_name`,
  12 + count( DISTINCT `jksyj`.`glkdbh` ) AS `order_count`,
  13 + sum(
  14 + cast( `jksyj`.`jksyj` AS DECIMAL ( 18, 2 ) )
  15 + ) AS `total_performance`,
  16 + max( `jksyj`.`yjsj` ) AS `last_order_date`,
  17 + min( `jksyj`.`yjsj` ) AS `first_order_date`
  18 +FROM
  19 + (
  20 + (
  21 + `lq_ycsd_jsj` `jsj`
  22 + LEFT JOIN `lq_kd_jksyj` `jksyj` ON (
  23 + (
  24 + ( `jsj`.`F_Id` = `jksyj`.`jsj_id` )
  25 + AND (
  26 + YEAR ( `jksyj`.`yjsj` ) = substr( `jsj`.`yf`, 1, 4 )
  27 + )
  28 + AND (
  29 + MONTH ( `jksyj`.`yjsj` ) = substr( `jsj`.`yf`, 5, 2 )
  30 + )
  31 + )
  32 + )
  33 + )
  34 + LEFT JOIN `lq_mdxx` `md` ON ( ( `jsj`.`md` = `md`.`F_Id` ) )
  35 + )
  36 +WHERE
  37 + (
  38 + ( `jsj`.`yf` IS NOT NULL )
  39 + AND ( `jksyj`.`yjsj` IS NOT NULL )
  40 + AND ( `jksyj`.`jksyj` IS NOT NULL )
  41 + AND ( `jksyj`.`jksyj` <> '' )
  42 + AND ( `jksyj`.`jksyj` <> '0' )
  43 + )
  44 +GROUP BY
  45 + `jsj`.`F_Id`,
  46 + `jsj`.`jsj`,
  47 + `jsj`.`yf`,
  48 + `jsj`.`md`,
  49 + `md`.`dm`
  50 +ORDER BY
  51 + `jsj`.`yf` DESC,
  52 + `total_performance` DESC;
  53 +
  54 +-- 视图说明:
  55 +-- jsj_id: 金三角ID
  56 +-- jsj_name: 金三角名称
  57 +-- month: 月份(格式:yyyyMM)
  58 +-- store_id: 门店ID
  59 +-- store_name: 门店名称
  60 +-- order_count: 订单数量(去重)
  61 +-- total_performance: 总业绩(转换为DECIMAL类型)
  62 +-- last_order_date: 最后订单日期
  63 +-- first_order_date: 首次订单日期
... ...
netcore/src/Application/NCC.API/Program.cs
... ... @@ -11,11 +11,10 @@ namespace NCC.API
11 11 }
12 12  
13 13 public static IHostBuilder CreateHostBuilder(string[] args) =>
14   - Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>
15   - {
16   - webBuilder.Inject()
17   - .UseStartup<Startup>()
18   - .UseSerilogDefault();
19   - });
  14 + Host.CreateDefaultBuilder(args)
  15 + .ConfigureWebHostDefaults(webBuilder =>
  16 + {
  17 + webBuilder.Inject().UseStartup<Startup>().UseSerilogDefault();
  18 + });
20 19 }
21 20 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/Common/EnumOutput.cs 0 → 100644
  1 +namespace NCC.Extend.Entitys.Dto.Common
  2 +{
  3 + /// <summary>
  4 + /// 通用枚举输出
  5 + /// </summary>
  6 + public class EnumOutput
  7 + {
  8 + /// <summary>
  9 + /// 枚举值
  10 + /// </summary>
  11 + public int Value { get; set; }
  12 +
  13 + /// <summary>
  14 + /// 枚举名称
  15 + /// </summary>
  16 + public string Name { get; set; }
  17 +
  18 + /// <summary>
  19 + /// 中文描述
  20 + /// </summary>
  21 + public string Description { get; set; }
  22 + }
  23 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventCrInput.cs
... ... @@ -69,6 +69,15 @@ namespace NCC.Extend.Entitys.Dto.LqEvent
69 69 public string EventNumber { get; set; }
70 70  
71 71 /// <summary>
  72 + /// 活动类型
  73 + /// </summary>
  74 + /// <remarks>
  75 + /// 活动类型,可选字段
  76 + /// 最大长度:255个字符
  77 + /// </remarks>
  78 + public int EventType { get; set; }
  79 +
  80 + /// <summary>
72 81 /// 拓客活动成员列表
73 82 /// </summary>
74 83 /// <remarks>
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventInfoOutput.cs
... ... @@ -40,6 +40,11 @@ namespace NCC.Extend.Entitys.Dto.LqEvent
40 40 public string eventNumber { get; set; }
41 41  
42 42 /// <summary>
  43 + /// 活动类型
  44 + /// </summary>
  45 + public int eventType { get; set; }
  46 +
  47 + /// <summary>
43 48 /// 拓客活动成员列表
44 49 /// </summary>
45 50 public List<LqEventUserInfoOutput> Members { get; set; } = new List<LqEventUserInfoOutput>();
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventListOutput.cs
... ... @@ -41,5 +41,10 @@ namespace NCC.Extend.Entitys.Dto.LqEvent
41 41 /// 成员数量
42 42 /// </summary>
43 43 public int memberCount { get; set; }
  44 +
  45 + /// <summary>
  46 + /// 活动类型
  47 + /// </summary>
  48 + public int eventType { get; set; }
44 49 }
45 50 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventUpInput.cs
... ... @@ -14,7 +14,7 @@ namespace NCC.Extend.Entitys.Dto.LqEvent
14 14 /// 主键ID
15 15 /// </summary>
16 16 [Required(ErrorMessage = "活动ID不能为空")]
17   - public new int? Id { get; set; }
  17 + public new string Id { get; set; }
18 18  
19 19 /// <summary>
20 20 /// 活动名称
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventUserEventOutput.cs
... ... @@ -66,5 +66,15 @@ namespace NCC.Extend.Entitys.Dto.LqEvent
66 66 /// 创建用户
67 67 /// </summary>
68 68 public string CreationUser { get; set; }
  69 +
  70 + /// <summary>
  71 + /// 门店ID
  72 + /// </summary>
  73 + public string StoreId { get; set; }
  74 +
  75 + /// <summary>
  76 + /// 门店名称
  77 + /// </summary>
  78 + public string StoreName { get; set; }
69 79 }
70 80 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/StoreTeamDataOutput.cs 0 → 100644
  1 +using System.Collections.Generic;
  2 +
  3 +namespace NCC.Extend.Entitys.Dto.LqEvent
  4 +{
  5 + /// <summary>
  6 + /// 门店战队数据输出
  7 + /// </summary>
  8 + public class StoreTeamDataOutput
  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 List<TeamInfoOutput> TeamList { get; set; } = new List<TeamInfoOutput>();
  24 + }
  25 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/TeamInfoOutput.cs 0 → 100644
  1 +using System.Collections.Generic;
  2 +
  3 +namespace NCC.Extend.Entitys.Dto.LqEvent
  4 +{
  5 + /// <summary>
  6 + /// 战队信息输出
  7 + /// </summary>
  8 + public class TeamInfoOutput
  9 + {
  10 + /// <summary>
  11 + /// 战队名称
  12 + /// </summary>
  13 + public string TeamName { get; set; }
  14 +
  15 + /// <summary>
  16 + /// 战队用户信息列表
  17 + /// </summary>
  18 + public List<TeamUserInfoOutput> TeamUserInfo { get; set; } = new List<TeamUserInfoOutput>();
  19 + }
  20 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/TeamUserInfoOutput.cs 0 → 100644
  1 +using System;
  2 +
  3 +namespace NCC.Extend.Entitys.Dto.LqEvent
  4 +{
  5 + /// <summary>
  6 + /// 战队用户信息输出
  7 + /// </summary>
  8 + public class TeamUserInfoOutput
  9 + {
  10 + /// <summary>
  11 + /// 拓客用户ID
  12 + /// </summary>
  13 + public string ExpansionUserId { get; set; }
  14 +
  15 + /// <summary>
  16 + /// 拓客用户姓名
  17 + /// </summary>
  18 + public string ExpansionUserName { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 拓客数量
  22 + /// </summary>
  23 + public int ExpansionCount { get; set; }
  24 +
  25 + /// <summary>
  26 + /// 活动目标
  27 + /// </summary>
  28 + public int EventTarget { get; set; }
  29 + }
  30 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEventUser/LqEventUserCrInput.cs
... ... @@ -38,5 +38,10 @@ namespace NCC.Extend.Entitys.Dto.LqEventUser
38 38 /// 门店id
39 39 /// </summary>
40 40 public string StoreId { get; set; }
  41 +
  42 + /// <summary>
  43 + /// 目标张数
  44 + /// </summary>
  45 + public int TargetCount { get; set; } = 0;
41 46 }
42 47 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEventUser/LqEventUserInfoOutput.cs
... ... @@ -41,5 +41,15 @@ namespace NCC.Extend.Entitys.Dto.LqEventUser
41 41 /// 创建用户
42 42 /// </summary>
43 43 public string creationUser { get; set; }
  44 +
  45 + /// <summary>
  46 + /// 目标数量
  47 + /// </summary>
  48 + public int targetCount { get; set; }
  49 +
  50 + /// <summary>
  51 + /// 门店ID
  52 + /// </summary>
  53 + public string storeId { get; set; }
44 54 }
45 55 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkCrInput.cs
... ... @@ -95,15 +95,5 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
95 95 /// 退卡品项明细列表
96 96 /// </summary>
97 97 public List<LqHytkMxCrInput> lqHytkMxList { get; set; }
98   -
99   - /// <summary>
100   - /// 退卡健康师业绩列表
101   - /// </summary>
102   - public List<LqHytkJksyjCrInput> lqHytkJksyjList { get; set; }
103   -
104   - /// <summary>
105   - /// 退卡科技部老师业绩列表
106   - /// </summary>
107   - public List<LqHytkKjbsyjCrInput> lqHytkKjbsyjList { get; set; }
108 98 }
109 99 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkMx/LqHytkMxCrInput.cs
... ... @@ -16,9 +16,14 @@ namespace NCC.Extend.Entitys.Dto.LqHytkMx
16 16 public string id { get; set; }
17 17  
18 18 /// <summary>
19   - /// 关联退卡编号
  19 + /// 关联退卡Id
20 20 /// </summary>
21   - public string gltkbh { get; set; }
  21 + public string refundInfoId { get; set; }
  22 +
  23 + /// <summary>
  24 + /// 退卡记录Id
  25 + /// </summary>
  26 + public string billingItemId { get; set; }
22 27  
23 28 /// <summary>
24 29 /// 品项
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkMx/LqHytkMxInfoOutput.cs
... ... @@ -16,9 +16,14 @@ namespace NCC.Extend.Entitys.Dto.LqHytkMx
16 16 public string id { get; set; }
17 17  
18 18 /// <summary>
19   - /// 关联退卡编号
  19 + /// 关联退卡Id
20 20 /// </summary>
21   - public string gltkbh { get; set; }
  21 + public string refundInfoId { get; set; }
  22 +
  23 + /// <summary>
  24 + /// 退卡记录Id
  25 + /// </summary>
  26 + public string billingItemId { get; set; }
22 27  
23 28 /// <summary>
24 29 /// 品项编号
... ... @@ -43,22 +48,22 @@ namespace NCC.Extend.Entitys.Dto.LqHytkMx
43 48 /// <summary>
44 49 /// 项目次数
45 50 /// </summary>
46   - public int? F_ProjectNumber { get; set; }
  51 + public int projectNumber { get; set; }
47 52  
48 53 /// <summary>
49 54 /// 是否有效
50 55 /// </summary>
51   - public int? F_IsEnabled { get; set; }
  56 + public int isEnabled { get; set; }
52 57  
53 58 /// <summary>
54 59 /// 来源类型(开卡/赠送/其他)
55 60 /// </summary>
56   - public string F_SourceType { get; set; }
  61 + public string sourceType { get; set; }
57 62  
58 63 /// <summary>
59 64 /// 合计金额(品项价格 × 项目次数)
60 65 /// </summary>
61   - public decimal? F_TotalPrice { get; set; }
  66 + public decimal? totalPrice { get; set; }
62 67  
63 68 /// <summary>
64 69 /// 健康师业绩列表
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdDeductinfo/LqKdDeductinfoCrInput.cs 0 → 100644
  1 +using System;
  2 +using System.ComponentModel.DataAnnotations;
  3 +
  4 +namespace NCC.Extend.Entitys.Dto.LqKdDeductinfo
  5 +{
  6 + /// <summary>
  7 + /// 开单扣减信息创建输入
  8 + /// </summary>
  9 + public class LqKdDeductinfoCrInput
  10 + {
  11 + /// <summary>
  12 + /// 扣减类型
  13 + /// </summary>
  14 + [Required(ErrorMessage = "扣减类型不能为空")]
  15 + public int? DeductType { get; set; }
  16 +
  17 + /// <summary>
  18 + /// 扣减关联ID
  19 + /// </summary>
  20 + [Required(ErrorMessage = "扣减关联ID不能为空")]
  21 + public string DeductId { get; set; }
  22 +
  23 + /// <summary>
  24 + /// 开单id
  25 + /// </summary>
  26 + [Required(ErrorMessage = "开单id不能为空")]
  27 + public string BillingId { get; set; }
  28 +
  29 + /// <summary>
  30 + /// 合计金额
  31 + /// </summary>
  32 + [Required(ErrorMessage = "合计金额不能为空")]
  33 + [Range(0.01, 999999.99, ErrorMessage = "合计金额必须在0.01到999999.99之间")]
  34 + public decimal? Amount { get; set; }
  35 + }
  36 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdDeductinfo/LqKdDeductinfoInfoOutput.cs 0 → 100644
  1 +using System;
  2 +
  3 +namespace NCC.Extend.Entitys.Dto.LqKdDeductinfo
  4 +{
  5 + /// <summary>
  6 + /// 开单扣减信息详情输出
  7 + /// </summary>
  8 + public class LqKdDeductinfoInfoOutput
  9 + {
  10 + /// <summary>
  11 + /// 主键
  12 + /// </summary>
  13 + public string Id { get; set; }
  14 +
  15 + /// <summary>
  16 + /// 扣减类型
  17 + /// </summary>
  18 + public int? DeductType { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 扣减类型名称
  22 + /// </summary>
  23 + public string DeductTypeName { get; set; }
  24 +
  25 + /// <summary>
  26 + /// 扣减关联ID
  27 + /// </summary>
  28 + public string DeductId { get; set; }
  29 +
  30 + /// <summary>
  31 + /// 开单id
  32 + /// </summary>
  33 + public string BillingId { get; set; }
  34 +
  35 + /// <summary>
  36 + /// 合计金额
  37 + /// </summary>
  38 + public decimal? Amount { get; set; }
  39 + }
  40 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdDeductinfo/LqKdDeductinfoListOutput.cs 0 → 100644
  1 +using System;
  2 +
  3 +namespace NCC.Extend.Entitys.Dto.LqKdDeductinfo
  4 +{
  5 + /// <summary>
  6 + /// 开单扣减信息列表输出
  7 + /// </summary>
  8 + public class LqKdDeductinfoListOutput
  9 + {
  10 + /// <summary>
  11 + /// 主键
  12 + /// </summary>
  13 + public string Id { get; set; }
  14 +
  15 + /// <summary>
  16 + /// 扣减类型
  17 + /// </summary>
  18 + public int? DeductType { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 扣减类型名称
  22 + /// </summary>
  23 + public string DeductTypeName { get; set; }
  24 +
  25 + /// <summary>
  26 + /// 扣减关联ID
  27 + /// </summary>
  28 + public string DeductId { get; set; }
  29 +
  30 + /// <summary>
  31 + /// 开单id
  32 + /// </summary>
  33 + public string BillingId { get; set; }
  34 +
  35 + /// <summary>
  36 + /// 合计金额
  37 + /// </summary>
  38 + public decimal? Amount { get; set; }
  39 + }
  40 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdDeductinfo/LqKdDeductinfoListQueryInput.cs 0 → 100644
  1 +using System;
  2 +
  3 +namespace NCC.Extend.Entitys.Dto.LqKdDeductinfo
  4 +{
  5 + /// <summary>
  6 + /// 开单扣减信息列表查询输入
  7 + /// </summary>
  8 + public class LqKdDeductinfoListQueryInput
  9 + {
  10 + /// <summary>
  11 + /// 扣减类型
  12 + /// </summary>
  13 + public int? DeductType { get; set; }
  14 +
  15 + /// <summary>
  16 + /// 扣减关联ID
  17 + /// </summary>
  18 + public string DeductId { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 开单id
  22 + /// </summary>
  23 + public string BillingId { get; set; }
  24 +
  25 + /// <summary>
  26 + /// 最小金额
  27 + /// </summary>
  28 + public decimal? MinAmount { get; set; }
  29 +
  30 + /// <summary>
  31 + /// 最大金额
  32 + /// </summary>
  33 + public decimal? MaxAmount { get; set; }
  34 + }
  35 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdDeductinfo/LqKdDeductinfoUpInput.cs 0 → 100644
  1 +using System;
  2 +using System.ComponentModel.DataAnnotations;
  3 +
  4 +namespace NCC.Extend.Entitys.Dto.LqKdDeductinfo
  5 +{
  6 + /// <summary>
  7 + /// 开单扣减信息更新输入
  8 + /// </summary>
  9 + public class LqKdDeductinfoUpInput : LqKdDeductinfoCrInput
  10 + {
  11 + /// <summary>
  12 + /// 主键
  13 + /// </summary>
  14 + [Required(ErrorMessage = "主键不能为空")]
  15 + public string Id { get; set; }
  16 + }
  17 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbCrInput.cs
1 1 using System;
2 2 using System.Collections.Generic;
3 3 using NCC.Common.Model;
  4 +using NCC.Extend.Entitys.Dto.LqKdDeductinfo;
4 5  
5 6 namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
6 7 {
... ... @@ -150,6 +151,11 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
150 151 public string F_FIleUrl { get; set; }
151 152  
152 153 /// <summary>
  154 + /// 扣款信息
  155 + /// </summary>
  156 + public List<LqKdDeductinfoCrInput> lqKdKdjlbDeductList { get; set; }
  157 +
  158 + /// <summary>
153 159 /// 开单_品项明细
154 160 /// </summary>
155 161 public List<LqKdPxmxCrInput> lqKdPxmxList { get; set; }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdPxmx/LqKdPxmxCrInput.cs
... ... @@ -51,7 +51,7 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
51 51 /// <summary>
52 52 /// 项目次数
53 53 /// </summary>
54   - public int? projectNumber { get; set; }
  54 + public decimal projectNumber { get; set; }
55 55  
56 56 /// <summary>
57 57 /// 是否有效
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdPxmx/LqKdPxmxInfoOutput.cs
... ... @@ -36,7 +36,7 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
36 36 /// <summary>
37 37 /// 项目次数
38 38 /// </summary>
39   - public int? projectNumber { get; set; }
  39 + public decimal projectNumber { get; set; }
40 40  
41 41 /// <summary>
42 42 /// 是否有效
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbCrInput.cs
... ... @@ -16,42 +16,42 @@ namespace NCC.Extend.Entitys.Dto.LqTkjlb
16 16 /// <summary>
17 17 /// 拓客时间
18 18 /// </summary>
19   - public DateTime? tksj { get; set; }
  19 + public DateTime expansionTime { get; set; }
  20 +
  21 + /// <summary>
  22 + /// 拓客人员
  23 + /// </summary>
  24 + public string expansionUserId { get; set; }
20 25  
21 26 /// <summary>
22 27 /// 顾客姓名
23 28 /// </summary>
24   - public string gkxm { get; set; }
  29 + public string customerName { get; set; }
25 30  
26 31 /// <summary>
27   - /// 电话号码
  32 + /// 顾客电话号码
28 33 /// </summary>
29   - public string dhhm { get; set; }
  34 + public string customerPhone { get; set; }
30 35  
31 36 /// <summary>
32 37 /// 购买张数
33 38 /// </summary>
34   - public int? gmzs { get; set; }
  39 + public int buyNumber { get; set; }
35 40  
36 41 /// <summary>
37 42 /// 支付方式
38 43 /// </summary>
39   - public string zffs { get; set; }
  44 + public string paymentMethod { get; set; }
40 45  
41 46 /// <summary>
42 47 /// 是否加微信
43 48 /// </summary>
44   - public string sfjwx { get; set; }
  49 + public string isAddWeChat { get; set; }
45 50  
46 51 /// <summary>
47 52 /// 备注
48 53 /// </summary>
49   - public string bz { get; set; }
50   -
51   - /// <summary>
52   - /// 拓客人员
53   - /// </summary>
54   - public string tkry { get; set; }
  54 + public string remarks { get; set; }
55 55  
56 56 /// <summary>
57 57 /// 拓客活动id
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbInfoOutput.cs
... ... @@ -12,56 +12,70 @@ namespace NCC.Extend.Entitys.Dto.LqTkjlb
12 12 /// 拓客编号
13 13 /// </summary>
14 14 public string id { get; set; }
15   -
  15 +
16 16 /// <summary>
17 17 /// 拓客时间
18 18 /// </summary>
19   - public DateTime? tksj { get; set; }
20   -
  19 + public DateTime expansionTime { get; set; }
  20 +
  21 + /// <summary>
  22 + /// 拓客人员
  23 + /// </summary>
  24 + public string expansionUserId { get; set; }
  25 +
21 26 /// <summary>
22 27 /// 拓客人员
23 28 /// </summary>
24   - public string tkry { get; set; }
25   -
  29 + public string expansionUserName { get; set; }
  30 +
26 31 /// <summary>
27 32 /// 顾客姓名
28 33 /// </summary>
29   - public string gkxm { get; set; }
30   -
  34 + public string customerName { get; set; }
  35 +
31 36 /// <summary>
32   - /// 电话号码
  37 + /// 顾客电话号码
33 38 /// </summary>
34   - public string dhhm { get; set; }
35   -
  39 + public string customerPhone { get; set; }
  40 +
36 41 /// <summary>
37 42 /// 购买张数
38 43 /// </summary>
39   - public int? gmzs { get; set; }
40   -
  44 + public int buyNumber { get; set; }
  45 +
41 46 /// <summary>
42 47 /// 支付方式
43 48 /// </summary>
44   - public string zffs { get; set; }
45   -
  49 + public string paymentMethod { get; set; }
  50 +
46 51 /// <summary>
47 52 /// 是否加微信
48 53 /// </summary>
49   - public string sfjwx { get; set; }
50   -
  54 + public string isAddWeChat { get; set; }
  55 +
51 56 /// <summary>
52 57 /// 备注
53 58 /// </summary>
54   - public string bz { get; set; }
55   -
  59 + public string remarks { get; set; }
  60 +
56 61 /// <summary>
57   - /// 所属门店
  62 + /// 所属门店ID
58 63 /// </summary>
59   - public string ssmd { get; set; }
60   -
  64 + public string storeId { get; set; }
  65 +
61 66 /// <summary>
62 67 /// 所属战队
63 68 /// </summary>
64   - public string sszd { get; set; }
65   -
  69 + public string teamName { get; set; }
  70 +
  71 + /// <summary>
  72 + /// 拓客活动id
  73 + /// </summary>
  74 + public string eventId { get; set; }
  75 +
  76 + /// <summary>
  77 + /// 拓客活动名称
  78 + /// </summary>
  79 + public string eventName { get; set; }
66 80 }
67 81 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbListOutput.cs
... ... @@ -11,56 +11,70 @@ namespace NCC.Extend.Entitys.Dto.LqTkjlb
11 11 /// 拓客编号
12 12 /// </summary>
13 13 public string id { get; set; }
14   -
  14 +
15 15 /// <summary>
16 16 /// 拓客时间
17 17 /// </summary>
18   - public DateTime? tksj { get; set; }
19   -
  18 + public DateTime expansionTime { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 拓客人员
  22 + /// </summary>
  23 + public string expansionUserId { get; set; }
  24 +
20 25 /// <summary>
21 26 /// 拓客人员
22 27 /// </summary>
23   - public string tkry { get; set; }
24   -
  28 + public string expansionUserName { get; set; }
  29 +
25 30 /// <summary>
26 31 /// 顾客姓名
27 32 /// </summary>
28   - public string gkxm { get; set; }
29   -
  33 + public string customerName { get; set; }
  34 +
30 35 /// <summary>
31   - /// 电话号码
  36 + /// 顾客电话号码
32 37 /// </summary>
33   - public string dhhm { get; set; }
34   -
  38 + public string customerPhone { get; set; }
  39 +
35 40 /// <summary>
36 41 /// 购买张数
37 42 /// </summary>
38   - public int? gmzs { get; set; }
39   -
  43 + public int buyNumber { get; set; }
  44 +
40 45 /// <summary>
41 46 /// 支付方式
42 47 /// </summary>
43   - public string zffs { get; set; }
44   -
  48 + public string paymentMethod { get; set; }
  49 +
45 50 /// <summary>
46 51 /// 是否加微信
47 52 /// </summary>
48   - public string sfjwx { get; set; }
49   -
  53 + public string isAddWeChat { get; set; }
  54 +
50 55 /// <summary>
51 56 /// 备注
52 57 /// </summary>
53   - public string bz { get; set; }
54   -
  58 + public string remarks { get; set; }
  59 +
55 60 /// <summary>
56   - /// 所属门店
  61 + /// 所属门店ID
57 62 /// </summary>
58   - public string ssmd { get; set; }
59   -
  63 + public string storeId { get; set; }
  64 +
60 65 /// <summary>
61 66 /// 所属战队
62 67 /// </summary>
63   - public string sszd { get; set; }
64   -
  68 + public string teamName { get; set; }
  69 +
  70 + /// <summary>
  71 + /// 拓客活动id
  72 + /// </summary>
  73 + public string eventId { get; set; }
  74 +
  75 + /// <summary>
  76 + /// 拓客活动名称
  77 + /// </summary>
  78 + public string eventName { get; set; }
65 79 }
66 80 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbListQueryInput.cs
1   -using NCC.Common.Filter;
2   -using System.Collections.Generic;
  1 +using System.Collections.Generic;
  2 +using NCC.Common.Filter;
3 3  
4 4 namespace NCC.Extend.Entitys.Dto.LqTkjlb
5 5 {
... ... @@ -14,65 +14,68 @@ namespace NCC.Extend.Entitys.Dto.LqTkjlb
14 14 public string selectKey { get; set; }
15 15  
16 16 /// <summary>
17   - ///
  17 + ///
18 18 /// </summary>
19 19 public int dataType { get; set; }
20 20  
21   -
22 21 /// <summary>
23 22 /// 拓客编号
24 23 /// </summary>
25 24 public string id { get; set; }
26   -
  25 +
27 26 /// <summary>
28 27 /// 拓客时间
29 28 /// </summary>
30   - public string tksj { get; set; }
31   -
  29 + public string expansionTime { get; set; }
  30 +
32 31 /// <summary>
33 32 /// 拓客人员
34 33 /// </summary>
35   - public string tkry { get; set; }
36   -
  34 + public string expansionUserId { get; set; }
  35 +
37 36 /// <summary>
38 37 /// 顾客姓名
39 38 /// </summary>
40   - public string gkxm { get; set; }
41   -
  39 + public string customerName { get; set; }
  40 +
42 41 /// <summary>
43   - /// 电话号码
  42 + /// 顾客电话号码
44 43 /// </summary>
45   - public string dhhm { get; set; }
46   -
  44 + public string customerPhone { get; set; }
  45 +
47 46 /// <summary>
48 47 /// 购买张数
49 48 /// </summary>
50   - public string gmzs { get; set; }
51   -
  49 + public string buyNumber { get; set; }
  50 +
52 51 /// <summary>
53 52 /// 支付方式
54 53 /// </summary>
55   - public string zffs { get; set; }
56   -
  54 + public string paymentMethod { get; set; }
  55 +
57 56 /// <summary>
58 57 /// 是否加微信
59 58 /// </summary>
60   - public string sfjwx { get; set; }
61   -
  59 + public string isAddWeChat { get; set; }
  60 +
62 61 /// <summary>
63 62 /// 备注
64 63 /// </summary>
65   - public string bz { get; set; }
66   -
  64 + public string remarks { get; set; }
  65 +
67 66 /// <summary>
68   - /// 所属门店
  67 + /// 拓客活动id
69 68 /// </summary>
70   - public string ssmd { get; set; }
71   -
  69 + public string eventId { get; set; }
  70 +
  71 + /// <summary>
  72 + /// 所属门店ID
  73 + /// </summary>
  74 + public string storeId { get; set; }
  75 +
72 76 /// <summary>
73 77 /// 所属战队
74 78 /// </summary>
75   - public string sszd { get; set; }
76   -
  79 + public string teamName { get; set; }
77 80 }
78 81 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbRankingOutput.cs
... ... @@ -10,13 +10,13 @@ namespace NCC.Extend.Entitys.Dto.LqTkjlb
10 10 /// <summary>
11 11 /// 所属战队
12 12 /// </summary>
13   - public string sszd { get; set; }
14   -
  13 + public string teamName { get; set; }
  14 +
15 15 /// <summary>
16 16 /// 拓客人数
17 17 /// </summary>
18   - public int tkrs { get; set; }
19   -
  18 + public int expansionUserCount { get; set; }
  19 +
20 20 /// <summary>
21 21 /// 排名
22 22 /// </summary>
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhHyhk/LqXhHyhkCrInput.cs
... ... @@ -13,71 +13,70 @@ namespace NCC.Extend.Entitys.Dto.LqXhHyhk
13 13 /// 耗卡编号
14 14 /// </summary>
15 15 public string id { get; set; }
16   -
  16 +
17 17 /// <summary>
18 18 /// 门店
19 19 /// </summary>
20 20 public string md { get; set; }
21   -
  21 +
22 22 /// <summary>
23 23 /// 门店编号
24 24 /// </summary>
25 25 public string mdbh { get; set; }
26   -
  26 +
27 27 /// <summary>
28 28 /// 门店名称
29 29 /// </summary>
30 30 public string mdmc { get; set; }
31   -
  31 +
32 32 /// <summary>
33 33 /// 会员
34 34 /// </summary>
35 35 public string hy { get; set; }
36   -
  36 +
37 37 /// <summary>
38 38 /// 会员账号
39 39 /// </summary>
40 40 public string hyzh { get; set; }
41   -
  41 +
42 42 /// <summary>
43 43 /// 会员名称
44 44 /// </summary>
45 45 public string hymc { get; set; }
46   -
  46 +
47 47 /// <summary>
48 48 /// 顾客类型
49 49 /// </summary>
50 50 public string gklx { get; set; }
51   -
  51 +
52 52 /// <summary>
53 53 /// 消费金额
54 54 /// </summary>
55 55 public string xfje { get; set; }
56   -
  56 +
57 57 /// <summary>
58 58 /// 手工费用
59 59 /// </summary>
60 60 public string sgfy { get; set; }
61   -
  61 +
62 62 /// <summary>
63 63 /// 是否有科技部
64 64 /// </summary>
65 65 public string sfykjb { get; set; }
66   -
  66 +
67 67 /// <summary>
68 68 /// 耗卡时间
69 69 /// </summary>
70 70 public DateTime? hksj { get; set; }
71   -
  71 +
72 72 /// <summary>
73 73 /// 操作人员
74 74 /// </summary>
75 75 public string czry { get; set; }
76   -
  76 +
77 77 /// <summary>
78 78 /// 耗卡_品项明细
79 79 /// </summary>
80 80 public List<LqXhPxmxCrInput> lqXhPxmxList { get; set; }
81   -
82 81 }
83 82 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhHyhk/MemberRemainingItemsOutput.cs
... ... @@ -17,13 +17,13 @@ namespace NCC.Extend.Entitys.Dto.LqXhHyhk
17 17 /// </summary>
18 18 /// <example>GK2025022100004</example>
19 19 public string MemberId { get; set; }
20   -
  20 +
21 21 /// <summary>
22 22 /// 会员姓名
23 23 /// </summary>
24 24 /// <example>张三</example>
25 25 public string MemberName { get; set; }
26   -
  26 +
27 27 /// <summary>
28 28 /// 剩余品项列表
29 29 /// </summary>
... ... @@ -41,51 +41,56 @@ namespace NCC.Extend.Entitys.Dto.LqXhHyhk
41 41 public class RemainingItemInfo
42 42 {
43 43 /// <summary>
  44 + /// 开单品项id
  45 + /// </summary>
  46 + public string BillingItemId { get; set; }
  47 +
  48 + /// <summary>
44 49 /// 品项ID
45 50 /// </summary>
46 51 /// <example>94</example>
47 52 public string ItemId { get; set; }
48   -
  53 +
49 54 /// <summary>
50 55 /// 品项名称
51 56 /// </summary>
52 57 /// <example>胶原宝宝-单部位</example>
53 58 public string ItemName { get; set; }
54   -
  59 +
55 60 /// <summary>
56 61 /// 品项单价
57 62 /// </summary>
58 63 /// <example>100.00</example>
59 64 public decimal ItemPrice { get; set; }
60   -
  65 +
61 66 /// <summary>
62 67 /// 来源类型
63 68 /// </summary>
64 69 /// <remarks>品项的来源类型,用于区分相同品项的不同来源</remarks>
65 70 /// <example>开卡</example>
66 71 public string SourceType { get; set; }
67   -
  72 +
68 73 /// <summary>
69 74 /// 总购买数量
70 75 /// </summary>
71 76 /// <remarks>该品项的总购买次数</remarks>
72 77 /// <example>3</example>
73 78 public decimal TotalPurchased { get; set; }
74   -
  79 +
75 80 /// <summary>
76 81 /// 已耗卡数量
77 82 /// </summary>
78 83 /// <remarks>该品项已消费的次数</remarks>
79 84 /// <example>1</example>
80 85 public decimal ConsumedCount { get; set; }
81   -
  86 +
82 87 /// <summary>
83 88 /// 已退卡数量
84 89 /// </summary>
85 90 /// <remarks>该品项已退卡的次数</remarks>
86 91 /// <example>0</example>
87 92 public decimal RefundedCount { get; set; }
88   -
  93 +
89 94 /// <summary>
90 95 /// 剩余数量
91 96 /// </summary>
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhPxmx/LqXhPxmxCrInput.cs
... ... @@ -14,9 +14,9 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx
14 14 public string id { get; set; }
15 15  
16 16 /// <summary>
17   - /// 关联开单编号
  17 + /// 开单品项明细表id
18 18 /// </summary>
19   - public string glkdbh { get; set; }
  19 + public string billingItemId { get; set; }
20 20  
21 21 /// <summary>
22 22 /// 品项
... ... @@ -34,11 +34,6 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx
34 34 public decimal pxjg { get; set; }
35 35  
36 36 /// <summary>
37   - /// 是否赠送
38   - /// </summary>
39   - public string xfzs { get; set; }
40   -
41   - /// <summary>
42 37 /// 会员id
43 38 /// </summary>
44 39 public string memberId { get; set; }
... ... @@ -78,4 +73,4 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx
78 73 /// </summary>
79 74 public List<LqXhKjbsyj.LqXhKjbsyjCrInput> lqXhKjbsyjList { get; set; }
80 75 }
81   -}
82 76 \ No newline at end of file
  77 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhPxmx/LqXhPxmxInfoOutput.cs
... ... @@ -16,9 +16,14 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx
16 16 public string id { get; set; }
17 17  
18 18 /// <summary>
19   - /// 关联耗卡编号
  19 + /// 耗卡记录ID
20 20 /// </summary>
21   - public string glkdbh { get; set; }
  21 + public string consumeInfoId { get; set; }
  22 +
  23 + /// <summary>
  24 + /// 开单品项明细表id
  25 + /// </summary>
  26 + public string billingItemId { get; set; }
22 27  
23 28 /// <summary>
24 29 /// 品项编号
... ... @@ -36,11 +41,6 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx
36 41 public decimal pxjg { get; set; }
37 42  
38 43 /// <summary>
39   - /// 是否赠送
40   - /// </summary>
41   - public string xfzs { get; set; }
42   -
43   - /// <summary>
44 44 /// 会员ID
45 45 /// </summary>
46 46 public string memberId { get; set; }
... ... @@ -80,4 +80,4 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx
80 80 /// </summary>
81 81 public List<LqXhKjbsyjInfoOutput> lqXhKjbsyjList { get; set; }
82 82 }
83   -}
84 83 \ No newline at end of file
  84 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYcsdJsj/LqYcsdJsjByUserMonthInput.cs 0 → 100644
  1 +using System;
  2 +using System.ComponentModel.DataAnnotations;
  3 +
  4 +namespace NCC.Extend.Entitys.Dto.LqYcsdJsj
  5 +{
  6 + /// <summary>
  7 + /// 根据用户和月份获取金三角信息输入参数
  8 + /// </summary>
  9 + public class LqYcsdJsjByUserMonthInput
  10 + {
  11 + /// <summary>
  12 + /// 用户ID
  13 + /// </summary>
  14 + [Required(ErrorMessage = "用户ID不能为空")]
  15 + public string UserId { get; set; }
  16 +
  17 + /// <summary>
  18 + /// 时间(格式:yyyy-MM-dd HH:mm:ss)
  19 + /// </summary>
  20 + [Required(ErrorMessage = "时间不能为空")]
  21 + public DateTime DateTime { get; set; }
  22 + }
  23 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYcsdJsj/LqYcsdJsjByUserMonthOutput.cs 0 → 100644
  1 +namespace NCC.Extend.Entitys.Dto.LqYcsdJsj
  2 +{
  3 + /// <summary>
  4 + /// 根据用户和月份获取金三角信息输出参数
  5 + /// </summary>
  6 + public class LqYcsdJsjByUserMonthOutput
  7 + {
  8 + /// <summary>
  9 + /// 金三角ID
  10 + /// </summary>
  11 + public string JsjId { get; set; }
  12 +
  13 + /// <summary>
  14 + /// 金三角名称
  15 + /// </summary>
  16 + public string JsjName { get; set; }
  17 +
  18 + /// <summary>
  19 + /// 月份
  20 + /// </summary>
  21 + public string Month { get; set; }
  22 +
  23 + /// <summary>
  24 + /// 门店ID
  25 + /// </summary>
  26 + public string StoreId { get; set; }
  27 +
  28 + /// <summary>
  29 + /// 门店名称
  30 + /// </summary>
  31 + public string StoreName { get; set; }
  32 +
  33 + /// <summary>
  34 + /// 用户ID
  35 + /// </summary>
  36 + public string UserId { get; set; }
  37 +
  38 + /// <summary>
  39 + /// 用户姓名
  40 + /// </summary>
  41 + public string UserName { get; set; }
  42 +
  43 + /// <summary>
  44 + /// 是否顾问
  45 + /// </summary>
  46 + public int IsLeader { get; set; }
  47 +
  48 + /// <summary>
  49 + /// 状态
  50 + /// </summary>
  51 + public string Status { get; set; }
  52 +
  53 + /// <summary>
  54 + /// 排序
  55 + /// </summary>
  56 + public int SortOrder { get; set; }
  57 + }
  58 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYcsdJsj/LqYcsdJsjPerformanceInput.cs 0 → 100644
  1 +using System.ComponentModel.DataAnnotations;
  2 +
  3 +namespace NCC.Extend.Entitys.Dto.LqYcsdJsj
  4 +{
  5 + /// <summary>
  6 + /// 金三角业绩统计查询输入参数
  7 + /// </summary>
  8 + public class LqYcsdJsjPerformanceInput
  9 + {
  10 + /// <summary>
  11 + /// 开始月份(格式:yyyyMM)
  12 + /// </summary>
  13 + public string StartMonth { get; set; }
  14 +
  15 + /// <summary>
  16 + /// 结束月份(格式:yyyyMM)
  17 + /// </summary>
  18 + public string EndMonth { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 金三角ID(可选,用于查询特定金三角)
  22 + /// </summary>
  23 + public string JsjId { get; set; }
  24 +
  25 + /// <summary>
  26 + /// 门店ID(可选,用于查询特定门店)
  27 + /// </summary>
  28 + public string StoreId { get; set; }
  29 + }
  30 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYcsdJsj/LqYcsdJsjPerformanceOutput.cs 0 → 100644
  1 +using System;
  2 +
  3 +namespace NCC.Extend.Entitys.Dto.LqYcsdJsj
  4 +{
  5 + /// <summary>
  6 + /// 金三角业绩统计输出参数
  7 + /// </summary>
  8 + public class LqYcsdJsjPerformanceOutput
  9 + {
  10 + /// <summary>
  11 + /// 金三角ID
  12 + /// </summary>
  13 + public string JsjId { get; set; }
  14 +
  15 + /// <summary>
  16 + /// 金三角名称
  17 + /// </summary>
  18 + public string JsjName { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 月份
  22 + /// </summary>
  23 + public string Month { get; set; }
  24 +
  25 + /// <summary>
  26 + /// 门店ID
  27 + /// </summary>
  28 + public string StoreId { get; set; }
  29 +
  30 + /// <summary>
  31 + /// 门店名称
  32 + /// </summary>
  33 + public string StoreName { get; set; }
  34 +
  35 + /// <summary>
  36 + /// 订单数量
  37 + /// </summary>
  38 + public int OrderCount { get; set; }
  39 +
  40 + /// <summary>
  41 + /// 总业绩
  42 + /// </summary>
  43 + public decimal TotalPerformance { get; set; }
  44 +
  45 + /// <summary>
  46 + /// 最后订单日期
  47 + /// </summary>
  48 + public DateTime? LastOrderDate { get; set; }
  49 +
  50 + /// <summary>
  51 + /// 首次订单日期
  52 + /// </summary>
  53 + public DateTime? FirstOrderDate { get; set; }
  54 +
  55 + /// <summary>
  56 + /// 统计类型(ACTIVE-活跃金三角业绩,INACTIVE-单人业绩)
  57 + /// </summary>
  58 + public string StatisticsType { get; set; }
  59 +
  60 + /// <summary>
  61 + /// 成员姓名(仅单人业绩时使用)
  62 + /// </summary>
  63 + public string MemberName { get; set; }
  64 + }
  65 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_event/LqEventEntity.cs
... ... @@ -44,5 +44,11 @@ namespace NCC.Extend.Entitys.lq_event
44 44 /// </summary>
45 45 [SugarColumn(ColumnName = "F_EventNumber")]
46 46 public string EventNumber { get; set; }
  47 +
  48 + /// <summary>
  49 + /// 活动类型
  50 + /// </summary>
  51 + [SugarColumn(ColumnName = "F_EventType")]
  52 + public int EventType { get; set; }
47 53 }
48 54 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_mx/LqHytkMxEntity.cs
1   -using NCC.Common.Const;
  1 +using System;
  2 +using NCC.Common.Const;
  3 +using NCC.Extend.Entitys.Enum;
2 4 using SqlSugar;
3   -using System;
4 5  
5 6 namespace NCC.Extend.Entitys.lq_hytk_mx
6 7 {
... ... @@ -16,90 +17,95 @@ namespace NCC.Extend.Entitys.lq_hytk_mx
16 17 /// </summary>
17 18 [SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true)]
18 19 public string Id { get; set; }
19   -
  20 +
20 21 /// <summary>
21   - /// 关联退卡编号
  22 + /// 关联退卡Id
22 23 /// </summary>
23   - [SugarColumn(ColumnName = "gltkbh")]
24   - public string Gltkbh { get; set; }
25   -
  24 + [SugarColumn(ColumnName = "F_RefundInfoId")]
  25 + public string RefundInfoId { get; set; }
  26 +
  27 + /// <summary>
  28 + /// 退卡记录Id
  29 + /// </summary>
  30 + [SugarColumn(ColumnName = "F_BillingItemId")]
  31 + public string BillingItemId { get; set; }
  32 +
26 33 /// <summary>
27 34 /// 品项
28 35 /// </summary>
29   - [SugarColumn(ColumnName = "px")]
  36 + [SugarColumn(ColumnName = "px")]
30 37 public string Px { get; set; }
31   -
  38 +
32 39 /// <summary>
33 40 /// 品项名称
34 41 /// </summary>
35   - [SugarColumn(ColumnName = "pxmc")]
  42 + [SugarColumn(ColumnName = "pxmc")]
36 43 public string Pxmc { get; set; }
37   -
  44 +
38 45 /// <summary>
39 46 /// 品项价格
40 47 /// </summary>
41   - [SugarColumn(ColumnName = "pxjg")]
  48 + [SugarColumn(ColumnName = "pxjg")]
42 49 public decimal? Pxjg { get; set; }
43   -
  50 +
44 51 /// <summary>
45 52 /// 退款金额
46 53 /// </summary>
47   - [SugarColumn(ColumnName = "tkje")]
  54 + [SugarColumn(ColumnName = "tkje")]
48 55 public decimal? Tkje { get; set; }
49   -
  56 +
50 57 /// <summary>
51 58 /// 项目次数
52 59 /// </summary>
53   - [SugarColumn(ColumnName = "F_ProjectNumber")]
54   - public int? F_ProjectNumber { get; set; }
55   -
  60 + [SugarColumn(ColumnName = "F_ProjectNumber")]
  61 + public int ProjectNumber { get; set; }
  62 +
56 63 /// <summary>
57 64 /// 是否有效
58 65 /// </summary>
59   - [SugarColumn(ColumnName = "F_IsEnabled")]
60   - public int? F_IsEnabled { get; set; }
61   -
  66 + [SugarColumn(ColumnName = "F_IsEnabled")]
  67 + public int IsEnabled { get; set; } = StatusEnum.有效.GetHashCode();
  68 +
62 69 /// <summary>
63 70 /// 来源类型
64 71 /// </summary>
65   - [SugarColumn(ColumnName = "F_SourceType")]
66   - public string F_SourceType { get; set; }
67   -
  72 + [SugarColumn(ColumnName = "F_SourceType")]
  73 + public string SourceType { get; set; }
  74 +
68 75 /// <summary>
69 76 /// 合计金额
70 77 /// </summary>
71   - [SugarColumn(ColumnName = "F_TotalPrice")]
72   - public decimal? F_TotalPrice { get; set; }
73   -
  78 + [SugarColumn(ColumnName = "F_TotalPrice")]
  79 + public decimal? TotalPrice { get; set; }
  80 +
74 81 /// <summary>
75 82 /// 创建时间
76 83 /// </summary>
77   - [SugarColumn(ColumnName = "F_CreateTime")]
78   - public DateTime? F_CreateTime { get; set; }
79   -
  84 + [SugarColumn(ColumnName = "F_CreateTime")]
  85 + public DateTime? CreateTime { get; set; }
  86 +
80 87 /// <summary>
81 88 /// 创建用户
82 89 /// </summary>
83   - [SugarColumn(ColumnName = "F_CreateUser")]
84   - public string F_CreateUser { get; set; }
85   -
  90 + [SugarColumn(ColumnName = "F_CreateUser")]
  91 + public string CreateUser { get; set; }
  92 +
86 93 /// <summary>
87 94 /// 修改时间
88 95 /// </summary>
89   - [SugarColumn(ColumnName = "F_ModifyTime")]
90   - public DateTime? F_ModifyTime { get; set; }
91   -
  96 + [SugarColumn(ColumnName = "F_ModifyTime")]
  97 + public DateTime? ModifyTime { get; set; }
  98 +
92 99 /// <summary>
93 100 /// 修改用户
94 101 /// </summary>
95   - [SugarColumn(ColumnName = "F_ModifyUser")]
96   - public string F_ModifyUser { get; set; }
97   -
  102 + [SugarColumn(ColumnName = "F_ModifyUser")]
  103 + public string ModifyUser { get; set; }
  104 +
98 105 /// <summary>
99 106 /// 删除标记
100 107 /// </summary>
101   - [SugarColumn(ColumnName = "F_DeleteMark")]
102   - public int? F_DeleteMark { get; set; }
103   -
  108 + [SugarColumn(ColumnName = "F_DeleteMark")]
  109 + public int? DeleteMark { get; set; }
104 110 }
105   -}
106 111 \ No newline at end of file
  112 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_deductinfo/LqKdDeductinfoEntity.cs 0 → 100644
  1 +using System;
  2 +using System.ComponentModel.DataAnnotations;
  3 +using SqlSugar;
  4 +
  5 +namespace NCC.Extend.Entitys.lq_kd_deductinfo
  6 +{
  7 + /// <summary>
  8 + /// 开单扣减信息表
  9 + /// </summary>
  10 + [SugarTable("lq_kd_deductinfo")]
  11 + public class LqKdDeductinfoEntity
  12 + {
  13 + /// <summary>
  14 + /// 主键
  15 + /// </summary>
  16 + [SugarColumn(IsPrimaryKey = true, ColumnName = "F_Id")]
  17 + public string Id { get; set; }
  18 +
  19 + /// <summary>
  20 + /// 扣减类型
  21 + /// </summary>
  22 + [SugarColumn(ColumnName = "F_DeductType")]
  23 + public int? DeductType { get; set; }
  24 +
  25 + /// <summary>
  26 + /// 扣减关联ID
  27 + /// </summary>
  28 + [SugarColumn(ColumnName = "F_DeductId")]
  29 + public string DeductId { get; set; }
  30 +
  31 + /// <summary>
  32 + /// 开单id
  33 + /// </summary>
  34 + [SugarColumn(ColumnName = "F_BillingId")]
  35 + [Required]
  36 + public string BillingId { get; set; }
  37 +
  38 + /// <summary>
  39 + /// 合计金额
  40 + /// </summary>
  41 + [SugarColumn(ColumnName = "F_Amount")]
  42 + public decimal? Amount { get; set; }
  43 + }
  44 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_jksyj/LqKdJksyjEntity.cs
1   -using NCC.Common.Const;
  1 +using System;
  2 +using NCC.Common.Const;
2 3 using SqlSugar;
3   -using System;
4 4  
5 5 namespace NCC.Extend.Entitys.lq_kd_jksyj
6 6 {
... ... @@ -16,55 +16,53 @@ namespace NCC.Extend.Entitys.lq_kd_jksyj
16 16 /// </summary>
17 17 [SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true)]
18 18 public string Id { get; set; }
19   -
  19 +
20 20 /// <summary>
21 21 /// 关联开单编号
22 22 /// </summary>
23   - [SugarColumn(ColumnName = "glkdbh")]
  23 + [SugarColumn(ColumnName = "glkdbh")]
24 24 public string Glkdbh { get; set; }
25   -
  25 +
26 26 /// <summary>
27 27 /// 健康师
28 28 /// </summary>
29   - [SugarColumn(ColumnName = "jks")]
  29 + [SugarColumn(ColumnName = "jks")]
30 30 public string Jks { get; set; }
31   -
  31 +
32 32 /// <summary>
33 33 /// 健康师姓名
34 34 /// </summary>
35   - [SugarColumn(ColumnName = "jksxm")]
  35 + [SugarColumn(ColumnName = "jksxm")]
36 36 public string Jksxm { get; set; }
37   -
  37 +
38 38 /// <summary>
39 39 /// 健康师账号
40 40 /// </summary>
41   - [SugarColumn(ColumnName = "jkszh")]
  41 + [SugarColumn(ColumnName = "jkszh")]
42 42 public string Jkszh { get; set; }
43   -
  43 +
44 44 /// <summary>
45 45 /// 健康师业绩
46 46 /// </summary>
47   - [SugarColumn(ColumnName = "jksyj")]
  47 + [SugarColumn(ColumnName = "jksyj")]
48 48 public string Jksyj { get; set; }
49   -
  49 +
50 50 /// <summary>
51 51 /// 业绩时间
52 52 /// </summary>
53   - [SugarColumn(ColumnName = "yjsj")]
  53 + [SugarColumn(ColumnName = "yjsj")]
54 54 public DateTime? Yjsj { get; set; }
55 55  
56 56 /// <summary>
57 57 /// 金三角id
58 58 /// </summary>
59   - [SugarColumn(ColumnName = "jsj_id")]
  59 + [SugarColumn(ColumnName = "jsj_id")]
60 60 public string Jsj_id { get; set; }
61 61  
62   -
63 62 /// <summary>
64 63 /// 开单品相id
65 64 /// </summary>
66   - [SugarColumn(ColumnName = "F_kdpxid")]
  65 + [SugarColumn(ColumnName = "F_kdpxid")]
67 66 public string Kdpxid { get; set; }
68   -
69 67 }
70   -}
71 68 \ No newline at end of file
  69 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_kdjlb/LqKdKdjlbEntity.cs
... ... @@ -184,5 +184,17 @@ namespace NCC.Extend.Entitys.lq_kd_kdjlb
184 184 /// </summary>
185 185 [SugarColumn(ColumnName = "F_FIleUrl")]
186 186 public string F_FIleUrl { get; set; }
  187 +
  188 + /// <summary>
  189 + /// 创建时间
  190 + /// </summary>
  191 + [SugarColumn(ColumnName = "F_CreateTime")]
  192 + public DateTime CreateTime { get; set; }
  193 +
  194 + /// <summary>
  195 + /// 修改时间
  196 + /// </summary>
  197 + [SugarColumn(ColumnName = "F_UpdateTime")]
  198 + public DateTime UpdateTime { get; set; }
187 199 }
188 200 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_pxmx/LqKdPxmxEntity.cs
... ... @@ -57,7 +57,7 @@ namespace NCC.Extend.Entitys.lq_kd_pxmx
57 57 /// 项目次数
58 58 /// </summary>
59 59 [SugarColumn(ColumnName = "F_ProjectNumber")]
60   - public int? ProjectNumber { get; set; }
  60 + public decimal ProjectNumber { get; set; }
61 61  
62 62 /// <summary>
63 63 /// 是否有效
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_tkjlb/LqTkjlbEntity.cs
... ... @@ -18,50 +18,50 @@ namespace NCC.Extend.Entitys.lq_tkjlb
18 18 /// <summary>
19 19 /// 拓客时间
20 20 /// </summary>
21   - [SugarColumn(ColumnName = "tksj")]
22   - public DateTime? Tksj { get; set; }
  21 + [SugarColumn(ColumnName = "F_ExpansionTime")]
  22 + public DateTime ExpansionTime { get; set; }
23 23  
24 24 /// <summary>
25 25 /// 拓客人员
26 26 /// </summary>
27   - [SugarColumn(ColumnName = "tkry")]
28   - public string Tkry { get; set; }
  27 + [SugarColumn(ColumnName = "F_ExpansionUserId")]
  28 + public string ExpansionUserId { get; set; }
29 29  
30 30 /// <summary>
31 31 /// 顾客姓名
32 32 /// </summary>
33   - [SugarColumn(ColumnName = "gkxm")]
34   - public string Gkxm { get; set; }
  33 + [SugarColumn(ColumnName = "F_CustomerName")]
  34 + public string CustomerName { get; set; }
35 35  
36 36 /// <summary>
37   - /// 电话号码
  37 + /// 顾客电话号码
38 38 /// </summary>
39   - [SugarColumn(ColumnName = "dhhm")]
40   - public string Dhhm { get; set; }
  39 + [SugarColumn(ColumnName = "F_CustomerPhone")]
  40 + public string CustomerPhone { get; set; }
41 41  
42 42 /// <summary>
43 43 /// 购买张数
44 44 /// </summary>
45   - [SugarColumn(ColumnName = "gmzs")]
46   - public int? Gmzs { get; set; }
  45 + [SugarColumn(ColumnName = "F_BuyNumber")]
  46 + public int BuyNumber { get; set; } = 0;
47 47  
48 48 /// <summary>
49 49 /// 支付方式
50 50 /// </summary>
51   - [SugarColumn(ColumnName = "zffs")]
52   - public string Zffs { get; set; }
  51 + [SugarColumn(ColumnName = "F_PaymentMethod")]
  52 + public string PaymentMethod { get; set; }
53 53  
54 54 /// <summary>
55 55 /// 是否加微信
56 56 /// </summary>
57   - [SugarColumn(ColumnName = "sfjwx")]
58   - public string Sfjwx { get; set; }
  57 + [SugarColumn(ColumnName = "F_IsAddWeChat")]
  58 + public string IsAddWeChat { get; set; }
59 59  
60 60 /// <summary>
61 61 /// 备注
62 62 /// </summary>
63   - [SugarColumn(ColumnName = "bz")]
64   - public string Bz { get; set; }
  63 + [SugarColumn(ColumnName = "F_Remarks")]
  64 + public string Remarks { get; set; }
65 65  
66 66 /// <summary>
67 67 /// 拓客活动id
... ... @@ -70,15 +70,27 @@ namespace NCC.Extend.Entitys.lq_tkjlb
70 70 public string EventId { get; set; }
71 71  
72 72 /// <summary>
73   - /// 所属组织
  73 + /// 所属门店ID
74 74 /// </summary>
75   - [SugarColumn(ColumnName = "ssmd")]
76   - public string Ssmd { get; set; }
  75 + [SugarColumn(ColumnName = "F_StoreId")]
  76 + public string StoreId { get; set; }
77 77  
78 78 /// <summary>
79 79 /// 所属战队
80 80 /// </summary>
81   - [SugarColumn(ColumnName = "sszd")]
82   - public string Sszd { get; set; }
  81 + [SugarColumn(ColumnName = "F_TeamName")]
  82 + public string TeamName { get; set; }
  83 +
  84 + /// <summary>
  85 + /// 所属部门id
  86 + /// </summary>
  87 + [SugarColumn(ColumnName = "F_DepId")]
  88 + public string DepId { get; set; }
  89 +
  90 + /// <summary>
  91 + /// 添加时间
  92 + /// </summary>
  93 + [SugarColumn(ColumnName = "F_CreateTime")]
  94 + public DateTime CreateTime { get; set; } = DateTime.Now;
83 95 }
84 96 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_xh_hyhk/LqXhHyhkEntity.cs
1   -using NCC.Common.Const;
  1 +using System;
  2 +using NCC.Common.Const;
2 3 using SqlSugar;
3   -using System;
4 4  
5 5 namespace NCC.Extend.Entitys.lq_xh_hyhk
6 6 {
... ... @@ -16,96 +16,107 @@ namespace NCC.Extend.Entitys.lq_xh_hyhk
16 16 /// </summary>
17 17 [SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true)]
18 18 public string Id { get; set; }
19   -
  19 +
20 20 /// <summary>
21 21 /// 门店
22 22 /// </summary>
23   - [SugarColumn(ColumnName = "md")]
  23 + [SugarColumn(ColumnName = "md")]
24 24 public string Md { get; set; }
25   -
  25 +
26 26 /// <summary>
27 27 /// 门店编号
28 28 /// </summary>
29   - [SugarColumn(ColumnName = "mdbh")]
  29 + [SugarColumn(ColumnName = "mdbh")]
30 30 public string Mdbh { get; set; }
31   -
  31 +
32 32 /// <summary>
33 33 /// 门店名称
34 34 /// </summary>
35   - [SugarColumn(ColumnName = "mdmc")]
  35 + [SugarColumn(ColumnName = "mdmc")]
36 36 public string Mdmc { get; set; }
37   -
  37 +
38 38 /// <summary>
39 39 /// 会员
40 40 /// </summary>
41   - [SugarColumn(ColumnName = "hy")]
  41 + [SugarColumn(ColumnName = "hy")]
42 42 public string Hy { get; set; }
43   -
  43 +
44 44 /// <summary>
45 45 /// 会员账号
46 46 /// </summary>
47   - [SugarColumn(ColumnName = "hyzh")]
  47 + [SugarColumn(ColumnName = "hyzh")]
48 48 public string Hyzh { get; set; }
49   -
  49 +
50 50 /// <summary>
51 51 /// 会员名称
52 52 /// </summary>
53   - [SugarColumn(ColumnName = "hymc")]
  53 + [SugarColumn(ColumnName = "hymc")]
54 54 public string Hymc { get; set; }
55   -
  55 +
56 56 /// <summary>
57 57 /// 顾客类型
58 58 /// </summary>
59   - [SugarColumn(ColumnName = "gklx")]
  59 + [SugarColumn(ColumnName = "gklx")]
60 60 public string Gklx { get; set; }
61   -
  61 +
62 62 /// <summary>
63 63 /// 消费金额
64 64 /// </summary>
65   - [SugarColumn(ColumnName = "xfje")]
  65 + [SugarColumn(ColumnName = "xfje")]
66 66 public string Xfje { get; set; }
67   -
  67 +
68 68 /// <summary>
69 69 /// 手工费用
70 70 /// </summary>
71   - [SugarColumn(ColumnName = "sgfy")]
  71 + [SugarColumn(ColumnName = "sgfy")]
72 72 public string Sgfy { get; set; }
73   -
  73 +
74 74 /// <summary>
75 75 /// 是否有科技部
76 76 /// </summary>
77   - [SugarColumn(ColumnName = "sfykjb")]
  77 + [SugarColumn(ColumnName = "sfykjb")]
78 78 public string Sfykjb { get; set; }
79   -
  79 +
80 80 /// <summary>
81 81 /// 健康师业绩
82 82 /// </summary>
83   - [SugarColumn(ColumnName = "jksyj")]
  83 + [SugarColumn(ColumnName = "jksyj")]
84 84 public string Jksyj { get; set; }
85   -
  85 +
86 86 /// <summary>
87 87 /// 科技部业绩
88 88 /// </summary>
89   - [SugarColumn(ColumnName = "kjbyj")]
  89 + [SugarColumn(ColumnName = "kjbyj")]
90 90 public string Kjbyj { get; set; }
91   -
  91 +
92 92 /// <summary>
93 93 /// 品项信息
94 94 /// </summary>
95   - [SugarColumn(ColumnName = "pxxx")]
  95 + [SugarColumn(ColumnName = "pxxx")]
96 96 public string Pxxx { get; set; }
97   -
  97 +
98 98 /// <summary>
99 99 /// 耗卡时间
100 100 /// </summary>
101   - [SugarColumn(ColumnName = "hksj")]
  101 + [SugarColumn(ColumnName = "hksj")]
102 102 public DateTime? Hksj { get; set; }
103   -
  103 +
104 104 /// <summary>
105 105 /// 操作人员
106 106 /// </summary>
107   - [SugarColumn(ColumnName = "czry")]
  107 + [SugarColumn(ColumnName = "czry")]
108 108 public string Czry { get; set; }
109   -
  109 +
  110 + /// <summary>
  111 + /// 创建时间
  112 + /// </summary>
  113 + [SugarColumn(ColumnName = "F_CreateTime")]
  114 + public DateTime CreateTime { get; set; }
  115 +
  116 + /// <summary>
  117 + /// 修改时间
  118 + /// </summary>
  119 + [SugarColumn(ColumnName = "F_UpdateTime")]
  120 + public DateTime UpdateTime { get; set; }
110 121 }
111   -}
112 122 \ No newline at end of file
  123 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_xh_pxmx/LqXhPxmxEntity.cs
1   -using NCC.Common.Const;
  1 +using System;
  2 +using NCC.Common.Const;
2 3 using SqlSugar;
3   -using System;
4 4  
5 5 namespace NCC.Extend.Entitys.lq_xh_pxmx
6 6 {
... ... @@ -16,71 +16,71 @@ namespace NCC.Extend.Entitys.lq_xh_pxmx
16 16 /// </summary>
17 17 [SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true)]
18 18 public string Id { get; set; }
19   -
  19 +
20 20 /// <summary>
21   - /// 关联开单编号
  21 + /// 耗卡记录ID
22 22 /// </summary>
23   - [SugarColumn(ColumnName = "glkdbh")]
24   - public string Glkdbh { get; set; }
25   -
  23 + [SugarColumn(ColumnName = "F_ConsumeInfoId")]
  24 + public string ConsumeInfoId { get; set; }
  25 +
  26 + /// <summary>
  27 + /// 开单品项明细表id
  28 + /// </summary>
  29 + [SugarColumn(ColumnName = "F_BillingItemId")]
  30 + public string BillingItemId { get; set; }
  31 +
26 32 /// <summary>
27 33 /// 品项
28 34 /// </summary>
29   - [SugarColumn(ColumnName = "px")]
  35 + [SugarColumn(ColumnName = "px")]
30 36 public string Px { get; set; }
31   -
  37 +
32 38 /// <summary>
33 39 /// 品项名称
34 40 /// </summary>
35   - [SugarColumn(ColumnName = "pxmc")]
  41 + [SugarColumn(ColumnName = "pxmc")]
36 42 public string Pxmc { get; set; }
37   -
  43 +
38 44 /// <summary>
39 45 /// 品项价格
40 46 /// </summary>
41   - [SugarColumn(ColumnName = "pxjg")]
  47 + [SugarColumn(ColumnName = "pxjg")]
42 48 public decimal Pxjg { get; set; }
43 49  
44 50 /// <summary>
45   - /// 是否赠送
46   - /// </summary>
47   - [SugarColumn(ColumnName = "xfzs")]
48   - public string Xfzs { get; set; }
49   -
50   - /// <summary>
51 51 /// 会员id
52 52 /// </summary>
53   - [SugarColumn(ColumnName = "F_MemberId")]
  53 + [SugarColumn(ColumnName = "F_MemberId")]
54 54 public string MemberId { get; set; }
55 55  
56 56 /// <summary>
57 57 /// 创建时间
58 58 /// </summary>
59   - [SugarColumn(ColumnName = "F_CreateTIme")]
  59 + [SugarColumn(ColumnName = "F_CreateTIme")]
60 60 public DateTime? CreateTIme { get; set; }
61 61  
62 62 /// <summary>
63 63 /// 项目次数
64 64 /// </summary>
65   - [SugarColumn(ColumnName = "F_ProjectNumber")]
66   - public int? ProjectNumber { get; set; }
  65 + [SugarColumn(ColumnName = "F_ProjectNumber")]
  66 + public int ProjectNumber { get; set; }
67 67  
68 68 /// <summary>
69 69 /// 是否有效
70 70 /// </summary>
71   - [SugarColumn(ColumnName = "F_IsEnabled")]
  71 + [SugarColumn(ColumnName = "F_IsEnabled")]
72 72 public int? IsEnabled { get; set; }
73 73  
74 74 /// <summary>
75 75 /// 来源类型
76 76 /// </summary>
77   - [SugarColumn(ColumnName = "F_SourceType")]
  77 + [SugarColumn(ColumnName = "F_SourceType")]
78 78 public string SourceType { get; set; }
79 79  
80 80 /// <summary>
81 81 /// 合计金额
82 82 /// </summary>
83   - [SugarColumn(ColumnName = "F_TotalPrice")]
  83 + [SugarColumn(ColumnName = "F_TotalPrice")]
84 84 public decimal TotalPrice { get; set; }
85 85 }
86   -}
87 86 \ No newline at end of file
  87 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Enum/DeductTypeEnum.cs 0 → 100644
  1 +using System.ComponentModel;
  2 +
  3 +namespace NCC.Extend.Entitys.Enum
  4 +{
  5 + /// <summary>
  6 + /// 扣款类型
  7 + /// </summary>
  8 + public enum DeductTypeEnum
  9 + {
  10 + /// <summary>
  11 + /// 储值卡
  12 + /// </summary>
  13 + [Description("储值卡")]
  14 + 储值卡 = 1,
  15 +
  16 + /// <summary>
  17 + /// 扣项
  18 + /// </summary>
  19 + [Description("扣项")]
  20 + 扣项 = 2,
  21 +
  22 + /// <summary>
  23 + /// 套餐
  24 + /// </summary>
  25 + [Description("套餐")]
  26 + 套餐 = 3,
  27 + }
  28 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Enum/EventType.cs 0 → 100644
  1 +using System.ComponentModel;
  2 +
  3 +namespace NCC.Extend.Entitys.Enum
  4 +{
  5 + /// <summary>
  6 + /// 活动类型
  7 + /// </summary>
  8 + public enum EventType
  9 + {
  10 + /// <summary>
  11 + /// 日常拓客
  12 + /// </summary>
  13 + [Description("日常拓客")]
  14 + 日常拓客 = 1,
  15 +
  16 + /// <summary>
  17 + /// 全员拓客
  18 + /// </summary>
  19 + [Description("全员拓客")]
  20 + 全员拓客 = 3,
  21 + }
  22 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Enum/StatusEnum.cs 0 → 100644
  1 +using System.ComponentModel;
  2 +
  3 +namespace NCC.Extend.Entitys.Enum
  4 +{
  5 + /// <summary>
  6 + /// 状态枚举
  7 + /// </summary>
  8 + public enum StatusEnum
  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 + 删除 = 99,
  27 + }
  28 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/NCC.Extend.Entitys.csproj
1 1 <Project Sdk="Microsoft.NET.Sdk">
2   -
3 2 <PropertyGroup>
4 3 <TargetFramework>net6.0</TargetFramework>
5 4 </PropertyGroup>
6   -
7 5 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
8 6 <OutputPath />
9 7 <DocumentationFile>bin\Release\NCC.Extend.Entitys.xml</DocumentationFile>
10 8 </PropertyGroup>
11   -
12   - <ItemGroup>
13   - <Compile Remove="Enum\**" />
14   - <EmbeddedResource Remove="Enum\**" />
15   - <None Remove="Enum\**" />
16   - </ItemGroup>
17   -
18 9 <ItemGroup>
19 10 <ProjectReference Include="..\..\..\Infrastructure\NCC.Expand.Thirdparty\NCC.Expand.Thirdparty.csproj" />
20 11 <ProjectReference Include="..\..\Common\NCC.Common\NCC.Common.csproj" />
21 12 </ItemGroup>
22   -
23 13 </Project>
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqEventService.cs
1 1 using System;
2 2 using System.Collections.Generic;
  3 +using System.ComponentModel;
3 4 using System.IO;
4 5 using System.Linq;
  6 +using System.Reflection;
5 7 using System.Threading.Tasks;
6 8 using Mapster;
7 9 using Microsoft.AspNetCore.Http;
8 10 using Microsoft.AspNetCore.Mvc;
9 11 using NCC.Common.Core.Manager;
  12 +using NCC.Common.Extension;
10 13 using NCC.Common.Filter;
11 14 using NCC.Common.Helper;
12 15 using NCC.Dependency;
13 16 using NCC.DynamicApiController;
  17 +using NCC.Extend.Entitys.Dto.Common;
14 18 using NCC.Extend.Entitys.Dto.LqEvent;
15 19 using NCC.Extend.Entitys.Dto.LqEventUser;
  20 +using NCC.Extend.Entitys.Enum;
16 21 using NCC.Extend.Entitys.lq_event;
17 22 using NCC.Extend.Entitys.lq_eventuser;
18 23 using NCC.Extend.Entitys.lq_mdxx;
  24 +using NCC.Extend.Entitys.lq_tkjlb;
19 25 using NCC.Extend.Interfaces.LqEvent;
20 26 using NCC.FriendlyException;
21 27 using NCC.System.Entitys.Permission;
... ... @@ -92,6 +98,7 @@ namespace NCC.Extend.LqEvent
92 98 eventCoordinator = e.EventCoordinator,
93 99 eventNumber = e.EventNumber,
94 100 memberCount = SqlFunc.Subqueryable<LqEventUserEntity>().Where(u => u.EventId == e.Id).Count(),
  101 + eventType = e.EventType,
95 102 })
96 103 .MergeTable()
97 104 .OrderBy(sidx + " " + sord)
... ... @@ -132,13 +139,36 @@ namespace NCC.Extend.LqEvent
132 139 throw NCCException.Oh("拓客活动不存在");
133 140 }
134 141  
135   - var output = entity.Adapt<LqEventInfoOutput>();
136   -
137   - // 2. 获取拓客活动成员信息
138   - var members = await _db.Queryable<LqEventUserEntity>().Where(u => u.EventId == id.ToString()).ToListAsync();
139   -
140   - // 3. 转换为输出格式
141   - output.Members = members.Adapt<List<LqEventUserInfoOutput>>();
  142 + // 2. 手动映射到输出格式
  143 + var output = new LqEventInfoOutput
  144 + {
  145 + id = entity.Id,
  146 + eventName = entity.EventName,
  147 + startTime = entity.StartTime,
  148 + endTime = entity.EndTime,
  149 + eventCoordinator = entity.EventCoordinator,
  150 + eventNumber = entity.EventNumber,
  151 + eventType = entity.EventType,
  152 + };
  153 +
  154 + // 3. 获取拓客活动成员信息
  155 + var members = await _db.Queryable<LqEventUserEntity>().Where(u => u.EventId == id).ToListAsync();
  156 +
  157 + // 4. 手动映射成员信息
  158 + output.Members = members
  159 + .Select(m => new LqEventUserInfoOutput
  160 + {
  161 + id = m.Id,
  162 + eventId = m.EventId,
  163 + userId = m.UserId,
  164 + depId = m.DepId,
  165 + teamName = m.TeamName,
  166 + creationTime = m.CreationTime,
  167 + creationUser = m.CreationUser,
  168 + targetCount = m.EventTarget,
  169 + storeId = m.StoreId,
  170 + })
  171 + .ToList();
142 172  
143 173 return output;
144 174 }
... ... @@ -203,6 +233,10 @@ namespace NCC.Extend.LqEvent
203 233 // 生成新的ID
204 234 entity.Id = YitIdHelper.NextId().ToString();
205 235  
  236 + // 手动设置时间字段,确保时分秒不丢失
  237 + entity.StartTime = input.StartTime;
  238 + entity.EndTime = input.EndTime;
  239 +
206 240 // 插入拓客活动
207 241 var isOk = await _db.Insertable(entity).ExecuteCommandAsync();
208 242 if (!(isOk > 0))
... ... @@ -225,6 +259,7 @@ namespace NCC.Extend.LqEvent
225 259 CreationTime = DateTime.Now,
226 260 CreationUser = userInfo?.userName,
227 261 StoreId = member.StoreId,
  262 + EventTarget = member.TargetCount,
228 263 }
229 264 );
230 265 }
... ... @@ -288,6 +323,10 @@ namespace NCC.Extend.LqEvent
288 323 var userInfo = await _userManager.GetUserInfo();
289 324 var entity = input.Adapt<LqEventEntity>();
290 325  
  326 + // 手动设置时间字段,确保时分秒不丢失
  327 + entity.StartTime = input.StartTime;
  328 + entity.EndTime = input.EndTime;
  329 +
291 330 // 更新拓客活动
292 331 var isOk = await _db.Updateable(entity).ExecuteCommandAsync();
293 332 if (!(isOk > 0))
... ... @@ -313,6 +352,7 @@ namespace NCC.Extend.LqEvent
313 352 CreationTime = DateTime.Now,
314 353 CreationUser = userInfo?.userName,
315 354 StoreId = member.StoreId,
  355 + EventTarget = member.TargetCount,
316 356 }
317 357 );
318 358 }
... ... @@ -352,7 +392,7 @@ namespace NCC.Extend.LqEvent
352 392 public async Task Delete(string id)
353 393 {
354 394 // 删除拓客活动成员
355   - await _db.Deleteable<LqEventUserEntity>().Where(u => u.EventId == id.ToString()).ExecuteCommandAsync();
  395 + await _db.Deleteable<LqEventUserEntity>().Where(u => u.EventId == id).ExecuteCommandAsync();
356 396  
357 397 // 删除拓客活动
358 398 var isOk = await _db.Deleteable<LqEventEntity>().Where(p => p.Id == id).ExecuteCommandAsync();
... ... @@ -475,6 +515,7 @@ namespace NCC.Extend.LqEvent
475 515 EventTarget = eventUser.EventTarget,
476 516 CreationTime = eventUser.CreationTime,
477 517 CreationUser = eventUser.CreationUser,
  518 + StoreId = eventUser.StoreId,
478 519 }
479 520 );
480 521 }
... ... @@ -490,6 +531,169 @@ namespace NCC.Extend.LqEvent
490 531 }
491 532 #endregion
492 533  
  534 + #region 根据用户ID获取当前参与的拓客活动
  535 + /// <summary>
  536 + /// 根据用户ID获取当前参与的拓客活动列表
  537 + /// </summary>
  538 + /// <remarks>
  539 + /// 根据用户ID查询当前正在进行的拓客活动信息
  540 + /// 返回用户参与的所有活动详情,包括活动基本信息、用户目标、门店信息等
  541 + /// 如果没有当前活动,返回空列表
  542 + ///
  543 + /// 示例请求:
  544 + /// ```json
  545 + /// GET /api/Extend/LqEvent/user/{userId}/current
  546 + /// ```
  547 + ///
  548 + /// 参数说明:
  549 + /// - userId: 用户ID,必填参数
  550 + ///
  551 + /// 返回信息包括:
  552 + /// - 活动基本信息(ID、名称、编号、负责人、时间)
  553 + /// - 用户参与信息(用户ID、部门ID、战队名称、目标数量)
  554 + /// - 门店信息(门店ID、门店名称)
  555 + /// - 创建信息(创建时间、创建用户)
  556 + /// </remarks>
  557 + /// <param name="userId">用户ID</param>
  558 + /// <returns>用户当前参与的拓客活动列表,无活动时返回空列表</returns>
  559 + /// <response code="200">成功返回活动列表(可能为空)</response>
  560 + /// <response code="400">参数错误,用户ID不能为空</response>
  561 + [HttpGet("user/{userId}/current")]
  562 + public async Task<dynamic> GetCurrentEvent(string userId)
  563 + {
  564 + if (string.IsNullOrEmpty(userId))
  565 + {
  566 + throw NCCException.Oh("用户ID不能为空");
  567 + }
  568 + try
  569 + {
  570 + var currentTime = DateTime.Now;
  571 + // 先检查用户是否有活动记录
  572 + var userEventCount = await _db.Queryable<LqEventUserEntity>().Where(eu => eu.UserId == userId).CountAsync();
  573 + if (userEventCount == 0)
  574 + {
  575 + return null;
  576 + }
  577 + // 使用多表查询方式,一次性获取所有数据
  578 + var eventUsers = await _db.Queryable<LqEventUserEntity, LqEventEntity>((eventUser, eventInfo) => eventUser.EventId == eventInfo.Id)
  579 + .Where((eventUser, eventInfo) => eventUser.UserId == userId && eventInfo.StartTime <= currentTime && eventInfo.EndTime >= currentTime)
  580 + .Select(
  581 + (eventUser, eventInfo) =>
  582 + new LqEventUserEventOutput
  583 + {
  584 + EventId = eventUser.EventId,
  585 + EventName = eventInfo.EventName,
  586 + EventNumber = eventInfo.EventNumber,
  587 + EventCoordinator = eventInfo.EventCoordinator,
  588 + StartTime = eventInfo.StartTime,
  589 + EndTime = eventInfo.EndTime,
  590 + UserId = eventUser.UserId,
  591 + DepId = eventUser.DepId,
  592 + TeamName = eventUser.TeamName,
  593 + EventTarget = eventUser.EventTarget,
  594 + CreationTime = eventUser.CreationTime,
  595 + CreationUser = eventUser.CreationUser,
  596 + StoreId = eventUser.StoreId,
  597 + StoreName = null, // 不需要门店信息
  598 + }
  599 + )
  600 + .ToListAsync();
  601 +
  602 + // 如果没有查询到当前活动,返回空列表
  603 + return eventUsers ?? new List<LqEventUserEventOutput>();
  604 + }
  605 + catch (Exception ex)
  606 + {
  607 + throw NCCException.Oh($"查询用户 {userId} 当前活动失败: {ex.Message}", ex);
  608 + }
  609 + }
  610 + #endregion
  611 +
  612 + #region 根据活动ID获取战队统计数据
  613 + /// <summary>
  614 + /// 根据活动ID获取战队统计数据
  615 + /// </summary>
  616 + /// <remarks>
  617 + /// 根据活动ID查询该活动下所有门店和战队的统计数据
  618 + /// 返回按门店和战队分组的拓客数据
  619 + ///
  620 + /// 示例请求:
  621 + /// ```json
  622 + /// GET /api/Extend/LqEvent/team-data/{eventId}
  623 + /// ```
  624 + ///
  625 + /// 参数说明:
  626 + /// - eventId: 活动ID,必填参数
  627 + ///
  628 + /// 返回信息包括:
  629 + /// - 门店信息(门店ID、门店名称)
  630 + /// - 战队信息(战队名称)
  631 + /// - 用户信息(用户ID、用户姓名、拓客数量、活动目标)
  632 + /// </remarks>
  633 + /// <param name="eventId">活动ID</param>
  634 + /// <returns>按门店和战队分组的统计数据</returns>
  635 + /// <response code="200">成功返回统计数据</response>
  636 + /// <response code="400">参数错误,活动ID不能为空</response>
  637 + [HttpGet("team-data/{eventId}")]
  638 + public async Task<dynamic> GetTeamDataByEventId(string eventId)
  639 + {
  640 + if (string.IsNullOrEmpty(eventId))
  641 + {
  642 + throw NCCException.Oh("活动ID不能为空");
  643 + }
  644 +
  645 + try
  646 + {
  647 + // 使用SqlFunc子查询,一次性获取所有需要的数据,避免多次查询和内存合并
  648 + var teamData = await _db.Queryable<LqEventUserEntity>()
  649 + .Where(eventUser => eventUser.EventId == eventId)
  650 + .Select(eventUser => new
  651 + {
  652 + StoreId = eventUser.StoreId,
  653 + StoreName = SqlFunc.Subqueryable<LqMdxxEntity>().Where(md => md.Id == eventUser.StoreId).Select(md => md.Dm),
  654 + TeamName = eventUser.TeamName,
  655 + ExpansionUserId = eventUser.UserId,
  656 + ExpansionUserName = SqlFunc.Subqueryable<UserEntity>().Where(u => u.Id == eventUser.UserId).Select(u => u.RealName),
  657 + EventTarget = eventUser.EventTarget,
  658 + ExpansionCount = SqlFunc.Subqueryable<LqTkjlbEntity>().Where(tkjlb => tkjlb.EventId == eventId && tkjlb.ExpansionUserId == eventUser.UserId).Count(),
  659 + })
  660 + .ToListAsync();
  661 +
  662 + // 按门店和战队分组数据
  663 + var result = teamData
  664 + .GroupBy(x => new { x.StoreId, x.StoreName })
  665 + .Select(storeGroup => new StoreTeamDataOutput
  666 + {
  667 + StoreId = storeGroup.Key.StoreId,
  668 + StoreName = storeGroup.Key.StoreName,
  669 + TeamList = storeGroup
  670 + .GroupBy(x => x.TeamName)
  671 + .Select(teamGroup => new TeamInfoOutput
  672 + {
  673 + TeamName = teamGroup.Key,
  674 + TeamUserInfo = teamGroup
  675 + .Select(user => new TeamUserInfoOutput
  676 + {
  677 + ExpansionUserId = user.ExpansionUserId,
  678 + ExpansionUserName = user.ExpansionUserName,
  679 + ExpansionCount = user.ExpansionCount,
  680 + EventTarget = user.EventTarget,
  681 + })
  682 + .ToList(),
  683 + })
  684 + .ToList(),
  685 + })
  686 + .ToList();
  687 +
  688 + return result;
  689 + }
  690 + catch (Exception ex)
  691 + {
  692 + throw NCCException.Oh($"查询活动 {eventId} 战队统计数据失败: {ex.Message}", ex);
  693 + }
  694 + }
  695 + #endregion
  696 +
493 697 #region Excel导入拓客活动用户
494 698  
495 699 /// <summary>
... ... @@ -604,6 +808,7 @@ namespace NCC.Extend.LqEvent
604 808 DepId = user.OrganizeId,
605 809 TeamName = row.TeamName,
606 810 StoreId = storeId,
  811 + TargetCount = row.TargetCount,
607 812 };
608 813  
609 814 result.SuccessData.Add(successData);
... ... @@ -656,8 +861,23 @@ namespace NCC.Extend.LqEvent
656 861 // 使用ExcelImportHelper读取Excel文件
657 862 var dataTable = ExcelImportHelper.ToDataTable(tempFilePath, 0, 0);
658 863  
659   - // 从第2行开始读取数据(第1行是标题)
660   - for (int i = 1; i < dataTable.Rows.Count; i++)
  864 + // 调试信息:输出总行数和列数
  865 + Console.WriteLine($"Excel总行数: {dataTable.Rows.Count}, 总列数: {dataTable.Columns.Count}");
  866 +
  867 + // 调试信息:输出所有行的数据
  868 + for (int debugRow = 0; debugRow < dataTable.Rows.Count; debugRow++)
  869 + {
  870 + var debugRowData = dataTable.Rows[debugRow];
  871 + var debugValues = new List<string>();
  872 + for (int debugCol = 0; debugCol < debugRowData.ItemArray.Length; debugCol++)
  873 + {
  874 + debugValues.Add(debugRowData[debugCol]?.ToString() ?? "null");
  875 + }
  876 + Console.WriteLine($"调试第{debugRow + 1}行: {string.Join(", ", debugValues)}");
  877 + }
  878 +
  879 + // 从第1行开始读取数据(没有标题行)
  880 + for (int i = 0; i < dataTable.Rows.Count; i++)
661 881 {
662 882 var row = dataTable.Rows[i];
663 883 var mobilePhone = row[0]?.ToString()?.Trim();
... ... @@ -666,7 +886,10 @@ namespace NCC.Extend.LqEvent
666 886 var storeName = row[3]?.ToString()?.Trim();
667 887 var targetCountStr = row[4]?.ToString()?.Trim();
668 888  
669   - int? targetCount = null;
  889 + // 调试信息:输出每一行读取的数据
  890 + Console.WriteLine($"第{i + 1}行数据: 手机号={mobilePhone}, 姓名={name}, 战队={teamName}, 门店={storeName}, 目标={targetCountStr}");
  891 +
  892 + int targetCount = 0;
670 893 if (!string.IsNullOrEmpty(targetCountStr) && int.TryParse(targetCountStr, out int target))
671 894 {
672 895 targetCount = target;
... ... @@ -675,6 +898,7 @@ namespace NCC.Extend.LqEvent
675 898 // 跳过空行
676 899 if (string.IsNullOrEmpty(mobilePhone) && string.IsNullOrEmpty(name))
677 900 {
  901 + Console.WriteLine($"第{i + 1}行被跳过:空行");
678 902 continue;
679 903 }
680 904  
... ... @@ -713,7 +937,28 @@ namespace NCC.Extend.LqEvent
713 937 public string Name { get; set; }
714 938 public string TeamName { get; set; }
715 939 public string StoreName { get; set; }
716   - public int? TargetCount { get; set; }
  940 + public int TargetCount { get; set; } = 0;
  941 + }
  942 +
  943 + #endregion
  944 +
  945 + #region 获取拓客类型枚举内容
  946 +
  947 + /// <summary>
  948 + /// 获取拓客类型枚举内容
  949 + /// </summary>
  950 + /// <returns>拓客类型枚举列表</returns>
  951 + [HttpGet("event-types")]
  952 + public List<EnumOutput> GetEventTypes()
  953 + {
  954 + return Enum.GetValues<EventType>()
  955 + .Select(e => new EnumOutput
  956 + {
  957 + Value = (int)e,
  958 + Name = e.ToString(),
  959 + Description = e.GetDescription(),
  960 + })
  961 + .ToList();
717 962 }
718 963  
719 964 #endregion
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqGzService.cs
1   -using NCC.Common.Core.Manager;
2   -using NCC.Common.Enum;
3   -using NCC.Common.Extension;
4   -using NCC.Common.Filter;
5   -using NCC.Dependency;
6   -using NCC.DynamicApiController;
7   -using NCC.FriendlyException;
8   -using NCC.Extend.Interfaces.LqGz;
9   -using Mapster;
10   -using Microsoft.AspNetCore.Mvc;
11   -using SqlSugar;
12   -using System;
  1 +using System;
13 2 using System.Collections.Generic;
14 3 using System.Linq;
15 4 using System.Threading.Tasks;
16   -using NCC.Extend.Entitys.lq_gz;
17   -using Yitter.IdGenerator;
  5 +using Mapster;
  6 +using Microsoft.AspNetCore.Mvc;
  7 +using Microsoft.Extensions.Logging;
  8 +using NCC.ClayObject;
  9 +using NCC.Common.Configuration;
  10 +using NCC.Common.Core.Manager;
  11 +using NCC.Common.Enum;
  12 +using NCC.Common.Extension;
  13 +using NCC.Common.Filter;
18 14 using NCC.Common.Helper;
19   -using NCC.JsonSerialization;
20 15 using NCC.Common.Model.NPOI;
21   -using NCC.Common.Configuration;
22 16 using NCC.DataEncryption;
23   -using NCC.ClayObject;
24   -using NCC.Extend.Entitys.lq_kd_pxmx;
25   -using NCC.Extend.Entitys.lq_xmzl;
  17 +using NCC.Dependency;
  18 +using NCC.DynamicApiController;
  19 +using NCC.Extend.Entitys.Dto.LqGz;
  20 +using NCC.Extend.Entitys.lq_gz;
26 21 using NCC.Extend.Entitys.lq_jlmxb;
27   -using NCC.Extend.Entitys.lq_ycsd_jsj;
28   -using NCC.Extend.Entitys.lq_mdxx;
29   -using NCC.Extend.Entitys.lq_kd_kdjlb;
30 22 using NCC.Extend.Entitys.lq_kd_jksyj;
  23 +using NCC.Extend.Entitys.lq_kd_kdjlb;
31 24 using NCC.Extend.Entitys.lq_kd_kjbsyj;
32   -using Microsoft.Extensions.Logging;
33   -using NCC.Extend.Entitys.Dto.LqGz;
  25 +using NCC.Extend.Entitys.lq_kd_pxmx;
  26 +using NCC.Extend.Entitys.lq_mdxx;
  27 +using NCC.Extend.Entitys.lq_xmzl;
  28 +using NCC.Extend.Entitys.lq_ycsd_jsj;
  29 +using NCC.Extend.Interfaces.LqGz;
  30 +using NCC.FriendlyException;
  31 +using NCC.JsonSerialization;
  32 +using SqlSugar;
  33 +using Yitter.IdGenerator;
34 34  
35 35 namespace NCC.Extend.LqGz
36 36 {
37 37 /// <summary>
38 38 /// 工资全字段服务
39 39 /// </summary>
40   - [ApiDescriptionSettings(Tag = "绿纤工资全字段服务",Name = "LqGz", Order = 200)]
  40 + [ApiDescriptionSettings(Tag = "绿纤工资全字段服务", Name = "LqGz", Order = 200)]
41 41 [Route("api/Extend/[controller]")]
42 42 public class LqGzService : ILqGzService, IDynamicApiController, ITransient
43 43 {
... ... @@ -49,12 +49,9 @@ namespace NCC.Extend.LqGz
49 49 /// <summary>
50 50 /// 初始化一个<see cref="LqGzService"/>类型的新实例
51 51 /// </summary>
52   - public LqGzService(
53   - ISqlSugarRepository<LqGzEntity> lqGzRepository,
54   - IUserManager userManager,
55   - ILogger<LqGzService> logger)
  52 + public LqGzService(ISqlSugarRepository<LqGzEntity> lqGzRepository, IUserManager userManager, ILogger<LqGzService> logger)
56 53 {
57   - _lqGzRepository = lqGzRepository;
  54 + _lqGzRepository = lqGzRepository;
58 55 _db = _lqGzRepository.Context;
59 56 _userManager = userManager;
60 57 _logger = logger;
... ... @@ -74,10 +71,10 @@ namespace NCC.Extend.LqGz
74 71 }
75 72  
76 73 /// <summary>
77   - /// 获取工资全字段列表
78   - /// </summary>
79   - /// <param name="input">请求参数</param>
80   - /// <returns></returns>
  74 + /// 获取工资全字段列表
  75 + /// </summary>
  76 + /// <param name="input">请求参数</param>
  77 + /// <returns></returns>
81 78 [HttpGet("")]
82 79 public async Task<dynamic> GetList([FromQuery] LqGzListQueryInput input)
83 80 {
... ... @@ -182,109 +179,112 @@ namespace NCC.Extend.LqGz
182 179 .WhereIF(!string.IsNullOrEmpty(input.dzjfe), p => p.Dzjfe.Equals(input.dzjfe))
183 180 .WhereIF(!string.IsNullOrEmpty(input.bfsy), p => p.Bfsy.Equals(input.bfsy))
184 181 .WhereIF(!string.IsNullOrEmpty(input.dyzfze), p => p.Dyzfze.Equals(input.dyzfze))
185   - .Select(it=> new LqGzListOutput
  182 + .Select(it => new LqGzListOutput
186 183 {
187 184 id = it.Id,
188   - md=it.Md,
189   - hsgw=it.Hsgw,
190   - xm=it.Xm,
191   - jsjzd=it.Jsjzd,
192   - zyj=it.Zyj,
193   - jcyj=it.Jcyj,
194   - hzyj=it.Hzyj,
195   - jlyj=it.Jlyj,
196   - mdzyj=it.Mdzyj,
197   - dwyj=it.Dwyj,
198   - zb=it.Zb,
199   - xkyj=it.Xkyj,
200   - xkcjl=it.Xkcjl,
201   - xktd=it.Xktd,
202   - sdyj=it.Sdyj,
203   - sdtd=it.Sdtd,
204   - syyj=it.Syyj,
205   - cellyj=it.Cellyj,
206   - dxmybyj=it.Dxmybyj,
207   - dxmebyj=it.Dxmebyj,
208   - dyyj=it.Dyyj,
209   - wysd=it.Wysd,
210   - mdzc=it.Mdzc,
211   - cpwl=it.Cpwl,
212   - wdcb=it.Wdcb,
213   - qthzcb=it.Qthzcb,
214   - xmj=it.Xmj,
215   - ml=it.Ml,
216   - zjltce=it.Zjltce,
217   - jltce=it.Jltce,
218   - xh=it.Xh,
219   - xms=it.Xms,
220   - ddrt=it.Ddrt,
221   - zdts=it.Zdts,
222   - qjts=it.Qjts,
223   - td=it.Td,
224   - jcyjtc=it.Jcyjtc,
225   - hzyjtc=it.Hzyjtc,
226   - gwtc=it.Gwtc,
227   - mdtqtc=it.Mdtqtc,
228   - dztc1=it.Dztc1,
229   - dzzrtc=it.Dzzrtc,
230   - zrtc=it.Zrtc,
231   - dztc2=it.Dztc2,
232   - zjltc=it.Zjltc,
233   - jltc=it.Jltc,
234   - yjtc=it.Yjtc,
235   - xhtc=it.Xhtc,
236   - kjbzctc=it.Kjbzctc,
237   - sytc=it.Sytc,
238   - celltc=it.Celltc,
239   - dxmbtc=it.Dxmbtc,
240   - tchj=it.Tchj,
241   - jksdx=it.Jksdx,
242   - dzhudx=it.Dzhudx,
243   - dzhangdx=it.Dzhangdx,
244   - zrdx=it.Zrdx,
245   - dzzrdx=it.Dzzrdx,
246   - zjldx=it.Zjldx,
247   - jldx=it.Jldx,
248   - kjblsdx=it.Kjblsdx,
249   - dxmbdx=it.Dxmbdx,
250   - dxhj=it.Dxhj,
251   - sg=it.Sg,
252   - rtjl=it.Rtjl,
253   - sjgl=it.Sjgl,
254   - cb=it.Cb,
255   - sx=it.Sx,
256   - qq=it.Qq,
257   - hsyfgz=it.Hsyfgz,
258   - bd=it.Bd,
259   - bdqj=it.Bdqj,
260   - bddx=it.Bddx,
261   - bdbc=it.Bdbc,
262   - zzyfgz=it.Zzyfgz,
263   - dypxbt=it.Dypxbt,
264   - dyjtbt=it.Dyjtbt,
265   - sypxbt=it.Sypxbt,
266   - syjtbt=it.Syjtbt,
267   - bthj=it.Bthj,
268   - qk=it.Qk,
269   - cd=it.Cd,
270   - qj=it.Qj,
271   - ksb=it.Ksb,
272   - kcjl=it.Kcjl,
273   - kzs=it.Kzs,
274   - kxxq=it.Kxxq,
275   - kgzf=it.Kgzf,
276   - kkhj=it.Kkhj,
277   - fjj=it.Fjj,
278   - tsjyj=it.Tsjyj,
279   - tzsyj=it.Tzsyj,
280   - sfgz=it.Sfgz,
281   - dysfff=it.Dysfff,
282   - zfje=it.Zfje,
283   - dzjfe=it.Dzjfe,
284   - bfsy=it.Bfsy,
285   - dyzfze=it.Dyzfze,
286   - }).MergeTable().OrderBy(sidx+" "+input.sort).ToPagedListAsync(input.currentPage, input.pageSize);
287   - return PageResult<LqGzListOutput>.SqlSugarPageResult(data);
  185 + md = it.Md,
  186 + hsgw = it.Hsgw,
  187 + xm = it.Xm,
  188 + jsjzd = it.Jsjzd,
  189 + zyj = it.Zyj,
  190 + jcyj = it.Jcyj,
  191 + hzyj = it.Hzyj,
  192 + jlyj = it.Jlyj,
  193 + mdzyj = it.Mdzyj,
  194 + dwyj = it.Dwyj,
  195 + zb = it.Zb,
  196 + xkyj = it.Xkyj,
  197 + xkcjl = it.Xkcjl,
  198 + xktd = it.Xktd,
  199 + sdyj = it.Sdyj,
  200 + sdtd = it.Sdtd,
  201 + syyj = it.Syyj,
  202 + cellyj = it.Cellyj,
  203 + dxmybyj = it.Dxmybyj,
  204 + dxmebyj = it.Dxmebyj,
  205 + dyyj = it.Dyyj,
  206 + wysd = it.Wysd,
  207 + mdzc = it.Mdzc,
  208 + cpwl = it.Cpwl,
  209 + wdcb = it.Wdcb,
  210 + qthzcb = it.Qthzcb,
  211 + xmj = it.Xmj,
  212 + ml = it.Ml,
  213 + zjltce = it.Zjltce,
  214 + jltce = it.Jltce,
  215 + xh = it.Xh,
  216 + xms = it.Xms,
  217 + ddrt = it.Ddrt,
  218 + zdts = it.Zdts,
  219 + qjts = it.Qjts,
  220 + td = it.Td,
  221 + jcyjtc = it.Jcyjtc,
  222 + hzyjtc = it.Hzyjtc,
  223 + gwtc = it.Gwtc,
  224 + mdtqtc = it.Mdtqtc,
  225 + dztc1 = it.Dztc1,
  226 + dzzrtc = it.Dzzrtc,
  227 + zrtc = it.Zrtc,
  228 + dztc2 = it.Dztc2,
  229 + zjltc = it.Zjltc,
  230 + jltc = it.Jltc,
  231 + yjtc = it.Yjtc,
  232 + xhtc = it.Xhtc,
  233 + kjbzctc = it.Kjbzctc,
  234 + sytc = it.Sytc,
  235 + celltc = it.Celltc,
  236 + dxmbtc = it.Dxmbtc,
  237 + tchj = it.Tchj,
  238 + jksdx = it.Jksdx,
  239 + dzhudx = it.Dzhudx,
  240 + dzhangdx = it.Dzhangdx,
  241 + zrdx = it.Zrdx,
  242 + dzzrdx = it.Dzzrdx,
  243 + zjldx = it.Zjldx,
  244 + jldx = it.Jldx,
  245 + kjblsdx = it.Kjblsdx,
  246 + dxmbdx = it.Dxmbdx,
  247 + dxhj = it.Dxhj,
  248 + sg = it.Sg,
  249 + rtjl = it.Rtjl,
  250 + sjgl = it.Sjgl,
  251 + cb = it.Cb,
  252 + sx = it.Sx,
  253 + qq = it.Qq,
  254 + hsyfgz = it.Hsyfgz,
  255 + bd = it.Bd,
  256 + bdqj = it.Bdqj,
  257 + bddx = it.Bddx,
  258 + bdbc = it.Bdbc,
  259 + zzyfgz = it.Zzyfgz,
  260 + dypxbt = it.Dypxbt,
  261 + dyjtbt = it.Dyjtbt,
  262 + sypxbt = it.Sypxbt,
  263 + syjtbt = it.Syjtbt,
  264 + bthj = it.Bthj,
  265 + qk = it.Qk,
  266 + cd = it.Cd,
  267 + qj = it.Qj,
  268 + ksb = it.Ksb,
  269 + kcjl = it.Kcjl,
  270 + kzs = it.Kzs,
  271 + kxxq = it.Kxxq,
  272 + kgzf = it.Kgzf,
  273 + kkhj = it.Kkhj,
  274 + fjj = it.Fjj,
  275 + tsjyj = it.Tsjyj,
  276 + tzsyj = it.Tzsyj,
  277 + sfgz = it.Sfgz,
  278 + dysfff = it.Dysfff,
  279 + zfje = it.Zfje,
  280 + dzjfe = it.Dzjfe,
  281 + bfsy = it.Bfsy,
  282 + dyzfze = it.Dyzfze,
  283 + })
  284 + .MergeTable()
  285 + .OrderBy(sidx + " " + input.sort)
  286 + .ToPagedListAsync(input.currentPage, input.pageSize);
  287 + return PageResult<LqGzListOutput>.SqlSugarPageResult(data);
288 288 }
289 289  
290 290 /// <summary>
... ... @@ -299,14 +299,15 @@ namespace NCC.Extend.LqGz
299 299 var entity = input.Adapt<LqGzEntity>();
300 300 entity.Id = YitIdHelper.NextId().ToString();
301 301 var isOk = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync();
302   - if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1000);
  302 + if (!(isOk > 0))
  303 + throw NCCException.Oh(ErrorCode.COM1000);
303 304 }
304 305  
305 306 /// <summary>
306   - /// 获取工资全字段无分页列表
307   - /// </summary>
308   - /// <param name="input">请求参数</param>
309   - /// <returns></returns>
  307 + /// 获取工资全字段无分页列表
  308 + /// </summary>
  309 + /// <param name="input">请求参数</param>
  310 + /// <returns></returns>
310 311 [NonAction]
311 312 public async Task<dynamic> GetNoPagingList([FromQuery] LqGzListQueryInput input)
312 313 {
... ... @@ -411,116 +412,119 @@ namespace NCC.Extend.LqGz
411 412 .WhereIF(!string.IsNullOrEmpty(input.dzjfe), p => p.Dzjfe.Equals(input.dzjfe))
412 413 .WhereIF(!string.IsNullOrEmpty(input.bfsy), p => p.Bfsy.Equals(input.bfsy))
413 414 .WhereIF(!string.IsNullOrEmpty(input.dyzfze), p => p.Dyzfze.Equals(input.dyzfze))
414   - .Select(it=> new LqGzListOutput
  415 + .Select(it => new LqGzListOutput
415 416 {
416 417 id = it.Id,
417   - md=it.Md,
418   - hsgw=it.Hsgw,
419   - xm=it.Xm,
420   - jsjzd=it.Jsjzd,
421   - zyj=it.Zyj,
422   - jcyj=it.Jcyj,
423   - hzyj=it.Hzyj,
424   - jlyj=it.Jlyj,
425   - mdzyj=it.Mdzyj,
426   - dwyj=it.Dwyj,
427   - zb=it.Zb,
428   - xkyj=it.Xkyj,
429   - xkcjl=it.Xkcjl,
430   - xktd=it.Xktd,
431   - sdyj=it.Sdyj,
432   - sdtd=it.Sdtd,
433   - syyj=it.Syyj,
434   - cellyj=it.Cellyj,
435   - dxmybyj=it.Dxmybyj,
436   - dxmebyj=it.Dxmebyj,
437   - dyyj=it.Dyyj,
438   - wysd=it.Wysd,
439   - mdzc=it.Mdzc,
440   - cpwl=it.Cpwl,
441   - wdcb=it.Wdcb,
442   - qthzcb=it.Qthzcb,
443   - xmj=it.Xmj,
444   - ml=it.Ml,
445   - zjltce=it.Zjltce,
446   - jltce=it.Jltce,
447   - xh=it.Xh,
448   - xms=it.Xms,
449   - ddrt=it.Ddrt,
450   - zdts=it.Zdts,
451   - qjts=it.Qjts,
452   - td=it.Td,
453   - jcyjtc=it.Jcyjtc,
454   - hzyjtc=it.Hzyjtc,
455   - gwtc=it.Gwtc,
456   - mdtqtc=it.Mdtqtc,
457   - dztc1=it.Dztc1,
458   - dzzrtc=it.Dzzrtc,
459   - zrtc=it.Zrtc,
460   - dztc2=it.Dztc2,
461   - zjltc=it.Zjltc,
462   - jltc=it.Jltc,
463   - yjtc=it.Yjtc,
464   - xhtc=it.Xhtc,
465   - kjbzctc=it.Kjbzctc,
466   - sytc=it.Sytc,
467   - celltc=it.Celltc,
468   - dxmbtc=it.Dxmbtc,
469   - tchj=it.Tchj,
470   - jksdx=it.Jksdx,
471   - dzhudx=it.Dzhudx,
472   - dzhangdx=it.Dzhangdx,
473   - zrdx=it.Zrdx,
474   - dzzrdx=it.Dzzrdx,
475   - zjldx=it.Zjldx,
476   - jldx=it.Jldx,
477   - kjblsdx=it.Kjblsdx,
478   - dxmbdx=it.Dxmbdx,
479   - dxhj=it.Dxhj,
480   - sg=it.Sg,
481   - rtjl=it.Rtjl,
482   - sjgl=it.Sjgl,
483   - cb=it.Cb,
484   - sx=it.Sx,
485   - qq=it.Qq,
486   - hsyfgz=it.Hsyfgz,
487   - bd=it.Bd,
488   - bdqj=it.Bdqj,
489   - bddx=it.Bddx,
490   - bdbc=it.Bdbc,
491   - zzyfgz=it.Zzyfgz,
492   - dypxbt=it.Dypxbt,
493   - dyjtbt=it.Dyjtbt,
494   - sypxbt=it.Sypxbt,
495   - syjtbt=it.Syjtbt,
496   - bthj=it.Bthj,
497   - qk=it.Qk,
498   - cd=it.Cd,
499   - qj=it.Qj,
500   - ksb=it.Ksb,
501   - kcjl=it.Kcjl,
502   - kzs=it.Kzs,
503   - kxxq=it.Kxxq,
504   - kgzf=it.Kgzf,
505   - kkhj=it.Kkhj,
506   - fjj=it.Fjj,
507   - tsjyj=it.Tsjyj,
508   - tzsyj=it.Tzsyj,
509   - sfgz=it.Sfgz,
510   - dysfff=it.Dysfff,
511   - zfje=it.Zfje,
512   - dzjfe=it.Dzjfe,
513   - bfsy=it.Bfsy,
514   - dyzfze=it.Dyzfze,
515   - }).MergeTable().OrderBy(sidx+" "+input.sort).ToListAsync();
516   - return data;
  418 + md = it.Md,
  419 + hsgw = it.Hsgw,
  420 + xm = it.Xm,
  421 + jsjzd = it.Jsjzd,
  422 + zyj = it.Zyj,
  423 + jcyj = it.Jcyj,
  424 + hzyj = it.Hzyj,
  425 + jlyj = it.Jlyj,
  426 + mdzyj = it.Mdzyj,
  427 + dwyj = it.Dwyj,
  428 + zb = it.Zb,
  429 + xkyj = it.Xkyj,
  430 + xkcjl = it.Xkcjl,
  431 + xktd = it.Xktd,
  432 + sdyj = it.Sdyj,
  433 + sdtd = it.Sdtd,
  434 + syyj = it.Syyj,
  435 + cellyj = it.Cellyj,
  436 + dxmybyj = it.Dxmybyj,
  437 + dxmebyj = it.Dxmebyj,
  438 + dyyj = it.Dyyj,
  439 + wysd = it.Wysd,
  440 + mdzc = it.Mdzc,
  441 + cpwl = it.Cpwl,
  442 + wdcb = it.Wdcb,
  443 + qthzcb = it.Qthzcb,
  444 + xmj = it.Xmj,
  445 + ml = it.Ml,
  446 + zjltce = it.Zjltce,
  447 + jltce = it.Jltce,
  448 + xh = it.Xh,
  449 + xms = it.Xms,
  450 + ddrt = it.Ddrt,
  451 + zdts = it.Zdts,
  452 + qjts = it.Qjts,
  453 + td = it.Td,
  454 + jcyjtc = it.Jcyjtc,
  455 + hzyjtc = it.Hzyjtc,
  456 + gwtc = it.Gwtc,
  457 + mdtqtc = it.Mdtqtc,
  458 + dztc1 = it.Dztc1,
  459 + dzzrtc = it.Dzzrtc,
  460 + zrtc = it.Zrtc,
  461 + dztc2 = it.Dztc2,
  462 + zjltc = it.Zjltc,
  463 + jltc = it.Jltc,
  464 + yjtc = it.Yjtc,
  465 + xhtc = it.Xhtc,
  466 + kjbzctc = it.Kjbzctc,
  467 + sytc = it.Sytc,
  468 + celltc = it.Celltc,
  469 + dxmbtc = it.Dxmbtc,
  470 + tchj = it.Tchj,
  471 + jksdx = it.Jksdx,
  472 + dzhudx = it.Dzhudx,
  473 + dzhangdx = it.Dzhangdx,
  474 + zrdx = it.Zrdx,
  475 + dzzrdx = it.Dzzrdx,
  476 + zjldx = it.Zjldx,
  477 + jldx = it.Jldx,
  478 + kjblsdx = it.Kjblsdx,
  479 + dxmbdx = it.Dxmbdx,
  480 + dxhj = it.Dxhj,
  481 + sg = it.Sg,
  482 + rtjl = it.Rtjl,
  483 + sjgl = it.Sjgl,
  484 + cb = it.Cb,
  485 + sx = it.Sx,
  486 + qq = it.Qq,
  487 + hsyfgz = it.Hsyfgz,
  488 + bd = it.Bd,
  489 + bdqj = it.Bdqj,
  490 + bddx = it.Bddx,
  491 + bdbc = it.Bdbc,
  492 + zzyfgz = it.Zzyfgz,
  493 + dypxbt = it.Dypxbt,
  494 + dyjtbt = it.Dyjtbt,
  495 + sypxbt = it.Sypxbt,
  496 + syjtbt = it.Syjtbt,
  497 + bthj = it.Bthj,
  498 + qk = it.Qk,
  499 + cd = it.Cd,
  500 + qj = it.Qj,
  501 + ksb = it.Ksb,
  502 + kcjl = it.Kcjl,
  503 + kzs = it.Kzs,
  504 + kxxq = it.Kxxq,
  505 + kgzf = it.Kgzf,
  506 + kkhj = it.Kkhj,
  507 + fjj = it.Fjj,
  508 + tsjyj = it.Tsjyj,
  509 + tzsyj = it.Tzsyj,
  510 + sfgz = it.Sfgz,
  511 + dysfff = it.Dysfff,
  512 + zfje = it.Zfje,
  513 + dzjfe = it.Dzjfe,
  514 + bfsy = it.Bfsy,
  515 + dyzfze = it.Dyzfze,
  516 + })
  517 + .MergeTable()
  518 + .OrderBy(sidx + " " + input.sort)
  519 + .ToListAsync();
  520 + return data;
517 521 }
518 522  
519 523 /// <summary>
520   - /// 导出工资全字段
521   - /// </summary>
522   - /// <param name="input">请求参数</param>
523   - /// <returns></returns>
  524 + /// 导出工资全字段
  525 + /// </summary>
  526 + /// <param name="input">请求参数</param>
  527 + /// <returns></returns>
524 528 [HttpGet("Actions/Export")]
525 529 public async Task<dynamic> Export([FromQuery] LqGzListQueryInput input)
526 530 {
... ... @@ -535,7 +539,8 @@ namespace NCC.Extend.LqGz
535 539 {
536 540 exportData = await this.GetNoPagingList(input);
537 541 }
538   - List<ParamsModel> paramList = "[{\"value\":\"主键\",\"field\":\"id\"},{\"value\":\"门店\",\"field\":\"md\"},{\"value\":\"核算岗位\",\"field\":\"hsgw\"},{\"value\":\"姓名\",\"field\":\"xm\"},{\"value\":\"金山角战队\",\"field\":\"jsjzd\"},{\"value\":\"基础业绩\",\"field\":\"jcyj\"},{\"value\":\"合作业绩\",\"field\":\"hzyj\"},{\"value\":\"奖励业绩\",\"field\":\"jlyj\"},{\"value\":\"门店总业绩\",\"field\":\"mdzyj\"},{\"value\":\"队伍业绩\",\"field\":\"dwyj\"},{\"value\":\"占比\",\"field\":\"zb\"},{\"value\":\"新客业绩\",\"field\":\"xkyj\"},{\"value\":\"新客成交率\",\"field\":\"xkcjl\"},{\"value\":\"新客提点\",\"field\":\"xktd\"},{\"value\":\"升单业绩\",\"field\":\"sdyj\"},{\"value\":\"升单提点\",\"field\":\"sdtd\"},{\"value\":\"溯源业绩\",\"field\":\"syyj\"},{\"value\":\"cell业绩\",\"field\":\"cellyj\"},{\"value\":\"项目一部业绩\",\"field\":\"dxmybyj\"},{\"value\":\"项目二部业绩\",\"field\":\"dxmebyj\"},{\"value\":\"当月业绩\",\"field\":\"dyyj\"},{\"value\":\"物业水电\",\"field\":\"wysd\"},{\"value\":\"门店支出\",\"field\":\"mdzc\"},{\"value\":\"产品物料\",\"field\":\"cpwl\"},{\"value\":\"微雕成本\",\"field\":\"wdcb\"},{\"value\":\"其它合作成本\",\"field\":\"qthzcb\"},{\"value\":\"洗毛巾\",\"field\":\"xmj\"},{\"value\":\"毛利\",\"field\":\"ml\"},{\"value\":\"总经理提成额\",\"field\":\"zjltce\"},{\"value\":\"经理提成额\",\"field\":\"jltce\"},{\"value\":\"消耗\",\"field\":\"xh\"},{\"value\":\"项目数\",\"field\":\"xms\"},{\"value\":\"到店人头\",\"field\":\"ddrt\"},{\"value\":\"在店天数\",\"field\":\"zdts\"},{\"value\":\"请假天数\",\"field\":\"qjts\"},{\"value\":\"提点\",\"field\":\"td\"},{\"value\":\"基础业绩提成\",\"field\":\"jcyjtc\"},{\"value\":\"合作业绩提成\",\"field\":\"hzyjtc\"},{\"value\":\"顾问提成\",\"field\":\"gwtc\"},{\"value\":\"门店T区提成\",\"field\":\"mdtqtc\"},{\"value\":\"店助提成\",\"field\":\"dztc1\"},{\"value\":\"店助主任提成\",\"field\":\"dzzrtc\"},{\"value\":\"主任提成\",\"field\":\"zrtc\"},{\"value\":\"店长提成\",\"field\":\"dztc2\"},{\"value\":\"总经理提成\",\"field\":\"zjltc\"},{\"value\":\"经理提成\",\"field\":\"jltc\"},{\"value\":\"业绩提成\",\"field\":\"yjtc\"},{\"value\":\"消耗提成\",\"field\":\"xhtc\"},{\"value\":\"科技部组长提成\",\"field\":\"kjbzctc\"},{\"value\":\"溯源提成\",\"field\":\"sytc\"},{\"value\":\"cell提成\",\"field\":\"celltc\"},{\"value\":\"大项目部提成\",\"field\":\"dxmbtc\"},{\"value\":\"提成合计\",\"field\":\"tchj\"},{\"value\":\"健康师底薪\",\"field\":\"jksdx\"},{\"value\":\"店助底薪\",\"field\":\"dzhudx\"},{\"value\":\"店长底薪\",\"field\":\"dzhangdx\"},{\"value\":\"主任底薪\",\"field\":\"zrdx\"},{\"value\":\"店助主任底薪\",\"field\":\"dzzrdx\"},{\"value\":\"总经理底薪\",\"field\":\"zjldx\"},{\"value\":\"经理底薪\",\"field\":\"jldx\"},{\"value\":\"科技部底薪\",\"field\":\"kjblsdx\"},{\"value\":\"大项目部底薪\",\"field\":\"dxmbdx\"},{\"value\":\"底薪合计\",\"field\":\"dxhj\"},{\"value\":\"手工\",\"field\":\"sg\"},{\"value\":\"人头奖励\",\"field\":\"rtjl\"},{\"value\":\"手机管理\",\"field\":\"sjgl\"},{\"value\":\"车补\",\"field\":\"cb\"},{\"value\":\"少休\",\"field\":\"sx\"},{\"value\":\"全勤\",\"field\":\"qq\"},{\"value\":\"核算应发工资\",\"field\":\"hsyfgz\"},{\"value\":\"保底\",\"field\":\"bd\"},{\"value\":\"保底请假\",\"field\":\"bdqj\"},{\"value\":\"保底底薪\",\"field\":\"bddx\"},{\"value\":\"保底补差\",\"field\":\"bdbc\"},{\"value\":\"最终应发工资\",\"field\":\"zzyfgz\"},{\"value\":\"当月培训补贴\",\"field\":\"dypxbt\"},{\"value\":\"当月交通补贴\",\"field\":\"dyjtbt\"},{\"value\":\"上月培训补贴\",\"field\":\"sypxbt\"},{\"value\":\"上月交通补贴\",\"field\":\"syjtbt\"},{\"value\":\"补贴合计\",\"field\":\"bthj\"},{\"value\":\"缺卡\",\"field\":\"qk\"},{\"value\":\"迟到\",\"field\":\"cd\"},{\"value\":\"请假\",\"field\":\"qj\"},{\"value\":\"扣社保\",\"field\":\"ksb\"},{\"value\":\"扣除奖励\",\"field\":\"kcjl\"},{\"value\":\"扣住宿\",\"field\":\"kzs\"},{\"value\":\"扣学习期\",\"field\":\"kxxq\"},{\"value\":\"扣工作服\",\"field\":\"kgzf\"},{\"value\":\"扣款合计\",\"field\":\"kkhj\"},{\"value\":\"发奖金\",\"field\":\"fjj\"},{\"value\":\"退手机押金\",\"field\":\"tsjyj\"},{\"value\":\"退住宿押金\",\"field\":\"tzsyj\"},{\"value\":\"实发工资\",\"field\":\"sfgz\"},{\"value\":\"当月是否发放\",\"field\":\"dysfff\"},{\"value\":\"支付金额\",\"field\":\"zfje\"},{\"value\":\"待支付金额\",\"field\":\"dzjfe\"},{\"value\":\"补发上月\",\"field\":\"bfsy\"},{\"value\":\"当月支付总额\",\"field\":\"dyzfze\"},{\"value\":\"总业绩\",\"field\":\"zyj\"},]".ToList<ParamsModel>();
  542 + List<ParamsModel> paramList =
  543 + "[{\"value\":\"主键\",\"field\":\"id\"},{\"value\":\"门店\",\"field\":\"md\"},{\"value\":\"核算岗位\",\"field\":\"hsgw\"},{\"value\":\"姓名\",\"field\":\"xm\"},{\"value\":\"金山角战队\",\"field\":\"jsjzd\"},{\"value\":\"基础业绩\",\"field\":\"jcyj\"},{\"value\":\"合作业绩\",\"field\":\"hzyj\"},{\"value\":\"奖励业绩\",\"field\":\"jlyj\"},{\"value\":\"门店总业绩\",\"field\":\"mdzyj\"},{\"value\":\"队伍业绩\",\"field\":\"dwyj\"},{\"value\":\"占比\",\"field\":\"zb\"},{\"value\":\"新客业绩\",\"field\":\"xkyj\"},{\"value\":\"新客成交率\",\"field\":\"xkcjl\"},{\"value\":\"新客提点\",\"field\":\"xktd\"},{\"value\":\"升单业绩\",\"field\":\"sdyj\"},{\"value\":\"升单提点\",\"field\":\"sdtd\"},{\"value\":\"溯源业绩\",\"field\":\"syyj\"},{\"value\":\"cell业绩\",\"field\":\"cellyj\"},{\"value\":\"项目一部业绩\",\"field\":\"dxmybyj\"},{\"value\":\"项目二部业绩\",\"field\":\"dxmebyj\"},{\"value\":\"当月业绩\",\"field\":\"dyyj\"},{\"value\":\"物业水电\",\"field\":\"wysd\"},{\"value\":\"门店支出\",\"field\":\"mdzc\"},{\"value\":\"产品物料\",\"field\":\"cpwl\"},{\"value\":\"微雕成本\",\"field\":\"wdcb\"},{\"value\":\"其它合作成本\",\"field\":\"qthzcb\"},{\"value\":\"洗毛巾\",\"field\":\"xmj\"},{\"value\":\"毛利\",\"field\":\"ml\"},{\"value\":\"总经理提成额\",\"field\":\"zjltce\"},{\"value\":\"经理提成额\",\"field\":\"jltce\"},{\"value\":\"消耗\",\"field\":\"xh\"},{\"value\":\"项目数\",\"field\":\"xms\"},{\"value\":\"到店人头\",\"field\":\"ddrt\"},{\"value\":\"在店天数\",\"field\":\"zdts\"},{\"value\":\"请假天数\",\"field\":\"qjts\"},{\"value\":\"提点\",\"field\":\"td\"},{\"value\":\"基础业绩提成\",\"field\":\"jcyjtc\"},{\"value\":\"合作业绩提成\",\"field\":\"hzyjtc\"},{\"value\":\"顾问提成\",\"field\":\"gwtc\"},{\"value\":\"门店T区提成\",\"field\":\"mdtqtc\"},{\"value\":\"店助提成\",\"field\":\"dztc1\"},{\"value\":\"店助主任提成\",\"field\":\"dzzrtc\"},{\"value\":\"主任提成\",\"field\":\"zrtc\"},{\"value\":\"店长提成\",\"field\":\"dztc2\"},{\"value\":\"总经理提成\",\"field\":\"zjltc\"},{\"value\":\"经理提成\",\"field\":\"jltc\"},{\"value\":\"业绩提成\",\"field\":\"yjtc\"},{\"value\":\"消耗提成\",\"field\":\"xhtc\"},{\"value\":\"科技部组长提成\",\"field\":\"kjbzctc\"},{\"value\":\"溯源提成\",\"field\":\"sytc\"},{\"value\":\"cell提成\",\"field\":\"celltc\"},{\"value\":\"大项目部提成\",\"field\":\"dxmbtc\"},{\"value\":\"提成合计\",\"field\":\"tchj\"},{\"value\":\"健康师底薪\",\"field\":\"jksdx\"},{\"value\":\"店助底薪\",\"field\":\"dzhudx\"},{\"value\":\"店长底薪\",\"field\":\"dzhangdx\"},{\"value\":\"主任底薪\",\"field\":\"zrdx\"},{\"value\":\"店助主任底薪\",\"field\":\"dzzrdx\"},{\"value\":\"总经理底薪\",\"field\":\"zjldx\"},{\"value\":\"经理底薪\",\"field\":\"jldx\"},{\"value\":\"科技部底薪\",\"field\":\"kjblsdx\"},{\"value\":\"大项目部底薪\",\"field\":\"dxmbdx\"},{\"value\":\"底薪合计\",\"field\":\"dxhj\"},{\"value\":\"手工\",\"field\":\"sg\"},{\"value\":\"人头奖励\",\"field\":\"rtjl\"},{\"value\":\"手机管理\",\"field\":\"sjgl\"},{\"value\":\"车补\",\"field\":\"cb\"},{\"value\":\"少休\",\"field\":\"sx\"},{\"value\":\"全勤\",\"field\":\"qq\"},{\"value\":\"核算应发工资\",\"field\":\"hsyfgz\"},{\"value\":\"保底\",\"field\":\"bd\"},{\"value\":\"保底请假\",\"field\":\"bdqj\"},{\"value\":\"保底底薪\",\"field\":\"bddx\"},{\"value\":\"保底补差\",\"field\":\"bdbc\"},{\"value\":\"最终应发工资\",\"field\":\"zzyfgz\"},{\"value\":\"当月培训补贴\",\"field\":\"dypxbt\"},{\"value\":\"当月交通补贴\",\"field\":\"dyjtbt\"},{\"value\":\"上月培训补贴\",\"field\":\"sypxbt\"},{\"value\":\"上月交通补贴\",\"field\":\"syjtbt\"},{\"value\":\"补贴合计\",\"field\":\"bthj\"},{\"value\":\"缺卡\",\"field\":\"qk\"},{\"value\":\"迟到\",\"field\":\"cd\"},{\"value\":\"请假\",\"field\":\"qj\"},{\"value\":\"扣社保\",\"field\":\"ksb\"},{\"value\":\"扣除奖励\",\"field\":\"kcjl\"},{\"value\":\"扣住宿\",\"field\":\"kzs\"},{\"value\":\"扣学习期\",\"field\":\"kxxq\"},{\"value\":\"扣工作服\",\"field\":\"kgzf\"},{\"value\":\"扣款合计\",\"field\":\"kkhj\"},{\"value\":\"发奖金\",\"field\":\"fjj\"},{\"value\":\"退手机押金\",\"field\":\"tsjyj\"},{\"value\":\"退住宿押金\",\"field\":\"tzsyj\"},{\"value\":\"实发工资\",\"field\":\"sfgz\"},{\"value\":\"当月是否发放\",\"field\":\"dysfff\"},{\"value\":\"支付金额\",\"field\":\"zfje\"},{\"value\":\"待支付金额\",\"field\":\"dzjfe\"},{\"value\":\"补发上月\",\"field\":\"bfsy\"},{\"value\":\"当月支付总额\",\"field\":\"dyzfze\"},{\"value\":\"总业绩\",\"field\":\"zyj\"},]".ToList<ParamsModel>();
539 544 ExcelConfig excelconfig = new ExcelConfig();
540 545 excelconfig.FileName = "工资全字段.xls";
541 546 excelconfig.HeadFont = "微软雅黑";
... ... @@ -554,11 +559,7 @@ namespace NCC.Extend.LqGz
554 559 var addPath = FileVariable.TemporaryFilePath + excelconfig.FileName;
555 560 ExcelExportHelper<LqGzListOutput>.Export(exportData, excelconfig, addPath);
556 561 var fileName = _userManager.UserId + "|" + addPath + "|xls";
557   - var output = new
558   - {
559   - name = excelconfig.FileName,
560   - url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fileName, "NCC")
561   - };
  562 + var output = new { name = excelconfig.FileName, url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fileName, "NCC") };
562 563 return output;
563 564 }
564 565  
... ... @@ -578,7 +579,7 @@ namespace NCC.Extend.LqGz
578 579 //开启事务
579 580 _db.BeginTran();
580 581 //批量删除工资全字段
581   - await _db.Deleteable<LqGzEntity>().In(d => d.Id,ids).ExecuteCommandAsync();
  582 + await _db.Deleteable<LqGzEntity>().In(d => d.Id, ids).ExecuteCommandAsync();
582 583 //关闭事务
583 584 _db.CommitTran();
584 585 }
... ... @@ -602,7 +603,8 @@ namespace NCC.Extend.LqGz
602 603 {
603 604 var entity = input.Adapt<LqGzEntity>();
604 605 var isOk = await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
605   - if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1001);
  606 + if (!(isOk > 0))
  607 + throw NCCException.Oh(ErrorCode.COM1001);
606 608 }
607 609  
608 610 /// <summary>
... ... @@ -615,7 +617,8 @@ namespace NCC.Extend.LqGz
615 617 var entity = await _db.Queryable<LqGzEntity>().FirstAsync(p => p.Id == id);
616 618 _ = entity ?? throw NCCException.Oh(ErrorCode.COM1005);
617 619 var isOk = await _db.Deleteable<LqGzEntity>().Where(d => d.Id == id).ExecuteCommandAsync();
618   - if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1002);
  620 + if (!(isOk > 0))
  621 + throw NCCException.Oh(ErrorCode.COM1002);
619 622 }
620 623  
621 624 #region 业绩计算相关方法
... ... @@ -625,14 +628,14 @@ namespace NCC.Extend.LqGz
625 628 /// </summary>
626 629 /// <remarks>
627 630 /// 根据薪酬规则计算个人的基础业绩、合作业绩、奖励业绩、门店总业绩、队伍业绩等
628   - ///
  631 + ///
629 632 /// 计算逻辑:
630 633 /// 1. 基础业绩:从开单品项明细表中统计,基于项目资料中的基础服务提成
631 634 /// 2. 合作业绩:从开单品项明细表中统计,基于项目资料中的合作项目设置
632 635 /// 3. 奖励业绩:从奖励明细表中统计
633 636 /// 4. 门店总业绩:该员工所在门店的所有业绩总和
634 637 /// 5. 队伍业绩:该员工所在金三角战队的所有业绩总和
635   - ///
  638 + ///
636 639 /// 示例请求:
637 640 /// ```json
638 641 /// {
... ... @@ -641,7 +644,7 @@ namespace NCC.Extend.LqGz
641 644 /// "calculationMonth": "2025-01"
642 645 /// }
643 646 /// ```
644   - ///
  647 + ///
645 648 /// 参数说明:
646 649 /// - employeeId: 员工ID(必填)
647 650 /// - storeId: 门店ID(必填)
... ... @@ -663,30 +666,29 @@ namespace NCC.Extend.LqGz
663 666 {
664 667 EmployeeId = input.EmployeeId,
665 668 StoreId = input.StoreId,
666   - CalculationMonth = input.CalculationMonth
  669 + CalculationMonth = input.CalculationMonth,
667 670 };
668 671  
669 672 // 1. 计算基础业绩
670 673 result.BasicPerformance = await CalculateBasicPerformance(input.EmployeeId, input.StoreId, input.CalculationMonth);
671   -
  674 +
672 675 // 2. 计算合作业绩
673 676 result.CooperationPerformance = await CalculateCooperationPerformance(input.EmployeeId, input.StoreId, input.CalculationMonth);
674   -
  677 +
675 678 // 3. 计算奖励业绩
676 679 result.RewardPerformance = await CalculateRewardPerformance(input.EmployeeId, input.StoreId, input.CalculationMonth);
677   -
  680 +
678 681 // 4. 计算总业绩
679 682 result.TotalPerformance = result.BasicPerformance + result.CooperationPerformance + result.RewardPerformance;
680   -
  683 +
681 684 // 5. 计算门店总业绩
682 685 result.StoreTotalPerformance = await CalculateStoreTotalPerformance(input.StoreId, input.CalculationMonth);
683   -
  686 +
684 687 // 6. 计算队伍业绩
685 688 result.TeamPerformance = await CalculateTeamPerformance(input.EmployeeId, input.StoreId, input.CalculationMonth);
686   -
  689 +
687 690 // 7. 计算占比
688   - result.PerformanceRatio = result.StoreTotalPerformance > 0 ?
689   - Math.Round(result.TotalPerformance / result.StoreTotalPerformance * 100, 2) : 0;
  691 + result.PerformanceRatio = result.StoreTotalPerformance > 0 ? Math.Round(result.TotalPerformance / result.StoreTotalPerformance * 100, 2) : 0;
690 692  
691 693 _logger.LogInformation($"业绩计算完成 - 员工ID: {input.EmployeeId}, 总业绩: {result.TotalPerformance}, 门店总业绩: {result.StoreTotalPerformance}");
692 694  
... ... @@ -711,11 +713,7 @@ namespace NCC.Extend.LqGz
711 713 var basicPerformance = await _db.Queryable<LqKdPxmxEntity>()
712 714 .LeftJoin<LqXmzlEntity>((px, xm) => px.Px == xm.Xmbh)
713 715 .LeftJoin<LqKdKdjlbEntity>((px, xm, kd) => px.Glkdbh == kd.Id)
714   - .Where((px, xm, kd) =>
715   - kd.Djmd == storeId &&
716   - kd.Kdrq >= startDate &&
717   - kd.Kdrq <= endDate &&
718   - (px.Px == employeeId || px.Px.Contains(employeeId))) // 根据实际情况调整匹配条件
  716 + .Where((px, xm, kd) => kd.Djmd == storeId && kd.Kdrq >= startDate && kd.Kdrq <= endDate && (px.Px == employeeId || px.Px.Contains(employeeId))) // 根据实际情况调整匹配条件
719 717 .SumAsync((px, xm, kd) => px.Pxjg * xm.Jcfwtc / 100);
720 718  
721 719 return basicPerformance;
... ... @@ -733,12 +731,16 @@ namespace NCC.Extend.LqGz
733 731 var cooperationPerformance = await _db.Queryable<LqKdPxmxEntity>()
734 732 .LeftJoin<LqXmzlEntity>((px, xm) => px.Px == xm.Xmbh)
735 733 .LeftJoin<LqKdKdjlbEntity>((px, xm, kd) => px.Glkdbh == kd.Id)
736   - .Where((px, xm, kd) =>
737   - kd.Djmd == storeId &&
738   - kd.Kdrq >= startDate &&
739   - kd.Kdrq <= endDate &&
740   - kd.Hgjg != null && kd.Hgjg != "" && // 有合作机构
741   - (px.Px == employeeId || px.Px.Contains(employeeId)))
  734 + .Where(
  735 + (px, xm, kd) =>
  736 + kd.Djmd == storeId
  737 + && kd.Kdrq >= startDate
  738 + && kd.Kdrq <= endDate
  739 + && kd.Hgjg != null
  740 + && kd.Hgjg != ""
  741 + && // 有合作机构
  742 + (px.Px == employeeId || px.Px.Contains(employeeId))
  743 + )
742 744 .SumAsync((px, xm, kd) => px.Pxjg * 0.65m); // 合作业绩按65%计算
743 745  
744 746 return cooperationPerformance;
... ... @@ -751,10 +753,7 @@ namespace NCC.Extend.LqGz
751 753 {
752 754 // 从奖励明细表中统计奖励业绩
753 755 var rewardPerformance = await _db.Queryable<LqJlmxbEntity>()
754   - .Where(jl =>
755   - jl.Mdbh == storeId &&
756   - jl.Jks == employeeId &&
757   - jl.Hj != null && jl.Hj != "")
  756 + .Where(jl => jl.Mdbh == storeId && jl.Jks == employeeId && jl.Hj != null && jl.Hj != "")
758 757 .SumAsync(jl => Convert.ToDecimal(jl.Hj));
759 758  
760 759 return rewardPerformance;
... ... @@ -769,12 +768,7 @@ namespace NCC.Extend.LqGz
769 768 var endDate = startDate.AddMonths(1).AddDays(-1);
770 769  
771 770 // 从开单记录表中统计门店总业绩
772   - var storeTotalPerformance = await _db.Queryable<LqKdKdjlbEntity>()
773   - .Where(kd =>
774   - kd.Djmd == storeId &&
775   - kd.Kdrq >= startDate &&
776   - kd.Kdrq <= endDate)
777   - .SumAsync(kd => kd.Zdyj);
  771 + var storeTotalPerformance = await _db.Queryable<LqKdKdjlbEntity>().Where(kd => kd.Djmd == storeId && kd.Kdrq >= startDate && kd.Kdrq <= endDate).SumAsync(kd => kd.Zdyj);
778 772  
779 773 return storeTotalPerformance;
780 774 }
... ... @@ -785,12 +779,7 @@ namespace NCC.Extend.LqGz
785 779 private async Task<decimal> CalculateTeamPerformance(string employeeId, string storeId, string calculationMonth)
786 780 {
787 781 // 先获取员工所在的金三角战队
788   - var goldenTriangle = await _db.Queryable<LqYcsdJsjEntity>()
789   - .Where(jsj =>
790   - jsj.Md == storeId &&
791   - jsj.Yf == calculationMonth &&
792   - jsj.Jsj.Contains(employeeId))
793   - .FirstAsync();
  782 + var goldenTriangle = await _db.Queryable<LqYcsdJsjEntity>().Where(jsj => jsj.Md == storeId && jsj.Yf == calculationMonth && jsj.Jsj.Contains(employeeId)).FirstAsync();
794 783  
795 784 if (goldenTriangle == null)
796 785 {
... ... @@ -802,11 +791,7 @@ namespace NCC.Extend.LqGz
802 791  
803 792 // 统计该战队所有成员的业绩
804 793 var teamPerformance = await _db.Queryable<LqKdKdjlbEntity>()
805   - .Where(kd =>
806   - kd.Djmd == storeId &&
807   - kd.Kdrq >= startDate &&
808   - kd.Kdrq <= endDate &&
809   - goldenTriangle.Jsj.Contains(kd.Jsj))
  794 + .Where(kd => kd.Djmd == storeId && kd.Kdrq >= startDate && kd.Kdrq <= endDate && goldenTriangle.Jsj.Contains(kd.Jsj))
810 795 .SumAsync(kd => kd.Zdyj);
811 796  
812 797 return teamPerformance;
... ... @@ -817,7 +802,7 @@ namespace NCC.Extend.LqGz
817 802 /// </summary>
818 803 /// <remarks>
819 804 /// 批量更新指定月份所有员工的业绩数据
820   - ///
  805 + ///
821 806 /// 示例请求:
822 807 /// ```json
823 808 /// {
... ... @@ -825,7 +810,7 @@ namespace NCC.Extend.LqGz
825 810 /// "storeIds": ["门店ID1", "门店ID2"]
826 811 /// }
827 812 /// ```
828   - ///
  813 + ///
829 814 /// 参数说明:
830 815 /// - calculationMonth: 计算月份,格式:YYYYMM(必填)
831 816 /// - storeIds: 门店ID列表(可选,为空则更新所有门店)
... ... @@ -846,9 +831,7 @@ namespace NCC.Extend.LqGz
846 831 var errorCount = 0;
847 832  
848 833 // 获取需要更新的工资记录
849   - var salaryRecords = await _db.Queryable<LqGzEntity>()
850   - .WhereIF(input.StoreIds != null && input.StoreIds.Any(), gz => input.StoreIds.Contains(gz.Md))
851   - .ToListAsync();
  834 + var salaryRecords = await _db.Queryable<LqGzEntity>().WhereIF(input.StoreIds != null && input.StoreIds.Any(), gz => input.StoreIds.Contains(gz.Md)).ToListAsync();
852 835  
853 836 foreach (var record in salaryRecords)
854 837 {
... ... @@ -859,7 +842,7 @@ namespace NCC.Extend.LqGz
859 842 {
860 843 EmployeeId = record.Xm, // 使用姓名作为员工标识
861 844 StoreId = record.Md,
862   - CalculationMonth = input.CalculationMonth
  845 + CalculationMonth = input.CalculationMonth,
863 846 };
864 847  
865 848 var performance = await CalculatePerformance(performanceInput);
... ... @@ -874,9 +857,15 @@ namespace NCC.Extend.LqGz
874 857 record.Zb = performance.PerformanceRatio;
875 858  
876 859 await _db.Updateable(record)
877   - .UpdateColumns(gz => new {
878   - gz.Jcyj, gz.Hzyj, gz.Jlyj, gz.Zyj,
879   - gz.Mdzyj, gz.Dwyj, gz.Zb
  860 + .UpdateColumns(gz => new
  861 + {
  862 + gz.Jcyj,
  863 + gz.Hzyj,
  864 + gz.Jlyj,
  865 + gz.Zyj,
  866 + gz.Mdzyj,
  867 + gz.Dwyj,
  868 + gz.Zb,
880 869 })
881 870 .ExecuteCommandAsync();
882 871  
... ... @@ -896,7 +885,7 @@ namespace NCC.Extend.LqGz
896 885 Success = true,
897 886 UpdatedCount = updatedCount,
898 887 ErrorCount = errorCount,
899   - Message = $"成功更新 {updatedCount} 条记录,失败 {errorCount} 条记录"
  888 + Message = $"成功更新 {updatedCount} 条记录,失败 {errorCount} 条记录",
900 889 };
901 890 }
902 891 catch (Exception ex)
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqHytkHytkService.cs
... ... @@ -199,7 +199,6 @@ namespace NCC.Extend.LqHytkHytk
199 199 entity.F_CreateTime = DateTime.Now;
200 200 entity.F_CreateUser = userInfo.userId;
201 201 entity.F_DeleteMark = 0;
202   - entity.Tksj = DateTime.Now;
203 202 entity.Czry = userInfo.userId;
204 203  
205 204 try
... ... @@ -224,18 +223,19 @@ namespace NCC.Extend.LqHytkHytk
224 223 var lqHytkMxEntity = new LqHytkMxEntity
225 224 {
226 225 Id = YitIdHelper.NextId().ToString(),
227   - Gltkbh = newEntity.Id,
228   - F_CreateTime = DateTime.Now,
229   - F_CreateUser = userInfo.userId,
230   - F_DeleteMark = 0,
  226 + RefundInfoId = newEntity.Id,
  227 + BillingItemId = item.billingItemId,
  228 + CreateTime = DateTime.Now,
  229 + CreateUser = userInfo.userId,
  230 + DeleteMark = 0,
231 231 Px = item.px,
232 232 Pxmc = item.pxmc,
233 233 Pxjg = item.pxjg,
234 234 Tkje = item.tkje,
235   - F_ProjectNumber = item.F_ProjectNumber ?? 1,
236   - F_IsEnabled = item.F_IsEnabled ?? 1,
237   - F_SourceType = item.F_SourceType,
238   - F_TotalPrice = item.F_TotalPrice ?? (item.pxjg * (item.F_ProjectNumber ?? 1)),
  235 + ProjectNumber = item.F_ProjectNumber ?? 1,
  236 + IsEnabled = item.F_IsEnabled ?? 1,
  237 + SourceType = item.F_SourceType,
  238 + TotalPrice = item.F_TotalPrice ?? (item.pxjg * (item.F_ProjectNumber ?? 1)),
239 239 };
240 240 allMxEntities.Add(lqHytkMxEntity);
241 241  
... ... @@ -357,7 +357,7 @@ namespace NCC.Extend.LqHytkHytk
357 357 await _db.Updateable(entity).IgnoreColumns(true).ExecuteCommandAsync();
358 358  
359 359 // 删除原有的关联数据
360   - await _db.Deleteable<LqHytkMxEntity>().Where(x => x.Gltkbh == id).ExecuteCommandAsync();
  360 + await _db.Deleteable<LqHytkMxEntity>().Where(x => x.RefundInfoId == id).ExecuteCommandAsync();
361 361 await _db.Deleteable<LqHytkJksyjEntity>().Where(x => x.Gltkbh == id).ExecuteCommandAsync();
362 362 await _db.Deleteable<LqHytkKjbsyjEntity>().Where(x => x.Gltkbh == id).ExecuteCommandAsync();
363 363  
... ... @@ -375,18 +375,19 @@ namespace NCC.Extend.LqHytkHytk
375 375 var lqHytkMxEntity = new LqHytkMxEntity
376 376 {
377 377 Id = YitIdHelper.NextId().ToString(),
378   - Gltkbh = id,
379   - F_CreateTime = DateTime.Now,
380   - F_CreateUser = userInfo.userId,
381   - F_DeleteMark = 0,
  378 + RefundInfoId = id,
  379 + BillingItemId = item.billingItemId,
  380 + CreateTime = DateTime.Now,
  381 + CreateUser = userInfo.userId,
  382 + DeleteMark = 0,
382 383 Px = item.px,
383 384 Pxmc = item.pxmc,
384 385 Pxjg = item.pxjg,
385 386 Tkje = item.tkje,
386   - F_ProjectNumber = item.F_ProjectNumber ?? 1,
387   - F_IsEnabled = item.F_IsEnabled ?? 1,
388   - F_SourceType = item.F_SourceType,
389   - F_TotalPrice = item.F_TotalPrice ?? (item.pxjg * (item.F_ProjectNumber ?? 1)),
  387 + ProjectNumber = item.F_ProjectNumber ?? 1,
  388 + IsEnabled = item.F_IsEnabled ?? 1,
  389 + SourceType = item.F_SourceType,
  390 + TotalPrice = item.F_TotalPrice ?? (item.pxjg * (item.F_ProjectNumber ?? 1)),
390 391 };
391 392 allMxEntities.Add(lqHytkMxEntity);
392 393  
... ... @@ -524,7 +525,7 @@ namespace NCC.Extend.LqHytkHytk
524 525 var output = entity.Adapt<LqHytkHytkInfoOutput>();
525 526  
526 527 // 2. 查询品项明细列表
527   - var lqHytkMxList = await _db.Queryable<LqHytkMxEntity>().Where(w => w.Gltkbh == entity.Id).ToListAsync();
  528 + var lqHytkMxList = await _db.Queryable<LqHytkMxEntity>().Where(w => w.RefundInfoId == entity.Id).ToListAsync();
528 529  
529 530 // 3. 查询健康师业绩列表
530 531 var lqHytkJksyjList = await _db.Queryable<LqHytkJksyjEntity>().Where(w => w.Gltkbh == entity.Id).ToListAsync();
... ... @@ -539,15 +540,16 @@ namespace NCC.Extend.LqHytkHytk
539 540 var mxOutput = new LqHytkMxInfoOutput
540 541 {
541 542 id = mx.Id,
542   - gltkbh = mx.Gltkbh,
  543 + refundInfoId = mx.RefundInfoId,
  544 + billingItemId = mx.BillingItemId,
543 545 px = mx.Px,
544 546 pxmc = mx.Pxmc,
545 547 pxjg = mx.Pxjg,
546 548 tkje = mx.Tkje,
547   - F_ProjectNumber = mx.F_ProjectNumber,
548   - F_IsEnabled = mx.F_IsEnabled,
549   - F_SourceType = mx.F_SourceType,
550   - F_TotalPrice = mx.F_TotalPrice,
  549 + projectNumber = mx.ProjectNumber,
  550 + isEnabled = mx.IsEnabled,
  551 + sourceType = mx.SourceType,
  552 + totalPrice = mx.TotalPrice,
551 553 };
552 554  
553 555 // 关联该品项的健康师业绩
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs
... ... @@ -16,8 +16,11 @@ 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.LqKdKdjlb;
  21 +using NCC.Extend.Entitys.Enum;
20 22 using NCC.Extend.Entitys.lq_jinsanjiao_user;
  23 +using NCC.Extend.Entitys.lq_kd_deductinfo;
21 24 using NCC.Extend.Entitys.lq_kd_jksyj;
22 25 using NCC.Extend.Entitys.lq_kd_kdjlb;
23 26 using NCC.Extend.Entitys.lq_kd_kjbsyj;
... ... @@ -252,6 +255,8 @@ namespace NCC.Extend.LqKdKdjlb
252 255 var userInfo = await _userManager.GetUserInfo();
253 256 var entity = input.Adapt<LqKdKdjlbEntity>();
254 257 entity.Id = YitIdHelper.NextId().ToString();
  258 + entity.CreateTime = DateTime.Now;
  259 + entity.UpdateTime = DateTime.Now;
255 260 try
256 261 {
257 262 //开启事务
... ... @@ -264,7 +269,20 @@ namespace NCC.Extend.LqKdKdjlb
264 269 var allPxmxEntities = new List<LqKdPxmxEntity>();
265 270 var allJksyjEntities = new List<LqKdJksyjEntity>();
266 271 var allKjbsyjEntities = new List<LqKdKjbsyjEntity>();
267   -
  272 + var allDeductEntities = new List<LqKdDeductinfoEntity>();
  273 + // 处理扣款信息列表
  274 + foreach (var item in input.lqKdKdjlbDeductList)
  275 + {
  276 + var lqKdDeductEntity = new LqKdDeductinfoEntity
  277 + {
  278 + Id = YitIdHelper.NextId().ToString(),
  279 + BillingId = newEntity.Id,
  280 + DeductId = item.DeductId,
  281 + DeductType = item.DeductType,
  282 + Amount = item.Amount,
  283 + };
  284 + allDeductEntities.Add(lqKdDeductEntity);
  285 + }
268 286 // 处理品项明细列表
269 287 foreach (var item in input.lqKdPxmxList)
270 288 {
... ... @@ -276,8 +294,8 @@ namespace NCC.Extend.LqKdKdjlb
276 294 CreateTIme = DateTime.Now,
277 295 MemberId = entity.Kdhy,
278 296 IsEnabled = 0,
279   - ProjectNumber = item.projectNumber ?? 1,
280   - TotalPrice = (decimal)(item.pxjg * (item.projectNumber ?? 1)),
  297 + ProjectNumber = item.projectNumber,
  298 + TotalPrice = (decimal)(item.pxjg * item.projectNumber),
281 299 Px = item.px,
282 300 Pxmc = item.pxmc,
283 301 Pxjg = item.pxjg,
... ... @@ -300,7 +318,7 @@ namespace NCC.Extend.LqKdKdjlb
300 318 Jksxm = ijks_tem.jksxm,
301 319 Jkszh = ijks_tem.jkszh,
302 320 Jksyj = ijks_tem.jksyj,
303   - Yjsj = DateTime.Now,
  321 + Yjsj = input.kdrq,
304 322 Jsj_id = ijks_tem.jsj_id,
305 323 Kdpxid = lqKdPxmxEntity.Id,
306 324 }
... ... @@ -322,14 +340,18 @@ namespace NCC.Extend.LqKdKdjlb
322 340 Kjblsxm = ikjbs_tem.kjblsxm,
323 341 Kjblszh = ikjbs_tem.kjblszh,
324 342 Kjblsyj = ikjbs_tem.kjblsyj,
325   - Yjsj = DateTime.Now,
  343 + Yjsj = input.kdrq,
326 344 Kdpxid = lqKdPxmxEntity.Id,
327 345 }
328 346 );
329 347 }
330 348 }
331 349 }
332   -
  350 + // 批量插入扣款信息
  351 + if (allDeductEntities.Any())
  352 + {
  353 + await _db.Insertable(allDeductEntities).ExecuteCommandAsync();
  354 + }
333 355 // 批量插入品项明细
334 356 if (allPxmxEntities.Any())
335 357 {
... ... @@ -345,6 +367,7 @@ namespace NCC.Extend.LqKdKdjlb
345 367 {
346 368 await _db.Insertable(allKjbsyjEntities).ExecuteCommandAsync();
347 369 }
  370 +
348 371 //关闭事务
349 372 _db.CommitTran();
350 373  
... ... @@ -634,8 +657,8 @@ namespace NCC.Extend.LqKdKdjlb
634 657 CreateTIme = DateTime.Now,
635 658 MemberId = entity.Kdhy,
636 659 IsEnabled = 0,
637   - ProjectNumber = item.projectNumber ?? 1,
638   - TotalPrice = (decimal)(item.pxjg * (item.projectNumber ?? 1)),
  660 + ProjectNumber = item.projectNumber == 0 ? 1 : item.projectNumber,
  661 + TotalPrice = (decimal)(item.pxjg * (item.projectNumber == 0 ? 1 : item.projectNumber)),
639 662 Px = item.px,
640 663 Pxmc = item.pxmc,
641 664 Pxjg = item.pxjg,
... ... @@ -753,5 +776,24 @@ namespace NCC.Extend.LqKdKdjlb
753 776 }
754 777 }
755 778 #endregion
  779 +
  780 + #region 获取扣款类型枚举内容
  781 + /// <summary>
  782 + /// 获取扣款类型枚举内容
  783 + /// </summary>
  784 + /// <returns>扣款类型枚举列表</returns>
  785 + [HttpGet("deduct-types")]
  786 + public List<EnumOutput> GetDeductTypes()
  787 + {
  788 + return Enum.GetValues<DeductTypeEnum>()
  789 + .Select(e => new EnumOutput
  790 + {
  791 + Value = (int)e,
  792 + Name = e.ToString(),
  793 + Description = e.GetDescription(),
  794 + })
  795 + .ToList();
  796 + }
  797 + #endregion
756 798 }
757 799 }
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs
... ... @@ -548,155 +548,34 @@ namespace NCC.Extend.LqKhxx
548 548 {
549 549 throw NCCException.Oh(ErrorCode.COM1000, "会员ID不能为空");
550 550 }
551   -
552 551 try
553 552 {
554   - _logger.LogInformation("开始查询会员剩余品项,会员ID:{MemberId}", memberId);
555   -
556 553 // 1. 查询会员基本信息
557 554 var memberInfo = await _db.Queryable<LqKhxxEntity>().Where(x => x.Id == memberId).FirstAsync();
558   -
559 555 if (memberInfo == null)
560 556 {
561 557 _logger.LogWarning("会员不存在,会员ID:{MemberId}", memberId);
562   - throw NCCException.Oh(ErrorCode.COM1005, "会员不存在");
  558 + throw NCCException.Oh("会员不存在");
563 559 }
564   -
565   - _logger.LogInformation("会员信息查询成功,会员姓名:{MemberName}", memberInfo.Khmc);
566   -
567 560 // 2. 查询开单记录ID列表
568   - _logger.LogInformation("开始查询开单记录ID列表");
569   - var orderIds = await _db.Queryable<LqKdKdjlbEntity>().Where(kd => kd.Kdhy == memberId).Select(kd => kd.Id).ToListAsync();
570   -
571   - _logger.LogInformation("开单记录ID列表查询成功,数量:{Count}", orderIds.Count);
572   -
573   - // 3. 查询开单品项统计(按品项ID、名称、价格和来源类型分组)
574   - _logger.LogInformation("开始查询开单品项统计");
575   - var purchasedItems = new List<dynamic>();
576   - if (orderIds.Any())
577   - {
578   - var tempPurchasedItems = await _db.Queryable<LqKdPxmxEntity>()
579   - .Where(px => orderIds.Contains(px.Glkdbh))
580   - .GroupBy(px => new
581   - {
582   - px.Px,
583   - px.Pxmc,
584   - px.Pxjg,
585   - px.SourceType,
586   - })
587   - .Select(px => new
588   - {
589   - ItemId = px.Px,
590   - ItemName = px.Pxmc,
591   - ItemPrice = px.Pxjg,
592   - SourceType = SqlFunc.IsNull(px.SourceType, "未知"),
593   - TotalPurchased = SqlFunc.AggregateSum(SqlFunc.ToDecimal(px.ProjectNumber)),
594   - })
595   - .ToListAsync();
596   -
597   - purchasedItems = tempPurchasedItems.Cast<dynamic>().ToList();
598   - _logger.LogInformation("开单品项统计查询成功,数量:{Count}", purchasedItems.Count);
599   -
600   - // 调试:输出前几条记录查看SourceType字段
601   - foreach (var item in purchasedItems.Take(3))
602   - {
603   - _logger.LogInformation($"调试 - 品项ID: {item.ItemId}, 品项名称: {item.ItemName}, 来源类型: {item.SourceType}");
604   - }
605   - }
606   -
607   - // 4. 查询耗卡记录ID列表
608   - _logger.LogInformation("开始查询耗卡记录ID列表");
609   - var consumeIds = await _db.Queryable<LqXhHyhkEntity>().Where(hk => hk.Hy == memberId).Select(hk => hk.Id).ToListAsync();
610   -
611   - _logger.LogInformation("耗卡记录ID列表查询成功,数量:{Count}", consumeIds.Count);
612   -
613   - // 5. 查询耗卡品项统计(按品项ID和来源类型分组)
614   - _logger.LogInformation("开始查询耗卡品项统计");
615   - var consumedItems = new List<dynamic>();
616   - if (consumeIds.Any())
617   - {
618   - var tempConsumedItems = await _db.Queryable<LqXhPxmxEntity>()
619   - .Where(px => consumeIds.Contains(px.Glkdbh))
620   - .GroupBy(px => new { px.Px, px.SourceType })
621   - .Select(px => new
622   - {
623   - ItemId = px.Px,
624   - SourceType = SqlFunc.IsNull(px.SourceType, "未知"),
625   - ConsumedCount = SqlFunc.AggregateSum(SqlFunc.ToDecimal(px.ProjectNumber)),
626   - })
627   - .ToListAsync();
628   -
629   - consumedItems = tempConsumedItems.Cast<dynamic>().ToList();
630   - _logger.LogInformation("耗卡品项统计查询成功,数量:{Count}", consumedItems.Count);
631   - }
632   -
633   - // 6. 查询退卡记录ID列表
634   - _logger.LogInformation("开始查询退卡记录ID列表");
635   - var refundIds = await _db.Queryable<LqHytkHytkEntity>().Where(tk => tk.Hy == memberId && tk.F_DeleteMark != 1).Select(tk => tk.Id).ToListAsync();
636   -
637   - _logger.LogInformation("退卡记录ID列表查询成功,数量:{Count}", refundIds.Count);
638   -
639   - // 7. 查询退卡品项统计(按品项ID和来源类型分组)
640   - _logger.LogInformation("开始查询退卡品项统计");
641   - var refundedItems = new List<dynamic>();
642   - if (refundIds.Any())
643   - {
644   - var tempRefundedItems = await _db.Queryable<LqHytkMxEntity>()
645   - .Where(px => refundIds.Contains(px.Gltkbh) && px.F_DeleteMark != 1)
646   - .GroupBy(px => new { px.Px, px.F_SourceType })
647   - .Select(px => new
648   - {
649   - ItemId = px.Px,
650   - SourceType = SqlFunc.IsNull(px.F_SourceType, "未知"),
651   - RefundedCount = SqlFunc.AggregateSum(SqlFunc.ToDecimal(px.F_ProjectNumber)),
652   - })
653   - .ToListAsync();
654   -
655   - refundedItems = tempRefundedItems.Cast<dynamic>().ToList();
656   - _logger.LogInformation("退卡品项统计查询成功,数量:{Count}", refundedItems.Count);
657   - }
658   -
659   - // 8. 合并计算剩余品项(按品项ID和来源类型匹配)
660   - _logger.LogInformation("开始合并计算剩余品项");
661   - var remainingItems = new List<RemainingItemInfo>();
662   -
663   - // 处理有购买记录的品项
664   - foreach (var purchased in purchasedItems)
665   - {
666   - // 按品项ID和来源类型匹配耗卡记录
667   - var consumed = consumedItems.FirstOrDefault(x => x.ItemId == purchased.ItemId && x.SourceType == purchased.SourceType);
668   - var consumedCount = consumed?.ConsumedCount ?? 0;
669   -
670   - // 按品项ID和来源类型匹配退卡记录
671   - var refunded = refundedItems.FirstOrDefault(x => x.ItemId == purchased.ItemId && x.SourceType == purchased.SourceType);
672   - var refundedCount = refunded?.RefundedCount ?? 0;
673   -
674   - // 计算剩余数量:购买数量 - 消费数量 - 退卡数量
675   - var remainingCount = purchased.TotalPurchased - consumedCount - refundedCount;
676   -
677   - if (remainingCount > 0)
  561 + var remainingItems = await _db.Queryable<LqKdPxmxEntity>()
  562 + .Where(x => x.MemberId == memberId)
  563 + .Select(x => new RemainingItemInfo
678 564 {
679   - remainingItems.Add(
680   - new RemainingItemInfo
681   - {
682   - ItemId = purchased.ItemId,
683   - ItemName = purchased.ItemName,
684   - ItemPrice = purchased.ItemPrice,
685   - SourceType = purchased.SourceType?.ToString() ?? "未知",
686   - TotalPurchased = purchased.TotalPurchased,
687   - ConsumedCount = consumedCount,
688   - RefundedCount = refundedCount,
689   - RemainingCount = remainingCount,
690   - }
691   - );
692   - }
693   - }
694   -
695   - // 7. 按剩余数量降序排列
696   - remainingItems = remainingItems.OrderByDescending(x => x.RemainingCount).ToList();
697   -
698   - _logger.LogInformation("剩余品项计算完成,数量:{Count}", remainingItems.Count);
699   -
  565 + BillingItemId = x.Id,
  566 + ItemId = x.Px,
  567 + ItemName = x.Pxmc,
  568 + ItemPrice = x.Pxjg,
  569 + SourceType = x.SourceType,
  570 + TotalPurchased = x.ProjectNumber,
  571 + ConsumedCount = SqlFunc.Subqueryable<LqXhPxmxEntity>().Where(y => y.BillingItemId == x.Id).Sum(y => SqlFunc.ToDecimal(y.ProjectNumber)),
  572 + 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)),
  577 + })
  578 + .ToListAsync();
700 579 return new MemberRemainingItemsOutput
701 580 {
702 581 MemberId = memberId,
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqStatisticsService.cs
... ... @@ -13,11 +13,15 @@ using NCC.Dependency;
13 13 using NCC.DynamicApiController;
14 14 using NCC.Extend.Entitys.Dto.LqMdxx;
15 15 using NCC.Extend.Entitys.Dto.LqStatistics;
  16 +using NCC.Extend.Entitys.Dto.LqYcsdJsj;
16 17 using NCC.Extend.Entitys.lq_hytk_kjbsyj;
  18 +using NCC.Extend.Entitys.lq_jinsanjiao_user;
  19 +using NCC.Extend.Entitys.lq_kd_jksyj;
17 20 using NCC.Extend.Entitys.lq_kd_kdjlb;
18 21 using NCC.Extend.Entitys.lq_kd_kjbsyj;
19 22 using NCC.Extend.Entitys.lq_mdxx;
20 23 using NCC.Extend.Entitys.lq_xh_kjbsyj;
  24 +using NCC.Extend.Entitys.lq_ycsd_jsj;
21 25 using NCC.Extend.Entitys.lq_yjmxb;
22 26 using NCC.Extend.Entitys.v_tech_teacher_flow;
23 27 using NCC.Extend.Interfaces.LqStatistics;
... ... @@ -1041,6 +1045,140 @@ namespace NCC.Extend.LqStatistics
1041 1045 }
1042 1046  
1043 1047 #endregion
  1048 +
  1049 + #region 金三角业绩统计
  1050 + /// <summary>
  1051 + /// 查询所有金三角的业绩统计
  1052 + /// </summary>
  1053 + /// <remarks>
  1054 + /// 根据金三角成员状态进行不同的统计方式:
  1055 + /// 1. 活跃成员:业绩计入金三角总业绩
  1056 + /// 2. 非活跃成员:按单人业绩统计,金三角名称为"门店名+姓名"
  1057 + ///
  1058 + /// 示例请求:
  1059 + /// GET /api/Extend/LqStatistics/GetJsjPerformance?startMonth=202401&amp;endMonth=202412
  1060 + ///
  1061 + /// 参数说明:
  1062 + /// - startMonth: 开始月份,格式为yyyyMM,可选
  1063 + /// - endMonth: 结束月份,格式为yyyyMM,可选
  1064 + /// - jsjId: 金三角ID,可选
  1065 + /// - storeId: 门店ID,可选
  1066 + ///
  1067 + /// 返回信息包括:
  1068 + /// - 金三角基本信息(ID、名称、月份、门店)
  1069 + /// - 业绩统计(订单数量、总业绩、首次/最后订单日期)
  1070 + /// - 统计类型(ACTIVE-活跃金三角业绩,INACTIVE-单人业绩)
  1071 + /// - 成员姓名(仅单人业绩时使用)
  1072 + /// </remarks>
  1073 + /// <param name="input">查询参数</param>
  1074 + /// <returns>金三角业绩统计列表</returns>
  1075 + /// <response code="200">查询成功</response>
  1076 + /// <response code="400">参数错误</response>
  1077 + [HttpGet("GetJsjPerformance")]
  1078 + public async Task<List<LqYcsdJsjPerformanceOutput>> GetJsjPerformance([FromQuery] LqYcsdJsjPerformanceInput input)
  1079 + {
  1080 + var result = new List<LqYcsdJsjPerformanceOutput>();
  1081 +
  1082 + try
  1083 + {
  1084 + // 1. 查询活跃金三角成员的业绩(计入金三角总业绩)
  1085 + var activePerformanceQuery = _db.Queryable<LqYcsdJsjEntity>()
  1086 + .LeftJoin<LqJinsanjiaoUserEntity>((jsj, user) => jsj.Id == user.JsjId && user.Status == "ACTIVE" && user.DeleteMark == 0)
  1087 + .LeftJoin<LqKdJksyjEntity>((jsj, user, jksyj) => jsj.Id == jksyj.Jsj_id && user.UserId == jksyj.Jkszh)
  1088 + .LeftJoin<LqMdxxEntity>((jsj, user, jksyj, md) => jsj.Md == md.Id)
  1089 + .Where((jsj, user, jksyj, md) => jsj.Yf != null && jksyj.Yjsj != null && jksyj.Jksyj != null && jksyj.Jksyj != "" && jksyj.Jksyj != "0")
  1090 + .WhereIF(!string.IsNullOrEmpty(input.StartMonth), (jsj, user, jksyj, md) => jsj.Yf.CompareTo(input.StartMonth) >= 0)
  1091 + .WhereIF(!string.IsNullOrEmpty(input.EndMonth), (jsj, user, jksyj, md) => jsj.Yf.CompareTo(input.EndMonth) <= 0)
  1092 + .WhereIF(!string.IsNullOrEmpty(input.JsjId), (jsj, user, jksyj, md) => jsj.Id == input.JsjId)
  1093 + .WhereIF(!string.IsNullOrEmpty(input.StoreId), (jsj, user, jksyj, md) => jsj.Md == input.StoreId)
  1094 + .GroupBy(
  1095 + (jsj, user, jksyj, md) =>
  1096 + new
  1097 + {
  1098 + jsj.Id,
  1099 + jsj.Jsj,
  1100 + jsj.Yf,
  1101 + jsj.Md,
  1102 + md.Dm,
  1103 + }
  1104 + )
  1105 + .Select(
  1106 + (jsj, user, jksyj, md) =>
  1107 + new LqYcsdJsjPerformanceOutput
  1108 + {
  1109 + JsjId = jsj.Id,
  1110 + JsjName = jsj.Jsj,
  1111 + Month = jsj.Yf,
  1112 + StoreId = jsj.Md,
  1113 + StoreName = md.Dm,
  1114 + OrderCount = SqlFunc.AggregateCount(jksyj.Glkdbh),
  1115 + TotalPerformance = SqlFunc.AggregateSum(SqlFunc.ToDecimal(jksyj.Jksyj)),
  1116 + LastOrderDate = SqlFunc.AggregateMax(jksyj.Yjsj),
  1117 + FirstOrderDate = SqlFunc.AggregateMin(jksyj.Yjsj),
  1118 + StatisticsType = "ACTIVE",
  1119 + MemberName = null,
  1120 + }
  1121 + );
  1122 +
  1123 + var activeResults = await activePerformanceQuery.ToListAsync();
  1124 + result.AddRange(activeResults);
  1125 +
  1126 + // 2. 查询非活跃金三角成员的业绩(按单人业绩统计)
  1127 + var inactivePerformanceQuery = _db.Queryable<LqJinsanjiaoUserEntity>()
  1128 + .LeftJoin<LqYcsdJsjEntity>((user, jsj) => user.JsjId == jsj.Id)
  1129 + .LeftJoin<LqKdJksyjEntity>((user, jsj, jksyj) => user.UserId == jksyj.Jkszh)
  1130 + .LeftJoin<LqMdxxEntity>((user, jsj, jksyj, md) => jsj.Md == md.Id)
  1131 + .Where(
  1132 + (user, jsj, jksyj, md) =>
  1133 + user.Status == "INACTIVE" && user.DeleteMark == 0 && jsj.Yf != null && jksyj.Yjsj != null && jksyj.Jksyj != null && jksyj.Jksyj != "" && jksyj.Jksyj != "0"
  1134 + )
  1135 + .WhereIF(!string.IsNullOrEmpty(input.StartMonth), (user, jsj, jksyj, md) => jsj.Yf.CompareTo(input.StartMonth) >= 0)
  1136 + .WhereIF(!string.IsNullOrEmpty(input.EndMonth), (user, jsj, jksyj, md) => jsj.Yf.CompareTo(input.EndMonth) <= 0)
  1137 + .WhereIF(!string.IsNullOrEmpty(input.JsjId), (user, jsj, jksyj, md) => jsj.Id == input.JsjId)
  1138 + .WhereIF(!string.IsNullOrEmpty(input.StoreId), (user, jsj, jksyj, md) => jsj.Md == input.StoreId)
  1139 + .GroupBy(
  1140 + (user, jsj, jksyj, md) =>
  1141 + new
  1142 + {
  1143 + user.Id,
  1144 + user.UserName,
  1145 + jsjId = jsj.Id,
  1146 + jsj.Yf,
  1147 + jsj.Md,
  1148 + md.Dm,
  1149 + }
  1150 + )
  1151 + .Select(
  1152 + (user, jsj, jksyj, md) =>
  1153 + new LqYcsdJsjPerformanceOutput
  1154 + {
  1155 + JsjId = user.Id, // 使用用户ID作为标识
  1156 + JsjName = md.Dm + "-" + user.UserName, // 门店名+姓名
  1157 + Month = jsj.Yf,
  1158 + StoreId = jsj.Md,
  1159 + StoreName = md.Dm,
  1160 + OrderCount = SqlFunc.AggregateCount(jksyj.Glkdbh),
  1161 + TotalPerformance = SqlFunc.AggregateSum(SqlFunc.ToDecimal(jksyj.Jksyj)),
  1162 + LastOrderDate = SqlFunc.AggregateMax(jksyj.Yjsj),
  1163 + FirstOrderDate = SqlFunc.AggregateMin(jksyj.Yjsj),
  1164 + StatisticsType = "INACTIVE",
  1165 + MemberName = user.UserName,
  1166 + }
  1167 + );
  1168 +
  1169 + var inactiveResults = await inactivePerformanceQuery.ToListAsync();
  1170 + result.AddRange(inactiveResults);
  1171 +
  1172 + // 3. 按月份和业绩排序
  1173 + return result.OrderByDescending(x => x.Month).ThenByDescending(x => x.TotalPerformance).ToList();
  1174 + }
  1175 + catch (Exception ex)
  1176 + {
  1177 + _logger.LogError(ex, "查询金三角业绩统计时发生错误");
  1178 + throw NCCException.Oh(ErrorCode.COM1001, "查询金三角业绩统计失败");
  1179 + }
  1180 + }
  1181 + #endregion
1044 1182 }
1045 1183  
1046 1184 /// <summary>
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs
... ... @@ -16,6 +16,7 @@ using NCC.DataEncryption;
16 16 using NCC.Dependency;
17 17 using NCC.DynamicApiController;
18 18 using NCC.Extend.Entitys.Dto.LqTkjlb;
  19 +using NCC.Extend.Entitys.lq_event;
19 20 using NCC.Extend.Entitys.lq_eventuser;
20 21 using NCC.Extend.Entitys.lq_khxx;
21 22 using NCC.Extend.Entitys.lq_ryzl;
... ... @@ -32,7 +33,7 @@ namespace NCC.Extend.LqTkjlb
32 33 /// <summary>
33 34 /// 拓客管理服务
34 35 /// </summary>
35   - [ApiDescriptionSettings(Tag = "Extend", Name = "LqTkjlb", Order = 200)]
  36 + [ApiDescriptionSettings(Tag = "绿纤拓客管理服务", Name = "LqTkjlb", Order = 200)]
36 37 [Route("api/Extend/[controller]")]
37 38 public class LqTkjlbService : ILqTkjlbService, IDynamicApiController, ITransient
38 39 {
... ... @@ -59,9 +60,29 @@ namespace NCC.Extend.LqTkjlb
59 60 [HttpGet("{id}")]
60 61 public async Task<dynamic> GetInfo(string id)
61 62 {
62   - var entity = await _db.Queryable<LqTkjlbEntity>().FirstAsync(p => p.Id == id);
63   - var output = entity.Adapt<LqTkjlbInfoOutput>();
64   - return output;
  63 + // 使用SqlFunc在查询时直接获取用户名和活动名称
  64 + var result = await _db.Queryable<LqTkjlbEntity>()
  65 + .Where(p => p.Id == id)
  66 + .Select(p => new LqTkjlbInfoOutput
  67 + {
  68 + id = p.Id,
  69 + expansionTime = p.ExpansionTime,
  70 + expansionUserId = p.ExpansionUserId,
  71 + expansionUserName = SqlFunc.Subqueryable<UserEntity>().Where(u => u.Id == p.ExpansionUserId).Select(u => u.RealName),
  72 + customerName = p.CustomerName,
  73 + customerPhone = p.CustomerPhone,
  74 + buyNumber = p.BuyNumber,
  75 + paymentMethod = p.PaymentMethod,
  76 + isAddWeChat = p.IsAddWeChat,
  77 + remarks = p.Remarks,
  78 + storeId = p.StoreId,
  79 + teamName = p.TeamName,
  80 + eventId = p.EventId,
  81 + eventName = SqlFunc.Subqueryable<LqEventEntity>().Where(e => e.Id == p.EventId).Select(e => e.EventName),
  82 + })
  83 + .FirstAsync();
  84 +
  85 + return result;
65 86 }
66 87 #endregion
67 88  
... ... @@ -76,37 +97,39 @@ namespace NCC.Extend.LqTkjlb
76 97 public async Task<dynamic> GetList([FromQuery] LqTkjlbListQueryInput input)
77 98 {
78 99 var sidx = input.sidx == null ? "id" : input.sidx;
79   - List<string> queryTksj = input.tksj != null ? input.tksj.Split(',').ToObeject<List<string>>() : null;
  100 + List<string> queryTksj = input.expansionTime != null ? input.expansionTime.Split(',').ToObeject<List<string>>() : null;
80 101 DateTime? startTksj = queryTksj != null ? Ext.GetDateTime(queryTksj.First()) : null;
81 102 DateTime? endTksj = queryTksj != null ? Ext.GetDateTime(queryTksj.Last()) : null;
82 103 var data = await _db.Queryable<LqTkjlbEntity>()
83 104 .WhereIF(!string.IsNullOrEmpty(input.id), p => p.Id.Contains(input.id))
84   - .WhereIF(queryTksj != null, p => p.Tksj >= new DateTime(startTksj.ToDate().Year, startTksj.ToDate().Month, startTksj.ToDate().Day, 0, 0, 0))
85   - .WhereIF(queryTksj != null, p => p.Tksj <= new DateTime(endTksj.ToDate().Year, endTksj.ToDate().Month, endTksj.ToDate().Day, 23, 59, 59))
86   - .WhereIF(!string.IsNullOrEmpty(input.tkry), p => p.Tkry.Equals(input.tkry))
87   - .WhereIF(!string.IsNullOrEmpty(input.gkxm), p => p.Gkxm.Contains(input.gkxm))
88   - .WhereIF(!string.IsNullOrEmpty(input.dhhm), p => p.Dhhm.Contains(input.dhhm))
89   - .WhereIF(!string.IsNullOrEmpty(input.gmzs), p => p.Gmzs.Equals(input.gmzs))
90   - .WhereIF(!string.IsNullOrEmpty(input.zffs), p => p.Zffs.Equals(input.zffs))
91   - .WhereIF(!string.IsNullOrEmpty(input.sfjwx), p => p.Sfjwx.Equals(input.sfjwx))
92   - .WhereIF(!string.IsNullOrEmpty(input.bz), p => p.Bz.Contains(input.bz))
93   - .WhereIF(!string.IsNullOrEmpty(input.ssmd), p => p.Ssmd.Contains(input.ssmd))
94   - .WhereIF(!string.IsNullOrEmpty(input.sszd), p => p.Sszd.Contains(input.sszd))
  105 + .WhereIF(queryTksj != null, p => p.ExpansionTime >= new DateTime(startTksj.ToDate().Year, startTksj.ToDate().Month, startTksj.ToDate().Day, 0, 0, 0))
  106 + .WhereIF(queryTksj != null, p => p.ExpansionTime <= new DateTime(endTksj.ToDate().Year, endTksj.ToDate().Month, endTksj.ToDate().Day, 23, 59, 59))
  107 + .WhereIF(!string.IsNullOrEmpty(input.expansionUserId), p => p.ExpansionUserId.Equals(input.expansionUserId))
  108 + .WhereIF(!string.IsNullOrEmpty(input.customerName), p => p.CustomerName.Contains(input.customerName))
  109 + .WhereIF(!string.IsNullOrEmpty(input.customerPhone), p => p.CustomerPhone.Contains(input.customerPhone))
  110 + .WhereIF(!string.IsNullOrEmpty(input.buyNumber), p => p.BuyNumber.Equals(input.buyNumber))
  111 + .WhereIF(!string.IsNullOrEmpty(input.paymentMethod), p => p.PaymentMethod.Equals(input.paymentMethod))
  112 + .WhereIF(!string.IsNullOrEmpty(input.isAddWeChat), p => p.IsAddWeChat.Equals(input.isAddWeChat))
  113 + .WhereIF(!string.IsNullOrEmpty(input.remarks), p => p.Remarks.Contains(input.remarks))
  114 + .WhereIF(!string.IsNullOrEmpty(input.storeId), p => p.StoreId.Contains(input.storeId))
  115 + .WhereIF(!string.IsNullOrEmpty(input.teamName), p => p.TeamName.Contains(input.teamName))
  116 + .WhereIF(!string.IsNullOrEmpty(input.eventId), p => p.EventId.Contains(input.eventId))
95 117 .Select(it => new LqTkjlbListOutput
96 118 {
97 119 id = it.Id,
98   - tksj = it.Tksj,
99   - // tkry=it.Tkry,
100   - tkry = SqlFunc.Subqueryable<UserEntity>().Where(u => u.MobilePhone == it.Tkry).Select(u => u.RealName),
101   -
102   - gkxm = it.Gkxm,
103   - dhhm = it.Dhhm,
104   - gmzs = it.Gmzs,
105   - zffs = it.Zffs,
106   - sfjwx = it.Sfjwx,
107   - bz = it.Bz,
108   - ssmd = it.Ssmd,
109   - sszd = it.Sszd,
  120 + expansionTime = it.ExpansionTime,
  121 + expansionUserId = it.ExpansionUserId,
  122 + expansionUserName = SqlFunc.Subqueryable<UserEntity>().Where(u => u.MobilePhone == it.ExpansionUserId).Select(u => u.RealName),
  123 + customerName = it.CustomerName,
  124 + customerPhone = it.CustomerPhone,
  125 + buyNumber = it.BuyNumber,
  126 + paymentMethod = it.PaymentMethod,
  127 + isAddWeChat = it.IsAddWeChat,
  128 + remarks = it.Remarks,
  129 + storeId = it.StoreId,
  130 + teamName = it.TeamName,
  131 + eventId = it.EventId,
  132 + eventName = SqlFunc.Subqueryable<LqEventEntity>().Where(u => u.Id == it.EventId).Select(u => u.EventName),
110 133 })
111 134 .MergeTable()
112 135 .OrderBy(sidx + " " + input.sort)
... ... @@ -126,7 +149,7 @@ namespace NCC.Extend.LqTkjlb
126 149 {
127 150 var userInfo = await _userManager.GetUserInfo();
128 151 //通过input.dhhm去查询用户信息
129   - var user = _db.Queryable<LqKhxxEntity>().Where(u => u.Sjh == input.dhhm).Any();
  152 + var user = _db.Queryable<LqKhxxEntity>().Where(u => u.Sjh == input.customerPhone).Any();
130 153 if (user)
131 154 {
132 155 throw NCCException.Oh("该手机号码已存在于会员或线索池中");
... ... @@ -135,19 +158,27 @@ namespace NCC.Extend.LqTkjlb
135 158 var result = await _db.Ado.UseTranAsync(async () =>
136 159 {
137 160 //通过input.eventId去查询拓客活动信息
138   - var eventUserInfo = await _db.Queryable<LqEventUserEntity>().Where(u => u.EventId == input.eventId && u.UserId == input.tkry).FirstAsync();
  161 + var eventUserInfoList = await _db.Queryable<LqEventUserEntity>().Where(u => u.EventId == input.eventId && u.UserId == input.expansionUserId).ToListAsync();
  162 + if (eventUserInfoList == null || eventUserInfoList.Count == 0)
  163 + {
  164 + throw NCCException.Oh("未找到对应的拓客活动用户信息,请确认活动ID和用户ID是否正确");
  165 + }
  166 + var eventUserInfo = eventUserInfoList.First();
139 167 // 创建拓客记录
140 168 var entity = input.Adapt<LqTkjlbEntity>();
141 169 entity.Id = YitIdHelper.NextId().ToString();
142   - entity.Sszd = eventUserInfo.TeamName;
  170 + entity.TeamName = eventUserInfo.TeamName;
  171 + entity.StoreId = eventUserInfo.StoreId;
  172 + entity.DepId = eventUserInfo.DepId;
  173 + entity.ExpansionTime = DateTime.Now;
143 174 var isOk = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync();
144 175 if (!(isOk > 0))
145 176 throw NCCException.Oh("创建拓客记录失败");
146 177 // 创建客户信息
147 178 LqKhxxEntity MemberInfo = new LqKhxxEntity();
148 179 MemberInfo.Id = YitIdHelper.NextId().ToString();
149   - MemberInfo.Khmc = entity.Gkxm;
150   - MemberInfo.Sjh = input.dhhm; // 设置手机号
  180 + MemberInfo.Khmc = entity.CustomerName;
  181 + MemberInfo.Sjh = input.customerPhone; // 设置手机号
151 182 MemberInfo.Khmqgs = "线索池";
152 183 MemberInfo.Dah = "GK" + DateTime.Now.ToString("yyyyMMddHHmmss");
153 184 var memberResult = await _db.Insertable(MemberInfo).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync();
... ... @@ -173,35 +204,42 @@ namespace NCC.Extend.LqTkjlb
173 204 public async Task<dynamic> GetNoPagingList([FromQuery] LqTkjlbListQueryInput input)
174 205 {
175 206 var sidx = input.sidx == null ? "id" : input.sidx;
176   - List<string> queryTksj = input.tksj != null ? input.tksj.Split(',').ToObeject<List<string>>() : null;
177   - DateTime? startTksj = queryTksj != null ? Ext.GetDateTime(queryTksj.First()) : null;
178   - DateTime? endTksj = queryTksj != null ? Ext.GetDateTime(queryTksj.Last()) : null;
  207 + List<string> queryExpansionTime = input.expansionTime != null ? input.expansionTime.Split(',').ToObeject<List<string>>() : null;
  208 + DateTime? startExpansionTime = queryExpansionTime != null ? Ext.GetDateTime(queryExpansionTime.First()) : null;
  209 + DateTime? endExpansionTime = queryExpansionTime != null ? Ext.GetDateTime(queryExpansionTime.Last()) : null;
179 210 var data = await _db.Queryable<LqTkjlbEntity>()
180 211 .WhereIF(!string.IsNullOrEmpty(input.id), p => p.Id.Contains(input.id))
181   - .WhereIF(queryTksj != null, p => p.Tksj >= new DateTime(startTksj.ToDate().Year, startTksj.ToDate().Month, startTksj.ToDate().Day, 0, 0, 0))
182   - .WhereIF(queryTksj != null, p => p.Tksj <= new DateTime(endTksj.ToDate().Year, endTksj.ToDate().Month, endTksj.ToDate().Day, 23, 59, 59))
183   - .WhereIF(!string.IsNullOrEmpty(input.tkry), p => p.Tkry.Equals(input.tkry))
184   - .WhereIF(!string.IsNullOrEmpty(input.gkxm), p => p.Gkxm.Contains(input.gkxm))
185   - .WhereIF(!string.IsNullOrEmpty(input.dhhm), p => p.Dhhm.Contains(input.dhhm))
186   - .WhereIF(!string.IsNullOrEmpty(input.gmzs), p => p.Gmzs.Equals(input.gmzs))
187   - .WhereIF(!string.IsNullOrEmpty(input.zffs), p => p.Zffs.Equals(input.zffs))
188   - .WhereIF(!string.IsNullOrEmpty(input.sfjwx), p => p.Sfjwx.Equals(input.sfjwx))
189   - .WhereIF(!string.IsNullOrEmpty(input.bz), p => p.Bz.Contains(input.bz))
190   - .WhereIF(!string.IsNullOrEmpty(input.ssmd), p => p.Ssmd.Contains(input.ssmd))
191   - .WhereIF(!string.IsNullOrEmpty(input.sszd), p => p.Sszd.Contains(input.sszd))
  212 + .WhereIF(
  213 + queryExpansionTime != null,
  214 + p => p.ExpansionTime >= new DateTime(startExpansionTime.ToDate().Year, startExpansionTime.ToDate().Month, startExpansionTime.ToDate().Day, 0, 0, 0)
  215 + )
  216 + .WhereIF(queryExpansionTime != null, p => p.ExpansionTime <= new DateTime(endExpansionTime.ToDate().Year, endExpansionTime.ToDate().Month, endExpansionTime.ToDate().Day, 23, 59, 59))
  217 + .WhereIF(!string.IsNullOrEmpty(input.expansionUserId), p => p.ExpansionUserId.Equals(input.expansionUserId))
  218 + .WhereIF(!string.IsNullOrEmpty(input.customerName), p => p.CustomerName.Contains(input.customerName))
  219 + .WhereIF(!string.IsNullOrEmpty(input.customerPhone), p => p.CustomerPhone.Contains(input.customerPhone))
  220 + .WhereIF(!string.IsNullOrEmpty(input.buyNumber), p => p.BuyNumber.ToString().Equals(input.buyNumber))
  221 + .WhereIF(!string.IsNullOrEmpty(input.paymentMethod), p => p.PaymentMethod.Equals(input.paymentMethod))
  222 + .WhereIF(!string.IsNullOrEmpty(input.isAddWeChat), p => p.IsAddWeChat.Equals(input.isAddWeChat))
  223 + .WhereIF(!string.IsNullOrEmpty(input.remarks), p => p.Remarks.Contains(input.remarks))
  224 + .WhereIF(!string.IsNullOrEmpty(input.storeId), p => p.StoreId.Contains(input.storeId))
  225 + .WhereIF(!string.IsNullOrEmpty(input.teamName), p => p.TeamName.Contains(input.teamName))
  226 + .WhereIF(!string.IsNullOrEmpty(input.eventId), p => p.EventId.Equals(input.eventId))
192 227 .Select(it => new LqTkjlbListOutput
193 228 {
194 229 id = it.Id,
195   - tksj = it.Tksj,
196   - tkry = it.Tkry,
197   - gkxm = it.Gkxm,
198   - dhhm = it.Dhhm,
199   - gmzs = it.Gmzs,
200   - zffs = it.Zffs,
201   - sfjwx = it.Sfjwx,
202   - bz = it.Bz,
203   - ssmd = it.Ssmd,
204   - sszd = it.Sszd,
  230 + expansionTime = it.ExpansionTime,
  231 + expansionUserId = it.ExpansionUserId,
  232 + expansionUserName = it.ExpansionUserId, // 这里需要根据实际业务逻辑获取用户名
  233 + customerName = it.CustomerName,
  234 + customerPhone = it.CustomerPhone,
  235 + buyNumber = it.BuyNumber,
  236 + paymentMethod = it.PaymentMethod,
  237 + isAddWeChat = it.IsAddWeChat,
  238 + remarks = it.Remarks,
  239 + storeId = it.StoreId,
  240 + teamName = it.TeamName,
  241 + eventId = it.EventId,
  242 + eventName = it.EventId, // 这里需要根据实际业务逻辑获取活动名称
205 243 })
206 244 .MergeTable()
207 245 .OrderBy(sidx + " " + input.sort)
... ... @@ -328,10 +366,13 @@ namespace NCC.Extend.LqTkjlb
328 366 [HttpGet("Actions/GetRanking")]
329 367 public async Task<dynamic> GetRanking()
330 368 {
331   - var data = await _db.Queryable<LqTkjlbEntity>().GroupBy(it => it.Sszd).Select(it => new LqTkjlbRankingOutput { sszd = it.Sszd, tkrs = SqlFunc.AggregateCount(it.Id) }).ToListAsync();
  369 + var data = await _db.Queryable<LqTkjlbEntity>()
  370 + .GroupBy(it => it.TeamName)
  371 + .Select(it => new LqTkjlbRankingOutput { teamName = it.TeamName, expansionUserCount = SqlFunc.AggregateCount(it.Id) })
  372 + .ToListAsync();
332 373  
333 374 // 在内存中排序并添加排名
334   - var sortedData = data.OrderByDescending(it => it.tkrs).ToList();
  375 + var sortedData = data.OrderByDescending(it => it.expansionUserCount).ToList();
335 376 for (int i = 0; i < sortedData.Count; i++)
336 377 {
337 378 sortedData[i].ranking = i + 1;
... ... @@ -352,18 +393,18 @@ namespace NCC.Extend.LqTkjlb
352 393 var result = new List<LqTkjlbTeamDetailOutput>();
353 394  
354 395 // 获取所有战队
355   - var teams = await _db.Queryable<LqTkjlbEntity>().GroupBy(it => it.Sszd).Select(it => it.Sszd).ToListAsync();
  396 + var teams = await _db.Queryable<LqTkjlbEntity>().GroupBy(it => it.TeamName).Select(it => it.TeamName).ToListAsync();
356 397  
357 398 foreach (var team in teams)
358 399 {
359 400 // 获取该战队所有人员的拓客数据
360 401 var teamMembers = await _db.Queryable<LqTkjlbEntity>()
361   - .Where(it => it.Sszd == team)
362   - .GroupBy(it => it.Tkry)
  402 + .Where(it => it.TeamName == team)
  403 + .GroupBy(it => it.ExpansionUserId)
363 404 .Select(it => new
364 405 {
365 406 // tkry = it.Tkry,
366   - tkry = SqlFunc.Subqueryable<UserEntity>().Where(u => u.MobilePhone == it.Tkry).Select(u => u.RealName),
  407 + tkry = SqlFunc.Subqueryable<UserEntity>().Where(u => u.Id == it.ExpansionUserId).Select(u => u.RealName),
367 408 tkrs = SqlFunc.AggregateCount(it.Id),
368 409 })
369 410 .ToListAsync();
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqXhHyhkService.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 Microsoft.Extensions.Logging;
  8 +using NCC.ClayObject;
  9 +using NCC.Common.Configuration;
  10 +using NCC.Common.Core.Manager;
2 11 using NCC.Common.Enum;
3 12 using NCC.Common.Extension;
4 13 using NCC.Common.Filter;
  14 +using NCC.Common.Helper;
  15 +using NCC.Common.Model.NPOI;
  16 +using NCC.DataEncryption;
5 17 using NCC.Dependency;
6 18 using NCC.DynamicApiController;
7   -using NCC.FriendlyException;
8   -using NCC.Extend.Interfaces.LqXhHyhk;
9 19 using NCC.Extend.Entitys.Dto.LqXhHyhk;
10   -using Mapster;
11   -using Microsoft.AspNetCore.Mvc;
12   -using SqlSugar;
13   -using System;
14   -using System.Collections.Generic;
15   -using System.Linq;
16   -using System.Threading.Tasks;
  20 +using NCC.Extend.Entitys.Dto.LqXhJksyj;
  21 +using NCC.Extend.Entitys.Dto.LqXhKjbsyj;
  22 +using NCC.Extend.Entitys.Dto.LqXhPxmx;
  23 +using NCC.Extend.Entitys.lq_kd_kdjlb;
  24 +using NCC.Extend.Entitys.lq_kd_pxmx;
  25 +using NCC.Extend.Entitys.lq_khxx;
17 26 using NCC.Extend.Entitys.lq_xh_hyhk;
18 27 using NCC.Extend.Entitys.lq_xh_jksyj;
19 28 using NCC.Extend.Entitys.lq_xh_kjbsyj;
20 29 using NCC.Extend.Entitys.lq_xh_pxmx;
21   -using NCC.Extend.Entitys.lq_kd_pxmx;
22   -using NCC.Extend.Entitys.lq_kd_kdjlb;
23   -using NCC.Extend.Entitys.lq_khxx;
24   -using Microsoft.Extensions.Logging;
25   -using Yitter.IdGenerator;
26   -using NCC.Common.Helper;
  30 +using NCC.Extend.Interfaces.LqXhHyhk;
  31 +using NCC.FriendlyException;
27 32 using NCC.JsonSerialization;
28   -using NCC.Common.Model.NPOI;
29   -using NCC.Common.Configuration;
30   -using NCC.DataEncryption;
31   -using NCC.ClayObject;
32   -using NCC.Extend.Entitys.Dto.LqXhJksyj;
33   -using NCC.Extend.Entitys.Dto.LqXhKjbsyj;
34   -using NCC.Extend.Entitys.Dto.LqXhPxmx;
  33 +using SqlSugar;
  34 +using Yitter.IdGenerator;
35 35  
36 36 namespace NCC.Extend.LqXhHyhk
37 37 {
... ... @@ -59,7 +59,8 @@ namespace NCC.Extend.LqXhHyhk
59 59 ISqlSugarRepository<LqXhKjbsyjEntity> lqXhKjbsyjRepository,
60 60 ISqlSugarRepository<LqXhPxmxEntity> lqXhPxmxRepository,
61 61 IUserManager userManager,
62   - ILogger<LqXhHyhkService> logger)
  62 + ILogger<LqXhHyhkService> logger
  63 + )
63 64 {
64 65 _lqXhHyhkRepository = lqXhHyhkRepository;
65 66 _db = _lqXhHyhkRepository.Context;
... ... @@ -77,7 +78,7 @@ namespace NCC.Extend.LqXhHyhk
77 78 /// <remarks>
78 79 /// 获取耗卡记录及其关联的品项明细、健康师业绩、科技部老师业绩信息
79 80 /// 按照耗卡的完整格式返回数据,不包含汇总信息
80   - ///
  81 + ///
81 82 /// 返回数据结构:
82 83 /// - 主表信息:耗卡基础信息、门店信息、会员信息等
83 84 /// - 品项明细列表:每个品项包含完整的项目信息(项目次数、是否有效、来源类型等)
... ... @@ -104,19 +105,13 @@ namespace NCC.Extend.LqXhHyhk
104 105 var output = entity.Adapt<LqXhHyhkInfoOutput>();
105 106  
106 107 // 2. 查询品项明细列表
107   - var lqXhPxmxList = await _db.Queryable<LqXhPxmxEntity>()
108   - .Where(w => w.Glkdbh == entity.Id)
109   - .ToListAsync();
  108 + var lqXhPxmxList = await _db.Queryable<LqXhPxmxEntity>().Where(w => w.ConsumeInfoId == entity.Id).ToListAsync();
110 109  
111 110 // 3. 查询健康师业绩列表
112   - var lqXhJksyjList = await _db.Queryable<LqXhJksyjEntity>()
113   - .Where(w => w.Glkdbh == entity.Id)
114   - .ToListAsync();
  111 + var lqXhJksyjList = await _db.Queryable<LqXhJksyjEntity>().Where(w => w.Glkdbh == entity.Id).ToListAsync();
115 112  
116 113 // 4. 查询科技部老师业绩列表
117   - var lqXhKjbsyjList = await _db.Queryable<LqXhKjbsyjEntity>()
118   - .Where(w => w.Glkdbh == entity.Id)
119   - .ToListAsync();
  114 + var lqXhKjbsyjList = await _db.Queryable<LqXhKjbsyjEntity>().Where(w => w.Glkdbh == entity.Id).ToListAsync();
120 115  
121 116 // 5. 构建品项明细输出,每个品项关联对应的业绩信息
122 117 var pxmxOutputList = new List<LqXhPxmxInfoOutput>();
... ... @@ -125,17 +120,17 @@ namespace NCC.Extend.LqXhHyhk
125 120 var pxmxOutput = new LqXhPxmxInfoOutput
126 121 {
127 122 id = pxmx.Id,
128   - glkdbh = pxmx.Glkdbh,
  123 + consumeInfoId = pxmx.ConsumeInfoId,
  124 + billingItemId = pxmx.BillingItemId,
129 125 px = pxmx.Px,
130 126 pxmc = pxmx.Pxmc,
131 127 pxjg = pxmx.Pxjg,
132   - xfzs = pxmx.Xfzs,
133 128 memberId = pxmx.MemberId,
134 129 createTime = pxmx.CreateTIme,
135 130 projectNumber = pxmx.ProjectNumber,
136 131 isEnabled = pxmx.IsEnabled,
137 132 sourceType = pxmx.SourceType,
138   - totalPrice = pxmx.TotalPrice
  133 + totalPrice = pxmx.TotalPrice,
139 134 };
140 135  
141 136 // 关联该品项的健康师业绩
... ... @@ -209,7 +204,10 @@ namespace NCC.Extend.LqXhHyhk
209 204 sfykjb = it.Sfykjb,
210 205 hksj = it.Hksj,
211 206 czry = it.Czry,
212   - }).MergeTable().OrderBy(sidx + " " + input.sort).ToPagedListAsync(input.currentPage, input.pageSize);
  207 + })
  208 + .MergeTable()
  209 + .OrderBy(sidx + " " + input.sort)
  210 + .ToPagedListAsync(input.currentPage, input.pageSize);
213 211 return PageResult<LqXhHyhkListOutput>.SqlSugarPageResult(data);
214 212 }
215 213 #endregion
... ... @@ -220,7 +218,7 @@ namespace NCC.Extend.LqXhHyhk
220 218 /// </summary>
221 219 /// <remarks>
222 220 /// 创建会员耗卡记录及其关联的品项明细、健康师业绩、科技部老师业绩信息
223   - ///
  221 + ///
224 222 /// 示例请求:
225 223 /// ```json
226 224 /// {
... ... @@ -245,7 +243,7 @@ namespace NCC.Extend.LqXhHyhk
245 243 /// ]
246 244 /// }
247 245 /// ```
248   - ///
  246 + ///
249 247 /// 参数说明:
250 248 /// - hyid: 会员ID
251 249 /// - hkmd: 耗卡门店
... ... @@ -262,8 +260,8 @@ namespace NCC.Extend.LqXhHyhk
262 260 var userInfo = await _userManager.GetUserInfo();
263 261 var entity = input.Adapt<LqXhHyhkEntity>();
264 262 entity.Id = YitIdHelper.NextId().ToString();
265   - entity.Hksj = DateTime.Now;
266 263 entity.Czry = _userManager.UserId;
  264 + entity.CreateTime = DateTime.Now;
267 265 try
268 266 {
269 267 // 开启事务
... ... @@ -283,7 +281,8 @@ namespace NCC.Extend.LqXhHyhk
283 281 var lqXhPxmxEntity = new LqXhPxmxEntity
284 282 {
285 283 Id = YitIdHelper.NextId().ToString(),
286   - Glkdbh = newEntity.Id,
  284 + ConsumeInfoId = newEntity.Id,
  285 + BillingItemId = item.billingItemId,
287 286 CreateTIme = DateTime.Now,
288 287 MemberId = entity.Hy,
289 288 IsEnabled = 0,
... ... @@ -292,51 +291,54 @@ namespace NCC.Extend.LqXhHyhk
292 291 Px = item.px,
293 292 Pxmc = item.pxmc,
294 293 Pxjg = item.pxjg,
295   - Xfzs = item.xfzs,
296 294 SourceType = item.sourceType,
297 295 };
298 296 allPxmxEntities.Add(lqXhPxmxEntity);
299   -
  297 +
300 298 // 收集该品项关联的健康师业绩
301 299 if (item.lqXhJksyjList != null && item.lqXhJksyjList.Any())
302 300 {
303 301 foreach (var ijks_tem in item.lqXhJksyjList)
304 302 {
305   - allJksyjEntities.Add(new LqXhJksyjEntity
306   - {
307   - Id = YitIdHelper.NextId().ToString(),
308   - Glkdbh = newEntity.Id,
309   - Jks = ijks_tem.jks,
310   - Jksxm = ijks_tem.jksxm,
311   - Jkszh = ijks_tem.jkszh,
312   - Jksyj = ijks_tem.jksyj,
313   - Yjsj = DateTime.Now,
314   - JsjId = ijks_tem.jsjId,
315   - Kdpxid = lqXhPxmxEntity.Id,
316   - LaborCost = ijks_tem.laborCost,
317   - KdpxNumber = ijks_tem.kdpxNumber,
318   - });
  303 + allJksyjEntities.Add(
  304 + new LqXhJksyjEntity
  305 + {
  306 + Id = YitIdHelper.NextId().ToString(),
  307 + Glkdbh = newEntity.Id,
  308 + Jks = ijks_tem.jks,
  309 + Jksxm = ijks_tem.jksxm,
  310 + Jkszh = ijks_tem.jkszh,
  311 + Jksyj = ijks_tem.jksyj,
  312 + Yjsj = DateTime.Now,
  313 + JsjId = ijks_tem.jsjId,
  314 + Kdpxid = lqXhPxmxEntity.Id,
  315 + LaborCost = ijks_tem.laborCost,
  316 + KdpxNumber = ijks_tem.kdpxNumber,
  317 + }
  318 + );
319 319 }
320 320 }
321   -
  321 +
322 322 // 收集该品项关联的科技部老师业绩
323 323 if (item.lqXhKjbsyjList != null && item.lqXhKjbsyjList.Any())
324 324 {
325 325 foreach (var ikjbs_tem in item.lqXhKjbsyjList)
326 326 {
327   - allKjbsyjEntities.Add(new LqXhKjbsyjEntity
328   - {
329   - Id = YitIdHelper.NextId().ToString(),
330   - Glkdbh = newEntity.Id,
331   - Kjbls = ikjbs_tem.kjbls,
332   - Kjblsxm = ikjbs_tem.kjblsxm,
333   - Kjblszh = ikjbs_tem.kjblszh,
334   - Kjblsyj = ikjbs_tem.kjblsyj,
335   - Yjsj = DateTime.Now,
336   - Hkpxid = lqXhPxmxEntity.Id,
337   - LaborCost = ikjbs_tem.laborCost,
338   - HdpxNumber = ikjbs_tem.hdpxNumber,
339   - });
  327 + allKjbsyjEntities.Add(
  328 + new LqXhKjbsyjEntity
  329 + {
  330 + Id = YitIdHelper.NextId().ToString(),
  331 + Glkdbh = newEntity.Id,
  332 + Kjbls = ikjbs_tem.kjbls,
  333 + Kjblsxm = ikjbs_tem.kjblsxm,
  334 + Kjblszh = ikjbs_tem.kjblszh,
  335 + Kjblsyj = ikjbs_tem.kjblsyj,
  336 + Yjsj = DateTime.Now,
  337 + Hkpxid = lqXhPxmxEntity.Id,
  338 + LaborCost = ikjbs_tem.laborCost,
  339 + HdpxNumber = ikjbs_tem.hdpxNumber,
  340 + }
  341 + );
340 342 }
341 343 }
342 344 }
... ... @@ -413,7 +415,10 @@ namespace NCC.Extend.LqXhHyhk
413 415 sfykjb = it.Sfykjb,
414 416 hksj = it.Hksj,
415 417 czry = it.Czry,
416   - }).MergeTable().OrderBy(sidx + " " + input.sort).ToListAsync();
  418 + })
  419 + .MergeTable()
  420 + .OrderBy(sidx + " " + input.sort)
  421 + .ToListAsync();
417 422 return data;
418 423 }
419 424 #endregion
... ... @@ -438,7 +443,8 @@ namespace NCC.Extend.LqXhHyhk
438 443 {
439 444 exportData = await this.GetNoPagingList(input);
440 445 }
441   - List<ParamsModel> paramList = "[{\"value\":\"耗卡编号\",\"field\":\"id\"},{\"value\":\"门店\",\"field\":\"md\"},{\"value\":\"门店编号\",\"field\":\"mdbh\"},{\"value\":\"门店名称\",\"field\":\"mdmc\"},{\"value\":\"会员\",\"field\":\"hy\"},{\"value\":\"会员账号\",\"field\":\"hyzh\"},{\"value\":\"会员名称\",\"field\":\"hymc\"},{\"value\":\"顾客类型\",\"field\":\"gklx\"},{\"value\":\"消费金额\",\"field\":\"xfje\"},{\"value\":\"手工费用\",\"field\":\"sgfy\"},{\"value\":\"是否有科技部\",\"field\":\"sfykjb\"},{\"value\":\"耗卡时间\",\"field\":\"hksj\"},{\"value\":\"操作人员\",\"field\":\"czry\"},]".ToList<ParamsModel>();
  446 + List<ParamsModel> paramList =
  447 + "[{\"value\":\"耗卡编号\",\"field\":\"id\"},{\"value\":\"门店\",\"field\":\"md\"},{\"value\":\"门店编号\",\"field\":\"mdbh\"},{\"value\":\"门店名称\",\"field\":\"mdmc\"},{\"value\":\"会员\",\"field\":\"hy\"},{\"value\":\"会员账号\",\"field\":\"hyzh\"},{\"value\":\"会员名称\",\"field\":\"hymc\"},{\"value\":\"顾客类型\",\"field\":\"gklx\"},{\"value\":\"消费金额\",\"field\":\"xfje\"},{\"value\":\"手工费用\",\"field\":\"sgfy\"},{\"value\":\"是否有科技部\",\"field\":\"sfykjb\"},{\"value\":\"耗卡时间\",\"field\":\"hksj\"},{\"value\":\"操作人员\",\"field\":\"czry\"},]".ToList<ParamsModel>();
442 448 ExcelConfig excelconfig = new ExcelConfig();
443 449 excelconfig.FileName = "会员耗卡.xls";
444 450 excelconfig.HeadFont = "微软雅黑";
... ... @@ -457,11 +463,7 @@ namespace NCC.Extend.LqXhHyhk
457 463 var addPath = FileVariable.TemporaryFilePath + excelconfig.FileName;
458 464 ExcelExportHelper<LqXhHyhkListOutput>.Export(exportData, excelconfig, addPath);
459 465 var fileName = _userManager.UserId + "|" + addPath + "|xls";
460   - var output = new
461   - {
462   - name = excelconfig.FileName,
463   - url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fileName, "NCC")
464   - };
  466 + var output = new { name = excelconfig.FileName, url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fileName, "NCC") };
465 467 return output;
466 468 }
467 469 #endregion
... ... @@ -492,7 +494,7 @@ namespace NCC.Extend.LqXhHyhk
492 494 await _db.Deleteable<LqXhKjbsyjEntity>().In(u => u.Glkdbh, ids).ExecuteCommandAsync();
493 495  
494 496 //清空子表数据
495   - await _db.Deleteable<LqXhPxmxEntity>().In(u => u.Glkdbh, ids).ExecuteCommandAsync();
  497 + await _db.Deleteable<LqXhPxmxEntity>().In(u => u.ConsumeInfoId, ids).ExecuteCommandAsync();
496 498 //关闭事务
497 499 _db.CommitTran();
498 500 }
... ... @@ -521,7 +523,7 @@ namespace NCC.Extend.LqXhHyhk
521 523 {
522 524 //开启事务
523 525 _db.BeginTran();
524   -
  526 + entity.UpdateTime = DateTime.Now;
525 527 //更新会员耗卡记录
526 528 await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
527 529  
... ... @@ -530,7 +532,7 @@ namespace NCC.Extend.LqXhHyhk
530 532 await _db.Deleteable<LqXhKjbsyjEntity>().Where(u => u.Glkdbh == id).ExecuteCommandAsync();
531 533  
532 534 //清空原有数据
533   - await _db.Deleteable<LqXhPxmxEntity>().Where(u => u.Glkdbh == id).ExecuteCommandAsync();
  535 + await _db.Deleteable<LqXhPxmxEntity>().Where(u => u.ConsumeInfoId == id).ExecuteCommandAsync();
534 536  
535 537 // 收集所有需要插入的实体,然后批量插入
536 538 var allPxmxEntities = new List<LqXhPxmxEntity>();
... ... @@ -546,7 +548,8 @@ namespace NCC.Extend.LqXhHyhk
546 548 var lqXhPxmxEntity = new LqXhPxmxEntity
547 549 {
548 550 Id = YitIdHelper.NextId().ToString(),
549   - Glkdbh = entity.Id,
  551 + ConsumeInfoId = entity.Id,
  552 + BillingItemId = item.billingItemId,
550 553 CreateTIme = DateTime.Now,
551 554 MemberId = entity.Hy,
552 555 IsEnabled = 0,
... ... @@ -555,51 +558,54 @@ namespace NCC.Extend.LqXhHyhk
555 558 Px = item.px,
556 559 Pxmc = item.pxmc,
557 560 Pxjg = item.pxjg,
558   - Xfzs = item.xfzs,
559 561 SourceType = item.sourceType,
560 562 };
561 563 allPxmxEntities.Add(lqXhPxmxEntity);
562   -
  564 +
563 565 // 收集该品项关联的健康师业绩
564 566 if (item.lqXhJksyjList != null && item.lqXhJksyjList.Any())
565 567 {
566 568 foreach (var ijks_tem in item.lqXhJksyjList)
567 569 {
568   - allJksyjEntities.Add(new LqXhJksyjEntity
569   - {
570   - Id = YitIdHelper.NextId().ToString(),
571   - Glkdbh = entity.Id,
572   - Jks = ijks_tem.jks,
573   - Jksxm = ijks_tem.jksxm,
574   - Jkszh = ijks_tem.jkszh,
575   - Jksyj = ijks_tem.jksyj,
576   - Yjsj = DateTime.Now,
577   - JsjId = ijks_tem.jsjId,
578   - Kdpxid = lqXhPxmxEntity.Id,
579   - LaborCost = ijks_tem.laborCost,
580   - KdpxNumber = ijks_tem.kdpxNumber,
581   - });
  570 + allJksyjEntities.Add(
  571 + new LqXhJksyjEntity
  572 + {
  573 + Id = YitIdHelper.NextId().ToString(),
  574 + Glkdbh = entity.Id,
  575 + Jks = ijks_tem.jks,
  576 + Jksxm = ijks_tem.jksxm,
  577 + Jkszh = ijks_tem.jkszh,
  578 + Jksyj = ijks_tem.jksyj,
  579 + Yjsj = DateTime.Now,
  580 + JsjId = ijks_tem.jsjId,
  581 + Kdpxid = lqXhPxmxEntity.Id,
  582 + LaborCost = ijks_tem.laborCost,
  583 + KdpxNumber = ijks_tem.kdpxNumber,
  584 + }
  585 + );
582 586 }
583 587 }
584   -
  588 +
585 589 // 收集该品项关联的科技部老师业绩
586 590 if (item.lqXhKjbsyjList != null && item.lqXhKjbsyjList.Any())
587 591 {
588 592 foreach (var ikjbs_tem in item.lqXhKjbsyjList)
589 593 {
590   - allKjbsyjEntities.Add(new LqXhKjbsyjEntity
591   - {
592   - Id = YitIdHelper.NextId().ToString(),
593   - Glkdbh = entity.Id,
594   - Kjbls = ikjbs_tem.kjbls,
595   - Kjblsxm = ikjbs_tem.kjblsxm,
596   - Kjblszh = ikjbs_tem.kjblszh,
597   - Kjblsyj = ikjbs_tem.kjblsyj,
598   - Yjsj = DateTime.Now,
599   - Hkpxid = lqXhPxmxEntity.Id,
600   - LaborCost = ikjbs_tem.laborCost,
601   - HdpxNumber = ikjbs_tem.hdpxNumber,
602   - });
  594 + allKjbsyjEntities.Add(
  595 + new LqXhKjbsyjEntity
  596 + {
  597 + Id = YitIdHelper.NextId().ToString(),
  598 + Glkdbh = entity.Id,
  599 + Kjbls = ikjbs_tem.kjbls,
  600 + Kjblsxm = ikjbs_tem.kjblsxm,
  601 + Kjblszh = ikjbs_tem.kjblszh,
  602 + Kjblsyj = ikjbs_tem.kjblsyj,
  603 + Yjsj = DateTime.Now,
  604 + Hkpxid = lqXhPxmxEntity.Id,
  605 + LaborCost = ikjbs_tem.laborCost,
  606 + HdpxNumber = ikjbs_tem.hdpxNumber,
  607 + }
  608 + );
603 609 }
604 610 }
605 611 }
... ... @@ -658,7 +664,7 @@ namespace NCC.Extend.LqXhHyhk
658 664 await _db.Deleteable<LqXhKjbsyjEntity>().Where(u => u.Glkdbh == id).ExecuteCommandAsync();
659 665  
660 666 //清空子表数据
661   - await _db.Deleteable<LqXhPxmxEntity>().Where(u => u.Glkdbh == id).ExecuteCommandAsync();
  667 + await _db.Deleteable<LqXhPxmxEntity>().Where(u => u.ConsumeInfoId == id).ExecuteCommandAsync();
662 668  
663 669 //关闭事务
664 670 _db.CommitTran();
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqXhmxbService.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.LqXhmxb;
  19 +using NCC.Extend.Entitys.lq_xhmxb;
8 20 using NCC.Extend.Interfaces.LqXhmxb;
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_xhmxb;
17   -using NCC.Extend.Entitys.Dto.LqXhmxb;
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.LqXhmxb
27 27 {
28 28 /// <summary>
29 29 /// 消耗明细表服务
30 30 /// </summary>
31   - [ApiDescriptionSettings(Tag = "Extend",Name = "LqXhmxb", Order = 200)]
  31 + [ApiDescriptionSettings(Tag = "Extend", Name = "LqXhmxb", Order = 200)]
32 32 [Route("api/Extend/[controller]")]
33 33 public class LqXhmxbService : ILqXhmxbService, IDynamicApiController, ITransient
34 34 {
... ... @@ -39,11 +39,9 @@ namespace NCC.Extend.LqXhmxb
39 39 /// <summary>
40 40 /// 初始化一个<see cref="LqXhmxbService"/>类型的新实例
41 41 /// </summary>
42   - public LqXhmxbService(
43   - ISqlSugarRepository<LqXhmxbEntity> lqXhmxbRepository,
44   - IUserManager userManager)
  42 + public LqXhmxbService(ISqlSugarRepository<LqXhmxbEntity> lqXhmxbRepository, IUserManager userManager)
45 43 {
46   - _lqXhmxbRepository = lqXhmxbRepository;
  44 + _lqXhmxbRepository = lqXhmxbRepository;
47 45 _db = _lqXhmxbRepository.Context;
48 46 _userManager = userManager;
49 47 }
... ... @@ -62,10 +60,10 @@ namespace NCC.Extend.LqXhmxb
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] LqXhmxbListQueryInput input)
71 69 {
... ... @@ -85,24 +83,27 @@ namespace NCC.Extend.LqXhmxb
85 83 .WhereIF(!string.IsNullOrEmpty(input.qtsg2), p => p.Qtsg2.Contains(input.qtsg2))
86 84 .WhereIF(!string.IsNullOrEmpty(input.qtsg3), p => p.Qtsg3.Contains(input.qtsg3))
87 85 .WhereIF(!string.IsNullOrEmpty(input.sghj), p => p.Sghj.Contains(input.sghj))
88   - .Select(it=> new LqXhmxbListOutput
  86 + .Select(it => new LqXhmxbListOutput
89 87 {
90 88 id = it.Id,
91   - mdbh=it.Mdbh,
92   - mdmc=it.Mdmc,
93   - bmbh=it.Bmbh,
94   - bmmc=it.Bmmc,
95   - ygbh=it.Ygbh,
96   - ygmc=it.Ygmc,
97   - xms=it.Xms,
98   - xh=it.Xh,
99   - sg=it.Sg,
100   - qtsg1=it.Qtsg1,
101   - qtsg2=it.Qtsg2,
102   - qtsg3=it.Qtsg3,
103   - sghj=it.Sghj,
104   - }).MergeTable().OrderBy(sidx+" "+input.sort).ToPagedListAsync(input.currentPage, input.pageSize);
105   - return PageResult<LqXhmxbListOutput>.SqlSugarPageResult(data);
  89 + mdbh = it.Mdbh,
  90 + mdmc = it.Mdmc,
  91 + bmbh = it.Bmbh,
  92 + bmmc = it.Bmmc,
  93 + ygbh = it.Ygbh,
  94 + ygmc = it.Ygmc,
  95 + xms = it.Xms,
  96 + xh = it.Xh,
  97 + sg = it.Sg,
  98 + qtsg1 = it.Qtsg1,
  99 + qtsg2 = it.Qtsg2,
  100 + qtsg3 = it.Qtsg3,
  101 + sghj = it.Sghj,
  102 + })
  103 + .MergeTable()
  104 + .OrderBy(sidx + " " + input.sort)
  105 + .ToPagedListAsync(input.currentPage, input.pageSize);
  106 + return PageResult<LqXhmxbListOutput>.SqlSugarPageResult(data);
106 107 }
107 108  
108 109 /// <summary>
... ... @@ -117,14 +118,15 @@ namespace NCC.Extend.LqXhmxb
117 118 var entity = input.Adapt<LqXhmxbEntity>();
118 119 entity.Id = YitIdHelper.NextId().ToString();
119 120 var isOk = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync();
120   - if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1000);
  121 + if (!(isOk > 0))
  122 + throw NCCException.Oh(ErrorCode.COM1000);
121 123 }
122 124  
123 125 /// <summary>
124   - /// 获取消耗明细表无分页列表
125   - /// </summary>
126   - /// <param name="input">请求参数</param>
127   - /// <returns></returns>
  126 + /// 获取消耗明细表无分页列表
  127 + /// </summary>
  128 + /// <param name="input">请求参数</param>
  129 + /// <returns></returns>
128 130 [NonAction]
129 131 public async Task<dynamic> GetNoPagingList([FromQuery] LqXhmxbListQueryInput input)
130 132 {
... ... @@ -144,31 +146,34 @@ namespace NCC.Extend.LqXhmxb
144 146 .WhereIF(!string.IsNullOrEmpty(input.qtsg2), p => p.Qtsg2.Contains(input.qtsg2))
145 147 .WhereIF(!string.IsNullOrEmpty(input.qtsg3), p => p.Qtsg3.Contains(input.qtsg3))
146 148 .WhereIF(!string.IsNullOrEmpty(input.sghj), p => p.Sghj.Contains(input.sghj))
147   - .Select(it=> new LqXhmxbListOutput
  149 + .Select(it => new LqXhmxbListOutput
148 150 {
149 151 id = it.Id,
150   - mdbh=it.Mdbh,
151   - mdmc=it.Mdmc,
152   - bmbh=it.Bmbh,
153   - bmmc=it.Bmmc,
154   - ygbh=it.Ygbh,
155   - ygmc=it.Ygmc,
156   - xms=it.Xms,
157   - xh=it.Xh,
158   - sg=it.Sg,
159   - qtsg1=it.Qtsg1,
160   - qtsg2=it.Qtsg2,
161   - qtsg3=it.Qtsg3,
162   - sghj=it.Sghj,
163   - }).MergeTable().OrderBy(sidx+" "+input.sort).ToListAsync();
164   - return data;
  152 + mdbh = it.Mdbh,
  153 + mdmc = it.Mdmc,
  154 + bmbh = it.Bmbh,
  155 + bmmc = it.Bmmc,
  156 + ygbh = it.Ygbh,
  157 + ygmc = it.Ygmc,
  158 + xms = it.Xms,
  159 + xh = it.Xh,
  160 + sg = it.Sg,
  161 + qtsg1 = it.Qtsg1,
  162 + qtsg2 = it.Qtsg2,
  163 + qtsg3 = it.Qtsg3,
  164 + sghj = it.Sghj,
  165 + })
  166 + .MergeTable()
  167 + .OrderBy(sidx + " " + input.sort)
  168 + .ToListAsync();
  169 + return data;
165 170 }
166 171  
167 172 /// <summary>
168   - /// 导出消耗明细表
169   - /// </summary>
170   - /// <param name="input">请求参数</param>
171   - /// <returns></returns>
  173 + /// 导出消耗明细表
  174 + /// </summary>
  175 + /// <param name="input">请求参数</param>
  176 + /// <returns></returns>
172 177 [HttpGet("Actions/Export")]
173 178 public async Task<dynamic> Export([FromQuery] LqXhmxbListQueryInput input)
174 179 {
... ... @@ -183,7 +188,8 @@ namespace NCC.Extend.LqXhmxb
183 188 {
184 189 exportData = await this.GetNoPagingList(input);
185 190 }
186   - List<ParamsModel> paramList = "[{\"value\":\"消耗编号\",\"field\":\"id\"},{\"value\":\"门店编号\",\"field\":\"mdbh\"},{\"value\":\"门店名称\",\"field\":\"mdmc\"},{\"value\":\"部门编号\",\"field\":\"bmbh\"},{\"value\":\"部门名称\",\"field\":\"bmmc\"},{\"value\":\"员工编号\",\"field\":\"ygbh\"},{\"value\":\"员工名称\",\"field\":\"ygmc\"},{\"value\":\"项目数\",\"field\":\"xms\"},{\"value\":\"消耗\",\"field\":\"xh\"},{\"value\":\"手工\",\"field\":\"sg\"},{\"value\":\"其它手工1\",\"field\":\"qtsg1\"},{\"value\":\"其它手工2\",\"field\":\"qtsg2\"},{\"value\":\"其它手工3\",\"field\":\"qtsg3\"},{\"value\":\"手工合计\",\"field\":\"sghj\"},]".ToList<ParamsModel>();
  191 + List<ParamsModel> paramList =
  192 + "[{\"value\":\"消耗编号\",\"field\":\"id\"},{\"value\":\"门店编号\",\"field\":\"mdbh\"},{\"value\":\"门店名称\",\"field\":\"mdmc\"},{\"value\":\"部门编号\",\"field\":\"bmbh\"},{\"value\":\"部门名称\",\"field\":\"bmmc\"},{\"value\":\"员工编号\",\"field\":\"ygbh\"},{\"value\":\"员工名称\",\"field\":\"ygmc\"},{\"value\":\"项目数\",\"field\":\"xms\"},{\"value\":\"消耗\",\"field\":\"xh\"},{\"value\":\"手工\",\"field\":\"sg\"},{\"value\":\"其它手工1\",\"field\":\"qtsg1\"},{\"value\":\"其它手工2\",\"field\":\"qtsg2\"},{\"value\":\"其它手工3\",\"field\":\"qtsg3\"},{\"value\":\"手工合计\",\"field\":\"sghj\"},]".ToList<ParamsModel>();
187 193 ExcelConfig excelconfig = new ExcelConfig();
188 194 excelconfig.FileName = "消耗明细表.xls";
189 195 excelconfig.HeadFont = "微软雅黑";
... ... @@ -202,11 +208,7 @@ namespace NCC.Extend.LqXhmxb
202 208 var addPath = FileVariable.TemporaryFilePath + excelconfig.FileName;
203 209 ExcelExportHelper<LqXhmxbListOutput>.Export(exportData, excelconfig, addPath);
204 210 var fileName = _userManager.UserId + "|" + addPath + "|xls";
205   - var output = new
206   - {
207   - name = excelconfig.FileName,
208   - url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fileName, "NCC")
209   - };
  211 + var output = new { name = excelconfig.FileName, url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fileName, "NCC") };
210 212 return output;
211 213 }
212 214  
... ... @@ -226,7 +228,7 @@ namespace NCC.Extend.LqXhmxb
226 228 //开启事务
227 229 _db.BeginTran();
228 230 //批量删除消耗明细表
229   - await _db.Deleteable<LqXhmxbEntity>().In(d => d.Id,ids).ExecuteCommandAsync();
  231 + await _db.Deleteable<LqXhmxbEntity>().In(d => d.Id, ids).ExecuteCommandAsync();
230 232 //关闭事务
231 233 _db.CommitTran();
232 234 }
... ... @@ -250,7 +252,8 @@ namespace NCC.Extend.LqXhmxb
250 252 {
251 253 var entity = input.Adapt<LqXhmxbEntity>();
252 254 var isOk = await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
253   - if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1001);
  255 + if (!(isOk > 0))
  256 + throw NCCException.Oh(ErrorCode.COM1001);
254 257 }
255 258  
256 259 /// <summary>
... ... @@ -263,7 +266,8 @@ namespace NCC.Extend.LqXhmxb
263 266 var entity = await _db.Queryable<LqXhmxbEntity>().FirstAsync(p => p.Id == id);
264 267 _ = entity ?? throw NCCException.Oh(ErrorCode.COM1005);
265 268 var isOk = await _db.Deleteable<LqXhmxbEntity>().Where(d => d.Id == id).ExecuteCommandAsync();
266   - if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1002);
  269 + if (!(isOk > 0))
  270 + throw NCCException.Oh(ErrorCode.COM1002);
267 271 }
268 272 }
269 273 }
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs
1 1 using System;
2 2 using System.Collections.Generic;
  3 +using System.ComponentModel.DataAnnotations;
3 4 using System.Globalization;
4 5 using System.Linq;
5 6 using System.Threading.Tasks;
... ... @@ -81,7 +82,7 @@ namespace NCC.Extend.LqYcsdJsj
81 82 var output = entity.Adapt<LqYcsdJsjInfoOutput>();
82 83  
83 84 // 获取成员信息
84   - var members = await _db.Queryable<LqJinsanjiaoUserEntity>()
  85 + var members = await _db.Queryable<NCC.Extend.Entitys.lq_jinsanjiao_user.LqJinsanjiaoUserEntity>()
85 86 .Where(x => x.JsjId == id && x.Status == "ACTIVE")
86 87 .OrderBy(x => x.SortOrder)
87 88 .Select(x => new
... ... @@ -194,6 +195,81 @@ namespace NCC.Extend.LqYcsdJsj
194 195 }
195 196 #endregion
196 197  
  198 + #region 根据用户和月份获取金三角信息
  199 + /// <summary>
  200 + /// 根据用户和时间获取金三角信息
  201 + /// </summary>
  202 + /// <remarks>
  203 + /// 根据指定的用户ID和时间,从时间中提取月份,查询该用户在该月份的金三角信息。
  204 + ///
  205 + /// 示例请求:
  206 + /// GET /api/Extend/LqYcsdJsj/GetJsjInfoByUserMonth?userId=123456&amp;dateTime=2024-12-15%2014:30:00
  207 + ///
  208 + /// 参数说明:
  209 + /// - userId: 用户ID,必填
  210 + /// - dateTime: 时间,格式为yyyy-MM-dd HH:mm:ss,必填
  211 + ///
  212 + /// 返回信息包括:
  213 + /// - 金三角基本信息(ID、名称、月份)
  214 + /// - 门店信息(ID、名称)
  215 + /// - 用户信息(ID、姓名、是否顾问、状态、排序)
  216 + /// </remarks>
  217 + /// <param name="input">查询参数</param>
  218 + /// <returns>金三角信息</returns>
  219 + /// <response code="200">查询成功</response>
  220 + /// <response code="400">参数错误</response>
  221 + /// <response code="404">未找到相关数据</response>
  222 + [HttpGet("GetJsjInfoByUserMonth")]
  223 + public async Task<LqYcsdJsjByUserMonthOutput> GetJsjInfoByUserMonth([FromQuery] LqYcsdJsjByUserMonthInput input)
  224 + {
  225 + if (string.IsNullOrEmpty(input.UserId))
  226 + {
  227 + throw NCCException.Oh(ErrorCode.COM1001, "用户ID不能为空");
  228 + }
  229 +
  230 + if (input.DateTime == default(DateTime))
  231 + {
  232 + throw NCCException.Oh(ErrorCode.COM1001, "时间不能为空");
  233 + }
  234 +
  235 + // 从时间中提取月份(格式:yyyyMM)
  236 + var month = input.DateTime.ToString("yyyyMM");
  237 +
  238 + // 先查询用户的金三角关联信息
  239 + var jsjUser = await _db.Queryable<NCC.Extend.Entitys.lq_jinsanjiao_user.LqJinsanjiaoUserEntity>().Where(x => x.UserId == input.UserId && x.DeleteMark == 0).FirstAsync();
  240 +
  241 + if (jsjUser == null)
  242 + {
  243 + return null;
  244 + }
  245 +
  246 + // 查询金三角信息
  247 + var jsj = await _db.Queryable<LqYcsdJsjEntity>().Where(x => x.Id == jsjUser.JsjId && x.Yf == month).FirstAsync();
  248 +
  249 + if (jsj == null)
  250 + {
  251 + return null;
  252 + }
  253 +
  254 + // 查询门店信息
  255 + var store = await _db.Queryable<LqMdxxEntity>().Where(x => x.Id == jsj.Md).FirstAsync();
  256 +
  257 + return new LqYcsdJsjByUserMonthOutput
  258 + {
  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,
  269 + };
  270 + }
  271 + #endregion
  272 +
197 273 #region 新建金三角
198 274 /// <summary>
199 275 /// 新建金三角
... ... @@ -474,7 +550,7 @@ namespace NCC.Extend.LqYcsdJsj
474 550 }
475 551  
476 552 var query = _db.Queryable<LqYcsdJsjEntity>()
477   - .LeftJoin<LqKdJksyjEntity>((jsj, jksyj) => jsj.Id == jksyj.Jsj_id)
  553 + .LeftJoin<NCC.Extend.Entitys.lq_kd_jksyj.LqKdJksyjEntity>((jsj, jksyj) => jsj.Id == jksyj.Jsj_id)
478 554 .LeftJoin<LqMdxxEntity>((jsj, jksyj, md) => jsj.Md == md.Id)
479 555 .Where((jsj, jksyj, md) => jsj.Yf == month)
480 556 .Where((jsj, jksyj, md) => jksyj.Yjsj != null)
... ... @@ -603,12 +679,12 @@ namespace NCC.Extend.LqYcsdJsj
603 679 /// <returns></returns>
604 680 private async Task CreateJsjMembers(string jsjId, List<JsjMemberInput> members, string creatorUserId)
605 681 {
606   - var memberEntities = new List<LqJinsanjiaoUserEntity>();
  682 + var memberEntities = new List<NCC.Extend.Entitys.lq_jinsanjiao_user.LqJinsanjiaoUserEntity>();
607 683  
608 684 for (int i = 0; i < members.Count; i++)
609 685 {
610 686 var member = members[i];
611   - var memberEntity = new LqJinsanjiaoUserEntity
  687 + var memberEntity = new NCC.Extend.Entitys.lq_jinsanjiao_user.LqJinsanjiaoUserEntity
612 688 {
613 689 Id = YitIdHelper.NextId().ToString(),
614 690 JsjId = jsjId,
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqYyjlService.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.LqYyjl;
  19 +using NCC.Extend.Entitys.lq_yyjl;
8 20 using NCC.Extend.Interfaces.LqYyjl;
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_yyjl;
17   -using NCC.Extend.Entitys.Dto.LqYyjl;
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.LqYyjl
27 27 {
28 28 /// <summary>
29 29 /// 预约记录服务
30 30 /// </summary>
31   - [ApiDescriptionSettings(Tag = "Extend",Name = "LqYyjl", Order = 200)]
  31 + [ApiDescriptionSettings(Tag = "Extend", Name = "LqYyjl", Order = 200)]
32 32 [Route("api/Extend/[controller]")]
33 33 public class LqYyjlService : ILqYyjlService, IDynamicApiController, ITransient
34 34 {
... ... @@ -39,11 +39,9 @@ namespace NCC.Extend.LqYyjl
39 39 /// <summary>
40 40 /// 初始化一个<see cref="LqYyjlService"/>类型的新实例
41 41 /// </summary>
42   - public LqYyjlService(
43   - ISqlSugarRepository<LqYyjlEntity> lqYyjlRepository,
44   - IUserManager userManager)
  42 + public LqYyjlService(ISqlSugarRepository<LqYyjlEntity> lqYyjlRepository, IUserManager userManager)
45 43 {
46   - _lqYyjlRepository = lqYyjlRepository;
  44 + _lqYyjlRepository = lqYyjlRepository;
47 45 _db = _lqYyjlRepository.Context;
48 46 _userManager = userManager;
49 47 }
... ... @@ -62,10 +60,10 @@ namespace NCC.Extend.LqYyjl
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] LqYyjlListQueryInput input)
71 69 {
... ... @@ -96,23 +94,26 @@ namespace NCC.Extend.LqYyjl
96 94 .WhereIF(queryYyjs != null, p => p.Yyjs >= new DateTime(startYyjs.ToDate().Year, startYyjs.ToDate().Month, startYyjs.ToDate().Day, 0, 0, 0))
97 95 .WhereIF(queryYyjs != null, p => p.Yyjs <= new DateTime(endYyjs.ToDate().Year, endYyjs.ToDate().Month, endYyjs.ToDate().Day, 23, 59, 59))
98 96 .WhereIF(!string.IsNullOrEmpty(input.F_Status), p => p.F_Status.Equals(input.F_Status))
99   - .Select(it=> new LqYyjlListOutput
  97 + .Select(it => new LqYyjlListOutput
100 98 {
101 99 id = it.Id,
102   - djmd=it.Djmd,
103   - yyr=it.Yyr,
104   - gklx=it.Gklx,
105   - yytyxm=it.Yytyxm,
106   - czr=it.Czr,
107   - czsj=it.Czsj,
108   - gk=it.Gk,
109   - gkxm=it.Gkxm,
110   - yyjks=it.Yyjks,
111   - yysj=it.Yysj,
112   - yyjs=it.Yyjs,
113   - F_Status=it.F_Status,
114   - }).MergeTable().OrderBy(sidx+" "+input.sort).ToPagedListAsync(input.currentPage, input.pageSize);
115   - return PageResult<LqYyjlListOutput>.SqlSugarPageResult(data);
  100 + djmd = it.Djmd,
  101 + yyr = it.Yyr,
  102 + gklx = it.Gklx,
  103 + yytyxm = it.Yytyxm,
  104 + czr = it.Czr,
  105 + czsj = it.Czsj,
  106 + gk = it.Gk,
  107 + gkxm = it.Gkxm,
  108 + yyjks = it.Yyjks,
  109 + yysj = it.Yysj,
  110 + yyjs = it.Yyjs,
  111 + F_Status = it.F_Status,
  112 + })
  113 + .MergeTable()
  114 + .OrderBy(sidx + " " + input.sort)
  115 + .ToPagedListAsync(input.currentPage, input.pageSize);
  116 + return PageResult<LqYyjlListOutput>.SqlSugarPageResult(data);
116 117 }
117 118  
118 119 /// <summary>
... ... @@ -127,16 +128,17 @@ namespace NCC.Extend.LqYyjl
127 128 var entity = input.Adapt<LqYyjlEntity>();
128 129 entity.Id = YitIdHelper.NextId().ToString();
129 130 entity.Czr = _userManager.UserId;
130   - entity.Czsj = DateTime.Now;
  131 + entity.Czsj = DateTime.Now;
131 132 var isOk = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync();
132   - if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1000);
  133 + if (!(isOk > 0))
  134 + throw NCCException.Oh(ErrorCode.COM1000);
133 135 }
134 136  
135 137 /// <summary>
136   - /// 获取预约记录无分页列表
137   - /// </summary>
138   - /// <param name="input">请求参数</param>
139   - /// <returns></returns>
  138 + /// 获取预约记录无分页列表
  139 + /// </summary>
  140 + /// <param name="input">请求参数</param>
  141 + /// <returns></returns>
140 142 [NonAction]
141 143 public async Task<dynamic> GetNoPagingList([FromQuery] LqYyjlListQueryInput input)
142 144 {
... ... @@ -167,30 +169,33 @@ namespace NCC.Extend.LqYyjl
167 169 .WhereIF(queryYyjs != null, p => p.Yyjs >= new DateTime(startYyjs.ToDate().Year, startYyjs.ToDate().Month, startYyjs.ToDate().Day, 0, 0, 0))
168 170 .WhereIF(queryYyjs != null, p => p.Yyjs <= new DateTime(endYyjs.ToDate().Year, endYyjs.ToDate().Month, endYyjs.ToDate().Day, 23, 59, 59))
169 171 .WhereIF(!string.IsNullOrEmpty(input.F_Status), p => p.F_Status.Equals(input.F_Status))
170   - .Select(it=> new LqYyjlListOutput
  172 + .Select(it => new LqYyjlListOutput
171 173 {
172 174 id = it.Id,
173   - djmd=it.Djmd,
174   - yyr=it.Yyr,
175   - gklx=it.Gklx,
176   - yytyxm=it.Yytyxm,
177   - czr=it.Czr,
178   - czsj=it.Czsj,
179   - gk=it.Gk,
180   - gkxm=it.Gkxm,
181   - yyjks=it.Yyjks,
182   - yysj=it.Yysj,
183   - yyjs=it.Yyjs,
184   - F_Status=it.F_Status,
185   - }).MergeTable().OrderBy(sidx+" "+input.sort).ToListAsync();
186   - return data;
  175 + djmd = it.Djmd,
  176 + yyr = it.Yyr,
  177 + gklx = it.Gklx,
  178 + yytyxm = it.Yytyxm,
  179 + czr = it.Czr,
  180 + czsj = it.Czsj,
  181 + gk = it.Gk,
  182 + gkxm = it.Gkxm,
  183 + yyjks = it.Yyjks,
  184 + yysj = it.Yysj,
  185 + yyjs = it.Yyjs,
  186 + F_Status = it.F_Status,
  187 + })
  188 + .MergeTable()
  189 + .OrderBy(sidx + " " + input.sort)
  190 + .ToListAsync();
  191 + return data;
187 192 }
188 193  
189 194 /// <summary>
190   - /// 导出预约记录
191   - /// </summary>
192   - /// <param name="input">请求参数</param>
193   - /// <returns></returns>
  195 + /// 导出预约记录
  196 + /// </summary>
  197 + /// <param name="input">请求参数</param>
  198 + /// <returns></returns>
194 199 [HttpGet("Actions/Export")]
195 200 public async Task<dynamic> Export([FromQuery] LqYyjlListQueryInput input)
196 201 {
... ... @@ -205,7 +210,8 @@ namespace NCC.Extend.LqYyjl
205 210 {
206 211 exportData = await this.GetNoPagingList(input);
207 212 }
208   - List<ParamsModel> paramList = "[{\"value\":\"预约编号\",\"field\":\"id\"},{\"value\":\"单据门店\",\"field\":\"djmd\"},{\"value\":\"邀约人\",\"field\":\"yyr\"},{\"value\":\"顾客姓名\",\"field\":\"gkxm\"},{\"value\":\"操作人\",\"field\":\"czr\"},{\"value\":\"操作时间\",\"field\":\"czsj\"},{\"value\":\"预约体验项目\",\"field\":\"yytyxm\"},{\"value\":\"顾客类型\",\"field\":\"gklx\"},{\"value\":\"预约健康师\",\"field\":\"yyjks\"},{\"value\":\"预约开始时间\",\"field\":\"yysj\"},{\"value\":\"预约结束时间\",\"field\":\"yyjs\"},{\"value\":\"顾客\",\"field\":\"gk\"},{\"value\":\"预约状态\",\"field\":\"F_Status\"},]".ToList<ParamsModel>();
  213 + List<ParamsModel> paramList =
  214 + "[{\"value\":\"预约编号\",\"field\":\"id\"},{\"value\":\"单据门店\",\"field\":\"djmd\"},{\"value\":\"邀约人\",\"field\":\"yyr\"},{\"value\":\"顾客姓名\",\"field\":\"gkxm\"},{\"value\":\"操作人\",\"field\":\"czr\"},{\"value\":\"操作时间\",\"field\":\"czsj\"},{\"value\":\"预约体验项目\",\"field\":\"yytyxm\"},{\"value\":\"顾客类型\",\"field\":\"gklx\"},{\"value\":\"预约健康师\",\"field\":\"yyjks\"},{\"value\":\"预约开始时间\",\"field\":\"yysj\"},{\"value\":\"预约结束时间\",\"field\":\"yyjs\"},{\"value\":\"顾客\",\"field\":\"gk\"},{\"value\":\"预约状态\",\"field\":\"F_Status\"},]".ToList<ParamsModel>();
209 215 ExcelConfig excelconfig = new ExcelConfig();
210 216 excelconfig.FileName = "预约记录.xls";
211 217 excelconfig.HeadFont = "微软雅黑";
... ... @@ -224,11 +230,7 @@ namespace NCC.Extend.LqYyjl
224 230 var addPath = FileVariable.TemporaryFilePath + excelconfig.FileName;
225 231 ExcelExportHelper<LqYyjlListOutput>.Export(exportData, excelconfig, addPath);
226 232 var fileName = _userManager.UserId + "|" + addPath + "|xls";
227   - var output = new
228   - {
229   - name = excelconfig.FileName,
230   - url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fileName, "NCC")
231   - };
  233 + var output = new { name = excelconfig.FileName, url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fileName, "NCC") };
232 234 return output;
233 235 }
234 236  
... ... @@ -248,7 +250,7 @@ namespace NCC.Extend.LqYyjl
248 250 //开启事务
249 251 _db.BeginTran();
250 252 //批量删除预约记录
251   - await _db.Deleteable<LqYyjlEntity>().In(d => d.Id,ids).ExecuteCommandAsync();
  253 + await _db.Deleteable<LqYyjlEntity>().In(d => d.Id, ids).ExecuteCommandAsync();
252 254 //关闭事务
253 255 _db.CommitTran();
254 256 }
... ... @@ -272,7 +274,8 @@ namespace NCC.Extend.LqYyjl
272 274 {
273 275 var entity = input.Adapt<LqYyjlEntity>();
274 276 var isOk = await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
275   - if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1001);
  277 + if (!(isOk > 0))
  278 + throw NCCException.Oh(ErrorCode.COM1001);
276 279 }
277 280  
278 281 /// <summary>
... ... @@ -285,7 +288,8 @@ namespace NCC.Extend.LqYyjl
285 288 var entity = await _db.Queryable<LqYyjlEntity>().FirstAsync(p => p.Id == id);
286 289 _ = entity ?? throw NCCException.Oh(ErrorCode.COM1005);
287 290 var isOk = await _db.Deleteable<LqYyjlEntity>().Where(d => d.Id == id).ExecuteCommandAsync();
288   - if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1002);
  291 + if (!(isOk > 0))
  292 + throw NCCException.Oh(ErrorCode.COM1002);
289 293 }
290 294 }
291 295 }
... ...
netcore/src/Modularity/Extend/NCC.Extend/NCC.Extend.csproj
1 1 <Project Sdk="Microsoft.NET.Sdk">
2   -
3   - <PropertyGroup>
4   - <TargetFramework>net6.0</TargetFramework>
5   - </PropertyGroup>
6   -
7   - <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
8   - <DocumentationFile>bin\Debug\$(AssemblyName).xml</DocumentationFile>
9   - </PropertyGroup>
10   -
11   - <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
12   - <DocumentationFile>bin\Release\$(AssemblyName).xml</DocumentationFile>
13   - </PropertyGroup>
14   -
15   - <ItemGroup>
16   - <ProjectReference Include="..\..\Common\NCC.Common.Core\NCC.Common.Core.csproj" />
17   - <ProjectReference Include="..\NCC.Extend.Interfaces\NCC.Extend.Interfaces.csproj" />
18   - </ItemGroup>
19   -
20   - <ItemGroup>
21   - <PackageReference Include="EPPlus" Version="6.2.10" />
22   - </ItemGroup>
23   -
  2 + <PropertyGroup>
  3 + <TargetFramework>net6.0</TargetFramework>
  4 + </PropertyGroup>
  5 + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  6 + <DocumentationFile>bin\Debug\$(AssemblyName).xml</DocumentationFile>
  7 + </PropertyGroup>
  8 + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
  9 + <DocumentationFile>bin\Release\$(AssemblyName).xml</DocumentationFile>
  10 + </PropertyGroup>
  11 + <ItemGroup>
  12 + <ProjectReference Include="..\..\Common\NCC.Common.Core\NCC.Common.Core.csproj" />
  13 + <ProjectReference Include="..\NCC.Extend.Interfaces\NCC.Extend.Interfaces.csproj" />
  14 + <ProjectReference Include="..\NCC.Extend.Entitys\NCC.Extend.Entitys.csproj" />
  15 + </ItemGroup>
  16 + <ItemGroup>
  17 + <PackageReference Include="EPPlus" Version="6.2.10" />
  18 + </ItemGroup>
24 19 </Project>
... ...
金三角业绩统计接口说明.md 0 → 100644
  1 +# 金三角业绩统计接口说明
  2 +
  3 +## 接口概述
  4 +新增了金三角业绩统计查询接口,根据金三角成员状态进行不同的统计方式。
  5 +
  6 +## 接口地址
  7 +```
  8 +GET /api/Extend/LqYcsdJsj/GetJsjPerformance
  9 +```
  10 +
  11 +## 功能说明
  12 +根据金三角成员状态进行不同的统计方式:
  13 +1. **活跃成员**:业绩计入金三角总业绩
  14 +2. **非活跃成员**:按单人业绩统计,金三角名称为"门店名+姓名"
  15 +
  16 +## 请求参数
  17 +| 参数名 | 类型 | 必填 | 说明 |
  18 +|--------|------|------|------|
  19 +| startMonth | string | 否 | 开始月份,格式:yyyyMM |
  20 +| endMonth | string | 否 | 结束月份,格式:yyyyMM |
  21 +| jsjId | string | 否 | 金三角ID,用于查询特定金三角 |
  22 +| storeId | string | 否 | 门店ID,用于查询特定门店 |
  23 +
  24 +## 响应参数
  25 +| 字段名 | 类型 | 说明 |
  26 +|--------|------|------|
  27 +| JsjId | string | 金三角ID(非活跃成员时为用户ID) |
  28 +| JsjName | string | 金三角名称(非活跃成员时为"门店名+姓名") |
  29 +| Month | string | 月份(格式:yyyyMM) |
  30 +| StoreId | string | 门店ID |
  31 +| StoreName | string | 门店名称 |
  32 +| OrderCount | int | 订单数量 |
  33 +| TotalPerformance | decimal | 总业绩 |
  34 +| LastOrderDate | DateTime? | 最后订单日期 |
  35 +| FirstOrderDate | DateTime? | 首次订单日期 |
  36 +| StatisticsType | string | 统计类型(ACTIVE-活跃金三角业绩,INACTIVE-单人业绩) |
  37 +| MemberName | string | 成员姓名(仅单人业绩时使用) |
  38 +
  39 +## 示例请求
  40 +```
  41 +GET /api/Extend/LqYcsdJsj/GetJsjPerformance?startMonth=202401&endMonth=202412
  42 +```
  43 +
  44 +## 示例响应
  45 +```json
  46 +{
  47 + "code": 200,
  48 + "msg": "操作成功",
  49 + "data": [
  50 + {
  51 + "jsjId": "123456789",
  52 + "jsjName": "金三角A组",
  53 + "month": "202412",
  54 + "storeId": "store001",
  55 + "storeName": "绿纤川音店",
  56 + "orderCount": 15,
  57 + "totalPerformance": 50000.00,
  58 + "lastOrderDate": "2024-12-15T14:30:00",
  59 + "firstOrderDate": "2024-12-01T09:00:00",
  60 + "statisticsType": "ACTIVE",
  61 + "memberName": null
  62 + },
  63 + {
  64 + "jsjId": "987654321",
  65 + "jsjName": "绿纤川音店-张三",
  66 + "month": "202412",
  67 + "storeId": "store001",
  68 + "storeName": "绿纤川音店",
  69 + "orderCount": 8,
  70 + "totalPerformance": 25000.00,
  71 + "lastOrderDate": "2024-12-14T16:20:00",
  72 + "firstOrderDate": "2024-12-02T10:15:00",
  73 + "statisticsType": "INACTIVE",
  74 + "memberName": "张三"
  75 + }
  76 + ]
  77 +}
  78 +```
  79 +
  80 +## 业务逻辑
  81 +1. **活跃成员统计**:
  82 + - 查询状态为"ACTIVE"的金三角成员
  83 + - 将业绩计入金三角总业绩
  84 + - 按金三角分组统计
  85 +
  86 +2. **非活跃成员统计**:
  87 + - 查询状态为"INACTIVE"的金三角成员
  88 + - 按单人业绩统计
  89 + - 金三角名称为"门店名+姓名"格式
  90 +
  91 +3. **数据排序**:
  92 + - 按月份降序(最新的月份在前)
  93 + - 按总业绩降序(业绩高的在前)
  94 +
  95 +## 注意事项
  96 +- 所有查询都是只读操作,不会修改数据库数据
  97 +- 支持按月统计,可以指定月份范围
  98 +- 支持按金三角ID和门店ID进行筛选
  99 +- 返回结果包含统计类型标识,便于前端区分处理
... ...