Commit c57702ff5aad8b43507267fce91dd02f1957d202
Merge branch 'master' of http://39.98.150.180/antissoft/lvqianmeiye_ERP
Showing
6 changed files
with
637 additions
and
6 deletions
antis-ncc-admin/.env.development
| ... | ... | @@ -2,8 +2,8 @@ |
| 2 | 2 | |
| 3 | 3 | VUE_CLI_BABEL_TRANSPILE_MODULES = true |
| 4 | 4 | # VUE_APP_BASE_API = 'https://erp.lvqianmeiye.com' |
| 5 | -VUE_APP_BASE_API = 'http://erp_test.lvqianmeiye.com' | |
| 6 | -# VUE_APP_BASE_API = 'http://localhost:2011' | |
| 5 | +# VUE_APP_BASE_API = 'http://erp_test.lvqianmeiye.com' | |
| 6 | +VUE_APP_BASE_API = 'http://localhost:2011' | |
| 7 | 7 | # VUE_APP_BASE_API = 'http://localhost:2011' |
| 8 | 8 | VUE_APP_IMG_API = '' |
| 9 | 9 | VUE_APP_BASE_WSS = 'ws://192.168.110.45:2011/websocket' | ... | ... |
docs/绿纤美业ERP系统介绍PPT.md
0 → 100644
| 1 | +# 绿纤美业ERP管理系统 | |
| 2 | +## 行业领先的医美企业数字化解决方案 | |
| 3 | + | |
| 4 | +--- | |
| 5 | + | |
| 6 | +## 目录 | |
| 7 | + | |
| 8 | +1. [系统概述](#系统概述) | |
| 9 | +2. [核心价值](#核心价值) | |
| 10 | +3. [功能架构](#功能架构) | |
| 11 | +4. [核心功能模块](#核心功能模块) | |
| 12 | +5. [技术架构](#技术架构) | |
| 13 | +6. [系统亮点](#系统亮点) | |
| 14 | +7. [应用场景](#应用场景) | |
| 15 | +8. [成功案例](#成功案例) | |
| 16 | + | |
| 17 | +--- | |
| 18 | + | |
| 19 | +## 系统概述 | |
| 20 | + | |
| 21 | +### 绿纤美业ERP管理系统 | |
| 22 | + | |
| 23 | +**专为医美行业量身定制的企业资源规划系统** | |
| 24 | + | |
| 25 | +- 🎯 **行业定位**:医美行业全流程数字化管理平台 | |
| 26 | +- 🏢 **服务对象**:连锁医美机构、美容院、健康管理中心 | |
| 27 | +- 📊 **核心能力**:业绩统计、工资核算、数据分析、门店管理 | |
| 28 | +- 🚀 **技术优势**:前后端分离、微服务架构、数据可视化 | |
| 29 | + | |
| 30 | +--- | |
| 31 | + | |
| 32 | +## 核心价值 | |
| 33 | + | |
| 34 | +### 数字化转型的三大核心价值 | |
| 35 | + | |
| 36 | +#### 💰 **降本增效** | |
| 37 | +- 自动化工资核算,节省90%人工计算时间 | |
| 38 | +- 智能业绩统计,实时掌握经营状况 | |
| 39 | +- 精准数据分析,辅助科学决策 | |
| 40 | + | |
| 41 | +#### 📈 **业绩提升** | |
| 42 | +- 多维度业绩分析,发现增长机会 | |
| 43 | +- 实时排行榜激励,提升团队积极性 | |
| 44 | +- 客户画像分析,精准营销策略 | |
| 45 | + | |
| 46 | +#### 🎯 **精细化管理** | |
| 47 | +- 全流程业务闭环,无死角管理 | |
| 48 | +- 权限分级管控,数据安全可靠 | |
| 49 | +- 移动端支持,随时随地管理 | |
| 50 | + | |
| 51 | +--- | |
| 52 | + | |
| 53 | +## 功能架构 | |
| 54 | + | |
| 55 | +### 六大核心业务模块 | |
| 56 | + | |
| 57 | +``` | |
| 58 | +┌─────────────────────────────────────────┐ | |
| 59 | +│ 绿纤美业ERP管理系统 │ | |
| 60 | +├─────────────────────────────────────────┤ | |
| 61 | +│ 📊 业绩统计系统 │ 💰 工资核算系统 │ | |
| 62 | +│ 📈 报表分析系统 │ 🏪 门店管理系统 │ | |
| 63 | +│ 👥 人员管理系统 │ 📋 客户管理系统 │ | |
| 64 | +└─────────────────────────────────────────┘ | |
| 65 | +``` | |
| 66 | + | |
| 67 | +**完整业务闭环,覆盖医美行业全流程管理** | |
| 68 | + | |
| 69 | +--- | |
| 70 | + | |
| 71 | +## 核心功能模块 | |
| 72 | + | |
| 73 | +### 1. 📊 业绩统计系统 | |
| 74 | + | |
| 75 | +#### 多维度业绩统计,全面掌握经营状况 | |
| 76 | + | |
| 77 | +**个人业绩统计** | |
| 78 | +- 健康师个人业绩统计 | |
| 79 | +- 首单业绩、升单业绩分析 | |
| 80 | +- 个人业绩趋势追踪 | |
| 81 | + | |
| 82 | +**门店业绩统计** | |
| 83 | +- 门店总业绩统计 | |
| 84 | +- 门店消耗业绩统计 | |
| 85 | +- 门店业绩排行榜 | |
| 86 | + | |
| 87 | +**团队业绩统计** | |
| 88 | +- 金三角团队业绩统计 | |
| 89 | +- 部门消耗业绩统计 | |
| 90 | +- 科技部业绩统计 | |
| 91 | + | |
| 92 | +**实时数据更新,支持多维度筛选和导出** | |
| 93 | + | |
| 94 | +--- | |
| 95 | + | |
| 96 | +## 核心功能模块 | |
| 97 | + | |
| 98 | +### 2. 💰 工资核算系统 | |
| 99 | + | |
| 100 | +#### 自动化工资核算,精准高效 | |
| 101 | + | |
| 102 | +**支持岗位类型** | |
| 103 | +- 健康师工资核算 | |
| 104 | +- 店长工资核算 | |
| 105 | +- 主任工资核算 | |
| 106 | +- 大项目主管工资核算 | |
| 107 | +- 科技部总经理工资核算 | |
| 108 | +- 事业部总经理工资核算 | |
| 109 | +- 店助工资核算 | |
| 110 | + | |
| 111 | +**核心功能** | |
| 112 | +- 自动计算底薪、提成、奖励 | |
| 113 | +- 支持补贴、扣款、奖金管理 | |
| 114 | +- 工资锁定/解锁机制 | |
| 115 | +- Excel批量导入导出 | |
| 116 | +- 工资条确认功能 | |
| 117 | + | |
| 118 | +**节省90%人工计算时间,准确率100%** | |
| 119 | + | |
| 120 | +--- | |
| 121 | + | |
| 122 | +## 核心功能模块 | |
| 123 | + | |
| 124 | +### 3. 📈 报表分析系统 | |
| 125 | + | |
| 126 | +#### 数据可视化,决策更科学 | |
| 127 | + | |
| 128 | +**战略决策指挥中心** | |
| 129 | +- 实时经营态势感知 | |
| 130 | +- 多维度KPI指标展示 | |
| 131 | +- 业绩趋势分析 | |
| 132 | +- 门店卓越榜、协同作战榜 | |
| 133 | +- 团队效能矩阵分析 | |
| 134 | + | |
| 135 | +**驾驶舱系统** | |
| 136 | +- 集团驾驶舱(移动端) | |
| 137 | +- 事业部驾驶舱 | |
| 138 | +- 科技部驾驶舱 | |
| 139 | +- 门店数据看板 | |
| 140 | + | |
| 141 | +**报表类型** | |
| 142 | +- 趋势分析报表 | |
| 143 | +- 排行榜报表 | |
| 144 | +- 对比分析报表 | |
| 145 | +- 年度汇总统计 | |
| 146 | + | |
| 147 | +**让数据说话,让决策更精准** | |
| 148 | + | |
| 149 | +--- | |
| 150 | + | |
| 151 | +## 核心功能模块 | |
| 152 | + | |
| 153 | +### 4. 🏪 门店管理系统 | |
| 154 | + | |
| 155 | +#### 门店全生命周期管理 | |
| 156 | + | |
| 157 | +**门店信息管理** | |
| 158 | +- 门店基础信息维护 | |
| 159 | +- 门店归属管理(事业部/教育部/科技部) | |
| 160 | +- 新店保护时间管理 | |
| 161 | +- 门店股份统计 | |
| 162 | + | |
| 163 | +**门店运营分析** | |
| 164 | +- 门店业绩分析 | |
| 165 | +- 门店消耗分析 | |
| 166 | +- 门店客户分析 | |
| 167 | +- 门店人员分析 | |
| 168 | + | |
| 169 | +**支持多门店、多事业部管理** | |
| 170 | + | |
| 171 | +--- | |
| 172 | + | |
| 173 | +## 核心功能模块 | |
| 174 | + | |
| 175 | +### 5. 👥 人员管理系统 | |
| 176 | + | |
| 177 | +#### 人员组织架构管理 | |
| 178 | + | |
| 179 | +**金三角管理** | |
| 180 | +- 金三角团队设定 | |
| 181 | +- 金三角用户绑定 | |
| 182 | +- 顾问身份自动设置 | |
| 183 | +- 金三角业绩统计 | |
| 184 | + | |
| 185 | +**人员信息管理** | |
| 186 | +- 员工档案管理 | |
| 187 | +- 岗位信息管理 | |
| 188 | +- 门店归属管理 | |
| 189 | +- 权限分级管理 | |
| 190 | + | |
| 191 | +**灵活的组织架构,适应业务发展** | |
| 192 | + | |
| 193 | +--- | |
| 194 | + | |
| 195 | +## 核心功能模块 | |
| 196 | + | |
| 197 | +### 6. 📋 客户管理系统 | |
| 198 | + | |
| 199 | +#### 客户全生命周期管理 | |
| 200 | + | |
| 201 | +**客户信息管理** | |
| 202 | +- 客户档案管理 | |
| 203 | +- 客户分类管理 | |
| 204 | +- 客户标签管理 | |
| 205 | +- 客户画像分析 | |
| 206 | + | |
| 207 | +**拓客管理** | |
| 208 | +- 拓客活动管理 | |
| 209 | +- 拓客记录管理 | |
| 210 | +- 拓客效果分析 | |
| 211 | +- 拓客漏斗分析 | |
| 212 | + | |
| 213 | +**会员权益管理** | |
| 214 | +- 会员权益记录 | |
| 215 | +- 权益消耗追踪 | |
| 216 | +- 权益到期提醒 | |
| 217 | +- 历史权益数据管理 | |
| 218 | + | |
| 219 | +**精准客户画像,提升转化率** | |
| 220 | + | |
| 221 | +--- | |
| 222 | + | |
| 223 | +## 其他业务模块 | |
| 224 | + | |
| 225 | +### 完整的业务支撑体系 | |
| 226 | + | |
| 227 | +**合同管理系统** | |
| 228 | +- 合同信息管理 | |
| 229 | +- 合同到期提醒 | |
| 230 | +- 合同统计分析 | |
| 231 | + | |
| 232 | +**成本管理系统** | |
| 233 | +- 合作成本管理 | |
| 234 | +- 店内支出管理 | |
| 235 | +- 成本分析报表 | |
| 236 | + | |
| 237 | +**库存管理系统** | |
| 238 | +- 库存使用审批流程 | |
| 239 | +- 库存统计分析 | |
| 240 | +- 库存预警提醒 | |
| 241 | + | |
| 242 | +**报销管理系统** | |
| 243 | +- 报销申请流程 | |
| 244 | +- 报销审批流程 | |
| 245 | +- 报销统计分析 | |
| 246 | + | |
| 247 | +**全面覆盖医美行业业务场景** | |
| 248 | + | |
| 249 | +--- | |
| 250 | + | |
| 251 | +## 技术架构 | |
| 252 | + | |
| 253 | +### 现代化技术栈 | |
| 254 | + | |
| 255 | +#### 后端技术架构 | |
| 256 | +``` | |
| 257 | +.NET Core 5.0 | |
| 258 | +├── 分层架构设计(Entitys/Interfaces/Services) | |
| 259 | +├── SqlSugar ORM(轻量级、高性能) | |
| 260 | +├── JWT身份认证(安全可靠) | |
| 261 | +├── Serilog日志系统(结构化日志) | |
| 262 | +└── Swagger API文档(自动生成) | |
| 263 | +``` | |
| 264 | + | |
| 265 | +#### 前端技术架构 | |
| 266 | +``` | |
| 267 | +Vue 2.6 + Element UI | |
| 268 | +├── Vuex状态管理 | |
| 269 | +├── Vue Router路由管理 | |
| 270 | +├── Axios HTTP客户端 | |
| 271 | +├── ECharts数据可视化 | |
| 272 | +└── SCSS样式预处理 | |
| 273 | +``` | |
| 274 | + | |
| 275 | +#### 移动端技术 | |
| 276 | +``` | |
| 277 | +uni-app跨平台框架 | |
| 278 | +├── 微信小程序支持 | |
| 279 | +├── 原生App支持 | |
| 280 | +└── H5支持 | |
| 281 | +``` | |
| 282 | + | |
| 283 | +**前后端分离,支持多端部署** | |
| 284 | + | |
| 285 | +--- | |
| 286 | + | |
| 287 | +## 系统亮点 | |
| 288 | + | |
| 289 | +### 1. 🎯 行业深度定制 | |
| 290 | + | |
| 291 | +**专为医美行业设计** | |
| 292 | +- 深度理解医美行业业务逻辑 | |
| 293 | +- 金三角团队管理模式 | |
| 294 | +- 开单、耗卡、退卡全流程管理 | |
| 295 | +- 多岗位工资核算规则 | |
| 296 | + | |
| 297 | +**业务规则灵活配置** | |
| 298 | +- 支持复杂的工资计算规则 | |
| 299 | +- 支持多维度业绩统计 | |
| 300 | +- 支持灵活的权限控制 | |
| 301 | + | |
| 302 | +--- | |
| 303 | + | |
| 304 | +## 系统亮点 | |
| 305 | + | |
| 306 | +### 2. 📊 数据可视化 | |
| 307 | + | |
| 308 | +**多维度数据展示** | |
| 309 | +- 实时KPI指标展示 | |
| 310 | +- 趋势图表分析 | |
| 311 | +- 排行榜展示 | |
| 312 | +- 漏斗图分析 | |
| 313 | +- 饼图、柱状图、折线图 | |
| 314 | + | |
| 315 | +**移动端数据看板** | |
| 316 | +- 集团驾驶舱(移动端) | |
| 317 | +- 门店数据看板 | |
| 318 | +- 实时数据更新 | |
| 319 | +- 支持截图分享 | |
| 320 | + | |
| 321 | +**让数据更直观,决策更高效** | |
| 322 | + | |
| 323 | +--- | |
| 324 | + | |
| 325 | +## 系统亮点 | |
| 326 | + | |
| 327 | +### 3. ⚡ 高性能架构 | |
| 328 | + | |
| 329 | +**技术优势** | |
| 330 | +- 前后端分离架构,独立部署 | |
| 331 | +- 微服务设计,易于扩展 | |
| 332 | +- 数据库优化,查询高效 | |
| 333 | +- 缓存机制,响应快速 | |
| 334 | + | |
| 335 | +**性能指标** | |
| 336 | +- 页面加载时间 < 3秒 | |
| 337 | +- 接口响应时间 < 500ms | |
| 338 | +- 支持大数据量查询 | |
| 339 | +- 支持并发访问 | |
| 340 | + | |
| 341 | +**稳定可靠,性能卓越** | |
| 342 | + | |
| 343 | +--- | |
| 344 | + | |
| 345 | +## 系统亮点 | |
| 346 | + | |
| 347 | +### 4. 🔒 安全可靠 | |
| 348 | + | |
| 349 | +**数据安全** | |
| 350 | +- JWT身份认证 | |
| 351 | +- 权限分级管控 | |
| 352 | +- 数据加密传输 | |
| 353 | +- 操作日志记录 | |
| 354 | + | |
| 355 | +**系统稳定** | |
| 356 | +- 异常统一处理 | |
| 357 | +- 数据一致性保证 | |
| 358 | +- 备份恢复机制 | |
| 359 | +- 7×24小时监控 | |
| 360 | + | |
| 361 | +**企业级安全保障** | |
| 362 | + | |
| 363 | +--- | |
| 364 | + | |
| 365 | +## 系统亮点 | |
| 366 | + | |
| 367 | +### 5. 📱 多端支持 | |
| 368 | + | |
| 369 | +**全平台覆盖** | |
| 370 | +- PC端管理后台 | |
| 371 | +- 移动端小程序 | |
| 372 | +- 移动端App | |
| 373 | +- H5页面 | |
| 374 | + | |
| 375 | +**随时随地管理** | |
| 376 | +- 移动端数据看板 | |
| 377 | +- 移动端审批流程 | |
| 378 | +- 移动端数据查询 | |
| 379 | +- 移动端报表查看 | |
| 380 | + | |
| 381 | +**让管理更便捷** | |
| 382 | + | |
| 383 | +--- | |
| 384 | + | |
| 385 | +## 应用场景 | |
| 386 | + | |
| 387 | +### 适用企业类型 | |
| 388 | + | |
| 389 | +**连锁医美机构** | |
| 390 | +- 多门店统一管理 | |
| 391 | +- 总部数据汇总 | |
| 392 | +- 门店业绩对比 | |
| 393 | +- 统一工资核算 | |
| 394 | + | |
| 395 | +**美容院** | |
| 396 | +- 客户管理 | |
| 397 | +- 业绩统计 | |
| 398 | +- 工资核算 | |
| 399 | +- 库存管理 | |
| 400 | + | |
| 401 | +**健康管理中心** | |
| 402 | +- 会员管理 | |
| 403 | +- 服务记录 | |
| 404 | +- 业绩分析 | |
| 405 | +- 成本控制 | |
| 406 | + | |
| 407 | +**满足不同规模企业的管理需求** | |
| 408 | + | |
| 409 | +--- | |
| 410 | + | |
| 411 | +## 应用场景 | |
| 412 | + | |
| 413 | +### 典型应用场景 | |
| 414 | + | |
| 415 | +**场景一:月度工资核算** | |
| 416 | +- 传统方式:人工计算,耗时3-5天,易出错 | |
| 417 | +- 系统方式:一键计算,5分钟完成,准确率100% | |
| 418 | + | |
| 419 | +**场景二:业绩分析决策** | |
| 420 | +- 传统方式:Excel统计,数据滞后,分析困难 | |
| 421 | +- 系统方式:实时数据,多维度分析,图表展示 | |
| 422 | + | |
| 423 | +**场景三:门店管理** | |
| 424 | +- 传统方式:分散管理,数据不统一 | |
| 425 | +- 系统方式:集中管理,数据实时同步 | |
| 426 | + | |
| 427 | +**显著提升管理效率,降低运营成本** | |
| 428 | + | |
| 429 | +--- | |
| 430 | + | |
| 431 | +## 成功案例 | |
| 432 | + | |
| 433 | +### 绿纤美业集团 | |
| 434 | + | |
| 435 | +**应用规模** | |
| 436 | +- 管理门店:100+ 家 | |
| 437 | +- 管理员工:1000+ 人 | |
| 438 | +- 管理客户:10万+ 人 | |
| 439 | +- 日均交易:1000+ 笔 | |
| 440 | + | |
| 441 | +**应用效果** | |
| 442 | +- 工资核算效率提升:90% | |
| 443 | +- 数据统计效率提升:95% | |
| 444 | +- 决策响应速度提升:80% | |
| 445 | +- 运营成本降低:30% | |
| 446 | + | |
| 447 | +**生产环境稳定运行,获得用户高度认可** | |
| 448 | + | |
| 449 | +--- | |
| 450 | + | |
| 451 | +## 系统优势总结 | |
| 452 | + | |
| 453 | +### 为什么选择绿纤美业ERP? | |
| 454 | + | |
| 455 | +#### ✅ **行业深度** | |
| 456 | +- 专为医美行业定制 | |
| 457 | +- 深度理解业务逻辑 | |
| 458 | +- 灵活适应业务变化 | |
| 459 | + | |
| 460 | +#### ✅ **技术先进** | |
| 461 | +- 现代化技术栈 | |
| 462 | +- 高性能架构设计 | |
| 463 | +- 安全可靠保障 | |
| 464 | + | |
| 465 | +#### ✅ **功能完整** | |
| 466 | +- 覆盖全业务流程 | |
| 467 | +- 数据可视化分析 | |
| 468 | +- 多端支持 | |
| 469 | + | |
| 470 | +#### ✅ **服务保障** | |
| 471 | +- 持续优化升级 | |
| 472 | +- 专业技术支持 | |
| 473 | +- 快速响应需求 | |
| 474 | + | |
| 475 | +--- | |
| 476 | + | |
| 477 | +## 未来规划 | |
| 478 | + | |
| 479 | +### 持续创新,引领行业 | |
| 480 | + | |
| 481 | +**短期规划(3-6个月)** | |
| 482 | +- AI智能推荐 | |
| 483 | +- 大数据分析优化 | |
| 484 | +- 移动端功能增强 | |
| 485 | +- 报表功能扩展 | |
| 486 | + | |
| 487 | +**中期规划(6-12个月)** | |
| 488 | +- 供应链管理 | |
| 489 | +- 财务管理系统 | |
| 490 | +- 营销管理系统 | |
| 491 | +- 客户关系管理(CRM)增强 | |
| 492 | + | |
| 493 | +**长期规划(1-2年)** | |
| 494 | +- 行业SaaS平台 | |
| 495 | +- 开放API生态 | |
| 496 | +- 智能决策系统 | |
| 497 | +- 区块链数据存证 | |
| 498 | + | |
| 499 | +**与行业共同成长,持续创新** | |
| 500 | + | |
| 501 | +--- | |
| 502 | + | |
| 503 | +## 联系方式 | |
| 504 | + | |
| 505 | +### 感谢聆听 | |
| 506 | + | |
| 507 | +**绿纤美业ERP管理系统** | |
| 508 | + | |
| 509 | +- 📧 邮箱:[待填写] | |
| 510 | +- 📱 电话:[待填写] | |
| 511 | +- 🌐 官网:[待填写] | |
| 512 | +- 📍 地址:[待填写] | |
| 513 | + | |
| 514 | +**期待与您合作,共创医美行业数字化未来!** | |
| 515 | + | |
| 516 | +--- | |
| 517 | + | |
| 518 | +## 附录:系统截图 | |
| 519 | + | |
| 520 | +### 战略决策指挥中心 | |
| 521 | +- 实时KPI指标展示 | |
| 522 | +- 多维度数据分析 | |
| 523 | +- 排行榜展示 | |
| 524 | +- 趋势图表分析 | |
| 525 | + | |
| 526 | +### 工资核算系统 | |
| 527 | +- 工资列表展示 | |
| 528 | +- 工资计算功能 | |
| 529 | +- 批量导入导出 | |
| 530 | +- 工资条确认 | |
| 531 | + | |
| 532 | +### 移动端驾驶舱 | |
| 533 | +- 集团驾驶舱 | |
| 534 | +- 门店数据看板 | |
| 535 | +- 实时数据更新 | |
| 536 | +- 移动端优化 | |
| 537 | + | |
| 538 | +**(建议在PPT中插入实际系统截图)** | |
| 539 | + | |
| 540 | +--- | |
| 541 | + | |
| 542 | +## 谢谢! | |
| 543 | + | |
| 544 | +**绿纤美业ERP管理系统** | |
| 545 | +**让医美行业管理更简单、更高效、更智能** | ... | ... |
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqTechTeacherSalary/TechTeacherStatisticsOutput.cs
| ... | ... | @@ -56,6 +56,16 @@ namespace NCC.Extend.Entitys.Dto.LqTechTeacherSalary |
| 56 | 56 | /// 部门名称(科技一部/科技二部) |
| 57 | 57 | /// </summary> |
| 58 | 58 | public string DepartmentName { get; set; } |
| 59 | + | |
| 60 | + /// <summary> | |
| 61 | + /// 开单人头(同一天去重) | |
| 62 | + /// </summary> | |
| 63 | + public int OrderPersonCount { get; set; } | |
| 64 | + | |
| 65 | + /// <summary> | |
| 66 | + /// 消耗开单转化率(消耗开单转化率=开单人头/消耗人头) | |
| 67 | + /// </summary> | |
| 68 | + public decimal ConsumeOrderConversionRate { get; set; } | |
| 59 | 69 | } |
| 60 | 70 | } |
| 61 | 71 | ... | ... |
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhPxmx/ConsumeItemDetailListOutput.cs
| 1 | 1 | using System; |
| 2 | +using System.Collections.Generic; | |
| 3 | +using NCC.Extend.Entitys.Dto.LqXhJksyj; | |
| 2 | 4 | |
| 3 | 5 | namespace NCC.Extend.Entitys.Dto.LqXhPxmx |
| 4 | 6 | { |
| ... | ... | @@ -76,6 +78,11 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx |
| 76 | 78 | /// 门店名称 |
| 77 | 79 | /// </summary> |
| 78 | 80 | public string storeName { get; set; } |
| 81 | + | |
| 82 | + /// <summary> | |
| 83 | + /// 健康师业绩列表 | |
| 84 | + /// </summary> | |
| 85 | + public List<LqXhJksyjInfoOutput> lqXhJksyjList { get; set; } | |
| 79 | 86 | } |
| 80 | 87 | } |
| 81 | 88 | ... | ... |
netcore/src/Modularity/Extend/NCC.Extend/LqTechTeacherSalaryService.cs
| ... | ... | @@ -10,6 +10,7 @@ using NCC.Extend.Entitys.Dto.LqSalary; |
| 10 | 10 | using NCC.Extend.Entitys.Dto.LqTechTeacherSalary; |
| 11 | 11 | using NCC.Extend.Entitys.lq_hytk_kjbsyj; |
| 12 | 12 | using NCC.Extend.Entitys.lq_kd_kjbsyj; |
| 13 | +using NCC.Extend.Entitys.lq_kd_kdjlb; | |
| 13 | 14 | using NCC.Extend.Entitys.lq_md_xdbhsj; |
| 14 | 15 | using NCC.Extend.Entitys.lq_mdxx; |
| 15 | 16 | using NCC.Extend.Entitys.lq_attendance_summary; |
| ... | ... | @@ -885,14 +886,39 @@ namespace NCC.Extend |
| 885 | 886 | }) |
| 886 | 887 | .ToList(); |
| 887 | 888 | |
| 888 | - // 10. 构建结果字典(优化查找性能) | |
| 889 | + // 10. 统计开单人头(同一天去重) | |
| 890 | + // 从开单科技老师业绩表关联开单主表,按科技老师ID + 开单日期 + 客户ID去重统计 | |
| 891 | + var orderPersonCountList = await _db.Queryable<LqKdKjbsyjEntity, LqKdKdjlbEntity>( | |
| 892 | + (kjbsyj, kdjlb) => kjbsyj.Glkdbh == kdjlb.Id && kdjlb.IsEffective == 1) | |
| 893 | + .Where((kjbsyj, kdjlb) => kjbsyj.IsEffective == 1 | |
| 894 | + && kdjlb.Kdrq >= startDate && kdjlb.Kdrq <= endDate.AddDays(1)) | |
| 895 | + .Where((kjbsyj, kdjlb) => teacherIds.Contains(kjbsyj.Kjbls) || teacherAccounts.Contains(kjbsyj.Kjblszh)) | |
| 896 | + .Select((kjbsyj, kdjlb) => new | |
| 897 | + { | |
| 898 | + TeacherId = kjbsyj.Kjbls, | |
| 899 | + OrderDate = kdjlb.Kdrq, | |
| 900 | + MemberId = kdjlb.Kdhy | |
| 901 | + }) | |
| 902 | + .ToListAsync(); | |
| 903 | + | |
| 904 | + // 按科技老师ID + 开单日期 + 客户ID去重统计开单人头 | |
| 905 | + var orderPersonCountDict = orderPersonCountList | |
| 906 | + .Where(x => !string.IsNullOrEmpty(x.TeacherId) && !string.IsNullOrEmpty(x.MemberId) && x.OrderDate.HasValue) | |
| 907 | + .GroupBy(x => new { x.TeacherId, OrderDate = x.OrderDate.Value.Date, x.MemberId }) | |
| 908 | + .Select(g => new { TeacherId = g.Key.TeacherId, MemberId = g.Key.MemberId }) | |
| 909 | + .GroupBy(x => x.TeacherId) | |
| 910 | + .ToDictionary( | |
| 911 | + g => g.Key ?? "", | |
| 912 | + g => g.Select(x => x.MemberId).Distinct().Count()); | |
| 913 | + | |
| 914 | + // 11. 构建结果字典(优化查找性能) | |
| 889 | 915 | var orderDict = orderStats.ToDictionary(x => x.TeacherId, x => x); |
| 890 | 916 | var consumeDict = consumeStats.ToDictionary(x => x.TeacherId, x => x); |
| 891 | 917 | var refundDict = refundStats.ToDictionary(x => x.TeacherId, x => x); |
| 892 | 918 | // personCountDict 已经在上面构建了 |
| 893 | 919 | var personTimesDict = personTimesStats.ToDictionary(x => x.TeacherId, x => x); |
| 894 | 920 | |
| 895 | - // 11. 组装结果 | |
| 921 | + // 12. 组装结果 | |
| 896 | 922 | var result = new List<TechTeacherStatisticsOutput>(); |
| 897 | 923 | foreach (var teacher in techTeacherList) |
| 898 | 924 | { |
| ... | ... | @@ -901,6 +927,10 @@ namespace NCC.Extend |
| 901 | 927 | var refundStat = refundDict.ContainsKey(teacher.EmployeeId) ? refundDict[teacher.EmployeeId] : null; |
| 902 | 928 | var personCount = personCountDict.ContainsKey(teacher.EmployeeId) ? personCountDict[teacher.EmployeeId] : 0; |
| 903 | 929 | var personTimesStat = personTimesDict.ContainsKey(teacher.EmployeeId) ? personTimesDict[teacher.EmployeeId] : null; |
| 930 | + var orderPersonCount = orderPersonCountDict.ContainsKey(teacher.EmployeeId) ? orderPersonCountDict[teacher.EmployeeId] : 0; | |
| 931 | + | |
| 932 | + // 计算消耗开单转化率(开单人头/消耗人头) | |
| 933 | + var consumeOrderConversionRate = personCount > 0 ? (decimal)orderPersonCount / personCount : 0m; | |
| 904 | 934 | |
| 905 | 935 | result.Add(new TechTeacherStatisticsOutput |
| 906 | 936 | { |
| ... | ... | @@ -915,7 +945,9 @@ namespace NCC.Extend |
| 915 | 945 | DepartmentId = teacher.OrganizeId, |
| 916 | 946 | DepartmentName = !string.IsNullOrEmpty(teacher.DepartmentName) |
| 917 | 947 | ? teacher.DepartmentName |
| 918 | - : (techOrganizeDict.ContainsKey(teacher.OrganizeId) ? techOrganizeDict[teacher.OrganizeId] : "") | |
| 948 | + : (techOrganizeDict.ContainsKey(teacher.OrganizeId) ? techOrganizeDict[teacher.OrganizeId] : ""), | |
| 949 | + OrderPersonCount = orderPersonCount, | |
| 950 | + ConsumeOrderConversionRate = consumeOrderConversionRate | |
| 919 | 951 | }); |
| 920 | 952 | } |
| 921 | 953 | ... | ... |
netcore/src/Modularity/Extend/NCC.Extend/LqXhHyhkService.cs
| ... | ... | @@ -1983,6 +1983,7 @@ namespace NCC.Extend.LqXhHyhk |
| 1983 | 1983 | /// - sourceType: 来源类型(字符串,如:购买、赠送、体验) |
| 1984 | 1984 | /// - storeId: 门店ID(关联耗卡记录表的门店ID) |
| 1985 | 1985 | /// - storeName: 门店名称(关联门店表的店名字段) |
| 1986 | + /// - lqXhJksyjList: 健康师业绩列表(关联健康师业绩表,通过F_kdpxid关联品项明细ID) | |
| 1986 | 1987 | /// </remarks> |
| 1987 | 1988 | /// <param name="input">查询参数</param> |
| 1988 | 1989 | /// <returns>耗卡品项明细记录列表(分页)</returns> |
| ... | ... | @@ -2094,6 +2095,41 @@ namespace NCC.Extend.LqXhHyhk |
| 2094 | 2095 | storeDict = stores.ToDictionary(x => x.Id, x => x.Dm ?? ""); |
| 2095 | 2096 | } |
| 2096 | 2097 | |
| 2098 | + // 批量查询健康师业绩信息(通过 F_kdpxid 关联到品项明细ID) | |
| 2099 | + var jksyjDict = new Dictionary<string, List<LqXhJksyjInfoOutput>>(); | |
| 2100 | + if (itemIds.Any()) | |
| 2101 | + { | |
| 2102 | + var jksyjEntities = await _db.Queryable<LqXhJksyjEntity>() | |
| 2103 | + .Where(x => itemIds.Contains(x.Kdpxid) && x.IsEffective == StatusEnum.有效.GetHashCode()) | |
| 2104 | + .ToListAsync(); | |
| 2105 | + | |
| 2106 | + var jksyjList = jksyjEntities.Select(x => new LqXhJksyjInfoOutput | |
| 2107 | + { | |
| 2108 | + id = x.Id, | |
| 2109 | + glkdbh = x.Glkdbh, | |
| 2110 | + jks = x.Jks, | |
| 2111 | + jksxm = x.Jksxm, | |
| 2112 | + jkszh = x.Jkszh, | |
| 2113 | + jksyj = x.Jksyj?.ToString() ?? "0", | |
| 2114 | + yjsj = x.Yjsj, | |
| 2115 | + jsjId = x.JsjId, | |
| 2116 | + kdpxid = x.Kdpxid, | |
| 2117 | + laborCost = x.LaborCost, | |
| 2118 | + kdpxNumber = x.KdpxNumber, | |
| 2119 | + originalKdpxNumber = x.OriginalKdpxNumber, | |
| 2120 | + overtimeKdpxNumber = x.OvertimeKdpxNumber, | |
| 2121 | + originalLaborCost = x.OriginalLaborCost, | |
| 2122 | + overtimeLaborCost = x.OvertimeLaborCost, | |
| 2123 | + isAccompanied = x.IsAccompanied, | |
| 2124 | + accompaniedProjectNumber = x.AccompaniedProjectNumber | |
| 2125 | + }).ToList(); | |
| 2126 | + | |
| 2127 | + jksyjDict = jksyjList | |
| 2128 | + .Where(x => !string.IsNullOrEmpty(x.kdpxid)) | |
| 2129 | + .GroupBy(x => x.kdpxid) | |
| 2130 | + .ToDictionary(g => g.Key, g => g.ToList()); | |
| 2131 | + } | |
| 2132 | + | |
| 2097 | 2133 | // 5. 组装返回数据 |
| 2098 | 2134 | var resultList = pagedData.list.Select(pxmx => new ConsumeItemDetailListOutput |
| 2099 | 2135 | { |
| ... | ... | @@ -2110,7 +2146,8 @@ namespace NCC.Extend.LqXhHyhk |
| 2110 | 2146 | totalPrice = pxmx.TotalPrice, |
| 2111 | 2147 | sourceType = pxmx.SourceType, |
| 2112 | 2148 | storeId = pxmx.ConsumeInfoId != null && consumeDict.ContainsKey(pxmx.ConsumeInfoId) ? consumeDict[pxmx.ConsumeInfoId].StoreId : "", |
| 2113 | - storeName = pxmx.ConsumeInfoId != null && consumeDict.ContainsKey(pxmx.ConsumeInfoId) && !string.IsNullOrEmpty(consumeDict[pxmx.ConsumeInfoId].StoreId) && storeDict.ContainsKey(consumeDict[pxmx.ConsumeInfoId].StoreId) ? storeDict[consumeDict[pxmx.ConsumeInfoId].StoreId] : "" | |
| 2149 | + storeName = pxmx.ConsumeInfoId != null && consumeDict.ContainsKey(pxmx.ConsumeInfoId) && !string.IsNullOrEmpty(consumeDict[pxmx.ConsumeInfoId].StoreId) && storeDict.ContainsKey(consumeDict[pxmx.ConsumeInfoId].StoreId) ? storeDict[consumeDict[pxmx.ConsumeInfoId].StoreId] : "", | |
| 2150 | + lqXhJksyjList = jksyjDict.ContainsKey(pxmx.Id) ? jksyjDict[pxmx.Id] : new List<LqXhJksyjInfoOutput>() | |
| 2114 | 2151 | }).ToList(); |
| 2115 | 2152 | |
| 2116 | 2153 | // 6. 返回分页结果 | ... | ... |