Merge remote-tracking branch 'origin/dev_pro2.0' into dev_pro2.0
| | |
| | | await updateFeedback(data); |
| | | formData.value = { ...formData.value, ...data }; |
| | | message.success($t('common.updateSuccess')); |
| | | await modalApi.close(); |
| | | } |
| | | // 刷新快照(已对齐数量并补 id),后续 submit 用于判断是否需要再保存 |
| | | originalSnapshot.value = JSON.stringify(data); |
| | |
| | | * 1. 按订单分组展示生产任务,订单为 project 行,任务为子行 |
| | | * 2. 支持只读预览和拖拽编辑两种模式 |
| | | * 3. 拖拽后触发 taskUpdate 事件,通知父组件批量保存 |
| | | * 4. 时间刻度:周 → 日 → 8 小时(1 工作日 = 8 小时) |
| | | * 4. 时间刻度:周 → 日 → 小时 |
| | | */ |
| | | defineOptions({ name: 'GanttChart', inheritAttrs: false }); |
| | | |
| | |
| | | |
| | | gantt.config.readonly = props.readonly; |
| | | gantt.config.date_format = '%Y-%m-%d %H:%i:%s'; |
| | | gantt.config.duration_unit = 'hour'; // 持续时间单位为小时,配合 duration_step 实现工作日单位 |
| | | gantt.config.duration_step = 8; // 1 工作日 = 8 小时 |
| | | gantt.config.duration_unit = 'hour'; // 持续时间单位为小时 |
| | | gantt.config.duration_step = 1; // duration 字段即为实际小时数 |
| | | gantt.config.row_height = 36; |
| | | gantt.config.bar_height = 24; |
| | | gantt.config.fit_tasks = true; |
| | |
| | | gantt.config.buttons_left = ['gantt_save_btn']; |
| | | gantt.config.buttons_right = ['gantt_cancel_btn']; |
| | | |
| | | // 时间刻度:周 > 日 > 8 小时 |
| | | // 时间刻度:周 > 日 > 小时 |
| | | const weekScaleTemplate = (date: Date) => { |
| | | const dateToStr = gantt.date.date_to_str('%M %d'); |
| | | const endDate = gantt.date.add(gantt.date.add(date, 1, 'week'), -1, 'day'); |
| | |
| | | gantt.config.scales = [ |
| | | { unit: 'week', step: 1, format: weekScaleTemplate }, |
| | | { unit: 'day', step: 1, format: dayTemplate, css: daysStyle }, |
| | | { unit: 'hour', step: 8, format: '%H:%i' }, |
| | | { unit: 'hour', step: 1, format: '%H:%i' }, |
| | | ]; |
| | | gantt.config.scale_height = 50; |
| | | gantt.config.show_task_cells = true; |
| | |
| | | }, |
| | | { |
| | | field: 'duration', |
| | | title: '生产时长', |
| | | width: 80, |
| | | title: '生产时长(h)', |
| | | width: 120, |
| | | }, |
| | | { |
| | | field: 'endTime', |
| | |
| | | }, |
| | | { |
| | | fieldName: 'duration', |
| | | label: '生产时长', |
| | | label: '生产时长(h)', |
| | | component: 'InputNumber', |
| | | componentProps: { |
| | | class: '!w-full', |
| | |
| | | ]; |
| | | } |
| | | |
| | | /** 计算结束时间:开始时间 + 生产时长 × 8 小时 */ |
| | | /** 计算结束时间:开始时间 + 生产时长(小时) */ |
| | | async function recalcEndTime(formApi?: VbenFormApi) { |
| | | if (!formApi) { |
| | | return; |
| | |
| | | const start = Number(values.startTime); |
| | | await formApi.setFieldValue( |
| | | 'endTime', |
| | | start + values.duration * 8 * 3600 * 1000, |
| | | start + values.duration * 3600 * 1000, |
| | | ); |
| | | } |
| | | } |
| | |
| | | width: 170, |
| | | formatter: 'formatDateTime', |
| | | }, |
| | | { field: 'duration', title: '生产时长', width: 100 }, |
| | | { field: 'duration', title: '生产时长(h)', width: 120 }, |
| | | { |
| | | field: 'endTime', |
| | | title: '预计完成时间', |
| | |
| | | label: '完成', |
| | | type: 'link', |
| | | auth: ['mes:pro-work-order:update'], |
| | | ifShow: row.status === MesProWorkOrderStatusEnum.CONFIRMED, |
| | | ifShow: |
| | | row.status === MesProWorkOrderStatusEnum.CONFIRMED && |
| | | !!row.quantityProduced, |
| | | onClick: handleFinish.bind(null, row), |
| | | }, |
| | | { |
| | |
| | | if (formData.value?.id) { |
| | | await updateWorkOrder({ ...formData.value, ...data }); |
| | | formData.value = { ...formData.value, ...data }; |
| | | emit("success"); |
| | | message.success($t("ui.actionMessage.operationSuccess")); |
| | | await modalApi.close(); |
| | | } else { |
| | | const id = await createWorkOrder(data); |
| | | formData.value = { |
| | |
| | | formType.value = "update"; |
| | | applySchema(); |
| | | await formApi.setValues(formData.value); |
| | | emit("success"); |
| | | } |
| | | originalSnapshot.value = JSON.stringify(await formApi.getValues()); |
| | | emit("success"); |
| | | message.success($t("ui.actionMessage.operationSuccess")); |
| | | } finally { |
| | | modalApi.unlock(); |
| | | } |
| | |
| | | } else { |
| | | await updateRoute(data); |
| | | formData.value = { ...formData.value, ...data }; |
| | | emit('success'); |
| | | message.success($t('ui.actionMessage.operationSuccess')); |
| | | await modalApi.close(); |
| | | return; |
| | | } |
| | | // 新增:保持弹窗打开,切换到编辑模式继续维护 |
| | | emit('success'); |
| | | message.success($t('ui.actionMessage.operationSuccess')); |
| | | } finally { |
| | |
| | | if (formData.value?.id) { |
| | | await updateItemReceipt({ ...formData.value, ...data }); |
| | | formData.value = { ...formData.value, ...data }; |
| | | } else { |
| | | emit('success'); |
| | | message.success($t('ui.actionMessage.operationSuccess')); |
| | | await modalApi.close(); |
| | | return; |
| | | } |
| | | // 新增:保持弹窗打开,切换到编辑模式 |
| | | const id = await createItemReceipt(data); |
| | | formData.value = { |
| | | ...data, |
| | |
| | | await formApi.setFieldValue('id', id); |
| | | await formApi.setFieldValue('status', formData.value.status); |
| | | formType.value = 'update'; |
| | | } |
| | | originalSnapshot.value = JSON.stringify(await formApi.getValues()); |
| | | emit('success'); |
| | | message.success($t('ui.actionMessage.operationSuccess')); |
| | |
| | | if (formData.value?.id) { |
| | | await updateProductIssue({ ...formData.value, ...data }); |
| | | formData.value = { ...formData.value, ...data }; |
| | | } else { |
| | | emit('success'); |
| | | message.success($t('ui.actionMessage.operationSuccess')); |
| | | await modalApi.close(); |
| | | return; |
| | | } |
| | | // 新增:保持弹窗打开,切换到编辑模式 |
| | | const id = await createProductIssue(data); |
| | | formData.value = { |
| | | ...data, |
| | |
| | | await formApi.setFieldValue('id', id); |
| | | await formApi.setFieldValue('status', formData.value.status); |
| | | formType.value = 'update'; |
| | | } |
| | | originalSnapshot.value = JSON.stringify(await formApi.getValues()); |
| | | emit('success'); |
| | | message.success($t('ui.actionMessage.operationSuccess')); |
| | |
| | | if (formData.value?.id) { |
| | | await updateReturnIssue({ ...formData.value, ...data }); |
| | | formData.value = { ...formData.value, ...data }; |
| | | } else { |
| | | emit('success'); |
| | | message.success($t('ui.actionMessage.operationSuccess')); |
| | | await modalApi.close(); |
| | | return; |
| | | } |
| | | // 新增:保持弹窗打开,切换到编辑模式 |
| | | const id = await createReturnIssue(data); |
| | | formData.value = { |
| | | ...data, |
| | |
| | | await formApi.setFieldValue('id', id); |
| | | await formApi.setFieldValue('status', formData.value.status); |
| | | formType.value = 'update'; |
| | | } |
| | | originalSnapshot.value = JSON.stringify(await formApi.getValues()); |
| | | emit('success'); |
| | | message.success($t('ui.actionMessage.operationSuccess')); |
| | |
| | | if (formData.value?.id) { |
| | | await updateSalesNotice({ ...formData.value, ...data }); |
| | | formData.value = { ...formData.value, ...data }; |
| | | } else { |
| | | emit('success'); |
| | | message.success($t('ui.actionMessage.operationSuccess')); |
| | | await modalApi.close(); |
| | | return; |
| | | } |
| | | // 新增:保持弹窗打开,切换到编辑模式 |
| | | const id = await createSalesNotice(data); |
| | | formData.value = { |
| | | ...data, |
| | |
| | | await formApi.setFieldValue('id', id); |
| | | await formApi.setFieldValue('status', formData.value.status); |
| | | formType.value = 'update'; |
| | | } |
| | | originalSnapshot.value = JSON.stringify(await formApi.getValues()); |
| | | emit('success'); |
| | | message.success($t('ui.actionMessage.operationSuccess')); |