feat: 新增多类业务功能并优化页面展示

1. 新增钢卷周期对比查询API,增加冷轧卷、花纹板物料类型
2. 优化库存积压统计逻辑,支持成品和原料数据合并计算
3. 新增告警统计功能,实现长度/厚度告警的数量和重量统计
4. 替换岗位管理页面为冷轧厂业务流程泳道图页面
This commit is contained in:
2026-06-17 11:01:47 +08:00
parent 7b7f4b902e
commit 791be3e1a5
5 changed files with 573 additions and 46 deletions

View File

@@ -123,7 +123,7 @@ import * as echarts from 'echarts'
import { getCoilHoardingStats, listCoilHoardingDetail } from '@/api/cost/coil'
import WarehouseSelect from '@/components/KLPService/WarehouseSelect'
const PRODUCT_NAMES = ['镀锌卷', '镀铬卷', '冷硬卷', '热轧卷板']
const PRODUCT_NAMES = ['镀锌卷', '镀铬卷', '冷硬卷', '热轧卷板', '冷轧卷', '花纹板']
function parseFirstCreateTime(row) {
try {
@@ -237,17 +237,37 @@ export default {
fetchDimension() {
this.dimLoading = true
const base = this.buildQuery()
const promises = PRODUCT_NAMES.map(v => {
const body = { ...base, itemName: v }
return getCoilHoardingStats(body).then(res => ({
const promises = PRODUCT_NAMES.flatMap(v => {
const baseBody = { ...base, itemName: v }
const productReq = getCoilHoardingStats({ ...baseBody, selectType: 'product' }).then(res => ({
label: v,
avgDays: parseFloat((res.data && res.data.avgHoardingDays) || 0),
avgCost: parseFloat((res.data && res.data.avgHoardingCost) || 0),
count: parseInt((res.data && res.data.totalCount) || 0)
}))
const rawReq = getCoilHoardingStats({ ...baseBody, selectType: 'raw_material' }).then(res => ({
label: v,
avgDays: parseFloat((res.data && res.data.avgHoardingDays) || 0),
avgCost: parseFloat((res.data && res.data.avgHoardingCost) || 0),
count: parseInt((res.data && res.data.totalCount) || 0)
}))
return [productReq, rawReq]
})
Promise.all(promises).then(data => {
this.dimensionData = data.filter(d => d.count > 0)
const map = {}
data.forEach(d => {
if (!map[d.label]) {
map[d.label] = { label: d.label, avgDays: 0, avgCost: 0, count: 0 }
}
const prev = map[d.label]
const totalCount = prev.count + d.count
if (totalCount > 0) {
prev.avgDays = parseFloat(((prev.avgDays * prev.count + d.avgDays * d.count) / totalCount).toFixed(2))
prev.avgCost = parseFloat(((prev.avgCost * prev.count + d.avgCost * d.count) / totalCount).toFixed(2))
}
prev.count = totalCount
})
this.dimensionData = Object.values(map).filter(d => d.count > 0)
this.$nextTick(() => this.updateDimChart())
}).finally(() => { this.dimLoading = false })
},