Commit 7e362a148954e38c500ac53042b64d3eaf5a1e13

Authored by “wangming”
1 parent 8514f465

feat: 为业绩表添加门店ID和品项名称字段

- 删除业绩表的部门字段(F_DepartmentId)
- 为6个业绩表添加门店ID字段(F_StoreId)
- 为6个业绩表添加品项名称字段(F_ItemName)
- 创建SQL脚本同步门店ID和品项名称数据
- 更新6个业绩表的Entity类,添加StoreId和ItemName属性
- 优化同步SQL性能,添加索引提升查询效率
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_jksyj/LqHytkJksyjEntity.cs
... ... @@ -125,5 +125,17 @@ namespace NCC.Extend.Entitys.lq_hytk_jksyj
125 125 /// </summary>
126 126 [SugarColumn(ColumnName = "F_ItemId")]
127 127 public string ItemId { get; set; }
  128 +
  129 + /// <summary>
  130 + /// 门店ID
  131 + /// </summary>
  132 + [SugarColumn(ColumnName = "F_StoreId")]
  133 + public string StoreId { get; set; }
  134 +
  135 + /// <summary>
  136 + /// 品项名称
  137 + /// </summary>
  138 + [SugarColumn(ColumnName = "F_ItemName")]
  139 + public string ItemName { get; set; }
128 140 }
129 141 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_kjbsyj/LqHytkKjbsyjEntity.cs
... ... @@ -120,5 +120,17 @@ namespace NCC.Extend.Entitys.lq_hytk_kjbsyj
120 120 /// </summary>
121 121 [SugarColumn(ColumnName = "F_ItemId")]
122 122 public string ItemId { get; set; }
  123 +
  124 + /// <summary>
  125 + /// 门店ID
  126 + /// </summary>
  127 + [SugarColumn(ColumnName = "F_StoreId")]
  128 + public string StoreId { get; set; }
  129 +
  130 + /// <summary>
  131 + /// 品项名称
  132 + /// </summary>
  133 + [SugarColumn(ColumnName = "F_ItemName")]
  134 + public string ItemName { get; set; }
123 135 }
124 136 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_jksyj/LqKdJksyjEntity.cs
... ... @@ -88,5 +88,17 @@ namespace NCC.Extend.Entitys.lq_kd_jksyj
88 88 /// </summary>
89 89 [SugarColumn(ColumnName = "F_ItemId")]
90 90 public string ItemId { get; set; }
  91 +
  92 + /// <summary>
  93 + /// 门店ID
  94 + /// </summary>
  95 + [SugarColumn(ColumnName = "F_StoreId")]
  96 + public string StoreId { get; set; }
  97 +
  98 + /// <summary>
  99 + /// 品项名称
  100 + /// </summary>
  101 + [SugarColumn(ColumnName = "F_ItemName")]
  102 + public string ItemName { get; set; }
91 103 }
92 104 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_kjbsyj/LqKdKjbsyjEntity.cs
... ... @@ -88,5 +88,17 @@ namespace NCC.Extend.Entitys.lq_kd_kjbsyj
88 88 /// </summary>
89 89 [SugarColumn(ColumnName = "F_ItemId")]
90 90 public string ItemId { get; set; }
  91 +
  92 + /// <summary>
  93 + /// 门店ID
  94 + /// </summary>
  95 + [SugarColumn(ColumnName = "F_StoreId")]
  96 + public string StoreId { get; set; }
  97 +
  98 + /// <summary>
  99 + /// 品项名称
  100 + /// </summary>
  101 + [SugarColumn(ColumnName = "F_ItemName")]
  102 + public string ItemName { get; set; }
91 103 }
92 104 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_xh_jksyj/LqXhJksyjEntity.cs
... ... @@ -136,5 +136,17 @@ namespace NCC.Extend.Entitys.lq_xh_jksyj
136 136 /// </summary>
137 137 [SugarColumn(ColumnName = "F_ItemId")]
138 138 public string ItemId { get; set; }
  139 +
  140 + /// <summary>
  141 + /// 门店ID
  142 + /// </summary>
  143 + [SugarColumn(ColumnName = "F_StoreId")]
  144 + public string StoreId { get; set; }
  145 +
  146 + /// <summary>
  147 + /// 品项名称
  148 + /// </summary>
  149 + [SugarColumn(ColumnName = "F_ItemName")]
  150 + public string ItemName { get; set; }
139 151 }
140 152 }
141 153 \ No newline at end of file
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_xh_kjbsyj/LqXhKjbsyjEntity.cs
... ... @@ -118,5 +118,17 @@ namespace NCC.Extend.Entitys.lq_xh_kjbsyj
118 118 /// </summary>
119 119 [SugarColumn(ColumnName = "F_ItemId")]
120 120 public string ItemId { get; set; }
  121 +
  122 + /// <summary>
  123 + /// 门店ID
  124 + /// </summary>
  125 + [SugarColumn(ColumnName = "F_StoreId")]
  126 + public string StoreId { get; set; }
  127 +
  128 + /// <summary>
  129 + /// 品项名称
  130 + /// </summary>
  131 + [SugarColumn(ColumnName = "F_ItemName")]
  132 + public string ItemName { get; set; }
121 133 }
122 134 }
123 135 \ No newline at end of file
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Enum/ConsumableProductTypeEnum.cs
... ... @@ -14,10 +14,10 @@ namespace NCC.Extend.Entitys.Enum
14 14 毛巾 = 1,
15 15  
16 16 /// <summary>
17   - /// 垫子
  17 + /// 床巾
18 18 /// </summary>
19   - [Description("垫子")]
20   - 垫子 = 2,
  19 + [Description("床巾")]
  20 + 床巾 = 2,
