|
|
|
@ -1,11 +1,50 @@ |
|
|
|
<template> |
|
|
|
<template> |
|
|
|
<basic-container> |
|
|
|
<!-- <basic-container> --> |
|
|
|
<avue-form :option="option" @submit="submit" @error="error"> |
|
|
|
<div> |
|
|
|
<template #menu-form> |
|
|
|
<el-form label-width="80px" :model="formLabelAlign"> |
|
|
|
|
|
|
|
<el-row> |
|
|
|
|
|
|
|
<el-col :span="6"> |
|
|
|
|
|
|
|
<el-form-item label="维度:"> |
|
|
|
|
|
|
|
<el-select v-model="formLabelAlign.type" placeholder="请选择"> |
|
|
|
|
|
|
|
<el-option label="车间订单" value="1"> </el-option> |
|
|
|
|
|
|
|
<el-option label="班组" value="2"> </el-option> |
|
|
|
|
|
|
|
<el-option label="设备" value="3"> </el-option> |
|
|
|
|
|
|
|
</el-select> |
|
|
|
|
|
|
|
</el-form-item> |
|
|
|
|
|
|
|
</el-col> |
|
|
|
|
|
|
|
<el-col :span="6" v-if="formLabelAlign.type == '1'"> |
|
|
|
|
|
|
|
<el-form-item label="车间订单号:" label-width="120px"> |
|
|
|
|
|
|
|
<el-input v-model="formLabelAlign.woCode"></el-input> |
|
|
|
|
|
|
|
</el-form-item> |
|
|
|
|
|
|
|
</el-col> |
|
|
|
|
|
|
|
<el-col :span="6" v-if="formLabelAlign.type == '2'"> |
|
|
|
|
|
|
|
<el-form-item label="班组:"> |
|
|
|
|
|
|
|
<el-select v-model="formLabelAlign.teamame" placeholder="请选择"> |
|
|
|
|
|
|
|
<el-option label="班组1" value="1"> </el-option> |
|
|
|
|
|
|
|
<el-option label="班组2" value="2"> </el-option> |
|
|
|
|
|
|
|
</el-select> |
|
|
|
|
|
|
|
</el-form-item> |
|
|
|
|
|
|
|
</el-col> |
|
|
|
|
|
|
|
<el-col :span="6" v-if="formLabelAlign.type == '3'"> |
|
|
|
|
|
|
|
<el-form-item label="设备:"> |
|
|
|
|
|
|
|
<el-select v-model="formLabelAlign.equipName" placeholder="请选择"> |
|
|
|
|
|
|
|
<el-option label="设备1" value="1"> </el-option> |
|
|
|
|
|
|
|
<el-option label="设备2" value="2"> </el-option> |
|
|
|
|
|
|
|
</el-select> |
|
|
|
|
|
|
|
</el-form-item> |
|
|
|
|
|
|
|
</el-col> |
|
|
|
|
|
|
|
<el-col :span="6"> |
|
|
|
|
|
|
|
<el-form-item label="时间:"> |
|
|
|
|
|
|
|
<el-date-picker v-model="formLabelAlign.startTime" type="date" placeholder="选择日期"> |
|
|
|
|
|
|
|
</el-date-picker> |
|
|
|
|
|
|
|
</el-form-item> |
|
|
|
|
|
|
|
</el-col> |
|
|
|
|
|
|
|
<el-col :span="6"> |
|
|
|
<el-button type="primary" icon="el-icon-search" @click="handleSubmit"> 搜索 </el-button> |
|
|
|
<el-button type="primary" icon="el-icon-search" @click="handleSubmit"> 搜索 </el-button> |
|
|
|
<el-button icon="el-icon-delete" @click="handleSubmit"> 清空 </el-button> |
|
|
|
<el-button icon="el-icon-delete" @click="handleSubmit"> 清空 </el-button> |
|
|
|
</template> |
|
|
|
</el-col> |
|
|
|
</avue-form> |
|
|
|
</el-row> |
|
|
|
|
|
|
|
</el-form> |
|
|
|
|
|
|
|
|
|
|
|
<div class="gantt-container"> |
|
|
|
<div class="gantt-container"> |
|
|
|
<!-- 头部标题和图例 --> |
|
|
|
<!-- 头部标题和图例 --> |
|
|
|
@ -31,12 +70,33 @@ |
|
|
|
<div class="gantt-wrapper"> |
|
|
|
<div class="gantt-wrapper"> |
|
|
|
<!-- 左侧设备列表 --> |
|
|
|
<!-- 左侧设备列表 --> |
|
|
|
<div class="device-list"> |
|
|
|
<div class="device-list"> |
|
|
|
<div class="device-item device-item-title" :style="{ height: '36px' }">设备</div> |
|
|
|
<div |
|
|
|
|
|
|
|
v-if="searchType == '1'" |
|
|
|
|
|
|
|
class="device-item device-item-title" |
|
|
|
|
|
|
|
:style="{ height: '36px' }" |
|
|
|
|
|
|
|
> |
|
|
|
|
|
|
|
车间订单号 |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<div |
|
|
|
|
|
|
|
v-if="searchType == '2'" |
|
|
|
|
|
|
|
class="device-item device-item-title" |
|
|
|
|
|
|
|
:style="{ height: '36px' }" |
|
|
|
|
|
|
|
> |
|
|
|
|
|
|
|
班组 |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<div |
|
|
|
|
|
|
|
v-if="searchType == '3'" |
|
|
|
|
|
|
|
class="device-item device-item-title" |
|
|
|
|
|
|
|
:style="{ height: '36px' }" |
|
|
|
|
|
|
|
> |
|
|
|
|
|
|
|
设备 |
|
|
|
|
|
|
|
</div> |
|
|
|
<div |
|
|
|
<div |
|
|
|
v-for="(device, index) in devices" |
|
|
|
v-for="(device, index) in devices" |
|
|
|
:key="index" |
|
|
|
:key="index" |
|
|
|
class="device-item" |
|
|
|
class="device-item" |
|
|
|
:style="{ height: rowHeight + 'px' }" |
|
|
|
:style="{ height: rowHeight + 'px' }" |
|
|
|
|
|
|
|
:title="device" |
|
|
|
> |
|
|
|
> |
|
|
|
{{ device }} |
|
|
|
{{ device }} |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
@ -123,14 +183,16 @@ |
|
|
|
:key="taskIndex" |
|
|
|
:key="taskIndex" |
|
|
|
class="task-bar" |
|
|
|
class="task-bar" |
|
|
|
:style="{ |
|
|
|
:style="{ |
|
|
|
left: `${getPositionPercent(task.start)}%`, |
|
|
|
left: `${getPositionPercent(task.startTime)}%`, |
|
|
|
width: `${getWidthPercent(task.start, task.end)}%`, |
|
|
|
width: `${getWidthPercent(task.startTime, task.endTime)}%`, |
|
|
|
backgroundColor: getStatusColor(task.status), |
|
|
|
backgroundColor: getStatusColor(task.status), |
|
|
|
}" |
|
|
|
}" |
|
|
|
@mouseenter="showTooltip($event, task, device)" |
|
|
|
@mouseenter="showTooltip($event, task, device)" |
|
|
|
@mouseleave="hideTooltip()" |
|
|
|
@mouseleave="hideTooltip()" |
|
|
|
> |
|
|
|
> |
|
|
|
<span class="task-label">{{ task.task }}</span> |
|
|
|
<span class="task-label" v-if="searchType == '1'">{{ task.processName }}</span> |
|
|
|
|
|
|
|
<span class="task-label" v-if="searchType == '2'">{{ task.woCode }}</span> |
|
|
|
|
|
|
|
<span class="task-label" v-if="searchType == '3'">{{ task.woCode }}</span> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
@ -148,200 +210,86 @@ |
|
|
|
}" |
|
|
|
}" |
|
|
|
> |
|
|
|
> |
|
|
|
<div class="tooltip-content"> |
|
|
|
<div class="tooltip-content"> |
|
|
|
<div><strong>设备:</strong>{{ tooltipData.device }}</div> |
|
|
|
<!-- 工单标题 --> |
|
|
|
<div><strong>任务:</strong>{{ tooltipData.task }}</div> |
|
|
|
<div class="wo-code-title" v-if="searchType=='1'">{{ tooltipData.woCode }}</div> |
|
|
|
<div><strong>时间:</strong>{{ tooltipData.start }} - {{ tooltipData.end }}</div> |
|
|
|
<div class="wo-code-title" v-if="searchType=='2'">{{ tooltipData.teamName }}</div> |
|
|
|
<div><strong>状态:</strong>{{ tooltipData.status }}</div> |
|
|
|
<div class="wo-code-title" v-if="searchType=='3'">{{ tooltipData.equipName }}</div> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- 详情列表 --> |
|
|
|
|
|
|
|
<ul class="detail-list"> |
|
|
|
|
|
|
|
<li class="detail-item" v-if="searchType=='1'"> |
|
|
|
|
|
|
|
<span class="label">工序:</span> |
|
|
|
|
|
|
|
<span class="value">{{ tooltipData.processName || '-' }}</span> |
|
|
|
|
|
|
|
</li> |
|
|
|
|
|
|
|
<li class="detail-item" v-if="searchType=='1'"> |
|
|
|
|
|
|
|
<span class="label">班组:</span> |
|
|
|
|
|
|
|
<span class="value">{{ tooltipData.teamName || '-' }}</span> |
|
|
|
|
|
|
|
</li> |
|
|
|
|
|
|
|
<li class="detail-item" v-if="searchType=='2'||searchType=='3'"> |
|
|
|
|
|
|
|
<span class="label">车间订单号:</span> |
|
|
|
|
|
|
|
<span class="value">{{ tooltipData.woCode || '-' }}</span> |
|
|
|
|
|
|
|
</li> |
|
|
|
|
|
|
|
<li class="detail-item"> |
|
|
|
|
|
|
|
<span class="label">计划开始时间:</span> |
|
|
|
|
|
|
|
<span class="value">{{tooltipData.planStartTime || '-' }}</span> |
|
|
|
|
|
|
|
</li> |
|
|
|
|
|
|
|
<li class="detail-item"> |
|
|
|
|
|
|
|
<span class="label">实际开始时间:</span> |
|
|
|
|
|
|
|
<span class="value">{{ tooltipData.factStartTime || '-' }}</span> |
|
|
|
|
|
|
|
</li> |
|
|
|
|
|
|
|
<li class="detail-item"> |
|
|
|
|
|
|
|
<span class="label">计划完成时间:</span> |
|
|
|
|
|
|
|
<span class="value">{{tooltipData.planEndTime || '-' }}</span> |
|
|
|
|
|
|
|
</li> |
|
|
|
|
|
|
|
<li class="detail-item"> |
|
|
|
|
|
|
|
<span class="label">实际完成时间:</span> |
|
|
|
|
|
|
|
<span class="value">{{ tooltipData.factEndTime || '-' }}</span> |
|
|
|
|
|
|
|
</li> |
|
|
|
|
|
|
|
<li class="detail-item"> |
|
|
|
|
|
|
|
<span class="label">状态:</span> |
|
|
|
|
|
|
|
<span class="value"> |
|
|
|
|
|
|
|
<el-tag :type="tooltipData.status">{{ |
|
|
|
|
|
|
|
tooltipData.status || '未知' |
|
|
|
|
|
|
|
}}</el-tag> |
|
|
|
|
|
|
|
</span> |
|
|
|
|
|
|
|
</li> |
|
|
|
|
|
|
|
</ul> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</basic-container> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- </basic-container> --> |
|
|
|
</template> |
|
|
|
</template> |
|
|
|
|
|
|
|
|
|
|
|
<script> |
|
|
|
<script> |
|
|
|
|
|
|
|
import { getData } from '@/api/productionSchedulingPlan/scheduling'; |
|
|
|
export default { |
|
|
|
export default { |
|
|
|
name: 'GanttChart', |
|
|
|
name: 'GanttChart', |
|
|
|
data() { |
|
|
|
data() { |
|
|
|
return { |
|
|
|
return { |
|
|
|
|
|
|
|
searchType: '', |
|
|
|
|
|
|
|
formLabelAlign: { |
|
|
|
|
|
|
|
type: '1', //维度类型 |
|
|
|
|
|
|
|
startTime: '', //时间 |
|
|
|
|
|
|
|
teamName: '', //班组 |
|
|
|
|
|
|
|
equipName: '', //设备 |
|
|
|
|
|
|
|
woCode: '', //车间订单号 |
|
|
|
|
|
|
|
}, |
|
|
|
rowHeight: 36, |
|
|
|
rowHeight: 36, |
|
|
|
zoomLevel: 1, // 缩放级别 (1-4) |
|
|
|
zoomLevel: 1, // 缩放级别 (1-4) |
|
|
|
minZoom: 1, |
|
|
|
minZoom: 1, |
|
|
|
maxZoom: 4, |
|
|
|
maxZoom: 4, |
|
|
|
|
|
|
|
|
|
|
|
// 设备列表 |
|
|
|
// 设备列表 |
|
|
|
devices: [ |
|
|
|
devices: [], |
|
|
|
'铜合金零件化学镀镍线(9652248)', |
|
|
|
|
|
|
|
'铜合金化学镀镍烤箱(9652248-01)', |
|
|
|
|
|
|
|
'铜合金化学镀镍烤箱(9652248-02)', |
|
|
|
|
|
|
|
'铜合金化学镀镍烤箱(9652248-03)', |
|
|
|
|
|
|
|
'铝合金化学镀镍生产线(9653582)', |
|
|
|
|
|
|
|
'铝合金化学镀镍烤箱(9653582-01)', |
|
|
|
|
|
|
|
'铝合金化学镀镍烤箱(9653582-02)', |
|
|
|
|
|
|
|
'铝合金化学镀镍烤箱(9653582-03)', |
|
|
|
|
|
|
|
'铝合金化学镀镍烤箱(9653582-04)', |
|
|
|
|
|
|
|
'镀金生产线(9652249)', |
|
|
|
|
|
|
|
'热表线烘箱(9652249-01)', |
|
|
|
|
|
|
|
'热表线烘箱(9652249-02)', |
|
|
|
|
|
|
|
'热表线烘箱(9652249-03)', |
|
|
|
|
|
|
|
'热表线烘箱(9652249-04)', |
|
|
|
|
|
|
|
'喷漆生产线(965396)', |
|
|
|
|
|
|
|
'喷码机(9652055)', |
|
|
|
|
|
|
|
'喷漆生产线(965396)', |
|
|
|
|
|
|
|
'喷码机(9652055)', |
|
|
|
|
|
|
|
], |
|
|
|
|
|
|
|
// 任务数据 |
|
|
|
// 任务数据 |
|
|
|
taskData: [ |
|
|
|
taskData: [], |
|
|
|
{ |
|
|
|
|
|
|
|
device: '铜合金零件化学镀镍线(9652248)', |
|
|
|
|
|
|
|
task: 'WO-N261026761', |
|
|
|
|
|
|
|
start: '00:15', |
|
|
|
|
|
|
|
end: '08:45', |
|
|
|
|
|
|
|
status: '已完成', |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
device: '铜合金零件化学镀镍线(9652248)', |
|
|
|
|
|
|
|
task: 'WO-N261026762', |
|
|
|
|
|
|
|
start: '09:30', |
|
|
|
|
|
|
|
end: '12:15', |
|
|
|
|
|
|
|
status: '已完成', |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
device: '铜合金零件化学镀镍线(9652248)', |
|
|
|
|
|
|
|
task: 'WO-N261026764', |
|
|
|
|
|
|
|
start: '13:20', |
|
|
|
|
|
|
|
end: '16:50', |
|
|
|
|
|
|
|
status: '已完成', |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
device: '铜合金零件化学镀镍线(9652248)', |
|
|
|
|
|
|
|
task: 'WO-N261026763', |
|
|
|
|
|
|
|
start: '16:00', |
|
|
|
|
|
|
|
end: '18:30', |
|
|
|
|
|
|
|
status: '进行中', |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
device: '铜合金零件化学镀镍线(9652248)', |
|
|
|
|
|
|
|
task: 'WO-N2610287265', |
|
|
|
|
|
|
|
start: '19:10', |
|
|
|
|
|
|
|
end: '23:45', |
|
|
|
|
|
|
|
status: '未开始', |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
device: '铜合金化学镀镍烤箱(9652248-01)', |
|
|
|
|
|
|
|
task: 'WO-N261026727', |
|
|
|
|
|
|
|
start: '09:15', |
|
|
|
|
|
|
|
end: '11:30', |
|
|
|
|
|
|
|
status: '已完成', |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
device: '铜合金化学镀镍烤箱(9652248-01)', |
|
|
|
|
|
|
|
task: 'WO-N261026729', |
|
|
|
|
|
|
|
start: '12:20', |
|
|
|
|
|
|
|
end: '14:40', |
|
|
|
|
|
|
|
status: '已完成', |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
device: '铜合金化学镀镍烤箱(9652248-01)', |
|
|
|
|
|
|
|
task: 'WO-N261026721', |
|
|
|
|
|
|
|
start: '15:50', |
|
|
|
|
|
|
|
end: '17:20', |
|
|
|
|
|
|
|
status: '进行中', |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
device: '铜合金化学镀镍烤箱(9652248-01)', |
|
|
|
|
|
|
|
task: 'WO-N2610287244', |
|
|
|
|
|
|
|
start: '18:10', |
|
|
|
|
|
|
|
end: '20:30', |
|
|
|
|
|
|
|
status: '未开始', |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
device: '铜合金化学镀镍烤箱(9652248-01)', |
|
|
|
|
|
|
|
task: 'WO-N261026778', |
|
|
|
|
|
|
|
start: '21:25', |
|
|
|
|
|
|
|
end: '23:55', |
|
|
|
|
|
|
|
status: '未开始', |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
device: '铜合金化学镀镍烤箱(9652248-01)', |
|
|
|
|
|
|
|
task: 'WO-N2610287244', |
|
|
|
|
|
|
|
start: '18:10', |
|
|
|
|
|
|
|
end: '20:30', |
|
|
|
|
|
|
|
status: '未开始', |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
device: '铜合金化学镀镍烤箱(9652248-01)', |
|
|
|
|
|
|
|
task: 'WO-N261026778', |
|
|
|
|
|
|
|
start: '21:25', |
|
|
|
|
|
|
|
end: '23:55', |
|
|
|
|
|
|
|
status: '未开始', |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
], |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 提示框相关 |
|
|
|
// 提示框相关 |
|
|
|
tooltipVisible: false, |
|
|
|
tooltipVisible: false, |
|
|
|
tooltipData: {}, |
|
|
|
tooltipData: {}, |
|
|
|
tooltipX: 0, |
|
|
|
tooltipX: 0, |
|
|
|
tooltipY: 0, |
|
|
|
tooltipY: 0, |
|
|
|
option: { |
|
|
|
|
|
|
|
menuSpan: 4, |
|
|
|
|
|
|
|
submitBtn: false, |
|
|
|
|
|
|
|
emptyBtn: false, |
|
|
|
|
|
|
|
menuPosition: 'right', |
|
|
|
|
|
|
|
column: [ |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
label: '设备', |
|
|
|
|
|
|
|
prop: 'name', |
|
|
|
|
|
|
|
span: 5, |
|
|
|
|
|
|
|
type: 'select', |
|
|
|
|
|
|
|
dicData: [ |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
label: '车间订单', |
|
|
|
|
|
|
|
value: 1, |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
label: '设备', |
|
|
|
|
|
|
|
value: 2, |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
label: '班组', |
|
|
|
|
|
|
|
value: 3, |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
], |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
label: '车间订单号', |
|
|
|
|
|
|
|
prop: 'name', |
|
|
|
|
|
|
|
span: 5, |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
label: '班组', |
|
|
|
|
|
|
|
prop: 'name', |
|
|
|
|
|
|
|
span: 5, |
|
|
|
|
|
|
|
type: 'select', |
|
|
|
|
|
|
|
dicData: [ |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
label: '班组1', |
|
|
|
|
|
|
|
value: 1, |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
label: '班组2', |
|
|
|
|
|
|
|
value: 2, |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
label: '班组3', |
|
|
|
|
|
|
|
value: 3, |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
], |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
label: '时间', |
|
|
|
|
|
|
|
prop: 'name', |
|
|
|
|
|
|
|
span: 5, |
|
|
|
|
|
|
|
type: 'date', |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
], |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
}; |
|
|
|
}; |
|
|
|
}, |
|
|
|
}, |
|
|
|
computed: { |
|
|
|
computed: { |
|
|
|
@ -363,10 +311,102 @@ export default { |
|
|
|
return labels; |
|
|
|
return labels; |
|
|
|
}, |
|
|
|
}, |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
mounted() { |
|
|
|
|
|
|
|
this.searchType = this.formLabelAlign.type; |
|
|
|
|
|
|
|
this.getData(); |
|
|
|
|
|
|
|
}, |
|
|
|
methods: { |
|
|
|
methods: { |
|
|
|
|
|
|
|
getData() { |
|
|
|
|
|
|
|
getData(this.formLabelAlign).then(res => { |
|
|
|
|
|
|
|
console.log(99999, res.data.data); |
|
|
|
|
|
|
|
this.processData(res.data.data); |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
processData(rawData) { |
|
|
|
|
|
|
|
const tasks = []; |
|
|
|
|
|
|
|
const workOrders = Object.keys(rawData); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 遍历每个工单的任务 |
|
|
|
|
|
|
|
workOrders.forEach(woCode => { |
|
|
|
|
|
|
|
const woTasks = rawData[woCode] || []; |
|
|
|
|
|
|
|
woTasks.forEach(task => { |
|
|
|
|
|
|
|
tasks.push({ |
|
|
|
|
|
|
|
...task, |
|
|
|
|
|
|
|
status: this.calcTaskStatus(task.startTime, task.endTime), |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
this.devices = workOrders; |
|
|
|
|
|
|
|
this.taskData = tasks; |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
// 计算任务状态(已完成/进行中/未开始) |
|
|
|
|
|
|
|
calcTaskStatus(startTime, endTime) { |
|
|
|
|
|
|
|
const now = new Date(); |
|
|
|
|
|
|
|
const current = now.getHours() * 60 + now.getMinutes(); |
|
|
|
|
|
|
|
const start = this.timeToMinutes(startTime); |
|
|
|
|
|
|
|
let end = this.timeToMinutes(endTime); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 处理跨天(结束时间小于开始时间) |
|
|
|
|
|
|
|
if (end < start) { |
|
|
|
|
|
|
|
end += 24 * 60; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (current >= end) { |
|
|
|
|
|
|
|
return '已完成'; |
|
|
|
|
|
|
|
} else if (current >= start) { |
|
|
|
|
|
|
|
return '进行中'; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
return '未开始'; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
// 判断任务状态 |
|
|
|
|
|
|
|
getTaskStatus(startTime, endTime) { |
|
|
|
|
|
|
|
const now = new Date(); |
|
|
|
|
|
|
|
const currentHours = now.getHours(); |
|
|
|
|
|
|
|
const currentMinutes = now.getMinutes(); |
|
|
|
|
|
|
|
const currentTotal = currentHours * 60 + currentMinutes; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const startTotal = this.timeToMinutes(startTime); |
|
|
|
|
|
|
|
const endTotal = this.timeToMinutes(endTime); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 处理跨天情况(结束时间小于开始时间) |
|
|
|
|
|
|
|
if (endTotal < startTotal) { |
|
|
|
|
|
|
|
// 现在在[start, 24:00)或[00:00, end)之间为进行中 |
|
|
|
|
|
|
|
if (currentTotal >= startTotal || currentTotal < endTotal) { |
|
|
|
|
|
|
|
return '进行中'; |
|
|
|
|
|
|
|
} else if (currentTotal >= endTotal) { |
|
|
|
|
|
|
|
return '已完成'; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
return '未开始'; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
// 正常时间段 |
|
|
|
|
|
|
|
if (currentTotal >= endTotal) { |
|
|
|
|
|
|
|
return '已完成'; |
|
|
|
|
|
|
|
} else if (currentTotal >= startTotal) { |
|
|
|
|
|
|
|
return '进行中'; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
return '未开始'; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
handleSubmit() { |
|
|
|
|
|
|
|
this.searchType = this.formLabelAlign.type; |
|
|
|
|
|
|
|
this.devices = []; |
|
|
|
|
|
|
|
this.taskData = []; |
|
|
|
|
|
|
|
this.getData(); |
|
|
|
|
|
|
|
}, |
|
|
|
// 根据设备筛选任务 |
|
|
|
// 根据设备筛选任务 |
|
|
|
getDeviceTasks(device) { |
|
|
|
getDeviceTasks(device) { |
|
|
|
return this.taskData.filter(task => task.device === device); |
|
|
|
if (this.searchType == '1') { |
|
|
|
|
|
|
|
return this.taskData.filter(task => task.woCode === device); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (this.searchType == '2') { |
|
|
|
|
|
|
|
return this.taskData.filter(task => task.teamName === device); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (this.searchType == '3') { |
|
|
|
|
|
|
|
return this.taskData.filter(task => task.equipName === device); |
|
|
|
|
|
|
|
} |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
// 时间转分钟数 |
|
|
|
// 时间转分钟数 |
|
|
|
@ -738,4 +778,36 @@ export default { |
|
|
|
.tooltip-content div { |
|
|
|
.tooltip-content div { |
|
|
|
margin: 3px 0; |
|
|
|
margin: 3px 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
.wo-code-title { |
|
|
|
|
|
|
|
font-size: 18px; |
|
|
|
|
|
|
|
font-weight: bold; |
|
|
|
|
|
|
|
color: #1f2d3d; |
|
|
|
|
|
|
|
margin-bottom: 15px; |
|
|
|
|
|
|
|
padding-bottom: 10px; |
|
|
|
|
|
|
|
border-bottom: 1px solid #e6e6e6; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.detail-list { |
|
|
|
|
|
|
|
list-style: none; |
|
|
|
|
|
|
|
padding: 0; |
|
|
|
|
|
|
|
margin: 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.detail-item { |
|
|
|
|
|
|
|
display: flex; |
|
|
|
|
|
|
|
align-items: center; |
|
|
|
|
|
|
|
margin-bottom: 12px; |
|
|
|
|
|
|
|
line-height: 24px; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.label { |
|
|
|
|
|
|
|
width: 100px; |
|
|
|
|
|
|
|
color: #666; |
|
|
|
|
|
|
|
font-weight: 500; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.value { |
|
|
|
|
|
|
|
flex: 1; |
|
|
|
|
|
|
|
color: #333; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
</style> |
|
|
|
</style> |
|
|
|
|