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 1 using System;
2 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 7 namespace NCC.Extend.Entitys.Dto.LqHytkHytk
5 8 {
6 9 /// <summary>
7   - /// 会员退卡修改输入参数
  10 + /// 退卡_信息表创建输入参数
8 11 /// </summary>
9 12 public class LqHytkHytkCrInput
10 13 {
... ... @@ -21,7 +24,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
21 24 /// <summary>
22 25 /// 门店编号
23 26 /// </summary>
24   - public string mcbh { get; set; }
  27 + public string mdbh { get; set; }
25 28  
26 29 /// <summary>
27 30 /// 门店名称
... ... @@ -36,7 +39,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
36 39 /// <summary>
37 40 /// 会员姓名
38 41 /// </summary>
39   - public string hyxm { get; set; }
  42 + public string hymc { get; set; }
40 43  
41 44 /// <summary>
42 45 /// 会员账号
... ... @@ -44,19 +47,19 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
44 47 public string hyzh { get; set; }
45 48  
46 49 /// <summary>
47   - /// 健康师
  50 + /// 顾客类型
48 51 /// </summary>
49   - public string jks { get; set; }
  52 + public string gklx { get; set; }
50 53  
51 54 /// <summary>
52   - /// 健康师账号
  55 + /// 退卡总金额
53 56 /// </summary>
54   - public string jkszh { get; set; }
  57 + public decimal? tkje { get; set; }
55 58  
56 59 /// <summary>
57   - /// 健康师姓名
  60 + /// 手工费用
58 61 /// </summary>
59   - public string jksxm { get; set; }
  62 + public decimal? sgfy { get; set; }
60 63  
61 64 /// <summary>
62 65 /// 备注
... ... @@ -64,24 +67,44 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
64 67 public string bz { get; set; }
65 68  
66 69 /// <summary>
67   - /// 退卡品项
  70 + /// 退卡时间
68 71 /// </summary>
69   - public string tkpx { get; set; }
  72 + public DateTime? tksj { get; set; }
70 73  
71 74 /// <summary>
72   - /// 退卡时间
  75 + /// 操作人员
73 76 /// </summary>
74   - public DateTime? tksj { get; set; }
  77 + public string czry { get; set; }
75 78  
76 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 91 /// </summary>
79   - public string tkr { get; set; }
  92 + public string fileUrl { get; set; }
80 93  
81 94 /// <summary>
82   - /// 会员退卡明细
  95 + /// 退卡品项明细列表
83 96 /// </summary>
84 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 1 using System;
2 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 7 namespace NCC.Extend.Entitys.Dto.LqHytkHytk
5 8 {
6 9 /// <summary>
7   - /// 会员退卡输出参数
  10 + /// 退卡_信息表详情输出
8 11 /// </summary>
9 12 public class LqHytkHytkInfoOutput
10 13 {
... ... @@ -21,7 +24,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
21 24 /// <summary>
22 25 /// 门店编号
23 26 /// </summary>
24   - public string mcbh { get; set; }
  27 + public string mdbh { get; set; }
25 28  
26 29 /// <summary>
27 30 /// 门店名称
... ... @@ -36,7 +39,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
36 39 /// <summary>
37 40 /// 会员姓名
38 41 /// </summary>
39   - public string hyxm { get; set; }
  42 + public string hymc { get; set; }
40 43  
41 44 /// <summary>
42 45 /// 会员账号
... ... @@ -44,19 +47,19 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
44 47 public string hyzh { get; set; }
45 48  
46 49 /// <summary>
47   - /// 健康师
  50 + /// 顾客类型
48 51 /// </summary>
49   - public string jks { get; set; }
  52 + public string gklx { get; set; }
50 53  
51 54 /// <summary>
52   - /// 健康师账号
  55 + /// 退卡总金额
53 56 /// </summary>
54   - public string jkszh { get; set; }
  57 + public decimal? tkje { get; set; }
55 58  
56 59 /// <summary>
57   - /// 健康师姓名
  60 + /// 手工费用
58 61 /// </summary>
59   - public string jksxm { get; set; }
  62 + public decimal? sgfy { get; set; }
60 63  
61 64 /// <summary>
62 65 /// 备注
... ... @@ -64,24 +67,44 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
64 67 public string bz { get; set; }
65 68  
66 69 /// <summary>
67   - /// 退卡品项
  70 + /// 退卡时间
68 71 /// </summary>
69   - public string tkpx { get; set; }
  72 + public DateTime? tksj { get; set; }
70 73  
71 74 /// <summary>
72   - /// 退卡时间
  75 + /// 操作人员
73 76 /// </summary>
74   - public DateTime? tksj { get; set; }
  77 + public string czry { get; set; }
75 78  
76 79 /// <summary>
77   - /// 退卡
  80 + /// 退卡状态
78 81 /// </summary>
79   - public string tkr { get; set; }
  82 + public string tkzt { get; set; }
80 83  
81 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 96 /// </summary>
84 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 112 \ No newline at end of file
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkListOutput.cs
... ... @@ -3,7 +3,7 @@
3 3 namespace NCC.Extend.Entitys.Dto.LqHytkHytk
4 4 {
5 5 /// <summary>
6   - /// 会员退卡输入参数
  6 + /// 退卡_信息表列表输出
7 7 /// </summary>
8 8 public class LqHytkHytkListOutput
9 9 {
... ... @@ -20,7 +20,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
20 20 /// <summary>
21 21 /// 门店编号
22 22 /// </summary>
23   - public string mcbh { get; set; }
  23 + public string mdbh { get; set; }
24 24  
25 25 /// <summary>
26 26 /// 门店名称
... ... @@ -35,7 +35,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
35 35 /// <summary>
36 36 /// 会员姓名
37 37 /// </summary>
38   - public string hyxm { get; set; }
  38 + public string hymc { get; set; }
39 39  
40 40 /// <summary>
41 41 /// 会员账号
... ... @@ -43,19 +43,19 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
43 43 public string hyzh { get; set; }
44 44  
45 45 /// <summary>
46   - /// 健康师
  46 + /// 顾客类型
47 47 /// </summary>
48   - public string jks { get; set; }
  48 + public string gklx { get; set; }
49 49  
50 50 /// <summary>
51   - /// 健康师账号
  51 + /// 退卡总金额
52 52 /// </summary>
53   - public string jkszh { get; set; }
  53 + public decimal? tkje { get; set; }
54 54  
55 55 /// <summary>
56   - /// 健康师姓名
  56 + /// 手工费用
57 57 /// </summary>
58   - public string jksxm { get; set; }
  58 + public decimal? sgfy { get; set; }
59 59  
60 60 /// <summary>
61 61 /// 备注
... ... @@ -63,19 +63,29 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
63 63 public string bz { get; set; }
64 64  
65 65 /// <summary>
66   - /// 退卡品项
  66 + /// 退卡时间
67 67 /// </summary>
68   - public string tkpx { get; set; }
  68 + public DateTime? tksj { get; set; }
69 69  
70 70 /// <summary>
71   - /// 退卡时间
  71 + /// 操作人员
72 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 80 /// <summary>
76   - /// 退卡人
  81 + /// 退卡原因
  82 + /// </summary>
  83 + public string tkyy { get; set; }
  84 +
  85 + /// <summary>
  86 + /// 退卡附件
77 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 4 namespace NCC.Extend.Entitys.Dto.LqHytkHytk
5 5 {
6 6 /// <summary>
7   - /// 会员退卡列表查询输入
  7 + /// 退卡_信息表列表查询输入参数
8 8 /// </summary>
9 9 public class LqHytkHytkListQueryInput : PageInputBase
10 10 {
11 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 13 /// </summary>
25 14 public string id { get; set; }
... ... @@ -32,7 +21,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
32 21 /// <summary>
33 22 /// 门店编号
34 23 /// </summary>
35   - public string mcbh { get; set; }
  24 + public string mdbh { get; set; }
36 25  
37 26 /// <summary>
38 27 /// 门店名称
... ... @@ -47,7 +36,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
47 36 /// <summary>
48 37 /// 会员姓名
49 38 /// </summary>
50   - public string hyxm { get; set; }
  39 + public string hymc { get; set; }
51 40  
52 41 /// <summary>
53 42 /// 会员账号
... ... @@ -55,19 +44,19 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
55 44 public string hyzh { get; set; }
56 45  
57 46 /// <summary>
58   - /// 健康师
  47 + /// 顾客类型
59 48 /// </summary>
60   - public string jks { get; set; }
  49 + public string gklx { get; set; }
61 50  
62 51 /// <summary>
63   - /// 健康师账号
  52 + /// 退卡总金额
64 53 /// </summary>
65   - public string jkszh { get; set; }
  54 + public decimal? tkje { get; set; }
66 55  
67 56 /// <summary>
68   - /// 健康师姓名
  57 + /// 手工费用
69 58 /// </summary>
70   - public string jksxm { get; set; }
  59 + public decimal? sgfy { get; set; }
71 60  
72 61 /// <summary>
73 62 /// 备注
... ... @@ -75,19 +64,29 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
75 64 public string bz { get; set; }
76 65  
77 66 /// <summary>
78   - /// 退卡品项
  67 + /// 退卡时间
79 68 /// </summary>
80   - public string tkpx { get; set; }
  69 + public string tksj { get; set; }
81 70  
82 71 /// <summary>
83   - /// 退卡时间
  72 + /// 操作人员
84 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 81 /// <summary>
88   - /// 退卡人
  82 + /// 退卡原因
  83 + /// </summary>
  84 + public string tkyy { get; set; }
  85 +
  86 + /// <summary>
  87 + /// 退卡附件
89 88 /// </summary>
90   - public string tkr { get; set; }
  89 + public string fileUrl { get; set; }
91 90  
92 91 }
93 92 -}
  93 +}
94 94 \ No newline at end of file
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkUpInput.cs
1 1 using System;
2 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 7 namespace NCC.Extend.Entitys.Dto.LqHytkHytk
5 8 {
6 9 /// <summary>
7   - /// 会员退卡更新输入参数
  10 + /// 退卡_信息表更新输入参数
8 11 /// </summary>
9   - public class LqHytkHytkUpInput : LqHytkHytkCrInput
  12 + public class LqHytkHytkUpInput
10 13 {
11 14 /// <summary>
12 15 /// 退卡编号
13 16 /// </summary>
14 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 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 1 using System;
2 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 8 /// <summary>
7   - /// 会员退卡修改输入参数
  9 + /// 退卡_品项明细表创建输入参数
8 10 /// </summary>
9 11 public class LqHytkMxCrInput
10 12 {
... ... @@ -13,7 +15,6 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
13 15 /// </summary>
14 16 public string id { get; set; }
15 17  
16   -
17 18 /// <summary>
18 19 /// 关联退卡编号
19 20 /// </summary>
... ... @@ -27,27 +28,47 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
27 28 /// <summary>
28 29 /// 品项名称
29 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 38 /// <summary>
33 39 /// 退款金额
34 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 58 /// <summary>
38   - /// 次数
  59 + /// 合计金额
39 60 /// </summary>
40   - public string cs { get; set; }
  61 + public decimal? F_TotalPrice { get; set; }
41 62  
42 63 /// <summary>
43   - /// 单次耗卡
  64 + /// 退卡健康师业绩列表
44 65 /// </summary>
45   - public string dchk { get; set; }
  66 + public List<LqHytkJksyjCrInput> lqHytkJksyjList { get; set; }
46 67  
47 68 /// <summary>
48   - /// 发生时间
  69 + /// 退卡科技部老师业绩列表
49 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 1 using System;
2 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 8 /// <summary>
7   - /// 会员退卡输出参数
  9 + /// 退卡_品项明细表详情输出
8 10 /// </summary>
9 11 public class LqHytkMxInfoOutput
10 12 {
... ... @@ -19,34 +21,54 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk
19 21 public string gltkbh { get; set; }
20 22  
21 23 /// <summary>
22   - /// 品项
  24 + /// 品项编号
23 25 /// </summary>
24 26 public string px { get; set; }
25 27  
26 28 /// <summary>
27 29 /// 品项名称
28 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 38 /// <summary>
32 39 /// 退款金额
33 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 48 /// <summary>
37   - /// 次数
  49 + /// 是否有效
38 50 /// </summary>
39   - public string cs { get; set; }
  51 + public int? F_IsEnabled { get; set; }
40 52  
41 53 /// <summary>
42   - /// 单次耗卡
  54 + /// 来源类型(开卡/赠送/其他)
43 55 /// </summary>
44   - public string dchk { get; set; }
  56 + public string F_SourceType { get; set; }
45 57  
46 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 70 /// </summary>
49   - public DateTime? fssj { get; set; }
  71 + public List<LqHytkKjbsyjInfoOutput> lqHytkKjbsyjList { get; set; }
50 72  
51 73 }
52 74 -}
  75 +}
53 76 \ No newline at end of file
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkMx/LqHytkMxUpInput.cs
1 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 5 /// <summary>
7   - /// 会员退卡更新输入参数
  6 + /// 退卡_品项明细表更新输入参数
8 7 /// </summary>
9   - public class LqHytkMxUpInput : LqHytkHytkCrInput
  8 + public class LqHytkMxUpInput
10 9 {
11 10 /// <summary>
12 11 /// 明细编号
13 12 /// </summary>
14 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 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 4 namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
5 5 {
6 6 /// <summary>
7   - /// 开单记录表输出参数
  7 + /// 开单健康师业绩输出参数
8 8 /// </summary>
9 9 public class LqKdJksyjInfoOutput
10 10 {
... ... @@ -19,7 +19,12 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
19 19 public string glkdbh { get; set; }
20 20  
21 21 /// <summary>
22   - /// 健康师
  22 + /// 关联开单品项ID
  23 + /// </summary>
  24 + public string kdpxid { get; set; }
  25 +
  26 + /// <summary>
  27 + /// 健康师ID
23 28 /// </summary>
24 29 public string jks { get; set; }
25 30  
... ... @@ -43,5 +48,9 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
43 48 /// </summary>
44 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 4 namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
5 5 {
6 6 /// <summary>
7   - /// 开单记录表输出参数
  7 + /// 开单科技部老师业绩输出参数
8 8 /// </summary>
9 9 public class LqKdKjbsyjInfoOutput
10 10 {
... ... @@ -19,7 +19,12 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
19 19 public string glkdbh { get; set; }
20 20  
21 21 /// <summary>
22   - /// 科技部老师
  22 + /// 关联开单品项ID
  23 + /// </summary>
  24 + public string kdpxid { get; set; }
  25 +
  26 + /// <summary>
  27 + /// 科技部老师ID
23 28 /// </summary>
24 29 public string kjbls { get; set; }
25 30  
... ... @@ -42,6 +47,5 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
42 47 /// 业绩时间
43 48 /// </summary>
44 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 4 namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
5 5 {
6 6 /// <summary>
7   - /// 开单记录表输出参数
  7 + /// 开单品项明细输出参数
8 8 /// </summary>
9 9 public class LqKdPxmxInfoOutput
10 10 {
... ... @@ -19,7 +19,7 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
19 19 public string glkdbh { get; set; }
20 20  
21 21 /// <summary>
22   - /// 品项
  22 + /// 品项编号
23 23 /// </summary>
24 24 public string px { get; set; }
25 25  
... ... @@ -33,5 +33,44 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
33 33 /// </summary>
34 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 80 public decimal ConsumedCount { get; set; }
81 81  
82 82 /// <summary>
  83 + /// 已退卡数量
  84 + /// </summary>
  85 + /// <remarks>该品项已退卡的次数</remarks>
  86 + /// <example>0</example>
  87 + public decimal RefundedCount { get; set; }
  88 +
  89 + /// <summary>
83 90 /// 剩余数量
84 91 /// </summary>
85   - /// <remarks>总购买数量减去已消费数量</remarks>
  92 + /// <remarks>总购买数量减去已消费数量减去已退卡数量</remarks>
86 93 /// <example>2</example>
87 94 public decimal RemainingCount { get; set; }
88 95 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhPxmx/LqXhPxmxInfoOutput.cs
1 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 6 namespace NCC.Extend.Entitys.Dto.LqXhPxmx
4 7 {
... ... @@ -13,12 +16,12 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx
13 16 public string id { get; set; }
14 17  
15 18 /// <summary>
16   - /// 关联开单编号
  19 + /// 关联耗卡编号
17 20 /// </summary>
18 21 public string glkdbh { get; set; }
19 22  
20 23 /// <summary>
21   - /// 品项
  24 + /// 品项编号
22 25 /// </summary>
23 26 public string px { get; set; }
24 27  
... ... @@ -38,7 +41,7 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx
38 41 public string xfzs { get; set; }
39 42  
40 43 /// <summary>
41   - /// 会员id
  44 + /// 会员ID
42 45 /// </summary>
43 46 public string memberId { get; set; }
44 47  
... ... @@ -58,13 +61,23 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx
58 61 public int? isEnabled { get; set; }
59 62  
60 63 /// <summary>
61   - /// 来源类型
  64 + /// 来源类型(开卡/赠送/其他)
62 65 /// </summary>
63 66 public string sourceType { get; set; }
64 67  
65 68 /// <summary>
66   - /// 合计金额
  69 + /// 合计金额(品项价格 × 项目次数)
67 70 /// </summary>
68 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 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 5 namespace NCC.Extend.Entitys.lq_hytk_hytk
6 6 {
7 7 /// <summary>
8   - /// 会员退卡
  8 + /// 退卡_信息表
9 9 /// </summary>
10 10 [SugarTable("lq_hytk_hytk")]
11 11 [Tenant(ClaimConst.TENANT_ID)]
... ... @@ -26,8 +26,8 @@ namespace NCC.Extend.Entitys.lq_hytk_hytk
26 26 /// <summary>
27 27 /// 门店编号
28 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 32 /// <summary>
33 33 /// 门店名称
... ... @@ -44,8 +44,8 @@ namespace NCC.Extend.Entitys.lq_hytk_hytk
44 44 /// <summary>
45 45 /// 会员姓名
46 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 50 /// <summary>
51 51 /// 会员账号
... ... @@ -54,22 +54,22 @@ namespace NCC.Extend.Entitys.lq_hytk_hytk
54 54 public string Hyzh { get; set; }
55 55  
56 56 /// <summary>
57   - /// 健康师
  57 + /// 顾客类型
58 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 62 /// <summary>
63   - /// 健康师账号
  63 + /// 退卡总金额
64 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 68 /// <summary>
69   - /// 健康师姓名
  69 + /// 手工费用
70 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 74 /// <summary>
75 75 /// 备注
... ... @@ -78,22 +78,65 @@ namespace NCC.Extend.Entitys.lq_hytk_hytk
78 78 public string Bz { get; set; }
79 79  
80 80 /// <summary>
81   - /// 退卡品项
82   - /// </summary>
83   - [SugarColumn(ColumnName = "tkpx")]
84   - public string Tkpx { get; set; }
85   -
86   - /// <summary>
87 81 /// 退卡时间
88 82 /// </summary>
89 83 [SugarColumn(ColumnName = "tksj")]
90 84 public DateTime? Tksj { get; set; }
91 85  
92 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 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 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 5 namespace NCC.Extend.Entitys.lq_hytk_mx
6 6 {
7 7 /// <summary>
8   - /// 会员退卡
  8 + /// 退卡_品项明细表
9 9 /// </summary>
10 10 [SugarTable("lq_hytk_mx")]
11 11 [Tenant(ClaimConst.TENANT_ID)]
... ... @@ -32,32 +32,74 @@ namespace NCC.Extend.Entitys.lq_hytk_mx
32 32 /// <summary>
33 33 /// 品项名称
34 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 44 /// <summary>
39 45 /// 退款金额
40 46 /// </summary>
41 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 86 /// <summary>
45   - /// 次数
  87 + /// 修改时间
46 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 92 /// <summary>
51   - /// 单次耗卡
  93 + /// 修改用户
52 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 98 /// <summary>
57   - /// 发生时间
  99 + /// 删除标记
58 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 106 \ No newline at end of file
... ...
netcore/src/Modularity/Extend/NCC.Extend.Interfaces/LqStatistics/ILqStatisticsService.cs
1 1 using System.Collections.Generic;
2 2 using System.Threading.Tasks;
3 3 using NCC.Extend.Entitys.Dto.LqStatistics;
  4 +using NCC.Extend.Entitys.Dto.LqMdxx;
4 5  
5 6 namespace NCC.Extend.Interfaces.LqStatistics
6 7 {
... ... @@ -10,15 +11,16 @@ namespace NCC.Extend.Interfaces.LqStatistics
10 11 public interface ILqStatisticsService
11 12 {
12 13 /// <summary>
13   - /// 测试接口
14   - /// </summary>
15   - /// <returns>测试结果</returns>
16   - Task<dynamic> Test();
17   -
18   - /// <summary>
19 14 /// 获取门店业绩统计列表
20 15 /// </summary>
21 16 /// <returns>门店业绩统计列表</returns>
22 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 2 using NCC.Common.Enum;
3 3 using NCC.Common.Extension;
4 4 using NCC.Common.Filter;
... ... @@ -15,7 +15,12 @@ using System.Linq;
15 15 using System.Threading.Tasks;
16 16 using NCC.Extend.Entitys.lq_hytk_hytk;
17 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 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 24 using Yitter.IdGenerator;
20 25 using NCC.Common.Helper;
21 26 using NCC.JsonSerialization;
... ... @@ -27,14 +32,16 @@ using NCC.ClayObject;
27 32 namespace NCC.Extend.LqHytkHytk
28 33 {
29 34 /// <summary>
30   - /// 会员退卡服务
  35 + /// 退卡_信息表服务
31 36 /// </summary>
32   - [ApiDescriptionSettings(Tag = "Extend",Name = "LqHytkHytk", Order = 200)]
  37 + [ApiDescriptionSettings(Tag = "绿纤退卡信息表服务",Name = "LqHytkHytk", Order = 200)]
33 38 [Route("api/Extend/[controller]")]
34 39 public class LqHytkHytkService : ILqHytkHytkService, IDynamicApiController, ITransient
35 40 {
36 41 private readonly ISqlSugarRepository<LqHytkHytkEntity> _lqHytkHytkRepository;
37 42 private readonly ISqlSugarRepository<LqHytkMxEntity> _lqHytkMxRepository;
  43 + private readonly ISqlSugarRepository<LqHytkJksyjEntity> _lqHytkJksyjRepository;
  44 + private readonly ISqlSugarRepository<LqHytkKjbsyjEntity> _lqHytkKjbsyjRepository;
38 45 private readonly SqlSugarScope _db;
39 46 private readonly IUserManager _userManager;
40 47  
... ... @@ -44,34 +51,22 @@ namespace NCC.Extend.LqHytkHytk
44 51 public LqHytkHytkService(
45 52 ISqlSugarRepository<LqHytkHytkEntity> lqHytkHytkRepository,
46 53 ISqlSugarRepository<LqHytkMxEntity> lqHytkMxRepository,
  54 + ISqlSugarRepository<LqHytkJksyjEntity> lqHytkJksyjRepository,
  55 + ISqlSugarRepository<LqHytkKjbsyjEntity> lqHytkKjbsyjRepository,
47 56 IUserManager userManager)
48 57 {
49 58 _lqHytkHytkRepository = lqHytkHytkRepository;
50   - _db = _lqHytkHytkRepository.Context;
51 59 _lqHytkMxRepository = lqHytkMxRepository;
  60 + _lqHytkJksyjRepository = lqHytkJksyjRepository;
  61 + _lqHytkKjbsyjRepository = lqHytkKjbsyjRepository;
  62 + _db = _lqHytkHytkRepository.Context;
52 63 _userManager = userManager;
53 64 }
54 65  
55 66 /// <summary>
56   - /// 获取会员退卡
  67 + /// 获取退卡信息列表
57 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 70 /// <returns></returns>
76 71 [HttpGet("")]
77 72 public async Task<dynamic> GetList([FromQuery] LqHytkHytkListQueryInput input)
... ... @@ -83,279 +78,486 @@ namespace NCC.Extend.LqHytkHytk
83 78 var data = await _db.Queryable<LqHytkHytkEntity>()
84 79 .WhereIF(!string.IsNullOrEmpty(input.id), p => p.Id.Contains(input.id))
85 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 82 .WhereIF(!string.IsNullOrEmpty(input.mdmc), p => p.Mdmc.Contains(input.mdmc))
88 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 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 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 93 .WhereIF(queryTksj != null, p => p.Tksj >= new DateTime(startTksj.ToDate().Year, startTksj.ToDate().Month, startTksj.ToDate().Day, 0, 0, 0))
97 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 96 .Select(it=> new LqHytkHytkListOutput
100 97 {
101 98 id = it.Id,
102 99 md=it.Md,
103   - mcbh=it.Mcbh,
  100 + mdbh=it.Mdbh,
104 101 mdmc=it.Mdmc,
105 102 hy=it.Hy,
106   - hyxm=it.Hyxm,
  103 + hymc=it.Hymc,
107 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 108 bz=it.Bz,
112   - tkpx=it.Tkpx,
  109 + tkzt=it.Tkzt,
  110 + tkyy=it.Tkyy,
113 111 tksj=it.Tksj,
114   - tkr=it.Tkr,
  112 + czry=it.Czry,
  113 + fileUrl=it.FileUrl,
115 114 }).MergeTable().OrderBy(sidx+" "+input.sort).ToPagedListAsync(input.currentPage, input.pageSize);
116 115 return PageResult<LqHytkHytkListOutput>.SqlSugarPageResult(data);
117 116 }
118 117  
119 118 /// <summary>
120   - /// 新建会员退卡
  119 + /// 创建退卡信息及其关联的品项明细、健康师业绩、科技部老师业绩信息
121 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 186 [HttpPost("")]
125 187 public async Task Create([FromBody] LqHytkHytkCrInput input)
126 188 {
127 189 var userInfo = await _userManager.GetUserInfo();
128 190 var entity = input.Adapt<LqHytkHytkEntity>();
129 191 entity.Id = YitIdHelper.NextId().ToString();
  192 + entity.F_CreateTime = DateTime.Now;
  193 + entity.F_CreateUser = userInfo.userId;
  194 + entity.F_DeleteMark = 0;
130 195 entity.Tksj = DateTime.Now;
131   - entity.Tkr = _userManager.UserId;
  196 + entity.Czry = userInfo.userId;
  197 +
132 198 try
133 199 {
134   - //开启事务
  200 + // 开启事务
135 201 _db.BeginTran();
136 202  
137   - //新增会员退卡记录
  203 + // 新增退卡主表记录
138 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 314 /// <summary>
289   - /// 更新会员退卡
  315 + /// 更新退卡信息及其关联的品项明细、健康师业绩、科技部老师业绩信息
290 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 327 [HttpPut("{id}")]
295 328 public async Task Update(string id, [FromBody] LqHytkHytkUpInput input)
296 329 {
  330 + var userInfo = await _userManager.GetUserInfo();
297 331 var entity = input.Adapt<LqHytkHytkEntity>();
  332 + entity.Id = id;
  333 + entity.F_ModifyTime = DateTime.Now;
  334 + entity.F_ModifyUser = userInfo.userId;
  335 +
298 336 try
299 337 {
300   - //开启事务
  338 + // 开启事务
301 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 448 _db.CommitTran();
322 449 }
323   - catch (Exception)
  450 + catch (Exception ex)
324 451 {
325   - //回滚事务
326 452 _db.RollbackTran();
327   - throw NCCException.Oh(ErrorCode.COM1001);
  453 + throw NCCException.Oh(ErrorCode.COM1005, ex.Message);
328 454 }
329 455 }
330 456  
331 457 /// <summary>
332   - /// 删除会员退卡
  458 + /// 删除退卡信息
333 459 /// </summary>
  460 + /// <param name="id">主键</param>
334 461 /// <returns></returns>
335 462 [HttpDelete("{id}")]
336 463 public async Task Delete(string id)
337 464 {
338 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 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 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 74 /// <summary>
75 75 /// 获取开单记录表
76 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 92 [HttpGet("{id}")]
80 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 166 #endregion
96 167  
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs
... ... @@ -19,6 +19,8 @@ using NCC.Extend.Entitys.lq_kd_kdjlb;
19 19 using NCC.Extend.Entitys.lq_kd_pxmx;
20 20 using NCC.Extend.Entitys.lq_xh_hyhk;
21 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 24 using Yitter.IdGenerator;
23 25 using NCC.Common.Helper;
24 26 using NCC.JsonSerialization;
... ... @@ -459,6 +461,7 @@ namespace NCC.Extend.LqKhxx
459 461 /// <remarks>
460 462 /// 根据会员ID查询该会员的剩余品项信息,包括已购买但未消费完的品项详情
461 463 /// 支持按来源类型(F_SourceType)区分相同品项的不同来源,确保数据准确分组
  464 + /// 计算逻辑:剩余数量 = 购买数量 - 消费数量 - 退卡数量
462 465 ///
463 466 /// 示例请求:
464 467 /// ```json
... ... @@ -478,12 +481,14 @@ namespace NCC.Extend.LqKhxx
478 481 /// - SourceType: 来源类型(用于区分相同品项的不同来源)
479 482 /// - TotalPurchased: 总购买数量
480 483 /// - ConsumedCount: 已消费数量
  484 + /// - RefundedCount: 已退卡数量
481 485 /// - RemainingCount: 剩余数量
482 486 ///
483 487 /// 特殊说明:
484 488 /// - 相同品项但不同SourceType的记录会分开显示
485   - /// - 耗卡统计会按品项ID和SourceType精确匹配
  489 + /// - 耗卡和退卡统计会按品项ID和SourceType精确匹配
486 490 /// - 确保数据按SourceType正确分组且不重叠
  491 + /// - 退卡记录会减少剩余品项数量
487 492 /// </remarks>
488 493 /// <param name="memberId">会员ID</param>
489 494 /// <returns>会员剩余品项信息</returns>
... ... @@ -581,7 +586,36 @@ namespace NCC.Extend.LqKhxx
581 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 619 _logger.LogInformation("开始合并计算剩余品项");
586 620 var remainingItems = new List<RemainingItemInfo>();
587 621  
... ... @@ -593,7 +627,15 @@ namespace NCC.Extend.LqKhxx
593 627 x.ItemId == purchased.ItemId &&
594 628 x.SourceType == purchased.SourceType);
595 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 640 if (remainingCount > 0)
599 641 {
... ... @@ -605,6 +647,7 @@ namespace NCC.Extend.LqKhxx
605 647 SourceType = purchased.SourceType?.ToString() ?? "未知",
606 648 TotalPurchased = purchased.TotalPurchased,
607 649 ConsumedCount = consumedCount,
  650 + RefundedCount = refundedCount,
608 651 RemainingCount = remainingCount
609 652 });
610 653 }
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqMdxxService.cs
... ... @@ -325,5 +325,6 @@ namespace NCC.Extend.LqMdxx
325 325 .ToListAsync();
326 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 14 using System.Linq;
15 15 using System.Threading.Tasks;
16 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 21 namespace NCC.Extend.LqStatistics
19 22 {
... ... @@ -27,29 +30,23 @@ namespace NCC.Extend.LqStatistics
27 30 private readonly ISqlSugarRepository<LqMdxxEntity> _lqMdxxRepository;
28 31 private readonly SqlSugarScope _db;
29 32 private readonly IUserManager _userManager;
  33 + private readonly ILogger<LqStatisticsService> _logger;
30 34  
31 35 /// <summary>
32 36 /// 初始化一个<see cref="LqStatisticsService"/>类型的新实例
33 37 /// </summary>
34 38 public LqStatisticsService(
35 39 ISqlSugarRepository<LqMdxxEntity> lqMdxxRepository,
36   - IUserManager userManager)
  40 + IUserManager userManager,
  41 + ILogger<LqStatisticsService> logger)
37 42 {
38 43 _lqMdxxRepository = lqMdxxRepository;
39 44 _db = _lqMdxxRepository.Context;
40 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 50 /// <summary>
54 51 /// 获取门店业绩统计列表
55 52 /// </summary>
... ... @@ -91,5 +88,131 @@ namespace NCC.Extend.LqStatistics
91 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 74 /// <summary>
75 75 /// 获取会员耗卡
76 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 92 [HttpGet("{id}")]
80 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 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 '创建结果';
... ...