Commit 2b23ca5e18fc4bf226c629c7529c6ac9e68c7a40

Authored by “wangming”
1 parent 35bb18d3

更新退卡相关功能,重构退卡信息表及品项明细表,新增健康师和科技部老师业绩列表,优化查询逻辑,确保数据准确性和代码整洁。

Showing 34 changed files with 2228 additions and 412 deletions
[已用]创建门店每日耗卡统计视图.sql 0 → 100644
  1 +-- 创建门店每日耗卡统计视图
  2 +-- 统计各个门店每日项目数(耗卡里面的项目数量)和消耗业绩(耗卡里面的金额)
  3 +
  4 +DROP VIEW IF EXISTS `v_store_daily_consume_stats`;
  5 +
  6 +CREATE VIEW `v_store_daily_consume_stats` AS
  7 +SELECT
  8 + hk.md AS store_id, -- 门店ID
  9 + hk.mdbh AS store_code, -- 门店编号
  10 + hk.mdmc AS store_name, -- 门店名称
  11 + DATE(hk.hksj) AS consume_date, -- 耗卡日期
  12 + COUNT(DISTINCT hk.F_Id) AS consume_count, -- 耗卡记录数
  13 + COALESCE(SUM(px.F_ProjectNumber), 0) AS total_project_count, -- 总项目数
  14 + COALESCE(SUM(px.F_TotalPrice), 0) AS total_consume_amount, -- 总消耗金额
  15 + COALESCE(SUM(CASE WHEN px.F_IsEnabled = 1 THEN px.F_ProjectNumber ELSE 0 END), 0) AS enabled_project_count, -- 有效项目数
  16 + COALESCE(SUM(CASE WHEN px.F_IsEnabled = 1 THEN px.F_TotalPrice ELSE 0 END), 0) AS enabled_consume_amount, -- 有效消耗金额
  17 + COALESCE(SUM(CASE WHEN px.F_SourceType = '开卡' THEN px.F_ProjectNumber ELSE 0 END), 0) AS card_project_count, -- 开卡项目数
  18 + COALESCE(SUM(CASE WHEN px.F_SourceType = '开卡' THEN px.F_TotalPrice ELSE 0 END), 0) AS card_consume_amount, -- 开卡消耗金额
  19 + COALESCE(SUM(CASE WHEN px.F_SourceType = '赠送' THEN px.F_ProjectNumber ELSE 0 END), 0) AS gift_project_count, -- 赠送项目数
  20 + COALESCE(SUM(CASE WHEN px.F_SourceType = '赠送' THEN px.F_TotalPrice ELSE 0 END), 0) AS gift_consume_amount, -- 赠送消耗金额
  21 + COALESCE(SUM(CASE WHEN px.F_SourceType = '其他' THEN px.F_ProjectNumber ELSE 0 END), 0) AS other_project_count, -- 其他项目数
  22 + COALESCE(SUM(CASE WHEN px.F_SourceType = '其他' THEN px.F_TotalPrice ELSE 0 END), 0) AS other_consume_amount, -- 其他消耗金额
  23 + COUNT(DISTINCT hk.hy) AS member_count, -- 消费会员数
  24 + hk.hksj AS create_time -- 创建时间
  25 +FROM lq_xh_hyhk hk
  26 +LEFT JOIN lq_xh_pxmx px ON hk.F_Id = px.glkdbh
  27 +WHERE hk.hksj IS NOT NULL
  28 +GROUP BY hk.md, hk.mdbh, hk.mdmc, DATE(hk.hksj), hk.hksj
  29 +ORDER BY hk.md, DATE(hk.hksj) DESC;
  30 +
  31 +-- 添加视图注释
  32 +ALTER VIEW `v_store_daily_consume_stats` COMMENT = '门店每日耗卡统计视图 - 统计各门店每日项目数和消耗业绩';
  33 +
  34 +-- 视图说明:
  35 +-- 1. 按门店和日期分组统计耗卡数据
  36 +-- 2. 统计项目数和消耗金额,区分不同来源类型
  37 +-- 3. 包含有效/无效项目统计
  38 +-- 4. 按来源类型(开卡、赠送、其他)分别统计
  39 +-- 5. 统计消费会员数量
  40 +-- 6. 按门店和日期降序排列
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkCrInput.cs
1 using System; 1 using System;
2 using System.Collections.Generic; 2 using System.Collections.Generic;
  3 +using NCC.Extend.Entitys.Dto.LqHytkMx;
  4 +using NCC.Extend.Entitys.Dto.LqHytkJksyj;
  5 +using NCC.Extend.Entitys.Dto.LqHytkKjbsyj;
3 6
4 namespace NCC.Extend.Entitys.Dto.LqHytkHytk 7 namespace NCC.Extend.Entitys.Dto.LqHytkHytk
5 { 8 {
6 /// <summary> 9 /// <summary>
7 - /// 会员退卡修改输入参数 10 + /// 退卡_信息表创建输入参数
8 /// </summary> 11 /// </summary>
9 public class LqHytkHytkCrInput 12 public class LqHytkHytkCrInput
10 { 13 {
@@ -21,7 +24,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk @@ -21,7 +24,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
21 /// <summary> 24 /// <summary>
22 /// 门店编号 25 /// 门店编号
23 /// </summary> 26 /// </summary>
24 - public string mcbh { get; set; } 27 + public string mdbh { get; set; }
25 28
26 /// <summary> 29 /// <summary>
27 /// 门店名称 30 /// 门店名称
@@ -36,7 +39,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk @@ -36,7 +39,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
36 /// <summary> 39 /// <summary>
37 /// 会员姓名 40 /// 会员姓名
38 /// </summary> 41 /// </summary>
39 - public string hyxm { get; set; } 42 + public string hymc { get; set; }
40 43
41 /// <summary> 44 /// <summary>
42 /// 会员账号 45 /// 会员账号
@@ -44,19 +47,19 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk @@ -44,19 +47,19 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
44 public string hyzh { get; set; } 47 public string hyzh { get; set; }
45 48
46 /// <summary> 49 /// <summary>
47 - /// 健康师 50 + /// 顾客类型
48 /// </summary> 51 /// </summary>
49 - public string jks { get; set; } 52 + public string gklx { get; set; }
50 53
51 /// <summary> 54 /// <summary>
52 - /// 健康师账号 55 + /// 退卡总金额
53 /// </summary> 56 /// </summary>
54 - public string jkszh { get; set; } 57 + public decimal? tkje { get; set; }
55 58
56 /// <summary> 59 /// <summary>
57 - /// 健康师姓名 60 + /// 手工费用
58 /// </summary> 61 /// </summary>
59 - public string jksxm { get; set; } 62 + public decimal? sgfy { get; set; }
60 63
61 /// <summary> 64 /// <summary>
62 /// 备注 65 /// 备注
@@ -64,24 +67,44 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk @@ -64,24 +67,44 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
64 public string bz { get; set; } 67 public string bz { get; set; }
65 68
66 /// <summary> 69 /// <summary>
67 - /// 退卡品项 70 + /// 退卡时间
68 /// </summary> 71 /// </summary>
69 - public string tkpx { get; set; } 72 + public DateTime? tksj { get; set; }
70 73
71 /// <summary> 74 /// <summary>
72 - /// 退卡时间 75 + /// 操作人员
73 /// </summary> 76 /// </summary>
74 - public DateTime? tksj { get; set; } 77 + public string czry { get; set; }
75 78
76 /// <summary> 79 /// <summary>
77 - /// 退卡人 80 + /// 退卡状态
  81 + /// </summary>
  82 + public string tkzt { get; set; }
  83 +
  84 + /// <summary>
  85 + /// 退卡原因
  86 + /// </summary>
  87 + public string tkyy { get; set; }
  88 +
  89 + /// <summary>
  90 + /// 退卡附件
78 /// </summary> 91 /// </summary>
79 - public string tkr { get; set; } 92 + public string fileUrl { get; set; }
80 93
81 /// <summary> 94 /// <summary>
82 - /// 会员退卡明细 95 + /// 退卡品项明细列表
83 /// </summary> 96 /// </summary>
84 public List<LqHytkMxCrInput> lqHytkMxList { get; set; } 97 public List<LqHytkMxCrInput> lqHytkMxList { get; set; }
85 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 +
86 } 109 }
87 } 110 }
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkInfoOutput.cs
1 using System; 1 using System;
2 using System.Collections.Generic; 2 using System.Collections.Generic;
  3 +using NCC.Extend.Entitys.Dto.LqHytkMx;
  4 +using NCC.Extend.Entitys.Dto.LqHytkJksyj;
  5 +using NCC.Extend.Entitys.Dto.LqHytkKjbsyj;
3 6
4 namespace NCC.Extend.Entitys.Dto.LqHytkHytk 7 namespace NCC.Extend.Entitys.Dto.LqHytkHytk
5 { 8 {
6 /// <summary> 9 /// <summary>
7 - /// 会员退卡输出参数 10 + /// 退卡_信息表详情输出
8 /// </summary> 11 /// </summary>
9 public class LqHytkHytkInfoOutput 12 public class LqHytkHytkInfoOutput
10 { 13 {
@@ -21,7 +24,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk @@ -21,7 +24,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
21 /// <summary> 24 /// <summary>
22 /// 门店编号 25 /// 门店编号
23 /// </summary> 26 /// </summary>
24 - public string mcbh { get; set; } 27 + public string mdbh { get; set; }
25 28
26 /// <summary> 29 /// <summary>
27 /// 门店名称 30 /// 门店名称
@@ -36,7 +39,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk @@ -36,7 +39,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
36 /// <summary> 39 /// <summary>
37 /// 会员姓名 40 /// 会员姓名
38 /// </summary> 41 /// </summary>
39 - public string hyxm { get; set; } 42 + public string hymc { get; set; }
40 43
41 /// <summary> 44 /// <summary>
42 /// 会员账号 45 /// 会员账号
@@ -44,19 +47,19 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk @@ -44,19 +47,19 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
44 public string hyzh { get; set; } 47 public string hyzh { get; set; }
45 48
46 /// <summary> 49 /// <summary>
47 - /// 健康师 50 + /// 顾客类型
48 /// </summary> 51 /// </summary>
49 - public string jks { get; set; } 52 + public string gklx { get; set; }
50 53
51 /// <summary> 54 /// <summary>
52 - /// 健康师账号 55 + /// 退卡总金额
53 /// </summary> 56 /// </summary>
54 - public string jkszh { get; set; } 57 + public decimal? tkje { get; set; }
55 58
56 /// <summary> 59 /// <summary>
57 - /// 健康师姓名 60 + /// 手工费用
58 /// </summary> 61 /// </summary>
59 - public string jksxm { get; set; } 62 + public decimal? sgfy { get; set; }
60 63
61 /// <summary> 64 /// <summary>
62 /// 备注 65 /// 备注
@@ -64,24 +67,44 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk @@ -64,24 +67,44 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
64 public string bz { get; set; } 67 public string bz { get; set; }
65 68
66 /// <summary> 69 /// <summary>
67 - /// 退卡品项 70 + /// 退卡时间
68 /// </summary> 71 /// </summary>
69 - public string tkpx { get; set; } 72 + public DateTime? tksj { get; set; }
70 73
71 /// <summary> 74 /// <summary>
72 - /// 退卡时间 75 + /// 操作人员
73 /// </summary> 76 /// </summary>
74 - public DateTime? tksj { get; set; } 77 + public string czry { get; set; }
75 78
76 /// <summary> 79 /// <summary>
77 - /// 退卡 80 + /// 退卡状态
78 /// </summary> 81 /// </summary>
79 - public string tkr { get; set; } 82 + public string tkzt { get; set; }
80 83
81 /// <summary> 84 /// <summary>
82 - /// 会员退卡明细 85 + /// 退卡原因
  86 + /// </summary>
  87 + public string tkyy { get; set; }
  88 +
  89 + /// <summary>
  90 + /// 退卡附件
  91 + /// </summary>
  92 + public string fileUrl { get; set; }
  93 +
  94 + /// <summary>
  95 + /// 退卡品项明细列表
83 /// </summary> 96 /// </summary>
84 public List<LqHytkMxInfoOutput> lqHytkMxList { get; set; } 97 public List<LqHytkMxInfoOutput> lqHytkMxList { get; set; }
  98 +
  99 + /// <summary>
  100 + /// 健康师业绩列表
  101 + /// </summary>
  102 + public List<LqHytkJksyjInfoOutput> lqHytkJksyjList { get; set; }
  103 +
  104 + /// <summary>
  105 + /// 科技部老师业绩列表
  106 + /// </summary>
  107 + public List<LqHytkKjbsyjInfoOutput> lqHytkKjbsyjList { get; set; }
85 108
86 } 109 }
87 -} 110 -}
  111 +}
88 \ No newline at end of file 112 \ No newline at end of file
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkListOutput.cs
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 namespace NCC.Extend.Entitys.Dto.LqHytkHytk 3 namespace NCC.Extend.Entitys.Dto.LqHytkHytk
4 { 4 {
5 /// <summary> 5 /// <summary>
6 - /// 会员退卡输入参数 6 + /// 退卡_信息表列表输出
7 /// </summary> 7 /// </summary>
8 public class LqHytkHytkListOutput 8 public class LqHytkHytkListOutput
9 { 9 {
@@ -20,7 +20,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk @@ -20,7 +20,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
20 /// <summary> 20 /// <summary>
21 /// 门店编号 21 /// 门店编号
22 /// </summary> 22 /// </summary>
23 - public string mcbh { get; set; } 23 + public string mdbh { get; set; }
24 24
25 /// <summary> 25 /// <summary>
26 /// 门店名称 26 /// 门店名称
@@ -35,7 +35,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk @@ -35,7 +35,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
35 /// <summary> 35 /// <summary>
36 /// 会员姓名 36 /// 会员姓名
37 /// </summary> 37 /// </summary>
38 - public string hyxm { get; set; } 38 + public string hymc { get; set; }
39 39
40 /// <summary> 40 /// <summary>
41 /// 会员账号 41 /// 会员账号
@@ -43,19 +43,19 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk @@ -43,19 +43,19 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
43 public string hyzh { get; set; } 43 public string hyzh { get; set; }
44 44
45 /// <summary> 45 /// <summary>
46 - /// 健康师 46 + /// 顾客类型
47 /// </summary> 47 /// </summary>
48 - public string jks { get; set; } 48 + public string gklx { get; set; }
49 49
50 /// <summary> 50 /// <summary>
51 - /// 健康师账号 51 + /// 退卡总金额
52 /// </summary> 52 /// </summary>
53 - public string jkszh { get; set; } 53 + public decimal? tkje { get; set; }
54 54
55 /// <summary> 55 /// <summary>
56 - /// 健康师姓名 56 + /// 手工费用
57 /// </summary> 57 /// </summary>
58 - public string jksxm { get; set; } 58 + public decimal? sgfy { get; set; }
59 59
60 /// <summary> 60 /// <summary>
61 /// 备注 61 /// 备注
@@ -63,19 +63,29 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk @@ -63,19 +63,29 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
63 public string bz { get; set; } 63 public string bz { get; set; }
64 64
65 /// <summary> 65 /// <summary>
66 - /// 退卡品项 66 + /// 退卡时间
67 /// </summary> 67 /// </summary>
68 - public string tkpx { get; set; } 68 + public DateTime? tksj { get; set; }
69 69
70 /// <summary> 70 /// <summary>
71 - /// 退卡时间 71 + /// 操作人员
72 /// </summary> 72 /// </summary>
73 - public DateTime? tksj { get; set; } 73 + public string czry { get; set; }
  74 +
  75 + /// <summary>
  76 + /// 退卡状态
  77 + /// </summary>
  78 + public string tkzt { get; set; }
74 79
75 /// <summary> 80 /// <summary>
76 - /// 退卡人 81 + /// 退卡原因
  82 + /// </summary>
  83 + public string tkyy { get; set; }
  84 +
  85 + /// <summary>
  86 + /// 退卡附件
77 /// </summary> 87 /// </summary>
78 - public string tkr { get; set; } 88 + public string fileUrl { get; set; }
79 89
80 } 90 }
81 } 91 }
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkListQueryInput.cs
1 -using NCC.Common.Filter;  
2 -using System.Collections.Generic; 1 +using System;
  2 +using NCC.Common.Filter;
3 3
4 namespace NCC.Extend.Entitys.Dto.LqHytkHytk 4 namespace NCC.Extend.Entitys.Dto.LqHytkHytk
5 { 5 {
6 /// <summary> 6 /// <summary>
7 - /// 会员退卡列表查询输入 7 + /// 退卡_信息表列表查询输入参数
8 /// </summary> 8 /// </summary>
9 public class LqHytkHytkListQueryInput : PageInputBase 9 public class LqHytkHytkListQueryInput : PageInputBase
10 { 10 {
11 /// <summary> 11 /// <summary>
12 - /// 选择导出数据key  
13 - /// </summary>  
14 - public string selectKey { get; set; }  
15 -  
16 - /// <summary>  
17 - ///  
18 - /// </summary>  
19 - public int dataType { get; set; }  
20 -  
21 -  
22 - /// <summary>  
23 /// 退卡编号 12 /// 退卡编号
24 /// </summary> 13 /// </summary>
25 public string id { get; set; } 14 public string id { get; set; }
@@ -32,7 +21,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk @@ -32,7 +21,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
32 /// <summary> 21 /// <summary>
33 /// 门店编号 22 /// 门店编号
34 /// </summary> 23 /// </summary>
35 - public string mcbh { get; set; } 24 + public string mdbh { get; set; }
36 25
37 /// <summary> 26 /// <summary>
38 /// 门店名称 27 /// 门店名称
@@ -47,7 +36,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk @@ -47,7 +36,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
47 /// <summary> 36 /// <summary>
48 /// 会员姓名 37 /// 会员姓名
49 /// </summary> 38 /// </summary>
50 - public string hyxm { get; set; } 39 + public string hymc { get; set; }
51 40
52 /// <summary> 41 /// <summary>
53 /// 会员账号 42 /// 会员账号
@@ -55,19 +44,19 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk @@ -55,19 +44,19 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
55 public string hyzh { get; set; } 44 public string hyzh { get; set; }
56 45
57 /// <summary> 46 /// <summary>
58 - /// 健康师 47 + /// 顾客类型
59 /// </summary> 48 /// </summary>
60 - public string jks { get; set; } 49 + public string gklx { get; set; }
61 50
62 /// <summary> 51 /// <summary>
63 - /// 健康师账号 52 + /// 退卡总金额
64 /// </summary> 53 /// </summary>
65 - public string jkszh { get; set; } 54 + public decimal? tkje { get; set; }
66 55
67 /// <summary> 56 /// <summary>
68 - /// 健康师姓名 57 + /// 手工费用
69 /// </summary> 58 /// </summary>
70 - public string jksxm { get; set; } 59 + public decimal? sgfy { get; set; }
71 60
72 /// <summary> 61 /// <summary>
73 /// 备注 62 /// 备注
@@ -75,19 +64,29 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk @@ -75,19 +64,29 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
75 public string bz { get; set; } 64 public string bz { get; set; }
76 65
77 /// <summary> 66 /// <summary>
78 - /// 退卡品项 67 + /// 退卡时间
79 /// </summary> 68 /// </summary>
80 - public string tkpx { get; set; } 69 + public string tksj { get; set; }
81 70
82 /// <summary> 71 /// <summary>
83 - /// 退卡时间 72 + /// 操作人员
84 /// </summary> 73 /// </summary>
85 - public string tksj { get; set; } 74 + public string czry { get; set; }
  75 +
  76 + /// <summary>
  77 + /// 退卡状态
  78 + /// </summary>
  79 + public string tkzt { get; set; }
86 80
87 /// <summary> 81 /// <summary>
88 - /// 退卡人 82 + /// 退卡原因
  83 + /// </summary>
  84 + public string tkyy { get; set; }
  85 +
  86 + /// <summary>
  87 + /// 退卡附件
89 /// </summary> 88 /// </summary>
90 - public string tkr { get; set; } 89 + public string fileUrl { get; set; }
91 90
92 } 91 }
93 -} 92 -}
  93 +}
94 \ No newline at end of file 94 \ No newline at end of file
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkUpInput.cs
1 using System; 1 using System;
2 using System.Collections.Generic; 2 using System.Collections.Generic;
  3 +using NCC.Extend.Entitys.Dto.LqHytkMx;
  4 +using NCC.Extend.Entitys.Dto.LqHytkJksyj;
  5 +using NCC.Extend.Entitys.Dto.LqHytkKjbsyj;
