更新生产计划、销售订单、工作订单和仓库发料功能

This commit is contained in:
panchengyong
2026-03-13 11:11:37 +08:00
parent 34cbf08144
commit 099e01e518
30 changed files with 681 additions and 185 deletions

View File

@@ -140,3 +140,20 @@ export function revokeIssue(mbomId: number): Promise<void> {
export function calcBom(planId: number): Promise<void> {
return request.put(`/erp/mp/plan/bom-calculate/${planId}`)
}
// 齐套检查:查询物料清单的子件库存情况
export interface StockCheckItem {
itemCode: string
itemName: string
unitName?: string
requiredQty: number
availableQty: number
shortage: number
isShortage: boolean
}
export function checkMbomStock(mbomId: number): Promise<StockCheckItem[]> {
return request.get(`/erp/mp/mbom/stock-check/${mbomId}`).then((res: any) => {
return res.data ?? res.rows ?? res ?? []
})
}

View File

@@ -57,6 +57,12 @@ export interface ProductionPlan {
slaveList?: PlanLine[]
/** 部门名称(单据视图) */
deptName?: string
/** 客户ID从关联销售订单带入 */
clientId?: number
/** 客户编码(从关联销售订单带入) */
clientCode?: string
/** 客户名称(从关联销售订单带入) */
clientName?: string
/** 物料清单BOM运算结果详情页只读 */
mbomList?: MbomLine[]
/** 补料清单(详情页只读) */
@@ -187,6 +193,7 @@ export const PLAN_STATUS_MAP: Record<string, { label: string; type: string }> =
export const BUSINESS_STATUS_OPTIONS = [
{ value: 'NORMAL', label: '正常' },
{ value: 'BOM_CALCULATED', label: '已运算' },
{ value: 'PAUSE', label: '暂停' },
{ value: 'CANCEL', label: '取消' }
]
@@ -295,7 +302,7 @@ export function getImportOrderList(params?: {
return request.get('/erp/sl/order/list', {
params: {
...params,
orderStatus: '审核',
status: 'APPROVED',
pageNum: 1,
pageSize: 100
}
@@ -306,9 +313,9 @@ export function getImportOrderList(params?: {
orderId: row.orderId,
orderCode: row.orderCode,
orderDate: row.orderDate,
userId: row.salesmanId,
userName: row.salesmanName,
salesmanName: row.salesmanName,
userId: row.salesUserId ?? row.salesmanId,
userName: row.salesUserName ?? row.salesmanName,
salesmanName: row.salesUserName ?? row.salesmanName,
clientName: row.clientName,
deliveryDate: row.deliveryDate,
deliveryStatus: row.deliveryDate && new Date(row.deliveryDate) < new Date() ? '超期' : '预计',

View File

@@ -122,11 +122,12 @@ export interface SalesOrderDetailListResponse {
// ============ 状态映射 ============
export const ORDER_STATUS_MAP: Record<string, { label: string; type: string }> = {
'DRAFT': { label: '草稿', type: 'info' },
'开立': { label: '开立', type: '' },
'审核': { label: '审核', type: 'success' },
'退回': { label: '退回', type: 'warning' },
'关闭': { label: '关闭', type: 'danger' }
'DRAFT': { label: '草稿', type: 'info' },
'PREPARE': { label: '开立', type: '' },
'APPROVED': { label: '审核', type: 'success' },
'REJECTED': { label: '退回', type: 'warning' },
'FINISHED': { label: '已完成', type: 'info' },
'CANCELED': { label: '关闭', type: 'danger' },
}
export const SALES_TYPE_OPTIONS = [
@@ -162,9 +163,10 @@ const BASE = '/erp/sl/order'
function normalizeOrderRow(row: any): any {
return {
...row,
orderStatus: row.orderStatus ?? row.status ?? '',
salesmanId: row.salesmanId ?? row.salesUserId,
salesmanName: row.salesmanName ?? row.salesUserName ?? '',
salesType: row.salesType ?? row.saleType ?? '',
salesType: row.salesType ?? row.orderType ?? row.saleType ?? '',
}
}
@@ -197,11 +199,13 @@ export function getSalesOrderDetail(orderId: number): Promise<SalesOrder> {
// 后端返回 salesUserId/salesUserName前端表单使用 salesmanId/salesmanName便于下拉回显
if (data.salesUserId !== undefined) data.salesmanId = data.salesUserId
if (data.salesUserName !== undefined) data.salesmanName = data.salesUserName
// 审核信息字段别名映射(后端可能使用 checkBy/checkDate 等命名)
// 审核信息字段别名映射
// 使用 == null 而非 ! 判断,避免 auditorId=0 或 auditorName='' 被误判为缺失
if (data.auditorId == null) data.auditorId = data.checkUserId ?? data.checkById ?? data.auditById
if (data.auditorName == null) data.auditorName = data.checkUserName ?? data.checkByName ?? data.auditByName ?? data.auditUser
if (data.auditDate == null) data.auditDate = data.checkDate ?? data.auditTime ?? data.checkTime
if (data.auditorId == null) data.auditorId = data.approverId ?? data.checkUserId ?? data.checkById ?? data.auditById
if (data.auditorName == null) data.auditorName = data.approverName ?? data.checkUserName ?? data.checkByName ?? data.auditByName ?? data.auditUser
if (data.auditDate == null) data.auditDate = data.approveDate ?? data.checkDate ?? data.auditTime ?? data.checkTime
// 统一状态字段
if (data.orderStatus == null) data.orderStatus = data.status ?? ''
return data
})
}
@@ -216,6 +220,10 @@ function buildOrderPayload(data: Partial<SalesOrder>): Record<string, unknown> {
// 后端实体为 salesUserId / salesUserName前端表单为 salesmanId / salesmanName此处统一发给后端
if (payload.salesmanId !== undefined) payload.salesUserId = payload.salesmanId
if (payload.salesmanName !== undefined) payload.salesUserName = payload.salesmanName
// 后端实体用 orderType 存储销售类型,前端表单用 salesType
if (payload.salesType !== undefined) payload.orderType = payload.salesType
// 前端用 orderStatus后端实体字段为 status
if (payload.orderStatus !== undefined) payload.status = payload.orderStatus
return payload
}