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,8 +2,8 @@ | ||
| 2 | 2 | ||
| 3 | VUE_CLI_BABEL_TRANSPILE_MODULES = true | 3 | VUE_CLI_BABEL_TRANSPILE_MODULES = true |
| 4 | # VUE_APP_BASE_API = 'https://erp.lvqianmeiye.com' | 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 | # VUE_APP_BASE_API = 'http://localhost:2011' | 7 | # VUE_APP_BASE_API = 'http://localhost:2011' |
| 8 | VUE_APP_IMG_API = '' | 8 | VUE_APP_IMG_API = '' |
| 9 | VUE_APP_BASE_WSS = 'ws://192.168.110.45:2011/websocket' | 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,6 +56,16 @@ namespace NCC.Extend.Entitys.Dto.LqTechTeacherSalary | ||
| 56 | /// 部门名称(科技一部/科技二部) | 56 | /// 部门名称(科技一部/科技二部) |
| 57 | /// </summary> | 57 | /// </summary> |
| 58 | public string DepartmentName { get; set; } | 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 | using System; | 1 | using System; |
| 2 | +using System.Collections.Generic; | ||
| 3 | +using NCC.Extend.Entitys.Dto.LqXhJksyj; | ||
| 2 | 4 | ||
| 3 | namespace NCC.Extend.Entitys.Dto.LqXhPxmx | 5 | namespace NCC.Extend.Entitys.Dto.LqXhPxmx |
| 4 | { | 6 | { |
| @@ -76,6 +78,11 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx | @@ -76,6 +78,11 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx | ||
| 76 | /// 门店名称 | 78 | /// 门店名称 |
| 77 | /// </summary> | 79 | /// </summary> |
| 78 | public string storeName { get; set; } | 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,6 +10,7 @@ using NCC.Extend.Entitys.Dto.LqSalary; | ||
| 10 | using NCC.Extend.Entitys.Dto.LqTechTeacherSalary; | 10 | using NCC.Extend.Entitys.Dto.LqTechTeacherSalary; |
| 11 | using NCC.Extend.Entitys.lq_hytk_kjbsyj; | 11 | using NCC.Extend.Entitys.lq_hytk_kjbsyj; |
| 12 | using NCC.Extend.Entitys.lq_kd_kjbsyj; | 12 | using NCC.Extend.Entitys.lq_kd_kjbsyj; |
| 13 | +using NCC.Extend.Entitys.lq_kd_kdjlb; | ||
| 13 | using NCC.Extend.Entitys.lq_md_xdbhsj; | 14 | using NCC.Extend.Entitys.lq_md_xdbhsj; |
| 14 | using NCC.Extend.Entitys.lq_mdxx; | 15 | using NCC.Extend.Entitys.lq_mdxx; |
| 15 | using NCC.Extend.Entitys.lq_attendance_summary; | 16 | using NCC.Extend.Entitys.lq_attendance_summary; |
| @@ -885,14 +886,39 @@ namespace NCC.Extend | @@ -885,14 +886,39 @@ namespace NCC.Extend | ||
| 885 | }) | 886 | }) |
| 886 | .ToList(); | 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 | var orderDict = orderStats.ToDictionary(x => x.TeacherId, x => x); | 915 | var orderDict = orderStats.ToDictionary(x => x.TeacherId, x => x); |
| 890 | var consumeDict = consumeStats.ToDictionary(x => x.TeacherId, x => x); | 916 | var consumeDict = consumeStats.ToDictionary(x => x.TeacherId, x => x); |
| 891 | var refundDict = refundStats.ToDictionary(x => x.TeacherId, x => x); | 917 | var refundDict = refundStats.ToDictionary(x => x.TeacherId, x => x); |
| 892 | // personCountDict 已经在上面构建了 | 918 | // personCountDict 已经在上面构建了 |
| 893 | var personTimesDict = personTimesStats.ToDictionary(x => x.TeacherId, x => x); | 919 | var personTimesDict = personTimesStats.ToDictionary(x => x.TeacherId, x => x); |
| 894 | 920 | ||
| 895 | - // 11. 组装结果 | 921 | + // 12. 组装结果 |
| 896 | var result = new List<TechTeacherStatisticsOutput>(); | 922 | var result = new List<TechTeacherStatisticsOutput>(); |
| 897 | foreach (var teacher in techTeacherList) | 923 | foreach (var teacher in techTeacherList) |
| 898 | { | 924 | { |
| @@ -901,6 +927,10 @@ namespace NCC.Extend | @@ -901,6 +927,10 @@ namespace NCC.Extend | ||
| 901 | var refundStat = refundDict.ContainsKey(teacher.EmployeeId) ? refundDict[teacher.EmployeeId] : null; | 927 | var refundStat = refundDict.ContainsKey(teacher.EmployeeId) ? refundDict[teacher.EmployeeId] : null; |
| 902 | var personCount = personCountDict.ContainsKey(teacher.EmployeeId) ? personCountDict[teacher.EmployeeId] : 0; | 928 | var personCount = personCountDict.ContainsKey(teacher.EmployeeId) ? personCountDict[teacher.EmployeeId] : 0; |
| 903 | var personTimesStat = personTimesDict.ContainsKey(teacher.EmployeeId) ? personTimesDict[teacher.EmployeeId] : null; | 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 | result.Add(new TechTeacherStatisticsOutput | 935 | result.Add(new TechTeacherStatisticsOutput |
| 906 | { | 936 | { |
| @@ -915,7 +945,9 @@ namespace NCC.Extend | @@ -915,7 +945,9 @@ namespace NCC.Extend | ||
| 915 | DepartmentId = teacher.OrganizeId, | 945 | DepartmentId = teacher.OrganizeId, |
| 916 | DepartmentName = !string.IsNullOrEmpty(teacher.DepartmentName) | 946 | DepartmentName = !string.IsNullOrEmpty(teacher.DepartmentName) |
| 917 | ? teacher.DepartmentName | 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,6 +1983,7 @@ namespace NCC.Extend.LqXhHyhk | ||
| 1983 | /// - sourceType: 来源类型(字符串,如:购买、赠送、体验) | 1983 | /// - sourceType: 来源类型(字符串,如:购买、赠送、体验) |
| 1984 | /// - storeId: 门店ID(关联耗卡记录表的门店ID) | 1984 | /// - storeId: 门店ID(关联耗卡记录表的门店ID) |
| 1985 | /// - storeName: 门店名称(关联门店表的店名字段) | 1985 | /// - storeName: 门店名称(关联门店表的店名字段) |
| 1986 | + /// - lqXhJksyjList: 健康师业绩列表(关联健康师业绩表,通过F_kdpxid关联品项明细ID) | ||
| 1986 | /// </remarks> | 1987 | /// </remarks> |
| 1987 | /// <param name="input">查询参数</param> | 1988 | /// <param name="input">查询参数</param> |
| 1988 | /// <returns>耗卡品项明细记录列表(分页)</returns> | 1989 | /// <returns>耗卡品项明细记录列表(分页)</returns> |
| @@ -2094,6 +2095,41 @@ namespace NCC.Extend.LqXhHyhk | @@ -2094,6 +2095,41 @@ namespace NCC.Extend.LqXhHyhk | ||
| 2094 | storeDict = stores.ToDictionary(x => x.Id, x => x.Dm ?? ""); | 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 | // 5. 组装返回数据 | 2133 | // 5. 组装返回数据 |
| 2098 | var resultList = pagedData.list.Select(pxmx => new ConsumeItemDetailListOutput | 2134 | var resultList = pagedData.list.Select(pxmx => new ConsumeItemDetailListOutput |
| 2099 | { | 2135 | { |
| @@ -2110,7 +2146,8 @@ namespace NCC.Extend.LqXhHyhk | @@ -2110,7 +2146,8 @@ namespace NCC.Extend.LqXhHyhk | ||
| 2110 | totalPrice = pxmx.TotalPrice, | 2146 | totalPrice = pxmx.TotalPrice, |
| 2111 | sourceType = pxmx.SourceType, | 2147 | sourceType = pxmx.SourceType, |
| 2112 | storeId = pxmx.ConsumeInfoId != null && consumeDict.ContainsKey(pxmx.ConsumeInfoId) ? consumeDict[pxmx.ConsumeInfoId].StoreId : "", | 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 | }).ToList(); | 2151 | }).ToList(); |
| 2115 | 2152 | ||
| 2116 | // 6. 返回分页结果 | 2153 | // 6. 返回分页结果 |