You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
4.4 KiB
Vue
143 lines
4.4 KiB
Vue
<template>
|
|
<ContentWrap>
|
|
<el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="auto">
|
|
<el-form-item :label="t('GanttChart.Index.searchTimeLabel')" prop="range">
|
|
<el-date-picker
|
|
v-model="queryRange"
|
|
type="datetimerange"
|
|
value-format="YYYY-MM-DD HH:mm:ss"
|
|
range-separator="-"
|
|
:start-placeholder="t('GanttChart.Index.startPlaceholder')"
|
|
:end-placeholder="t('GanttChart.Index.endPlaceholder')"
|
|
class="!w-360px"
|
|
/>
|
|
</el-form-item>
|
|
<el-form-item :label="t('GanttChart.Index.deviceLabel')" prop="deviceIds">
|
|
<el-select v-model="queryParams.deviceIds" :placeholder="t('GanttChart.Index.devicePlaceholder')" clearable multiple collapse-tags class="!w-240px">
|
|
<el-option v-for="item in deviceOptions" :key="item.value" :label="item.label" :value="item.value" />
|
|
</el-select>
|
|
</el-form-item>
|
|
<el-form-item>
|
|
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" />{{ t('GanttChart.Index.buttonSearch') }}</el-button>
|
|
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" />{{ t('GanttChart.Index.buttonReset') }}</el-button>
|
|
<el-button circle @click="toggleViewMode">
|
|
<el-icon><Switch /></el-icon>
|
|
</el-button>
|
|
</el-form-item>
|
|
</el-form>
|
|
</ContentWrap>
|
|
|
|
<ContentWrap v-if="viewMode === 'gantt'">
|
|
<div v-loading="loading">
|
|
<ScheduleGanttPanel :schedule-list="filteredList" :editable="false" height="calc(100vh - 320px)" />
|
|
</div>
|
|
</ContentWrap>
|
|
|
|
<div v-else style="width: 100%; height: calc(100vh - 60px)">
|
|
<div v-loading="loading" style="width: 100%; height: 100%">
|
|
<ScheduleCardView :schedule-list="filteredList" @refresh="getList" />
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { Switch } from '@element-plus/icons-vue'
|
|
import { PlanApi } from '@/api/mes/plan'
|
|
import ScheduleGanttPanel from '@/views/mes/components/ScheduleGanttPanel.vue'
|
|
import ScheduleCardView from '@/views/mes/ganttChart/components/ScheduleCardView.vue'
|
|
import dayjs from 'dayjs'
|
|
import { useI18n } from '@/hooks/web/useI18n'
|
|
|
|
defineOptions({ name: 'MesGanttChart' })
|
|
|
|
const { t } = useI18n()
|
|
|
|
type UnifiedPlan = {
|
|
taskId: string | number
|
|
taskDetailId: string | number
|
|
taskCode: string
|
|
productCode: string
|
|
productName: string
|
|
planNumber: number
|
|
planStartTimeStr: string
|
|
planEndTimeStr: string
|
|
latestStartTimeStr: string
|
|
deliveryDateStr: string
|
|
scheduleDays: number
|
|
sourceType: 'HISTORY'
|
|
}
|
|
|
|
type UnifiedDevice = {
|
|
deviceId: string | number
|
|
deviceName: string
|
|
ratedCapacity?: number | string
|
|
plans: UnifiedPlan[]
|
|
}
|
|
|
|
const loading = ref(false)
|
|
const queryFormRef = ref()
|
|
const scheduleList = ref<UnifiedDevice[]>([])
|
|
const viewMode = ref<'gantt' | 'card'>('gantt')
|
|
|
|
const buildDefaultRange = () => {
|
|
const start = dayjs().startOf('month').startOf('day')
|
|
const end = dayjs().endOf('month').endOf('day')
|
|
return [start.format('YYYY-MM-DD HH:mm:ss'), end.format('YYYY-MM-DD HH:mm:ss')]
|
|
}
|
|
|
|
const queryRange = ref<string[]>(buildDefaultRange())
|
|
const queryParams = reactive({
|
|
startTime: queryRange.value[0],
|
|
endTime: queryRange.value[1],
|
|
deviceIds: [] as (string | number)[]
|
|
})
|
|
|
|
const deviceOptions = computed(() =>
|
|
scheduleList.value.map((device) => ({
|
|
label: device.deviceName,
|
|
value: device.deviceId
|
|
}))
|
|
)
|
|
|
|
const filteredList = computed(() => {
|
|
if (!queryParams.deviceIds.length) return scheduleList.value
|
|
return scheduleList.value.filter((device) => queryParams.deviceIds.includes(device.deviceId))
|
|
})
|
|
|
|
const getList = async () => {
|
|
loading.value = true
|
|
try {
|
|
const data = await PlanApi.getGanttByDevice({
|
|
startTime: queryParams.startTime,
|
|
endTime: queryParams.endTime
|
|
})
|
|
scheduleList.value = data
|
|
} finally {
|
|
loading.value = false
|
|
}
|
|
}
|
|
|
|
const handleQuery = () => {
|
|
const [startTime, endTime] = Array.isArray(queryRange.value) ? queryRange.value : []
|
|
queryParams.startTime = startTime || ''
|
|
queryParams.endTime = endTime || ''
|
|
getList()
|
|
}
|
|
|
|
const resetQuery = () => {
|
|
queryFormRef.value?.resetFields()
|
|
queryRange.value = buildDefaultRange()
|
|
queryParams.startTime = queryRange.value[0]
|
|
queryParams.endTime = queryRange.value[1]
|
|
getList()
|
|
}
|
|
|
|
const toggleViewMode = () => {
|
|
viewMode.value = viewMode.value === 'gantt' ? 'card' : 'gantt'
|
|
}
|
|
|
|
onMounted(() => {
|
|
handleQuery()
|
|
})
|
|
</script>
|