@@ -2,9 +2,13 @@
< div class = "app-container" v-loading = "loading" >
< el -row >
< el-form label -width = " 80px " inline >
< el-form-item label = "日期" prop = "date" >
< el-date-picker style = "width: 200px;" v-model = "queryParams.date" type="date" value-format="yyyy-MM-dd "
placeholder = "选择日期" @change ="handleDateChange" > < / el -date -picker >
< el-form-item label = "开始 日期" prop = "date" >
< el-date-picker style = "width: 200px;" v-model = "queryParams.byCreateTimeStart" type="date "
value -format = " yyyy -MM -dd " placeholder = "选择日期" > < / el-date-picker>
< / el-form-item >
< el-form-item label = "结束日期" prop = "date" >
< el-date-picker style = "width: 200px;" v-model = "queryParams.byCreateTimeEnd" type="date"
value -format = " yyyy -MM -dd " placeholder = "选择日期" > < / el-date-picker >
< / el-form-item >
< el-form-item label = "班组" prop = "team" >
< el-select v-model = "queryParams.team" placeholder="请选择班组" style="width: 200px;" >
@@ -54,25 +58,36 @@
< el-descriptions-item label = "产出总重" > { { summary . outTotalWeight } } t < / el-descriptions-item >
< el-descriptions-item label = "产出均重" > { { summary . outAvgWeight } } t < / el-descriptions-item >
< el-descriptions-item label = "消耗数量" > { { summary . lossCount } } < / el-descriptions-item >
<!-- < el-descriptions-item label = "消耗数量" > { { summary . lossCount } } < / el-descriptions-item >
< el-descriptions-item label = "消耗总重" > { { summary . lossTotalWeight } } t < / el-descriptions-item >
< el-descriptions-item label = "消耗均重" > { { summary . lossAvgWeight } } t < / el-descriptions-item >
< el-descriptions-item label = "合计数量" > { { summary . totalCount } } < / el-descriptions-item >
< el-descriptions-item label = "合计总重" > { { summary . totalWeight } } t < / el-descriptions-item >
< el-descriptions-item label = "合计均重" > { { summary . totalAvgWeight } } t < / el-descriptions-item >
< el-descriptions-item label = "合计均重" > { { summary . totalAvgWeight } } t < / el-descriptions-item > -- >
<!-- 成品率 -- >
< el-descriptions-item label = "成品率" > { { summary . passRate } } < / el-descriptions-item >
< el-descriptions-item label = "损耗率" > { { summary . lossRate } } < / el-descriptions-item >
<!-- < el-descriptions-item label = "成品率" > { { summary . passRate } } < / el-descriptions-item > -- >
<!-- < el-descriptions-item label = "损耗率" > { { summary . lossRate } } < / el-descriptions-item > -- >
<!-- 异常率 -- >
< el-descriptions-item label = "异常率" > { { summary . abRate } } < / el-descriptions-item >
<!-- < el-descriptions-item label = "异常率" > { { summary . abRate } } < / el-descriptions-item > -- >
< / el-descriptions >
< el-descriptions title = "班组统计信息" :column = "3" border >
< / el-descriptions >
< el-table :data = "teamSummary" border >
< el-table-column label = "班组" align = "center" prop = "team" / >
< el-table-column label = "产出数量" align = "center" prop = "outCount" / >
< el-table-column label = "产出总重" align = "center" prop = "outWeight" / >
<!-- < el-table-column label = "消耗数量" align = "center" prop = "lossCount" / >
< el-table-column label = "消耗总重" align = "center" prop = "lossWeight" / >
< el-table-column label = "成品率" align = "center" prop = "passRate" / > -- >
< / el-table >
< el-descriptions title = "明细信息" :column = "3" border >
< / el-descriptions >
< el-tabs v-model = "activeTab" >
< el -tab -pane label = "损耗 钢卷" name = "loss" >
<!-- < el-tabs v-model = "activeTab" >
< el -tab -pane label = "投入 钢卷" name = "loss" >
< el-table :data = "lossList" border height = "calc(100vh - 320px)" >
< el-table-column label = "入场钢卷号" align = "center" prop = "enterCoilNo" >
< template slot -scope = " scope " >
@@ -86,7 +101,6 @@
< / el-table-column >
< el-table-column label = "创建时间" align = "center" prop = "createTime" / >
< el-table-column label = "逻辑库位" align = "center" prop = "warehouseName" / >
<!-- < el-table-column label = "实际库区" align = "center" prop = "actualWarehouseName" / > -- >
< el-table-column label = "产品类型" align = "center" width = "250" >
< template slot -scope = " scope " >
< ProductInfo v-if = "scope.row.itemType == 'product'" :product="scope.row.product" / >
@@ -99,8 +113,8 @@
< el-table-column label = "更新人" align = "center" prop = "updateByName" / >
< el-table-column label = "更新时间" align = "center" prop = "updateTime" / >
< / el-table >
< / el-tab-pane >
< el-tab-pane label = "产出钢卷" name = "output" >
< / el-tab-pane > -- >
<!-- < el-tab-pane label = "产出钢卷" name = "output" > -- >
< el-table :data = "list" border height = "calc(100vh - 320px)" >
< el-table-column label = "入场钢卷号" align = "center" prop = "enterCoilNo" >
< template slot -scope = " scope " >
@@ -134,8 +148,8 @@
< el-table-column label = "更新人" align = "center" prop = "updateByName" / >
< el-table-column label = "更新时间" align = "center" prop = "updateTime" / >
< / el-table >
< / el-tab-pane >
< / el-tabs >
<!-- < / el-tab-pane > -- >
<!-- < / el-tabs > -- >
< / div >
< / template >
@@ -151,6 +165,7 @@ import CoilNo from "@/components/KLPService/Renderer/CoilNo.vue";
import MemoInput from "@/components/MemoInput" ;
import MutiSelect from "@/components/MutiSelect" ;
import WarehouseSelect from "@/components/KLPService/WarehouseSelect" ;
import { calcSummary , calcAbSummary , calcTeamSummary } from "@/views/wms/report/js/calc" ;
export default {
components : {
@@ -168,15 +183,45 @@ export default {
// 获取当前日期(默认选中当天)
const now = new Date ( )
const currentDate = ` ${ now . getFullYear ( ) } - ${ addZero ( now . getMonth ( ) + 1 ) } - ${ addZero ( now . getDate ( ) ) } `
const currentDate = ` ${ now . getFullYear ( ) } - ${ addZero ( now . getMonth ( ) + 1 ) } `
// 生成指定日期的 00:00:00 和 23:59:59 时间字符串
/**
* 生成指定日期/月份的时间范围字符串
* @param {string} dateStr - 支持格式: yyyy-MM( 月份) 或 yyyy-MM-dd( 具体日期)
* @returns {object} 包含start( 开始时间) 和end( 结束时间) 的对象
*/
const getDayTimeRange = ( dateStr ) => {
return {
start : ` ${ dateStr } 00:00:00 ` ,
end : ` ${ dateStr } 23:59:59 `
// 先校验输入格式是否合法
const monthPattern = /^\d{4}-\d{2}$/ ; // yyyy-MM 正则
const dayPattern = /^\d{4}-\d{2}-\d{2}$/ ; // yyyy-MM-dd 正则
if ( ! monthPattern . test ( dateStr ) && ! dayPattern . test ( dateStr ) ) {
throw new Error ( '输入格式错误,请传入 yyyy-MM 或 yyyy-MM-dd 格式的字符串' ) ;
}
}
let startDate , endDate ;
if ( monthPattern . test ( dateStr ) ) {
// 处理 yyyy-MM 格式:获取本月第一天和最后一天
const [ year , month ] = dateStr . split ( '-' ) . map ( Number ) ;
// 月份是0基的( 0=1月, 1=2月...) , 所以要减1
// 第一天: yyyy-MM-01
startDate = ` ${ dateStr } -01 ` ;
// 最后一天:通过 new Date(year, month, 0) 计算( month是原始月份, 比如2代表2月, 传2则取3月0日=2月最后一天)
const lastDayOfMonth = new Date ( year , month , 0 ) . getDate ( ) ;
endDate = ` ${ dateStr } - ${ lastDayOfMonth . toString ( ) . padStart ( 2 , '0' ) } ` ;
} else {
// 处理 yyyy-MM-dd 格式:直接使用传入的日期
startDate = dateStr ;
endDate = dateStr ;
}
// 拼接时间部分
return {
start : ` ${ startDate } 00:00:00 ` ,
end : ` ${ endDate } 23:59:59 `
} ;
} ;
const { start , end } = getDayTimeRange ( currentDate )
@@ -267,47 +312,41 @@ export default {
} ,
computed : {
summary ( ) {
// 总钢卷数量、总重、均重
const outCount = this . list . length
const outTotalWeight = this . list . reduce ( ( acc , cur ) => acc + ( parseFloat ( cur . netWeight ) || 0 ) , 0 ) // 增加容错
const outAvgWeight = outCount > 0 ? ( outTotalWeight / outCount ) ? . toFixed ( 2 ) : 0
return calcSummary ( this . list , this . lossList )
} ,
// 合并两个汇总结果并转换为目标数组的方法
teamSummary ( ) {
const teamOutSummary = calcTeamSummary ( this . list ) ;
// const teamLossSummary = calcTeamSummary(this.lossList);
// 损失钢卷数量、总重、均重
const lossCount = this . lossList . length
const lossTotalWeight = this . lossList . reduce ( ( acc , cur ) => acc + ( parseFloat ( cur . netWeight ) || 0 ) , 0 ) // 增加容错
const lossAvgWeight = lossCount > 0 ? ( lossTotalWeight / lossCount ) ? . toFixed ( 2 ) : 0
// 合计数量、总重、均重
const totalCount = outCount + lossCount
const totalWeight = parseFloat ( ( outTotalWeight + lossTotalWeight ) . toFixed ( 2 ) )
const totalAvgWeight = totalCount > 0 ? ( totalWeight / totalCount ) ? . toFixed ( 2 ) : 0
const allTeams = [ ... new Set ( [
... Object . keys ( teamOutSummary ) ,
// ...Object.keys(teamLossSummary)
] ) ] ;
// 成品比率
const passRate = outCount > 0 ? ( outCount / lossCount ) : 0
// 损失比率
const lossRate = 1 - passRate
// 异常率,成品在warehouseId在'2019583656787259393',
// '2019583325311414274',
// '2019583429955104769',
// '2019583137616310273',这四个库中的占比
const abRate = this . list . filter ( item => {
return item . warehouseId == '2019583656787259393' || item . warehouseId == '2019583325311414274' || item . warehouseId == '2019583429955104769' || item . warehouseId == '2019583137616310273'
} ) . length / totalCount
const result = allTeams . map ( team => {
const outData = teamOutSummary [ team ] || { count : 0 , weight : 0 } ;
// const lossData = teamLossSummary[team] || { count: 0, weight: 0 };
// 核心修复:先确保是有效数字,再保留两位小数
const formatWeight = ( weight ) => {
// 步骤1: 转数字, 非数字则置为0; 步骤2: 保留两位小数
return Number ( weight || 0 ) . toFixed ( 2 ) ;
// 如果需要返回数字类型(而非字符串),用这行:
// return Number(Number(weight || 0).toFixed(2));
} ;
return {
outCount ,
outTotalWeight : outTotalWeight . toFixed ( 2 ) ,
outAvgWeight ,
lossCount,
lossTotalWeight : lossTotalWeight . toFixed ( 2 ) ,
lossAvgWeight ,
totalCount ,
totalWeight : totalWeight . toFixed ( 2 ) ,
totalAvgWeight ,
passRate : passRate ? . toFixed ( 2 ) * 100 + '%' ,
lossRate : lossRate ? . toFixed ( 2 ) * 100 + '%' ,
abRate : ( abRate ? . toFixed ( 2 ) * 100 ) || 0 + '%' ,
}
return {
team : team ,
outCount : outData . count ,
outWeight : formatWeight ( outData . weight ) , // 格式化出库重量
// lossCount: lossData.count,
// lossWeight: formatWeight(lossData.weight), // 格式化损耗重量
// passRate: (outData.weight / lossData.weight * 100).toFixed(2) + '%' , // 计算成品率
} ;
} ) ;
return result ;
}
} ,
methods : {
@@ -344,7 +383,7 @@ export default {
( a , b ) => new Date ( b . createTime ) - new Date ( a . createTime )
)
this . loading = false
this . getLossList( )
// this. getLossList()
} ) . catch ( err => { // 增加错误处理
console . error ( '查询失败:' , err )
this . loading = false