3 6
4 namespace NCC.Extend.Entitys.Dto.LqHytkHytk 7 namespace NCC.Extend.Entitys.Dto.LqHytkHytk
5 { 8 {
6 /// <summary> 9 /// <summary>
7 - /// 会员退卡更新输入参数 10 + /// 退卡_信息表更新输入参数
8 /// </summary> 11 /// </summary>
9 - public class LqHytkHytkUpInput : LqHytkHytkCrInput 12 + public class LqHytkHytkUpInput
10 { 13 {
11 /// <summary> 14 /// <summary>
12 /// 退卡编号 15 /// 退卡编号
13 /// </summary> 16 /// </summary>
14 public string id { get; set; } 17 public string id { get; set; }
15 18
  19 + /// <summary>
  20 + /// 门店
  21 + /// </summary>
  22 + public string md { get; set; }
  23 +
  24 + /// <summary>
  25 + /// 门店编号
  26 + /// </summary>
  27 + public string mdbh { get; set; }
  28 +
  29 + /// <summary>
  30 + /// 门店名称
  31 + /// </summary>
  32 + public string mdmc { get; set; }
  33 +
  34 + /// <summary>
  35 + /// 会员
  36 + /// </summary>
  37 + public string hy { get; set; }
  38 +
  39 + /// <summary>
  40 + /// 会员姓名
  41 + /// </summary>
  42 + public string hymc { get; set; }
  43 +
  44 + /// <summary>
  45 + /// 会员账号
  46 + /// </summary>
  47 + public string hyzh { get; set; }
  48 +
  49 + /// <summary>
  50 + /// 顾客类型
  51 + /// </summary>
  52 + public string gklx { get; set; }
  53 +
  54 + /// <summary>
  55 + /// 退卡总金额
  56 + /// </summary>
  57 + public decimal? tkje { get; set; }
  58 +
  59 + /// <summary>
  60 + /// 手工费用
  61 + /// </summary>
  62 + public decimal? sgfy { get; set; }
  63 +
  64 + /// <summary>
  65 + /// 备注
  66 + /// </summary>
  67 + public string bz { get; set; }
  68 +
  69 + /// <summary>
  70 + /// 退卡时间
  71 + /// </summary>
  72 + public DateTime? tksj { get; set; }
  73 +
  74 + /// <summary>
  75 + /// 操作人员
  76 + /// </summary>
  77 + public string czry { get; set; }
  78 +
  79 + /// <summary>
  80 + /// 退卡状态
  81 + /// </summary>
  82 + public string tkzt { get; set; }
  83 +
  84 + /// <summary>
  85 + /// 退卡原因
  86 + /// </summary>
  87 + public string tkyy { get; set; }
  88 +
  89 + /// <summary>
  90 + /// 退卡附件
  91 + /// </summary>
  92 + public string fileUrl { get; set; }
  93 +
  94 + /// <summary>
  95 + /// 退卡品项明细列表
  96 + /// </summary>
  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 +
16 } 109 }
17 -} 110 -}
  111 +}
