diff --git a/apps/web-antd/src/views/mes/md/item/index.vue b/apps/web-antd/src/views/mes/md/item/index.vue index 2cbcbb48e..98132ab9e 100644 --- a/apps/web-antd/src/views/mes/md/item/index.vue +++ b/apps/web-antd/src/views/mes/md/item/index.vue @@ -5,12 +5,12 @@ import type { MesMdItemTypeApi } from '#/api/mes/md/item/type'; import { ref } from 'vue'; -import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; +import { confirm, DocAlert, Page, useVbenModal } from '@vben/common-ui'; import { DICT_TYPE } from '@vben/constants'; import { getDictLabel } from '@vben/hooks'; import { downloadFileFromBlobPart } from '@vben/utils'; -import { Button, Card, message, Modal } from 'ant-design-vue'; +import { Button, Card, message } from 'ant-design-vue'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { diff --git a/apps/web-antd/src/views/mes/md/workstation/components/md-workstation-select.vue b/apps/web-antd/src/views/mes/md/workstation/components/md-workstation-select.vue index 3743ef25a..10d8dfd4f 100644 --- a/apps/web-antd/src/views/mes/md/workstation/components/md-workstation-select.vue +++ b/apps/web-antd/src/views/mes/md/workstation/components/md-workstation-select.vue @@ -50,7 +50,7 @@ const showClear = computed( /** 根据工作站编号回显选择器 */ async function resolveItemById(id: number | undefined) { - if (id === null) { + if (id == null) { selectedItem.value = undefined; return; } @@ -58,7 +58,7 @@ async function resolveItemById(id: number | undefined) { return; } try { - selectedItem.value = await getWorkstation(id as number); + selectedItem.value = await getWorkstation(id); } catch (error) { console.error('[MdWorkstationSelect] resolveItemById failed:', error); } @@ -90,8 +90,8 @@ function handleClick(event: MouseEvent) { clearSelected(); return; } - const selectedIds = props.modelValue === null ? [] : [props.modelValue]; - dialogRef.value?.open(selectedIds as number[], { multiple: false }); + const selectedIds = props.modelValue == null ? [] : [props.modelValue]; + dialogRef.value?.open(selectedIds, { multiple: false }); } /** 回填选中的工作站 */ diff --git a/apps/web-antd/src/views/mes/pro/route/index.vue b/apps/web-antd/src/views/mes/pro/route/index.vue index 7a35148fa..9a2f8d80c 100644 --- a/apps/web-antd/src/views/mes/pro/route/index.vue +++ b/apps/web-antd/src/views/mes/pro/route/index.vue @@ -3,12 +3,12 @@ import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import type { MesProRouteApi } from '#/api/mes/pro/route'; import { useAccess } from '@vben/access'; -import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; +import { confirm, DocAlert, Page, useVbenModal } from '@vben/common-ui'; import { CommonStatusEnum, DICT_TYPE } from '@vben/constants'; import { getDictLabel } from '@vben/hooks'; import { downloadFileFromBlobPart } from '@vben/utils'; -import { Button, message, Modal, Tooltip } from 'ant-design-vue'; +import { Button, message, Tooltip } from 'ant-design-vue'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -55,19 +55,12 @@ async function handleStatusChange( newStatus: number, row: MesProRouteApi.Route, ): Promise { - return new Promise((resolve, reject) => { - Modal.confirm({ - content: `确认要将"${row.name}"工艺路线切换为【${getDictLabel(DICT_TYPE.COMMON_STATUS, newStatus)}】吗?`, - async onOk() { - await updateRouteStatus(row.id!, newStatus); - message.success($t('ui.actionMessage.operationSuccess')); - resolve(true); - }, - onCancel() { - reject(new Error('取消操作')); - }, - }); - }); + await confirm( + `确认要将"${row.name}"工艺路线切换为【${getDictLabel(DICT_TYPE.COMMON_STATUS, newStatus)}】吗?`, + ); + await updateRouteStatus(row.id!, newStatus); + message.success($t('ui.actionMessage.operationSuccess')); + return true; } /** 删除(仅停用状态可删除) */ diff --git a/apps/web-antd/src/views/mes/pro/workrecord/components/work-record-status-bar.vue b/apps/web-antd/src/views/mes/pro/workrecord/components/work-record-status-bar.vue new file mode 100644 index 000000000..25c367826 --- /dev/null +++ b/apps/web-antd/src/views/mes/pro/workrecord/components/work-record-status-bar.vue @@ -0,0 +1,111 @@ + + + diff --git a/apps/web-antd/src/views/mes/pro/workrecord/data.ts b/apps/web-antd/src/views/mes/pro/workrecord/data.ts new file mode 100644 index 000000000..291d7e156 --- /dev/null +++ b/apps/web-antd/src/views/mes/pro/workrecord/data.ts @@ -0,0 +1,107 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesProWorkRecordApi } from '#/api/mes/pro/workrecord'; +import type { SystemUserApi } from '#/api/system/user'; + +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 MdWorkstationSelect from '#/views/mes/md/workstation/components/md-workstation-select.vue'; + +/** 关联数据 */ +let userList: SystemUserApi.User[] = []; +getSimpleUserList().then((data) => (userList = data)); + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'userId', + label: '用户', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getSimpleUserList, + labelField: 'nickname', + placeholder: '请选择用户', + valueField: 'id', + }, + }, + { + fieldName: 'workstationId', + label: '工作站', + component: markRaw(MdWorkstationSelect), + componentProps: { + placeholder: '请选择工作站', + }, + }, + { + fieldName: 'type', + label: '操作类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_PRO_WORK_RECORD_TYPE, 'number'), + placeholder: '请选择操作类型', + }, + }, + { + fieldName: 'createTime', + label: '操作时间', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + allowClear: true, + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'id', + title: '编号', + width: 80, + }, + { + field: 'userId', + title: '用户', + width: 140, + formatter: ({ row }) => + row.userNickname || + userList.find((user) => user.id === row.userId)?.nickname || + '', + }, + { + field: 'workstationCode', + title: '工作站编码', + width: 140, + }, + { + field: 'workstationName', + title: '工作站名称', + minWidth: 160, + }, + { + field: 'type', + title: '操作类型', + width: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_PRO_WORK_RECORD_TYPE }, + }, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + ]; +} diff --git a/apps/web-antd/src/views/mes/pro/workrecord/index.vue b/apps/web-antd/src/views/mes/pro/workrecord/index.vue new file mode 100644 index 000000000..3c9483954 --- /dev/null +++ b/apps/web-antd/src/views/mes/pro/workrecord/index.vue @@ -0,0 +1,87 @@ + + + diff --git a/apps/web-ele/src/api/mes/pro/workrecord/index.ts b/apps/web-ele/src/api/mes/pro/workrecord/index.ts new file mode 100644 index 000000000..08950365c --- /dev/null +++ b/apps/web-ele/src/api/mes/pro/workrecord/index.ts @@ -0,0 +1,71 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesProWorkRecordApi { + /** MES 工作记录流水 */ + export interface WorkRecordLog { + id?: number; // 编号 + userId?: number; // 用户编号 + userNickname?: string; // 用户昵称 + workstationId?: number; // 工作站编号 + workstationCode?: string; // 工作站编码 + workstationName?: string; // 工作站名称 + type?: number; // 1=上工 2=下工 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } + + /** MES 当前用户工作站绑定状态 */ + export interface MyWorkRecord { + userId?: number; // 用户编号 + userNickname?: string; // 用户昵称 + workstationId?: number; // 工作站编号 + workstationCode?: string; // 工作站编码 + workstationName?: string; // 工作站名称 + type?: number; // 1=上工 2=下工 + clockInTime?: Date; // 上工时间 + clockOutTime?: Date; // 下工时间 + } +} + +/** 查询工作记录分页 */ +export function getWorkRecordLogPage(params: PageParam) { + return requestClient.get>( + '/mes/pro/workrecord/log/page', + { params }, + ); +} + +/** 查询工作记录详情 */ +export function getWorkRecordLog(id: number) { + return requestClient.get( + `/mes/pro/workrecord/log/get?id=${id}`, + ); +} + +/** 导出工作记录 */ +export function exportWorkRecordLog(params: any) { + return requestClient.download('/mes/pro/workrecord/log/export-excel', { + params, + }); +} + +/** 上工(绑定工作站) */ +export function clockInWorkRecord(workstationId: number) { + return requestClient.put('/mes/pro/workrecord/clock-in', null, { + params: { workstationId }, + }); +} + +/** 下工(解绑工作站) */ +export function clockOutWorkRecord() { + return requestClient.put('/mes/pro/workrecord/clock-out'); +} + +/** 查询当前用户绑定的工作站 */ +export function getMyWorkRecord() { + return requestClient.get( + '/mes/pro/workrecord/get-my', + ); +} diff --git a/apps/web-ele/src/api/mes/qc/defect/index.ts b/apps/web-ele/src/api/mes/qc/defect/index.ts new file mode 100644 index 000000000..0b46d3581 --- /dev/null +++ b/apps/web-ele/src/api/mes/qc/defect/index.ts @@ -0,0 +1,54 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcDefectApi { + /** MES 缺陷类型 */ + export interface Defect { + id?: number; // 编号 + code?: string; // 缺陷编码 + name?: string; // 缺陷描述 + type?: number; // 检测项类型 + level?: number; // 缺陷等级 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询缺陷类型分页 */ +export function getDefectPage(params: PageParam) { + return requestClient.get>( + '/mes/qc/defect/page', + { params }, + ); +} + +/** 查询缺陷类型精简列表 */ +export function getDefectSimpleList() { + return requestClient.get('/mes/qc/defect/simple-list'); +} + +/** 查询缺陷类型详情 */ +export function getDefect(id: number) { + return requestClient.get(`/mes/qc/defect/get?id=${id}`); +} + +/** 新增缺陷类型 */ +export function createDefect(data: MesQcDefectApi.Defect) { + return requestClient.post('/mes/qc/defect/create', data); +} + +/** 修改缺陷类型 */ +export function updateDefect(data: MesQcDefectApi.Defect) { + return requestClient.put('/mes/qc/defect/update', data); +} + +/** 删除缺陷类型 */ +export function deleteDefect(id: number) { + return requestClient.delete(`/mes/qc/defect/delete?id=${id}`); +} + +/** 导出缺陷类型 */ +export function exportDefect(params: any) { + return requestClient.download('/mes/qc/defect/export-excel', { params }); +} diff --git a/apps/web-ele/src/api/mes/qc/indicator/index.ts b/apps/web-ele/src/api/mes/qc/indicator/index.ts new file mode 100644 index 000000000..163f11d89 --- /dev/null +++ b/apps/web-ele/src/api/mes/qc/indicator/index.ts @@ -0,0 +1,53 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcIndicatorApi { + /** MES 质检指标 */ + export interface Indicator { + id?: number; // 编号 + code?: string; // 检测项编码 + name?: string; // 检测项名称 + type?: number; // 检测项类型 + tool?: string; // 检测工具 + resultType?: number; // 结果值类型 + resultSpecification?: string; // 结果值属性 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询质检指标分页 */ +export function getIndicatorPage(params: PageParam) { + return requestClient.get>( + '/mes/qc/indicator/page', + { params }, + ); +} + +/** 查询质检指标详情 */ +export function getIndicator(id: number) { + return requestClient.get( + `/mes/qc/indicator/get?id=${id}`, + ); +} + +/** 新增质检指标 */ +export function createIndicator(data: MesQcIndicatorApi.Indicator) { + return requestClient.post('/mes/qc/indicator/create', data); +} + +/** 修改质检指标 */ +export function updateIndicator(data: MesQcIndicatorApi.Indicator) { + return requestClient.put('/mes/qc/indicator/update', data); +} + +/** 删除质检指标 */ +export function deleteIndicator(id: number) { + return requestClient.delete(`/mes/qc/indicator/delete?id=${id}`); +} + +/** 导出质检指标 */ +export function exportIndicator(params: any) { + return requestClient.download('/mes/qc/indicator/export-excel', { params }); +} diff --git a/apps/web-ele/src/api/mes/qc/template/index.ts b/apps/web-ele/src/api/mes/qc/template/index.ts new file mode 100644 index 000000000..768864482 --- /dev/null +++ b/apps/web-ele/src/api/mes/qc/template/index.ts @@ -0,0 +1,51 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcTemplateApi { + /** MES 质检方案 */ + export interface Template { + id?: number; // 编号 + code?: string; // 方案编号 + name?: string; // 方案名称 + types?: number[]; // 检测种类 + status?: number; // 状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询质检方案分页 */ +export function getTemplatePage(params: PageParam) { + return requestClient.get>( + '/mes/qc/template/page', + { params }, + ); +} + +/** 查询质检方案详情 */ +export function getTemplate(id: number) { + return requestClient.get( + `/mes/qc/template/get?id=${id}`, + ); +} + +/** 新增质检方案 */ +export function createTemplate(data: MesQcTemplateApi.Template) { + return requestClient.post('/mes/qc/template/create', data); +} + +/** 修改质检方案 */ +export function updateTemplate(data: MesQcTemplateApi.Template) { + return requestClient.put('/mes/qc/template/update', data); +} + +/** 删除质检方案 */ +export function deleteTemplate(id: number) { + return requestClient.delete(`/mes/qc/template/delete?id=${id}`); +} + +/** 导出质检方案 */ +export function exportTemplate(params: any) { + return requestClient.download('/mes/qc/template/export-excel', { params }); +} diff --git a/apps/web-ele/src/api/mes/qc/template/indicator/index.ts b/apps/web-ele/src/api/mes/qc/template/indicator/index.ts new file mode 100644 index 000000000..8fa8119e6 --- /dev/null +++ b/apps/web-ele/src/api/mes/qc/template/indicator/index.ts @@ -0,0 +1,57 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcTemplateIndicatorApi { + /** MES 质检方案-检测指标项 */ + export interface TemplateIndicator { + id?: number; // 编号 + templateId?: number; // 质检方案ID + indicatorId?: number; // 质检指标ID + checkMethod?: string; // 检测方法 + standardValue?: number; // 标准值 + unitMeasureId?: number; // 计量单位ID + thresholdMax?: number; // 误差上限 + thresholdMin?: number; // 误差下限 + docUrl?: string; // 说明图URL + remark?: string; // 备注 + indicatorCode?: string; // 检测项编码(JOIN) + indicatorName?: string; // 检测项名称(JOIN) + indicatorType?: number; // 检测项类型(JOIN) + indicatorTool?: string; // 检测工具(JOIN) + unitMeasureName?: string; // 计量单位名称(JOIN) + } +} + +/** 查询检测指标项分页 */ +export function getTemplateIndicatorPage(params: PageParam & { templateId?: number }) { + return requestClient.get< + PageResult + >('/mes/qc/template/indicator/page', { params }); +} + +/** 查询检测指标项详情 */ +export function getTemplateIndicator(id: number) { + return requestClient.get( + `/mes/qc/template/indicator/get?id=${id}`, + ); +} + +/** 新增检测指标项 */ +export function createTemplateIndicator( + data: MesQcTemplateIndicatorApi.TemplateIndicator, +) { + return requestClient.post('/mes/qc/template/indicator/create', data); +} + +/** 修改检测指标项 */ +export function updateTemplateIndicator( + data: MesQcTemplateIndicatorApi.TemplateIndicator, +) { + return requestClient.put('/mes/qc/template/indicator/update', data); +} + +/** 删除检测指标项 */ +export function deleteTemplateIndicator(id: number) { + return requestClient.delete(`/mes/qc/template/indicator/delete?id=${id}`); +} diff --git a/apps/web-ele/src/api/mes/qc/template/item/index.ts b/apps/web-ele/src/api/mes/qc/template/item/index.ts new file mode 100644 index 000000000..b1d5b1e6b --- /dev/null +++ b/apps/web-ele/src/api/mes/qc/template/item/index.ts @@ -0,0 +1,52 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcTemplateItemApi { + /** MES 质检方案-产品关联 */ + export interface TemplateItem { + id?: number; // 编号 + templateId?: number; // 质检方案ID + itemId?: number; // 产品物料ID + quantityCheck?: number; // 最低检测数 + quantityUnqualified?: number; // 最大不合格数 + criticalRate?: number; // 最大致命缺陷率(%) + majorRate?: number; // 最大严重缺陷率(%) + minorRate?: number; // 最大轻微缺陷率(%) + remark?: string; // 备注 + itemCode?: string; // 物料编码(JOIN) + itemName?: string; // 物料名称(JOIN) + specification?: string; // 规格型号(JOIN) + unitMeasureName?: string; // 计量单位名称(JOIN) + } +} + +/** 查询产品关联分页 */ +export function getTemplateItemPage(params: PageParam & { templateId?: number }) { + return requestClient.get>( + '/mes/qc/template/item/page', + { params }, + ); +} + +/** 查询产品关联详情 */ +export function getTemplateItem(id: number) { + return requestClient.get( + `/mes/qc/template/item/get?id=${id}`, + ); +} + +/** 新增产品关联 */ +export function createTemplateItem(data: MesQcTemplateItemApi.TemplateItem) { + return requestClient.post('/mes/qc/template/item/create', data); +} + +/** 修改产品关联 */ +export function updateTemplateItem(data: MesQcTemplateItemApi.TemplateItem) { + return requestClient.put('/mes/qc/template/item/update', data); +} + +/** 删除产品关联 */ +export function deleteTemplateItem(id: number) { + return requestClient.delete(`/mes/qc/template/item/delete?id=${id}`); +} diff --git a/apps/web-ele/src/api/mes/wm/barcode/config/index.ts b/apps/web-ele/src/api/mes/wm/barcode/config/index.ts new file mode 100644 index 000000000..862da4fbb --- /dev/null +++ b/apps/web-ele/src/api/mes/wm/barcode/config/index.ts @@ -0,0 +1,49 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmBarcodeConfigApi { + /** MES 条码配置 */ + export interface BarcodeConfig { + id?: number; // 编号 + format?: number; // 条码格式 + bizType?: number; // 业务类型 + contentFormat?: string; // 内容格式模板 + contentExample?: string; // 内容样例 + autoGenerateFlag?: boolean; // 是否自动生成 + defaultTemplate?: string; // 默认打印模板 + status?: number; // 状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询条码配置分页 */ +export function getBarcodeConfigPage(params: PageParam) { + return requestClient.get>( + '/mes/wm/barcode-config/page', + { params }, + ); +} + +/** 查询条码配置详情 */ +export function getBarcodeConfig(id: number) { + return requestClient.get( + `/mes/wm/barcode-config/get?id=${id}`, + ); +} + +/** 新增条码配置 */ +export function createBarcodeConfig(data: MesWmBarcodeConfigApi.BarcodeConfig) { + return requestClient.post('/mes/wm/barcode-config/create', data); +} + +/** 修改条码配置 */ +export function updateBarcodeConfig(data: MesWmBarcodeConfigApi.BarcodeConfig) { + return requestClient.put('/mes/wm/barcode-config/update', data); +} + +/** 删除条码配置 */ +export function deleteBarcodeConfig(id: number) { + return requestClient.delete(`/mes/wm/barcode-config/delete?id=${id}`); +} diff --git a/apps/web-ele/src/api/mes/wm/barcode/index.ts b/apps/web-ele/src/api/mes/wm/barcode/index.ts index 6cbf8a51e..7e8154141 100644 --- a/apps/web-ele/src/api/mes/wm/barcode/index.ts +++ b/apps/web-ele/src/api/mes/wm/barcode/index.ts @@ -38,7 +38,7 @@ export function getBarcode(id: number) { export function getBarcodeByBusiness(bizType: number, bizId: number) { return requestClient.get( '/mes/wm/barcode/get-by-business', - { params: { bizType, bizId } }, + { params: { bizId, bizType } }, ); } @@ -57,9 +57,14 @@ export function deleteBarcode(id: number) { return requestClient.delete(`/mes/wm/barcode/delete?id=${id}`); } +/** 导出条码 */ +export function exportBarcode(params: any) { + return requestClient.download('/mes/wm/barcode/export-excel', { params }); +} + /** 生成条码内容 */ export function generateBarcodeContent(bizType: number, bizCode: string) { return requestClient.get('/mes/wm/barcode/generate-content', { - params: { bizType, bizCode }, + params: { bizCode, bizType }, }); } diff --git a/apps/web-ele/src/api/mes/wm/materialstock/index.ts b/apps/web-ele/src/api/mes/wm/materialstock/index.ts new file mode 100644 index 000000000..49aab9620 --- /dev/null +++ b/apps/web-ele/src/api/mes/wm/materialstock/index.ts @@ -0,0 +1,61 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmMaterialStockApi { + /** MES 库存台账 */ + export interface MaterialStock { + id?: number; // 编号 + itemTypeId?: number; // 物料分类编号 + itemId?: number; // 物料编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 计量单位名称 + batchId?: number; // 批次编号 + batchCode?: string; // 批次号 + warehouseId?: number; // 仓库编号 + warehouseCode?: string; // 仓库编码 + warehouseName?: string; // 仓库名称 + locationId?: number; // 库区编号 + locationName?: string; // 库区名称 + areaId?: number; // 库位编号 + areaName?: string; // 库位名称 + vendorId?: number; // 供应商编号 + vendorName?: string; // 供应商名称 + quantity?: number; // 在库数量 + receiptTime?: string; // 入库日期 + frozen?: boolean; // 是否冻结 + createTime?: Date; // 创建时间 + } +} + +/** 查询库存台账分页 */ +export function getMaterialStockPage(params: PageParam) { + return requestClient.get>( + '/mes/wm/material-stock/page', + { params }, + ); +} + +/** 查询库存台账详情 */ +export function getMaterialStock(id: number) { + return requestClient.get( + `/mes/wm/material-stock/get?id=${id}`, + ); +} + +/** 更新库存冻结状态 */ +export function updateMaterialStockFrozen(data: { + frozen: boolean; + id: number; +}) { + return requestClient.put('/mes/wm/material-stock/update-frozen', data); +} + +/** 导出库存台账 */ +export function exportMaterialStock(params: any) { + return requestClient.download('/mes/wm/material-stock/export-excel', { + params, + }); +} diff --git a/apps/web-ele/src/api/mes/wm/warehouse/area/index.ts b/apps/web-ele/src/api/mes/wm/warehouse/area/index.ts index cf5844ade..ca67789d8 100644 --- a/apps/web-ele/src/api/mes/wm/warehouse/area/index.ts +++ b/apps/web-ele/src/api/mes/wm/warehouse/area/index.ts @@ -48,3 +48,18 @@ export function getWarehouseArea(id: number) { `/mes/wm/warehouse-area/get?id=${id}`, ); } + +/** 新增库位 */ +export function createWarehouseArea(data: MesWmWarehouseAreaApi.WarehouseArea) { + return requestClient.post('/mes/wm/warehouse-area/create', data); +} + +/** 修改库位 */ +export function updateWarehouseArea(data: MesWmWarehouseAreaApi.WarehouseArea) { + return requestClient.put('/mes/wm/warehouse-area/update', data); +} + +/** 删除库位 */ +export function deleteWarehouseArea(id: number) { + return requestClient.delete(`/mes/wm/warehouse-area/delete?id=${id}`); +} diff --git a/apps/web-ele/src/api/mes/wm/warehouse/index.ts b/apps/web-ele/src/api/mes/wm/warehouse/index.ts index f68604790..661b62ee4 100644 --- a/apps/web-ele/src/api/mes/wm/warehouse/index.ts +++ b/apps/web-ele/src/api/mes/wm/warehouse/index.ts @@ -38,3 +38,18 @@ export function getWarehouse(id: number) { `/mes/wm/warehouse/get?id=${id}`, ); } + +/** 新增仓库 */ +export function createWarehouse(data: MesWmWarehouseApi.Warehouse) { + return requestClient.post('/mes/wm/warehouse/create', data); +} + +/** 修改仓库 */ +export function updateWarehouse(data: MesWmWarehouseApi.Warehouse) { + return requestClient.put('/mes/wm/warehouse/update', data); +} + +/** 删除仓库 */ +export function deleteWarehouse(id: number) { + return requestClient.delete(`/mes/wm/warehouse/delete?id=${id}`); +} diff --git a/apps/web-ele/src/api/mes/wm/warehouse/location/index.ts b/apps/web-ele/src/api/mes/wm/warehouse/location/index.ts index e33fb180e..4211f73c8 100644 --- a/apps/web-ele/src/api/mes/wm/warehouse/location/index.ts +++ b/apps/web-ele/src/api/mes/wm/warehouse/location/index.ts @@ -38,3 +38,35 @@ export function getWarehouseLocation(id: number) { `/mes/wm/warehouse-location/get?id=${id}`, ); } + +/** 新增库区 */ +export function createWarehouseLocation( + data: MesWmWarehouseLocationApi.WarehouseLocation, +) { + return requestClient.post('/mes/wm/warehouse-location/create', data); +} + +/** 修改库区 */ +export function updateWarehouseLocation( + data: MesWmWarehouseLocationApi.WarehouseLocation, +) { + return requestClient.put('/mes/wm/warehouse-location/update', data); +} + +/** 删除库区 */ +export function deleteWarehouseLocation(id: number) { + return requestClient.delete(`/mes/wm/warehouse-location/delete?id=${id}`); +} + +/** 批量设置库区下所有库位的混放规则 */ +export function updateAreaByLocationId( + locationId: number, + allowItemMixing?: boolean, + allowBatchMixing?: boolean, +) { + return requestClient.put( + '/mes/wm/warehouse-location/update-by-location-id', + null, + { params: { allowBatchMixing, allowItemMixing, locationId } }, + ); +} diff --git a/apps/web-ele/src/views/mes/md/workstation/components/md-workstation-select.vue b/apps/web-ele/src/views/mes/md/workstation/components/md-workstation-select.vue index 92e3944e3..6129baf5a 100644 --- a/apps/web-ele/src/views/mes/md/workstation/components/md-workstation-select.vue +++ b/apps/web-ele/src/views/mes/md/workstation/components/md-workstation-select.vue @@ -50,7 +50,7 @@ const showClear = computed( /** 根据工作站编号回显选择器 */ async function resolveItemById(id: number | undefined) { - if (id === null) { + if (id == null) { selectedItem.value = undefined; return; } @@ -58,7 +58,7 @@ async function resolveItemById(id: number | undefined) { return; } try { - selectedItem.value = await getWorkstation(id as number); + selectedItem.value = await getWorkstation(id); } catch (error) { console.error('[MdWorkstationSelect] resolveItemById failed:', error); } @@ -90,8 +90,8 @@ function handleClick(event: MouseEvent) { clearSelected(); return; } - const selectedIds = props.modelValue === null ? [] : [props.modelValue]; - dialogRef.value?.open(selectedIds as number[], { multiple: false }); + const selectedIds = props.modelValue == null ? [] : [props.modelValue]; + dialogRef.value?.open(selectedIds, { multiple: false }); } /** 回填选中的工作站 */ diff --git a/apps/web-ele/src/views/mes/pro/workrecord/components/work-record-status-bar.vue b/apps/web-ele/src/views/mes/pro/workrecord/components/work-record-status-bar.vue new file mode 100644 index 000000000..499dc51d7 --- /dev/null +++ b/apps/web-ele/src/views/mes/pro/workrecord/components/work-record-status-bar.vue @@ -0,0 +1,119 @@ + + + diff --git a/apps/web-ele/src/views/mes/pro/workrecord/data.ts b/apps/web-ele/src/views/mes/pro/workrecord/data.ts new file mode 100644 index 000000000..dea5783d5 --- /dev/null +++ b/apps/web-ele/src/views/mes/pro/workrecord/data.ts @@ -0,0 +1,107 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesProWorkRecordApi } from '#/api/mes/pro/workrecord'; +import type { SystemUserApi } from '#/api/system/user'; + +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 MdWorkstationSelect from '#/views/mes/md/workstation/components/md-workstation-select.vue'; + +/** 关联数据 */ +let userList: SystemUserApi.User[] = []; +getSimpleUserList().then((data) => (userList = data)); + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'userId', + label: '用户', + component: 'ApiSelect', + componentProps: { + api: getSimpleUserList, + clearable: true, + labelField: 'nickname', + placeholder: '请选择用户', + valueField: 'id', + }, + }, + { + fieldName: 'workstationId', + label: '工作站', + component: markRaw(MdWorkstationSelect), + componentProps: { + placeholder: '请选择工作站', + }, + }, + { + fieldName: 'type', + label: '操作类型', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.MES_PRO_WORK_RECORD_TYPE, 'number'), + placeholder: '请选择操作类型', + }, + }, + { + fieldName: 'createTime', + label: '操作时间', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + clearable: true, + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'id', + title: '编号', + width: 80, + }, + { + field: 'userId', + title: '用户', + width: 140, + formatter: ({ row }) => + row.userNickname || + userList.find((user) => user.id === row.userId)?.nickname || + '', + }, + { + field: 'workstationCode', + title: '工作站编码', + width: 140, + }, + { + field: 'workstationName', + title: '工作站名称', + minWidth: 160, + }, + { + field: 'type', + title: '操作类型', + width: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_PRO_WORK_RECORD_TYPE }, + }, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + ]; +} diff --git a/apps/web-ele/src/views/mes/pro/workrecord/index.vue b/apps/web-ele/src/views/mes/pro/workrecord/index.vue new file mode 100644 index 000000000..3c9483954 --- /dev/null +++ b/apps/web-ele/src/views/mes/pro/workrecord/index.vue @@ -0,0 +1,87 @@ + + + diff --git a/apps/web-ele/src/views/mes/utils/constants.ts b/apps/web-ele/src/views/mes/utils/constants.ts index 668cf7240..15993c32a 100644 --- a/apps/web-ele/src/views/mes/utils/constants.ts +++ b/apps/web-ele/src/views/mes/utils/constants.ts @@ -139,8 +139,14 @@ export const MesAutoCodeRuleCode = { PRO_ROUTE_CODE: 'PRO_ROUTE_CODE', PRO_TASK_CODE: 'PRO_TASK_CODE', PRO_WORK_ORDER_CODE: 'PRO_WORK_ORDER_CODE', + QC_DEFECT_CODE: 'QC_DEFECT_CODE', + QC_INDICATOR_CODE: 'QC_INDICATOR_CODE', + QC_TEMPLATE_CODE: 'QC_TEMPLATE_CODE', TM_TOOL_TYPE_CODE: 'TM_TOOL_TYPE_CODE', TM_TOOL_CODE: 'TM_TOOL_CODE', + WM_AREA_CODE: 'WM_AREA_CODE', + WM_LOCATION_CODE: 'WM_LOCATION_CODE', + WM_WAREHOUSE_CODE: 'WM_WAREHOUSE_CODE', } as const; /** MES 生产工单状态枚举 */ @@ -194,6 +200,21 @@ export const MesProAndonLevelEnum = { LEVEL3: 3, } as const; +/** MES 上下工状态类型枚举 */ +export const MesProWorkRecordTypeEnum = { + CLOCK_IN: 1, + CLOCK_OUT: 2, +} as const; + +/** MES 质检结果值类型枚举 */ +export const MesQcResultValueType = { + FLOAT: 1, + INTEGER: 2, + TEXT: 3, + DICT: 4, + FILE: 5, +} as const; + /** MES 编码规则分段类型枚举 */ export const MesAutoCodePartTypeEnum = { INPUT: 1,