# 主任工资毛利计算逻辑梳理 ## 📋 概述 根据店长工资计算规则,主任工资也需要使用**毛利**来计算提成,而不是直接使用门店业绩(开单-退卡)。 ## 💰 毛利计算公式 ### 核心公式 ``` 毛利 = 销售业绩 - 产品物料 - 合作项目成本 - 店内支出 - 洗毛巾 ``` 其中: - **销售业绩** = 开单业绩 - 退款业绩 - **产品物料** = 仓库领用金额合计(注意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示例**: ```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` 表中新增以下字段: ```sql -- 销售业绩(开单业绩-退款业绩) 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. **计算销售业绩**(开单-退卡) ```csharp salary.SalesPerformance = billing - refund; ``` 2. **统计产品物料**(注意11月特殊规则) ```csharp var queryMonth = monthStr; if (month == 11) { queryMonth = $"{year}10"; // 11月工资算10月数据 } salary.ProductMaterial = productMaterialDict.ContainsKey(storeId) ? productMaterialDict[storeId] : 0; ``` 3. **统计合作项目成本** ```csharp salary.CooperationCost = cooperationCostDict.ContainsKey(storeId) ? cooperationCostDict[storeId] : 0; ``` 4. **统计店内支出** ```csharp salary.StoreExpense = storeExpenseDict.ContainsKey(storeId) ? storeExpenseDict[storeId] : 0; ``` 5. **统计洗毛巾费用**(只统计送出的记录) ```csharp salary.LaundryCost = laundryCostDict.ContainsKey(storeId) ? laundryCostDict[storeId] : 0; ``` 6. **计算毛利** ```csharp salary.GrossProfit = salary.SalesPerformance - salary.ProductMaterial - salary.CooperationCost - salary.StoreExpense - salary.LaundryCost; ``` 7. **将毛利赋值给 F_StoreTotalPerformance**(用于提成计算) ```csharp salary.StoreTotalPerformance = salary.GrossProfit; ``` 8. **计算业绩完成率**(基于毛利与生命线比较) ```csharp if (salary.StoreLifeline > 0) { salary.PerformanceCompletionRate = salary.GrossProfit / salary.StoreLifeline; } ``` 9. **判断业绩是否达标**(基于毛利) ```csharp bool performanceReached = salary.GrossProfit >= salary.StoreLifeline; ``` 10. **计算提成**(基于毛利,使用阶梯提成) ```csharp 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. **提成计算**:基于毛利,不是基于销售业绩