hsy
4 天以前 b3abd460d8f68b9f501b48aeecaa344ff18c033a
feat(mes): 生产任务报工人下拉源调整为工作站人力配置

- 后端: `MesMdWorkstationWorkerController` 新增 `list-user-by-workstation` 接口,支持按工作站拉取关联岗位对应的精简用户信息。
- 前端: `task-form.vue` 移除原依赖生产订单 `feedbackRole`(报工人角色)获取报工人员的废弃逻辑。
- 前端: 调整新增生产任务表单,报工人下拉列表与“工作站”联动,切换工作站时动态拉取对应人员。
- 前端: 增加缺失配置预警,当所选工作站未配置人力资源时,自动弹出“当前工作站没有配置人力资源”的警告提示。
- 修复: 修复因下拉组件传参类型不匹配,导致弹窗刚打开时触发“请求参数缺失:workstationId”报错的问题。
已修改5个文件
114 ■■■■■ 文件已修改
src/api/mes/md/workstation/worker/index.ts 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/pd/archive/modules/detail.vue 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/pro/task/data.ts 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/pro/task/modules/task-form.vue 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/pro/workorder/data.ts 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/mes/md/workstation/worker/index.ts
@@ -1,4 +1,5 @@
import { requestClient } from '#/api/request';
import type { SystemUserApi } from '#/api/system/user';
export namespace MesMdWorkstationWorkerApi {
  /** MES 工作站人力资源 */
@@ -21,6 +22,17 @@
  );
}
/** 获得工作站对应岗位的员工列表 */
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,
src/views/mes/pd/archive/modules/detail.vue
@@ -54,23 +54,33 @@
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);
}
src/views/mes/pro/task/data.ts
@@ -1,7 +1,7 @@
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';
@@ -393,7 +393,7 @@
}
/** 生产任务新增/修改的表单 */
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',
@@ -475,11 +475,18 @@
      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([]),
    },
@@ -500,6 +507,18 @@
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);
src/views/mes/pro/task/modules/task-form.vue
@@ -1,4 +1,4 @@
<script lang="ts" setup>
<script lang="ts" setup>
import type { MesProTaskApi } from '#/api/mes/pro/task';
import { computed, ref } from 'vue';
@@ -9,7 +9,6 @@
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';
@@ -24,7 +23,6 @@
  routeId?: number;
  workOrderId?: number;
}>({}); // 新增任务时的订单 / 工序上下文
const feedbackRole = ref<string>();
const getTitle = computed(() => {
  return formData.value?.id
@@ -113,16 +111,7 @@
      });
    }
    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>
src/views/mes/pro/workorder/data.ts
@@ -237,20 +237,20 @@
      },
      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: '是否报工审批',