21 21  
22 22 /// <summary>
23 23 /// 浴巾
... ... @@ -38,6 +38,206 @@ namespace NCC.Extend.Entitys.Enum
38 38 枕套 = 5,
39 39  
40 40 /// <summary>
  41 + /// 白床毯
  42 + /// </summary>
  43 + [Description("白床毯")]
  44 + 白床毯 = 6,
  45 +
  46 +
  47 + /// <summary>
  48 + /// 毛线毯
  49 + /// </summary>
  50 + [Description("毛线毯")]
  51 + 毛线毯 = 7,
  52 +
  53 +
  54 + /// <summary>
  55 + /// 毯被
  56 + /// </summary>
  57 + [Description("毯被")]
  58 + 毯被 = 8,
  59 +
  60 + /// <summary>
  61 + /// 面巾
  62 + /// </summary>
  63 + [Description("面巾")]
  64 + 面巾 = 9,
  65 +
  66 + /// <summary>
  67 + /// 地巾
  68 + /// </summary>
  69 + [Description("地巾")]
  70 + 地巾 = 10,
  71 +
  72 + /// <summary>
  73 + /// 浴袍(衣、裙)
  74 + /// </summary>
  75 + [Description("浴袍衣裙")]
  76 + 浴袍衣裙 = 11,
  77 +
  78 + /// <summary>
  79 + /// 凳套
  80 + /// </summary>
  81 + [Description("凳套")]
  82 + 凳套 = 12,
  83 +
  84 + /// <summary>
  85 + /// 床罩
  86 + /// </summary>
  87 + [Description("床罩")]
  88 + 床罩 = 13,
  89 +
  90 + /// <summary>
  91 + /// 桌布
  92 + /// </summary>
  93 + [Description("桌布")]
  94 + 桌布 = 14,
  95 +
  96 + /// <summary>
  97 + /// 包头巾
  98 + /// </summary>
  99 + [Description("包头巾")]
  100 + 包头巾 = 15,
  101 +
  102 + /// <summary>
  103 + /// 靠枕
  104 + /// </summary>
  105 + [Description("靠枕")]
  106 + 靠枕 = 16,
  107 +
  108 + /// <summary>
  109 + /// 束带
  110 + /// </summary>
  111 + [Description("束带")]
  112 + 束带 = 17,
  113 +
  114 + /// <summary>
  115 + /// 床上5件套
  116 + /// </summary>
  117 + [Description("床上5件套")]
  118 + 床上5件套 = 18,
  119 +
  120 + /// <summary>
  121 + /// 桌旗
  122 + /// </summary>
  123 + [Description("桌旗")]
  124 + 桌旗 = 19,
  125 +
  126 + /// <summary>
  127 + /// 床旗
  128 + /// </summary>
  129 + [Description("床旗")]
  130 + 床旗 = 20,
  131 +
  132 + /// <summary>
  133 + /// 被套
  134 + /// </summary>
  135 + [Description("被套")]
  136 + 被套 = 21,
  137 +
  138 + /// <summary>
  139 + /// 工作服
  140 + /// </summary>
  141 + [Description("工作服")]
  142 + 工作服 = 22,
  143 +
  144 + /// <summary>
  145 + /// 头巾
  146 + /// </summary>
  147 + [Description("头巾")]
  148 + 头巾 = 23,
  149 +
  150 + /// <summary>
  151 + /// 床套
  152 + /// </summary>
  153 + [Description("床套")]
  154 + 床套 = 24,
  155 +
  156 + /// <summary>
  157 + /// 脚套
  158 + /// </summary>
  159 + [Description("脚套")]
  160 + 脚套 = 25,
  161 +
  162 + /// <summary>
  163 + /// 登套
  164 + /// </summary>
  165 + [Description("登套")]
  166 + 登套 = 26,
  167 +
  168 + /// <summary>
  169 + /// 椅套
  170 + /// </summary>
  171 + [Description("椅套")]
  172 + 椅套 = 27,
  173 +
  174 + /// <summary>
  175 + /// 浴衣
  176 + /// </summary>
  177 + [Description("浴衣")]
  178 + 浴衣 = 28,
  179 +
  180 + /// <summary>
  181 + /// 浴袍
  182 + /// </summary>
  183 + [Description("浴袍")]
  184 + 浴袍 = 29,
  185 +
  186 + /// <summary>
  187 + /// 工衣
  188 + /// </summary>
  189 + [Description("工衣")]
  190 + 工衣 = 30,
  191 +
  192 + /// <summary>
  193 + /// 毛毯
  194 + /// </summary>
  195 + [Description("毛毯")]
  196 + 毛毯 = 31,
  197 +
  198 + /// <summary>
  199 + /// 针织被
  200 + /// </summary>
  201 + [Description("针织被")]
  202 + 针织被 = 32,
  203 +
  204 + /// <summary>
  205 + /// 靠被
  206 + /// </summary>
  207 + [Description("靠被")]
  208 + 靠被 = 33,
  209 +
  210 + /// <summary>
  211 + /// 脚枕
  212 + /// </summary>
  213 + [Description("脚枕")]
  214 + 脚枕 = 34,
  215 +
  216 + /// <summary>
  217 + /// 垫褥
  218 + /// </summary>
  219 + [Description("垫褥")]
  220 + 垫褥 = 35,
  221 +
  222 + /// <summary>
  223 + /// 垫子
  224 + /// </summary>
  225 + [Description("垫子")]
  226 + 垫子 = 36,
  227 +
  228 + /// <summary>
  229 + /// 板凳套
  230 + /// </summary>
  231 + [Description("板凳套")]
  232 + 板凳套 = 37,
  233 +
  234 + /// <summary>
  235 + /// 针织毯
  236 + /// </summary>
  237 + [Description("针织毯")]
  238 + 针织毯 = 38,
  239 +
  240 + /// <summary>
41 241 /// 其他
42 242 /// </summary>
43 243 [Description("其他")]
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqDailyReportService.cs
... ... @@ -542,10 +542,8 @@ namespace NCC.Extend
542 542 {
543 543 // 获取时间范围
544 544 var (startDate, endDate) = GetTimeRange(input.StartTime, input.EndTime);
545   -
546 545 // 根据开始时间确定月份(YYYYMM格式)
547 546 var month = startDate.ToString("yyyyMM");
548   -
549 547 // 构建部门过滤条件
550 548 var departmentFilter = "";
551 549 if (input.DepartmentIds != null && input.DepartmentIds.Any())
... ... @@ -553,7 +551,6 @@ namespace NCC.Extend
553 551 var filterDeptIdsStr = string.Join("','", input.DepartmentIds);
554 552 departmentFilter = $"AND o.F_Id IN ('{filterDeptIdsStr}')";
555 553 }
556   -
557 554 // 天王团部门信息(字段名、目标字段名、部门名称和品项分类的映射)
558 555 var tianwangDepartments = new Dictionary<string, (string fieldName, string targetFieldName, string[] departmentNames, string itemType)>
559 556 {
... ... @@ -561,7 +558,6 @@ namespace NCC.Extend
561 558 { "kjb", ("F_TechDepartment", "F_TechDepartmentTarget", new[] { "科技一部", "科技二部" }, "科美") },
562 559 { "dxmb", ("F_MajorProjectDepartment", "F_MajorProjectDepartmentTarget", new[] { "大项目一部", "大项目二部" }, "医美") }
563 560 };
564   -
565 561 // 分步查询,提高效率
566 562 var departmentDict = new Dictionary<string, TianwangGroupPerformanceCompletionOutput>();
567 563 // 记录每个部门ID对应的字段类型(jyb、kjb、dxmb)
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqHytkHytkService.cs
... ... @@ -437,6 +437,8 @@ namespace NCC.Extend.LqHytkHytk
437 437 IsEffective = StatusEnum.有效.GetHashCode(),
438 438 ItemCategory = lqHytkMxEntity.ItemCategory,
439 439 ItemId = lqHytkMxEntity.Px,
  440 + StoreId = newEntity.Md,
  441 + ItemName = lqHytkMxEntity.Pxmc
440 442 }
441 443 );
442 444 }
... ... @@ -466,6 +468,8 @@ namespace NCC.Extend.LqHytkHytk
466 468 IsEffective = StatusEnum.有效.GetHashCode(),
467 469 ItemCategory = lqHytkMxEntity.ItemCategory,
468 470 ItemId = lqHytkMxEntity.Px,
  471 + StoreId = newEntity.Md,
  472 + ItemName = lqHytkMxEntity.Pxmc
469 473 }
470 474 );
471 475 }
... ... @@ -592,6 +596,8 @@ namespace NCC.Extend.LqHytkHytk
592 596 F_CreateUser = userInfo.userId,
593 597 ItemCategory = lqHytkMxEntity.ItemCategory,
594 598 ItemId = lqHytkMxEntity.Px,
  599 + StoreId = entity.Md,
  600 + ItemName = lqHytkMxEntity.Pxmc
595 601 }
596 602 );
597 603 }
... ... @@ -619,6 +625,8 @@ namespace NCC.Extend.LqHytkHytk
619 625 F_CreateUser = userInfo.userId,
620 626 ItemCategory = lqHytkMxEntity.ItemCategory,
621 627 ItemId = lqHytkMxEntity.Px,
  628 + StoreId = entity.Md,
  629 + ItemName = lqHytkMxEntity.Pxmc
