Commit 06553fb7f1908058072762b2c4436cb8bf6877f6

Authored by “wangming”
1 parent 2ce7c3cb

1

.DS_Store
No preview for this file type
netcore/src/.DS_Store
No preview for this file type
netcore/src/Application/.DS_Store
No preview for this file type
netcore/src/Application/NCC.API/.DS_Store
No preview for this file type
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdPxmx/LqKdPxmxCrInput.cs
... ... @@ -49,10 +49,15 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
49 49 /// 项目次数
50 50 /// </summary>
51 51 public int? projectNumber { get; set; }
52   -
  52 +
53 53 /// <summary>
54 54 /// 是否有效
55 55 /// </summary>
56   - public int? isEnabled { get; set; }
  56 + public int? isEnabled { get; set; } = 0;
  57 +
  58 + /// <summary>
  59 + /// 来源类型
  60 + /// </summary>
  61 + public string sourceType { get; set; }
57 62 }
58 63 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/User/UserListOutput.cs
... ... @@ -201,6 +201,11 @@ namespace NCC.Extend.Entitys.Dto.User
201 201 /// 创建人
202 202 /// </summary>
203 203 public string creatorUserId { get; set; }
204   -
  204 +
  205 +
  206 + /// <summary>
  207 + /// 当月金三角名称
  208 + /// </summary>
  209 + public string thisMonthJsjName { get; set; }
205 210 }
206 211 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_pxmx/LqKdPxmxEntity.cs
... ... @@ -64,6 +64,20 @@ namespace NCC.Extend.Entitys.lq_kd_pxmx
64 64 /// </summary>
65 65 [SugarColumn(ColumnName = "F_IsEnabled")]
66 66 public int? IsEnabled { get; set; }
  67 +
  68 +
  69 + /// <summary>
  70 + /// 来源类型
  71 + /// </summary>
  72 + [SugarColumn(ColumnName = "F_SourceType")]
  73 + public string SourceType { get; set; }
  74 +
  75 +
  76 + /// <summary>
  77 + /// 金额合计
  78 + /// </summary>
  79 + [SugarColumn(ColumnName = "F_TotalPrice")]
  80 + public decimal TotalPrice { get; set; }
67 81  
68 82 }
69 83 }
70 84 \ No newline at end of file
... ...
netcore/src/Modularity/Extend/NCC.Extend/DataBase/DevStartService.cs
... ... @@ -102,5 +102,14 @@ namespace NCC.Extend
102 102 return true;
103 103 }
104 104  
  105 +// //base64 上传图片
  106 +// [HttpPost("UploadImage")]
  107 +// [AllowAnonymous]
  108 +// public void UploadImage(string base64)
  109 +// {
  110 +// FileHelper.Base64ToFile(base64, "image.png", "wwwroot/images/");
  111 +// }
  112 +
  113 +
105 114 }
106 115 }
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs
... ... @@ -28,6 +28,7 @@ using NCC.ClayObject;
28 28 using NCC.Extend.Utils;
29 29 using System.Net.Http;
30 30 using NCC.Extend.Entitys.lq_jinsanjiao_user;
  31 +using NCC.System.Entitys.Permission;
31 32 using NCC.Extend.Entitys.lq_xmzl;
32 33  
33 34 namespace NCC.Extend.LqKdKdjlb
... ... @@ -193,7 +194,11 @@ namespace NCC.Extend.LqKdKdjlb
193 194 item.Id = YitIdHelper.NextId().ToString();
194 195 item.Glkdbh = newEntity.Id;
195 196 item.Yjsj = DateTime.Now;
196   - item.Jsj_id = _db.Queryable<LqJinsanjiaoUserEntity>().Where(w => w.UserId == item.Jks && w.Month == DateTime.Now.ToString("yyyyMM")).FirstAsync().Result.JsjId;
  197 + // var jsjUser = await _db.Queryable<LqJinsanjiaoUserEntity>().Where(w => w.UserId == item.Jks && w.Month == DateTime.Now.ToString("yyyyMM")).FirstAsync ();
  198 + // if(jsjUser != null)
  199 + // {
  200 + // item.Jsj_id = jsjUser.JsjId;
  201 + // }