18 \ No newline at end of file 112 \ No newline at end of file
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkJksyj/LqHytkJksyjCrInput.cs 0 → 100644
  1 +using System;
  2 +
  3 +namespace NCC.Extend.Entitys.Dto.LqHytkJksyj
  4 +{
  5 + /// <summary>
  6 + /// 退卡_健康师业绩表创建输入参数
  7 + /// </summary>
  8 + public class LqHytkJksyjCrInput
  9 + {
  10 + /// <summary>
  11 + /// 业绩编号
  12 + /// </summary>
  13 + public string id { get; set; }
  14 +
  15 + /// <summary>
  16 + /// 关联退卡编号
  17 + /// </summary>
  18 + public string gltkbh { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 健康师
  22 + /// </summary>
  23 + public string jks { get; set; }
  24 +
  25 + /// <summary>
  26 + /// 健康师姓名
  27 + /// </summary>
  28 + public string jksxm { get; set; }
  29 +
  30 + /// <summary>
  31 + /// 健康师账号
  32 + /// </summary>
  33 + public string jkszh { get; set; }
  34 +
  35 + /// <summary>
  36 + /// 健康师业绩
  37 + /// </summary>
  38 + public decimal? jksyj { get; set; }
  39 +
  40 + /// <summary>
  41 + /// 退卡时间
  42 + /// </summary>
  43 + public DateTime? tksj { get; set; }
  44 +
  45 + /// <summary>
  46 + /// 金三角id
  47 + /// </summary>
  48 + public string F_jsjid { get; set; }
  49 +
  50 + /// <summary>
  51 + /// 关联项目资料表ID
  52 + /// </summary>
  53 + public string F_tkpxid { get; set; }
  54 +
  55 + /// <summary>
  56 + /// 手工费
  57 + /// </summary>
  58 + public decimal? F_LaborCost { get; set; }
  59 +
  60 + /// <summary>
  61 + /// 退卡品项次数
  62 + /// </summary>
  63 + public decimal? F_tkpxNumber { get; set; }
  64 +
  65 + }
  66 +}
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkJksyj/LqHytkJksyjInfoOutput.cs 0 → 100644
  1 +using System;
  2 +
  3 +namespace NCC.Extend.Entitys.Dto.LqHytkJksyj
  4 +{
  5 + /// <summary>
  6 + /// 退卡_健康师业绩表详情输出
  7 + /// </summary>
  8 + public class LqHytkJksyjInfoOutput
  9 + {
  10 + /// <summary>
  11 + /// 业绩编号
  12 + /// </summary>
  13 + public string id { get; set; }
  14 +
  15 + /// <summary>
  16 + /// 关联退卡编号
  17 + /// </summary>
  18 + public string gltkbh { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 健康师
  22 + /// </summary>
  23 + public string jks { get; set; }
  24 +
  25 + /// <summary>
  26 + /// 健康师姓名
  27 + /// </summary>
  28 + public string jksxm { get; set; }
  29 +
  30 + /// <summary>
  31 + /// 健康师账号
  32 + /// </summary>
  33 + public string jkszh { get; set; }
  34 +
  35 + /// <summary>
  36 + /// 健康师业绩
  37 + /// </summary>
  38 + public decimal? jksyj { get; set; }
  39 +
  40 + /// <summary>
  41 + /// 退卡时间
  42 + /// </summary>
  43 + public DateTime? tksj { get; set; }
  44 +
  45 + /// <summary>
  46 + /// 金三角id
  47 + /// </summary>
  48 + public string F_jsjid { get; set; }
  49 +
  50 + /// <summary>
  51 + /// 关联项目资料表ID
  52 + /// </summary>
  53 + public string F_tkpxid { get; set; }
  54 +
  55 + /// <summary>
  56 + /// 手工费
  57 + /// </summary>
  58 + public decimal? F_LaborCost { get; set; }
  59 +
  60 + /// <summary>
  61 + /// 退卡品项次数
  62 + /// </summary>
  63 + public decimal? F_tkpxNumber { get; set; }
  64 +
  65 + }
  66 +}
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkJksyj/LqHytkJksyjUpInput.cs 0 → 100644
  1 +using System;
  2 +
  3 +namespace NCC.Extend.Entitys.Dto.LqHytkJksyj
  4 +{
  5 + /// <summary>
  6 + /// 退卡_健康师业绩表更新输入参数
  7 + /// </summary>
  8 + public class LqHytkJksyjUpInput
  9 + {
  10 + /// <summary>
  11 + /// 业绩编号
  12 + /// </summary>
  13 + public string id { get; set; }
  14 +
  15 + /// <summary>
  16 + /// 关联退卡编号
  17 + /// </summary>
  18 + public string gltkbh { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 健康师
  22 + /// </summary>
  23 + public string jks { get; set; }
  24 +
  25 + /// <summary>
  26 + /// 健康师姓名
  27 + /// </summary>
  28 + public string jksxm { get; set; }
  29 +
  30 + /// <summary>
  31 + /// 健康师账号
  32 + /// </summary>
  33 + public string jkszh { get; set; }
  34 +
  35 + /// <summary>
  36 + /// 健康师业绩
  37 + /// </summary>
  38 + public decimal? jksyj { get; set; }
  39 +
  40 + /// <summary>
  41 + /// 退卡时间
  42 + /// </summary>
  43 + public DateTime? tksj { get; set; }
  44 +
  45 + /// <summary>
  46 + /// 金三角id
  47 + /// </summary>
  48 + public string F_jsjid { get; set; }
  49 +
  50 + /// <summary>
  51 + /// 关联项目资料表ID
  52 + /// </summary>
  53 + public string F_tkpxid { get; set; }
  54 +
  55 + /// <summary>
  56 + /// 手工费
  57 + /// </summary>
  58 + public decimal? F_LaborCost { get; set; }
  59 +
  60 + /// <summary>
  61 + /// 退卡品项次数
  62 + /// </summary>
  63 + public decimal? F_tkpxNumber { get; set; }
  64 +
  65 + }
  66 +}
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkKjbsyj/LqHytkKjbsyjCrInput.cs 0 → 100644
  1 +using System;
  2 +
  3 +namespace NCC.Extend.Entitys.Dto.LqHytkKjbsyj
  4 +{
  5 + /// <summary>
  6 + /// 退卡_科技部老师业绩表创建输入参数
  7 + /// </summary>
  8 + public class LqHytkKjbsyjCrInput
  9 + {
  10 + /// <summary>
  11 + /// 业绩编号
  12 + /// </summary>
  13 + public string id { get; set; }
  14 +
  15 + /// <summary>
  16 + /// 关联退卡编号
  17 + /// </summary>
  18 + public string gltkbh { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 科技部老师
  22 + /// </summary>
  23 + public string kjbls { get; set; }
  24 +
  25 + /// <summary>
  26 + /// 科技部老师姓名
  27 + /// </summary>
  28 + public string kjblsxm { get; set; }
  29 +
  30 + /// <summary>
  31 + /// 科技部老师账号
  32 + /// </summary>
  33 + public string kjblszh { get; set; }
  34 +
  35 + /// <summary>
  36 + /// 科技部老师业绩
  37 + /// </summary>
  38 + public decimal? kjblsyj { get; set; }
  39 +
  40 + /// <summary>
  41 + /// 退卡时间
  42 + /// </summary>
  43 + public DateTime? tksj { get; set; }
  44 +
  45 + /// <summary>
  46 + /// 关联项目资料表ID
  47 + /// </summary>
  48 + public string F_tkpxid { get; set; }
  49 +
  50 + /// <summary>
  51 + /// 手工费
  52 + /// </summary>
  53 + public decimal? F_LaborCost { get; set; }
  54 +
  55 + /// <summary>
  56 + /// 退卡品项次数
  57 + /// </summary>
  58 + public decimal? F_tkpxNumber { get; set; }
  59 +
  60 + }
  61 +}
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkKjbsyj/LqHytkKjbsyjInfoOutput.cs 0 → 100644
  1 +using System;
  2 +
  3 +namespace NCC.Extend.Entitys.Dto.LqHytkKjbsyj
  4 +{
  5 + /// <summary>
  6 + /// 退卡_科技部老师业绩表详情输出
  7 + /// </summary>
  8 + public class LqHytkKjbsyjInfoOutput
  9 + {
  10 + /// <summary>
  11 + /// 业绩编号
  12 + /// </summary>
  13 + public string id { get; set; }
  14 +
  15 + /// <summary>
  16 + /// 关联退卡编号
  17 + /// </summary>
  18 + public string gltkbh { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 科技部老师
  22 + /// </summary>
  23 + public string kjbls { get; set; }
  24 +
  25 + /// <summary>
  26 + /// 科技部老师姓名
  27 + /// </summary>
  28 + public string kjblsxm { get; set; }
  29 +
  30 + /// <summary>
  31 + /// 科技部老师账号
  32 + /// </summary>
  33 + public string kjblszh { get; set; }
  34 +
  35 + /// <summary>
  36 + /// 科技部老师业绩
  37 + /// </summary>
  38 + public decimal? kjblsyj { get; set; }
  39 +
  40 + /// <summary>
  41 + /// 退卡时间
  42 + /// </summary>
  43 + public DateTime? tksj { get; set; }
  44 +
  45 + /// <summary>
  46 + /// 关联项目资料表ID
  47 + /// </summary>
  48 + public string F_tkpxid { get; set; }
  49 +
  50 + /// <summary>
  51 + /// 手工费
  52 + /// </summary>
  53 + public decimal? F_LaborCost { get; set; }
  54 +
  55 + /// <summary>
  56 + /// 退卡品项次数
  57 + /// </summary>
  58 + public decimal? F_tkpxNumber { get; set; }
  59 +
  60 + }
  61 +}
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkKjbsyj/LqHytkKjbsyjUpInput.cs 0 → 100644
  1 +using System;
  2 +
  3 +namespace NCC.Extend.Entitys.Dto.LqHytkKjbsyj
  4 +{
  5 + /// <summary>
  6 + /// 退卡_科技部老师业绩表更新输入参数
  7 + /// </summary>
  8 + public class LqHytkKjbsyjUpInput
  9 + {
  10 + /// <summary>
  11 + /// 业绩编号
  12 + /// </summary>
  13 + public string id { get; set; }
  14 +
  15 + /// <summary>
  16 + /// 关联退卡编号
  17 + /// </summary>
  18 + public string gltkbh { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 科技部老师
  22 + /// </summary>
  23 + public string kjbls { get; set; }
  24 +
  25 + /// <summary>
  26 + /// 科技部老师姓名
  27 + /// </summary>
  28 + public string kjblsxm { get; set; }
  29 +
  30 + /// <summary>
  31 + /// 科技部老师账号
  32 + /// </summary>
  33 + public string kjblszh { get; set; }
  34 +
  35 + /// <summary>
  36 + /// 科技部老师业绩
  37 + /// </summary>
  38 + public decimal? kjblsyj { get; set; }
  39 +
  40 + /// <summary>
  41 + /// 退卡时间
  42 + /// </summary>
  43 + public DateTime? tksj { get; set; }
  44 +
  45 + /// <summary>
  46 + /// 关联项目资料表ID
  47 + /// </summary>
  48 + public string F_tkpxid { get; set; }
  49 +
  50 + /// <summary>
  51 + /// 手工费
  52 + /// </summary>
  53 + public decimal? F_LaborCost { get; set; }
  54 +
  55 + /// <summary>
  56 + /// 退卡品项次数
  57 + /// </summary>
  58 + public decimal? F_tkpxNumber { get; set; }
  59 +
  60 + }
  61 +}
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkMx/LqHytkMxCrInput.cs
1 using System; 1 using System;
2 using System.Collections.Generic; 2 using System.Collections.Generic;
  3 +using NCC.Extend.Entitys.Dto.LqHytkJksyj;
  4 +using NCC.Extend.Entitys.Dto.LqHytkKjbsyj;
3 5
4 -namespace NCC.Extend.Entitys.Dto.LqHytkHytk 6 +namespace NCC.Extend.Entitys.Dto.LqHytkMx
5 { 7 {
6 /// <summary> 8 /// <summary>
7 - /// 会员退卡修改输入参数 9 + /// 退卡_品项明细表创建输入参数
8 /// </summary> 10 /// </summary>
9 public class LqHytkMxCrInput 11 public class LqHytkMxCrInput
10 { 12 {
@@ -13,7 +15,6 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk @@ -13,7 +15,6 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
13 /// </summary> 15 /// </summary>
14 public string id { get; set; } 16 public string id { get; set; }
15 17
16 -  
17 /// <summary> 18 /// <summary>
18 /// 关联退卡编号 19 /// 关联退卡编号
19 /// </summary> 20 /// </summary>
@@ -27,27 +28,47 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk @@ -27,27 +28,47 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
27 /// <summary> 28 /// <summary>
28 /// 品项名称 29 /// 品项名称
29 /// </summary> 30 /// </summary>
30 - public string mc { get; set; } 31 + public string pxmc { get; set; }
  32 +
  33 + /// <summary>
  34 + /// 品项价格
  35 + /// </summary>
  36 + public decimal? pxjg { get; set; }
31 37
32 /// <summary> 38 /// <summary>
33 /// 退款金额 39 /// 退款金额
34 /// </summary> 40 /// </summary>
35 - public string tkje { get; set; } 41 + public decimal? tkje { get; set; }
  42 +
  43 + /// <summary>
  44 + /// 项目次数
  45 + /// </summary>
  46 + public int? F_ProjectNumber { get; set; }
  47 +
  48 + /// <summary>
  49 + /// 是否有效
  50 + /// </summary>
  51 + public int? F_IsEnabled { get; set; }
  52 +
  53 + /// <summary>
  54 + /// 来源类型
  55 + /// </summary>
  56 + public string F_SourceType { get; set; }
36 57
37 /// <summary> 58 /// <summary>
38 - /// 次数 59 + /// 合计金额
39 /// </summary> 60 /// </summary>
40 - public string cs { get; set; } 61 + public decimal? F_TotalPrice { get; set; }
41 62
42 /// <summary> 63 /// <summary>
43 - /// 单次耗卡 64 + /// 退卡健康师业绩列表
44 /// </summary> 65 /// </summary>
45 - public string dchk { get; set; } 66 + public List<LqHytkJksyjCrInput> lqHytkJksyjList { get; set; }
46 67
47 /// <summary> 68 /// <summary>
48 - /// 发生时间 69 + /// 退卡科技部老师业绩列表
49 /// </summary> 70 /// </summary>
50 - public DateTime? fssj { get; set; } 71 + public List<LqHytkKjbsyjCrInput> lqHytkKjbsyjList { get; set; }
51 72
52 } 73 }
53 } 74 }
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkMx/LqHytkMxInfoOutput.cs
1 using System; 1 using System;
2 using System.Collections.Generic; 2 using System.Collections.Generic;
  3 +using NCC.Extend.Entitys.Dto.LqHytkJksyj;
  4 +using NCC.Extend.Entitys.Dto.LqHytkKjbsyj;
3 5
4 -namespace NCC.Extend.Entitys.Dto.LqHytkHytk 6 +namespace NCC.Extend.Entitys.Dto.LqHytkMx
5 { 7 {
6 /// <summary> 8 /// <summary>
7 - /// 会员退卡输出参数 9 + /// 退卡_品项明细表详情输出
8 /// </summary> 10 /// </summary>
9 public class LqHytkMxInfoOutput 11 public class LqHytkMxInfoOutput
10 { 12 {
@@ -19,34 +21,54 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk @@ -19,34 +21,54 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
19 public string gltkbh { get; set; } 21 public string gltkbh { get; set; }
20 22
21 /// <summary> 23 /// <summary>
22 - /// 品项 24 + /// 品项编号
23 /// </summary> 25 /// </summary>
24 public string px { get; set; } 26 public string px { get; set; }
25 27
26 /// <summary> 28 /// <summary>
27 /// 品项名称 29 /// 品项名称
28 /// </summary> 30 /// </summary>
29 - public string mc { get; set; } 31 + public string pxmc { get; set; }
  32 +
  33 + /// <summary>
  34 + /// 品项价格
  35 + /// </summary>
  36 + public decimal? pxjg { get; set; }
30 37
31 /// <summary> 38 /// <summary>
32 /// 退款金额 39 /// 退款金额
33 /// </summary> 40 /// </summary>
34 - public string tkje { get; set; } 41 + public decimal? tkje { get; set; }
  42 +
  43 + /// <summary>
  44 + /// 项目次数
  45 + /// </summary>
  46 + public int? F_ProjectNumber { get; set; }
35 47
36 /// <summary> 48 /// <summary>
37 - /// 次数 49 + /// 是否有效
38 /// </summary> 50 /// </summary>
39 - public string cs { get; set; } 51 + public int? F_IsEnabled { get; set; }
40 52
41 /// <summary> 53 /// <summary>
42 - /// 单次耗卡 54 + /// 来源类型(开卡/赠送/其他)
43 /// </summary> 55 /// </summary>
44 - public string dchk { get; set; } 56 + public string F_SourceType { get; set; }
45 57
46 /// <summary> 58 /// <summary>
47 - /// 发生时间 59 + /// 合计金额(品项价格 × 项目次数)
  60 + /// </summary>
  61 + public decimal? F_TotalPrice { get; set; }
  62 +
  63 + /// <summary>
  64 + /// 健康师业绩列表
  65 + /// </summary>
  66 + public List<LqHytkJksyjInfoOutput> lqHytkJksyjList { get; set; }
  67 +
  68 + /// <summary>
  69 + /// 科技部老师业绩列表
48 /// </summary> 70 /// </summary>
49 - public DateTime? fssj { get; set; } 71 + public List<LqHytkKjbsyjInfoOutput> lqHytkKjbsyjList { get; set; }
50 72
51 } 73 }
52 -} 74 -}
  75 +}
53 \ No newline at end of file 76 \ No newline at end of file
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkMx/LqHytkMxUpInput.cs
1 using System; 1 using System;
2 -using System.Collections.Generic;  
3 2
4 -namespace NCC.Extend.Entitys.Dto.LqHytkHytk 3 +namespace NCC.Extend.Entitys.Dto.LqHytkMx
5 { 4 {
6 /// <summary> 5 /// <summary>
7 - /// 会员退卡更新输入参数 6 + /// 退卡_品项明细表更新输入参数
8 /// </summary> 7 /// </summary>
9 - public class LqHytkMxUpInput : LqHytkHytkCrInput 8 + public class LqHytkMxUpInput
10 { 9 {
11 /// <summary> 10 /// <summary>
12 /// 明细编号 11 /// 明细编号
13 /// </summary> 12 /// </summary>
14 public string id { get; set; } 13 public string id { get; set; }
15 14
  15 + /// <summary>
  16 + /// 关联退卡编号
  17 + /// </summary>
  18 + public string gltkbh { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 品项
  22 + /// </summary>
  23 + public string px { get; set; }
  24 +
  25 + /// <summary>
  26 + /// 品项名称
  27 + /// </summary>
  28 + public string pxmc { get; set; }
  29 +
  30 + /// <summary>
  31 + /// 品项价格
  32 + /// </summary>
  33 + public decimal? pxjg { get; set; }
  34 +
  35 + /// <summary>
  36 + /// 退款金额
  37 + /// </summary>
  38 + public decimal? tkje { get; set; }
  39 +
  40 + /// <summary>
  41 + /// 项目次数
  42 + /// </summary>
  43 + public int? F_ProjectNumber { get; set; }
  44 +
  45 + /// <summary>
  46 + /// 是否有效
  47 + /// </summary>
  48 + public int? F_IsEnabled { get; set; }
  49 +
  50 + /// <summary>
  51 + /// 来源类型
  52 + /// </summary>
  53 + public string F_SourceType { get; set; }
  54 +
  55 + /// <summary>
  56 + /// 合计金额
  57 + /// </summary>
  58 + public decimal? F_TotalPrice { get; set; }
  59 +
16 } 60 }
17 -} 61 -}
  62 +}
18 \ No newline at end of file 63 \ No newline at end of file
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdJksyj/LqKdJksyjInfoOutput.cs
@@ -4,7 +4,7 @@ using System.Collections.Generic; @@ -4,7 +4,7 @@ using System.Collections.Generic;
4 namespace NCC.Extend.Entitys.Dto.LqKdKdjlb 4 namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
5 { 5 {
6 /// <summary> 6 /// <summary>
7 - /// 开单记录表输出参数 7 + /// 开单健康师业绩输出参数
8 /// </summary> 8 /// </summary>
9 public class LqKdJksyjInfoOutput 9 public class LqKdJksyjInfoOutput
10 { 10 {
@@ -19,7 +19,12 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb @@ -19,7 +19,12 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
19 public string glkdbh { get; set; } 19 public string glkdbh { get; set; }
20 20
21 /// <summary> 21 /// <summary>
22 - /// 健康师 22 + /// 关联开单品项ID
  23 + /// </summary>
  24 + public string kdpxid { get; set; }
  25 +
  26 + /// <summary>
  27 + /// 健康师ID
23 /// </summary> 28 /// </summary>
24 public string jks { get; set; } 29 public string jks { get; set; }
25 30
@@ -43,5 +48,9 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb @@ -43,5 +48,9 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
43 /// </summary> 48 /// </summary>
44 public DateTime? yjsj { get; set; } 49 public DateTime? yjsj { get; set; }
45 50
  51 + /// <summary>
  52 + /// 金三角ID
  53 + /// </summary>
  54 + public string jsj_id { get; set; }
46 } 55 }
47 } 56 }
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKjbsyj/LqKdKjbsyjInfoOutput.cs
@@ -4,7 +4,7 @@ using System.Collections.Generic; @@ -4,7 +4,7 @@ using System.Collections.Generic;
4 namespace NCC.Extend.Entitys.Dto.LqKdKdjlb 4 namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
5 { 5 {
6 /// <summary> 6 /// <summary>
7 - /// 开单记录表输出参数 7 + /// 开单科技部老师业绩输出参数
8 /// </summary> 8 /// </summary>
9 public class LqKdKjbsyjInfoOutput 9 public class LqKdKjbsyjInfoOutput
10 { 10 {
@@ -19,7 +19,12 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb @@ -19,7 +19,12 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
19 public string glkdbh { get; set; } 19 public string glkdbh { get; set; }
20 20
21 /// <summary> 21 /// <summary>
22 - /// 科技部老师 22 + /// 关联开单品项ID
  23 + /// </summary>
  24 + public string kdpxid { get; set; }
  25 +
  26 + /// <summary>
  27 + /// 科技部老师ID
23 /// </summary> 28 /// </summary>
24 public string kjbls { get; set; } 29 public string kjbls { get; set; }
25 30
@@ -42,6 +47,5 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb @@ -42,6 +47,5 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
42 /// 业绩时间 47 /// 业绩时间
43 /// </summary> 48 /// </summary>
44 public DateTime? yjsj { get; set; } 49 public DateTime? yjsj { get; set; }
45 -  
46 } 50 }
47 } 51 }
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdPxmx/LqKdPxmxInfoOutput.cs
@@ -4,7 +4,7 @@ using System.Collections.Generic; @@ -4,7 +4,7 @@ using System.Collections.Generic;
4 namespace NCC.Extend.Entitys.Dto.LqKdKdjlb 4 namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
5 { 5 {
6 /// <summary> 6 /// <summary>
7 - /// 开单记录表输出参数 7 + /// 开单品项明细输出参数
8 /// </summary> 8 /// </summary>
9 public class LqKdPxmxInfoOutput 9 public class LqKdPxmxInfoOutput
10 { 10 {
@@ -19,7 +19,7 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb @@ -19,7 +19,7 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
19 public string glkdbh { get; set; } 19 public string glkdbh { get; set; }
20 20
21 /// <summary> 21 /// <summary>
22 - /// 品项 22 + /// 品项编号
23 /// </summary> 23 /// </summary>
24 public string px { get; set; } 24 public string px { get; set; }
25 25
@@ -33,5 +33,44 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb @@ -33,5 +33,44 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
33 /// </summary> 33 /// </summary>
34 public decimal pxjg { get; set; } 34 public decimal pxjg { get; set; }
35 35
  36 + /// <summary>
  37 + /// 项目次数
  38 + /// </summary>
  39 + public int? projectNumber { get; set; }
  40 +
  41 + /// <summary>
  42 + /// 是否有效
  43 + /// </summary>
  44 + public int? isEnabled { get; set; }
  45 +
  46 + /// <summary>
  47 + /// 来源类型(开卡/赠送/其他)
  48 + /// </summary>
  49 + public string sourceType { get; set; }
  50 +
  51 + /// <summary>
  52 + /// 会员ID
  53 + /// </summary>
  54 + public string memberId { get; set; }
  55 +
  56 + /// <summary>
  57 + /// 创建时间
  58 + /// </summary>
  59 + public DateTime? createTime { get; set; }
  60 +
  61 + /// <summary>
  62 + /// 总价格(品项价格 × 项目次数)
  63 + /// </summary>
  64 + public decimal totalPrice { get; set; }
  65 +
  66 + /// <summary>
  67 + /// 健康师业绩列表
  68 + /// </summary>
  69 + public List<LqKdJksyjInfoOutput> lqKdJksyjList { get; set; }
  70 +
  71 + /// <summary>
  72 + /// 科技部老师业绩列表
  73 + /// </summary>
  74 + public List<LqKdKjbsyjInfoOutput> lqKdKjbsyjList { get; set; }
36 } 75 }
37 } 76 }
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqMdxx/StoreStatisticsInput.cs 0 → 100644
  1 +using System;
  2 +using System.ComponentModel.DataAnnotations;
  3 +
  4 +namespace NCC.Extend.Entitys.Dto.LqMdxx
  5 +{
  6 + /// <summary>
  7 + /// 门店统计查询输入参数
  8 + /// </summary>
  9 + public class StoreStatisticsInput
  10 + {
  11 + /// <summary>
  12 + /// 查询日期
  13 + /// </summary>
  14 + /// <remarks>
  15 + /// 传入日期格式:2025-9-14
  16 + /// 系统会自动计算本月1号到传入日期的时间范围
  17 + /// 例如传入2025-9-14,则查询范围为2025-9-1到2025-9-14
  18 + /// </remarks>
  19 + /// <example>2025-9-14</example>
  20 + [Required(ErrorMessage = "查询日期不能为空")]
  21 + public DateTime QueryDate { get; set; }
  22 + }
  23 +}
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqMdxx/StoreStatisticsOutput.cs 0 → 100644
  1 +using System;
  2 +using System.Collections.Generic;
  3 +
  4 +namespace NCC.Extend.Entitys.Dto.LqMdxx
  5 +{
  6 + /// <summary>
  7 + /// 门店统计结果输出
  8 + /// </summary>
  9 + public class StoreStatisticsOutput
  10 + {
  11 + /// <summary>
  12 + /// 查询开始日期
  13 + /// </summary>
  14 + /// <example>2025-09-01</example>
  15 + public DateTime StartDate { get; set; }
  16 +
  17 + /// <summary>
  18 + /// 查询结束日期
  19 + /// </summary>
  20 + /// <example>2025-09-14</example>
  21 + public DateTime EndDate { get; set; }
  22 +
  23 + /// <summary>
  24 + /// 门店统计列表
  25 + /// </summary>
  26 + public List<StoreStatisticsInfo> StoreList { get; set; } = new List<StoreStatisticsInfo>();
  27 +
  28 + /// <summary>
  29 + /// 汇总统计
  30 + /// </summary>
  31 + public StoreSummaryInfo Summary { get; set; } = new StoreSummaryInfo();
  32 + }
  33 +
  34 + /// <summary>
  35 + /// 门店统计信息
  36 + /// </summary>
  37 + public class StoreStatisticsInfo
  38 + {
  39 + /// <summary>
  40 + /// 门店ID
  41 + /// </summary>
  42 + /// <example>123456789</example>
  43 + public string StoreId { get; set; }
  44 +
  45 + /// <summary>
  46 + /// 门店编码
  47 + /// </summary>
  48 + /// <example>MD001</example>
  49 + public string StoreCode { get; set; }
  50 +
  51 + /// <summary>
  52 + /// 门店名称
  53 + /// </summary>
  54 + /// <example>北京朝阳店</example>
  55 + public string StoreName { get; set; }
  56 +
  57 + /// <summary>
  58 + /// 员工数量
  59 + /// </summary>
  60 + /// <remarks>该门店的员工总数</remarks>
  61 + /// <example>15</example>
  62 + public int EmployeeCount { get; set; }
  63 +
  64 + /// <summary>
  65 + /// 项目数量
  66 + /// </summary>
  67 + /// <remarks>统计期间该门店耗卡的项目总数</remarks>
  68 + /// <example>128</example>
  69 + public decimal ProjectCount { get; set; }
  70 +
  71 + /// <summary>
  72 + /// 消耗业绩
  73 + /// </summary>
  74 + /// <remarks>统计期间该门店耗卡的金额总计</remarks>
  75 + /// <example>25680.50</example>
  76 + public decimal ConsumeAmount { get; set; }
  77 +
  78 + /// <summary>
  79 + /// 城市
  80 + /// </summary>
  81 + /// <example>北京</example>
  82 + public string City { get; set; }
  83 +
  84 + /// <summary>
  85 + /// 事业部
  86 + /// </summary>
  87 + /// <example>华北事业部</example>
  88 + public string BusinessUnit { get; set; }
  89 + }
  90 +
  91 + /// <summary>
  92 + /// 汇总统计信息
  93 + /// </summary>
  94 + public class StoreSummaryInfo
  95 + {
  96 + /// <summary>
  97 + /// 门店总数
  98 + /// </summary>
  99 + /// <example>25</example>
  100 + public int TotalStoreCount { get; set; }
  101 +
  102 + /// <summary>
  103 + /// 员工总数
  104 + /// </summary>
  105 + /// <example>365</example>
  106 + public int TotalEmployeeCount { get; set; }
  107 +
  108 + /// <summary>
  109 + /// 项目总数
  110 + /// </summary>
  111 + /// <example>2580</example>
  112 + public decimal TotalProjectCount { get; set; }
  113 +
  114 + /// <summary>
  115 + /// 消耗业绩总计
  116 + /// </summary>
  117 + /// <example>568920.80</example>
  118 + public decimal TotalConsumeAmount { get; set; }
  119 + }
  120 +}
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhHyhk/MemberRemainingItemsOutput.cs
@@ -80,9 +80,16 @@ namespace NCC.Extend.Entitys.Dto.LqXhHyhk @@ -80,9 +80,16 @@ namespace NCC.Extend.Entitys.Dto.LqXhHyhk
80 public decimal ConsumedCount { get; set; } 80 public decimal ConsumedCount { get; set; }
81 81
82 /// <summary> 82 /// <summary>
  83 + /// 已退卡数量
  84 + /// </summary>
  85 + /// <remarks>该品项已退卡的次数</remarks>
  86 + /// <example>0</example>
  87 + public decimal RefundedCount { get; set; }
  88 +
  89 + /// <summary>
83 /// 剩余数量 90 /// 剩余数量
84 /// </summary> 91 /// </summary>
85 - /// <remarks>总购买数量减去已消费数量</remarks> 92 + /// <remarks>总购买数量减去已消费数量减去已退卡数量</remarks>
86 /// <example>2</example> 93 /// <example>2</example>
87 public decimal RemainingCount { get; set; } 94 public decimal RemainingCount { get; set; }
88 } 95 }
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhPxmx/LqXhPxmxInfoOutput.cs
1 using System; 1 using System;
  2 +using System.Collections.Generic;
  3 +using NCC.Extend.Entitys.Dto.LqXhJksyj;
  4 +using NCC.Extend.Entitys.Dto.LqXhKjbsyj;
2 5
3 namespace NCC.Extend.Entitys.Dto.LqXhPxmx 6 namespace NCC.Extend.Entitys.Dto.LqXhPxmx
4 { 7 {
@@ -13,12 +16,12 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx @@ -13,12 +16,12 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx
13 public string id { get; set; } 16 public string id { get; set; }
14 17
15 /// <summary> 18 /// <summary>
16 - /// 关联开单编号 19 + /// 关联耗卡编号
17 /// </summary> 20 /// </summary>
18 public string glkdbh { get; set; } 21 public string glkdbh { get; set; }
19 22
20 /// <summary> 23 /// <summary>
21 - /// 品项 24 + /// 品项编号
22 /// </summary> 25 /// </summary>
23 public string px { get; set; } 26 public string px { get; set; }
24 27
@@ -38,7 +41,7 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx @@ -38,7 +41,7 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx
38 public string xfzs { get; set; } 41 public string xfzs { get; set; }
39 42
40 /// <summary> 43 /// <summary>
41 - /// 会员id 44 + /// 会员ID
42 /// </summary> 45 /// </summary>
43 public string memberId { get; set; } 46 public string memberId { get; set; }
44 47
@@ -58,13 +61,23 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx @@ -58,13 +61,23 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx
58 public int? isEnabled { get; set; } 61 public int? isEnabled { get; set; }
59 62
60 /// <summary> 63 /// <summary>
61 - /// 来源类型 64 + /// 来源类型(开卡/赠送/其他)
62 /// </summary> 65 /// </summary>
63 public string sourceType { get; set; } 66 public string sourceType { get; set; }
64 67
65 /// <summary> 68 /// <summary>
66 - /// 合计金额 69 + /// 合计金额(品项价格 × 项目次数)
67 /// </summary> 70 /// </summary>
68 public decimal totalPrice { get; set; } 71 public decimal totalPrice { get; set; }
  72 +
  73 + /// <summary>
  74 + /// 健康师业绩列表
  75 + /// </summary>
  76 + public List<LqXhJksyjInfoOutput> lqXhJksyjList { get; set; }
  77 +
  78 + /// <summary>
  79 + /// 科技部老师业绩列表
  80 + /// </summary>
  81 + public List<LqXhKjbsyjInfoOutput> lqXhKjbsyjList { get; set; }
69 } 82 }
70 } 83 }
71 \ No newline at end of file 84 \ No newline at end of file
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_hytk/LqHytkHytkEntity.cs
@@ -5,7 +5,7 @@ using System; @@ -5,7 +5,7 @@ using System;
5 namespace NCC.Extend.Entitys.lq_hytk_hytk 5 namespace NCC.Extend.Entitys.lq_hytk_hytk
6 { 6 {
7 /// <summary> 7 /// <summary>
8 - /// 会员退卡 8 + /// 退卡_信息表
9 /// </summary> 9 /// </summary>
10 [SugarTable("lq_hytk_hytk")] 10 [SugarTable("lq_hytk_hytk")]
11 [Tenant(ClaimConst.TENANT_ID)] 11 [Tenant(ClaimConst.TENANT_ID)]
@@ -26,8 +26,8 @@ namespace NCC.Extend.Entitys.lq_hytk_hytk @@ -26,8 +26,8 @@ namespace NCC.Extend.Entitys.lq_hytk_hytk
26 /// <summary> 26 /// <summary>
27 /// 门店编号 27 /// 门店编号
28 /// </summary> 28 /// </summary>
29 - [SugarColumn(ColumnName = "mcbh")]  
30 - public string Mcbh { get; set; } 29 + [SugarColumn(ColumnName = "mdbh")]
  30 + public string Mdbh { get; set; }
31 31
32 /// <summary> 32 /// <summary>
33 /// 门店名称 33 /// 门店名称
@@ -44,8 +44,8 @@ namespace NCC.Extend.Entitys.lq_hytk_hytk @@ -44,8 +44,8 @@ namespace NCC.Extend.Entitys.lq_hytk_hytk
44 /// <summary> 44 /// <summary>
45 /// 会员姓名 45 /// 会员姓名
46 /// </summary> 46 /// </summary>
47 - [SugarColumn(ColumnName = "hyxm")]  
48 - public string Hyxm { get; set; } 47 + [SugarColumn(ColumnName = "hymc")]
  48 + public string Hymc { get; set; }
49 49
50 /// <summary> 50 /// <summary>
51 /// 会员账号 51 /// 会员账号
@@ -54,22 +54,22 @@ namespace NCC.Extend.Entitys.lq_hytk_hytk @@ -54,22 +54,22 @@ namespace NCC.Extend.Entitys.lq_hytk_hytk
54 public string Hyzh { get; set; } 54 public string Hyzh { get; set; }
55 55
56 /// <summary> 56 /// <summary>
57 - /// 健康师 57 + /// 顾客类型
58 /// </summary> 58 /// </summary>
59 - [SugarColumn(ColumnName = "jks")]  
60 - public string Jks { get; set; } 59 + [SugarColumn(ColumnName = "gklx")]
  60 + public string Gklx { get; set; }
61 61
62 /// <summary> 62 /// <summary>
63 - /// 健康师账号 63 + /// 退卡总金额
64 /// </summary> 64 /// </summary>
65 - [SugarColumn(ColumnName = "jkszh")]  
66 - public string Jkszh { get; set; } 65 + [SugarColumn(ColumnName = "tkje")]
  66 + public decimal? Tkje { get; set; }
67 67
68 /// <summary> 68 /// <summary>
69 - /// 健康师姓名 69 + /// 手工费用
70 /// </summary> 70 /// </summary>
71 - [SugarColumn(ColumnName = "jksxm")]  
72 - public string Jksxm { get; set; } 71 + [SugarColumn(ColumnName = "sgfy")]
  72 + public decimal? Sgfy { get; set; }
73 73
74 /// <summary> 74 /// <summary>
75 /// 备注 75 /// 备注
@@ -78,22 +78,65 @@ namespace NCC.Extend.Entitys.lq_hytk_hytk @@ -78,22 +78,65 @@ namespace NCC.Extend.Entitys.lq_hytk_hytk
78 public string Bz { get; set; } 78 public string Bz { get; set; }
79 79
80 /// <summary> 80 /// <summary>
81 - /// 退卡品项  
82 - /// </summary>  
83 - [SugarColumn(ColumnName = "tkpx")]  
84 - public string Tkpx { get; set; }  
85 -  
86 - /// <summary>  
87 /// 退卡时间 81 /// 退卡时间
88 /// </summary> 82 /// </summary>
89 [SugarColumn(ColumnName = "tksj")] 83 [SugarColumn(ColumnName = "tksj")]
90 public DateTime? Tksj { get; set; } 84 public DateTime? Tksj { get; set; }
91 85
92 /// <summary> 86 /// <summary>
93 - /// 退卡人 87 + /// 操作人员
  88 + /// </summary>
  89 + [SugarColumn(ColumnName = "czry")]
  90 + public string Czry { get; set; }
  91 +
  92 + /// <summary>
  93 + /// 退卡状态
  94 + /// </summary>
  95 + [SugarColumn(ColumnName = "tkzt")]
  96 + public string Tkzt { get; set; }
  97 +
  98 + /// <summary>
  99 + /// 退卡原因
  100 + /// </summary>
  101 + [SugarColumn(ColumnName = "tkyy")]
  102 + public string Tkyy { get; set; }
  103 +
  104 +
  105 + /// <summary>
  106 + /// 退卡附件
  107 + /// </summary>
  108 + [SugarColumn(ColumnName = "F_FileUrl")]
  109 + public string FileUrl { get; set; }
  110 +
  111 + /// <summary>
  112 + /// 创建时间
  113 + /// </summary>
  114 + [SugarColumn(ColumnName = "F_CreateTime")]
  115 + public DateTime? F_CreateTime { get; set; }
  116 +
  117 + /// <summary>
  118 + /// 创建用户
  119 + /// </summary>
  120 + [SugarColumn(ColumnName = "F_CreateUser")]
  121 + public string F_CreateUser { get; set; }
  122 +
  123 + /// <summary>
  124 + /// 修改时间
  125 + /// </summary>
  126 + [SugarColumn(ColumnName = "F_ModifyTime")]
  127 + public DateTime? F_ModifyTime { get; set; }
  128 +
  129 + /// <summary>
  130 + /// 修改用户
  131 + /// </summary>
  132 + [SugarColumn(ColumnName = "F_ModifyUser")]
  133 + public string F_ModifyUser { get; set; }
  134 +
  135 + /// <summary>
  136 + /// 删除标记
94 /// </summary> 137 /// </summary>
95 - [SugarColumn(ColumnName = "tkr")]  
96 - public string Tkr { get; set; } 138 + [SugarColumn(ColumnName = "F_DeleteMark")]
  139 + public int? F_DeleteMark { get; set; }
97 140
98 } 141 }
99 } 142 }
100 \ No newline at end of file 143 \ No newline at end of file
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_jksyj/LqHytkJksyjEntity.cs 0 → 100644
  1 +using NCC.Common.Const;
  2 +using SqlSugar;
  3 +using System;
  4 +
  5 +namespace NCC.Extend.Entitys.lq_hytk_jksyj
  6 +{
  7 + /// <summary>
  8 + /// 退卡_健康师业绩表
  9 + /// </summary>
  10 + [SugarTable("lq_hytk_jksyj")]
  11 + [Tenant(ClaimConst.TENANT_ID)]
  12 + public class LqHytkJksyjEntity
  13 + {
  14 + /// <summary>
  15 + /// 业绩编号
  16 + /// </summary>
  17 + [SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true)]
  18 + public string Id { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 关联退卡编号
  22 + /// </summary>
  23 + [SugarColumn(ColumnName = "gltkbh")]
  24 + public string Gltkbh { get; set; }
  25 +
  26 + /// <summary>
  27 + /// 健康师
  28 + /// </summary>
  29 + [SugarColumn(ColumnName = "jks")]
  30 + public string Jks { get; set; }
  31 +
  32 + /// <summary>
  33 + /// 健康师姓名
  34 + /// </summary>
  35 + [SugarColumn(ColumnName = "jksxm")]
  36 + public string Jksxm { get; set; }
  37 +
  38 + /// <summary>
  39 + /// 健康师账号
  40 + /// </summary>
  41 + [SugarColumn(ColumnName = "jkszh")]
  42 + public string Jkszh { get; set; }
  43 +
  44 + /// <summary>
  45 + /// 健康师业绩
  46 + /// </summary>
  47 + [SugarColumn(ColumnName = "jksyj")]
  48 + public decimal? Jksyj { get; set; }
  49 +
  50 + /// <summary>
  51 + /// 退卡时间
  52 + /// </summary>
  53 + [SugarColumn(ColumnName = "tksj")]
  54 + public DateTime? Tksj { get; set; }
  55 +
  56 + /// <summary>
  57 + /// 金三角id
  58 + /// </summary>
  59 + [SugarColumn(ColumnName = "F_jsjid")]
  60 + public string F_jsjid { get; set; }
  61 +
  62 + /// <summary>
  63 + /// 关联项目资料表ID
  64 + /// </summary>
  65 + [SugarColumn(ColumnName = "F_tkpxid")]
  66 + public string F_tkpxid { get; set; }
  67 +
  68 + /// <summary>
  69 + /// 手工费
  70 + /// </summary>
  71 + [SugarColumn(ColumnName = "F_LaborCost")]
  72 + public decimal? F_LaborCost { get; set; }
  73 +
  74 + /// <summary>
  75 + /// 退卡品项次数
  76 + /// </summary>
  77 + [SugarColumn(ColumnName = "F_tkpxNumber")]
  78 + public decimal? F_tkpxNumber { get; set; }
  79 +
  80 + /// <summary>
  81 + /// 创建时间
  82 + /// </summary>
  83 + [SugarColumn(ColumnName = "F_CreateTime")]
  84 + public DateTime? F_CreateTime { get; set; }
  85 +
  86 + /// <summary>
  87 + /// 创建用户
  88 + /// </summary>
  89 + [SugarColumn(ColumnName = "F_CreateUser")]
  90 + public string F_CreateUser { get; set; }
  91 +
  92 + /// <summary>
  93 + /// 修改时间
  94 + /// </summary>
  95 + [SugarColumn(ColumnName = "F_ModifyTime")]
  96 + public DateTime? F_ModifyTime { get; set; }
  97 +
  98 + /// <summary>
  99 + /// 修改用户
  100 + /// </summary>
  101 + [SugarColumn(ColumnName = "F_ModifyUser")]
  102 + public string F_ModifyUser { get; set; }
  103 +
  104 + /// <summary>
  105 + /// 删除标记
  106 + /// </summary>
  107 + [SugarColumn(ColumnName = "F_DeleteMark")]
  108 + public int? F_DeleteMark { get; set; }
  109 +
  110 + }
  111 +}
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_kjbsyj/LqHytkKjbsyjEntity.cs 0 → 100644
  1 +using NCC.Common.Const;
  2 +using SqlSugar;
  3 +using System;
  4 +
  5 +namespace NCC.Extend.Entitys.lq_hytk_kjbsyj
  6 +{
  7 + /// <summary>
  8 + /// 退卡_科技部老师业绩表
  9 + /// </summary>
  10 + [SugarTable("lq_hytk_kjbsyj")]
  11 + [Tenant(ClaimConst.TENANT_ID)]
  12 + public class LqHytkKjbsyjEntity
  13 + {
  14 + /// <summary>
  15 + /// 业绩编号
  16 + /// </summary>
  17 + [SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true)]
  18 + public string Id { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 关联退卡编号
  22 + /// </summary>
  23 + [SugarColumn(ColumnName = "gltkbh")]
  24 + public string Gltkbh { get; set; }
  25 +
  26 + /// <summary>
  27 + /// 科技部老师
  28 + /// </summary>
  29 + [SugarColumn(ColumnName = "kjbls")]
  30 + public string Kjbls { get; set; }
  31 +
  32 + /// <summary>
  33 + /// 科技部老师姓名
  34 + /// </summary>
  35 + [SugarColumn(ColumnName = "kjblsxm")]
  36 + public string Kjblsxm { get; set; }
  37 +
  38 + /// <summary>
  39 + /// 科技部老师账号
  40 + /// </summary>
  41 + [SugarColumn(ColumnName = "kjblszh")]
  42 + public string Kjblszh { get; set; }
  43 +
  44 + /// <summary>
  45 + /// 科技部老师业绩
  46 + /// </summary>
  47 + [SugarColumn(ColumnName = "kjblsyj")]
  48 + public decimal? Kjblsyj { get; set; }
  49 +
  50 + /// <summary>
  51 + /// 退卡时间
  52 + /// </summary>
  53 + [SugarColumn(ColumnName = "tksj")]
  54 + public DateTime? Tksj { get; set; }
  55 +
  56 + /// <summary>
  57 + /// 关联项目资料表ID
  58 + /// </summary>
  59 + [SugarColumn(ColumnName = "F_tkpxid")]
  60 + public string F_tkpxid { get; set; }
  61 +
  62 + /// <summary>
  63 + /// 手工费
  64 + /// </summary>
  65 + [SugarColumn(ColumnName = "F_LaborCost")]
  66 + public decimal? F_LaborCost { get; set; }
  67 +
  68 + /// <summary>
  69 + /// 退卡品项次数
  70 + /// </summary>
  71 + [SugarColumn(ColumnName = "F_tkpxNumber")]
  72 + public decimal? F_tkpxNumber { get; set; }
  73 +
  74 + /// <summary>
  75 + /// 创建时间
  76 + /// </summary>
  77 + [SugarColumn(ColumnName = "F_CreateTime")]
  78 + public DateTime? F_CreateTime { get; set; }
  79 +
  80 + /// <summary>
  81 + /// 创建用户
  82 + /// </summary>
  83 + [SugarColumn(ColumnName = "F_CreateUser")]
  84 + public string F_CreateUser { get; set; }
  85 +
  86 + /// <summary>
  87 + /// 修改时间
  88 + /// </summary>
  89 + [SugarColumn(ColumnName = "F_ModifyTime")]
  90 + public DateTime? F_ModifyTime { get; set; }
  91 +
  92 + /// <summary>
  93 + /// 修改用户
  94 + /// </summary>
  95 + [SugarColumn(ColumnName = "F_ModifyUser")]
  96 + public string F_ModifyUser { get; set; }
  97 +
  98 + /// <summary>
  99 + /// 删除标记
  100 + /// </summary>
  101 + [SugarColumn(ColumnName = "F_DeleteMark")]
  102 + public int? F_DeleteMark { get; set; }
  103 +
  104 + }
  105 +}
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_mx/LqHytkMxEntity.cs
@@ -5,7 +5,7 @@ using System; @@ -5,7 +5,7 @@ using System;
5 namespace NCC.Extend.Entitys.lq_hytk_mx 5 namespace NCC.Extend.Entitys.lq_hytk_mx
6 { 6 {
7 /// <summary> 7 /// <summary>
8 - /// 会员退卡 8 + /// 退卡_品项明细表
9 /// </summary> 9 /// </summary>
10 [SugarTable("lq_hytk_mx")] 10 [SugarTable("lq_hytk_mx")]
11 [Tenant(ClaimConst.TENANT_ID)] 11 [Tenant(ClaimConst.TENANT_ID)]
@@ -32,32 +32,74 @@ namespace NCC.Extend.Entitys.lq_hytk_mx @@ -32,32 +32,74 @@ namespace NCC.Extend.Entitys.lq_hytk_mx
32 /// <summary> 32 /// <summary>
33 /// 品项名称 33 /// 品项名称
34 /// </summary> 34 /// </summary>
35 - [SugarColumn(ColumnName = "mc")]  
36 - public string Mc { get; set; } 35 + [SugarColumn(ColumnName = "pxmc")]
  36 + public string Pxmc { get; set; }
  37 +
  38 + /// <summary>
  39 + /// 品项价格
  40 + /// </summary>
  41 + [SugarColumn(ColumnName = "pxjg")]
  42 + public decimal? Pxjg { get; set; }
37 43
38 /// <summary> 44 /// <summary>
39 /// 退款金额 45 /// 退款金额
40 /// </summary> 46 /// </summary>
41 [SugarColumn(ColumnName = "tkje")] 47 [SugarColumn(ColumnName = "tkje")]
42 - public string Tkje { get; set; } 48 + public decimal? Tkje { get; set; }
  49 +
  50 + /// <summary>
  51 + /// 项目次数
  52 + /// </summary>
  53 + [SugarColumn(ColumnName = "F_ProjectNumber")]
  54 + public int? F_ProjectNumber { get; set; }
  55 +
  56 + /// <summary>
  57 + /// 是否有效
  58 + /// </summary>
  59 + [SugarColumn(ColumnName = "F_IsEnabled")]
  60 + public int? F_IsEnabled { get; set; }
  61 +
  62 + /// <summary>
  63 + /// 来源类型
  64 + /// </summary>
  65 + [SugarColumn(ColumnName = "F_SourceType")]
  66 + public string F_SourceType { get; set; }
  67 +
  68 + /// <summary>
  69 + /// 合计金额
  70 + /// </summary>
  71 + [SugarColumn(ColumnName = "F_TotalPrice")]
  72 + public decimal? F_TotalPrice { get; set; }
  73 +
  74 + /// <summary>
  75 + /// 创建时间
  76 + /// </summary>
  77 + [SugarColumn(ColumnName = "F_CreateTime")]
  78 + public DateTime? F_CreateTime { get; set; }
  79 +
  80 + /// <summary>
  81 + /// 创建用户
  82 + /// </summary>
  83 + [SugarColumn(ColumnName = "F_CreateUser")]
  84 + public string F_CreateUser { get; set; }
43 85
44 /// <summary> 86 /// <summary>
45 - /// 次数 87 + /// 修改时间
46 /// </summary> 88 /// </summary>
47 - [SugarColumn(ColumnName = "cs")]  
48 - public string Cs { get; set; } 89 + [SugarColumn(ColumnName = "F_ModifyTime")]
  90 + public DateTime? F_ModifyTime { get; set; }
49 91
50 /// <summary> 92 /// <summary>
51 - /// 单次耗卡 93 + /// 修改用户
52 /// </summary> 94 /// </summary>
53 - [SugarColumn(ColumnName = "dchk")]  
54 - public string Dchk { get; set; } 95 + [SugarColumn(ColumnName = "F_ModifyUser")]
  96 + public string F_ModifyUser { get; set; }
55 97
56 /// <summary> 98 /// <summary>
57 - /// 发生时间 99 + /// 删除标记
58 /// </summary> 100 /// </summary>
59 - [SugarColumn(ColumnName = "fssj")]  
60 - public DateTime? Fssj { get; set; } 101 + [SugarColumn(ColumnName = "F_DeleteMark")]
  102 + public int? F_DeleteMark { get; set; }
61 103
62 } 104 }
63 } 105 }
64 \ No newline at end of file 106 \ No newline at end of file
netcore/src/Modularity/Extend/NCC.Extend.Interfaces/LqStatistics/ILqStatisticsService.cs
1 using System.Collections.Generic; 1 using System.Collections.Generic;
2 using System.Threading.Tasks; 2 using System.Threading.Tasks;
3 using NCC.Extend.Entitys.Dto.LqStatistics; 3 using NCC.Extend.Entitys.Dto.LqStatistics;
  4 +using NCC.Extend.Entitys.Dto.LqMdxx;
