diff --git a/apps/web-antd/src/api/mes/home/index.ts b/apps/web-antd/src/api/mes/home/index.ts new file mode 100644 index 000000000..cf1aa9953 --- /dev/null +++ b/apps/web-antd/src/api/mes/home/index.ts @@ -0,0 +1,55 @@ +import { requestClient } from '#/api/request'; + +export namespace MesHomeApi { + /** MES 首页汇总统计 */ + export interface Summary { + workOrderActiveCount: number; // 进行中工单数 + workOrderPrepareCount: number; // 待排产工单数 + workOrderFinishedCount: number; // 已完成工单数 + todayOutput: number; // 今日产量 + yesterdayOutput: number; // 昨日产量 + todayQualifiedQuantity: number; // 今日合格品数 + todayUnqualifiedQuantity: number; // 今日不良品数 + machineryTotal: number; // 设备总数 + machineryProducing: number; // 生产中设备数 + machineryStop: number; // 停机设备数 + machineryMaintenance: number; // 维护中设备数 + andonActiveCount: number; // 未处置安灯呼叫数 + repairActiveCount: number; // 待处理维修工单数 + } + + /** MES 工单状态分布 */ + export interface WorkOrderStatus { + status: number; // 工单状态 + statusName: string; // 工单状态名称 + count: number; // 数量 + } + + /** MES 生产趋势 */ + export interface ProductionTrend { + date: string; // 日期 + quantity: number; // 产量 + qualifiedQuantity: number; // 合格品数 + unqualifiedQuantity: number; // 不良品数 + } +} + +/** 获得首页汇总统计 */ +export function getHomeSummary() { + return requestClient.get('/mes/home-statistics/summary'); +} + +/** 获得工单状态分布 */ +export function getWorkOrderStatusDistribution() { + return requestClient.get( + '/mes/home-statistics/work-order-status', + ); +} + +/** 获得生产趋势 */ +export function getProductionTrend(days?: number) { + return requestClient.get( + '/mes/home-statistics/production-trend', + { params: { days } }, + ); +} diff --git a/apps/web-antd/src/api/mes/wm/transfer/detail/index.ts b/apps/web-antd/src/api/mes/wm/transfer/detail/index.ts new file mode 100644 index 000000000..ff215d92c --- /dev/null +++ b/apps/web-antd/src/api/mes/wm/transfer/detail/index.ts @@ -0,0 +1,59 @@ +import { requestClient } from '#/api/request'; + +export namespace MesWmTransferDetailApi { + /** MES 调拨明细 */ + export interface TransferDetail { + id?: number; // 编号 + lineId?: number; // 转移单行编号 + transferId?: number; // 转移单编号 + itemId?: number; // 物料产品编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 单位名称 + quantity?: number; // 数量 + batchId?: number; // 批次编号 + batchCode?: string; // 批次号 + toWarehouseId?: number; // 移入仓库编号 + toWarehouseName?: string; // 移入仓库名称 + toLocationId?: number; // 移入库区编号 + toLocationName?: string; // 移入库区名称 + toAreaId?: number; // 移入库位编号 + toAreaName?: string; // 移入库位名称 + remark?: string; // 备注 + } +} + +/** 查询调拨明细列表(按行编号) */ +export function getTransferDetailListByLineId(lineId: number) { + return requestClient.get( + '/mes/wm/transfer-detail/list-by-line', + { params: { lineId } }, + ); +} + +/** 查询调拨明细详情 */ +export function getTransferDetail(id: number) { + return requestClient.get( + `/mes/wm/transfer-detail/get?id=${id}`, + ); +} + +/** 新增调拨明细 */ +export function createTransferDetail( + data: MesWmTransferDetailApi.TransferDetail, +) { + return requestClient.post('/mes/wm/transfer-detail/create', data); +} + +/** 修改调拨明细 */ +export function updateTransferDetail( + data: MesWmTransferDetailApi.TransferDetail, +) { + return requestClient.put('/mes/wm/transfer-detail/update', data); +} + +/** 删除调拨明细 */ +export function deleteTransferDetail(id: number) { + return requestClient.delete(`/mes/wm/transfer-detail/delete?id=${id}`); +} diff --git a/apps/web-antd/src/api/mes/wm/transfer/index.ts b/apps/web-antd/src/api/mes/wm/transfer/index.ts new file mode 100644 index 000000000..14d9b860f --- /dev/null +++ b/apps/web-antd/src/api/mes/wm/transfer/index.ts @@ -0,0 +1,92 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmTransferApi { + /** MES 转移单 */ + export interface Transfer { + id?: number; // 编号 + code?: string; // 转移单编号 + name?: string; // 转移单名称 + type?: number; // 转移单类型 + deliveryFlag?: boolean; // 是否配送 + recipientName?: string; // 收货人 + recipientTelephone?: string; // 联系电话 + destinationAddress?: string; // 目的地 + carrier?: string; // 承运商 + shippingNumber?: string; // 运输单号 + confirmFlag?: boolean; // 是否确认 + transferDate?: string; // 转移日期 + status?: number; // 单据状态 + remark?: string; // 备注 + createTime?: number; // 创建时间 + } + + /** MES 转移单分页查询参数 */ + export interface PageParams extends PageParam { + code?: string; + name?: string; + type?: number; + status?: number; + } +} + +/** 查询转移单分页 */ +export function getTransferPage(params: MesWmTransferApi.PageParams) { + return requestClient.get>( + '/mes/wm/transfer/page', + { params }, + ); +} + +/** 查询转移单详情 */ +export function getTransfer(id: number) { + return requestClient.get( + `/mes/wm/transfer/get?id=${id}`, + ); +} + +/** 新增转移单 */ +export function createTransfer(data: MesWmTransferApi.Transfer) { + return requestClient.post('/mes/wm/transfer/create', data); +} + +/** 修改转移单 */ +export function updateTransfer(data: MesWmTransferApi.Transfer) { + return requestClient.put('/mes/wm/transfer/update', data); +} + +/** 删除转移单 */ +export function deleteTransfer(id: number) { + return requestClient.delete(`/mes/wm/transfer/delete?id=${id}`); +} + +/** 提交转移单 */ +export function submitTransfer(id: number) { + return requestClient.put(`/mes/wm/transfer/submit?id=${id}`); +} + +/** 到货确认 */ +export function confirmTransfer(id: number) { + return requestClient.put(`/mes/wm/transfer/confirm?id=${id}`); +} + +/** 执行上架 */ +export function stockTransfer(id: number) { + return requestClient.put(`/mes/wm/transfer/stock?id=${id}`); +} + +/** 完成转移 */ +export function finishTransfer(id: number) { + return requestClient.put(`/mes/wm/transfer/finish?id=${id}`); +} + +/** 取消转移单 */ +export function cancelTransfer(id: number) { + return requestClient.put(`/mes/wm/transfer/cancel?id=${id}`); +} + +/** 导出转移单 */ +export function exportTransfer(params: any) { + return requestClient.download('/mes/wm/transfer/export-excel', { params }); +} diff --git a/apps/web-antd/src/api/mes/wm/transfer/line/index.ts b/apps/web-antd/src/api/mes/wm/transfer/line/index.ts new file mode 100644 index 000000000..9ec7b5ea9 --- /dev/null +++ b/apps/web-antd/src/api/mes/wm/transfer/line/index.ts @@ -0,0 +1,55 @@ +import { requestClient } from '#/api/request'; + +export namespace MesWmTransferLineApi { + /** MES 转移单行 */ + export interface TransferLine { + id?: number; // 编号 + transferId?: number; // 转移单编号 + materialStockId?: number; // 库存台账编号 + itemId?: number; // 物料产品编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 单位名称 + quantity?: number; // 转移数量 + batchId?: number; // 批次编号 + batchCode?: string; // 批次号 + fromWarehouseId?: number; // 移出仓库编号 + fromWarehouseName?: string; // 移出仓库名称 + fromLocationId?: number; // 移出库区编号 + fromLocationName?: string; // 移出库区名称 + fromAreaId?: number; // 移出库位编号 + fromAreaName?: string; // 移出库位名称 + remark?: string; // 备注 + } +} + +/** 查询转移单行列表 */ +export function getTransferLineList(transferId: number) { + return requestClient.get( + '/mes/wm/transfer-line/list', + { params: { transferId } }, + ); +} + +/** 查询转移单行详情 */ +export function getTransferLine(id: number) { + return requestClient.get( + `/mes/wm/transfer-line/get?id=${id}`, + ); +} + +/** 新增转移单行 */ +export function createTransferLine(data: MesWmTransferLineApi.TransferLine) { + return requestClient.post('/mes/wm/transfer-line/create', data); +} + +/** 修改转移单行 */ +export function updateTransferLine(data: MesWmTransferLineApi.TransferLine) { + return requestClient.put('/mes/wm/transfer-line/update', data); +} + +/** 删除转移单行 */ +export function deleteTransferLine(id: number) { + return requestClient.delete(`/mes/wm/transfer-line/delete?id=${id}`); +} diff --git a/apps/web-antd/src/views/mes/home/data.ts b/apps/web-antd/src/views/mes/home/data.ts new file mode 100644 index 000000000..381016f1c --- /dev/null +++ b/apps/web-antd/src/views/mes/home/data.ts @@ -0,0 +1,89 @@ +import type { MesHomeApi } from '#/api/mes/home'; + +import { MesProWorkOrderStatusEnum } from '#/views/mes/utils/constants'; + +/** 首页汇总统计默认值 */ +export const defaultSummary: MesHomeApi.Summary = { + andonActiveCount: 0, + machineryMaintenance: 0, + machineryProducing: 0, + machineryStop: 0, + machineryTotal: 0, + repairActiveCount: 0, + todayOutput: 0, + todayQualifiedQuantity: 0, + todayUnqualifiedQuantity: 0, + workOrderActiveCount: 0, + workOrderFinishedCount: 0, + workOrderPrepareCount: 0, + yesterdayOutput: 0, +}; + +/** 工单状态对应的颜色映射 */ +export const WORK_ORDER_STATUS_COLOR_MAP: Record = { + [MesProWorkOrderStatusEnum.PREPARE]: '#909399', // 草稿 + [MesProWorkOrderStatusEnum.CONFIRMED]: '#409EFF', // 已确认 + [MesProWorkOrderStatusEnum.FINISHED]: '#67C23A', // 已完成 + [MesProWorkOrderStatusEnum.CANCELED]: '#F56C6C', // 已取消 +}; + +/** 生产趋势折线图配置 */ +export function getProductionTrendChartOptions( + dates: string[], + quantities: number[], + qualified: number[], + unqualified: number[], +): any { + return { + grid: { bottom: 40, left: 50, right: 20, top: 20 }, + legend: { bottom: 0, data: ['产量', '合格品', '不良品'] }, + series: [ + { + areaStyle: { color: 'rgba(64,158,255,0.15)' }, + data: quantities, + itemStyle: { color: '#409EFF' }, + name: '产量', + smooth: true, + type: 'line', + }, + { + data: qualified, + itemStyle: { color: '#67C23A' }, + name: '合格品', + smooth: true, + type: 'line', + }, + { + data: unqualified, + itemStyle: { color: '#F56C6C' }, + name: '不良品', + smooth: true, + type: 'line', + }, + ], + tooltip: { axisPointer: { type: 'cross' }, trigger: 'axis' }, + xAxis: { boundaryGap: false, data: dates, type: 'category' }, + yAxis: { minInterval: 1, type: 'value' }, + }; +} + +/** 工单状态分布饼图配置 */ +export function getWorkOrderStatusChartOptions( + data: Array<{ itemStyle: { color: string }; name: string; value: number }>, +): any { + return { + legend: { bottom: 0, type: 'scroll' }, + series: [ + { + avoidLabelOverlap: true, + data, + emphasis: { label: { fontSize: 14, fontWeight: 'bold', show: true } }, + itemStyle: { borderColor: '#fff', borderRadius: 6, borderWidth: 2 }, + label: { formatter: '{b}\n{c}', show: true }, + radius: ['40%', '70%'], + type: 'pie', + }, + ], + tooltip: { formatter: '{b}: {c} ({d}%)', trigger: 'item' }, + }; +} diff --git a/apps/web-antd/src/views/mes/home/index.vue b/apps/web-antd/src/views/mes/home/index.vue new file mode 100644 index 000000000..ec59771be --- /dev/null +++ b/apps/web-antd/src/views/mes/home/index.vue @@ -0,0 +1,70 @@ + + + diff --git a/apps/web-antd/src/views/mes/home/modules/alert-panel.vue b/apps/web-antd/src/views/mes/home/modules/alert-panel.vue new file mode 100644 index 000000000..ffc31ca03 --- /dev/null +++ b/apps/web-antd/src/views/mes/home/modules/alert-panel.vue @@ -0,0 +1,72 @@ + + + diff --git a/apps/web-antd/src/views/mes/home/modules/kpi-cards.vue b/apps/web-antd/src/views/mes/home/modules/kpi-cards.vue new file mode 100644 index 000000000..c92a8968d --- /dev/null +++ b/apps/web-antd/src/views/mes/home/modules/kpi-cards.vue @@ -0,0 +1,174 @@ + + + diff --git a/apps/web-antd/src/views/mes/home/modules/production-trend.vue b/apps/web-antd/src/views/mes/home/modules/production-trend.vue new file mode 100644 index 000000000..6890abc1d --- /dev/null +++ b/apps/web-antd/src/views/mes/home/modules/production-trend.vue @@ -0,0 +1,56 @@ + + + diff --git a/apps/web-antd/src/views/mes/home/modules/shortcuts.vue b/apps/web-antd/src/views/mes/home/modules/shortcuts.vue new file mode 100644 index 000000000..f2d4b7ae3 --- /dev/null +++ b/apps/web-antd/src/views/mes/home/modules/shortcuts.vue @@ -0,0 +1,90 @@ + + + diff --git a/apps/web-antd/src/views/mes/home/modules/work-order-chart.vue b/apps/web-antd/src/views/mes/home/modules/work-order-chart.vue new file mode 100644 index 000000000..244bda2db --- /dev/null +++ b/apps/web-antd/src/views/mes/home/modules/work-order-chart.vue @@ -0,0 +1,39 @@ + + + diff --git a/apps/web-ele/src/api/mes/home/index.ts b/apps/web-ele/src/api/mes/home/index.ts new file mode 100644 index 000000000..cf1aa9953 --- /dev/null +++ b/apps/web-ele/src/api/mes/home/index.ts @@ -0,0 +1,55 @@ +import { requestClient } from '#/api/request'; + +export namespace MesHomeApi { + /** MES 首页汇总统计 */ + export interface Summary { + workOrderActiveCount: number; // 进行中工单数 + workOrderPrepareCount: number; // 待排产工单数 + workOrderFinishedCount: number; // 已完成工单数 + todayOutput: number; // 今日产量 + yesterdayOutput: number; // 昨日产量 + todayQualifiedQuantity: number; // 今日合格品数 + todayUnqualifiedQuantity: number; // 今日不良品数 + machineryTotal: number; // 设备总数 + machineryProducing: number; // 生产中设备数 + machineryStop: number; // 停机设备数 + machineryMaintenance: number; // 维护中设备数 + andonActiveCount: number; // 未处置安灯呼叫数 + repairActiveCount: number; // 待处理维修工单数 + } + + /** MES 工单状态分布 */ + export interface WorkOrderStatus { + status: number; // 工单状态 + statusName: string; // 工单状态名称 + count: number; // 数量 + } + + /** MES 生产趋势 */ + export interface ProductionTrend { + date: string; // 日期 + quantity: number; // 产量 + qualifiedQuantity: number; // 合格品数 + unqualifiedQuantity: number; // 不良品数 + } +} + +/** 获得首页汇总统计 */ +export function getHomeSummary() { + return requestClient.get('/mes/home-statistics/summary'); +} + +/** 获得工单状态分布 */ +export function getWorkOrderStatusDistribution() { + return requestClient.get( + '/mes/home-statistics/work-order-status', + ); +} + +/** 获得生产趋势 */ +export function getProductionTrend(days?: number) { + return requestClient.get( + '/mes/home-statistics/production-trend', + { params: { days } }, + ); +} diff --git a/apps/web-ele/src/api/mes/wm/transfer/detail/index.ts b/apps/web-ele/src/api/mes/wm/transfer/detail/index.ts new file mode 100644 index 000000000..ff215d92c --- /dev/null +++ b/apps/web-ele/src/api/mes/wm/transfer/detail/index.ts @@ -0,0 +1,59 @@ +import { requestClient } from '#/api/request'; + +export namespace MesWmTransferDetailApi { + /** MES 调拨明细 */ + export interface TransferDetail { + id?: number; // 编号 + lineId?: number; // 转移单行编号 + transferId?: number; // 转移单编号 + itemId?: number; // 物料产品编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 单位名称 + quantity?: number; // 数量 + batchId?: number; // 批次编号 + batchCode?: string; // 批次号 + toWarehouseId?: number; // 移入仓库编号 + toWarehouseName?: string; // 移入仓库名称 + toLocationId?: number; // 移入库区编号 + toLocationName?: string; // 移入库区名称 + toAreaId?: number; // 移入库位编号 + toAreaName?: string; // 移入库位名称 + remark?: string; // 备注 + } +} + +/** 查询调拨明细列表(按行编号) */ +export function getTransferDetailListByLineId(lineId: number) { + return requestClient.get( + '/mes/wm/transfer-detail/list-by-line', + { params: { lineId } }, + ); +} + +/** 查询调拨明细详情 */ +export function getTransferDetail(id: number) { + return requestClient.get( + `/mes/wm/transfer-detail/get?id=${id}`, + ); +} + +/** 新增调拨明细 */ +export function createTransferDetail( + data: MesWmTransferDetailApi.TransferDetail, +) { + return requestClient.post('/mes/wm/transfer-detail/create', data); +} + +/** 修改调拨明细 */ +export function updateTransferDetail( + data: MesWmTransferDetailApi.TransferDetail, +) { + return requestClient.put('/mes/wm/transfer-detail/update', data); +} + +/** 删除调拨明细 */ +export function deleteTransferDetail(id: number) { + return requestClient.delete(`/mes/wm/transfer-detail/delete?id=${id}`); +} diff --git a/apps/web-ele/src/api/mes/wm/transfer/index.ts b/apps/web-ele/src/api/mes/wm/transfer/index.ts new file mode 100644 index 000000000..14d9b860f --- /dev/null +++ b/apps/web-ele/src/api/mes/wm/transfer/index.ts @@ -0,0 +1,92 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmTransferApi { + /** MES 转移单 */ + export interface Transfer { + id?: number; // 编号 + code?: string; // 转移单编号 + name?: string; // 转移单名称 + type?: number; // 转移单类型 + deliveryFlag?: boolean; // 是否配送 + recipientName?: string; // 收货人 + recipientTelephone?: string; // 联系电话 + destinationAddress?: string; // 目的地 + carrier?: string; // 承运商 + shippingNumber?: string; // 运输单号 + confirmFlag?: boolean; // 是否确认 + transferDate?: string; // 转移日期 + status?: number; // 单据状态 + remark?: string; // 备注 + createTime?: number; // 创建时间 + } + + /** MES 转移单分页查询参数 */ + export interface PageParams extends PageParam { + code?: string; + name?: string; + type?: number; + status?: number; + } +} + +/** 查询转移单分页 */ +export function getTransferPage(params: MesWmTransferApi.PageParams) { + return requestClient.get>( + '/mes/wm/transfer/page', + { params }, + ); +} + +/** 查询转移单详情 */ +export function getTransfer(id: number) { + return requestClient.get( + `/mes/wm/transfer/get?id=${id}`, + ); +} + +/** 新增转移单 */ +export function createTransfer(data: MesWmTransferApi.Transfer) { + return requestClient.post('/mes/wm/transfer/create', data); +} + +/** 修改转移单 */ +export function updateTransfer(data: MesWmTransferApi.Transfer) { + return requestClient.put('/mes/wm/transfer/update', data); +} + +/** 删除转移单 */ +export function deleteTransfer(id: number) { + return requestClient.delete(`/mes/wm/transfer/delete?id=${id}`); +} + +/** 提交转移单 */ +export function submitTransfer(id: number) { + return requestClient.put(`/mes/wm/transfer/submit?id=${id}`); +} + +/** 到货确认 */ +export function confirmTransfer(id: number) { + return requestClient.put(`/mes/wm/transfer/confirm?id=${id}`); +} + +/** 执行上架 */ +export function stockTransfer(id: number) { + return requestClient.put(`/mes/wm/transfer/stock?id=${id}`); +} + +/** 完成转移 */ +export function finishTransfer(id: number) { + return requestClient.put(`/mes/wm/transfer/finish?id=${id}`); +} + +/** 取消转移单 */ +export function cancelTransfer(id: number) { + return requestClient.put(`/mes/wm/transfer/cancel?id=${id}`); +} + +/** 导出转移单 */ +export function exportTransfer(params: any) { + return requestClient.download('/mes/wm/transfer/export-excel', { params }); +} diff --git a/apps/web-ele/src/api/mes/wm/transfer/line/index.ts b/apps/web-ele/src/api/mes/wm/transfer/line/index.ts new file mode 100644 index 000000000..9ec7b5ea9 --- /dev/null +++ b/apps/web-ele/src/api/mes/wm/transfer/line/index.ts @@ -0,0 +1,55 @@ +import { requestClient } from '#/api/request'; + +export namespace MesWmTransferLineApi { + /** MES 转移单行 */ + export interface TransferLine { + id?: number; // 编号 + transferId?: number; // 转移单编号 + materialStockId?: number; // 库存台账编号 + itemId?: number; // 物料产品编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 单位名称 + quantity?: number; // 转移数量 + batchId?: number; // 批次编号 + batchCode?: string; // 批次号 + fromWarehouseId?: number; // 移出仓库编号 + fromWarehouseName?: string; // 移出仓库名称 + fromLocationId?: number; // 移出库区编号 + fromLocationName?: string; // 移出库区名称 + fromAreaId?: number; // 移出库位编号 + fromAreaName?: string; // 移出库位名称 + remark?: string; // 备注 + } +} + +/** 查询转移单行列表 */ +export function getTransferLineList(transferId: number) { + return requestClient.get( + '/mes/wm/transfer-line/list', + { params: { transferId } }, + ); +} + +/** 查询转移单行详情 */ +export function getTransferLine(id: number) { + return requestClient.get( + `/mes/wm/transfer-line/get?id=${id}`, + ); +} + +/** 新增转移单行 */ +export function createTransferLine(data: MesWmTransferLineApi.TransferLine) { + return requestClient.post('/mes/wm/transfer-line/create', data); +} + +/** 修改转移单行 */ +export function updateTransferLine(data: MesWmTransferLineApi.TransferLine) { + return requestClient.put('/mes/wm/transfer-line/update', data); +} + +/** 删除转移单行 */ +export function deleteTransferLine(id: number) { + return requestClient.delete(`/mes/wm/transfer-line/delete?id=${id}`); +}