- 목록 = 이름 · 규격 · 구분 · 가격 · 손료계수 · 주연료 · 조종원 · 시간당 경비(서버 값) · 별칭 · 비고 (단위 · 출처 열 없음 · 가로 넘침 없음) · 다른 요소 표 그대로 - 상세 = 기계 양식 + 원문번호 · 원문 · 구분 · 상세구분 · 별칭 · 비고 · 쓰는 곳 · 지우기(쓰는 곳 보이고 확인) · 주소 ?machine= 로 바로 열림 · 뒤로 가기 = 목록 · 저장 안 한 고침 나가기 경고 - 고침 = 초안 → 페이지 [저장](자동저장 없음) · 서버 M01_MasterData_Machine.fix = 품셈 입력이 바뀌면 계수 짝으로 다시 셈 · 단위 · 출처 칸 채움(새 칸 = 마스터 단위 · 「자체」) - API /api/m01/machine/lists · hourly · uses · find · row (시스템 관리자만) · 시험 test_821_2_machine_save.py Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
58 lines
2.1 KiB
TypeScript
58 lines
2.1 KiB
TypeScript
/* =============================================================================
|
|
* M01_MasterData_Machine_Api.ts
|
|
* M01 기계 화면 서버 호출(PLAN 821-2) — 양식 목록 · 시간당 경비 · 쓰는 곳 · 비슷한 기계 찾기 · 한 줄.
|
|
* 서버 = `M01_MasterData_Machine.py` · 시스템 관리자만.
|
|
* ========================================================================== */
|
|
|
|
import { API_BASE_URL } from "@config/config_frontend";
|
|
import type { MachinePick } from "@ui/ui_template_machine_form";
|
|
import type { Row } from "./M01_MasterData_Api_Fetch";
|
|
|
|
export interface MachineLists {
|
|
fuels: MachinePick[];
|
|
jobs: MachinePick[];
|
|
power: number;
|
|
hour: number;
|
|
books: string[];
|
|
/** 구분 → 원문 */
|
|
groups: Record<string, string>;
|
|
}
|
|
|
|
export interface MachineHourly {
|
|
노무비?: number;
|
|
재료비?: number;
|
|
경비?: number;
|
|
계?: number;
|
|
reason?: string;
|
|
}
|
|
|
|
async function get<T>(path: string, params: Record<string, string> = {}): Promise<T> {
|
|
const query = new URLSearchParams(params);
|
|
const res = await fetch(`${API_BASE_URL}/m01/machine${path}?${query}`, {
|
|
credentials: "include",
|
|
});
|
|
const body = (await res.json()) as T & { detail?: unknown };
|
|
if (!res.ok) throw new Error(String(body.detail ?? `HTTP ${res.status}`));
|
|
return body;
|
|
}
|
|
|
|
let lists: Promise<MachineLists> | null = null;
|
|
/** 한 번 받아 둠(페이지 다시 그리면 다시 받음) */
|
|
export const fetchMachineLists = (fresh = false): Promise<MachineLists> => {
|
|
if (!lists || fresh)
|
|
lists = get<MachineLists>("/lists").catch((e) => ((lists = null), Promise.reject(e)));
|
|
return lists;
|
|
};
|
|
|
|
export const fetchMachineHourly = (keys: string[]): Promise<Record<string, MachineHourly>> =>
|
|
keys.length ? get("/hourly", { keys: keys.join(",") }) : Promise.resolve({});
|
|
|
|
export const fetchMachineUses = async (key: string): Promise<string[]> =>
|
|
(await get<{ uses: string[] }>("/uses", { key })).uses;
|
|
|
|
export const findMachines = async (q: string): Promise<Row[]> =>
|
|
(await get<{ rows: Row[] }>("/find", { q })).rows;
|
|
|
|
export const fetchMachineRow = (key: string): Promise<{ version: string; row: Row }> =>
|
|
get("/row", { key });
|