4 5
5 namespace NCC.Extend.Interfaces.LqStatistics 6 namespace NCC.Extend.Interfaces.LqStatistics
6 { 7 {
@@ -10,15 +11,16 @@ namespace NCC.Extend.Interfaces.LqStatistics @@ -10,15 +11,16 @@ namespace NCC.Extend.Interfaces.LqStatistics
10 public interface ILqStatisticsService 11 public interface ILqStatisticsService
11 { 12 {
12 /// <summary> 13 /// <summary>
13 - /// 测试接口  
14 - /// </summary>  
15 - /// <returns>测试结果</returns>  
16 - Task<dynamic> Test();  
17 -  
18 - /// <summary>  
19 /// 获取门店业绩统计列表 14 /// 获取门店业绩统计列表
20 /// </summary> 15 /// </summary>
21 /// <returns>门店业绩统计列表</returns> 16 /// <returns>门店业绩统计列表</returns>
22 Task<List<StorePerformanceOutput>> GetStorePerformanceList(); 17 Task<List<StorePerformanceOutput>> GetStorePerformanceList();
  18 +
  19 + /// <summary>
  20 + /// 获取门店统计信息
  21 + /// </summary>
  22 + /// <param name="input">查询参数</param>
  23 + /// <returns>门店统计结果</returns>
  24 + Task<StoreStatisticsOutput> GetStoreStatistics(StoreStatisticsInput input);
23 } 25 }
24 } 26 }
netcore/src/Modularity/Extend/NCC.Extend/LqHytkHytkService.cs
1 -using NCC.Common.Core.Manager; 1 +using NCC.Common.Core.Manager;
2 using NCC.Common.Enum; 2 using NCC.Common.Enum;
3 using NCC.Common.Extension; 3 using NCC.Common.Extension;
4 using NCC.Common.Filter; 4 using NCC.Common.Filter;
@@ -15,7 +15,12 @@ using System.Linq; @@ -15,7 +15,12 @@ using System.Linq;
15 using System.Threading.Tasks; 15 using System.Threading.Tasks;
16 using NCC.Extend.Entitys.lq_hytk_hytk; 16 using NCC.Extend.Entitys.lq_hytk_hytk;
17 using NCC.Extend.Entitys.lq_hytk_mx; 17 using NCC.Extend.Entitys.lq_hytk_mx;
  18 +using NCC.Extend.Entitys.lq_hytk_jksyj;
  19 +using NCC.Extend.Entitys.lq_hytk_kjbsyj;
18 using NCC.Extend.Entitys.Dto.LqHytkHytk; 20 using NCC.Extend.Entitys.Dto.LqHytkHytk;
  21 +using NCC.Extend.Entitys.Dto.LqHytkMx;
  22 +using NCC.Extend.Entitys.Dto.LqHytkJksyj;
  23 +using NCC.Extend.Entitys.Dto.LqHytkKjbsyj;
