主任工资毛利计算逻辑梳理.md 8.75 KB

主任工资毛利计算逻辑梳理

📋 概述

根据店长工资计算规则,主任工资也需要使用毛利来计算提成,而不是直接使用门店业绩(开单-退卡)。

💰 毛利计算公式

核心公式

毛利 = 销售业绩 - 产品物料 - 合作项目成本 - 店内支出 - 洗毛巾

其中:

  • 销售业绩 = 开单业绩 - 退款业绩
  • 产品物料 = 仓库领用金额合计(注意11月特殊规则:11月工资算10月数据)
  • 合作项目成本 = 合作成本表合计金额
  • 店内支出 = 店内支出表合计金额
  • 洗毛巾 = 送洗记录总费用(只统计送出的记录,F_FlowType = 0)

📊 数据来源

1. 销售业绩

计算公式

销售业绩 = 开单业绩 - 退款业绩

数据来源

  1. 开单业绩

    • 表:lq_kd_kdjlb(开单记录表)
    • 字段:sfyj(实付业绩)
    • 条件:
      • F_IsEffective = 1(有效记录)
      • Djmd = @StoreId(门店ID)
      • DATE_FORMAT(Kdrq, '%Y%m') = @Month(月份,YYYYMM格式)
  2. 退款业绩

    • 表:lq_hytk_hytk(退卡记录表)
    • 字段:F_ActualRefundAmount(实际退款金额)
    • 条件:
      • F_IsEffective = 1(有效记录)
      • md = @StoreId(门店ID)
      • DATE_FORMAT(tksj, '%Y%m') = @Month(月份,YYYYMM格式)

2. 产品物料

计算公式

产品物料 = 仓库领用金额合计

数据来源

  • 表:lq_inventory_usage(库存使用记录表)
  • 字段:F_TotalAmount(合计金额)
  • 条件:
    • F_IsEffective = 1(有效记录)
    • F_StoreId = @StoreId(门店ID)
    • 特殊规则:核算11月工资时,算的是10月份的仓库领用
    • 如果计算月份是11月,则查询10月的数据
    • 其他月份正常查询当月数据

SQL示例

-- 产品物料(特殊规则:11月工资算10月数据)
SET @QueryMonth = @Month;
IF @Month = '202411' THEN
    SET @QueryMonth = '202410';
END IF;

SELECT COALESCE(SUM(F_TotalAmount), 0) as MaterialCost
FROM lq_inventory_usage
WHERE F_StoreId = @StoreId
  AND DATE_FORMAT(F_UsageTime, '%Y%m') = @QueryMonth
  AND F_IsEffective = 1

3. 合作项目成本

计算公式

合作项目成本 = 合作成本表合计金额

数据来源

  • 表:lq_cooperation_cost(合作成本表)
  • 字段:F_TotalAmount(合计金额)
  • 条件:
    • F_StoreId = @StoreId(门店ID)
    • F_Year = @Year(年份)
    • F_Month = @Month(月份,YYYYMM格式)
    • F_IsEffective = 1(有效记录)

4. 店内支出

计算公式

店内支出 = 店内支出表合计金额

数据来源

  • 表:lq_store_expense(店内支出表)
  • 字段:F_Amount(金额)
  • 条件:
    • F_StoreId = @StoreId(门店ID)
    • DATE_FORMAT(F_ExpenseDate, '%Y%m') = @Month(月份,YYYYMM格式)
    • F_IsEffective = 1(有效记录)

5. 洗毛巾费用

计算公式

洗毛巾 = 送洗记录总费用

数据来源

  • 表:lq_laundry_flow(洗毛巾流水表)
  • 字段:F_TotalPrice(总费用)
  • 条件:
    • F_IsEffective = 1(有效记录)
    • F_StoreId = @StoreId(门店ID)
    • F_FlowType = 0(只统计送出的记录)
    • DATE_FORMAT(F_CreateTime, '%Y%m') = @Month(月份,YYYYMM格式)

🔄 修改方案

1. 数据库字段调整

需要新增的字段

lq_director_salary_statistics 表中新增以下字段:

-- 销售业绩(开单业绩-退款业绩)
ALTER TABLE lq_director_salary_statistics 
ADD COLUMN F_SalesPerformance DECIMAL(18,2) DEFAULT 0.00 COMMENT '销售业绩(开单业绩-退款业绩)' AFTER F_StoreRefundPerformance;

-- 产品物料
ALTER TABLE lq_director_salary_statistics 
ADD COLUMN F_ProductMaterial DECIMAL(18,2) DEFAULT 0.00 COMMENT '产品物料(仓库领用金额)' AFTER F_SalesPerformance;

-- 合作项目成本
ALTER TABLE lq_director_salary_statistics 
ADD COLUMN F_CooperationCost DECIMAL(18,2) DEFAULT 0.00 COMMENT '合作项目成本' AFTER F_ProductMaterial;

