主任工资毛利计算逻辑梳理.md
8.75 KB
主任工资毛利计算逻辑梳理
📋 概述
根据店长工资计算规则,主任工资也需要使用毛利来计算提成,而不是直接使用门店业绩(开单-退卡)。
💰 毛利计算公式
核心公式
毛利 = 销售业绩 - 产品物料 - 合作项目成本 - 店内支出 - 洗毛巾
其中:
- 销售业绩 = 开单业绩 - 退款业绩
- 产品物料 = 仓库领用金额合计(注意11月特殊规则:11月工资算10月数据)
- 合作项目成本 = 合作成本表合计金额
- 店内支出 = 店内支出表合计金额
- 洗毛巾 = 送洗记录总费用(只统计送出的记录,F_FlowType = 0)
📊 数据来源
1. 销售业绩
计算公式:
销售业绩 = 开单业绩 - 退款业绩
数据来源:
开单业绩:
- 表:
lq_kd_kdjlb(开单记录表) - 字段:
sfyj(实付业绩) - 条件:
F_IsEffective = 1(有效记录)Djmd = @StoreId(门店ID)DATE_FORMAT(Kdrq, '%Y%m') = @Month(月份,YYYYMM格式)
- 表:
退款业绩:
- 表:
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. 代码逻辑调整
计算流程
计算销售业绩(开单-退卡)
salary.SalesPerformance = billing - refund;统计产品物料(注意11月特殊规则)
var queryMonth = monthStr; if (month == 11) { queryMonth = $"{year}10"; // 11月工资算10月数据 } 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;计算毛利
salary.GrossProfit = salary.SalesPerformance - salary.ProductMaterial - salary.CooperationCost - salary.StoreExpense - salary.LaundryCost;将毛利赋值给 F_StoreTotalPerformance(用于提成计算)
salary.StoreTotalPerformance = salary.GrossProfit;计算业绩完成率(基于毛利与生命线比较)
if (salary.StoreLifeline > 0) { salary.PerformanceCompletionRate = salary.GrossProfit / salary.StoreLifeline; }判断业绩是否达标(基于毛利)
bool performanceReached = salary.GrossProfit >= salary.StoreLifeline;计算提成(基于毛利,使用阶梯提成)
CalculateCommission(salary, isNewStore); // 提成计算基于毛利
3. 提成计算调整
重要说明:提成计算需要基于毛利,而不是销售业绩。
当前提成计算逻辑(阶梯提成):
- ≤生命线部分:根据门店分类使用不同比例(A类2%,B类2.5%,C类3%)
- >生命线部分:根据门店分类使用不同比例(A类2.5%,B类3%,C类3.5%)
修改后:
- 提成计算基于毛利(
salary.GrossProfit) - 业绩完成率判断基于毛利与生命线比较
- 业绩达标判断基于毛利是否≥生命线
📝 总结
关键变更点
F_StoreTotalPerformance 字段含义变更:
- 原来:开单业绩 - 退卡业绩
- 现在:毛利(销售业绩 - 产品物料 - 合作项目成本 - 店内支出 - 洗毛巾)
需要新增字段:
F_SalesPerformance:销售业绩(开单-退卡)F_ProductMaterial:产品物料F_CooperationCost:合作项目成本F_StoreExpense:店内支出F_LaundryCost:洗毛巾费用F_GrossProfit:毛利
计算逻辑调整:
- 先计算销售业绩(开单-退卡)
- 统计各项成本(产品物料、合作项目成本、店内支出、洗毛巾)
- 计算毛利
- 将毛利赋值给
F_StoreTotalPerformance(用于提成计算) - 基于毛利计算业绩完成率和判断业绩是否达标
- 基于毛利计算提成
数据查询:
- 需要查询
lq_inventory_usage(产品物料) - 需要查询
lq_cooperation_cost(合作项目成本) - 需要查询
lq_store_expense(店内支出) - 需要查询
lq_laundry_flow(洗毛巾费用)
- 需要查询
⚠️ 注意事项
- 11月特殊规则:核算11月工资时,产品物料算的是10月份的数据
- 洗毛巾费用:只统计送出的记录(
F_FlowType = 0) - 业绩完成率:基于毛利与生命线比较,不是基于销售业绩
- 业绩达标判断:基于毛利是否≥生命线
- 提成计算:基于毛利,不是基于销售业绩