Commit c57702ff5aad8b43507267fce91dd02f1957d202

Authored by 李宇
2 parents 8e97d59d 50867d2a

Merge branch 'master' of http://39.98.150.180/antissoft/lvqianmeiye_ERP

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. 返回分页结果