feat(mes): 生产任务报工人下拉源调整为工作站人力配置
- 后端: `MesMdWorkstationWorkerController` 新增 `list-user-by-workstation` 接口,支持按工作站拉取关联岗位对应的精简用户信息。
- 前端: `task-form.vue` 移除原依赖生产订单 `feedbackRole`(报工人角色)获取报工人员的废弃逻辑。
- 前端: 调整新增生产任务表单,报工人下拉列表与“工作站”联动,切换工作站时动态拉取对应人员。
- 前端: 增加缺失配置预警,当所选工作站未配置人力资源时,自动弹出“当前工作站没有配置人力资源”的警告提示。
- 修复: 修复因下拉组件传参类型不匹配,导致弹窗刚打开时触发“请求参数缺失:workstationId”报错的问题。
| | |
| | | import { requestClient } from '#/api/request'; |
| | | import type { SystemUserApi } from '#/api/system/user'; |
| | | |
| | | export namespace MesMdWorkstationWorkerApi { |
| | | /** MES 工作站人力资源 */ |
| | |
| | | ); |
| | | } |
| | | |
| | | /** 获得工作站对应岗位的员工列表 */ |
| | | export function getUserListByWorkstationId(params: { workstationId: number }) { |
| | | if (!params || !params.workstationId) { |
| | | return Promise.resolve([]); |
| | | } |
| | | return requestClient.get<SystemUserApi.UserSimple[]>( |
| | | '/mes/md-workstation-worker/list-user-by-workstation', |
| | | { params }, |
| | | ); |
| | | } |
| | | |
| | | /** 新增工作站人力资源 */ |
| | | export function createWorkstationWorker( |
| | | data: MesMdWorkstationWorkerApi.WorkstationWorker, |
| | |
| | | |
| | | watch(() => props.visible, async (newVal) => { |
| | | if (newVal && props.productCode) { |
| | | open.value = true; |
| | | loading.value = true; |
| | | detailList.value = []; |
| | | activeProject.value = '0'; |
| | | try { |
| | | detailList.value = await getPdArchiveDetailByProduct(props.productCode); |
| | | } catch { |
| | | message.error('获取归档详情失败'); |
| | | } finally { |
| | | loading.value = false; |
| | | } |
| | | loadData(props.productCode); |
| | | } else if (!newVal) { |
| | | open.value = false; |
| | | detailList.value = []; |
| | | } |
| | | }); |
| | | |
| | | async function loadData(code: string) { |
| | | open.value = true; |
| | | loading.value = true; |
| | | detailList.value = []; |
| | | activeProject.value = '0'; |
| | | try { |
| | | detailList.value = await getPdArchiveDetailByProduct(code); |
| | | } catch { |
| | | message.error('获取归档详情失败'); |
| | | } finally { |
| | | loading.value = false; |
| | | } |
| | | } |
| | | |
| | | function openModal(code: string) { |
| | | loadData(code); |
| | | } |
| | | |
| | | defineExpose({ open: openModal }); |
| | | |
| | | function handleClose() { |
| | | emit('update:visible', false); |
| | | } |
| | |
| | | import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; |
| | | import type { VxeTableGridOptions } from '#/adapter/vxe-table'; |
| | | import { z } from '#/adapter/form'; |
| | | import { getSimpleUserListByRoleCode } from '#/api/system/user'; |
| | | import { getUserListByWorkstationId } from '#/api/mes/md/workstation/worker'; |
| | | import type { MesProTaskApi } from '#/api/mes/pro/task'; |
| | | import type { MesProWorkOrderApi } from '#/api/mes/pro/workorder'; |
| | | |
| | |
| | | } |
| | | |
| | | /** 生产任务新增/修改的表单 */ |
| | | export function useTaskFormSchema(formApi?: VbenFormApi, workOrderQuantity?: Ref<number | undefined>, feedbackRole?: Ref<string | undefined>): VbenFormSchema[] { |
| | | export function useTaskFormSchema(formApi?: VbenFormApi, workOrderQuantity?: Ref<number | undefined>): VbenFormSchema[] { |
| | | return [ |
| | | { |
| | | fieldName: 'workstationId', |
| | |
| | | component: 'ApiSelect', |
| | | componentProps: { |
| | | placeholder: '请选择报工人', |
| | | api: getSimpleUserListByRoleCode, |
| | | params: { code: feedbackRole?.value || 'production_submit_work' }, |
| | | api: getUserListByWorkstationId, |
| | | labelField: 'nickname', |
| | | valueField: 'id', |
| | | mode: 'multiple', |
| | | }, |
| | | dependencies: { |
| | | triggerFields: ['workstationId'], |
| | | componentProps: (values) => ({ |
| | | params: { workstationId: values.workstationId }, |
| | | disabled: !values.workstationId, |
| | | placeholder: values.workstationId ? '请选择报工人' : '请先选择工作站', |
| | | }), |
| | | }, |
| | | rules: z.array(z.number()).min(1, '请选择报工人').default([]), |
| | | }, |
| | |
| | | async function recalcDuration(formApi?: VbenFormApi) { |
| | | if (!formApi) return; |
| | | const values = await formApi.getValues(); |
| | | |
| | | if (values.workstationId) { |
| | | try { |
| | | const users = await getUserListByWorkstationId({ workstationId: values.workstationId }); |
| | | if (!users || users.length === 0) { |
| | | message.warning('当前工作站没有配置人力资源'); |
| | | } |
| | | } catch { |
| | | // ignore |
| | | } |
| | | } |
| | | |
| | | if (!values.workstationId || !values.quantity) return; |
| | | try { |
| | | const res = await calculateTaskDuration(values.workstationId, values.quantity); |
| | |
| | | <script lang="ts" setup> |
| | | <script lang="ts" setup> |
| | | import type { MesProTaskApi } from '#/api/mes/pro/task'; |
| | | |
| | | import { computed, ref } from 'vue'; |
| | |
| | | |
| | | import { useVbenForm } from '#/adapter/form'; |
| | | import { createTask, getTask, updateTask } from '#/api/mes/pro/task'; |
| | | import { getWorkOrder } from '#/api/mes/pro/workorder'; |
| | | import { $t } from '#/locales'; |
| | | |
| | | import { useTaskFormSchema } from '../data'; |
| | |
| | | routeId?: number; |
| | | workOrderId?: number; |
| | | }>({}); // 新增任务时的订单 / 工序上下文 |
| | | const feedbackRole = ref<string>(); |
| | | |
| | | const getTitle = computed(() => { |
| | | return formData.value?.id |
| | |
| | | }); |
| | | } |
| | | |
| | | if (wid) { |
| | | try { |
| | | const wo = await getWorkOrder(wid); |
| | | feedbackRole.value = wo.feedbackRole; |
| | | } catch { |
| | | // ignore |
| | | } |
| | | } |
| | | |
| | | formApi.setState({ schema: useTaskFormSchema(formApi, workOrderQuantity, feedbackRole) }); |
| | | formApi.setState({ schema: useTaskFormSchema(formApi, workOrderQuantity) }); |
| | | }, |
| | | }); |
| | | </script> |
| | |
| | | }, |
| | | rules: 'required', |
| | | }, |
| | | { |
| | | fieldName: 'feedbackRole', |
| | | label: '报工角色', |
| | | component: 'ApiSelect', |
| | | componentProps: { |
| | | api: getSimpleRoleList, |
| | | disabled: headerReadonly, |
| | | labelField: 'name', |
| | | valueField: 'code', |
| | | mode: 'multiple', |
| | | placeholder: '请选择报工角色', |
| | | }, |
| | | rules: 'selectRequired', |
| | | }, |
| | | // { |
| | | // fieldName: 'feedbackRole', |
| | | // label: '报工角色', |
| | | // component: 'ApiSelect', |
| | | // componentProps: { |
| | | // api: getSimpleRoleList, |
| | | // disabled: headerReadonly, |
| | | // labelField: 'name', |
| | | // valueField: 'code', |
| | | // mode: 'multiple', |
| | | // placeholder: '请选择报工角色', |
| | | // }, |
| | | // rules: 'selectRequired', |
| | | // }, |
| | | { |
| | | fieldName: 'feedbackApprove', |
| | | label: '是否报工审批', |