622 630 }
623 631 );
624 632 }
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs
... ... @@ -955,6 +955,8 @@ namespace NCC.Extend.LqKdKdjlb
955 955 ActivityId = input.activityId,
956 956 ItemCategory = lqKdPxmxEntity.ItemCategory,
957 957 ItemId = lqKdPxmxEntity.Px,
  958 + ItemName = lqKdPxmxEntity.Pxmc,
  959 + StoreId = entity.Djmd
958 960 });
959 961 }
960 962 }
... ... @@ -978,6 +980,8 @@ namespace NCC.Extend.LqKdKdjlb
978 980 ActivityId = input.activityId,
979 981 ItemCategory = lqKdPxmxEntity.ItemCategory,
980 982 ItemId = lqKdPxmxEntity.Px,
  983 + ItemName = lqKdPxmxEntity.Pxmc,
  984 + StoreId = entity.Djmd
981 985 }
982 986 );
983 987 }
... ... @@ -1425,6 +1429,7 @@ namespace NCC.Extend.LqKdKdjlb
1425 1429 Pxmc = item.pxmc,
1426 1430 Pxjg = item.pxjg,
1427 1431 SourceType = item.sourceType,
  1432 + ItemCategory = await _db.Queryable<LqXmzlEntity>().Where(x => x.Id == item.px).Select(x => x.Qt2).FirstAsync(),
1428 1433 };
1429 1434 allPxmxEntities.Add(lqKdPxmxEntity);
1430 1435  
... ... @@ -1433,20 +1438,22 @@ namespace NCC.Extend.LqKdKdjlb
1433 1438 {
1434 1439 foreach (var ijks_tem in item.lqKdJksyjList)
1435 1440 {
1436   - allJksyjEntities.Add(
1437   - new LqKdJksyjEntity
1438   - {
1439   - Id = YitIdHelper.NextId().ToString(),
1440   - Glkdbh = entity.Id,
1441   - Jks = ijks_tem.jks,
1442   - Jksxm = ijks_tem.jksxm,
1443   - Jkszh = ijks_tem.jkszh,
1444   - Jksyj = ijks_tem.jksyj,
1445   - Yjsj = DateTime.Now,
1446   - Jsj_id = ijks_tem.jsj_id,
1447   - Kdpxid = lqKdPxmxEntity.Id,
1448   - }
1449   - );
  1441 + allJksyjEntities.Add(new LqKdJksyjEntity
  1442 + {
  1443 + Id = YitIdHelper.NextId().ToString(),
  1444 + Glkdbh = entity.Id,
  1445 + Jks = ijks_tem.jks,
  1446 + Jksxm = ijks_tem.jksxm,
  1447 + Jkszh = ijks_tem.jkszh,
  1448 + Jksyj = ijks_tem.jksyj,
  1449 + Yjsj = DateTime.Now,
  1450 + Jsj_id = ijks_tem.jsj_id,
  1451 + Kdpxid = lqKdPxmxEntity.Id,
  1452 + StoreId = entity.Djmd,
  1453 + ItemCategory = lqKdPxmxEntity.ItemCategory,
  1454 + ItemId = lqKdPxmxEntity.Px,
  1455 + ItemName = lqKdPxmxEntity.Pxmc,
  1456 + });
1450 1457 }
1451 1458 }
1452 1459  
... ... @@ -1455,19 +1462,21 @@ namespace NCC.Extend.LqKdKdjlb
1455 1462 {
1456 1463 foreach (var ikjbs_tem in item.lqKdKjbsyjList)
1457 1464 {
1458   - allKjbsyjEntities.Add(
1459   - new LqKdKjbsyjEntity
1460   - {
1461   - Id = YitIdHelper.NextId().ToString(),
1462   - Glkdbh = entity.Id,
1463   - Kjbls = ikjbs_tem.kjbls,
1464   - Kjblsxm = ikjbs_tem.kjblsxm,
1465   - Kjblszh = ikjbs_tem.kjblszh,
1466   - Kjblsyj = ikjbs_tem.kjblsyj,
1467   - Yjsj = DateTime.Now,
1468   - Kdpxid = lqKdPxmxEntity.Id,
1469   - }
1470   - );
  1465 + allKjbsyjEntities.Add(new LqKdKjbsyjEntity
  1466 + {
  1467 + Id = YitIdHelper.NextId().ToString(),
  1468 + Glkdbh = entity.Id,
  1469 + Kjbls = ikjbs_tem.kjbls,
  1470 + Kjblsxm = ikjbs_tem.kjblsxm,
  1471 + Kjblszh = ikjbs_tem.kjblszh,
  1472 + Kjblsyj = ikjbs_tem.kjblsyj,
  1473 + Yjsj = DateTime.Now,
  1474 + Kdpxid = lqKdPxmxEntity.Id,
  1475 + ItemCategory = lqKdPxmxEntity.ItemCategory,
  1476 + ItemId = lqKdPxmxEntity.Px,
  1477 + StoreId = entity.Djmd,
  1478 + ItemName = lqKdPxmxEntity.Pxmc,
  1479 + });
1471 1480 }
1472 1481 }
1473 1482 }
... ... @@ -2622,7 +2631,11 @@ namespace NCC.Extend.LqKdKdjlb
2622 2631 jksyj = it.Jksyj,
2623 2632 kdpxid = it.Kdpxid,
2624 2633 yjsj = it.Yjsj,
2625   - jsj_id = it.Jsj_id
  2634 + jsj_id = it.Jsj_id,
  2635 + itemCategory = it.ItemCategory,
  2636 + storeId = it.StoreId,
  2637 + itemId = it.ItemId,
  2638 + itemName = it.ItemName,
2626 2639 })
2627 2640 .ToListAsync();
2628 2641  
... ... @@ -2691,7 +2704,11 @@ namespace NCC.Extend.LqKdKdjlb
2691 2704 performance = x.jksyj,
2692 2705 performanceTime = x.yjsj,
2693 2706 itemDetailId = x.kdpxid,
2694   - goldTriangleId = x.jsj_id
  2707 + goldTriangleId = x.jsj_id,
  2708 + itemCategory = x.itemCategory,
  2709 + itemId = x.itemId,
  2710 + storeId = x.storeId,
  2711 + itemName = x.itemName
2695 2712 }).ToList(),
2696 2713  
2697 2714 // 其他信息
... ... @@ -2937,7 +2954,8 @@ namespace NCC.Extend.LqKdKdjlb
2937 2954 ProjectNumber = item.TransferQuantity,
2938 2955 SourceType = refundPxmxEntity.SourceType,
2939 2956 TotalPrice = totalItemDeduction,
2940   - IsEffective = StatusEnum.有效.GetHashCode()
  2957 + IsEffective = StatusEnum.有效.GetHashCode(),
  2958 + ItemCategory = await _db.Queryable<LqXmzlEntity>().Where(x => x.Id == refundPxmxEntity.Px).Select(x => x.Qt2).FirstAsync(),
2941 2959 };
2942 2960 refundMxEntities.Add(refundMxEntity);
2943 2961 var refundKdyjEntities = _db.Queryable<LqKdJksyjEntity>().Where(p => p.Kdpxid == item.BillingItemId).ToList();
... ... @@ -2968,7 +2986,11 @@ namespace NCC.Extend.LqKdKdjlb
2968 2986 F_CreateTime = transferTime,
2969 2987 F_CreateUser = userInfo.userId,
2970 2988 CardReturn = refundMxEntity.Id,
2971   - IsEffective = StatusEnum.有效.GetHashCode()
  2989 + IsEffective = StatusEnum.有效.GetHashCode(),
  2990 + ItemCategory = refundMxEntity.ItemCategory,
  2991 + ItemId = refundMxEntity.Px,
  2992 + StoreId = refundEntity.Md,
  2993 + ItemName = refundMxEntity.Pxmc
