---
url: /dev/reports/meal-table/index.md
---
# 菜金表

## 功能概述

## 业务对象

| 业务对象 | 说明 |
| --- | --- |
| 菜金计算 | 按工人计算菜金补贴的核心业务对象 |
| 菜金单价 | 各车间菜金补贴单价标准 |

**业务场景描述：**

## 实体设计

**菜金表实体 (RP\_MealTableLine)**

| 字段名称 | 字段编码 | 数据类型 | 必填 | 是否隐藏 | 说明 |
| --- | --- | --- | --- | --- | --- |
| 主键ID | id | 整数 | 自动 | 系统自带 |
| 会计期间 | period | 文本 | 是 | 否 | 会计月份 |
| 车间ID | workshopId | 参照/外键 | 是 | 是 | 关联车间档案ID |
| 工人编码 | workerCode | 文本 | 是 | 否 | 工人工号 |
| 工人姓名 | workerName | 文本 | 是 | 否 | 工人姓名 |
| 部门编码 | deptCode | 参照/外键 | 是 | 是 | 所属部门编码 |
| 出勤天数 | attendanceDays | 整数 | 是 | 否 | 当月实际出勤天数 |
| 菜金单价 | mealPrice | 数值 | 是 | 否 | 每天菜金补贴标准（元/天）(2位小数) |
| 菜金金额 | mealAmount | 数值 | 是 | 否 | 菜金补贴金额（元）(2位小数) |
| 计算状态 | calcStatus | 枚举 | 是 | 否 | 0-未计算/1-已计算/2-已审核 |
| 备注 | remark | 文本 | 否 | 否 | 备注说明 |
| 创建人 | createBy | 文本 | 自动 | 是 | 创建人 |
| 创建时间 | createTime | 日期时间 | 自动 | 是 | 创建时间 |
| 更新人 | updateBy | 文本 | 自动 | 是 | 更新人 |
| 更新时间 | updateTime | 日期时间 | 自动 | 是 | 更新时间 |
| 组织ID | orgId | 参照/外键 | 是 | 是 | 所属组织ID |

## 页面设计

### 页面布局

菜金表页面采用简洁的人员明细报表布局，由筛选区、人员菜金列表区和汇总区组成。

**顶部筛选区：**

* 会计期间选择器
* 车间多选下拉框
* 工人编码/姓名搜索框
* 计算状态筛选
* "执行计算"按钮
* "审核"按钮
* 导出功能

**中间人员菜金列表区：**

* 按车间分组展示工人菜金明细
* 同一车间内按工号排序
* 出勤天数异常值（过低或过高）高亮标注
* 菜金金额列为只读计算列
* 支持批量审核功能

**底部汇总区：**

* 各车间菜金合计
* 全厂菜金合计
* 平均菜金金额
* 各车间菜金占比

### 核心组件

* **报表设计器：** 配置多级分组、条件格式和汇总规则
* **智能分析：** 基于语义模型自动识别出勤异常的工人
* **批量审核：** 支持菜金数据的批量审核功能
* **数据联动：** 菜金计算结果自动联动至工资表

### 交互规则

1. 页面加载时自动加载当前期间的菜金数据
2. 点击"执行计算"按钮按车间菜金单价和出勤天数计算菜金
3. 点击"审核"按钮对菜金数据进行批量审核
4. 支持按车间分组审核
5. 菜金数据审核通过后自动传递至工资表

## 前端脚本

```javascript
// 执行菜金计算
async function onClickCalc() {
    const period = getFilterValue('period');
    showLoading('正在计算菜金...');
    try {
        const result = await calculateMealFee(period);
        renderTable(result.data);
        updateSummary(result.summary);
        showToast('菜金计算完成');
    } catch (e) {
        showError('计算失败：' + e.message);
    } finally {
        hideLoading();
    }
}

// 批量审核
async function onClickBatchApprove() {
    const selectedRows = getSelectedRows();
    if (selectedRows.length === 0) {
        showWarning('请先选择要审核的记录');
        return;
    }
    showConfirm('确认审核选中的 ' + selectedRows.length + ' 条菜金记录？', async () => {
        try {
            await approveMealData(selectedRows);
            showToast('审核成功');
            refreshTable();
        } catch (e) {
            showError('审核失败：' + e.message);
        }
    });
}

// 出勤异常高亮
function highlightAbnormalAttendance() {
    const rows = getTableRows();
    rows.forEach(row => {
        const days = row.getData('AttendanceDays');
        if (days < 15 || days > 31) {
            row.setBackgroundColor('orange');
        }
    });
}

// 工人搜索
async function onWorkerSearch() {
    const keyword = getSearchValue();
    const data = await searchMealData(keyword);
    renderTable(data);
}
```

**计算触发时机：**

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

## 后端脚本

### YonQL 查询

```sql
-- 查询各车间菜金单价标准
SELECT 
    Workshop,
    Price AS MealPrice
FROM MealPriceStandard
WHERE IsActive = 1

-- 查询工人出勤数据
SELECT 
    Workshop,
    WorkerCode,
    WorkerName,
    Department,
    AttendanceDays
FROM WorkerAttendance
WHERE Period = #{period}
```

### 报表计算逻辑

```javascript
async function calculateMealFee(period) {
    // 1. 获取菜金单价标准
    const priceStandards = await queryMealPriceStandards();
    
    // 2. 获取工人出勤数据
    const attendanceData = await queryWorkerAttendance(period);
    
    // 3. 逐工人计算菜金
    for (const worker of attendanceData) {
        const price = priceStandards.find(p => p.Workshop === worker.Workshop);
        const mealPrice = price ? price.MealPrice : 0;
        const mealAmount = mealPrice * worker.AttendanceDays;
        
        await saveMealData({
            Period: period,
            Workshop: worker.Workshop,
            WorkerCode: worker.WorkerCode,
            WorkerName: worker.WorkerName,
            Department: worker.Department,
            AttendanceDays: worker.AttendanceDays,
            MealPrice: mealPrice,
            MealAmount: mealAmount,
            CalcStatus: '已计算'
        });
    }
    
    // 4. 汇总计算
    await summarizeMealByWorkshop(period);
    
    // 5. 联动至工资表
    await syncToSalaryTable(period);
}
```

### 数据汇总

菜金表按车间汇总菜金金额，生成各车间菜金合计数据。审核通过后，菜金数据自动传递至工资表，作为工资计算的组成部分。菜金数据同时纳入车间综合人工成本分析。

## 报表配置

### 报表数据源配置

| 配置项 | 说明 |
| --- | --- |
| 主数据源 | 菜金表实体 (RP\_MealTableLine) |
| 关联数据源 | 菜金单价标准、工人出勤登记、工人档案 |
| 数据类型 | 计算类报表 |
| 语义模型 | 基于"车间-工人-出勤"三维菜金语义模型 |

### 过滤条件

* 会计期间：必选
* 车间：可选，多选
* 工人编码/姓名：可选，模糊搜索
* 计算状态：可选

### 分组统计

* **一级分组：** 车间
* **二级分组：** 部门
* **汇总指标：** 出勤天数合计、菜金金额合计、平均菜金

## 数据权限

### 功能权限

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

### 数据权限规则

1. 车间主任可查看本车间菜金数据并执行计算和审核
2. 人事人员可查看全公司菜金数据并执行计算和审核
3. 财务人员仅可查看菜金数据，不可修改
4. 系统管理员拥有全部权限
5. 菜金数据审核后不可直接修改，需重新计算
6. 所有计算和审核操作需记录操作日志
