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/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/EventTypeEnumOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/EventTypeEnumOutput.cs new file mode 100644 index 0000000..588f003 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/EventTypeEnumOutput.cs @@ -0,0 +1,25 @@ +using System.ComponentModel; + +namespace NCC.Extend.Entitys.Dto.LqEvent +{ + /// + /// 拓客类型枚举输出 + /// + public class EventTypeEnumOutput + { + /// + /// 枚举值 + /// + 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/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/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/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/LqTkjlbInfoOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTkjlb/LqTkjlbInfoOutput.cs index 56b3264..f056394 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,65 @@ namespace NCC.Extend.Entitys.Dto.LqTkjlb /// 拓客编号 /// public string id { get; set; } - + /// /// 拓客时间 /// public DateTime? tksj { get; set; } - + /// /// 拓客人员 /// public string tkry { get; set; } - + /// /// 顾客姓名 /// public string gkxm { get; set; } - + /// /// 电话号码 /// public string dhhm { get; set; } - + /// /// 购买张数 /// public int? gmzs { get; set; } - + /// /// 支付方式 /// public string zffs { get; set; } - + /// /// 是否加微信 /// public string sfjwx { get; set; } - + /// /// 备注 /// public string bz { get; set; } - + /// /// 所属门店 /// public string ssmd { get; set; } - + /// /// 所属战队 /// public string sszd { 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..abfa230 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,65 @@ namespace NCC.Extend.Entitys.Dto.LqTkjlb /// 拓客编号 /// public string id { get; set; } - + /// /// 拓客时间 /// public DateTime? tksj { get; set; } - + /// /// 拓客人员 /// public string tkry { get; set; } - + /// /// 顾客姓名 /// public string gkxm { get; set; } - + /// /// 电话号码 /// public string dhhm { get; set; } - + /// /// 购买张数 /// public int? gmzs { get; set; } - + /// /// 支付方式 /// public string zffs { get; set; } - + /// /// 是否加微信 /// public string sfjwx { get; set; } - + /// /// 备注 /// public string bz { get; set; } - + /// /// 所属门店 /// public string ssmd { get; set; } - + /// /// 所属战队 /// public string sszd { get; set; } - + + /// + /// 拓客活动id + /// + public string eventId { get; set; } + + /// + /// 拓客活动名称 + /// + public string eventName { get; set; } } } 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_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_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/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/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 08e180d..9e97358 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqEventService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqEventService.cs @@ -1,7 +1,9 @@ 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; @@ -13,6 +15,7 @@ using NCC.Dependency; using NCC.DynamicApiController; 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; @@ -92,6 +95,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) @@ -203,6 +207,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)) @@ -288,6 +296,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)) @@ -352,7 +364,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 +487,7 @@ namespace NCC.Extend.LqEvent EventTarget = eventUser.EventTarget, CreationTime = eventUser.CreationTime, CreationUser = eventUser.CreationUser, + StoreId = eventUser.StoreId, } ); } @@ -737,5 +750,40 @@ namespace NCC.Extend.LqEvent } #endregion + + #region 获取拓客类型枚举内容 + + /// + /// 获取拓客类型枚举内容 + /// + /// 拓客类型枚举列表 + [HttpGet("event-types")] + public List GetEventTypes() + { + var result = new List(); + + // 获取所有枚举值 + var enumValues = Enum.GetValues(); + + foreach (var enumValue in enumValues) + { + // 获取枚举的Description特性 + var field = enumValue.GetType().GetField(enumValue.ToString()); + var descriptionAttribute = field?.GetCustomAttributes(typeof(DescriptionAttribute), false).FirstOrDefault() as DescriptionAttribute; + + result.Add( + new EventTypeEnumOutput + { + Value = (int)enumValue, + Name = enumValue.ToString(), + Description = descriptionAttribute?.Description ?? enumValue.ToString(), + } + ); + } + + return result; + } + + #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..85f44fb 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 diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs index 6550734..6a71eac 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs @@ -252,6 +252,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 { //开启事务 @@ -300,7 +302,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,7 +324,7 @@ 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, } ); @@ -634,8 +636,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, 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..af48c14 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; @@ -61,6 +62,7 @@ namespace NCC.Extend.LqTkjlb { var entity = await _db.Queryable().FirstAsync(p => p.Id == id); var output = entity.Adapt(); + output.eventName = SqlFunc.Subqueryable().Where(u => u.Id == entity.EventId).Select(u => u.EventName); return output; } #endregion @@ -98,7 +100,6 @@ namespace NCC.Extend.LqTkjlb 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, @@ -107,6 +108,8 @@ namespace NCC.Extend.LqTkjlb bz = it.Bz, ssmd = it.Ssmd, sszd = it.Sszd, + eventId = it.EventId, + eventName = SqlFunc.Subqueryable().Where(u => u.Id == it.EventId).Select(u => u.EventName), }) .MergeTable() .OrderBy(sidx + " " + input.sort) @@ -135,7 +138,12 @@ 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.tkry).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(); diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqXhHyhkService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqXhHyhkService.cs index d26b412..5ba0a97 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.Glkdbh == 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(); @@ -135,7 +130,7 @@ namespace NCC.Extend.LqXhHyhk 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 { // 开启事务 @@ -296,47 +294,51 @@ namespace NCC.Extend.LqXhHyhk 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 @@ -521,7 +523,7 @@ namespace NCC.Extend.LqXhHyhk { //开启事务 _db.BeginTran(); - + entity.UpdateTime = DateTime.Now; //更新会员耗卡记录 await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); @@ -559,47 +561,51 @@ namespace NCC.Extend.LqXhHyhk 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, + } + ); } } } 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进行筛选 +- 返回结果包含统计类型标识,便于前端区分处理