Commit 06553fb7f1908058072762b2c4436cb8bf6877f6
1 parent
2ce7c3cb
1
Showing
15 changed files
with
430 additions
and
7 deletions
.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
创建开单详细记录视图.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. **字段命名**:项目中使用拼音首字母命名,需要在此文档中详细说明 | ... | ... |