aacbb62ad8
- 신규 테이블 5종 (운영 11133 → RPS 11134 DDL 1:1):
inventory_mgmt / inventory_mgmt_in / inventory_mgmt_out /
inventory_mgmt_out_master / inventory_mgmt_history
- 백엔드 /api/inventory-mng — 리스트·재고등록·자재이동·삭제·이력 +
불출의뢰 생성·접수·자재불출(재고 차감)·삭제. 채번 Rfw-YYYY-seq.
- 프론트 /COMPANY_16/material/{list, issue-request} +
StockRegister / MaterialMove / IssueRequestCreate /
InventoryHistory / IssueDispatch 다이얼로그 5종.
- AdminPageRenderer 등록 + /material/ prefix.
170 lines
5.0 KiB
TypeScript
170 lines
5.0 KiB
TypeScript
// ============================================================
|
|
// 자재관리 — 자재리스트 + 불출의뢰서 API
|
|
// 백엔드: /api/inventory-mng
|
|
// ============================================================
|
|
|
|
import { apiClient } from "./client";
|
|
|
|
export interface InventoryListFilter {
|
|
project_objid?: string;
|
|
unit_code?: string;
|
|
part_no?: string;
|
|
part_name?: string;
|
|
part_type?: string;
|
|
location?: string;
|
|
cls_cd?: string;
|
|
cau_cd?: string;
|
|
writer?: string;
|
|
page?: number;
|
|
page_size?: number;
|
|
}
|
|
|
|
export interface IssueRequestFilter {
|
|
part_no?: string;
|
|
part_name?: string;
|
|
request_start_date?: string;
|
|
request_end_date?: string;
|
|
request_user?: string;
|
|
reception_status?: string;
|
|
reception_user?: string;
|
|
reception_start_date?: string;
|
|
reception_end_date?: string;
|
|
out_status?: string;
|
|
page?: number;
|
|
page_size?: number;
|
|
}
|
|
|
|
export interface ListResponse<T = any> {
|
|
rows: T[];
|
|
totalCount: number;
|
|
page: number;
|
|
pageSize: number;
|
|
}
|
|
|
|
export interface OptionItem { code: string; label: string; part_name?: string }
|
|
|
|
export interface SaveStockInput {
|
|
project_objid: string;
|
|
unit?: string;
|
|
part_objid: string;
|
|
qty: number;
|
|
price?: string;
|
|
location: string;
|
|
sub_location?: string;
|
|
cls_cd?: string;
|
|
cau_cd?: string;
|
|
receipt_date?: string;
|
|
writer?: string;
|
|
order_objid?: string;
|
|
}
|
|
|
|
export interface MoveItem {
|
|
in_objid: string;
|
|
move_qty: number;
|
|
location?: string;
|
|
sub_location?: string;
|
|
move_date?: string;
|
|
move_user?: string;
|
|
}
|
|
|
|
export interface IssueRequestLineInput {
|
|
parent_objid: string;
|
|
request_qty: number;
|
|
unit?: string;
|
|
}
|
|
|
|
export interface IssueRequestSaveInput {
|
|
master_objid?: string;
|
|
contract_mgmt_objid?: string;
|
|
request_date?: string;
|
|
request_id?: string;
|
|
remark?: string;
|
|
writer?: string;
|
|
lines: IssueRequestLineInput[];
|
|
}
|
|
|
|
export interface DispatchLineInput {
|
|
objid: string;
|
|
out_qty: number;
|
|
out_date: string;
|
|
acq_user: string;
|
|
sign?: string;
|
|
}
|
|
|
|
export interface DispatchInput {
|
|
master_objid: string;
|
|
lines: DispatchLineInput[];
|
|
writer?: string;
|
|
}
|
|
|
|
export const inventoryMngApi = {
|
|
// 자재리스트
|
|
async list(f: InventoryListFilter = {}): Promise<ListResponse> {
|
|
const r = await apiClient.get("/inventory-mng/list", { params: f });
|
|
return r.data?.data as ListResponse;
|
|
},
|
|
async saveStock(input: SaveStockInput): Promise<{ objid: string; in_objid: string }> {
|
|
const r = await apiClient.post("/inventory-mng/stock", input);
|
|
return r.data?.data;
|
|
},
|
|
async deleteStock(objids: string[]): Promise<{ deleted: number }> {
|
|
const r = await apiClient.post("/inventory-mng/stock/delete", { objids });
|
|
return r.data?.data;
|
|
},
|
|
async move(items: MoveItem[]): Promise<{ updated: number }> {
|
|
const r = await apiClient.post("/inventory-mng/move", { items });
|
|
return r.data?.data;
|
|
},
|
|
async history(objid: string): Promise<any[]> {
|
|
const r = await apiClient.get(`/inventory-mng/history/${objid}`);
|
|
return (r.data?.data ?? []) as any[];
|
|
},
|
|
|
|
// 불출의뢰
|
|
async listIssue(f: IssueRequestFilter = {}): Promise<ListResponse> {
|
|
const r = await apiClient.get("/inventory-mng/issue-request", { params: f });
|
|
return r.data?.data as ListResponse;
|
|
},
|
|
async getIssue(objid: string): Promise<{ master: any; lines: any[] }> {
|
|
const r = await apiClient.get(`/inventory-mng/issue-request/${objid}`);
|
|
return r.data?.data;
|
|
},
|
|
async candidates(parent_objids: string[]): Promise<any[]> {
|
|
const r = await apiClient.post("/inventory-mng/issue-request/candidates", { parent_objids });
|
|
return (r.data?.data ?? []) as any[];
|
|
},
|
|
async saveIssue(input: IssueRequestSaveInput): Promise<{ master_objid: string; inventory_out_no: string }> {
|
|
const r = await apiClient.post("/inventory-mng/issue-request", input);
|
|
return r.data?.data;
|
|
},
|
|
async deleteIssue(objid: string): Promise<void> {
|
|
await apiClient.delete(`/inventory-mng/issue-request/${objid}`);
|
|
},
|
|
async receiveIssue(objids: string[]): Promise<{ updated: number }> {
|
|
const r = await apiClient.post("/inventory-mng/issue-request/receive", { objids });
|
|
return r.data?.data;
|
|
},
|
|
async dispatchIssue(input: DispatchInput): Promise<{ updated: number }> {
|
|
const r = await apiClient.post("/inventory-mng/issue-request/dispatch", input);
|
|
return r.data?.data;
|
|
},
|
|
|
|
// 옵션
|
|
async projects(): Promise<OptionItem[]> {
|
|
const r = await apiClient.get("/inventory-mng/options/projects");
|
|
return (r.data?.data ?? []) as OptionItem[];
|
|
},
|
|
async units(contract_objid: string): Promise<OptionItem[]> {
|
|
const r = await apiClient.get("/inventory-mng/options/units", { params: { contract_objid } });
|
|
return (r.data?.data ?? []) as OptionItem[];
|
|
},
|
|
async users(): Promise<OptionItem[]> {
|
|
const r = await apiClient.get("/inventory-mng/options/users");
|
|
return (r.data?.data ?? []) as OptionItem[];
|
|
},
|
|
async parts(keyword: string, limit = 30): Promise<OptionItem[]> {
|
|
const r = await apiClient.get("/inventory-mng/options/parts", { params: { q: keyword, limit } });
|
|
return (r.data?.data ?? []) as OptionItem[];
|
|
},
|
|
};
|