From 06553fb7f1908058072762b2c4436cb8bf6877f6 Mon Sep 17 00:00:00 2001 From: “wangming” <“wangming@antissoft.com”> Date: Thu, 11 Sep 2025 21:25:33 +0800 Subject: [PATCH] 1 --- .DS_Store | Bin 18436 -> 0 bytes netcore/src/.DS_Store | Bin 10244 -> 0 bytes netcore/src/Application/.DS_Store | Bin 10244 -> 0 bytes netcore/src/Application/NCC.API/.DS_Store | Bin 10244 -> 0 bytes netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdPxmx/LqKdPxmxCrInput.cs | 9 +++++++-- netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/User/UserListOutput.cs | 7 ++++++- netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_pxmx/LqKdPxmxEntity.cs | 14 ++++++++++++++ netcore/src/Modularity/Extend/NCC.Extend/DataBase/DevStartService.cs | 9 +++++++++ netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs | 25 +++++++++++++++++++++---- netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ netcore/src/Modularity/Extend/NCC.Extend/UserService.cs | 1 + 创建开单详细记录视图.sql | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 创建金三角月度业绩总和视图.sql | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 创建金三角月度业绩统计视图.sql | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 数据库说明.md | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 15 files changed, 430 insertions(+), 7 deletions(-) create mode 100644 创建开单详细记录视图.sql create mode 100644 创建金三角月度业绩总和视图.sql create mode 100644 创建金三角月度业绩统计视图.sql diff --git a/.DS_Store b/.DS_Store index dcd23dd..2b45748 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/netcore/src/.DS_Store b/netcore/src/.DS_Store index 804c075..7b10818 100644 Binary files a/netcore/src/.DS_Store and b/netcore/src/.DS_Store differ diff --git a/netcore/src/Application/.DS_Store b/netcore/src/Application/.DS_Store index 7413767..8c62076 100644 Binary files a/netcore/src/Application/.DS_Store and b/netcore/src/Application/.DS_Store differ diff --git a/netcore/src/Application/NCC.API/.DS_Store b/netcore/src/Application/NCC.API/.DS_Store index 78e10f5..34562a8 100644 Binary files a/netcore/src/Application/NCC.API/.DS_Store and b/netcore/src/Application/NCC.API/.DS_Store differ 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. **字段命名**:项目中使用拼音首字母命名,需要在此文档中详细说明 -- libgit2 0.21.4