feat(mes/wms): 新增磨辊人管理与免验规则优化

1. 优化wms产线免验逻辑,新增镀铬产线免验支持
2. 新增磨辊人统计报表导出功能
3. 新增磨辊操作人字典维护功能
This commit is contained in:
2026-06-03 15:12:31 +08:00
parent 6fe1f668d3
commit 51bb7593c7
3 changed files with 171 additions and 10 deletions

View File

@@ -78,11 +78,19 @@
<div class="card-header">
<span class="card-title"><i class="el-icon-user" /> 磨辊人统计</span>
<span class="card-subtitle" v-if="operatorStats.length"> {{ operatorStats.length }} </span>
<el-button size="mini" type="primary" plain icon="el-icon-download" style="margin-left:8px" @click="exportOperatorStats" :disabled="!operatorStats.length">导出</el-button>
</div>
<el-table :data="operatorStats" size="small" border stripe style="width:100%"
v-if="operatorStats.length" :default-sort="{ prop: 'totalGrindAmount', order: 'descending' }">
<el-table-column label="序号" type="index" align="center" />
<el-table-column label="磨辊人" prop="operator" sortable />
<el-table-column label="在职状态" align="center" width="90">
<template slot-scope="{row}">
<el-tag :type="operatorStatusType(row.operator)" size="mini" disable-transitions>
{{ operatorStatusLabel(row.operator) }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="CR(中间辊)" align="center">
<el-table-column label="磨削次数" prop="crGrindCount" align="center" sortable />
<el-table-column label="磨削总量(mm)" align="right" sortable>
@@ -128,6 +136,7 @@
<script>
import * as echarts from 'echarts'
import * as XLSX from 'xlsx'
import { getRollStats, listRollInfo } from '@/api/mes/roll/rollInfo'
import { listRollGrindAll } from '@/api/mes/roll/rollGrind'
import rollLineMixin from '../rollLineMixin'
@@ -135,6 +144,7 @@ import rollLineMixin from '../rollLineMixin'
export default {
name: 'RollReport',
mixins: [rollLineMixin],
dicts: ['mes_roll_operator'],
data() {
const now = new Date()
const sevenDaysAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000)
@@ -357,6 +367,20 @@ export default {
this.trendChart && this.trendChart.resize()
this.pieChart && this.pieChart.resize()
},
operatorStatusLabel(name) {
if (!name) return ''
const items = this.dict?.type?.mes_roll_operator || []
const found = items.find(item => item.value === name)
if (!found || !found.raw) return '未知'
return found.raw.status === '0' ? '在职' : '离职'
},
operatorStatusType(name) {
if (!name) return ''
const items = this.dict?.type?.mes_roll_operator || []
const found = items.find(item => item.value === name)
if (!found || !found.raw) return 'info'
return found.raw.status === '0' ? 'success' : 'danger'
},
handleQuery() {
this.loadData()
},
@@ -367,6 +391,35 @@ export default {
const fmt = d => `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`
this.dateRange = [fmt(sevenDaysAgo), fmt(now)]
this.loadData()
},
exportOperatorStats() {
const rows = [
['序号', '磨辊人', '在职状态', 'CR磨削次数', 'CR磨削总量(mm)', 'CR平均磨削量(mm)', 'BR磨削次数', 'BR磨削总量(mm)', 'BR平均磨削量(mm)', 'WR磨削次数', 'WR磨削总量(mm)', 'WR平均磨削量(mm)', '合计磨削次数', '合计磨削总量(mm)', '合计平均磨削量(mm)']
]
this.operatorStats.forEach((item, idx) => {
rows.push([
idx + 1,
item.operator,
this.operatorStatusLabel(item.operator),
item.crGrindCount, item.crTotalGrindAmount, item.crAvgGrindAmount,
item.brGrindCount, item.brTotalGrindAmount, item.brAvgGrindAmount,
item.wrGrindCount, item.wrTotalGrindAmount, item.wrAvgGrindAmount,
item.grindCount, item.totalGrindAmount, item.avgGrindAmount
])
})
const ws = XLSX.utils.aoa_to_sheet(rows)
const wb = XLSX.utils.book_new()
XLSX.utils.book_append_sheet(wb, ws, '磨辊人统计')
const buf = XLSX.write(wb, { bookType: 'xlsx', type: 'array' })
const blob = new Blob([buf], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' })
const url = URL.createObjectURL(blob)
const link = document.createElement('a')
link.href = url
link.download = `磨辊人统计_${this._beginTime || ''}_${this._endTime ? this._endTime.substring(0, 10) : ''}.xlsx`
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
URL.revokeObjectURL(url)
}
}
}