diff --git a/src/locales/en.ts b/src/locales/en.ts index 6781d569..5c7a1810 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -4269,5 +4269,228 @@ export default { messageDeviceNoParams: 'No parameters under this device', messageFetchChartFailed: 'Failed to load chart data' } + }, + ProductionReport: { + Index: { + searchCodeLabel: 'Task Code', + searchCodePlaceholder: 'Please enter task code', + searchOrderDateLabel: 'Order Date', + searchDeliveryDateLabel: 'Delivery Date', + searchRemarkLabel: 'Remark', + searchRemarkPlaceholder: 'Please enter remark', + searchCreateTimeLabel: 'Create Time', + startDatePlaceholder: 'Start Date', + endDatePlaceholder: 'End Date', + buttonSearch: 'Search', + buttonReset: 'Reset', + buttonExport: 'Export', + tabAll: 'All', + tabIssued: 'Issued', + tabPartialScheduled: 'Partial Scheduled', + tabPendingProduction: 'Pending', + tabInProduction: 'In Production', + tabCompleted: 'Completed', + tableCode: 'Task Code', + tableOrderDate: 'Order Date', + tableDeliveryDate: 'Delivery Date', + tableStatus: 'Status', + tableIsScheduled: 'Scheduled', + tableProductionProgress: 'Progress', + tableRemark: 'Remark', + yes: 'Yes', + no: 'No', + detailTabBasicInfo: 'Basic Info', + detailTabRelatedPlan: 'Related Plans', + detailTabQualityInfo: 'Quality Info', + detailTabBaogongInfo: 'Work Report', + exportFilename: 'ProductionReport' + }, + BasicInfo: { + buttonRefresh: 'Refresh', + tableTaskCode: 'Task Code', + tableProductCode: 'Product Code', + tableProductName: 'Product Name', + tableTotalNumber: 'Total Qty', + tablePlanNumber: 'Planned Qty', + tableUnplannedNumber: 'Unplanned Qty', + tableOperate: 'Operate', + buttonViewProductInfo: 'View Product' + }, + ProductInfo: { + dialogTitle: 'Product Info', + labelProductCode: 'Product Code', + labelProductName: 'Product Name', + labelNumber: 'Quantity', + labelUnit: 'Unit', + labelSpecification: 'Specification', + tableMaterialCode: 'Material Code', + tableMaterialName: 'Material Name', + tableRequiredQuantity: 'Required Qty', + tableUnit: 'Unit' + }, + BaogongInfo: { + dateRangeSeparator: 'To', + startDatePlaceholder: 'Start Date', + endDatePlaceholder: 'End Date', + buttonToday: 'Today', + buttonLast7Days: 'Last 7 Days', + buttonLast30Days: 'Last 30 Days', + buttonReset: 'Reset', + buttonRefresh: 'Refresh', + tableTaskCode: 'Task Code', + tablePlanCode: 'Plan Code', + tableEmployeeId: 'Employee ID', + tableEmployeeName: 'Employee Name', + tableProductName: 'Product Name', + tableProductCode: 'Product Code', + tableBaogongNumber: 'Report Qty', + tablePassNumber: 'Pass Qty', + tableNoPassNumber: 'Fail Qty', + tablePassRate: 'Pass Rate%', + tableNoPassReason: 'Fail Reason', + tableBaogongTime: 'Report Time' + }, + QualityInfo: { + buttonRefresh: 'Refresh', + expandTableName: 'Inspection Item', + expandTableMethod: 'Method', + expandTableStandard: 'Standard', + expandTableUnit: 'Unit', + expandTableUpperLimit: 'Upper Limit', + expandTableLowerLimit: 'Lower Limit', + expandTableInputValue: 'Input Value', + expandTableImage: 'Image', + expandTablePreview: 'Preview', + expandTableResult: 'Result', + expandTableRemark: 'Remark', + tableCode: 'Inspection Code', + tableCategory: 'Category', + tableStatus: 'Status', + tableTicketCode: 'Ticket Code', + tableProcess: 'Process', + tableSchema: 'Inspection Schema', + tableManager: 'Manager', + tableExecutor: 'Executor', + tableExecuteTime: 'Execute Time', + tableRemark: 'Remark', + tableResult: 'Result', + resultPass: 'Pass', + resultFail: 'Fail', + inspectionPending: 'Pending', + inspectionPass: 'Passed', + inspectionFail: 'Failed', + unknown: 'Unknown' + }, + RelatedPlan: { + buttonRefresh: 'Refresh', + emptyDescription: 'No related plans' + }, + PlanCard: { + labelProductName: 'Product Name', + labelDeviceName: 'Device Name', + labelPlanStartTime: 'Plan Start Time', + labelPlanEndTime: 'Plan End Time', + labelLatestStartTime: 'Latest Start Time', + statPlanNumber: 'Planned Qty', + statWangongNumber: 'Completed Qty', + statPassNumber: 'Pass Qty', + statNoPassNumber: 'Fail Qty', + statPassRate: 'Pass Rate', + emptyDescription: 'No data' + }, + Timeline: { + unknown: 'Unknown', + statusScheduled: 'Scheduled', + statusPaused: 'Paused', + statusPendingStorage: 'Pending Storage', + statusStored: 'Stored', + statusStarted: 'Started' + } + }, + GanttChart: { + Index: { + searchTimeLabel: 'Query Time', + startPlaceholder: 'Start Time', + endPlaceholder: 'End Time', + deviceLabel: 'Device', + devicePlaceholder: 'Please select device', + buttonSearch: 'Search', + buttonReset: 'Reset' + }, + CardView: { + legendScheduled: 'Scheduled', + legendMerged: 'Merged', + legendPaused: 'Paused', + legendPendingStorage: 'Pending Storage', + legendStored: 'Stored', + statPlanCount: 'Plans', + statCapacity: 'Capacity', + planCodeLabel: 'Plan Code:', + productLabel: 'Product:', + planNumberLabel: 'Plan Qty:', + deliveryDateLabel: 'Delivery Date:', + startLabel: 'Start:', + endLabel: 'End:', + emptyDescription: 'No Plans', + statusScheduled: 'Scheduled', + statusMerged: 'Merged', + statusPaused: 'Paused', + statusPendingStorage: 'Pending Storage', + statusStored: 'Stored', + statusUnknown: 'Unknown' + }, + GanttPanel: { + detailTitle: 'Schedule Info', + deviceNameLabel: 'Device Name', + deviceIdLabel: 'Device ID', + capacityLabel: 'Capacity', + dailyAvgLabel: 'Daily Avg Report', + dataCollectionCapacityLabel: 'DC Capacity', + planCountLabel: 'Plan Count', + planDetailTitle: 'Plan Details', + planCodeColon: 'Plan Code: ', + planNumberColon: 'Plan Qty: ', + deliveryDateColon: 'Delivery Date: ', + startColon: 'Start: ', + endColon: 'End: ', + latestStartColon: 'Latest Start: ', + emptyDescription: 'No Schedule Info', + adjustTaskTitle: 'Adjust Task', + deviceLabel: 'Device', + devicePlaceholder: 'Please select device', + startDateLabel: 'Start Date', + startDatePlaceholder: 'Please select start date', + durationLabel: 'Days', + buttonCancel: 'Cancel', + buttonConfirm: 'Confirm', + editStartDateTitle: 'Edit Start Time', + startTimeLabel: 'Start Time', + startTimePlaceholder: 'Please select start time', + warningCompleteDeviceDate: 'Please complete device and start date', + warningValidTime: 'Please select a valid time', + columnTaskName: 'Task Name', + columnStartTime: 'Start Time', + columnDays: 'Days', + scaleMonthFormat: 'MMM YYYY', + tooltipTaskDetail: 'Task Detail', + tooltipTaskCode: 'Task Code: ', + tooltipProduct: 'Product: ', + tooltipDetailId: 'Detail ID: ', + tooltipPlanNumber: 'Plan Qty: ', + tooltipStart: 'Start: ', + tooltipEnd: 'End: ', + tooltipLatestStart: 'Latest Start: ', + tooltipSummary: 'Summary', + tooltipDevice: 'Device: ', + tooltipDetailCount: 'Detail Count: ', + tooltipTotalPlanNumber: 'Total Plan Qty: ', + tooltipEarliestStart: 'Earliest Start: ', + tooltipLatestEnd: 'Latest End: ', + statusScheduled: 'Scheduled', + statusStarted: 'Started', + statusPaused: 'Paused', + statusPendingStorage: 'Pending Storage', + statusStored: 'Stored' + } } } diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts index eef7d30c..8b896efa 100644 --- a/src/locales/zh-CN.ts +++ b/src/locales/zh-CN.ts @@ -4486,6 +4486,229 @@ export default { } + } + }, + ProductionReport: { + Index: { + searchCodeLabel: '任务单编码', + searchCodePlaceholder: '请输入任务单编码', + searchOrderDateLabel: '下达日期', + searchDeliveryDateLabel: '交货日期', + searchRemarkLabel: '备注', + searchRemarkPlaceholder: '请输入备注', + searchCreateTimeLabel: '创建时间', + startDatePlaceholder: '开始日期', + endDatePlaceholder: '结束日期', + buttonSearch: '搜索', + buttonReset: '重置', + buttonExport: '导出', + tabAll: '全部', + tabIssued: '已下达', + tabPartialScheduled: '部分排产', + tabPendingProduction: '待生产', + tabInProduction: '生产中', + tabCompleted: '已完成', + tableCode: '任务单编码', + tableOrderDate: '下达日期', + tableDeliveryDate: '交货日期', + tableStatus: '状态', + tableIsScheduled: '是否排产', + tableProductionProgress: '生产进度', + tableRemark: '备注', + yes: '是', + no: '否', + detailTabBasicInfo: '基础信息', + detailTabRelatedPlan: '关联计划', + detailTabQualityInfo: '质检信息', + detailTabBaogongInfo: '报工信息', + exportFilename: '生产报表' + }, + BasicInfo: { + buttonRefresh: '刷新', + tableTaskCode: '任务单编码', + tableProductCode: '产品编码', + tableProductName: '产品名称', + tableTotalNumber: '总数量', + tablePlanNumber: '已计划数量', + tableUnplannedNumber: '未计划数量', + tableOperate: '操作', + buttonViewProductInfo: '查看产品信息' + }, + ProductInfo: { + dialogTitle: '产品信息', + labelProductCode: '产品编码', + labelProductName: '产品名称', + labelNumber: '数量', + labelUnit: '单位', + labelSpecification: '规格', + tableMaterialCode: '原料编码', + tableMaterialName: '原料名称', + tableRequiredQuantity: '需求量', + tableUnit: '单位' + }, + BaogongInfo: { + dateRangeSeparator: '至', + startDatePlaceholder: '开始日期', + endDatePlaceholder: '结束日期', + buttonToday: '今日', + buttonLast7Days: '近七天', + buttonLast30Days: '近30日', + buttonReset: '重置', + buttonRefresh: '刷新', + tableTaskCode: '任务单编码', + tablePlanCode: '计划编码', + tableEmployeeId: '员工ID', + tableEmployeeName: '员工名称', + tableProductName: '产品名称', + tableProductCode: '产品编码', + tableBaogongNumber: '报工数量', + tablePassNumber: '合格数量', + tableNoPassNumber: '不合格数量', + tablePassRate: '合格率%', + tableNoPassReason: '不合格原因', + tableBaogongTime: '报工时间' + }, + QualityInfo: { + buttonRefresh: '刷新', + expandTableName: '检验项名称', + expandTableMethod: '检验方式', + expandTableStandard: '判定基准', + expandTableUnit: '单位', + expandTableUpperLimit: '上限值', + expandTableLowerLimit: '下限值', + expandTableInputValue: '输入值', + expandTableImage: '图片', + expandTablePreview: '预览', + expandTableResult: '检验结果', + expandTableRemark: '备注', + tableCode: '质检编码', + tableCategory: '质检分类', + tableStatus: '状态', + tableTicketCode: '工单编码', + tableProcess: '工序', + tableSchema: '检验方案', + tableManager: '负责人', + tableExecutor: '执行人', + tableExecuteTime: '执行时间', + tableRemark: '备注', + tableResult: '结果', + resultPass: '通过', + resultFail: '不通过', + inspectionPending: '待检测', + inspectionPass: '检测通过', + inspectionFail: '检测不通过', + unknown: '未知' + }, + RelatedPlan: { + buttonRefresh: '刷新', + emptyDescription: '暂无关联计划' + }, + PlanCard: { + labelProductName: '产品名称', + labelDeviceName: '设备名称', + labelPlanStartTime: '计划开始时间', + labelPlanEndTime: '计划结束时间', + labelLatestStartTime: '最晚开始时间', + statPlanNumber: '计划数量', + statWangongNumber: '完工数量', + statPassNumber: '合格数量', + statNoPassNumber: '不合格数量', + statPassRate: '合格率', + emptyDescription: '暂无数据' + }, + Timeline: { + unknown: '未知', + statusScheduled: '已排产', + statusPaused: '暂停', + statusPendingStorage: '待入库', + statusStored: '已入库', + statusStarted: '已开工' + } + }, + GanttChart: { + Index: { + searchTimeLabel: '查询时间', + startPlaceholder: '开始时间', + endPlaceholder: '结束时间', + deviceLabel: '设备', + devicePlaceholder: '请选择设备', + buttonSearch: '查询', + buttonReset: '重置' + }, + CardView: { + legendScheduled: '已排产', + legendMerged: '已并工', + legendPaused: '暂停', + legendPendingStorage: '待入库', + legendStored: '已入库', + statPlanCount: '计划数', + statCapacity: '产能', + planCodeLabel: '计划编号:', + productLabel: '产品:', + planNumberLabel: '计划数量:', + deliveryDateLabel: '交货日期:', + startLabel: '开始:', + endLabel: '结束:', + emptyDescription: '暂无计划', + statusScheduled: '已排产', + statusMerged: '已并工', + statusPaused: '暂停', + statusPendingStorage: '待入库', + statusStored: '已入库', + statusUnknown: '未知' + }, + GanttPanel: { + detailTitle: '计划信息', + deviceNameLabel: '设备名称', + deviceIdLabel: '设备ID', + capacityLabel: '产能', + dailyAvgLabel: '每日报工平均值', + dataCollectionCapacityLabel: '数据采集产能', + planCountLabel: '计划条数', + planDetailTitle: '计划明细', + planCodeColon: '计划编码:', + planNumberColon: '计划数量:', + deliveryDateColon: '交货日期:', + startColon: '开始:', + endColon: '结束:', + latestStartColon: '最晚开工:', + emptyDescription: '暂无计划信息', + adjustTaskTitle: '调整任务', + deviceLabel: '设备', + devicePlaceholder: '请选择设备', + startDateLabel: '开始日期', + startDatePlaceholder: '请选择开始日期', + durationLabel: '天数', + buttonCancel: '取消', + buttonConfirm: '确定', + editStartDateTitle: '修改开始时间', + startTimeLabel: '开始时间', + startTimePlaceholder: '请选择开始时间', + warningCompleteDeviceDate: '请完善设备和开始日期', + warningValidTime: '请选择有效的时间', + columnTaskName: '任务名称', + columnStartTime: '开始时间', + columnDays: '天数', + scaleMonthFormat: 'YYYY年M月', + tooltipTaskDetail: '任务明细', + tooltipTaskCode: '任务单:', + tooltipProduct: '产品:', + tooltipDetailId: '明细ID:', + tooltipPlanNumber: '计划数量:', + tooltipStart: '开始:', + tooltipEnd: '结束:', + tooltipLatestStart: '最晚开工:', + tooltipSummary: '汇总', + tooltipDevice: '设备:', + tooltipDetailCount: '任务明细条数:', + tooltipTotalPlanNumber: '计划总数:', + tooltipEarliestStart: '最早计划开始:', + tooltipLatestEnd: '最晚计划结束:', + statusScheduled: '已排产', + statusStarted: '已开工', + statusPaused: '暂停', + statusPendingStorage: '待入库', + statusStored: '已入库' } } } diff --git a/src/views/erp/stock/out/index.vue b/src/views/erp/stock/out/index.vue index c2762414..bfb0ee63 100644 --- a/src/views/erp/stock/out/index.vue +++ b/src/views/erp/stock/out/index.vue @@ -420,7 +420,7 @@ onMounted(async () => { // TODO 芋艿:可优化功能:列表界面,支持导入 // TODO 芋艿:可优化功能:详情界面,支持打印 /** tab 切换 */ -let activeName = '产品出库' +let activeName = '领料出库' const handleTabClick = (tab: TabsPaneContext) => { queryParams.outType = tab.paneName handleQuery() diff --git a/src/views/mes/components/ScheduleGanttPanel.vue b/src/views/mes/components/ScheduleGanttPanel.vue index 0bf5399d..0c69429b 100644 --- a/src/views/mes/components/ScheduleGanttPanel.vue +++ b/src/views/mes/components/ScheduleGanttPanel.vue @@ -2,7 +2,7 @@
-
计划信息
+
{{ t('GanttChart.GanttPanel.detailTitle') }}
- +
- + - - + + - + - + - + - + @@ -102,16 +102,19 @@ import dayjs from 'dayjs' import { gantt } from 'dhtmlx-gantt' import 'dhtmlx-gantt/codebase/dhtmlxgantt.css' +import { useI18n } from '@/hooks/web/useI18n' defineOptions({ name: 'ScheduleGanttPanel' }) +const { t } = useI18n() + // 计划状态颜色映射表 const PLAN_STATUS_COLOR_MAP = { - 1: { label: '已排产', color: '#409eff', textColor: '#ffffff', sort: 1 }, - 8: { label: '已开工', color: '#67c23a', textColor: '#ffffff', sort: 2 }, - 3: { label: '暂停', color: '#e6a23c', textColor: '#ffffff', sort: 3 }, - 4: { label: '待入库', color: '#f56c6c', textColor: '#ffffff', sort: 4 }, - 5: { label: '已入库', color: '#8e7cc3', textColor: '#ffffff', sort: 5 }, + 1: { label: t('GanttChart.GanttPanel.statusScheduled'), color: '#409eff', textColor: '#ffffff', sort: 1 }, + 8: { label: t('GanttChart.GanttPanel.statusStarted'), color: '#67c23a', textColor: '#ffffff', sort: 2 }, + 3: { label: t('GanttChart.GanttPanel.statusPaused'), color: '#e6a23c', textColor: '#ffffff', sort: 3 }, + 4: { label: t('GanttChart.GanttPanel.statusPendingStorage'), color: '#f56c6c', textColor: '#ffffff', sort: 4 }, + 5: { label: t('GanttChart.GanttPanel.statusStored'), color: '#8e7cc3', textColor: '#ffffff', sort: 5 }, } const sortedPlanStatusList = Object.entries(PLAN_STATUS_COLOR_MAP) @@ -339,25 +342,25 @@ const buildTaskTooltipHtml = (task: any, start?: Date, end?: Date) => { const plan = task?._planData if (plan) { return ` -
任务明细
-
任务单:${plan.taskCode ?? '-'}
-
产品:${plan.productCode ?? '-'} / ${plan.productName ?? '-'}
-
明细ID:${plan.taskDetailId ?? '-'}
-
计划数量:${plan.planNumber ?? '-'}
-
开始:${formatTooltipDateTime(start ?? task?.start_date)}
-
结束:${formatTooltipDateTime(end ?? task?.end_date)}
-
最晚开工:${formatTooltipDateTime(plan.latestStartTimeStr)}
+
${t('GanttChart.GanttPanel.tooltipTaskDetail')}
+
${t('GanttChart.GanttPanel.tooltipTaskCode')}${plan.taskCode ?? '-'}
+
${t('GanttChart.GanttPanel.tooltipProduct')}${plan.productCode ?? '-'} / ${plan.productName ?? '-'}
+
${t('GanttChart.GanttPanel.tooltipDetailId')}${plan.taskDetailId ?? '-'}
+
${t('GanttChart.GanttPanel.tooltipPlanNumber')}${plan.planNumber ?? '-'}
+
${t('GanttChart.GanttPanel.tooltipStart')}${formatTooltipDateTime(start ?? task?.start_date)}
+
${t('GanttChart.GanttPanel.tooltipEnd')}${formatTooltipDateTime(end ?? task?.end_date)}
+
${t('GanttChart.GanttPanel.tooltipLatestStart')}${formatTooltipDateTime(plan.latestStartTimeStr)}
` } const device = task?._deviceData const summary = getDeviceTaskSummary(task) return ` -
汇总
-
设备:${device?.deviceName ?? '-'}
-
任务明细条数:${summary.planCount}
-
计划总数:${summary.totalPlanNumber}
-
最早计划开始:${summary.earliestStart}
-
最晚计划结束:${summary.latestEnd}
+
${t('GanttChart.GanttPanel.tooltipSummary')}
+
${t('GanttChart.GanttPanel.tooltipDevice')}${device?.deviceName ?? '-'}
+
${t('GanttChart.GanttPanel.tooltipDetailCount')}${summary.planCount}
+
${t('GanttChart.GanttPanel.tooltipTotalPlanNumber')}${summary.totalPlanNumber}
+
${t('GanttChart.GanttPanel.tooltipEarliestStart')}${summary.earliestStart}
+
${t('GanttChart.GanttPanel.tooltipLatestEnd')}${summary.latestEnd}
` } const getTaskByTooltipNode = (node: HTMLElement) => { @@ -617,7 +620,7 @@ const openTaskAdjustDialog = (task: any) => { const handleTaskAdjustSubmit = () => { if (!taskAdjustTaskId.value || !props.editable) return if (!taskAdjustForm.deviceTaskId || !taskAdjustForm.startDate) { - message.warning('请完善设备和开始日期') + message.warning(t('GanttChart.GanttPanel.warningCompleteDeviceDate')) return } const task = gantt.getTask(taskAdjustTaskId.value) @@ -643,7 +646,7 @@ const handleStartDateEditorSubmit = () => { } const newStart = dayjs(startDateEditorValue.value) if (!newStart.isValid()) { - message.warning('请选择有效的时间') + message.warning(t('GanttChart.GanttPanel.warningValidTime')) return } const duration = Math.max(Number(task.duration) || 1, 1) @@ -717,14 +720,14 @@ const initGanttPreview = () => { gantt.config.columns = [ { name: 'text', - label: '任务名称', + label: t('GanttChart.GanttPanel.columnTaskName'), tree: true, width: '*', min_width: 200 }, { name: 'start_date', - label: '开始时间', + label: t('GanttChart.GanttPanel.columnStartTime'), align: 'center', width: 210, template: (task: any) => @@ -734,7 +737,7 @@ const initGanttPreview = () => { }, { name: 'duration', - label: '天数', + label: t('GanttChart.GanttPanel.columnDays'), align: 'center', width: 60, template: (task: any) => @@ -750,7 +753,7 @@ const initGanttPreview = () => { ] gantt.config.scales = [ - { unit: 'month', step: 1, format: (date) => dayjs(date).format('YYYY年M月') }, + { unit: 'month', step: 1, format: (date) => dayjs(date).format(t('GanttChart.GanttPanel.scaleMonthFormat')) }, { unit: 'day', step: 1, format: (date) => dayjs(date).format('MM-DD') } ] diff --git a/src/views/mes/ganttChart/components/ScheduleCardView.vue b/src/views/mes/ganttChart/components/ScheduleCardView.vue new file mode 100644 index 00000000..71058b5d --- /dev/null +++ b/src/views/mes/ganttChart/components/ScheduleCardView.vue @@ -0,0 +1,426 @@ + + + + + diff --git a/src/views/mes/ganttChart/index.vue b/src/views/mes/ganttChart/index.vue index 8c39ac95..5d96385e 100644 --- a/src/views/mes/ganttChart/index.vue +++ b/src/views/mes/ganttChart/index.vue @@ -1,43 +1,57 @@ + + diff --git a/src/views/mes/plan/index.vue b/src/views/mes/plan/index.vue index d6a679a4..88d76c3e 100644 --- a/src/views/mes/plan/index.vue +++ b/src/views/mes/plan/index.vue @@ -73,34 +73,20 @@