- 읽기 view(Master.value) = 인력 · 잡품 목록 → 식이 읽는 조종원 수 · 직종 · 잡재료율(옛 꼴 = 그대로) - 목록이 식 한 줄로 안 풀리면 row_entry 바탕 덮음 · 단가산출 기계덮음은 merge 로 부분별 위에(짝 TS) - M02_Machine_Hourly.hourly · brief · M02_MyMachine.hourly = 문서 엔진(doc_sums) · 식 문서 없는 식만 옛 로직 엔진 - pick · _operated · why · logic_key · 호표 기계 고름 · 불러오기 기계 수 = 인력 줄로 - 내 기계 clean = 인력 · 잡품 목록 받음(옛 칸 = from_old) · M01 fix · check_master = 목록 꼴 검사 - 사본 자동 따라옴 = 옛 꼴 사본 줄 대 새 꼴 M01 줄은 새 꼴로 바꿔 대조(덮음 안 지움) - 시험 836_1 몸 검사: 조종원 빈 키 = 식 입력 직종으로 받음 → 틀림 꼴을 「키 없음」으로 고침 - 전후: 655 대 로직 엔진 = 문서 엔진 611 같음 · 다름 0 · 코드만 바꾼 뒤 655 대 hourly · brief · 문서 셈 전후 같음 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
81 lines
3.9 KiB
TypeScript
81 lines
3.9 KiB
TypeScript
/* =============================================================================
|
|
* common_util_machine_crew.ts
|
|
* 기계 한 대 인력 줄 · 잡품 줄(PLAN 842-3 · 요구 849 · 853 · 867 · 868 · 870) — 기계 줄 값 칸 꼴 · 읽는 법
|
|
* 꼴(기계 줄 `값`) — 인력 = [{키: 'LB:<인력 원문번호>'(빈 글 = 직종 고르기), 인, 이름?}] ·
|
|
* 잡품 = [{줄: '주연료' | '전력' | 키: 재료 요소 키, 이름?, 수량?, 율 %}] · 옛 칸(조종원 · 조종원직종 · 잡재료율) 없음
|
|
* 읽기(`crewView`) = 식이 읽는 조종원 수(인 합) · 직종(첫 직종) · 잡재료율(첫 줄 율)을 목록에서 셈(저장 안 함) · 옛 꼴 = 그대로
|
|
* 옛 꼴 → 새 꼴(`fromOld`)
|
|
* 파이썬 · TS 짝 — 짝 = resources/master_data/scripts/master_machine_crew.py · 거울 시험 test_842_3_machine_crew.py
|
|
* · 화면 · DOM · fetch 없음
|
|
* ========================================================================== */
|
|
|
|
import type { CrewRow, MiscRow } from "./common_util_formula_doc_cover";
|
|
|
|
export const CREW = "인력";
|
|
export const MISC = "잡품";
|
|
export const LISTS = [CREW, MISC];
|
|
export const OLD = ["조종원", "조종원직종", "잡재료율"];
|
|
/** 잡품 줄 기본 = 이 재료 줄(값 > 0) */
|
|
export const BASE = ["주연료", "전력"];
|
|
|
|
type Vals = Record<string, unknown>;
|
|
const isNum = (v: unknown): v is number => typeof v === "number" && Number.isFinite(v);
|
|
|
|
/** 노임 키 → 인력 원문번호(`LB:1048` → 1048 · 빈 글 = 직종 고르기) */
|
|
export const code = (key: unknown): string => {
|
|
const t = String(key ?? "");
|
|
return t.startsWith("LB:") ? t.slice(3) : t;
|
|
};
|
|
|
|
/** 새 꼴(옛 칸 없음) 기계 값 */
|
|
export const isNew = (vals: unknown): boolean =>
|
|
!!vals &&
|
|
typeof vals === "object" &&
|
|
!Array.isArray(vals) &&
|
|
!OLD.some((k) => k in (vals as Vals));
|
|
|
|
export const crewOf = (vals: Vals | undefined): CrewRow[] | undefined =>
|
|
Array.isArray(vals?.[CREW]) ? (vals[CREW] as CrewRow[]) : undefined;
|
|
export const miscOf = (vals: Vals | undefined): MiscRow[] | undefined =>
|
|
Array.isArray(vals?.[MISC]) ? (vals[MISC] as MiscRow[]) : undefined;
|
|
|
|
/** 식이 읽는 값 — 새 꼴이면 옛 칸 셋을 목록에서 셈해 더한 새 묶음 · 그 밖 = 그대로 */
|
|
export function crewView(vals: Vals): Vals {
|
|
if (!isNew(vals)) return vals;
|
|
const crew = crewOf(vals);
|
|
const misc = miscOf(vals);
|
|
const jobs = (crew ?? []).map((r) => code(r?.키)).filter((c) => c);
|
|
const rate = (misc ?? []).find((r) => r && r.줄)?.율;
|
|
return {
|
|
...vals,
|
|
조종원: crew === undefined ? null : crew.reduce((a, r) => a + (Number(r?.인) || 0), 0),
|
|
조종원직종: jobs.length ? jobs[0] : null,
|
|
잡재료율: misc === undefined ? null : (rate ?? 0),
|
|
};
|
|
}
|
|
|
|
/** 옛 꼴 값 → 새 꼴(옛 칸 셋 → 인력 · 잡품) — 옛 칸 없음 = 그대로 */
|
|
export function fromOld(vals: Vals, base?: string[]): Vals {
|
|
if (isNew(vals)) return vals;
|
|
const out: Vals = Object.fromEntries(Object.entries(vals).filter(([k]) => !OLD.includes(k)));
|
|
const n = vals.조종원;
|
|
const job = vals.조종원직종;
|
|
const rate = vals.잡재료율;
|
|
if (isNum(n)) out[CREW] = n > 0 ? [{ 키: job ? `LB:${String(job)}` : "", 인: n }] : [];
|
|
if (isNum(rate)) {
|
|
const b = base ?? BASE.filter((k) => Number(vals[k]) > 0);
|
|
out[MISC] = rate > 0 && b.length ? b.map((줄) => ({ 줄, 율: rate })) : [];
|
|
}
|
|
return out;
|
|
}
|
|
|
|
/** 목록 요약 글(M01 기계 목록 열) — 「1048 1인 · 잡품 주연료 22%」 */
|
|
export function crewSummary(vals: Vals | undefined, jobName?: (code: string) => string): string {
|
|
const crew = (crewOf(vals) ?? []).map((r) => {
|
|
const c = code(r.키);
|
|
return `${r.이름 || (c ? (jobName?.(c) ?? c) : "직종 고르기")} ${r.인}인`;
|
|
});
|
|
const misc = (miscOf(vals) ?? []).map((r) => `${r.이름 || r.줄 || r.키} ${r.율}%`);
|
|
return [...crew, ...(misc.length ? [`잡품 ${misc.join(", ")}`] : [])].join(" · ");
|
|
}
|