19 using Yitter.IdGenerator; 24 using Yitter.IdGenerator;
20 using NCC.Common.Helper; 25 using NCC.Common.Helper;
21 using NCC.JsonSerialization; 26 using NCC.JsonSerialization;
@@ -27,14 +32,16 @@ using NCC.ClayObject; @@ -27,14 +32,16 @@ using NCC.ClayObject;
27 namespace NCC.Extend.LqHytkHytk 32 namespace NCC.Extend.LqHytkHytk
28 { 33 {
29 /// <summary> 34 /// <summary>
30 - /// 会员退卡服务 35 + /// 退卡_信息表服务
31 /// </summary> 36 /// </summary>
32 - [ApiDescriptionSettings(Tag = "Extend",Name = "LqHytkHytk", Order = 200)] 37 + [ApiDescriptionSettings(Tag = "绿纤退卡信息表服务",Name = "LqHytkHytk", Order = 200)]
33 [Route("api/Extend/[controller]")] 38 [Route("api/Extend/[controller]")]
34 public class LqHytkHytkService : ILqHytkHytkService, IDynamicApiController, ITransient 39 public class LqHytkHytkService : ILqHytkHytkService, IDynamicApiController, ITransient
35 { 40 {
36 private readonly ISqlSugarRepository<LqHytkHytkEntity> _lqHytkHytkRepository; 41 private readonly ISqlSugarRepository<LqHytkHytkEntity> _lqHytkHytkRepository;
37 private readonly ISqlSugarRepository<LqHytkMxEntity> _lqHytkMxRepository; 42 private readonly ISqlSugarRepository<LqHytkMxEntity> _lqHytkMxRepository;
  43 + private readonly ISqlSugarRepository<LqHytkJksyjEntity> _lqHytkJksyjRepository;
  44 + private readonly ISqlSugarRepository<LqHytkKjbsyjEntity> _lqHytkKjbsyjRepository;
38 private readonly SqlSugarScope _db; 45 private readonly SqlSugarScope _db;
39 private readonly IUserManager _userManager; 46 private readonly IUserManager _userManager;
40 47
@@ -44,34 +51,22 @@ namespace NCC.Extend.LqHytkHytk @@ -44,34 +51,22 @@ namespace NCC.Extend.LqHytkHytk
44 public LqHytkHytkService( 51 public LqHytkHytkService(
45 ISqlSugarRepository<LqHytkHytkEntity> lqHytkHytkRepository, 52 ISqlSugarRepository<LqHytkHytkEntity> lqHytkHytkRepository,
46 ISqlSugarRepository<LqHytkMxEntity> lqHytkMxRepository, 53 ISqlSugarRepository<LqHytkMxEntity> lqHytkMxRepository,
  54 + ISqlSugarRepository<LqHytkJksyjEntity> lqHytkJksyjRepository,
  55 + ISqlSugarRepository<LqHytkKjbsyjEntity> lqHytkKjbsyjRepository,
47 IUserManager userManager) 56 IUserManager userManager)
48 { 57 {
49 _lqHytkHytkRepository = lqHytkHytkRepository; 58 _lqHytkHytkRepository = lqHytkHytkRepository;
50 - _db = _lqHytkHytkRepository.Context;  
51 _lqHytkMxRepository = lqHytkMxRepository; 59 _lqHytkMxRepository = lqHytkMxRepository;
  60 + _lqHytkJksyjRepository = lqHytkJksyjRepository;
  61 + _lqHytkKjbsyjRepository = lqHytkKjbsyjRepository;
  62 + _db = _lqHytkHytkRepository.Context;
52 _userManager = userManager; 63 _userManager = userManager;
53 } 64 }
54 65
55 /// <summary> 66 /// <summary>
56 - /// 获取会员退卡 67 + /// 获取退卡信息列表
57 /// </summary> 68 /// </summary>
58 - /// <param name="id">参数</param>  
59 - /// <returns></returns>  
60 - [HttpGet("{id}")]  
61 - public async Task<dynamic> GetInfo(string id)  
62 - {  
63 - var entity = await _db.Queryable<LqHytkHytkEntity>().FirstAsync(p => p.Id == id);  
64 - var output = entity.Adapt<LqHytkHytkInfoOutput>();  
65 -  
66 - var lqHytkMxList = await _db.Queryable<LqHytkMxEntity>().Where(w => w.Gltkbh == entity.Id).ToListAsync();  
67 - output.lqHytkMxList = lqHytkMxList.Adapt<List<LqHytkMxInfoOutput>>();  
68 - return output;  
69 - }  
70 -  
71 - /// <summary>  
72 - /// 获取会员退卡列表  
73 - /// </summary>  
74 - /// <param name="input">请求参数</param> 69 + /// <param name="input">查询参数</param>
75 /// <returns></returns> 70 /// <returns></returns>
76 [HttpGet("")] 71 [HttpGet("")]
77 public async Task<dynamic> GetList([FromQuery] LqHytkHytkListQueryInput input) 72 public async Task<dynamic> GetList([FromQuery] LqHytkHytkListQueryInput input)
@@ -83,279 +78,486 @@ namespace NCC.Extend.LqHytkHytk @@ -83,279 +78,486 @@ namespace NCC.Extend.LqHytkHytk
83 var data = await _db.Queryable<LqHytkHytkEntity>() 78 var data = await _db.Queryable<LqHytkHytkEntity>()
84 .WhereIF(!string.IsNullOrEmpty(input.id), p => p.Id.Contains(input.id)) 79 .WhereIF(!string.IsNullOrEmpty(input.id), p => p.Id.Contains(input.id))
85 .WhereIF(!string.IsNullOrEmpty(input.md), p => p.Md.Equals(input.md)) 80 .WhereIF(!string.IsNullOrEmpty(input.md), p => p.Md.Equals(input.md))
86 - .WhereIF(!string.IsNullOrEmpty(input.mcbh), p => p.Mcbh.Contains(input.mcbh)) 81 + .WhereIF(!string.IsNullOrEmpty(input.mdbh), p => p.Mdbh.Contains(input.mdbh))
87 .WhereIF(!string.IsNullOrEmpty(input.mdmc), p => p.Mdmc.Contains(input.mdmc)) 82 .WhereIF(!string.IsNullOrEmpty(input.mdmc), p => p.Mdmc.Contains(input.mdmc))
88 .WhereIF(!string.IsNullOrEmpty(input.hy), p => p.Hy.Equals(input.hy)) 83 .WhereIF(!string.IsNullOrEmpty(input.hy), p => p.Hy.Equals(input.hy))
89 - .WhereIF(!string.IsNullOrEmpty(input.hyxm), p => p.Hyxm.Contains(input.hyxm)) 84 + .WhereIF(!string.IsNullOrEmpty(input.hymc), p => p.Hymc.Contains(input.hymc))
90 .WhereIF(!string.IsNullOrEmpty(input.hyzh), p => p.Hyzh.Contains(input.hyzh)) 85 .WhereIF(!string.IsNullOrEmpty(input.hyzh), p => p.Hyzh.Contains(input.hyzh))
91 - .WhereIF(!string.IsNullOrEmpty(input.jks), p => p.Jks.Equals(input.jks))  
92 - .WhereIF(!string.IsNullOrEmpty(input.jkszh), p => p.Jkszh.Contains(input.jkszh))  
93 - .WhereIF(!string.IsNullOrEmpty(input.jksxm), p => p.Jksxm.Contains(input.jksxm)) 86 + .WhereIF(!string.IsNullOrEmpty(input.gklx), p => p.Gklx.Contains(input.gklx))
  87 + .WhereIF(input.tkje.HasValue, p => p.Tkje == input.tkje)
  88 + .WhereIF(input.sgfy.HasValue, p => p.Sgfy == input.sgfy)
94 .WhereIF(!string.IsNullOrEmpty(input.bz), p => p.Bz.Contains(input.bz)) 89 .WhereIF(!string.IsNullOrEmpty(input.bz), p => p.Bz.Contains(input.bz))
95 - .WhereIF(!string.IsNullOrEmpty(input.tkpx), p => p.Tkpx.Contains(input.tkpx)) 90 + .WhereIF(!string.IsNullOrEmpty(input.tkzt), p => p.Tkzt.Contains(input.tkzt))
  91 + .WhereIF(!string.IsNullOrEmpty(input.tkyy), p => p.Tkyy.Contains(input.tkyy))
  92 + .WhereIF(!string.IsNullOrEmpty(input.fileUrl), p => p.FileUrl.Contains(input.fileUrl))
96 .WhereIF(queryTksj != null, p => p.Tksj >= new DateTime(startTksj.ToDate().Year, startTksj.ToDate().Month, startTksj.ToDate().Day, 0, 0, 0)) 93 .WhereIF(queryTksj != null, p => p.Tksj >= new DateTime(startTksj.ToDate().Year, startTksj.ToDate().Month, startTksj.ToDate().Day, 0, 0, 0))
97 .WhereIF(queryTksj != null, p => p.Tksj <= new DateTime(endTksj.ToDate().Year, endTksj.ToDate().Month, endTksj.ToDate().Day, 23, 59, 59)) 94 .WhereIF(queryTksj != null, p => p.Tksj <= new DateTime(endTksj.ToDate().Year, endTksj.ToDate().Month, endTksj.ToDate().Day, 23, 59, 59))
98 - .WhereIF(!string.IsNullOrEmpty(input.tkr), p => p.Tkr.Equals(input.tkr)) 95 + .WhereIF(!string.IsNullOrEmpty(input.czry), p => p.Czry.Equals(input.czry))
99 .Select(it=> new LqHytkHytkListOutput 96 .Select(it=> new LqHytkHytkListOutput
100 { 97 {
101 id = it.Id, 98 id = it.Id,
102 md=it.Md, 99 md=it.Md,
103 - mcbh=it.Mcbh, 100 + mdbh=it.Mdbh,
104 mdmc=it.Mdmc, 101 mdmc=it.Mdmc,
105 hy=it.Hy, 102 hy=it.Hy,
106 - hyxm=it.Hyxm, 103 + hymc=it.Hymc,
107 hyzh=it.Hyzh, 104 hyzh=it.Hyzh,
108 - jks=it.Jks,  
109 - jkszh=it.Jkszh,  
110 - jksxm=it.Jksxm, 105 + gklx=it.Gklx,
  106 + tkje=it.Tkje,
  107 + sgfy=it.Sgfy,
111 bz=it.Bz, 108 bz=it.Bz,
112 - tkpx=it.Tkpx, 109 + tkzt=it.Tkzt,
  110 + tkyy=it.Tkyy,
113 tksj=it.Tksj, 111 tksj=it.Tksj,
114 - tkr=it.Tkr, 112 + czry=it.Czry,
  113 + fileUrl=it.FileUrl,
115 }).MergeTable().OrderBy(sidx+" "+input.sort).ToPagedListAsync(input.currentPage, input.pageSize); 114 }).MergeTable().OrderBy(sidx+" "+input.sort).ToPagedListAsync(input.currentPage, input.pageSize);
116 return PageResult<LqHytkHytkListOutput>.SqlSugarPageResult(data); 115 return PageResult<LqHytkHytkListOutput>.SqlSugarPageResult(data);
117 } 116 }
118 117
119 /// <summary> 118 /// <summary>
120 - /// 新建会员退卡 119 + /// 创建退卡信息及其关联的品项明细、健康师业绩、科技部老师业绩信息
121 /// </summary> 120 /// </summary>
122 - /// <param name="input">参数</param>  
123 - /// <returns></returns> 121 + /// <remarks>
  122 + /// 创建退卡记录及其关联的品项明细、健康师业绩、科技部老师业绩信息
  123 + ///
  124 + /// 示例请求:
  125 + /// ```json
  126 + /// {
  127 + /// "md": "门店ID",
  128 + /// "mdbh": "门店编号",
  129 + /// "mdmc": "门店名称",
  130 + /// "hy": "会员ID",
  131 + /// "hymc": "会员姓名",
  132 + /// "hyzh": "会员账号",
  133 + /// "gklx": "顾客类型",
  134 + /// "tkje": 1000.00,
  135 + /// "sgfy": 50.00,
  136 + /// "bz": "备注",
  137 + /// "tkzt": "退卡状态",
  138 + /// "tkyy": "退卡原因",
  139 + /// "lqHytkMxList": [
  140 + /// {
  141 + /// "px": "品项编号",
  142 + /// "pxmc": "品项名称",
  143 + /// "pxjg": 100.00,
  144 + /// "tkje": 100.00,
  145 + /// "F_ProjectNumber": 1,
  146 + /// "F_SourceType": "来源类型",
  147 + /// "F_TotalPrice": 100.00,
  148 + /// "lqHytkJksyjList": [
  149 + /// {
  150 + /// "jks": "健康师",
  151 + /// "jksxm": "健康师姓名",
  152 + /// "jkszh": "健康师账号",
  153 + /// "jksyj": 50.00,
  154 + /// "F_jsjid": "金三角ID",
  155 + /// "F_tkpxid": "项目资料ID",
  156 + /// "F_LaborCost": 10.00,
  157 + /// "F_tkpxNumber": 1
  158 + /// }
  159 + /// ],
  160 + /// "lqHytkKjbsyjList": [
  161 + /// {
  162 + /// "kjbls": "科技部老师",
  163 + /// "kjblsxm": "科技部老师姓名",
  164 + /// "kjblszh": "科技部老师账号",
  165 + /// "kjblsyj": 30.00,
  166 + /// "F_tkpxid": "项目资料ID",
  167 + /// "F_LaborCost": 5.00,
  168 + /// "F_tkpxNumber": 1
  169 + /// }
  170 + /// ]
  171 + /// }
  172 + /// ]
  173 + /// }
  174 + /// ```
  175 + ///
  176 + /// 参数说明:
  177 + /// - md: 门店ID
  178 + /// - hy: 会员ID
  179 + /// - lqHytkMxList: 退卡品项明细列表
  180 + /// </remarks>
  181 + /// <param name="input">退卡创建参数</param>
  182 + /// <returns>无返回值</returns>
  183 + /// <response code="200">创建成功</response>
  184 + /// <response code="400">参数错误或数据验证失败</response>
  185 + /// <response code="500">服务器内部错误</response>
124 [HttpPost("")] 186 [HttpPost("")]
125 public async Task Create([FromBody] LqHytkHytkCrInput input) 187 public async Task Create([FromBody] LqHytkHytkCrInput input)
126 { 188 {
127 var userInfo = await _userManager.GetUserInfo(); 189 var userInfo = await _userManager.GetUserInfo();
128 var entity = input.Adapt<LqHytkHytkEntity>(); 190 var entity = input.Adapt<LqHytkHytkEntity>();
129 entity.Id = YitIdHelper.NextId().ToString(); 191 entity.Id = YitIdHelper.NextId().ToString();
  192 + entity.F_CreateTime = DateTime.Now;
  193 + entity.F_CreateUser = userInfo.userId;
  194 + entity.F_DeleteMark = 0;
130 entity.Tksj = DateTime.Now; 195 entity.Tksj = DateTime.Now;
131 - entity.Tkr = _userManager.UserId; 196 + entity.Czry = userInfo.userId;
  197 +
132 try 198 try
133 { 199 {
134 - //开启事务 200 + // 开启事务
135 _db.BeginTran(); 201 _db.BeginTran();
136 202
137 - //新增会员退卡记录 203 + // 新增退卡主表记录
138 var newEntity = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteReturnEntityAsync(); 204 var newEntity = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteReturnEntityAsync();
139 205
140 - var lqHytkMxEntityList = input.lqHytkMxList.Adapt<List<LqHytkMxEntity>>();  
141 - if(lqHytkMxEntityList != null) 206 + // 收集所有需要插入的实体,然后批量插入
  207 + var allMxEntities = new List<LqHytkMxEntity>();
  208 + var allJksyjEntities = new List<LqHytkJksyjEntity>();
  209 + var allKjbsyjEntities = new List<LqHytkKjbsyjEntity>();
  210 +
  211 + // 处理品项明细列表
  212 + if (input.lqHytkMxList != null && input.lqHytkMxList.Any())
142 { 213 {
143 - foreach (var item in lqHytkMxEntityList) 214 + foreach (var item in input.lqHytkMxList)
144 { 215 {
145 - item.Id = YitIdHelper.NextId().ToString();  
146 - item.Gltkbh = newEntity.Id; 216 + // 创建品项明细实体
  217 + var lqHytkMxEntity = new LqHytkMxEntity
  218 + {
  219 + Id = YitIdHelper.NextId().ToString(),
  220 + Gltkbh = newEntity.Id,
  221 + F_CreateTime = DateTime.Now,
  222 + F_CreateUser = userInfo.userId,
  223 + F_DeleteMark = 0,
  224 + Px = item.px,
  225 + Pxmc = item.pxmc,
  226 + Pxjg = item.pxjg,
  227 + Tkje = item.tkje,
  228 + F_ProjectNumber = item.F_ProjectNumber ?? 1,
  229 + F_IsEnabled = item.F_IsEnabled ?? 1,
  230 + F_SourceType = item.F_SourceType,
  231 + F_TotalPrice = item.F_TotalPrice ?? (item.pxjg * (item.F_ProjectNumber ?? 1)),
  232 + };
  233 + allMxEntities.Add(lqHytkMxEntity);
  234 +
  235 + // 收集该品项关联的健康师业绩
  236 + if (item.lqHytkJksyjList != null && item.lqHytkJksyjList.Any())
  237 + {
  238 + foreach (var ijks_tem in item.lqHytkJksyjList)
  239 + {
  240 + allJksyjEntities.Add(new LqHytkJksyjEntity
  241 + {
  242 + Id = YitIdHelper.NextId().ToString(),
  243 + Gltkbh = newEntity.Id,
  244 + Jks = ijks_tem.jks,
  245 + Jksxm = ijks_tem.jksxm,
  246 + Jkszh = ijks_tem.jkszh,
  247 + Jksyj = ijks_tem.jksyj,
  248 + Tksj = DateTime.Now,
  249 + F_jsjid = ijks_tem.F_jsjid,
  250 + F_tkpxid = ijks_tem.F_tkpxid,
  251 + F_LaborCost = ijks_tem.F_LaborCost,
  252 + F_tkpxNumber = ijks_tem.F_tkpxNumber,
  253 + F_CreateTime = DateTime.Now,
  254 + F_CreateUser = userInfo.userId,
  255 + F_DeleteMark = 0,
  256 + });
  257 + }
  258 + }
  259 +
  260 + // 收集该品项关联的科技部老师业绩
  261 + if (item.lqHytkKjbsyjList != null && item.lqHytkKjbsyjList.Any())
  262 + {
  263 + foreach (var ikjbs_tem in item.lqHytkKjbsyjList)
  264 + {
  265 + allKjbsyjEntities.Add(new LqHytkKjbsyjEntity
  266 + {
  267 + Id = YitIdHelper.NextId().ToString(),
  268 + Gltkbh = newEntity.Id,
  269 + Kjbls = ikjbs_tem.kjbls,
  270 + Kjblsxm = ikjbs_tem.kjblsxm,
  271 + Kjblszh = ikjbs_tem.kjblszh,
  272 + Kjblsyj = ikjbs_tem.kjblsyj,
  273 + Tksj = DateTime.Now,
  274 + F_tkpxid = ikjbs_tem.F_tkpxid,
  275 + F_LaborCost = ikjbs_tem.F_LaborCost,
  276 + F_tkpxNumber = ikjbs_tem.F_tkpxNumber,
  277 + F_CreateTime = DateTime.Now,
  278 + F_CreateUser = userInfo.userId,
  279 + F_DeleteMark = 0,
  280 + });
  281 + }
  282 + }
147 } 283 }
148 - await _db.Insertable(lqHytkMxEntityList).ExecuteCommandAsync();  
149 } 284 }
150 -  
151 - //关闭事务  
152 - _db.CommitTran();  
153 - }  
154 - catch (Exception)  
155 - {  
156 - //回滚事务  
157 - _db.RollbackTran();  
158 - throw NCCException.Oh(ErrorCode.COM1000);  
159 - }  
160 - }  
161 -  
162 - /// <summary>  
163 - /// 获取会员退卡无分页列表  
164 - /// </summary>  
165 - /// <param name="input">请求参数</param>  
166 - /// <returns></returns>  
167 - [NonAction]  
168 - public async Task<dynamic> GetNoPagingList([FromQuery] LqHytkHytkListQueryInput input)  
169 - {  
170 - var sidx = input.sidx == null ? "id" : input.sidx;  
171 - List<string> queryTksj = input.tksj != null ? input.tksj.Split(',').ToObeject<List<string>>() : null;  
172 - DateTime? startTksj = queryTksj != null ? Ext.GetDateTime(queryTksj.First()) : null;  
173 - DateTime? endTksj = queryTksj != null ? Ext.GetDateTime(queryTksj.Last()) : null;  
174 - var data = await _db.Queryable<LqHytkHytkEntity>()  
175 - .WhereIF(!string.IsNullOrEmpty(input.id), p => p.Id.Contains(input.id))  
176 - .WhereIF(!string.IsNullOrEmpty(input.md), p => p.Md.Equals(input.md))  
177 - .WhereIF(!string.IsNullOrEmpty(input.mcbh), p => p.Mcbh.Contains(input.mcbh))  
178 - .WhereIF(!string.IsNullOrEmpty(input.mdmc), p => p.Mdmc.Contains(input.mdmc))  
179 - .WhereIF(!string.IsNullOrEmpty(input.hy), p => p.Hy.Equals(input.hy))  
180 - .WhereIF(!string.IsNullOrEmpty(input.hyxm), p => p.Hyxm.Contains(input.hyxm))  
181 - .WhereIF(!string.IsNullOrEmpty(input.hyzh), p => p.Hyzh.Contains(input.hyzh))  
182 - .WhereIF(!string.IsNullOrEmpty(input.jks), p => p.Jks.Equals(input.jks))  
183 - .WhereIF(!string.IsNullOrEmpty(input.jkszh), p => p.Jkszh.Contains(input.jkszh))  
184 - .WhereIF(!string.IsNullOrEmpty(input.jksxm), p => p.Jksxm.Contains(input.jksxm))  
185 - .WhereIF(!string.IsNullOrEmpty(input.bz), p => p.Bz.Contains(input.bz))  
186 - .WhereIF(!string.IsNullOrEmpty(input.tkpx), p => p.Tkpx.Contains(input.tkpx))  
187 - .WhereIF(queryTksj != null, p => p.Tksj >= new DateTime(startTksj.ToDate().Year, startTksj.ToDate().Month, startTksj.ToDate().Day, 0, 0, 0))  
188 - .WhereIF(queryTksj != null, p => p.Tksj <= new DateTime(endTksj.ToDate().Year, endTksj.ToDate().Month, endTksj.ToDate().Day, 23, 59, 59))  
189 - .WhereIF(!string.IsNullOrEmpty(input.tkr), p => p.Tkr.Equals(input.tkr))  
190 - .Select(it=> new LqHytkHytkListOutput  
191 - {  
192 - id = it.Id,  
193 - md=it.Md,  
194 - mcbh=it.Mcbh,  
195 - mdmc=it.Mdmc,  
196 - hy=it.Hy,  
197 - hyxm=it.Hyxm,  
198 - hyzh=it.Hyzh,  
199 - jks=it.Jks,  
200 - jkszh=it.Jkszh,  
201 - jksxm=it.Jksxm,  
202 - bz=it.Bz,  
203 - tkpx=it.Tkpx,  
204 - tksj=it.Tksj,  
205 - tkr=it.Tkr,  
206 - }).MergeTable().OrderBy(sidx+" "+input.sort).ToListAsync();  
207 - return data;  
208 - }  
209 -  
210 - /// <summary>  
211 - /// 导出会员退卡  
212 - /// </summary>  
213 - /// <param name="input">请求参数</param>  
214 - /// <returns></returns>  
215 - [HttpGet("Actions/Export")]  
216 - public async Task<dynamic> Export([FromQuery] LqHytkHytkListQueryInput input)  
217 - {  
218 - var userInfo = await _userManager.GetUserInfo();  
219 - var exportData = new List<LqHytkHytkListOutput>();  
220 - if (input.dataType == 0)  
221 - {  
222 - var data = Clay.Object(await this.GetList(input));  
223 - exportData = data.Solidify<PageResult<LqHytkHytkListOutput>>().list;  
224 - }  
225 - else  
226 - {  
227 - exportData = await this.GetNoPagingList(input);  
228 - }  
229 - List<ParamsModel> paramList = "[{\"value\":\"退卡编号\",\"field\":\"id\"},{\"value\":\"门店\",\"field\":\"md\"},{\"value\":\"门店编号\",\"field\":\"mcbh\"},{\"value\":\"门店名称\",\"field\":\"mdmc\"},{\"value\":\"会员\",\"field\":\"hy\"},{\"value\":\"会员姓名\",\"field\":\"hyxm\"},{\"value\":\"会员账号\",\"field\":\"hyzh\"},{\"value\":\"健康师\",\"field\":\"jks\"},{\"value\":\"健康师账号\",\"field\":\"jkszh\"},{\"value\":\"健康师姓名\",\"field\":\"jksxm\"},{\"value\":\"备注\",\"field\":\"bz\"},{\"value\":\"退卡品项\",\"field\":\"tkpx\"},{\"value\":\"退卡时间\",\"field\":\"tksj\"},{\"value\":\"退卡人\",\"field\":\"tkr\"},]".ToList<ParamsModel>();  
230 - ExcelConfig excelconfig = new ExcelConfig();  
231 - excelconfig.FileName = "会员退卡.xls";  
232 - excelconfig.HeadFont = "微软雅黑";  
233 - excelconfig.HeadPoint = 10;  
234 - excelconfig.IsAllSizeColumn = true;  
235 - excelconfig.ColumnModel = new List<ExcelColumnModel>();  
236 - List<string> selectKeyList = input.selectKey.Split(',').ToList();  
237 - foreach (var item in selectKeyList)  
238 - {  
239 - var isExist = paramList.Find(p => p.field == item);  
240 - if (isExist != null) 285 +
  286 + // 批量插入品项明细
  287 + if (allMxEntities.Any())
241 { 288 {
242 - excelconfig.ColumnModel.Add(new ExcelColumnModel() { Column = isExist.field, ExcelColumn = isExist.value }); 289 + await _db.Insertable(allMxEntities).ExecuteCommandAsync();
243 } 290 }
244 - }  
245 - var addPath = FileVariable.TemporaryFilePath + excelconfig.FileName;  
246 - ExcelExportHelper<LqHytkHytkListOutput>.Export(exportData, excelconfig, addPath);  
247 - var fileName = _userManager.UserId + "|" + addPath + "|xls";  
248 - var output = new  
249 - {  
250 - name = excelconfig.FileName,  
251 - url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fileName, "NCC")  
252 - };  
253 - return output;  
254 - }  
255 -  
256 - /// <summary>  
257 - /// 批量删除会员退卡  
258 - /// </summary>  
259 - /// <param name="ids">主键数组</param>  
260 - /// <returns></returns>  
261 - [HttpPost("batchRemove")]  
262 - public async Task BatchRemove([FromBody] List<string> ids)  
263 - {  
264 - var entitys = await _db.Queryable<LqHytkHytkEntity>().In(it => it.Id, ids).ToListAsync();  
265 - if (entitys.Count > 0)  
266 - {  
267 - try 291 +
  292 + // 批量插入健康师业绩
  293 + if (allJksyjEntities.Any())
268 { 294 {
269 - //开启事务  
270 - _db.BeginTran();  
271 - //批量删除会员退卡  
272 - await _db.Deleteable<LqHytkHytkEntity>().In(d => d.Id,ids).ExecuteCommandAsync();  
273 -  
274 - //清空子表数据  
275 - await _db.Deleteable<LqHytkMxEntity>().In(u => u.Gltkbh,ids).ExecuteCommandAsync();  
276 - //关闭事务  
277 - _db.CommitTran(); 295 + await _db.Insertable(allJksyjEntities).ExecuteCommandAsync();
278 } 296 }
279 - catch (Exception) 297 +
  298 + // 批量插入科技部老师业绩
  299 + if (allKjbsyjEntities.Any())
280 { 300 {
281 - //回滚事务  
282 - _db.RollbackTran();  
283 - throw NCCException.Oh(ErrorCode.COM1002); 301 + await _db.Insertable(allKjbsyjEntities).ExecuteCommandAsync();
284 } 302 }
  303 +
  304 + // 关闭事务
  305 + _db.CommitTran();
  306 + }
  307 + catch (Exception ex)
  308 + {
  309 + _db.RollbackTran();
  310 + throw NCCException.Oh(ErrorCode.COM1005, ex.Message);
285 } 311 }
286 } 312 }
287 313
288 /// <summary> 314 /// <summary>
289 - /// 更新会员退卡 315 + /// 更新退卡信息及其关联的品项明细、健康师业绩、科技部老师业绩信息
290 /// </summary> 316 /// </summary>
291 - /// <param name="id">主键</param>  
292 - /// <param name="input">参数</param>  
293 - /// <returns></returns> 317 + /// <remarks>
  318 + /// 更新退卡记录及其关联的品项明细、健康师业绩、科技部老师业绩信息
  319 + /// 先删除原有的关联数据,再插入新的数据
  320 + /// </remarks>
  321 + /// <param name="id">退卡ID</param>
  322 + /// <param name="input">退卡更新参数</param>
  323 + /// <returns>无返回值</returns>
  324 + /// <response code="200">更新成功</response>
  325 + /// <response code="400">参数错误或数据验证失败</response>
  326 + /// <response code="500">服务器内部错误</response>
294 [HttpPut("{id}")] 327 [HttpPut("{id}")]
295 public async Task Update(string id, [FromBody] LqHytkHytkUpInput input) 328 public async Task Update(string id, [FromBody] LqHytkHytkUpInput input)
296 { 329 {
  330 + var userInfo = await _userManager.GetUserInfo();
297 var entity = input.Adapt<LqHytkHytkEntity>(); 331 var entity = input.Adapt<LqHytkHytkEntity>();
  332 + entity.Id = id;
  333 + entity.F_ModifyTime = DateTime.Now;
  334 + entity.F_ModifyUser = userInfo.userId;
  335 +
298 try 336 try
299 { 337 {
300 - //开启事务 338 + // 开启事务
301 _db.BeginTran(); 339 _db.BeginTran();
302 340
303 - //更新会员退卡记录  
304 - await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();  
305 -  
306 - //清空原有数据  
307 - await _db.Deleteable<LqHytkMxEntity>().Where(u => u.Gltkbh == id).ExecuteCommandAsync();  
308 - //新增新数据  
309 - var lqHytkMxEntityList = input.lqHytkMxList.Adapt<List<LqHytkMxEntity>>();  
310 - if(lqHytkMxEntityList != null) 341 + // 更新退卡主表记录
  342 + await _db.Updateable(entity).IgnoreColumns(true).ExecuteCommandAsync();
  343 +
  344 + // 删除原有的关联数据
  345 + await _db.Deleteable<LqHytkMxEntity>().Where(x => x.Gltkbh == id).ExecuteCommandAsync();
  346 + await _db.Deleteable<LqHytkJksyjEntity>().Where(x => x.Gltkbh == id).ExecuteCommandAsync();
  347 + await _db.Deleteable<LqHytkKjbsyjEntity>().Where(x => x.Gltkbh == id).ExecuteCommandAsync();
  348 +
  349 + // 收集所有需要插入的实体,然后批量插入
  350 + var allMxEntities = new List<LqHytkMxEntity>();
  351 + var allJksyjEntities = new List<LqHytkJksyjEntity>();
  352 + var allKjbsyjEntities = new List<LqHytkKjbsyjEntity>();
  353 +
  354 + // 处理品项明细列表
  355 + if (input.lqHytkMxList != null && input.lqHytkMxList.Any())
311 { 356 {
312 - foreach (var item in lqHytkMxEntityList) 357 + foreach (var item in input.lqHytkMxList)
313 { 358 {
314 - item.Id = YitIdHelper.NextId().ToString();  
315 - item.Gltkbh = entity.Id; 359 + // 创建品项明细实体
  360 + var lqHytkMxEntity = new LqHytkMxEntity
  361 + {
  362 + Id = YitIdHelper.NextId().ToString(),
  363 + Gltkbh = id,
  364 + F_CreateTime = DateTime.Now,
  365 + F_CreateUser = userInfo.userId,
  366 + F_DeleteMark = 0,
  367 + Px = item.px,
  368 + Pxmc = item.pxmc,
  369 + Pxjg = item.pxjg,
  370 + Tkje = item.tkje,
  371 + F_ProjectNumber = item.F_ProjectNumber ?? 1,
  372 + F_IsEnabled = item.F_IsEnabled ?? 1,
  373 + F_SourceType = item.F_SourceType,
  374 + F_TotalPrice = item.F_TotalPrice ?? (item.pxjg * (item.F_ProjectNumber ?? 1)),
  375 + };
  376 + allMxEntities.Add(lqHytkMxEntity);
  377 +
  378 + // 收集该品项关联的健康师业绩
  379 + if (item.lqHytkJksyjList != null && item.lqHytkJksyjList.Any())
  380 + {
  381 + foreach (var ijks_tem in item.lqHytkJksyjList)
  382 + {
  383 + allJksyjEntities.Add(new LqHytkJksyjEntity
  384 + {
  385 + Id = YitIdHelper.NextId().ToString(),
  386 + Gltkbh = id,
  387 + Jks = ijks_tem.jks,
  388 + Jksxm = ijks_tem.jksxm,
  389 + Jkszh = ijks_tem.jkszh,
  390 + Jksyj = ijks_tem.jksyj,
  391 + Tksj = DateTime.Now,
  392 + F_jsjid = ijks_tem.F_jsjid,
  393 + F_tkpxid = ijks_tem.F_tkpxid,
  394 + F_LaborCost = ijks_tem.F_LaborCost,
  395 + F_tkpxNumber = ijks_tem.F_tkpxNumber,
  396 + F_CreateTime = DateTime.Now,
  397 + F_CreateUser = userInfo.userId,
  398 + F_DeleteMark = 0,
  399 + });
  400 + }
  401 + }
  402 +
  403 + // 收集该品项关联的科技部老师业绩
  404 + if (item.lqHytkKjbsyjList != null && item.lqHytkKjbsyjList.Any())
  405 + {
  406 + foreach (var ikjbs_tem in item.lqHytkKjbsyjList)
  407 + {
  408 + allKjbsyjEntities.Add(new LqHytkKjbsyjEntity
  409 + {
  410 + Id = YitIdHelper.NextId().ToString(),
  411 + Gltkbh = id,
  412 + Kjbls = ikjbs_tem.kjbls,
  413 + Kjblsxm = ikjbs_tem.kjblsxm,
  414 + Kjblszh = ikjbs_tem.kjblszh,
  415 + Kjblsyj = ikjbs_tem.kjblsyj,
  416 + Tksj = DateTime.Now,
  417 + F_tkpxid = ikjbs_tem.F_tkpxid,
  418 + F_LaborCost = ikjbs_tem.F_LaborCost,
  419 + F_tkpxNumber = ikjbs_tem.F_tkpxNumber,
  420 + F_CreateTime = DateTime.Now,
  421 + F_CreateUser = userInfo.userId,
  422 + F_DeleteMark = 0,
  423 + });
  424 + }
  425 + }
316 } 426 }
317 - await _db.Insertable(lqHytkMxEntityList).ExecuteCommandAsync();  
318 } 427 }
319 428
320 - //关闭事务 429 + // 批量插入品项明细
  430 + if (allMxEntities.Any())
  431 + {
  432 + await _db.Insertable(allMxEntities).ExecuteCommandAsync();
  433 + }
  434 +
  435 + // 批量插入健康师业绩
  436 + if (allJksyjEntities.Any())
  437 + {
  438 + await _db.Insertable(allJksyjEntities).ExecuteCommandAsync();
  439 + }
  440 +
  441 + // 批量插入科技部老师业绩
  442 + if (allKjbsyjEntities.Any())
  443 + {
  444 + await _db.Insertable(allKjbsyjEntities).ExecuteCommandAsync();
  445 + }
  446 +
  447 + // 关闭事务
321 _db.CommitTran(); 448 _db.CommitTran();
322 } 449 }
323 - catch (Exception) 450 + catch (Exception ex)
324 { 451 {
325 - //回滚事务  
326 _db.RollbackTran(); 452 _db.RollbackTran();
327 - throw NCCException.Oh(ErrorCode.COM1001); 453 + throw NCCException.Oh(ErrorCode.COM1005, ex.Message);
328 } 454 }
329 } 455 }
330 456
331 /// <summary> 457 /// <summary>
332 - /// 删除会员退卡 458 + /// 删除退卡信息
333 /// </summary> 459 /// </summary>
  460 + /// <param name="id">主键</param>
334 /// <returns></returns> 461 /// <returns></returns>
335 [HttpDelete("{id}")] 462 [HttpDelete("{id}")]
336 public async Task Delete(string id) 463 public async Task Delete(string id)
337 { 464 {
338 var entity = await _db.Queryable<LqHytkHytkEntity>().FirstAsync(p => p.Id == id); 465 var entity = await _db.Queryable<LqHytkHytkEntity>().FirstAsync(p => p.Id == id);
339 - _ = entity ?? throw NCCException.Oh(ErrorCode.COM1005); 466 + if (entity != null)
  467 + {
  468 + entity.F_DeleteMark = 1;
  469 + await _lqHytkHytkRepository.UpdateAsync(entity);
  470 + }
  471 + }
  472 +
  473 + /// <summary>
  474 + /// 获取退卡信息详情
  475 + /// </summary>
  476 + /// <remarks>
  477 + /// 获取退卡记录及其关联的品项明细、健康师业绩、科技部老师业绩信息
  478 + /// 按照退卡的完整格式返回数据,不包含汇总信息
  479 + ///
  480 + /// 返回数据结构:
  481 + /// - 主表信息:退卡基础信息、门店信息、会员信息、退卡金额等
  482 + /// - 品项明细列表:每个品项包含完整的项目信息(项目次数、是否有效、来源类型等)
  483 + /// - 健康师业绩列表:按品项关联的健康师业绩信息
  484 + /// - 科技部老师业绩列表:按品项关联的科技部老师业绩信息
  485 + /// </remarks>
  486 + /// <param name="id">退卡记录主键ID</param>
  487 + /// <returns>退卡记录完整信息</returns>
  488 + /// <response code="200">查询成功</response>
  489 + /// <response code="404">退卡记录不存在</response>
  490 + /// <response code="500">服务器内部错误</response>
  491 + [HttpGet("{id}")]
  492 + public async Task<dynamic> GetInfo(string id)
  493 + {
340 try 494 try
341 { 495 {
342 - //开启事务  
343 - _db.BeginTran();  
344 -  
345 - //删除会员退卡记录  
346 - await _db.Deleteable<LqHytkHytkEntity>().Where(d => d.Id == id).ExecuteCommandAsync(); 496 + // 1. 查询主表信息
  497 + var entity = await _db.Queryable<LqHytkHytkEntity>().FirstAsync(p => p.Id == id);
  498 + if (entity == null)
  499 + {
  500 + throw NCCException.Oh(ErrorCode.COM1005, "退卡记录不存在");
  501 + }
347 502
348 - //清空子表数据  
349 - await _db.Deleteable<LqHytkMxEntity>().Where(u => u.Gltkbh == id).ExecuteCommandAsync();  
350 -  
351 - //关闭事务  
352 - _db.CommitTran(); 503 + var output = entity.Adapt<LqHytkHytkInfoOutput>();
  504 +
  505 + // 2. 查询品项明细列表
  506 + var lqHytkMxList = await _db.Queryable<LqHytkMxEntity>()
  507 + .Where(w => w.Gltkbh == entity.Id)
  508 + .ToListAsync();
  509 +
  510 + // 3. 查询健康师业绩列表
  511 + var lqHytkJksyjList = await _db.Queryable<LqHytkJksyjEntity>()
  512 + .Where(w => w.Gltkbh == entity.Id)
  513 + .ToListAsync();
  514 +
  515 + // 4. 查询科技部老师业绩列表
  516 + var lqHytkKjbsyjList = await _db.Queryable<LqHytkKjbsyjEntity>()
  517 + .Where(w => w.Gltkbh == entity.Id)
  518 + .ToListAsync();
  519 +
  520 + // 5. 构建品项明细输出,每个品项关联对应的业绩信息
  521 + var mxOutputList = new List<LqHytkMxInfoOutput>();
  522 + foreach (var mx in lqHytkMxList)
  523 + {
  524 + var mxOutput = new LqHytkMxInfoOutput
  525 + {
  526 + id = mx.Id,
  527 + gltkbh = mx.Gltkbh,
  528 + px = mx.Px,
  529 + pxmc = mx.Pxmc,
  530 + pxjg = mx.Pxjg,
  531 + tkje = mx.Tkje,
  532 + F_ProjectNumber = mx.F_ProjectNumber,
  533 + F_IsEnabled = mx.F_IsEnabled,
  534 + F_SourceType = mx.F_SourceType,
  535 + F_TotalPrice = mx.F_TotalPrice
  536 + };
  537 +
  538 + // 关联该品项的健康师业绩
  539 + var jksyjForMx = lqHytkJksyjList.Where(j => j.F_tkpxid == mx.Id).ToList();
  540 + mxOutput.lqHytkJksyjList = jksyjForMx.Adapt<List<LqHytkJksyjInfoOutput>>();
  541 +
  542 + // 关联该品项的科技部老师业绩
  543 + var kjbsyjForMx = lqHytkKjbsyjList.Where(k => k.F_tkpxid == mx.Id).ToList();
  544 + mxOutput.lqHytkKjbsyjList = kjbsyjForMx.Adapt<List<LqHytkKjbsyjInfoOutput>>();
  545 +
  546 + mxOutputList.Add(mxOutput);
  547 + }
  548 +
  549 + // 6. 设置输出结果
  550 + output.lqHytkMxList = mxOutputList;
  551 +
  552 + // 7. 设置全局业绩列表(用于兼容性,但主要使用品项关联的业绩)
  553 + output.lqHytkJksyjList = lqHytkJksyjList.Adapt<List<LqHytkJksyjInfoOutput>>();
  554 + output.lqHytkKjbsyjList = lqHytkKjbsyjList.Adapt<List<LqHytkKjbsyjInfoOutput>>();
  555 +
  556 + return output;
353 } 557 }
354 catch (Exception) 558 catch (Exception)
355 { 559 {
356 - //回滚事务  
357 - _db.RollbackTran();  
358 - throw NCCException.Oh(ErrorCode.COM1002); 560 + throw NCCException.Oh(ErrorCode.COM1000, "获取退卡记录失败");
359 } 561 }
360 } 562 }
361 } 563 }
netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs
@@ -74,23 +74,94 @@ namespace NCC.Extend.LqKdKdjlb @@ -74,23 +74,94 @@ namespace NCC.Extend.LqKdKdjlb
74 /// <summary> 74 /// <summary>
75 /// 获取开单记录表 75 /// 获取开单记录表
76 /// </summary> 76 /// </summary>
77 - /// <param name="id">参数</param>  
78 - /// <returns></returns> 77 + /// <remarks>
  78 + /// 获取开单记录及其关联的品项明细、健康师业绩、科技部老师业绩信息
  79 + /// 按照开单的完整格式返回数据,不包含汇总信息
  80 + ///
  81 + /// 返回数据结构:
  82 + /// - 主表信息:开单基础信息、业绩信息、支付信息、会员信息等
  83 + /// - 品项明细列表:每个品项包含完整的项目信息(项目次数、是否有效、来源类型等)
  84 + /// - 健康师业绩列表:按品项关联的健康师业绩信息
  85 + /// - 科技部老师业绩列表:按品项关联的科技部老师业绩信息
  86 + /// </remarks>
  87 + /// <param name="id">开单记录主键ID</param>
  88 + /// <returns>开单记录完整信息</returns>
  89 + /// <response code="200">查询成功</response>
  90 + /// <response code="404">开单记录不存在</response>
  91 + /// <response code="500">服务器内部错误</response>