2972 2994 });
2973 2995 }
2974 2996 //查询科技部老师的业绩
... ... @@ -2991,7 +3013,11 @@ namespace NCC.Extend.LqKdKdjlb
2991 3013 F_CreateTime = transferTime,
2992 3014 F_CreateUser = userInfo.userId,
2993 3015 CardReturn = refundMxEntity.Id,
2994   - IsEffective = StatusEnum.有效.GetHashCode()
  3016 + IsEffective = StatusEnum.有效.GetHashCode(),
  3017 + ItemCategory = refundMxEntity.ItemCategory,
  3018 + ItemId = refundMxEntity.Px,
  3019 + StoreId = refundEntity.Md,
  3020 + ItemName = refundMxEntity.Pxmc
2995 3021 });
2996 3022 }
2997 3023 }
... ... @@ -3049,7 +3075,8 @@ namespace NCC.Extend.LqKdKdjlb
3049 3075 TotalPrice = item.ItemPrice * item.TransferQuantity,
3050 3076 ActualPrice = item.ItemPrice * item.TransferQuantity,
3051 3077 IsEffective = StatusEnum.有效.GetHashCode(),
3052   - Remark = $"从会员 {fromMember.Khmc} 转入"
  3078 + Remark = $"从会员 {fromMember.Khmc} 转入",
  3079 + ItemCategory = await _db.Queryable<LqXmzlEntity>().Where(x => x.Id == refundPxmxEntity.Px).Select(x => x.Qt2).FirstAsync(),
3053 3080 };
3054 3081 billingPxmxEntities.Add(billingPxmxEntity);
3055 3082  
... ... @@ -3066,7 +3093,11 @@ namespace NCC.Extend.LqKdKdjlb
3066 3093 Yjsj = transferTime,
3067 3094 Jsj_id = jks.F_jsjid,
3068 3095 Kdpxid = billingPxmxEntity.Id,
3069   - IsEffective = StatusEnum.有效.GetHashCode()
  3096 + IsEffective = StatusEnum.有效.GetHashCode(),
  3097 + ItemCategory = billingPxmxEntity.ItemCategory,
  3098 + ItemId = billingPxmxEntity.Px,
  3099 + StoreId = billingEntity.Djmd,
  3100 + ItemName = billingPxmxEntity.Pxmc
3070 3101 });
3071 3102 }
3072 3103  
... ... @@ -3082,7 +3113,11 @@ namespace NCC.Extend.LqKdKdjlb
3082 3113 Kjblsyj = kjbs.Kjblsyj.ToString(),
3083 3114 Yjsj = transferTime,
3084 3115 Kdpxid = billingPxmxEntity.Id,
3085   - IsEffective = StatusEnum.有效.GetHashCode()
  3116 + IsEffective = StatusEnum.有效.GetHashCode(),
  3117 + ItemCategory = billingPxmxEntity.ItemCategory,
  3118 + ItemId = billingPxmxEntity.Px,
  3119 + StoreId = billingEntity.Djmd,
  3120 + ItemName = billingPxmxEntity.Pxmc
