diff --git a/src/api/erp/mold/index.ts b/src/api/erp/mold/index.ts index dc34c093..0e688282 100644 --- a/src/api/erp/mold/index.ts +++ b/src/api/erp/mold/index.ts @@ -83,7 +83,7 @@ export const MoldBrandApi = { }, getMoldPageWithoutPaging: async () => { - return await request.get({ url: `/erp/mold-brand/mold/page` }) + return await request.get({ url: `/erp/mold-brand/mold/list` }) }, // 新增模具 createMold: async (data) => { diff --git a/src/api/mes/deviceledger/index.ts b/src/api/mes/deviceledger/index.ts index c6ed0460..8294b8a2 100644 --- a/src/api/mes/deviceledger/index.ts +++ b/src/api/mes/deviceledger/index.ts @@ -45,6 +45,10 @@ export const DeviceLedgerApi = { return await request.get({ url: `/mes/device-ledger/page`, params }) }, + getDeviceLedgerList: async (params: any) => { + return await request.get({ url: `/mes/device-ledger/list`, params }) + }, + // 查询设备类型详情 getDeviceLedger: async (id: number) => { return await request.get({ url: `/mes/device-ledger/get?id=` + id }) diff --git a/src/api/mes/taskManagement/index.ts b/src/api/mes/taskManagement/index.ts index ed2a14be..fe87f63c 100644 --- a/src/api/mes/taskManagement/index.ts +++ b/src/api/mes/taskManagement/index.ts @@ -43,5 +43,10 @@ export const TaskManagementApi = { exportTaskManagement: async (params: any) => { return await request.download({ url: `/mes/task-management/export-excel`, params }) + }, + + updateTaskManagementEnabled: async (id: number | string, enabled: string) => { + const data = { id, enabled } + return await request.put({ url: `/mes/task-management/update-enabled`, data }) } } diff --git a/src/assets/imgs/banner.png b/src/assets/imgs/banner.png new file mode 100644 index 00000000..6e60e45f Binary files /dev/null and b/src/assets/imgs/banner.png differ diff --git a/src/views/Home/Index.vue b/src/views/Home/Index.vue index e62b0a4c..b051e335 100644 --- a/src/views/Home/Index.vue +++ b/src/views/Home/Index.vue @@ -1,185 +1,285 @@ - - - - - - - - - - - - {{ t('workplace.welcome') }} {{ username }} {{ t('workplace.happyDay') }} - - - {{ weatherCity }}: 白天{{ todayWeather.dayweather }},晚上{{ todayWeather.nightweather }} - - - 气温{{ todayWeather.daytemp }}°C~{{ todayWeather.nighttemp }}°C - ,{{ todayWeather.daywind }}风{{ todayWeather.daypower }}级 - - - - - - - - - - {{ item.date }} - - - 白天{{ item.dayweather }},晚上{{ item.nightweather }},气温 - {{ item.daytemp }}°C~{{ item.nighttemp }}°C - ,{{ item.daywind }}风{{ item.daypower }}级 - - - - - - - - - - - - - - - - - - - - - - 生产进度 - - {{ t('action.more') }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {{ t('workplace.shortcutOperation') }} - - - - - - - - - {{ item.name }} - - - - - - - - - - 大屏看板 - - - - - - - - - {{ item.name }} - - - - - - - - - - {{ t('workplace.notice') }} - {{ t('action.more') }} - - - - - - - - - - - - {{ item.type }} : {{ item.title }} - - - - {{ formatTime(item.date, 'yyyy-MM-dd') }} - - - - - - - - - + + + + 欢迎使用您的云上数字工厂 + + 云上数字工厂可以整合您工厂所有设备、自动化、信息化的教据,帮助您对工厂和生产进行建模管理,统一主教报及应用集成,打造您工厂的教字中心和业务中心,并且与产业链相关系统协同,不断提升您的智能制造能力。 + + + + + + + + + 整体生产概况 + + + + + + + + {{ item.label }} + {{ item.value }} + + + + + {{ item.label }} + {{ item.value }} + + + + + {{ item.label }} + {{ item.value }} + + + + + + + 实时生产进度 + + + + + + + 生产工单 {{ item.orderNo }} + + + + 产品名称 + {{ item.productName }} + + + 任务数量 + - + + + 客户简称 + - + + + 交货时间 + {{ item.planEndTime }} + + + 投产时间 + {{ item.planStartTime }} + + + + + 产品型号 + - + + + 完成数量 + - + + + 完成进度 + {{ item.completeRate }}% + + + 工单状态 + {{ item.statusText }} + + + 完工时间 + - + + + + + + + + + + + + + + 设备 + + 查看文档 + 添加设备 + + + + + + {{ item.label }} + {{ item.value }} + + + + + + + + + 告警 + + + + + {{ item.label }} + {{ item.value }} + + + + + + + + + 设备整体情况 + + + + + + + + {{ item.label }} + {{ item.value }} + + + + + {{ item.label }} + {{ item.value }} + + + + + + + 待办任务 + + + + + + + {{ item.name }} + 任务编号:{{ item.id }} + 任务类型:{{ item.type }}|优先级:{{ item.priority }} + 计划时间:{{ item.planTime }} + 责任部门:{{ item.owner }} + + + + + + + + + + + + 设备维修数量统计 + + + + + + + + + + 设备分类统计 + + + + + + + + + + 设备分布统计 + + + + + + + + + + + + 每周用户活跃量 + + + + + + + + + + {{ t('workplace.shortcutOperation') }} + + + + + + + + + {{ item.name }} + + + + + + + + + + {{ t('workplace.notice') }} + {{ t('action.more') }} + + + + + + + + + + + + {{ item.type }} : {{ item.title }} + + + + {{ formatTime(item.date, 'yyyy-MM-dd') }} + + + + + + + + + + + diff --git a/src/views/Home/echarts-data.ts b/src/views/Home/echarts-data.ts index 56093f4b..9692ab90 100644 --- a/src/views/Home/echarts-data.ts +++ b/src/views/Home/echarts-data.ts @@ -151,6 +151,228 @@ export const barOptions: EChartsOption = { ] } +export const deviceRepairLineOptions: EChartsOption = { + title: { + text: '设备维修数量统计', + left: 'center' + }, + tooltip: { + trigger: 'axis' + }, + grid: { + left: 40, + right: 20, + bottom: 30, + top: 60, + containLabel: true + }, + xAxis: { + type: 'category', + boundaryGap: false, + data: ['一月', '二月', '三月', '四月', '五月', '六月'] + }, + yAxis: { + type: 'value' + }, + series: [ + { + name: '维修数量', + type: 'line', + smooth: true, + data: [3, 5, 4, 6, 8, 7] + } + ] +} + +export const deviceCategoryPieOptions: EChartsOption = { + title: { + text: '设备分类统计', + left: 'center' + }, + tooltip: { + trigger: 'item' + }, + legend: { + orient: 'vertical', + left: 'left' + }, + series: [ + { + name: '设备类别', + type: 'pie', + radius: '55%', + center: ['50%', '60%'], + data: [ + { value: 12, name: '注塑机' }, + { value: 9, name: '冲床' }, + { value: 6, name: '数控机床' }, + { value: 4, name: '检测设备' }, + { value: 2, name: '其他' } + ] + } + ] +} + +export const deviceDistributionBarOptions: EChartsOption = { + title: { + text: '设备分布统计', + left: 'center' + }, + tooltip: { + trigger: 'axis', + axisPointer: { + type: 'shadow' + } + }, + grid: { + left: 40, + right: 20, + bottom: 30, + top: 60, + containLabel: true + }, + xAxis: { + type: 'category', + data: ['一车间', '二车间', '三车间', '四车间', '五车间'], + axisTick: { + alignWithLabel: true + } + }, + yAxis: { + type: 'value' + }, + series: [ + { + name: '设备数量', + type: 'bar', + data: [10, 8, 6, 5, 4] + } + ] +} + +export const productionOverviewMock = { + orderCount: 9, + runningOrderCount: 12, + startedOrderCount: 12, + shutdownOrderCount: 0, + plannedOutput: 109210, + completedOutput: 1260, + qualifiedRate: 1.15, + alarmRate: 0, + onTimeRate: 0 +} + +export const productionProgressMock = [ + { + id: 'SCGD00000036', + orderNo: 'SCGD00000036', + productName: '大中型模具', + statusText: '生产中', + planStartTime: '2021-05-28 18:40:10', + planEndTime: '2021-06-05 18:40:10', + completeRate: 8.33 + }, + { + id: 'SCGD00000037', + orderNo: 'SCGD00000037', + productName: '大型注塑模具', + statusText: '排产中', + planStartTime: '2021-05-28 18:40:10', + planEndTime: '2021-06-10 18:40:10', + completeRate: 6.86 + }, + { + id: 'SCGD00000033', + orderNo: 'SCGD00000033', + productName: '模具零件加工', + statusText: '生产中', + planStartTime: '2021-04-02 17:50:12', + planEndTime: '2021-04-10 17:50:12', + completeRate: 57.58 + }, + { + id: 'SCGD00000040', + orderNo: 'SCGD00000040', + productName: '试模工单', + statusText: '待开工', + planStartTime: '2021-06-15 08:30:00', + planEndTime: '2021-06-20 18:00:00', + completeRate: 0 + } +] + +export const deviceStatusMock = { + inactive: 2, + active: 0, + total: 2 +} + +export const alarmStatusMock = { + serious: 0, + assignedToMe: 0, + total: 0 +} + +export const deviceOverviewMock = { + deviceTotal: 33, + needRepair: 0, + running: 33, + stop: 0, + utilization: 0, + alarmRate: 0 +} + +export const todoTasksMock = [ + { + id: 'TASK0001', + name: '模具工位点检任务', + type: '点检', + priority: '高', + planTime: '2021-06-13 13:00', + owner: '设备科' + }, + { + id: 'TASK0002', + name: '设备保养任务', + type: '保养', + priority: '中', + planTime: '2021-06-13 15:00', + owner: '保全班' + }, + { + id: 'TASK0003', + name: '注塑机状态巡检', + type: '巡检', + priority: '中', + planTime: '2021-06-14 09:00', + owner: '设备科' + }, + { + id: 'TASK0004', + name: '能耗异常分析', + type: '分析', + priority: '低', + planTime: '2021-06-14 14:00', + owner: '能源管理' + }, + { + id: 'TASK0005', + name: '设备档案核对', + type: '管理', + priority: '低', + planTime: '2021-06-15 10:00', + owner: '设备管理' + }, + { + id: 'TASK0006', + name: '安全隐患排查', + type: '安全', + priority: '高', + planTime: '2021-06-15 16:00', + owner: '安环部' + } +] + export const radarOption: EChartsOption = { legend: { data: [t('workplace.personal'), t('workplace.team')] diff --git a/src/views/Home/types.ts b/src/views/Home/types.ts index e6313d36..06a7bab1 100644 --- a/src/views/Home/types.ts +++ b/src/views/Home/types.ts @@ -1,7 +1,7 @@ export type WorkplaceTotal = { - project: number - access: number - todo: number + project: number + access: number + todo: number } export type Project = { @@ -53,3 +53,55 @@ export type MonthlySales = { estimate: number actual: number } + +export type ProductionOverview = { + orderCount: number + runningOrderCount: number + startedOrderCount: number + shutdownOrderCount: number + plannedOutput: number + completedOutput: number + qualifiedRate: number + alarmRate: number + onTimeRate: number +} + +export type ProductionProgressItem = { + id: string + orderNo: string + productName: string + statusText: string + planStartTime: string + planEndTime: string + completeRate: number +} + +export type DeviceStatusSummary = { + inactive: number + active: number + total: number +} + +export type AlarmStatusSummary = { + serious: number + assignedToMe: number + total: number +} + +export type DeviceOverview = { + deviceTotal: number + needRepair: number + running: number + stop: number + utilization: number + alarmRate: number +} + +export type TodoTask = { + id: string + name: string + type: string + priority: string + planTime: string + owner: string +} diff --git a/src/views/erp/mold/components/MoldList.vue b/src/views/erp/mold/components/MoldList.vue index 62bcd4d6..95d02c4a 100644 --- a/src/views/erp/mold/components/MoldList.vue +++ b/src/views/erp/mold/components/MoldList.vue @@ -1,26 +1,16 @@ - + 新增 - + - + - + @@ -29,21 +19,18 @@ - + - - + + + + 详情 + +link type="primary" @click="openForm('update', scope.row.id)" + v-hasPermi="['erp:mold-brand:update']"> 编辑 - + 删除 @@ -73,22 +52,231 @@ +:total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize" + @pagination="getList" /> - - + + + + + + + {{ detailData?.code ?? '' }} + {{ detailData?.name ?? '' }} + + + + {{ detailData?.brandName ?? '' }} + {{ detailData?.moldType ?? '' }} + + + + {{ detailData?.moldSize ?? '' }} + {{ detailData?.useTime ?? '' }} + {{ detailData?.machineName ?? detailData?.machineId ?? '' + }} + {{ formatDetailDate(detailData?.inTime) }} + + + + {{ detailData?.remark ?? '' }} + + + + + + + + + + + [{{ group.time }}] + 操作人: {{ group.operator }} + + + + + + + {{ getResultLabel(item.result) }} + {{ item.name }} + + + + 点检方式 + + + + + + 判定标准 + {{ item.criteria ?? '-' }} + + + 点检时间 + + {{ formatHistoryTime(item.inspectionTime) }} + + + + 创建时间 + + {{ formatHistoryTime(item.createTime) }} + + + + 备注 + {{ item.remark ?? '-' }} + + + + + 图片加载失败 + + + + + + + + + + + + + + + + + [{{ group.time }}] + 操作人: {{ group.operator }} + + + + + + + {{ getResultLabel(item.result) }} + {{ item.name }} + + + + 保养方式 + + + + + + 判定标准 + {{ item.criteria ?? '-' }} + + + 保养时间 + + {{ formatHistoryTime(item.inspectionTime) }} + + + + 创建时间 + + {{ formatHistoryTime(item.createTime) }} + + + + 备注 + {{ item.remark ?? '-' }} + + + + + 图片加载失败 + + + + + + + + + + + + + + + + + + + + + + + + {{ formatHistoryTime(scope.row.createTime) }} + + + + + + + + + + + + + diff --git a/src/views/mes/dvrepair/DvRepairForm.vue b/src/views/mes/dvrepair/DvRepairForm.vue index 067016a3..79e0301f 100644 --- a/src/views/mes/dvrepair/DvRepairForm.vue +++ b/src/views/mes/dvrepair/DvRepairForm.vue @@ -211,8 +211,8 @@ const ensureDeviceOptionsLoaded = async () => { if (deviceOptionsLoaded.value) return deviceLoading.value = true try { - const data = await DeviceLedgerApi.getDeviceLedgerPage({}) - const rows = (data?.list ?? []) as DeviceLedgerVO[] + const data = await DeviceLedgerApi.getDeviceLedgerList({}) + const rows = (Array.isArray(data) ? data : data?.list ?? data?.data ?? []) as DeviceLedgerVO[] deviceOptions.value = rows .filter((r) => typeof r?.id === 'number') .map((r) => ({ label: `${r.deviceCode ?? ''} ${r.deviceName ?? ''}`.trim(), value: r.id, raw: r })) diff --git a/src/views/mes/energydevicecheck/index.vue b/src/views/mes/energydevicecheck/index.vue index 742e43b4..d01b102d 100644 --- a/src/views/mes/energydevicecheck/index.vue +++ b/src/views/mes/energydevicecheck/index.vue @@ -2,7 +2,8 @@ - @@ -13,7 +14,8 @@ - - - @@ -76,7 +80,8 @@ - @@ -108,12 +113,27 @@ const getDisabledTime = () => { } } +const buildDefaultTimeRange = () => { + const pad = (n: number) => (n < 10 ? `0${n}` : String(n)) + const end = new Date() + end.setMinutes(0, 0, 0) + const start = new Date(end.getTime() - 7 * 24 * 60 * 60 * 1000) + const format = (d: Date) => { + const y = d.getFullYear() + const m = pad(d.getMonth() + 1) + const day = pad(d.getDate()) + const h = pad(d.getHours()) + return `${y}-${m}-${day} ${h}:00:00` + } + return [format(start), format(end)] as string[] +} + const queryParams = reactive({ pageNo: 1, pageSize: 10, name: undefined as string | undefined, orgId: undefined as string | number | undefined, - timeRange: [] as string[], + timeRange: buildDefaultTimeRange(), startTime: undefined as string | undefined, endTime: undefined as string | undefined }) @@ -187,7 +207,7 @@ const handleQuery = () => { /** 重置按钮操作 */ const resetQuery = () => { queryFormRef.value.resetFields() - queryParams.timeRange = [] + queryParams.timeRange = buildDefaultTimeRange() handleQuery() } diff --git a/src/views/mes/taskManagement/TaskManagementForm.vue b/src/views/mes/taskManagement/TaskManagementForm.vue index 2611f0be..3b2026e3 100644 --- a/src/views/mes/taskManagement/TaskManagementForm.vue +++ b/src/views/mes/taskManagement/TaskManagementForm.vue @@ -64,13 +64,6 @@ - - - - {{ dict.label }} - - - 确 定 @@ -127,11 +120,11 @@ const toCommaSeparatedIds = (value: any): string | undefined => { const ensureOptionsLoaded = async () => { const [deviceRes, planRes, userRes] = await Promise.all([ - DeviceLedgerApi.getDeviceLedgerPage({}), + DeviceLedgerApi.getDeviceLedgerList({}), PlanMaintenanceApi.getPlanMaintenancePage({ pageNo: 1, pageSize: 100 }), getSimpleUserList() ]) - deviceOptions.value = (deviceRes?.list ?? []) as DeviceOption[] + deviceOptions.value = (Array.isArray(deviceRes) ? deviceRes : deviceRes?.list ?? deviceRes?.data ?? []) as DeviceOption[] planOptions.value = (planRes?.list ?? []) as PlanOption[] users.value = userRes ?? [] } diff --git a/src/views/mes/taskManagement/index.vue b/src/views/mes/taskManagement/index.vue index f667c074..014cebfb 100644 --- a/src/views/mes/taskManagement/index.vue +++ b/src/views/mes/taskManagement/index.vue @@ -78,9 +78,12 @@ - + - + handleEnabledChange(scope.row, val)" + /> @@ -244,6 +247,19 @@ const handleCreateTicket = async (id?: number) => { } } +const handleEnabledChange = async (row: TaskManagementVO, value: boolean) => { + if (!row.id) return + const oldEnabled = row.enabled + row.enabled = value + try { + await TaskManagementApi.updateTaskManagementEnabled(String(row.id), value ? 'true' : 'false') + message.success('更新启用状态成功') + } catch { + row.enabled = oldEnabled + message.error('更新启用状态失败') + } +} + const handleExport = async () => { try { await message.exportConfirm() diff --git a/src/views/mes/workOrderManagement/components/TicketResultDialog.vue b/src/views/mes/workOrderManagement/components/TicketResultDialog.vue index e3e21d9c..346fc647 100644 --- a/src/views/mes/workOrderManagement/components/TicketResultDialog.vue +++ b/src/views/mes/workOrderManagement/components/TicketResultDialog.vue @@ -59,6 +59,7 @@ import { TicketManagementApi, TicketResultVO } from '@/api/mes/ticketManagement' defineOptions({ name: 'TicketResultDialog' }) +const emit = defineEmits(['success']) const message = useMessage() const dialogVisible = ref(false) @@ -140,6 +141,7 @@ const handleSave = async () => { try { await TicketManagementApi.batchUpdateTicketResults(payload) message.success('更新成功') + emit('success') dialogVisible.value = false } catch { message.error('更新失败') diff --git a/src/views/mes/workOrderManagement/index.vue b/src/views/mes/workOrderManagement/index.vue index d64fd0e0..7b644cb9 100644 --- a/src/views/mes/workOrderManagement/index.vue +++ b/src/views/mes/workOrderManagement/index.vue @@ -82,7 +82,7 @@ v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" @pagination="getList" /> - +