79 [HttpGet("{id}")] 92 [HttpGet("{id}")]
80 public async Task<dynamic> GetInfo(string id) 93 public async Task<dynamic> GetInfo(string id)
81 { 94 {
82 - var entity = await _db.Queryable<LqKdKdjlbEntity>().FirstAsync(p => p.Id == id);  
83 - var output = entity.Adapt<LqKdKdjlbInfoOutput>(); 95 + try
  96 + {
  97 + // 1. 查询主表信息
  98 + var entity = await _db.Queryable<LqKdKdjlbEntity>().FirstAsync(p => p.Id == id);
  99 + if (entity == null)
  100 + {
  101 + throw NCCException.Oh(ErrorCode.COM1005, "开单记录不存在");
  102 + }
84 103
85 - var lqKdJksyjList = await _db.Queryable<LqKdJksyjEntity>().Where(w => w.Glkdbh == entity.Id).ToListAsync();  
86 - output.lqKdJksyjList = lqKdJksyjList.Adapt<List<LqKdJksyjInfoOutput>>(); 104 + var output = entity.Adapt<LqKdKdjlbInfoOutput>();
87 105
88 - var lqKdKjbsyjList = await _db.Queryable<LqKdKjbsyjEntity>().Where(w => w.Glkdbh == entity.Id).ToListAsync();  
89 - output.lqKdKjbsyjList = lqKdKjbsyjList.Adapt<List<LqKdKjbsyjInfoOutput>>(); 106 + // 2. 查询品项明细列表
  107 + var lqKdPxmxList = await _db.Queryable<LqKdPxmxEntity>()
  108 + .Where(w => w.Glkdbh == entity.Id)
  109 + .ToListAsync();
90 110
91 - var lqKdPxmxList = await _db.Queryable<LqKdPxmxEntity>().Where(w => w.Glkdbh == entity.Id).ToListAsync();  
92 - output.lqKdPxmxList = lqKdPxmxList.Adapt<List<LqKdPxmxInfoOutput>>();  
93 - return output; 111 + // 3. 查询健康师业绩列表
  112 + var lqKdJksyjList = await _db.Queryable<LqKdJksyjEntity>()
  113 + .Where(w => w.Glkdbh == entity.Id)
  114 + .ToListAsync();
  115 +
  116 + // 4. 查询科技部老师业绩列表
  117 + var lqKdKjbsyjList = await _db.Queryable<LqKdKjbsyjEntity>()
  118 + .Where(w => w.Glkdbh == entity.Id)
  119 + .ToListAsync();
  120 +
  121 + // 5. 构建品项明细输出,每个品项关联对应的业绩信息
  122 + var pxmxOutputList = new List<LqKdPxmxInfoOutput>();
  123 + foreach (var pxmx in lqKdPxmxList)
  124 + {
  125 + var pxmxOutput = new LqKdPxmxInfoOutput
  126 + {
  127 + id = pxmx.Id,
  128 + glkdbh = pxmx.Glkdbh,
  129 + px = pxmx.Px,
  130 + pxmc = pxmx.Pxmc,
  131 + pxjg = pxmx.Pxjg,
  132 + projectNumber = pxmx.ProjectNumber,
  133 + isEnabled = pxmx.IsEnabled,
  134 + sourceType = pxmx.SourceType,
  135 + memberId = pxmx.MemberId,
  136 + createTime = pxmx.CreateTIme,
  137 + totalPrice = pxmx.TotalPrice
  138 + };
  139 +
  140 + // 关联该品项的健康师业绩
  141 + var jksyjForPx = lqKdJksyjList.Where(j => j.Kdpxid == pxmx.Id).ToList();
  142 + pxmxOutput.lqKdJksyjList = jksyjForPx.Adapt<List<LqKdJksyjInfoOutput>>();
  143 +
  144 + // 关联该品项的科技部老师业绩
  145 + var kjbsyjForPx = lqKdKjbsyjList.Where(k => k.Kdpxid == pxmx.Id).ToList();
  146 + pxmxOutput.lqKdKjbsyjList = kjbsyjForPx.Adapt<List<LqKdKjbsyjInfoOutput>>();
  147 +
  148 + pxmxOutputList.Add(pxmxOutput);
  149 + }
  150 +
  151 + // 6. 设置输出结果
  152 + output.lqKdPxmxList = pxmxOutputList;
  153 +
  154 + // 7. 设置全局业绩列表(用于兼容性,但主要使用品项关联的业绩)
  155 + output.lqKdJksyjList = lqKdJksyjList.Adapt<List<LqKdJksyjInfoOutput>>();
  156 + output.lqKdKjbsyjList = lqKdKjbsyjList.Adapt<List<LqKdKjbsyjInfoOutput>>();
  157 +
  158 + return output;
  159 + }
  160 + catch (Exception ex)
  161 + {
  162 + Console.WriteLine($"获取开单记录失败: {ex.Message}");
  163 + throw NCCException.Oh(ErrorCode.COM1000, "获取开单记录失败");
  164 + }
94 } 165 }
95 #endregion 166 #endregion
96 167
netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs
@@ -19,6 +19,8 @@ using NCC.Extend.Entitys.lq_kd_kdjlb; @@ -19,6 +19,8 @@ using NCC.Extend.Entitys.lq_kd_kdjlb;
19 using NCC.Extend.Entitys.lq_kd_pxmx; 19 using NCC.Extend.Entitys.lq_kd_pxmx;
20 using NCC.Extend.Entitys.lq_xh_hyhk; 20 using NCC.Extend.Entitys.lq_xh_hyhk;
21 using NCC.Extend.Entitys.lq_xh_pxmx; 21 using NCC.Extend.Entitys.lq_xh_pxmx;
  22 +using NCC.Extend.Entitys.lq_hytk_hytk;
  23 +using NCC.Extend.Entitys.lq_hytk_mx;
