7e7c6a0ac0
backend
- services/salesPurchaseRequestService.ts: listPurchaseRequestReg(DOC_TYPE='PURCHASE_REG') + listPurchaseRegProposal(DOC_TYPE='PURCHASE_REG_PROPOSAL')
· 구매요청서 상태 CASE: PURCHASE_REG_PROPOSAL 자식 존재 시 '품의서생성' → '확정'/'작성중' (wace 매퍼 1:1)
· 품의서 결재상태: amaranth_approval(target_type='PROPOSAL') LEFT JOIN 우선순위
· sales_request_part 누락 → MBOM_DETAIL+PART_MNG fallback (구매관리 패턴 동일)
- routes/salesPurchaseRequestRoutes.ts + app.ts: /api/sales/purchase-request, /api/sales/purchase-proposal
frontend
- lib/api/salesPurchaseRequest.ts
- sales/purchase-request/page.tsx — 14컬럼, 구매요청서작성/품의서생성 액션 (placeholder 토스트)
- sales/purchase-proposal/page.tsx — 10컬럼, 결재상신 액션 (placeholder 토스트)
- PageHeader+CompactFilterBar+SmartSelect+DataGrid logicstudio 6종 패턴 일관 적용
구매관리>품의서관리 vs 영업관리>품의서관리 차이
- 구매관리: DOC_TYPE in ('PROPOSAL', 'PURCHASE_REG_PROPOSAL'(결재완료만)) → 발주서 생성 풀
- 영업관리: DOC_TYPE='PURCHASE_REG_PROPOSAL' 전용 → 결재상신 화면 (결재완료 시 구매관리로 자동 노출)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
42 lines
1.3 KiB
TypeScript
42 lines
1.3 KiB
TypeScript
// ============================================================
|
|
// 영업관리 > 구매요청서관리 / 품의서관리 (wace_plm 1:1)
|
|
// 백엔드: /api/sales/purchase-request, /api/sales/purchase-proposal
|
|
// ============================================================
|
|
|
|
import { apiClient } from "./client";
|
|
|
|
export interface SalesPurchaseRequestFilter {
|
|
project_no?: string;
|
|
part_no?: string;
|
|
part_name?: string;
|
|
purchase_type?: string;
|
|
writer?: string;
|
|
part_type?: string;
|
|
search_status?: string;
|
|
proposal_no?: string;
|
|
regdate_start?: string;
|
|
regdate_end?: string;
|
|
page?: number;
|
|
page_size?: number;
|
|
}
|
|
|
|
export interface SalesPurchaseRequestListResponse<T = any> {
|
|
rows: T[];
|
|
totalCount: number;
|
|
page: number;
|
|
pageSize: number;
|
|
}
|
|
|
|
async function getList<T = any>(
|
|
path: string,
|
|
filter: SalesPurchaseRequestFilter,
|
|
): Promise<SalesPurchaseRequestListResponse<T>> {
|
|
const res = await apiClient.get(`/sales/${path}`, { params: filter });
|
|
return res.data?.data as SalesPurchaseRequestListResponse<T>;
|
|
}
|
|
|
|
export const salesPurchaseRequestApi = {
|
|
listPurchaseRequestReg: (f: SalesPurchaseRequestFilter = {}) => getList("purchase-request", f),
|
|
listPurchaseRegProposal: (f: SalesPurchaseRequestFilter = {}) => getList("purchase-proposal", f),
|
|
};
|