3086 3121 });
3087 3122 }
3088 3123 }
... ... @@ -3100,7 +3135,6 @@ namespace NCC.Extend.LqKdKdjlb
3100 3135 Remarks = input.Remarks,
3101 3136 CreateTime = DateTime.Now,
3102 3137 IsEffective = StatusEnum.有效.GetHashCode()
3103   -
3104 3138 };
3105 3139 await _db.Insertable(transferLogEntity).ExecuteCommandAsync();
3106 3140  
... ... @@ -4128,6 +4162,5 @@ namespace NCC.Extend.LqKdKdjlb
4128 4162 }
4129 4163 }
4130 4164 #endregion
4131   -
4132 4165 }
4133 4166 }
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqStatisticsService.cs
... ... @@ -3625,7 +3625,6 @@ namespace NCC.Extend.LqStatistics
3625 3625 var result = await _db.Ado.SqlQueryAsync<dynamic>(sql);
3626 3626 return Convert.ToDecimal(result.FirstOrDefault()?.LaborCost ?? 0);
3627 3627 }
3628   -
3629 3628 #endregion
3630 3629  
3631 3630 #region 科技部老师业绩统计
... ... @@ -4250,6 +4249,304 @@ namespace NCC.Extend.LqStatistics
4250 4249 }
4251 4250 #endregion
4252 4251  
  4252 + #region 线索池客户统计报表
  4253 + /// <summary>
  4254 + /// 获取线索池客户统计报表(BAK)
  4255 + /// </summary>
  4256 + /// <remarks>
  4257 + /// 根据拓客记录统计线索池客户的邀约、预约、消耗、开单等信息
  4258 + ///
  4259 + /// 业务链路:拓客 -> 邀约 -> 预约 -> 开单/消耗
  4260 + ///
  4261 + /// 示例请求:
  4262 + /// ```json
  4263 + /// {
  4264 + /// "pageIndex": 1,
  4265 + /// "pageSize": 20,
  4266 + /// "startTime": "2025-10-01T00:00:00",
  4267 + /// "endTime": "2025-10-31T23:59:59",
  4268 + /// "storeIds": ["store1", "store2"],
  4269 + /// "eventId": "event123"
  4270 + /// }
  4271 + /// ```
  4272 + ///
  4273 + /// 参数说明:
  4274 + /// - pageIndex: 页码,从1开始
  4275 + /// - pageSize: 每页数量
  4276 + /// - startTime: 拓客时间范围开始时间
  4277 + /// - endTime: 拓客时间范围结束时间
  4278 + /// - storeIds: 门店ID列表,可传多个
  4279 + /// - eventId: 拓客活动ID
  4280 + ///
  4281 + /// 返回数据说明:
  4282 + /// - LeadCustomerId: 线索池客户(拓客编号)
  4283 + /// - CustomerName: 客户姓名
  4284 + /// - ExpansionTime: 拓客时间
  4285 + /// - HasInvite: 是否邀约(是/否),通过拓客编号关联邀约表
  4286 + /// - HasAppointment: 是否预约(是/否),只统计通过邀约产生的预约(预约表的F_InviteId关联邀约表)
  4287 + /// - HasConsume: 是否有消耗(是/否),只统计通过预约产生的耗卡(耗卡表的F_AppointmentId关联预约表)
  4288 + /// - HasBilling: 是否开单(是/否),只统计通过预约产生的开单(开单表的F_AppointmentId关联预约表)
  4289 + /// - NoBillingReason: 未开单原因,从预约记录的F_NoDealRemark字段获取
  4290 + /// - BillingAmount: 开卡金额,汇总通过预约产生的开单记录的整单业绩(zdyj)
  4291 + /// - BillingItems: 开卡卡项,汇总通过预约产生的开单品项名称,多个用顿号分隔
  4292 + /// - ActualAppointmentCount: 实际预约记录数(不管是否通过邀约产生),用于问题分析
  4293 + /// - ActualConsumeCount: 实际消耗记录数(不管是否通过预约产生),用于问题分析
  4294 + /// - ActualBillingCount: 实际开单记录数(不管是否通过预约产生),用于问题分析
  4295 + /// - Analysis: 问题分析说明,自动分析数据异常情况,如:有预约记录但未通过邀约产生、有消耗记录但未通过预约产生等
  4296 + ///
  4297 + /// 返回示例:
  4298 + /// ```json
  4299 + /// {
  4300 + /// "list": [
  4301 + /// {
  4302 + /// "LeadCustomerId": "751248448816153862",
  4303 + /// "CustomerName": "王女士",
  4304 + /// "ExpansionTime": "2025-10-24T03:33:10.000Z",
  4305 + /// "HasInvite": "否",
  4306 + /// "HasAppointment": "否",
  4307 + /// "HasConsume": "否",
  4308 + /// "HasBilling": "否",
  4309 + /// "NoBillingReason": null,
  4310 + /// "BillingAmount": 0,
  4311 + /// "BillingItems": null,
  4312 + /// "ActualAppointmentCount": 3,
  4313 + /// "ActualConsumeCount": 4,
  4314 + /// "ActualBillingCount": 5,
  4315 + /// "Analysis": "有3条预约记录,但未通过邀约产生(F_InviteId为null);有4条消耗记录,但未通过预约产生(F_AppointmentId为null或预约未通过邀约产生);有5条开单记录,但未通过预约产生(F_AppointmentId为null或预约未通过邀约产生)"
  4316 + /// }
  4317 + /// ],
  4318 + /// "pagination": {
  4319 + /// "pageIndex": 1,
  4320 + /// "pageSize": 20,
  4321 + /// "total": 1511
  4322 + /// }
  4323 + /// }
  4324 + /// ```
  4325 + /// </remarks>
  4326 + /// <param name="input">查询条件</param>
  4327 + /// <returns>线索池客户统计报表列表,包含统计数据和问题分析</returns>
  4328 + /// <response code="200">查询成功,返回统计报表列表和分页信息</response>
  4329 + /// <response code="400">参数错误</response>
  4330 + /// <response code="500">服务器内部错误</response>
  4331 + [HttpPost("get-lead-customer-statistics-list-bak")]
  4332 + public async Task<dynamic> GetLeadCustomerStatisticsList_bak([FromBody] LeadCustomerStatisticsListQueryInput input)
  4333 + {
  4334 + try
  4335 + {
  4336 + // 构建WHERE条件
  4337 + var whereConditions = new List<string>();
  4338 + var parameters = new List<SugarParameter>();
  4339 +
  4340 + if (input.StartTime.HasValue)
  4341 + {
  4342 + whereConditions.Add("tk.F_ExpansionTime >= @StartTime");
  4343 + parameters.Add(new SugarParameter("@StartTime", input.StartTime.Value));
  4344 + }
  4345 +
  4346 + if (input.EndTime.HasValue)
  4347 + {
  4348 + whereConditions.Add("tk.F_ExpansionTime <= @EndTime");
  4349 + parameters.Add(new SugarParameter("@EndTime", input.EndTime.Value));
  4350 + }
  4351 +
  4352 + if (input.StoreIds != null && input.StoreIds.Any())
  4353 + {
  4354 + var storeIdParams = string.Join(",", input.StoreIds.Select((_, i) => $"@StoreId{i}"));
  4355 + whereConditions.Add($"tk.F_StoreId IN ({storeIdParams})");
  4356 + for (int i = 0; i < input.StoreIds.Count; i++)
  4357 + {
  4358 + parameters.Add(new SugarParameter($"@StoreId{i}", input.StoreIds[i]));
  4359 + }
  4360 + }
  4361 +
  4362 + if (!string.IsNullOrEmpty(input.EventId))
  4363 + {
  4364 + whereConditions.Add("tk.F_EventId = @EventId");
  4365 + parameters.Add(new SugarParameter("@EventId", input.EventId));
  4366 + }
  4367 +
  4368 + var whereClause = whereConditions.Any() ? "WHERE " + string.Join(" AND ", whereConditions) : "";
  4369 +
  4370 + // 使用子查询优化性能,避免复杂的JOIN和GROUP BY
  4371 + var sql = $@"
  4372 + SELECT
  4373 + tk.F_Id as LeadCustomerId,
  4374 + tk.F_CustomerName as CustomerName,
  4375 + tk.F_ExpansionTime as ExpansionTime,
  4376 + -- 是否邀约:通过拓客编号关联
  4377 + CASE WHEN yaoy_stats.has_invite = 1 THEN '是' ELSE '否' END as HasInvite,
  4378 + -- 是否预约:通过邀约ID关联(只统计通过邀约产生的预约)
  4379 + CASE WHEN yy_stats.has_appointment = 1 THEN '是' ELSE '否' END as HasAppointment,
  4380 + -- 是否有消耗:通过预约ID关联(只统计通过预约产生的耗卡)
  4381 + CASE WHEN xh_stats.has_consume = 1 THEN '是' ELSE '否' END as HasConsume,
  4382 + -- 是否开单:通过预约ID关联(只统计通过预约产生的开单)
  4383 + CASE WHEN kd_stats.has_billing = 1 THEN '是' ELSE '否' END as HasBilling,
  4384 + -- 未开单原因:从预约记录中获取(只取通过邀约产生的预约)
  4385 + yy_stats.no_billing_reason as NoBillingReason,
  4386 + -- 开卡金额:汇总通过预约产生的开单记录
  4387 + COALESCE(kd_stats.billing_amount, 0) as BillingAmount,
  4388 + -- 开卡卡项:汇总通过预约产生的开单品项
  4389 + kd_stats.billing_items as BillingItems,
  4390 + -- 实际预约记录数(不管是否通过邀约产生)
  4391 + COALESCE(yy_actual.count, 0) as ActualAppointmentCount,
  4392 + -- 实际消耗记录数(不管是否通过预约产生)
  4393 + COALESCE(xh_actual.count, 0) as ActualConsumeCount,
  4394 + -- 实际开单记录数(不管是否通过预约产生)
  4395 + COALESCE(kd_actual.count, 0) as ActualBillingCount
  4396 + FROM lq_tkjlb tk
  4397 + -- 邀约统计子查询
  4398 + LEFT JOIN (
  4399 + SELECT
  4400 + yaoy.tkbh as tk_id,
  4401 + 1 as has_invite
  4402 + FROM lq_yaoyjl yaoy
  4403 + GROUP BY yaoy.tkbh
  4404 + ) yaoy_stats ON yaoy_stats.tk_id = tk.F_Id
  4405 + -- 预约统计子查询(只统计通过邀约产生的预约)
  4406 + LEFT JOIN (
  4407 + SELECT
  4408 + tk_inner.F_MemberId as member_id,
  4409 + 1 as has_appointment,
  4410 + MAX(yy.F_NoDealRemark) as no_billing_reason
  4411 + FROM lq_tkjlb tk_inner
  4412 + INNER JOIN lq_yaoyjl yaoy ON yaoy.tkbh = tk_inner.F_Id
  4413 + INNER JOIN lq_yyjl yy ON yy.F_InviteId = yaoy.F_Id
  4414 + GROUP BY tk_inner.F_MemberId
  4415 + ) yy_stats ON yy_stats.member_id = tk.F_MemberId
  4416 + -- 消耗统计子查询(只统计通过预约产生的耗卡)
  4417 + LEFT JOIN (
  4418 + SELECT
  4419 + tk_inner.F_MemberId as member_id,
  4420 + 1 as has_consume
  4421 + FROM lq_tkjlb tk_inner
  4422 + INNER JOIN lq_yaoyjl yaoy ON yaoy.tkbh = tk_inner.F_Id
  4423 + INNER JOIN lq_yyjl yy ON yy.F_InviteId = yaoy.F_Id
  4424 + INNER JOIN lq_xh_hyhk xh ON xh.F_AppointmentId = yy.F_Id AND xh.F_IsEffective = 1
  4425 + GROUP BY tk_inner.F_MemberId
  4426 + ) xh_stats ON xh_stats.member_id = tk.F_MemberId
  4427 + -- 开单统计子查询(只统计通过预约产生的开单,包含金额和品项)
  4428 + LEFT JOIN (
  4429 + SELECT
  4430 + tk_inner.F_MemberId as member_id,
  4431 + 1 as has_billing,
  4432 + SUM(kd.zdyj) as billing_amount,
  4433 + GROUP_CONCAT(DISTINCT kdpx.pxmc SEPARATOR '、') as billing_items
  4434 + FROM lq_tkjlb tk_inner
  4435 + INNER JOIN lq_yaoyjl yaoy ON yaoy.tkbh = tk_inner.F_Id
  4436 + INNER JOIN lq_yyjl yy ON yy.F_InviteId = yaoy.F_Id
  4437 + INNER JOIN lq_kd_kdjlb kd ON kd.F_AppointmentId = yy.F_Id AND kd.F_IsEffective = 1
  4438 + LEFT JOIN lq_kd_pxmx kdpx ON kdpx.glkdbh = kd.F_Id AND kdpx.F_IsEffective = 1
  4439 + GROUP BY tk_inner.F_MemberId
  4440 + ) kd_stats ON kd_stats.member_id = tk.F_MemberId
  4441 + -- 实际预约记录数统计(不管是否通过邀约产生)
  4442 + LEFT JOIN (
  4443 + SELECT
  4444 + yy.gk as member_id,
  4445 + COUNT(*) as count
  4446 + FROM lq_yyjl yy
  4447 + GROUP BY yy.gk
  4448 + ) yy_actual ON yy_actual.member_id = tk.F_MemberId
  4449 + -- 实际消耗记录数统计(不管是否通过预约产生)
  4450 + LEFT JOIN (
  4451 + SELECT
  4452 + xh.hy as member_id,
  4453 + COUNT(*) as count
  4454 + FROM lq_xh_hyhk xh
  4455 + WHERE xh.F_IsEffective = 1
  4456 + GROUP BY xh.hy
  4457 + ) xh_actual ON xh_actual.member_id = tk.F_MemberId
  4458 + -- 实际开单记录数统计(不管是否通过预约产生)
  4459 + LEFT JOIN (
  4460 + SELECT
  4461 + kd.kdhy as member_id,
  4462 + COUNT(*) as count
  4463 + FROM lq_kd_kdjlb kd
  4464 + WHERE kd.F_IsEffective = 1
  4465 + GROUP BY kd.kdhy
  4466 + ) kd_actual ON kd_actual.member_id = tk.F_MemberId
  4467 + {whereClause}
  4468 + ORDER BY tk.F_ExpansionTime DESC
  4469 + LIMIT @PageSize OFFSET @Offset";
  4470 +
  4471 + parameters.Add(new SugarParameter("@PageSize", input.PageSize));
  4472 + parameters.Add(new SugarParameter("@Offset", (input.PageIndex - 1) * input.PageSize));
  4473 +
  4474 + // 查询总数
  4475 + var countSql = $@"
  4476 + SELECT COUNT(*)
  4477 + FROM lq_tkjlb tk
  4478 + {whereClause}";
  4479 +
  4480 + var countParameters = parameters.Where(p => p.ParameterName != "@PageSize" && p.ParameterName != "@Offset").ToList();
  4481 + var totalCount = await _db.Ado.GetIntAsync(countSql, countParameters);
  4482 +
  4483 + // 执行查询
  4484 + var result = await _db.Ado.SqlQueryAsync<LeadCustomerStatisticsListOutput>(sql, parameters);
  4485 +
  4486 + // 生成问题分析说明
  4487 + foreach (var item in result)
  4488 + {
  4489 + var analysisList = new List<string>();
  4490 +
  4491 + if (item.HasInvite == "否" && item.HasAppointment == "否" && item.ActualAppointmentCount > 0)
  4492 + {
  4493 + analysisList.Add($"有{item.ActualAppointmentCount}条预约记录,但未通过邀约产生(F_InviteId为null)");
  4494 + }
  4495 +
  4496 + if (item.HasAppointment == "否" && item.HasConsume == "否" && item.ActualConsumeCount > 0)
  4497 + {
  4498 + analysisList.Add($"有{item.ActualConsumeCount}条消耗记录,但未通过预约产生(F_AppointmentId为null或预约未通过邀约产生)");
  4499 + }
  4500 +
  4501 + if (item.HasAppointment == "否" && item.HasBilling == "否" && item.ActualBillingCount > 0)
  4502 + {
  4503 + analysisList.Add($"有{item.ActualBillingCount}条开单记录,但未通过预约产生(F_AppointmentId为null或预约未通过邀约产生)");
  4504 + }
  4505 +
  4506 + if (item.HasInvite == "是" && item.HasAppointment == "否" && item.ActualAppointmentCount > 0)
  4507 + {
  4508 + analysisList.Add($"有邀约记录,有{item.ActualAppointmentCount}条预约记录,但预约记录的F_InviteId未关联到邀约记录");
  4509 + }
  4510 +
  4511 + if (item.HasAppointment == "是" && item.HasConsume == "否" && item.ActualConsumeCount > 0)
  4512 + {
  4513 + analysisList.Add($"有预约记录,有{item.ActualConsumeCount}条消耗记录,但消耗记录的F_AppointmentId未关联到预约记录");
  4514 + }
  4515 +
  4516 + if (item.HasAppointment == "是" && item.HasBilling == "否" && item.ActualBillingCount > 0)
  4517 + {
  4518 + analysisList.Add($"有预约记录,有{item.ActualBillingCount}条开单记录,但开单记录的F_AppointmentId未关联到预约记录");
  4519 + }
  4520 +
  4521 + if (analysisList.Count == 0)
  4522 + {
  4523 + item.Analysis = "数据正常,符合业务链路:拓客 -> 邀约 -> 预约 -> 开单/消耗";
  4524 + }
  4525 + else
  4526 + {
  4527 + item.Analysis = string.Join(";", analysisList);
  4528 + }
  4529 + }
  4530 +
  4531 + return new
  4532 + {
  4533 + list = result,
  4534 + pagination = new
  4535 + {
  4536 + pageIndex = input.PageIndex,
  4537 + pageSize = input.PageSize,
  4538 + total = totalCount
  4539 + }
  4540 + };
  4541 + }
  4542 + catch (Exception ex)
  4543 + {
  4544 + _logger.LogError(ex, "获取线索池客户统计报表失败");
  4545 + throw NCCException.Oh($"获取线索池客户统计报表失败:{ex.Message}");
  4546 + }
  4547 + }
  4548 + #endregion
  4549 +
