From f891e7d46c6a111df56fed4579183d9001edf706 Mon Sep 17 00:00:00 2001 From: “wangming” <“wangming@antissoft.com”> Date: Mon, 29 Dec 2025 18:45:34 +0800 Subject: [PATCH] 1 --- 历史开单记录接口文档.md | 213 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 客户GK2020082101082医美会员分析.md | 159 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 开单升单逻辑Bug排查报告.md | 232 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 开单升单逻辑说明.md | 259 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 集团驾驶舱标题修改记录.md | 194 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 1057 insertions(+), 0 deletions(-) create mode 100644 历史开单记录接口文档.md create mode 100644 客户GK2020082101082医美会员分析.md create mode 100644 开单升单逻辑Bug排查报告.md create mode 100644 开单升单逻辑说明.md create mode 100644 集团驾驶舱标题修改记录.md diff --git a/历史开单记录接口文档.md b/历史开单记录接口文档.md new file mode 100644 index 0000000..6803844 --- /dev/null +++ b/历史开单记录接口文档.md @@ -0,0 +1,213 @@ +# 历史开单记录接口文档 + +## 说明 +历史开单记录接口用于查询从老系统迁移过来的开单记录数据。 + +## 接口列表 + +### 1. 获取历史开单记录列表 + +**接口地址**: `GET /api/Extend/LqOrderRecords` + +**请求参数** (Query参数): + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| currentPage | int | 是 | 当前页码,从1开始 | +| pageSize | int | 是 | 每页数量 | +| memberNo | string | 否 | 会员编号(模糊匹配) | +| memberPhone | string | 否 | 会员手机号(模糊匹配) | +| sidx | string | 否 | 排序字段,默认 "id" | +| sort | string | 否 | 排序方式,默认 "desc"(asc/desc) | + +**请求示例**: +```javascript +// 基础查询 +GET /api/Extend/LqOrderRecords?currentPage=1&pageSize=10 + +// 通过会员编号筛选 +GET /api/Extend/LqOrderRecords?currentPage=1&pageSize=10&memberNo=GK2022120408026 + +// 通过会员手机号筛选 +GET /api/Extend/LqOrderRecords?currentPage=1&pageSize=10&memberPhone=13699443779 + +// 组合筛选 +GET /api/Extend/LqOrderRecords?currentPage=1&pageSize=10&memberNo=GK&memberPhone=136 +``` + +**响应示例**: +```json +{ + "code": 200, + "msg": "操作成功", + "data": { + "pagination": { + "pageIndex": 1, + "pageSize": 10, + "total": 100 + }, + "list": [ + { + "id": 1, + "orderNo": "KD20231201001", + "imageName": "image1.jpg", + "memberNo": "GK2022120408026", + "memberPhone": "13699443779", + "memberName": "张三", + "remarks": "备注信息", + "createdAt": "2023-12-01T10:00:00", + "updatedAt": "2023-12-01T10:00:00" + } + ] + } +} +``` + +**响应字段说明**: + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | int | 主键ID | +| orderNo | string | 开单号 | +| imageName | string | 图片名称 | +| memberNo | string | 会员编号 | +| memberPhone | string | 会员手机号 | +| memberName | string | 会员名称 | +| remarks | string | 备注 | +| createdAt | string | 创建时间(ISO 8601格式) | +| updatedAt | string | 更新时间(ISO 8601格式) | + +--- + +### 2. 获取历史开单记录详情 + +**接口地址**: `GET /api/Extend/LqOrderRecords/{id}` + +**路径参数**: + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| id | int | 是 | 主键ID | + +**请求示例**: +```javascript +GET /api/Extend/LqOrderRecords/1 +``` + +**响应示例**: +```json +{ + "code": 200, + "msg": "操作成功", + "data": { + "id": 1, + "orderNo": "KD20231201001", + "imageName": "image1.jpg", + "memberNo": "GK2022120408026", + "memberPhone": "13699443779", + "memberName": "张三", + "remarks": "备注信息", + "createdAt": "2023-12-01T10:00:00", + "updatedAt": "2023-12-01T10:00:00" + } +} +``` + +**错误响应** (记录不存在): +```json +{ + "code": 500, + "msg": "未找到该历史开单记录", + "data": null +} +``` + +--- + +## 前端调用示例 + +### Vue/axios 示例 + +```javascript +import axios from 'axios' + +// 获取列表 +async function getOrderRecordsList(params) { + try { + const response = await axios.get('/api/Extend/LqOrderRecords', { + params: { + currentPage: params.currentPage || 1, + pageSize: params.pageSize || 10, + memberNo: params.memberNo || '', + memberPhone: params.memberPhone || '', + sidx: params.sidx || 'id', + sort: params.sort || 'desc' + } + }) + return response.data + } catch (error) { + console.error('获取历史开单记录列表失败:', error) + throw error + } +} + +// 获取详情 +async function getOrderRecordInfo(id) { + try { + const response = await axios.get(`/api/Extend/LqOrderRecords/${id}`) + return response.data + } catch (error) { + console.error('获取历史开单记录详情失败:', error) + throw error + } +} + +// 使用示例 +// 1. 查询所有记录 +getOrderRecordsList({ currentPage: 1, pageSize: 10 }) + +// 2. 通过会员编号筛选 +getOrderRecordsList({ + currentPage: 1, + pageSize: 10, + memberNo: 'GK2022120408026' +}) + +// 3. 通过会员手机号筛选 +getOrderRecordsList({ + currentPage: 1, + pageSize: 10, + memberPhone: '13699443779' +}) + +// 4. 获取详情 +getOrderRecordInfo(1) +``` + +--- + +## 注意事项 + +1. **数据来源**: 这些数据是从老系统迁移过来的历史数据,只读不写 +2. **筛选条件**: `memberNo` 和 `memberPhone` 支持模糊匹配(Contains查询) +3. **分页**: 必须提供 `currentPage` 和 `pageSize` 参数 +4. **排序**: 默认按 `id` 降序排列,可通过 `sidx` 和 `sort` 参数自定义 +5. **认证**: 所有接口都需要在请求头中携带认证Token + ``` + Authorization: Bearer {token} + ``` + +--- + +## 接口状态 + +✅ **已实现并通过测试** +- 代码已编译通过 +- 接口测试通过,功能正常 +- 测试结果: + - ✅ 列表查询:成功(共31495条记录) + - ✅ 会员编号筛选:成功(筛选出30642条记录) + - ✅ 会员手机号筛选:成功(筛选出2756条记录) + - ✅ 详情查询:成功 + - ✅ 错误处理:正确返回错误提示 + diff --git a/客户GK2020082101082医美会员分析.md b/客户GK2020082101082医美会员分析.md new file mode 100644 index 0000000..ab09bdc --- /dev/null +++ b/客户GK2020082101082医美会员分析.md @@ -0,0 +1,159 @@ +# 客户 GK2020082101082 医美会员分析报告 + +## 客户基本信息 +- **客户编号**: GK2020082101082 +- **客户名称**: 韦明霞 +- **手机号**: 15928992865 +- **当前状态**: `F_IsMedicalMember = 0`(不是医美会员) +- **医美会员时间**: 2025-11-29(但标记为0,可能是历史记录) + +--- + +## 医美会员计算规则 + +### 计算逻辑 +根据代码 `LqKhxxService.cs` 中的 `UpdateMemberTypeFlags` 方法: + +1. **数据来源**: 查询该会员的所有有效开单品项明细 + - 表:`lq_kd_pxmx`(开单品项明细) + - 关联:`lq_kd_kdjlb`(开单记录表) + +2. **筛选条件**: + - `pxmx.F_IsEffective = 1`(品项明细有效) + - `kd.F_IsEffective = 1`(开单记录有效) + - `pxmx.F_ActualPrice > 0`(实际价格大于0) + - `pxmx.px != '61'`(排除女神卡) + +3. **计算方式**: + ```csharp + var medicalAmount = billingItems + .Where(x => x.ItemCategory == "医美") + .Sum(x => x.ActualPrice); + + if (medicalAmount > MemberInfoUpdateConfig.MedicalMemberAmountThreshold) + { + member.IsMedicalMember = 1; // 是医美会员 + } + else + { + member.IsMedicalMember = 0; // 不是医美会员 + } + ``` + +4. **阈值配置**: + - 医美会员判断金额阈值:**3000元** + - 配置位置:`MemberInfoUpdateConfig.MedicalMemberAmountThreshold = 3000m` + +--- + +## 该客户的医美品项明细 + +### 医美品项统计(已确认完整) +- **医美品项总数**: 8个(已确认,无遗漏) +- **医美品项总金额**: **1459.34元** +- **医美会员阈值**: 3000元 +- **判断结果**: ❌ **不是医美会员**(1459.34 < 3000) + +### 完整品项分类统计 +- **总有效品项数**: 48个 +- **医美品项**: 8个,总金额 1459.34元 +- **生美品项**: 17个,总金额 124490.47元 +- **科美品项**: 23个,总金额 621450.17元 + +### 医美品项分布 +- **开单记录数**: 1个(2025-11-29) +- **该开单包含**: 11个品项(其中8个医美,3个其他分类) + +### 医美品项明细列表 + +| 品项ID | 品项名称 | 品项分类 | 实际价格 | 开单日期 | +|--------|---------|---------|---------|---------| +| 757744121354913029 | 直播-肝胆排毒 | 医美 | 199.00 | 2025-11-29 | +| 757740784001746181 | 直播-除皱秒杀 | 医美 | 199.00 | 2025-11-29 | +| 757743414367225093 | 直播-私密排毒 | 医美 | 199.00 | 2025-11-29 | +| 757744676965975301 | 直播-脂间艺术定金 | 医美 | 199.00 | 2025-11-29 | +| 757740991623988485 | 直播-小V脸秒杀 | 医美 | 199.00 | 2025-11-29 | +| 757742347281761541 | 直播-面部提升 | 医美 | 199.00 | 2025-11-29 | +| 757743777686226181 | 直播-仪器收紧(私密) | 医美 | 199.00 | 2025-11-29 | +| 763566455714219269 | 直播-气血针 | 医美 | 66.34 | 2025-11-29 | + +**金额计算**: +- 7个 × 199.00 = 1393.00元 +- 1个 × 66.34 = 66.34元 +- **总计**: 1459.34元 + +--- + +## 问题分析 + +### 为什么不是医美会员? + +1. **金额不足**: + - 该客户的医美品项总金额为 **1459.34元** + - 医美会员阈值要求 **3000元** + - 差额:3000 - 1459.34 = **1540.66元** + +2. **品项特点**: + - 所有医美品项都是"直播"相关的低价品项 + - 单价较低(199元、66.34元) + - 虽然数量有8个,但总金额未达到阈值 + +3. **F_MedicalMemberTime 字段说明**: + - 该字段有值(2025-11-29),但 `F_IsMedicalMember = 0` + - 可能原因: + - 之前计算时设置了时间,但后来金额不满足条件,标记被重置为0 + - 或者该时间字段是首次购买医美品项的时间,而非成为医美会员的时间 + +--- + +## 如何成为医美会员? + +### 条件 +客户需要满足以下条件才能成为医美会员: + +1. **累计医美品项金额 > 3000元** + - 当前金额:1459.34元 + - 还需金额:**1540.66元** + +2. **品项要求**: + - 品项分类必须是"医美" + - 开单记录和品项明细都必须有效(F_IsEffective = 1) + - 实际价格必须大于0 + - 排除女神卡(px != '61') + +### 计算逻辑位置 +- **代码文件**: `netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs` +- **方法**: `UpdateMemberTypeFlags` +- **行数**: 1968-1989行 + +### 配置位置 +- **代码文件**: `netcore/src/Modularity/Extend/NCC.Extend.Entitys/Config/MemberInfoUpdateConfig.cs` +- **属性**: `MedicalMemberAmountThreshold` +- **当前值**: 3000元 + +--- + +## 其他会员类型统计(参考) + +该客户的其他品项统计: +- **生美品项**: 多个,总金额远超过500元(生美会员阈值) +- **科美品项**: 多个,有单品项金额超过3800元(科技部会员阈值) + +--- + +## 总结 + +客户 **GK2020082101082(韦明霞)** 不是医美会员的原因是: +- ✅ 有医美品项(8个,已确认完整) +- ❌ 但医美品项总金额(1459.34元)未达到阈值(3000元) +- 📊 差额:还需1540.66元才能成为医美会员 +- 📅 所有医美品项都在2025-11-29这一个开单记录中 + +**计算逻辑确认**: +- ✅ 查询逻辑正确:已查询所有有效开单品项明细 +- ✅ 筛选条件正确:有效记录、价格>0、排除女神卡 +- ✅ 金额计算正确:8个医美品项累计1459.34元 +- ✅ 阈值判断正确:1459.34 < 3000,所以不是医美会员 + +**建议**: 如果该客户需要成为医美会员,需要再购买至少1540.66元的医美品项。 + diff --git a/开单升单逻辑Bug排查报告.md b/开单升单逻辑Bug排查报告.md new file mode 100644 index 0000000..90bf6b2 --- /dev/null +++ b/开单升单逻辑Bug排查报告.md @@ -0,0 +1,232 @@ +# 开单升单逻辑Bug排查报告 + +## 排查目的 +确认 `UpdateForNoDelete` 方法中是否存在升单字段赋值错误,因为这是生产环境,需要谨慎验证。 + +--- + +## 代码对比分析 + +### 1. Create方法(新增开单)- 第856-884行 + +**逻辑正确** ✅ + +```csharp +//判断升医美:当前开单包含医美品项 + 之前有医美类型的开单记录 + 实付业绩>=1000 +if (hasMedicalItemInCurrentBilling && hasPreviousMedicalBilling && MedicalItemInCurrentBillingAmount >= 1000) +{ + entity.UpgradeMedicalBeauty = "是"; // ✅ 正确 +} + +//判断升科美:当前开单包含科美品项 + 之前有科美类型的开单记录 +if (hasTechItemInCurrentBilling && hasPreviousTechBilling) +{ + entity.UpgradeTechBeauty = "是"; // ✅ 正确 +} + +//判断升生美:当前开单包含生美品项 + 之前有生美类型的开单记录 +if (hasLifeItemInCurrentBilling && hasPreviousLifeBilling) +{ + entity.UpgradeLifeBeauty = "是"; // ✅ 正确 +} +``` + +--- + +### 2. UpdateForNoDelete方法(更新开单)- 第1192-1220行 + +**逻辑存在Bug** ❌ + +```csharp +// 第1192行:判断升医美的条件 +var isMedicalProject = hasMedicalItemInCurrentBilling && await _db.Queryable() + .Where(x => x.MemberId == entity.Kdhy + && x.IsEffective == StatusEnum.有效.GetHashCode() + && x.ItemCategory == "医美" // 判断医美 + && x.ActualPrice > 0 + && x.Px != "61" + && x.Glkdbh != id) + .AnyAsync(); + +// 第1193-1200行:判断升医美,但赋值错误 +if (isMedicalProject && MedicalItemInCurrentBillingAmount >= 1000) +{ + entity.UpgradeLifeBeauty = "是"; // ❌ BUG:应该是 UpgradeMedicalBeauty +} +else +{ + entity.UpgradeLifeBeauty = "否"; // ❌ BUG:应该是 UpgradeMedicalBeauty +} + +// 第1202行:判断升科美的条件 +var isTechProject = hasTechItemInCurrentBilling && await _db.Queryable() + .Where(x => x.MemberId == entity.Kdhy + && x.IsEffective == StatusEnum.有效.GetHashCode() + && x.ItemCategory == "科美" // 判断科美 + && x.ActualPrice > 0 + && x.Px != "61" + && x.Glkdbh != id) + .AnyAsync(); + +// 第1203-1210行:判断升科美,赋值正确 +if (isTechProject) +{ + entity.UpgradeTechBeauty = "是"; // ✅ 正确 +} + +// 第1212行:判断升生美的条件 +var isLifeProject = hasLifeItemInCurrentBilling && await _db.Queryable() + .Where(x => x.MemberId == entity.Kdhy + && x.IsEffective == StatusEnum.有效.GetHashCode() + && x.ItemCategory == "生美" // 判断生美 + && x.ActualPrice > 0 + && x.Px != "61" + && x.Glkdbh != id) + .AnyAsync(); + +// 第1213-1220行:判断升生美,但赋值错误 +if (isLifeProject) +{ + entity.UpgradeMedicalBeauty = "是"; // ❌ BUG:应该是 UpgradeLifeBeauty +} +else +{ + entity.UpgradeMedicalBeauty = "否"; // ❌ BUG:应该是 UpgradeLifeBeauty +} +``` + +--- + +### 3. 批量处理方法(BatchProcessHistoricalUpgradeTypes)- 第4342-4348行 + +**逻辑正确** ✅ + +```csharp +// 判断升医美 +billing.UpgradeMedicalBeauty = (hasMedicalItem && hasPreviousMedical && medicalItemAmount >= 1000) ? "是" : "否"; + +// 判断升科美 +billing.UpgradeTechBeauty = (hasTechItem && hasPreviousTech) ? "是" : "否"; + +// 判断升生美 +billing.UpgradeLifeBeauty = (hasLifeItem && hasPreviousLife) ? "是" : "否"; +``` + +--- + +## Bug确认 + +### Bug 1:升医美判断错误赋值 +- **位置**:第1193-1200行 +- **问题**:判断升医美的条件,但赋值给了 `UpgradeLifeBeauty`(升生美字段) +- **正确应该是**:赋值给 `UpgradeMedicalBeauty` + +### Bug 2:升生美判断错误赋值 +- **位置**:第1213-1220行 +- **问题**:判断升生美的条件,但赋值给了 `UpgradeMedicalBeauty`(升医美字段) +- **正确应该是**:赋值给 `UpgradeLifeBeauty` + +--- + +## 影响分析 + +### 受影响的操作 +- **UpdateForNoDelete方法**:当通过此方法更新开单记录时,升单标记会被错误赋值 + +### 不受影响的操作 +- **Create方法**:新增开单时,升单标记是正确的 +- **批量处理方法**:批量处理历史数据时,升单标记是正确的 + +### 实际影响 +1. **如果开单记录只通过Create方法创建,从未通过Update方法更新**: + - ✅ 升单标记是正确的 + +2. **如果开单记录通过Update方法更新过**: + - ❌ 升医美的标记会被错误地写入 `UpgradeLifeBeauty` 字段 + - ❌ 升生美的标记会被错误地写入 `UpgradeMedicalBeauty` 字段 + - ✅ 升科美的标记是正确的 + +3. **数据混乱情况**: + - 如果一个开单同时满足升医美和升生美的条件,通过Update方法更新后: + - `UpgradeLifeBeauty` 会被设置为"是"(但实际应该是升医美) + - `UpgradeMedicalBeauty` 会被设置为"是"(但实际应该是升生美) + - 数据完全错位 + +--- + +## 验证建议 + +### 1. 检查Update方法使用频率 +- 查询最近几个月通过 `UpdateForNoDelete` 方法更新的开单记录数量 +- 确认是否有大量数据受到影响 + +### 2. 抽样验证数据 +- 随机抽取一些通过Update方法更新的开单记录 +- 检查其升单标记是否与品项明细匹配 +- 如果发现不匹配,说明Bug确实存在 + +### 3. 对比Create和Update的数据 +- 对比同一时间段通过Create和Update方法处理的升单标记 +- 如果Update方法处理的数据有明显异常,说明Bug存在 + +--- + +## 修复方案 + +### 修复代码位置 +- **文件**:`netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs` +- **方法**:`UpdateForNoDelete` +- **行数**:第1195行和第1215行 + +### 修复内容 + +**第1195行**: +```csharp +// 修复前 +entity.UpgradeLifeBeauty = "是"; + +// 修复后 +entity.UpgradeMedicalBeauty = "是"; +``` + +**第1199行**: +```csharp +// 修复前 +entity.UpgradeLifeBeauty = "否"; + +// 修复后 +entity.UpgradeMedicalBeauty = "否"; +``` + +**第1215行**: +```csharp +// 修复前 +entity.UpgradeMedicalBeauty = "是"; + +// 修复后 +entity.UpgradeLifeBeauty = "是"; +``` + +**第1219行**: +```csharp +// 修复前 +entity.UpgradeMedicalBeauty = "否"; + +// 修复后 +entity.UpgradeLifeBeauty = "否"; +``` + +--- + +## 结论 + +**Bug确实存在**,但需要确认: +1. `UpdateForNoDelete` 方法在生产环境中的使用频率 +2. 是否有历史数据受到影响 +3. 是否需要修复历史数据 + +**建议**: +1. 先修复代码Bug +2. 评估是否需要修复历史数据(如果Update方法使用频率不高,可能影响范围有限) +3. 如果影响范围大,考虑使用批量处理方法重新计算受影响的开单记录的升单标记 + diff --git a/开单升单逻辑说明.md b/开单升单逻辑说明.md new file mode 100644 index 0000000..29f3c48 --- /dev/null +++ b/开单升单逻辑说明.md @@ -0,0 +1,259 @@ +# 开单升单逻辑说明文档 + +## 概述 +升单是指已经开过会员再次消费的情况。系统会根据当前开单的品项类型和会员历史开单记录,自动判断是否为升单,并标记升单类型。 + +## 升单类型字段 +- `F_UpgradeLifeBeauty`:升生美(再次开单时,包含生美品项的订单) +- `F_UpgradeTechBeauty`:升科美(再次开单时,包含科美品项的订单) +- `F_UpgradeMedicalBeauty`:升医美(再次开单时,包含医美品项的订单) + +--- + +## 升单判断逻辑 + +### 1. 升医美(UpgradeMedicalBeauty) + +**判断条件**(需同时满足): +1. ✅ **当前开单包含医美品项** + - 检查当前开单的品项明细中,是否有品项分类(`lq_xmzl.qt2`)为"医美"的记录 + +2. ✅ **之前有医美类型的开单记录** + - 查询该会员(`kdhy`)在**当前开单之前**的所有有效开单品项明细 + - 筛选条件: + - `F_IsEffective = 1`(品项明细有效) + - `ItemCategory = "医美"`(品项分类为医美) + - `ActualPrice > 0`(实际价格大于0) + - `Px != "61"`(排除女神卡) + +3. ✅ **当前开单的医美品项实付业绩 >= 1000元** + - 计算当前开单中所有医美品项的 `actualPrice` 总和 + - 必须 >= 1000元 + +**代码位置**:`LqKdKdjlbService.cs` 第856-864行 + +**代码逻辑**: +```csharp +//判断升医美:当前开单包含医美品项 + 之前有医美类型的开单记录 + 实付业绩>=1000 +if (hasMedicalItemInCurrentBilling && hasPreviousMedicalBilling && MedicalItemInCurrentBillingAmount >= 1000) +{ + entity.UpgradeMedicalBeauty = "是"; +} +else +{ + entity.UpgradeMedicalBeauty = "否"; +} +``` + +--- + +### 2. 升科美(UpgradeTechBeauty) + +**判断条件**(需同时满足): +1. ✅ **当前开单包含科美品项** + - 检查当前开单的品项明细中,是否有品项分类为"科美"的记录 + +2. ✅ **之前有科美类型的开单记录** + - 查询该会员在当前开单之前的所有有效开单品项明细 + - 筛选条件: + - `F_IsEffective = 1` + - `ItemCategory = "科美"` + - `ActualPrice > 0` + - `Px != "61"`(排除女神卡) + +**代码位置**:`LqKdKdjlbService.cs` 第866-874行 + +**代码逻辑**: +```csharp +//判断升科美:当前开单包含科美品项 + 之前有科美类型的开单记录 +if (hasTechItemInCurrentBilling && hasPreviousTechBilling) +{ + entity.UpgradeTechBeauty = "是"; +} +else +{ + entity.UpgradeTechBeauty = "否"; +} +``` + +--- + +### 3. 升生美(UpgradeLifeBeauty) + +**判断条件**(需同时满足): +1. ✅ **当前开单包含生美品项** + - 检查当前开单的品项明细中,是否有品项分类为"生美"的记录 + +2. ✅ **之前有生美类型的开单记录** + - 查询该会员在当前开单之前的所有有效开单品项明细 + - 筛选条件: + - `F_IsEffective = 1` + - `ItemCategory = "生美"` + - `ActualPrice > 0` + - `Px != "61"`(排除女神卡) + +**代码位置**:`LqKdKdjlbService.cs` 第876-884行 + +**代码逻辑**: +```csharp +//判断升生美:当前开单包含生美品项 + 之前有生美类型的开单记录 +if (hasLifeItemInCurrentBilling && hasPreviousLifeBilling) +{ + entity.UpgradeLifeBeauty = "是"; +} +else +{ + entity.UpgradeLifeBeauty = "否"; +} +``` + +--- + +## 关键代码位置 + +### 新增开单(Create方法) +- **文件**:`netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs` +- **方法**:`Create`(第799-884行) +- **逻辑**:在创建新开单时,自动判断并设置升单类型字段 + +### 更新开单(Update方法) +- **文件**:`netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs` +- **方法**:`Update`(第1190-1220行) +- **⚠️ 注意**:Update方法中的升单判断逻辑**存在Bug**(见下方说明) + +### 批量处理历史数据 +- **文件**:`netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs` +- **方法**:`BatchProcessHistoricalUpgradeTypes`(第4220-4398行) +- **逻辑**:批量更新历史开单记录的升单类型字段 + +--- + +## ⚠️ 发现的Bug + +### Update方法中的字段赋值错误 + +**位置**:`LqKdKdjlbService.cs` 第1192-1220行 + +**问题**: +1. **第1195行**:判断升医美,但赋值给了 `UpgradeLifeBeauty`(应该是 `UpgradeMedicalBeauty`) +2. **第1215行**:判断升生美,但赋值给了 `UpgradeMedicalBeauty`(应该是 `UpgradeLifeBeauty`) + +**错误代码**: +```csharp +// 第1192-1200行:判断升医美,但赋值错误 +var isMedicalProject = hasMedicalItemInCurrentBilling && await _db.Queryable()... +if (isMedicalProject && MedicalItemInCurrentBillingAmount >= 1000) +{ + entity.UpgradeLifeBeauty = "是"; // ❌ 错误:应该是 UpgradeMedicalBeauty +} + +// 第1212-1220行:判断升生美,但赋值错误 +var isLifeProject = hasLifeItemInCurrentBilling && await _db.Queryable()... +if (isLifeProject) +{ + entity.UpgradeMedicalBeauty = "是"; // ❌ 错误:应该是 UpgradeLifeBeauty +} +``` + +**正确代码应该是**: +```csharp +// 升医美 +if (isMedicalProject && MedicalItemInCurrentBillingAmount >= 1000) +{ + entity.UpgradeMedicalBeauty = "是"; // ✅ 正确 +} + +// 升生美 +if (isLifeProject) +{ + entity.UpgradeLifeBeauty = "是"; // ✅ 正确 +} +``` + +--- + +## 数据来源说明 + +### 品项分类获取 +- **表**:`lq_xmzl`(项目资料表) +- **字段**:`qt2`(品项分类:生美/科美/医美) +- **关联**:通过 `lq_kd_pxmx.px = lq_xmzl.F_Id` 关联 + +### 历史开单记录查询 +- **表**:`lq_kd_pxmx`(开单品项明细表) +- **筛选条件**: + - `MemberId = 当前会员ID` + - `F_IsEffective = 1`(有效) + - `ItemCategory = 对应类型`(生美/科美/医美) + - `ActualPrice > 0`(实际价格大于0) + - `Px != "61"`(排除女神卡) + - `Glkdbh != 当前开单ID`(排除当前开单本身,仅查询历史记录) + +--- + +## 升单判断流程图 + +### 升医美流程 +``` +开始 + ↓ +当前开单是否包含医美品项? + ↓ 是 +之前是否有医美类型的开单记录? + ↓ 是 +当前开单医美品项实付业绩 >= 1000元? + ↓ 是 +标记为:升医美 = "是" + ↓ +结束 +``` + +### 升科美流程 +``` +开始 + ↓ +当前开单是否包含科美品项? + ↓ 是 +之前是否有科美类型的开单记录? + ↓ 是 +标记为:升科美 = "是" + ↓ +结束 +``` + +### 升生美流程 +``` +开始 + ↓ +当前开单是否包含生美品项? + ↓ 是 +之前是否有生美类型的开单记录? + ↓ 是 +标记为:升生美 = "是" + ↓ +结束 +``` + +--- + +## 注意事项 + +1. **升单判断是独立的**:一个开单可以同时标记为升医美、升科美、升生美(如果同时满足条件) + +2. **时间顺序很重要**:判断"之前是否有开单记录"时,是基于开单日期(`kdrq`)来判断的,必须是当前开单日期之前的记录 + +3. **排除女神卡**:所有升单判断都排除品项ID为"61"的女神卡 + +4. **有效记录**:只统计有效的开单记录和品项明细(`F_IsEffective = 1`) + +5. **医美升单特殊要求**:升医美除了需要满足前两个条件外,还需要当前开单的医美品项实付业绩 >= 1000元 + +--- + +## 修复建议 + +建议修复 `Update` 方法中的字段赋值错误,确保: +- 升医美 → 赋值给 `UpgradeMedicalBeauty` +- 升科美 → 赋值给 `UpgradeTechBeauty` +- 升生美 → 赋值给 `UpgradeLifeBeauty` + diff --git a/集团驾驶舱标题修改记录.md b/集团驾驶舱标题修改记录.md new file mode 100644 index 0000000..f4b1d41 --- /dev/null +++ b/集团驾驶舱标题修改记录.md @@ -0,0 +1,194 @@ +# 集团驾驶舱标题修改记录 + +## 修改时间 +2025-12-28 + +## 修改状态 +✅ **已完成** - 所有标题已成功修改 + +## 原始标题记录 + +### 一、主页面标题 +- **文件**: `antis-ncc-admin/src/views/statisticsList/form9.vue` +- **位置**: 第6行 +- **原始**: `集团驾驶舱` + `本月经营动态监测` + +### 二、核心 KPI 指标(6个) +- **文件**: `antis-ncc-admin/src/views/statisticsList/form9.vue` +- **位置**: 第620-625行(kpiList数组) +1. `本月成交总额` +2. `本月消耗金额` +3. `完成业绩(净额)` +4. `开单目标达成` +5. `本月拓客人数` +6. `退卡总计` + +### 三、卡片模块标题(11个) +- **文件**: `antis-ncc-admin/src/views/statisticsList/form9.vue` +1. 第63行: `会员核心指标` +2. 第249行: `会员类型分布` +3. 第259行: `会员分类统计` +4. 第297行: `营收与服务产出趋势分析` +5. 第311行: `拓客全链路转化漏斗` +6. 第327行: `门店业绩琅琊榜` +7. 第342行: `核心员效贡献矩阵` +8. 第370行: `金三角战队协同榜` +9. 第387行: `会员到店频次分布` +10. 第394行: `消耗品项 TOP 10` +11. 第409行: `开单品项 TOP 10` + +### 四、KPI 穿透弹窗标题(6个) +- **文件**: `antis-ncc-admin/src/views/statisticsList/form9.vue` +- **位置**: 第715-722行(titleMap对象) +1. `成交数据深度分析` +2. `消耗数据深度分析` +3. `净业绩完成度分析` +4. `开单目标达成度分析` +5. `拓客数据深度分析` +6. `退卡数据深度分析` + +### 五、年度经营统计分析页面 +- **文件**: `antis-ncc-admin/src/views/extend/annualSummary/dashboard/index.vue` + +#### 主标题 +- 第6行: `年度经营统计分析` + +#### 子页面标签(9个) +- 第32行: `月度趋势分析` +- 第35行: `全年门店业绩表` +- 第38行: `全年门店消耗表` +- 第41行: `年度门店人头表` +- 第44行: `年度门店人次表` +- 第47行: `年度门店项目数表` +- 第50行: `门店五项指标统计` +- 第53行: `事业部五项指标统计` +- 第56行: `事业部内部汇总` + +#### 子页面图表标题(10个) +- 第70行: `业绩走势对比` +- 第79行: `消耗走势对比` +- 第90行: `客头数走势` +- 第99行: `客次数走势` +- 第108行: `项目数走势` +- 第118行: `月度趋势数据列表` +- 第140行: `业绩走势图` +- 第148行: `业绩数据列表` +- 第171行: `消耗走势图` +- 第179行: `消耗数据列表` + +### 六、KPI 穿透子页面内部标题 + +#### 成交分析页面 +- **文件**: `antis-ncc-admin/src/components/kpi-drill/billing-analysis.vue` +- 第9行: `每日开单金额 & 人数` +- 第18行: `本月成交明细` + +#### 消耗分析页面 +- **文件**: `antis-ncc-admin/src/components/kpi-drill/consume-analysis.vue` +- 第9行: `每日消耗金额 & 人数` +- 第18行: `本月消耗明细` + +#### 退卡分析页面 +- **文件**: `antis-ncc-admin/src/components/kpi-drill/refund-analysis.vue` +- 第9行: `各门店退卡金额分布(不包含转卡)` +- 第21行: `退卡明细` + +--- + +## 新标题方案 + +### 一、主页面标题 +- 新: `战略决策指挥中心` + `实时经营态势感知` + +### 二、核心 KPI 指标(6个) +1. `营收核心指标` +2. `服务产出价值` +3. `净收益达成` +4. `目标完成度` +5. `新客增长量` +6. `风险管控指标` + +### 三、卡片模块标题(11个) +1. `会员资产全景` +2. `会员结构洞察` +3. `会员价值分层` +4. `经营效能趋势` +5. `客户获取转化链` +6. `门店卓越榜` +7. `团队效能矩阵` +8. `协同作战榜` +9. `客户活跃度分析` +10. `热门服务品项` +11. `热销产品品项` + +### 四、KPI 穿透弹窗标题(6个) +1. `营收洞察报告` +2. `服务价值分析` +3. `净收益达成分析` +4. `目标达成诊断` +5. `客户增长分析` +6. `风险预警分析` + +### 五、年度经营统计分析页面 + +#### 主标题 +- 新: `年度经营全景报告` + +#### 子页面标签(9个) +1. `月度经营趋势` +2. `年度业绩总览` +3. `年度消耗总览` +4. `年度客流量总览` +5. `年度到店频次总览` +6. `年度项目量总览` +7. `门店综合指标` +8. `事业部综合指标` +9. `事业部经营汇总` + +#### 子页面图表标题(10个) +1. `业绩趋势对比` +2. `消耗趋势对比` +3. `客流量趋势` +4. `到店频次趋势` +5. `项目量趋势` +6. `月度趋势明细` +7. `业绩趋势图` +8. `业绩明细表` +9. `消耗趋势图` +10. `消耗明细表` + +### 六、KPI 穿透子页面内部标题 + +#### 成交分析页面 +- `日度成交趋势` +- `成交明细清单` + +#### 消耗分析页面 +- `日度消耗趋势` +- `消耗明细清单` + +#### 退卡分析页面 +- `门店退卡分布` +- `退卡明细清单` + +--- + +## 修改完成确认 + +### 修改的文件列表 +1. ✅ `antis-ncc-admin/src/views/statisticsList/form9.vue` - 集团驾驶舱主页面 +2. ✅ `antis-ncc-admin/src/views/extend/annualSummary/dashboard/index.vue` - 年度经营统计分析页面 +3. ✅ `antis-ncc-admin/src/components/kpi-drill/billing-analysis.vue` - 成交分析子页面 +4. ✅ `antis-ncc-admin/src/components/kpi-drill/consume-analysis.vue` - 消耗分析子页面 +5. ✅ `antis-ncc-admin/src/components/kpi-drill/refund-analysis.vue` - 退卡分析子页面 + +### 修改统计 +- **总修改项**: 42个标题 +- **修改文件数**: 5个文件 +- **语法检查**: ✅ 通过 + +### 注意事项 +- 所有原始标题已完整记录,如需回滚可参考本文件 +- 修改后的标题保持了原有的功能逻辑不变 +- 所有修改已通过语法检查,无错误 + -- libgit2 0.21.4