diff --git a/.DS_Store b/.DS_Store
index dcd23dd..2b45748 100644
--- a/.DS_Store
+++ b/.DS_Store
diff --git a/netcore/src/.DS_Store b/netcore/src/.DS_Store
index 804c075..7b10818 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 7413767..8c62076 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 78e10f5..34562a8 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/LqKdPxmx/LqKdPxmxCrInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdPxmx/LqKdPxmxCrInput.cs
index fc1dd6f..2a597d7 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdPxmx/LqKdPxmxCrInput.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdPxmx/LqKdPxmxCrInput.cs
@@ -49,10 +49,15 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
/// 项目次数
///
public int? projectNumber { get; set; }
-
+
///
/// 是否有效
///
- public int? isEnabled { get; set; }
+ public int? isEnabled { get; set; } = 0;
+
+ ///
+ /// 来源类型
+ ///
+ public string sourceType { get; set; }
}
}
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/User/UserListOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/User/UserListOutput.cs
index 5adc112..b043fe1 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/User/UserListOutput.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/User/UserListOutput.cs
@@ -201,6 +201,11 @@ namespace NCC.Extend.Entitys.Dto.User
/// 创建人
///
public string creatorUserId { get; set; }
-
+
+
+ ///
+ /// 当月金三角名称
+ ///
+ public string thisMonthJsjName { get; set; }
}
}
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_pxmx/LqKdPxmxEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_pxmx/LqKdPxmxEntity.cs
index 921b1f6..3bc66bb 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_pxmx/LqKdPxmxEntity.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_pxmx/LqKdPxmxEntity.cs
@@ -64,6 +64,20 @@ namespace NCC.Extend.Entitys.lq_kd_pxmx
///
[SugarColumn(ColumnName = "F_IsEnabled")]
public int? IsEnabled { get; set; }
+
+
+ ///
+ /// 来源类型
+ ///
+ [SugarColumn(ColumnName = "F_SourceType")]
+ public string SourceType { get; set; }
+
+
+ ///
+ /// 金额合计
+ ///
+ [SugarColumn(ColumnName = "F_TotalPrice")]
+ public decimal TotalPrice { get; set; }
}
}
\ No newline at end of file
diff --git a/netcore/src/Modularity/Extend/NCC.Extend/DataBase/DevStartService.cs b/netcore/src/Modularity/Extend/NCC.Extend/DataBase/DevStartService.cs
index 3e1bde4..f087766 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend/DataBase/DevStartService.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend/DataBase/DevStartService.cs
@@ -102,5 +102,14 @@ namespace NCC.Extend
return true;
}
+// //base64 上传图片
+// [HttpPost("UploadImage")]
+// [AllowAnonymous]
+// public void UploadImage(string base64)
+// {
+// FileHelper.Base64ToFile(base64, "image.png", "wwwroot/images/");
+// }
+
+
}
}
diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs
index 818f22d..2c7e078 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs
@@ -28,6 +28,7 @@ using NCC.ClayObject;
using NCC.Extend.Utils;
using System.Net.Http;
using NCC.Extend.Entitys.lq_jinsanjiao_user;
+using NCC.System.Entitys.Permission;
using NCC.Extend.Entitys.lq_xmzl;
namespace NCC.Extend.LqKdKdjlb
@@ -193,7 +194,11 @@ namespace NCC.Extend.LqKdKdjlb
item.Id = YitIdHelper.NextId().ToString();
item.Glkdbh = newEntity.Id;
item.Yjsj = DateTime.Now;
- item.Jsj_id = _db.Queryable().Where(w => w.UserId == item.Jks && w.Month == DateTime.Now.ToString("yyyyMM")).FirstAsync().Result.JsjId;
+ // var jsjUser = await _db.Queryable().Where(w => w.UserId == item.Jks && w.Month == DateTime.Now.ToString("yyyyMM")).FirstAsync ();
+ // if(jsjUser != null)
+ // {
+ // item.Jsj_id = jsjUser.JsjId;
+ // }
}
await _db.Insertable(lqKdJksyjEntityList).ExecuteCommandAsync();
}
@@ -208,7 +213,7 @@ namespace NCC.Extend.LqKdKdjlb
}
await _db.Insertable(lqKdKjbsyjEntityList).ExecuteCommandAsync();
}
-
+ //对品相进行保存,保存了包括会员的id,这样直接查询会员已有的品相
var lqKdPxmxEntityList = input.lqKdPxmxList.Adapt>();
if (lqKdPxmxEntityList != null)
{
@@ -218,8 +223,18 @@ namespace NCC.Extend.LqKdKdjlb
item.Glkdbh = newEntity.Id;
item.CreateTIme = DateTime.Now;
item.MemberId = entity.Kdhy;
- item.ProjectNumber = _db.Queryable().Where(w => w.Id == item.Px).FirstAsync().Result.ProjectNumber;
item.IsEnabled = 0;
+ // 手动设置项目数量,因为Adapt可能无法正确映射
+ var inputItem = input.lqKdPxmxList.FirstOrDefault(x => x.px == item.Px);
+ if (inputItem != null)
+ {
+ item.ProjectNumber = inputItem.projectNumber ?? 1;
+ }
+ else
+ {
+ item.ProjectNumber = 1;
+ }
+ item.TotalPrice = (decimal)(item.Pxjg * item.ProjectNumber);
}
await _db.Insertable(lqKdPxmxEntityList).ExecuteCommandAsync();
}
@@ -262,10 +277,12 @@ namespace NCC.Extend.LqKdKdjlb
Console.WriteLine($"生成开单记录字符串失败: {ex.Message}");
}
}
- catch (Exception)
+ catch (Exception ex)
{
//回滚事务
_db.RollbackTran();
+ Console.WriteLine($"开单创建失败: {ex.Message}");
+ Console.WriteLine($"异常堆栈: {ex.StackTrace}");
throw NCCException.Oh(ErrorCode.COM1000);
}
}
diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs
index 4954eff..ea22107 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs
@@ -17,6 +17,7 @@ using System.Threading.Tasks;
using NCC.Extend.Entitys.lq_ycsd_jsj;
using NCC.Extend.Entitys.lq_jinsanjiao_user;
using NCC.Extend.Entitys.lq_mdxx;
+using NCC.Extend.Entitys.lq_kd_jksyj;
using NCC.Extend.Entitys.Dto.LqYcsdJsj;
using Yitter.IdGenerator;
using NCC.Common.Helper;
@@ -400,6 +401,101 @@ namespace NCC.Extend.LqYcsdJsj
}
#endregion
+ #region 金三角月度业绩统计
+ ///
+ /// 获取金三角月度业绩统计
+ ///
+ /// 月份(格式:yyyyMM),为空则查询所有月份
+ /// 金三角ID,为空则查询所有金三角
+ /// 门店ID,为空则查询所有门店
+ /// 金三角月度业绩统计列表
+ [HttpGet("Actions/GetMonthlyPerformance")]
+ public async Task GetMonthlyPerformance([FromQuery] string month = null, [FromQuery] string jsjId = null, [FromQuery] string storeId = null)
+ {
+ var query = _db.Queryable()
+ .LeftJoin((jsj, jksyj) => jsj.Id == jksyj.Jsj_id)
+ .LeftJoin((jsj, jksyj, md) => jsj.Md == md.Id)
+ .Where((jsj, jksyj, md) => jsj.Yf != null)
+ .Where((jsj, jksyj, md) => jksyj.Yjsj != null)
+ .Where((jsj, jksyj, md) => jksyj.Jksyj != null && jksyj.Jksyj != "" && jksyj.Jksyj != "0")
+ .WhereIF(!string.IsNullOrEmpty(month), (jsj, jksyj, md) => jsj.Yf == month)
+ .WhereIF(!string.IsNullOrEmpty(jsjId), (jsj, jksyj, md) => jsj.Id == jsjId)
+ .WhereIF(!string.IsNullOrEmpty(storeId), (jsj, jksyj, md) => jsj.Md == storeId)
+ .GroupBy((jsj, jksyj, md) => new { jsj.Id, jsj.Jsj, jsj.Yf, jsj.Md, md.Dm })
+ .Select((jsj, jksyj, md) => new
+ {
+ jsjId = jsj.Id,
+ jsjName = jsj.Jsj,
+ month = jsj.Yf,
+ storeId = jsj.Md,
+ storeName = md.Dm,
+ totalPerformance = SqlFunc.AggregateSum(SqlFunc.ToDecimal(jksyj.Jksyj)),
+ orderCount = SqlFunc.AggregateCount(jksyj.Id),
+ avgPerformance = SqlFunc.AggregateAvg(SqlFunc.ToDecimal(jksyj.Jksyj)),
+ lastOrderDate = SqlFunc.AggregateMax(jksyj.Yjsj),
+ firstOrderDate = SqlFunc.AggregateMin(jksyj.Yjsj)
+ })
+ .OrderBy(jsj => jsj.month, OrderByType.Desc)
+ .OrderBy(jsj => jsj.totalPerformance, OrderByType.Desc);
+
+ var result = await query.ToListAsync();
+ return result;
+ }
+
+ ///
+ /// 获取金三角月度业绩排名
+ ///
+ /// 月份(格式:yyyyMM)
+ /// 排名数量,默认10
+ /// 金三角月度业绩排名列表
+ [HttpGet("Actions/GetMonthlyPerformanceRanking")]
+ public async Task GetMonthlyPerformanceRanking([FromQuery] string month, [FromQuery] int topCount = 10)
+ {
+ if (string.IsNullOrEmpty(month))
+ {
+ throw NCCException.Oh(ErrorCode.COM1001, "月份参数不能为空");
+ }
+
+ var query = _db.Queryable()
+ .LeftJoin((jsj, jksyj) => jsj.Id == jksyj.Jsj_id)
+ .LeftJoin((jsj, jksyj, md) => jsj.Md == md.Id)
+ .Where((jsj, jksyj, md) => jsj.Yf == month)
+ .Where((jsj, jksyj, md) => jksyj.Yjsj != null)
+ .Where((jsj, jksyj, md) => jksyj.Jksyj != null && jksyj.Jksyj != "" && jksyj.Jksyj != "0")
+ .GroupBy((jsj, jksyj, md) => new { jsj.Id, jsj.Jsj, jsj.Yf, jsj.Md, md.Dm })
+ .Select((jsj, jksyj, md) => new
+ {
+ jsjId = jsj.Id,
+ jsjName = jsj.Jsj,
+ month = jsj.Yf,
+ storeId = jsj.Md,
+ storeName = md.Dm,
+ totalPerformance = SqlFunc.AggregateSum(SqlFunc.ToDecimal(jksyj.Jksyj)),
+ orderCount = SqlFunc.AggregateCount(jksyj.Id),
+ ranking = 0 // 排名将在后续计算
+ })
+ .OrderBy(jsj => jsj.totalPerformance, OrderByType.Desc)
+ .Take(topCount);
+
+ var result = await query.ToListAsync();
+
+ // 创建包含排名的结果
+ var rankedResult = result.Select((item, index) => new
+ {
+ item.jsjId,
+ item.jsjName,
+ item.month,
+ item.storeId,
+ item.storeName,
+ item.totalPerformance,
+ item.orderCount,
+ ranking = index + 1
+ }).ToList();
+
+ return rankedResult;
+ }
+ #endregion
+
#region 私有辅助方法
///
diff --git a/netcore/src/Modularity/Extend/NCC.Extend/UserService.cs b/netcore/src/Modularity/Extend/NCC.Extend/UserService.cs
index 54d86a0..ef63494 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend/UserService.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend/UserService.cs
@@ -21,6 +21,7 @@ using NCC.Common.Model.NPOI;
using NCC.Common.Configuration;
using NCC.DataEncryption;
using NCC.ClayObject;
+using NCC.Extend.Entitys.lq_jinsanjiao_user;
namespace NCC.Extend.User
{
diff --git a/创建开单详细记录视图.sql b/创建开单详细记录视图.sql
new file mode 100644
index 0000000..c72ccb1
--- /dev/null
+++ b/创建开单详细记录视图.sql
@@ -0,0 +1,89 @@
+-- 创建开单详细记录视图(简化版)
+-- 功能:联合开单记录表、开单品项明细表、项目资料表,呈现开单详细记录
+-- 包含:开单编号、开单会员、会员手机号、开单时间、开单品项、项目数量、项目单价、项目总价、来源类型、项目分类3
+
+CREATE VIEW v_order_detail_simple AS
+SELECT
+ kd.F_Id AS order_id, -- 开单编号
+ kd.kdhy AS order_member, -- 开单会员
+ kd.kdhysjh AS member_phone, -- 会员手机号
+ kd.kdrq AS order_time, -- 开单时间
+ px.px AS item_code, -- 开单品项(项目编号)
+ px.pxmc AS item_name, -- 品项名称
+ COALESCE(px.F_ProjectNumber, 1) AS project_count, -- 项目数量(默认为1)
+ px.pxjg AS project_unit_price, -- 项目单价
+ (COALESCE(px.F_ProjectNumber, 1) * px.pxjg) AS project_total_price, -- 项目总价(数量*单价)
+ px.F_SourceType AS source_type, -- 来源类型
+ xm.fl3 AS project_category3 -- 项目分类3
+
+FROM
+ lq_kd_kdjlb kd
+ LEFT JOIN lq_kd_pxmx px ON kd.F_Id = px.glkdbh
+ LEFT JOIN lq_xmzl xm ON px.px = xm.F_Id
+WHERE
+ kd.F_Id IS NOT NULL
+ AND px.F_Id IS NOT NULL -- 只显示有品项明细的开单
+ORDER BY
+ kd.kdrq DESC,
+ kd.F_Id,
+ px.F_Id;
+
+-- 创建相关索引以优化查询性能
+CREATE INDEX IF NOT EXISTS idx_lq_kd_pxmx_glkdbh ON lq_kd_pxmx(glkdbh);
+CREATE INDEX IF NOT EXISTS idx_lq_kd_pxmx_px ON lq_kd_pxmx(px);
+CREATE INDEX IF NOT EXISTS idx_lq_xmzl_fl3 ON lq_xmzl(fl3);
+CREATE INDEX IF NOT EXISTS idx_lq_kd_kdjlb_kdrq ON lq_kd_kdjlb(kdrq);
+
+-- 使用示例查询:
+-- 1. 查询所有开单详细记录
+-- SELECT * FROM v_order_detail_simple ORDER BY order_time DESC;
+
+-- 2. 查询指定开单编号的详细记录
+-- SELECT * FROM v_order_detail_simple WHERE order_id = '具体开单编号';
+
+-- 3. 查询指定会员的开单记录
+-- SELECT * FROM v_order_detail_simple WHERE order_member = '具体会员ID' ORDER BY order_time DESC;
+
+-- 4. 查询指定分类3的开单记录
+-- SELECT * FROM v_order_detail_simple WHERE project_category3 = '具体分类3名称' ORDER BY order_time DESC;
+
+-- 5. 查询指定来源类型的开单记录
+-- SELECT * FROM v_order_detail_simple WHERE source_type = '具体来源类型' ORDER BY order_time DESC;
+
+-- 6. 查询指定日期范围的开单记录
+-- SELECT * FROM v_order_detail_simple
+-- WHERE order_time >= '2024-01-01' AND order_time <= '2024-12-31'
+-- ORDER BY order_time DESC;
+
+-- 7. 按分类3统计开单数量和总金额
+-- SELECT
+-- project_category3,
+-- COUNT(*) AS record_count,
+-- SUM(project_total_price) AS total_amount
+-- FROM v_order_detail_simple
+-- WHERE project_category3 IS NOT NULL
+-- GROUP BY project_category3
+-- ORDER BY total_amount DESC;
+
+-- 8. 按来源类型统计开单数量和总金额
+-- SELECT
+-- source_type,
+-- COUNT(*) AS record_count,
+-- SUM(project_total_price) AS total_amount
+-- FROM v_order_detail_simple
+-- WHERE source_type IS NOT NULL
+-- GROUP BY source_type
+-- ORDER BY total_amount DESC;
+
+-- 9. 查询项目总价大于指定金额的记录
+-- SELECT * FROM v_order_detail_simple WHERE project_total_price > 1000 ORDER BY project_total_price DESC;
+
+-- 10. 按会员统计开单数量和总金额
+-- SELECT
+-- order_member,
+-- member_phone,
+-- COUNT(*) AS order_count,
+-- SUM(project_total_price) AS total_amount
+-- FROM v_order_detail_simple
+-- GROUP BY order_member, member_phone
+-- ORDER BY total_amount DESC;
diff --git a/创建金三角月度业绩总和视图.sql b/创建金三角月度业绩总和视图.sql
new file mode 100644
index 0000000..f1055cb
--- /dev/null
+++ b/创建金三角月度业绩总和视图.sql
@@ -0,0 +1,49 @@
+-- 创建金三角月度业绩总和视图(简化版)
+-- 功能:获取每个金三角的每个月开单业绩总和
+-- 主要关联:lq_kd_jksyj(健康师业绩表)和 lq_ycsd_jsj(金三角设定表)
+
+CREATE VIEW v_jsj_monthly_summary AS
+SELECT
+ jsj.F_Id AS jsj_id, -- 金三角ID
+ jsj.jsj AS jsj_name, -- 金三角名称
+ jsj.yf AS month, -- 月份
+ jsj.md AS store_id, -- 门店ID
+ md.dm AS store_name, -- 门店名称
+ SUM(CAST(jksyj.jksyj AS DECIMAL(18,2))) AS total_performance -- 月度业绩总和
+FROM
+ lq_ycsd_jsj jsj
+ LEFT JOIN lq_kd_jksyj jksyj ON jsj.F_Id = jksyj.jsj_id
+ LEFT JOIN lq_mdxx md ON jsj.md = md.F_Id
+WHERE
+ jsj.yf IS NOT NULL
+ AND jksyj.yjsj IS NOT NULL
+ AND jksyj.jksyj IS NOT NULL
+ AND jksyj.jksyj != ''
+ AND jksyj.jksyj != '0'
+GROUP BY
+ jsj.F_Id,
+ jsj.jsj,
+ jsj.yf,
+ jsj.md,
+ md.dm
+ORDER BY
+ jsj.yf DESC,
+ total_performance DESC;
+
+-- 创建相关索引以优化查询性能
+CREATE INDEX IF NOT EXISTS idx_lq_kd_jksyj_jsj_id ON lq_kd_jksyj(jsj_id);
+CREATE INDEX IF NOT EXISTS idx_lq_kd_jksyj_yjsj ON lq_kd_jksyj(yjsj);
+CREATE INDEX IF NOT EXISTS idx_lq_ycsd_jsj_yf ON lq_ycsd_jsj(yf);
+
+-- 使用示例:
+-- 1. 查询所有金三角的月度业绩总和
+-- SELECT * FROM v_jsj_monthly_summary ORDER BY month DESC, total_performance DESC;
+
+-- 2. 查询指定月份的金三角业绩总和
+-- SELECT * FROM v_jsj_monthly_summary WHERE month = '202412' ORDER BY total_performance DESC;
+
+-- 3. 查询指定金三角的业绩历史
+-- SELECT * FROM v_jsj_monthly_summary WHERE jsj_id = '具体金三角ID' ORDER BY month DESC;
+
+-- 4. 查询指定门店的金三角业绩
+-- SELECT * FROM v_jsj_monthly_summary WHERE store_id = '具体门店ID' ORDER BY month DESC, total_performance DESC;
diff --git a/创建金三角月度业绩统计视图.sql b/创建金三角月度业绩统计视图.sql
new file mode 100644
index 0000000..25cd48a
--- /dev/null
+++ b/创建金三角月度业绩统计视图.sql
@@ -0,0 +1,57 @@
+-- 创建金三角月度业绩统计视图
+-- 功能:获取每个金三角的每个月开单业绩总和
+-- 关联表:lq_kd_jksyj(健康师业绩表)、lq_ycsd_jsj(金三角设定表)、lq_jinsanjiao_user(金三角用户绑定表)
+
+CREATE VIEW v_jsj_monthly_performance AS
+SELECT
+ jsj.F_Id AS jsj_id, -- 金三角ID
+ jsj.jsj AS jsj_name, -- 金三角名称
+ jsj.yf AS month, -- 月份
+ jsj.md AS store_id, -- 门店ID
+ md.dm AS store_name, -- 门店名称
+ COUNT(DISTINCT jksyj.F_Id) AS order_count, -- 开单数量
+ SUM(CAST(jksyj.jksyj AS DECIMAL(18,2))) AS total_performance, -- 总业绩
+ AVG(CAST(jksyj.jksyj AS DECIMAL(18,2))) AS avg_performance, -- 平均业绩
+ MAX(jksyj.yjsj) AS last_order_date, -- 最后开单日期
+ MIN(jksyj.yjsj) AS first_order_date, -- 首次开单日期
+ COUNT(DISTINCT jksyj.jks) AS health_teacher_count, -- 健康师数量
+ GROUP_CONCAT(DISTINCT jksyj.jksxm ORDER BY jksyj.jksxm SEPARATOR ',') AS health_teachers -- 健康师姓名列表
+FROM
+ lq_ycsd_jsj jsj
+ LEFT JOIN lq_kd_jksyj jksyj ON jsj.F_Id = jksyj.jsj_id
+ LEFT JOIN lq_mdxx md ON jsj.md = md.F_Id
+WHERE
+ jsj.yf IS NOT NULL
+ AND jksyj.yjsj IS NOT NULL
+ AND jksyj.jksyj IS NOT NULL
+ AND jksyj.jksyj != ''
+ AND jksyj.jksyj != '0'
+GROUP BY
+ jsj.F_Id,
+ jsj.jsj,
+ jsj.yf,
+ jsj.md,
+ md.dm
+ORDER BY
+ jsj.yf DESC,
+ total_performance DESC;
+
+-- 创建索引以优化查询性能
+CREATE INDEX idx_lq_kd_jksyj_jsj_yjsj ON lq_kd_jksyj(jsj_id, yjsj);
+CREATE INDEX idx_lq_kd_jksyj_jksyj ON lq_kd_jksyj(jksyj);
+
+-- 使用示例查询:
+-- 1. 查询所有金三角的月度业绩
+-- SELECT * FROM v_jsj_monthly_performance ORDER BY month DESC, total_performance DESC;
+
+-- 2. 查询指定月份的金三角业绩
+-- SELECT * FROM v_jsj_monthly_performance WHERE month = '202412' ORDER BY total_performance DESC;
+
+-- 3. 查询指定金三角的业绩历史
+-- SELECT * FROM v_jsj_monthly_performance WHERE jsj_id = '具体金三角ID' ORDER BY month DESC;
+
+-- 4. 查询指定门店的金三角业绩
+-- SELECT * FROM v_jsj_monthly_performance WHERE store_id = '具体门店ID' ORDER BY month DESC, total_performance DESC;
+
+-- 5. 查询业绩排名前10的金三角
+-- SELECT * FROM v_jsj_monthly_performance WHERE month = '202412' ORDER BY total_performance DESC LIMIT 10;
diff --git a/数据库说明.md b/数据库说明.md
index 49226e1..30e2131 100644
--- a/数据库说明.md
+++ b/数据库说明.md
@@ -332,6 +332,44 @@
#### lq_ycsd_mdtjbcbftb (社保门店统计表成本分摊表)
- 用于存储社保成本分摊信息
+### 8. 视图
+
+#### v_jsj_monthly_performance (金三角月度业绩统计视图)
+| 字段名 | 数据类型 | 字段说明 |
+|--------|----------|----------|
+| jsj_id | varchar(50) | 金三角ID |
+| jsj_name | varchar(50) | 金三角名称 |
+| month | varchar(50) | 月份 |
+| store_id | varchar(50) | 门店ID |
+| store_name | varchar(50) | 门店名称 |
+| order_count | int | 开单数量 |
+| total_performance | decimal(18,2) | 总业绩 |
+| avg_performance | decimal(18,2) | 平均业绩 |
+| last_order_date | datetime | 最后开单日期 |
+| first_order_date | datetime | 首次开单日期 |
+| health_teacher_count | int | 健康师数量 |
+| health_teachers | text | 健康师姓名列表 |
+
+**业务说明**:
+- 用于统计每个金三角的月度业绩情况
+- 关联表:`lq_ycsd_jsj`(金三角设定)、`lq_kd_jksyj`(健康师业绩)、`lq_mdxx`(门店信息)
+- 提供详细的业绩统计信息,包括总业绩、平均业绩、开单数量等
+
+#### v_jsj_monthly_summary (金三角月度业绩总和视图)
+| 字段名 | 数据类型 | 字段说明 |
+|--------|----------|----------|
+| jsj_id | varchar(50) | 金三角ID |
+| jsj_name | varchar(50) | 金三角名称 |
+| month | varchar(50) | 月份 |
+| store_id | varchar(50) | 门店ID |
+| store_name | varchar(50) | 门店名称 |
+| total_performance | decimal(18,2) | 月度业绩总和 |
+
+**业务说明**:
+- 简化版的金三角月度业绩统计视图
+- 只包含核心的业绩总和信息
+- 用于快速查询金三角的月度业绩情况
+
---
## 表关联关系
@@ -376,6 +414,49 @@
---
+## 数据库视图
+
+### v_jsj_monthly_performance (金三角月度业绩统计视图)
+- **功能**:统计每个金三角的月度业绩数据
+- **关联表**:lq_ycsd_jsj, lq_kd_jksyj, lq_mdxx, lq_jinsanjiao_user
+- **主要字段**:
+ - jsj_id: 金三角ID
+ - jsj_name: 金三角姓名
+ - month: 统计月份
+ - total_performance: 总业绩
+ - order_count: 开单数量
+ - avg_performance: 平均业绩
+ - last_order_date: 最后开单日期
+ - first_order_date: 首次开单日期
+ - health_teacher_name: 健康师姓名
+
+### v_jsj_monthly_summary (金三角月度业绩总和视图)
+- **功能**:金三角月度业绩汇总(简化版)
+- **关联表**:lq_ycsd_jsj, lq_kd_jksyj, lq_jinsanjiao_user
+- **主要字段**:
+ - jsj_id: 金三角ID
+ - jsj_name: 金三角姓名
+ - month: 统计月份
+ - total_performance: 总业绩
+
+### v_order_detail_simple (开单详细记录视图)
+- **功能**:联合开单记录表、开单品项明细表、项目资料表,呈现开单详细记录
+- **关联表**:lq_kd_kdjlb, lq_kd_pxmx, lq_xmzl
+- **主要字段**:
+ - order_id: 开单编号
+ - order_member: 开单会员
+ - member_phone: 会员手机号
+ - order_time: 开单时间
+ - item_code: 开单品项(项目编号)
+ - item_name: 品项名称
+ - project_count: 项目数量
+ - project_unit_price: 项目单价
+ - project_total_price: 项目总价(数量*单价)
+ - source_type: 来源类型
+ - project_category3: 项目分类3
+
+---
+
## 重要说明
1. **字段命名**:项目中使用拼音首字母命名,需要在此文档中详细说明