潘的第一次 commit

This commit is contained in:
panchengyong
2026-02-27 23:50:25 +08:00
commit 10b6d0099a
117 changed files with 32547 additions and 0 deletions

View File

@@ -0,0 +1,305 @@
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
}))
}