排产看板页面调整

dev-scheduling
zhangdi 3 months ago
parent b11ae269f1
commit 385eabf178
  1. 189
      src/views/productionSchedulingPlan/schedulingDashboard/container.vue

@ -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>

Loading…
Cancel
Save