4253 4550 #region 门店统计报表
4254 4551 /// <summary>
4255 4552 /// 获取门店统计报表
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs
... ... @@ -24,6 +24,7 @@ using NCC.Extend.Entitys.lq_kd_pxmx;
24 24 using NCC.Extend.Entitys.lq_khxx;
25 25 using NCC.Extend.Entitys.lq_mdxx;
26 26 using NCC.Extend.Entitys.lq_tkjlb;
  27 +using NCC.Extend.Entitys.lq_xmzl;
27 28 using NCC.Extend.Interfaces.LqTkjlb;
28 29 using NCC.FriendlyException;
29 30 using NCC.JsonSerialization;
... ... @@ -246,6 +247,7 @@ namespace NCC.Extend.LqTkjlb
246 247 ActualPrice = 0,
247 248 IsEffective = StatusEnum.有效.GetHashCode(),
248 249 CreateTIme = DateTime.Now,
  250 + ItemCategory = await _db.Queryable<LqXmzlEntity>().Where(x => x.Id == "61").Select(x => x.Qt2).FirstAsync(),
249 251 };
250 252 var pxmxResult = await _db.Insertable(pxmxentity).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync();
251 253 if (!(pxmxResult > 0))
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqXhHyhkService.cs
... ... @@ -970,6 +970,8 @@ namespace NCC.Extend.LqXhHyhk
970 970 IsEffective = StatusEnum.有效.GetHashCode(),
971 971 ItemCategory = lqXhPxmxEntity.ItemCategory,
972 972 ItemId = lqXhPxmxEntity.Px,
  973 + StoreId = entity.Md,
  974 + ItemName = lqXhPxmxEntity.Pxmc
