diff --git a/[已用]创建门店每日耗卡统计视图.sql b/[已用]创建门店每日耗卡统计视图.sql new file mode 100644 index 0000000..5f95f66 --- /dev/null +++ b/[已用]创建门店每日耗卡统计视图.sql @@ -0,0 +1,40 @@ +-- 创建门店每日耗卡统计视图 +-- 统计各个门店每日项目数(耗卡里面的项目数量)和消耗业绩(耗卡里面的金额) + +DROP VIEW IF EXISTS `v_store_daily_consume_stats`; + +CREATE VIEW `v_store_daily_consume_stats` AS +SELECT + hk.md AS store_id, -- 门店ID + hk.mdbh AS store_code, -- 门店编号 + hk.mdmc AS store_name, -- 门店名称 + DATE(hk.hksj) AS consume_date, -- 耗卡日期 + COUNT(DISTINCT hk.F_Id) AS consume_count, -- 耗卡记录数 + COALESCE(SUM(px.F_ProjectNumber), 0) AS total_project_count, -- 总项目数 + COALESCE(SUM(px.F_TotalPrice), 0) AS total_consume_amount, -- 总消耗金额 + COALESCE(SUM(CASE WHEN px.F_IsEnabled = 1 THEN px.F_ProjectNumber ELSE 0 END), 0) AS enabled_project_count, -- 有效项目数 + COALESCE(SUM(CASE WHEN px.F_IsEnabled = 1 THEN px.F_TotalPrice ELSE 0 END), 0) AS enabled_consume_amount, -- 有效消耗金额 + COALESCE(SUM(CASE WHEN px.F_SourceType = '开卡' THEN px.F_ProjectNumber ELSE 0 END), 0) AS card_project_count, -- 开卡项目数 + COALESCE(SUM(CASE WHEN px.F_SourceType = '开卡' THEN px.F_TotalPrice ELSE 0 END), 0) AS card_consume_amount, -- 开卡消耗金额 + COALESCE(SUM(CASE WHEN px.F_SourceType = '赠送' THEN px.F_ProjectNumber ELSE 0 END), 0) AS gift_project_count, -- 赠送项目数 + COALESCE(SUM(CASE WHEN px.F_SourceType = '赠送' THEN px.F_TotalPrice ELSE 0 END), 0) AS gift_consume_amount, -- 赠送消耗金额 + COALESCE(SUM(CASE WHEN px.F_SourceType = '其他' THEN px.F_ProjectNumber ELSE 0 END), 0) AS other_project_count, -- 其他项目数 + COALESCE(SUM(CASE WHEN px.F_SourceType = '其他' THEN px.F_TotalPrice ELSE 0 END), 0) AS other_consume_amount, -- 其他消耗金额 + COUNT(DISTINCT hk.hy) AS member_count, -- 消费会员数 + hk.hksj AS create_time -- 创建时间 +FROM lq_xh_hyhk hk +LEFT JOIN lq_xh_pxmx px ON hk.F_Id = px.glkdbh +WHERE hk.hksj IS NOT NULL +GROUP BY hk.md, hk.mdbh, hk.mdmc, DATE(hk.hksj), hk.hksj +ORDER BY hk.md, DATE(hk.hksj) DESC; + +-- 添加视图注释 +ALTER VIEW `v_store_daily_consume_stats` COMMENT = '门店每日耗卡统计视图 - 统计各门店每日项目数和消耗业绩'; + +-- 视图说明: +-- 1. 按门店和日期分组统计耗卡数据 +-- 2. 统计项目数和消耗金额,区分不同来源类型 +-- 3. 包含有效/无效项目统计 +-- 4. 按来源类型(开卡、赠送、其他)分别统计 +-- 5. 统计消费会员数量 +-- 6. 按门店和日期降序排列 diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkCrInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkCrInput.cs index a635f93..9e59613 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkCrInput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkCrInput.cs @@ -1,10 +1,13 @@ using System; using System.Collections.Generic; +using NCC.Extend.Entitys.Dto.LqHytkMx; +using NCC.Extend.Entitys.Dto.LqHytkJksyj; +using NCC.Extend.Entitys.Dto.LqHytkKjbsyj; namespace NCC.Extend.Entitys.Dto.LqHytkHytk { /// - /// 会员退卡修改输入参数 + /// 退卡_信息表创建输入参数 /// public class LqHytkHytkCrInput { @@ -21,7 +24,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk /// /// 门店编号 /// - public string mcbh { get; set; } + public string mdbh { get; set; } /// /// 门店名称 @@ -36,7 +39,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk /// /// 会员姓名 /// - public string hyxm { get; set; } + public string hymc { get; set; } /// /// 会员账号 @@ -44,19 +47,19 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk public string hyzh { get; set; } /// - /// 健康师 + /// 顾客类型 /// - public string jks { get; set; } + public string gklx { get; set; } /// - /// 健康师账号 + /// 退卡总金额 /// - public string jkszh { get; set; } + public decimal? tkje { get; set; } /// - /// 健康师姓名 + /// 手工费用 /// - public string jksxm { get; set; } + public decimal? sgfy { get; set; } /// /// 备注 @@ -64,24 +67,44 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk public string bz { get; set; } /// - /// 退卡品项 + /// 退卡时间 /// - public string tkpx { get; set; } + public DateTime? tksj { get; set; } /// - /// 退卡时间 + /// 操作人员 /// - public DateTime? tksj { get; set; } + public string czry { get; set; } /// - /// 退卡人 + /// 退卡状态 + /// + public string tkzt { get; set; } + + /// + /// 退卡原因 + /// + public string tkyy { get; set; } + + /// + /// 退卡附件 /// - public string tkr { get; set; } + public string fileUrl { get; set; } /// - /// 会员退卡明细 + /// 退卡品项明细列表 /// public List lqHytkMxList { get; set; } + /// + /// 退卡健康师业绩列表 + /// + public List lqHytkJksyjList { get; set; } + + /// + /// 退卡科技部老师业绩列表 + /// + public List lqHytkKjbsyjList { get; set; } + } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkInfoOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkInfoOutput.cs index 001e883..e812e0f 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkInfoOutput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkInfoOutput.cs @@ -1,10 +1,13 @@ using System; using System.Collections.Generic; +using NCC.Extend.Entitys.Dto.LqHytkMx; +using NCC.Extend.Entitys.Dto.LqHytkJksyj; +using NCC.Extend.Entitys.Dto.LqHytkKjbsyj; namespace NCC.Extend.Entitys.Dto.LqHytkHytk { /// - /// 会员退卡输出参数 + /// 退卡_信息表详情输出 /// public class LqHytkHytkInfoOutput { @@ -21,7 +24,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk /// /// 门店编号 /// - public string mcbh { get; set; } + public string mdbh { get; set; } /// /// 门店名称 @@ -36,7 +39,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk /// /// 会员姓名 /// - public string hyxm { get; set; } + public string hymc { get; set; } /// /// 会员账号 @@ -44,19 +47,19 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk public string hyzh { get; set; } /// - /// 健康师 + /// 顾客类型 /// - public string jks { get; set; } + public string gklx { get; set; } /// - /// 健康师账号 + /// 退卡总金额 /// - public string jkszh { get; set; } + public decimal? tkje { get; set; } /// - /// 健康师姓名 + /// 手工费用 /// - public string jksxm { get; set; } + public decimal? sgfy { get; set; } /// /// 备注 @@ -64,24 +67,44 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk public string bz { get; set; } /// - /// 退卡品项 + /// 退卡时间 /// - public string tkpx { get; set; } + public DateTime? tksj { get; set; } /// - /// 退卡时间 + /// 操作人员 /// - public DateTime? tksj { get; set; } + public string czry { get; set; } /// - /// 退卡人 + /// 退卡状态 /// - public string tkr { get; set; } + public string tkzt { get; set; } /// - /// 会员退卡明细 + /// 退卡原因 + /// + public string tkyy { get; set; } + + /// + /// 退卡附件 + /// + public string fileUrl { get; set; } + + /// + /// 退卡品项明细列表 /// public List lqHytkMxList { get; set; } + + /// + /// 健康师业绩列表 + /// + public List lqHytkJksyjList { get; set; } + + /// + /// 科技部老师业绩列表 + /// + public List lqHytkKjbsyjList { get; set; } } -} +} \ No newline at end of file diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkListOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkListOutput.cs index 4facf53..6ad2f6b 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkListOutput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkListOutput.cs @@ -3,7 +3,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk { /// - /// 会员退卡输入参数 + /// 退卡_信息表列表输出 /// public class LqHytkHytkListOutput { @@ -20,7 +20,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk /// /// 门店编号 /// - public string mcbh { get; set; } + public string mdbh { get; set; } /// /// 门店名称 @@ -35,7 +35,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk /// /// 会员姓名 /// - public string hyxm { get; set; } + public string hymc { get; set; } /// /// 会员账号 @@ -43,19 +43,19 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk public string hyzh { get; set; } /// - /// 健康师 + /// 顾客类型 /// - public string jks { get; set; } + public string gklx { get; set; } /// - /// 健康师账号 + /// 退卡总金额 /// - public string jkszh { get; set; } + public decimal? tkje { get; set; } /// - /// 健康师姓名 + /// 手工费用 /// - public string jksxm { get; set; } + public decimal? sgfy { get; set; } /// /// 备注 @@ -63,19 +63,29 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk public string bz { get; set; } /// - /// 退卡品项 + /// 退卡时间 /// - public string tkpx { get; set; } + public DateTime? tksj { get; set; } /// - /// 退卡时间 + /// 操作人员 /// - public DateTime? tksj { get; set; } + public string czry { get; set; } + + /// + /// 退卡状态 + /// + public string tkzt { get; set; } /// - /// 退卡人 + /// 退卡原因 + /// + public string tkyy { get; set; } + + /// + /// 退卡附件 /// - public string tkr { get; set; } + public string fileUrl { get; set; } } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkListQueryInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkListQueryInput.cs index 175e412..31f41ee 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkListQueryInput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkListQueryInput.cs @@ -1,25 +1,14 @@ -using NCC.Common.Filter; -using System.Collections.Generic; +using System; +using NCC.Common.Filter; namespace NCC.Extend.Entitys.Dto.LqHytkHytk { /// - /// 会员退卡列表查询输入 + /// 退卡_信息表列表查询输入参数 /// public class LqHytkHytkListQueryInput : PageInputBase { /// - /// 选择导出数据key - /// - public string selectKey { get; set; } - - /// - /// - /// - public int dataType { get; set; } - - - /// /// 退卡编号 /// public string id { get; set; } @@ -32,7 +21,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk /// /// 门店编号 /// - public string mcbh { get; set; } + public string mdbh { get; set; } /// /// 门店名称 @@ -47,7 +36,7 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk /// /// 会员姓名 /// - public string hyxm { get; set; } + public string hymc { get; set; } /// /// 会员账号 @@ -55,19 +44,19 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk public string hyzh { get; set; } /// - /// 健康师 + /// 顾客类型 /// - public string jks { get; set; } + public string gklx { get; set; } /// - /// 健康师账号 + /// 退卡总金额 /// - public string jkszh { get; set; } + public decimal? tkje { get; set; } /// - /// 健康师姓名 + /// 手工费用 /// - public string jksxm { get; set; } + public decimal? sgfy { get; set; } /// /// 备注 @@ -75,19 +64,29 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk public string bz { get; set; } /// - /// 退卡品项 + /// 退卡时间 /// - public string tkpx { get; set; } + public string tksj { get; set; } /// - /// 退卡时间 + /// 操作人员 /// - public string tksj { get; set; } + public string czry { get; set; } + + /// + /// 退卡状态 + /// + public string tkzt { get; set; } /// - /// 退卡人 + /// 退卡原因 + /// + public string tkyy { get; set; } + + /// + /// 退卡附件 /// - public string tkr { get; set; } + public string fileUrl { get; set; } } -} +} \ No newline at end of file diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkUpInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkUpInput.cs index 5e32ce3..18d38d4 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkUpInput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkUpInput.cs @@ -1,17 +1,110 @@ using System; using System.Collections.Generic; +using NCC.Extend.Entitys.Dto.LqHytkMx; +using NCC.Extend.Entitys.Dto.LqHytkJksyj; +using NCC.Extend.Entitys.Dto.LqHytkKjbsyj; namespace NCC.Extend.Entitys.Dto.LqHytkHytk { /// - /// 会员退卡更新输入参数 + /// 退卡_信息表更新输入参数 /// - public class LqHytkHytkUpInput : LqHytkHytkCrInput + public class LqHytkHytkUpInput { /// /// 退卡编号 /// public string id { get; set; } + /// + /// 门店 + /// + public string md { get; set; } + + /// + /// 门店编号 + /// + public string mdbh { get; set; } + + /// + /// 门店名称 + /// + public string mdmc { get; set; } + + /// + /// 会员 + /// + public string hy { get; set; } + + /// + /// 会员姓名 + /// + public string hymc { get; set; } + + /// + /// 会员账号 + /// + public string hyzh { get; set; } + + /// + /// 顾客类型 + /// + public string gklx { get; set; } + + /// + /// 退卡总金额 + /// + public decimal? tkje { get; set; } + + /// + /// 手工费用 + /// + public decimal? sgfy { get; set; } + + /// + /// 备注 + /// + public string bz { get; set; } + + /// + /// 退卡时间 + /// + public DateTime? tksj { get; set; } + + /// + /// 操作人员 + /// + public string czry { get; set; } + + /// + /// 退卡状态 + /// + public string tkzt { get; set; } + + /// + /// 退卡原因 + /// + public string tkyy { get; set; } + + /// + /// 退卡附件 + /// + public string fileUrl { get; set; } + + /// + /// 退卡品项明细列表 + /// + public List lqHytkMxList { get; set; } + + /// + /// 退卡健康师业绩列表 + /// + public List lqHytkJksyjList { get; set; } + + /// + /// 退卡科技部老师业绩列表 + /// + public List lqHytkKjbsyjList { get; set; } + } -} +} \ No newline at end of file diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkJksyj/LqHytkJksyjCrInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkJksyj/LqHytkJksyjCrInput.cs new file mode 100644 index 0000000..57dd462 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkJksyj/LqHytkJksyjCrInput.cs @@ -0,0 +1,66 @@ +using System; + +namespace NCC.Extend.Entitys.Dto.LqHytkJksyj +{ + /// + /// 退卡_健康师业绩表创建输入参数 + /// + public class LqHytkJksyjCrInput + { + /// + /// 业绩编号 + /// + public string id { get; set; } + + /// + /// 关联退卡编号 + /// + public string gltkbh { get; set; } + + /// + /// 健康师 + /// + public string jks { get; set; } + + /// + /// 健康师姓名 + /// + public string jksxm { get; set; } + + /// + /// 健康师账号 + /// + public string jkszh { get; set; } + + /// + /// 健康师业绩 + /// + public decimal? jksyj { get; set; } + + /// + /// 退卡时间 + /// + public DateTime? tksj { get; set; } + + /// + /// 金三角id + /// + public string F_jsjid { get; set; } + + /// + /// 关联项目资料表ID + /// + public string F_tkpxid { get; set; } + + /// + /// 手工费 + /// + public decimal? F_LaborCost { get; set; } + + /// + /// 退卡品项次数 + /// + public decimal? F_tkpxNumber { get; set; } + + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkJksyj/LqHytkJksyjInfoOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkJksyj/LqHytkJksyjInfoOutput.cs new file mode 100644 index 0000000..ef81a72 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkJksyj/LqHytkJksyjInfoOutput.cs @@ -0,0 +1,66 @@ +using System; + +namespace NCC.Extend.Entitys.Dto.LqHytkJksyj +{ + /// + /// 退卡_健康师业绩表详情输出 + /// + public class LqHytkJksyjInfoOutput + { + /// + /// 业绩编号 + /// + public string id { get; set; } + + /// + /// 关联退卡编号 + /// + public string gltkbh { get; set; } + + /// + /// 健康师 + /// + public string jks { get; set; } + + /// + /// 健康师姓名 + /// + public string jksxm { get; set; } + + /// + /// 健康师账号 + /// + public string jkszh { get; set; } + + /// + /// 健康师业绩 + /// + public decimal? jksyj { get; set; } + + /// + /// 退卡时间 + /// + public DateTime? tksj { get; set; } + + /// + /// 金三角id + /// + public string F_jsjid { get; set; } + + /// + /// 关联项目资料表ID + /// + public string F_tkpxid { get; set; } + + /// + /// 手工费 + /// + public decimal? F_LaborCost { get; set; } + + /// + /// 退卡品项次数 + /// + public decimal? F_tkpxNumber { get; set; } + + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkJksyj/LqHytkJksyjUpInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkJksyj/LqHytkJksyjUpInput.cs new file mode 100644 index 0000000..1deff62 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkJksyj/LqHytkJksyjUpInput.cs @@ -0,0 +1,66 @@ +using System; + +namespace NCC.Extend.Entitys.Dto.LqHytkJksyj +{ + /// + /// 退卡_健康师业绩表更新输入参数 + /// + public class LqHytkJksyjUpInput + { + /// + /// 业绩编号 + /// + public string id { get; set; } + + /// + /// 关联退卡编号 + /// + public string gltkbh { get; set; } + + /// + /// 健康师 + /// + public string jks { get; set; } + + /// + /// 健康师姓名 + /// + public string jksxm { get; set; } + + /// + /// 健康师账号 + /// + public string jkszh { get; set; } + + /// + /// 健康师业绩 + /// + public decimal? jksyj { get; set; } + + /// + /// 退卡时间 + /// + public DateTime? tksj { get; set; } + + /// + /// 金三角id + /// + public string F_jsjid { get; set; } + + /// + /// 关联项目资料表ID + /// + public string F_tkpxid { get; set; } + + /// + /// 手工费 + /// + public decimal? F_LaborCost { get; set; } + + /// + /// 退卡品项次数 + /// + public decimal? F_tkpxNumber { get; set; } + + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkKjbsyj/LqHytkKjbsyjCrInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkKjbsyj/LqHytkKjbsyjCrInput.cs new file mode 100644 index 0000000..b36fcab --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkKjbsyj/LqHytkKjbsyjCrInput.cs @@ -0,0 +1,61 @@ +using System; + +namespace NCC.Extend.Entitys.Dto.LqHytkKjbsyj +{ + /// + /// 退卡_科技部老师业绩表创建输入参数 + /// + public class LqHytkKjbsyjCrInput + { + /// + /// 业绩编号 + /// + public string id { get; set; } + + /// + /// 关联退卡编号 + /// + public string gltkbh { get; set; } + + /// + /// 科技部老师 + /// + public string kjbls { get; set; } + + /// + /// 科技部老师姓名 + /// + public string kjblsxm { get; set; } + + /// + /// 科技部老师账号 + /// + public string kjblszh { get; set; } + + /// + /// 科技部老师业绩 + /// + public decimal? kjblsyj { get; set; } + + /// + /// 退卡时间 + /// + public DateTime? tksj { get; set; } + + /// + /// 关联项目资料表ID + /// + public string F_tkpxid { get; set; } + + /// + /// 手工费 + /// + public decimal? F_LaborCost { get; set; } + + /// + /// 退卡品项次数 + /// + public decimal? F_tkpxNumber { get; set; } + + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkKjbsyj/LqHytkKjbsyjInfoOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkKjbsyj/LqHytkKjbsyjInfoOutput.cs new file mode 100644 index 0000000..820deb3 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkKjbsyj/LqHytkKjbsyjInfoOutput.cs @@ -0,0 +1,61 @@ +using System; + +namespace NCC.Extend.Entitys.Dto.LqHytkKjbsyj +{ + /// + /// 退卡_科技部老师业绩表详情输出 + /// + public class LqHytkKjbsyjInfoOutput + { + /// + /// 业绩编号 + /// + public string id { get; set; } + + /// + /// 关联退卡编号 + /// + public string gltkbh { get; set; } + + /// + /// 科技部老师 + /// + public string kjbls { get; set; } + + /// + /// 科技部老师姓名 + /// + public string kjblsxm { get; set; } + + /// + /// 科技部老师账号 + /// + public string kjblszh { get; set; } + + /// + /// 科技部老师业绩 + /// + public decimal? kjblsyj { get; set; } + + /// + /// 退卡时间 + /// + public DateTime? tksj { get; set; } + + /// + /// 关联项目资料表ID + /// + public string F_tkpxid { get; set; } + + /// + /// 手工费 + /// + public decimal? F_LaborCost { get; set; } + + /// + /// 退卡品项次数 + /// + public decimal? F_tkpxNumber { get; set; } + + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkKjbsyj/LqHytkKjbsyjUpInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkKjbsyj/LqHytkKjbsyjUpInput.cs new file mode 100644 index 0000000..f230494 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkKjbsyj/LqHytkKjbsyjUpInput.cs @@ -0,0 +1,61 @@ +using System; + +namespace NCC.Extend.Entitys.Dto.LqHytkKjbsyj +{ + /// + /// 退卡_科技部老师业绩表更新输入参数 + /// + public class LqHytkKjbsyjUpInput + { + /// + /// 业绩编号 + /// + public string id { get; set; } + + /// + /// 关联退卡编号 + /// + public string gltkbh { get; set; } + + /// + /// 科技部老师 + /// + public string kjbls { get; set; } + + /// + /// 科技部老师姓名 + /// + public string kjblsxm { get; set; } + + /// + /// 科技部老师账号 + /// + public string kjblszh { get; set; } + + /// + /// 科技部老师业绩 + /// + public decimal? kjblsyj { get; set; } + + /// + /// 退卡时间 + /// + public DateTime? tksj { get; set; } + + /// + /// 关联项目资料表ID + /// + public string F_tkpxid { get; set; } + + /// + /// 手工费 + /// + public decimal? F_LaborCost { get; set; } + + /// + /// 退卡品项次数 + /// + public decimal? F_tkpxNumber { get; set; } + + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkMx/LqHytkMxCrInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkMx/LqHytkMxCrInput.cs index 81caf0d..cfba5e9 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkMx/LqHytkMxCrInput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkMx/LqHytkMxCrInput.cs @@ -1,10 +1,12 @@ using System; using System.Collections.Generic; +using NCC.Extend.Entitys.Dto.LqHytkJksyj; +using NCC.Extend.Entitys.Dto.LqHytkKjbsyj; -namespace NCC.Extend.Entitys.Dto.LqHytkHytk +namespace NCC.Extend.Entitys.Dto.LqHytkMx { /// - /// 会员退卡修改输入参数 + /// 退卡_品项明细表创建输入参数 /// public class LqHytkMxCrInput { @@ -13,7 +15,6 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk /// public string id { get; set; } - /// /// 关联退卡编号 /// @@ -27,27 +28,47 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk /// /// 品项名称 /// - public string mc { get; set; } + public string pxmc { get; set; } + + /// + /// 品项价格 + /// + public decimal? pxjg { get; set; } /// /// 退款金额 /// - public string tkje { get; set; } + public decimal? tkje { get; set; } + + /// + /// 项目次数 + /// + public int? F_ProjectNumber { get; set; } + + /// + /// 是否有效 + /// + public int? F_IsEnabled { get; set; } + + /// + /// 来源类型 + /// + public string F_SourceType { get; set; } /// - /// 次数 + /// 合计金额 /// - public string cs { get; set; } + public decimal? F_TotalPrice { get; set; } /// - /// 单次耗卡 + /// 退卡健康师业绩列表 /// - public string dchk { get; set; } + public List lqHytkJksyjList { get; set; } /// - /// 发生时间 + /// 退卡科技部老师业绩列表 /// - public DateTime? fssj { get; set; } + public List lqHytkKjbsyjList { get; set; } } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkMx/LqHytkMxInfoOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkMx/LqHytkMxInfoOutput.cs index 29eecc1..57550f1 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkMx/LqHytkMxInfoOutput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkMx/LqHytkMxInfoOutput.cs @@ -1,10 +1,12 @@ using System; using System.Collections.Generic; +using NCC.Extend.Entitys.Dto.LqHytkJksyj; +using NCC.Extend.Entitys.Dto.LqHytkKjbsyj; -namespace NCC.Extend.Entitys.Dto.LqHytkHytk +namespace NCC.Extend.Entitys.Dto.LqHytkMx { /// - /// 会员退卡输出参数 + /// 退卡_品项明细表详情输出 /// public class LqHytkMxInfoOutput { @@ -19,34 +21,54 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk public string gltkbh { get; set; } /// - /// 品项 + /// 品项编号 /// public string px { get; set; } /// /// 品项名称 /// - public string mc { get; set; } + public string pxmc { get; set; } + + /// + /// 品项价格 + /// + public decimal? pxjg { get; set; } /// /// 退款金额 /// - public string tkje { get; set; } + public decimal? tkje { get; set; } + + /// + /// 项目次数 + /// + public int? F_ProjectNumber { get; set; } /// - /// 次数 + /// 是否有效 /// - public string cs { get; set; } + public int? F_IsEnabled { get; set; } /// - /// 单次耗卡 + /// 来源类型(开卡/赠送/其他) /// - public string dchk { get; set; } + public string F_SourceType { get; set; } /// - /// 发生时间 + /// 合计金额(品项价格 × 项目次数) + /// + public decimal? F_TotalPrice { get; set; } + + /// + /// 健康师业绩列表 + /// + public List lqHytkJksyjList { get; set; } + + /// + /// 科技部老师业绩列表 /// - public DateTime? fssj { get; set; } + public List lqHytkKjbsyjList { get; set; } } -} +} \ No newline at end of file diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkMx/LqHytkMxUpInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkMx/LqHytkMxUpInput.cs index 11639bd..a23fc9e 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkMx/LqHytkMxUpInput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkMx/LqHytkMxUpInput.cs @@ -1,17 +1,61 @@ using System; -using System.Collections.Generic; -namespace NCC.Extend.Entitys.Dto.LqHytkHytk +namespace NCC.Extend.Entitys.Dto.LqHytkMx { /// - /// 会员退卡更新输入参数 + /// 退卡_品项明细表更新输入参数 /// - public class LqHytkMxUpInput : LqHytkHytkCrInput + public class LqHytkMxUpInput { /// /// 明细编号 /// public string id { get; set; } + /// + /// 关联退卡编号 + /// + public string gltkbh { get; set; } + + /// + /// 品项 + /// + public string px { get; set; } + + /// + /// 品项名称 + /// + public string pxmc { get; set; } + + /// + /// 品项价格 + /// + public decimal? pxjg { get; set; } + + /// + /// 退款金额 + /// + public decimal? tkje { get; set; } + + /// + /// 项目次数 + /// + public int? F_ProjectNumber { get; set; } + + /// + /// 是否有效 + /// + public int? F_IsEnabled { get; set; } + + /// + /// 来源类型 + /// + public string F_SourceType { get; set; } + + /// + /// 合计金额 + /// + public decimal? F_TotalPrice { get; set; } + } -} +} \ No newline at end of file diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdJksyj/LqKdJksyjInfoOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdJksyj/LqKdJksyjInfoOutput.cs index cba09ac..4b39d4e 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdJksyj/LqKdJksyjInfoOutput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdJksyj/LqKdJksyjInfoOutput.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; namespace NCC.Extend.Entitys.Dto.LqKdKdjlb { /// - /// 开单记录表输出参数 + /// 开单健康师业绩输出参数 /// public class LqKdJksyjInfoOutput { @@ -19,7 +19,12 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb public string glkdbh { get; set; } /// - /// 健康师 + /// 关联开单品项ID + /// + public string kdpxid { get; set; } + + /// + /// 健康师ID /// public string jks { get; set; } @@ -43,5 +48,9 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb /// public DateTime? yjsj { get; set; } + /// + /// 金三角ID + /// + public string jsj_id { get; set; } } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKjbsyj/LqKdKjbsyjInfoOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKjbsyj/LqKdKjbsyjInfoOutput.cs index e6c650e..40ea6c7 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKjbsyj/LqKdKjbsyjInfoOutput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKjbsyj/LqKdKjbsyjInfoOutput.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; namespace NCC.Extend.Entitys.Dto.LqKdKdjlb { /// - /// 开单记录表输出参数 + /// 开单科技部老师业绩输出参数 /// public class LqKdKjbsyjInfoOutput { @@ -19,7 +19,12 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb public string glkdbh { get; set; } /// - /// 科技部老师 + /// 关联开单品项ID + /// + public string kdpxid { get; set; } + + /// + /// 科技部老师ID /// public string kjbls { get; set; } @@ -42,6 +47,5 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb /// 业绩时间 /// public DateTime? yjsj { get; set; } - } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdPxmx/LqKdPxmxInfoOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdPxmx/LqKdPxmxInfoOutput.cs index aaa894b..c02844f 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdPxmx/LqKdPxmxInfoOutput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdPxmx/LqKdPxmxInfoOutput.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; namespace NCC.Extend.Entitys.Dto.LqKdKdjlb { /// - /// 开单记录表输出参数 + /// 开单品项明细输出参数 /// public class LqKdPxmxInfoOutput { @@ -19,7 +19,7 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb public string glkdbh { get; set; } /// - /// 品项 + /// 品项编号 /// public string px { get; set; } @@ -33,5 +33,44 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb /// public decimal pxjg { get; set; } + /// + /// 项目次数 + /// + public int? projectNumber { get; set; } + + /// + /// 是否有效 + /// + public int? isEnabled { get; set; } + + /// + /// 来源类型(开卡/赠送/其他) + /// + public string sourceType { get; set; } + + /// + /// 会员ID + /// + public string memberId { get; set; } + + /// + /// 创建时间 + /// + public DateTime? createTime { get; set; } + + /// + /// 总价格(品项价格 × 项目次数) + /// + public decimal totalPrice { get; set; } + + /// + /// 健康师业绩列表 + /// + public List lqKdJksyjList { get; set; } + + /// + /// 科技部老师业绩列表 + /// + public List lqKdKjbsyjList { get; set; } } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqMdxx/StoreStatisticsInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqMdxx/StoreStatisticsInput.cs new file mode 100644 index 0000000..6349506 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqMdxx/StoreStatisticsInput.cs @@ -0,0 +1,23 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace NCC.Extend.Entitys.Dto.LqMdxx +{ + /// + /// 门店统计查询输入参数 + /// + public class StoreStatisticsInput + { + /// + /// 查询日期 + /// + /// + /// 传入日期格式:2025-9-14 + /// 系统会自动计算本月1号到传入日期的时间范围 + /// 例如传入2025-9-14,则查询范围为2025-9-1到2025-9-14 + /// + /// 2025-9-14 + [Required(ErrorMessage = "查询日期不能为空")] + public DateTime QueryDate { get; set; } + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqMdxx/StoreStatisticsOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqMdxx/StoreStatisticsOutput.cs new file mode 100644 index 0000000..5b31b94 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqMdxx/StoreStatisticsOutput.cs @@ -0,0 +1,120 @@ +using System; +using System.Collections.Generic; + +namespace NCC.Extend.Entitys.Dto.LqMdxx +{ + /// + /// 门店统计结果输出 + /// + public class StoreStatisticsOutput + { + /// + /// 查询开始日期 + /// + /// 2025-09-01 + public DateTime StartDate { get; set; } + + /// + /// 查询结束日期 + /// + /// 2025-09-14 + public DateTime EndDate { get; set; } + + /// + /// 门店统计列表 + /// + public List StoreList { get; set; } = new List(); + + /// + /// 汇总统计 + /// + public StoreSummaryInfo Summary { get; set; } = new StoreSummaryInfo(); + } + + /// + /// 门店统计信息 + /// + public class StoreStatisticsInfo + { + /// + /// 门店ID + /// + /// 123456789 + public string StoreId { get; set; } + + /// + /// 门店编码 + /// + /// MD001 + public string StoreCode { get; set; } + + /// + /// 门店名称 + /// + /// 北京朝阳店 + public string StoreName { get; set; } + + /// + /// 员工数量 + /// + /// 该门店的员工总数 + /// 15 + public int EmployeeCount { get; set; } + + /// + /// 项目数量 + /// + /// 统计期间该门店耗卡的项目总数 + /// 128 + public decimal ProjectCount { get; set; } + + /// + /// 消耗业绩 + /// + /// 统计期间该门店耗卡的金额总计 + /// 25680.50 + public decimal ConsumeAmount { get; set; } + + /// + /// 城市 + /// + /// 北京 + public string City { get; set; } + + /// + /// 事业部 + /// + /// 华北事业部 + public string BusinessUnit { get; set; } + } + + /// + /// 汇总统计信息 + /// + public class StoreSummaryInfo + { + /// + /// 门店总数 + /// + /// 25 + public int TotalStoreCount { get; set; } + + /// + /// 员工总数 + /// + /// 365 + public int TotalEmployeeCount { get; set; } + + /// + /// 项目总数 + /// + /// 2580 + public decimal TotalProjectCount { get; set; } + + /// + /// 消耗业绩总计 + /// + /// 568920.80 + public decimal TotalConsumeAmount { get; set; } + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhHyhk/MemberRemainingItemsOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhHyhk/MemberRemainingItemsOutput.cs index e1c0340..0038e88 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhHyhk/MemberRemainingItemsOutput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhHyhk/MemberRemainingItemsOutput.cs @@ -80,9 +80,16 @@ namespace NCC.Extend.Entitys.Dto.LqXhHyhk public decimal ConsumedCount { get; set; } /// + /// 已退卡数量 + /// + /// 该品项已退卡的次数 + /// 0 + public decimal RefundedCount { get; set; } + + /// /// 剩余数量 /// - /// 总购买数量减去已消费数量 + /// 总购买数量减去已消费数量减去已退卡数量 /// 2 public decimal RemainingCount { get; set; } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhPxmx/LqXhPxmxInfoOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhPxmx/LqXhPxmxInfoOutput.cs index caae96b..bd7a991 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhPxmx/LqXhPxmxInfoOutput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhPxmx/LqXhPxmxInfoOutput.cs @@ -1,4 +1,7 @@ using System; +using System.Collections.Generic; +using NCC.Extend.Entitys.Dto.LqXhJksyj; +using NCC.Extend.Entitys.Dto.LqXhKjbsyj; namespace NCC.Extend.Entitys.Dto.LqXhPxmx { @@ -13,12 +16,12 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx public string id { get; set; } /// - /// 关联开单编号 + /// 关联耗卡编号 /// public string glkdbh { get; set; } /// - /// 品项 + /// 品项编号 /// public string px { get; set; } @@ -38,7 +41,7 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx public string xfzs { get; set; } /// - /// 会员id + /// 会员ID /// public string memberId { get; set; } @@ -58,13 +61,23 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx public int? isEnabled { get; set; } /// - /// 来源类型 + /// 来源类型(开卡/赠送/其他) /// public string sourceType { get; set; } /// - /// 合计金额 + /// 合计金额(品项价格 × 项目次数) /// public decimal totalPrice { get; set; } + + /// + /// 健康师业绩列表 + /// + public List lqXhJksyjList { get; set; } + + /// + /// 科技部老师业绩列表 + /// + public List lqXhKjbsyjList { get; set; } } } \ No newline at end of file diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_hytk/LqHytkHytkEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_hytk/LqHytkHytkEntity.cs index d46726e..bc1b154 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_hytk/LqHytkHytkEntity.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_hytk/LqHytkHytkEntity.cs @@ -5,7 +5,7 @@ using System; namespace NCC.Extend.Entitys.lq_hytk_hytk { /// - /// 会员退卡 + /// 退卡_信息表 /// [SugarTable("lq_hytk_hytk")] [Tenant(ClaimConst.TENANT_ID)] @@ -26,8 +26,8 @@ namespace NCC.Extend.Entitys.lq_hytk_hytk /// /// 门店编号 /// - [SugarColumn(ColumnName = "mcbh")] - public string Mcbh { get; set; } + [SugarColumn(ColumnName = "mdbh")] + public string Mdbh { get; set; } /// /// 门店名称 @@ -44,8 +44,8 @@ namespace NCC.Extend.Entitys.lq_hytk_hytk /// /// 会员姓名 /// - [SugarColumn(ColumnName = "hyxm")] - public string Hyxm { get; set; } + [SugarColumn(ColumnName = "hymc")] + public string Hymc { get; set; } /// /// 会员账号 @@ -54,22 +54,22 @@ namespace NCC.Extend.Entitys.lq_hytk_hytk public string Hyzh { get; set; } /// - /// 健康师 + /// 顾客类型 /// - [SugarColumn(ColumnName = "jks")] - public string Jks { get; set; } + [SugarColumn(ColumnName = "gklx")] + public string Gklx { get; set; } /// - /// 健康师账号 + /// 退卡总金额 /// - [SugarColumn(ColumnName = "jkszh")] - public string Jkszh { get; set; } + [SugarColumn(ColumnName = "tkje")] + public decimal? Tkje { get; set; } /// - /// 健康师姓名 + /// 手工费用 /// - [SugarColumn(ColumnName = "jksxm")] - public string Jksxm { get; set; } + [SugarColumn(ColumnName = "sgfy")] + public decimal? Sgfy { get; set; } /// /// 备注 @@ -78,22 +78,65 @@ namespace NCC.Extend.Entitys.lq_hytk_hytk public string Bz { get; set; } /// - /// 退卡品项 - /// - [SugarColumn(ColumnName = "tkpx")] - public string Tkpx { get; set; } - - /// /// 退卡时间 /// [SugarColumn(ColumnName = "tksj")] public DateTime? Tksj { get; set; } /// - /// 退卡人 + /// 操作人员 + /// + [SugarColumn(ColumnName = "czry")] + public string Czry { get; set; } + + /// + /// 退卡状态 + /// + [SugarColumn(ColumnName = "tkzt")] + public string Tkzt { get; set; } + + /// + /// 退卡原因 + /// + [SugarColumn(ColumnName = "tkyy")] + public string Tkyy { get; set; } + + + /// + /// 退卡附件 + /// + [SugarColumn(ColumnName = "F_FileUrl")] + public string FileUrl { get; set; } + + /// + /// 创建时间 + /// + [SugarColumn(ColumnName = "F_CreateTime")] + public DateTime? F_CreateTime { get; set; } + + /// + /// 创建用户 + /// + [SugarColumn(ColumnName = "F_CreateUser")] + public string F_CreateUser { get; set; } + + /// + /// 修改时间 + /// + [SugarColumn(ColumnName = "F_ModifyTime")] + public DateTime? F_ModifyTime { get; set; } + + /// + /// 修改用户 + /// + [SugarColumn(ColumnName = "F_ModifyUser")] + public string F_ModifyUser { get; set; } + + /// + /// 删除标记 /// - [SugarColumn(ColumnName = "tkr")] - public string Tkr { get; set; } + [SugarColumn(ColumnName = "F_DeleteMark")] + public int? F_DeleteMark { get; set; } } } \ No newline at end of file diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_jksyj/LqHytkJksyjEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_jksyj/LqHytkJksyjEntity.cs new file mode 100644 index 0000000..ae9436e --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_jksyj/LqHytkJksyjEntity.cs @@ -0,0 +1,111 @@ +using NCC.Common.Const; +using SqlSugar; +using System; + +namespace NCC.Extend.Entitys.lq_hytk_jksyj +{ + /// + /// 退卡_健康师业绩表 + /// + [SugarTable("lq_hytk_jksyj")] + [Tenant(ClaimConst.TENANT_ID)] + public class LqHytkJksyjEntity + { + /// + /// 业绩编号 + /// + [SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true)] + public string Id { get; set; } + + /// + /// 关联退卡编号 + /// + [SugarColumn(ColumnName = "gltkbh")] + public string Gltkbh { get; set; } + + /// + /// 健康师 + /// + [SugarColumn(ColumnName = "jks")] + public string Jks { get; set; } + + /// + /// 健康师姓名 + /// + [SugarColumn(ColumnName = "jksxm")] + public string Jksxm { get; set; } + + /// + /// 健康师账号 + /// + [SugarColumn(ColumnName = "jkszh")] + public string Jkszh { get; set; } + + /// + /// 健康师业绩 + /// + [SugarColumn(ColumnName = "jksyj")] + public decimal? Jksyj { get; set; } + + /// + /// 退卡时间 + /// + [SugarColumn(ColumnName = "tksj")] + public DateTime? Tksj { get; set; } + + /// + /// 金三角id + /// + [SugarColumn(ColumnName = "F_jsjid")] + public string F_jsjid { get; set; } + + /// + /// 关联项目资料表ID + /// + [SugarColumn(ColumnName = "F_tkpxid")] + public string F_tkpxid { get; set; } + + /// + /// 手工费 + /// + [SugarColumn(ColumnName = "F_LaborCost")] + public decimal? F_LaborCost { get; set; } + + /// + /// 退卡品项次数 + /// + [SugarColumn(ColumnName = "F_tkpxNumber")] + public decimal? F_tkpxNumber { get; set; } + + /// + /// 创建时间 + /// + [SugarColumn(ColumnName = "F_CreateTime")] + public DateTime? F_CreateTime { get; set; } + + /// + /// 创建用户 + /// + [SugarColumn(ColumnName = "F_CreateUser")] + public string F_CreateUser { get; set; } + + /// + /// 修改时间 + /// + [SugarColumn(ColumnName = "F_ModifyTime")] + public DateTime? F_ModifyTime { get; set; } + + /// + /// 修改用户 + /// + [SugarColumn(ColumnName = "F_ModifyUser")] + public string F_ModifyUser { get; set; } + + /// + /// 删除标记 + /// + [SugarColumn(ColumnName = "F_DeleteMark")] + public int? F_DeleteMark { get; set; } + + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_kjbsyj/LqHytkKjbsyjEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_kjbsyj/LqHytkKjbsyjEntity.cs new file mode 100644 index 0000000..86c12cd --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_kjbsyj/LqHytkKjbsyjEntity.cs @@ -0,0 +1,105 @@ +using NCC.Common.Const; +using SqlSugar; +using System; + +namespace NCC.Extend.Entitys.lq_hytk_kjbsyj +{ + /// + /// 退卡_科技部老师业绩表 + /// + [SugarTable("lq_hytk_kjbsyj")] + [Tenant(ClaimConst.TENANT_ID)] + public class LqHytkKjbsyjEntity + { + /// + /// 业绩编号 + /// + [SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true)] + public string Id { get; set; } + + /// + /// 关联退卡编号 + /// + [SugarColumn(ColumnName = "gltkbh")] + public string Gltkbh { get; set; } + + /// + /// 科技部老师 + /// + [SugarColumn(ColumnName = "kjbls")] + public string Kjbls { get; set; } + + /// + /// 科技部老师姓名 + /// + [SugarColumn(ColumnName = "kjblsxm")] + public string Kjblsxm { get; set; } + + /// + /// 科技部老师账号 + /// + [SugarColumn(ColumnName = "kjblszh")] + public string Kjblszh { get; set; } + + /// + /// 科技部老师业绩 + /// + [SugarColumn(ColumnName = "kjblsyj")] + public decimal? Kjblsyj { get; set; } + + /// + /// 退卡时间 + /// + [SugarColumn(ColumnName = "tksj")] + public DateTime? Tksj { get; set; } + + /// + /// 关联项目资料表ID + /// + [SugarColumn(ColumnName = "F_tkpxid")] + public string F_tkpxid { get; set; } + + /// + /// 手工费 + /// + [SugarColumn(ColumnName = "F_LaborCost")] + public decimal? F_LaborCost { get; set; } + + /// + /// 退卡品项次数 + /// + [SugarColumn(ColumnName = "F_tkpxNumber")] + public decimal? F_tkpxNumber { get; set; } + + /// + /// 创建时间 + /// + [SugarColumn(ColumnName = "F_CreateTime")] + public DateTime? F_CreateTime { get; set; } + + /// + /// 创建用户 + /// + [SugarColumn(ColumnName = "F_CreateUser")] + public string F_CreateUser { get; set; } + + /// + /// 修改时间 + /// + [SugarColumn(ColumnName = "F_ModifyTime")] + public DateTime? F_ModifyTime { get; set; } + + /// + /// 修改用户 + /// + [SugarColumn(ColumnName = "F_ModifyUser")] + public string F_ModifyUser { get; set; } + + /// + /// 删除标记 + /// + [SugarColumn(ColumnName = "F_DeleteMark")] + public int? F_DeleteMark { get; set; } + + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_mx/LqHytkMxEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_mx/LqHytkMxEntity.cs index 5e97330..928de33 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_mx/LqHytkMxEntity.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_mx/LqHytkMxEntity.cs @@ -5,7 +5,7 @@ using System; namespace NCC.Extend.Entitys.lq_hytk_mx { /// - /// 会员退卡 + /// 退卡_品项明细表 /// [SugarTable("lq_hytk_mx")] [Tenant(ClaimConst.TENANT_ID)] @@ -32,32 +32,74 @@ namespace NCC.Extend.Entitys.lq_hytk_mx /// /// 品项名称 /// - [SugarColumn(ColumnName = "mc")] - public string Mc { get; set; } + [SugarColumn(ColumnName = "pxmc")] + public string Pxmc { get; set; } + + /// + /// 品项价格 + /// + [SugarColumn(ColumnName = "pxjg")] + public decimal? Pxjg { get; set; } /// /// 退款金额 /// [SugarColumn(ColumnName = "tkje")] - public string Tkje { get; set; } + public decimal? Tkje { get; set; } + + /// + /// 项目次数 + /// + [SugarColumn(ColumnName = "F_ProjectNumber")] + public int? F_ProjectNumber { get; set; } + + /// + /// 是否有效 + /// + [SugarColumn(ColumnName = "F_IsEnabled")] + public int? F_IsEnabled { get; set; } + + /// + /// 来源类型 + /// + [SugarColumn(ColumnName = "F_SourceType")] + public string F_SourceType { get; set; } + + /// + /// 合计金额 + /// + [SugarColumn(ColumnName = "F_TotalPrice")] + public decimal? F_TotalPrice { get; set; } + + /// + /// 创建时间 + /// + [SugarColumn(ColumnName = "F_CreateTime")] + public DateTime? F_CreateTime { get; set; } + + /// + /// 创建用户 + /// + [SugarColumn(ColumnName = "F_CreateUser")] + public string F_CreateUser { get; set; } /// - /// 次数 + /// 修改时间 /// - [SugarColumn(ColumnName = "cs")] - public string Cs { get; set; } + [SugarColumn(ColumnName = "F_ModifyTime")] + public DateTime? F_ModifyTime { get; set; } /// - /// 单次耗卡 + /// 修改用户 /// - [SugarColumn(ColumnName = "dchk")] - public string Dchk { get; set; } + [SugarColumn(ColumnName = "F_ModifyUser")] + public string F_ModifyUser { get; set; } /// - /// 发生时间 + /// 删除标记 /// - [SugarColumn(ColumnName = "fssj")] - public DateTime? Fssj { get; set; } + [SugarColumn(ColumnName = "F_DeleteMark")] + public int? F_DeleteMark { get; set; } } } \ No newline at end of file diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Interfaces/LqStatistics/ILqStatisticsService.cs b/netcore/src/Modularity/Extend/NCC.Extend.Interfaces/LqStatistics/ILqStatisticsService.cs index 281576b..3e9f377 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Interfaces/LqStatistics/ILqStatisticsService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Interfaces/LqStatistics/ILqStatisticsService.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Threading.Tasks; using NCC.Extend.Entitys.Dto.LqStatistics; +using NCC.Extend.Entitys.Dto.LqMdxx; namespace NCC.Extend.Interfaces.LqStatistics { @@ -10,15 +11,16 @@ namespace NCC.Extend.Interfaces.LqStatistics public interface ILqStatisticsService { /// - /// 测试接口 - /// - /// 测试结果 - Task Test(); - - /// /// 获取门店业绩统计列表 /// /// 门店业绩统计列表 Task> GetStorePerformanceList(); + + /// + /// 获取门店统计信息 + /// + /// 查询参数 + /// 门店统计结果 + Task GetStoreStatistics(StoreStatisticsInput input); } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqHytkHytkService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqHytkHytkService.cs index 3480e47..9ad8486 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqHytkHytkService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqHytkHytkService.cs @@ -1,4 +1,4 @@ -using NCC.Common.Core.Manager; +using NCC.Common.Core.Manager; using NCC.Common.Enum; using NCC.Common.Extension; using NCC.Common.Filter; @@ -15,7 +15,12 @@ using System.Linq; using System.Threading.Tasks; using NCC.Extend.Entitys.lq_hytk_hytk; using NCC.Extend.Entitys.lq_hytk_mx; +using NCC.Extend.Entitys.lq_hytk_jksyj; +using NCC.Extend.Entitys.lq_hytk_kjbsyj; using NCC.Extend.Entitys.Dto.LqHytkHytk; +using NCC.Extend.Entitys.Dto.LqHytkMx; +using NCC.Extend.Entitys.Dto.LqHytkJksyj; +using NCC.Extend.Entitys.Dto.LqHytkKjbsyj; using Yitter.IdGenerator; using NCC.Common.Helper; using NCC.JsonSerialization; @@ -27,14 +32,16 @@ using NCC.ClayObject; namespace NCC.Extend.LqHytkHytk { /// - /// 会员退卡服务 + /// 退卡_信息表服务 /// - [ApiDescriptionSettings(Tag = "Extend",Name = "LqHytkHytk", Order = 200)] + [ApiDescriptionSettings(Tag = "绿纤退卡信息表服务",Name = "LqHytkHytk", Order = 200)] [Route("api/Extend/[controller]")] public class LqHytkHytkService : ILqHytkHytkService, IDynamicApiController, ITransient { private readonly ISqlSugarRepository _lqHytkHytkRepository; private readonly ISqlSugarRepository _lqHytkMxRepository; + private readonly ISqlSugarRepository _lqHytkJksyjRepository; + private readonly ISqlSugarRepository _lqHytkKjbsyjRepository; private readonly SqlSugarScope _db; private readonly IUserManager _userManager; @@ -44,34 +51,22 @@ namespace NCC.Extend.LqHytkHytk public LqHytkHytkService( ISqlSugarRepository lqHytkHytkRepository, ISqlSugarRepository lqHytkMxRepository, + ISqlSugarRepository lqHytkJksyjRepository, + ISqlSugarRepository lqHytkKjbsyjRepository, IUserManager userManager) { _lqHytkHytkRepository = lqHytkHytkRepository; - _db = _lqHytkHytkRepository.Context; _lqHytkMxRepository = lqHytkMxRepository; + _lqHytkJksyjRepository = lqHytkJksyjRepository; + _lqHytkKjbsyjRepository = lqHytkKjbsyjRepository; + _db = _lqHytkHytkRepository.Context; _userManager = userManager; } /// - /// 获取会员退卡 + /// 获取退卡信息列表 /// - /// 参数 - /// - [HttpGet("{id}")] - public async Task GetInfo(string id) - { - var entity = await _db.Queryable().FirstAsync(p => p.Id == id); - var output = entity.Adapt(); - - var lqHytkMxList = await _db.Queryable().Where(w => w.Gltkbh == entity.Id).ToListAsync(); - output.lqHytkMxList = lqHytkMxList.Adapt>(); - return output; - } - - /// - /// 获取会员退卡列表 - /// - /// 请求参数 + /// 查询参数 /// [HttpGet("")] public async Task GetList([FromQuery] LqHytkHytkListQueryInput input) @@ -83,279 +78,486 @@ namespace NCC.Extend.LqHytkHytk var data = await _db.Queryable() .WhereIF(!string.IsNullOrEmpty(input.id), p => p.Id.Contains(input.id)) .WhereIF(!string.IsNullOrEmpty(input.md), p => p.Md.Equals(input.md)) - .WhereIF(!string.IsNullOrEmpty(input.mcbh), p => p.Mcbh.Contains(input.mcbh)) + .WhereIF(!string.IsNullOrEmpty(input.mdbh), p => p.Mdbh.Contains(input.mdbh)) .WhereIF(!string.IsNullOrEmpty(input.mdmc), p => p.Mdmc.Contains(input.mdmc)) .WhereIF(!string.IsNullOrEmpty(input.hy), p => p.Hy.Equals(input.hy)) - .WhereIF(!string.IsNullOrEmpty(input.hyxm), p => p.Hyxm.Contains(input.hyxm)) + .WhereIF(!string.IsNullOrEmpty(input.hymc), p => p.Hymc.Contains(input.hymc)) .WhereIF(!string.IsNullOrEmpty(input.hyzh), p => p.Hyzh.Contains(input.hyzh)) - .WhereIF(!string.IsNullOrEmpty(input.jks), p => p.Jks.Equals(input.jks)) - .WhereIF(!string.IsNullOrEmpty(input.jkszh), p => p.Jkszh.Contains(input.jkszh)) - .WhereIF(!string.IsNullOrEmpty(input.jksxm), p => p.Jksxm.Contains(input.jksxm)) + .WhereIF(!string.IsNullOrEmpty(input.gklx), p => p.Gklx.Contains(input.gklx)) + .WhereIF(input.tkje.HasValue, p => p.Tkje == input.tkje) + .WhereIF(input.sgfy.HasValue, p => p.Sgfy == input.sgfy) .WhereIF(!string.IsNullOrEmpty(input.bz), p => p.Bz.Contains(input.bz)) - .WhereIF(!string.IsNullOrEmpty(input.tkpx), p => p.Tkpx.Contains(input.tkpx)) + .WhereIF(!string.IsNullOrEmpty(input.tkzt), p => p.Tkzt.Contains(input.tkzt)) + .WhereIF(!string.IsNullOrEmpty(input.tkyy), p => p.Tkyy.Contains(input.tkyy)) + .WhereIF(!string.IsNullOrEmpty(input.fileUrl), p => p.FileUrl.Contains(input.fileUrl)) .WhereIF(queryTksj != null, p => p.Tksj >= new DateTime(startTksj.ToDate().Year, startTksj.ToDate().Month, startTksj.ToDate().Day, 0, 0, 0)) .WhereIF(queryTksj != null, p => p.Tksj <= new DateTime(endTksj.ToDate().Year, endTksj.ToDate().Month, endTksj.ToDate().Day, 23, 59, 59)) - .WhereIF(!string.IsNullOrEmpty(input.tkr), p => p.Tkr.Equals(input.tkr)) + .WhereIF(!string.IsNullOrEmpty(input.czry), p => p.Czry.Equals(input.czry)) .Select(it=> new LqHytkHytkListOutput { id = it.Id, md=it.Md, - mcbh=it.Mcbh, + mdbh=it.Mdbh, mdmc=it.Mdmc, hy=it.Hy, - hyxm=it.Hyxm, + hymc=it.Hymc, hyzh=it.Hyzh, - jks=it.Jks, - jkszh=it.Jkszh, - jksxm=it.Jksxm, + gklx=it.Gklx, + tkje=it.Tkje, + sgfy=it.Sgfy, bz=it.Bz, - tkpx=it.Tkpx, + tkzt=it.Tkzt, + tkyy=it.Tkyy, tksj=it.Tksj, - tkr=it.Tkr, + czry=it.Czry, + fileUrl=it.FileUrl, }).MergeTable().OrderBy(sidx+" "+input.sort).ToPagedListAsync(input.currentPage, input.pageSize); return PageResult.SqlSugarPageResult(data); } /// - /// 新建会员退卡 + /// 创建退卡信息及其关联的品项明细、健康师业绩、科技部老师业绩信息 /// - /// 参数 - /// + /// + /// 创建退卡记录及其关联的品项明细、健康师业绩、科技部老师业绩信息 + /// + /// 示例请求: + /// ```json + /// { + /// "md": "门店ID", + /// "mdbh": "门店编号", + /// "mdmc": "门店名称", + /// "hy": "会员ID", + /// "hymc": "会员姓名", + /// "hyzh": "会员账号", + /// "gklx": "顾客类型", + /// "tkje": 1000.00, + /// "sgfy": 50.00, + /// "bz": "备注", + /// "tkzt": "退卡状态", + /// "tkyy": "退卡原因", + /// "lqHytkMxList": [ + /// { + /// "px": "品项编号", + /// "pxmc": "品项名称", + /// "pxjg": 100.00, + /// "tkje": 100.00, + /// "F_ProjectNumber": 1, + /// "F_SourceType": "来源类型", + /// "F_TotalPrice": 100.00, + /// "lqHytkJksyjList": [ + /// { + /// "jks": "健康师", + /// "jksxm": "健康师姓名", + /// "jkszh": "健康师账号", + /// "jksyj": 50.00, + /// "F_jsjid": "金三角ID", + /// "F_tkpxid": "项目资料ID", + /// "F_LaborCost": 10.00, + /// "F_tkpxNumber": 1 + /// } + /// ], + /// "lqHytkKjbsyjList": [ + /// { + /// "kjbls": "科技部老师", + /// "kjblsxm": "科技部老师姓名", + /// "kjblszh": "科技部老师账号", + /// "kjblsyj": 30.00, + /// "F_tkpxid": "项目资料ID", + /// "F_LaborCost": 5.00, + /// "F_tkpxNumber": 1 + /// } + /// ] + /// } + /// ] + /// } + /// ``` + /// + /// 参数说明: + /// - md: 门店ID + /// - hy: 会员ID + /// - lqHytkMxList: 退卡品项明细列表 + /// + /// 退卡创建参数 + /// 无返回值 + /// 创建成功 + /// 参数错误或数据验证失败 + /// 服务器内部错误 [HttpPost("")] public async Task Create([FromBody] LqHytkHytkCrInput input) { var userInfo = await _userManager.GetUserInfo(); var entity = input.Adapt(); entity.Id = YitIdHelper.NextId().ToString(); + entity.F_CreateTime = DateTime.Now; + entity.F_CreateUser = userInfo.userId; + entity.F_DeleteMark = 0; entity.Tksj = DateTime.Now; - entity.Tkr = _userManager.UserId; + entity.Czry = userInfo.userId; + try { - //开启事务 + // 开启事务 _db.BeginTran(); - //新增会员退卡记录 + // 新增退卡主表记录 var newEntity = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteReturnEntityAsync(); - var lqHytkMxEntityList = input.lqHytkMxList.Adapt>(); - if(lqHytkMxEntityList != null) + // 收集所有需要插入的实体,然后批量插入 + var allMxEntities = new List(); + var allJksyjEntities = new List(); + var allKjbsyjEntities = new List(); + + // 处理品项明细列表 + if (input.lqHytkMxList != null && input.lqHytkMxList.Any()) { - foreach (var item in lqHytkMxEntityList) + foreach (var item in input.lqHytkMxList) { - item.Id = YitIdHelper.NextId().ToString(); - item.Gltkbh = newEntity.Id; + // 创建品项明细实体 + var lqHytkMxEntity = new LqHytkMxEntity + { + Id = YitIdHelper.NextId().ToString(), + Gltkbh = newEntity.Id, + F_CreateTime = DateTime.Now, + F_CreateUser = userInfo.userId, + F_DeleteMark = 0, + Px = item.px, + Pxmc = item.pxmc, + Pxjg = item.pxjg, + Tkje = item.tkje, + F_ProjectNumber = item.F_ProjectNumber ?? 1, + F_IsEnabled = item.F_IsEnabled ?? 1, + F_SourceType = item.F_SourceType, + F_TotalPrice = item.F_TotalPrice ?? (item.pxjg * (item.F_ProjectNumber ?? 1)), + }; + allMxEntities.Add(lqHytkMxEntity); + + // 收集该品项关联的健康师业绩 + if (item.lqHytkJksyjList != null && item.lqHytkJksyjList.Any()) + { + foreach (var ijks_tem in item.lqHytkJksyjList) + { + allJksyjEntities.Add(new LqHytkJksyjEntity + { + Id = YitIdHelper.NextId().ToString(), + Gltkbh = newEntity.Id, + Jks = ijks_tem.jks, + Jksxm = ijks_tem.jksxm, + Jkszh = ijks_tem.jkszh, + Jksyj = ijks_tem.jksyj, + Tksj = DateTime.Now, + F_jsjid = ijks_tem.F_jsjid, + F_tkpxid = ijks_tem.F_tkpxid, + F_LaborCost = ijks_tem.F_LaborCost, + F_tkpxNumber = ijks_tem.F_tkpxNumber, + F_CreateTime = DateTime.Now, + F_CreateUser = userInfo.userId, + F_DeleteMark = 0, + }); + } + } + + // 收集该品项关联的科技部老师业绩 + if (item.lqHytkKjbsyjList != null && item.lqHytkKjbsyjList.Any()) + { + foreach (var ikjbs_tem in item.lqHytkKjbsyjList) + { + allKjbsyjEntities.Add(new LqHytkKjbsyjEntity + { + Id = YitIdHelper.NextId().ToString(), + Gltkbh = newEntity.Id, + Kjbls = ikjbs_tem.kjbls, + Kjblsxm = ikjbs_tem.kjblsxm, + Kjblszh = ikjbs_tem.kjblszh, + Kjblsyj = ikjbs_tem.kjblsyj, + Tksj = DateTime.Now, + F_tkpxid = ikjbs_tem.F_tkpxid, + F_LaborCost = ikjbs_tem.F_LaborCost, + F_tkpxNumber = ikjbs_tem.F_tkpxNumber, + F_CreateTime = DateTime.Now, + F_CreateUser = userInfo.userId, + F_DeleteMark = 0, + }); + } + } } - await _db.Insertable(lqHytkMxEntityList).ExecuteCommandAsync(); } - - //关闭事务 - _db.CommitTran(); - } - catch (Exception) - { - //回滚事务 - _db.RollbackTran(); - throw NCCException.Oh(ErrorCode.COM1000); - } - } - - /// - /// 获取会员退卡无分页列表 - /// - /// 请求参数 - /// - [NonAction] - public async Task GetNoPagingList([FromQuery] LqHytkHytkListQueryInput input) - { - var sidx = input.sidx == null ? "id" : input.sidx; - List queryTksj = input.tksj != null ? input.tksj.Split(',').ToObeject>() : null; - DateTime? startTksj = queryTksj != null ? Ext.GetDateTime(queryTksj.First()) : null; - DateTime? endTksj = queryTksj != null ? Ext.GetDateTime(queryTksj.Last()) : null; - var data = await _db.Queryable() - .WhereIF(!string.IsNullOrEmpty(input.id), p => p.Id.Contains(input.id)) - .WhereIF(!string.IsNullOrEmpty(input.md), p => p.Md.Equals(input.md)) - .WhereIF(!string.IsNullOrEmpty(input.mcbh), p => p.Mcbh.Contains(input.mcbh)) - .WhereIF(!string.IsNullOrEmpty(input.mdmc), p => p.Mdmc.Contains(input.mdmc)) - .WhereIF(!string.IsNullOrEmpty(input.hy), p => p.Hy.Equals(input.hy)) - .WhereIF(!string.IsNullOrEmpty(input.hyxm), p => p.Hyxm.Contains(input.hyxm)) - .WhereIF(!string.IsNullOrEmpty(input.hyzh), p => p.Hyzh.Contains(input.hyzh)) - .WhereIF(!string.IsNullOrEmpty(input.jks), p => p.Jks.Equals(input.jks)) - .WhereIF(!string.IsNullOrEmpty(input.jkszh), p => p.Jkszh.Contains(input.jkszh)) - .WhereIF(!string.IsNullOrEmpty(input.jksxm), p => p.Jksxm.Contains(input.jksxm)) - .WhereIF(!string.IsNullOrEmpty(input.bz), p => p.Bz.Contains(input.bz)) - .WhereIF(!string.IsNullOrEmpty(input.tkpx), p => p.Tkpx.Contains(input.tkpx)) - .WhereIF(queryTksj != null, p => p.Tksj >= new DateTime(startTksj.ToDate().Year, startTksj.ToDate().Month, startTksj.ToDate().Day, 0, 0, 0)) - .WhereIF(queryTksj != null, p => p.Tksj <= new DateTime(endTksj.ToDate().Year, endTksj.ToDate().Month, endTksj.ToDate().Day, 23, 59, 59)) - .WhereIF(!string.IsNullOrEmpty(input.tkr), p => p.Tkr.Equals(input.tkr)) - .Select(it=> new LqHytkHytkListOutput - { - id = it.Id, - md=it.Md, - mcbh=it.Mcbh, - mdmc=it.Mdmc, - hy=it.Hy, - hyxm=it.Hyxm, - hyzh=it.Hyzh, - jks=it.Jks, - jkszh=it.Jkszh, - jksxm=it.Jksxm, - bz=it.Bz, - tkpx=it.Tkpx, - tksj=it.Tksj, - tkr=it.Tkr, - }).MergeTable().OrderBy(sidx+" "+input.sort).ToListAsync(); - return data; - } - - /// - /// 导出会员退卡 - /// - /// 请求参数 - /// - [HttpGet("Actions/Export")] - public async Task Export([FromQuery] LqHytkHytkListQueryInput input) - { - var userInfo = await _userManager.GetUserInfo(); - var exportData = new List(); - if (input.dataType == 0) - { - var data = Clay.Object(await this.GetList(input)); - exportData = data.Solidify>().list; - } - else - { - exportData = await this.GetNoPagingList(input); - } - List 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(); - ExcelConfig excelconfig = new ExcelConfig(); - excelconfig.FileName = "会员退卡.xls"; - excelconfig.HeadFont = "微软雅黑"; - excelconfig.HeadPoint = 10; - excelconfig.IsAllSizeColumn = true; - excelconfig.ColumnModel = new List(); - List selectKeyList = input.selectKey.Split(',').ToList(); - foreach (var item in selectKeyList) - { - var isExist = paramList.Find(p => p.field == item); - if (isExist != null) + + // 批量插入品项明细 + if (allMxEntities.Any()) { - excelconfig.ColumnModel.Add(new ExcelColumnModel() { Column = isExist.field, ExcelColumn = isExist.value }); + await _db.Insertable(allMxEntities).ExecuteCommandAsync(); } - } - var addPath = FileVariable.TemporaryFilePath + excelconfig.FileName; - ExcelExportHelper.Export(exportData, excelconfig, addPath); - var fileName = _userManager.UserId + "|" + addPath + "|xls"; - var output = new - { - name = excelconfig.FileName, - url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fileName, "NCC") - }; - return output; - } - - /// - /// 批量删除会员退卡 - /// - /// 主键数组 - /// - [HttpPost("batchRemove")] - public async Task BatchRemove([FromBody] List ids) - { - var entitys = await _db.Queryable().In(it => it.Id, ids).ToListAsync(); - if (entitys.Count > 0) - { - try + + // 批量插入健康师业绩 + if (allJksyjEntities.Any()) { - //开启事务 - _db.BeginTran(); - //批量删除会员退卡 - await _db.Deleteable().In(d => d.Id,ids).ExecuteCommandAsync(); - - //清空子表数据 - await _db.Deleteable().In(u => u.Gltkbh,ids).ExecuteCommandAsync(); - //关闭事务 - _db.CommitTran(); + await _db.Insertable(allJksyjEntities).ExecuteCommandAsync(); } - catch (Exception) + + // 批量插入科技部老师业绩 + if (allKjbsyjEntities.Any()) { - //回滚事务 - _db.RollbackTran(); - throw NCCException.Oh(ErrorCode.COM1002); + await _db.Insertable(allKjbsyjEntities).ExecuteCommandAsync(); } + + // 关闭事务 + _db.CommitTran(); + } + catch (Exception ex) + { + _db.RollbackTran(); + throw NCCException.Oh(ErrorCode.COM1005, ex.Message); } } /// - /// 更新会员退卡 + /// 更新退卡信息及其关联的品项明细、健康师业绩、科技部老师业绩信息 /// - /// 主键 - /// 参数 - /// + /// + /// 更新退卡记录及其关联的品项明细、健康师业绩、科技部老师业绩信息 + /// 先删除原有的关联数据,再插入新的数据 + /// + /// 退卡ID + /// 退卡更新参数 + /// 无返回值 + /// 更新成功 + /// 参数错误或数据验证失败 + /// 服务器内部错误 [HttpPut("{id}")] public async Task Update(string id, [FromBody] LqHytkHytkUpInput input) { + var userInfo = await _userManager.GetUserInfo(); var entity = input.Adapt(); + entity.Id = id; + entity.F_ModifyTime = DateTime.Now; + entity.F_ModifyUser = userInfo.userId; + try { - //开启事务 + // 开启事务 _db.BeginTran(); - //更新会员退卡记录 - await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); - - //清空原有数据 - await _db.Deleteable().Where(u => u.Gltkbh == id).ExecuteCommandAsync(); - //新增新数据 - var lqHytkMxEntityList = input.lqHytkMxList.Adapt>(); - if(lqHytkMxEntityList != null) + // 更新退卡主表记录 + await _db.Updateable(entity).IgnoreColumns(true).ExecuteCommandAsync(); + + // 删除原有的关联数据 + await _db.Deleteable().Where(x => x.Gltkbh == id).ExecuteCommandAsync(); + await _db.Deleteable().Where(x => x.Gltkbh == id).ExecuteCommandAsync(); + await _db.Deleteable().Where(x => x.Gltkbh == id).ExecuteCommandAsync(); + + // 收集所有需要插入的实体,然后批量插入 + var allMxEntities = new List(); + var allJksyjEntities = new List(); + var allKjbsyjEntities = new List(); + + // 处理品项明细列表 + if (input.lqHytkMxList != null && input.lqHytkMxList.Any()) { - foreach (var item in lqHytkMxEntityList) + foreach (var item in input.lqHytkMxList) { - item.Id = YitIdHelper.NextId().ToString(); - item.Gltkbh = entity.Id; + // 创建品项明细实体 + var lqHytkMxEntity = new LqHytkMxEntity + { + Id = YitIdHelper.NextId().ToString(), + Gltkbh = id, + F_CreateTime = DateTime.Now, + F_CreateUser = userInfo.userId, + F_DeleteMark = 0, + Px = item.px, + Pxmc = item.pxmc, + Pxjg = item.pxjg, + Tkje = item.tkje, + F_ProjectNumber = item.F_ProjectNumber ?? 1, + F_IsEnabled = item.F_IsEnabled ?? 1, + F_SourceType = item.F_SourceType, + F_TotalPrice = item.F_TotalPrice ?? (item.pxjg * (item.F_ProjectNumber ?? 1)), + }; + allMxEntities.Add(lqHytkMxEntity); + + // 收集该品项关联的健康师业绩 + if (item.lqHytkJksyjList != null && item.lqHytkJksyjList.Any()) + { + foreach (var ijks_tem in item.lqHytkJksyjList) + { + allJksyjEntities.Add(new LqHytkJksyjEntity + { + Id = YitIdHelper.NextId().ToString(), + Gltkbh = id, + Jks = ijks_tem.jks, + Jksxm = ijks_tem.jksxm, + Jkszh = ijks_tem.jkszh, + Jksyj = ijks_tem.jksyj, + Tksj = DateTime.Now, + F_jsjid = ijks_tem.F_jsjid, + F_tkpxid = ijks_tem.F_tkpxid, + F_LaborCost = ijks_tem.F_LaborCost, + F_tkpxNumber = ijks_tem.F_tkpxNumber, + F_CreateTime = DateTime.Now, + F_CreateUser = userInfo.userId, + F_DeleteMark = 0, + }); + } + } + + // 收集该品项关联的科技部老师业绩 + if (item.lqHytkKjbsyjList != null && item.lqHytkKjbsyjList.Any()) + { + foreach (var ikjbs_tem in item.lqHytkKjbsyjList) + { + allKjbsyjEntities.Add(new LqHytkKjbsyjEntity + { + Id = YitIdHelper.NextId().ToString(), + Gltkbh = id, + Kjbls = ikjbs_tem.kjbls, + Kjblsxm = ikjbs_tem.kjblsxm, + Kjblszh = ikjbs_tem.kjblszh, + Kjblsyj = ikjbs_tem.kjblsyj, + Tksj = DateTime.Now, + F_tkpxid = ikjbs_tem.F_tkpxid, + F_LaborCost = ikjbs_tem.F_LaborCost, + F_tkpxNumber = ikjbs_tem.F_tkpxNumber, + F_CreateTime = DateTime.Now, + F_CreateUser = userInfo.userId, + F_DeleteMark = 0, + }); + } + } } - await _db.Insertable(lqHytkMxEntityList).ExecuteCommandAsync(); } - //关闭事务 + // 批量插入品项明细 + if (allMxEntities.Any()) + { + await _db.Insertable(allMxEntities).ExecuteCommandAsync(); + } + + // 批量插入健康师业绩 + if (allJksyjEntities.Any()) + { + await _db.Insertable(allJksyjEntities).ExecuteCommandAsync(); + } + + // 批量插入科技部老师业绩 + if (allKjbsyjEntities.Any()) + { + await _db.Insertable(allKjbsyjEntities).ExecuteCommandAsync(); + } + + // 关闭事务 _db.CommitTran(); } - catch (Exception) + catch (Exception ex) { - //回滚事务 _db.RollbackTran(); - throw NCCException.Oh(ErrorCode.COM1001); + throw NCCException.Oh(ErrorCode.COM1005, ex.Message); } } /// - /// 删除会员退卡 + /// 删除退卡信息 /// + /// 主键 /// [HttpDelete("{id}")] public async Task Delete(string id) { var entity = await _db.Queryable().FirstAsync(p => p.Id == id); - _ = entity ?? throw NCCException.Oh(ErrorCode.COM1005); + if (entity != null) + { + entity.F_DeleteMark = 1; + await _lqHytkHytkRepository.UpdateAsync(entity); + } + } + + /// + /// 获取退卡信息详情 + /// + /// + /// 获取退卡记录及其关联的品项明细、健康师业绩、科技部老师业绩信息 + /// 按照退卡的完整格式返回数据,不包含汇总信息 + /// + /// 返回数据结构: + /// - 主表信息:退卡基础信息、门店信息、会员信息、退卡金额等 + /// - 品项明细列表:每个品项包含完整的项目信息(项目次数、是否有效、来源类型等) + /// - 健康师业绩列表:按品项关联的健康师业绩信息 + /// - 科技部老师业绩列表:按品项关联的科技部老师业绩信息 + /// + /// 退卡记录主键ID + /// 退卡记录完整信息 + /// 查询成功 + /// 退卡记录不存在 + /// 服务器内部错误 + [HttpGet("{id}")] + public async Task GetInfo(string id) + { try { - //开启事务 - _db.BeginTran(); - - //删除会员退卡记录 - await _db.Deleteable().Where(d => d.Id == id).ExecuteCommandAsync(); + // 1. 查询主表信息 + var entity = await _db.Queryable().FirstAsync(p => p.Id == id); + if (entity == null) + { + throw NCCException.Oh(ErrorCode.COM1005, "退卡记录不存在"); + } - //清空子表数据 - await _db.Deleteable().Where(u => u.Gltkbh == id).ExecuteCommandAsync(); - - //关闭事务 - _db.CommitTran(); + var output = entity.Adapt(); + + // 2. 查询品项明细列表 + var lqHytkMxList = await _db.Queryable() + .Where(w => w.Gltkbh == entity.Id) + .ToListAsync(); + + // 3. 查询健康师业绩列表 + var lqHytkJksyjList = await _db.Queryable() + .Where(w => w.Gltkbh == entity.Id) + .ToListAsync(); + + // 4. 查询科技部老师业绩列表 + var lqHytkKjbsyjList = await _db.Queryable() + .Where(w => w.Gltkbh == entity.Id) + .ToListAsync(); + + // 5. 构建品项明细输出,每个品项关联对应的业绩信息 + var mxOutputList = new List(); + foreach (var mx in lqHytkMxList) + { + var mxOutput = new LqHytkMxInfoOutput + { + id = mx.Id, + gltkbh = mx.Gltkbh, + px = mx.Px, + pxmc = mx.Pxmc, + pxjg = mx.Pxjg, + tkje = mx.Tkje, + F_ProjectNumber = mx.F_ProjectNumber, + F_IsEnabled = mx.F_IsEnabled, + F_SourceType = mx.F_SourceType, + F_TotalPrice = mx.F_TotalPrice + }; + + // 关联该品项的健康师业绩 + var jksyjForMx = lqHytkJksyjList.Where(j => j.F_tkpxid == mx.Id).ToList(); + mxOutput.lqHytkJksyjList = jksyjForMx.Adapt>(); + + // 关联该品项的科技部老师业绩 + var kjbsyjForMx = lqHytkKjbsyjList.Where(k => k.F_tkpxid == mx.Id).ToList(); + mxOutput.lqHytkKjbsyjList = kjbsyjForMx.Adapt>(); + + mxOutputList.Add(mxOutput); + } + + // 6. 设置输出结果 + output.lqHytkMxList = mxOutputList; + + // 7. 设置全局业绩列表(用于兼容性,但主要使用品项关联的业绩) + output.lqHytkJksyjList = lqHytkJksyjList.Adapt>(); + output.lqHytkKjbsyjList = lqHytkKjbsyjList.Adapt>(); + + return output; } catch (Exception) { - //回滚事务 - _db.RollbackTran(); - throw NCCException.Oh(ErrorCode.COM1002); + throw NCCException.Oh(ErrorCode.COM1000, "获取退卡记录失败"); } } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs index cb462d0..7585b15 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs @@ -74,23 +74,94 @@ namespace NCC.Extend.LqKdKdjlb /// /// 获取开单记录表 /// - /// 参数 - /// + /// + /// 获取开单记录及其关联的品项明细、健康师业绩、科技部老师业绩信息 + /// 按照开单的完整格式返回数据,不包含汇总信息 + /// + /// 返回数据结构: + /// - 主表信息:开单基础信息、业绩信息、支付信息、会员信息等 + /// - 品项明细列表:每个品项包含完整的项目信息(项目次数、是否有效、来源类型等) + /// - 健康师业绩列表:按品项关联的健康师业绩信息 + /// - 科技部老师业绩列表:按品项关联的科技部老师业绩信息 + /// + /// 开单记录主键ID + /// 开单记录完整信息 + /// 查询成功 + /// 开单记录不存在 + /// 服务器内部错误 [HttpGet("{id}")] public async Task GetInfo(string id) { - var entity = await _db.Queryable().FirstAsync(p => p.Id == id); - var output = entity.Adapt(); + try + { + // 1. 查询主表信息 + var entity = await _db.Queryable().FirstAsync(p => p.Id == id); + if (entity == null) + { + throw NCCException.Oh(ErrorCode.COM1005, "开单记录不存在"); + } - var lqKdJksyjList = await _db.Queryable().Where(w => w.Glkdbh == entity.Id).ToListAsync(); - output.lqKdJksyjList = lqKdJksyjList.Adapt>(); + var output = entity.Adapt(); - var lqKdKjbsyjList = await _db.Queryable().Where(w => w.Glkdbh == entity.Id).ToListAsync(); - output.lqKdKjbsyjList = lqKdKjbsyjList.Adapt>(); + // 2. 查询品项明细列表 + var lqKdPxmxList = await _db.Queryable() + .Where(w => w.Glkdbh == entity.Id) + .ToListAsync(); - var lqKdPxmxList = await _db.Queryable().Where(w => w.Glkdbh == entity.Id).ToListAsync(); - output.lqKdPxmxList = lqKdPxmxList.Adapt>(); - return output; + // 3. 查询健康师业绩列表 + var lqKdJksyjList = await _db.Queryable() + .Where(w => w.Glkdbh == entity.Id) + .ToListAsync(); + + // 4. 查询科技部老师业绩列表 + var lqKdKjbsyjList = await _db.Queryable() + .Where(w => w.Glkdbh == entity.Id) + .ToListAsync(); + + // 5. 构建品项明细输出,每个品项关联对应的业绩信息 + var pxmxOutputList = new List(); + foreach (var pxmx in lqKdPxmxList) + { + var pxmxOutput = new LqKdPxmxInfoOutput + { + id = pxmx.Id, + glkdbh = pxmx.Glkdbh, + px = pxmx.Px, + pxmc = pxmx.Pxmc, + pxjg = pxmx.Pxjg, + projectNumber = pxmx.ProjectNumber, + isEnabled = pxmx.IsEnabled, + sourceType = pxmx.SourceType, + memberId = pxmx.MemberId, + createTime = pxmx.CreateTIme, + totalPrice = pxmx.TotalPrice + }; + + // 关联该品项的健康师业绩 + var jksyjForPx = lqKdJksyjList.Where(j => j.Kdpxid == pxmx.Id).ToList(); + pxmxOutput.lqKdJksyjList = jksyjForPx.Adapt>(); + + // 关联该品项的科技部老师业绩 + var kjbsyjForPx = lqKdKjbsyjList.Where(k => k.Kdpxid == pxmx.Id).ToList(); + pxmxOutput.lqKdKjbsyjList = kjbsyjForPx.Adapt>(); + + pxmxOutputList.Add(pxmxOutput); + } + + // 6. 设置输出结果 + output.lqKdPxmxList = pxmxOutputList; + + // 7. 设置全局业绩列表(用于兼容性,但主要使用品项关联的业绩) + output.lqKdJksyjList = lqKdJksyjList.Adapt>(); + output.lqKdKjbsyjList = lqKdKjbsyjList.Adapt>(); + + return output; + } + catch (Exception ex) + { + Console.WriteLine($"获取开单记录失败: {ex.Message}"); + throw NCCException.Oh(ErrorCode.COM1000, "获取开单记录失败"); + } } #endregion diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs index b9d4663..7fea7dd 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs @@ -19,6 +19,8 @@ using NCC.Extend.Entitys.lq_kd_kdjlb; using NCC.Extend.Entitys.lq_kd_pxmx; using NCC.Extend.Entitys.lq_xh_hyhk; using NCC.Extend.Entitys.lq_xh_pxmx; +using NCC.Extend.Entitys.lq_hytk_hytk; +using NCC.Extend.Entitys.lq_hytk_mx; using Yitter.IdGenerator; using NCC.Common.Helper; using NCC.JsonSerialization; @@ -459,6 +461,7 @@ namespace NCC.Extend.LqKhxx /// /// 根据会员ID查询该会员的剩余品项信息,包括已购买但未消费完的品项详情 /// 支持按来源类型(F_SourceType)区分相同品项的不同来源,确保数据准确分组 + /// 计算逻辑:剩余数量 = 购买数量 - 消费数量 - 退卡数量 /// /// 示例请求: /// ```json @@ -478,12 +481,14 @@ namespace NCC.Extend.LqKhxx /// - SourceType: 来源类型(用于区分相同品项的不同来源) /// - TotalPurchased: 总购买数量 /// - ConsumedCount: 已消费数量 + /// - RefundedCount: 已退卡数量 /// - RemainingCount: 剩余数量 /// /// 特殊说明: /// - 相同品项但不同SourceType的记录会分开显示 - /// - 耗卡统计会按品项ID和SourceType精确匹配 + /// - 耗卡和退卡统计会按品项ID和SourceType精确匹配 /// - 确保数据按SourceType正确分组且不重叠 + /// - 退卡记录会减少剩余品项数量 /// /// 会员ID /// 会员剩余品项信息 @@ -581,7 +586,36 @@ namespace NCC.Extend.LqKhxx _logger.LogInformation("耗卡品项统计查询成功,数量:{Count}", consumedItems.Count); } - // 6. 合并计算剩余品项(按品项ID和来源类型匹配) + // 6. 查询退卡记录ID列表 + _logger.LogInformation("开始查询退卡记录ID列表"); + var refundIds = await _db.Queryable() + .Where(tk => tk.Hy == memberId && tk.F_DeleteMark != 1) + .Select(tk => tk.Id) + .ToListAsync(); + + _logger.LogInformation("退卡记录ID列表查询成功,数量:{Count}", refundIds.Count); + + // 7. 查询退卡品项统计(按品项ID和来源类型分组) + _logger.LogInformation("开始查询退卡品项统计"); + var refundedItems = new List(); + if (refundIds.Any()) + { + var tempRefundedItems = await _db.Queryable() + .Where(px => refundIds.Contains(px.Gltkbh) && px.F_DeleteMark != 1) + .GroupBy(px => new { px.Px, px.F_SourceType }) + .Select(px => new + { + ItemId = px.Px, + SourceType = SqlFunc.IsNull(px.F_SourceType, "未知"), + RefundedCount = SqlFunc.AggregateSum(SqlFunc.ToDecimal(px.F_ProjectNumber)) + }) + .ToListAsync(); + + refundedItems = tempRefundedItems.Cast().ToList(); + _logger.LogInformation("退卡品项统计查询成功,数量:{Count}", refundedItems.Count); + } + + // 8. 合并计算剩余品项(按品项ID和来源类型匹配) _logger.LogInformation("开始合并计算剩余品项"); var remainingItems = new List(); @@ -593,7 +627,15 @@ namespace NCC.Extend.LqKhxx x.ItemId == purchased.ItemId && x.SourceType == purchased.SourceType); var consumedCount = consumed?.ConsumedCount ?? 0; - var remainingCount = purchased.TotalPurchased - consumedCount; + + // 按品项ID和来源类型匹配退卡记录 + var refunded = refundedItems.FirstOrDefault(x => + x.ItemId == purchased.ItemId && + x.SourceType == purchased.SourceType); + var refundedCount = refunded?.RefundedCount ?? 0; + + // 计算剩余数量:购买数量 - 消费数量 - 退卡数量 + var remainingCount = purchased.TotalPurchased - consumedCount - refundedCount; if (remainingCount > 0) { @@ -605,6 +647,7 @@ namespace NCC.Extend.LqKhxx SourceType = purchased.SourceType?.ToString() ?? "未知", TotalPurchased = purchased.TotalPurchased, ConsumedCount = consumedCount, + RefundedCount = refundedCount, RemainingCount = remainingCount }); } diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqMdxxService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqMdxxService.cs index ef5118c..4fd2334 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqMdxxService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqMdxxService.cs @@ -325,5 +325,6 @@ namespace NCC.Extend.LqMdxx .ToListAsync(); return new { list = list }; } + } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqStatisticsService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqStatisticsService.cs index 83803bd..02eb417 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqStatisticsService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqStatisticsService.cs @@ -14,6 +14,9 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using NCC.Extend.Entitys.lq_mdxx; +using NCC.Extend.Entitys.Dto.LqMdxx; +using NCC.System.Entitys.Permission; +using Microsoft.Extensions.Logging; namespace NCC.Extend.LqStatistics { @@ -27,29 +30,23 @@ namespace NCC.Extend.LqStatistics private readonly ISqlSugarRepository _lqMdxxRepository; private readonly SqlSugarScope _db; private readonly IUserManager _userManager; + private readonly ILogger _logger; /// /// 初始化一个类型的新实例 /// public LqStatisticsService( ISqlSugarRepository lqMdxxRepository, - IUserManager userManager) + IUserManager userManager, + ILogger logger) { _lqMdxxRepository = lqMdxxRepository; _db = _lqMdxxRepository.Context; _userManager = userManager; + _logger = logger; } - /// - /// 测试接口 - /// - /// 测试结果 - [HttpGet] - public async Task Test() - { - return await Task.FromResult(new { message = "绿纤统计服务运行正常", timestamp = DateTime.Now }); - } - + #region 获取门店业绩统计列表 /// /// 获取门店业绩统计列表 /// @@ -91,5 +88,131 @@ namespace NCC.Extend.LqStatistics throw NCCException.Oh(ErrorCode.COM1005, ex.Message); } } + #endregion + + #region 门店统计信息 + /// + /// 获取门店统计信息 + /// + /// + /// 统计各个门店在员工数量、项目数(耗卡里面的项目数量)和消耗业绩(耗卡里面的金额) + /// 可以传入日期,然后去统计本月一号到传入的日期 + /// + /// 示例请求: + /// ```json + /// { + /// "queryDate": "2025-09-14" + /// } + /// ``` + /// + /// 参数说明: + /// - queryDate: 查询日期,系统会自动计算本月1号到该日期的统计范围 + /// + /// 查询参数 + /// 门店统计结果 + /// 查询成功 + /// 参数错误 + /// 服务器内部错误 + [HttpPost("StoreStatistics")] + public async Task GetStoreStatistics([FromBody] StoreStatisticsInput input) + { + try + { + _logger.LogInformation("开始查询门店统计信息,查询日期:{QueryDate}", input.QueryDate); + + // 计算查询时间范围:本月1号到传入日期 + var startDate = new DateTime(input.QueryDate.Year, input.QueryDate.Month, 1); + var endDate = input.QueryDate.Date.AddDays(1).AddSeconds(-1); // 包含当天结束时间 + + _logger.LogInformation("统计时间范围:{StartDate} 到 {EndDate}", startDate, endDate); + + // 1. 查询门店基础信息 + var storeList = await _db.Queryable() + .Select(it => new StoreStatisticsInfo + { + StoreId = it.Id, + StoreCode = it.Mdbm, + StoreName = it.Dm, + City = it.Cs, + BusinessUnit = it.Syb, + EmployeeCount = 0, + ProjectCount = 0, + ConsumeAmount = 0 + }) + .ToListAsync(); + + _logger.LogInformation("查询到门店数量:{Count}", storeList.Count); + + // 2. 查询员工数量(按门店统计) + var employeeCounts = await _db.Queryable() + .Where(u => !string.IsNullOrEmpty(u.Mdid) && u.DeleteMark != 1) + .GroupBy(u => u.Mdid) + .Select(g => new { StoreId = g.Mdid, Count = SqlFunc.AggregateCount(g.Id) }) + .ToListAsync(); + + _logger.LogInformation("查询到员工统计数量:{Count}", employeeCounts.Count); + + // 3. 从视图查询项目数和消耗业绩 + var consumeStats = await _db.SqlQueryable(@" + SELECT + store_id, + SUM(total_project_count) as total_project_count, + SUM(total_consume_amount) as total_consume_amount + FROM v_store_daily_consume_stats + WHERE consume_date >= @startDate AND consume_date <= @endDate + GROUP BY store_id") + .AddParameters(new { startDate = startDate.ToString("yyyy-MM-dd"), endDate = input.QueryDate.ToString("yyyy-MM-dd") }) + .ToListAsync(); + + _logger.LogInformation("查询到消耗统计数量:{Count}", consumeStats.Count); + + // 4. 合并统计数据 + foreach (var store in storeList) + { + // 匹配员工数量 + var employeeCount = employeeCounts.FirstOrDefault(e => e.StoreId == store.StoreId); + if (employeeCount != null) + { + store.EmployeeCount = employeeCount.Count; + } + + // 匹配项目数和消耗业绩 + var consumeStat = consumeStats.FirstOrDefault(c => c.store_id?.ToString() == store.StoreId); + if (consumeStat != null) + { + store.ProjectCount = Convert.ToDecimal(consumeStat.total_project_count ?? 0); + store.ConsumeAmount = Convert.ToDecimal(consumeStat.total_consume_amount ?? 0); + } + } + + // 5. 计算汇总统计 + var summary = new StoreSummaryInfo + { + TotalStoreCount = storeList.Count, + TotalEmployeeCount = storeList.Sum(s => s.EmployeeCount), + TotalProjectCount = storeList.Sum(s => s.ProjectCount), + TotalConsumeAmount = storeList.Sum(s => s.ConsumeAmount) + }; + + var result = new StoreStatisticsOutput + { + StartDate = startDate, + EndDate = input.QueryDate, + StoreList = storeList.OrderByDescending(s => s.ConsumeAmount).ToList(), + Summary = summary + }; + + _logger.LogInformation("门店统计查询完成,门店数:{StoreCount},总员工数:{EmployeeCount},总项目数:{ProjectCount},总消耗业绩:{ConsumeAmount}", + summary.TotalStoreCount, summary.TotalEmployeeCount, summary.TotalProjectCount, summary.TotalConsumeAmount); + + return result; + } + catch (Exception ex) + { + _logger.LogError(ex, "查询门店统计信息时发生错误,查询日期:{QueryDate}", input.QueryDate); + throw NCCException.Oh(ErrorCode.COM1000, "查询门店统计信息失败"); + } + } + #endregion } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqXhHyhkService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqXhHyhkService.cs index 680a514..d26b412 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqXhHyhkService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqXhHyhkService.cs @@ -74,23 +74,95 @@ namespace NCC.Extend.LqXhHyhk /// /// 获取会员耗卡 /// - /// 参数 - /// + /// + /// 获取耗卡记录及其关联的品项明细、健康师业绩、科技部老师业绩信息 + /// 按照耗卡的完整格式返回数据,不包含汇总信息 + /// + /// 返回数据结构: + /// - 主表信息:耗卡基础信息、门店信息、会员信息等 + /// - 品项明细列表:每个品项包含完整的项目信息(项目次数、是否有效、来源类型等) + /// - 健康师业绩列表:按品项关联的健康师业绩信息 + /// - 科技部老师业绩列表:按品项关联的科技部老师业绩信息 + /// + /// 耗卡记录主键ID + /// 耗卡记录完整信息 + /// 查询成功 + /// 耗卡记录不存在 + /// 服务器内部错误 [HttpGet("{id}")] public async Task GetInfo(string id) { - var entity = await _db.Queryable().FirstAsync(p => p.Id == id); - var output = entity.Adapt(); + try + { + // 1. 查询主表信息 + var entity = await _db.Queryable().FirstAsync(p => p.Id == id); + if (entity == null) + { + throw NCCException.Oh(ErrorCode.COM1005, "耗卡记录不存在"); + } - var lqXhJksyjList = await _db.Queryable().Where(w => w.Glkdbh == entity.Id).ToListAsync(); - output.lqXhJksyjList = lqXhJksyjList.Adapt>(); + var output = entity.Adapt(); - var lqXhKjbsyjList = await _db.Queryable().Where(w => w.Glkdbh == entity.Id).ToListAsync(); - output.lqXhKjbsyjList = lqXhKjbsyjList.Adapt>(); + // 2. 查询品项明细列表 + var lqXhPxmxList = await _db.Queryable() + .Where(w => w.Glkdbh == entity.Id) + .ToListAsync(); - var lqXhPxmxList = await _db.Queryable().Where(w => w.Glkdbh == entity.Id).ToListAsync(); - output.lqXhPxmxList = lqXhPxmxList.Adapt>(); - return output; + // 3. 查询健康师业绩列表 + var lqXhJksyjList = await _db.Queryable() + .Where(w => w.Glkdbh == entity.Id) + .ToListAsync(); + + // 4. 查询科技部老师业绩列表 + var lqXhKjbsyjList = await _db.Queryable() + .Where(w => w.Glkdbh == entity.Id) + .ToListAsync(); + + // 5. 构建品项明细输出,每个品项关联对应的业绩信息 + var pxmxOutputList = new List(); + foreach (var pxmx in lqXhPxmxList) + { + var pxmxOutput = new LqXhPxmxInfoOutput + { + id = pxmx.Id, + glkdbh = pxmx.Glkdbh, + px = pxmx.Px, + pxmc = pxmx.Pxmc, + pxjg = pxmx.Pxjg, + xfzs = pxmx.Xfzs, + memberId = pxmx.MemberId, + createTime = pxmx.CreateTIme, + projectNumber = pxmx.ProjectNumber, + isEnabled = pxmx.IsEnabled, + sourceType = pxmx.SourceType, + totalPrice = pxmx.TotalPrice + }; + + // 关联该品项的健康师业绩 + var jksyjForPx = lqXhJksyjList.Where(j => j.Kdpxid == pxmx.Id).ToList(); + pxmxOutput.lqXhJksyjList = jksyjForPx.Adapt>(); + + // 关联该品项的科技部老师业绩 + var kjbsyjForPx = lqXhKjbsyjList.Where(k => k.Hkpxid == pxmx.Id).ToList(); + pxmxOutput.lqXhKjbsyjList = kjbsyjForPx.Adapt>(); + + pxmxOutputList.Add(pxmxOutput); + } + + // 6. 设置输出结果 + output.lqXhPxmxList = pxmxOutputList; + + // 7. 设置全局业绩列表(用于兼容性,但主要使用品项关联的业绩) + output.lqXhJksyjList = lqXhJksyjList.Adapt>(); + output.lqXhKjbsyjList = lqXhKjbsyjList.Adapt>(); + + return output; + } + catch (Exception ex) + { + _logger.LogError(ex, "获取耗卡记录失败,ID:{Id}", id); + throw NCCException.Oh(ErrorCode.COM1000, "获取耗卡记录失败"); + } } #endregion diff --git a/创建退卡相关表.sql b/创建退卡相关表.sql new file mode 100644 index 0000000..43bf951 --- /dev/null +++ b/创建退卡相关表.sql @@ -0,0 +1,130 @@ +-- ============================================= +-- 绿纤美业ERP系统 - 退卡相关表创建脚本 +-- 创建时间: 2025-01-27 +-- 说明: 创建会员退卡主表、明细表、业绩表 +-- ============================================= + +-- 1. 创建会员退卡主表 +DROP TABLE IF EXISTS `lq_hytk_hytk`; +CREATE TABLE `lq_hytk_hytk` ( + `F_Id` varchar(50) NOT NULL COMMENT '退卡编号', + `md` varchar(50) DEFAULT NULL COMMENT '门店', + `mdbh` varchar(50) DEFAULT NULL COMMENT '门店编号', + `mdmc` varchar(50) DEFAULT NULL COMMENT '门店名称', + `hy` varchar(50) DEFAULT NULL COMMENT '会员', + `hyzh` varchar(50) DEFAULT NULL COMMENT '会员账号', + `hymc` varchar(50) DEFAULT NULL COMMENT '会员名称', + `gklx` varchar(50) DEFAULT NULL COMMENT '顾客类型', + `tkje` decimal(15,2) DEFAULT NULL COMMENT '退卡总金额', + `sgfy` decimal(15,2) DEFAULT NULL COMMENT '手工费用', + `bz` text COMMENT '备注', + `tksj` datetime DEFAULT NULL COMMENT '退卡时间', + `czry` varchar(50) DEFAULT NULL COMMENT '操作人员', + `tkzt` varchar(20) DEFAULT NULL COMMENT '退卡状态', + `tkyy` varchar(200) DEFAULT NULL COMMENT '退卡原因', + `F_CreateTime` datetime DEFAULT NULL COMMENT '创建时间', + `F_CreateUser` varchar(50) DEFAULT NULL COMMENT '创建用户', + `F_ModifyTime` datetime DEFAULT NULL COMMENT '修改时间', + `F_ModifyUser` varchar(50) DEFAULT NULL COMMENT '修改用户', + `F_DeleteMark` int(1) DEFAULT NULL COMMENT '删除标记', + PRIMARY KEY (`F_Id`), + KEY `idx_md` (`md`), + KEY `idx_hy` (`hy`), + KEY `idx_tksj` (`tksj`), + KEY `idx_tkzt` (`tkzt`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='退卡_信息表'; + +-- 2. 创建会员退卡明细表 +DROP TABLE IF EXISTS `lq_hytk_mx`; +CREATE TABLE `lq_hytk_mx` ( + `F_Id` varchar(50) NOT NULL COMMENT '明细编号', + `gltkbh` varchar(50) DEFAULT NULL COMMENT '关联退卡编号', + `px` varchar(50) DEFAULT NULL COMMENT '品项', + `pxmc` varchar(100) DEFAULT NULL COMMENT '品项名称', + `pxjg` decimal(15,2) DEFAULT NULL COMMENT '品项价格', + `tkje` decimal(15,2) DEFAULT NULL COMMENT '退款金额', + `F_ProjectNumber` int DEFAULT NULL COMMENT '项目次数', + `F_IsEnabled` int(1) DEFAULT NULL COMMENT '是否有效', + `F_SourceType` varchar(20) DEFAULT NULL COMMENT '来源类型', + `F_TotalPrice` decimal(15,2) DEFAULT NULL COMMENT '合计金额', + `F_CreateTime` datetime DEFAULT NULL COMMENT '创建时间', + `F_CreateUser` varchar(50) DEFAULT NULL COMMENT '创建用户', + `F_ModifyTime` datetime DEFAULT NULL COMMENT '修改时间', + `F_ModifyUser` varchar(50) DEFAULT NULL COMMENT '修改用户', + `F_DeleteMark` int(1) DEFAULT NULL COMMENT '删除标记', + PRIMARY KEY (`F_Id`), + KEY `idx_gltkbh` (`gltkbh`), + KEY `idx_px` (`px`), + KEY `idx_F_SourceType` (`F_SourceType`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='退卡_品项明细表'; + +-- 3. 创建退卡健康师业绩表 +DROP TABLE IF EXISTS `lq_hytk_jksyj`; +CREATE TABLE `lq_hytk_jksyj` ( + `F_Id` varchar(50) NOT NULL COMMENT '业绩编号', + `gltkbh` varchar(50) DEFAULT NULL COMMENT '关联退卡编号', + `jks` varchar(50) DEFAULT NULL COMMENT '健康师', + `jksxm` varchar(50) DEFAULT NULL COMMENT '健康师姓名', + `jkszh` varchar(50) DEFAULT NULL COMMENT '健康师账号', + `jksyj` decimal(15,2) DEFAULT NULL COMMENT '健康师业绩', + `tksj` datetime DEFAULT NULL COMMENT '退卡时间', + `F_jsjid` varchar(50) DEFAULT NULL COMMENT '金三角id', + `F_tkpxid` varchar(50) DEFAULT NULL COMMENT '关联项目资料表ID', + `F_LaborCost` decimal(15,2) DEFAULT NULL COMMENT '手工费', + `F_tkpxNumber` decimal(15,2) DEFAULT NULL COMMENT '退卡品项次数', + `F_CreateTime` datetime DEFAULT NULL COMMENT '创建时间', + `F_CreateUser` varchar(50) DEFAULT NULL COMMENT '创建用户', + `F_ModifyTime` datetime DEFAULT NULL COMMENT '修改时间', + `F_ModifyUser` varchar(50) DEFAULT NULL COMMENT '修改用户', + `F_DeleteMark` int(1) DEFAULT NULL COMMENT '删除标记', + PRIMARY KEY (`F_Id`), + KEY `idx_gltkbh` (`gltkbh`), + KEY `idx_jks` (`jks`), + KEY `idx_F_tkpxid` (`F_tkpxid`), + KEY `idx_tksj` (`tksj`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='退卡_健康师业绩表'; + +-- 4. 创建退卡科技部老师业绩表 +DROP TABLE IF EXISTS `lq_hytk_kjbsyj`; +CREATE TABLE `lq_hytk_kjbsyj` ( + `F_Id` varchar(50) NOT NULL COMMENT '业绩编号', + `gltkbh` varchar(50) DEFAULT NULL COMMENT '关联退卡编号', + `kjbls` varchar(50) DEFAULT NULL COMMENT '科技部老师', + `kjblsxm` varchar(50) DEFAULT NULL COMMENT '科技部老师姓名', + `kjblszh` varchar(50) DEFAULT NULL COMMENT '科技部老师账号', + `kjblsyj` decimal(15,2) DEFAULT NULL COMMENT '科技部老师业绩', + `tksj` datetime DEFAULT NULL COMMENT '退卡时间', + `F_tkpxid` varchar(50) DEFAULT NULL COMMENT '关联项目资料表ID', + `F_LaborCost` decimal(15,2) DEFAULT NULL COMMENT '手工费', + `F_tkpxNumber` decimal(15,2) DEFAULT NULL COMMENT '退卡品项次数', + `F_CreateTime` datetime DEFAULT NULL COMMENT '创建时间', + `F_CreateUser` varchar(50) DEFAULT NULL COMMENT '创建用户', + `F_ModifyTime` datetime DEFAULT NULL COMMENT '修改时间', + `F_ModifyUser` varchar(50) DEFAULT NULL COMMENT '修改用户', + `F_DeleteMark` int(1) DEFAULT NULL COMMENT '删除标记', + PRIMARY KEY (`F_Id`), + KEY `idx_gltkbh` (`gltkbh`), + KEY `idx_kjbls` (`kjbls`), + KEY `idx_F_tkpxid` (`F_tkpxid`), + KEY `idx_tksj` (`tksj`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='退卡_科技部老师业绩表'; + +-- ============================================= +-- 添加外键约束(可选) +-- ============================================= + +-- 退卡明细表外键约束 +-- 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; + +-- 退卡健康师业绩表外键约束 +-- 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; +-- 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; + +-- 退卡科技部老师业绩表外键约束 +-- 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; +-- 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; + +-- ============================================= +-- 创建完成提示 +-- ============================================= +SELECT '退卡相关表创建完成!' AS '创建结果';