diff --git a/netcore/src/Modularity/Common/NCC.Common/Extension/Ext.cs b/netcore/src/Modularity/Common/NCC.Common/Extension/Ext.cs
index 48fd3e9..fa7a23d 100644
--- a/netcore/src/Modularity/Common/NCC.Common/Extension/Ext.cs
+++ b/netcore/src/Modularity/Common/NCC.Common/Extension/Ext.cs
@@ -808,7 +808,7 @@ namespace NCC.Common.Extension
}
#endregion
-
+
///
/// 元转分
///
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbListByJksQueryInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbListByJksQueryInput.cs
new file mode 100644
index 0000000..f8e3d82
--- /dev/null
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbListByJksQueryInput.cs
@@ -0,0 +1,36 @@
+using NCC.Common.Filter;
+
+namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
+{
+ ///
+ /// 根据健康师ID查询开单列表输入
+ ///
+ public class LqKdKdjlbListByJksQueryInput : PageInputBase
+ {
+ ///
+ /// 健康师ID(必填)
+ ///
+ public string jksId { get; set; }
+
+ ///
+ /// 开始时间(可选,格式:yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss)
+ ///
+ public string startTime { get; set; }
+
+ ///
+ /// 结束时间(可选,格式:yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss)
+ ///
+ public string endTime { get; set; }
+
+ ///
+ /// 门店ID(可选)
+ ///
+ public string djmd { get; set; }
+
+ ///
+ /// 是否有效(可选,0=全部,1=有效,2=无效,默认1)
+ ///
+ public int isEffective { get; set; } = 1;
+ }
+}
+
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbListByKjbQueryInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbListByKjbQueryInput.cs
new file mode 100644
index 0000000..005c9cb
--- /dev/null
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbListByKjbQueryInput.cs
@@ -0,0 +1,36 @@
+using NCC.Common.Filter;
+
+namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
+{
+ ///
+ /// 根据科技部老师ID查询开单列表输入
+ ///
+ public class LqKdKdjlbListByKjbQueryInput : PageInputBase
+ {
+ ///
+ /// 科技部老师ID(必填)
+ ///
+ public string kjblsId { get; set; }
+
+ ///
+ /// 开始时间(可选,格式:yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss)
+ ///
+ public string startTime { get; set; }
+
+ ///
+ /// 结束时间(可选,格式:yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss)
+ ///
+ public string endTime { get; set; }
+
+ ///
+ /// 门店ID(可选)
+ ///
+ public string djmd { get; set; }
+
+ ///
+ /// 是否有效(可选,0=全部,1=有效,2=无效,默认1)
+ ///
+ public int isEffective { get; set; } = 1;
+ }
+}
+
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbListOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbListOutput.cs
index 1b40dfc..6ab7a25 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbListOutput.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbListOutput.cs
@@ -170,5 +170,15 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
/// 开单品项明细列表
///
public List ItemDetails { get; set; }
+
+ ///
+ /// 健康师业绩列表
+ ///
+ public List lqKdJksyjList { get; set; }
+
+ ///
+ /// 科技部老师业绩列表
+ ///
+ public List lqKdKjbsyjList { get; set; }
}
}
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbListQueryInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbListQueryInput.cs
index 8504adb..e5a3a1f 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbListQueryInput.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbListQueryInput.cs
@@ -139,5 +139,14 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
///
public int isEffective { get; set; } = 0;
+ ///
+ /// 健康师ID(可选,传入后只返回该健康师参与的开单记录)
+ ///
+ public string jksId { get; set; }
+
+ ///
+ /// 科技部老师ID(可选,传入后只返回该老师参与的开单记录)
+ ///
+ public string kjblsId { get; set; }
}
}
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/Dto/LqMdGeneralManagerLifeline/LqMdGeneralManagerLifelineCrInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/Dto/LqMdGeneralManagerLifeline/LqMdGeneralManagerLifelineCrInput.cs
index ed01b6d..6620704 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/Dto/LqMdGeneralManagerLifeline/LqMdGeneralManagerLifelineCrInput.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/Dto/LqMdGeneralManagerLifeline/LqMdGeneralManagerLifelineCrInput.cs
@@ -28,6 +28,12 @@ namespace NCC.Extend.Entitys.Dto.LqMdGeneralManagerLifeline
public string generalManagerId { get; set; }
///
+ /// 经理类型(0=经理,1=总经理)
+ ///
+ [Required(ErrorMessage = "经理类型不能为空")]
+ public int managerType { get; set; } = 1;
+
+ ///
/// 生命线1
///
[Required(ErrorMessage = "生命线1不能为空")]
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/Dto/LqMdGeneralManagerLifeline/LqMdGeneralManagerLifelineInfoOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/Dto/LqMdGeneralManagerLifeline/LqMdGeneralManagerLifelineInfoOutput.cs
index 5c3af13..22e5e03 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/Dto/LqMdGeneralManagerLifeline/LqMdGeneralManagerLifelineInfoOutput.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/Dto/LqMdGeneralManagerLifeline/LqMdGeneralManagerLifelineInfoOutput.cs
@@ -28,6 +28,11 @@ namespace NCC.Extend.Entitys.Dto.LqMdGeneralManagerLifeline
public string generalManagerId { get; set; }
///
+ /// 经理类型(0=经理,1=总经理)
+ ///
+ public int managerType { get; set; }
+
+ ///
/// 生命线1
///
public decimal lifeline1 { get; set; }
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/Dto/LqMdGeneralManagerLifeline/LqMdGeneralManagerLifelineListOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/Dto/LqMdGeneralManagerLifeline/LqMdGeneralManagerLifelineListOutput.cs
index 0f5f0b2..0c1f481 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/Dto/LqMdGeneralManagerLifeline/LqMdGeneralManagerLifelineListOutput.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/Dto/LqMdGeneralManagerLifeline/LqMdGeneralManagerLifelineListOutput.cs
@@ -28,6 +28,16 @@ namespace NCC.Extend.Entitys.Dto.LqMdGeneralManagerLifeline
public string generalManagerId { get; set; }
///
+ /// 经理类型(0=经理,1=总经理)
+ ///
+ public int managerType { get; set; }
+
+ ///
+ /// 经理类型(0=经理,1=总经理)
+ ///
+ public string managerTypeName { get; set; }
+
+ ///
/// 生命线1
///
public decimal lifeline1 { get; set; }
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/Dto/LqMdGeneralManagerLifeline/LqMdGeneralManagerLifelineUpInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/Dto/LqMdGeneralManagerLifeline/LqMdGeneralManagerLifelineUpInput.cs
index a6fcf76..dfdc4de 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/Dto/LqMdGeneralManagerLifeline/LqMdGeneralManagerLifelineUpInput.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/Dto/LqMdGeneralManagerLifeline/LqMdGeneralManagerLifelineUpInput.cs
@@ -28,6 +28,12 @@ namespace NCC.Extend.Entitys.Dto.LqMdGeneralManagerLifeline
public string generalManagerId { get; set; }
///
+ /// 经理类型(0=经理,1=总经理)
+ ///
+ [Required(ErrorMessage = "经理类型不能为空")]
+ public int managerType { get; set; } = 1;
+
+ ///
/// 生命线1
///
[Required(ErrorMessage = "生命线1不能为空")]
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_md_general_manager_lifeline/LqMdGeneralManagerLifelineEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_md_general_manager_lifeline/LqMdGeneralManagerLifelineEntity.cs
index 536a9ef..5356a42 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_md_general_manager_lifeline/LqMdGeneralManagerLifelineEntity.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_md_general_manager_lifeline/LqMdGeneralManagerLifelineEntity.cs
@@ -36,6 +36,12 @@ namespace NCC.Extend.Entitys.lq_md_general_manager_lifeline
public string GeneralManagerId { get; set; }
///
+ /// 经理类型(0=经理,1=总经理)
+ ///
+ [SugarColumn(ColumnName = "F_ManagerType")]
+ public int ManagerType { get; set; } = 1;
+
+ ///
/// 生命线1
///
[SugarColumn(ColumnName = "F_Lifeline1")]
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Enum/ManagerTypeEnum.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Enum/ManagerTypeEnum.cs
new file mode 100644
index 0000000..a38b7a9
--- /dev/null
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Enum/ManagerTypeEnum.cs
@@ -0,0 +1,23 @@
+using System.ComponentModel;
+
+namespace NCC.Extend.Entitys.Enum
+{
+ ///
+ /// 经理类型枚举
+ ///
+ public enum ManagerTypeEnum
+ {
+ ///
+ /// 经理
+ ///
+ [Description("经理")]
+ 经理 = 0,
+
+ ///
+ /// 总经理
+ ///
+ [Description("总经理")]
+ 总经理 = 1,
+ }
+}
+
diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqDailyReportService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqDailyReportService.cs
index fe5f308..5f417d0 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend/LqDailyReportService.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend/LqDailyReportService.cs
@@ -752,7 +752,7 @@ namespace NCC.Extend
managerFilter = $"AND target.F_GeneralManagerId = '{input.ManagerId}'";
}
- // SQL查询:获取经理汇总业绩
+ // SQL查询:获取经理汇总业绩(基于lq_md_general_manager_lifeline表中的经理和门店关系)
var sql = $@"
SELECT
target.F_GeneralManagerId as ManagerId,
@@ -761,7 +761,7 @@ namespace NCC.Extend
COALESCE(SUM(target.F_Lifeline2), 0) as TotalTarget2,
COALESCE(SUM(target.F_Lifeline3), 0) as TotalTarget3,
COUNT(DISTINCT target.F_StoreId) as StoreCount,
- -- 总完成业绩
+ -- 总完成业绩(基于lq_md_general_manager_lifeline表中的门店关系计算)
SUM(COALESCE((
SELECT SUM(billing.sfyj)
FROM lq_kd_kdjlb billing
diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs
index d02bc86..6014901 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs
@@ -214,8 +214,49 @@ namespace NCC.Extend.LqKdKdjlb
List queryKdrq = input.kdrq != null ? input.kdrq.Split(',').ToObeject>() : null;
DateTime? startKdrq = queryKdrq != null ? Ext.GetDateTime(queryKdrq.First()) : null;
DateTime? endKdrq = queryKdrq != null ? Ext.GetDateTime(queryKdrq.Last()) : null;
- var data = await _db.Queryable()
- .WhereIF(!string.IsNullOrEmpty(input.keyword), p => p.Kdhyc.Contains(input.keyword) || p.Kdhysjh.Contains(input.keyword))
+
+ // 根据是否传入健康师ID或科技部老师ID,动态构建查询
+ ISugarQueryable baseQuery = null;
+
+ if (!string.IsNullOrEmpty(input.jksId) && !string.IsNullOrEmpty(input.kjblsId))
+ {
+ // 同时传入健康师ID和科技部老师ID,需要同时关联两个业绩表
+ baseQuery = _db.Queryable(
+ (jksyj, kjbsyj, kdjlb) => jksyj.Glkdbh == kdjlb.Id && kjbsyj.Glkdbh == kdjlb.Id)
+ .Where((jksyj, kjbsyj, kdjlb) => jksyj.Jkszh == input.jksId && jksyj.IsEffective == StatusEnum.有效.GetHashCode())
+ .Where((jksyj, kjbsyj, kdjlb) => kjbsyj.Kjbls == input.kjblsId && kjbsyj.IsEffective == StatusEnum.有效.GetHashCode())
+ .Select((jksyj, kjbsyj, kdjlb) => kdjlb)
+ .Distinct()
+ .MergeTable();
+ }
+ else if (!string.IsNullOrEmpty(input.jksId))
+ {
+ // 只传入健康师ID,关联健康师业绩表
+ baseQuery = _db.Queryable(
+ (jksyj, kdjlb) => jksyj.Glkdbh == kdjlb.Id)
+ .Where((jksyj, kdjlb) => jksyj.Jkszh == input.jksId && jksyj.IsEffective == StatusEnum.有效.GetHashCode())
+ .Select((jksyj, kdjlb) => kdjlb)
+ .Distinct()
+ .MergeTable();
+ }
+ else if (!string.IsNullOrEmpty(input.kjblsId))
+ {
+ // 只传入科技部老师ID,关联科技部老师业绩表
+ baseQuery = _db.Queryable(
+ (kjbsyj, kdjlb) => kjbsyj.Glkdbh == kdjlb.Id)
+ .Where((kjbsyj, kdjlb) => kjbsyj.Kjbls == input.kjblsId && kjbsyj.IsEffective == StatusEnum.有效.GetHashCode())
+ .Select((kjbsyj, kdjlb) => kdjlb)
+ .Distinct()
+ .MergeTable();
+ }
+ else
+ {
+ // 没有传入健康师ID或科技部老师ID,使用原来的查询逻辑
+ baseQuery = _db.Queryable();
+ }
+
+ var data = await baseQuery
+ .WhereIF(!string.IsNullOrEmpty(input.keyword), p => p.Kdhyc.Contains(input.keyword) || p.Kdhysjh.Contains(input.keyword))
.WhereIF(!string.IsNullOrEmpty(input.id), p => p.Id.Contains(input.id))
.WhereIF(!string.IsNullOrEmpty(input.djmd), p => p.Djmd.Equals(input.djmd))
.WhereIF(!string.IsNullOrEmpty(input.jsj), p => p.Jsj.Equals(input.jsj))
@@ -308,18 +349,383 @@ namespace NCC.Extend.LqKdKdjlb
var itemDetailsGrouped = itemDetails.GroupBy(x => x.glkdbh)
.ToDictionary(g => g.Key, g => g.ToList());
- // 为每个开单记录分配品项明细
+ // 批量查询健康师业绩(性能优化:一次性查询所有开单的健康师业绩)
+ var jksyjList = new List();
+ if (billingIds.Any())
+ {
+ jksyjList = await _db.Queryable()
+ .Where(x => billingIds.Contains(x.Glkdbh) && x.IsEffective == StatusEnum.有效.GetHashCode())
+ .Select(x => new LqKdJksyjInfoOutput
+ {
+ id = x.Id,
+ glkdbh = x.Glkdbh,
+ kdpxid = x.Kdpxid,
+ jks = x.Jks,
+ jksxm = x.Jksxm,
+ jkszh = x.Jkszh,
+ jksyj = x.Jksyj,
+ yjsj = x.Yjsj,
+ jsj_id = x.Jsj_id,
+ isEffective = x.IsEffective
+ })
+ .ToListAsync();
+ }
+
+ // 批量查询科技部老师业绩(性能优化:一次性查询所有开单的科技部老师业绩)
+ var kjbsyjList = new List();
+ if (billingIds.Any())
+ {
+ kjbsyjList = await _db.Queryable()
+ .Where(x => billingIds.Contains(x.Glkdbh) && x.IsEffective == StatusEnum.有效.GetHashCode())
+ .Select(x => new LqKdKjbsyjInfoOutput
+ {
+ id = x.Id,
+ glkdbh = x.Glkdbh,
+ kdpxid = x.Kdpxid,
+ kjbls = x.Kjbls,
+ kjblsxm = x.Kjblsxm,
+ kjblszh = x.Kjblszh,
+ kjblsyj = x.Kjblsyj,
+ yjsj = x.Yjsj,
+ isEffective = x.IsEffective
+ })
+ .ToListAsync();
+ }
+
+ // 按开单ID分组健康师业绩
+ var jksyjGrouped = jksyjList.GroupBy(x => x.glkdbh)
+ .ToDictionary(g => g.Key, g => g.ToList());
+
+ // 按开单ID分组科技部老师业绩
+ var kjbsyjGrouped = kjbsyjList.GroupBy(x => x.glkdbh)
+ .ToDictionary(g => g.Key, g => g.ToList());
+
+ // 为每个开单记录分配品项明细、健康师业绩和科技部老师业绩
foreach (var item in data.list)
{
item.ItemDetails = itemDetailsGrouped.ContainsKey(item.id)
? itemDetailsGrouped[item.id]
: new List();
+ item.lqKdJksyjList = jksyjGrouped.ContainsKey(item.id)
+ ? jksyjGrouped[item.id]
+ : new List();
+ item.lqKdKjbsyjList = kjbsyjGrouped.ContainsKey(item.id)
+ ? kjbsyjGrouped[item.id]
+ : new List();
}
return PageResult.SqlSugarPageResult(data);
}
#endregion
+ #region 根据健康师ID获取开单列表
+ ///
+ /// 根据健康师ID获取开单列表
+ ///
+ ///
+ /// 根据健康师ID查询该健康师参与的所有开单记录,支持时间周期查询和分页
+ ///
+ /// 示例请求:
+ /// GET /api/Extend/LqKdKdjlb/GetListByJksId?jksId=健康师ID&startTime=2025-01-01&endTime=2025-01-31¤tPage=1&pageSize=10
+ ///
+ /// 参数说明:
+ /// - jksId: 健康师ID(必填)
+ /// - startTime: 开始时间(可选,格式:yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss)
+ /// - endTime: 结束时间(可选,格式:yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss)
+ /// - djmd: 门店ID(可选)
+ /// - isEffective: 是否有效(可选,0=全部,1=有效,2=无效,默认1)
+ /// - currentPage: 当前页码(必填)
+ /// - pageSize: 每页数量(必填)
+ ///
+ /// 返回说明:
+ /// - 返回格式与GetList接口相同,包含开单基本信息及品项明细列表
+ ///
+ /// 查询参数
+ /// 开单列表(分页)
+ /// 查询成功
+ /// 参数错误
+ /// 服务器内部错误
+ [HttpGet("GetListByJksId")]
+ public async Task GetListByJksId([FromQuery] LqKdKdjlbListByJksQueryInput input)
+ {
+ try
+ {
+ if (string.IsNullOrEmpty(input.jksId))
+ {
+ throw NCCException.Oh("健康师ID不能为空");
+ }
+
+ var sidx = input.sidx == null ? "kdrq" : input.sidx;
+ var sort = string.IsNullOrEmpty(input.sort) ? "DESC" : input.sort;
+
+ // 解析时间范围
+ DateTime? startDate = null;
+ DateTime? endDate = null;
+ if (!string.IsNullOrEmpty(input.startTime))
+ {
+ startDate = Ext.GetDateTime(input.startTime);
+ }
+ if (!string.IsNullOrEmpty(input.endTime))
+ {
+ endDate = Ext.GetDateTime(input.endTime);
+ // 如果只传了日期,则设置为当天的23:59:59
+ if (endDate.HasValue && !input.endTime.Contains(":"))
+ {
+ endDate = new DateTime(endDate.Value.Year, endDate.Value.Month, endDate.Value.Day, 23, 59, 59);
+ }
+ }
+
+ // 通过健康师业绩表关联查询开单记录
+ var data = await _db.Queryable(
+ (jksyj, kdjlb) => jksyj.Glkdbh == kdjlb.Id)
+ .Where((jksyj, kdjlb) => jksyj.Jkszh == input.jksId)
+ .WhereIF(input.isEffective != 0, (jksyj, kdjlb) => jksyj.IsEffective == input.isEffective && kdjlb.IsEffective == input.isEffective)
+ .WhereIF(input.isEffective == 0, (jksyj, kdjlb) => jksyj.IsEffective == StatusEnum.有效.GetHashCode() && kdjlb.IsEffective == StatusEnum.有效.GetHashCode())
+ .WhereIF(startDate.HasValue, (jksyj, kdjlb) => kdjlb.Kdrq >= startDate.Value)
+ .WhereIF(endDate.HasValue, (jksyj, kdjlb) => kdjlb.Kdrq <= endDate.Value)
+ .WhereIF(!string.IsNullOrEmpty(input.djmd), (jksyj, kdjlb) => kdjlb.Djmd == input.djmd)
+ .Select((jksyj, kdjlb) => new LqKdKdjlbListOutput
+ {
+ id = kdjlb.Id,
+ djmd = kdjlb.Djmd,
+ jsj = kdjlb.Jsj,
+ kdrq = kdjlb.Kdrq,
+ gjlx = kdjlb.Gjlx,
+ hgjg = kdjlb.Hgjg,
+ zdyj = kdjlb.Zdyj,
+ sfyj = kdjlb.Sfyj,
+ qk = kdjlb.Qk,
+ ckfs = kdjlb.Ckfs,
+ fkfs = kdjlb.Fkfs,
+ fkyy = kdjlb.Fkyy,
+ fkpd = kdjlb.Fkpd,
+ khly = kdjlb.Khly,
+ tjr = kdjlb.Tjr,
+ deductAmount = kdjlb.DeductAmount,
+ paidDebt = kdjlb.PaidDebt,
+ supplementBillingId = kdjlb.SupplementBillingId,
+ sfskdd = kdjlb.Sfskdd,
+ jj = kdjlb.Jj,
+ bz = kdjlb.Bz,
+ kdhy = kdjlb.Kdhy,
+ kdhyc = SqlFunc.Subqueryable().Where(x => x.Id == kdjlb.Kdhy).Select(x => x.Khmc),
+ kdhysjh = SqlFunc.Subqueryable().Where(x => x.Id == kdjlb.Kdhy).Select(x => x.Sjh),
+ isEffective = kdjlb.IsEffective,
+ createUser = kdjlb.CreateUser,
+ createUserName = SqlFunc.Subqueryable().Where(x => x.Id == kdjlb.CreateUser).Select(x => x.RealName),
+ activityId = kdjlb.ActivityId,
+ activityName = SqlFunc.Subqueryable().Where(x => x.Id == kdjlb.ActivityId).Select(x => x.ActivityName),
+ })
+ .MergeTable()
+ .Distinct() // 去重,因为一个开单可能对应多个健康师业绩记录
+ .OrderBy($"{sidx} {sort}")
+ .ToPagedListAsync(input.currentPage, input.pageSize);
+
+ // 获取当前页的开单记录ID列表
+ var billingIds = data.list.Select(x => x.id).ToList();
+
+ // 批量查询品项明细
+ var itemDetails = new List();
+ if (billingIds.Any())
+ {
+ itemDetails = await _db.Queryable()
+ .Where(x => billingIds.Contains(x.Glkdbh) && x.IsEffective == StatusEnum.有效.GetHashCode())
+ .Select(x => new LqKdPxmxInfoOutput
+ {
+ id = x.Id,
+ glkdbh = x.Glkdbh,
+ px = x.Px,
+ pxmc = x.Pxmc,
+ pxjg = x.Pxjg,
+ projectNumber = x.ProjectNumber,
+ isEnabled = x.IsEnabled,
+ sourceType = x.SourceType,
+ memberId = x.MemberId,
+ createTime = x.CreateTIme,
+ totalPrice = x.TotalPrice,
+ actualPrice = x.ActualPrice,
+ remark = x.Remark,
+ isEffective = x.IsEffective
+ })
+ .ToListAsync();
+ }
+
+ // 按开单ID分组品项明细
+ var itemDetailsGrouped = itemDetails.GroupBy(x => x.glkdbh)
+ .ToDictionary(g => g.Key, g => g.ToList());
+
+ // 为每个开单记录分配品项明细
+ foreach (var item in data.list)
+ {
+ item.ItemDetails = itemDetailsGrouped.ContainsKey(item.id)
+ ? itemDetailsGrouped[item.id]
+ : new List();
+ }
+
+ return PageResult.SqlSugarPageResult(data);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, $"根据健康师ID获取开单列表失败 - 健康师ID: {input?.jksId}, 开始时间: {input?.startTime}, 结束时间: {input?.endTime}");
+ throw NCCException.Oh($"根据健康师ID获取开单列表失败: {ex.Message}");
+ }
+ }
+ #endregion
+
+ #region 根据科技部老师ID获取开单列表
+ ///
+ /// 根据科技部老师ID获取开单列表
+ ///
+ ///
+ /// 根据科技部老师ID查询该老师参与的所有开单记录,支持时间周期查询和分页
+ ///
+ /// 示例请求:
+ /// GET /api/Extend/LqKdKdjlb/GetListByKjbId?kjblsId=科技部老师ID&startTime=2025-01-01&endTime=2025-01-31¤tPage=1&pageSize=10
+ ///
+ /// 参数说明:
+ /// - kjblsId: 科技部老师ID(必填)
+ /// - startTime: 开始时间(可选,格式:yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss)
+ /// - endTime: 结束时间(可选,格式:yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss)
+ /// - djmd: 门店ID(可选)
+ /// - isEffective: 是否有效(可选,0=全部,1=有效,2=无效,默认1)
+ /// - currentPage: 当前页码(必填)
+ /// - pageSize: 每页数量(必填)
+ ///
+ /// 返回说明:
+ /// - 返回格式与GetList接口相同,包含开单基本信息及品项明细列表
+ ///
+ /// 查询参数
+ /// 开单列表(分页)
+ /// 查询成功
+ /// 参数错误
+ /// 服务器内部错误
+ [HttpGet("GetListByKjbId")]
+ public async Task GetListByKjbId([FromQuery] LqKdKdjlbListByKjbQueryInput input)
+ {
+ try
+ {
+ if (string.IsNullOrEmpty(input.kjblsId))
+ {
+ throw NCCException.Oh("科技部老师ID不能为空");
+ }
+
+ var sidx = input.sidx == null ? "kdrq" : input.sidx;
+ var sort = string.IsNullOrEmpty(input.sort) ? "DESC" : input.sort;
+
+ // 解析时间范围
+ DateTime? startDate = null;
+ DateTime? endDate = null;
+ if (!string.IsNullOrEmpty(input.startTime))
+ {
+ startDate = Ext.GetDateTime(input.startTime);
+ }
+ if (!string.IsNullOrEmpty(input.endTime))
+ {
+ endDate = Ext.GetDateTime(input.endTime);
+ // 如果只传了日期,则设置为当天的23:59:59
+ if (endDate.HasValue && !input.endTime.Contains(":"))
+ {
+ endDate = new DateTime(endDate.Value.Year, endDate.Value.Month, endDate.Value.Day, 23, 59, 59);
+ }
+ }
+
+ // 通过科技部老师业绩表关联查询开单记录
+ var data = await _db.Queryable(
+ (kjbsyj, kdjlb) => kjbsyj.Glkdbh == kdjlb.Id)
+ .Where((kjbsyj, kdjlb) => kjbsyj.Kjbls == input.kjblsId)
+ .WhereIF(input.isEffective != 0, (kjbsyj, kdjlb) => kjbsyj.IsEffective == input.isEffective && kdjlb.IsEffective == input.isEffective)
+ .WhereIF(input.isEffective == 0, (kjbsyj, kdjlb) => kjbsyj.IsEffective == StatusEnum.有效.GetHashCode() && kdjlb.IsEffective == StatusEnum.有效.GetHashCode())
+ .WhereIF(startDate.HasValue, (kjbsyj, kdjlb) => kdjlb.Kdrq >= startDate.Value)
+ .WhereIF(endDate.HasValue, (kjbsyj, kdjlb) => kdjlb.Kdrq <= endDate.Value)
+ .WhereIF(!string.IsNullOrEmpty(input.djmd), (kjbsyj, kdjlb) => kdjlb.Djmd == input.djmd)
+ .Select((kjbsyj, kdjlb) => new LqKdKdjlbListOutput
+ {
+ id = kdjlb.Id,
+ djmd = kdjlb.Djmd,
+ jsj = kdjlb.Jsj,
+ kdrq = kdjlb.Kdrq,
+ gjlx = kdjlb.Gjlx,
+ hgjg = kdjlb.Hgjg,
+ zdyj = kdjlb.Zdyj,
+ sfyj = kdjlb.Sfyj,
+ qk = kdjlb.Qk,
+ ckfs = kdjlb.Ckfs,
+ fkfs = kdjlb.Fkfs,
+ fkyy = kdjlb.Fkyy,
+ fkpd = kdjlb.Fkpd,
+ khly = kdjlb.Khly,
+ tjr = kdjlb.Tjr,
+ deductAmount = kdjlb.DeductAmount,
+ paidDebt = kdjlb.PaidDebt,
+ supplementBillingId = kdjlb.SupplementBillingId,
+ sfskdd = kdjlb.Sfskdd,
+ jj = kdjlb.Jj,
+ bz = kdjlb.Bz,
+ kdhy = kdjlb.Kdhy,
+ kdhyc = SqlFunc.Subqueryable().Where(x => x.Id == kdjlb.Kdhy).Select(x => x.Khmc),
+ kdhysjh = SqlFunc.Subqueryable().Where(x => x.Id == kdjlb.Kdhy).Select(x => x.Sjh),
+ isEffective = kdjlb.IsEffective,
+ createUser = kdjlb.CreateUser,
+ createUserName = SqlFunc.Subqueryable().Where(x => x.Id == kdjlb.CreateUser).Select(x => x.RealName),
+ activityId = kdjlb.ActivityId,
+ activityName = SqlFunc.Subqueryable().Where(x => x.Id == kdjlb.ActivityId).Select(x => x.ActivityName),
+ })
+ .MergeTable()
+ .Distinct() // 去重,因为一个开单可能对应多个科技部老师业绩记录
+ .OrderBy($"{sidx} {sort}")
+ .ToPagedListAsync(input.currentPage, input.pageSize);
+
+ // 获取当前页的开单记录ID列表
+ var billingIds = data.list.Select(x => x.id).ToList();
+
+ // 批量查询品项明细
+ var itemDetails = new List();
+ if (billingIds.Any())
+ {
+ itemDetails = await _db.Queryable()
+ .Where(x => billingIds.Contains(x.Glkdbh) && x.IsEffective == StatusEnum.有效.GetHashCode())
+ .Select(x => new LqKdPxmxInfoOutput
+ {
+ id = x.Id,
+ glkdbh = x.Glkdbh,
+ px = x.Px,
+ pxmc = x.Pxmc,
+ pxjg = x.Pxjg,
+ projectNumber = x.ProjectNumber,
+ isEnabled = x.IsEnabled,
+ sourceType = x.SourceType,
+ memberId = x.MemberId,
+ createTime = x.CreateTIme,
+ totalPrice = x.TotalPrice,
+ actualPrice = x.ActualPrice,
+ remark = x.Remark,
+ isEffective = x.IsEffective
+ })
+ .ToListAsync();
+ }
+
+ // 按开单ID分组品项明细
+ var itemDetailsGrouped = itemDetails.GroupBy(x => x.glkdbh)
+ .ToDictionary(g => g.Key, g => g.ToList());
+
+ // 为每个开单记录分配品项明细
+ foreach (var item in data.list)
+ {
+ item.ItemDetails = itemDetailsGrouped.ContainsKey(item.id)
+ ? itemDetailsGrouped[item.id]
+ : new List();
+ }
+
+ return PageResult.SqlSugarPageResult(data);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, $"根据科技部老师ID获取开单列表失败 - 科技部老师ID: {input?.kjblsId}, 开始时间: {input?.startTime}, 结束时间: {input?.endTime}");
+ throw NCCException.Oh($"根据科技部老师ID获取开单列表失败: {ex.Message}");
+ }
+ }
+ #endregion
+
#region 新建开单记录表
///
/// 新建开单记录表
diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqMdGeneralManagerLifelineService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqMdGeneralManagerLifelineService.cs
index 3189ddf..975f66c 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend/LqMdGeneralManagerLifelineService.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend/LqMdGeneralManagerLifelineService.cs
@@ -7,10 +7,12 @@ using Mapster;
using Microsoft.AspNetCore.Mvc;
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.Extend.Entitys.Dto.LqMdGeneralManagerLifeline;
+using NCC.Extend.Entitys.Enum;
using NCC.Extend.Entitys.lq_md_general_manager_lifeline;
using NCC.Extend.Entitys.lq_md_target;
using NCC.Extend.Interfaces.LqMdGeneralManagerLifeline;
@@ -77,6 +79,7 @@ namespace NCC.Extend.LqMdGeneralManagerLifeline
storeId = it.StoreId,
month = it.Month,
generalManagerId = it.GeneralManagerId,
+ managerType = it.ManagerType,
lifeline1 = it.Lifeline1,
commissionRate1 = it.CommissionRate1,
lifeline2 = it.Lifeline2,
@@ -92,6 +95,21 @@ namespace NCC.Extend.LqMdGeneralManagerLifeline
.MergeTable()
.OrderBy(sidx + " " + input.sort)
.ToPagedListAsync(input.currentPage, input.pageSize);
+
+ // 设置经理类型中文名称
+ foreach (var item in data.list)
+ {
+ if (Enum.IsDefined(typeof(ManagerTypeEnum), item.managerType))
+ {
+ var enumValue = (ManagerTypeEnum)item.managerType;
+ item.managerTypeName = enumValue.GetDescription();
+ }
+ else
+ {
+ item.managerTypeName = string.Empty;
+ }
+ }
+
return PageResult.SqlSugarPageResult(data);
}
#endregion
@@ -273,6 +291,7 @@ namespace NCC.Extend.LqMdGeneralManagerLifeline
Id = YitIdHelper.NextId().ToString(),
StoreId = target.StoreId,
Month = target.Month,
+ ManagerType = ManagerTypeEnum.总经理.GetHashCode(),
GeneralManagerId = target.BusinessUnitGeneralManager,
Lifeline1 = 0,
CommissionRate1 = 0,
@@ -299,14 +318,15 @@ namespace NCC.Extend.LqMdGeneralManagerLifeline
Id = YitIdHelper.NextId().ToString(),
StoreId = target.StoreId,
Month = target.Month,
+ ManagerType = ManagerTypeEnum.经理.GetHashCode(),
GeneralManagerId = target.BusinessUnitManager,
Lifeline1 = 0,
CommissionRate1 = 0,
- Lifeline2 = null,
- CommissionRate2 = null,
- Lifeline3 = null,
- CommissionRate3 = null,
- Remark = null,
+ Lifeline2 = 0,
+ CommissionRate2 = 0,
+ Lifeline3 = 0,
+ CommissionRate3 = 0,
+ Remark = "",
CreateTime = DateTime.Now,
CreateUserId = userInfo.userId,
});
@@ -405,6 +425,7 @@ namespace NCC.Extend.LqMdGeneralManagerLifeline
Id = YitIdHelper.NextId().ToString(),
StoreId = p.StoreId,
Month = targetMonthStr,
+ ManagerType = p.ManagerType,
GeneralManagerId = p.GeneralManagerId,
Lifeline1 = p.Lifeline1,
CommissionRate1 = p.CommissionRate1,