973 975 }
974 976 );
975 977 }
... ... @@ -1007,6 +1009,8 @@ namespace NCC.Extend.LqXhHyhk
1007 1009 IsEffective = StatusEnum.有效.GetHashCode(),
1008 1010 ItemCategory = lqXhPxmxEntity.ItemCategory,
1009 1011 ItemId = lqXhPxmxEntity.Px,
  1012 + StoreId = entity.Md,
  1013 + ItemName = lqXhPxmxEntity.Pxmc
1010 1014 }
1011 1015 );
1012 1016 }
... ... @@ -1341,6 +1345,8 @@ namespace NCC.Extend.LqXhHyhk
1341 1345 AccompaniedProjectNumber = ijks_tem.accompaniedProjectNumber,
1342 1346 ItemCategory = lqXhPxmxEntity.ItemCategory,
1343 1347 ItemId = lqXhPxmxEntity.Px,
  1348 + StoreId = entity.Md,
  1349 + ItemName = lqXhPxmxEntity.Pxmc
1344 1350 }
1345 1351 );
1346 1352 }
... ... @@ -1377,6 +1383,8 @@ namespace NCC.Extend.LqXhHyhk
1377 1383 IsEffective = StatusEnum.有效.GetHashCode(),
1378 1384 ItemCategory = lqXhPxmxEntity.ItemCategory,
1379 1385 ItemId = lqXhPxmxEntity.Px,
  1386 + StoreId = entity.Md,
  1387 + ItemName = lqXhPxmxEntity.Pxmc
1380 1388 });
1381 1389 }
1382 1390 }
... ...
sql/删除业绩表部门字段.sql 0 → 100644
  1 +-- 删除6个业绩表的部门字段
  2 +-- 注意:如果字段不存在,执行时会报错,可以忽略该错误继续执行
  3 +
  4 +-- 1. 开单健康师业绩表
  5 +ALTER TABLE lq_kd_jksyj DROP COLUMN F_DepartmentId;
  6 +
  7 +-- 2. 开单科技老师业绩表
  8 +ALTER TABLE lq_kd_kjbsyj DROP COLUMN F_DepartmentId;
  9 +
  10 +-- 3. 消耗健康师业绩表
  11 +ALTER TABLE lq_xh_jksyj DROP COLUMN F_DepartmentId;
  12 +
  13 +-- 4. 消耗科技老师业绩表
  14 +ALTER TABLE lq_xh_kjbsyj DROP COLUMN F_DepartmentId;
  15 +
  16 +-- 5. 退卡健康师业绩表
  17 +ALTER TABLE lq_hytk_jksyj DROP COLUMN F_DepartmentId;
  18 +
  19 +-- 6. 退卡科技老师业绩表
  20 +ALTER TABLE lq_hytk_kjbsyj DROP COLUMN F_DepartmentId;
  21 +
... ...
sql/同步业绩表品项名称字段.sql 0 → 100644
  1 +-- 同步6个业绩表的品项名称字段
  2 +-- 通过关联的品项明细表获取品项名称(pxmc字段)
  3 +
  4 +-- 1. 开单健康师业绩表:从开单品项明细表(lq_kd_pxmx)同步
  5 +UPDATE lq_kd_jksyj kd
  6 +INNER JOIN lq_kd_pxmx px ON px.F_Id = kd.F_kdpxid
  7 +SET kd.F_ItemName = px.pxmc
  8 +WHERE kd.F_kdpxid IS NOT NULL
  9 + AND px.pxmc IS NOT NULL
  10 + AND px.pxmc != '';
  11 +
  12 +-- 2. 开单科技老师业绩表:从开单品项明细表(lq_kd_pxmx)同步
  13 +UPDATE lq_kd_kjbsyj kd
  14 +INNER JOIN lq_kd_pxmx px ON px.F_Id = kd.F_kdpxid
  15 +SET kd.F_ItemName = px.pxmc
  16 +WHERE kd.F_kdpxid IS NOT NULL
  17 + AND px.pxmc IS NOT NULL
  18 + AND px.pxmc != '';
  19 +
  20 +-- 3. 消耗健康师业绩表:从耗卡品项明细表(lq_xh_pxmx)同步
  21 +UPDATE lq_xh_jksyj xh
  22 +INNER JOIN lq_xh_pxmx px ON px.F_Id = xh.F_kdpxid
  23 +SET xh.F_ItemName = px.pxmc
  24 +WHERE xh.F_kdpxid IS NOT NULL
  25 + AND px.pxmc IS NOT NULL
  26 + AND px.pxmc != '';
  27 +
  28 +-- 4. 消耗科技老师业绩表:从耗卡品项明细表(lq_xh_pxmx)同步
  29 +UPDATE lq_xh_kjbsyj xh
  30 +INNER JOIN lq_xh_pxmx px ON px.F_Id = xh.F_hkpxid
  31 +SET xh.F_ItemName = px.pxmc
  32 +WHERE xh.F_hkpxid IS NOT NULL
  33 + AND px.pxmc IS NOT NULL
  34 + AND px.pxmc != '';
  35 +
  36 +-- 5. 退卡健康师业绩表:从退卡品项明细表(lq_hytk_mx)同步
  37 +UPDATE lq_hytk_jksyj tk
  38 +INNER JOIN lq_hytk_mx mx ON mx.F_Id = tk.F_CardReturn
  39 +SET tk.F_ItemName = mx.pxmc
  40 +WHERE tk.F_CardReturn IS NOT NULL
  41 + AND mx.pxmc IS NOT NULL
  42 + AND mx.pxmc != '';
  43 +
  44 +-- 6. 退卡科技老师业绩表:从退卡品项明细表(lq_hytk_mx)同步
  45 +UPDATE lq_hytk_kjbsyj tk
  46 +INNER JOIN lq_hytk_mx mx ON mx.F_Id = tk.F_CardReturn
  47 +SET tk.F_ItemName = mx.pxmc
  48 +WHERE tk.F_CardReturn IS NOT NULL
  49 + AND mx.pxmc IS NOT NULL
  50 + AND mx.pxmc != '';
  51 +