22 using Yitter.IdGenerator; 24 using Yitter.IdGenerator;
23 using NCC.Common.Helper; 25 using NCC.Common.Helper;
24 using NCC.JsonSerialization; 26 using NCC.JsonSerialization;
@@ -459,6 +461,7 @@ namespace NCC.Extend.LqKhxx @@ -459,6 +461,7 @@ namespace NCC.Extend.LqKhxx
459 /// <remarks> 461 /// <remarks>
460 /// 根据会员ID查询该会员的剩余品项信息,包括已购买但未消费完的品项详情 462 /// 根据会员ID查询该会员的剩余品项信息,包括已购买但未消费完的品项详情
461 /// 支持按来源类型(F_SourceType)区分相同品项的不同来源,确保数据准确分组 463 /// 支持按来源类型(F_SourceType)区分相同品项的不同来源,确保数据准确分组
  464 + /// 计算逻辑:剩余数量 = 购买数量 - 消费数量 - 退卡数量
462 /// 465 ///
463 /// 示例请求: 466 /// 示例请求:
464 /// ```json 467 /// ```json
@@ -478,12 +481,14 @@ namespace NCC.Extend.LqKhxx @@ -478,12 +481,14 @@ namespace NCC.Extend.LqKhxx
478 /// - SourceType: 来源类型(用于区分相同品项的不同来源) 481 /// - SourceType: 来源类型(用于区分相同品项的不同来源)
479 /// - TotalPurchased: 总购买数量 482 /// - TotalPurchased: 总购买数量
480 /// - ConsumedCount: 已消费数量 483 /// - ConsumedCount: 已消费数量
  484 + /// - RefundedCount: 已退卡数量
481 /// - RemainingCount: 剩余数量 485 /// - RemainingCount: 剩余数量
482 /// 486 ///
483 /// 特殊说明: 487 /// 特殊说明:
484 /// - 相同品项但不同SourceType的记录会分开显示 488 /// - 相同品项但不同SourceType的记录会分开显示
485 - /// - 耗卡统计会按品项ID和SourceType精确匹配 489 + /// - 耗卡和退卡统计会按品项ID和SourceType精确匹配
486 /// - 确保数据按SourceType正确分组且不重叠 490 /// - 确保数据按SourceType正确分组且不重叠
  491 + /// - 退卡记录会减少剩余品项数量
487 /// </remarks> 492 /// </remarks>
488 /// <param name="memberId">会员ID</param> 493 /// <param name="memberId">会员ID</param>
489 /// <returns>会员剩余品项信息</returns> 494 /// <returns>会员剩余品项信息</returns>
@@ -581,7 +586,36 @@ namespace NCC.Extend.LqKhxx @@ -581,7 +586,36 @@ namespace NCC.Extend.LqKhxx
581 _logger.LogInformation("耗卡品项统计查询成功,数量:{Count}", consumedItems.Count); 586 _logger.LogInformation("耗卡品项统计查询成功,数量:{Count}", consumedItems.Count);
582 } 587 }
583 588
584 - // 6. 合并计算剩余品项(按品项ID和来源类型匹配) 589 + // 6. 查询退卡记录ID列表
  590 + _logger.LogInformation("开始查询退卡记录ID列表");
  591 + var refundIds = await _db.Queryable<LqHytkHytkEntity>()
  592 + .Where(tk => tk.Hy == memberId && tk.F_DeleteMark != 1)
  593 + .Select(tk => tk.Id)
  594 + .ToListAsync();
  595 +
  596 + _logger.LogInformation("退卡记录ID列表查询成功,数量:{Count}", refundIds.Count);
  597 +
  598 + // 7. 查询退卡品项统计(按品项ID和来源类型分组)
  599 + _logger.LogInformation("开始查询退卡品项统计");
  600 + var refundedItems = new List<dynamic>();
  601 + if (refundIds.Any())
  602 + {
  603 + var tempRefundedItems = await _db.Queryable<LqHytkMxEntity>()
  604 + .Where(px => refundIds.Contains(px.Gltkbh) && px.F_DeleteMark != 1)
  605 + .GroupBy(px => new { px.Px, px.F_SourceType })
  606 + .Select(px => new
  607 + {
  608 + ItemId = px.Px,
  609 + SourceType = SqlFunc.IsNull(px.F_SourceType, "未知"),
  610 + RefundedCount = SqlFunc.AggregateSum(SqlFunc.ToDecimal(px.F_ProjectNumber))
  611 + })
  612 + .ToListAsync();
  613 +
  614 + refundedItems = tempRefundedItems.Cast<dynamic>().ToList();
  615 + _logger.LogInformation("退卡品项统计查询成功,数量:{Count}", refundedItems.Count);
  616 + }
  617 +
  618 + // 8. 合并计算剩余品项(按品项ID和来源类型匹配)
585 _logger.LogInformation("开始合并计算剩余品项"); 619 _logger.LogInformation("开始合并计算剩余品项");
586 var remainingItems = new List<RemainingItemInfo>(); 620 var remainingItems = new List<RemainingItemInfo>();
587 621
@@ -593,7 +627,15 @@ namespace NCC.Extend.LqKhxx @@ -593,7 +627,15 @@ namespace NCC.Extend.LqKhxx
593 x.ItemId == purchased.ItemId && 627 x.ItemId == purchased.ItemId &&
594 x.SourceType == purchased.SourceType); 628 x.SourceType == purchased.SourceType);
595 var consumedCount = consumed?.ConsumedCount ?? 0; 629 var consumedCount = consumed?.ConsumedCount ?? 0;
596 - var remainingCount = purchased.TotalPurchased - consumedCount; 630 +
  631 + // 按品项ID和来源类型匹配退卡记录
  632 + var refunded = refundedItems.FirstOrDefault(x =>
  633 + x.ItemId == purchased.ItemId &&
  634 + x.SourceType == purchased.SourceType);
  635 + var refundedCount = refunded?.RefundedCount ?? 0;
  636 +
  637 + // 计算剩余数量:购买数量 - 消费数量 - 退卡数量
  638 + var remainingCount = purchased.TotalPurchased - consumedCount - refundedCount;
597 639
598 if (remainingCount > 0) 640 if (remainingCount > 0)
599 { 641 {
@@ -605,6 +647,7 @@ namespace NCC.Extend.LqKhxx @@ -605,6 +647,7 @@ namespace NCC.Extend.LqKhxx
605 SourceType = purchased.SourceType?.ToString() ?? "未知", 647 SourceType = purchased.SourceType?.ToString() ?? "未知",
606 TotalPurchased = purchased.TotalPurchased, 648 TotalPurchased = purchased.TotalPurchased,
607 ConsumedCount = consumedCount, 649 ConsumedCount = consumedCount,
  650 + RefundedCount = refundedCount,
608 RemainingCount = remainingCount 651 RemainingCount = remainingCount
609 }); 652 });
610 } 653 }
netcore/src/Modularity/Extend/NCC.Extend/LqMdxxService.cs
@@ -325,5 +325,6 @@ namespace NCC.Extend.LqMdxx @@ -325,5 +325,6 @@ namespace NCC.Extend.LqMdxx
325 .ToListAsync(); 325 .ToListAsync();
326 return new { list = list }; 326 return new { list = list };
327 } 327 }
  328 +
328 } 329 }
329 } 330 }
netcore/src/Modularity/Extend/NCC.Extend/LqStatisticsService.cs
@@ -14,6 +14,9 @@ using System.Collections.Generic; @@ -14,6 +14,9 @@ using System.Collections.Generic;
14 using System.Linq; 14 using System.Linq;
15 using System.Threading.Tasks; 15 using System.Threading.Tasks;
16 using NCC.Extend.Entitys.lq_mdxx; 16 using NCC.Extend.Entitys.lq_mdxx;
  17 +using NCC.Extend.Entitys.Dto.LqMdxx;
  18 +using NCC.System.Entitys.Permission;
  19 +using Microsoft.Extensions.Logging;
17 20
18 namespace NCC.Extend.LqStatistics 21 namespace NCC.Extend.LqStatistics
19 { 22 {
@@ -27,29 +30,23 @@ namespace NCC.Extend.LqStatistics @@ -27,29 +30,23 @@ namespace NCC.Extend.LqStatistics
27 private readonly ISqlSugarRepository<LqMdxxEntity> _lqMdxxRepository; 30 private readonly ISqlSugarRepository<LqMdxxEntity> _lqMdxxRepository;
28 private readonly SqlSugarScope _db; 31 private readonly SqlSugarScope _db;
29 private readonly IUserManager _userManager; 32 private readonly IUserManager _userManager;
  33 + private readonly ILogger<LqStatisticsService> _logger;
30 34
31 /// <summary> 35 /// <summary>
32 /// 初始化一个<see cref="LqStatisticsService"/>类型的新实例 36 /// 初始化一个<see cref="LqStatisticsService"/>类型的新实例
33 /// </summary> 37 /// </summary>
34 public LqStatisticsService( 38 public LqStatisticsService(
35 ISqlSugarRepository<LqMdxxEntity> lqMdxxRepository, 39 ISqlSugarRepository<LqMdxxEntity> lqMdxxRepository,
36 - IUserManager userManager) 40 + IUserManager userManager,
  41 + ILogger<LqStatisticsService> logger)
37 { 42 {
38 _lqMdxxRepository = lqMdxxRepository; 43 _lqMdxxRepository = lqMdxxRepository;
39 _db = _lqMdxxRepository.Context; 44 _db = _lqMdxxRepository.Context;
40 _userManager = userManager; 45 _userManager = userManager;
  46 + _logger = logger;
41 } 47 }
42 48
43 - /// <summary>  
44 - /// 测试接口  
45 - /// </summary>  
46 - /// <returns>测试结果</returns>  
47 - [HttpGet]  
48 - public async Task<dynamic> Test()  
49 - {  
50 - return await Task.FromResult(new { message = "绿纤统计服务运行正常", timestamp = DateTime.Now });  
51 - }  
52 - 49 + #region 获取门店业绩统计列表
53 /// <summary> 50 /// <summary>
54 /// 获取门店业绩统计列表 51 /// 获取门店业绩统计列表
55 /// </summary> 52 /// </summary>
@@ -91,5 +88,131 @@ namespace NCC.Extend.LqStatistics @@ -91,5 +88,131 @@ namespace NCC.Extend.LqStatistics
91 throw NCCException.Oh(ErrorCode.COM1005, ex.Message); 88 throw NCCException.Oh(ErrorCode.COM1005, ex.Message);
92 } 89 }
93 } 90 }
  91 + #endregion
  92 +
  93 + #region 门店统计信息
  94 + /// <summary>
  95 + /// 获取门店统计信息
  96 + /// </summary>
  97 + /// <remarks>
  98 + /// 统计各个门店在员工数量、项目数(耗卡里面的项目数量)和消耗业绩(耗卡里面的金额)
  99 + /// 可以传入日期,然后去统计本月一号到传入的日期
  100 + ///
  101 + /// 示例请求:
  102 + /// ```json
  103 + /// {
  104 + /// "queryDate": "2025-09-14"
  105 + /// }
  106 + /// ```
  107 + ///
  108 + /// 参数说明:
  109 + /// - queryDate: 查询日期,系统会自动计算本月1号到该日期的统计范围
  110 + /// </remarks>
  111 + /// <param name="input">查询参数</param>
  112 + /// <returns>门店统计结果</returns>
  113 + /// <response code="200">查询成功</response>
  114 + /// <response code="400">参数错误</response>
  115 + /// <response code="500">服务器内部错误</response>
  116 + [HttpPost("StoreStatistics")]
  117 + public async Task<StoreStatisticsOutput> GetStoreStatistics([FromBody] StoreStatisticsInput input)
  118 + {
  119 + try
  120 + {
  121 + _logger.LogInformation("开始查询门店统计信息,查询日期:{QueryDate}", input.QueryDate);
  122 +
  123 + // 计算查询时间范围:本月1号到传入日期
  124 + var startDate = new DateTime(input.QueryDate.Year, input.QueryDate.Month, 1);
  125 + var endDate = input.QueryDate.Date.AddDays(1).AddSeconds(-1); // 包含当天结束时间
  126 +
  127 + _logger.LogInformation("统计时间范围:{StartDate} 到 {EndDate}", startDate, endDate);
  128 +
  129 + // 1. 查询门店基础信息
  130 + var storeList = await _db.Queryable<LqMdxxEntity>()
  131 + .Select(it => new StoreStatisticsInfo
  132 + {
  133 + StoreId = it.Id,
  134 + StoreCode = it.Mdbm,
  135 + StoreName = it.Dm,
  136 + City = it.Cs,
  137 + BusinessUnit = it.Syb,
  138 + EmployeeCount = 0,
  139 + ProjectCount = 0,
  140 + ConsumeAmount = 0
  141 + })
  142 + .ToListAsync();
  143 +
  144 + _logger.LogInformation("查询到门店数量:{Count}", storeList.Count);
  145 +
  146 + // 2. 查询员工数量(按门店统计)
  147 + var employeeCounts = await _db.Queryable<UserEntity>()
  148 + .Where(u => !string.IsNullOrEmpty(u.Mdid) && u.DeleteMark != 1)
  149 + .GroupBy(u => u.Mdid)
  150 + .Select(g => new { StoreId = g.Mdid, Count = SqlFunc.AggregateCount(g.Id) })
  151 + .ToListAsync();
  152 +
  153 + _logger.LogInformation("查询到员工统计数量:{Count}", employeeCounts.Count);
  154 +
  155 + // 3. 从视图查询项目数和消耗业绩
  156 + var consumeStats = await _db.SqlQueryable<dynamic>(@"
  157 + SELECT
  158 + store_id,
  159 + SUM(total_project_count) as total_project_count,
  160 + SUM(total_consume_amount) as total_consume_amount
  161 + FROM v_store_daily_consume_stats
  162 + WHERE consume_date >= @startDate AND consume_date <= @endDate
  163 + GROUP BY store_id")
  164 + .AddParameters(new { startDate = startDate.ToString("yyyy-MM-dd"), endDate = input.QueryDate.ToString("yyyy-MM-dd") })
  165 + .ToListAsync();
  166 +
  167 + _logger.LogInformation("查询到消耗统计数量:{Count}", consumeStats.Count);
  168 +
  169 + // 4. 合并统计数据
  170 + foreach (var store in storeList)
  171 + {
  172 + // 匹配员工数量
  173 + var employeeCount = employeeCounts.FirstOrDefault(e => e.StoreId == store.StoreId);
  174 + if (employeeCount != null)
  175 + {
  176 + store.EmployeeCount = employeeCount.Count;
  177 + }
  178 +
  179 + // 匹配项目数和消耗业绩
  180 + var consumeStat = consumeStats.FirstOrDefault(c => c.store_id?.ToString() == store.StoreId);
  181 + if (consumeStat != null)
  182 + {
  183 + store.ProjectCount = Convert.ToDecimal(consumeStat.total_project_count ?? 0);
  184 + store.ConsumeAmount = Convert.ToDecimal(consumeStat.total_consume_amount ?? 0);
  185 + }
  186 + }
  187 +
  188 + // 5. 计算汇总统计
  189 + var summary = new StoreSummaryInfo
  190 + {
  191 + TotalStoreCount = storeList.Count,
  192 + TotalEmployeeCount = storeList.Sum(s => s.EmployeeCount),
  193 + TotalProjectCount = storeList.Sum(s => s.ProjectCount),
  194 + TotalConsumeAmount = storeList.Sum(s => s.ConsumeAmount)
  195 + };
  196 +
  197 + var result = new StoreStatisticsOutput
  198 + {
  199 + StartDate = startDate,
  200 + EndDate = input.QueryDate,
  201 + StoreList = storeList.OrderByDescending(s => s.ConsumeAmount).ToList(),
  202 + Summary = summary
  203 + };
  204 +
  205 + _logger.LogInformation("门店统计查询完成,门店数:{StoreCount},总员工数:{EmployeeCount},总项目数:{ProjectCount},总消耗业绩:{ConsumeAmount}",
  206 + summary.TotalStoreCount, summary.TotalEmployeeCount, summary.TotalProjectCount, summary.TotalConsumeAmount);
  207 +
  208 + return result;
  209 + }
  210 + catch (Exception ex)
  211 + {
  212 + _logger.LogError(ex, "查询门店统计信息时发生错误,查询日期:{QueryDate}", input.QueryDate);
  213 + throw NCCException.Oh(ErrorCode.COM1000, "查询门店统计信息失败");
  214 + }
  215 + }
  216 + #endregion
94 } 217 }
95 } 218 }
netcore/src/Modularity/Extend/NCC.Extend/LqXhHyhkService.cs
@@ -74,23 +74,95 @@ namespace NCC.Extend.LqXhHyhk @@ -74,23 +74,95 @@ namespace NCC.Extend.LqXhHyhk
74 /// <summary> 74 /// <summary>
75 /// 获取会员耗卡 75 /// 获取会员耗卡
76 /// </summary> 76 /// </summary>
77 - /// <param name="id">参数</param>  
78 - /// <returns></returns> 77 + /// <remarks>
  78 + /// 获取耗卡记录及其关联的品项明细、健康师业绩、科技部老师业绩信息
  79 + /// 按照耗卡的完整格式返回数据,不包含汇总信息
  80 + ///
  81 + /// 返回数据结构:
  82 + /// - 主表信息:耗卡基础信息、门店信息、会员信息等
  83 + /// - 品项明细列表:每个品项包含完整的项目信息(项目次数、是否有效、来源类型等)
  84 + /// - 健康师业绩列表:按品项关联的健康师业绩信息
  85 + /// - 科技部老师业绩列表:按品项关联的科技部老师业绩信息
  86 + /// </remarks>
  87 + /// <param name="id">耗卡记录主键ID</param>
  88 + /// <returns>耗卡记录完整信息</returns>
  89 + /// <response code="200">查询成功</response>
  90 + /// <response code="404">耗卡记录不存在</response>
  91 + /// <response code="500">服务器内部错误</response>
