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