---
url: /dev/reports/material-consumption/index.md
---
# 物料消耗计算表

## 功能概述

物料消耗计算表用于计算各车间产品的物料消耗量，基于BOM（物料清单）和实际产量数据，结合消耗范围组中的奖惩规则，计算物料消耗的节约或超支金额。该报表是车间考核体系中的核心环节，直接关系到产品成本核算和车间绩效评定。

## 业务对象

| 业务对象 | 说明 |
| --- | --- |
| 物料消耗计算 | 物料消耗计算的核心业务对象，包含计算规则和结果 |
| 消耗范围组 | 物料消耗的奖惩规则配置，定义消耗合格范围和奖惩比例 |

**业务场景描述：** 每月末结账后，系统根据各车间的成品入库数量和对应的BOM清单，计算各产品应消耗的原材料数量，再与实际领用数量进行对比，得出节约或超支情况，并按照消耗范围组配置的奖惩规则计算奖惩金额。

## 实体设计

**物料消耗计算表实体 (RP\_MaterialConsumptionLine)**

| 字段名称 | 字段编码 | 数据类型 | 必填 | 是否隐藏 | 说明 |
| --- | --- | --- | --- | --- | --- |
| 主键ID | id | 整数 | 自动 | 系统自带 |
| 会计期间 | period | 文本 | 是 | 否 | 会计月份，格式为YYYY-MM |
| 车间ID | workshopId | 参照/外键 | 是 | 是 | 关联车间档案ID |
| 产品编码 | productCode | 文本 | 是 | 否 | 产品料号编码 |
| 产品名称 | productName | 文本 | 是 | 否 | 产品名称 |
| BOM版本 | bomVersion | 文本 | 是 | 否 | 物料清单版本号 |
| 产量 | outputQty | 数值 | 是 | 否 | 实际入库产量(2位小数) |
| 标准消耗量 | standardQty | 数值 | 是 | 否 | 按BOM计算的标准消耗量(2位小数) |
| 实际消耗量 | actualQty | 数值 | 是 | 否 | 实际领用消耗量(2位小数) |
| 差异量 | diffQty | 数值 | 是 | 否 | 实际与标准的差异(2位小数) |
| 差异率 | diffRate | 数值 | 是 | 否 | 差异百分比(2位小数) |
| 奖惩金额 | rewardAmount | 数值 | 是 | 否 | 按规则计算的奖惩金额(2位小数) |
| 计算状态 | calcStatus | 枚举 | 是 | 否 | 0-未计算/1-已计算/2-已审核 |
| 备注 | remark | 文本 | 否 | 否 | 备注说明 |
| 创建人 | createBy | 文本 | 自动 | 是 | 创建人 |
| 创建时间 | createTime | 日期时间 | 自动 | 是 | 创建时间 |
| 更新人 | updateBy | 文本 | 自动 | 是 | 更新人 |
| 更新时间 | updateTime | 日期时间 | 自动 | 是 | 更新时间 |
| 组织ID | orgId | 参照/外键 | 是 | 是 | 所属组织ID |

## 页面设计

### 页面布局

物料消耗计算表页面采用典型的报表布局结构，由顶部筛选区、中间数据表格区和底部汇总区三部分组成。

**顶部筛选区：**

* 会计期间选择器（默认当前月份）
* 车间多选下拉框
* 产品编码模糊搜索框
* 计算状态筛选
* "执行计算"按钮
* "导出Excel"按钮

**中间数据表格区：**

* 按车间分组展示各产品的物料消耗明细
* 支持按车间/产品折叠展开
* 差异量和差异率超阈值行高亮显示（红色超支、绿色节约）
* 每行显示计算状态标签

**底部汇总区：**

* 各车间产量合计
* 标准消耗量合计与实际消耗量合计
* 奖惩金额合计

### 核心组件

* **报表设计器：** 使用YonBIP报表设计器配置数据列、分组、汇总规则
* **智能分析：** 基于语义模型自动识别异常数据，提供超支原因分析建议
* **条件格式：** 差异率超过阈值时自动标红预警

### 交互规则

1. 首次打开页面时，根据当前会计期间自动加载已有计算数据
2. 点击"执行计算"按钮触发后端计算流程，重新计算所有物料消耗数据
3. 计算完成后自动刷新页面数据，差异率超阈值的行高亮显示
4. 支持点击单条记录查看详细的BOM展开和领用明细

## 前端脚本

