Commit 7e362a148954e38c500ac53042b64d3eaf5a1e13
1 parent
8514f465
feat: 为业绩表添加门店ID和品项名称字段
- 删除业绩表的部门字段(F_DepartmentId) - 为6个业绩表添加门店ID字段(F_StoreId) - 为6个业绩表添加品项名称字段(F_ItemName) - 创建SQL脚本同步门店ID和品项名称数据 - 更新6个业绩表的Entity类,添加StoreId和ItemName属性 - 优化同步SQL性能,添加索引提升查询效率
Showing
18 changed files
with
848 additions
and
45 deletions
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 | + | ... | ... |