Files
my-mom-system/erp-frontend-vue/src/api/workOrder.ts
2026-02-27 23:50:25 +08:00

306 lines
9.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import request from './request'
// ============ 类型定义 ============
/** 生产工单 BOM 物料行 */
export interface WorkOrderBom {
lineId?: number
workorderId?: number
itemId?: number
itemCode?: string
itemName?: string
itemSpc?: string
unitOfMeasure?: string
unitName?: string
itemOrProduct?: string
quantity?: number
remark?: string
}
/** 生产工单主表 */
export interface WorkOrder {
workorderId?: number
workorderCode?: string
workorderName?: string
workorderType?: string
orderSource?: string
sourceCode?: string
productId?: number
productCode?: string
productName?: string
productSpc?: string
unitOfMeasure?: string
unitName?: string
routeId?: number
routeCode?: string
routeName?: string
batchCode?: string
quantity?: number
quantityProduced?: number
quantityChanged?: number
quantityScheduled?: number
clientId?: number
clientCode?: string
clientName?: string
vendorId?: number
vendorCode?: string
vendorName?: string
productionDate?: string // 前端字段名,映射到后端 requestDate
requestDate?: string // 后端实际字段名(数据库列 request_date
finishDate?: string
cancelDate?: string
parentId?: number
ancestors?: string
status?: string
remark?: string
createBy?: string
createTime?: string
updateBy?: string
updateTime?: string
// v3.1 新增字段
orderDate?: string // 单据日期
businessType?: string // 业务类型
businessStatus?: string // 业务状态
operatorName?: string // 操作员
approverName?: string // 审核员
approveDate?: string // 审核日期
salesOrderCode?: string // 跟单编号(销售订单号)
deliveryDate?: string // 订单交期
drawingNo?: string // 图纸号
productionLine?: string // 生产线
processTime?: number // 加工时长(分钟)
qualityReq?: string // 质量要求
}
/** 查询参数 */
export interface WorkOrderQuery {
workorderCode?: string
workorderName?: string
workorderType?: string
sourceCode?: string
productCode?: string
productName?: string
status?: string
beginProductionDate?: string // 前端用,映射到后端 beginRequestDate
endProductionDate?: string // 前端用,映射到后端 endRequestDate
pageNum?: number
pageSize?: number
}
/** 分页响应 */
export interface WorkOrderListResponse {
rows: WorkOrder[]
total: number
}
// ============ 状态映射 ============
export const STATUS_MAP: Record<string, { label: string; type: string }> = {
'PREPARE': { label: '草稿', type: 'info' },
'CONFIRMED': { label: '已确认', type: '' },
'APPROVED': { label: '已审核', type: 'success' },
'FINISHED': { label: '已完成', type: 'success' },
'CANCELED': { label: '已取消', type: 'danger' }
}
export const WORKORDER_TYPE_OPTIONS = [
{ value: 'SELF', label: '自产' },
{ value: 'OUTSOURCE', label: '委外' },
{ value: 'PROCESSING', label: '加工车间' }
]
export const BUSINESS_STATUS_OPTIONS = [
{ value: 'NORMAL', label: '正常' },
{ value: 'PAUSE', label: '暂停' },
{ value: 'CANCEL', label: '取消' }
]
// ============ API 接口 ============
const BASE = '/mes/pro/workorder'
/** 查询生产工单列表 */
export function getWorkOrderList(params: WorkOrderQuery): Promise<WorkOrderListResponse> {
// 将前端日期查询参数映射为后端字段名
const backendParams: Record<string, any> = { ...params }
if (backendParams.beginProductionDate) {
backendParams.beginRequestDate = backendParams.beginProductionDate
delete backendParams.beginProductionDate
}
if (backendParams.endProductionDate) {
backendParams.endRequestDate = backendParams.endProductionDate
delete backendParams.endProductionDate
}
return request.get(`${BASE}/list`, { params: backendParams }).then((res: any) => {
const rows = (res.rows ?? res.data?.rows ?? []).map((row: any) => {
// 后端返回 requestDate前端显示用 productionDate
if (row.requestDate && !row.productionDate) {
row.productionDate = row.requestDate
}
return row
})
const total = res.total ?? res.data?.total ?? 0
return { rows, total }
})
}
/** 获取生产工单详情 */
export function getWorkOrderDetail(workorderId: number): Promise<WorkOrder> {
return request.get(`${BASE}/${workorderId}`).then((res: any) => {
const data = res.data ?? res
// 后端返回 requestDate前端用 productionDate
if (data.requestDate && !data.productionDate) {
data.productionDate = data.requestDate
}
return data
})
}
/** 将前端字段名映射为后端字段名 */
function toBackendPayload(data: Partial<WorkOrder>): Record<string, any> {
const payload: Record<string, any> = { ...data }
// 前端用 productionDate后端用 requestDate
if (payload.productionDate !== undefined) {
payload.requestDate = payload.productionDate
delete payload.productionDate
}
return payload
}
/** 新增生产工单 */
export function createWorkOrder(data: Partial<WorkOrder>): Promise<number> {
return request.post(BASE, toBackendPayload(data)).then((res: any) => res.data ?? res)
}
/** 修改生产工单 */
export function updateWorkOrder(data: Partial<WorkOrder>): Promise<void> {
return request.put(BASE, toBackendPayload(data))
}
/** 删除生产工单(支持批量) */
export function deleteWorkOrder(workorderIds: number | number[] | string): Promise<void> {
const ids = Array.isArray(workorderIds) ? workorderIds.join(',') : String(workorderIds)
return request.delete(`${BASE}/${ids}`)
}
/** 完工工单 */
export function finishWorkOrder(workorderId: number): Promise<void> {
return request.put(`${BASE}/finish/${workorderId}`)
}
/** 取消工单 */
export function cancelWorkOrder(workorderId: number): Promise<void> {
return request.put(`${BASE}/cancel/${workorderId}`)
}
/** 获取工单 BOM 组成列表(直接查 pro_workorder_bom 表,字段名直接对应) */
export function getWorkOrderBomList(workorderId: number): Promise<WorkOrderBom[]> {
return request.get('/mes/pro/workorderbom/list', {
params: { workorderId, pageNum: 1, pageSize: 500 }
}).then((res: any) => {
return res.rows ?? res.data?.rows ?? []
})
}
/** 导出生产工单 */
export function exportWorkOrder(params: WorkOrderQuery): Promise<Blob> {
return request.post(`${BASE}/export`, params, { responseType: 'blob' })
}
/** 一键领料:根据工单 BOM 自动创建领料单,返回领料单 ID */
export function quickIssue(workorderId: number): Promise<number> {
return request.post(`${BASE}/quickIssue/${workorderId}`).then((res: any) => res.data ?? res)
}
/** 审核工单确认PREPARE → CONFIRMED */
export function confirmWorkOrder(workorderId: number): Promise<void> {
return request.put(`${BASE}/confirm/${workorderId}`)
}
/** 反审核工单CONFIRMED → PREPARE */
export function unconfirmWorkOrder(workorderId: number): Promise<void> {
return request.put(`${BASE}/unconfirm/${workorderId}`)
}
/** 查询工单关联的领料明细列表 */
export function getIssueListByWorkorder(workorderId: number): Promise<{ rows: any[]; total: number }> {
return request.get('/mes/wm/issueheader/list', {
params: { workorderId, pageNum: 1, pageSize: 100 }
}).then((res: any) => ({
rows: res.rows ?? [],
total: res.total ?? 0
}))
}
// ============ 工序任务ProTaskAPI ============
/** 工序任务 */
export interface ProTask {
taskId?: number
taskCode?: string
taskName?: string
workorderId?: number
workorderCode?: string
processId?: number
processCode?: string
processName?: string
quantity?: number
quantityProduced?: number
quantityQuanlified?: number
quantityUnquanlified?: number
startTime?: string
duration?: number
endTime?: string
colorCode?: string
status?: string
remark?: string
createBy?: string
createTime?: string
updateBy?: string
updateTime?: string
}
/** 根据工单 ID 获取工序任务列表 */
export function getTaskListByWorkorder(workorderId: number): Promise<ProTask[]> {
return request.get('/mes/pro/protask/list', {
params: { workorderId, pageNum: 1, pageSize: 500 }
}).then((res: any) => {
return res.rows ?? res.data?.rows ?? []
})
}
// ============ 工艺路线选择 API ============
/** 工艺路线列表(选择弹窗,不默认过滤 enableFlag 以避免列表为空) */
export function getRouteList(params?: {
routeCode?: string
routeName?: string
enableFlag?: string
pageNum?: number
pageSize?: number
}): Promise<{ rows: any[]; total: number }> {
return request.get('/mes/pro/proroute/list', {
params: { pageNum: 1, pageSize: 100, ...params }
}).then((res: any) => ({
rows: res.rows ?? [],
total: res.total ?? 0
}))
}
// ============ 客户选择 API备用 ============
/** 客户列表(选择弹窗) */
export function getClientList(params?: {
clientCode?: string
clientName?: string
pageNum?: number
pageSize?: number
}): Promise<{ rows: any[]; total: number }> {
return request.get('/mes/md/client/list', {
params: { pageNum: 1, pageSize: 100, ...params }
}).then((res: any) => ({
rows: res.rows ?? [],
total: res.total ?? 0
}))
}