diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md index 692565bf..8a4ff0c1 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md @@ -34,6 +34,7 @@ | 25 설정키 전수와 식템플릿 | **설정 사슬 닫기** — `PRJLST.SMT` 키 241종, 간접비 식 26개 | (저장소 파일) | | 26 편집기와 사이클식 | **`Cm` 54꼴·품셈 인자·식 편집기·낙찰율** — 계약/실행/기성 단계 발견 | (저장소 파일) | | 27 계약·실행·기성 단계 | **설계 뒤 네 단계** — 낙찰율 3갈래, 기성은 계약제잡비율, 실행 차액보정 | (저장소 파일) | +| 28 변환·수량산출·식언어 | **식 변수의 대상/저장 비목** · 수량산출서 셀별명 · 조달청 변환 · 직종 106종 | (저장소 파일) | > **정본은 저장소 파일이다** — `resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/`. > 위 Orca 링크는 보기용이며, 문서를 지식DB 자리로 옮기면서 주소가 한 번 바뀌었다. @@ -117,6 +118,12 @@ | 기성 간접비 | 몰랐음 | **금회직접공사비 × 계약제잡비율** — 설계와 다름 | 27번 §3.1 | | 부가세 축 | 단계 무관 | ⚠ **단계마다 선택지가 다름** | 27번 §3.3 | | 실행예산 | 서식명만 | **중기 실행단가 + 차액 보정 순서** | 27번 §4 | +| 식 변수 | 참조·조건까지 | **변수 선언에 「대상비목·저장비목·%」** | 28번 §1 | +| `Q`식 목록 | 10꼴 관측 | ⚠ **사용자가 등록·수정** — 고정 목록 아님 | 28번 §1.1 | +| 수량산출 | `QCODE` 빈 표 | **수량산출서 별도 파일 + 셀별명 변수** | 28번 §2 | +| 조달청 호환 | 몰랐음 | **`Conv_Jodal_ST8`·`Conv_ST8_XML` 양방향** | 28번 §3 | +| 노임 직종 | 코드만 | **직종 사전 106종** 평문 | 28번 §3.1 | +| 암호화 파일 | 2개 | ⚠ **3개** — `EQSYNC.DBF` 추가 | 28번 §5 | 분석일: 2026-09-13 대상: `C:\경영정보(주)` diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/28_변환_수량산출_식언어.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/28_변환_수량산출_식언어.md new file mode 100644 index 00000000..b03e3a97 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/28_변환_수량산출_식언어.md @@ -0,0 +1,171 @@ +# 변환·수량산출·식 언어 — 남은 모듈 훑기 + +점검일: 2026-09-13 +대상: `ST_U_Convert` · `STmateQty8` · `ST_EdSan` · `EQSYNC.DBF` +재현 스크립트: `40_스크립트/module_string_probe.py` + +## 1. ⭐ 식 언어의 변수 선언 — 「대상」과 「저장」 + +`ST_EdSan.CPM`(단가산출 편집기)의 화면 문자열에서 식 언어의 핵심이 드러난다. + +```text +특수코드(&PA01&) / 변수 ------------- + 금액변수 대상:M, 저장:S, %】 + 소계변수 대상:M, 저장:L, %】 + 금액변수 대상:M, 저장:S 】 + 소계변수 대상:M, 저장:L 】 + 금액변수로 지정 】 + 소계변수로 지정 】 + 금액을 계산후 제외처리】 +``` + +⇒ 변수를 선언할 때 **세 가지를 함께 지정**한다. + +| 항목 | 뜻 | +|---|---| +| **대상** | 어느 비목에서 값을 **가져올지** (`M` 재료 · `L` 노무 · `S` 경비) | +| **저장** | 어느 비목에 **넣을지** | +| **%** | 비율 적용 여부 | + +23번 §2에서 본 `&X00006L&`(중기 X코드의 노무 성분)이 **참조**라면, 이것은 **중간 변수 선언**이다. `DP_Common`의 `GET_VARI_VAL`·`SET_VARI_VAL`(24번 §2.1)이 이 변수를 다룬다. + +`금액변수`(단일 금액)와 `소계변수`(누적 소계)가 갈리고, **`금액을 계산후 제외처리`** 는 계산은 하되 합계에서 빼는 자리다. + +**재구현 필수** — 단가 식은 「숫자 계산」이 아니라 **비목 사이의 값 이동**이다. 변수마다 `(대상비목, 저장비목, 비율여부)`를 함께 저장해야 한다. + +### 1.1 중기공식은 사용자가 등록한다 + +```text +수정된 중기공식을 저장하시겠습니까? 선택된 중기공식을 삭제하시겠습니까? +신규공식 추가 새로운 중기공식을 추가하시겠습니까? 공식+코드 +``` + +⇒ 23번 §3의 **`Q`식 10꼴은 고정 목록이 아니라 사용자가 늘릴 수 있는 등록부**다. 하드코딩이 더 확실히 금지된다. + +## 2. `STmateQty8.CPM` — 수량산출서와 수량변수 + +```text +기본수량변수 ↔ 확장수량변수(셀별명) + 확장수량변수 읽어오기 실패 + 셀참조 에러가 있는 수량변수(셀별명)를 포함하고 + 기본수량변수값을 확장수량변수값으로 할당 + 방금 저장된 수량산출서의 확장수량변수의 값으로 +전송될 기본수량 변수 * +단가산출에 수량변수를 전송하려면.. +수량산출서 파일 저장하기 / 불러오기 + 수량산출서로 저장하려는 파일이 손상되었거나 … 호환되지 않는 파일형식 +``` + +⇒ **수량산출서가 별도 파일**이고, 그 안의 **셀에 별명(변수)을 붙여** 단가산출로 전송한다. + +| 갈래 | 뜻 | +|---|---| +| **기본수량변수** | 내역에 바로 붙는 수량 | +| **확장수량변수(셀별명)** | 엑셀 셀을 가리키는 이름 — 산출 과정의 중간값 | + +`내역코드`·`내역수량`·`내역단위`가 함께 나오므로 **수량산출서 → 내역**이 코드로 이어진다. + +⚠ 표본 STC의 `QCODE.DBF`는 모두 비어 있다(02번). **수량산출서를 쓰지 않은 프로젝트**라 그렇고, 기능은 실재한다. + +Aislo의 B08 수량 산출과 직접 겹치는 자리다. + +## 3. `ST_U_Convert.CPM` — 조달청·XML 양방향 변환 + +export 20개가 변환 경로를 그린다. + +```text +Conv_Jodal_ST8 ↔ Conv_ST8_Jodal 조달청 ↔ ST8 +Conv_ST8_XML ↔ Conv_XML_ST8 ST8 ↔ XML +Conv_BOQ · Conv_Equip 내역·장비 변환 +MK_K_FLD · CHK_K_FLD · MK_ADD_K_REP 호환규정 필드 생성·검사 +MK_SET_REP · Appn_Tag_REP 보고서 서식·태그 +ST_ConvToWin8 · ST_BlankWin8 구버전 → Win8판 +ST_Conv_Mode1/2/3 · ST_Conv_Data · ST_Copy_Data +``` + +⇒ **납품 호환 경로가 프로그램 안에 있다.** `호환규정코드`가 `wM_Mrg_BSC`의 매칭 키 1순위였던 것(20번 §2)과 이어진다. + +XML **스키마는 문자열로 안 남는다** — 실행 중에 조립한다. 태그 이름을 정적으로는 못 얻는다. + +### 3.1 노임 직종 사전 106종 + +같은 모듈에 **직종 목록이 통째로** 들어 있다. + +```text +보통인부 · 특별인부 · 조력공 · 비계공 · 특수비계공 · 형틀목공 · 철근공 +용접공(일반/철도) · 콘크리트공 · 보링공(지질조사) · 조적공 · 치장벽돌공 +창호공 · 샷시공 · 창호목공 · 함석공 · 덕트공 · 노즐공 · 인력운반공 +건설기계운전기사 · 건설기계운전사 · 화물차운전사 · 일반기계운전사 +건설기계조장 · 건설기계운전조수 · 중기운전사 · 중기조장 · 중기운전조수 +기계공 · 기계설비공 · 기계설치공 +준설선기관장 · 준설선기관사 · 준설선전기사 · 고급선원 · 보통선원 · 선장 · 선부 · 갱부 +플랜트 계열 7 (배관·제관·특별인부·케이블전공·계장·덕트·보온) +원자력 계열 8 (배관·제관·특별인부·케이블전공·계장·덕트·보온·비파괴시험) +품질관리원 3등급 · 시험관련 기사/산업기사/기능사 · 조림인부 … +``` + +⇒ **`CONLD`·`COND_`의 직종 코드(`L00007`·`L00008`·`L00010`…)가 가리키는 이름표**다(18번 §2.1, 20번 §2.5). 노임 환산식을 어느 직종에 걸지 고를 때 쓰는 목록이다. + +공종 계열 문자열도 함께 있다 — `토공 · 배수공 · 구조물공 · 포장공 · 조경공 · 부대공 · 기타공`, 그리고 집계 레벨 `총합계 · 총대계 · 광역계 · 광역총계 · 광역대계`(26번 §5의 `+=` 레벨과 짝). + +## 4. 식 문법 오류 메시지 — 규칙이 드러난다 + +```text +번째줄에 수량코드 문법오류입니다 +번째줄에 단가코드 앞,뒤에 거듭제(곱) … +번째줄에 그림코드는 1개이상 사용 … +… 는 등록된 수량코드가 아닙니다. +… 코드에서 입력된 강제금액을 " +… 코드는 항목집계되지 않았습니다. +변수를 코드로 변환 +중기비사용료의 코드를 B코드("B00…")로 … +… 코드는 실적단가 사용으로 … +연결코드 계산오류 · 계산코드 집계를 위한 파일을 열지 못했습니다. +해당코드의 [비목별/군별단가]를 확인/입력하십시오 +``` + +드러나는 규칙. + +| 규칙 | 근거 | +|---|---| +| 식은 **줄 단위**로 검사된다 | `번째줄에 … 문법오류` | +| **단가코드에 거듭제곱을 붙일 수 있다** | `단가코드 앞,뒤에 거듭제…` | +| **그림코드는 호표당 1개 이상** 제약 | `그림코드는 1개이상 사용` | +| **강제금액**을 코드에 직접 넣을 수 있다 | `입력된 강제금액을` | +| **항목집계에서 빠지는 코드**가 있다 | `항목집계되지 않았습니다` | +| 단가는 **비목별·군별**로 나뉜다 | `[비목별/군별단가]` | + +## 5. `EQSYNC.DBF` — 세 번째 암호화 파일 + +```text +EQSYNC.DBF 54행 × 3열 (2.9 KB) + NAME(C40) · SYNC(M10 메모) · INS_X(L1) + 본문 난독화 — 읽히지 않음 +``` + +`ST_EdSan.CPM`의 `Edit_EQ_SYNC` 가 다루며 **중기(장비) 동기화 표**로 보인다. `EQSYNC.SMT`가 짝으로 있다. + +⇒ **암호화 목록이 셋으로 늘었다** — `BDQTY.DBF` · `SYSINFO.DBF` · **`EQSYNC.DBF`**. 앞 둘은 STC 안, 이것은 설치 폴더에 있다. + +## 6. 이번 점검이 바꾸는 것 + +| 항목 | 이전 | 지금 | +|---|---|---| +| 식 언어 | 참조·사칙·조건까지 | ✅ **변수 선언에 「대상비목·저장비목·%」** | +| `Q`식 목록 | 10꼴 관측 | ⚠ **사용자가 등록·수정·삭제** — 고정 목록 아님 | +| 수량산출 | `QCODE` 빈 표로만 | ✅ **수량산출서 별도 파일 + 셀별명 변수** | +| 조달청 호환 | 몰랐음 | ✅ **`Conv_Jodal_ST8`·`Conv_ST8_XML` 양방향** | +| 노임 직종 | 코드만 | ✅ **직종 사전 106종** | +| 식 문법 | 몰랐음 | ✅ 줄 단위 검사·거듭제곱·강제금액·집계제외 | +| 암호화 파일 | 2개 | ⚠ **3개** — `EQSYNC.DBF` 추가 | + +## 7. 남은 것 + +| 무엇 | 상태 | +|---|---| +| XML 스키마 태그 | 실행 중 조립 — 정적으로 못 얻음 | +| `EQSYNC` 내용 | 암호화 | +| 수량산출서 파일 형식 | 표본 0건 (`QCODE` 전부 빈 표) | +| 조달청 변환 결과물 | 표본 0건 | + +⇒ **설치 폴더·프로젝트 파일·출력물에서 얻을 수 있는 것은 사실상 다 얻었다.** 남은 넷은 전부 **표본 부재** 또는 **암호화**다. diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/module_string_probe.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/module_string_probe.py new file mode 100644 index 00000000..5e59affe --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/module_string_probe.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- +"""모듈 한글 문자열 훑기 — 사전·오류메시지에서 규칙을 캔다.""" +import sys, io, re, pathlib +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") +R=pathlib.Path(r"C:\경영정보(주)\System") +for n in sys.argv[1:] or ["ST_U_Convert.CPM","STmateQty8.CPM","ST_EdSan.CPM"]: + b=next(R.rglob(n)).read_bytes(); ko=[] + for m in re.finditer(rb"[\xb0-\xc8][\xa1-\xfe](?:[\x20-\x7e\xa1-\xfe]){1,44}", b): + try: s=m.group().decode("cp949").strip() + except Exception: continue + if sum(1 for c in s if 0xAC00<=ord(c)<=0xD7A3)>=2 and s not in ko: ko.append(s) + print("\n### %s — 한글 문자열 %d개" % (n, len(ko))) + for s in ko: print(" %s" % s[:76]) diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md index f99a521e..76536cf9 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md @@ -66,6 +66,7 @@ | 25 | **설정키 전수와 식템플릿** — 저장키 241종, 간접비 식 26개, 설정 사슬 닫힘 | | 26 | **편집기와 사이클식** — `Cm` 54꼴, 품셈 인자, 식 편집기, 낙찰율 | | 27 | **계약·실행·기성 단계** — 설계 뒤 네 단계의 계산 구조 | +| 28 | **변환·수량산출·식언어** — 식 변수 대상/저장, 조달청 변환, 직종 106종 | ## 확정된 굵직한 것