主任工资计算逻辑完整梳理.md 11.6 KB

主任工资计算逻辑完整梳理

📋 概述

主任工资由以下几个部分组成:

  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:计算销售业绩

// 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:统计各项成本

// 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:计算毛利

// 2.6 计算毛利
// 毛利 = 销售业绩 - 产品物料 - 合作项目成本 - 店内支出 - 洗毛巾
salary.GrossProfit = salary.SalesPerformance - salary.ProductMaterial - salary.CooperationCost - salary.StoreExpense - salary.LaundryCost;

代码位置:第422-424行

步骤4:将毛利赋值给StoreTotalPerformance(用于提成计算)

// 2.7 将毛利赋值给StoreTotalPerformance(用于提成计算)
salary.StoreTotalPerformance = salary.GrossProfit;

代码位置:第426-427行

关键点StoreTotalPerformance 存储的是毛利,不是销售业绩。

步骤5:计算业绩完成率(基于毛利)

// 2.8 计算业绩完成率(基于毛利与生命线比较)
if (salary.StoreLifeline > 0)
{
    salary.PerformanceCompletionRate = salary.GrossProfit / salary.StoreLifeline;
}

代码位置:第429-437行

步骤6:判断业绩是否达标(基于毛利)

// 2.11 计算考核指标(业绩、人头、消耗是否达标)
// 业绩达标判断基于毛利
bool performanceReached = salary.GrossProfit >= salary.StoreLifeline;

代码位置:第445-447行

步骤7:计算提成(基于毛利)

// 2.14 计算阶梯提成(先计算门店总提成,基于毛利)
CalculateCommission(salary, isNewStore);

代码位置:第495-496行

提成计算方法

// 提成计算基于毛利(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元

提成按在店天数比例计算

// 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 最后更新:确认业绩就是毛利,提成计算基于毛利