From f4e71137e0e775a63961cef5c57e23efb0b52d53 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 25 May 2026 22:50:42 +0800 Subject: [PATCH] =?UTF-8?q?feat(mes)=EF=BC=9A=E6=96=B0=E5=A2=9E=E2=80=9C?= =?UTF-8?q?=E5=AE=89=E7=81=AF=EF=BC=88pro=5Fandon=EF=BC=89=E2=80=9D?= =?UTF-8?q?=E7=9A=84=20review?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/api/mes/pro/andon/config/index.ts | 16 ++++++++++----- .../pro/andon/config/modules/config-form.vue | 1 - .../pro/andon/config/modules/config-modal.vue | 19 +++++++++++++++--- .../src/views/mes/pro/andon/record/data.ts | 9 +++++++-- .../mes/pro/andon/record/modules/form.vue | 20 +++++++++---------- 5 files changed, 44 insertions(+), 21 deletions(-) diff --git a/apps/web-antd/src/api/mes/pro/andon/config/index.ts b/apps/web-antd/src/api/mes/pro/andon/config/index.ts index 317c6cc50..7a2ac2ad1 100644 --- a/apps/web-antd/src/api/mes/pro/andon/config/index.ts +++ b/apps/web-antd/src/api/mes/pro/andon/config/index.ts @@ -1,21 +1,27 @@ +import type { PageParam, PageResult } from '@vben/request'; + import { requestClient } from '#/api/request'; export namespace MesProAndonConfigApi { /** MES 安灯配置 */ export interface AndonConfig { - id?: number; + id?: number; // 编号 reason?: string; // 呼叫原因 level?: number; // 级别 handlerRoleId?: number; // 处置角色编号 + handlerRoleName?: string; // 处置角色名称(前端通过角色精简列表回显) handlerUserId?: number; // 处置人编号 - handlerUserNickname?: string; // 处置人姓名(详情回显) - remark?: string; + handlerUserNickname?: string; // 处置人昵称 + remark?: string; // 备注 } } /** 查询安灯配置分页 */ -export function getAndonConfigPage(params: any) { - return requestClient.get('/mes/pro/andon-config/page', { params }); +export function getAndonConfigPage(params: PageParam) { + return requestClient.get>( + '/mes/pro/andon-config/page', + { params }, + ); } /** 查询安灯配置列表 */ diff --git a/apps/web-antd/src/views/mes/pro/andon/config/modules/config-form.vue b/apps/web-antd/src/views/mes/pro/andon/config/modules/config-form.vue index 00ef94418..46a6a5ed2 100644 --- a/apps/web-antd/src/views/mes/pro/andon/config/modules/config-form.vue +++ b/apps/web-antd/src/views/mes/pro/andon/config/modules/config-form.vue @@ -37,7 +37,6 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false, }); -// TODO @AI:注释缺少 const [Modal, modalApi] = useVbenModal({ async onConfirm() { const { valid } = await formApi.validate(); diff --git a/apps/web-antd/src/views/mes/pro/andon/config/modules/config-modal.vue b/apps/web-antd/src/views/mes/pro/andon/config/modules/config-modal.vue index 1ef2d8b44..5b01674b6 100644 --- a/apps/web-antd/src/views/mes/pro/andon/config/modules/config-modal.vue +++ b/apps/web-antd/src/views/mes/pro/andon/config/modules/config-modal.vue @@ -13,18 +13,20 @@ import { deleteAndonConfig, getAndonConfigList, } from '#/api/mes/pro/andon/config'; +import { getSimpleRoleList } from '#/api/system/role'; import { $t } from '#/locales'; import { useConfigGridColumns } from '../../record/data'; import ConfigForm from './config-form.vue'; -const list = ref([]); +const list = ref([]); // 安灯配置列表(已回填处置角色名称) const [ConfigFormModal, configFormModalApi] = useVbenModal({ connectedComponent: ConfigForm, destroyOnClose: true, }); +// TODO @AI:这个格式,是不是有问题?应该要换行?看看别的模块也是; const [Grid, gridApi] = useVbenVxeGrid({ gridOptions: { autoResize: true, @@ -39,11 +41,22 @@ const [Grid, gridApi] = useVbenVxeGrid({ } as VxeTableGridOptions, }); -/** 加载安灯配置列表 */ +/** 加载安灯配置列表,并通过角色精简列表回填处置角色名称 */ +// TODO @AI:这里需要 getAndonConfigList、getSimpleRoleList 么?通过 data.ts 里处理,是不是更主流??? async function getList() { gridApi.setLoading(true); try { - list.value = (await getAndonConfigList()) || []; + const [configList, roleList] = await Promise.all([ + getAndonConfigList(), + getSimpleRoleList(), + ]); + const roleMap = new Map(roleList.map((role) => [role.id!, role.name!])); + list.value = (configList || []).map((item) => ({ + ...item, + handlerRoleName: item.handlerRoleId + ? roleMap.get(item.handlerRoleId) + : undefined, + })); gridApi.setGridOptions({ data: list.value }); } finally { gridApi.setLoading(false); diff --git a/apps/web-antd/src/views/mes/pro/andon/record/data.ts b/apps/web-antd/src/views/mes/pro/andon/record/data.ts index 36cb24d93..3badb717b 100644 --- a/apps/web-antd/src/views/mes/pro/andon/record/data.ts +++ b/apps/web-antd/src/views/mes/pro/andon/record/data.ts @@ -7,6 +7,7 @@ import { DICT_TYPE } from '@vben/constants'; import { getDictOptions } from '@vben/hooks'; import { z } from '#/adapter/form'; +import { getSimpleRoleList } from '#/api/system/role'; import { getSimpleUserList } from '#/api/system/user'; import { MdWorkstationSelect } from '#/views/mes/md/workstation/components'; import { ProProcessSelect } from '#/views/mes/pro/process/components'; @@ -64,6 +65,10 @@ export function useGridFormSchema(): VbenFormSchema[] { component: 'RangePicker', componentProps: { allowClear: true, + defaultTime: [ + new Date(2000, 0, 1, 0, 0, 0), + new Date(2000, 0, 1, 23, 59, 59), + ], format: 'YYYY-MM-DD HH:mm:ss', showTime: true, valueFormat: 'YYYY-MM-DD HH:mm:ss', @@ -293,6 +298,7 @@ export function useConfigGridColumns(): VxeTableGridOptions - import('#/api/system/role').then((m) => m.getSimpleRoleList()), + api: getSimpleRoleList, labelField: 'name', placeholder: '请选择角色(与处置人至少填一个)', valueField: 'id', diff --git a/apps/web-antd/src/views/mes/pro/andon/record/modules/form.vue b/apps/web-antd/src/views/mes/pro/andon/record/modules/form.vue index 62b08097f..0e43f9b9e 100644 --- a/apps/web-antd/src/views/mes/pro/andon/record/modules/form.vue +++ b/apps/web-antd/src/views/mes/pro/andon/record/modules/form.vue @@ -6,7 +6,6 @@ import { computed, ref } from 'vue'; import { useVbenModal } from '@vben/common-ui'; import { useUserStore } from '@vben/stores'; -import { formatDate } from '@vben/utils'; import { Button, message } from 'ant-design-vue'; @@ -22,8 +21,8 @@ import { MesProAndonStatusEnum } from '#/views/mes/utils/constants'; import { useFormSchema } from '../data'; const emit = defineEmits(['success']); -const formType = ref<'create' | 'detail' | 'update'>('create'); // 表单类型 -const formData = ref({}); // 表单数据 +const formType = ref<'create' | 'detail' | 'update'>('create'); // 表单当前模式:新增 / 处置 / 详情 +const formData = ref(); const userStore = useUserStore(); const dialogTitle = computed(() => { @@ -83,6 +82,7 @@ async function handleCreate() { } /** 处置:保存(保持 ACTIVE) */ +// TODO @AI:这里写下注释; async function handleSave() { modalApi.lock(); try { @@ -91,7 +91,7 @@ async function handleSave() { await updateAndonRecord({ handlerUserId: values.handlerUserId, handleTime: values.handleTime, - id: formData.value.id, + id: formData.value?.id, remark: values.remark, status: MesProAndonStatusEnum.ACTIVE, }); @@ -104,6 +104,7 @@ async function handleSave() { } /** 处置:标记已处置 */ +// TODO @AI:这里写下注释; async function handleFinish() { const values = (await formApi.getValues()) as MesProAndonRecordApi.AndonRecord; @@ -120,7 +121,7 @@ async function handleFinish() { await updateAndonRecord({ handlerUserId: values.handlerUserId, handleTime: values.handleTime, - id: formData.value.id, + id: formData.value?.id, remark: values.remark, status: MesProAndonStatusEnum.HANDLED, }); @@ -132,12 +133,11 @@ async function handleFinish() { } } -// TODO @AI:注释缺少 -// TODO @AI:代码风格,貌似和别的模块不同; +// TODO @AI:这里的代码风格?!! const [Modal, modalApi] = useVbenModal({ async onOpenChange(isOpen: boolean) { if (!isOpen) { - formData.value = {}; + formData.value = undefined; return; } const data = modalApi.getData<{ @@ -167,10 +167,10 @@ const [Modal, modalApi] = useVbenModal({ try { formData.value = await getAndonRecord(data.id); const initial: MesProAndonRecordApi.AndonRecord = { ...formData.value }; - // 处置模式下,默认填充处置时间和处置人 + // 处置模式下,默认填充处置时间和处置人,方便快速保存 if (data.type === 'update') { if (!initial.handleTime) { - initial.handleTime = formatDate(new Date(), 'YYYY-MM-DD HH:mm:ss'); + initial.handleTime = Date.now(); } if (!initial.handlerUserId) { initial.handlerUserId = userStore.userInfo?.id;