feat(M01): 조달 찾기 확정 모양 · 품셈재료 가격 연결 · 건설노임 준용 직종 고르기

- 고르기 API GET /api/m01/pick (나라장터자재 · 시중물가 · 공표 직종) — 조달 찾기 옛 API 대체
- 시중물가 조달›출처 「나라장터:<열쇠>」 연결 · 끊기 뒤 변화 없음 · 조달 값·기준 칸
- 품셈재료 「가격 연결」 모달(이름·규격 미리 찾기 · 관급 표시 · 후보 조건 · 끊기) · 못 이은 줄만 보기
- 건설노임 미공표 줄 「준용」 직종 고르기

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016WRFJmmhPi4exAzHgPZHMT
This commit is contained in:
2026-09-19 23:53:28 +09:00
co-authored by Claude Sonnet 5
parent 796b0f8efc
commit d2a6646fc4
10 changed files with 367 additions and 135 deletions
+15 -5
View File
@@ -83,8 +83,13 @@ export const fetchGroups = async (): Promise<GroupInfo[]> =>
export const fetchFiles = async (group: string): Promise<FileInfo[]> =>
(await get<{ files: FileInfo[] }>(`/groups/${encodeURIComponent(group)}/files`, {})).files;
export const fetchRows = (file: string, page: number, size: number, q: string): Promise<RowsPage> =>
get<RowsPage>("/rows", { file, page, size, q });
export const fetchRows = (
file: string,
page: number,
size: number,
q: string,
unlinked = false,
): Promise<RowsPage> => get<RowsPage>("/rows", { file, page, size, q, unlinked: unlinked ? 1 : 0 });
export const fetchTables = (
file: string,
@@ -108,13 +113,18 @@ export async function saveFiles(files: FileChanges[]): Promise<SaveResult> {
return { status, detail: typeof detail === "string" ? detail : JSON.stringify(detail) };
}
export interface ProcureItem {
export type PickKind = "procure" | "price" | "job";
export interface PickItem {
ref: string;
이름: string;
규격: string;
단위: string;
값: unknown;
관급: boolean;
}
export const fetchProcurement = (q: string): Promise<{ total: number; items: ProcureItem[] }> =>
get("/procurement", { q, limit: 50 });
export const fetchPick = (
kind: PickKind,
q: string,
): Promise<{ total: number; items: PickItem[] }> => get("/pick", { kind, q, limit: 50 });