... ...
sql/同步业绩表门店ID字段.sql 0 → 100644
  1 +-- 同步6个业绩表的门店ID字段
  2 +-- 开单和消耗业绩表:通过开单编号(glkdbh)关联开单记录表(lq_kd_kdjlb),获取门店ID(djmd)
  3 +-- 退卡业绩表:通过退卡编号(gltkbh)关联退卡表(lq_hytk_hytk),获取门店ID(md)
  4 +
  5 +-- 给业绩表的关联字段加索引
  6 +-- 注意:如果索引已存在会报错,可以忽略该错误继续执行后续UPDATE语句
  7 +-- 开单健康师业绩表
  8 +CREATE INDEX idx_kd_jksyj_glkdbh ON lq_kd_jksyj(glkdbh);
  9 +-- 开单科技老师业绩表
  10 +CREATE INDEX idx_kd_kjbsyj_glkdbh ON lq_kd_kjbsyj(glkdbh);
  11 +-- 消耗健康师业绩表
  12 +CREATE INDEX idx_xh_jksyj_glkdbh ON lq_xh_jksyj(glkdbh);
  13 +-- 消耗科技老师业绩表
  14 +CREATE INDEX idx_xh_kjbsyj_glkdbh ON lq_xh_kjbsyj(glkdbh);
  15 +-- 退卡健康师业绩表
  16 +CREATE INDEX idx_hytk_jksyj_gltkbh ON lq_hytk_jksyj(gltkbh);
  17 +-- 退卡科技老师业绩表
  18 +CREATE INDEX idx_hytk_kjbsyj_gltkbh ON lq_hytk_kjbsyj(gltkbh);
  19 +
  20 +-- 1. 开单健康师业绩表:通过glkdbh关联开单记录表获取门店ID
  21 +UPDATE lq_kd_jksyj yj
  22 +INNER JOIN lq_kd_kdjlb kd ON yj.glkdbh = kd.F_Id
  23 +SET yj.F_StoreId = kd.djmd
  24 +WHERE yj.glkdbh IS NOT NULL
  25 + AND yj.glkdbh != ''
  26 + AND kd.djmd IS NOT NULL
  27 + AND kd.djmd != '';
  28 +
  29 +-- 2. 开单科技老师业绩表:通过glkdbh关联开单记录表获取门店ID
  30 +UPDATE lq_kd_kjbsyj yj
  31 +INNER JOIN lq_kd_kdjlb kd ON yj.glkdbh = kd.F_Id
  32 +SET yj.F_StoreId = kd.djmd
  33 +WHERE yj.glkdbh IS NOT NULL
  34 + AND yj.glkdbh != ''
  35 + AND kd.djmd IS NOT NULL
  36 + AND kd.djmd != '';
  37 +
  38 +-- 3. 消耗健康师业绩表:通过glkdbh关联开单记录表获取门店ID
  39 +UPDATE lq_xh_jksyj yj
  40 +INNER JOIN lq_kd_kdjlb kd ON yj.glkdbh = kd.F_Id
  41 +SET yj.F_StoreId = kd.djmd
  42 +WHERE yj.glkdbh IS NOT NULL
  43 + AND yj.glkdbh != ''
  44 + AND kd.djmd IS NOT NULL
  45 + AND kd.djmd != '';
  46 +
  47 +-- 4. 消耗科技老师业绩表:通过glkdbh关联开单记录表获取门店ID
  48 +UPDATE lq_xh_kjbsyj yj
  49 +INNER JOIN lq_kd_kdjlb kd ON yj.glkdbh = kd.F_Id
  50 +SET yj.F_StoreId = kd.djmd
  51 +WHERE yj.glkdbh IS NOT NULL
  52 + AND yj.glkdbh != ''
  53 + AND kd.djmd IS NOT NULL
  54 + AND kd.djmd != '';
  55 +
  56 +-- 5. 退卡健康师业绩表:通过gltkbh关联退卡表获取门店ID
  57 +UPDATE lq_hytk_jksyj yj
  58 +INNER JOIN lq_hytk_hytk tk ON yj.gltkbh = tk.F_Id
  59 +SET yj.F_StoreId = tk.md
  60 +WHERE yj.gltkbh IS NOT NULL
  61 + AND yj.gltkbh != ''
  62 + AND tk.md IS NOT NULL
  63 + AND tk.md != '';
  64 +
  65 +-- 6. 退卡科技老师业绩表:通过gltkbh关联退卡表获取门店ID
  66 +UPDATE lq_hytk_kjbsyj yj
  67 +INNER JOIN lq_hytk_hytk tk ON yj.gltkbh = tk.F_Id
  68 +SET yj.F_StoreId = tk.md
  69 +WHERE yj.gltkbh IS NOT NULL
  70 + AND yj.gltkbh != ''
  71 + AND tk.md IS NOT NULL
  72 + AND tk.md != '';
  73 +
... ...
sql/添加业绩表品项名称字段.sql 0 → 100644
  1 +-- 为6个业绩表添加品项名称字段
  2 +-- 品项名称字段存储品项名称(从品项明细表的pxmc字段获取)
  3 +
  4 +-- 1. 开单健康师业绩表
  5 +ALTER TABLE lq_kd_jksyj ADD COLUMN F_ItemName VARCHAR(200) NULL COMMENT '品项名称' AFTER F_ItemId;
  6 +
  7 +-- 2. 开单科技老师业绩表
  8 +ALTER TABLE lq_kd_kjbsyj ADD COLUMN F_ItemName VARCHAR(200) NULL COMMENT '品项名称' AFTER F_ItemId;
  9 +
  10 +-- 3. 消耗健康师业绩表
  11 +ALTER TABLE lq_xh_jksyj ADD COLUMN F_ItemName VARCHAR(200) NULL COMMENT '品项名称' AFTER F_ItemId;
  12 +
  13 +-- 4. 消耗科技老师业绩表
  14 +ALTER TABLE lq_xh_kjbsyj ADD COLUMN F_ItemName VARCHAR(200) NULL COMMENT '品项名称' AFTER F_ItemId;
  15 +
  16 +-- 5. 退卡健康师业绩表
  17 +ALTER TABLE lq_hytk_jksyj ADD COLUMN F_ItemName VARCHAR(200) NULL COMMENT '品项名称' AFTER F_ItemId;
  18 +
  19 +-- 6. 退卡科技老师业绩表
  20 +ALTER TABLE lq_hytk_kjbsyj ADD COLUMN F_ItemName VARCHAR(200) NULL COMMENT '品项名称' AFTER F_ItemId;
  21 +
... ...
sql/添加业绩表门店ID字段.sql 0 → 100644
  1 +-- 为6个业绩表添加门店ID字段
  2 +-- 门店ID字段存储门店ID(从BASE_USER.F_MDID获取,对应lq_mdxx.F_Id)
  3 +
  4 +-- 1. 开单健康师业绩表
  5 +ALTER TABLE lq_kd_jksyj ADD COLUMN F_StoreId VARCHAR(50) NULL COMMENT '门店ID' AFTER F_ItemId;
  6 +
  7 +-- 2. 开单科技老师业绩表
  8 +ALTER TABLE lq_kd_kjbsyj ADD COLUMN F_StoreId VARCHAR(50) NULL COMMENT '门店ID' AFTER F_ItemId;
  9 +
  10 +-- 3. 消耗健康师业绩表
  11 +ALTER TABLE lq_xh_jksyj ADD COLUMN F_StoreId VARCHAR(50) NULL COMMENT '门店ID' AFTER F_ItemId;
  12 +
  13 +-- 4. 消耗科技老师业绩表
  14 +ALTER TABLE lq_xh_kjbsyj ADD COLUMN F_StoreId VARCHAR(50) NULL COMMENT '门店ID' AFTER F_ItemId;
  15 +
  16 +-- 5. 退卡健康师业绩表
  17 +ALTER TABLE lq_hytk_jksyj ADD COLUMN F_StoreId VARCHAR(50) NULL COMMENT '门店ID' AFTER F_ItemId;
  18 +
  19 +-- 6. 退卡科技老师业绩表
  20 +ALTER TABLE lq_hytk_kjbsyj ADD COLUMN F_StoreId VARCHAR(50) NULL COMMENT '门店ID' AFTER F_ItemId;
  21 +
... ...