|
|
|
@ -174,14 +174,17 @@ |
|
|
|
<el-col :span="24"> |
|
|
|
<el-col :span="24"> |
|
|
|
<div class="info-item-txt info-item-info"> |
|
|
|
<div class="info-item-txt info-item-info"> |
|
|
|
<span class="order-code" style="font-weight: 600">{{ order.woCode }}</span> |
|
|
|
<span class="order-code" style="font-weight: 600">{{ order.woCode }}</span> |
|
|
|
|
|
|
|
|
|
|
|
<span class="part-code">{{ order.partCode }}</span> |
|
|
|
<span class="part-code">{{ order.partCode }}</span> |
|
|
|
|
|
|
|
<span class="make-qty">{{ order.makeQty }}</span> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</el-col> |
|
|
|
</el-col> |
|
|
|
<el-col :span="24"> |
|
|
|
<el-col :span="24"> |
|
|
|
<div class="info-item-txt info-item-orderInfo"> |
|
|
|
<div class="info-item-txt info-item-orderInfo"> |
|
|
|
<div class="info-item-content"> |
|
|
|
<div class="info-item-content"> |
|
|
|
|
|
|
|
<span class="batch-data">{{ order.releaseDate }}</span> |
|
|
|
<span class="batch-no">{{ order.batchNo }}</span> |
|
|
|
<span class="batch-no">{{ order.batchNo }}</span> |
|
|
|
<span class="make-qty">{{ order.makeQty }}</span> |
|
|
|
|
|
|
|
<span class="product-ident">{{ order.productIdent }}</span> |
|
|
|
<span class="product-ident">{{ order.productIdent }}</span> |
|
|
|
<span v-if="order.priorityAps != ''" class="priority-aps">{{ |
|
|
|
<span v-if="order.priorityAps != ''" class="priority-aps">{{ |
|
|
|
order.priorityAps |
|
|
|
order.priorityAps |
|
|
|
@ -303,7 +306,6 @@ |
|
|
|
v-for="(task, taskIndex) in layer" |
|
|
|
v-for="(task, taskIndex) in layer" |
|
|
|
:key="taskIndex" |
|
|
|
:key="taskIndex" |
|
|
|
class="task-bar" |
|
|
|
class="task-bar" |
|
|
|
|
|
|
|
|
|
|
|
:class="{ |
|
|
|
:class="{ |
|
|
|
'task-bar-narrow': |
|
|
|
'task-bar-narrow': |
|
|
|
getWidthPercent(task.planStartTime, task.planEndTime) < 2.1, |
|
|
|
getWidthPercent(task.planStartTime, task.planEndTime) < 2.1, |
|
|
|
@ -408,7 +410,7 @@ |
|
|
|
<span class="label">数量:</span> |
|
|
|
<span class="label">数量:</span> |
|
|
|
<span class="value">{{ tooltipData.makeQty || '-' }}</span> |
|
|
|
<span class="value">{{ tooltipData.makeQty || '-' }}</span> |
|
|
|
</li> |
|
|
|
</li> |
|
|
|
<li class="detail-item"> |
|
|
|
<li class="detail-item"> |
|
|
|
<span class="label">计划人员:</span> |
|
|
|
<span class="label">计划人员:</span> |
|
|
|
<span class="value">{{ tooltipData.teamMembers || '-' }}</span> |
|
|
|
<span class="value">{{ tooltipData.teamMembers || '-' }}</span> |
|
|
|
</li> |
|
|
|
</li> |
|
|
|
@ -788,7 +790,7 @@ export default { |
|
|
|
batchNo: task.batchNo, |
|
|
|
batchNo: task.batchNo, |
|
|
|
woCode: task.woCode, |
|
|
|
woCode: task.woCode, |
|
|
|
partCode: task.partCode, |
|
|
|
partCode: task.partCode, |
|
|
|
cardNo: task.cardNo |
|
|
|
cardNo: task.cardNo, |
|
|
|
}, |
|
|
|
}, |
|
|
|
'*' // 生产环境建议指定父页面域名(如 "https://parent-domain.com"),避免安全风险 |
|
|
|
'*' // 生产环境建议指定父页面域名(如 "https://parent-domain.com"),避免安全风险 |
|
|
|
); |
|
|
|
); |
|
|
|
@ -1075,85 +1077,101 @@ export default { |
|
|
|
// 数据处理 |
|
|
|
// 数据处理 |
|
|
|
processData(rawData) { |
|
|
|
processData(rawData) { |
|
|
|
const tasks = []; |
|
|
|
const tasks = []; |
|
|
|
const orders = []; |
|
|
|
const orders = []; |
|
|
|
|
|
|
|
|
|
|
|
// 遍历数组对象 |
|
|
|
rawData.forEach(item => { |
|
|
|
rawData.forEach(item => { |
|
|
|
const woCode = item.woCode; |
|
|
|
const woCode = item.woCode; // 提取车间订单号 |
|
|
|
const woTasks = item.workOrderList || []; |
|
|
|
const woTasks = item.workOrderList || []; // 提取任务列表 |
|
|
|
|
|
|
|
|
|
|
|
if (woTasks.length > 0) { |
|
|
|
// 提取订单信息(取第一个任务的基础信息) |
|
|
|
const firstTask = woTasks[0]; |
|
|
|
if (woTasks.length > 0) { |
|
|
|
orders.push({ |
|
|
|
const firstTask = woTasks[0]; |
|
|
|
woCode, |
|
|
|
orders.push({ |
|
|
|
partCode: firstTask.partCode, |
|
|
|
woCode, |
|
|
|
batchNo: firstTask.batchNo, |
|
|
|
partCode: firstTask.partCode, |
|
|
|
makeQty: firstTask.makeQty, |
|
|
|
batchNo: firstTask.batchNo, |
|
|
|
productIdent: firstTask.productIdent, |
|
|
|
makeQty: firstTask.makeQty, |
|
|
|
priorityAps: firstTask.priorityAps, |
|
|
|
productIdent: firstTask.productIdent, |
|
|
|
teamMembers: firstTask.teamMembers, |
|
|
|
priorityAps: firstTask.priorityAps, |
|
|
|
releaseDate: firstTask.releaseDate, // 假设这里存在 |
|
|
|
teamMembers:firstTask.teamMembers, |
|
|
|
}); |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 按工序名称分组并合并任务 |
|
|
|
// ... 合并任务逻辑保持不变 ... |
|
|
|
const groupedTasks = {}; |
|
|
|
const groupedTasks = {}; |
|
|
|
woTasks.forEach(task => { |
|
|
|
woTasks.forEach(task => { |
|
|
|
if (!groupedTasks[task.processName]) { |
|
|
|
if (!groupedTasks[task.processName]) { |
|
|
|
groupedTasks[task.processName] = []; |
|
|
|
groupedTasks[task.processName] = []; |
|
|
|
} |
|
|
|
} |
|
|
|
groupedTasks[task.processName].push(task); |
|
|
|
groupedTasks[task.processName].push(task); |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
console.log(89898989, groupedTasks); |
|
|
|
|
|
|
|
|
|
|
|
// 合并相同工序的任务 |
|
|
|
Object.values(groupedTasks).forEach(group => { |
|
|
|
Object.values(groupedTasks).forEach(group => { |
|
|
|
// 按计划开始时间升序排序 |
|
|
|
// 按开始时间排序 |
|
|
|
const sortedTasks = [...group].sort((a, b) => { |
|
|
|
const sortedTasks = [...group].sort((a, b) => { |
|
|
|
return new Date(a.planStartTime) - new Date(b.planStartTime); |
|
|
|
const aStart = this.parseTimeToHours(a.planStartTime); |
|
|
|
}); |
|
|
|
const bStart = this.parseTimeToHours(b.planStartTime); |
|
|
|
|
|
|
|
return aStart - bStart; |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 合并符合条件的任务 |
|
|
|
const mergedTasks = []; |
|
|
|
const mergedTasks = []; |
|
|
|
let currentMergedTask = null; |
|
|
|
let currentMergedTask = null; |
|
|
|
|
|
|
|
|
|
|
|
sortedTasks.forEach(task => { |
|
|
|
|
|
|
|
if (!currentMergedTask) { |
|
|
|
|
|
|
|
currentMergedTask = { ...task }; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
const prevEndTime = new Date(currentMergedTask.planEndTime); |
|
|
|
|
|
|
|
const currStartTime = new Date(task.planStartTime); |
|
|
|
|
|
|
|
const currEndTime = new Date(task.planEndTime); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 判断是否重叠或连续:当前任务开始时间 <= 已合并任务的结束时间 |
|
|
|
|
|
|
|
if (currStartTime.getTime() <= prevEndTime.getTime()) { |
|
|
|
|
|
|
|
// 合并时间区间:结束时间取最大值 |
|
|
|
|
|
|
|
if (currEndTime.getTime() > prevEndTime.getTime()) { |
|
|
|
|
|
|
|
currentMergedTask.planEndTime = task.planEndTime; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// 可选:合并其他字段,如数量、人员等 |
|
|
|
|
|
|
|
// currentMergedTask.makeQty += task.makeQty; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
// 无重叠,推入并开启新合并任务 |
|
|
|
|
|
|
|
mergedTasks.push(currentMergedTask); |
|
|
|
|
|
|
|
currentMergedTask = { ...task }; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
sortedTasks.forEach(task => { |
|
|
|
if (currentMergedTask) { |
|
|
|
if (!currentMergedTask) { |
|
|
|
|
|
|
|
// 初始化第一个任务 |
|
|
|
|
|
|
|
currentMergedTask = { ...task }; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
// 检查当前任务的开始时间是否等于前一个任务的结束时间 |
|
|
|
|
|
|
|
const prevEnd = this.parseTimeToHours(currentMergedTask.planEndTime); |
|
|
|
|
|
|
|
const currStart = this.parseTimeToHours(task.planStartTime); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (prevEnd === currStart) { |
|
|
|
|
|
|
|
// 合并任务:更新结束时间 |
|
|
|
|
|
|
|
currentMergedTask.planEndTime = task.planEndTime; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
// 当前任务无法合并,保存之前的合并任务,并重新初始化 |
|
|
|
|
|
|
|
mergedTasks.push(currentMergedTask); |
|
|
|
mergedTasks.push(currentMergedTask); |
|
|
|
currentMergedTask = { ...task }; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 保存最后一个合并任务 |
|
|
|
tasks.push(...mergedTasks); |
|
|
|
if (currentMergedTask) { |
|
|
|
}); |
|
|
|
mergedTasks.push(currentMergedTask); |
|
|
|
}); |
|
|
|
} |
|
|
|
console.log(909090, tasks); |
|
|
|
|
|
|
|
// >>>>>>>>>> 新增排序逻辑 <<<<<<<<<< |
|
|
|
|
|
|
|
// 1. 对 orders 按 releaseDate 升序 |
|
|
|
|
|
|
|
orders.sort((a, b) => new Date(a.releaseDate) - new Date(b.releaseDate)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 2. 构建 woCode 到 releaseDate 的映射 |
|
|
|
|
|
|
|
const woReleaseMap = {}; |
|
|
|
|
|
|
|
orders.forEach(order => { |
|
|
|
|
|
|
|
woReleaseMap[order.woCode] = order.releaseDate; |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
// 将合并后的任务添加到总任务列表 |
|
|
|
// 3. 对 tasks 按其所属订单的 releaseDate 升序 |
|
|
|
tasks.push(...mergedTasks); |
|
|
|
tasks.sort((a, b) => { |
|
|
|
}); |
|
|
|
const dateA = new Date(woReleaseMap[a.woCode] || '1970-01-01'); |
|
|
|
}); |
|
|
|
const dateB = new Date(woReleaseMap[b.woCode] || '1970-01-01'); |
|
|
|
|
|
|
|
return dateA - dateB; |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
// >>>>>>>>>> 排序结束 <<<<<<<<<< |
|
|
|
|
|
|
|
|
|
|
|
this.allOrders = orders; |
|
|
|
this.allOrders = orders; |
|
|
|
this.totalOrders = orders.length; |
|
|
|
this.totalOrders = orders.length; |
|
|
|
this.taskData = tasks; |
|
|
|
this.taskData = tasks; |
|
|
|
|
|
|
|
|
|
|
|
this.updateCurrentPageOrders(); |
|
|
|
this.updateCurrentPageOrders(); |
|
|
|
this.loading = false; |
|
|
|
this.loading = false; |
|
|
|
}, |
|
|
|
}, |
|
|
|
formatHoursToTime(hours) { |
|
|
|
formatHoursToTime(hours) { |
|
|
|
const baseDate = new Date(this.baseDate); |
|
|
|
const baseDate = new Date(this.baseDate); |
|
|
|
@ -1594,7 +1612,8 @@ export default { |
|
|
|
white-space: nowrap; |
|
|
|
white-space: nowrap; |
|
|
|
font-size: 12px; |
|
|
|
font-size: 12px; |
|
|
|
text-align: left; |
|
|
|
text-align: left; |
|
|
|
padding-left: 15px; |
|
|
|
// padding-left: 15px;、 |
|
|
|
|
|
|
|
// padding:0 10px; |
|
|
|
} |
|
|
|
} |
|
|
|
.info-item-txt i { |
|
|
|
.info-item-txt i { |
|
|
|
font-style: normal; |
|
|
|
font-style: normal; |
|
|
|
@ -1602,8 +1621,8 @@ export default { |
|
|
|
.info-item-info { |
|
|
|
.info-item-info { |
|
|
|
display: flex; |
|
|
|
display: flex; |
|
|
|
justify-content: space-between; |
|
|
|
justify-content: space-between; |
|
|
|
align-items: center; |
|
|
|
// align-items: center; |
|
|
|
padding-right: 15px; |
|
|
|
// padding-right: 15px; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.info-title-cell { |
|
|
|
.info-title-cell { |
|
|
|
@ -2031,19 +2050,26 @@ export default { |
|
|
|
} |
|
|
|
} |
|
|
|
.info-item-content { |
|
|
|
.info-item-content { |
|
|
|
display: flex; |
|
|
|
display: flex; |
|
|
|
width: 100%; |
|
|
|
// width: caclc(100% - 20px); |
|
|
|
} |
|
|
|
} |
|
|
|
/* 左侧信息颜色区分 */ |
|
|
|
/* 左侧信息颜色区分 */ |
|
|
|
.order-code { |
|
|
|
.order-code { |
|
|
|
color: #1a73e8; /* 谷歌蓝 - 专业稳重 */ |
|
|
|
color: #1a73e8; /* 谷歌蓝 - 专业稳重 */ |
|
|
|
font-weight: bold; |
|
|
|
font-weight: bold; |
|
|
|
|
|
|
|
padding-right: 15px; |
|
|
|
|
|
|
|
padding-left: 10px; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.part-code { |
|
|
|
.part-code { |
|
|
|
color: #34a853; /* 谷歌绿 - 清新自然 */ |
|
|
|
color: #34a853; /* 谷歌绿 - 清新自然 */ |
|
|
|
font-weight: bold; |
|
|
|
font-weight: bold; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
.batch-data { |
|
|
|
|
|
|
|
color: #b73779; /* 谷歌黄 - 温暖明亮 */ |
|
|
|
|
|
|
|
font-weight: bold; |
|
|
|
|
|
|
|
flex: 0 0 100px; /* 固定宽度80px,不伸缩 */ |
|
|
|
|
|
|
|
padding-left: 10px; |
|
|
|
|
|
|
|
} |
|
|
|
.batch-no { |
|
|
|
.batch-no { |
|
|
|
color: #fbbc05; /* 谷歌黄 - 温暖明亮 */ |
|
|
|
color: #fbbc05; /* 谷歌黄 - 温暖明亮 */ |
|
|
|
font-weight: bold; |
|
|
|
font-weight: bold; |
|
|
|
@ -2054,6 +2080,9 @@ export default { |
|
|
|
color: #ea4335; /* 谷歌红 - 醒目突出 */ |
|
|
|
color: #ea4335; /* 谷歌红 - 醒目突出 */ |
|
|
|
font-weight: bold; |
|
|
|
font-weight: bold; |
|
|
|
flex: 1; /* 均匀分配剩余空间 */ |
|
|
|
flex: 1; /* 均匀分配剩余空间 */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
text-align: right; |
|
|
|
|
|
|
|
padding-right: 10px; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.product-ident { |
|
|
|
.product-ident { |
|
|
|
@ -2065,8 +2094,8 @@ export default { |
|
|
|
.priority-aps { |
|
|
|
.priority-aps { |
|
|
|
color: #ff6d01; /* 橙色 - 温暖活力 */ |
|
|
|
color: #ff6d01; /* 橙色 - 温暖活力 */ |
|
|
|
font-weight: bold; |
|
|
|
font-weight: bold; |
|
|
|
flex: 0 0 90px; /* 固定宽度80px,不伸缩 */ |
|
|
|
flex: 1; /* 固定宽度80px,不伸缩 */ |
|
|
|
text-align: right; |
|
|
|
text-align: right; |
|
|
|
padding-right: 15px; |
|
|
|
padding-right: 10px; |
|
|
|
} |
|
|
|
} |
|
|
|
</style> |
|
|
|
</style> |
|
|
|
|