diff --git a/[已用]创建金三角统计视图.sql b/[已用]创建金三角统计视图.sql new file mode 100644 index 0000000..2a988d9 --- /dev/null +++ b/[已用]创建金三角统计视图.sql @@ -0,0 +1,63 @@ +-- 创建金三角统计视图 +-- 用于统计金三角的订单数量、业绩总额、首次和最后订单日期等信息 +-- 按月份和业绩总额降序排列 + +CREATE VIEW v_jsj_monthly_performance AS +SELECT + `jsj`.`F_Id` AS `jsj_id`, + `jsj`.`jsj` AS `jsj_name`, + `jsj`.`yf` AS `month`, + `jsj`.`md` AS `store_id`, + `md`.`dm` AS `store_name`, + count( DISTINCT `jksyj`.`glkdbh` ) AS `order_count`, + sum( + cast( `jksyj`.`jksyj` AS DECIMAL ( 18, 2 ) ) + ) AS `total_performance`, + max( `jksyj`.`yjsj` ) AS `last_order_date`, + min( `jksyj`.`yjsj` ) AS `first_order_date` +FROM + ( + ( + `lq_ycsd_jsj` `jsj` + LEFT JOIN `lq_kd_jksyj` `jksyj` ON ( + ( + ( `jsj`.`F_Id` = `jksyj`.`jsj_id` ) + AND ( + YEAR ( `jksyj`.`yjsj` ) = substr( `jsj`.`yf`, 1, 4 ) + ) + AND ( + MONTH ( `jksyj`.`yjsj` ) = substr( `jsj`.`yf`, 5, 2 ) + ) + ) + ) + ) + LEFT JOIN `lq_mdxx` `md` ON ( ( `jsj`.`md` = `md`.`F_Id` ) ) + ) +WHERE + ( + ( `jsj`.`yf` IS NOT NULL ) + AND ( `jksyj`.`yjsj` IS NOT NULL ) + AND ( `jksyj`.`jksyj` IS NOT NULL ) + AND ( `jksyj`.`jksyj` <> '' ) + AND ( `jksyj`.`jksyj` <> '0' ) + ) +GROUP BY + `jsj`.`F_Id`, + `jsj`.`jsj`, + `jsj`.`yf`, + `jsj`.`md`, + `md`.`dm` +ORDER BY + `jsj`.`yf` DESC, + `total_performance` DESC; + +-- 视图说明: +-- jsj_id: 金三角ID +-- jsj_name: 金三角名称 +-- month: 月份(格式:yyyyMM) +-- store_id: 门店ID +-- store_name: 门店名称 +-- order_count: 订单数量(去重) +-- total_performance: 总业绩(转换为DECIMAL类型) +-- last_order_date: 最后订单日期 +-- first_order_date: 首次订单日期 diff --git a/netcore/src/Application/NCC.API/Program.cs b/netcore/src/Application/NCC.API/Program.cs index 798dba6..a4d98f0 100644 --- a/netcore/src/Application/NCC.API/Program.cs +++ b/netcore/src/Application/NCC.API/Program.cs @@ -11,11 +11,10 @@ namespace NCC.API } public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder => - { - webBuilder.Inject() - .UseStartup() - .UseSerilogDefault(); - }); + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.Inject().UseStartup().UseSerilogDefault(); + }); } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/Common/EnumOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/Common/EnumOutput.cs new file mode 100644 index 0000000..375b2a5 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/Common/EnumOutput.cs @@ -0,0 +1,23 @@ +namespace NCC.Extend.Entitys.Dto.Common +{ + /// + /// 通用枚举输出 + /// + public class EnumOutput + { + /// + /// 枚举值 + /// + public int Value { get; set; } + + /// + /// 枚举名称 + /// + public string Name { get; set; } + + /// + /// 中文描述 + /// + public string Description { get; set; } + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventCrInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventCrInput.cs index ddddedc..9120030 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventCrInput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventCrInput.cs @@ -69,6 +69,15 @@ namespace NCC.Extend.Entitys.Dto.LqEvent public string EventNumber { get; set; } /// + /// 活动类型 + /// + /// + /// 活动类型,可选字段 + /// 最大长度:255个字符 + /// + public int EventType { get; set; } + + /// /// 拓客活动成员列表 /// /// diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventInfoOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventInfoOutput.cs index 649452d..894963b 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventInfoOutput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventInfoOutput.cs @@ -40,6 +40,11 @@ namespace NCC.Extend.Entitys.Dto.LqEvent public string eventNumber { get; set; } /// + /// 活动类型 + /// + public int eventType { get; set; } + + /// /// 拓客活动成员列表 /// public List Members { get; set; } = new List(); diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventListOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventListOutput.cs index 845b628..c924279 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventListOutput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventListOutput.cs @@ -41,5 +41,10 @@ namespace NCC.Extend.Entitys.Dto.LqEvent /// 成员数量 /// public int memberCount { get; set; } + + /// + /// 活动类型 + /// + public int eventType { get; set; } } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventUpInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventUpInput.cs index 9db7cf4..21d67b6 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventUpInput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventUpInput.cs @@ -14,7 +14,7 @@ namespace NCC.Extend.Entitys.Dto.LqEvent /// 主键ID /// [Required(ErrorMessage = "活动ID不能为空")] - public new int? Id { get; set; } + public new string Id { get; set; } /// /// 活动名称 diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventUserEventOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventUserEventOutput.cs index d9c5af5..3d41811 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventUserEventOutput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventUserEventOutput.cs @@ -66,5 +66,15 @@ namespace NCC.Extend.Entitys.Dto.LqEvent /// 创建用户 /// public string CreationUser { get; set; } + + /// + /// 门店ID + /// + public string StoreId { get; set; } + + /// + /// 门店名称 + /// + public string StoreName { get; set; } } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/StoreTeamDataOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/StoreTeamDataOutput.cs new file mode 100644 index 0000000..6052ff2 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/StoreTeamDataOutput.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; + +namespace NCC.Extend.Entitys.Dto.LqEvent +{ + /// + /// 门店战队数据输出 + /// + public class StoreTeamDataOutput + { + /// + /// 门店ID + /// + public string StoreId { get; set; } + + /// + /// 门店名称 + /// + public string StoreName { get; set; } + + /// + /// 战队列表 + /// + public List TeamList { get; set; } = new List(); + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/TeamInfoOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/TeamInfoOutput.cs new file mode 100644 index 0000000..8d9f78c --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/TeamInfoOutput.cs @@ -0,0 +1,20 @@ +using System.Collections.Generic; + +namespace NCC.Extend.Entitys.Dto.LqEvent +{ + /// + /// 战队信息输出 + /// + public class TeamInfoOutput + { + /// + /// 战队名称 + /// + public string TeamName { get; set; } + + /// + /// 战队用户信息列表 + /// + public List TeamUserInfo { get; set; } = new List(); + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/TeamUserInfoOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/TeamUserInfoOutput.cs new file mode 100644 index 0000000..98ab6bb --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/TeamUserInfoOutput.cs @@ -0,0 +1,30 @@ +using System; + +namespace NCC.Extend.Entitys.Dto.LqEvent +{ + /// + /// 战队用户信息输出 + /// + public class TeamUserInfoOutput + { + /// + /// 拓客用户ID + /// + public string ExpansionUserId { get; set; } + + /// + /// 拓客用户姓名 + /// + public string ExpansionUserName { get; set; } + + /// + /// 拓客数量 + /// + public int ExpansionCount { get; set; } + + /// + /// 活动目标 + /// + public int EventTarget { get; set; } + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEventUser/LqEventUserCrInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEventUser/LqEventUserCrInput.cs index 373e018..8d6c268 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEventUser/LqEventUserCrInput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEventUser/LqEventUserCrInput.cs @@ -38,5 +38,10 @@ namespace NCC.Extend.Entitys.Dto.LqEventUser /// 门店id /// public string StoreId { get; set; } + + /// + /// 目标张数 + /// + public int TargetCount { get; set; } = 0; } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEventUser/LqEventUserInfoOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEventUser/LqEventUserInfoOutput.cs index 1bb2e35..a1f4123 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEventUser/LqEventUserInfoOutput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEventUser/LqEventUserInfoOutput.cs @@ -41,5 +41,15 @@ namespace NCC.Extend.Entitys.Dto.LqEventUser /// 创建用户 /// public string creationUser { get; set; } + + /// + /// 目标数量 + /// + public int targetCount { get; set; } + + /// + /// 门店ID + /// + public string storeId { get; set; } } } 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 ddc69d9..5765211 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 @@ -95,15 +95,5 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk /// 退卡品项明细列表 /// 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/LqHytkMx/LqHytkMxCrInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkMx/LqHytkMxCrInput.cs index 7f73fc3..e7c406d 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 @@ -16,9 +16,14 @@ namespace NCC.Extend.Entitys.Dto.LqHytkMx public string id { get; set; } /// - /// 关联退卡编号 + /// 关联退卡Id /// - public string gltkbh { get; set; } + public string refundInfoId { get; set; } + + /// + /// 退卡记录Id + /// + public string billingItemId { 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 c462028..c4628e7 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 @@ -16,9 +16,14 @@ namespace NCC.Extend.Entitys.Dto.LqHytkMx public string id { get; set; } /// - /// 关联退卡编号 + /// 关联退卡Id /// - public string gltkbh { get; set; } + public string refundInfoId { get; set; } + + /// + /// 退卡记录Id + /// + public string billingItemId { get; set; } /// /// 品项编号 @@ -43,22 +48,22 @@ namespace NCC.Extend.Entitys.Dto.LqHytkMx /// /// 项目次数 /// - public int? F_ProjectNumber { get; set; } + public int projectNumber { get; set; } /// /// 是否有效 /// - public int? F_IsEnabled { get; set; } + public int isEnabled { get; set; } /// /// 来源类型(开卡/赠送/其他) /// - public string F_SourceType { get; set; } + public string sourceType { get; set; } /// /// 合计金额(品项价格 × 项目次数) /// - public decimal? F_TotalPrice { get; set; } + public decimal? totalPrice { get; set; } /// /// 健康师业绩列表 diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdDeductinfo/LqKdDeductinfoCrInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdDeductinfo/LqKdDeductinfoCrInput.cs new file mode 100644 index 0000000..1c76346 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdDeductinfo/LqKdDeductinfoCrInput.cs @@ -0,0 +1,36 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace NCC.Extend.Entitys.Dto.LqKdDeductinfo +{ + /// + /// 开单扣减信息创建输入 + /// + public class LqKdDeductinfoCrInput + { + /// + /// 扣减类型 + /// + [Required(ErrorMessage = "扣减类型不能为空")] + public int? DeductType { get; set; } + + /// + /// 扣减关联ID + /// + [Required(ErrorMessage = "扣减关联ID不能为空")] + public string DeductId { get; set; } + + /// + /// 开单id + /// + [Required(ErrorMessage = "开单id不能为空")] + public string BillingId { get; set; } + + /// + /// 合计金额 + /// + [Required(ErrorMessage = "合计金额不能为空")] + [Range(0.01, 999999.99, ErrorMessage = "合计金额必须在0.01到999999.99之间")] + public decimal? Amount { get; set; } + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdDeductinfo/LqKdDeductinfoInfoOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdDeductinfo/LqKdDeductinfoInfoOutput.cs new file mode 100644 index 0000000..29ef734 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdDeductinfo/LqKdDeductinfoInfoOutput.cs @@ -0,0 +1,40 @@ +using System; + +namespace NCC.Extend.Entitys.Dto.LqKdDeductinfo +{ + /// + /// 开单扣减信息详情输出 + /// + public class LqKdDeductinfoInfoOutput + { + /// + /// 主键 + /// + public string Id { get; set; } + + /// + /// 扣减类型 + /// + public int? DeductType { get; set; } + + /// + /// 扣减类型名称 + /// + public string DeductTypeName { get; set; } + + /// + /// 扣减关联ID + /// + public string DeductId { get; set; } + + /// + /// 开单id + /// + public string BillingId { get; set; } + + /// + /// 合计金额 + /// + public decimal? Amount { get; set; } + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdDeductinfo/LqKdDeductinfoListOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdDeductinfo/LqKdDeductinfoListOutput.cs new file mode 100644 index 0000000..fcd8bcf --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdDeductinfo/LqKdDeductinfoListOutput.cs @@ -0,0 +1,40 @@ +using System; + +namespace NCC.Extend.Entitys.Dto.LqKdDeductinfo +{ + /// + /// 开单扣减信息列表输出 + /// + public class LqKdDeductinfoListOutput + { + /// + /// 主键 + /// + public string Id { get; set; } + + /// + /// 扣减类型 + /// + public int? DeductType { get; set; } + + /// + /// 扣减类型名称 + /// + public string DeductTypeName { get; set; } + + /// + /// 扣减关联ID + /// + public string DeductId { get; set; } + + /// + /// 开单id + /// + public string BillingId { get; set; } + + /// + /// 合计金额 + /// + public decimal? Amount { get; set; } + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdDeductinfo/LqKdDeductinfoListQueryInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdDeductinfo/LqKdDeductinfoListQueryInput.cs new file mode 100644 index 0000000..6565663 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdDeductinfo/LqKdDeductinfoListQueryInput.cs @@ -0,0 +1,35 @@ +using System; + +namespace NCC.Extend.Entitys.Dto.LqKdDeductinfo +{ + /// + /// 开单扣减信息列表查询输入 + /// + public class LqKdDeductinfoListQueryInput + { + /// + /// 扣减类型 + /// + public int? DeductType { get; set; } + + /// + /// 扣减关联ID + /// + public string DeductId { get; set; } + + /// + /// 开单id + /// + public string BillingId { get; set; } + + /// + /// 最小金额 + /// + public decimal? MinAmount { get; set; } + + /// + /// 最大金额 + /// + public decimal? MaxAmount { get; set; } + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdDeductinfo/LqKdDeductinfoUpInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdDeductinfo/LqKdDeductinfoUpInput.cs new file mode 100644 index 0000000..e309233 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdDeductinfo/LqKdDeductinfoUpInput.cs @@ -0,0 +1,17 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace NCC.Extend.Entitys.Dto.LqKdDeductinfo +{ + /// + /// 开单扣减信息更新输入 + /// + public class LqKdDeductinfoUpInput : LqKdDeductinfoCrInput + { + /// + /// 主键 + /// + [Required(ErrorMessage = "主键不能为空")] + public string Id { get; set; } + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbCrInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbCrInput.cs index 18162ef..481ba5d 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbCrInput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbCrInput.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using NCC.Common.Model; +using NCC.Extend.Entitys.Dto.LqKdDeductinfo; namespace NCC.Extend.Entitys.Dto.LqKdKdjlb { @@ -150,6 +151,11 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb public string F_FIleUrl { get; set; } /// + /// 扣款信息 + /// + public List lqKdKdjlbDeductList { get; set; } + + /// /// 开单_品项明细 /// public List lqKdPxmxList { get; set; } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdPxmx/LqKdPxmxCrInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdPxmx/LqKdPxmxCrInput.cs index e34c224..8cf281d 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdPxmx/LqKdPxmxCrInput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdPxmx/LqKdPxmxCrInput.cs @@ -51,7 +51,7 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb /// /// 项目次数 /// - public int? projectNumber { get; set; } + public decimal projectNumber { 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 7e580d0..a044f1d 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 @@ -36,7 +36,7 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb /// /// 项目次数 /// - public int? projectNumber { get; set; } + public decimal projectNumber { get; set; } /// /// 是否有效 diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbCrInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbCrInput.cs index cbbfd13..3c4515a 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbCrInput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbCrInput.cs @@ -16,42 +16,42 @@ namespace NCC.Extend.Entitys.Dto.LqTkjlb /// /// 拓客时间 /// - public DateTime? tksj { get; set; } + public DateTime expansionTime { get; set; } + + /// + /// 拓客人员 + /// + public string expansionUserId { get; set; } /// /// 顾客姓名 /// - public string gkxm { get; set; } + public string customerName { get; set; } /// - /// 电话号码 + /// 顾客电话号码 /// - public string dhhm { get; set; } + public string customerPhone { get; set; } /// /// 购买张数 /// - public int? gmzs { get; set; } + public int buyNumber { get; set; } /// /// 支付方式 /// - public string zffs { get; set; } + public string paymentMethod { get; set; } /// /// 是否加微信 /// - public string sfjwx { get; set; } + public string isAddWeChat { get; set; } /// /// 备注 /// - public string bz { get; set; } - - /// - /// 拓客人员 - /// - public string tkry { get; set; } + public string remarks { get; set; } /// /// 拓客活动id diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbInfoOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbInfoOutput.cs index 56b3264..0ec4db3 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbInfoOutput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbInfoOutput.cs @@ -12,56 +12,70 @@ namespace NCC.Extend.Entitys.Dto.LqTkjlb /// 拓客编号 /// public string id { get; set; } - + /// /// 拓客时间 /// - public DateTime? tksj { get; set; } - + public DateTime expansionTime { get; set; } + + /// + /// 拓客人员 + /// + public string expansionUserId { get; set; } + /// /// 拓客人员 /// - public string tkry { get; set; } - + public string expansionUserName { get; set; } + /// /// 顾客姓名 /// - public string gkxm { get; set; } - + public string customerName { get; set; } + /// - /// 电话号码 + /// 顾客电话号码 /// - public string dhhm { get; set; } - + public string customerPhone { get; set; } + /// /// 购买张数 /// - public int? gmzs { get; set; } - + public int buyNumber { get; set; } + /// /// 支付方式 /// - public string zffs { get; set; } - + public string paymentMethod { get; set; } + /// /// 是否加微信 /// - public string sfjwx { get; set; } - + public string isAddWeChat { get; set; } + /// /// 备注 /// - public string bz { get; set; } - + public string remarks { get; set; } + /// - /// 所属门店 + /// 所属门店ID /// - public string ssmd { get; set; } - + public string storeId { get; set; } + /// /// 所属战队 /// - public string sszd { get; set; } - + public string teamName { get; set; } + + /// + /// 拓客活动id + /// + public string eventId { get; set; } + + /// + /// 拓客活动名称 + /// + public string eventName { get; set; } } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbListOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbListOutput.cs index fd63c70..a70ae5a 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbListOutput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbListOutput.cs @@ -11,56 +11,70 @@ namespace NCC.Extend.Entitys.Dto.LqTkjlb /// 拓客编号 /// public string id { get; set; } - + /// /// 拓客时间 /// - public DateTime? tksj { get; set; } - + public DateTime expansionTime { get; set; } + + /// + /// 拓客人员 + /// + public string expansionUserId { get; set; } + /// /// 拓客人员 /// - public string tkry { get; set; } - + public string expansionUserName { get; set; } + /// /// 顾客姓名 /// - public string gkxm { get; set; } - + public string customerName { get; set; } + /// - /// 电话号码 + /// 顾客电话号码 /// - public string dhhm { get; set; } - + public string customerPhone { get; set; } + /// /// 购买张数 /// - public int? gmzs { get; set; } - + public int buyNumber { get; set; } + /// /// 支付方式 /// - public string zffs { get; set; } - + public string paymentMethod { get; set; } + /// /// 是否加微信 /// - public string sfjwx { get; set; } - + public string isAddWeChat { get; set; } + /// /// 备注 /// - public string bz { get; set; } - + public string remarks { get; set; } + /// - /// 所属门店 + /// 所属门店ID /// - public string ssmd { get; set; } - + public string storeId { get; set; } + /// /// 所属战队 /// - public string sszd { get; set; } - + public string teamName { get; set; } + + /// + /// 拓客活动id + /// + public string eventId { get; set; } + + /// + /// 拓客活动名称 + /// + public string eventName { get; set; } } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbListQueryInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbListQueryInput.cs index 910eda6..a38de1b 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbListQueryInput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbListQueryInput.cs @@ -1,5 +1,5 @@ -using NCC.Common.Filter; -using System.Collections.Generic; +using System.Collections.Generic; +using NCC.Common.Filter; namespace NCC.Extend.Entitys.Dto.LqTkjlb { @@ -14,65 +14,68 @@ namespace NCC.Extend.Entitys.Dto.LqTkjlb public string selectKey { get; set; } /// - /// + /// /// public int dataType { get; set; } - /// /// 拓客编号 /// public string id { get; set; } - + /// /// 拓客时间 /// - public string tksj { get; set; } - + public string expansionTime { get; set; } + /// /// 拓客人员 /// - public string tkry { get; set; } - + public string expansionUserId { get; set; } + /// /// 顾客姓名 /// - public string gkxm { get; set; } - + public string customerName { get; set; } + /// - /// 电话号码 + /// 顾客电话号码 /// - public string dhhm { get; set; } - + public string customerPhone { get; set; } + /// /// 购买张数 /// - public string gmzs { get; set; } - + public string buyNumber { get; set; } + /// /// 支付方式 /// - public string zffs { get; set; } - + public string paymentMethod { get; set; } + /// /// 是否加微信 /// - public string sfjwx { get; set; } - + public string isAddWeChat { get; set; } + /// /// 备注 /// - public string bz { get; set; } - + public string remarks { get; set; } + /// - /// 所属门店 + /// 拓客活动id /// - public string ssmd { get; set; } - + public string eventId { get; set; } + + /// + /// 所属门店ID + /// + public string storeId { get; set; } + /// /// 所属战队 /// - public string sszd { get; set; } - + public string teamName { get; set; } } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbRankingOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbRankingOutput.cs index 5672845..f8ee7cc 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbRankingOutput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbRankingOutput.cs @@ -10,13 +10,13 @@ namespace NCC.Extend.Entitys.Dto.LqTkjlb /// /// 所属战队 /// - public string sszd { get; set; } - + public string teamName { get; set; } + /// /// 拓客人数 /// - public int tkrs { get; set; } - + public int expansionUserCount { get; set; } + /// /// 排名 /// diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhHyhk/LqXhHyhkCrInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhHyhk/LqXhHyhkCrInput.cs index 32fe5e6..e3c80f8 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhHyhk/LqXhHyhkCrInput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhHyhk/LqXhHyhkCrInput.cs @@ -13,71 +13,70 @@ namespace NCC.Extend.Entitys.Dto.LqXhHyhk /// 耗卡编号 /// 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 hyzh { get; set; } - + /// /// 会员名称 /// public string hymc { get; set; } - + /// /// 顾客类型 /// public string gklx { get; set; } - + /// /// 消费金额 /// public string xfje { get; set; } - + /// /// 手工费用 /// public string sgfy { get; set; } - + /// /// 是否有科技部 /// public string sfykjb { get; set; } - + /// /// 耗卡时间 /// public DateTime? hksj { get; set; } - + /// /// 操作人员 /// public string czry { get; set; } - + /// /// 耗卡_品项明细 /// public List lqXhPxmxList { 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 0038e88..83144e0 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 @@ -17,13 +17,13 @@ namespace NCC.Extend.Entitys.Dto.LqXhHyhk /// /// GK2025022100004 public string MemberId { get; set; } - + /// /// 会员姓名 /// /// 张三 public string MemberName { get; set; } - + /// /// 剩余品项列表 /// @@ -41,51 +41,56 @@ namespace NCC.Extend.Entitys.Dto.LqXhHyhk public class RemainingItemInfo { /// + /// 开单品项id + /// + public string BillingItemId { get; set; } + + /// /// 品项ID /// /// 94 public string ItemId { get; set; } - + /// /// 品项名称 /// /// 胶原宝宝-单部位 public string ItemName { get; set; } - + /// /// 品项单价 /// /// 100.00 public decimal ItemPrice { get; set; } - + /// /// 来源类型 /// /// 品项的来源类型,用于区分相同品项的不同来源 /// 开卡 public string SourceType { get; set; } - + /// /// 总购买数量 /// /// 该品项的总购买次数 /// 3 public decimal TotalPurchased { get; set; } - + /// /// 已耗卡数量 /// /// 该品项已消费的次数 /// 1 public decimal ConsumedCount { get; set; } - + /// /// 已退卡数量 /// /// 该品项已退卡的次数 /// 0 public decimal RefundedCount { get; set; } - + /// /// 剩余数量 /// diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhPxmx/LqXhPxmxCrInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhPxmx/LqXhPxmxCrInput.cs index 4801ba6..5165762 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhPxmx/LqXhPxmxCrInput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhPxmx/LqXhPxmxCrInput.cs @@ -14,9 +14,9 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx public string id { get; set; } /// - /// 关联开单编号 + /// 开单品项明细表id /// - public string glkdbh { get; set; } + public string billingItemId { get; set; } /// /// 品项 @@ -34,11 +34,6 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx public decimal pxjg { get; set; } /// - /// 是否赠送 - /// - public string xfzs { get; set; } - - /// /// 会员id /// public string memberId { get; set; } @@ -78,4 +73,4 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx /// public List lqXhKjbsyjList { get; set; } } -} \ No newline at end of file +} 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 bd7a991..d203e31 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 @@ -16,9 +16,14 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx public string id { get; set; } /// - /// 关联耗卡编号 + /// 耗卡记录ID /// - public string glkdbh { get; set; } + public string consumeInfoId { get; set; } + + /// + /// 开单品项明细表id + /// + public string billingItemId { get; set; } /// /// 品项编号 @@ -36,11 +41,6 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx public decimal pxjg { get; set; } /// - /// 是否赠送 - /// - public string xfzs { get; set; } - - /// /// 会员ID /// public string memberId { get; set; } @@ -80,4 +80,4 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx /// public List lqXhKjbsyjList { get; set; } } -} \ No newline at end of file +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYcsdJsj/LqYcsdJsjByUserMonthInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYcsdJsj/LqYcsdJsjByUserMonthInput.cs new file mode 100644 index 0000000..86cbcc0 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYcsdJsj/LqYcsdJsjByUserMonthInput.cs @@ -0,0 +1,23 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace NCC.Extend.Entitys.Dto.LqYcsdJsj +{ + /// + /// 根据用户和月份获取金三角信息输入参数 + /// + public class LqYcsdJsjByUserMonthInput + { + /// + /// 用户ID + /// + [Required(ErrorMessage = "用户ID不能为空")] + public string UserId { get; set; } + + /// + /// 时间(格式:yyyy-MM-dd HH:mm:ss) + /// + [Required(ErrorMessage = "时间不能为空")] + public DateTime DateTime { get; set; } + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYcsdJsj/LqYcsdJsjByUserMonthOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYcsdJsj/LqYcsdJsjByUserMonthOutput.cs new file mode 100644 index 0000000..d751a3b --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYcsdJsj/LqYcsdJsjByUserMonthOutput.cs @@ -0,0 +1,58 @@ +namespace NCC.Extend.Entitys.Dto.LqYcsdJsj +{ + /// + /// 根据用户和月份获取金三角信息输出参数 + /// + public class LqYcsdJsjByUserMonthOutput + { + /// + /// 金三角ID + /// + public string JsjId { get; set; } + + /// + /// 金三角名称 + /// + public string JsjName { get; set; } + + /// + /// 月份 + /// + public string Month { get; set; } + + /// + /// 门店ID + /// + public string StoreId { get; set; } + + /// + /// 门店名称 + /// + public string StoreName { get; set; } + + /// + /// 用户ID + /// + public string UserId { get; set; } + + /// + /// 用户姓名 + /// + public string UserName { get; set; } + + /// + /// 是否顾问 + /// + public int IsLeader { get; set; } + + /// + /// 状态 + /// + public string Status { get; set; } + + /// + /// 排序 + /// + public int SortOrder { get; set; } + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYcsdJsj/LqYcsdJsjPerformanceInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYcsdJsj/LqYcsdJsjPerformanceInput.cs new file mode 100644 index 0000000..e9f7e35 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYcsdJsj/LqYcsdJsjPerformanceInput.cs @@ -0,0 +1,30 @@ +using System.ComponentModel.DataAnnotations; + +namespace NCC.Extend.Entitys.Dto.LqYcsdJsj +{ + /// + /// 金三角业绩统计查询输入参数 + /// + public class LqYcsdJsjPerformanceInput + { + /// + /// 开始月份(格式:yyyyMM) + /// + public string StartMonth { get; set; } + + /// + /// 结束月份(格式:yyyyMM) + /// + public string EndMonth { get; set; } + + /// + /// 金三角ID(可选,用于查询特定金三角) + /// + public string JsjId { get; set; } + + /// + /// 门店ID(可选,用于查询特定门店) + /// + public string StoreId { get; set; } + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYcsdJsj/LqYcsdJsjPerformanceOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYcsdJsj/LqYcsdJsjPerformanceOutput.cs new file mode 100644 index 0000000..a6d4756 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYcsdJsj/LqYcsdJsjPerformanceOutput.cs @@ -0,0 +1,65 @@ +using System; + +namespace NCC.Extend.Entitys.Dto.LqYcsdJsj +{ + /// + /// 金三角业绩统计输出参数 + /// + public class LqYcsdJsjPerformanceOutput + { + /// + /// 金三角ID + /// + public string JsjId { get; set; } + + /// + /// 金三角名称 + /// + public string JsjName { get; set; } + + /// + /// 月份 + /// + public string Month { get; set; } + + /// + /// 门店ID + /// + public string StoreId { get; set; } + + /// + /// 门店名称 + /// + public string StoreName { get; set; } + + /// + /// 订单数量 + /// + public int OrderCount { get; set; } + + /// + /// 总业绩 + /// + public decimal TotalPerformance { get; set; } + + /// + /// 最后订单日期 + /// + public DateTime? LastOrderDate { get; set; } + + /// + /// 首次订单日期 + /// + public DateTime? FirstOrderDate { get; set; } + + /// + /// 统计类型(ACTIVE-活跃金三角业绩,INACTIVE-单人业绩) + /// + public string StatisticsType { get; set; } + + /// + /// 成员姓名(仅单人业绩时使用) + /// + public string MemberName { get; set; } + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_event/LqEventEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_event/LqEventEntity.cs index ae79ca9..b5f5023 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_event/LqEventEntity.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_event/LqEventEntity.cs @@ -44,5 +44,11 @@ namespace NCC.Extend.Entitys.lq_event /// [SugarColumn(ColumnName = "F_EventNumber")] public string EventNumber { get; set; } + + /// + /// 活动类型 + /// + [SugarColumn(ColumnName = "F_EventType")] + public int EventType { 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 928de33..303ed67 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 @@ -1,6 +1,7 @@ -using NCC.Common.Const; +using System; +using NCC.Common.Const; +using NCC.Extend.Entitys.Enum; using SqlSugar; -using System; namespace NCC.Extend.Entitys.lq_hytk_mx { @@ -16,90 +17,95 @@ namespace NCC.Extend.Entitys.lq_hytk_mx /// [SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true)] public string Id { get; set; } - + /// - /// 关联退卡编号 + /// 关联退卡Id /// - [SugarColumn(ColumnName = "gltkbh")] - public string Gltkbh { get; set; } - + [SugarColumn(ColumnName = "F_RefundInfoId")] + public string RefundInfoId { get; set; } + + /// + /// 退卡记录Id + /// + [SugarColumn(ColumnName = "F_BillingItemId")] + public string BillingItemId { get; set; } + /// /// 品项 /// - [SugarColumn(ColumnName = "px")] + [SugarColumn(ColumnName = "px")] public string Px { get; set; } - + /// /// 品项名称 /// - [SugarColumn(ColumnName = "pxmc")] + [SugarColumn(ColumnName = "pxmc")] public string Pxmc { get; set; } - + /// /// 品项价格 /// - [SugarColumn(ColumnName = "pxjg")] + [SugarColumn(ColumnName = "pxjg")] public decimal? Pxjg { get; set; } - + /// /// 退款金额 /// - [SugarColumn(ColumnName = "tkje")] + [SugarColumn(ColumnName = "tkje")] public decimal? Tkje { get; set; } - + /// /// 项目次数 /// - [SugarColumn(ColumnName = "F_ProjectNumber")] - public int? F_ProjectNumber { get; set; } - + [SugarColumn(ColumnName = "F_ProjectNumber")] + public int ProjectNumber { get; set; } + /// /// 是否有效 /// - [SugarColumn(ColumnName = "F_IsEnabled")] - public int? F_IsEnabled { get; set; } - + [SugarColumn(ColumnName = "F_IsEnabled")] + public int IsEnabled { get; set; } = StatusEnum.有效.GetHashCode(); + /// /// 来源类型 /// - [SugarColumn(ColumnName = "F_SourceType")] - public string F_SourceType { get; set; } - + [SugarColumn(ColumnName = "F_SourceType")] + public string SourceType { get; set; } + /// /// 合计金额 /// - [SugarColumn(ColumnName = "F_TotalPrice")] - public decimal? F_TotalPrice { get; set; } - + [SugarColumn(ColumnName = "F_TotalPrice")] + public decimal? TotalPrice { get; set; } + /// /// 创建时间 /// - [SugarColumn(ColumnName = "F_CreateTime")] - public DateTime? F_CreateTime { get; set; } - + [SugarColumn(ColumnName = "F_CreateTime")] + public DateTime? CreateTime { get; set; } + /// /// 创建用户 /// - [SugarColumn(ColumnName = "F_CreateUser")] - public string F_CreateUser { get; set; } - + [SugarColumn(ColumnName = "F_CreateUser")] + public string CreateUser { get; set; } + /// /// 修改时间 /// - [SugarColumn(ColumnName = "F_ModifyTime")] - public DateTime? F_ModifyTime { get; set; } - + [SugarColumn(ColumnName = "F_ModifyTime")] + public DateTime? ModifyTime { get; set; } + /// /// 修改用户 /// - [SugarColumn(ColumnName = "F_ModifyUser")] - public string F_ModifyUser { get; set; } - + [SugarColumn(ColumnName = "F_ModifyUser")] + public string ModifyUser { get; set; } + /// /// 删除标记 /// - [SugarColumn(ColumnName = "F_DeleteMark")] - public int? F_DeleteMark { get; set; } - + [SugarColumn(ColumnName = "F_DeleteMark")] + public int? DeleteMark { get; set; } } -} \ No newline at end of file +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_deductinfo/LqKdDeductinfoEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_deductinfo/LqKdDeductinfoEntity.cs new file mode 100644 index 0000000..22a02eb --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_deductinfo/LqKdDeductinfoEntity.cs @@ -0,0 +1,44 @@ +using System; +using System.ComponentModel.DataAnnotations; +using SqlSugar; + +namespace NCC.Extend.Entitys.lq_kd_deductinfo +{ + /// + /// 开单扣减信息表 + /// + [SugarTable("lq_kd_deductinfo")] + public class LqKdDeductinfoEntity + { + /// + /// 主键 + /// + [SugarColumn(IsPrimaryKey = true, ColumnName = "F_Id")] + public string Id { get; set; } + + /// + /// 扣减类型 + /// + [SugarColumn(ColumnName = "F_DeductType")] + public int? DeductType { get; set; } + + /// + /// 扣减关联ID + /// + [SugarColumn(ColumnName = "F_DeductId")] + public string DeductId { get; set; } + + /// + /// 开单id + /// + [SugarColumn(ColumnName = "F_BillingId")] + [Required] + public string BillingId { get; set; } + + /// + /// 合计金额 + /// + [SugarColumn(ColumnName = "F_Amount")] + public decimal? Amount { get; set; } + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_jksyj/LqKdJksyjEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_jksyj/LqKdJksyjEntity.cs index bb0d209..7a75e90 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_jksyj/LqKdJksyjEntity.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_jksyj/LqKdJksyjEntity.cs @@ -1,6 +1,6 @@ -using NCC.Common.Const; +using System; +using NCC.Common.Const; using SqlSugar; -using System; namespace NCC.Extend.Entitys.lq_kd_jksyj { @@ -16,55 +16,53 @@ namespace NCC.Extend.Entitys.lq_kd_jksyj /// [SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true)] public string Id { get; set; } - + /// /// 关联开单编号 /// - [SugarColumn(ColumnName = "glkdbh")] + [SugarColumn(ColumnName = "glkdbh")] public string Glkdbh { get; set; } - + /// /// 健康师 /// - [SugarColumn(ColumnName = "jks")] + [SugarColumn(ColumnName = "jks")] public string Jks { get; set; } - + /// /// 健康师姓名 /// - [SugarColumn(ColumnName = "jksxm")] + [SugarColumn(ColumnName = "jksxm")] public string Jksxm { get; set; } - + /// /// 健康师账号 /// - [SugarColumn(ColumnName = "jkszh")] + [SugarColumn(ColumnName = "jkszh")] public string Jkszh { get; set; } - + /// /// 健康师业绩 /// - [SugarColumn(ColumnName = "jksyj")] + [SugarColumn(ColumnName = "jksyj")] public string Jksyj { get; set; } - + /// /// 业绩时间 /// - [SugarColumn(ColumnName = "yjsj")] + [SugarColumn(ColumnName = "yjsj")] public DateTime? Yjsj { get; set; } /// /// 金三角id /// - [SugarColumn(ColumnName = "jsj_id")] + [SugarColumn(ColumnName = "jsj_id")] public string Jsj_id { get; set; } - /// /// 开单品相id /// - [SugarColumn(ColumnName = "F_kdpxid")] + [SugarColumn(ColumnName = "F_kdpxid")] public string Kdpxid { get; set; } - } -} \ No newline at end of file +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_kdjlb/LqKdKdjlbEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_kdjlb/LqKdKdjlbEntity.cs index 075ea1c..2421d72 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_kdjlb/LqKdKdjlbEntity.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_kdjlb/LqKdKdjlbEntity.cs @@ -184,5 +184,17 @@ namespace NCC.Extend.Entitys.lq_kd_kdjlb /// [SugarColumn(ColumnName = "F_FIleUrl")] public string F_FIleUrl { get; set; } + + /// + /// 创建时间 + /// + [SugarColumn(ColumnName = "F_CreateTime")] + public DateTime CreateTime { get; set; } + + /// + /// 修改时间 + /// + [SugarColumn(ColumnName = "F_UpdateTime")] + public DateTime UpdateTime { get; set; } } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_pxmx/LqKdPxmxEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_pxmx/LqKdPxmxEntity.cs index 7e4f21f..791cefa 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_pxmx/LqKdPxmxEntity.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_pxmx/LqKdPxmxEntity.cs @@ -57,7 +57,7 @@ namespace NCC.Extend.Entitys.lq_kd_pxmx /// 项目次数 /// [SugarColumn(ColumnName = "F_ProjectNumber")] - public int? ProjectNumber { get; set; } + public decimal ProjectNumber { get; set; } /// /// 是否有效 diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_tkjlb/LqTkjlbEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_tkjlb/LqTkjlbEntity.cs index 61b05fd..e668938 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_tkjlb/LqTkjlbEntity.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_tkjlb/LqTkjlbEntity.cs @@ -18,50 +18,50 @@ namespace NCC.Extend.Entitys.lq_tkjlb /// /// 拓客时间 /// - [SugarColumn(ColumnName = "tksj")] - public DateTime? Tksj { get; set; } + [SugarColumn(ColumnName = "F_ExpansionTime")] + public DateTime ExpansionTime { get; set; } /// /// 拓客人员 /// - [SugarColumn(ColumnName = "tkry")] - public string Tkry { get; set; } + [SugarColumn(ColumnName = "F_ExpansionUserId")] + public string ExpansionUserId { get; set; } /// /// 顾客姓名 /// - [SugarColumn(ColumnName = "gkxm")] - public string Gkxm { get; set; } + [SugarColumn(ColumnName = "F_CustomerName")] + public string CustomerName { get; set; } /// - /// 电话号码 + /// 顾客电话号码 /// - [SugarColumn(ColumnName = "dhhm")] - public string Dhhm { get; set; } + [SugarColumn(ColumnName = "F_CustomerPhone")] + public string CustomerPhone { get; set; } /// /// 购买张数 /// - [SugarColumn(ColumnName = "gmzs")] - public int? Gmzs { get; set; } + [SugarColumn(ColumnName = "F_BuyNumber")] + public int BuyNumber { get; set; } = 0; /// /// 支付方式 /// - [SugarColumn(ColumnName = "zffs")] - public string Zffs { get; set; } + [SugarColumn(ColumnName = "F_PaymentMethod")] + public string PaymentMethod { get; set; } /// /// 是否加微信 /// - [SugarColumn(ColumnName = "sfjwx")] - public string Sfjwx { get; set; } + [SugarColumn(ColumnName = "F_IsAddWeChat")] + public string IsAddWeChat { get; set; } /// /// 备注 /// - [SugarColumn(ColumnName = "bz")] - public string Bz { get; set; } + [SugarColumn(ColumnName = "F_Remarks")] + public string Remarks { get; set; } /// /// 拓客活动id @@ -70,15 +70,27 @@ namespace NCC.Extend.Entitys.lq_tkjlb public string EventId { get; set; } /// - /// 所属组织 + /// 所属门店ID /// - [SugarColumn(ColumnName = "ssmd")] - public string Ssmd { get; set; } + [SugarColumn(ColumnName = "F_StoreId")] + public string StoreId { get; set; } /// /// 所属战队 /// - [SugarColumn(ColumnName = "sszd")] - public string Sszd { get; set; } + [SugarColumn(ColumnName = "F_TeamName")] + public string TeamName { get; set; } + + /// + /// 所属部门id + /// + [SugarColumn(ColumnName = "F_DepId")] + public string DepId { get; set; } + + /// + /// 添加时间 + /// + [SugarColumn(ColumnName = "F_CreateTime")] + public DateTime CreateTime { get; set; } = DateTime.Now; } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_xh_hyhk/LqXhHyhkEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_xh_hyhk/LqXhHyhkEntity.cs index de1f7b7..cf1ba6e 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_xh_hyhk/LqXhHyhkEntity.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_xh_hyhk/LqXhHyhkEntity.cs @@ -1,6 +1,6 @@ -using NCC.Common.Const; +using System; +using NCC.Common.Const; using SqlSugar; -using System; namespace NCC.Extend.Entitys.lq_xh_hyhk { @@ -16,96 +16,107 @@ namespace NCC.Extend.Entitys.lq_xh_hyhk /// [SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true)] public string Id { get; set; } - + /// /// 门店 /// - [SugarColumn(ColumnName = "md")] + [SugarColumn(ColumnName = "md")] public string Md { get; set; } - + /// /// 门店编号 /// - [SugarColumn(ColumnName = "mdbh")] + [SugarColumn(ColumnName = "mdbh")] public string Mdbh { get; set; } - + /// /// 门店名称 /// - [SugarColumn(ColumnName = "mdmc")] + [SugarColumn(ColumnName = "mdmc")] public string Mdmc { get; set; } - + /// /// 会员 /// - [SugarColumn(ColumnName = "hy")] + [SugarColumn(ColumnName = "hy")] public string Hy { get; set; } - + /// /// 会员账号 /// - [SugarColumn(ColumnName = "hyzh")] + [SugarColumn(ColumnName = "hyzh")] public string Hyzh { get; set; } - + /// /// 会员名称 /// - [SugarColumn(ColumnName = "hymc")] + [SugarColumn(ColumnName = "hymc")] public string Hymc { get; set; } - + /// /// 顾客类型 /// - [SugarColumn(ColumnName = "gklx")] + [SugarColumn(ColumnName = "gklx")] public string Gklx { get; set; } - + /// /// 消费金额 /// - [SugarColumn(ColumnName = "xfje")] + [SugarColumn(ColumnName = "xfje")] public string Xfje { get; set; } - + /// /// 手工费用 /// - [SugarColumn(ColumnName = "sgfy")] + [SugarColumn(ColumnName = "sgfy")] public string Sgfy { get; set; } - + /// /// 是否有科技部 /// - [SugarColumn(ColumnName = "sfykjb")] + [SugarColumn(ColumnName = "sfykjb")] public string Sfykjb { get; set; } - + /// /// 健康师业绩 /// - [SugarColumn(ColumnName = "jksyj")] + [SugarColumn(ColumnName = "jksyj")] public string Jksyj { get; set; } - + /// /// 科技部业绩 /// - [SugarColumn(ColumnName = "kjbyj")] + [SugarColumn(ColumnName = "kjbyj")] public string Kjbyj { get; set; } - + /// /// 品项信息 /// - [SugarColumn(ColumnName = "pxxx")] + [SugarColumn(ColumnName = "pxxx")] public string Pxxx { get; set; } - + /// /// 耗卡时间 /// - [SugarColumn(ColumnName = "hksj")] + [SugarColumn(ColumnName = "hksj")] public DateTime? Hksj { get; set; } - + /// /// 操作人员 /// - [SugarColumn(ColumnName = "czry")] + [SugarColumn(ColumnName = "czry")] public string Czry { get; set; } - + + /// + /// 创建时间 + /// + [SugarColumn(ColumnName = "F_CreateTime")] + public DateTime CreateTime { get; set; } + + /// + /// 修改时间 + /// + [SugarColumn(ColumnName = "F_UpdateTime")] + public DateTime UpdateTime { get; set; } } -} \ No newline at end of file +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_xh_pxmx/LqXhPxmxEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_xh_pxmx/LqXhPxmxEntity.cs index f424831..9af0701 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_xh_pxmx/LqXhPxmxEntity.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_xh_pxmx/LqXhPxmxEntity.cs @@ -1,6 +1,6 @@ -using NCC.Common.Const; +using System; +using NCC.Common.Const; using SqlSugar; -using System; namespace NCC.Extend.Entitys.lq_xh_pxmx { @@ -16,71 +16,71 @@ namespace NCC.Extend.Entitys.lq_xh_pxmx /// [SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true)] public string Id { get; set; } - + /// - /// 关联开单编号 + /// 耗卡记录ID /// - [SugarColumn(ColumnName = "glkdbh")] - public string Glkdbh { get; set; } - + [SugarColumn(ColumnName = "F_ConsumeInfoId")] + public string ConsumeInfoId { get; set; } + + /// + /// 开单品项明细表id + /// + [SugarColumn(ColumnName = "F_BillingItemId")] + public string BillingItemId { get; set; } + /// /// 品项 /// - [SugarColumn(ColumnName = "px")] + [SugarColumn(ColumnName = "px")] public string Px { get; set; } - + /// /// 品项名称 /// - [SugarColumn(ColumnName = "pxmc")] + [SugarColumn(ColumnName = "pxmc")] public string Pxmc { get; set; } - + /// /// 品项价格 /// - [SugarColumn(ColumnName = "pxjg")] + [SugarColumn(ColumnName = "pxjg")] public decimal Pxjg { get; set; } /// - /// 是否赠送 - /// - [SugarColumn(ColumnName = "xfzs")] - public string Xfzs { get; set; } - - /// /// 会员id /// - [SugarColumn(ColumnName = "F_MemberId")] + [SugarColumn(ColumnName = "F_MemberId")] public string MemberId { get; set; } /// /// 创建时间 /// - [SugarColumn(ColumnName = "F_CreateTIme")] + [SugarColumn(ColumnName = "F_CreateTIme")] public DateTime? CreateTIme { get; set; } /// /// 项目次数 /// - [SugarColumn(ColumnName = "F_ProjectNumber")] - public int? ProjectNumber { get; set; } + [SugarColumn(ColumnName = "F_ProjectNumber")] + public int ProjectNumber { get; set; } /// /// 是否有效 /// - [SugarColumn(ColumnName = "F_IsEnabled")] + [SugarColumn(ColumnName = "F_IsEnabled")] public int? IsEnabled { get; set; } /// /// 来源类型 /// - [SugarColumn(ColumnName = "F_SourceType")] + [SugarColumn(ColumnName = "F_SourceType")] public string SourceType { get; set; } /// /// 合计金额 /// - [SugarColumn(ColumnName = "F_TotalPrice")] + [SugarColumn(ColumnName = "F_TotalPrice")] public decimal TotalPrice { get; set; } } -} \ No newline at end of file +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Enum/DeductTypeEnum.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Enum/DeductTypeEnum.cs new file mode 100644 index 0000000..d9e4b7e --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Enum/DeductTypeEnum.cs @@ -0,0 +1,28 @@ +using System.ComponentModel; + +namespace NCC.Extend.Entitys.Enum +{ + /// + /// 扣款类型 + /// + public enum DeductTypeEnum + { + /// + /// 储值卡 + /// + [Description("储值卡")] + 储值卡 = 1, + + /// + /// 扣项 + /// + [Description("扣项")] + 扣项 = 2, + + /// + /// 套餐 + /// + [Description("套餐")] + 套餐 = 3, + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Enum/EventType.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Enum/EventType.cs new file mode 100644 index 0000000..c846e8a --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Enum/EventType.cs @@ -0,0 +1,22 @@ +using System.ComponentModel; + +namespace NCC.Extend.Entitys.Enum +{ + /// + /// 活动类型 + /// + public enum EventType + { + /// + /// 日常拓客 + /// + [Description("日常拓客")] + 日常拓客 = 1, + + /// + /// 全员拓客 + /// + [Description("全员拓客")] + 全员拓客 = 3, + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Enum/StatusEnum.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Enum/StatusEnum.cs new file mode 100644 index 0000000..c71b3da --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Enum/StatusEnum.cs @@ -0,0 +1,28 @@ +using System.ComponentModel; + +namespace NCC.Extend.Entitys.Enum +{ + /// + /// 状态枚举 + /// + public enum StatusEnum + { + /// + /// 有效 + /// + [Description("有效")] + 有效 = 0, + + /// + /// 无效 + /// + [Description("无效")] + 无效 = 1, + + /// + /// 删除 + /// + [Description("删除")] + 删除 = 99, + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/NCC.Extend.Entitys.csproj b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/NCC.Extend.Entitys.csproj index 596ec4b..ca2ef87 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/NCC.Extend.Entitys.csproj +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/NCC.Extend.Entitys.csproj @@ -1,23 +1,13 @@  - net6.0 - bin\Release\NCC.Extend.Entitys.xml - - - - - - - - diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqEventService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqEventService.cs index 86853d8..4196825 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqEventService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqEventService.cs @@ -1,21 +1,27 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.IO; using System.Linq; +using System.Reflection; using System.Threading.Tasks; using Mapster; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using NCC.Common.Core.Manager; +using NCC.Common.Extension; using NCC.Common.Filter; using NCC.Common.Helper; using NCC.Dependency; using NCC.DynamicApiController; +using NCC.Extend.Entitys.Dto.Common; using NCC.Extend.Entitys.Dto.LqEvent; using NCC.Extend.Entitys.Dto.LqEventUser; +using NCC.Extend.Entitys.Enum; using NCC.Extend.Entitys.lq_event; using NCC.Extend.Entitys.lq_eventuser; using NCC.Extend.Entitys.lq_mdxx; +using NCC.Extend.Entitys.lq_tkjlb; using NCC.Extend.Interfaces.LqEvent; using NCC.FriendlyException; using NCC.System.Entitys.Permission; @@ -92,6 +98,7 @@ namespace NCC.Extend.LqEvent eventCoordinator = e.EventCoordinator, eventNumber = e.EventNumber, memberCount = SqlFunc.Subqueryable().Where(u => u.EventId == e.Id).Count(), + eventType = e.EventType, }) .MergeTable() .OrderBy(sidx + " " + sord) @@ -132,13 +139,36 @@ namespace NCC.Extend.LqEvent throw NCCException.Oh("拓客活动不存在"); } - var output = entity.Adapt(); - - // 2. 获取拓客活动成员信息 - var members = await _db.Queryable().Where(u => u.EventId == id.ToString()).ToListAsync(); - - // 3. 转换为输出格式 - output.Members = members.Adapt>(); + // 2. 手动映射到输出格式 + var output = new LqEventInfoOutput + { + id = entity.Id, + eventName = entity.EventName, + startTime = entity.StartTime, + endTime = entity.EndTime, + eventCoordinator = entity.EventCoordinator, + eventNumber = entity.EventNumber, + eventType = entity.EventType, + }; + + // 3. 获取拓客活动成员信息 + var members = await _db.Queryable().Where(u => u.EventId == id).ToListAsync(); + + // 4. 手动映射成员信息 + output.Members = members + .Select(m => new LqEventUserInfoOutput + { + id = m.Id, + eventId = m.EventId, + userId = m.UserId, + depId = m.DepId, + teamName = m.TeamName, + creationTime = m.CreationTime, + creationUser = m.CreationUser, + targetCount = m.EventTarget, + storeId = m.StoreId, + }) + .ToList(); return output; } @@ -203,6 +233,10 @@ namespace NCC.Extend.LqEvent // 生成新的ID entity.Id = YitIdHelper.NextId().ToString(); + // 手动设置时间字段,确保时分秒不丢失 + entity.StartTime = input.StartTime; + entity.EndTime = input.EndTime; + // 插入拓客活动 var isOk = await _db.Insertable(entity).ExecuteCommandAsync(); if (!(isOk > 0)) @@ -225,6 +259,7 @@ namespace NCC.Extend.LqEvent CreationTime = DateTime.Now, CreationUser = userInfo?.userName, StoreId = member.StoreId, + EventTarget = member.TargetCount, } ); } @@ -288,6 +323,10 @@ namespace NCC.Extend.LqEvent var userInfo = await _userManager.GetUserInfo(); var entity = input.Adapt(); + // 手动设置时间字段,确保时分秒不丢失 + entity.StartTime = input.StartTime; + entity.EndTime = input.EndTime; + // 更新拓客活动 var isOk = await _db.Updateable(entity).ExecuteCommandAsync(); if (!(isOk > 0)) @@ -313,6 +352,7 @@ namespace NCC.Extend.LqEvent CreationTime = DateTime.Now, CreationUser = userInfo?.userName, StoreId = member.StoreId, + EventTarget = member.TargetCount, } ); } @@ -352,7 +392,7 @@ namespace NCC.Extend.LqEvent public async Task Delete(string id) { // 删除拓客活动成员 - await _db.Deleteable().Where(u => u.EventId == id.ToString()).ExecuteCommandAsync(); + await _db.Deleteable().Where(u => u.EventId == id).ExecuteCommandAsync(); // 删除拓客活动 var isOk = await _db.Deleteable().Where(p => p.Id == id).ExecuteCommandAsync(); @@ -475,6 +515,7 @@ namespace NCC.Extend.LqEvent EventTarget = eventUser.EventTarget, CreationTime = eventUser.CreationTime, CreationUser = eventUser.CreationUser, + StoreId = eventUser.StoreId, } ); } @@ -490,6 +531,169 @@ namespace NCC.Extend.LqEvent } #endregion + #region 根据用户ID获取当前参与的拓客活动 + /// + /// 根据用户ID获取当前参与的拓客活动列表 + /// + /// + /// 根据用户ID查询当前正在进行的拓客活动信息 + /// 返回用户参与的所有活动详情,包括活动基本信息、用户目标、门店信息等 + /// 如果没有当前活动,返回空列表 + /// + /// 示例请求: + /// ```json + /// GET /api/Extend/LqEvent/user/{userId}/current + /// ``` + /// + /// 参数说明: + /// - userId: 用户ID,必填参数 + /// + /// 返回信息包括: + /// - 活动基本信息(ID、名称、编号、负责人、时间) + /// - 用户参与信息(用户ID、部门ID、战队名称、目标数量) + /// - 门店信息(门店ID、门店名称) + /// - 创建信息(创建时间、创建用户) + /// + /// 用户ID + /// 用户当前参与的拓客活动列表,无活动时返回空列表 + /// 成功返回活动列表(可能为空) + /// 参数错误,用户ID不能为空 + [HttpGet("user/{userId}/current")] + public async Task GetCurrentEvent(string userId) + { + if (string.IsNullOrEmpty(userId)) + { + throw NCCException.Oh("用户ID不能为空"); + } + try + { + var currentTime = DateTime.Now; + // 先检查用户是否有活动记录 + var userEventCount = await _db.Queryable().Where(eu => eu.UserId == userId).CountAsync(); + if (userEventCount == 0) + { + return null; + } + // 使用多表查询方式,一次性获取所有数据 + var eventUsers = await _db.Queryable((eventUser, eventInfo) => eventUser.EventId == eventInfo.Id) + .Where((eventUser, eventInfo) => eventUser.UserId == userId && eventInfo.StartTime <= currentTime && eventInfo.EndTime >= currentTime) + .Select( + (eventUser, eventInfo) => + new LqEventUserEventOutput + { + EventId = eventUser.EventId, + EventName = eventInfo.EventName, + EventNumber = eventInfo.EventNumber, + EventCoordinator = eventInfo.EventCoordinator, + StartTime = eventInfo.StartTime, + EndTime = eventInfo.EndTime, + UserId = eventUser.UserId, + DepId = eventUser.DepId, + TeamName = eventUser.TeamName, + EventTarget = eventUser.EventTarget, + CreationTime = eventUser.CreationTime, + CreationUser = eventUser.CreationUser, + StoreId = eventUser.StoreId, + StoreName = null, // 不需要门店信息 + } + ) + .ToListAsync(); + + // 如果没有查询到当前活动,返回空列表 + return eventUsers ?? new List(); + } + catch (Exception ex) + { + throw NCCException.Oh($"查询用户 {userId} 当前活动失败: {ex.Message}", ex); + } + } + #endregion + + #region 根据活动ID获取战队统计数据 + /// + /// 根据活动ID获取战队统计数据 + /// + /// + /// 根据活动ID查询该活动下所有门店和战队的统计数据 + /// 返回按门店和战队分组的拓客数据 + /// + /// 示例请求: + /// ```json + /// GET /api/Extend/LqEvent/team-data/{eventId} + /// ``` + /// + /// 参数说明: + /// - eventId: 活动ID,必填参数 + /// + /// 返回信息包括: + /// - 门店信息(门店ID、门店名称) + /// - 战队信息(战队名称) + /// - 用户信息(用户ID、用户姓名、拓客数量、活动目标) + /// + /// 活动ID + /// 按门店和战队分组的统计数据 + /// 成功返回统计数据 + /// 参数错误,活动ID不能为空 + [HttpGet("team-data/{eventId}")] + public async Task GetTeamDataByEventId(string eventId) + { + if (string.IsNullOrEmpty(eventId)) + { + throw NCCException.Oh("活动ID不能为空"); + } + + try + { + // 使用SqlFunc子查询,一次性获取所有需要的数据,避免多次查询和内存合并 + var teamData = await _db.Queryable() + .Where(eventUser => eventUser.EventId == eventId) + .Select(eventUser => new + { + StoreId = eventUser.StoreId, + StoreName = SqlFunc.Subqueryable().Where(md => md.Id == eventUser.StoreId).Select(md => md.Dm), + TeamName = eventUser.TeamName, + ExpansionUserId = eventUser.UserId, + ExpansionUserName = SqlFunc.Subqueryable().Where(u => u.Id == eventUser.UserId).Select(u => u.RealName), + EventTarget = eventUser.EventTarget, + ExpansionCount = SqlFunc.Subqueryable().Where(tkjlb => tkjlb.EventId == eventId && tkjlb.ExpansionUserId == eventUser.UserId).Count(), + }) + .ToListAsync(); + + // 按门店和战队分组数据 + var result = teamData + .GroupBy(x => new { x.StoreId, x.StoreName }) + .Select(storeGroup => new StoreTeamDataOutput + { + StoreId = storeGroup.Key.StoreId, + StoreName = storeGroup.Key.StoreName, + TeamList = storeGroup + .GroupBy(x => x.TeamName) + .Select(teamGroup => new TeamInfoOutput + { + TeamName = teamGroup.Key, + TeamUserInfo = teamGroup + .Select(user => new TeamUserInfoOutput + { + ExpansionUserId = user.ExpansionUserId, + ExpansionUserName = user.ExpansionUserName, + ExpansionCount = user.ExpansionCount, + EventTarget = user.EventTarget, + }) + .ToList(), + }) + .ToList(), + }) + .ToList(); + + return result; + } + catch (Exception ex) + { + throw NCCException.Oh($"查询活动 {eventId} 战队统计数据失败: {ex.Message}", ex); + } + } + #endregion + #region Excel导入拓客活动用户 /// @@ -604,6 +808,7 @@ namespace NCC.Extend.LqEvent DepId = user.OrganizeId, TeamName = row.TeamName, StoreId = storeId, + TargetCount = row.TargetCount, }; result.SuccessData.Add(successData); @@ -656,8 +861,23 @@ namespace NCC.Extend.LqEvent // 使用ExcelImportHelper读取Excel文件 var dataTable = ExcelImportHelper.ToDataTable(tempFilePath, 0, 0); - // 从第2行开始读取数据(第1行是标题) - for (int i = 1; i < dataTable.Rows.Count; i++) + // 调试信息:输出总行数和列数 + Console.WriteLine($"Excel总行数: {dataTable.Rows.Count}, 总列数: {dataTable.Columns.Count}"); + + // 调试信息:输出所有行的数据 + for (int debugRow = 0; debugRow < dataTable.Rows.Count; debugRow++) + { + var debugRowData = dataTable.Rows[debugRow]; + var debugValues = new List(); + for (int debugCol = 0; debugCol < debugRowData.ItemArray.Length; debugCol++) + { + debugValues.Add(debugRowData[debugCol]?.ToString() ?? "null"); + } + Console.WriteLine($"调试第{debugRow + 1}行: {string.Join(", ", debugValues)}"); + } + + // 从第1行开始读取数据(没有标题行) + for (int i = 0; i < dataTable.Rows.Count; i++) { var row = dataTable.Rows[i]; var mobilePhone = row[0]?.ToString()?.Trim(); @@ -666,7 +886,10 @@ namespace NCC.Extend.LqEvent var storeName = row[3]?.ToString()?.Trim(); var targetCountStr = row[4]?.ToString()?.Trim(); - int? targetCount = null; + // 调试信息:输出每一行读取的数据 + Console.WriteLine($"第{i + 1}行数据: 手机号={mobilePhone}, 姓名={name}, 战队={teamName}, 门店={storeName}, 目标={targetCountStr}"); + + int targetCount = 0; if (!string.IsNullOrEmpty(targetCountStr) && int.TryParse(targetCountStr, out int target)) { targetCount = target; @@ -675,6 +898,7 @@ namespace NCC.Extend.LqEvent // 跳过空行 if (string.IsNullOrEmpty(mobilePhone) && string.IsNullOrEmpty(name)) { + Console.WriteLine($"第{i + 1}行被跳过:空行"); continue; } @@ -713,7 +937,28 @@ namespace NCC.Extend.LqEvent public string Name { get; set; } public string TeamName { get; set; } public string StoreName { get; set; } - public int? TargetCount { get; set; } + public int TargetCount { get; set; } = 0; + } + + #endregion + + #region 获取拓客类型枚举内容 + + /// + /// 获取拓客类型枚举内容 + /// + /// 拓客类型枚举列表 + [HttpGet("event-types")] + public List GetEventTypes() + { + return Enum.GetValues() + .Select(e => new EnumOutput + { + Value = (int)e, + Name = e.ToString(), + Description = e.GetDescription(), + }) + .ToList(); } #endregion diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqGzService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqGzService.cs index f1d22e2..37fd74a 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqGzService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqGzService.cs @@ -1,43 +1,43 @@ -using NCC.Common.Core.Manager; -using NCC.Common.Enum; -using NCC.Common.Extension; -using NCC.Common.Filter; -using NCC.Dependency; -using NCC.DynamicApiController; -using NCC.FriendlyException; -using NCC.Extend.Interfaces.LqGz; -using Mapster; -using Microsoft.AspNetCore.Mvc; -using SqlSugar; -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using NCC.Extend.Entitys.lq_gz; -using Yitter.IdGenerator; +using Mapster; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using NCC.ClayObject; +using NCC.Common.Configuration; +using NCC.Common.Core.Manager; +using NCC.Common.Enum; +using NCC.Common.Extension; +using NCC.Common.Filter; using NCC.Common.Helper; -using NCC.JsonSerialization; using NCC.Common.Model.NPOI; -using NCC.Common.Configuration; using NCC.DataEncryption; -using NCC.ClayObject; -using NCC.Extend.Entitys.lq_kd_pxmx; -using NCC.Extend.Entitys.lq_xmzl; +using NCC.Dependency; +using NCC.DynamicApiController; +using NCC.Extend.Entitys.Dto.LqGz; +using NCC.Extend.Entitys.lq_gz; using NCC.Extend.Entitys.lq_jlmxb; -using NCC.Extend.Entitys.lq_ycsd_jsj; -using NCC.Extend.Entitys.lq_mdxx; -using NCC.Extend.Entitys.lq_kd_kdjlb; using NCC.Extend.Entitys.lq_kd_jksyj; +using NCC.Extend.Entitys.lq_kd_kdjlb; using NCC.Extend.Entitys.lq_kd_kjbsyj; -using Microsoft.Extensions.Logging; -using NCC.Extend.Entitys.Dto.LqGz; +using NCC.Extend.Entitys.lq_kd_pxmx; +using NCC.Extend.Entitys.lq_mdxx; +using NCC.Extend.Entitys.lq_xmzl; +using NCC.Extend.Entitys.lq_ycsd_jsj; +using NCC.Extend.Interfaces.LqGz; +using NCC.FriendlyException; +using NCC.JsonSerialization; +using SqlSugar; +using Yitter.IdGenerator; namespace NCC.Extend.LqGz { /// /// 工资全字段服务 /// - [ApiDescriptionSettings(Tag = "绿纤工资全字段服务",Name = "LqGz", Order = 200)] + [ApiDescriptionSettings(Tag = "绿纤工资全字段服务", Name = "LqGz", Order = 200)] [Route("api/Extend/[controller]")] public class LqGzService : ILqGzService, IDynamicApiController, ITransient { @@ -49,12 +49,9 @@ namespace NCC.Extend.LqGz /// /// 初始化一个类型的新实例 /// - public LqGzService( - ISqlSugarRepository lqGzRepository, - IUserManager userManager, - ILogger logger) + public LqGzService(ISqlSugarRepository lqGzRepository, IUserManager userManager, ILogger logger) { - _lqGzRepository = lqGzRepository; + _lqGzRepository = lqGzRepository; _db = _lqGzRepository.Context; _userManager = userManager; _logger = logger; @@ -74,10 +71,10 @@ namespace NCC.Extend.LqGz } /// - /// 获取工资全字段列表 - /// - /// 请求参数 - /// + /// 获取工资全字段列表 + /// + /// 请求参数 + /// [HttpGet("")] public async Task GetList([FromQuery] LqGzListQueryInput input) { @@ -182,109 +179,112 @@ namespace NCC.Extend.LqGz .WhereIF(!string.IsNullOrEmpty(input.dzjfe), p => p.Dzjfe.Equals(input.dzjfe)) .WhereIF(!string.IsNullOrEmpty(input.bfsy), p => p.Bfsy.Equals(input.bfsy)) .WhereIF(!string.IsNullOrEmpty(input.dyzfze), p => p.Dyzfze.Equals(input.dyzfze)) - .Select(it=> new LqGzListOutput + .Select(it => new LqGzListOutput { id = it.Id, - md=it.Md, - hsgw=it.Hsgw, - xm=it.Xm, - jsjzd=it.Jsjzd, - zyj=it.Zyj, - jcyj=it.Jcyj, - hzyj=it.Hzyj, - jlyj=it.Jlyj, - mdzyj=it.Mdzyj, - dwyj=it.Dwyj, - zb=it.Zb, - xkyj=it.Xkyj, - xkcjl=it.Xkcjl, - xktd=it.Xktd, - sdyj=it.Sdyj, - sdtd=it.Sdtd, - syyj=it.Syyj, - cellyj=it.Cellyj, - dxmybyj=it.Dxmybyj, - dxmebyj=it.Dxmebyj, - dyyj=it.Dyyj, - wysd=it.Wysd, - mdzc=it.Mdzc, - cpwl=it.Cpwl, - wdcb=it.Wdcb, - qthzcb=it.Qthzcb, - xmj=it.Xmj, - ml=it.Ml, - zjltce=it.Zjltce, - jltce=it.Jltce, - xh=it.Xh, - xms=it.Xms, - ddrt=it.Ddrt, - zdts=it.Zdts, - qjts=it.Qjts, - td=it.Td, - jcyjtc=it.Jcyjtc, - hzyjtc=it.Hzyjtc, - gwtc=it.Gwtc, - mdtqtc=it.Mdtqtc, - dztc1=it.Dztc1, - dzzrtc=it.Dzzrtc, - zrtc=it.Zrtc, - dztc2=it.Dztc2, - zjltc=it.Zjltc, - jltc=it.Jltc, - yjtc=it.Yjtc, - xhtc=it.Xhtc, - kjbzctc=it.Kjbzctc, - sytc=it.Sytc, - celltc=it.Celltc, - dxmbtc=it.Dxmbtc, - tchj=it.Tchj, - jksdx=it.Jksdx, - dzhudx=it.Dzhudx, - dzhangdx=it.Dzhangdx, - zrdx=it.Zrdx, - dzzrdx=it.Dzzrdx, - zjldx=it.Zjldx, - jldx=it.Jldx, - kjblsdx=it.Kjblsdx, - dxmbdx=it.Dxmbdx, - dxhj=it.Dxhj, - sg=it.Sg, - rtjl=it.Rtjl, - sjgl=it.Sjgl, - cb=it.Cb, - sx=it.Sx, - qq=it.Qq, - hsyfgz=it.Hsyfgz, - bd=it.Bd, - bdqj=it.Bdqj, - bddx=it.Bddx, - bdbc=it.Bdbc, - zzyfgz=it.Zzyfgz, - dypxbt=it.Dypxbt, - dyjtbt=it.Dyjtbt, - sypxbt=it.Sypxbt, - syjtbt=it.Syjtbt, - bthj=it.Bthj, - qk=it.Qk, - cd=it.Cd, - qj=it.Qj, - ksb=it.Ksb, - kcjl=it.Kcjl, - kzs=it.Kzs, - kxxq=it.Kxxq, - kgzf=it.Kgzf, - kkhj=it.Kkhj, - fjj=it.Fjj, - tsjyj=it.Tsjyj, - tzsyj=it.Tzsyj, - sfgz=it.Sfgz, - dysfff=it.Dysfff, - zfje=it.Zfje, - dzjfe=it.Dzjfe, - bfsy=it.Bfsy, - dyzfze=it.Dyzfze, - }).MergeTable().OrderBy(sidx+" "+input.sort).ToPagedListAsync(input.currentPage, input.pageSize); - return PageResult.SqlSugarPageResult(data); + md = it.Md, + hsgw = it.Hsgw, + xm = it.Xm, + jsjzd = it.Jsjzd, + zyj = it.Zyj, + jcyj = it.Jcyj, + hzyj = it.Hzyj, + jlyj = it.Jlyj, + mdzyj = it.Mdzyj, + dwyj = it.Dwyj, + zb = it.Zb, + xkyj = it.Xkyj, + xkcjl = it.Xkcjl, + xktd = it.Xktd, + sdyj = it.Sdyj, + sdtd = it.Sdtd, + syyj = it.Syyj, + cellyj = it.Cellyj, + dxmybyj = it.Dxmybyj, + dxmebyj = it.Dxmebyj, + dyyj = it.Dyyj, + wysd = it.Wysd, + mdzc = it.Mdzc, + cpwl = it.Cpwl, + wdcb = it.Wdcb, + qthzcb = it.Qthzcb, + xmj = it.Xmj, + ml = it.Ml, + zjltce = it.Zjltce, + jltce = it.Jltce, + xh = it.Xh, + xms = it.Xms, + ddrt = it.Ddrt, + zdts = it.Zdts, + qjts = it.Qjts, + td = it.Td, + jcyjtc = it.Jcyjtc, + hzyjtc = it.Hzyjtc, + gwtc = it.Gwtc, + mdtqtc = it.Mdtqtc, + dztc1 = it.Dztc1, + dzzrtc = it.Dzzrtc, + zrtc = it.Zrtc, + dztc2 = it.Dztc2, + zjltc = it.Zjltc, + jltc = it.Jltc, + yjtc = it.Yjtc, + xhtc = it.Xhtc, + kjbzctc = it.Kjbzctc, + sytc = it.Sytc, + celltc = it.Celltc, + dxmbtc = it.Dxmbtc, + tchj = it.Tchj, + jksdx = it.Jksdx, + dzhudx = it.Dzhudx, + dzhangdx = it.Dzhangdx, + zrdx = it.Zrdx, + dzzrdx = it.Dzzrdx, + zjldx = it.Zjldx, + jldx = it.Jldx, + kjblsdx = it.Kjblsdx, + dxmbdx = it.Dxmbdx, + dxhj = it.Dxhj, + sg = it.Sg, + rtjl = it.Rtjl, + sjgl = it.Sjgl, + cb = it.Cb, + sx = it.Sx, + qq = it.Qq, + hsyfgz = it.Hsyfgz, + bd = it.Bd, + bdqj = it.Bdqj, + bddx = it.Bddx, + bdbc = it.Bdbc, + zzyfgz = it.Zzyfgz, + dypxbt = it.Dypxbt, + dyjtbt = it.Dyjtbt, + sypxbt = it.Sypxbt, + syjtbt = it.Syjtbt, + bthj = it.Bthj, + qk = it.Qk, + cd = it.Cd, + qj = it.Qj, + ksb = it.Ksb, + kcjl = it.Kcjl, + kzs = it.Kzs, + kxxq = it.Kxxq, + kgzf = it.Kgzf, + kkhj = it.Kkhj, + fjj = it.Fjj, + tsjyj = it.Tsjyj, + tzsyj = it.Tzsyj, + sfgz = it.Sfgz, + dysfff = it.Dysfff, + zfje = it.Zfje, + dzjfe = it.Dzjfe, + bfsy = it.Bfsy, + dyzfze = it.Dyzfze, + }) + .MergeTable() + .OrderBy(sidx + " " + input.sort) + .ToPagedListAsync(input.currentPage, input.pageSize); + return PageResult.SqlSugarPageResult(data); } /// @@ -299,14 +299,15 @@ namespace NCC.Extend.LqGz var entity = input.Adapt(); entity.Id = YitIdHelper.NextId().ToString(); var isOk = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync(); - if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1000); + if (!(isOk > 0)) + throw NCCException.Oh(ErrorCode.COM1000); } /// - /// 获取工资全字段无分页列表 - /// - /// 请求参数 - /// + /// 获取工资全字段无分页列表 + /// + /// 请求参数 + /// [NonAction] public async Task GetNoPagingList([FromQuery] LqGzListQueryInput input) { @@ -411,116 +412,119 @@ namespace NCC.Extend.LqGz .WhereIF(!string.IsNullOrEmpty(input.dzjfe), p => p.Dzjfe.Equals(input.dzjfe)) .WhereIF(!string.IsNullOrEmpty(input.bfsy), p => p.Bfsy.Equals(input.bfsy)) .WhereIF(!string.IsNullOrEmpty(input.dyzfze), p => p.Dyzfze.Equals(input.dyzfze)) - .Select(it=> new LqGzListOutput + .Select(it => new LqGzListOutput { id = it.Id, - md=it.Md, - hsgw=it.Hsgw, - xm=it.Xm, - jsjzd=it.Jsjzd, - zyj=it.Zyj, - jcyj=it.Jcyj, - hzyj=it.Hzyj, - jlyj=it.Jlyj, - mdzyj=it.Mdzyj, - dwyj=it.Dwyj, - zb=it.Zb, - xkyj=it.Xkyj, - xkcjl=it.Xkcjl, - xktd=it.Xktd, - sdyj=it.Sdyj, - sdtd=it.Sdtd, - syyj=it.Syyj, - cellyj=it.Cellyj, - dxmybyj=it.Dxmybyj, - dxmebyj=it.Dxmebyj, - dyyj=it.Dyyj, - wysd=it.Wysd, - mdzc=it.Mdzc, - cpwl=it.Cpwl, - wdcb=it.Wdcb, - qthzcb=it.Qthzcb, - xmj=it.Xmj, - ml=it.Ml, - zjltce=it.Zjltce, - jltce=it.Jltce, - xh=it.Xh, - xms=it.Xms, - ddrt=it.Ddrt, - zdts=it.Zdts, - qjts=it.Qjts, - td=it.Td, - jcyjtc=it.Jcyjtc, - hzyjtc=it.Hzyjtc, - gwtc=it.Gwtc, - mdtqtc=it.Mdtqtc, - dztc1=it.Dztc1, - dzzrtc=it.Dzzrtc, - zrtc=it.Zrtc, - dztc2=it.Dztc2, - zjltc=it.Zjltc, - jltc=it.Jltc, - yjtc=it.Yjtc, - xhtc=it.Xhtc, - kjbzctc=it.Kjbzctc, - sytc=it.Sytc, - celltc=it.Celltc, - dxmbtc=it.Dxmbtc, - tchj=it.Tchj, - jksdx=it.Jksdx, - dzhudx=it.Dzhudx, - dzhangdx=it.Dzhangdx, - zrdx=it.Zrdx, - dzzrdx=it.Dzzrdx, - zjldx=it.Zjldx, - jldx=it.Jldx, - kjblsdx=it.Kjblsdx, - dxmbdx=it.Dxmbdx, - dxhj=it.Dxhj, - sg=it.Sg, - rtjl=it.Rtjl, - sjgl=it.Sjgl, - cb=it.Cb, - sx=it.Sx, - qq=it.Qq, - hsyfgz=it.Hsyfgz, - bd=it.Bd, - bdqj=it.Bdqj, - bddx=it.Bddx, - bdbc=it.Bdbc, - zzyfgz=it.Zzyfgz, - dypxbt=it.Dypxbt, - dyjtbt=it.Dyjtbt, - sypxbt=it.Sypxbt, - syjtbt=it.Syjtbt, - bthj=it.Bthj, - qk=it.Qk, - cd=it.Cd, - qj=it.Qj, - ksb=it.Ksb, - kcjl=it.Kcjl, - kzs=it.Kzs, - kxxq=it.Kxxq, - kgzf=it.Kgzf, - kkhj=it.Kkhj, - fjj=it.Fjj, - tsjyj=it.Tsjyj, - tzsyj=it.Tzsyj, - sfgz=it.Sfgz, - dysfff=it.Dysfff, - zfje=it.Zfje, - dzjfe=it.Dzjfe, - bfsy=it.Bfsy, - dyzfze=it.Dyzfze, - }).MergeTable().OrderBy(sidx+" "+input.sort).ToListAsync(); - return data; + md = it.Md, + hsgw = it.Hsgw, + xm = it.Xm, + jsjzd = it.Jsjzd, + zyj = it.Zyj, + jcyj = it.Jcyj, + hzyj = it.Hzyj, + jlyj = it.Jlyj, + mdzyj = it.Mdzyj, + dwyj = it.Dwyj, + zb = it.Zb, + xkyj = it.Xkyj, + xkcjl = it.Xkcjl, + xktd = it.Xktd, + sdyj = it.Sdyj, + sdtd = it.Sdtd, + syyj = it.Syyj, + cellyj = it.Cellyj, + dxmybyj = it.Dxmybyj, + dxmebyj = it.Dxmebyj, + dyyj = it.Dyyj, + wysd = it.Wysd, + mdzc = it.Mdzc, + cpwl = it.Cpwl, + wdcb = it.Wdcb, + qthzcb = it.Qthzcb, + xmj = it.Xmj, + ml = it.Ml, + zjltce = it.Zjltce, + jltce = it.Jltce, + xh = it.Xh, + xms = it.Xms, + ddrt = it.Ddrt, + zdts = it.Zdts, + qjts = it.Qjts, + td = it.Td, + jcyjtc = it.Jcyjtc, + hzyjtc = it.Hzyjtc, + gwtc = it.Gwtc, + mdtqtc = it.Mdtqtc, + dztc1 = it.Dztc1, + dzzrtc = it.Dzzrtc, + zrtc = it.Zrtc, + dztc2 = it.Dztc2, + zjltc = it.Zjltc, + jltc = it.Jltc, + yjtc = it.Yjtc, + xhtc = it.Xhtc, + kjbzctc = it.Kjbzctc, + sytc = it.Sytc, + celltc = it.Celltc, + dxmbtc = it.Dxmbtc, + tchj = it.Tchj, + jksdx = it.Jksdx, + dzhudx = it.Dzhudx, + dzhangdx = it.Dzhangdx, + zrdx = it.Zrdx, + dzzrdx = it.Dzzrdx, + zjldx = it.Zjldx, + jldx = it.Jldx, + kjblsdx = it.Kjblsdx, + dxmbdx = it.Dxmbdx, + dxhj = it.Dxhj, + sg = it.Sg, + rtjl = it.Rtjl, + sjgl = it.Sjgl, + cb = it.Cb, + sx = it.Sx, + qq = it.Qq, + hsyfgz = it.Hsyfgz, + bd = it.Bd, + bdqj = it.Bdqj, + bddx = it.Bddx, + bdbc = it.Bdbc, + zzyfgz = it.Zzyfgz, + dypxbt = it.Dypxbt, + dyjtbt = it.Dyjtbt, + sypxbt = it.Sypxbt, + syjtbt = it.Syjtbt, + bthj = it.Bthj, + qk = it.Qk, + cd = it.Cd, + qj = it.Qj, + ksb = it.Ksb, + kcjl = it.Kcjl, + kzs = it.Kzs, + kxxq = it.Kxxq, + kgzf = it.Kgzf, + kkhj = it.Kkhj, + fjj = it.Fjj, + tsjyj = it.Tsjyj, + tzsyj = it.Tzsyj, + sfgz = it.Sfgz, + dysfff = it.Dysfff, + zfje = it.Zfje, + dzjfe = it.Dzjfe, + bfsy = it.Bfsy, + dyzfze = it.Dyzfze, + }) + .MergeTable() + .OrderBy(sidx + " " + input.sort) + .ToListAsync(); + return data; } /// - /// 导出工资全字段 - /// - /// 请求参数 - /// + /// 导出工资全字段 + /// + /// 请求参数 + /// [HttpGet("Actions/Export")] public async Task Export([FromQuery] LqGzListQueryInput input) { @@ -535,7 +539,8 @@ namespace NCC.Extend.LqGz { exportData = await this.GetNoPagingList(input); } - List paramList = "[{\"value\":\"主键\",\"field\":\"id\"},{\"value\":\"门店\",\"field\":\"md\"},{\"value\":\"核算岗位\",\"field\":\"hsgw\"},{\"value\":\"姓名\",\"field\":\"xm\"},{\"value\":\"金山角战队\",\"field\":\"jsjzd\"},{\"value\":\"基础业绩\",\"field\":\"jcyj\"},{\"value\":\"合作业绩\",\"field\":\"hzyj\"},{\"value\":\"奖励业绩\",\"field\":\"jlyj\"},{\"value\":\"门店总业绩\",\"field\":\"mdzyj\"},{\"value\":\"队伍业绩\",\"field\":\"dwyj\"},{\"value\":\"占比\",\"field\":\"zb\"},{\"value\":\"新客业绩\",\"field\":\"xkyj\"},{\"value\":\"新客成交率\",\"field\":\"xkcjl\"},{\"value\":\"新客提点\",\"field\":\"xktd\"},{\"value\":\"升单业绩\",\"field\":\"sdyj\"},{\"value\":\"升单提点\",\"field\":\"sdtd\"},{\"value\":\"溯源业绩\",\"field\":\"syyj\"},{\"value\":\"cell业绩\",\"field\":\"cellyj\"},{\"value\":\"项目一部业绩\",\"field\":\"dxmybyj\"},{\"value\":\"项目二部业绩\",\"field\":\"dxmebyj\"},{\"value\":\"当月业绩\",\"field\":\"dyyj\"},{\"value\":\"物业水电\",\"field\":\"wysd\"},{\"value\":\"门店支出\",\"field\":\"mdzc\"},{\"value\":\"产品物料\",\"field\":\"cpwl\"},{\"value\":\"微雕成本\",\"field\":\"wdcb\"},{\"value\":\"其它合作成本\",\"field\":\"qthzcb\"},{\"value\":\"洗毛巾\",\"field\":\"xmj\"},{\"value\":\"毛利\",\"field\":\"ml\"},{\"value\":\"总经理提成额\",\"field\":\"zjltce\"},{\"value\":\"经理提成额\",\"field\":\"jltce\"},{\"value\":\"消耗\",\"field\":\"xh\"},{\"value\":\"项目数\",\"field\":\"xms\"},{\"value\":\"到店人头\",\"field\":\"ddrt\"},{\"value\":\"在店天数\",\"field\":\"zdts\"},{\"value\":\"请假天数\",\"field\":\"qjts\"},{\"value\":\"提点\",\"field\":\"td\"},{\"value\":\"基础业绩提成\",\"field\":\"jcyjtc\"},{\"value\":\"合作业绩提成\",\"field\":\"hzyjtc\"},{\"value\":\"顾问提成\",\"field\":\"gwtc\"},{\"value\":\"门店T区提成\",\"field\":\"mdtqtc\"},{\"value\":\"店助提成\",\"field\":\"dztc1\"},{\"value\":\"店助主任提成\",\"field\":\"dzzrtc\"},{\"value\":\"主任提成\",\"field\":\"zrtc\"},{\"value\":\"店长提成\",\"field\":\"dztc2\"},{\"value\":\"总经理提成\",\"field\":\"zjltc\"},{\"value\":\"经理提成\",\"field\":\"jltc\"},{\"value\":\"业绩提成\",\"field\":\"yjtc\"},{\"value\":\"消耗提成\",\"field\":\"xhtc\"},{\"value\":\"科技部组长提成\",\"field\":\"kjbzctc\"},{\"value\":\"溯源提成\",\"field\":\"sytc\"},{\"value\":\"cell提成\",\"field\":\"celltc\"},{\"value\":\"大项目部提成\",\"field\":\"dxmbtc\"},{\"value\":\"提成合计\",\"field\":\"tchj\"},{\"value\":\"健康师底薪\",\"field\":\"jksdx\"},{\"value\":\"店助底薪\",\"field\":\"dzhudx\"},{\"value\":\"店长底薪\",\"field\":\"dzhangdx\"},{\"value\":\"主任底薪\",\"field\":\"zrdx\"},{\"value\":\"店助主任底薪\",\"field\":\"dzzrdx\"},{\"value\":\"总经理底薪\",\"field\":\"zjldx\"},{\"value\":\"经理底薪\",\"field\":\"jldx\"},{\"value\":\"科技部底薪\",\"field\":\"kjblsdx\"},{\"value\":\"大项目部底薪\",\"field\":\"dxmbdx\"},{\"value\":\"底薪合计\",\"field\":\"dxhj\"},{\"value\":\"手工\",\"field\":\"sg\"},{\"value\":\"人头奖励\",\"field\":\"rtjl\"},{\"value\":\"手机管理\",\"field\":\"sjgl\"},{\"value\":\"车补\",\"field\":\"cb\"},{\"value\":\"少休\",\"field\":\"sx\"},{\"value\":\"全勤\",\"field\":\"qq\"},{\"value\":\"核算应发工资\",\"field\":\"hsyfgz\"},{\"value\":\"保底\",\"field\":\"bd\"},{\"value\":\"保底请假\",\"field\":\"bdqj\"},{\"value\":\"保底底薪\",\"field\":\"bddx\"},{\"value\":\"保底补差\",\"field\":\"bdbc\"},{\"value\":\"最终应发工资\",\"field\":\"zzyfgz\"},{\"value\":\"当月培训补贴\",\"field\":\"dypxbt\"},{\"value\":\"当月交通补贴\",\"field\":\"dyjtbt\"},{\"value\":\"上月培训补贴\",\"field\":\"sypxbt\"},{\"value\":\"上月交通补贴\",\"field\":\"syjtbt\"},{\"value\":\"补贴合计\",\"field\":\"bthj\"},{\"value\":\"缺卡\",\"field\":\"qk\"},{\"value\":\"迟到\",\"field\":\"cd\"},{\"value\":\"请假\",\"field\":\"qj\"},{\"value\":\"扣社保\",\"field\":\"ksb\"},{\"value\":\"扣除奖励\",\"field\":\"kcjl\"},{\"value\":\"扣住宿\",\"field\":\"kzs\"},{\"value\":\"扣学习期\",\"field\":\"kxxq\"},{\"value\":\"扣工作服\",\"field\":\"kgzf\"},{\"value\":\"扣款合计\",\"field\":\"kkhj\"},{\"value\":\"发奖金\",\"field\":\"fjj\"},{\"value\":\"退手机押金\",\"field\":\"tsjyj\"},{\"value\":\"退住宿押金\",\"field\":\"tzsyj\"},{\"value\":\"实发工资\",\"field\":\"sfgz\"},{\"value\":\"当月是否发放\",\"field\":\"dysfff\"},{\"value\":\"支付金额\",\"field\":\"zfje\"},{\"value\":\"待支付金额\",\"field\":\"dzjfe\"},{\"value\":\"补发上月\",\"field\":\"bfsy\"},{\"value\":\"当月支付总额\",\"field\":\"dyzfze\"},{\"value\":\"总业绩\",\"field\":\"zyj\"},]".ToList(); + List paramList = + "[{\"value\":\"主键\",\"field\":\"id\"},{\"value\":\"门店\",\"field\":\"md\"},{\"value\":\"核算岗位\",\"field\":\"hsgw\"},{\"value\":\"姓名\",\"field\":\"xm\"},{\"value\":\"金山角战队\",\"field\":\"jsjzd\"},{\"value\":\"基础业绩\",\"field\":\"jcyj\"},{\"value\":\"合作业绩\",\"field\":\"hzyj\"},{\"value\":\"奖励业绩\",\"field\":\"jlyj\"},{\"value\":\"门店总业绩\",\"field\":\"mdzyj\"},{\"value\":\"队伍业绩\",\"field\":\"dwyj\"},{\"value\":\"占比\",\"field\":\"zb\"},{\"value\":\"新客业绩\",\"field\":\"xkyj\"},{\"value\":\"新客成交率\",\"field\":\"xkcjl\"},{\"value\":\"新客提点\",\"field\":\"xktd\"},{\"value\":\"升单业绩\",\"field\":\"sdyj\"},{\"value\":\"升单提点\",\"field\":\"sdtd\"},{\"value\":\"溯源业绩\",\"field\":\"syyj\"},{\"value\":\"cell业绩\",\"field\":\"cellyj\"},{\"value\":\"项目一部业绩\",\"field\":\"dxmybyj\"},{\"value\":\"项目二部业绩\",\"field\":\"dxmebyj\"},{\"value\":\"当月业绩\",\"field\":\"dyyj\"},{\"value\":\"物业水电\",\"field\":\"wysd\"},{\"value\":\"门店支出\",\"field\":\"mdzc\"},{\"value\":\"产品物料\",\"field\":\"cpwl\"},{\"value\":\"微雕成本\",\"field\":\"wdcb\"},{\"value\":\"其它合作成本\",\"field\":\"qthzcb\"},{\"value\":\"洗毛巾\",\"field\":\"xmj\"},{\"value\":\"毛利\",\"field\":\"ml\"},{\"value\":\"总经理提成额\",\"field\":\"zjltce\"},{\"value\":\"经理提成额\",\"field\":\"jltce\"},{\"value\":\"消耗\",\"field\":\"xh\"},{\"value\":\"项目数\",\"field\":\"xms\"},{\"value\":\"到店人头\",\"field\":\"ddrt\"},{\"value\":\"在店天数\",\"field\":\"zdts\"},{\"value\":\"请假天数\",\"field\":\"qjts\"},{\"value\":\"提点\",\"field\":\"td\"},{\"value\":\"基础业绩提成\",\"field\":\"jcyjtc\"},{\"value\":\"合作业绩提成\",\"field\":\"hzyjtc\"},{\"value\":\"顾问提成\",\"field\":\"gwtc\"},{\"value\":\"门店T区提成\",\"field\":\"mdtqtc\"},{\"value\":\"店助提成\",\"field\":\"dztc1\"},{\"value\":\"店助主任提成\",\"field\":\"dzzrtc\"},{\"value\":\"主任提成\",\"field\":\"zrtc\"},{\"value\":\"店长提成\",\"field\":\"dztc2\"},{\"value\":\"总经理提成\",\"field\":\"zjltc\"},{\"value\":\"经理提成\",\"field\":\"jltc\"},{\"value\":\"业绩提成\",\"field\":\"yjtc\"},{\"value\":\"消耗提成\",\"field\":\"xhtc\"},{\"value\":\"科技部组长提成\",\"field\":\"kjbzctc\"},{\"value\":\"溯源提成\",\"field\":\"sytc\"},{\"value\":\"cell提成\",\"field\":\"celltc\"},{\"value\":\"大项目部提成\",\"field\":\"dxmbtc\"},{\"value\":\"提成合计\",\"field\":\"tchj\"},{\"value\":\"健康师底薪\",\"field\":\"jksdx\"},{\"value\":\"店助底薪\",\"field\":\"dzhudx\"},{\"value\":\"店长底薪\",\"field\":\"dzhangdx\"},{\"value\":\"主任底薪\",\"field\":\"zrdx\"},{\"value\":\"店助主任底薪\",\"field\":\"dzzrdx\"},{\"value\":\"总经理底薪\",\"field\":\"zjldx\"},{\"value\":\"经理底薪\",\"field\":\"jldx\"},{\"value\":\"科技部底薪\",\"field\":\"kjblsdx\"},{\"value\":\"大项目部底薪\",\"field\":\"dxmbdx\"},{\"value\":\"底薪合计\",\"field\":\"dxhj\"},{\"value\":\"手工\",\"field\":\"sg\"},{\"value\":\"人头奖励\",\"field\":\"rtjl\"},{\"value\":\"手机管理\",\"field\":\"sjgl\"},{\"value\":\"车补\",\"field\":\"cb\"},{\"value\":\"少休\",\"field\":\"sx\"},{\"value\":\"全勤\",\"field\":\"qq\"},{\"value\":\"核算应发工资\",\"field\":\"hsyfgz\"},{\"value\":\"保底\",\"field\":\"bd\"},{\"value\":\"保底请假\",\"field\":\"bdqj\"},{\"value\":\"保底底薪\",\"field\":\"bddx\"},{\"value\":\"保底补差\",\"field\":\"bdbc\"},{\"value\":\"最终应发工资\",\"field\":\"zzyfgz\"},{\"value\":\"当月培训补贴\",\"field\":\"dypxbt\"},{\"value\":\"当月交通补贴\",\"field\":\"dyjtbt\"},{\"value\":\"上月培训补贴\",\"field\":\"sypxbt\"},{\"value\":\"上月交通补贴\",\"field\":\"syjtbt\"},{\"value\":\"补贴合计\",\"field\":\"bthj\"},{\"value\":\"缺卡\",\"field\":\"qk\"},{\"value\":\"迟到\",\"field\":\"cd\"},{\"value\":\"请假\",\"field\":\"qj\"},{\"value\":\"扣社保\",\"field\":\"ksb\"},{\"value\":\"扣除奖励\",\"field\":\"kcjl\"},{\"value\":\"扣住宿\",\"field\":\"kzs\"},{\"value\":\"扣学习期\",\"field\":\"kxxq\"},{\"value\":\"扣工作服\",\"field\":\"kgzf\"},{\"value\":\"扣款合计\",\"field\":\"kkhj\"},{\"value\":\"发奖金\",\"field\":\"fjj\"},{\"value\":\"退手机押金\",\"field\":\"tsjyj\"},{\"value\":\"退住宿押金\",\"field\":\"tzsyj\"},{\"value\":\"实发工资\",\"field\":\"sfgz\"},{\"value\":\"当月是否发放\",\"field\":\"dysfff\"},{\"value\":\"支付金额\",\"field\":\"zfje\"},{\"value\":\"待支付金额\",\"field\":\"dzjfe\"},{\"value\":\"补发上月\",\"field\":\"bfsy\"},{\"value\":\"当月支付总额\",\"field\":\"dyzfze\"},{\"value\":\"总业绩\",\"field\":\"zyj\"},]".ToList(); ExcelConfig excelconfig = new ExcelConfig(); excelconfig.FileName = "工资全字段.xls"; excelconfig.HeadFont = "微软雅黑"; @@ -554,11 +559,7 @@ namespace NCC.Extend.LqGz 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") - }; + var output = new { name = excelconfig.FileName, url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fileName, "NCC") }; return output; } @@ -578,7 +579,7 @@ namespace NCC.Extend.LqGz //开启事务 _db.BeginTran(); //批量删除工资全字段 - await _db.Deleteable().In(d => d.Id,ids).ExecuteCommandAsync(); + await _db.Deleteable().In(d => d.Id, ids).ExecuteCommandAsync(); //关闭事务 _db.CommitTran(); } @@ -602,7 +603,8 @@ namespace NCC.Extend.LqGz { var entity = input.Adapt(); var isOk = await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); - if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1001); + if (!(isOk > 0)) + throw NCCException.Oh(ErrorCode.COM1001); } /// @@ -615,7 +617,8 @@ namespace NCC.Extend.LqGz var entity = await _db.Queryable().FirstAsync(p => p.Id == id); _ = entity ?? throw NCCException.Oh(ErrorCode.COM1005); var isOk = await _db.Deleteable().Where(d => d.Id == id).ExecuteCommandAsync(); - if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1002); + if (!(isOk > 0)) + throw NCCException.Oh(ErrorCode.COM1002); } #region 业绩计算相关方法 @@ -625,14 +628,14 @@ namespace NCC.Extend.LqGz /// /// /// 根据薪酬规则计算个人的基础业绩、合作业绩、奖励业绩、门店总业绩、队伍业绩等 - /// + /// /// 计算逻辑: /// 1. 基础业绩:从开单品项明细表中统计,基于项目资料中的基础服务提成 /// 2. 合作业绩:从开单品项明细表中统计,基于项目资料中的合作项目设置 /// 3. 奖励业绩:从奖励明细表中统计 /// 4. 门店总业绩:该员工所在门店的所有业绩总和 /// 5. 队伍业绩:该员工所在金三角战队的所有业绩总和 - /// + /// /// 示例请求: /// ```json /// { @@ -641,7 +644,7 @@ namespace NCC.Extend.LqGz /// "calculationMonth": "2025-01" /// } /// ``` - /// + /// /// 参数说明: /// - employeeId: 员工ID(必填) /// - storeId: 门店ID(必填) @@ -663,30 +666,29 @@ namespace NCC.Extend.LqGz { EmployeeId = input.EmployeeId, StoreId = input.StoreId, - CalculationMonth = input.CalculationMonth + CalculationMonth = input.CalculationMonth, }; // 1. 计算基础业绩 result.BasicPerformance = await CalculateBasicPerformance(input.EmployeeId, input.StoreId, input.CalculationMonth); - + // 2. 计算合作业绩 result.CooperationPerformance = await CalculateCooperationPerformance(input.EmployeeId, input.StoreId, input.CalculationMonth); - + // 3. 计算奖励业绩 result.RewardPerformance = await CalculateRewardPerformance(input.EmployeeId, input.StoreId, input.CalculationMonth); - + // 4. 计算总业绩 result.TotalPerformance = result.BasicPerformance + result.CooperationPerformance + result.RewardPerformance; - + // 5. 计算门店总业绩 result.StoreTotalPerformance = await CalculateStoreTotalPerformance(input.StoreId, input.CalculationMonth); - + // 6. 计算队伍业绩 result.TeamPerformance = await CalculateTeamPerformance(input.EmployeeId, input.StoreId, input.CalculationMonth); - + // 7. 计算占比 - result.PerformanceRatio = result.StoreTotalPerformance > 0 ? - Math.Round(result.TotalPerformance / result.StoreTotalPerformance * 100, 2) : 0; + result.PerformanceRatio = result.StoreTotalPerformance > 0 ? Math.Round(result.TotalPerformance / result.StoreTotalPerformance * 100, 2) : 0; _logger.LogInformation($"业绩计算完成 - 员工ID: {input.EmployeeId}, 总业绩: {result.TotalPerformance}, 门店总业绩: {result.StoreTotalPerformance}"); @@ -711,11 +713,7 @@ namespace NCC.Extend.LqGz var basicPerformance = await _db.Queryable() .LeftJoin((px, xm) => px.Px == xm.Xmbh) .LeftJoin((px, xm, kd) => px.Glkdbh == kd.Id) - .Where((px, xm, kd) => - kd.Djmd == storeId && - kd.Kdrq >= startDate && - kd.Kdrq <= endDate && - (px.Px == employeeId || px.Px.Contains(employeeId))) // 根据实际情况调整匹配条件 + .Where((px, xm, kd) => kd.Djmd == storeId && kd.Kdrq >= startDate && kd.Kdrq <= endDate && (px.Px == employeeId || px.Px.Contains(employeeId))) // 根据实际情况调整匹配条件 .SumAsync((px, xm, kd) => px.Pxjg * xm.Jcfwtc / 100); return basicPerformance; @@ -733,12 +731,16 @@ namespace NCC.Extend.LqGz var cooperationPerformance = await _db.Queryable() .LeftJoin((px, xm) => px.Px == xm.Xmbh) .LeftJoin((px, xm, kd) => px.Glkdbh == kd.Id) - .Where((px, xm, kd) => - kd.Djmd == storeId && - kd.Kdrq >= startDate && - kd.Kdrq <= endDate && - kd.Hgjg != null && kd.Hgjg != "" && // 有合作机构 - (px.Px == employeeId || px.Px.Contains(employeeId))) + .Where( + (px, xm, kd) => + kd.Djmd == storeId + && kd.Kdrq >= startDate + && kd.Kdrq <= endDate + && kd.Hgjg != null + && kd.Hgjg != "" + && // 有合作机构 + (px.Px == employeeId || px.Px.Contains(employeeId)) + ) .SumAsync((px, xm, kd) => px.Pxjg * 0.65m); // 合作业绩按65%计算 return cooperationPerformance; @@ -751,10 +753,7 @@ namespace NCC.Extend.LqGz { // 从奖励明细表中统计奖励业绩 var rewardPerformance = await _db.Queryable() - .Where(jl => - jl.Mdbh == storeId && - jl.Jks == employeeId && - jl.Hj != null && jl.Hj != "") + .Where(jl => jl.Mdbh == storeId && jl.Jks == employeeId && jl.Hj != null && jl.Hj != "") .SumAsync(jl => Convert.ToDecimal(jl.Hj)); return rewardPerformance; @@ -769,12 +768,7 @@ namespace NCC.Extend.LqGz var endDate = startDate.AddMonths(1).AddDays(-1); // 从开单记录表中统计门店总业绩 - var storeTotalPerformance = await _db.Queryable() - .Where(kd => - kd.Djmd == storeId && - kd.Kdrq >= startDate && - kd.Kdrq <= endDate) - .SumAsync(kd => kd.Zdyj); + var storeTotalPerformance = await _db.Queryable().Where(kd => kd.Djmd == storeId && kd.Kdrq >= startDate && kd.Kdrq <= endDate).SumAsync(kd => kd.Zdyj); return storeTotalPerformance; } @@ -785,12 +779,7 @@ namespace NCC.Extend.LqGz private async Task CalculateTeamPerformance(string employeeId, string storeId, string calculationMonth) { // 先获取员工所在的金三角战队 - var goldenTriangle = await _db.Queryable() - .Where(jsj => - jsj.Md == storeId && - jsj.Yf == calculationMonth && - jsj.Jsj.Contains(employeeId)) - .FirstAsync(); + var goldenTriangle = await _db.Queryable().Where(jsj => jsj.Md == storeId && jsj.Yf == calculationMonth && jsj.Jsj.Contains(employeeId)).FirstAsync(); if (goldenTriangle == null) { @@ -802,11 +791,7 @@ namespace NCC.Extend.LqGz // 统计该战队所有成员的业绩 var teamPerformance = await _db.Queryable() - .Where(kd => - kd.Djmd == storeId && - kd.Kdrq >= startDate && - kd.Kdrq <= endDate && - goldenTriangle.Jsj.Contains(kd.Jsj)) + .Where(kd => kd.Djmd == storeId && kd.Kdrq >= startDate && kd.Kdrq <= endDate && goldenTriangle.Jsj.Contains(kd.Jsj)) .SumAsync(kd => kd.Zdyj); return teamPerformance; @@ -817,7 +802,7 @@ namespace NCC.Extend.LqGz /// /// /// 批量更新指定月份所有员工的业绩数据 - /// + /// /// 示例请求: /// ```json /// { @@ -825,7 +810,7 @@ namespace NCC.Extend.LqGz /// "storeIds": ["门店ID1", "门店ID2"] /// } /// ``` - /// + /// /// 参数说明: /// - calculationMonth: 计算月份,格式:YYYYMM(必填) /// - storeIds: 门店ID列表(可选,为空则更新所有门店) @@ -846,9 +831,7 @@ namespace NCC.Extend.LqGz var errorCount = 0; // 获取需要更新的工资记录 - var salaryRecords = await _db.Queryable() - .WhereIF(input.StoreIds != null && input.StoreIds.Any(), gz => input.StoreIds.Contains(gz.Md)) - .ToListAsync(); + var salaryRecords = await _db.Queryable().WhereIF(input.StoreIds != null && input.StoreIds.Any(), gz => input.StoreIds.Contains(gz.Md)).ToListAsync(); foreach (var record in salaryRecords) { @@ -859,7 +842,7 @@ namespace NCC.Extend.LqGz { EmployeeId = record.Xm, // 使用姓名作为员工标识 StoreId = record.Md, - CalculationMonth = input.CalculationMonth + CalculationMonth = input.CalculationMonth, }; var performance = await CalculatePerformance(performanceInput); @@ -874,9 +857,15 @@ namespace NCC.Extend.LqGz record.Zb = performance.PerformanceRatio; await _db.Updateable(record) - .UpdateColumns(gz => new { - gz.Jcyj, gz.Hzyj, gz.Jlyj, gz.Zyj, - gz.Mdzyj, gz.Dwyj, gz.Zb + .UpdateColumns(gz => new + { + gz.Jcyj, + gz.Hzyj, + gz.Jlyj, + gz.Zyj, + gz.Mdzyj, + gz.Dwyj, + gz.Zb, }) .ExecuteCommandAsync(); @@ -896,7 +885,7 @@ namespace NCC.Extend.LqGz Success = true, UpdatedCount = updatedCount, ErrorCount = errorCount, - Message = $"成功更新 {updatedCount} 条记录,失败 {errorCount} 条记录" + Message = $"成功更新 {updatedCount} 条记录,失败 {errorCount} 条记录", }; } catch (Exception ex) diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqHytkHytkService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqHytkHytkService.cs index 07fc53d..7f8ba96 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqHytkHytkService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqHytkHytkService.cs @@ -199,7 +199,6 @@ namespace NCC.Extend.LqHytkHytk entity.F_CreateTime = DateTime.Now; entity.F_CreateUser = userInfo.userId; entity.F_DeleteMark = 0; - entity.Tksj = DateTime.Now; entity.Czry = userInfo.userId; try @@ -224,18 +223,19 @@ namespace NCC.Extend.LqHytkHytk var lqHytkMxEntity = new LqHytkMxEntity { Id = YitIdHelper.NextId().ToString(), - Gltkbh = newEntity.Id, - F_CreateTime = DateTime.Now, - F_CreateUser = userInfo.userId, - F_DeleteMark = 0, + RefundInfoId = newEntity.Id, + BillingItemId = item.billingItemId, + CreateTime = DateTime.Now, + CreateUser = userInfo.userId, + 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)), + ProjectNumber = item.F_ProjectNumber ?? 1, + IsEnabled = item.F_IsEnabled ?? 1, + SourceType = item.F_SourceType, + TotalPrice = item.F_TotalPrice ?? (item.pxjg * (item.F_ProjectNumber ?? 1)), }; allMxEntities.Add(lqHytkMxEntity); @@ -357,7 +357,7 @@ namespace NCC.Extend.LqHytkHytk await _db.Updateable(entity).IgnoreColumns(true).ExecuteCommandAsync(); // 删除原有的关联数据 - await _db.Deleteable().Where(x => x.Gltkbh == id).ExecuteCommandAsync(); + await _db.Deleteable().Where(x => x.RefundInfoId == id).ExecuteCommandAsync(); await _db.Deleteable().Where(x => x.Gltkbh == id).ExecuteCommandAsync(); await _db.Deleteable().Where(x => x.Gltkbh == id).ExecuteCommandAsync(); @@ -375,18 +375,19 @@ namespace NCC.Extend.LqHytkHytk var lqHytkMxEntity = new LqHytkMxEntity { Id = YitIdHelper.NextId().ToString(), - Gltkbh = id, - F_CreateTime = DateTime.Now, - F_CreateUser = userInfo.userId, - F_DeleteMark = 0, + RefundInfoId = id, + BillingItemId = item.billingItemId, + CreateTime = DateTime.Now, + CreateUser = userInfo.userId, + 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)), + ProjectNumber = item.F_ProjectNumber ?? 1, + IsEnabled = item.F_IsEnabled ?? 1, + SourceType = item.F_SourceType, + TotalPrice = item.F_TotalPrice ?? (item.pxjg * (item.F_ProjectNumber ?? 1)), }; allMxEntities.Add(lqHytkMxEntity); @@ -524,7 +525,7 @@ namespace NCC.Extend.LqHytkHytk var output = entity.Adapt(); // 2. 查询品项明细列表 - var lqHytkMxList = await _db.Queryable().Where(w => w.Gltkbh == entity.Id).ToListAsync(); + var lqHytkMxList = await _db.Queryable().Where(w => w.RefundInfoId == entity.Id).ToListAsync(); // 3. 查询健康师业绩列表 var lqHytkJksyjList = await _db.Queryable().Where(w => w.Gltkbh == entity.Id).ToListAsync(); @@ -539,15 +540,16 @@ namespace NCC.Extend.LqHytkHytk var mxOutput = new LqHytkMxInfoOutput { id = mx.Id, - gltkbh = mx.Gltkbh, + refundInfoId = mx.RefundInfoId, + billingItemId = mx.BillingItemId, 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, + projectNumber = mx.ProjectNumber, + isEnabled = mx.IsEnabled, + sourceType = mx.SourceType, + totalPrice = mx.TotalPrice, }; // 关联该品项的健康师业绩 diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs index 448898c..9a16689 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs @@ -16,8 +16,11 @@ using NCC.Common.Model.NPOI; using NCC.DataEncryption; using NCC.Dependency; using NCC.DynamicApiController; +using NCC.Extend.Entitys.Dto.Common; using NCC.Extend.Entitys.Dto.LqKdKdjlb; +using NCC.Extend.Entitys.Enum; using NCC.Extend.Entitys.lq_jinsanjiao_user; +using NCC.Extend.Entitys.lq_kd_deductinfo; using NCC.Extend.Entitys.lq_kd_jksyj; using NCC.Extend.Entitys.lq_kd_kdjlb; using NCC.Extend.Entitys.lq_kd_kjbsyj; @@ -252,6 +255,8 @@ namespace NCC.Extend.LqKdKdjlb var userInfo = await _userManager.GetUserInfo(); var entity = input.Adapt(); entity.Id = YitIdHelper.NextId().ToString(); + entity.CreateTime = DateTime.Now; + entity.UpdateTime = DateTime.Now; try { //开启事务 @@ -264,7 +269,20 @@ namespace NCC.Extend.LqKdKdjlb var allPxmxEntities = new List(); var allJksyjEntities = new List(); var allKjbsyjEntities = new List(); - + var allDeductEntities = new List(); + // 处理扣款信息列表 + foreach (var item in input.lqKdKdjlbDeductList) + { + var lqKdDeductEntity = new LqKdDeductinfoEntity + { + Id = YitIdHelper.NextId().ToString(), + BillingId = newEntity.Id, + DeductId = item.DeductId, + DeductType = item.DeductType, + Amount = item.Amount, + }; + allDeductEntities.Add(lqKdDeductEntity); + } // 处理品项明细列表 foreach (var item in input.lqKdPxmxList) { @@ -276,8 +294,8 @@ namespace NCC.Extend.LqKdKdjlb CreateTIme = DateTime.Now, MemberId = entity.Kdhy, IsEnabled = 0, - ProjectNumber = item.projectNumber ?? 1, - TotalPrice = (decimal)(item.pxjg * (item.projectNumber ?? 1)), + ProjectNumber = item.projectNumber, + TotalPrice = (decimal)(item.pxjg * item.projectNumber), Px = item.px, Pxmc = item.pxmc, Pxjg = item.pxjg, @@ -300,7 +318,7 @@ namespace NCC.Extend.LqKdKdjlb Jksxm = ijks_tem.jksxm, Jkszh = ijks_tem.jkszh, Jksyj = ijks_tem.jksyj, - Yjsj = DateTime.Now, + Yjsj = input.kdrq, Jsj_id = ijks_tem.jsj_id, Kdpxid = lqKdPxmxEntity.Id, } @@ -322,14 +340,18 @@ namespace NCC.Extend.LqKdKdjlb Kjblsxm = ikjbs_tem.kjblsxm, Kjblszh = ikjbs_tem.kjblszh, Kjblsyj = ikjbs_tem.kjblsyj, - Yjsj = DateTime.Now, + Yjsj = input.kdrq, Kdpxid = lqKdPxmxEntity.Id, } ); } } } - + // 批量插入扣款信息 + if (allDeductEntities.Any()) + { + await _db.Insertable(allDeductEntities).ExecuteCommandAsync(); + } // 批量插入品项明细 if (allPxmxEntities.Any()) { @@ -345,6 +367,7 @@ namespace NCC.Extend.LqKdKdjlb { await _db.Insertable(allKjbsyjEntities).ExecuteCommandAsync(); } + //关闭事务 _db.CommitTran(); @@ -634,8 +657,8 @@ namespace NCC.Extend.LqKdKdjlb CreateTIme = DateTime.Now, MemberId = entity.Kdhy, IsEnabled = 0, - ProjectNumber = item.projectNumber ?? 1, - TotalPrice = (decimal)(item.pxjg * (item.projectNumber ?? 1)), + ProjectNumber = item.projectNumber == 0 ? 1 : item.projectNumber, + TotalPrice = (decimal)(item.pxjg * (item.projectNumber == 0 ? 1 : item.projectNumber)), Px = item.px, Pxmc = item.pxmc, Pxjg = item.pxjg, @@ -753,5 +776,24 @@ namespace NCC.Extend.LqKdKdjlb } } #endregion + + #region 获取扣款类型枚举内容 + /// + /// 获取扣款类型枚举内容 + /// + /// 扣款类型枚举列表 + [HttpGet("deduct-types")] + public List GetDeductTypes() + { + return Enum.GetValues() + .Select(e => new EnumOutput + { + Value = (int)e, + Name = e.ToString(), + Description = e.GetDescription(), + }) + .ToList(); + } + #endregion } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs index 53cca4c..b396a74 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs @@ -548,155 +548,34 @@ namespace NCC.Extend.LqKhxx { throw NCCException.Oh(ErrorCode.COM1000, "会员ID不能为空"); } - try { - _logger.LogInformation("开始查询会员剩余品项,会员ID:{MemberId}", memberId); - // 1. 查询会员基本信息 var memberInfo = await _db.Queryable().Where(x => x.Id == memberId).FirstAsync(); - if (memberInfo == null) { _logger.LogWarning("会员不存在,会员ID:{MemberId}", memberId); - throw NCCException.Oh(ErrorCode.COM1005, "会员不存在"); + throw NCCException.Oh("会员不存在"); } - - _logger.LogInformation("会员信息查询成功,会员姓名:{MemberName}", memberInfo.Khmc); - // 2. 查询开单记录ID列表 - _logger.LogInformation("开始查询开单记录ID列表"); - var orderIds = await _db.Queryable().Where(kd => kd.Kdhy == memberId).Select(kd => kd.Id).ToListAsync(); - - _logger.LogInformation("开单记录ID列表查询成功,数量:{Count}", orderIds.Count); - - // 3. 查询开单品项统计(按品项ID、名称、价格和来源类型分组) - _logger.LogInformation("开始查询开单品项统计"); - var purchasedItems = new List(); - if (orderIds.Any()) - { - var tempPurchasedItems = await _db.Queryable() - .Where(px => orderIds.Contains(px.Glkdbh)) - .GroupBy(px => new - { - px.Px, - px.Pxmc, - px.Pxjg, - px.SourceType, - }) - .Select(px => new - { - ItemId = px.Px, - ItemName = px.Pxmc, - ItemPrice = px.Pxjg, - SourceType = SqlFunc.IsNull(px.SourceType, "未知"), - TotalPurchased = SqlFunc.AggregateSum(SqlFunc.ToDecimal(px.ProjectNumber)), - }) - .ToListAsync(); - - purchasedItems = tempPurchasedItems.Cast().ToList(); - _logger.LogInformation("开单品项统计查询成功,数量:{Count}", purchasedItems.Count); - - // 调试:输出前几条记录查看SourceType字段 - foreach (var item in purchasedItems.Take(3)) - { - _logger.LogInformation($"调试 - 品项ID: {item.ItemId}, 品项名称: {item.ItemName}, 来源类型: {item.SourceType}"); - } - } - - // 4. 查询耗卡记录ID列表 - _logger.LogInformation("开始查询耗卡记录ID列表"); - var consumeIds = await _db.Queryable().Where(hk => hk.Hy == memberId).Select(hk => hk.Id).ToListAsync(); - - _logger.LogInformation("耗卡记录ID列表查询成功,数量:{Count}", consumeIds.Count); - - // 5. 查询耗卡品项统计(按品项ID和来源类型分组) - _logger.LogInformation("开始查询耗卡品项统计"); - var consumedItems = new List(); - if (consumeIds.Any()) - { - var tempConsumedItems = await _db.Queryable() - .Where(px => consumeIds.Contains(px.Glkdbh)) - .GroupBy(px => new { px.Px, px.SourceType }) - .Select(px => new - { - ItemId = px.Px, - SourceType = SqlFunc.IsNull(px.SourceType, "未知"), - ConsumedCount = SqlFunc.AggregateSum(SqlFunc.ToDecimal(px.ProjectNumber)), - }) - .ToListAsync(); - - consumedItems = tempConsumedItems.Cast().ToList(); - _logger.LogInformation("耗卡品项统计查询成功,数量:{Count}", consumedItems.Count); - } - - // 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(); - - // 处理有购买记录的品项 - foreach (var purchased in purchasedItems) - { - // 按品项ID和来源类型匹配耗卡记录 - var consumed = consumedItems.FirstOrDefault(x => x.ItemId == purchased.ItemId && x.SourceType == purchased.SourceType); - var consumedCount = consumed?.ConsumedCount ?? 0; - - // 按品项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) + var remainingItems = await _db.Queryable() + .Where(x => x.MemberId == memberId) + .Select(x => new RemainingItemInfo { - remainingItems.Add( - new RemainingItemInfo - { - ItemId = purchased.ItemId, - ItemName = purchased.ItemName, - ItemPrice = purchased.ItemPrice, - SourceType = purchased.SourceType?.ToString() ?? "未知", - TotalPurchased = purchased.TotalPurchased, - ConsumedCount = consumedCount, - RefundedCount = refundedCount, - RemainingCount = remainingCount, - } - ); - } - } - - // 7. 按剩余数量降序排列 - remainingItems = remainingItems.OrderByDescending(x => x.RemainingCount).ToList(); - - _logger.LogInformation("剩余品项计算完成,数量:{Count}", remainingItems.Count); - + BillingItemId = x.Id, + ItemId = x.Px, + ItemName = x.Pxmc, + ItemPrice = x.Pxjg, + SourceType = x.SourceType, + TotalPurchased = x.ProjectNumber, + ConsumedCount = SqlFunc.Subqueryable().Where(y => y.BillingItemId == x.Id).Sum(y => SqlFunc.ToDecimal(y.ProjectNumber)), + RefundedCount = SqlFunc.Subqueryable().Where(y => y.BillingItemId == x.Id).Sum(y => SqlFunc.ToDecimal(y.ProjectNumber)), + RemainingCount = + x.ProjectNumber + - SqlFunc.Subqueryable().Where(y => y.BillingItemId == x.Id).Sum(y => SqlFunc.ToDecimal(y.ProjectNumber)) + - SqlFunc.Subqueryable().Where(y => y.BillingItemId == x.Id).Sum(y => SqlFunc.ToDecimal(y.ProjectNumber)), + }) + .ToListAsync(); return new MemberRemainingItemsOutput { MemberId = memberId, diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqStatisticsService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqStatisticsService.cs index 6827432..291c93d 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqStatisticsService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqStatisticsService.cs @@ -13,11 +13,15 @@ using NCC.Dependency; using NCC.DynamicApiController; using NCC.Extend.Entitys.Dto.LqMdxx; using NCC.Extend.Entitys.Dto.LqStatistics; +using NCC.Extend.Entitys.Dto.LqYcsdJsj; using NCC.Extend.Entitys.lq_hytk_kjbsyj; +using NCC.Extend.Entitys.lq_jinsanjiao_user; +using NCC.Extend.Entitys.lq_kd_jksyj; using NCC.Extend.Entitys.lq_kd_kdjlb; using NCC.Extend.Entitys.lq_kd_kjbsyj; using NCC.Extend.Entitys.lq_mdxx; using NCC.Extend.Entitys.lq_xh_kjbsyj; +using NCC.Extend.Entitys.lq_ycsd_jsj; using NCC.Extend.Entitys.lq_yjmxb; using NCC.Extend.Entitys.v_tech_teacher_flow; using NCC.Extend.Interfaces.LqStatistics; @@ -1041,6 +1045,140 @@ namespace NCC.Extend.LqStatistics } #endregion + + #region 金三角业绩统计 + /// + /// 查询所有金三角的业绩统计 + /// + /// + /// 根据金三角成员状态进行不同的统计方式: + /// 1. 活跃成员:业绩计入金三角总业绩 + /// 2. 非活跃成员:按单人业绩统计,金三角名称为"门店名+姓名" + /// + /// 示例请求: + /// GET /api/Extend/LqStatistics/GetJsjPerformance?startMonth=202401&endMonth=202412 + /// + /// 参数说明: + /// - startMonth: 开始月份,格式为yyyyMM,可选 + /// - endMonth: 结束月份,格式为yyyyMM,可选 + /// - jsjId: 金三角ID,可选 + /// - storeId: 门店ID,可选 + /// + /// 返回信息包括: + /// - 金三角基本信息(ID、名称、月份、门店) + /// - 业绩统计(订单数量、总业绩、首次/最后订单日期) + /// - 统计类型(ACTIVE-活跃金三角业绩,INACTIVE-单人业绩) + /// - 成员姓名(仅单人业绩时使用) + /// + /// 查询参数 + /// 金三角业绩统计列表 + /// 查询成功 + /// 参数错误 + [HttpGet("GetJsjPerformance")] + public async Task> GetJsjPerformance([FromQuery] LqYcsdJsjPerformanceInput input) + { + var result = new List(); + + try + { + // 1. 查询活跃金三角成员的业绩(计入金三角总业绩) + var activePerformanceQuery = _db.Queryable() + .LeftJoin((jsj, user) => jsj.Id == user.JsjId && user.Status == "ACTIVE" && user.DeleteMark == 0) + .LeftJoin((jsj, user, jksyj) => jsj.Id == jksyj.Jsj_id && user.UserId == jksyj.Jkszh) + .LeftJoin((jsj, user, jksyj, md) => jsj.Md == md.Id) + .Where((jsj, user, jksyj, md) => jsj.Yf != null && jksyj.Yjsj != null && jksyj.Jksyj != null && jksyj.Jksyj != "" && jksyj.Jksyj != "0") + .WhereIF(!string.IsNullOrEmpty(input.StartMonth), (jsj, user, jksyj, md) => jsj.Yf.CompareTo(input.StartMonth) >= 0) + .WhereIF(!string.IsNullOrEmpty(input.EndMonth), (jsj, user, jksyj, md) => jsj.Yf.CompareTo(input.EndMonth) <= 0) + .WhereIF(!string.IsNullOrEmpty(input.JsjId), (jsj, user, jksyj, md) => jsj.Id == input.JsjId) + .WhereIF(!string.IsNullOrEmpty(input.StoreId), (jsj, user, jksyj, md) => jsj.Md == input.StoreId) + .GroupBy( + (jsj, user, jksyj, md) => + new + { + jsj.Id, + jsj.Jsj, + jsj.Yf, + jsj.Md, + md.Dm, + } + ) + .Select( + (jsj, user, jksyj, md) => + new LqYcsdJsjPerformanceOutput + { + JsjId = jsj.Id, + JsjName = jsj.Jsj, + Month = jsj.Yf, + StoreId = jsj.Md, + StoreName = md.Dm, + OrderCount = SqlFunc.AggregateCount(jksyj.Glkdbh), + TotalPerformance = SqlFunc.AggregateSum(SqlFunc.ToDecimal(jksyj.Jksyj)), + LastOrderDate = SqlFunc.AggregateMax(jksyj.Yjsj), + FirstOrderDate = SqlFunc.AggregateMin(jksyj.Yjsj), + StatisticsType = "ACTIVE", + MemberName = null, + } + ); + + var activeResults = await activePerformanceQuery.ToListAsync(); + result.AddRange(activeResults); + + // 2. 查询非活跃金三角成员的业绩(按单人业绩统计) + var inactivePerformanceQuery = _db.Queryable() + .LeftJoin((user, jsj) => user.JsjId == jsj.Id) + .LeftJoin((user, jsj, jksyj) => user.UserId == jksyj.Jkszh) + .LeftJoin((user, jsj, jksyj, md) => jsj.Md == md.Id) + .Where( + (user, jsj, jksyj, md) => + user.Status == "INACTIVE" && user.DeleteMark == 0 && jsj.Yf != null && jksyj.Yjsj != null && jksyj.Jksyj != null && jksyj.Jksyj != "" && jksyj.Jksyj != "0" + ) + .WhereIF(!string.IsNullOrEmpty(input.StartMonth), (user, jsj, jksyj, md) => jsj.Yf.CompareTo(input.StartMonth) >= 0) + .WhereIF(!string.IsNullOrEmpty(input.EndMonth), (user, jsj, jksyj, md) => jsj.Yf.CompareTo(input.EndMonth) <= 0) + .WhereIF(!string.IsNullOrEmpty(input.JsjId), (user, jsj, jksyj, md) => jsj.Id == input.JsjId) + .WhereIF(!string.IsNullOrEmpty(input.StoreId), (user, jsj, jksyj, md) => jsj.Md == input.StoreId) + .GroupBy( + (user, jsj, jksyj, md) => + new + { + user.Id, + user.UserName, + jsjId = jsj.Id, + jsj.Yf, + jsj.Md, + md.Dm, + } + ) + .Select( + (user, jsj, jksyj, md) => + new LqYcsdJsjPerformanceOutput + { + JsjId = user.Id, // 使用用户ID作为标识 + JsjName = md.Dm + "-" + user.UserName, // 门店名+姓名 + Month = jsj.Yf, + StoreId = jsj.Md, + StoreName = md.Dm, + OrderCount = SqlFunc.AggregateCount(jksyj.Glkdbh), + TotalPerformance = SqlFunc.AggregateSum(SqlFunc.ToDecimal(jksyj.Jksyj)), + LastOrderDate = SqlFunc.AggregateMax(jksyj.Yjsj), + FirstOrderDate = SqlFunc.AggregateMin(jksyj.Yjsj), + StatisticsType = "INACTIVE", + MemberName = user.UserName, + } + ); + + var inactiveResults = await inactivePerformanceQuery.ToListAsync(); + result.AddRange(inactiveResults); + + // 3. 按月份和业绩排序 + return result.OrderByDescending(x => x.Month).ThenByDescending(x => x.TotalPerformance).ToList(); + } + catch (Exception ex) + { + _logger.LogError(ex, "查询金三角业绩统计时发生错误"); + throw NCCException.Oh(ErrorCode.COM1001, "查询金三角业绩统计失败"); + } + } + #endregion } /// diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs index 2e75879..d1026f3 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs @@ -16,6 +16,7 @@ using NCC.DataEncryption; using NCC.Dependency; using NCC.DynamicApiController; using NCC.Extend.Entitys.Dto.LqTkjlb; +using NCC.Extend.Entitys.lq_event; using NCC.Extend.Entitys.lq_eventuser; using NCC.Extend.Entitys.lq_khxx; using NCC.Extend.Entitys.lq_ryzl; @@ -32,7 +33,7 @@ namespace NCC.Extend.LqTkjlb /// /// 拓客管理服务 /// - [ApiDescriptionSettings(Tag = "Extend", Name = "LqTkjlb", Order = 200)] + [ApiDescriptionSettings(Tag = "绿纤拓客管理服务", Name = "LqTkjlb", Order = 200)] [Route("api/Extend/[controller]")] public class LqTkjlbService : ILqTkjlbService, IDynamicApiController, ITransient { @@ -59,9 +60,29 @@ namespace NCC.Extend.LqTkjlb [HttpGet("{id}")] public async Task GetInfo(string id) { - var entity = await _db.Queryable().FirstAsync(p => p.Id == id); - var output = entity.Adapt(); - return output; + // 使用SqlFunc在查询时直接获取用户名和活动名称 + var result = await _db.Queryable() + .Where(p => p.Id == id) + .Select(p => new LqTkjlbInfoOutput + { + id = p.Id, + expansionTime = p.ExpansionTime, + expansionUserId = p.ExpansionUserId, + expansionUserName = SqlFunc.Subqueryable().Where(u => u.Id == p.ExpansionUserId).Select(u => u.RealName), + customerName = p.CustomerName, + customerPhone = p.CustomerPhone, + buyNumber = p.BuyNumber, + paymentMethod = p.PaymentMethod, + isAddWeChat = p.IsAddWeChat, + remarks = p.Remarks, + storeId = p.StoreId, + teamName = p.TeamName, + eventId = p.EventId, + eventName = SqlFunc.Subqueryable().Where(e => e.Id == p.EventId).Select(e => e.EventName), + }) + .FirstAsync(); + + return result; } #endregion @@ -76,37 +97,39 @@ namespace NCC.Extend.LqTkjlb public async Task GetList([FromQuery] LqTkjlbListQueryInput input) { var sidx = input.sidx == null ? "id" : input.sidx; - List queryTksj = input.tksj != null ? input.tksj.Split(',').ToObeject>() : null; + List queryTksj = input.expansionTime != null ? input.expansionTime.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(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.tkry), p => p.Tkry.Equals(input.tkry)) - .WhereIF(!string.IsNullOrEmpty(input.gkxm), p => p.Gkxm.Contains(input.gkxm)) - .WhereIF(!string.IsNullOrEmpty(input.dhhm), p => p.Dhhm.Contains(input.dhhm)) - .WhereIF(!string.IsNullOrEmpty(input.gmzs), p => p.Gmzs.Equals(input.gmzs)) - .WhereIF(!string.IsNullOrEmpty(input.zffs), p => p.Zffs.Equals(input.zffs)) - .WhereIF(!string.IsNullOrEmpty(input.sfjwx), p => p.Sfjwx.Equals(input.sfjwx)) - .WhereIF(!string.IsNullOrEmpty(input.bz), p => p.Bz.Contains(input.bz)) - .WhereIF(!string.IsNullOrEmpty(input.ssmd), p => p.Ssmd.Contains(input.ssmd)) - .WhereIF(!string.IsNullOrEmpty(input.sszd), p => p.Sszd.Contains(input.sszd)) + .WhereIF(queryTksj != null, p => p.ExpansionTime >= new DateTime(startTksj.ToDate().Year, startTksj.ToDate().Month, startTksj.ToDate().Day, 0, 0, 0)) + .WhereIF(queryTksj != null, p => p.ExpansionTime <= new DateTime(endTksj.ToDate().Year, endTksj.ToDate().Month, endTksj.ToDate().Day, 23, 59, 59)) + .WhereIF(!string.IsNullOrEmpty(input.expansionUserId), p => p.ExpansionUserId.Equals(input.expansionUserId)) + .WhereIF(!string.IsNullOrEmpty(input.customerName), p => p.CustomerName.Contains(input.customerName)) + .WhereIF(!string.IsNullOrEmpty(input.customerPhone), p => p.CustomerPhone.Contains(input.customerPhone)) + .WhereIF(!string.IsNullOrEmpty(input.buyNumber), p => p.BuyNumber.Equals(input.buyNumber)) + .WhereIF(!string.IsNullOrEmpty(input.paymentMethod), p => p.PaymentMethod.Equals(input.paymentMethod)) + .WhereIF(!string.IsNullOrEmpty(input.isAddWeChat), p => p.IsAddWeChat.Equals(input.isAddWeChat)) + .WhereIF(!string.IsNullOrEmpty(input.remarks), p => p.Remarks.Contains(input.remarks)) + .WhereIF(!string.IsNullOrEmpty(input.storeId), p => p.StoreId.Contains(input.storeId)) + .WhereIF(!string.IsNullOrEmpty(input.teamName), p => p.TeamName.Contains(input.teamName)) + .WhereIF(!string.IsNullOrEmpty(input.eventId), p => p.EventId.Contains(input.eventId)) .Select(it => new LqTkjlbListOutput { id = it.Id, - tksj = it.Tksj, - // tkry=it.Tkry, - tkry = SqlFunc.Subqueryable().Where(u => u.MobilePhone == it.Tkry).Select(u => u.RealName), - - gkxm = it.Gkxm, - dhhm = it.Dhhm, - gmzs = it.Gmzs, - zffs = it.Zffs, - sfjwx = it.Sfjwx, - bz = it.Bz, - ssmd = it.Ssmd, - sszd = it.Sszd, + expansionTime = it.ExpansionTime, + expansionUserId = it.ExpansionUserId, + expansionUserName = SqlFunc.Subqueryable().Where(u => u.MobilePhone == it.ExpansionUserId).Select(u => u.RealName), + customerName = it.CustomerName, + customerPhone = it.CustomerPhone, + buyNumber = it.BuyNumber, + paymentMethod = it.PaymentMethod, + isAddWeChat = it.IsAddWeChat, + remarks = it.Remarks, + storeId = it.StoreId, + teamName = it.TeamName, + eventId = it.EventId, + eventName = SqlFunc.Subqueryable().Where(u => u.Id == it.EventId).Select(u => u.EventName), }) .MergeTable() .OrderBy(sidx + " " + input.sort) @@ -126,7 +149,7 @@ namespace NCC.Extend.LqTkjlb { var userInfo = await _userManager.GetUserInfo(); //通过input.dhhm去查询用户信息 - var user = _db.Queryable().Where(u => u.Sjh == input.dhhm).Any(); + var user = _db.Queryable().Where(u => u.Sjh == input.customerPhone).Any(); if (user) { throw NCCException.Oh("该手机号码已存在于会员或线索池中"); @@ -135,19 +158,27 @@ namespace NCC.Extend.LqTkjlb var result = await _db.Ado.UseTranAsync(async () => { //通过input.eventId去查询拓客活动信息 - var eventUserInfo = await _db.Queryable().Where(u => u.EventId == input.eventId && u.UserId == input.tkry).FirstAsync(); + var eventUserInfoList = await _db.Queryable().Where(u => u.EventId == input.eventId && u.UserId == input.expansionUserId).ToListAsync(); + if (eventUserInfoList == null || eventUserInfoList.Count == 0) + { + throw NCCException.Oh("未找到对应的拓客活动用户信息,请确认活动ID和用户ID是否正确"); + } + var eventUserInfo = eventUserInfoList.First(); // 创建拓客记录 var entity = input.Adapt(); entity.Id = YitIdHelper.NextId().ToString(); - entity.Sszd = eventUserInfo.TeamName; + entity.TeamName = eventUserInfo.TeamName; + entity.StoreId = eventUserInfo.StoreId; + entity.DepId = eventUserInfo.DepId; + entity.ExpansionTime = DateTime.Now; var isOk = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync(); if (!(isOk > 0)) throw NCCException.Oh("创建拓客记录失败"); // 创建客户信息 LqKhxxEntity MemberInfo = new LqKhxxEntity(); MemberInfo.Id = YitIdHelper.NextId().ToString(); - MemberInfo.Khmc = entity.Gkxm; - MemberInfo.Sjh = input.dhhm; // 设置手机号 + MemberInfo.Khmc = entity.CustomerName; + MemberInfo.Sjh = input.customerPhone; // 设置手机号 MemberInfo.Khmqgs = "线索池"; MemberInfo.Dah = "GK" + DateTime.Now.ToString("yyyyMMddHHmmss"); var memberResult = await _db.Insertable(MemberInfo).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync(); @@ -173,35 +204,42 @@ namespace NCC.Extend.LqTkjlb public async Task GetNoPagingList([FromQuery] LqTkjlbListQueryInput 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; + List queryExpansionTime = input.expansionTime != null ? input.expansionTime.Split(',').ToObeject>() : null; + DateTime? startExpansionTime = queryExpansionTime != null ? Ext.GetDateTime(queryExpansionTime.First()) : null; + DateTime? endExpansionTime = queryExpansionTime != null ? Ext.GetDateTime(queryExpansionTime.Last()) : null; var data = await _db.Queryable() .WhereIF(!string.IsNullOrEmpty(input.id), p => p.Id.Contains(input.id)) - .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.tkry), p => p.Tkry.Equals(input.tkry)) - .WhereIF(!string.IsNullOrEmpty(input.gkxm), p => p.Gkxm.Contains(input.gkxm)) - .WhereIF(!string.IsNullOrEmpty(input.dhhm), p => p.Dhhm.Contains(input.dhhm)) - .WhereIF(!string.IsNullOrEmpty(input.gmzs), p => p.Gmzs.Equals(input.gmzs)) - .WhereIF(!string.IsNullOrEmpty(input.zffs), p => p.Zffs.Equals(input.zffs)) - .WhereIF(!string.IsNullOrEmpty(input.sfjwx), p => p.Sfjwx.Equals(input.sfjwx)) - .WhereIF(!string.IsNullOrEmpty(input.bz), p => p.Bz.Contains(input.bz)) - .WhereIF(!string.IsNullOrEmpty(input.ssmd), p => p.Ssmd.Contains(input.ssmd)) - .WhereIF(!string.IsNullOrEmpty(input.sszd), p => p.Sszd.Contains(input.sszd)) + .WhereIF( + queryExpansionTime != null, + p => p.ExpansionTime >= new DateTime(startExpansionTime.ToDate().Year, startExpansionTime.ToDate().Month, startExpansionTime.ToDate().Day, 0, 0, 0) + ) + .WhereIF(queryExpansionTime != null, p => p.ExpansionTime <= new DateTime(endExpansionTime.ToDate().Year, endExpansionTime.ToDate().Month, endExpansionTime.ToDate().Day, 23, 59, 59)) + .WhereIF(!string.IsNullOrEmpty(input.expansionUserId), p => p.ExpansionUserId.Equals(input.expansionUserId)) + .WhereIF(!string.IsNullOrEmpty(input.customerName), p => p.CustomerName.Contains(input.customerName)) + .WhereIF(!string.IsNullOrEmpty(input.customerPhone), p => p.CustomerPhone.Contains(input.customerPhone)) + .WhereIF(!string.IsNullOrEmpty(input.buyNumber), p => p.BuyNumber.ToString().Equals(input.buyNumber)) + .WhereIF(!string.IsNullOrEmpty(input.paymentMethod), p => p.PaymentMethod.Equals(input.paymentMethod)) + .WhereIF(!string.IsNullOrEmpty(input.isAddWeChat), p => p.IsAddWeChat.Equals(input.isAddWeChat)) + .WhereIF(!string.IsNullOrEmpty(input.remarks), p => p.Remarks.Contains(input.remarks)) + .WhereIF(!string.IsNullOrEmpty(input.storeId), p => p.StoreId.Contains(input.storeId)) + .WhereIF(!string.IsNullOrEmpty(input.teamName), p => p.TeamName.Contains(input.teamName)) + .WhereIF(!string.IsNullOrEmpty(input.eventId), p => p.EventId.Equals(input.eventId)) .Select(it => new LqTkjlbListOutput { id = it.Id, - tksj = it.Tksj, - tkry = it.Tkry, - gkxm = it.Gkxm, - dhhm = it.Dhhm, - gmzs = it.Gmzs, - zffs = it.Zffs, - sfjwx = it.Sfjwx, - bz = it.Bz, - ssmd = it.Ssmd, - sszd = it.Sszd, + expansionTime = it.ExpansionTime, + expansionUserId = it.ExpansionUserId, + expansionUserName = it.ExpansionUserId, // 这里需要根据实际业务逻辑获取用户名 + customerName = it.CustomerName, + customerPhone = it.CustomerPhone, + buyNumber = it.BuyNumber, + paymentMethod = it.PaymentMethod, + isAddWeChat = it.IsAddWeChat, + remarks = it.Remarks, + storeId = it.StoreId, + teamName = it.TeamName, + eventId = it.EventId, + eventName = it.EventId, // 这里需要根据实际业务逻辑获取活动名称 }) .MergeTable() .OrderBy(sidx + " " + input.sort) @@ -328,10 +366,13 @@ namespace NCC.Extend.LqTkjlb [HttpGet("Actions/GetRanking")] public async Task GetRanking() { - var data = await _db.Queryable().GroupBy(it => it.Sszd).Select(it => new LqTkjlbRankingOutput { sszd = it.Sszd, tkrs = SqlFunc.AggregateCount(it.Id) }).ToListAsync(); + var data = await _db.Queryable() + .GroupBy(it => it.TeamName) + .Select(it => new LqTkjlbRankingOutput { teamName = it.TeamName, expansionUserCount = SqlFunc.AggregateCount(it.Id) }) + .ToListAsync(); // 在内存中排序并添加排名 - var sortedData = data.OrderByDescending(it => it.tkrs).ToList(); + var sortedData = data.OrderByDescending(it => it.expansionUserCount).ToList(); for (int i = 0; i < sortedData.Count; i++) { sortedData[i].ranking = i + 1; @@ -352,18 +393,18 @@ namespace NCC.Extend.LqTkjlb var result = new List(); // 获取所有战队 - var teams = await _db.Queryable().GroupBy(it => it.Sszd).Select(it => it.Sszd).ToListAsync(); + var teams = await _db.Queryable().GroupBy(it => it.TeamName).Select(it => it.TeamName).ToListAsync(); foreach (var team in teams) { // 获取该战队所有人员的拓客数据 var teamMembers = await _db.Queryable() - .Where(it => it.Sszd == team) - .GroupBy(it => it.Tkry) + .Where(it => it.TeamName == team) + .GroupBy(it => it.ExpansionUserId) .Select(it => new { // tkry = it.Tkry, - tkry = SqlFunc.Subqueryable().Where(u => u.MobilePhone == it.Tkry).Select(u => u.RealName), + tkry = SqlFunc.Subqueryable().Where(u => u.Id == it.ExpansionUserId).Select(u => u.RealName), tkrs = SqlFunc.AggregateCount(it.Id), }) .ToListAsync(); diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqXhHyhkService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqXhHyhkService.cs index d26b412..a8823b4 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqXhHyhkService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqXhHyhkService.cs @@ -1,37 +1,37 @@ -using NCC.Common.Core.Manager; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Mapster; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using NCC.ClayObject; +using NCC.Common.Configuration; +using NCC.Common.Core.Manager; using NCC.Common.Enum; using NCC.Common.Extension; using NCC.Common.Filter; +using NCC.Common.Helper; +using NCC.Common.Model.NPOI; +using NCC.DataEncryption; using NCC.Dependency; using NCC.DynamicApiController; -using NCC.FriendlyException; -using NCC.Extend.Interfaces.LqXhHyhk; using NCC.Extend.Entitys.Dto.LqXhHyhk; -using Mapster; -using Microsoft.AspNetCore.Mvc; -using SqlSugar; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; +using NCC.Extend.Entitys.Dto.LqXhJksyj; +using NCC.Extend.Entitys.Dto.LqXhKjbsyj; +using NCC.Extend.Entitys.Dto.LqXhPxmx; +using NCC.Extend.Entitys.lq_kd_kdjlb; +using NCC.Extend.Entitys.lq_kd_pxmx; +using NCC.Extend.Entitys.lq_khxx; using NCC.Extend.Entitys.lq_xh_hyhk; using NCC.Extend.Entitys.lq_xh_jksyj; using NCC.Extend.Entitys.lq_xh_kjbsyj; using NCC.Extend.Entitys.lq_xh_pxmx; -using NCC.Extend.Entitys.lq_kd_pxmx; -using NCC.Extend.Entitys.lq_kd_kdjlb; -using NCC.Extend.Entitys.lq_khxx; -using Microsoft.Extensions.Logging; -using Yitter.IdGenerator; -using NCC.Common.Helper; +using NCC.Extend.Interfaces.LqXhHyhk; +using NCC.FriendlyException; using NCC.JsonSerialization; -using NCC.Common.Model.NPOI; -using NCC.Common.Configuration; -using NCC.DataEncryption; -using NCC.ClayObject; -using NCC.Extend.Entitys.Dto.LqXhJksyj; -using NCC.Extend.Entitys.Dto.LqXhKjbsyj; -using NCC.Extend.Entitys.Dto.LqXhPxmx; +using SqlSugar; +using Yitter.IdGenerator; namespace NCC.Extend.LqXhHyhk { @@ -59,7 +59,8 @@ namespace NCC.Extend.LqXhHyhk ISqlSugarRepository lqXhKjbsyjRepository, ISqlSugarRepository lqXhPxmxRepository, IUserManager userManager, - ILogger logger) + ILogger logger + ) { _lqXhHyhkRepository = lqXhHyhkRepository; _db = _lqXhHyhkRepository.Context; @@ -77,7 +78,7 @@ namespace NCC.Extend.LqXhHyhk /// /// 获取耗卡记录及其关联的品项明细、健康师业绩、科技部老师业绩信息 /// 按照耗卡的完整格式返回数据,不包含汇总信息 - /// + /// /// 返回数据结构: /// - 主表信息:耗卡基础信息、门店信息、会员信息等 /// - 品项明细列表:每个品项包含完整的项目信息(项目次数、是否有效、来源类型等) @@ -104,19 +105,13 @@ namespace NCC.Extend.LqXhHyhk var output = entity.Adapt(); // 2. 查询品项明细列表 - var lqXhPxmxList = await _db.Queryable() - .Where(w => w.Glkdbh == entity.Id) - .ToListAsync(); + var lqXhPxmxList = await _db.Queryable().Where(w => w.ConsumeInfoId == entity.Id).ToListAsync(); // 3. 查询健康师业绩列表 - var lqXhJksyjList = await _db.Queryable() - .Where(w => w.Glkdbh == entity.Id) - .ToListAsync(); + 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(); + var lqXhKjbsyjList = await _db.Queryable().Where(w => w.Glkdbh == entity.Id).ToListAsync(); // 5. 构建品项明细输出,每个品项关联对应的业绩信息 var pxmxOutputList = new List(); @@ -125,17 +120,17 @@ namespace NCC.Extend.LqXhHyhk var pxmxOutput = new LqXhPxmxInfoOutput { id = pxmx.Id, - glkdbh = pxmx.Glkdbh, + consumeInfoId = pxmx.ConsumeInfoId, + billingItemId = pxmx.BillingItemId, 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 + totalPrice = pxmx.TotalPrice, }; // 关联该品项的健康师业绩 @@ -209,7 +204,10 @@ namespace NCC.Extend.LqXhHyhk sfykjb = it.Sfykjb, hksj = it.Hksj, czry = it.Czry, - }).MergeTable().OrderBy(sidx + " " + input.sort).ToPagedListAsync(input.currentPage, input.pageSize); + }) + .MergeTable() + .OrderBy(sidx + " " + input.sort) + .ToPagedListAsync(input.currentPage, input.pageSize); return PageResult.SqlSugarPageResult(data); } #endregion @@ -220,7 +218,7 @@ namespace NCC.Extend.LqXhHyhk /// /// /// 创建会员耗卡记录及其关联的品项明细、健康师业绩、科技部老师业绩信息 - /// + /// /// 示例请求: /// ```json /// { @@ -245,7 +243,7 @@ namespace NCC.Extend.LqXhHyhk /// ] /// } /// ``` - /// + /// /// 参数说明: /// - hyid: 会员ID /// - hkmd: 耗卡门店 @@ -262,8 +260,8 @@ namespace NCC.Extend.LqXhHyhk var userInfo = await _userManager.GetUserInfo(); var entity = input.Adapt(); entity.Id = YitIdHelper.NextId().ToString(); - entity.Hksj = DateTime.Now; entity.Czry = _userManager.UserId; + entity.CreateTime = DateTime.Now; try { // 开启事务 @@ -283,7 +281,8 @@ namespace NCC.Extend.LqXhHyhk var lqXhPxmxEntity = new LqXhPxmxEntity { Id = YitIdHelper.NextId().ToString(), - Glkdbh = newEntity.Id, + ConsumeInfoId = newEntity.Id, + BillingItemId = item.billingItemId, CreateTIme = DateTime.Now, MemberId = entity.Hy, IsEnabled = 0, @@ -292,51 +291,54 @@ namespace NCC.Extend.LqXhHyhk Px = item.px, Pxmc = item.pxmc, Pxjg = item.pxjg, - Xfzs = item.xfzs, SourceType = item.sourceType, }; allPxmxEntities.Add(lqXhPxmxEntity); - + // 收集该品项关联的健康师业绩 if (item.lqXhJksyjList != null && item.lqXhJksyjList.Any()) { foreach (var ijks_tem in item.lqXhJksyjList) { - allJksyjEntities.Add(new LqXhJksyjEntity - { - Id = YitIdHelper.NextId().ToString(), - Glkdbh = newEntity.Id, - Jks = ijks_tem.jks, - Jksxm = ijks_tem.jksxm, - Jkszh = ijks_tem.jkszh, - Jksyj = ijks_tem.jksyj, - Yjsj = DateTime.Now, - JsjId = ijks_tem.jsjId, - Kdpxid = lqXhPxmxEntity.Id, - LaborCost = ijks_tem.laborCost, - KdpxNumber = ijks_tem.kdpxNumber, - }); + allJksyjEntities.Add( + new LqXhJksyjEntity + { + Id = YitIdHelper.NextId().ToString(), + Glkdbh = newEntity.Id, + Jks = ijks_tem.jks, + Jksxm = ijks_tem.jksxm, + Jkszh = ijks_tem.jkszh, + Jksyj = ijks_tem.jksyj, + Yjsj = DateTime.Now, + JsjId = ijks_tem.jsjId, + Kdpxid = lqXhPxmxEntity.Id, + LaborCost = ijks_tem.laborCost, + KdpxNumber = ijks_tem.kdpxNumber, + } + ); } } - + // 收集该品项关联的科技部老师业绩 if (item.lqXhKjbsyjList != null && item.lqXhKjbsyjList.Any()) { foreach (var ikjbs_tem in item.lqXhKjbsyjList) { - allKjbsyjEntities.Add(new LqXhKjbsyjEntity - { - Id = YitIdHelper.NextId().ToString(), - Glkdbh = newEntity.Id, - Kjbls = ikjbs_tem.kjbls, - Kjblsxm = ikjbs_tem.kjblsxm, - Kjblszh = ikjbs_tem.kjblszh, - Kjblsyj = ikjbs_tem.kjblsyj, - Yjsj = DateTime.Now, - Hkpxid = lqXhPxmxEntity.Id, - LaborCost = ikjbs_tem.laborCost, - HdpxNumber = ikjbs_tem.hdpxNumber, - }); + allKjbsyjEntities.Add( + new LqXhKjbsyjEntity + { + Id = YitIdHelper.NextId().ToString(), + Glkdbh = newEntity.Id, + Kjbls = ikjbs_tem.kjbls, + Kjblsxm = ikjbs_tem.kjblsxm, + Kjblszh = ikjbs_tem.kjblszh, + Kjblsyj = ikjbs_tem.kjblsyj, + Yjsj = DateTime.Now, + Hkpxid = lqXhPxmxEntity.Id, + LaborCost = ikjbs_tem.laborCost, + HdpxNumber = ikjbs_tem.hdpxNumber, + } + ); } } } @@ -413,7 +415,10 @@ namespace NCC.Extend.LqXhHyhk sfykjb = it.Sfykjb, hksj = it.Hksj, czry = it.Czry, - }).MergeTable().OrderBy(sidx + " " + input.sort).ToListAsync(); + }) + .MergeTable() + .OrderBy(sidx + " " + input.sort) + .ToListAsync(); return data; } #endregion @@ -438,7 +443,8 @@ namespace NCC.Extend.LqXhHyhk { exportData = await this.GetNoPagingList(input); } - List paramList = "[{\"value\":\"耗卡编号\",\"field\":\"id\"},{\"value\":\"门店\",\"field\":\"md\"},{\"value\":\"门店编号\",\"field\":\"mdbh\"},{\"value\":\"门店名称\",\"field\":\"mdmc\"},{\"value\":\"会员\",\"field\":\"hy\"},{\"value\":\"会员账号\",\"field\":\"hyzh\"},{\"value\":\"会员名称\",\"field\":\"hymc\"},{\"value\":\"顾客类型\",\"field\":\"gklx\"},{\"value\":\"消费金额\",\"field\":\"xfje\"},{\"value\":\"手工费用\",\"field\":\"sgfy\"},{\"value\":\"是否有科技部\",\"field\":\"sfykjb\"},{\"value\":\"耗卡时间\",\"field\":\"hksj\"},{\"value\":\"操作人员\",\"field\":\"czry\"},]".ToList(); + List paramList = + "[{\"value\":\"耗卡编号\",\"field\":\"id\"},{\"value\":\"门店\",\"field\":\"md\"},{\"value\":\"门店编号\",\"field\":\"mdbh\"},{\"value\":\"门店名称\",\"field\":\"mdmc\"},{\"value\":\"会员\",\"field\":\"hy\"},{\"value\":\"会员账号\",\"field\":\"hyzh\"},{\"value\":\"会员名称\",\"field\":\"hymc\"},{\"value\":\"顾客类型\",\"field\":\"gklx\"},{\"value\":\"消费金额\",\"field\":\"xfje\"},{\"value\":\"手工费用\",\"field\":\"sgfy\"},{\"value\":\"是否有科技部\",\"field\":\"sfykjb\"},{\"value\":\"耗卡时间\",\"field\":\"hksj\"},{\"value\":\"操作人员\",\"field\":\"czry\"},]".ToList(); ExcelConfig excelconfig = new ExcelConfig(); excelconfig.FileName = "会员耗卡.xls"; excelconfig.HeadFont = "微软雅黑"; @@ -457,11 +463,7 @@ namespace NCC.Extend.LqXhHyhk 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") - }; + var output = new { name = excelconfig.FileName, url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fileName, "NCC") }; return output; } #endregion @@ -492,7 +494,7 @@ namespace NCC.Extend.LqXhHyhk await _db.Deleteable().In(u => u.Glkdbh, ids).ExecuteCommandAsync(); //清空子表数据 - await _db.Deleteable().In(u => u.Glkdbh, ids).ExecuteCommandAsync(); + await _db.Deleteable().In(u => u.ConsumeInfoId, ids).ExecuteCommandAsync(); //关闭事务 _db.CommitTran(); } @@ -521,7 +523,7 @@ namespace NCC.Extend.LqXhHyhk { //开启事务 _db.BeginTran(); - + entity.UpdateTime = DateTime.Now; //更新会员耗卡记录 await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); @@ -530,7 +532,7 @@ namespace NCC.Extend.LqXhHyhk await _db.Deleteable().Where(u => u.Glkdbh == id).ExecuteCommandAsync(); //清空原有数据 - await _db.Deleteable().Where(u => u.Glkdbh == id).ExecuteCommandAsync(); + await _db.Deleteable().Where(u => u.ConsumeInfoId == id).ExecuteCommandAsync(); // 收集所有需要插入的实体,然后批量插入 var allPxmxEntities = new List(); @@ -546,7 +548,8 @@ namespace NCC.Extend.LqXhHyhk var lqXhPxmxEntity = new LqXhPxmxEntity { Id = YitIdHelper.NextId().ToString(), - Glkdbh = entity.Id, + ConsumeInfoId = entity.Id, + BillingItemId = item.billingItemId, CreateTIme = DateTime.Now, MemberId = entity.Hy, IsEnabled = 0, @@ -555,51 +558,54 @@ namespace NCC.Extend.LqXhHyhk Px = item.px, Pxmc = item.pxmc, Pxjg = item.pxjg, - Xfzs = item.xfzs, SourceType = item.sourceType, }; allPxmxEntities.Add(lqXhPxmxEntity); - + // 收集该品项关联的健康师业绩 if (item.lqXhJksyjList != null && item.lqXhJksyjList.Any()) { foreach (var ijks_tem in item.lqXhJksyjList) { - allJksyjEntities.Add(new LqXhJksyjEntity - { - Id = YitIdHelper.NextId().ToString(), - Glkdbh = entity.Id, - Jks = ijks_tem.jks, - Jksxm = ijks_tem.jksxm, - Jkszh = ijks_tem.jkszh, - Jksyj = ijks_tem.jksyj, - Yjsj = DateTime.Now, - JsjId = ijks_tem.jsjId, - Kdpxid = lqXhPxmxEntity.Id, - LaborCost = ijks_tem.laborCost, - KdpxNumber = ijks_tem.kdpxNumber, - }); + allJksyjEntities.Add( + new LqXhJksyjEntity + { + Id = YitIdHelper.NextId().ToString(), + Glkdbh = entity.Id, + Jks = ijks_tem.jks, + Jksxm = ijks_tem.jksxm, + Jkszh = ijks_tem.jkszh, + Jksyj = ijks_tem.jksyj, + Yjsj = DateTime.Now, + JsjId = ijks_tem.jsjId, + Kdpxid = lqXhPxmxEntity.Id, + LaborCost = ijks_tem.laborCost, + KdpxNumber = ijks_tem.kdpxNumber, + } + ); } } - + // 收集该品项关联的科技部老师业绩 if (item.lqXhKjbsyjList != null && item.lqXhKjbsyjList.Any()) { foreach (var ikjbs_tem in item.lqXhKjbsyjList) { - allKjbsyjEntities.Add(new LqXhKjbsyjEntity - { - Id = YitIdHelper.NextId().ToString(), - Glkdbh = entity.Id, - Kjbls = ikjbs_tem.kjbls, - Kjblsxm = ikjbs_tem.kjblsxm, - Kjblszh = ikjbs_tem.kjblszh, - Kjblsyj = ikjbs_tem.kjblsyj, - Yjsj = DateTime.Now, - Hkpxid = lqXhPxmxEntity.Id, - LaborCost = ikjbs_tem.laborCost, - HdpxNumber = ikjbs_tem.hdpxNumber, - }); + allKjbsyjEntities.Add( + new LqXhKjbsyjEntity + { + Id = YitIdHelper.NextId().ToString(), + Glkdbh = entity.Id, + Kjbls = ikjbs_tem.kjbls, + Kjblsxm = ikjbs_tem.kjblsxm, + Kjblszh = ikjbs_tem.kjblszh, + Kjblsyj = ikjbs_tem.kjblsyj, + Yjsj = DateTime.Now, + Hkpxid = lqXhPxmxEntity.Id, + LaborCost = ikjbs_tem.laborCost, + HdpxNumber = ikjbs_tem.hdpxNumber, + } + ); } } } @@ -658,7 +664,7 @@ namespace NCC.Extend.LqXhHyhk await _db.Deleteable().Where(u => u.Glkdbh == id).ExecuteCommandAsync(); //清空子表数据 - await _db.Deleteable().Where(u => u.Glkdbh == id).ExecuteCommandAsync(); + await _db.Deleteable().Where(u => u.ConsumeInfoId == id).ExecuteCommandAsync(); //关闭事务 _db.CommitTran(); diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqXhmxbService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqXhmxbService.cs index 5aaa4e8..02af8f3 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqXhmxbService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqXhmxbService.cs @@ -1,34 +1,34 @@ -using NCC.Common.Core.Manager; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Mapster; +using Microsoft.AspNetCore.Mvc; +using NCC.ClayObject; +using NCC.Common.Configuration; +using NCC.Common.Core.Manager; using NCC.Common.Enum; using NCC.Common.Extension; using NCC.Common.Filter; +using NCC.Common.Helper; +using NCC.Common.Model.NPOI; +using NCC.DataEncryption; using NCC.Dependency; using NCC.DynamicApiController; -using NCC.FriendlyException; +using NCC.Extend.Entitys.Dto.LqXhmxb; +using NCC.Extend.Entitys.lq_xhmxb; using NCC.Extend.Interfaces.LqXhmxb; -using Mapster; -using Microsoft.AspNetCore.Mvc; +using NCC.FriendlyException; +using NCC.JsonSerialization; using SqlSugar; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using NCC.Extend.Entitys.lq_xhmxb; -using NCC.Extend.Entitys.Dto.LqXhmxb; using Yitter.IdGenerator; -using NCC.Common.Helper; -using NCC.JsonSerialization; -using NCC.Common.Model.NPOI; -using NCC.Common.Configuration; -using NCC.DataEncryption; -using NCC.ClayObject; namespace NCC.Extend.LqXhmxb { /// /// 消耗明细表服务 /// - [ApiDescriptionSettings(Tag = "Extend",Name = "LqXhmxb", Order = 200)] + [ApiDescriptionSettings(Tag = "Extend", Name = "LqXhmxb", Order = 200)] [Route("api/Extend/[controller]")] public class LqXhmxbService : ILqXhmxbService, IDynamicApiController, ITransient { @@ -39,11 +39,9 @@ namespace NCC.Extend.LqXhmxb /// /// 初始化一个类型的新实例 /// - public LqXhmxbService( - ISqlSugarRepository lqXhmxbRepository, - IUserManager userManager) + public LqXhmxbService(ISqlSugarRepository lqXhmxbRepository, IUserManager userManager) { - _lqXhmxbRepository = lqXhmxbRepository; + _lqXhmxbRepository = lqXhmxbRepository; _db = _lqXhmxbRepository.Context; _userManager = userManager; } @@ -62,10 +60,10 @@ namespace NCC.Extend.LqXhmxb } /// - /// 获取消耗明细表列表 - /// - /// 请求参数 - /// + /// 获取消耗明细表列表 + /// + /// 请求参数 + /// [HttpGet("")] public async Task GetList([FromQuery] LqXhmxbListQueryInput input) { @@ -85,24 +83,27 @@ namespace NCC.Extend.LqXhmxb .WhereIF(!string.IsNullOrEmpty(input.qtsg2), p => p.Qtsg2.Contains(input.qtsg2)) .WhereIF(!string.IsNullOrEmpty(input.qtsg3), p => p.Qtsg3.Contains(input.qtsg3)) .WhereIF(!string.IsNullOrEmpty(input.sghj), p => p.Sghj.Contains(input.sghj)) - .Select(it=> new LqXhmxbListOutput + .Select(it => new LqXhmxbListOutput { id = it.Id, - mdbh=it.Mdbh, - mdmc=it.Mdmc, - bmbh=it.Bmbh, - bmmc=it.Bmmc, - ygbh=it.Ygbh, - ygmc=it.Ygmc, - xms=it.Xms, - xh=it.Xh, - sg=it.Sg, - qtsg1=it.Qtsg1, - qtsg2=it.Qtsg2, - qtsg3=it.Qtsg3, - sghj=it.Sghj, - }).MergeTable().OrderBy(sidx+" "+input.sort).ToPagedListAsync(input.currentPage, input.pageSize); - return PageResult.SqlSugarPageResult(data); + mdbh = it.Mdbh, + mdmc = it.Mdmc, + bmbh = it.Bmbh, + bmmc = it.Bmmc, + ygbh = it.Ygbh, + ygmc = it.Ygmc, + xms = it.Xms, + xh = it.Xh, + sg = it.Sg, + qtsg1 = it.Qtsg1, + qtsg2 = it.Qtsg2, + qtsg3 = it.Qtsg3, + sghj = it.Sghj, + }) + .MergeTable() + .OrderBy(sidx + " " + input.sort) + .ToPagedListAsync(input.currentPage, input.pageSize); + return PageResult.SqlSugarPageResult(data); } /// @@ -117,14 +118,15 @@ namespace NCC.Extend.LqXhmxb var entity = input.Adapt(); entity.Id = YitIdHelper.NextId().ToString(); var isOk = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync(); - if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1000); + if (!(isOk > 0)) + throw NCCException.Oh(ErrorCode.COM1000); } /// - /// 获取消耗明细表无分页列表 - /// - /// 请求参数 - /// + /// 获取消耗明细表无分页列表 + /// + /// 请求参数 + /// [NonAction] public async Task GetNoPagingList([FromQuery] LqXhmxbListQueryInput input) { @@ -144,31 +146,34 @@ namespace NCC.Extend.LqXhmxb .WhereIF(!string.IsNullOrEmpty(input.qtsg2), p => p.Qtsg2.Contains(input.qtsg2)) .WhereIF(!string.IsNullOrEmpty(input.qtsg3), p => p.Qtsg3.Contains(input.qtsg3)) .WhereIF(!string.IsNullOrEmpty(input.sghj), p => p.Sghj.Contains(input.sghj)) - .Select(it=> new LqXhmxbListOutput + .Select(it => new LqXhmxbListOutput { id = it.Id, - mdbh=it.Mdbh, - mdmc=it.Mdmc, - bmbh=it.Bmbh, - bmmc=it.Bmmc, - ygbh=it.Ygbh, - ygmc=it.Ygmc, - xms=it.Xms, - xh=it.Xh, - sg=it.Sg, - qtsg1=it.Qtsg1, - qtsg2=it.Qtsg2, - qtsg3=it.Qtsg3, - sghj=it.Sghj, - }).MergeTable().OrderBy(sidx+" "+input.sort).ToListAsync(); - return data; + mdbh = it.Mdbh, + mdmc = it.Mdmc, + bmbh = it.Bmbh, + bmmc = it.Bmmc, + ygbh = it.Ygbh, + ygmc = it.Ygmc, + xms = it.Xms, + xh = it.Xh, + sg = it.Sg, + qtsg1 = it.Qtsg1, + qtsg2 = it.Qtsg2, + qtsg3 = it.Qtsg3, + sghj = it.Sghj, + }) + .MergeTable() + .OrderBy(sidx + " " + input.sort) + .ToListAsync(); + return data; } /// - /// 导出消耗明细表 - /// - /// 请求参数 - /// + /// 导出消耗明细表 + /// + /// 请求参数 + /// [HttpGet("Actions/Export")] public async Task Export([FromQuery] LqXhmxbListQueryInput input) { @@ -183,7 +188,8 @@ namespace NCC.Extend.LqXhmxb { exportData = await this.GetNoPagingList(input); } - List paramList = "[{\"value\":\"消耗编号\",\"field\":\"id\"},{\"value\":\"门店编号\",\"field\":\"mdbh\"},{\"value\":\"门店名称\",\"field\":\"mdmc\"},{\"value\":\"部门编号\",\"field\":\"bmbh\"},{\"value\":\"部门名称\",\"field\":\"bmmc\"},{\"value\":\"员工编号\",\"field\":\"ygbh\"},{\"value\":\"员工名称\",\"field\":\"ygmc\"},{\"value\":\"项目数\",\"field\":\"xms\"},{\"value\":\"消耗\",\"field\":\"xh\"},{\"value\":\"手工\",\"field\":\"sg\"},{\"value\":\"其它手工1\",\"field\":\"qtsg1\"},{\"value\":\"其它手工2\",\"field\":\"qtsg2\"},{\"value\":\"其它手工3\",\"field\":\"qtsg3\"},{\"value\":\"手工合计\",\"field\":\"sghj\"},]".ToList(); + List paramList = + "[{\"value\":\"消耗编号\",\"field\":\"id\"},{\"value\":\"门店编号\",\"field\":\"mdbh\"},{\"value\":\"门店名称\",\"field\":\"mdmc\"},{\"value\":\"部门编号\",\"field\":\"bmbh\"},{\"value\":\"部门名称\",\"field\":\"bmmc\"},{\"value\":\"员工编号\",\"field\":\"ygbh\"},{\"value\":\"员工名称\",\"field\":\"ygmc\"},{\"value\":\"项目数\",\"field\":\"xms\"},{\"value\":\"消耗\",\"field\":\"xh\"},{\"value\":\"手工\",\"field\":\"sg\"},{\"value\":\"其它手工1\",\"field\":\"qtsg1\"},{\"value\":\"其它手工2\",\"field\":\"qtsg2\"},{\"value\":\"其它手工3\",\"field\":\"qtsg3\"},{\"value\":\"手工合计\",\"field\":\"sghj\"},]".ToList(); ExcelConfig excelconfig = new ExcelConfig(); excelconfig.FileName = "消耗明细表.xls"; excelconfig.HeadFont = "微软雅黑"; @@ -202,11 +208,7 @@ namespace NCC.Extend.LqXhmxb 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") - }; + var output = new { name = excelconfig.FileName, url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fileName, "NCC") }; return output; } @@ -226,7 +228,7 @@ namespace NCC.Extend.LqXhmxb //开启事务 _db.BeginTran(); //批量删除消耗明细表 - await _db.Deleteable().In(d => d.Id,ids).ExecuteCommandAsync(); + await _db.Deleteable().In(d => d.Id, ids).ExecuteCommandAsync(); //关闭事务 _db.CommitTran(); } @@ -250,7 +252,8 @@ namespace NCC.Extend.LqXhmxb { var entity = input.Adapt(); var isOk = await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); - if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1001); + if (!(isOk > 0)) + throw NCCException.Oh(ErrorCode.COM1001); } /// @@ -263,7 +266,8 @@ namespace NCC.Extend.LqXhmxb var entity = await _db.Queryable().FirstAsync(p => p.Id == id); _ = entity ?? throw NCCException.Oh(ErrorCode.COM1005); var isOk = await _db.Deleteable().Where(d => d.Id == id).ExecuteCommandAsync(); - if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1002); + if (!(isOk > 0)) + throw NCCException.Oh(ErrorCode.COM1002); } } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs index 132eb52..ad88e2f 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Globalization; using System.Linq; using System.Threading.Tasks; @@ -81,7 +82,7 @@ namespace NCC.Extend.LqYcsdJsj var output = entity.Adapt(); // 获取成员信息 - var members = await _db.Queryable() + var members = await _db.Queryable() .Where(x => x.JsjId == id && x.Status == "ACTIVE") .OrderBy(x => x.SortOrder) .Select(x => new @@ -194,6 +195,81 @@ namespace NCC.Extend.LqYcsdJsj } #endregion + #region 根据用户和月份获取金三角信息 + /// + /// 根据用户和时间获取金三角信息 + /// + /// + /// 根据指定的用户ID和时间,从时间中提取月份,查询该用户在该月份的金三角信息。 + /// + /// 示例请求: + /// GET /api/Extend/LqYcsdJsj/GetJsjInfoByUserMonth?userId=123456&dateTime=2024-12-15%2014:30:00 + /// + /// 参数说明: + /// - userId: 用户ID,必填 + /// - dateTime: 时间,格式为yyyy-MM-dd HH:mm:ss,必填 + /// + /// 返回信息包括: + /// - 金三角基本信息(ID、名称、月份) + /// - 门店信息(ID、名称) + /// - 用户信息(ID、姓名、是否顾问、状态、排序) + /// + /// 查询参数 + /// 金三角信息 + /// 查询成功 + /// 参数错误 + /// 未找到相关数据 + [HttpGet("GetJsjInfoByUserMonth")] + public async Task GetJsjInfoByUserMonth([FromQuery] LqYcsdJsjByUserMonthInput input) + { + if (string.IsNullOrEmpty(input.UserId)) + { + throw NCCException.Oh(ErrorCode.COM1001, "用户ID不能为空"); + } + + if (input.DateTime == default(DateTime)) + { + throw NCCException.Oh(ErrorCode.COM1001, "时间不能为空"); + } + + // 从时间中提取月份(格式:yyyyMM) + var month = input.DateTime.ToString("yyyyMM"); + + // 先查询用户的金三角关联信息 + var jsjUser = await _db.Queryable().Where(x => x.UserId == input.UserId && x.DeleteMark == 0).FirstAsync(); + + if (jsjUser == null) + { + return null; + } + + // 查询金三角信息 + var jsj = await _db.Queryable().Where(x => x.Id == jsjUser.JsjId && x.Yf == month).FirstAsync(); + + if (jsj == null) + { + return null; + } + + // 查询门店信息 + var store = await _db.Queryable().Where(x => x.Id == jsj.Md).FirstAsync(); + + return new LqYcsdJsjByUserMonthOutput + { + JsjId = jsj.Id, + JsjName = jsj.Jsj, + Month = jsj.Yf, + StoreId = jsj.Md, + StoreName = store?.Dm, + UserId = jsjUser.UserId, + UserName = jsjUser.UserName, + IsLeader = jsjUser.IsLeader, + Status = jsjUser.Status, + SortOrder = jsjUser.SortOrder, + }; + } + #endregion + #region 新建金三角 /// /// 新建金三角 @@ -474,7 +550,7 @@ namespace NCC.Extend.LqYcsdJsj } var query = _db.Queryable() - .LeftJoin((jsj, jksyj) => jsj.Id == jksyj.Jsj_id) + .LeftJoin((jsj, jksyj) => jsj.Id == jksyj.Jsj_id) .LeftJoin((jsj, jksyj, md) => jsj.Md == md.Id) .Where((jsj, jksyj, md) => jsj.Yf == month) .Where((jsj, jksyj, md) => jksyj.Yjsj != null) @@ -603,12 +679,12 @@ namespace NCC.Extend.LqYcsdJsj /// private async Task CreateJsjMembers(string jsjId, List members, string creatorUserId) { - var memberEntities = new List(); + var memberEntities = new List(); for (int i = 0; i < members.Count; i++) { var member = members[i]; - var memberEntity = new LqJinsanjiaoUserEntity + var memberEntity = new NCC.Extend.Entitys.lq_jinsanjiao_user.LqJinsanjiaoUserEntity { Id = YitIdHelper.NextId().ToString(), JsjId = jsjId, diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqYyjlService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqYyjlService.cs index abca174..fc85b07 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqYyjlService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqYyjlService.cs @@ -1,34 +1,34 @@ -using NCC.Common.Core.Manager; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Mapster; +using Microsoft.AspNetCore.Mvc; +using NCC.ClayObject; +using NCC.Common.Configuration; +using NCC.Common.Core.Manager; using NCC.Common.Enum; using NCC.Common.Extension; using NCC.Common.Filter; +using NCC.Common.Helper; +using NCC.Common.Model.NPOI; +using NCC.DataEncryption; using NCC.Dependency; using NCC.DynamicApiController; -using NCC.FriendlyException; +using NCC.Extend.Entitys.Dto.LqYyjl; +using NCC.Extend.Entitys.lq_yyjl; using NCC.Extend.Interfaces.LqYyjl; -using Mapster; -using Microsoft.AspNetCore.Mvc; +using NCC.FriendlyException; +using NCC.JsonSerialization; using SqlSugar; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using NCC.Extend.Entitys.lq_yyjl; -using NCC.Extend.Entitys.Dto.LqYyjl; using Yitter.IdGenerator; -using NCC.Common.Helper; -using NCC.JsonSerialization; -using NCC.Common.Model.NPOI; -using NCC.Common.Configuration; -using NCC.DataEncryption; -using NCC.ClayObject; namespace NCC.Extend.LqYyjl { /// /// 预约记录服务 /// - [ApiDescriptionSettings(Tag = "Extend",Name = "LqYyjl", Order = 200)] + [ApiDescriptionSettings(Tag = "Extend", Name = "LqYyjl", Order = 200)] [Route("api/Extend/[controller]")] public class LqYyjlService : ILqYyjlService, IDynamicApiController, ITransient { @@ -39,11 +39,9 @@ namespace NCC.Extend.LqYyjl /// /// 初始化一个类型的新实例 /// - public LqYyjlService( - ISqlSugarRepository lqYyjlRepository, - IUserManager userManager) + public LqYyjlService(ISqlSugarRepository lqYyjlRepository, IUserManager userManager) { - _lqYyjlRepository = lqYyjlRepository; + _lqYyjlRepository = lqYyjlRepository; _db = _lqYyjlRepository.Context; _userManager = userManager; } @@ -62,10 +60,10 @@ namespace NCC.Extend.LqYyjl } /// - /// 获取预约记录列表 - /// - /// 请求参数 - /// + /// 获取预约记录列表 + /// + /// 请求参数 + /// [HttpGet("")] public async Task GetList([FromQuery] LqYyjlListQueryInput input) { @@ -96,23 +94,26 @@ namespace NCC.Extend.LqYyjl .WhereIF(queryYyjs != null, p => p.Yyjs >= new DateTime(startYyjs.ToDate().Year, startYyjs.ToDate().Month, startYyjs.ToDate().Day, 0, 0, 0)) .WhereIF(queryYyjs != null, p => p.Yyjs <= new DateTime(endYyjs.ToDate().Year, endYyjs.ToDate().Month, endYyjs.ToDate().Day, 23, 59, 59)) .WhereIF(!string.IsNullOrEmpty(input.F_Status), p => p.F_Status.Equals(input.F_Status)) - .Select(it=> new LqYyjlListOutput + .Select(it => new LqYyjlListOutput { id = it.Id, - djmd=it.Djmd, - yyr=it.Yyr, - gklx=it.Gklx, - yytyxm=it.Yytyxm, - czr=it.Czr, - czsj=it.Czsj, - gk=it.Gk, - gkxm=it.Gkxm, - yyjks=it.Yyjks, - yysj=it.Yysj, - yyjs=it.Yyjs, - F_Status=it.F_Status, - }).MergeTable().OrderBy(sidx+" "+input.sort).ToPagedListAsync(input.currentPage, input.pageSize); - return PageResult.SqlSugarPageResult(data); + djmd = it.Djmd, + yyr = it.Yyr, + gklx = it.Gklx, + yytyxm = it.Yytyxm, + czr = it.Czr, + czsj = it.Czsj, + gk = it.Gk, + gkxm = it.Gkxm, + yyjks = it.Yyjks, + yysj = it.Yysj, + yyjs = it.Yyjs, + F_Status = it.F_Status, + }) + .MergeTable() + .OrderBy(sidx + " " + input.sort) + .ToPagedListAsync(input.currentPage, input.pageSize); + return PageResult.SqlSugarPageResult(data); } /// @@ -127,16 +128,17 @@ namespace NCC.Extend.LqYyjl var entity = input.Adapt(); entity.Id = YitIdHelper.NextId().ToString(); entity.Czr = _userManager.UserId; - entity.Czsj = DateTime.Now; + entity.Czsj = DateTime.Now; var isOk = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync(); - if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1000); + if (!(isOk > 0)) + throw NCCException.Oh(ErrorCode.COM1000); } /// - /// 获取预约记录无分页列表 - /// - /// 请求参数 - /// + /// 获取预约记录无分页列表 + /// + /// 请求参数 + /// [NonAction] public async Task GetNoPagingList([FromQuery] LqYyjlListQueryInput input) { @@ -167,30 +169,33 @@ namespace NCC.Extend.LqYyjl .WhereIF(queryYyjs != null, p => p.Yyjs >= new DateTime(startYyjs.ToDate().Year, startYyjs.ToDate().Month, startYyjs.ToDate().Day, 0, 0, 0)) .WhereIF(queryYyjs != null, p => p.Yyjs <= new DateTime(endYyjs.ToDate().Year, endYyjs.ToDate().Month, endYyjs.ToDate().Day, 23, 59, 59)) .WhereIF(!string.IsNullOrEmpty(input.F_Status), p => p.F_Status.Equals(input.F_Status)) - .Select(it=> new LqYyjlListOutput + .Select(it => new LqYyjlListOutput { id = it.Id, - djmd=it.Djmd, - yyr=it.Yyr, - gklx=it.Gklx, - yytyxm=it.Yytyxm, - czr=it.Czr, - czsj=it.Czsj, - gk=it.Gk, - gkxm=it.Gkxm, - yyjks=it.Yyjks, - yysj=it.Yysj, - yyjs=it.Yyjs, - F_Status=it.F_Status, - }).MergeTable().OrderBy(sidx+" "+input.sort).ToListAsync(); - return data; + djmd = it.Djmd, + yyr = it.Yyr, + gklx = it.Gklx, + yytyxm = it.Yytyxm, + czr = it.Czr, + czsj = it.Czsj, + gk = it.Gk, + gkxm = it.Gkxm, + yyjks = it.Yyjks, + yysj = it.Yysj, + yyjs = it.Yyjs, + F_Status = it.F_Status, + }) + .MergeTable() + .OrderBy(sidx + " " + input.sort) + .ToListAsync(); + return data; } /// - /// 导出预约记录 - /// - /// 请求参数 - /// + /// 导出预约记录 + /// + /// 请求参数 + /// [HttpGet("Actions/Export")] public async Task Export([FromQuery] LqYyjlListQueryInput input) { @@ -205,7 +210,8 @@ namespace NCC.Extend.LqYyjl { exportData = await this.GetNoPagingList(input); } - List paramList = "[{\"value\":\"预约编号\",\"field\":\"id\"},{\"value\":\"单据门店\",\"field\":\"djmd\"},{\"value\":\"邀约人\",\"field\":\"yyr\"},{\"value\":\"顾客姓名\",\"field\":\"gkxm\"},{\"value\":\"操作人\",\"field\":\"czr\"},{\"value\":\"操作时间\",\"field\":\"czsj\"},{\"value\":\"预约体验项目\",\"field\":\"yytyxm\"},{\"value\":\"顾客类型\",\"field\":\"gklx\"},{\"value\":\"预约健康师\",\"field\":\"yyjks\"},{\"value\":\"预约开始时间\",\"field\":\"yysj\"},{\"value\":\"预约结束时间\",\"field\":\"yyjs\"},{\"value\":\"顾客\",\"field\":\"gk\"},{\"value\":\"预约状态\",\"field\":\"F_Status\"},]".ToList(); + List paramList = + "[{\"value\":\"预约编号\",\"field\":\"id\"},{\"value\":\"单据门店\",\"field\":\"djmd\"},{\"value\":\"邀约人\",\"field\":\"yyr\"},{\"value\":\"顾客姓名\",\"field\":\"gkxm\"},{\"value\":\"操作人\",\"field\":\"czr\"},{\"value\":\"操作时间\",\"field\":\"czsj\"},{\"value\":\"预约体验项目\",\"field\":\"yytyxm\"},{\"value\":\"顾客类型\",\"field\":\"gklx\"},{\"value\":\"预约健康师\",\"field\":\"yyjks\"},{\"value\":\"预约开始时间\",\"field\":\"yysj\"},{\"value\":\"预约结束时间\",\"field\":\"yyjs\"},{\"value\":\"顾客\",\"field\":\"gk\"},{\"value\":\"预约状态\",\"field\":\"F_Status\"},]".ToList(); ExcelConfig excelconfig = new ExcelConfig(); excelconfig.FileName = "预约记录.xls"; excelconfig.HeadFont = "微软雅黑"; @@ -224,11 +230,7 @@ namespace NCC.Extend.LqYyjl 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") - }; + var output = new { name = excelconfig.FileName, url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fileName, "NCC") }; return output; } @@ -248,7 +250,7 @@ namespace NCC.Extend.LqYyjl //开启事务 _db.BeginTran(); //批量删除预约记录 - await _db.Deleteable().In(d => d.Id,ids).ExecuteCommandAsync(); + await _db.Deleteable().In(d => d.Id, ids).ExecuteCommandAsync(); //关闭事务 _db.CommitTran(); } @@ -272,7 +274,8 @@ namespace NCC.Extend.LqYyjl { var entity = input.Adapt(); var isOk = await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); - if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1001); + if (!(isOk > 0)) + throw NCCException.Oh(ErrorCode.COM1001); } /// @@ -285,7 +288,8 @@ namespace NCC.Extend.LqYyjl var entity = await _db.Queryable().FirstAsync(p => p.Id == id); _ = entity ?? throw NCCException.Oh(ErrorCode.COM1005); var isOk = await _db.Deleteable().Where(d => d.Id == id).ExecuteCommandAsync(); - if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1002); + if (!(isOk > 0)) + throw NCCException.Oh(ErrorCode.COM1002); } } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend/NCC.Extend.csproj b/netcore/src/Modularity/Extend/NCC.Extend/NCC.Extend.csproj index a89e7d9..3b939c9 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/NCC.Extend.csproj +++ b/netcore/src/Modularity/Extend/NCC.Extend/NCC.Extend.csproj @@ -1,24 +1,19 @@  - - - net6.0 - - - - bin\Debug\$(AssemblyName).xml - - - - bin\Release\$(AssemblyName).xml - - - - - - - - - - - + + net6.0 + + + bin\Debug\$(AssemblyName).xml + + + bin\Release\$(AssemblyName).xml + + + + + + + + + diff --git a/金三角业绩统计接口说明.md b/金三角业绩统计接口说明.md new file mode 100644 index 0000000..fd5e678 --- /dev/null +++ b/金三角业绩统计接口说明.md @@ -0,0 +1,99 @@ +# 金三角业绩统计接口说明 + +## 接口概述 +新增了金三角业绩统计查询接口,根据金三角成员状态进行不同的统计方式。 + +## 接口地址 +``` +GET /api/Extend/LqYcsdJsj/GetJsjPerformance +``` + +## 功能说明 +根据金三角成员状态进行不同的统计方式: +1. **活跃成员**:业绩计入金三角总业绩 +2. **非活跃成员**:按单人业绩统计,金三角名称为"门店名+姓名" + +## 请求参数 +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| startMonth | string | 否 | 开始月份,格式:yyyyMM | +| endMonth | string | 否 | 结束月份,格式:yyyyMM | +| jsjId | string | 否 | 金三角ID,用于查询特定金三角 | +| storeId | string | 否 | 门店ID,用于查询特定门店 | + +## 响应参数 +| 字段名 | 类型 | 说明 | +|--------|------|------| +| JsjId | string | 金三角ID(非活跃成员时为用户ID) | +| JsjName | string | 金三角名称(非活跃成员时为"门店名+姓名") | +| Month | string | 月份(格式:yyyyMM) | +| StoreId | string | 门店ID | +| StoreName | string | 门店名称 | +| OrderCount | int | 订单数量 | +| TotalPerformance | decimal | 总业绩 | +| LastOrderDate | DateTime? | 最后订单日期 | +| FirstOrderDate | DateTime? | 首次订单日期 | +| StatisticsType | string | 统计类型(ACTIVE-活跃金三角业绩,INACTIVE-单人业绩) | +| MemberName | string | 成员姓名(仅单人业绩时使用) | + +## 示例请求 +``` +GET /api/Extend/LqYcsdJsj/GetJsjPerformance?startMonth=202401&endMonth=202412 +``` + +## 示例响应 +```json +{ + "code": 200, + "msg": "操作成功", + "data": [ + { + "jsjId": "123456789", + "jsjName": "金三角A组", + "month": "202412", + "storeId": "store001", + "storeName": "绿纤川音店", + "orderCount": 15, + "totalPerformance": 50000.00, + "lastOrderDate": "2024-12-15T14:30:00", + "firstOrderDate": "2024-12-01T09:00:00", + "statisticsType": "ACTIVE", + "memberName": null + }, + { + "jsjId": "987654321", + "jsjName": "绿纤川音店-张三", + "month": "202412", + "storeId": "store001", + "storeName": "绿纤川音店", + "orderCount": 8, + "totalPerformance": 25000.00, + "lastOrderDate": "2024-12-14T16:20:00", + "firstOrderDate": "2024-12-02T10:15:00", + "statisticsType": "INACTIVE", + "memberName": "张三" + } + ] +} +``` + +## 业务逻辑 +1. **活跃成员统计**: + - 查询状态为"ACTIVE"的金三角成员 + - 将业绩计入金三角总业绩 + - 按金三角分组统计 + +2. **非活跃成员统计**: + - 查询状态为"INACTIVE"的金三角成员 + - 按单人业绩统计 + - 金三角名称为"门店名+姓名"格式 + +3. **数据排序**: + - 按月份降序(最新的月份在前) + - 按总业绩降序(业绩高的在前) + +## 注意事项 +- 所有查询都是只读操作,不会修改数据库数据 +- 支持按月统计,可以指定月份范围 +- 支持按金三角ID和门店ID进行筛选 +- 返回结果包含统计类型标识,便于前端区分处理