```javascript
// 页面加载时自动加载当前期间的计算数据
async function onPageLoad() {
    const period = getCurrentPeriod();
    const data = await fetchConsumptionData(period);
    setTableData(data);
    applyConditionalFormat();
}

// 执行计算按钮事件
async function onClickCalc() {
    const period = getFilterValue('period');
    const workshop = getFilterValue('workshop');
    showLoading('正在计算物料消耗...');
    try {
        const result = await triggerCalculation(period, workshop);
        setTableData(result.data);
        applyConditionalFormat();
        showToast('计算完成，共处理 ' + result.count + ' 条记录');
    } catch (e) {
        showError('计算失败：' + e.message);
    } finally {
        hideLoading();
    }
}

// 条件格式：差异率超阈值标红
function applyConditionalFormat() {
    const rows = getTableRows();
    rows.forEach(row => {
        const diffRate = row.getData('DiffRate');
        const threshold = getConsumptionThreshold(row.getData('Workshop'));
        if (diffRate > threshold) {
            row.setBackgroundColor('red');
        } else if (diffRate < 0) {
            row.setBackgroundColor('green');
        }
    });
}
```

**计算触发时机：**

* 页面首次加载时自动加载已有数据
* 用户点击"执行计算"按钮时触发全量计算
* 支持按车间维度单独计算

## 后端脚本

### YonQL 查询

```sql
-- 查询成品入库数量
SELECT 
    Workshop,
    ProductCode,
    SUM(InQty) AS OutputQty
FROM InboundOrder
WHERE Period = #{period}
AND Workshop IN (#{workshops})
GROUP BY Workshop, ProductCode

-- 查询实际领用数量
SELECT 
    c.Workshop,
    c.ProductCode,
    SUM(c.UseQty) AS ActualQty
FROM MaterialUse c
WHERE c.Period = #{period}
GROUP BY c.Workshop, c.ProductCode

-- 查询BOM标准用量
SELECT 
    b.Workshop,
    b.ProductCode,
    b.MaterialCode,
    b.UnitUsage
FROM BOM b
WHERE b.IsActive = 1
```

### 报表计算逻辑

```javascript
// 物料消耗核心计算流程
async function calculateMaterialConsumption(period, workshops) {
    // 1. 获取各车间各产品的产量
    const outputData = await queryOutputByWorkshop(period, workshops);
    
    // 2. 获取BOM标准
    const bomData = await queryBOM();
    
    // 3. 获取实际领用数据
    const actualData = await queryActualUsage(period, workshops);
    
    // 4. 获取消耗范围组规则
    const scopeRules = await queryConsumptionScope(workshops);
    
    // 5. 逐产品计算标准消耗量、差异量、奖惩金额
    for (const item of outputData) {
        const bom = bomData.find(b => b.ProductCode === item.ProductCode);
        const standardQty = calcStandardUsage(bom, item.OutputQty);
        const actualQty = getActualUsage(actualData, item);
        const diff = actualQty - standardQty;
        const rate = diff / standardQty;
        const reward = calcReward(scopeRules, item.Workshop, rate, diff);
        
        await saveCalculationResult({
            Period: period,
            Workshop: item.Workshop,
            ProductCode: item.ProductCode,
            OutputQty: item.OutputQty,
            StandardQty: standardQty,
            ActualQty: actualQty,
            DiffQty: diff,
            DiffRate: rate,
            RewardAmount: reward
        });
    }
}
```

### 数据汇总

计算完成后，系统按车间维度自动汇总奖惩金额，作为车间绩效考核的重要输入数据。汇总结果同步至工资计算模块，用于扣减或增加车间总工资额度。

## 报表配置

### 报表数据源配置

| 配置项 | 说明 |
| --- | --- |
| 主数据源 | 物料消耗计算表实体 (RP\_MaterialConsumptionLine) |
| 关联数据源 | BOM实体、成品入库单、材料领用单、消耗范围组 |
| 数据类型 | 汇总计算类报表 |
| 语义模型 | 基于"车间-产品-物料"三级语义模型 |

### 过滤条件

* 会计期间：必选，默认当前月份
* 车间：可选，多选
* 产品编码：可选，模糊搜索
* 计算状态：可选，支持未计算/已计算/已审核

### 分组统计

* **一级分组：** 车间
* **二级分组：** 产品
* **汇总指标：** 产量合计、标准消耗量合计、实际消耗量合计、差异量合计、奖惩金额合计

## 数据权限

### 功能权限

| 角色 | 查看 | 计算 | 审核 | 导出 |
| --- | --- | --- | --- | --- |
| 车间主任 | ✅ | ✅ | ✅ | ✅ |
| 财务人员 | ✅ | ✅ | ✅ | ✅ |
| 系统管理员 | ✅ | ✅ | ✅ | ✅ |
| 普通用户 | ✅ | ❌ | ❌ | ❌ |

### 数据权限规则

1. 车间主任仅可查看和操作本车间的物料消耗数据
2. 财务人员可查看所有车间数据，但计算和审核需记录操作日志
3. 系统管理员拥有全部权限
4. 普通用户仅具备只读权限，不可执行计算和审核操作
5. 所有计算操作均记录操作人、操作时间和操作内容