-- 店内支出
ALTER TABLE lq_director_salary_statistics 
ADD COLUMN F_StoreExpense DECIMAL(18,2) DEFAULT 0.00 COMMENT '店内支出' AFTER F_CooperationCost;

-- 洗毛巾费用
ALTER TABLE lq_director_salary_statistics 
ADD COLUMN F_LaundryCost DECIMAL(18,2) DEFAULT 0.00 COMMENT '洗毛巾费用' AFTER F_StoreExpense;

-- 毛利
ALTER TABLE lq_director_salary_statistics 
ADD COLUMN F_GrossProfit DECIMAL(18,2) DEFAULT 0.00 COMMENT '毛利(销售业绩-产品物料-合作项目成本-店内支出-洗毛巾)' AFTER F_LaundryCost;

字段说明调整

F_StoreTotalPerformance 字段的注释需要修改:

  • 修改前:门店总业绩(门店开单业绩-门店退卡业绩)
  • 修改后:门店总业绩(毛利,用于提成计算)

注意F_StoreTotalPerformance 字段的值应该存储毛利,而不是开单-退卡。


2. 代码逻辑调整

计算流程

  1. 计算销售业绩(开单-退卡)

    salary.SalesPerformance = billing - refund;
    
  2. 统计产品物料(注意11月特殊规则)

    var queryMonth = monthStr;
    if (month == 11)
    {
       queryMonth = $"{year}10"; // 11月工资算10月数据
    }
    salary.ProductMaterial = productMaterialDict.ContainsKey(storeId) ? productMaterialDict[storeId] : 0;
    
  3. 统计合作项目成本

    salary.CooperationCost = cooperationCostDict.ContainsKey(storeId) ? cooperationCostDict[storeId] : 0;
    
  4. 统计店内支出

    salary.StoreExpense = storeExpenseDict.ContainsKey(storeId) ? storeExpenseDict[storeId] : 0;
    
  5. 统计洗毛巾费用(只统计送出的记录)

    salary.LaundryCost = laundryCostDict.ContainsKey(storeId) ? laundryCostDict[storeId] : 0;
    
  6. 计算毛利

    salary.GrossProfit = salary.SalesPerformance - salary.ProductMaterial - salary.CooperationCost - salary.StoreExpense - salary.LaundryCost;
    
  7. 将毛利赋值给 F_StoreTotalPerformance(用于提成计算)

    salary.StoreTotalPerformance = salary.GrossProfit;
    
  8. 计算业绩完成率(基于毛利与生命线比较)

    if (salary.StoreLifeline > 0)
    {
       salary.PerformanceCompletionRate = salary.GrossProfit / salary.StoreLifeline;
    }
    
  9. 判断业绩是否达标(基于毛利)

    bool performanceReached = salary.GrossProfit >= salary.StoreLifeline;
    
  10. 计算提成(基于毛利,使用阶梯提成)

    CalculateCommission(salary, isNewStore); // 提成计算基于毛利
    

3. 提成计算调整

重要说明:提成计算需要基于毛利,而不是销售业绩。

当前提成计算逻辑(阶梯提成):

  • ≤生命线部分:根据门店分类使用不同比例(A类2%,B类2.5%,C类3%)
  • >生命线部分:根据门店分类使用不同比例(A类2.5%,B类3%,C类3.5%)

修改后

  • 提成计算基于毛利salary.GrossProfit
  • 业绩完成率判断基于毛利与生命线比较
  • 业绩达标判断基于毛利是否≥生命线

📝 总结

关键变更点

  1. F_StoreTotalPerformance 字段含义变更

    • 原来:开单业绩 - 退卡业绩
    • 现在:毛利(销售业绩 - 产品物料 - 合作项目成本 - 店内支出 - 洗毛巾)
  2. 需要新增字段

    • F_SalesPerformance:销售业绩(开单-退卡)
    • F_ProductMaterial:产品物料
    • F_CooperationCost:合作项目成本
    • F_StoreExpense:店内支出
    • F_LaundryCost:洗毛巾费用
    • F_GrossProfit:毛利
  3. 计算逻辑调整

    • 先计算销售业绩(开单-退卡)
    • 统计各项成本(产品物料、合作项目成本、店内支出、洗毛巾)
    • 计算毛利
    • 将毛利赋值给 F_StoreTotalPerformance(用于提成计算)
    • 基于毛利计算业绩完成率和判断业绩是否达标
    • 基于毛利计算提成
  4. 数据查询

    • 需要查询 lq_inventory_usage(产品物料)
    • 需要查询 lq_cooperation_cost(合作项目成本)
    • 需要查询 lq_store_expense(店内支出)
    • 需要查询 lq_laundry_flow(洗毛巾费用)

⚠️ 注意事项

  1. 11月特殊规则:核算11月工资时,产品物料算的是10月份的数据
  2. 洗毛巾费用:只统计送出的记录(F_FlowType = 0
  3. 业绩完成率:基于毛利与生命线比较,不是基于销售业绩
  4. 业绩达标判断:基于毛利是否≥生命线
  5. 提成计算:基于毛利,不是基于销售业绩