| | |
| | | import { DICT_TYPE } from '@vben/constants'; |
| | | import { getDictOptions } from '@vben/hooks'; |
| | | |
| | | import { message } from 'ant-design-vue'; |
| | | |
| | | import CrmCustomerSelect from '#/components/crm-customer-select.vue'; |
| | | import { calculateTaskDuration } from '#/api/mes/pro/task'; |
| | | import { getRangePickerDefaultProps } from '#/utils'; |
| | | import { MdItemSelect } from '#/views/mes/md/item/components'; |
| | | import { MdWorkstationSelect } from '#/views/mes/md/workstation/components'; |
| | |
| | | class: '!w-full', |
| | | disabled: true, |
| | | format: 'YYYY-MM-DD', |
| | | valueFormat: 'x', |
| | | valueFormat: 'YYYY-MM-DD', |
| | | }, |
| | | }, |
| | | { |
| | |
| | | component: markRaw(MdWorkstationSelect), |
| | | componentProps: { |
| | | placeholder: '请选择工作站', |
| | | onChange: () => recalcDuration(formApi), |
| | | }, |
| | | rules: 'selectRequired', |
| | | }, |
| | |
| | | min: 0.01, |
| | | placeholder: '请输入排产数量', |
| | | precision: 2, |
| | | onChange: () => recalcDuration(formApi), |
| | | }, |
| | | rules: 'required', |
| | | }, |
| | |
| | | component: 'DatePicker', |
| | | componentProps: { |
| | | class: '!w-full', |
| | | placeholder: '请选择开始时间', |
| | | placeholder: '请先选择工作站', |
| | | showTime: true, |
| | | valueFormat: 'x', |
| | | // 开始时间变更:重新计算结束时间 |
| | | valueFormat: 'YYYY-MM-DD HH:mm:ss', |
| | | onChange: () => recalcEndTime(formApi), |
| | | }, |
| | | dependencies: { |
| | | triggerFields: ['workstationId'], |
| | | componentProps: (values) => ({ |
| | | disabled: !values.workstationId, |
| | | placeholder: values.workstationId ? '请选择开始时间' : '请先选择工作站', |
| | | }), |
| | | }, |
| | | rules: 'required', |
| | | }, |
| | |
| | | class: '!w-full', |
| | | disabled: true, |
| | | showTime: true, |
| | | valueFormat: 'x', |
| | | valueFormat: 'YYYY-MM-DD HH:mm:ss', |
| | | }, |
| | | }, |
| | | { |
| | |
| | | ]; |
| | | } |
| | | |
| | | /** 选择工作站或修改数量后,自动计算生产时长 */ |
| | | async function recalcDuration(formApi?: VbenFormApi) { |
| | | if (!formApi) return; |
| | | const values = await formApi.getValues(); |
| | | if (!values.workstationId || !values.quantity) return; |
| | | try { |
| | | const res = await calculateTaskDuration(values.workstationId, values.quantity); |
| | | await formApi.setFieldValue('duration', res.duration); |
| | | if (res.duration === 0) { |
| | | message.warning('该工作站未绑定设备,或绑定设备未配置生产效率'); |
| | | } |
| | | // 重新计算结束时间 |
| | | await recalcEndTime(formApi); |
| | | } catch { |
| | | // 计算失败不阻塞用户操作 |
| | | } |
| | | } |
| | | |
| | | /** 计算结束时间:开始时间 + 生产时长(小时) */ |
| | | async function recalcEndTime(formApi?: VbenFormApi) { |
| | | if (!formApi) { |
| | |
| | | } |
| | | const values = await formApi.getValues(); |
| | | if (values.startTime && values.duration) { |
| | | const start = Number(values.startTime); |
| | | await formApi.setFieldValue( |
| | | 'endTime', |
| | | start + values.duration * 3600 * 1000, |
| | | ); |
| | | const start = new Date(values.startTime).getTime(); |
| | | const endTime = start + values.duration * 3600 * 1000; |
| | | const pad = (n: number) => String(n).padStart(2, '0'); |
| | | const d = new Date(endTime); |
| | | const formatted = `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`; |
| | | await formApi.setFieldValue('endTime', formatted); |
| | | } |
| | | } |
| | | |