diff --git a/.DS_Store b/.DS_Store index d45bcb1..f7d53bb 100644 --- a/.DS_Store +++ b/.DS_Store diff --git a/netcore/netcore/.DS_Store b/netcore/netcore/.DS_Store index 8349213..428a747 100644 --- a/netcore/netcore/.DS_Store +++ b/netcore/netcore/.DS_Store diff --git a/netcore/src/.DS_Store b/netcore/src/.DS_Store index 3353ee1..eb1f690 100644 --- a/netcore/src/.DS_Store +++ b/netcore/src/.DS_Store diff --git a/netcore/src/Application/.DS_Store b/netcore/src/Application/.DS_Store index 1f866c2..fc78486 100644 --- a/netcore/src/Application/.DS_Store +++ b/netcore/src/Application/.DS_Store diff --git a/netcore/src/Application/NCC.API/.DS_Store b/netcore/src/Application/NCC.API/.DS_Store index 76012f3..fe916be 100644 --- a/netcore/src/Application/NCC.API/.DS_Store +++ b/netcore/src/Application/NCC.API/.DS_Store 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 new file mode 100644 index 0000000..ddddedc --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventCrInput.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using NCC.Extend.Entitys.Dto.LqEventUser; + +namespace NCC.Extend.Entitys.Dto.LqEvent +{ + /// + /// 拓客活动创建输入参数 + /// + /// + /// 用于创建新拓客活动的参数类,包含活动基础信息和参与成员列表。 + /// 系统会自动生成活动ID,无需手动指定。 + /// + public class LqEventCrInput + { + /// + /// 活动名称 + /// + /// + /// 拓客活动的名称,必填字段 + /// 最大长度:255个字符 + /// 示例:春节拓客活动、夏季促销活动 + /// + [Required(ErrorMessage = "活动名称不能为空")] + [StringLength(255, ErrorMessage = "活动名称长度不能超过255个字符")] + public string EventName { get; set; } + + /// + /// 开始时间 + /// + /// + /// 拓客活动的开始时间,可选字段 + /// 格式:yyyy-MM-dd HH:mm:ss 或 yyyy-MM-dd + /// 示例:2024-01-15 09:00:00 + /// + public DateTime? StartTime { get; set; } + + /// + /// 结束时间 + /// + /// + /// 拓客活动的结束时间,可选字段 + /// 格式:yyyy-MM-dd HH:mm:ss 或 yyyy-MM-dd + /// 示例:2024-01-20 18:00:00 + /// 建议:结束时间应晚于开始时间 + /// + public DateTime? EndTime { get; set; } + + /// + /// 活动负责人 + /// + /// + /// 拓客活动的负责人id + /// 最大长度:255个字符 + /// + [StringLength(255, ErrorMessage = "活动负责人长度不能超过255个字符")] + public string EventCoordinator { get; set; } + + /// + /// 活动编号 + /// + /// + /// 拓客活动的编号,可选字段 + /// 最大长度:255个字符 + /// 建议格式:TK + 年份 + 序号,如:TK2024001 + /// + [StringLength(255, ErrorMessage = "活动编号长度不能超过255个字符")] + public string EventNumber { get; set; } + + /// + /// 拓客活动成员列表 + /// + /// + /// 参与拓客活动的成员列表,可选字段 + /// 可以为空,表示暂时不添加成员 + /// 每个成员包含:用户ID、部门ID、战队名称等信息 + /// + public List Members { get; set; } = new List(); + } +} 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 new file mode 100644 index 0000000..649452d --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventInfoOutput.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using NCC.Extend.Entitys.Dto.LqEventUser; + +namespace NCC.Extend.Entitys.Dto.LqEvent +{ + /// + /// 拓客活动详情输出 + /// + public class LqEventInfoOutput + { + /// + /// 主键ID + /// + public string id { get; set; } + + /// + /// 活动名称 + /// + public string eventName { get; set; } + + /// + /// 开始时间 + /// + public DateTime? startTime { get; set; } + + /// + /// 结束时间 + /// + public DateTime? endTime { get; set; } + + /// + /// 活动负责人 + /// + public string eventCoordinator { get; set; } + + /// + /// 活动编号 + /// + public string eventNumber { 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 new file mode 100644 index 0000000..845b628 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventListOutput.cs @@ -0,0 +1,45 @@ +using System; + +namespace NCC.Extend.Entitys.Dto.LqEvent +{ + /// + /// 拓客活动列表输出 + /// + public class LqEventListOutput + { + /// + /// 主键ID + /// + public string id { get; set; } + + /// + /// 活动名称 + /// + public string eventName { get; set; } + + /// + /// 开始时间 + /// + public DateTime? startTime { get; set; } + + /// + /// 结束时间 + /// + public DateTime? endTime { get; set; } + + /// + /// 活动负责人 + /// + public string eventCoordinator { get; set; } + + /// + /// 活动编号 + /// + public string eventNumber { get; set; } + + /// + /// 成员数量 + /// + public int memberCount { get; set; } + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventListQueryInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventListQueryInput.cs new file mode 100644 index 0000000..a77b588 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventListQueryInput.cs @@ -0,0 +1,93 @@ +using System; + +namespace NCC.Extend.Entitys.Dto.LqEvent +{ + /// + /// 拓客活动列表查询输入参数 + /// + /// + /// 用于拓客活动列表查询的参数类,支持分页、排序和多条件筛选。 + /// 所有筛选条件都是可选的,支持模糊查询和时间范围查询。 + /// + public class LqEventListQueryInput + { + /// + /// 拓客活动ID + /// + /// + /// 精确匹配查询,用于根据特定ID查询活动 + /// + public string Id { get; set; } + + /// + /// 活动名称 + /// + /// + /// 模糊查询,支持部分匹配活动名称 + /// 示例:输入"春节"可以匹配"春节拓客活动" + /// + public string EventName { get; set; } + + /// + /// 活动编号 + /// + /// + /// 模糊查询,支持部分匹配活动编号 + /// 示例:输入"TK2024"可以匹配"TK2024001" + /// + public string EventNumber { get; set; } + + /// + /// 活动负责人 + /// + /// + /// 模糊查询,支持部分匹配负责人姓名 + /// 示例:输入"张"可以匹配"张三" + /// + public string EventCoordinator { get; set; } + + /// + /// 排序字段 + /// + /// + /// 指定按哪个字段排序,支持以下字段: + /// - Id: 活动ID + /// - EventName: 活动名称 + /// - EventNumber: 活动编号 + /// - EventCoordinator: 活动负责人 + /// - StartTime: 开始时间 + /// - EndTime: 结束时间 + /// 默认为"Id" + /// + public string sidx { get; set; } + + /// + /// 排序方式 + /// + /// + /// 指定排序方向: + /// - asc: 升序(从小到大) + /// - desc: 降序(从大到小) + /// 默认为"desc" + /// + public string sord { get; set; } + + /// + /// 页码 + /// + /// + /// 分页查询的页码,从1开始 + /// 默认为1 + /// + public int page { get; set; } = 1; + + /// + /// 每页记录数 + /// + /// + /// 每页返回的记录数量 + /// 默认为10,建议范围:1-100 + /// + public int rows { get; set; } = 10; + } +} 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 new file mode 100644 index 0000000..9db7cf4 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventUpInput.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using NCC.Extend.Entitys.Dto.LqEventUser; + +namespace NCC.Extend.Entitys.Dto.LqEvent +{ + /// + /// 拓客活动更新输入参数 + /// + public class LqEventUpInput : LqEventCrInput + { + /// + /// 主键ID + /// + [Required(ErrorMessage = "活动ID不能为空")] + public new int? Id { get; set; } + + /// + /// 活动名称 + /// + [Required(ErrorMessage = "活动名称不能为空")] + [StringLength(255, ErrorMessage = "活动名称长度不能超过255个字符")] + public new string EventName { 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 new file mode 100644 index 0000000..d9c5af5 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventUserEventOutput.cs @@ -0,0 +1,70 @@ +using System; + +namespace NCC.Extend.Entitys.Dto.LqEvent +{ + /// + /// 用户参与的拓客活动输出 + /// + public class LqEventUserEventOutput + { + /// + /// 活动ID + /// + public string EventId { get; set; } + + /// + /// 活动名称 + /// + public string EventName { get; set; } + + /// + /// 活动编号 + /// + public string EventNumber { get; set; } + + /// + /// 活动负责人 + /// + public string EventCoordinator { get; set; } + + /// + /// 开始时间 + /// + public DateTime? StartTime { get; set; } + + /// + /// 结束时间 + /// + public DateTime? EndTime { get; set; } + + /// + /// 用户ID + /// + public string UserId { get; set; } + + /// + /// 部门ID + /// + public string DepId { get; set; } + + /// + /// 战队名称 + /// + public string TeamName { get; set; } + + /// + /// 拓客目标数量 + /// + public int EventTarget { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreationTime { get; set; } + + /// + /// 创建用户 + /// + public string CreationUser { 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 new file mode 100644 index 0000000..00e2fb4 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEventUser/LqEventUserCrInput.cs @@ -0,0 +1,37 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace NCC.Extend.Entitys.Dto.LqEventUser +{ + /// + /// 拓客活动用户创建输入参数 + /// + public class LqEventUserCrInput + { + /// + /// 主键 + /// + public string Id { get; set; } + + /// + /// 拓客活动ID + /// + public string EventId { get; set; } + + /// + /// 用户ID + /// + [Required(ErrorMessage = "用户ID不能为空")] + public string UserId { get; set; } + + /// + /// 部门ID + /// + public string DepId { get; set; } + + /// + /// 战队名称 + /// + public string TeamName { 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 new file mode 100644 index 0000000..1bb2e35 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEventUser/LqEventUserInfoOutput.cs @@ -0,0 +1,45 @@ +using System; + +namespace NCC.Extend.Entitys.Dto.LqEventUser +{ + /// + /// 拓客活动用户详情输出 + /// + public class LqEventUserInfoOutput + { + /// + /// 主键 + /// + public string id { get; set; } + + /// + /// 拓客活动ID + /// + public string eventId { get; set; } + + /// + /// 用户ID + /// + public string userId { get; set; } + + /// + /// 部门ID + /// + public string depId { get; set; } + + /// + /// 战队名称 + /// + public string teamName { get; set; } + + /// + /// 创建时间 + /// + public DateTime? creationTime { get; set; } + + /// + /// 创建用户 + /// + public string creationUser { get; set; } + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEventUser/LqEventUserListOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEventUser/LqEventUserListOutput.cs new file mode 100644 index 0000000..941fd1d --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEventUser/LqEventUserListOutput.cs @@ -0,0 +1,45 @@ +using System; + +namespace NCC.Extend.Entitys.Dto.LqEventUser +{ + /// + /// 拓客活动用户列表输出 + /// + public class LqEventUserListOutput + { + /// + /// 主键 + /// + public string Id { get; set; } + + /// + /// 拓客活动ID + /// + public string EventId { get; set; } + + /// + /// 用户ID + /// + public string UserId { get; set; } + + /// + /// 部门ID + /// + public string DepId { get; set; } + + /// + /// 战队名称 + /// + public string TeamName { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreationTime { get; set; } + + /// + /// 创建用户 + /// + public string CreationUser { get; set; } + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEventUser/LqEventUserListQueryInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEventUser/LqEventUserListQueryInput.cs new file mode 100644 index 0000000..f136092 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEventUser/LqEventUserListQueryInput.cs @@ -0,0 +1,65 @@ +using System; + +namespace NCC.Extend.Entitys.Dto.LqEventUser +{ + /// + /// 拓客活动用户列表查询输入 + /// + public class LqEventUserListQueryInput + { + /// + /// 主键 + /// + public string Id { get; set; } + + /// + /// 拓客活动ID + /// + public string EventId { get; set; } + + /// + /// 用户ID + /// + public string UserId { get; set; } + + /// + /// 部门ID + /// + public string DepId { get; set; } + + /// + /// 战队名称 + /// + public string TeamName { get; set; } + + /// + /// 创建时间(开始) + /// + public DateTime? CreationTimeBegin { get; set; } + + /// + /// 创建时间(结束) + /// + public DateTime? CreationTimeEnd { get; set; } + + /// + /// 排序字段 + /// + public string sidx { get; set; } + + /// + /// 排序方式 + /// + public string sord { get; set; } + + /// + /// 页码 + /// + public int page { get; set; } = 1; + + /// + /// 每页数量 + /// + public int rows { get; set; } = 10; + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEventUser/LqEventUserUpInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEventUser/LqEventUserUpInput.cs new file mode 100644 index 0000000..4c8023e --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEventUser/LqEventUserUpInput.cs @@ -0,0 +1,29 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace NCC.Extend.Entitys.Dto.LqEventUser +{ + /// + /// 拓客活动用户更新输入参数 + /// + public class LqEventUserUpInput : LqEventUserCrInput + { + /// + /// 主键 + /// + [Required(ErrorMessage = "主键不能为空")] + public new string Id { get; set; } + + /// + /// 拓客活动ID + /// + [Required(ErrorMessage = "拓客活动ID不能为空")] + public new string EventId { get; set; } + + /// + /// 用户ID + /// + [Required(ErrorMessage = "用户ID不能为空")] + public new string UserId { 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 9e59613..ddc69d9 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkCrInput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkCrInput.cs @@ -1,8 +1,8 @@ using System; using System.Collections.Generic; -using NCC.Extend.Entitys.Dto.LqHytkMx; using NCC.Extend.Entitys.Dto.LqHytkJksyj; using NCC.Extend.Entitys.Dto.LqHytkKjbsyj; +using NCC.Extend.Entitys.Dto.LqHytkMx; namespace NCC.Extend.Entitys.Dto.LqHytkHytk { @@ -15,72 +15,72 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk /// 退卡编号 /// public string id { get; set; } - + /// /// 门店 /// public string md { get; set; } - + /// /// 门店编号 /// public string mdbh { get; set; } - + /// /// 门店名称 /// public string mdmc { get; set; } - + /// /// 会员 /// public string hy { get; set; } - + /// /// 会员姓名 /// public string hymc { get; set; } - + /// /// 会员账号 /// public string hyzh { get; set; } - + /// /// 顾客类型 /// public string gklx { get; set; } - + /// /// 退卡总金额 /// public decimal? tkje { get; set; } - + /// /// 手工费用 /// public decimal? sgfy { get; set; } - + /// /// 备注 /// public string bz { get; set; } - + /// /// 退卡时间 /// public DateTime? tksj { get; set; } - + /// /// 操作人员 /// public string czry { get; set; } - + /// /// 退卡状态 /// public string tkzt { get; set; } - + /// /// 退卡原因 /// @@ -90,21 +90,20 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk /// 退卡附件 /// public string fileUrl { get; set; } - + /// /// 退卡品项明细列表 /// public List lqHytkMxList { get; set; } - + /// /// 退卡健康师业绩列表 /// public List lqHytkJksyjList { get; set; } - + /// /// 退卡科技部老师业绩列表 /// public List lqHytkKjbsyjList { get; set; } - } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkJksyj/LqHytkJksyjCrInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkJksyj/LqHytkJksyjCrInput.cs index 57dd462..c3320be 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkJksyj/LqHytkJksyjCrInput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkJksyj/LqHytkJksyjCrInput.cs @@ -11,56 +11,55 @@ namespace NCC.Extend.Entitys.Dto.LqHytkJksyj /// 业绩编号 /// public string id { get; set; } - + /// /// 关联退卡编号 /// public string gltkbh { get; set; } - + /// /// 健康师 /// public string jks { get; set; } - + /// /// 健康师姓名 /// public string jksxm { get; set; } - + /// /// 健康师账号 /// public string jkszh { get; set; } - + /// /// 健康师业绩 /// public decimal? jksyj { get; set; } - + /// /// 退卡时间 /// public DateTime? tksj { get; set; } - + /// /// 金三角id /// public string F_jsjid { get; set; } - + /// /// 关联项目资料表ID /// public string F_tkpxid { get; set; } - + /// /// 手工费 /// public decimal? F_LaborCost { get; set; } - + /// /// 退卡品项次数 /// public decimal? F_tkpxNumber { get; set; } - } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkMx/LqHytkMxCrInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkMx/LqHytkMxCrInput.cs index cfba5e9..7f73fc3 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 @@ -14,61 +14,60 @@ namespace NCC.Extend.Entitys.Dto.LqHytkMx /// 明细编号 /// public string id { get; set; } - + /// /// 关联退卡编号 /// public string gltkbh { get; set; } - + /// /// 品项 /// public string px { get; set; } - + /// /// 品项名称 /// public string pxmc { get; set; } - + /// /// 品项价格 /// public decimal? pxjg { get; set; } - + /// /// 退款金额 /// public decimal? tkje { get; set; } - + /// /// 项目次数 /// public int? F_ProjectNumber { get; set; } - + /// /// 是否有效 /// public int? F_IsEnabled { get; set; } - + /// /// 来源类型 /// public string F_SourceType { get; set; } - + /// /// 合计金额 /// public decimal? F_TotalPrice { get; set; } - + /// /// 退卡健康师业绩列表 /// public List lqHytkJksyjList { get; set; } - + /// /// 退卡科技部老师业绩列表 /// public List lqHytkKjbsyjList { get; set; } - } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkMx/LqHytkMxInfoOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkMx/LqHytkMxInfoOutput.cs index 57550f1..c462028 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 @@ -14,47 +14,47 @@ namespace NCC.Extend.Entitys.Dto.LqHytkMx /// 明细编号 /// public string id { get; set; } - + /// /// 关联退卡编号 /// public string gltkbh { get; set; } - + /// /// 品项编号 /// public string px { get; set; } - + /// /// 品项名称 /// public string pxmc { get; set; } - + /// /// 品项价格 /// public decimal? pxjg { get; set; } - + /// /// 退款金额 /// public decimal? tkje { get; set; } - + /// /// 项目次数 /// public int? F_ProjectNumber { get; set; } - + /// /// 是否有效 /// public int? F_IsEnabled { get; set; } - + /// /// 来源类型(开卡/赠送/其他) /// public string F_SourceType { get; set; } - + /// /// 合计金额(品项价格 × 项目次数) /// @@ -69,6 +69,5 @@ namespace NCC.Extend.Entitys.Dto.LqHytkMx /// 科技部老师业绩列表 /// public List lqHytkKjbsyjList { get; set; } - } -} \ No newline at end of file +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYxhdfa/LqYxhdfaCrInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYxhdfa/LqYxhdfaCrInput.cs index be327a3..344aa92 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYxhdfa/LqYxhdfaCrInput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYxhdfa/LqYxhdfaCrInput.cs @@ -1,10 +1,10 @@ using System; -using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; namespace NCC.Extend.Entitys.Dto.LqYxhdfa { /// - /// 营销活动方案修改输入参数 + /// 营销活动方案创建输入参数 /// public class LqYxhdfaCrInput { @@ -12,26 +12,28 @@ namespace NCC.Extend.Entitys.Dto.LqYxhdfa /// 方案编号 /// public string id { get; set; } - + /// /// 营销活动编号 /// + [Required(ErrorMessage = "营销活动编号不能为空")] public string yxhdbh { get; set; } - + /// /// 活动名称 /// + [Required(ErrorMessage = "活动名称不能为空")] + [StringLength(200, ErrorMessage = "活动名称长度不能超过200个字符")] public string hdmc { get; set; } - + /// /// 张数奖 /// public string zsj { get; set; } - + /// /// 金额奖 /// public string jej { get; set; } - } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYxhdfa/LqYxhdfaInfoOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYxhdfa/LqYxhdfaInfoOutput.cs index 79e96e4..200c105 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYxhdfa/LqYxhdfaInfoOutput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqYxhdfa/LqYxhdfaInfoOutput.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; namespace NCC.Extend.Entitys.Dto.LqYxhdfa { @@ -12,26 +11,25 @@ namespace NCC.Extend.Entitys.Dto.LqYxhdfa /// 方案编号 /// public string id { get; set; } - + /// /// 营销活动编号 /// public string yxhdbh { get; set; } - + /// /// 活动名称 /// public string hdmc { get; set; } - + /// /// 张数奖 /// public string zsj { get; set; } - + /// /// 金额奖 /// public string jej { 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 new file mode 100644 index 0000000..ae79ca9 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_event/LqEventEntity.cs @@ -0,0 +1,48 @@ +using System; +using SqlSugar; + +namespace NCC.Extend.Entitys.lq_event +{ + /// + /// 活动事件表 + /// + [SugarTable("lq_Event")] + public class LqEventEntity + { + /// + /// 主键ID + /// + [SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true)] + public string Id { get; set; } + + /// + /// 活动名称 + /// + [SugarColumn(ColumnName = "F_EventName")] + public string EventName { get; set; } + + /// + /// 开始时间 + /// + [SugarColumn(ColumnName = "F_StartTime")] + public DateTime? StartTime { get; set; } + + /// + /// 结束时间 + /// + [SugarColumn(ColumnName = "F_EndTime")] + public DateTime? EndTime { get; set; } + + /// + /// 活动负责人 + /// + [SugarColumn(ColumnName = "F_EventCoordinator")] + public string EventCoordinator { get; set; } + + /// + /// 活动编号 + /// + [SugarColumn(ColumnName = "F_EventNumber")] + public string EventNumber { get; set; } + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_eventuser/LqEventUserEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_eventuser/LqEventUserEntity.cs new file mode 100644 index 0000000..8ce9f42 --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_eventuser/LqEventUserEntity.cs @@ -0,0 +1,60 @@ +using System; +using SqlSugar; + +namespace NCC.Extend.Entitys.lq_eventuser +{ + /// + /// 拓客活动用户表 + /// + [SugarTable("lq_eventuser")] + public class LqEventUserEntity + { + /// + /// 主键 + /// + [SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true)] + public string Id { get; set; } + + /// + /// 拓客活动ID + /// + [SugarColumn(ColumnName = "F_EventId")] + public string EventId { get; set; } + + /// + /// 用户ID + /// + [SugarColumn(ColumnName = "F_UserId")] + public string UserId { get; set; } + + /// + /// 部门ID + /// + [SugarColumn(ColumnName = "F_DepId")] + public string DepId { get; set; } + + /// + /// 战队名称 + /// + [SugarColumn(ColumnName = "F_TeamName")] + public string TeamName { get; set; } + + /// + /// 创建时间 + /// + [SugarColumn(ColumnName = "F_CreationTime")] + public DateTime? CreationTime { get; set; } + + /// + /// 创建用户 + /// + [SugarColumn(ColumnName = "F_CreationUser")] + public string CreationUser { get; set; } + + /// + /// 拓客目标数量 + /// + [SugarColumn(ColumnName = "F_EventTarget")] + public int EventTarget { get; set; } + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_jksyj/LqHytkJksyjEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_jksyj/LqHytkJksyjEntity.cs index ae9436e..4fd006b 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_jksyj/LqHytkJksyjEntity.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_jksyj/LqHytkJksyjEntity.cs @@ -1,6 +1,6 @@ +using System; using NCC.Common.Const; using SqlSugar; -using System; namespace NCC.Extend.Entitys.lq_hytk_jksyj { @@ -16,96 +16,101 @@ namespace NCC.Extend.Entitys.lq_hytk_jksyj /// [SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true)] public string Id { get; set; } - + /// /// 关联退卡编号 /// - [SugarColumn(ColumnName = "gltkbh")] + [SugarColumn(ColumnName = "gltkbh")] public string Gltkbh { 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 decimal? Jksyj { get; set; } - + /// /// 退卡时间 /// - [SugarColumn(ColumnName = "tksj")] + [SugarColumn(ColumnName = "tksj")] public DateTime? Tksj { get; set; } - + /// /// 金三角id /// - [SugarColumn(ColumnName = "F_jsjid")] + [SugarColumn(ColumnName = "F_jsjid")] public string F_jsjid { get; set; } - + /// /// 关联项目资料表ID /// - [SugarColumn(ColumnName = "F_tkpxid")] + [SugarColumn(ColumnName = "F_tkpxid")] public string F_tkpxid { get; set; } - + /// /// 手工费 /// - [SugarColumn(ColumnName = "F_LaborCost")] + [SugarColumn(ColumnName = "F_LaborCost")] public decimal? F_LaborCost { get; set; } - + /// /// 退卡品项次数 /// - [SugarColumn(ColumnName = "F_tkpxNumber")] + [SugarColumn(ColumnName = "F_tkpxNumber")] public decimal? F_tkpxNumber { get; set; } - + /// /// 创建时间 /// - [SugarColumn(ColumnName = "F_CreateTime")] + [SugarColumn(ColumnName = "F_CreateTime")] public DateTime? F_CreateTime { get; set; } - + /// /// 创建用户 /// - [SugarColumn(ColumnName = "F_CreateUser")] + [SugarColumn(ColumnName = "F_CreateUser")] public string F_CreateUser { get; set; } - + /// /// 修改时间 /// - [SugarColumn(ColumnName = "F_ModifyTime")] + [SugarColumn(ColumnName = "F_ModifyTime")] public DateTime? F_ModifyTime { get; set; } - + /// /// 修改用户 /// - [SugarColumn(ColumnName = "F_ModifyUser")] + [SugarColumn(ColumnName = "F_ModifyUser")] public string F_ModifyUser { get; set; } - + /// /// 删除标记 /// - [SugarColumn(ColumnName = "F_DeleteMark")] + [SugarColumn(ColumnName = "F_DeleteMark")] public int? F_DeleteMark { get; set; } - + + /// + /// 退卡品项明细id + /// + [SugarColumn(ColumnName = "F_CardReturn")] + public string CardReturn { get; set; } } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_kjbsyj/LqHytkKjbsyjEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_kjbsyj/LqHytkKjbsyjEntity.cs index 86c12cd..fe4d17c 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_kjbsyj/LqHytkKjbsyjEntity.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_kjbsyj/LqHytkKjbsyjEntity.cs @@ -1,6 +1,6 @@ +using System; using NCC.Common.Const; using SqlSugar; -using System; namespace NCC.Extend.Entitys.lq_hytk_kjbsyj { @@ -16,90 +16,95 @@ namespace NCC.Extend.Entitys.lq_hytk_kjbsyj /// [SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true)] public string Id { get; set; } - + /// /// 关联退卡编号 /// - [SugarColumn(ColumnName = "gltkbh")] + [SugarColumn(ColumnName = "gltkbh")] public string Gltkbh { get; set; } - + /// /// 科技部老师 /// - [SugarColumn(ColumnName = "kjbls")] + [SugarColumn(ColumnName = "kjbls")] public string Kjbls { get; set; } - + /// /// 科技部老师姓名 /// - [SugarColumn(ColumnName = "kjblsxm")] + [SugarColumn(ColumnName = "kjblsxm")] public string Kjblsxm { get; set; } - + /// /// 科技部老师账号 /// - [SugarColumn(ColumnName = "kjblszh")] + [SugarColumn(ColumnName = "kjblszh")] public string Kjblszh { get; set; } - + /// /// 科技部老师业绩 /// - [SugarColumn(ColumnName = "kjblsyj")] + [SugarColumn(ColumnName = "kjblsyj")] public decimal? Kjblsyj { get; set; } - + /// /// 退卡时间 /// - [SugarColumn(ColumnName = "tksj")] + [SugarColumn(ColumnName = "tksj")] public DateTime? Tksj { get; set; } - + /// /// 关联项目资料表ID /// - [SugarColumn(ColumnName = "F_tkpxid")] + [SugarColumn(ColumnName = "F_tkpxid")] public string F_tkpxid { get; set; } - + /// /// 手工费 /// - [SugarColumn(ColumnName = "F_LaborCost")] + [SugarColumn(ColumnName = "F_LaborCost")] public decimal? F_LaborCost { get; set; } - + /// /// 退卡品项次数 /// - [SugarColumn(ColumnName = "F_tkpxNumber")] + [SugarColumn(ColumnName = "F_tkpxNumber")] public decimal? F_tkpxNumber { get; set; } - + /// /// 创建时间 /// - [SugarColumn(ColumnName = "F_CreateTime")] + [SugarColumn(ColumnName = "F_CreateTime")] public DateTime? F_CreateTime { get; set; } - + /// /// 创建用户 /// - [SugarColumn(ColumnName = "F_CreateUser")] + [SugarColumn(ColumnName = "F_CreateUser")] public string F_CreateUser { get; set; } - + /// /// 修改时间 /// - [SugarColumn(ColumnName = "F_ModifyTime")] + [SugarColumn(ColumnName = "F_ModifyTime")] public DateTime? F_ModifyTime { get; set; } - + /// /// 修改用户 /// - [SugarColumn(ColumnName = "F_ModifyUser")] + [SugarColumn(ColumnName = "F_ModifyUser")] public string F_ModifyUser { get; set; } - + /// /// 删除标记 /// - [SugarColumn(ColumnName = "F_DeleteMark")] + [SugarColumn(ColumnName = "F_DeleteMark")] public int? F_DeleteMark { get; set; } - + + /// + /// 退卡品项明细id + /// + [SugarColumn(ColumnName = "F_CardReturn")] + public string CardReturn { 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 f7d2f81..68a2683 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 @@ -1,14 +1,12 @@ -using NCC.Common.Const; +using System; using SqlSugar; -using System; namespace NCC.Extend.Entitys.lq_tkjlb { /// - /// 拓客管理 + /// 拓客基础信息表 /// [SugarTable("lq_tkjlb")] - [Tenant(ClaimConst.TENANT_ID)] public class LqTkjlbEntity { /// @@ -16,66 +14,65 @@ namespace NCC.Extend.Entitys.lq_tkjlb /// [SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true)] public string Id { get; set; } - + /// /// 拓客时间 /// - [SugarColumn(ColumnName = "tksj")] + [SugarColumn(ColumnName = "tksj")] public DateTime? Tksj { get; set; } - + /// /// 拓客人员 /// - [SugarColumn(ColumnName = "tkry")] + [SugarColumn(ColumnName = "tkry")] public string Tkry { get; set; } - + /// /// 顾客姓名 /// - [SugarColumn(ColumnName = "gkxm")] + [SugarColumn(ColumnName = "gkxm")] public string Gkxm { get; set; } - + /// /// 电话号码 /// - [SugarColumn(ColumnName = "dhhm")] + [SugarColumn(ColumnName = "dhhm")] public string Dhhm { get; set; } - + /// /// 购买张数 /// - [SugarColumn(ColumnName = "gmzs")] + [SugarColumn(ColumnName = "gmzs")] public int? Gmzs { get; set; } - + /// /// 支付方式 /// - [SugarColumn(ColumnName = "zffs")] + [SugarColumn(ColumnName = "zffs")] public string Zffs { get; set; } - + /// /// 是否加微信 /// - [SugarColumn(ColumnName = "sfjwx")] + [SugarColumn(ColumnName = "sfjwx")] public string Sfjwx { get; set; } - + /// /// 备注 /// - [SugarColumn(ColumnName = "bz")] + [SugarColumn(ColumnName = "bz")] public string Bz { get; set; } - + /// /// 所属门店 /// - [SugarColumn(ColumnName = "ssmd")] + [SugarColumn(ColumnName = "ssmd")] public string Ssmd { get; set; } - + /// /// 所属战队 /// - [SugarColumn(ColumnName = "sszd")] + [SugarColumn(ColumnName = "sszd")] public string Sszd { get; set; } - } -} \ No newline at end of file +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Interfaces/LqEvent/ILqEventService.cs b/netcore/src/Modularity/Extend/NCC.Extend.Interfaces/LqEvent/ILqEventService.cs new file mode 100644 index 0000000..bf8701b --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend.Interfaces/LqEvent/ILqEventService.cs @@ -0,0 +1,220 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using NCC.Common.Filter; +using NCC.Extend.Entitys.Dto.LqEvent; + +namespace NCC.Extend.Interfaces.LqEvent +{ + /// + /// 拓客活动服务接口 + /// + /// + /// 提供拓客活动的完整管理功能,包括活动基础信息和成员管理。 + /// 支持创建、查询、更新、删除拓客活动,以及管理每个活动的参与成员。 + /// + public interface ILqEventService + { + /// + /// 获取拓客活动列表 + /// + /// + /// 分页查询拓客活动列表,支持多条件筛选和排序。 + /// 返回结果包含每个活动的成员数量统计。 + /// + /// 示例请求: + /// ```json + /// { + /// "page": 1, + /// "rows": 10, + /// "sidx": "Id", + /// "sord": "desc", + /// "eventName": "春节拓客活动", + /// "eventNumber": "TK2024001", + /// "eventCoordinator": "张三", + /// "startTimeBegin": "2024-01-01", + /// "startTimeEnd": "2024-12-31" + /// } + /// ``` + /// + /// 参数说明: + /// - page: 页码,从1开始 + /// - rows: 每页记录数 + /// - sidx: 排序字段(Id、EventName、EventNumber、EventCoordinator、StartTime、EndTime) + /// - sord: 排序方向(asc、desc) + /// - eventName: 活动名称(模糊查询) + /// - eventNumber: 活动编号(模糊查询) + /// - eventCoordinator: 活动负责人(模糊查询) + /// - startTimeBegin: 开始时间范围-开始 + /// - startTimeEnd: 开始时间范围-结束 + /// - endTimeBegin: 结束时间范围-开始 + /// - endTimeEnd: 结束时间范围-结束 + /// + /// 查询参数 + /// 分页的拓客活动列表,包含成员数量统计 + /// 成功返回拓客活动列表 + /// 请求参数错误 + /// 服务器内部错误 + Task GetList(LqEventListQueryInput input); + + /// + /// 获取拓客活动详情 + /// + /// + /// 根据活动ID获取拓客活动的详细信息,包括基础信息和所有参与成员列表。 + /// + /// 示例请求: + /// GET /api/Extend/LqEvent/1234567890123456789 + /// + /// 返回数据包含: + /// - 活动基础信息(名称、编号、负责人、时间等) + /// - 成员列表(用户ID、部门ID、战队名称等) + /// + /// 拓客活动ID + /// 拓客活动详情,包含成员信息 + /// 成功返回拓客活动详情 + /// 拓客活动不存在 + /// 服务器内部错误 + Task GetInfo(string id); + + /// + /// 创建拓客活动 + /// + /// + /// 创建新的拓客活动,可以同时添加参与成员。 + /// 系统会自动生成活动ID,并记录创建用户信息。 + /// + /// 示例请求: + /// ```json + /// { + /// "eventName": "春节拓客活动", + /// "eventNumber": "TK2024001", + /// "eventCoordinator": "张三", + /// "startTime": "2024-01-15T09:00:00", + /// "endTime": "2024-01-20T18:00:00", + /// "members": [ + /// { + /// "userId": "user001", + /// "depId": "dept001", + /// "teamName": "第一战队" + /// }, + /// { + /// "userId": "user002", + /// "depId": "dept001", + /// "teamName": "第二战队" + /// } + /// ] + /// } + /// ``` + /// + /// 参数说明: + /// - eventName: 活动名称(必填) + /// - eventNumber: 活动编号(可选) + /// - eventCoordinator: 活动负责人(可选) + /// - startTime: 开始时间(可选) + /// - endTime: 结束时间(可选) + /// - members: 参与成员列表(可选) + /// - userId: 用户ID(必填) + /// - depId: 部门ID(可选) + /// - teamName: 战队名称(可选) + /// + /// 创建参数 + /// 无返回值 + /// 拓客活动创建成功 + /// 请求参数错误或验证失败 + /// 服务器内部错误 + Task Create(LqEventCrInput input); + + /// + /// 更新拓客活动 + /// + /// + /// 更新拓客活动信息,包括基础信息和成员列表。 + /// 更新时会先删除原有成员,再添加新成员。 + /// + /// 示例请求: + /// ```json + /// { + /// "id": "1234567890123456789", + /// "eventName": "春节拓客活动(更新)", + /// "eventNumber": "TK2024001", + /// "eventCoordinator": "李四", + /// "startTime": "2024-01-15T09:00:00", + /// "endTime": "2024-01-25T18:00:00", + /// "members": [ + /// { + /// "userId": "user003", + /// "depId": "dept002", + /// "teamName": "精英战队" + /// } + /// ] + /// } + /// ``` + /// + /// 参数说明: + /// - id: 拓客活动ID(必填) + /// - eventName: 活动名称(必填) + /// - eventNumber: 活动编号(可选) + /// - eventCoordinator: 活动负责人(可选) + /// - startTime: 开始时间(可选) + /// - endTime: 结束时间(可选) + /// - members: 参与成员列表(可选,为空则清空所有成员) + /// + /// 更新参数 + /// 无返回值 + /// 拓客活动更新成功 + /// 请求参数错误或验证失败 + /// 拓客活动不存在 + /// 服务器内部错误 + Task Update(LqEventUpInput input); + + /// + /// 删除拓客活动 + /// + /// + /// 删除指定的拓客活动,会同时删除该活动的所有成员记录。 + /// 删除操作不可恢复,请谨慎使用。 + /// + /// 示例请求: + /// DELETE /api/Extend/LqEvent/1234567890123456789 + /// + /// 删除顺序: + /// 1. 先删除所有相关成员记录 + /// 2. 再删除拓客活动记录 + /// + /// 拓客活动ID + /// 无返回值 + /// 拓客活动删除成功 + /// 拓客活动不存在 + /// 服务器内部错误 + Task Delete(string id); + + /// + /// 根据用户ID获取参与的拓客活动 + /// + /// + /// 根据用户ID查询该用户参与的所有拓客活动,支持时间范围筛选。 + /// 返回结果包含活动基础信息和用户在该活动中的详细信息。 + /// + /// 示例请求: + /// GET /api/Extend/LqEvent/user/user001?startTime=2024-01-01&endTime=2024-12-31 + /// + /// 参数说明: + /// - userId: 用户ID(必填) + /// - startTime: 开始时间(可选),查询在此时间之后开始的活动 + /// - endTime: 结束时间(可选),查询在此时间之前结束的活动 + /// + /// 返回数据包含: + /// - 活动基础信息(ID、名称、编号、负责人、开始时间、结束时间) + /// - 用户参与信息(部门ID、战队名称、目标数量等) + /// + /// 用户ID + /// 开始时间(可选) + /// 结束时间(可选) + /// 用户参与的拓客活动列表 + /// 成功返回用户参与的拓客活动列表 + /// 请求参数错误 + /// 服务器内部错误 + Task> GetUserEvents(string userId, DateTime? startTime = null, DateTime? endTime = null); + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqEventService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqEventService.cs new file mode 100644 index 0000000..97def2c --- /dev/null +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqEventService.cs @@ -0,0 +1,484 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Mapster; +using Microsoft.AspNetCore.Mvc; +using NCC.Common.Core.Manager; +using NCC.Common.Filter; +using NCC.Dependency; +using NCC.DynamicApiController; +using NCC.Extend.Entitys.Dto.LqEvent; +using NCC.Extend.Entitys.Dto.LqEventUser; +using NCC.Extend.Entitys.lq_event; +using NCC.Extend.Entitys.lq_eventuser; +using NCC.Extend.Interfaces.LqEvent; +using NCC.FriendlyException; +using SqlSugar; +using Yitter.IdGenerator; + +namespace NCC.Extend.LqEvent +{ + /// + /// 拓客活动服务 + /// + [ApiDescriptionSettings(Tag = "绿纤拓客活动服务", Name = "LqEvent", Order = 200)] + [Route("api/Extend/[controller]")] + [ApiController] + public class LqEventService : ILqEventService, IDynamicApiController, ITransient + { + private readonly ISqlSugarClient _db; + private readonly IUserManager _userManager; + + public LqEventService(ISqlSugarClient db, IUserManager userManager) + { + _db = db; + _userManager = userManager; + } + + #region 获取拓客活动列表 + /// + /// 获取拓客活动列表 + /// + /// + /// 分页查询拓客活动列表,支持多条件筛选和排序。 + /// 返回结果包含每个活动的成员数量统计。 + /// + /// 示例请求: + /// GET /api/Extend/LqEvent?page=1&rows=10&sidx=Id&sord=desc&eventName=春节拓客活动 + /// + /// 支持的条件筛选: + /// - 活动名称模糊查询 + /// - 活动编号模糊查询 + /// - 活动负责人模糊查询 + /// - 开始时间范围查询 + /// - 结束时间范围查询 + /// + /// 支持的排序字段: + /// - Id: 活动ID + /// - EventName: 活动名称 + /// - EventNumber: 活动编号 + /// - EventCoordinator: 活动负责人 + /// - StartTime: 开始时间 + /// - EndTime: 结束时间 + /// + /// 查询参数 + /// 分页的拓客活动列表,包含成员数量统计 + [HttpGet("")] + public async Task GetList([FromQuery] LqEventListQueryInput input) + { + var sidx = input.sidx == null ? "id" : input.sidx; + var sord = input.sord == null ? "desc" : input.sord; + // 先查询活动列表 + var Data = await _db.Queryable() + .WhereIF(!string.IsNullOrEmpty(input.EventName), e => e.EventName.Contains(input.EventName)) + .WhereIF(!string.IsNullOrEmpty(input.EventNumber), e => e.EventNumber.Contains(input.EventNumber)) + .Select(e => new LqEventListOutput + { + id = e.Id, + eventName = e.EventName, + startTime = e.StartTime, + endTime = e.EndTime, + eventCoordinator = e.EventCoordinator, + eventNumber = e.EventNumber, + memberCount = SqlFunc.Subqueryable().Where(u => u.EventId == e.Id).Count(), + }) + .MergeTable() + .OrderBy(sidx + " " + sord) + .ToPagedListAsync(input.page, input.rows); + return PageResult.SqlSugarPageResult(Data); + } + #endregion + + #region 获取拓客活动详情 + + /// + /// 获取拓客活动详情 + /// + /// + /// 根据活动ID获取拓客活动的详细信息,包括基础信息和所有参与成员列表。 + /// + /// 示例请求: + /// GET /api/Extend/LqEvent/1234567890123456789 + /// + /// 返回数据包含: + /// - 活动基础信息(ID、名称、编号、负责人、开始时间、结束时间) + /// - 成员列表(用户ID、部门ID、战队名称、创建时间、创建用户) + /// + /// 如果活动不存在,将返回404错误。 + /// + /// 拓客活动ID + /// 拓客活动详情,包含成员信息 + /// 成功返回拓客活动详情 + /// 拓客活动不存在 + /// 服务器内部错误 + [HttpGet("{id}")] + public async Task GetInfo(string id) + { + // 1. 获取拓客活动基本信息 + var entity = await _db.Queryable().FirstAsync(p => p.Id == id); + if (entity == null) + { + 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>(); + + return output; + } + #endregion + + #region 创建拓客活动 + /// + /// 创建拓客活动 + /// + /// + /// 创建新的拓客活动,可以同时添加参与成员。 + /// 系统会自动生成活动ID,并记录创建用户信息。 + /// + /// 示例请求: + /// POST /api/Extend/LqEvent + /// Content-Type: application/json + /// + /// ```json + /// { + /// "eventName": "春节拓客活动", + /// "eventNumber": "TK2024001", + /// "eventCoordinator": "张三", + /// "startTime": "2024-01-15T09:00:00", + /// "endTime": "2024-01-20T18:00:00", + /// "members": [ + /// { + /// "userId": "user001", + /// "depId": "dept001", + /// "teamName": "第一战队" + /// }, + /// { + /// "userId": "user002", + /// "depId": "dept001", + /// "teamName": "第二战队" + /// } + /// ] + /// } + /// ``` + /// + /// 参数验证: + /// - eventName: 必填,最大长度255字符 + /// - eventNumber: 可选,最大长度255字符 + /// - eventCoordinator: 可选,最大长度255字符 + /// - members: 可选,成员列表 + /// - userId: 必填 + /// - depId: 可选 + /// - teamName: 可选 + /// + /// 创建流程: + /// 1. 生成新的活动ID + /// 2. 插入拓客活动记录 + /// 3. 插入成员记录(如果有) + /// + /// 创建参数 + /// 无返回值 + /// 拓客活动创建成功 + /// 请求参数错误或验证失败 + /// 服务器内部错误 + [HttpPost("")] + public async Task Create([FromBody] LqEventCrInput input) + { + var userInfo = await _userManager.GetUserInfo(); + var entity = input.Adapt(); + + // 生成新的ID + entity.Id = YitIdHelper.NextId().ToString(); + + // 插入拓客活动 + var isOk = await _db.Insertable(entity).ExecuteCommandAsync(); + if (!(isOk > 0)) + throw NCCException.Oh("创建拓客活动失败"); + + // 插入拓客活动成员 + if (input.Members != null && input.Members.Count > 0) + { + var memberEntities = new List(); + foreach (var member in input.Members) + { + memberEntities.Add( + new LqEventUserEntity + { + Id = YitIdHelper.NextId().ToString(), + EventId = entity.Id.ToString(), + UserId = member.UserId, + DepId = member.DepId, + TeamName = member.TeamName, + CreationTime = DateTime.Now, + CreationUser = userInfo?.userName, + } + ); + } + + await _db.Insertable(memberEntities).ExecuteCommandAsync(); + } + } + #endregion + + #region 更新拓客活动 + /// + /// 更新拓客活动 + /// + /// + /// 更新拓客活动信息,包括基础信息和成员列表。 + /// 更新时会先删除原有成员,再添加新成员。 + /// + /// 示例请求: + /// PUT /api/Extend/LqEvent + /// Content-Type: application/json + /// + /// ```json + /// { + /// "id": "1234567890123456789", + /// "eventName": "春节拓客活动(更新)", + /// "eventNumber": "TK2024001", + /// "eventCoordinator": "李四", + /// "startTime": "2024-01-15T09:00:00", + /// "endTime": "2024-01-25T18:00:00", + /// "members": [ + /// { + /// "userId": "user003", + /// "depId": "dept002", + /// "teamName": "精英战队" + /// } + /// ] + /// } + /// ``` + /// + /// 参数验证: + /// - id: 必填,拓客活动ID + /// - eventName: 必填,最大长度255字符 + /// - eventNumber: 可选,最大长度255字符 + /// - eventCoordinator: 可选,最大长度255字符 + /// - members: 可选,成员列表(为空则清空所有成员) + /// + /// 更新流程: + /// 1. 更新拓客活动记录 + /// 2. 删除原有成员记录 + /// 3. 插入新成员记录(如果有) + /// + /// 更新参数 + /// 无返回值 + /// 拓客活动更新成功 + /// 请求参数错误或验证失败 + /// 拓客活动不存在 + /// 服务器内部错误 + [HttpPut("")] + public async Task Update([FromBody] LqEventUpInput input) + { + var userInfo = await _userManager.GetUserInfo(); + var entity = input.Adapt(); + + // 更新拓客活动 + var isOk = await _db.Updateable(entity).ExecuteCommandAsync(); + if (!(isOk > 0)) + throw NCCException.Oh("更新拓客活动失败"); + + // 删除原有成员 + await _db.Deleteable().Where(u => u.EventId == entity.Id.ToString()).ExecuteCommandAsync(); + + // 插入新成员 + if (input.Members != null && input.Members.Count > 0) + { + var memberEntities = new List(); + foreach (var member in input.Members) + { + memberEntities.Add( + new LqEventUserEntity + { + Id = YitIdHelper.NextId().ToString(), + EventId = entity.Id.ToString(), + UserId = member.UserId, + DepId = member.DepId, + TeamName = member.TeamName, + CreationTime = DateTime.Now, + CreationUser = userInfo?.userName, + } + ); + } + + await _db.Insertable(memberEntities).ExecuteCommandAsync(); + } + } + #endregion + + #region 删除拓客活动 + /// + /// 删除拓客活动 + /// + /// + /// 删除指定的拓客活动,会同时删除该活动的所有成员记录。 + /// 删除操作不可恢复,请谨慎使用。 + /// + /// 示例请求: + /// DELETE /api/Extend/LqEvent/1234567890123456789 + /// + /// 删除顺序: + /// 1. 先删除所有相关成员记录 + /// 2. 再删除拓客活动记录 + /// + /// 注意事项: + /// - 删除操作不可恢复 + /// - 会级联删除所有相关成员记录 + /// - 如果活动不存在,将返回404错误 + /// - 建议在删除前先查询确认活动信息 + /// + /// 拓客活动ID + /// 无返回值 + /// 拓客活动删除成功 + /// 拓客活动不存在 + /// 服务器内部错误 + [HttpDelete("{id}")] + public async Task Delete(string id) + { + // 删除拓客活动成员 + await _db.Deleteable().Where(u => u.EventId == id.ToString()).ExecuteCommandAsync(); + + // 删除拓客活动 + var isOk = await _db.Deleteable().Where(p => p.Id == id).ExecuteCommandAsync(); + + if (!(isOk > 0)) + throw NCCException.Oh("删除拓客活动失败"); + } + #endregion + + #region 更新拓客目标数量 + /// + /// 更新拓客目标数量 + /// + /// 拓客活动ID + /// 拓客目标数量 + /// + [HttpPut("{id}/target")] + public async Task UpdateTarget(string id, int target) + { + var isOk = await _db.Updateable().SetColumns(it => new LqEventUserEntity { EventTarget = target }).Where(x => x.EventId == id).ExecuteCommandAsync(); + if (!(isOk > 0)) + throw NCCException.Oh("更新拓客目标数量失败"); + } + #endregion + + #region 获取拓客目标数量 + /// + /// 获取拓客目标数量 + /// + /// 拓客活动ID + /// + [HttpGet("{id}/target")] + public async Task GetTarget(string id) + { + return await _db.Queryable().Where(x => x.EventId == id).Select(x => x.EventTarget).FirstAsync(); + } + #endregion + + #region 根据用户ID获取参与的拓客活动 + + /// + /// 根据用户ID获取参与的拓客活动 + /// + /// + /// 根据用户ID查询该用户参与的所有拓客活动,支持时间范围筛选。 + /// 返回结果包含活动基础信息和用户在该活动中的详细信息。 + /// + /// 示例请求: + /// GET /api/Extend/LqEvent/user/user001?startTime=2024-01-01&endTime=2024-12-31 + /// + /// 参数说明: + /// - userId: 用户ID(必填) + /// - startTime: 开始时间(可选),查询在此时间之后开始的活动 + /// - endTime: 结束时间(可选),查询在此时间之前结束的活动 + /// + /// 返回数据包含: + /// - 活动基础信息(ID、名称、编号、负责人、开始时间、结束时间) + /// - 用户参与信息(部门ID、战队名称、目标数量等) + /// + /// 用户ID + /// 开始时间(可选) + /// 结束时间(可选) + /// 用户参与的拓客活动列表 + /// 成功返回用户参与的拓客活动列表 + /// 请求参数错误 + /// 服务器内部错误 + [HttpGet("user/{userId}")] + [ProducesResponseType(typeof(List), 200)] + [ProducesResponseType(400)] + [ProducesResponseType(500)] + public async Task> GetUserEvents(string userId, [FromQuery] DateTime? startTime = null, [FromQuery] DateTime? endTime = null) + { + try + { + // 先测试简单的查询 + var eventUsers = await _db.Queryable().Where(u => u.UserId == userId).ToListAsync(); + + if (!eventUsers.Any()) + { + return new List(); + } + + var eventIds = eventUsers.Select(u => u.EventId).ToList(); + + // 查询活动信息 + var events = await _db.Queryable().Where(e => eventIds.Contains(e.Id)).ToListAsync(); + + // 时间范围筛选 + if (startTime.HasValue) + { + events = events.Where(e => e.StartTime >= startTime.Value).ToList(); + } + + if (endTime.HasValue) + { + events = events.Where(e => e.EndTime <= endTime.Value).ToList(); + } + + // 构建结果 + var result = new List(); + foreach (var eventUser in eventUsers) + { + var eventInfo = events.FirstOrDefault(e => e.Id == eventUser.EventId); + if (eventInfo != null) + { + result.Add( + new LqEventUserEventOutput + { + // 活动基础信息 + EventId = eventInfo.Id, + 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, + } + ); + } + } + + // 按开始时间降序排列 + return result.OrderByDescending(x => x.StartTime).ToList(); + } + catch (Exception ex) + { + throw NCCException.Oh("获取用户参与的拓客活动失败", ex); + } + } + #endregion + } +} diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqHytkHytkService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqHytkHytkService.cs index 1730d5f..07fc53d 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqHytkHytkService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqHytkHytkService.cs @@ -64,6 +64,7 @@ namespace NCC.Extend.LqHytkHytk _userManager = userManager; } + #region 获取退卡信息列表 /// /// 获取退卡信息列表 /// @@ -73,8 +74,7 @@ namespace NCC.Extend.LqHytkHytk public async Task GetList([FromQuery] LqHytkHytkListQueryInput input) { var sidx = input.sidx == null ? "id" : input.sidx; - List queryTksj = - input.tksj != null ? input.tksj.Split(',').ToObeject>() : null; + List queryTksj = input.tksj != null ? input.tksj.Split(',').ToObeject>() : null; DateTime? startTksj = queryTksj != null ? Ext.GetDateTime(queryTksj.First()) : null; DateTime? endTksj = queryTksj != null ? Ext.GetDateTime(queryTksj.Last()) : null; var data = await _db.Queryable() @@ -91,36 +91,9 @@ namespace NCC.Extend.LqHytkHytk .WhereIF(!string.IsNullOrEmpty(input.bz), p => p.Bz.Contains(input.bz)) .WhereIF(!string.IsNullOrEmpty(input.tkzt), p => p.Tkzt.Contains(input.tkzt)) .WhereIF(!string.IsNullOrEmpty(input.tkyy), p => p.Tkyy.Contains(input.tkyy)) - .WhereIF( - !string.IsNullOrEmpty(input.fileUrl), - p => p.FileUrl.Contains(input.fileUrl) - ) - .WhereIF( - queryTksj != null, - p => - p.Tksj - >= new DateTime( - startTksj.ToDate().Year, - startTksj.ToDate().Month, - startTksj.ToDate().Day, - 0, - 0, - 0 - ) - ) - .WhereIF( - queryTksj != null, - p => - p.Tksj - <= new DateTime( - endTksj.ToDate().Year, - endTksj.ToDate().Month, - endTksj.ToDate().Day, - 23, - 59, - 59 - ) - ) + .WhereIF(!string.IsNullOrEmpty(input.fileUrl), p => p.FileUrl.Contains(input.fileUrl)) + .WhereIF(queryTksj != null, p => p.Tksj >= new DateTime(startTksj.ToDate().Year, startTksj.ToDate().Month, startTksj.ToDate().Day, 0, 0, 0)) + .WhereIF(queryTksj != null, p => p.Tksj <= new DateTime(endTksj.ToDate().Year, endTksj.ToDate().Month, endTksj.ToDate().Day, 23, 59, 59)) .WhereIF(!string.IsNullOrEmpty(input.czry), p => p.Czry.Equals(input.czry)) .Select(it => new LqHytkHytkListOutput { @@ -146,7 +119,9 @@ namespace NCC.Extend.LqHytkHytk .ToPagedListAsync(input.currentPage, input.pageSize); return PageResult.SqlSugarPageResult(data); } + #endregion + #region 创建退卡信息及其关联的品项明细、健康师业绩、科技部老师业绩信息 /// /// 创建退卡信息及其关联的品项明细、健康师业绩、科技部老师业绩信息 /// @@ -233,9 +208,7 @@ namespace NCC.Extend.LqHytkHytk _db.BeginTran(); // 新增退卡主表记录 - var newEntity = await _db.Insertable(entity) - .IgnoreColumns(ignoreNullColumn: true) - .ExecuteReturnEntityAsync(); + var newEntity = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteReturnEntityAsync(); // 收集所有需要插入的实体,然后批量插入 var allMxEntities = new List(); @@ -262,8 +235,7 @@ namespace NCC.Extend.LqHytkHytk 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)), + F_TotalPrice = item.F_TotalPrice ?? (item.pxjg * (item.F_ProjectNumber ?? 1)), }; allMxEntities.Add(lqHytkMxEntity); @@ -289,6 +261,7 @@ namespace NCC.Extend.LqHytkHytk F_CreateTime = DateTime.Now, F_CreateUser = userInfo.userId, F_DeleteMark = 0, + CardReturn = lqHytkMxEntity.Id, } ); } @@ -315,6 +288,7 @@ namespace NCC.Extend.LqHytkHytk F_CreateTime = DateTime.Now, F_CreateUser = userInfo.userId, F_DeleteMark = 0, + CardReturn = lqHytkMxEntity.Id, } ); } @@ -349,7 +323,9 @@ namespace NCC.Extend.LqHytkHytk throw NCCException.Oh(ErrorCode.COM1005, ex.Message); } } + #endregion + #region 更新退卡信息及其关联的品项明细、健康师业绩、科技部老师业绩信息 /// /// 更新退卡信息及其关联的品项明细、健康师业绩、科技部老师业绩信息 /// @@ -381,15 +357,9 @@ 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.Gltkbh == id) - .ExecuteCommandAsync(); - await _db.Deleteable() - .Where(x => x.Gltkbh == id) - .ExecuteCommandAsync(); + await _db.Deleteable().Where(x => x.Gltkbh == id).ExecuteCommandAsync(); + await _db.Deleteable().Where(x => x.Gltkbh == id).ExecuteCommandAsync(); + await _db.Deleteable().Where(x => x.Gltkbh == id).ExecuteCommandAsync(); // 收集所有需要插入的实体,然后批量插入 var allMxEntities = new List(); @@ -416,8 +386,7 @@ namespace NCC.Extend.LqHytkHytk 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)), + F_TotalPrice = item.F_TotalPrice ?? (item.pxjg * (item.F_ProjectNumber ?? 1)), }; allMxEntities.Add(lqHytkMxEntity); @@ -501,7 +470,9 @@ namespace NCC.Extend.LqHytkHytk throw NCCException.Oh(ErrorCode.COM1005, ex.Message); } } + #endregion + #region 删除退卡信息 /// /// 删除退卡信息 /// @@ -517,7 +488,9 @@ namespace NCC.Extend.LqHytkHytk await _lqHytkHytkRepository.UpdateAsync(entity); } } + #endregion + #region 获取退卡信息详情 /// /// 获取退卡信息详情 /// @@ -551,19 +524,13 @@ 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.Gltkbh == entity.Id).ToListAsync(); // 3. 查询健康师业绩列表 - var lqHytkJksyjList = await _db.Queryable() - .Where(w => w.Gltkbh == entity.Id) - .ToListAsync(); + var lqHytkJksyjList = await _db.Queryable().Where(w => w.Gltkbh == entity.Id).ToListAsync(); // 4. 查询科技部老师业绩列表 - var lqHytkKjbsyjList = await _db.Queryable() - .Where(w => w.Gltkbh == entity.Id) - .ToListAsync(); + var lqHytkKjbsyjList = await _db.Queryable().Where(w => w.Gltkbh == entity.Id).ToListAsync(); // 5. 构建品项明细输出,每个品项关联对应的业绩信息 var mxOutputList = new List(); @@ -584,11 +551,11 @@ namespace NCC.Extend.LqHytkHytk }; // 关联该品项的健康师业绩 - var jksyjForMx = lqHytkJksyjList.Where(j => j.F_tkpxid == mx.Id).ToList(); + var jksyjForMx = lqHytkJksyjList.Where(j => j.CardReturn == mx.Id).ToList(); mxOutput.lqHytkJksyjList = jksyjForMx.Adapt>(); // 关联该品项的科技部老师业绩 - var kjbsyjForMx = lqHytkKjbsyjList.Where(k => k.F_tkpxid == mx.Id).ToList(); + var kjbsyjForMx = lqHytkKjbsyjList.Where(k => k.CardReturn == mx.Id).ToList(); mxOutput.lqHytkKjbsyjList = kjbsyjForMx.Adapt>(); mxOutputList.Add(mxOutput); @@ -608,5 +575,6 @@ namespace NCC.Extend.LqHytkHytk throw NCCException.Oh(ErrorCode.COM1000, "获取退卡记录失败"); } } + #endregion } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqJlmxbService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqJlmxbService.cs index e880a16..810b668 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqJlmxbService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqJlmxbService.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.LqJlmxb; +using NCC.Extend.Entitys.lq_jlmxb; using NCC.Extend.Interfaces.LqJlmxb; -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_jlmxb; -using NCC.Extend.Entitys.Dto.LqJlmxb; 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.LqJlmxb { /// /// 奖励统计表服务 /// - [ApiDescriptionSettings(Tag = "Extend",Name = "LqJlmxb", Order = 200)] + [ApiDescriptionSettings(Tag = "Extend", Name = "LqJlmxb", Order = 200)] [Route("api/Extend/[controller]")] public class LqJlmxbService : ILqJlmxbService, IDynamicApiController, ITransient { @@ -39,11 +39,9 @@ namespace NCC.Extend.LqJlmxb /// /// 初始化一个类型的新实例 /// - public LqJlmxbService( - ISqlSugarRepository lqJlmxbRepository, - IUserManager userManager) + public LqJlmxbService(ISqlSugarRepository lqJlmxbRepository, IUserManager userManager) { - _lqJlmxbRepository = lqJlmxbRepository; + _lqJlmxbRepository = lqJlmxbRepository; _db = _lqJlmxbRepository.Context; _userManager = userManager; } @@ -62,10 +60,10 @@ namespace NCC.Extend.LqJlmxb } /// - /// 获取奖励统计表列表 - /// - /// 请求参数 - /// + /// 获取奖励统计表列表 + /// + /// 请求参数 + /// [HttpGet("")] public async Task GetList([FromQuery] LqJlmxbListQueryInput input) { @@ -87,26 +85,29 @@ namespace NCC.Extend.LqJlmxb .WhereIF(!string.IsNullOrEmpty(input.hj), p => p.Hj.Contains(input.hj)) .WhereIF(!string.IsNullOrEmpty(input.kcmx), p => p.Kcmx.Contains(input.kcmx)) .WhereIF(!string.IsNullOrEmpty(input.bhjb), p => p.Bhjb.Contains(input.bhjb)) - .Select(it=> new LqJlmxbListOutput + .Select(it => new LqJlmxbListOutput { id = it.Id, - mdbh=it.Mdbh, - mdmc=it.Mdmc, - gw=it.Gw, - jks=it.Jks, - ymmsk=it.Ymmsk, - kjbmsk=it.Kjbmsk, - cjj=it.Cjj, - pk=it.Pk, - ty=it.Ty, - db=it.Db, - cs=it.Cs, - jb=it.Jb, - hj=it.Hj, - kcmx=it.Kcmx, - bhjb=it.Bhjb, - }).MergeTable().OrderBy(sidx+" "+input.sort).ToPagedListAsync(input.currentPage, input.pageSize); - return PageResult.SqlSugarPageResult(data); + mdbh = it.Mdbh, + mdmc = it.Mdmc, + gw = it.Gw, + jks = it.Jks, + ymmsk = it.Ymmsk, + kjbmsk = it.Kjbmsk, + cjj = it.Cjj, + pk = it.Pk, + ty = it.Ty, + db = it.Db, + cs = it.Cs, + jb = it.Jb, + hj = it.Hj, + kcmx = it.Kcmx, + bhjb = it.Bhjb, + }) + .MergeTable() + .OrderBy(sidx + " " + input.sort) + .ToPagedListAsync(input.currentPage, input.pageSize); + return PageResult.SqlSugarPageResult(data); } /// @@ -121,14 +122,15 @@ namespace NCC.Extend.LqJlmxb 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] LqJlmxbListQueryInput input) { @@ -150,33 +152,36 @@ namespace NCC.Extend.LqJlmxb .WhereIF(!string.IsNullOrEmpty(input.hj), p => p.Hj.Contains(input.hj)) .WhereIF(!string.IsNullOrEmpty(input.kcmx), p => p.Kcmx.Contains(input.kcmx)) .WhereIF(!string.IsNullOrEmpty(input.bhjb), p => p.Bhjb.Contains(input.bhjb)) - .Select(it=> new LqJlmxbListOutput + .Select(it => new LqJlmxbListOutput { id = it.Id, - mdbh=it.Mdbh, - mdmc=it.Mdmc, - gw=it.Gw, - jks=it.Jks, - ymmsk=it.Ymmsk, - kjbmsk=it.Kjbmsk, - cjj=it.Cjj, - pk=it.Pk, - ty=it.Ty, - db=it.Db, - cs=it.Cs, - jb=it.Jb, + mdbh = it.Mdbh, + mdmc = it.Mdmc, + gw = it.Gw, + jks = it.Jks, + ymmsk = it.Ymmsk, + kjbmsk = it.Kjbmsk, + cjj = it.Cjj, + pk = it.Pk, + ty = it.Ty, + db = it.Db, + cs = it.Cs, + jb = it.Jb, hj = it.Hj, - kcmx=it.Kcmx, - bhjb=it.Bhjb, - }).MergeTable().OrderBy(sidx+" "+input.sort).ToListAsync(); - return data; + kcmx = it.Kcmx, + bhjb = it.Bhjb, + }) + .MergeTable() + .OrderBy(sidx + " " + input.sort) + .ToListAsync(); + return data; } /// - /// 导出奖励统计表 - /// - /// 请求参数 - /// + /// 导出奖励统计表 + /// + /// 请求参数 + /// [HttpGet("Actions/Export")] public async Task Export([FromQuery] LqJlmxbListQueryInput input) { @@ -191,7 +196,8 @@ namespace NCC.Extend.LqJlmxb { exportData = await this.GetNoPagingList(input); } - List paramList = "[{\"value\":\"奖励编号\",\"field\":\"id\"},{\"value\":\"门店编号\",\"field\":\"mdbh\"},{\"value\":\"门店名称\",\"field\":\"mdmc\"},{\"value\":\"岗位\",\"field\":\"gw\"},{\"value\":\"健康师\",\"field\":\"jks\"},{\"value\":\"医美秒杀卡\",\"field\":\"ymmsk\"},{\"value\":\"科技部秒杀卡\",\"field\":\"kjbmsk\"},{\"value\":\"成交奖\",\"field\":\"cjj\"},{\"value\":\"PK\",\"field\":\"pk\"},{\"value\":\"体验\",\"field\":\"ty\"},{\"value\":\"打版\",\"field\":\"db\"},{\"value\":\"沉睡\",\"field\":\"cs\"},{\"value\":\"嘉宾\",\"field\":\"jb\"},{\"value\":\"合计\",\"field\":\"hj\"},{\"value\":\"扣除明细\",\"field\":\"kcmx\"},{\"value\":\"不含嘉宾\",\"field\":\"bhjb\"},]".ToList(); + List paramList = + "[{\"value\":\"奖励编号\",\"field\":\"id\"},{\"value\":\"门店编号\",\"field\":\"mdbh\"},{\"value\":\"门店名称\",\"field\":\"mdmc\"},{\"value\":\"岗位\",\"field\":\"gw\"},{\"value\":\"健康师\",\"field\":\"jks\"},{\"value\":\"医美秒杀卡\",\"field\":\"ymmsk\"},{\"value\":\"科技部秒杀卡\",\"field\":\"kjbmsk\"},{\"value\":\"成交奖\",\"field\":\"cjj\"},{\"value\":\"PK\",\"field\":\"pk\"},{\"value\":\"体验\",\"field\":\"ty\"},{\"value\":\"打版\",\"field\":\"db\"},{\"value\":\"沉睡\",\"field\":\"cs\"},{\"value\":\"嘉宾\",\"field\":\"jb\"},{\"value\":\"合计\",\"field\":\"hj\"},{\"value\":\"扣除明细\",\"field\":\"kcmx\"},{\"value\":\"不含嘉宾\",\"field\":\"bhjb\"},]".ToList(); ExcelConfig excelconfig = new ExcelConfig(); excelconfig.FileName = "奖励统计表.xls"; excelconfig.HeadFont = "微软雅黑"; @@ -210,11 +216,7 @@ namespace NCC.Extend.LqJlmxb 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; } @@ -234,7 +236,7 @@ namespace NCC.Extend.LqJlmxb //开启事务 _db.BeginTran(); //批量删除奖励统计表 - await _db.Deleteable().In(d => d.Id,ids).ExecuteCommandAsync(); + await _db.Deleteable().In(d => d.Id, ids).ExecuteCommandAsync(); //关闭事务 _db.CommitTran(); } @@ -258,7 +260,8 @@ namespace NCC.Extend.LqJlmxb { 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); } /// @@ -271,7 +274,8 @@ namespace NCC.Extend.LqJlmxb 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/LqTkjlbService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs index c3e3c90..32f64c7 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs @@ -1,36 +1,36 @@ -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.Interfaces.LqTkjlb; -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.lq_tkjlb; -using NCC.Extend.Entitys.lq_ryzl; using NCC.Extend.Entitys.Dto.LqTkjlb; -using Yitter.IdGenerator; -using NCC.Common.Helper; +using NCC.Extend.Entitys.lq_ryzl; +using NCC.Extend.Entitys.lq_tkjlb; +using NCC.Extend.Interfaces.LqTkjlb; +using NCC.FriendlyException; using NCC.JsonSerialization; -using NCC.Common.Model.NPOI; -using NCC.Common.Configuration; -using NCC.DataEncryption; -using NCC.ClayObject; using NCC.System.Entitys.Permission; +using SqlSugar; +using Yitter.IdGenerator; namespace NCC.Extend.LqTkjlb { /// /// 拓客管理服务 /// - [ApiDescriptionSettings(Tag = "Extend",Name = "LqTkjlb", Order = 200)] + [ApiDescriptionSettings(Tag = "Extend", Name = "LqTkjlb", Order = 200)] [Route("api/Extend/[controller]")] public class LqTkjlbService : ILqTkjlbService, IDynamicApiController, ITransient { @@ -41,15 +41,14 @@ namespace NCC.Extend.LqTkjlb /// /// 初始化一个类型的新实例 /// - public LqTkjlbService( - ISqlSugarRepository lqTkjlbRepository, - IUserManager userManager) + public LqTkjlbService(ISqlSugarRepository lqTkjlbRepository, IUserManager userManager) { - _lqTkjlbRepository = lqTkjlbRepository; + _lqTkjlbRepository = lqTkjlbRepository; _db = _lqTkjlbRepository.Context; _userManager = userManager; } + #region 获取拓客管理 /// /// 获取拓客管理 /// @@ -62,12 +61,14 @@ namespace NCC.Extend.LqTkjlb var output = entity.Adapt(); return output; } + #endregion + #region 获取拓客管理列表 /// - /// 获取拓客管理列表 - /// - /// 请求参数 - /// + /// 获取拓客管理列表 + /// + /// 请求参数 + /// [HttpGet("")] public async Task GetList([FromQuery] LqTkjlbListQueryInput input) { @@ -88,25 +89,29 @@ namespace NCC.Extend.LqTkjlb .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)) - .Select(it=> new LqTkjlbListOutput + .Select(it => new LqTkjlbListOutput { id = it.Id, - tksj=it.Tksj, - // tkry=it.Tkry, + 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, - }).MergeTable().OrderBy(sidx+" "+input.sort).ToPagedListAsync(input.currentPage, input.pageSize); - return PageResult.SqlSugarPageResult(data); + gkxm = it.Gkxm, + dhhm = it.Dhhm, + gmzs = it.Gmzs, + zffs = it.Zffs, + sfjwx = it.Sfjwx, + bz = it.Bz, + ssmd = it.Ssmd, + sszd = it.Sszd, + }) + .MergeTable() + .OrderBy(sidx + " " + input.sort) + .ToPagedListAsync(input.currentPage, input.pageSize); + return PageResult.SqlSugarPageResult(data); } - + #endregion + #region 新建拓客管理 /// /// 新建拓客管理 /// @@ -127,14 +132,16 @@ namespace NCC.Extend.LqTkjlb } 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); } - + #endregion + #region 获取拓客管理无分页列表 /// - /// 获取拓客管理无分页列表 - /// - /// 请求参数 - /// + /// 获取拓客管理无分页列表 + /// + /// 请求参数 + /// [NonAction] public async Task GetNoPagingList([FromQuery] LqTkjlbListQueryInput input) { @@ -155,28 +162,32 @@ namespace NCC.Extend.LqTkjlb .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)) - .Select(it=> new LqTkjlbListOutput + .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, - }).MergeTable().OrderBy(sidx+" "+input.sort).ToListAsync(); - return data; + 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, + }) + .MergeTable() + .OrderBy(sidx + " " + input.sort) + .ToListAsync(); + return data; } - + #endregion + #region 导出拓客管理 /// - /// 导出拓客管理 - /// - /// 请求参数 - /// + /// 导出拓客管理 + /// + /// 请求参数 + /// [HttpGet("Actions/Export")] public async Task Export([FromQuery] LqTkjlbListQueryInput input) { @@ -191,7 +202,8 @@ namespace NCC.Extend.LqTkjlb { exportData = await this.GetNoPagingList(input); } - List paramList = "[{\"value\":\"拓客编号\",\"field\":\"id\"},{\"value\":\"拓客人员\",\"field\":\"tkry\"},{\"value\":\"拓客时间\",\"field\":\"tksj\"},{\"value\":\"顾客姓名\",\"field\":\"gkxm\"},{\"value\":\"电话号码\",\"field\":\"dhhm\"},{\"value\":\"购买张数\",\"field\":\"gmzs\"},{\"value\":\"支付方式\",\"field\":\"zffs\"},{\"value\":\"是否加微信\",\"field\":\"sfjwx\"},{\"value\":\"备注\",\"field\":\"bz\"},{\"value\":\"所属门店\",\"field\":\"ssmd\"},{\"value\":\"所属战队\",\"field\":\"sszd\"},]".ToList(); + List paramList = + "[{\"value\":\"拓客编号\",\"field\":\"id\"},{\"value\":\"拓客人员\",\"field\":\"tkry\"},{\"value\":\"拓客时间\",\"field\":\"tksj\"},{\"value\":\"顾客姓名\",\"field\":\"gkxm\"},{\"value\":\"电话号码\",\"field\":\"dhhm\"},{\"value\":\"购买张数\",\"field\":\"gmzs\"},{\"value\":\"支付方式\",\"field\":\"zffs\"},{\"value\":\"是否加微信\",\"field\":\"sfjwx\"},{\"value\":\"备注\",\"field\":\"bz\"},{\"value\":\"所属门店\",\"field\":\"ssmd\"},{\"value\":\"所属战队\",\"field\":\"sszd\"},]".ToList(); ExcelConfig excelconfig = new ExcelConfig(); excelconfig.FileName = "拓客管理.xls"; excelconfig.HeadFont = "微软雅黑"; @@ -210,13 +222,11 @@ namespace NCC.Extend.LqTkjlb 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 + #region 批量删除拓客管理 /// /// 批量删除拓客管理 @@ -234,7 +244,7 @@ namespace NCC.Extend.LqTkjlb //开启事务 _db.BeginTran(); //批量删除拓客管理 - await _db.Deleteable().In(d => d.Id,ids).ExecuteCommandAsync(); + await _db.Deleteable().In(d => d.Id, ids).ExecuteCommandAsync(); //关闭事务 _db.CommitTran(); } @@ -246,7 +256,8 @@ namespace NCC.Extend.LqTkjlb } } } - + #endregion + #region 更新拓客管理 /// /// 更新拓客管理 /// @@ -258,9 +269,11 @@ namespace NCC.Extend.LqTkjlb { 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); } - + #endregion + #region 删除拓客管理 /// /// 删除拓客管理 /// @@ -271,9 +284,11 @@ namespace NCC.Extend.LqTkjlb 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); } - + #endregion + #region 获取拓客排行榜 /// /// 获取拓客排行榜 /// @@ -281,14 +296,7 @@ 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.Sszd).Select(it => new LqTkjlbRankingOutput { sszd = it.Sszd, tkrs = SqlFunc.AggregateCount(it.Id) }).ToListAsync(); // 在内存中排序并添加排名 var sortedData = data.OrderByDescending(it => it.tkrs).ToList(); @@ -299,7 +307,8 @@ namespace NCC.Extend.LqTkjlb return sortedData; } - + #endregion + #region 获取战队人员详细报表 /// /// 获取战队人员详细报表 /// @@ -310,10 +319,7 @@ 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.Sszd).Select(it => it.Sszd).ToListAsync(); foreach (var team in teams) { @@ -323,15 +329,15 @@ namespace NCC.Extend.LqTkjlb .GroupBy(it => it.Tkry) .Select(it => new { - // tkry = it.Tkry, - tkry = SqlFunc.Subqueryable().Where(u => u.MobilePhone == it.Tkry).Select(u => u.RealName), - tkrs = SqlFunc.AggregateCount(it.Id) + // tkry = it.Tkry, + tkry = SqlFunc.Subqueryable().Where(u => u.MobilePhone == it.Tkry).Select(u => u.RealName), + tkrs = SqlFunc.AggregateCount(it.Id), }) .ToListAsync(); // 按拓客数量排序 var sortedMembers = teamMembers.OrderByDescending(m => m.tkrs).ToList(); - + // 计算战队总拓客数量 var totalCount = sortedMembers.Sum(m => m.tkrs); @@ -340,7 +346,7 @@ namespace NCC.Extend.LqTkjlb { sszd = team, totalCount = totalCount, - members = new List() + members = new List(), }; // 添加成员详情 @@ -348,14 +354,16 @@ namespace NCC.Extend.LqTkjlb { var member = sortedMembers[i]; var percentage = totalCount > 0 ? (int)Math.Round((double)member.tkrs / totalCount * 100) : 0; - - teamDetail.members.Add(new TeamMemberDetail - { - tkry = member.tkry, - tkrs = member.tkrs, - teamRanking = i + 1, - percentage = percentage - }); + + teamDetail.members.Add( + new TeamMemberDetail + { + tkry = member.tkry, + tkrs = member.tkrs, + teamRanking = i + 1, + percentage = percentage, + } + ); } result.Add(teamDetail); @@ -364,5 +372,6 @@ namespace NCC.Extend.LqTkjlb // 按战队总拓客数量排序 return result.OrderByDescending(t => t.totalCount).ToList(); } + #endregion } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqYxhdfaService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqYxhdfaService.cs index 80f60a2..340b36b 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqYxhdfaService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqYxhdfaService.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.LqYxhdfa; +using NCC.Extend.Entitys.lq_yxhdfa; using NCC.Extend.Interfaces.LqYxhdfa; -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_yxhdfa; -using NCC.Extend.Entitys.Dto.LqYxhdfa; 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.LqYxhdfa { /// /// 营销活动方案服务 /// - [ApiDescriptionSettings(Tag = "Extend",Name = "LqYxhdfa", Order = 200)] + [ApiDescriptionSettings(Tag = "Extend", Name = "LqYxhdfa", Order = 200)] [Route("api/Extend/[controller]")] public class LqYxhdfaService : ILqYxhdfaService, IDynamicApiController, ITransient { @@ -39,11 +39,9 @@ namespace NCC.Extend.LqYxhdfa /// /// 初始化一个类型的新实例 /// - public LqYxhdfaService( - ISqlSugarRepository lqYxhdfaRepository, - IUserManager userManager) + public LqYxhdfaService(ISqlSugarRepository lqYxhdfaRepository, IUserManager userManager) { - _lqYxhdfaRepository = lqYxhdfaRepository; + _lqYxhdfaRepository = lqYxhdfaRepository; _db = _lqYxhdfaRepository.Context; _userManager = userManager; } @@ -62,10 +60,10 @@ namespace NCC.Extend.LqYxhdfa } /// - /// 获取营销活动方案列表 - /// - /// 请求参数 - /// + /// 获取营销活动方案列表 + /// + /// 请求参数 + /// [HttpGet("")] public async Task GetList([FromQuery] LqYxhdfaListQueryInput input) { @@ -76,15 +74,18 @@ namespace NCC.Extend.LqYxhdfa .WhereIF(!string.IsNullOrEmpty(input.hdmc), p => p.Hdmc.Contains(input.hdmc)) .WhereIF(!string.IsNullOrEmpty(input.zsj), p => p.Zsj.Contains(input.zsj)) .WhereIF(!string.IsNullOrEmpty(input.jej), p => p.Jej.Contains(input.jej)) - .Select(it=> new LqYxhdfaListOutput + .Select(it => new LqYxhdfaListOutput { id = it.Id, - yxhdbh=it.Yxhdbh, - hdmc=it.Hdmc, - zsj=it.Zsj, - jej=it.Jej, - }).MergeTable().OrderBy(sidx+" "+input.sort).ToPagedListAsync(input.currentPage, input.pageSize); - return PageResult.SqlSugarPageResult(data); + yxhdbh = it.Yxhdbh, + hdmc = it.Hdmc, + zsj = it.Zsj, + jej = it.Jej, + }) + .MergeTable() + .OrderBy(sidx + " " + input.sort) + .ToPagedListAsync(input.currentPage, input.pageSize); + return PageResult.SqlSugarPageResult(data); } /// @@ -99,14 +100,15 @@ namespace NCC.Extend.LqYxhdfa 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] LqYxhdfaListQueryInput input) { @@ -117,22 +119,25 @@ namespace NCC.Extend.LqYxhdfa .WhereIF(!string.IsNullOrEmpty(input.hdmc), p => p.Hdmc.Contains(input.hdmc)) .WhereIF(!string.IsNullOrEmpty(input.zsj), p => p.Zsj.Contains(input.zsj)) .WhereIF(!string.IsNullOrEmpty(input.jej), p => p.Jej.Contains(input.jej)) - .Select(it=> new LqYxhdfaListOutput + .Select(it => new LqYxhdfaListOutput { id = it.Id, - yxhdbh=it.Yxhdbh, - hdmc=it.Hdmc, - zsj=it.Zsj, - jej=it.Jej, - }).MergeTable().OrderBy(sidx+" "+input.sort).ToListAsync(); - return data; + yxhdbh = it.Yxhdbh, + hdmc = it.Hdmc, + zsj = it.Zsj, + jej = it.Jej, + }) + .MergeTable() + .OrderBy(sidx + " " + input.sort) + .ToListAsync(); + return data; } /// - /// 导出营销活动方案 - /// - /// 请求参数 - /// + /// 导出营销活动方案 + /// + /// 请求参数 + /// [HttpGet("Actions/Export")] public async Task Export([FromQuery] LqYxhdfaListQueryInput input) { @@ -147,7 +152,8 @@ namespace NCC.Extend.LqYxhdfa { exportData = await this.GetNoPagingList(input); } - List paramList = "[{\"value\":\"方案编号\",\"field\":\"id\"},{\"value\":\"营销活动编号\",\"field\":\"yxhdbh\"},{\"value\":\"活动名称\",\"field\":\"hdmc\"},{\"value\":\"张数奖\",\"field\":\"zsj\"},{\"value\":\"金额奖\",\"field\":\"jej\"},]".ToList(); + List paramList = + "[{\"value\":\"方案编号\",\"field\":\"id\"},{\"value\":\"营销活动编号\",\"field\":\"yxhdbh\"},{\"value\":\"活动名称\",\"field\":\"hdmc\"},{\"value\":\"张数奖\",\"field\":\"zsj\"},{\"value\":\"金额奖\",\"field\":\"jej\"},]".ToList(); ExcelConfig excelconfig = new ExcelConfig(); excelconfig.FileName = "营销活动方案.xls"; excelconfig.HeadFont = "微软雅黑"; @@ -166,11 +172,7 @@ namespace NCC.Extend.LqYxhdfa 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; } @@ -190,7 +192,7 @@ namespace NCC.Extend.LqYxhdfa //开启事务 _db.BeginTran(); //批量删除营销活动方案 - await _db.Deleteable().In(d => d.Id,ids).ExecuteCommandAsync(); + await _db.Deleteable().In(d => d.Id, ids).ExecuteCommandAsync(); //关闭事务 _db.CommitTran(); } @@ -214,7 +216,8 @@ namespace NCC.Extend.LqYxhdfa { 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); } /// @@ -227,7 +230,8 @@ namespace NCC.Extend.LqYxhdfa 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/项目信息-薪酬规则与名词解释.md b/项目信息-薪酬规则与名词解释.md index 63ce419..8c2a33c 100644 --- a/项目信息-薪酬规则与名词解释.md +++ b/项目信息-薪酬规则与名词解释.md @@ -50,14 +50,17 @@ ### 门店相关 17. **门店分类**:门店分为A、B、C类,不同类别有不同的底薪 -18. **新店**:在门店信息中设置时间段,在该时间段内按新店薪酬规则计算 -19. **老店**:不在新店时间段内,按老店薪酬规则计算 -20. **门店生命线**:每个门店的生命线不一样,对所有角色生效 -21. **金三角(战队)**:每月初由不同健康师组成战队,单人也可形成战队 +18. **门店类别**:门店分为200平或旗舰店两种类型(仅在新店时设置) + - **200平门店**:标准门店类型,按正常薪酬规则计算 + - **旗舰店**:特殊门店类型,需要扣除负奖励800元 +19. **新店**:在门店信息中设置时间段,在该时间段内按新店薪酬规则计算 +20. **老店**:不在新店时间段内,按老店薪酬规则计算 +21. **门店生命线**:每个门店的生命线不一样,对所有角色生效 +22. **金三角(战队)**:每月初由不同健康师组成战队,单人也可形成战队 ### 其他 -22. **毛利**:销售业绩 - 产品物料 - 合作项目成本 - 店内支出 - 洗毛巾 -23. **总经理保底**:总经理工资在一年里可以有一个月保底8000元,保底寒假月份(春节)不能使用 +23. **毛利**:销售业绩 - 产品物料 - 合作项目成本 - 店内支出 - 洗毛巾 +24. **总经理保底**:总经理工资在一年里可以有一个月保底8000元,保底寒假月份(春节)不能使用 --- @@ -70,13 +73,32 @@ ### 健康师薪酬规则 -#### 底薪规则 +#### 老店健康师底薪规则 - **一星**:月消耗达到10000元 且 项目数达到96个 → 底薪2000元 - **二星**:月消耗达到20000元 且 项目数达到126个 → 底薪2200元 - **三星**:月消耗达到40000元 且 项目数达到156个 → 底薪2400元 - **0星**:月消耗未达到10000元 且 项目数未达到96个 → 底薪1800元 - **特殊情况**:月消耗或项目数中有一个为0星(未达到最低标准),底薪为一星(2000元) +#### 新店健康师薪酬规则 +**重要说明**:新店不考核消耗,健康师分成3个阶段: + +**第一阶段:新客转化阶段** +- 主要考核新客转化率 +- 提成主要来源于新客转化业绩 + +**第二阶段:升单人头阶段** +- 主要考核升单人头数 +- 提成主要来源于升单业绩 + +**第三阶段:业绩和项目数阶段** +- 无新客转化和升单人头提成 +- 业绩主要计算提成 +- 项目数主要计算底薪 + +**旗舰店特殊规则**: +- 旗舰店类型门店需要扣除负奖励800元 + ### 金三角(战队)提成规则 #### 3人战队 @@ -159,6 +181,8 @@ #### 新店店长(底薪4000元) +**重要说明**:新店店长涉及全部阶段,都有负奖励机制 + **考核指标**: - 生命线-业绩、人头-固定 - 一个指标未达到:扣800元 @@ -170,6 +194,9 @@ **提成计算**:毛利 × 业绩提成比例 +**旗舰店特殊规则**: +- 旗舰店类型门店需要扣除负奖励800元 + ### 主任薪酬规则 #### 老店主任(底薪3500元)