197 202 }
198 203 await _db.Insertable(lqKdJksyjEntityList).ExecuteCommandAsync();
199 204 }
... ... @@ -208,7 +213,7 @@ namespace NCC.Extend.LqKdKdjlb
208 213 }
209 214 await _db.Insertable(lqKdKjbsyjEntityList).ExecuteCommandAsync();
210 215 }
211   -
  216 + //对品相进行保存,保存了包括会员的id,这样直接查询会员已有的品相
212 217 var lqKdPxmxEntityList = input.lqKdPxmxList.Adapt<List<LqKdPxmxEntity>>();
213 218 if (lqKdPxmxEntityList != null)
214 219 {
... ... @@ -218,8 +223,18 @@ namespace NCC.Extend.LqKdKdjlb
218 223 item.Glkdbh = newEntity.Id;
219 224 item.CreateTIme = DateTime.Now;
220 225 item.MemberId = entity.Kdhy;
221   - item.ProjectNumber = _db.Queryable<LqXmzlEntity>().Where(w => w.Id == item.Px).FirstAsync().Result.ProjectNumber;
222 226 item.IsEnabled = 0;
  227 + // 手动设置项目数量,因为Adapt可能无法正确映射
  228 + var inputItem = input.lqKdPxmxList.FirstOrDefault(x => x.px == item.Px);
  229 + if (inputItem != null)
  230 + {
  231 + item.ProjectNumber = inputItem.projectNumber ?? 1;
  232 + }
  233 + else
  234 + {
  235 + item.ProjectNumber = 1;
  236 + }
  237 + item.TotalPrice = (decimal)(item.Pxjg * item.ProjectNumber);
223 238 }
224 239 await _db.Insertable(lqKdPxmxEntityList).ExecuteCommandAsync();
225 240 }
... ... @@ -262,10 +277,12 @@ namespace NCC.Extend.LqKdKdjlb
262 277 Console.WriteLine($"生成开单记录字符串失败: {ex.Message}");
263 278 }
264 279 }
265   - catch (Exception)
  280 + catch (Exception ex)
266 281 {
267 282 //回滚事务
268 283 _db.RollbackTran();
  284 + Console.WriteLine($"开单创建失败: {ex.Message}");
  285 + Console.WriteLine($"异常堆栈: {ex.StackTrace}");
269 286 throw NCCException.Oh(ErrorCode.COM1000);
270 287 }
271 288 }
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs
... ... @@ -17,6 +17,7 @@ using System.Threading.Tasks;
17 17 using NCC.Extend.Entitys.lq_ycsd_jsj;
18 18 using NCC.Extend.Entitys.lq_jinsanjiao_user;
19 19 using NCC.Extend.Entitys.lq_mdxx;
  20 +using NCC.Extend.Entitys.lq_kd_jksyj;
