6f73631c7c
발주서관리 리스트:
- /purchase/order-wace 임시 라우트 → /purchase/order 통합 (기존 vexplor
변형판 대체). order-wace 폴더 삭제.
- 백엔드 라우트 /order-wace → /order-list, 함수 listPurchaseOrderWace →
listPurchaseOrderList, API 클라이언트 listOrderWace → listOrder.
발주서 폼 (general 양식) GET API:
- services/purchaseOrderFormService.ts 신규 (getPurchaseOrderFormInit,
getPurchaseOrderForm). 품의서 자동채움 = salesMng.getProposalPartList
매퍼 1:1 → 발주 그리드 형식 변환. 발주번호 채번 RPS{YY}-{MMDD}-{NN}.
- 컨트롤러/라우트: GET /api/purchase/order-form/init?proposal_objid=...
+ /api/purchase/order-form/:objid.
- RPS는 OBJID가 varchar라 wace numeric 캐스트 모두 제거.
PageHeader 컨벤션 일괄 변경:
- 자동매칭이 매칭된 menu의 parent_obj_id로 부모를 찾아
"{부모}_{자식}" 형식 표기 (wace 컨벤션). 부모가 루트 그룹이면 자식만.
- description prop과 렌더링 완전 제거 (사용처 없음 확인).
- 모든 메뉴 페이지에 일괄 적용.
DB(별도): menu_info 9857401373575 + rel_menu_auth 3건 제거.
저장/삭제 API + 프론트 다이얼로그는 다음 세션.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
100 lines
3.3 KiB
TypeScript
100 lines
3.3 KiB
TypeScript
// ============================================================
|
|
// 구매관리 — 7개 메뉴 그리드 API.
|
|
// 백엔드: /api/purchase/{menu-path}, /api/purchase/options/{suppliers|users|projects}
|
|
// ============================================================
|
|
|
|
import { apiClient } from "./client";
|
|
|
|
export interface PurchaseListFilter {
|
|
year?: string;
|
|
customer_objid?: string;
|
|
customer_cd?: string;
|
|
project_no?: string;
|
|
part_no?: string;
|
|
part_name?: string;
|
|
part_spec?: string;
|
|
partner_objid?: string;
|
|
purchase_order_no?: string;
|
|
proposal_no?: string;
|
|
search_status?: string;
|
|
writer?: string;
|
|
request_user?: string;
|
|
purchase_type?: string;
|
|
part_type?: string;
|
|
product_cd?: string;
|
|
category_cd?: string;
|
|
paid_type?: string;
|
|
mail_send_yn?: string;
|
|
delivery_status?: string;
|
|
close_status?: string;
|
|
sales_mng_user_id?: string;
|
|
regdate_start?: string;
|
|
regdate_end?: string;
|
|
receipt_date_start?: string;
|
|
receipt_date_end?: string;
|
|
delivery_start_date?: string;
|
|
delivery_end_date?: string;
|
|
reg_start_date?: string;
|
|
reg_end_date?: string;
|
|
page?: number;
|
|
page_size?: number;
|
|
}
|
|
|
|
export interface PurchaseListResponse<T = any> {
|
|
rows: T[];
|
|
totalCount: number;
|
|
page: number;
|
|
pageSize: number;
|
|
}
|
|
|
|
export interface OptionItem {
|
|
code: string;
|
|
label: string;
|
|
}
|
|
|
|
async function getList<T = any>(path: string, filter: PurchaseListFilter): Promise<PurchaseListResponse<T>> {
|
|
const res = await apiClient.get(`/purchase/${path}`, { params: filter });
|
|
return res.data?.data as PurchaseListResponse<T>;
|
|
}
|
|
|
|
export const purchaseApi = {
|
|
// 그리드 7종
|
|
listPurchaseRequest: (f: PurchaseListFilter = {}) => getList("purchase-request", f),
|
|
listQuotationRequest: (f: PurchaseListFilter = {}) => getList("quotation-request", f),
|
|
listProposal: (f: PurchaseListFilter = {}) => getList("proposal", f),
|
|
listInbound: (f: PurchaseListFilter = {}) => getList("inbound", f),
|
|
listInboundByItem: (f: PurchaseListFilter = {}) => getList("inbound-by-item", f),
|
|
listInboundByDate: (f: PurchaseListFilter = {}) => getList("inbound-by-date", f),
|
|
listProjectStatus: (f: PurchaseListFilter = {}) => getList("project-status", f),
|
|
listOrder: (f: PurchaseListFilter = {}) => getList("order-list", f),
|
|
|
|
// 공통 옵션
|
|
async listSuppliers(): Promise<OptionItem[]> {
|
|
const r = await apiClient.get("/purchase/options/suppliers");
|
|
return (r.data?.data ?? []) as OptionItem[];
|
|
},
|
|
// 견적요청서 / 발주서 vendor (wace client_mng 매칭)
|
|
async listVendors(): Promise<OptionItem[]> {
|
|
const r = await apiClient.get("/purchase/options/vendors");
|
|
return (r.data?.data ?? []) as OptionItem[];
|
|
},
|
|
async listUsers(): Promise<OptionItem[]> {
|
|
const r = await apiClient.get("/purchase/options/users");
|
|
return (r.data?.data ?? []) as OptionItem[];
|
|
},
|
|
async listProjects(): Promise<OptionItem[]> {
|
|
const r = await apiClient.get("/purchase/options/projects");
|
|
return (r.data?.data ?? []) as OptionItem[];
|
|
},
|
|
};
|
|
|
|
/** 년도 옵션 — wace 운영판 동일 (현재년도 ±4) */
|
|
export function getYearOptions(): OptionItem[] {
|
|
const y = new Date().getFullYear();
|
|
const out: OptionItem[] = [];
|
|
for (let i = y + 4; i >= y - 4; i--) {
|
|
out.push({ code: String(i), label: String(i) });
|
|
}
|
|
return out;
|
|
}
|