From 617d50f68f2559afbab6e960ec018a58c2d0353a Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 24 May 2026 20:26:00 +0800 Subject: [PATCH] =?UTF-8?q?feat(mes)=EF=BC=9A=E5=AE=8C=E6=88=90=20dv=20?= =?UTF-8?q?=E7=9A=84=E6=95=B4=E4=BD=93=E8=BF=81=E7=A7=BB=EF=BC=88=E9=9C=80?= =?UTF-8?q?=E8=A6=81=E8=AF=84=E5=AE=A1=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/mes/cal/holiday/data.ts | 49 +++ .../src/views/mes/cal/holiday/index.vue | 190 ++++++++++++ .../views/mes/cal/holiday/modules/form.vue | 84 ++++++ .../src/views/mes/cal/plan/modules/form.vue | 6 +- .../src/views/mes/cal/team/modules/form.vue | 6 +- .../components/dv-check-plan-select.vue | 74 +++++ .../mes/dv/checkplan/components/index.ts | 1 + .../src/views/mes/dv/checkplan/data.ts | 247 +++++++++++++++ .../src/views/mes/dv/checkplan/index.vue | 189 ++++++++++++ .../views/mes/dv/checkplan/modules/form.vue | 116 +++++++ .../dv/checkplan/modules/machinery-list.vue | 189 ++++++++++++ .../mes/dv/checkplan/modules/subject-list.vue | 201 +++++++++++++ .../src/views/mes/dv/checkrecord/data.ts | 165 ++++++++++ .../src/views/mes/dv/checkrecord/index.vue | 155 ++++++++++ .../views/mes/dv/checkrecord/modules/form.vue | 137 +++++++++ .../mes/dv/checkrecord/modules/line-list.vue | 232 ++++++++++++++ .../components/dv-machinery-select.vue | 58 ++++ .../mes/dv/machinery/components/index.ts | 1 + .../src/views/mes/dv/machinery/data.ts | 279 +++++++++++++++++ .../src/views/mes/dv/machinery/index.vue | 191 ++++++++++++ .../machinery/modules/check-record-list.vue | 73 +++++ .../views/mes/dv/machinery/modules/form.vue | 135 +++++++++ .../mes/dv/machinery/modules/import-form.vue | 87 ++++++ .../machinery/modules/mainten-record-list.vue | 73 +++++ .../mes/dv/machinery/modules/repair-list.vue | 74 +++++ .../components/dv-machinery-type-select.vue | 112 +++++++ .../mes/dv/machinery/type/components/index.ts | 2 + .../type/components/machinery-type-tree.vue | 94 ++++++ .../src/views/mes/dv/machinery/type/data.ts | 172 +++++++++++ .../src/views/mes/dv/machinery/type/index.vue | 150 ++++++++++ .../mes/dv/machinery/type/modules/form.vue | 84 ++++++ .../src/views/mes/dv/maintenrecord/data.ts | 165 ++++++++++ .../src/views/mes/dv/maintenrecord/index.vue | 159 ++++++++++ .../mes/dv/maintenrecord/modules/form.vue | 145 +++++++++ .../dv/maintenrecord/modules/line-list.vue | 235 +++++++++++++++ apps/web-antd/src/views/mes/dv/repair/data.ts | 267 +++++++++++++++++ .../src/views/mes/dv/repair/index.vue | 175 +++++++++++ .../src/views/mes/dv/repair/modules/form.vue | 217 ++++++++++++++ .../views/mes/dv/repair/modules/line-list.vue | 233 ++++++++++++++ .../subject/components/dv-subject-select.vue | 68 +++++ .../views/mes/dv/subject/components/index.ts | 1 + .../web-antd/src/views/mes/dv/subject/data.ts | 199 ++++++++++++ .../src/views/mes/dv/subject/index.vue | 146 +++++++++ .../src/views/mes/dv/subject/modules/form.vue | 91 ++++++ apps/web-ele/src/views/mes/cal/plan/data.ts | 283 ++++++++++++++++++ apps/web-ele/src/views/mes/cal/plan/index.vue | 142 +++++++++ .../src/views/mes/cal/plan/modules/form.vue | 155 ++++++++++ .../views/mes/cal/plan/modules/shift-list.vue | 240 +++++++++++++++ .../views/mes/cal/plan/modules/team-list.vue | 207 +++++++++++++ .../src/views/mes/cal/team/modules/form.vue | 6 +- .../components/dv-check-plan-select.vue | 71 +++++ .../mes/dv/checkplan/components/index.ts | 1 + .../src/views/mes/dv/checkplan/data.ts | 248 +++++++++++++++ .../src/views/mes/dv/checkplan/index.vue | 189 ++++++++++++ .../views/mes/dv/checkplan/modules/form.vue | 112 +++++++ .../dv/checkplan/modules/machinery-list.vue | 187 ++++++++++++ .../mes/dv/checkplan/modules/subject-list.vue | 199 ++++++++++++ .../src/views/mes/dv/checkrecord/data.ts | 166 ++++++++++ .../src/views/mes/dv/checkrecord/index.vue | 156 ++++++++++ .../views/mes/dv/checkrecord/modules/form.vue | 139 +++++++++ .../mes/dv/checkrecord/modules/line-list.vue | 233 ++++++++++++++ .../components/dv-machinery-select.vue | 55 ++++ .../mes/dv/machinery/components/index.ts | 1 + .../src/views/mes/dv/machinery/data.ts | 277 +++++++++++++++++ .../src/views/mes/dv/machinery/index.vue | 190 ++++++++++++ .../machinery/modules/check-record-list.vue | 73 +++++ .../views/mes/dv/machinery/modules/form.vue | 131 ++++++++ .../mes/dv/machinery/modules/import-form.vue | 92 ++++++ .../machinery/modules/mainten-record-list.vue | 73 +++++ .../mes/dv/machinery/modules/repair-list.vue | 74 +++++ .../components/dv-machinery-type-select.vue | 113 +++++++ .../mes/dv/machinery/type/components/index.ts | 2 + .../type/components/machinery-type-tree.vue | 95 ++++++ .../src/views/mes/dv/machinery/type/data.ts | 170 +++++++++++ .../src/views/mes/dv/machinery/type/index.vue | 151 ++++++++++ .../mes/dv/machinery/type/modules/form.vue | 84 ++++++ .../src/views/mes/dv/maintenrecord/data.ts | 166 ++++++++++ .../src/views/mes/dv/maintenrecord/index.vue | 160 ++++++++++ .../mes/dv/maintenrecord/modules/form.vue | 147 +++++++++ .../dv/maintenrecord/modules/line-list.vue | 236 +++++++++++++++ apps/web-ele/src/views/mes/dv/repair/data.ts | 268 +++++++++++++++++ .../web-ele/src/views/mes/dv/repair/index.vue | 176 +++++++++++ .../src/views/mes/dv/repair/modules/form.vue | 225 ++++++++++++++ .../views/mes/dv/repair/modules/line-list.vue | 236 +++++++++++++++ .../subject/components/dv-subject-select.vue | 65 ++++ .../views/mes/dv/subject/components/index.ts | 1 + apps/web-ele/src/views/mes/dv/subject/data.ts | 195 ++++++++++++ .../src/views/mes/dv/subject/index.vue | 144 +++++++++ .../src/views/mes/dv/subject/modules/form.vue | 91 ++++++ 89 files changed, 12146 insertions(+), 6 deletions(-) create mode 100644 apps/web-antd/src/views/mes/cal/holiday/data.ts create mode 100644 apps/web-antd/src/views/mes/cal/holiday/index.vue create mode 100644 apps/web-antd/src/views/mes/cal/holiday/modules/form.vue create mode 100644 apps/web-antd/src/views/mes/dv/checkplan/components/dv-check-plan-select.vue create mode 100644 apps/web-antd/src/views/mes/dv/checkplan/components/index.ts create mode 100644 apps/web-antd/src/views/mes/dv/checkplan/data.ts create mode 100644 apps/web-antd/src/views/mes/dv/checkplan/index.vue create mode 100644 apps/web-antd/src/views/mes/dv/checkplan/modules/form.vue create mode 100644 apps/web-antd/src/views/mes/dv/checkplan/modules/machinery-list.vue create mode 100644 apps/web-antd/src/views/mes/dv/checkplan/modules/subject-list.vue create mode 100644 apps/web-antd/src/views/mes/dv/checkrecord/data.ts create mode 100644 apps/web-antd/src/views/mes/dv/checkrecord/index.vue create mode 100644 apps/web-antd/src/views/mes/dv/checkrecord/modules/form.vue create mode 100644 apps/web-antd/src/views/mes/dv/checkrecord/modules/line-list.vue create mode 100644 apps/web-antd/src/views/mes/dv/machinery/components/dv-machinery-select.vue create mode 100644 apps/web-antd/src/views/mes/dv/machinery/components/index.ts create mode 100644 apps/web-antd/src/views/mes/dv/machinery/data.ts create mode 100644 apps/web-antd/src/views/mes/dv/machinery/index.vue create mode 100644 apps/web-antd/src/views/mes/dv/machinery/modules/check-record-list.vue create mode 100644 apps/web-antd/src/views/mes/dv/machinery/modules/form.vue create mode 100644 apps/web-antd/src/views/mes/dv/machinery/modules/import-form.vue create mode 100644 apps/web-antd/src/views/mes/dv/machinery/modules/mainten-record-list.vue create mode 100644 apps/web-antd/src/views/mes/dv/machinery/modules/repair-list.vue create mode 100644 apps/web-antd/src/views/mes/dv/machinery/type/components/dv-machinery-type-select.vue create mode 100644 apps/web-antd/src/views/mes/dv/machinery/type/components/index.ts create mode 100644 apps/web-antd/src/views/mes/dv/machinery/type/components/machinery-type-tree.vue create mode 100644 apps/web-antd/src/views/mes/dv/machinery/type/data.ts create mode 100644 apps/web-antd/src/views/mes/dv/machinery/type/index.vue create mode 100644 apps/web-antd/src/views/mes/dv/machinery/type/modules/form.vue create mode 100644 apps/web-antd/src/views/mes/dv/maintenrecord/data.ts create mode 100644 apps/web-antd/src/views/mes/dv/maintenrecord/index.vue create mode 100644 apps/web-antd/src/views/mes/dv/maintenrecord/modules/form.vue create mode 100644 apps/web-antd/src/views/mes/dv/maintenrecord/modules/line-list.vue create mode 100644 apps/web-antd/src/views/mes/dv/repair/data.ts create mode 100644 apps/web-antd/src/views/mes/dv/repair/index.vue create mode 100644 apps/web-antd/src/views/mes/dv/repair/modules/form.vue create mode 100644 apps/web-antd/src/views/mes/dv/repair/modules/line-list.vue create mode 100644 apps/web-antd/src/views/mes/dv/subject/components/dv-subject-select.vue create mode 100644 apps/web-antd/src/views/mes/dv/subject/components/index.ts create mode 100644 apps/web-antd/src/views/mes/dv/subject/data.ts create mode 100644 apps/web-antd/src/views/mes/dv/subject/index.vue create mode 100644 apps/web-antd/src/views/mes/dv/subject/modules/form.vue create mode 100644 apps/web-ele/src/views/mes/cal/plan/data.ts create mode 100644 apps/web-ele/src/views/mes/cal/plan/index.vue create mode 100644 apps/web-ele/src/views/mes/cal/plan/modules/form.vue create mode 100644 apps/web-ele/src/views/mes/cal/plan/modules/shift-list.vue create mode 100644 apps/web-ele/src/views/mes/cal/plan/modules/team-list.vue create mode 100644 apps/web-ele/src/views/mes/dv/checkplan/components/dv-check-plan-select.vue create mode 100644 apps/web-ele/src/views/mes/dv/checkplan/components/index.ts create mode 100644 apps/web-ele/src/views/mes/dv/checkplan/data.ts create mode 100644 apps/web-ele/src/views/mes/dv/checkplan/index.vue create mode 100644 apps/web-ele/src/views/mes/dv/checkplan/modules/form.vue create mode 100644 apps/web-ele/src/views/mes/dv/checkplan/modules/machinery-list.vue create mode 100644 apps/web-ele/src/views/mes/dv/checkplan/modules/subject-list.vue create mode 100644 apps/web-ele/src/views/mes/dv/checkrecord/data.ts create mode 100644 apps/web-ele/src/views/mes/dv/checkrecord/index.vue create mode 100644 apps/web-ele/src/views/mes/dv/checkrecord/modules/form.vue create mode 100644 apps/web-ele/src/views/mes/dv/checkrecord/modules/line-list.vue create mode 100644 apps/web-ele/src/views/mes/dv/machinery/components/dv-machinery-select.vue create mode 100644 apps/web-ele/src/views/mes/dv/machinery/components/index.ts create mode 100644 apps/web-ele/src/views/mes/dv/machinery/data.ts create mode 100644 apps/web-ele/src/views/mes/dv/machinery/index.vue create mode 100644 apps/web-ele/src/views/mes/dv/machinery/modules/check-record-list.vue create mode 100644 apps/web-ele/src/views/mes/dv/machinery/modules/form.vue create mode 100644 apps/web-ele/src/views/mes/dv/machinery/modules/import-form.vue create mode 100644 apps/web-ele/src/views/mes/dv/machinery/modules/mainten-record-list.vue create mode 100644 apps/web-ele/src/views/mes/dv/machinery/modules/repair-list.vue create mode 100644 apps/web-ele/src/views/mes/dv/machinery/type/components/dv-machinery-type-select.vue create mode 100644 apps/web-ele/src/views/mes/dv/machinery/type/components/index.ts create mode 100644 apps/web-ele/src/views/mes/dv/machinery/type/components/machinery-type-tree.vue create mode 100644 apps/web-ele/src/views/mes/dv/machinery/type/data.ts create mode 100644 apps/web-ele/src/views/mes/dv/machinery/type/index.vue create mode 100644 apps/web-ele/src/views/mes/dv/machinery/type/modules/form.vue create mode 100644 apps/web-ele/src/views/mes/dv/maintenrecord/data.ts create mode 100644 apps/web-ele/src/views/mes/dv/maintenrecord/index.vue create mode 100644 apps/web-ele/src/views/mes/dv/maintenrecord/modules/form.vue create mode 100644 apps/web-ele/src/views/mes/dv/maintenrecord/modules/line-list.vue create mode 100644 apps/web-ele/src/views/mes/dv/repair/data.ts create mode 100644 apps/web-ele/src/views/mes/dv/repair/index.vue create mode 100644 apps/web-ele/src/views/mes/dv/repair/modules/form.vue create mode 100644 apps/web-ele/src/views/mes/dv/repair/modules/line-list.vue create mode 100644 apps/web-ele/src/views/mes/dv/subject/components/dv-subject-select.vue create mode 100644 apps/web-ele/src/views/mes/dv/subject/components/index.ts create mode 100644 apps/web-ele/src/views/mes/dv/subject/data.ts create mode 100644 apps/web-ele/src/views/mes/dv/subject/index.vue create mode 100644 apps/web-ele/src/views/mes/dv/subject/modules/form.vue diff --git a/apps/web-antd/src/views/mes/cal/holiday/data.ts b/apps/web-antd/src/views/mes/cal/holiday/data.ts new file mode 100644 index 000000000..891aa335a --- /dev/null +++ b/apps/web-antd/src/views/mes/cal/holiday/data.ts @@ -0,0 +1,49 @@ +import type { VbenFormSchema } from '#/adapter/form'; + +import { DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { z } from '#/adapter/form'; +import { HolidayType } from '#/views/mes/utils/constants'; + +/** 假期设置表单 */ +export function useHolidayFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'day', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'dayDisplay', + label: '日期', + component: 'Input', + componentProps: { + disabled: true, + }, + }, + { + fieldName: 'type', + label: '类型', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + optionType: 'button', + options: getDictOptions(DICT_TYPE.MES_CAL_HOLIDAY_TYPE, 'number'), + }, + rules: z.number().default(HolidayType.WORKDAY), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} diff --git a/apps/web-antd/src/views/mes/cal/holiday/index.vue b/apps/web-antd/src/views/mes/cal/holiday/index.vue new file mode 100644 index 000000000..18b242f6a --- /dev/null +++ b/apps/web-antd/src/views/mes/cal/holiday/index.vue @@ -0,0 +1,190 @@ + + + diff --git a/apps/web-antd/src/views/mes/cal/holiday/modules/form.vue b/apps/web-antd/src/views/mes/cal/holiday/modules/form.vue new file mode 100644 index 000000000..f126f5db3 --- /dev/null +++ b/apps/web-antd/src/views/mes/cal/holiday/modules/form.vue @@ -0,0 +1,84 @@ + + + diff --git a/apps/web-antd/src/views/mes/cal/plan/modules/form.vue b/apps/web-antd/src/views/mes/cal/plan/modules/form.vue index 850b44dc5..7ddb19a7d 100644 --- a/apps/web-antd/src/views/mes/cal/plan/modules/form.vue +++ b/apps/web-antd/src/views/mes/cal/plan/modules/form.vue @@ -16,8 +16,10 @@ import { useFormSchema } from '../data'; import ShiftList from './shift-list.vue'; import PlanTeamList from './team-list.vue'; +type FormMode = 'create' | 'detail' | 'update'; + const emit = defineEmits(['success']); -const formMode = ref<'create' | 'detail' | 'update'>('create'); // 表单模式 +const formMode = ref('create'); // 表单模式 const subTabsName = ref('shift'); // 当前资源页签 const formData = ref(); const isDetail = computed(() => formMode.value === 'detail'); // 是否查看模式 @@ -106,7 +108,7 @@ const [Modal, modalApi] = useVbenModal({ } await formApi.resetForm(); subTabsName.value = 'shift'; - const data = modalApi.getData<{ id?: number; type?: 'create' | 'detail' | 'update' }>(); + const data = modalApi.getData<{ id?: number; type?: FormMode }>(); formMode.value = data?.type || 'create'; formApi.setDisabled(formMode.value === 'detail'); modalApi.setState({ showConfirmButton: formMode.value !== 'detail' }); diff --git a/apps/web-antd/src/views/mes/cal/team/modules/form.vue b/apps/web-antd/src/views/mes/cal/team/modules/form.vue index 0a3d1bbb8..7c1acd479 100644 --- a/apps/web-antd/src/views/mes/cal/team/modules/form.vue +++ b/apps/web-antd/src/views/mes/cal/team/modules/form.vue @@ -15,8 +15,10 @@ import { useFormSchema } from '../data'; import MemberList from './member-list.vue'; +type FormMode = 'create' | 'detail' | 'update'; + const emit = defineEmits(['success']); -const formMode = ref<'create' | 'detail' | 'update'>('create'); // 表单模式 +const formMode = ref('create'); // 表单模式 const subTabsName = ref('member'); // 当前资源页签 const formData = ref(); const isDetail = computed(() => formMode.value === 'detail'); // 是否查看模式 @@ -82,7 +84,7 @@ const [Modal, modalApi] = useVbenModal({ } await formApi.resetForm(); subTabsName.value = 'member'; - const data = modalApi.getData<{ id?: number; type?: 'create' | 'detail' | 'update' }>(); + const data = modalApi.getData<{ id?: number; type?: FormMode }>(); formMode.value = data?.type || 'create'; formApi.setDisabled(formMode.value === 'detail'); modalApi.setState({ showConfirmButton: formMode.value !== 'detail' }); diff --git a/apps/web-antd/src/views/mes/dv/checkplan/components/dv-check-plan-select.vue b/apps/web-antd/src/views/mes/dv/checkplan/components/dv-check-plan-select.vue new file mode 100644 index 000000000..1c3ab50e8 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/checkplan/components/dv-check-plan-select.vue @@ -0,0 +1,74 @@ + + + diff --git a/apps/web-antd/src/views/mes/dv/checkplan/components/index.ts b/apps/web-antd/src/views/mes/dv/checkplan/components/index.ts new file mode 100644 index 000000000..379957e07 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/checkplan/components/index.ts @@ -0,0 +1 @@ +export { default as DvCheckPlanSelect } from './dv-check-plan-select.vue'; diff --git a/apps/web-antd/src/views/mes/dv/checkplan/data.ts b/apps/web-antd/src/views/mes/dv/checkplan/data.ts new file mode 100644 index 000000000..ab9a41f84 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/checkplan/data.ts @@ -0,0 +1,247 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesDvCheckPlanApi } from '#/api/mes/dv/checkplan'; + +import { h } from 'vue'; + +import { DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { Button } from 'ant-design-vue'; + +import { z } from '#/adapter/form'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { getRangePickerDefaultProps } from '#/utils'; +import { + MesAutoCodeRuleCode, + MesDvCheckPlanStatusEnum, + MesDvSubjectTypeEnum, +} from '#/views/mes/utils/constants'; + +/** 新增/修改点检保养方案的表单 */ +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'status', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + defaultValue: MesDvCheckPlanStatusEnum.PREPARE, + }, + { + fieldName: 'code', + label: '方案编码', + component: 'Input', + componentProps: { + placeholder: '请输入方案编码', + }, + rules: 'required', + suffix: () => + h( + Button, + { + type: 'default', + onClick: async () => { + try { + const code = await generateAutoCode(MesAutoCodeRuleCode.DV_CHECK_PLAN_CODE); + await formApi?.setFieldValue('code', code); + } catch (error) { + console.error(error); + } + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'name', + label: '方案名称', + component: 'Input', + componentProps: { + placeholder: '请输入方案名称', + }, + rules: 'required', + }, + { + fieldName: 'type', + label: '方案类型', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + optionType: 'button', + options: getDictOptions(DICT_TYPE.MES_DV_SUBJECT_TYPE, 'number'), + }, + rules: z.number().default(MesDvSubjectTypeEnum.CHECK), + }, + { + fieldName: 'startDate', + label: '开始日期', + component: 'DatePicker', + componentProps: { + format: 'YYYY-MM-DD', + placeholder: '请选择开始日期', + valueFormat: 'x', + }, + rules: 'required', + }, + { + fieldName: 'endDate', + label: '结束日期', + component: 'DatePicker', + componentProps: { + format: 'YYYY-MM-DD', + placeholder: '请选择结束日期', + valueFormat: 'x', + }, + rules: 'required', + }, + { + fieldName: 'cycleType', + label: '周期类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_DV_CYCLE_TYPE, 'number'), + placeholder: '请选择周期类型', + }, + rules: 'selectRequired', + }, + { + fieldName: 'cycleCount', + label: '周期数量', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 1, + precision: 0, + }, + rules: z.number().default(1), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '方案编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入方案编码', + }, + }, + { + fieldName: 'name', + label: '方案名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入方案名称', + }, + }, + { + fieldName: 'type', + label: '方案类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_DV_SUBJECT_TYPE, 'number'), + placeholder: '请选择方案类型', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_DV_CHECK_PLAN_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + { + fieldName: 'startDate', + label: '开始日期', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '方案编码', + minWidth: 140, + slots: { + default: 'code', + }, + }, + { field: 'name', title: '方案名称', minWidth: 150 }, + { + field: 'type', + title: '方案类型', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DV_SUBJECT_TYPE }, + }, + }, + { field: 'startDate', title: '开始日期', width: 150, formatter: 'formatDate' }, + { field: 'endDate', title: '结束日期', width: 150, formatter: 'formatDate' }, + { + field: 'cycleType', + title: '周期类型', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DV_CYCLE_TYPE }, + }, + }, + { field: 'cycleCount', title: '周期数量', width: 100 }, + { + field: 'status', + title: '状态', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DV_CHECK_PLAN_STATUS }, + }, + }, + { field: 'createTime', title: '创建时间', width: 180, formatter: 'formatDateTime' }, + { + title: '操作', + width: 240, + fixed: 'right', + slots: { + default: 'actions', + }, + }, + ]; +} diff --git a/apps/web-antd/src/views/mes/dv/checkplan/index.vue b/apps/web-antd/src/views/mes/dv/checkplan/index.vue new file mode 100644 index 000000000..844ac68f9 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/checkplan/index.vue @@ -0,0 +1,189 @@ + + diff --git a/apps/web-antd/src/views/mes/dv/checkplan/modules/form.vue b/apps/web-antd/src/views/mes/dv/checkplan/modules/form.vue new file mode 100644 index 000000000..0daf5ff89 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/checkplan/modules/form.vue @@ -0,0 +1,116 @@ + + diff --git a/apps/web-antd/src/views/mes/dv/checkplan/modules/machinery-list.vue b/apps/web-antd/src/views/mes/dv/checkplan/modules/machinery-list.vue new file mode 100644 index 000000000..09ce92880 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/checkplan/modules/machinery-list.vue @@ -0,0 +1,189 @@ + + diff --git a/apps/web-antd/src/views/mes/dv/checkplan/modules/subject-list.vue b/apps/web-antd/src/views/mes/dv/checkplan/modules/subject-list.vue new file mode 100644 index 000000000..7765cdbaf --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/checkplan/modules/subject-list.vue @@ -0,0 +1,201 @@ + + diff --git a/apps/web-antd/src/views/mes/dv/checkrecord/data.ts b/apps/web-antd/src/views/mes/dv/checkrecord/data.ts new file mode 100644 index 000000000..68ffa8567 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/checkrecord/data.ts @@ -0,0 +1,165 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesDvCheckRecordApi } from '#/api/mes/dv/checkrecord'; + +import { markRaw } from 'vue'; + +import { DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { getSimpleUserList } from '#/api/system/user'; +import { getRangePickerDefaultProps } from '#/utils'; +import { DvCheckPlanSelect } from '#/views/mes/dv/checkplan/components'; +import { DvMachinerySelect } from '#/views/mes/dv/machinery/components'; +import { + MesDvCheckPlanStatusEnum, + MesDvCheckRecordStatusEnum, + MesDvSubjectTypeEnum, +} from '#/views/mes/utils/constants'; + +/** 新增/修改点检记录的表单 */ +export function useFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'status', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + defaultValue: MesDvCheckRecordStatusEnum.DRAFT, + }, + { + fieldName: 'machineryId', + label: '设备', + component: markRaw(DvMachinerySelect), + componentProps: { + placeholder: '请选择设备', + }, + rules: 'selectRequired', + }, + { + fieldName: 'planId', + label: '点检计划', + component: markRaw(DvCheckPlanSelect), + componentProps: { + status: MesDvCheckPlanStatusEnum.ENABLED, + type: MesDvSubjectTypeEnum.CHECK, + placeholder: '请选择计划', + }, + rules: 'selectRequired', + }, + { + fieldName: 'userId', + label: '点检人', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getSimpleUserList, + labelField: 'nickname', + placeholder: '请选择点检人', + valueField: 'id', + }, + rules: 'selectRequired', + }, + { + fieldName: 'checkTime', + label: '点检时间', + component: 'DatePicker', + componentProps: { + format: 'YYYY-MM-DD HH:mm:ss', + placeholder: '请选择点检时间', + showTime: true, + valueFormat: 'x', + }, + rules: 'required', + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'machineryName', + label: '设备名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入设备名称', + }, + }, + { + fieldName: 'checkTime', + label: '点检时间', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_DV_CHECK_RECORD_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { field: 'machineryCode', title: '设备编码', minWidth: 140 }, + { + field: 'machineryName', + title: '设备名称', + minWidth: 150, + slots: { + default: 'machineryName', + }, + }, + { field: 'planName', title: '计划名称', minWidth: 150 }, + { field: 'checkTime', title: '点检时间', width: 180, formatter: 'formatDateTime' }, + { field: 'nickname', title: '点检人', minWidth: 120 }, + { + field: 'status', + title: '状态', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DV_CHECK_RECORD_STATUS }, + }, + }, + { field: 'createTime', title: '创建时间', width: 180, formatter: 'formatDateTime' }, + { + title: '操作', + width: 200, + fixed: 'right', + slots: { + default: 'actions', + }, + }, + ]; +} diff --git a/apps/web-antd/src/views/mes/dv/checkrecord/index.vue b/apps/web-antd/src/views/mes/dv/checkrecord/index.vue new file mode 100644 index 000000000..44867b21e --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/checkrecord/index.vue @@ -0,0 +1,155 @@ + + diff --git a/apps/web-antd/src/views/mes/dv/checkrecord/modules/form.vue b/apps/web-antd/src/views/mes/dv/checkrecord/modules/form.vue new file mode 100644 index 000000000..21bd5a9b2 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/checkrecord/modules/form.vue @@ -0,0 +1,137 @@ + + diff --git a/apps/web-antd/src/views/mes/dv/checkrecord/modules/line-list.vue b/apps/web-antd/src/views/mes/dv/checkrecord/modules/line-list.vue new file mode 100644 index 000000000..467077d99 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/checkrecord/modules/line-list.vue @@ -0,0 +1,232 @@ + + diff --git a/apps/web-antd/src/views/mes/dv/machinery/components/dv-machinery-select.vue b/apps/web-antd/src/views/mes/dv/machinery/components/dv-machinery-select.vue new file mode 100644 index 000000000..ea9b543c8 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/machinery/components/dv-machinery-select.vue @@ -0,0 +1,58 @@ + + + diff --git a/apps/web-antd/src/views/mes/dv/machinery/components/index.ts b/apps/web-antd/src/views/mes/dv/machinery/components/index.ts new file mode 100644 index 000000000..cbe225de1 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/machinery/components/index.ts @@ -0,0 +1 @@ +export { default as DvMachinerySelect } from './dv-machinery-select.vue'; diff --git a/apps/web-antd/src/views/mes/dv/machinery/data.ts b/apps/web-antd/src/views/mes/dv/machinery/data.ts new file mode 100644 index 000000000..ad6b99f20 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/machinery/data.ts @@ -0,0 +1,279 @@ +import type { Ref } from 'vue'; + +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesDvMachineryApi } from '#/api/mes/dv/machinery'; + +import { h, markRaw } from 'vue'; + +import { DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { Button } from 'ant-design-vue'; + +import { z } from '#/adapter/form'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { MdWorkshopSelect } from '#/views/mes/md/workstation/components'; +import { MesAutoCodeRuleCode, MesDvMachineryStatusEnum } from '#/views/mes/utils/constants'; + +import { DvMachineryTypeSelect } from './type/components'; + +/** 新增/修改设备的表单 */ +export function useFormSchema(formApi?: VbenFormApi, formMode?: Ref): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '设备编码', + component: 'Input', + componentProps: { + placeholder: '请输入设备编码', + }, + dependencies: { + triggerFields: ['id'], + componentProps: (values) => ({ disabled: !!values.id }), + }, + rules: 'required', + suffix: () => + h( + Button, + { + type: 'default', + onClick: async () => { + try { + const code = await generateAutoCode(MesAutoCodeRuleCode.DV_MACHINERY_CODE); + await formApi?.setFieldValue('code', code); + } catch (error) { + console.error(error); + } + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'name', + label: '设备名称', + component: 'Input', + componentProps: { + placeholder: '请输入设备名称', + }, + rules: 'required', + }, + { + fieldName: 'brand', + label: '品牌', + component: 'Input', + componentProps: { + placeholder: '请输入品牌', + }, + }, + { + fieldName: 'machineryTypeId', + label: '设备类型', + component: markRaw(DvMachineryTypeSelect), + componentProps: { + placeholder: '请选择设备类型', + }, + rules: 'selectRequired', + }, + { + fieldName: 'workshopId', + label: '所属车间', + component: markRaw(MdWorkshopSelect), + componentProps: { + placeholder: '请选择所属车间', + }, + rules: 'selectRequired', + }, + { + fieldName: 'status', + label: '设备状态', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + optionType: 'button', + options: getDictOptions(DICT_TYPE.MES_DV_MACHINERY_STATUS, 'number'), + }, + rules: z.number().default(MesDvMachineryStatusEnum.STOP), + }, + { + fieldName: 'specification', + label: '规格型号', + component: 'Input', + componentProps: { + placeholder: '请输入规格型号', + }, + }, + { + fieldName: 'lastCheckTime', + label: '最近点检时间', + component: 'DatePicker', + componentProps: { + class: '!w-full', + disabled: true, + format: 'YYYY-MM-DD HH:mm:ss', + showTime: true, + valueFormat: 'x', + }, + dependencies: { + triggerFields: ['id'], + show: () => formMode?.value === 'detail', + }, + }, + { + fieldName: 'lastMaintenTime', + label: '最近保养时间', + component: 'DatePicker', + componentProps: { + class: '!w-full', + disabled: true, + format: 'YYYY-MM-DD HH:mm:ss', + showTime: true, + valueFormat: 'x', + }, + dependencies: { + triggerFields: ['id'], + show: () => formMode?.value === 'detail', + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '设备编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入设备编码', + }, + }, + { + fieldName: 'name', + label: '设备名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入设备名称', + }, + }, + { + fieldName: 'workshopId', + label: '所属车间', + component: markRaw(MdWorkshopSelect), + componentProps: { + allowClear: true, + placeholder: '请选择所属车间', + }, + }, + { + fieldName: 'status', + label: '设备状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_DV_MACHINERY_STATUS, 'number'), + placeholder: '请选择设备状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '设备编码', + minWidth: 140, + slots: { + default: 'code', + }, + }, + { field: 'name', title: '设备名称', minWidth: 140 }, + { field: 'brand', title: '品牌', minWidth: 120 }, + { field: 'specification', title: '规格型号', minWidth: 140 }, + { field: 'machineryTypeName', title: '设备类型', minWidth: 140 }, + { field: 'workshopName', title: '所属车间', minWidth: 140 }, + { + field: 'status', + title: '设备状态', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DV_MACHINERY_STATUS }, + }, + }, + { + field: 'lastCheckTime', + title: '最近点检时间', + width: 180, + formatter: 'formatDateTime', + }, + { + field: 'lastMaintenTime', + title: '最近保养时间', + width: 180, + formatter: 'formatDateTime', + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 220, + fixed: 'right', + slots: { + default: 'actions', + }, + }, + ]; +} + +/** 导入表单 */ +export function useImportFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'file', + label: '设备数据', + component: 'Upload', + rules: 'required', + help: '仅允许导入 xls、xlsx 格式文件', + }, + { + fieldName: 'updateSupport', + label: '是否覆盖', + component: 'Switch', + componentProps: { + checkedChildren: '是', + unCheckedChildren: '否', + }, + rules: z.boolean().default(false), + help: '是否更新已经存在的设备数据', + }, + ]; +} diff --git a/apps/web-antd/src/views/mes/dv/machinery/index.vue b/apps/web-antd/src/views/mes/dv/machinery/index.vue new file mode 100644 index 000000000..97b3c19f6 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/machinery/index.vue @@ -0,0 +1,191 @@ + + + diff --git a/apps/web-antd/src/views/mes/dv/machinery/modules/check-record-list.vue b/apps/web-antd/src/views/mes/dv/machinery/modules/check-record-list.vue new file mode 100644 index 000000000..aa486cf05 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/machinery/modules/check-record-list.vue @@ -0,0 +1,73 @@ + + + diff --git a/apps/web-antd/src/views/mes/dv/machinery/modules/form.vue b/apps/web-antd/src/views/mes/dv/machinery/modules/form.vue new file mode 100644 index 000000000..579b4cf0d --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/machinery/modules/form.vue @@ -0,0 +1,135 @@ + + + diff --git a/apps/web-antd/src/views/mes/dv/machinery/modules/import-form.vue b/apps/web-antd/src/views/mes/dv/machinery/modules/import-form.vue new file mode 100644 index 000000000..ac76752e7 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/machinery/modules/import-form.vue @@ -0,0 +1,87 @@ + + + diff --git a/apps/web-antd/src/views/mes/dv/machinery/modules/mainten-record-list.vue b/apps/web-antd/src/views/mes/dv/machinery/modules/mainten-record-list.vue new file mode 100644 index 000000000..3a8f2e656 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/machinery/modules/mainten-record-list.vue @@ -0,0 +1,73 @@ + + + diff --git a/apps/web-antd/src/views/mes/dv/machinery/modules/repair-list.vue b/apps/web-antd/src/views/mes/dv/machinery/modules/repair-list.vue new file mode 100644 index 000000000..efed48449 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/machinery/modules/repair-list.vue @@ -0,0 +1,74 @@ + + + diff --git a/apps/web-antd/src/views/mes/dv/machinery/type/components/dv-machinery-type-select.vue b/apps/web-antd/src/views/mes/dv/machinery/type/components/dv-machinery-type-select.vue new file mode 100644 index 000000000..2a5208428 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/machinery/type/components/dv-machinery-type-select.vue @@ -0,0 +1,112 @@ + + + diff --git a/apps/web-antd/src/views/mes/dv/machinery/type/components/index.ts b/apps/web-antd/src/views/mes/dv/machinery/type/components/index.ts new file mode 100644 index 000000000..c4cff7c14 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/machinery/type/components/index.ts @@ -0,0 +1,2 @@ +export { default as DvMachineryTypeSelect } from './dv-machinery-type-select.vue'; +export { default as MachineryTypeTree } from './machinery-type-tree.vue'; diff --git a/apps/web-antd/src/views/mes/dv/machinery/type/components/machinery-type-tree.vue b/apps/web-antd/src/views/mes/dv/machinery/type/components/machinery-type-tree.vue new file mode 100644 index 000000000..46b8e7f35 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/machinery/type/components/machinery-type-tree.vue @@ -0,0 +1,94 @@ + + + diff --git a/apps/web-antd/src/views/mes/dv/machinery/type/data.ts b/apps/web-antd/src/views/mes/dv/machinery/type/data.ts new file mode 100644 index 000000000..c7342e875 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/machinery/type/data.ts @@ -0,0 +1,172 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesDvMachineryTypeApi } from '#/api/mes/dv/machinery/type'; + +import { h } from 'vue'; + +import { CommonStatusEnum, DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; +import { handleTree } from '@vben/utils'; + +import { Button } from 'ant-design-vue'; + +import { z } from '#/adapter/form'; +import { getMachineryTypeList } from '#/api/mes/dv/machinery/type'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { MesAutoCodeRuleCode } from '#/views/mes/utils/constants'; + +/** 新增/修改设备类型的表单 */ +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'parentId', + label: '上级类型', + component: 'ApiTreeSelect', + componentProps: { + allowClear: true, + api: async () => [ + { id: 0, name: '顶级类型', children: handleTree(await getMachineryTypeList()) }, + ], + childrenField: 'children', + labelField: 'name', + placeholder: '请选择上级类型', + treeDefaultExpandAll: true, + treeNodeFilterProp: 'name', + valueField: 'id', + }, + rules: 'selectRequired', + }, + { + fieldName: 'code', + label: '类型编码', + component: 'Input', + componentProps: { + maxLength: 64, + placeholder: '请输入类型编码', + }, + rules: z.string().min(1, '类型编码不能为空').max(64), + suffix: () => + h( + Button, + { + type: 'default', + onClick: async () => { + try { + const code = await generateAutoCode(MesAutoCodeRuleCode.DV_MACHINERY_TYPE_CODE); + await formApi?.setFieldValue('code', code); + } catch (error) { + console.error(error); + } + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'name', + label: '类型名称', + component: 'Input', + componentProps: { + placeholder: '请输入类型名称', + }, + rules: 'required', + }, + { + fieldName: 'sort', + label: '显示排序', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + precision: 0, + }, + rules: z.number().default(0), + }, + { + fieldName: 'status', + label: '状态', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + optionType: 'button', + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + }, + rules: z.number().default(CommonStatusEnum.ENABLE), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'name', + label: '类型名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入类型名称', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { field: 'name', title: '类型名称', minWidth: 200, align: 'left', treeNode: true }, + { field: 'code', title: '类型编码', width: 160, align: 'center' }, + { field: 'sort', title: '排序', width: 100, align: 'center' }, + { + field: 'status', + title: '状态', + width: 120, + align: 'center', + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 260, + fixed: 'right', + slots: { + default: 'actions', + }, + }, + ]; +} diff --git a/apps/web-antd/src/views/mes/dv/machinery/type/index.vue b/apps/web-antd/src/views/mes/dv/machinery/type/index.vue new file mode 100644 index 000000000..e1ccc36a7 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/machinery/type/index.vue @@ -0,0 +1,150 @@ + + + diff --git a/apps/web-antd/src/views/mes/dv/machinery/type/modules/form.vue b/apps/web-antd/src/views/mes/dv/machinery/type/modules/form.vue new file mode 100644 index 000000000..f03b58d80 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/machinery/type/modules/form.vue @@ -0,0 +1,84 @@ + + + diff --git a/apps/web-antd/src/views/mes/dv/maintenrecord/data.ts b/apps/web-antd/src/views/mes/dv/maintenrecord/data.ts new file mode 100644 index 000000000..56368a6b4 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/maintenrecord/data.ts @@ -0,0 +1,165 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesDvMaintenRecordApi } from '#/api/mes/dv/maintenrecord'; + +import { markRaw } from 'vue'; + +import { DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { getSimpleUserList } from '#/api/system/user'; +import { getRangePickerDefaultProps } from '#/utils'; +import { DvCheckPlanSelect } from '#/views/mes/dv/checkplan/components'; +import { DvMachinerySelect } from '#/views/mes/dv/machinery/components'; +import { + MesDvCheckPlanStatusEnum, + MesDvMaintenRecordStatusEnum, + MesDvSubjectTypeEnum, +} from '#/views/mes/utils/constants'; + +/** 新增/修改保养记录的表单 */ +export function useFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'status', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + defaultValue: MesDvMaintenRecordStatusEnum.PREPARE, + }, + { + fieldName: 'machineryId', + label: '设备', + component: markRaw(DvMachinerySelect), + componentProps: { + placeholder: '请选择设备', + }, + rules: 'selectRequired', + }, + { + fieldName: 'planId', + label: '保养计划', + component: markRaw(DvCheckPlanSelect), + componentProps: { + status: MesDvCheckPlanStatusEnum.ENABLED, + type: MesDvSubjectTypeEnum.MAINTENANCE, + placeholder: '请选择计划', + }, + rules: 'selectRequired', + }, + { + fieldName: 'userId', + label: '保养人', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getSimpleUserList, + labelField: 'nickname', + placeholder: '请选择保养人', + valueField: 'id', + }, + rules: 'selectRequired', + }, + { + fieldName: 'maintenTime', + label: '保养时间', + component: 'DatePicker', + componentProps: { + format: 'YYYY-MM-DD HH:mm:ss', + placeholder: '请选择保养时间', + showTime: true, + valueFormat: 'x', + }, + rules: 'required', + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'machineryName', + label: '设备名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入设备名称', + }, + }, + { + fieldName: 'maintenTime', + label: '保养时间', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_MAINTEN_RECORD_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { field: 'machineryCode', title: '设备编码', minWidth: 140 }, + { + field: 'machineryName', + title: '设备名称', + minWidth: 150, + slots: { + default: 'machineryName', + }, + }, + { field: 'planName', title: '计划名称', minWidth: 150 }, + { field: 'maintenTime', title: '保养时间', width: 180, formatter: 'formatDateTime' }, + { field: 'nickname', title: '保养人', minWidth: 120 }, + { + field: 'status', + title: '状态', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_MAINTEN_RECORD_STATUS }, + }, + }, + { field: 'createTime', title: '创建时间', width: 180, formatter: 'formatDateTime' }, + { + title: '操作', + width: 200, + fixed: 'right', + slots: { + default: 'actions', + }, + }, + ]; +} diff --git a/apps/web-antd/src/views/mes/dv/maintenrecord/index.vue b/apps/web-antd/src/views/mes/dv/maintenrecord/index.vue new file mode 100644 index 000000000..e4917ba21 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/maintenrecord/index.vue @@ -0,0 +1,159 @@ + + diff --git a/apps/web-antd/src/views/mes/dv/maintenrecord/modules/form.vue b/apps/web-antd/src/views/mes/dv/maintenrecord/modules/form.vue new file mode 100644 index 000000000..86642de73 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/maintenrecord/modules/form.vue @@ -0,0 +1,145 @@ + + diff --git a/apps/web-antd/src/views/mes/dv/maintenrecord/modules/line-list.vue b/apps/web-antd/src/views/mes/dv/maintenrecord/modules/line-list.vue new file mode 100644 index 000000000..c8969bcb9 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/maintenrecord/modules/line-list.vue @@ -0,0 +1,235 @@ + + diff --git a/apps/web-antd/src/views/mes/dv/repair/data.ts b/apps/web-antd/src/views/mes/dv/repair/data.ts new file mode 100644 index 000000000..71029e5a1 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/repair/data.ts @@ -0,0 +1,267 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesDvRepairApi } from '#/api/mes/dv/repair'; + +import { h, markRaw } from 'vue'; + +import { DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { Button } from 'ant-design-vue'; + +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { getSimpleUserList } from '#/api/system/user'; +import { getRangePickerDefaultProps } from '#/utils'; +import { DvMachinerySelect } from '#/views/mes/dv/machinery/components'; +import { MesAutoCodeRuleCode, MesDvRepairStatusEnum } from '#/views/mes/utils/constants'; +/** 新增/修改维修工单的表单 */ +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'status', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + defaultValue: MesDvRepairStatusEnum.PREPARE, + }, + { + fieldName: 'code', + label: '维修单编码', + component: 'Input', + componentProps: { + placeholder: '请输入维修单编码', + }, + dependencies: { + triggerFields: ['id'], + componentProps: (values) => ({ disabled: !!values.id }), + }, + rules: 'required', + suffix: () => + h( + Button, + { + type: 'default', + onClick: async () => { + try { + const code = await generateAutoCode(MesAutoCodeRuleCode.DV_REPAIR_CODE); + await formApi?.setFieldValue('code', code); + } catch (error) { + console.error(error); + } + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'name', + label: '维修单名称', + component: 'Input', + componentProps: { + placeholder: '请输入维修单名称', + }, + rules: 'required', + }, + { + fieldName: 'machineryId', + label: '设备', + component: markRaw(DvMachinerySelect), + componentProps: { + placeholder: '请选择设备', + }, + rules: 'selectRequired', + }, + { + fieldName: 'requireDate', + label: '报修日期', + component: 'DatePicker', + componentProps: { + format: 'YYYY-MM-DD HH:mm:ss', + placeholder: '请选择报修日期', + showTime: true, + valueFormat: 'x', + }, + rules: 'required', + }, + { + fieldName: 'acceptedUserId', + label: '维修人', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getSimpleUserList, + labelField: 'nickname', + placeholder: '请选择维修人', + valueField: 'id', + }, + }, + { + fieldName: 'finishDate', + label: '维修完成日期', + component: 'DatePicker', + componentProps: { + format: 'YYYY-MM-DD HH:mm:ss', + placeholder: '请选择完成日期', + showTime: true, + valueFormat: 'x', + }, + }, + { + fieldName: 'confirmUserId', + label: '验收人', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getSimpleUserList, + labelField: 'nickname', + placeholder: '请选择验收人', + valueField: 'id', + }, + }, + { + fieldName: 'confirmDate', + label: '验收日期', + component: 'DatePicker', + componentProps: { + format: 'YYYY-MM-DD HH:mm:ss', + placeholder: '请选择验收日期', + showTime: true, + valueFormat: 'x', + }, + }, + { + fieldName: 'result', + label: '维修结果', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + optionType: 'button', + options: getDictOptions(DICT_TYPE.MES_DV_REPAIR_RESULT, 'number'), + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '维修单编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入维修单编码', + }, + }, + { + fieldName: 'name', + label: '维修单名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入维修单名称', + }, + }, + { + fieldName: 'machineryName', + label: '设备名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入设备名称', + }, + }, + { + fieldName: 'requireDate', + label: '报修日期', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + }, + }, + { + fieldName: 'result', + label: '维修结果', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_DV_REPAIR_RESULT, 'number'), + placeholder: '请选择维修结果', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_DV_REPAIR_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + ]; +} +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '维修单编码', + minWidth: 140, + slots: { + default: 'code', + }, + }, + { field: 'name', title: '维修单名称', minWidth: 150 }, + { field: 'machineryName', title: '设备名称', minWidth: 150 }, + { field: 'requireDate', title: '报修日期', width: 180, formatter: 'formatDateTime' }, + { field: 'finishDate', title: '完成日期', width: 180, formatter: 'formatDateTime' }, + { + field: 'result', + title: '维修结果', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DV_REPAIR_RESULT }, + }, + }, + { + field: 'status', + title: '状态', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DV_REPAIR_STATUS }, + }, + }, + { field: 'createTime', title: '创建时间', width: 180, formatter: 'formatDateTime' }, + { + title: '操作', + width: 260, + fixed: 'right', + slots: { + default: 'actions', + }, + }, + ]; +} diff --git a/apps/web-antd/src/views/mes/dv/repair/index.vue b/apps/web-antd/src/views/mes/dv/repair/index.vue new file mode 100644 index 000000000..c7c502d4b --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/repair/index.vue @@ -0,0 +1,175 @@ + + diff --git a/apps/web-antd/src/views/mes/dv/repair/modules/form.vue b/apps/web-antd/src/views/mes/dv/repair/modules/form.vue new file mode 100644 index 000000000..618cabdc4 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/repair/modules/form.vue @@ -0,0 +1,217 @@ + + diff --git a/apps/web-antd/src/views/mes/dv/repair/modules/line-list.vue b/apps/web-antd/src/views/mes/dv/repair/modules/line-list.vue new file mode 100644 index 000000000..f4a390048 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/repair/modules/line-list.vue @@ -0,0 +1,233 @@ + + diff --git a/apps/web-antd/src/views/mes/dv/subject/components/dv-subject-select.vue b/apps/web-antd/src/views/mes/dv/subject/components/dv-subject-select.vue new file mode 100644 index 000000000..f11e16a6b --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/subject/components/dv-subject-select.vue @@ -0,0 +1,68 @@ + + + diff --git a/apps/web-antd/src/views/mes/dv/subject/components/index.ts b/apps/web-antd/src/views/mes/dv/subject/components/index.ts new file mode 100644 index 000000000..a8c12d3be --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/subject/components/index.ts @@ -0,0 +1 @@ +export { default as DvSubjectSelect } from './dv-subject-select.vue'; diff --git a/apps/web-antd/src/views/mes/dv/subject/data.ts b/apps/web-antd/src/views/mes/dv/subject/data.ts new file mode 100644 index 000000000..21d51902b --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/subject/data.ts @@ -0,0 +1,199 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesDvSubjectApi } from '#/api/mes/dv/subject'; + +import { h } from 'vue'; + +import { CommonStatusEnum, DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { Button } from 'ant-design-vue'; + +import { z } from '#/adapter/form'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { MesAutoCodeRuleCode, MesDvSubjectTypeEnum } from '#/views/mes/utils/constants'; + +/** 新增/修改点检保养项目的表单 */ +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '项目编码', + component: 'Input', + componentProps: { + placeholder: '请输入项目编码', + }, + rules: 'required', + suffix: () => + h( + Button, + { + type: 'default', + onClick: async () => { + try { + const code = await generateAutoCode(MesAutoCodeRuleCode.DV_SUBJECT_CODE); + await formApi?.setFieldValue('code', code); + } catch (error) { + console.error(error); + } + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'name', + label: '项目名称', + component: 'Input', + componentProps: { + placeholder: '请输入项目名称', + }, + rules: 'required', + }, + { + fieldName: 'type', + label: '项目类型', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + optionType: 'button', + options: getDictOptions(DICT_TYPE.MES_DV_SUBJECT_TYPE, 'number'), + }, + rules: z.number().default(MesDvSubjectTypeEnum.CHECK), + }, + { + fieldName: 'content', + label: '项目内容', + component: 'Textarea', + formItemClass: 'col-span-2', + componentProps: { + placeholder: '请输入项目内容', + rows: 2, + }, + rules: 'required', + }, + { + fieldName: 'standard', + label: '标准', + component: 'Textarea', + formItemClass: 'col-span-2', + componentProps: { + placeholder: '请输入标准', + rows: 2, + }, + rules: 'required', + }, + { + fieldName: 'status', + label: '状态', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + optionType: 'button', + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + }, + rules: z.number().default(CommonStatusEnum.ENABLE), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-2', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '项目编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入项目编码', + }, + }, + { + fieldName: 'name', + label: '项目名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入项目名称', + }, + }, + { + fieldName: 'type', + label: '项目类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_DV_SUBJECT_TYPE, 'number'), + placeholder: '请选择项目类型', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '项目编码', + minWidth: 140, + slots: { + default: 'code', + }, + }, + { field: 'name', title: '项目名称', minWidth: 140 }, + { + field: 'type', + title: '项目类型', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DV_SUBJECT_TYPE }, + }, + }, + { field: 'content', title: '项目内容', minWidth: 180 }, + { field: 'standard', title: '标准', minWidth: 180 }, + { + field: 'status', + title: '状态', + width: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 180, + fixed: 'right', + slots: { + default: 'actions', + }, + }, + ]; +} diff --git a/apps/web-antd/src/views/mes/dv/subject/index.vue b/apps/web-antd/src/views/mes/dv/subject/index.vue new file mode 100644 index 000000000..99e7ace61 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/subject/index.vue @@ -0,0 +1,146 @@ + + + diff --git a/apps/web-antd/src/views/mes/dv/subject/modules/form.vue b/apps/web-antd/src/views/mes/dv/subject/modules/form.vue new file mode 100644 index 000000000..6e2c5efd4 --- /dev/null +++ b/apps/web-antd/src/views/mes/dv/subject/modules/form.vue @@ -0,0 +1,91 @@ + + + diff --git a/apps/web-ele/src/views/mes/cal/plan/data.ts b/apps/web-ele/src/views/mes/cal/plan/data.ts new file mode 100644 index 000000000..5c3867160 --- /dev/null +++ b/apps/web-ele/src/views/mes/cal/plan/data.ts @@ -0,0 +1,283 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesCalPlanApi } from '#/api/mes/cal/plan'; + +import { h } from 'vue'; + +import { DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { ElButton } from 'element-plus'; + +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { getRangePickerDefaultProps } from '#/utils'; +import { + MesAutoCodeRuleCode, + MesCalPlanStatusEnum, + MesCalShiftMethodEnum, + MesCalShiftTypeEnum, +} from '#/views/mes/utils/constants'; + +/** 新增/修改排班计划的表单 */ +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'status', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + defaultValue: MesCalPlanStatusEnum.PREPARE, + }, + { + fieldName: 'code', + label: '计划编码', + component: 'Input', + componentProps: { + placeholder: '请输入计划编码', + }, + rules: 'required', + suffix: () => + h( + ElButton, + { + type: 'default', + onClick: async () => { + try { + const code = await generateAutoCode(MesAutoCodeRuleCode.CAL_PLAN_CODE); + await formApi?.setFieldValue('code', code); + } catch (error) { + console.error(error); + } + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'name', + label: '计划名称', + component: 'Input', + componentProps: { + placeholder: '请输入计划名称', + }, + rules: 'required', + }, + { + fieldName: 'calendarType', + label: '班组类型', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.MES_CAL_CALENDAR_TYPE, 'number'), + placeholder: '请选择班组类型', + }, + rules: 'selectRequired', + }, + { + fieldName: 'startDate', + label: '开始日期', + component: 'DatePicker', + componentProps: { + class: '!w-full', + format: 'YYYY-MM-DD', + placeholder: '请选择开始日期', + valueFormat: 'x', + }, + rules: 'required', + }, + { + fieldName: 'endDate', + label: '结束日期', + component: 'DatePicker', + componentProps: { + class: '!w-full', + format: 'YYYY-MM-DD', + placeholder: '请选择结束日期', + valueFormat: 'x', + }, + rules: 'required', + }, + { + fieldName: 'shiftType', + label: '轮班方式', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.MES_CAL_SHIFT_TYPE, 'number'), + placeholder: '请选择轮班方式', + }, + rules: 'selectRequired', + }, + { + fieldName: 'shiftMethod', + label: '倒班方式', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.MES_CAL_SHIFT_METHOD, 'number'), + placeholder: '请选择倒班方式', + }, + dependencies: { + triggerFields: ['shiftType'], + show: (values) => !!values.shiftType && values.shiftType !== MesCalShiftTypeEnum.SINGLE, + }, + }, + { + fieldName: 'shiftCount', + label: '倒班天数', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + min: 1, + precision: 0, + }, + dependencies: { + triggerFields: ['shiftMethod'], + show: (values) => values.shiftMethod === MesCalShiftMethodEnum.DAY, + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '计划编码', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入计划编码', + }, + }, + { + fieldName: 'name', + label: '计划名称', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入计划名称', + }, + }, + { + fieldName: 'startDate', + label: '开始日期', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + }, + }, + { + fieldName: 'endDate', + label: '结束日期', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + }, + }, + { + fieldName: 'shiftType', + label: '轮班方式', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.MES_CAL_SHIFT_TYPE, 'number'), + placeholder: '请选择轮班方式', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.MES_CAL_PLAN_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '计划编码', + minWidth: 140, + slots: { + default: 'code', + }, + }, + { field: 'name', title: '计划名称', minWidth: 150 }, + { + field: 'calendarType', + title: '班组类型', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_CAL_CALENDAR_TYPE }, + }, + }, + { field: 'startDate', title: '开始日期', width: 150, formatter: 'formatDate' }, + { field: 'endDate', title: '结束日期', width: 150, formatter: 'formatDate' }, + { + field: 'shiftType', + title: '轮班方式', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_CAL_SHIFT_TYPE }, + }, + }, + { + field: 'shiftMethod', + title: '倒班方式', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_CAL_SHIFT_METHOD }, + }, + }, + { + field: 'status', + title: '单据状态', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_CAL_PLAN_STATUS }, + }, + }, + { field: 'createTime', title: '创建时间', width: 180, formatter: 'formatDateTime' }, + { + title: '操作', + width: 160, + fixed: 'right', + slots: { + default: 'actions', + }, + }, + ]; +} diff --git a/apps/web-ele/src/views/mes/cal/plan/index.vue b/apps/web-ele/src/views/mes/cal/plan/index.vue new file mode 100644 index 000000000..75c94baf1 --- /dev/null +++ b/apps/web-ele/src/views/mes/cal/plan/index.vue @@ -0,0 +1,142 @@ + + + diff --git a/apps/web-ele/src/views/mes/cal/plan/modules/form.vue b/apps/web-ele/src/views/mes/cal/plan/modules/form.vue new file mode 100644 index 000000000..2490cb04b --- /dev/null +++ b/apps/web-ele/src/views/mes/cal/plan/modules/form.vue @@ -0,0 +1,155 @@ + + + diff --git a/apps/web-ele/src/views/mes/cal/plan/modules/shift-list.vue b/apps/web-ele/src/views/mes/cal/plan/modules/shift-list.vue new file mode 100644 index 000000000..3fbf0fdf0 --- /dev/null +++ b/apps/web-ele/src/views/mes/cal/plan/modules/shift-list.vue @@ -0,0 +1,240 @@ + + + diff --git a/apps/web-ele/src/views/mes/cal/plan/modules/team-list.vue b/apps/web-ele/src/views/mes/cal/plan/modules/team-list.vue new file mode 100644 index 000000000..cb4e21106 --- /dev/null +++ b/apps/web-ele/src/views/mes/cal/plan/modules/team-list.vue @@ -0,0 +1,207 @@ + + + diff --git a/apps/web-ele/src/views/mes/cal/team/modules/form.vue b/apps/web-ele/src/views/mes/cal/team/modules/form.vue index 618e10d1e..3c6564055 100644 --- a/apps/web-ele/src/views/mes/cal/team/modules/form.vue +++ b/apps/web-ele/src/views/mes/cal/team/modules/form.vue @@ -15,8 +15,10 @@ import { useFormSchema } from '../data'; import MemberList from './member-list.vue'; +type FormMode = 'create' | 'detail' | 'update'; + const emit = defineEmits(['success']); -const formMode = ref<'create' | 'detail' | 'update'>('create'); // 表单模式 +const formMode = ref('create'); // 表单模式 const subTabsName = ref('member'); // 当前资源页签 const formData = ref(); const isDetail = computed(() => formMode.value === 'detail'); // 是否查看模式 @@ -82,7 +84,7 @@ const [Modal, modalApi] = useVbenModal({ } await formApi.resetForm(); subTabsName.value = 'member'; - const data = modalApi.getData<{ id?: number; type?: 'create' | 'detail' | 'update' }>(); + const data = modalApi.getData<{ id?: number; type?: FormMode }>(); formMode.value = data?.type || 'create'; formApi.setDisabled(formMode.value === 'detail'); modalApi.setState({ showConfirmButton: formMode.value !== 'detail' }); diff --git a/apps/web-ele/src/views/mes/dv/checkplan/components/dv-check-plan-select.vue b/apps/web-ele/src/views/mes/dv/checkplan/components/dv-check-plan-select.vue new file mode 100644 index 000000000..81d905dc3 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/checkplan/components/dv-check-plan-select.vue @@ -0,0 +1,71 @@ + + + diff --git a/apps/web-ele/src/views/mes/dv/checkplan/components/index.ts b/apps/web-ele/src/views/mes/dv/checkplan/components/index.ts new file mode 100644 index 000000000..379957e07 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/checkplan/components/index.ts @@ -0,0 +1 @@ +export { default as DvCheckPlanSelect } from './dv-check-plan-select.vue'; diff --git a/apps/web-ele/src/views/mes/dv/checkplan/data.ts b/apps/web-ele/src/views/mes/dv/checkplan/data.ts new file mode 100644 index 000000000..cf5ff2c44 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/checkplan/data.ts @@ -0,0 +1,248 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesDvCheckPlanApi } from '#/api/mes/dv/checkplan'; + +import { h } from 'vue'; + +import { DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { ElButton } from 'element-plus'; + +import { z } from '#/adapter/form'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { getRangePickerDefaultProps } from '#/utils'; +import { + MesAutoCodeRuleCode, + MesDvCheckPlanStatusEnum, + MesDvSubjectTypeEnum, +} from '#/views/mes/utils/constants'; + +/** 新增/修改点检保养方案的表单 */ +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'status', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + defaultValue: MesDvCheckPlanStatusEnum.PREPARE, + }, + { + fieldName: 'code', + label: '方案编码', + component: 'Input', + componentProps: { + placeholder: '请输入方案编码', + }, + rules: 'required', + suffix: () => + h( + ElButton, + { + type: 'default', + onClick: async () => { + try { + const code = await generateAutoCode(MesAutoCodeRuleCode.DV_CHECK_PLAN_CODE); + await formApi?.setFieldValue('code', code); + } catch (error) { + console.error(error); + } + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'name', + label: '方案名称', + component: 'Input', + componentProps: { + placeholder: '请输入方案名称', + }, + rules: 'required', + }, + { + fieldName: 'type', + label: '方案类型', + component: 'RadioGroup', + componentProps: { + options: getDictOptions(DICT_TYPE.MES_DV_SUBJECT_TYPE, 'number'), + }, + rules: z.number().default(MesDvSubjectTypeEnum.CHECK), + }, + { + fieldName: 'startDate', + label: '开始日期', + component: 'DatePicker', + componentProps: { + class: '!w-full', + format: 'YYYY-MM-DD', + placeholder: '请选择开始日期', + valueFormat: 'x', + }, + rules: 'required', + }, + { + fieldName: 'endDate', + label: '结束日期', + component: 'DatePicker', + componentProps: { + class: '!w-full', + format: 'YYYY-MM-DD', + placeholder: '请选择结束日期', + valueFormat: 'x', + }, + rules: 'required', + }, + { + fieldName: 'cycleType', + label: '周期类型', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.MES_DV_CYCLE_TYPE, 'number'), + placeholder: '请选择周期类型', + }, + rules: 'selectRequired', + }, + { + fieldName: 'cycleCount', + label: '周期数量', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + min: 1, + precision: 0, + }, + rules: z.number().default(1), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '方案编码', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入方案编码', + }, + }, + { + fieldName: 'name', + label: '方案名称', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入方案名称', + }, + }, + { + fieldName: 'type', + label: '方案类型', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.MES_DV_SUBJECT_TYPE, 'number'), + placeholder: '请选择方案类型', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.MES_DV_CHECK_PLAN_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + { + fieldName: 'startDate', + label: '开始日期', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '方案编码', + minWidth: 140, + slots: { + default: 'code', + }, + }, + { field: 'name', title: '方案名称', minWidth: 150 }, + { + field: 'type', + title: '方案类型', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DV_SUBJECT_TYPE }, + }, + }, + { field: 'startDate', title: '开始日期', width: 150, formatter: 'formatDate' }, + { field: 'endDate', title: '结束日期', width: 150, formatter: 'formatDate' }, + { + field: 'cycleType', + title: '周期类型', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DV_CYCLE_TYPE }, + }, + }, + { field: 'cycleCount', title: '周期数量', width: 100 }, + { + field: 'status', + title: '状态', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DV_CHECK_PLAN_STATUS }, + }, + }, + { field: 'createTime', title: '创建时间', width: 180, formatter: 'formatDateTime' }, + { + title: '操作', + width: 240, + fixed: 'right', + slots: { + default: 'actions', + }, + }, + ]; +} diff --git a/apps/web-ele/src/views/mes/dv/checkplan/index.vue b/apps/web-ele/src/views/mes/dv/checkplan/index.vue new file mode 100644 index 000000000..b3ff98571 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/checkplan/index.vue @@ -0,0 +1,189 @@ + + diff --git a/apps/web-ele/src/views/mes/dv/checkplan/modules/form.vue b/apps/web-ele/src/views/mes/dv/checkplan/modules/form.vue new file mode 100644 index 000000000..a265962f2 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/checkplan/modules/form.vue @@ -0,0 +1,112 @@ + + diff --git a/apps/web-ele/src/views/mes/dv/checkplan/modules/machinery-list.vue b/apps/web-ele/src/views/mes/dv/checkplan/modules/machinery-list.vue new file mode 100644 index 000000000..5c91afdd4 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/checkplan/modules/machinery-list.vue @@ -0,0 +1,187 @@ + + diff --git a/apps/web-ele/src/views/mes/dv/checkplan/modules/subject-list.vue b/apps/web-ele/src/views/mes/dv/checkplan/modules/subject-list.vue new file mode 100644 index 000000000..b678ed8d5 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/checkplan/modules/subject-list.vue @@ -0,0 +1,199 @@ + + diff --git a/apps/web-ele/src/views/mes/dv/checkrecord/data.ts b/apps/web-ele/src/views/mes/dv/checkrecord/data.ts new file mode 100644 index 000000000..d75828f64 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/checkrecord/data.ts @@ -0,0 +1,166 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesDvCheckRecordApi } from '#/api/mes/dv/checkrecord'; + +import { markRaw } from 'vue'; + +import { DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { getSimpleUserList } from '#/api/system/user'; +import { getRangePickerDefaultProps } from '#/utils'; +import { DvCheckPlanSelect } from '#/views/mes/dv/checkplan/components'; +import { DvMachinerySelect } from '#/views/mes/dv/machinery/components'; +import { + MesDvCheckPlanStatusEnum, + MesDvCheckRecordStatusEnum, + MesDvSubjectTypeEnum, +} from '#/views/mes/utils/constants'; + +/** 新增/修改点检记录的表单 */ +export function useFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'status', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + defaultValue: MesDvCheckRecordStatusEnum.DRAFT, + }, + { + fieldName: 'machineryId', + label: '设备', + component: markRaw(DvMachinerySelect), + componentProps: { + placeholder: '请选择设备', + }, + rules: 'selectRequired', + }, + { + fieldName: 'planId', + label: '点检计划', + component: markRaw(DvCheckPlanSelect), + componentProps: { + status: MesDvCheckPlanStatusEnum.ENABLED, + type: MesDvSubjectTypeEnum.CHECK, + placeholder: '请选择计划', + }, + rules: 'selectRequired', + }, + { + fieldName: 'userId', + label: '点检人', + component: 'ApiSelect', + componentProps: { + clearable: true, + api: getSimpleUserList, + labelField: 'nickname', + placeholder: '请选择点检人', + valueField: 'id', + }, + rules: 'selectRequired', + }, + { + fieldName: 'checkTime', + label: '点检时间', + component: 'DatePicker', + componentProps: { + class: '!w-full', + format: 'YYYY-MM-DD HH:mm:ss', + placeholder: '请选择点检时间', + showTime: true, + valueFormat: 'x', + }, + rules: 'required', + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'machineryName', + label: '设备名称', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入设备名称', + }, + }, + { + fieldName: 'checkTime', + label: '点检时间', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.MES_DV_CHECK_RECORD_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { field: 'machineryCode', title: '设备编码', minWidth: 140 }, + { + field: 'machineryName', + title: '设备名称', + minWidth: 150, + slots: { + default: 'machineryName', + }, + }, + { field: 'planName', title: '计划名称', minWidth: 150 }, + { field: 'checkTime', title: '点检时间', width: 180, formatter: 'formatDateTime' }, + { field: 'nickname', title: '点检人', minWidth: 120 }, + { + field: 'status', + title: '状态', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DV_CHECK_RECORD_STATUS }, + }, + }, + { field: 'createTime', title: '创建时间', width: 180, formatter: 'formatDateTime' }, + { + title: '操作', + width: 200, + fixed: 'right', + slots: { + default: 'actions', + }, + }, + ]; +} diff --git a/apps/web-ele/src/views/mes/dv/checkrecord/index.vue b/apps/web-ele/src/views/mes/dv/checkrecord/index.vue new file mode 100644 index 000000000..e6973e32f --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/checkrecord/index.vue @@ -0,0 +1,156 @@ + + diff --git a/apps/web-ele/src/views/mes/dv/checkrecord/modules/form.vue b/apps/web-ele/src/views/mes/dv/checkrecord/modules/form.vue new file mode 100644 index 000000000..111ee858d --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/checkrecord/modules/form.vue @@ -0,0 +1,139 @@ + + diff --git a/apps/web-ele/src/views/mes/dv/checkrecord/modules/line-list.vue b/apps/web-ele/src/views/mes/dv/checkrecord/modules/line-list.vue new file mode 100644 index 000000000..42bd2e466 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/checkrecord/modules/line-list.vue @@ -0,0 +1,233 @@ + + diff --git a/apps/web-ele/src/views/mes/dv/machinery/components/dv-machinery-select.vue b/apps/web-ele/src/views/mes/dv/machinery/components/dv-machinery-select.vue new file mode 100644 index 000000000..09f55a66b --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/machinery/components/dv-machinery-select.vue @@ -0,0 +1,55 @@ + + + diff --git a/apps/web-ele/src/views/mes/dv/machinery/components/index.ts b/apps/web-ele/src/views/mes/dv/machinery/components/index.ts new file mode 100644 index 000000000..cbe225de1 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/machinery/components/index.ts @@ -0,0 +1 @@ +export { default as DvMachinerySelect } from './dv-machinery-select.vue'; diff --git a/apps/web-ele/src/views/mes/dv/machinery/data.ts b/apps/web-ele/src/views/mes/dv/machinery/data.ts new file mode 100644 index 000000000..c11fd5940 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/machinery/data.ts @@ -0,0 +1,277 @@ +import type { Ref } from 'vue'; + +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesDvMachineryApi } from '#/api/mes/dv/machinery'; + +import { h, markRaw } from 'vue'; + +import { DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { ElButton } from 'element-plus'; + +import { z } from '#/adapter/form'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { MdWorkshopSelect } from '#/views/mes/md/workstation/components'; +import { MesAutoCodeRuleCode, MesDvMachineryStatusEnum } from '#/views/mes/utils/constants'; + +import { DvMachineryTypeSelect } from './type/components'; + +/** 新增/修改设备的表单 */ +export function useFormSchema(formApi?: VbenFormApi, formMode?: Ref): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '设备编码', + component: 'Input', + componentProps: { + placeholder: '请输入设备编码', + }, + dependencies: { + triggerFields: ['id'], + componentProps: (values) => ({ disabled: !!values.id }), + }, + rules: 'required', + suffix: () => + h( + ElButton, + { + type: 'default', + onClick: async () => { + try { + const code = await generateAutoCode(MesAutoCodeRuleCode.DV_MACHINERY_CODE); + await formApi?.setFieldValue('code', code); + } catch (error) { + console.error(error); + } + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'name', + label: '设备名称', + component: 'Input', + componentProps: { + placeholder: '请输入设备名称', + }, + rules: 'required', + }, + { + fieldName: 'brand', + label: '品牌', + component: 'Input', + componentProps: { + placeholder: '请输入品牌', + }, + }, + { + fieldName: 'machineryTypeId', + label: '设备类型', + component: markRaw(DvMachineryTypeSelect), + componentProps: { + placeholder: '请选择设备类型', + }, + rules: 'selectRequired', + }, + { + fieldName: 'workshopId', + label: '所属车间', + component: markRaw(MdWorkshopSelect), + componentProps: { + placeholder: '请选择所属车间', + }, + rules: 'selectRequired', + }, + { + fieldName: 'status', + label: '设备状态', + component: 'RadioGroup', + componentProps: { + options: getDictOptions(DICT_TYPE.MES_DV_MACHINERY_STATUS, 'number'), + }, + rules: z.number().default(MesDvMachineryStatusEnum.STOP), + }, + { + fieldName: 'specification', + label: '规格型号', + component: 'Input', + componentProps: { + placeholder: '请输入规格型号', + }, + }, + { + fieldName: 'lastCheckTime', + label: '最近点检时间', + component: 'DatePicker', + componentProps: { + disabled: true, + format: 'YYYY-MM-DD HH:mm:ss', + showTime: true, + valueFormat: 'x', + class: '!w-full', + }, + dependencies: { + triggerFields: ['id'], + show: () => formMode?.value === 'detail', + }, + }, + { + fieldName: 'lastMaintenTime', + label: '最近保养时间', + component: 'DatePicker', + componentProps: { + disabled: true, + format: 'YYYY-MM-DD HH:mm:ss', + showTime: true, + valueFormat: 'x', + class: '!w-full', + }, + dependencies: { + triggerFields: ['id'], + show: () => formMode?.value === 'detail', + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '设备编码', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入设备编码', + }, + }, + { + fieldName: 'name', + label: '设备名称', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入设备名称', + }, + }, + { + fieldName: 'workshopId', + label: '所属车间', + component: markRaw(MdWorkshopSelect), + componentProps: { + clearable: true, + placeholder: '请选择所属车间', + }, + }, + { + fieldName: 'status', + label: '设备状态', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.MES_DV_MACHINERY_STATUS, 'number'), + placeholder: '请选择设备状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '设备编码', + minWidth: 140, + slots: { + default: 'code', + }, + }, + { field: 'name', title: '设备名称', minWidth: 140 }, + { field: 'brand', title: '品牌', minWidth: 120 }, + { field: 'specification', title: '规格型号', minWidth: 140 }, + { field: 'machineryTypeName', title: '设备类型', minWidth: 140 }, + { field: 'workshopName', title: '所属车间', minWidth: 140 }, + { + field: 'status', + title: '设备状态', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DV_MACHINERY_STATUS }, + }, + }, + { + field: 'lastCheckTime', + title: '最近点检时间', + width: 180, + formatter: 'formatDateTime', + }, + { + field: 'lastMaintenTime', + title: '最近保养时间', + width: 180, + formatter: 'formatDateTime', + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 220, + fixed: 'right', + slots: { + default: 'actions', + }, + }, + ]; +} + +/** 导入表单 */ +export function useImportFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'file', + label: '设备数据', + component: 'Upload', + rules: 'required', + help: '仅允许导入 xls、xlsx 格式文件', + }, + { + fieldName: 'updateSupport', + label: '是否覆盖', + component: 'Switch', + componentProps: { + activeText: '是', + inactiveText: '否', + }, + rules: z.boolean().default(false), + help: '是否更新已经存在的设备数据', + }, + ]; +} diff --git a/apps/web-ele/src/views/mes/dv/machinery/index.vue b/apps/web-ele/src/views/mes/dv/machinery/index.vue new file mode 100644 index 000000000..df5b632b5 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/machinery/index.vue @@ -0,0 +1,190 @@ + + + diff --git a/apps/web-ele/src/views/mes/dv/machinery/modules/check-record-list.vue b/apps/web-ele/src/views/mes/dv/machinery/modules/check-record-list.vue new file mode 100644 index 000000000..aa486cf05 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/machinery/modules/check-record-list.vue @@ -0,0 +1,73 @@ + + + diff --git a/apps/web-ele/src/views/mes/dv/machinery/modules/form.vue b/apps/web-ele/src/views/mes/dv/machinery/modules/form.vue new file mode 100644 index 000000000..d86ffebc2 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/machinery/modules/form.vue @@ -0,0 +1,131 @@ + + + diff --git a/apps/web-ele/src/views/mes/dv/machinery/modules/import-form.vue b/apps/web-ele/src/views/mes/dv/machinery/modules/import-form.vue new file mode 100644 index 000000000..110c9e582 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/machinery/modules/import-form.vue @@ -0,0 +1,92 @@ + + + diff --git a/apps/web-ele/src/views/mes/dv/machinery/modules/mainten-record-list.vue b/apps/web-ele/src/views/mes/dv/machinery/modules/mainten-record-list.vue new file mode 100644 index 000000000..3a8f2e656 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/machinery/modules/mainten-record-list.vue @@ -0,0 +1,73 @@ + + + diff --git a/apps/web-ele/src/views/mes/dv/machinery/modules/repair-list.vue b/apps/web-ele/src/views/mes/dv/machinery/modules/repair-list.vue new file mode 100644 index 000000000..efed48449 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/machinery/modules/repair-list.vue @@ -0,0 +1,74 @@ + + + diff --git a/apps/web-ele/src/views/mes/dv/machinery/type/components/dv-machinery-type-select.vue b/apps/web-ele/src/views/mes/dv/machinery/type/components/dv-machinery-type-select.vue new file mode 100644 index 000000000..0d3419116 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/machinery/type/components/dv-machinery-type-select.vue @@ -0,0 +1,113 @@ + + + diff --git a/apps/web-ele/src/views/mes/dv/machinery/type/components/index.ts b/apps/web-ele/src/views/mes/dv/machinery/type/components/index.ts new file mode 100644 index 000000000..c4cff7c14 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/machinery/type/components/index.ts @@ -0,0 +1,2 @@ +export { default as DvMachineryTypeSelect } from './dv-machinery-type-select.vue'; +export { default as MachineryTypeTree } from './machinery-type-tree.vue'; diff --git a/apps/web-ele/src/views/mes/dv/machinery/type/components/machinery-type-tree.vue b/apps/web-ele/src/views/mes/dv/machinery/type/components/machinery-type-tree.vue new file mode 100644 index 000000000..88b175a18 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/machinery/type/components/machinery-type-tree.vue @@ -0,0 +1,95 @@ + + + diff --git a/apps/web-ele/src/views/mes/dv/machinery/type/data.ts b/apps/web-ele/src/views/mes/dv/machinery/type/data.ts new file mode 100644 index 000000000..b63b684a3 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/machinery/type/data.ts @@ -0,0 +1,170 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesDvMachineryTypeApi } from '#/api/mes/dv/machinery/type'; + +import { h } from 'vue'; + +import { CommonStatusEnum, DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; +import { handleTree } from '@vben/utils'; + +import { ElButton } from 'element-plus'; + +import { z } from '#/adapter/form'; +import { getMachineryTypeList } from '#/api/mes/dv/machinery/type'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { MesAutoCodeRuleCode } from '#/views/mes/utils/constants'; + +/** 新增/修改设备类型的表单 */ +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'parentId', + label: '上级类型', + component: 'ApiTreeSelect', + componentProps: { + clearable: true, + api: async () => [ + { id: 0, name: '顶级类型', children: handleTree(await getMachineryTypeList()) }, + ], + childrenField: 'children', + labelField: 'name', + placeholder: '请选择上级类型', + defaultExpandAll: true, + valueField: 'id', + }, + rules: 'selectRequired', + }, + { + fieldName: 'code', + label: '类型编码', + component: 'Input', + componentProps: { + maxLength: 64, + placeholder: '请输入类型编码', + }, + rules: z.string().min(1, '类型编码不能为空').max(64), + suffix: () => + h( + ElButton, + { + type: 'default', + onClick: async () => { + try { + const code = await generateAutoCode(MesAutoCodeRuleCode.DV_MACHINERY_TYPE_CODE); + await formApi?.setFieldValue('code', code); + } catch (error) { + console.error(error); + } + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'name', + label: '类型名称', + component: 'Input', + componentProps: { + placeholder: '请输入类型名称', + }, + rules: 'required', + }, + { + fieldName: 'sort', + label: '显示排序', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + min: 0, + precision: 0, + }, + rules: z.number().default(0), + }, + { + fieldName: 'status', + label: '状态', + component: 'RadioGroup', + componentProps: { + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + }, + rules: z.number().default(CommonStatusEnum.ENABLE), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'name', + label: '类型名称', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入类型名称', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { field: 'name', title: '类型名称', minWidth: 200, align: 'left', treeNode: true }, + { field: 'code', title: '类型编码', width: 160, align: 'center' }, + { field: 'sort', title: '排序', width: 100, align: 'center' }, + { + field: 'status', + title: '状态', + width: 120, + align: 'center', + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 260, + fixed: 'right', + slots: { + default: 'actions', + }, + }, + ]; +} diff --git a/apps/web-ele/src/views/mes/dv/machinery/type/index.vue b/apps/web-ele/src/views/mes/dv/machinery/type/index.vue new file mode 100644 index 000000000..ecde7c3c8 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/machinery/type/index.vue @@ -0,0 +1,151 @@ + + + diff --git a/apps/web-ele/src/views/mes/dv/machinery/type/modules/form.vue b/apps/web-ele/src/views/mes/dv/machinery/type/modules/form.vue new file mode 100644 index 000000000..59c466cb3 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/machinery/type/modules/form.vue @@ -0,0 +1,84 @@ + + + diff --git a/apps/web-ele/src/views/mes/dv/maintenrecord/data.ts b/apps/web-ele/src/views/mes/dv/maintenrecord/data.ts new file mode 100644 index 000000000..e5d6f6116 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/maintenrecord/data.ts @@ -0,0 +1,166 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesDvMaintenRecordApi } from '#/api/mes/dv/maintenrecord'; + +import { markRaw } from 'vue'; + +import { DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { getSimpleUserList } from '#/api/system/user'; +import { getRangePickerDefaultProps } from '#/utils'; +import { DvCheckPlanSelect } from '#/views/mes/dv/checkplan/components'; +import { DvMachinerySelect } from '#/views/mes/dv/machinery/components'; +import { + MesDvCheckPlanStatusEnum, + MesDvMaintenRecordStatusEnum, + MesDvSubjectTypeEnum, +} from '#/views/mes/utils/constants'; + +/** 新增/修改保养记录的表单 */ +export function useFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'status', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + defaultValue: MesDvMaintenRecordStatusEnum.PREPARE, + }, + { + fieldName: 'machineryId', + label: '设备', + component: markRaw(DvMachinerySelect), + componentProps: { + placeholder: '请选择设备', + }, + rules: 'selectRequired', + }, + { + fieldName: 'planId', + label: '保养计划', + component: markRaw(DvCheckPlanSelect), + componentProps: { + status: MesDvCheckPlanStatusEnum.ENABLED, + type: MesDvSubjectTypeEnum.MAINTENANCE, + placeholder: '请选择计划', + }, + rules: 'selectRequired', + }, + { + fieldName: 'userId', + label: '保养人', + component: 'ApiSelect', + componentProps: { + clearable: true, + api: getSimpleUserList, + labelField: 'nickname', + placeholder: '请选择保养人', + valueField: 'id', + }, + rules: 'selectRequired', + }, + { + fieldName: 'maintenTime', + label: '保养时间', + component: 'DatePicker', + componentProps: { + class: '!w-full', + format: 'YYYY-MM-DD HH:mm:ss', + placeholder: '请选择保养时间', + showTime: true, + valueFormat: 'x', + }, + rules: 'required', + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'machineryName', + label: '设备名称', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入设备名称', + }, + }, + { + fieldName: 'maintenTime', + label: '保养时间', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.MES_MAINTEN_RECORD_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { field: 'machineryCode', title: '设备编码', minWidth: 140 }, + { + field: 'machineryName', + title: '设备名称', + minWidth: 150, + slots: { + default: 'machineryName', + }, + }, + { field: 'planName', title: '计划名称', minWidth: 150 }, + { field: 'maintenTime', title: '保养时间', width: 180, formatter: 'formatDateTime' }, + { field: 'nickname', title: '保养人', minWidth: 120 }, + { + field: 'status', + title: '状态', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_MAINTEN_RECORD_STATUS }, + }, + }, + { field: 'createTime', title: '创建时间', width: 180, formatter: 'formatDateTime' }, + { + title: '操作', + width: 200, + fixed: 'right', + slots: { + default: 'actions', + }, + }, + ]; +} diff --git a/apps/web-ele/src/views/mes/dv/maintenrecord/index.vue b/apps/web-ele/src/views/mes/dv/maintenrecord/index.vue new file mode 100644 index 000000000..0e6a3b738 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/maintenrecord/index.vue @@ -0,0 +1,160 @@ + + diff --git a/apps/web-ele/src/views/mes/dv/maintenrecord/modules/form.vue b/apps/web-ele/src/views/mes/dv/maintenrecord/modules/form.vue new file mode 100644 index 000000000..60c96da23 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/maintenrecord/modules/form.vue @@ -0,0 +1,147 @@ + + diff --git a/apps/web-ele/src/views/mes/dv/maintenrecord/modules/line-list.vue b/apps/web-ele/src/views/mes/dv/maintenrecord/modules/line-list.vue new file mode 100644 index 000000000..1599cd0c6 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/maintenrecord/modules/line-list.vue @@ -0,0 +1,236 @@ + + diff --git a/apps/web-ele/src/views/mes/dv/repair/data.ts b/apps/web-ele/src/views/mes/dv/repair/data.ts new file mode 100644 index 000000000..9b027fb42 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/repair/data.ts @@ -0,0 +1,268 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesDvRepairApi } from '#/api/mes/dv/repair'; + +import { h, markRaw } from 'vue'; + +import { DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { ElButton } from 'element-plus'; + +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { getSimpleUserList } from '#/api/system/user'; +import { getRangePickerDefaultProps } from '#/utils'; +import { DvMachinerySelect } from '#/views/mes/dv/machinery/components'; +import { MesAutoCodeRuleCode, MesDvRepairStatusEnum } from '#/views/mes/utils/constants'; +/** 新增/修改维修工单的表单 */ +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'status', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + defaultValue: MesDvRepairStatusEnum.PREPARE, + }, + { + fieldName: 'code', + label: '维修单编码', + component: 'Input', + componentProps: { + placeholder: '请输入维修单编码', + }, + dependencies: { + triggerFields: ['id'], + componentProps: (values) => ({ disabled: !!values.id }), + }, + rules: 'required', + suffix: () => + h( + ElButton, + { + type: 'default', + onClick: async () => { + try { + const code = await generateAutoCode(MesAutoCodeRuleCode.DV_REPAIR_CODE); + await formApi?.setFieldValue('code', code); + } catch (error) { + console.error(error); + } + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'name', + label: '维修单名称', + component: 'Input', + componentProps: { + placeholder: '请输入维修单名称', + }, + rules: 'required', + }, + { + fieldName: 'machineryId', + label: '设备', + component: markRaw(DvMachinerySelect), + componentProps: { + placeholder: '请选择设备', + }, + rules: 'selectRequired', + }, + { + fieldName: 'requireDate', + label: '报修日期', + component: 'DatePicker', + componentProps: { + class: '!w-full', + format: 'YYYY-MM-DD HH:mm:ss', + placeholder: '请选择报修日期', + showTime: true, + valueFormat: 'x', + }, + rules: 'required', + }, + { + fieldName: 'acceptedUserId', + label: '维修人', + component: 'ApiSelect', + componentProps: { + clearable: true, + api: getSimpleUserList, + labelField: 'nickname', + placeholder: '请选择维修人', + valueField: 'id', + }, + }, + { + fieldName: 'finishDate', + label: '维修完成日期', + component: 'DatePicker', + componentProps: { + class: '!w-full', + format: 'YYYY-MM-DD HH:mm:ss', + placeholder: '请选择完成日期', + showTime: true, + valueFormat: 'x', + }, + }, + { + fieldName: 'confirmUserId', + label: '验收人', + component: 'ApiSelect', + componentProps: { + clearable: true, + api: getSimpleUserList, + labelField: 'nickname', + placeholder: '请选择验收人', + valueField: 'id', + }, + }, + { + fieldName: 'confirmDate', + label: '验收日期', + component: 'DatePicker', + componentProps: { + class: '!w-full', + format: 'YYYY-MM-DD HH:mm:ss', + placeholder: '请选择验收日期', + showTime: true, + valueFormat: 'x', + }, + }, + { + fieldName: 'result', + label: '维修结果', + component: 'RadioGroup', + componentProps: { + options: getDictOptions(DICT_TYPE.MES_DV_REPAIR_RESULT, 'number'), + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '维修单编码', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入维修单编码', + }, + }, + { + fieldName: 'name', + label: '维修单名称', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入维修单名称', + }, + }, + { + fieldName: 'machineryName', + label: '设备名称', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入设备名称', + }, + }, + { + fieldName: 'requireDate', + label: '报修日期', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + }, + }, + { + fieldName: 'result', + label: '维修结果', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.MES_DV_REPAIR_RESULT, 'number'), + placeholder: '请选择维修结果', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.MES_DV_REPAIR_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + ]; +} +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '维修单编码', + minWidth: 140, + slots: { + default: 'code', + }, + }, + { field: 'name', title: '维修单名称', minWidth: 150 }, + { field: 'machineryName', title: '设备名称', minWidth: 150 }, + { field: 'requireDate', title: '报修日期', width: 180, formatter: 'formatDateTime' }, + { field: 'finishDate', title: '完成日期', width: 180, formatter: 'formatDateTime' }, + { + field: 'result', + title: '维修结果', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DV_REPAIR_RESULT }, + }, + }, + { + field: 'status', + title: '状态', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DV_REPAIR_STATUS }, + }, + }, + { field: 'createTime', title: '创建时间', width: 180, formatter: 'formatDateTime' }, + { + title: '操作', + width: 260, + fixed: 'right', + slots: { + default: 'actions', + }, + }, + ]; +} diff --git a/apps/web-ele/src/views/mes/dv/repair/index.vue b/apps/web-ele/src/views/mes/dv/repair/index.vue new file mode 100644 index 000000000..fd2e6f7fd --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/repair/index.vue @@ -0,0 +1,176 @@ + + diff --git a/apps/web-ele/src/views/mes/dv/repair/modules/form.vue b/apps/web-ele/src/views/mes/dv/repair/modules/form.vue new file mode 100644 index 000000000..c8f523eb1 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/repair/modules/form.vue @@ -0,0 +1,225 @@ + + diff --git a/apps/web-ele/src/views/mes/dv/repair/modules/line-list.vue b/apps/web-ele/src/views/mes/dv/repair/modules/line-list.vue new file mode 100644 index 000000000..c0eb315de --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/repair/modules/line-list.vue @@ -0,0 +1,236 @@ + + diff --git a/apps/web-ele/src/views/mes/dv/subject/components/dv-subject-select.vue b/apps/web-ele/src/views/mes/dv/subject/components/dv-subject-select.vue new file mode 100644 index 000000000..36e75fb68 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/subject/components/dv-subject-select.vue @@ -0,0 +1,65 @@ + + + diff --git a/apps/web-ele/src/views/mes/dv/subject/components/index.ts b/apps/web-ele/src/views/mes/dv/subject/components/index.ts new file mode 100644 index 000000000..a8c12d3be --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/subject/components/index.ts @@ -0,0 +1 @@ +export { default as DvSubjectSelect } from './dv-subject-select.vue'; diff --git a/apps/web-ele/src/views/mes/dv/subject/data.ts b/apps/web-ele/src/views/mes/dv/subject/data.ts new file mode 100644 index 000000000..087781834 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/subject/data.ts @@ -0,0 +1,195 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesDvSubjectApi } from '#/api/mes/dv/subject'; + +import { h } from 'vue'; + +import { CommonStatusEnum, DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { ElButton } from 'element-plus'; + +import { z } from '#/adapter/form'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { MesAutoCodeRuleCode, MesDvSubjectTypeEnum } from '#/views/mes/utils/constants'; + +/** 新增/修改点检保养项目的表单 */ +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '项目编码', + component: 'Input', + componentProps: { + placeholder: '请输入项目编码', + }, + rules: 'required', + suffix: () => + h( + ElButton, + { + type: 'default', + onClick: async () => { + try { + const code = await generateAutoCode(MesAutoCodeRuleCode.DV_SUBJECT_CODE); + await formApi?.setFieldValue('code', code); + } catch (error) { + console.error(error); + } + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'name', + label: '项目名称', + component: 'Input', + componentProps: { + placeholder: '请输入项目名称', + }, + rules: 'required', + }, + { + fieldName: 'type', + label: '项目类型', + component: 'RadioGroup', + componentProps: { + options: getDictOptions(DICT_TYPE.MES_DV_SUBJECT_TYPE, 'number'), + }, + rules: z.number().default(MesDvSubjectTypeEnum.CHECK), + }, + { + fieldName: 'content', + label: '项目内容', + component: 'Textarea', + formItemClass: 'col-span-2', + componentProps: { + placeholder: '请输入项目内容', + rows: 2, + }, + rules: 'required', + }, + { + fieldName: 'standard', + label: '标准', + component: 'Textarea', + formItemClass: 'col-span-2', + componentProps: { + placeholder: '请输入标准', + rows: 2, + }, + rules: 'required', + }, + { + fieldName: 'status', + label: '状态', + component: 'RadioGroup', + componentProps: { + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + }, + rules: z.number().default(CommonStatusEnum.ENABLE), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-2', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '项目编码', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入项目编码', + }, + }, + { + fieldName: 'name', + label: '项目名称', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入项目名称', + }, + }, + { + fieldName: 'type', + label: '项目类型', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.MES_DV_SUBJECT_TYPE, 'number'), + placeholder: '请选择项目类型', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '项目编码', + minWidth: 140, + slots: { + default: 'code', + }, + }, + { field: 'name', title: '项目名称', minWidth: 140 }, + { + field: 'type', + title: '项目类型', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DV_SUBJECT_TYPE }, + }, + }, + { field: 'content', title: '项目内容', minWidth: 180 }, + { field: 'standard', title: '标准', minWidth: 180 }, + { + field: 'status', + title: '状态', + width: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 180, + fixed: 'right', + slots: { + default: 'actions', + }, + }, + ]; +} diff --git a/apps/web-ele/src/views/mes/dv/subject/index.vue b/apps/web-ele/src/views/mes/dv/subject/index.vue new file mode 100644 index 000000000..53ac51d00 --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/subject/index.vue @@ -0,0 +1,144 @@ + + + diff --git a/apps/web-ele/src/views/mes/dv/subject/modules/form.vue b/apps/web-ele/src/views/mes/dv/subject/modules/form.vue new file mode 100644 index 000000000..84c00ebff --- /dev/null +++ b/apps/web-ele/src/views/mes/dv/subject/modules/form.vue @@ -0,0 +1,91 @@ + + +