20 21 using NCC.Extend.Entitys.Dto.LqYcsdJsj;
21 22 using Yitter.IdGenerator;
22 23 using NCC.Common.Helper;
... ... @@ -400,6 +401,101 @@ namespace NCC.Extend.LqYcsdJsj
400 401 }
401 402 #endregion
402 403  
  404 + #region 金三角月度业绩统计
  405 + /// <summary>
  406 + /// 获取金三角月度业绩统计
  407 + /// </summary>
  408 + /// <param name="month">月份(格式:yyyyMM),为空则查询所有月份</param>
  409 + /// <param name="jsjId">金三角ID,为空则查询所有金三角</param>
  410 + /// <param name="storeId">门店ID,为空则查询所有门店</param>
  411 + /// <returns>金三角月度业绩统计列表</returns>
  412 + [HttpGet("Actions/GetMonthlyPerformance")]
  413 + public async Task<dynamic> GetMonthlyPerformance([FromQuery] string month = null, [FromQuery] string jsjId = null, [FromQuery] string storeId = null)
  414 + {
  415 + var query = _db.Queryable<LqYcsdJsjEntity>()
  416 + .LeftJoin<LqKdJksyjEntity>((jsj, jksyj) => jsj.Id == jksyj.Jsj_id)
  417 + .LeftJoin<LqMdxxEntity>((jsj, jksyj, md) => jsj.Md == md.Id)
  418 + .Where((jsj, jksyj, md) => jsj.Yf != null)
  419 + .Where((jsj, jksyj, md) => jksyj.Yjsj != null)
  420 + .Where((jsj, jksyj, md) => jksyj.Jksyj != null && jksyj.Jksyj != "" && jksyj.Jksyj != "0")
  421 + .WhereIF(!string.IsNullOrEmpty(month), (jsj, jksyj, md) => jsj.Yf == month)
  422 + .WhereIF(!string.IsNullOrEmpty(jsjId), (jsj, jksyj, md) => jsj.Id == jsjId)
  423 + .WhereIF(!string.IsNullOrEmpty(storeId), (jsj, jksyj, md) => jsj.Md == storeId)
  424 + .GroupBy((jsj, jksyj, md) => new { jsj.Id, jsj.Jsj, jsj.Yf, jsj.Md, md.Dm })
  425 + .Select((jsj, jksyj, md) => new
  426 + {
  427 + jsjId = jsj.Id,
  428 + jsjName = jsj.Jsj,
  429 + month = jsj.Yf,
  430 + storeId = jsj.Md,
  431 + storeName = md.Dm,
  432 + totalPerformance = SqlFunc.AggregateSum(SqlFunc.ToDecimal(jksyj.Jksyj)),
  433 + orderCount = SqlFunc.AggregateCount(jksyj.Id),
  434 + avgPerformance = SqlFunc.AggregateAvg(SqlFunc.ToDecimal(jksyj.Jksyj)),
  435 + lastOrderDate = SqlFunc.AggregateMax(jksyj.Yjsj),
  436 + firstOrderDate = SqlFunc.AggregateMin(jksyj.Yjsj)
  437 + })
  438 + .OrderBy(jsj => jsj.month, OrderByType.Desc)
  439 + .OrderBy(jsj => jsj.totalPerformance, OrderByType.Desc);
  440 +
  441 + var result = await query.ToListAsync();
  442 + return result;
  443 + }
  444 +
  445 + /// <summary>
  446 + /// 获取金三角月度业绩排名
  447 + /// </summary>
  448 + /// <param name="month">月份(格式:yyyyMM)</param>
  449 + /// <param name="topCount">排名数量,默认10</param>
  450 + /// <returns>金三角月度业绩排名列表</returns>
  451 + [HttpGet("Actions/GetMonthlyPerformanceRanking")]
  452 + public async Task<dynamic> GetMonthlyPerformanceRanking([FromQuery] string month, [FromQuery] int topCount = 10)
  453 + {
  454 + if (string.IsNullOrEmpty(month))
  455 + {
  456 + throw NCCException.Oh(ErrorCode.COM1001, "月份参数不能为空");
  457 + }
  458 +
  459 + var query = _db.Queryable<LqYcsdJsjEntity>()
  460 + .LeftJoin<LqKdJksyjEntity>((jsj, jksyj) => jsj.Id == jksyj.Jsj_id)
  461 + .LeftJoin<LqMdxxEntity>((jsj, jksyj, md) => jsj.Md == md.Id)
  462 + .Where((jsj, jksyj, md) => jsj.Yf == month)
  463 + .Where((jsj, jksyj, md) => jksyj.Yjsj != null)
  464 + .Where((jsj, jksyj, md) => jksyj.Jksyj != null && jksyj.Jksyj != "" && jksyj.Jksyj != "0")
  465 + .GroupBy((jsj, jksyj, md) => new { jsj.Id, jsj.Jsj, jsj.Yf, jsj.Md, md.Dm })
  466 + .Select((jsj, jksyj, md) => new
  467 + {
  468 + jsjId = jsj.Id,
  469 + jsjName = jsj.Jsj,
  470 + month = jsj.Yf,
  471 + storeId = jsj.Md,
  472 + storeName = md.Dm,
  473 + totalPerformance = SqlFunc.AggregateSum(SqlFunc.ToDecimal(jksyj.Jksyj)),
  474 + orderCount = SqlFunc.AggregateCount(jksyj.Id),
  475 + ranking = 0 // 排名将在后续计算
  476 + })
  477 + .OrderBy(jsj => jsj.totalPerformance, OrderByType.Desc)
  478 + .Take(topCount);
  479 +
  480 + var result = await query.ToListAsync();
  481 +
  482 + // 创建包含排名的结果
  483 + var rankedResult = result.Select((item, index) => new
  484 + {
  485 + item.jsjId,
  486 + item.jsjName,
  487 + item.month,
  488 + item.storeId,
  489 + item.storeName,
  490 + item.totalPerformance,
  491 + item.orderCount,
  492 + ranking = index + 1
  493 + }).ToList();
  494 +
  495 + return rankedResult;
  496 + }
  497 + #endregion
  498 +
