# 主任工资计算逻辑完整梳理 ## 📋 概述 主任工资由以下几个部分组成: 1. **底薪**:固定3500元,根据考核指标扣款 2. **提成**:基于**毛利**计算,使用阶梯提成模式 **重要说明**: - **业绩(StoreTotalPerformance)就是毛利** - **提成计算基于毛利**,而不是销售业绩(开单-退卡) --- ## 💰 核心计算公式 ### 1. 销售业绩 ``` 销售业绩 = 开单业绩 - 退款业绩 ``` ### 2. 毛利(核心指标) ``` 毛利 = 销售业绩 - - 合作项目成本 - 店内支出 - 洗毛巾费用 ``` ### 3. 业绩(用于提成计算) ``` 业绩(StoreTotalPerformance)= 毛利(GrossProfit) ``` **关键点**:`StoreTotalPerformance` 字段存储的是**毛利**,用于提成计算。 --- ## 📊 数据来源详解 ### 1. 开单业绩 **数据来源**: - 表:`lq_kd_kdjlb`(开单记录表) - 字段:`sfyj`(实付业绩) - 条件: - `F_IsEffective = 1`(有效记录) - `Djmd = @StoreId`(门店ID) - `Kdrq >= @StartDate AND Kdrq <= @EndDate`(时间范围) **代码位置**:第185-192行 ### 2. 退款业绩 **数据来源**: - 表:`lq_hytk_hytk`(退卡记录表) - 字段:`F_ActualRefundAmount`(实际退款金额,如果没有则使用 `tkje`) - 条件: - `F_IsEffective = 1`(有效记录) - `md = @StoreId`(门店ID) - `Tksj >= @StartDate AND Tksj <= @EndDate`(时间范围) **代码位置**:第194-202行 ### 3. 产品物料 **数据来源**: - 表:`lq_inventory_usage`(库存使用记录表) - 字段:`F_TotalAmount`(合计金额) - 条件: - `F_IsEffective = 1`(有效记录) - `F_StoreId = @StoreId`(门店ID) - **特殊规则**:11月工资算10月数据 - 如果计算月份是11月,则查询10月的数据 - 其他月份正常查询当月数据 **代码位置**:第252-271行 ### 4. 合作项目成本 **数据来源**: - 表:`lq_cooperation_cost`(合作成本表) - 字段:`F_TotalAmount`(合计金额) - 条件: - `F_Year = @Year`(年份) - `F_Month = @MonthStr`(月份,YYYYMM格式) - `F_StoreId = @StoreId`(门店ID) - `F_IsEffective = 1`(有效记录) **代码位置**:第273-281行 ### 5. 店内支出 **数据来源**: - 表:`lq_store_expense`(店内支出表) - 字段:`F_Amount`(金额) - 条件: - `F_IsEffective = 1`(有效记录) - `F_StoreId = @StoreId`(门店ID) - `DATE_FORMAT(F_ExpenseDate, '%Y%m') = @MonthStr`(月份,YYYYMM格式) **代码位置**:第283-296行 ### 6. 洗毛巾费用 **数据来源**: - 表:`lq_laundry_flow`(清洗流水表) - 字段:`F_TotalPrice`(总费用) - 条件: - `F_IsEffective = 1`(有效记录) - `F_FlowType = 0`(只统计送出的记录) - `F_StoreId = @StoreId`(门店ID) - 优先使用 `F_SendTime`,如果为空则使用 `F_CreateTime` - `DATE_FORMAT(COALESCE(F_SendTime, F_CreateTime), '%Y%m') = @MonthStr`(月份,YYYYMM格式) **代码位置**:第298-313行 --- ## 🔄 计算流程 ### 步骤1:计算销售业绩 ```csharp // 2.4 计算销售业绩(开单业绩-退款业绩) decimal billing = storeBillingDict.ContainsKey(storeId) ? storeBillingDict[storeId] : 0; decimal refund = storeRefundDict.ContainsKey(storeId) ? storeRefundDict[storeId] : 0; salary.StoreBillingPerformance = billing; salary.StoreRefundPerformance = refund; salary.SalesPerformance = billing - refund; ``` **代码位置**:第402-407行 ### 步骤2:统计各项成本 ```csharp // 2.5 统计各项成本 salary.ProductMaterial = productMaterialDict.ContainsKey(storeId) ? productMaterialDict[storeId] : 0; salary.CooperationCost = cooperationCostDict.ContainsKey(storeId) ? cooperationCostDict[storeId] : 0; salary.StoreExpense = storeExpenseDict.ContainsKey(storeId) ? storeExpenseDict[storeId] : 0; salary.LaundryCost = laundryCostDict.ContainsKey(storeId) ? laundryCostDict[storeId] : 0; ``` **代码位置**:第409-420行 ### 步骤3:计算毛利 ```csharp // 2.6 计算毛利 // 毛利 = 销售业绩 - 产品物料 - 合作项目成本 - 店内支出 - 洗毛巾 salary.GrossProfit = salary.SalesPerformance - salary.ProductMaterial - salary.CooperationCost - salary.StoreExpense - salary.LaundryCost; ``` **代码位置**:第422-424行 ### 步骤4:将毛利赋值给StoreTotalPerformance(用于提成计算) ```csharp // 2.7 将毛利赋值给StoreTotalPerformance(用于提成计算) salary.StoreTotalPerformance = salary.GrossProfit; ``` **代码位置**:第426-427行 **关键点**:`StoreTotalPerformance` 存储的是**毛利**,不是销售业绩。 ### 步骤5:计算业绩完成率(基于毛利) ```csharp // 2.8 计算业绩完成率(基于毛利与生命线比较) if (salary.StoreLifeline > 0) { salary.PerformanceCompletionRate = salary.GrossProfit / salary.StoreLifeline; } ``` **代码位置**:第429-437行 ### 步骤6:判断业绩是否达标(基于毛利) ```csharp // 2.11 计算考核指标(业绩、人头、消耗是否达标) // 业绩达标判断基于毛利 bool performanceReached = salary.GrossProfit >= salary.StoreLifeline; ``` **代码位置**:第445-447行 ### 步骤7:计算提成(基于毛利) ```csharp // 2.14 计算阶梯提成(先计算门店总提成,基于毛利) CalculateCommission(salary, isNewStore); ``` **代码位置**:第495-496行 **提成计算方法**: ```csharp // 提成计算基于毛利(StoreTotalPerformance存储的是毛利) decimal performance = salary.StoreTotalPerformance; // 这里已经是毛利了 decimal lifeline = salary.StoreLifeline; // 计算阶梯提成 if (performance <= lifeline) { // 业绩 ≤ 生命线:只计算≤生命线部分的提成 salary.CommissionAmountBelowLifeline = performance * rateBelowLifeline; salary.CommissionAmountAboveLifeline = 0; } else { // 业绩 > 生命线:分别计算≤生命线部分和>生命线部分的提成 salary.CommissionAmountBelowLifeline = lifeline * rateBelowLifeline; salary.CommissionAmountAboveLifeline = (performance - lifeline) * rateAboveLifeline; } ``` **代码位置**:第567-640行 --- ## 💰 提成规则详解 ### 提成计算方式 **重要说明**: - **提成基数**:使用**毛利**(GrossProfit),不是销售业绩(开单-退卡) - **分段计算**:根据毛利与生命线的比较,分段计算提成 - **阶梯提成模式**:根据毛利是否超过生命线,使用不同的提成比例 ### 老店主任提成规则 根据门店分类(A、B、C类)和毛利是否超过生命线,使用不同的阶梯提成比例: | 门店分类 | 毛利 ≤ 生命线部分 | 毛利 > 生命线部分 | |---------|----------------|-----------------| | A类门店 | 2% | 2.5% | | B类门店 | 2.5% | 3% | | C类门店 | 3% | 3.5% | **计算公式(基于毛利分段计算)**: ``` 如果 毛利 ≤ 生命线: 提成 = 毛利 × 对应提成比例(≤生命线部分) 如果 毛利 > 生命线: 提成 = 生命线 × 对应提成比例(≤生命线部分) + (毛利 - 生命线) × 对应提成比例(>生命线部分) ``` **计算示例**: - 假设:门店生命线 = 100,000元,毛利 = 120,000元,门店分类 = B类(2.5% / 3%) - 计算: - ≤生命线部分:100,000元 × 2.5% = 2,500元 - >生命线部分:(120,000 - 100,000)元 × 3% = 600元 - 总提成:2,500元 + 600元 = 3,100元 ### 新店主任提成规则 **统一标准**,不区分门店分类: | 毛利范围 | 提成比例 | |---------|---------| | 毛利 ≤ 生命线部分 | 2% | | 毛利 > 生命线部分 | 2.5% | **计算公式(基于毛利分段计算)**: ``` 如果 毛利 ≤ 生命线: 提成 = 毛利 × 2% 如果 毛利 > 生命线: 提成 = 生命线 × 2% + (毛利 - 生命线) × 2.5% ``` **计算示例**: - 假设:门店生命线 = 100,000元,毛利 = 120,000元(新店) - 计算: - ≤生命线部分:100,000元 × 2% = 2,000元 - >生命线部分:(120,000 - 100,000)元 × 2.5% = 500元 - 总提成:2,000元 + 500元 = 2,500元 ### 提成按在店天数比例计算 ```csharp // 2.15 按在店天数比例计算提成金额 if (daysInMonth > 0 && workingDays > 0) { // 提成金额按在店天数比例计算 salary.CommissionAmountBelowLifeline = salary.CommissionAmountBelowLifeline / daysInMonth * workingDays; salary.CommissionAmountAboveLifeline = salary.CommissionAmountAboveLifeline / daysInMonth * workingDays; salary.TotalCommissionAmount = salary.CommissionAmountBelowLifeline + salary.CommissionAmountAboveLifeline; } ``` **代码位置**:第498-512行 --- ## 📝 关键字段说明 ### StoreTotalPerformance(门店总业绩) **字段含义**:**毛利** **计算公式**: ``` StoreTotalPerformance = GrossProfit = 销售业绩 - 产品物料 - 合作项目成本 - 店内支出 - 洗毛巾费用 ``` **用途**: - 用于提成计算 - 用于业绩完成率计算 - 用于业绩达标判断 **重要说明**:此字段存储的是**毛利**,不是销售业绩(开单-退卡)。 ### GrossProfit(毛利) **字段含义**:毛利 **计算公式**: ``` GrossProfit = SalesPerformance - ProductMaterial - CooperationCost - StoreExpense - LaundryCost ``` ### SalesPerformance(销售业绩) **字段含义**:销售业绩(开单-退卡) **计算公式**: ``` SalesPerformance = StoreBillingPerformance - StoreRefundPerformance ``` --- ## ✅ 验证要点 ### 1. 业绩就是毛利 - ✅ `StoreTotalPerformance = GrossProfit`(第427行) - ✅ 提成计算使用 `StoreTotalPerformance`(第581行) - ✅ 业绩完成率使用 `GrossProfit`(第432行) - ✅ 业绩达标判断使用 `GrossProfit`(第447行) ### 2. 提成计算基于毛利 - ✅ `CalculateCommission` 方法注释明确说明"基于毛利"(第563行) - ✅ 方法内部使用 `StoreTotalPerformance`(即毛利)进行计算(第581行) - ✅ 所有提成计算都基于 `performance`(即毛利) --- ## 📋 总结 ### 核心结论 1. **业绩(StoreTotalPerformance)就是毛利** - `StoreTotalPerformance = GrossProfit` - 不是销售业绩(开单-退卡) 2. **提成计算基于毛利** - 提成计算使用 `StoreTotalPerformance`(即毛利) - 不是基于销售业绩 3. **毛利计算公式** ``` 毛利 = 销售业绩 - 产品物料 - 合作项目成本 - 店内支出 - 洗毛巾费用 ``` 4. **所有业绩相关的判断都基于毛利** - 业绩完成率 = 毛利 / 生命线 - 业绩达标判断 = 毛利 >= 生命线 - 提成计算 = 基于毛利使用阶梯提成 ### 数据流向 ``` 开单业绩 - 退款业绩 ↓ 销售业绩(SalesPerformance) ↓ 销售业绩 - 产品物料 - 合作项目成本 - 店内支出 - 洗毛巾费用 ↓ 毛利(GrossProfit) ↓ StoreTotalPerformance(用于提成计算) ↓ 阶梯提成计算 ``` --- ## 🔍 代码关键位置 | 功能 | 代码位置 | 说明 | |-----|---------|------| | 计算销售业绩 | 第402-407行 | 开单-退卡 | | 统计各项成本 | 第409-420行 | 产品物料、合作成本、店内支出、洗毛巾 | | 计算毛利 | 第422-424行 | 销售业绩 - 各项成本 | | 将毛利赋值给StoreTotalPerformance | 第426-427行 | **关键:业绩就是毛利** | | 计算业绩完成率 | 第429-437行 | 基于毛利 | | 判断业绩达标 | 第445-447行 | 基于毛利 | | 计算提成 | 第495-496行 | 调用CalculateCommission,基于毛利 | | 提成计算方法 | 第567-640行 | 使用StoreTotalPerformance(即毛利)计算 | --- **文档版本**:2025-01-20 **最后更新**:确认业绩就是毛利,提成计算基于毛利