79 [HttpGet("{id}")] 92 [HttpGet("{id}")]
80 public async Task<dynamic> GetInfo(string id) 93 public async Task<dynamic> GetInfo(string id)
81 { 94 {
82 - var entity = await _db.Queryable<LqXhHyhkEntity>().FirstAsync(p => p.Id == id);  
83 - var output = entity.Adapt<LqXhHyhkInfoOutput>(); 95 + try
  96 + {
  97 + // 1. 查询主表信息
  98 + var entity = await _db.Queryable<LqXhHyhkEntity>().FirstAsync(p => p.Id == id);
  99 + if (entity == null)
  100 + {
  101 + throw NCCException.Oh(ErrorCode.COM1005, "耗卡记录不存在");
  102 + }
84 103
85 - var lqXhJksyjList = await _db.Queryable<LqXhJksyjEntity>().Where(w => w.Glkdbh == entity.Id).ToListAsync();  
86 - output.lqXhJksyjList = lqXhJksyjList.Adapt<List<LqXhJksyjInfoOutput>>(); 104 + var output = entity.Adapt<LqXhHyhkInfoOutput>();
87 105
88 - var lqXhKjbsyjList = await _db.Queryable<LqXhKjbsyjEntity>().Where(w => w.Glkdbh == entity.Id).ToListAsync();  
89 - output.lqXhKjbsyjList = lqXhKjbsyjList.Adapt<List<LqXhKjbsyjInfoOutput>>(); 106 + // 2. 查询品项明细列表
  107 + var lqXhPxmxList = await _db.Queryable<LqXhPxmxEntity>()
  108 + .Where(w => w.Glkdbh == entity.Id)
  109 + .ToListAsync();
90 110
91 - var lqXhPxmxList = await _db.Queryable<LqXhPxmxEntity>().Where(w => w.Glkdbh == entity.Id).ToListAsync();  
92 - output.lqXhPxmxList = lqXhPxmxList.Adapt<List<LqXhPxmxInfoOutput>>();  
93 - return output; 111 + // 3. 查询健康师业绩列表
  112 + var lqXhJksyjList = await _db.Queryable<LqXhJksyjEntity>()
  113 + .Where(w => w.Glkdbh == entity.Id)
  114 + .ToListAsync();
  115 +
  116 + // 4. 查询科技部老师业绩列表
  117 + var lqXhKjbsyjList = await _db.Queryable<LqXhKjbsyjEntity>()
  118 + .Where(w => w.Glkdbh == entity.Id)
  119 + .ToListAsync();
  120 +
  121 + // 5. 构建品项明细输出,每个品项关联对应的业绩信息
  122 + var pxmxOutputList = new List<LqXhPxmxInfoOutput>();
  123 + foreach (var pxmx in lqXhPxmxList)
  124 + {
  125 + var pxmxOutput = new LqXhPxmxInfoOutput
  126 + {
  127 + id = pxmx.Id,
  128 + glkdbh = pxmx.Glkdbh,
  129 + px = pxmx.Px,
  130 + pxmc = pxmx.Pxmc,
  131 + pxjg = pxmx.Pxjg,
  132 + xfzs = pxmx.Xfzs,
  133 + memberId = pxmx.MemberId,
  134 + createTime = pxmx.CreateTIme,
  135 + projectNumber = pxmx.ProjectNumber,
  136 + isEnabled = pxmx.IsEnabled,
  137 + sourceType = pxmx.SourceType,
  138 + totalPrice = pxmx.TotalPrice
  139 + };
  140 +
  141 + // 关联该品项的健康师业绩
  142 + var jksyjForPx = lqXhJksyjList.Where(j => j.Kdpxid == pxmx.Id).ToList();
  143 + pxmxOutput.lqXhJksyjList = jksyjForPx.Adapt<List<LqXhJksyjInfoOutput>>();
  144 +
  145 + // 关联该品项的科技部老师业绩
  146 + var kjbsyjForPx = lqXhKjbsyjList.Where(k => k.Hkpxid == pxmx.Id).ToList();
  147 + pxmxOutput.lqXhKjbsyjList = kjbsyjForPx.Adapt<List<LqXhKjbsyjInfoOutput>>();
  148 +
  149 + pxmxOutputList.Add(pxmxOutput);
  150 + }
  151 +
  152 + // 6. 设置输出结果
  153 + output.lqXhPxmxList = pxmxOutputList;
  154 +
  155 + // 7. 设置全局业绩列表(用于兼容性,但主要使用品项关联的业绩)
  156 + output.lqXhJksyjList = lqXhJksyjList.Adapt<List<LqXhJksyjInfoOutput>>();
  157 + output.lqXhKjbsyjList = lqXhKjbsyjList.Adapt<List<LqXhKjbsyjInfoOutput>>();
  158 +
  159 + return output;
  160 + }
  161 + catch (Exception ex)
  162 + {
  163 + _logger.LogError(ex, "获取耗卡记录失败,ID:{Id}", id);
  164 + throw NCCException.Oh(ErrorCode.COM1000, "获取耗卡记录失败");
  165 + }
94 } 166 }
95 #endregion 167 #endregion
96 168
创建退卡相关表.sql 0 → 100644
  1 +-- =============================================
  2 +-- 绿纤美业ERP系统 - 退卡相关表创建脚本
  3 +-- 创建时间: 2025-01-27
  4 +-- 说明: 创建会员退卡主表、明细表、业绩表
  5 +-- =============================================
  6 +
  7 +-- 1. 创建会员退卡主表
  8 +DROP TABLE IF EXISTS `lq_hytk_hytk`;
  9 +CREATE TABLE `lq_hytk_hytk` (
  10 + `F_Id` varchar(50) NOT NULL COMMENT '退卡编号',
  11 + `md` varchar(50) DEFAULT NULL COMMENT '门店',
  12 + `mdbh` varchar(50) DEFAULT NULL COMMENT '门店编号',
  13 + `mdmc` varchar(50) DEFAULT NULL COMMENT '门店名称',
  14 + `hy` varchar(50) DEFAULT NULL COMMENT '会员',
  15 + `hyzh` varchar(50) DEFAULT NULL COMMENT '会员账号',
  16 + `hymc` varchar(50) DEFAULT NULL COMMENT '会员名称',
  17 + `gklx` varchar(50) DEFAULT NULL COMMENT '顾客类型',
  18 + `tkje` decimal(15,2) DEFAULT NULL COMMENT '退卡总金额',
  19 + `sgfy` decimal(15,2) DEFAULT NULL COMMENT '手工费用',
  20 + `bz` text COMMENT '备注',
  21 + `tksj` datetime DEFAULT NULL COMMENT '退卡时间',
  22 + `czry` varchar(50) DEFAULT NULL COMMENT '操作人员',
  23 + `tkzt` varchar(20) DEFAULT NULL COMMENT '退卡状态',
  24 + `tkyy` varchar(200) DEFAULT NULL COMMENT '退卡原因',
  25 + `F_CreateTime` datetime DEFAULT NULL COMMENT '创建时间',
  26 + `F_CreateUser` varchar(50) DEFAULT NULL COMMENT '创建用户',
  27 + `F_ModifyTime` datetime DEFAULT NULL COMMENT '修改时间',
  28 + `F_ModifyUser` varchar(50) DEFAULT NULL COMMENT '修改用户',
  29 + `F_DeleteMark` int(1) DEFAULT NULL COMMENT '删除标记',
  30 + PRIMARY KEY (`F_Id`),
  31 + KEY `idx_md` (`md`),
  32 + KEY `idx_hy` (`hy`),
  33 + KEY `idx_tksj` (`tksj`),
  34 + KEY `idx_tkzt` (`tkzt`)
  35 +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='退卡_信息表';
  36 +
  37 +-- 2. 创建会员退卡明细表
  38 +DROP TABLE IF EXISTS `lq_hytk_mx`;
  39 +CREATE TABLE `lq_hytk_mx` (
  40 + `F_Id` varchar(50) NOT NULL COMMENT '明细编号',
  41 + `gltkbh` varchar(50) DEFAULT NULL COMMENT '关联退卡编号',
  42 + `px` varchar(50) DEFAULT NULL COMMENT '品项',
  43 + `pxmc` varchar(100) DEFAULT NULL COMMENT '品项名称',
  44 + `pxjg` decimal(15,2) DEFAULT NULL COMMENT '品项价格',
  45 + `tkje` decimal(15,2) DEFAULT NULL COMMENT '退款金额',
  46 + `F_ProjectNumber` int DEFAULT NULL COMMENT '项目次数',
  47 + `F_IsEnabled` int(1) DEFAULT NULL COMMENT '是否有效',
  48 + `F_SourceType` varchar(20) DEFAULT NULL COMMENT '来源类型',
  49 + `F_TotalPrice` decimal(15,2) DEFAULT NULL COMMENT '合计金额',
  50 + `F_CreateTime` datetime DEFAULT NULL COMMENT '创建时间',
  51 + `F_CreateUser` varchar(50) DEFAULT NULL COMMENT '创建用户',
  52 + `F_ModifyTime` datetime DEFAULT NULL COMMENT '修改时间',
  53 + `F_ModifyUser` varchar(50) DEFAULT NULL COMMENT '修改用户',
  54 + `F_DeleteMark` int(1) DEFAULT NULL COMMENT '删除标记',
  55 + PRIMARY KEY (`F_Id`),
  56 + KEY `idx_gltkbh` (`gltkbh`),
  57 + KEY `idx_px` (`px`),
  58 + KEY `idx_F_SourceType` (`F_SourceType`)
  59 +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='退卡_品项明细表';
  60 +
  61 +-- 3. 创建退卡健康师业绩表
  62 +DROP TABLE IF EXISTS `lq_hytk_jksyj`;
  63 +CREATE TABLE `lq_hytk_jksyj` (
  64 + `F_Id` varchar(50) NOT NULL COMMENT '业绩编号',
  65 + `gltkbh` varchar(50) DEFAULT NULL COMMENT '关联退卡编号',
  66 + `jks` varchar(50) DEFAULT NULL COMMENT '健康师',
  67 + `jksxm` varchar(50) DEFAULT NULL COMMENT '健康师姓名',
  68 + `jkszh` varchar(50) DEFAULT NULL COMMENT '健康师账号',
  69 + `jksyj` decimal(15,2) DEFAULT NULL COMMENT '健康师业绩',
  70 + `tksj` datetime DEFAULT NULL COMMENT '退卡时间',
  71 + `F_jsjid` varchar(50) DEFAULT NULL COMMENT '金三角id',
  72 + `F_tkpxid` varchar(50) DEFAULT NULL COMMENT '关联项目资料表ID',
  73 + `F_LaborCost` decimal(15,2) DEFAULT NULL COMMENT '手工费',
  74 + `F_tkpxNumber` decimal(15,2) DEFAULT NULL COMMENT '退卡品项次数',
  75 + `F_CreateTime` datetime DEFAULT NULL COMMENT '创建时间',
  76 + `F_CreateUser` varchar(50) DEFAULT NULL COMMENT '创建用户',
  77 + `F_ModifyTime` datetime DEFAULT NULL COMMENT '修改时间',
  78 + `F_ModifyUser` varchar(50) DEFAULT NULL COMMENT '修改用户',
  79 + `F_DeleteMark` int(1) DEFAULT NULL COMMENT '删除标记',
  80 + PRIMARY KEY (`F_Id`),
  81 + KEY `idx_gltkbh` (`gltkbh`),
  82 + KEY `idx_jks` (`jks`),
  83 + KEY `idx_F_tkpxid` (`F_tkpxid`),
  84 + KEY `idx_tksj` (`tksj`)
  85 +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='退卡_健康师业绩表';
  86 +
  87 +-- 4. 创建退卡科技部老师业绩表
  88 +DROP TABLE IF EXISTS `lq_hytk_kjbsyj`;
  89 +CREATE TABLE `lq_hytk_kjbsyj` (
  90 + `F_Id` varchar(50) NOT NULL COMMENT '业绩编号',
  91 + `gltkbh` varchar(50) DEFAULT NULL COMMENT '关联退卡编号',
  92 + `kjbls` varchar(50) DEFAULT NULL COMMENT '科技部老师',
  93 + `kjblsxm` varchar(50) DEFAULT NULL COMMENT '科技部老师姓名',
  94 + `kjblszh` varchar(50) DEFAULT NULL COMMENT '科技部老师账号',
  95 + `kjblsyj` decimal(15,2) DEFAULT NULL COMMENT '科技部老师业绩',
  96 + `tksj` datetime DEFAULT NULL COMMENT '退卡时间',
  97 + `F_tkpxid` varchar(50) DEFAULT NULL COMMENT '关联项目资料表ID',
  98 + `F_LaborCost` decimal(15,2) DEFAULT NULL COMMENT '手工费',
  99 + `F_tkpxNumber` decimal(15,2) DEFAULT NULL COMMENT '退卡品项次数',
  100 + `F_CreateTime` datetime DEFAULT NULL COMMENT '创建时间',
  101 + `F_CreateUser` varchar(50) DEFAULT NULL COMMENT '创建用户',
  102 + `F_ModifyTime` datetime DEFAULT NULL COMMENT '修改时间',
  103 + `F_ModifyUser` varchar(50) DEFAULT NULL COMMENT '修改用户',
  104 + `F_DeleteMark` int(1) DEFAULT NULL COMMENT '删除标记',
  105 + PRIMARY KEY (`F_Id`),
  106 + KEY `idx_gltkbh` (`gltkbh`),
  107 + KEY `idx_kjbls` (`kjbls`),
  108 + KEY `idx_F_tkpxid` (`F_tkpxid`),
  109 + KEY `idx_tksj` (`tksj`)
  110 +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='退卡_科技部老师业绩表';
  111 +
  112 +-- =============================================
  113 +-- 添加外键约束(可选)
  114 +-- =============================================
  115 +
  116 +-- 退卡明细表外键约束
  117 +-- ALTER TABLE `lq_hytk_mx` ADD CONSTRAINT `fk_hytk_mx_gltkbh` FOREIGN KEY (`gltkbh`) REFERENCES `lq_hytk_hytk` (`F_Id`) ON DELETE CASCADE ON UPDATE CASCADE;
  118 +
  119 +-- 退卡健康师业绩表外键约束
  120 +-- ALTER TABLE `lq_hytk_jksyj` ADD CONSTRAINT `fk_hytk_jksyj_gltkbh` FOREIGN KEY (`gltkbh`) REFERENCES `lq_hytk_hytk` (`F_Id`) ON DELETE CASCADE ON UPDATE CASCADE;
  121 +-- ALTER TABLE `lq_hytk_jksyj` ADD CONSTRAINT `fk_hytk_jksyj_tkpxid` FOREIGN KEY (`F_tkpxid`) REFERENCES `lq_xmzl` (`F_Id`) ON DELETE CASCADE ON UPDATE CASCADE;
  122 +
  123 +-- 退卡科技部老师业绩表外键约束
  124 +-- ALTER TABLE `lq_hytk_kjbsyj` ADD CONSTRAINT `fk_hytk_kjbsyj_gltkbh` FOREIGN KEY (`gltkbh`) REFERENCES `lq_hytk_hytk` (`F_Id`) ON DELETE CASCADE ON UPDATE CASCADE;
  125 +-- ALTER TABLE `lq_hytk_kjbsyj` ADD CONSTRAINT `fk_hytk_kjbsyj_tkpxid` FOREIGN KEY (`F_tkpxid`) REFERENCES `lq_xmzl` (`F_Id`) ON DELETE CASCADE ON UPDATE CASCADE;
  126 +
  127 +-- =============================================
  128 +-- 创建完成提示
  129 +-- =============================================
  130 +SELECT '退卡相关表创建完成!' AS '创建结果';