403 499 #region 私有辅助方法
404 500  
405 501 /// <summary>
... ...
netcore/src/Modularity/Extend/NCC.Extend/UserService.cs
... ... @@ -21,6 +21,7 @@ using NCC.Common.Model.NPOI;
21 21 using NCC.Common.Configuration;
22 22 using NCC.DataEncryption;
23 23 using NCC.ClayObject;
  24 +using NCC.Extend.Entitys.lq_jinsanjiao_user;
24 25  
25 26 namespace NCC.Extend.User
26 27 {
... ...
创建开单详细记录视图.sql 0 → 100644
  1 +-- 创建开单详细记录视图(简化版)
  2 +-- 功能:联合开单记录表、开单品项明细表、项目资料表,呈现开单详细记录
  3 +-- 包含:开单编号、开单会员、会员手机号、开单时间、开单品项、项目数量、项目单价、项目总价、来源类型、项目分类3
  4 +
  5 +CREATE VIEW v_order_detail_simple AS
  6 +SELECT
  7 + kd.F_Id AS order_id, -- 开单编号
  8 + kd.kdhy AS order_member, -- 开单会员
  9 + kd.kdhysjh AS member_phone, -- 会员手机号
  10 + kd.kdrq AS order_time, -- 开单时间
  11 + px.px AS item_code, -- 开单品项(项目编号)
  12 + px.pxmc AS item_name, -- 品项名称
  13 + COALESCE(px.F_ProjectNumber, 1) AS project_count, -- 项目数量(默认为1)
  14 + px.pxjg AS project_unit_price, -- 项目单价
  15 + (COALESCE(px.F_ProjectNumber, 1) * px.pxjg) AS project_total_price, -- 项目总价(数量*单价)
  16 + px.F_SourceType AS source_type, -- 来源类型
  17 + xm.fl3 AS project_category3 -- 项目分类3
  18 +
  19 +FROM
  20 + lq_kd_kdjlb kd
  21 + LEFT JOIN lq_kd_pxmx px ON kd.F_Id = px.glkdbh
  22 + LEFT JOIN lq_xmzl xm ON px.px = xm.F_Id
  23 +WHERE
  24 + kd.F_Id IS NOT NULL
  25 + AND px.F_Id IS NOT NULL -- 只显示有品项明细的开单
  26 +ORDER BY
  27 + kd.kdrq DESC,
  28 + kd.F_Id,
  29 + px.F_Id;
  30 +
  31 +-- 创建相关索引以优化查询性能
  32 +CREATE INDEX IF NOT EXISTS idx_lq_kd_pxmx_glkdbh ON lq_kd_pxmx(glkdbh);
  33 +CREATE INDEX IF NOT EXISTS idx_lq_kd_pxmx_px ON lq_kd_pxmx(px);
  34 +CREATE INDEX IF NOT EXISTS idx_lq_xmzl_fl3 ON lq_xmzl(fl3);
  35 +CREATE INDEX IF NOT EXISTS idx_lq_kd_kdjlb_kdrq ON lq_kd_kdjlb(kdrq);
  36 +
  37 +-- 使用示例查询:
  38 +-- 1. 查询所有开单详细记录
  39 +-- SELECT * FROM v_order_detail_simple ORDER BY order_time DESC;
  40 +
  41 +-- 2. 查询指定开单编号的详细记录
  42 +-- SELECT * FROM v_order_detail_simple WHERE order_id = '具体开单编号';
  43 +
  44 +-- 3. 查询指定会员的开单记录
  45 +-- SELECT * FROM v_order_detail_simple WHERE order_member = '具体会员ID' ORDER BY order_time DESC;
  46 +
  47 +-- 4. 查询指定分类3的开单记录
  48 +-- SELECT * FROM v_order_detail_simple WHERE project_category3 = '具体分类3名称' ORDER BY order_time DESC;
  49 +
  50 +-- 5. 查询指定来源类型的开单记录
  51 +-- SELECT * FROM v_order_detail_simple WHERE source_type = '具体来源类型' ORDER BY order_time DESC;
  52 +
  53 +-- 6. 查询指定日期范围的开单记录
  54 +-- SELECT * FROM v_order_detail_simple
  55 +-- WHERE order_time >= '2024-01-01' AND order_time <= '2024-12-31'
  56 +-- ORDER BY order_time DESC;
  57 +
  58 +-- 7. 按分类3统计开单数量和总金额
  59 +-- SELECT
  60 +-- project_category3,
  61 +-- COUNT(*) AS record_count,
  62 +-- SUM(project_total_price) AS total_amount
  63 +-- FROM v_order_detail_simple
  64 +-- WHERE project_category3 IS NOT NULL
  65 +-- GROUP BY project_category3
  66 +-- ORDER BY total_amount DESC;
  67 +
  68 +-- 8. 按来源类型统计开单数量和总金额
  69 +-- SELECT
  70 +-- source_type,
  71 +-- COUNT(*) AS record_count,
  72 +-- SUM(project_total_price) AS total_amount
  73 +-- FROM v_order_detail_simple
  74 +-- WHERE source_type IS NOT NULL
  75 +-- GROUP BY source_type
  76 +-- ORDER BY total_amount DESC;
  77 +
  78 +-- 9. 查询项目总价大于指定金额的记录
  79 +-- SELECT * FROM v_order_detail_simple WHERE project_total_price > 1000 ORDER BY project_total_price DESC;
  80 +
  81 +-- 10. 按会员统计开单数量和总金额
  82 +-- SELECT
  83 +-- order_member,
  84 +-- member_phone,
  85 +-- COUNT(*) AS order_count,
  86 +-- SUM(project_total_price) AS total_amount
  87 +-- FROM v_order_detail_simple
  88 +-- GROUP BY order_member, member_phone
  89 +-- ORDER BY total_amount DESC;
... ...
创建金三角月度业绩总和视图.sql 0 → 100644
  1 +-- 创建金三角月度业绩总和视图(简化版)
  2 +-- 功能:获取每个金三角的每个月开单业绩总和
  3 +-- 主要关联:lq_kd_jksyj(健康师业绩表)和 lq_ycsd_jsj(金三角设定表)
  4 +
  5 +CREATE VIEW v_jsj_monthly_summary AS
  6 +SELECT
  7 + jsj.F_Id AS jsj_id, -- 金三角ID
  8 + jsj.jsj AS jsj_name, -- 金三角名称
  9 + jsj.yf AS month, -- 月份
  10 + jsj.md AS store_id, -- 门店ID
  11 + md.dm AS store_name, -- 门店名称
  12 + SUM(CAST(jksyj.jksyj AS DECIMAL(18,2))) AS total_performance -- 月度业绩总和
  13 +FROM
  14 + lq_ycsd_jsj jsj
  15 + LEFT JOIN lq_kd_jksyj jksyj ON jsj.F_Id = jksyj.jsj_id
  16 + LEFT JOIN lq_mdxx md ON jsj.md = md.F_Id
  17 +WHERE
  18 + jsj.yf IS NOT NULL
  19 + AND jksyj.yjsj IS NOT NULL
  20 + AND jksyj.jksyj IS NOT NULL
  21 + AND jksyj.jksyj != ''
  22 + AND jksyj.jksyj != '0'
  23 +GROUP BY
  24 + jsj.F_Id,
  25 + jsj.jsj,
  26 + jsj.yf,
  27 + jsj.md,
  28 + md.dm
  29 +ORDER BY
  30 + jsj.yf DESC,
  31 + total_performance DESC;
  32 +
  33 +-- 创建相关索引以优化查询性能
  34 +CREATE INDEX IF NOT EXISTS idx_lq_kd_jksyj_jsj_id ON lq_kd_jksyj(jsj_id);
  35 +CREATE INDEX IF NOT EXISTS idx_lq_kd_jksyj_yjsj ON lq_kd_jksyj(yjsj);
  36 +CREATE INDEX IF NOT EXISTS idx_lq_ycsd_jsj_yf ON lq_ycsd_jsj(yf);
  37 +
  38 +-- 使用示例:
  39 +-- 1. 查询所有金三角的月度业绩总和
  40 +-- SELECT * FROM v_jsj_monthly_summary ORDER BY month DESC, total_performance DESC;
  41 +
  42 +-- 2. 查询指定月份的金三角业绩总和
  43 +-- SELECT * FROM v_jsj_monthly_summary WHERE month = '202412' ORDER BY total_performance DESC;
  44 +
  45 +-- 3. 查询指定金三角的业绩历史
  46 +-- SELECT * FROM v_jsj_monthly_summary WHERE jsj_id = '具体金三角ID' ORDER BY month DESC;
  47 +
  48 +-- 4. 查询指定门店的金三角业绩
  49 +-- SELECT * FROM v_jsj_monthly_summary WHERE store_id = '具体门店ID' ORDER BY month DESC, total_performance DESC;
... ...
创建金三角月度业绩统计视图.sql 0 → 100644
  1 +-- 创建金三角月度业绩统计视图
  2 +-- 功能:获取每个金三角的每个月开单业绩总和
  3 +-- 关联表:lq_kd_jksyj(健康师业绩表)、lq_ycsd_jsj(金三角设定表)、lq_jinsanjiao_user(金三角用户绑定表)
  4 +
  5 +CREATE VIEW v_jsj_monthly_performance AS
  6 +SELECT
  7 + jsj.F_Id AS jsj_id, -- 金三角ID
  8 + jsj.jsj AS jsj_name, -- 金三角名称
  9 + jsj.yf AS month, -- 月份
  10 + jsj.md AS store_id, -- 门店ID
  11 + md.dm AS store_name, -- 门店名称
  12 + COUNT(DISTINCT jksyj.F_Id) AS order_count, -- 开单数量
  13 + SUM(CAST(jksyj.jksyj AS DECIMAL(18,2))) AS total_performance, -- 总业绩
  14 + AVG(CAST(jksyj.jksyj AS DECIMAL(18,2))) AS avg_performance, -- 平均业绩
  15 + MAX(jksyj.yjsj) AS last_order_date, -- 最后开单日期
  16 + MIN(jksyj.yjsj) AS first_order_date, -- 首次开单日期
  17 + COUNT(DISTINCT jksyj.jks) AS health_teacher_count, -- 健康师数量
  18 + GROUP_CONCAT(DISTINCT jksyj.jksxm ORDER BY jksyj.jksxm SEPARATOR ',') AS health_teachers -- 健康师姓名列表
  19 +FROM
  20 + lq_ycsd_jsj jsj
  21 + LEFT JOIN lq_kd_jksyj jksyj ON jsj.F_Id = jksyj.jsj_id
  22 + LEFT JOIN lq_mdxx md ON jsj.md = md.F_Id
  23 +WHERE
  24 + jsj.yf IS NOT NULL
  25 + AND jksyj.yjsj IS NOT NULL
  26 + AND jksyj.jksyj IS NOT NULL
  27 + AND jksyj.jksyj != ''
  28 + AND jksyj.jksyj != '0'
  29 +GROUP BY
  30 + jsj.F_Id,
  31 + jsj.jsj,
  32 + jsj.yf,
  33 + jsj.md,
  34 + md.dm
  35 +ORDER BY
  36 + jsj.yf DESC,
  37 + total_performance DESC;
  38 +
  39 +-- 创建索引以优化查询性能
  40 +CREATE INDEX idx_lq_kd_jksyj_jsj_yjsj ON lq_kd_jksyj(jsj_id, yjsj);
  41 +CREATE INDEX idx_lq_kd_jksyj_jksyj ON lq_kd_jksyj(jksyj);
  42 +
  43 +-- 使用示例查询:
  44 +-- 1. 查询所有金三角的月度业绩
  45 +-- SELECT * FROM v_jsj_monthly_performance ORDER BY month DESC, total_performance DESC;
  46 +
  47 +-- 2. 查询指定月份的金三角业绩
  48 +-- SELECT * FROM v_jsj_monthly_performance WHERE month = '202412' ORDER BY total_performance DESC;
  49 +
  50 +-- 3. 查询指定金三角的业绩历史
  51 +-- SELECT * FROM v_jsj_monthly_performance WHERE jsj_id = '具体金三角ID' ORDER BY month DESC;
  52 +
  53 +-- 4. 查询指定门店的金三角业绩
  54 +-- SELECT * FROM v_jsj_monthly_performance WHERE store_id = '具体门店ID' ORDER BY month DESC, total_performance DESC;
  55 +
  56 +-- 5. 查询业绩排名前10的金三角
  57 +-- SELECT * FROM v_jsj_monthly_performance WHERE month = '202412' ORDER BY total_performance DESC LIMIT 10;
... ...
数据库说明.md
... ... @@ -332,6 +332,44 @@
332 332 #### lq_ycsd_mdtjbcbftb (社保门店统计表成本分摊表)
333 333 - 用于存储社保成本分摊信息
334 334  
  335 +### 8. 视图
  336 +
  337 +#### v_jsj_monthly_performance (金三角月度业绩统计视图)
  338 +| 字段名 | 数据类型 | 字段说明 |
  339 +|--------|----------|----------|
  340 +| jsj_id | varchar(50) | 金三角ID |
  341 +| jsj_name | varchar(50) | 金三角名称 |
  342 +| month | varchar(50) | 月份 |
  343 +| store_id | varchar(50) | 门店ID |
  344 +| store_name | varchar(50) | 门店名称 |
  345 +| order_count | int | 开单数量 |
  346 +| total_performance | decimal(18,2) | 总业绩 |
  347 +| avg_performance | decimal(18,2) | 平均业绩 |
  348 +| last_order_date | datetime | 最后开单日期 |
  349 +| first_order_date | datetime | 首次开单日期 |
  350 +| health_teacher_count | int | 健康师数量 |
  351 +| health_teachers | text | 健康师姓名列表 |
  352 +
  353 +**业务说明**:
  354 +- 用于统计每个金三角的月度业绩情况
  355 +- 关联表:`lq_ycsd_jsj`(金三角设定)、`lq_kd_jksyj`(健康师业绩)、`lq_mdxx`(门店信息)
  356 +- 提供详细的业绩统计信息,包括总业绩、平均业绩、开单数量等
  357 +
  358 +#### v_jsj_monthly_summary (金三角月度业绩总和视图)
  359 +| 字段名 | 数据类型 | 字段说明 |
  360 +|--------|----------|----------|
  361 +| jsj_id | varchar(50) | 金三角ID |
  362 +| jsj_name | varchar(50) | 金三角名称 |
  363 +| month | varchar(50) | 月份 |
  364 +| store_id | varchar(50) | 门店ID |
  365 +| store_name | varchar(50) | 门店名称 |
  366 +| total_performance | decimal(18,2) | 月度业绩总和 |
  367 +
  368 +**业务说明**:
  369 +- 简化版的金三角月度业绩统计视图
  370 +- 只包含核心的业绩总和信息
  371 +- 用于快速查询金三角的月度业绩情况
  372 +
335 373 ---
336 374  
337 375 ## 表关联关系
... ... @@ -376,6 +414,49 @@
376 414  
377 415 ---
378 416  
  417 +## 数据库视图
  418 +
  419 +### v_jsj_monthly_performance (金三角月度业绩统计视图)
  420 +- **功能**:统计每个金三角的月度业绩数据
  421 +- **关联表**:lq_ycsd_jsj, lq_kd_jksyj, lq_mdxx, lq_jinsanjiao_user
  422 +- **主要字段**:
  423 + - jsj_id: 金三角ID
  424 + - jsj_name: 金三角姓名
  425 + - month: 统计月份
  426 + - total_performance: 总业绩
  427 + - order_count: 开单数量
  428 + - avg_performance: 平均业绩
  429 + - last_order_date: 最后开单日期
  430 + - first_order_date: 首次开单日期
  431 + - health_teacher_name: 健康师姓名
  432 +
  433 +### v_jsj_monthly_summary (金三角月度业绩总和视图)
  434 +- **功能**:金三角月度业绩汇总(简化版)
  435 +- **关联表**:lq_ycsd_jsj, lq_kd_jksyj, lq_jinsanjiao_user
  436 +- **主要字段**:
  437 + - jsj_id: 金三角ID
  438 + - jsj_name: 金三角姓名
  439 + - month: 统计月份
  440 + - total_performance: 总业绩
  441 +
  442 +### v_order_detail_simple (开单详细记录视图)
  443 +- **功能**:联合开单记录表、开单品项明细表、项目资料表,呈现开单详细记录
  444 +- **关联表**:lq_kd_kdjlb, lq_kd_pxmx, lq_xmzl
  445 +- **主要字段**:
  446 + - order_id: 开单编号
  447 + - order_member: 开单会员
  448 + - member_phone: 会员手机号
  449 + - order_time: 开单时间
  450 + - item_code: 开单品项(项目编号)
  451 + - item_name: 品项名称
  452 + - project_count: 项目数量
  453 + - project_unit_price: 项目单价
  454 + - project_total_price: 项目总价(数量*单价)
  455 + - source_type: 来源类型
  456 + - project_category3: 项目分类3
  457 +
  458 +---
  459 +
379 460 ## 重要说明
380 461  
381 462 1. **字段命名**:项目中使用拼音首字母命名,需要在此文档中详细说明
... ...