Upload data-logic.md regarding data processing structure
This commit is contained in:
184
waste/data-logic.md
Normal file
184
waste/data-logic.md
Normal file
@@ -0,0 +1,184 @@
|
||||
# 폐수/대기 운영일지 데이터 인식·적용 구조 정리
|
||||
|
||||
대상 파일: `waste/wastewater.html`
|
||||
|
||||
## 1) 핵심 저장소(메모리/브라우저)
|
||||
|
||||
- `formData`: 모든 입력값 원본 저장
|
||||
- `fieldMeta`: 각 입력칸의 라벨/탭 정보 저장
|
||||
- `datedFormSnapshots`: 날짜별 폼 스냅샷 저장
|
||||
- `dailyMeterHistory`: 수질 3번 항목 집계값 저장(일별/월별 계산용)
|
||||
- `savedDocs`: 저장된 PDF 메타(날짜, 탭, 파일명 등)
|
||||
|
||||
로컬 저장:
|
||||
- `saveToStorage()`가 `localStorage`에 `formData`, `fieldMeta`, `datedFormSnapshots`, `dailyMeterHistory`, `savedDocs`를 저장
|
||||
- `loadFromStorage()`가 복구
|
||||
|
||||
---
|
||||
|
||||
## 2) 표의 값을 “어떤 칸인지” 인식하는 방식
|
||||
|
||||
### 2-1. 일반 표 입력칸
|
||||
|
||||
- `makeTableCellsEditable()`에서 빈 `td`를 입력칸(`input`/`textarea`)으로 변환
|
||||
- 각 칸마다 `nextField('cell')`로 고유 키 생성
|
||||
- `inferCellLabel(td)`가 칸 라벨을 자동 생성:
|
||||
- `섹션 제목 / 행 제목 / 열 제목`
|
||||
- 이 라벨이 나중에 값 매핑 기준이 됨
|
||||
|
||||
### 2-2. 날짜/기본정보 라인 입력
|
||||
|
||||
- `makeLineInputsEditable()`에서 `.input-line`을 입력칸으로 변환
|
||||
- `inferLineLabel()`로 `기본정보 / 년·월·일·요일·날씨·저온·고온` 라벨 부여
|
||||
|
||||
### 2-3. 1,2번 시간대 체크표
|
||||
|
||||
- `setupToggleGridCells()`에서 시간칸을 `toggle-cell`로 초기화
|
||||
- 클릭 2번으로 구간 선택:
|
||||
- 첫 클릭: 시작점
|
||||
- 둘째 클릭: 범위 적용
|
||||
- 같은 시작/끝 구간을 다시 선택하면 삭제(토글)
|
||||
- 값은 `formData[field] = count` 형태로 누적 저장
|
||||
|
||||
---
|
||||
|
||||
## 3) 입력값이 데이터로 들어가는 시점
|
||||
|
||||
실시간 입력:
|
||||
- `bindTextInput()`에서 입력 이벤트마다 `formData[field]` 갱신
|
||||
- 즉시 `saveToStorage()` 호출
|
||||
|
||||
집계값 확정:
|
||||
- **`saveDocument()` 실행 시점**에만 수질 집계 확정
|
||||
- `tabId === 'water-tab'`이면 `commitCurrentDateMeterHistory(dateKey)` 실행
|
||||
- 즉, 데이터(계산) 표는 저장 문서(PDF)와 동기화된 값만 신뢰하도록 설계됨
|
||||
|
||||
---
|
||||
|
||||
## 4) 수질 3번 표(용수/폐수) 값 추출 규칙
|
||||
|
||||
### 4-1. 공통 파싱 기준
|
||||
|
||||
- `parseCalcLabel(meta.label)`이 `3. 용수 공급원별 사용량과 폐수배출량` 라벨만 파싱
|
||||
- `item`(행 항목), `col`(전일/금일/사용량)을 분리
|
||||
|
||||
### 4-2. 용수/폐수 분류
|
||||
|
||||
- `collectCurrentWaterMeters()`
|
||||
- 폐수 키워드: `폐수발생량, 폐수배출량, 냉각수량, 소모, 재사용량, 생활용수량`
|
||||
- 키워드에 해당하면 폐수 맵(`wasteTodayMap`, `wasteDailyMap`)
|
||||
- 아니면 용수 맵(`usageTodayMap`, `usageDailyMap`)
|
||||
|
||||
### 4-3. 위치 기반 정확 추출(우선)
|
||||
|
||||
- `collectCurrentWasteTripletExactMap()`
|
||||
- 우측 표 각 행에서 `전일/금일/배출량및사용량` 3칸을 직접 읽음
|
||||
- `collectCurrentWasteDailyExactMap()`
|
||||
- 우측 표의 `배출량 및 사용량(㎥/일)` 값만 항목별로 추출
|
||||
|
||||
### 4-4. 보조 추출(백업)
|
||||
|
||||
- `collectCurrentWasteRowTriplet(keyword)`
|
||||
- `collectCurrentWasteOccurrenceTriplet()`
|
||||
- 위치기반 읽기 실패 시 `fieldMeta.label` + `formData`로 보완
|
||||
|
||||
---
|
||||
|
||||
## 5) 특수 계산 규칙(반영된 내용)
|
||||
|
||||
- 슬러지 발생량:
|
||||
- `collectCurrentSludgeAmount()`
|
||||
- **4번 표 `슬러지발생량` 두 줄(여러 줄) 값을 합산**해서 `sludgeDaily` 저장
|
||||
|
||||
- 폐수발생량(일량):
|
||||
- 우측 `폐수발생량` 행의 `배출량 및 사용량(㎥/일)` 값을 우선 사용
|
||||
|
||||
- 용수 합계(계):
|
||||
- `collectCurrentUsageTotalTriplet()`에서 3번 표 좌측 `계` 행 `전일/금일/사용량` 직접 추출
|
||||
- 데이터(계산) 표의 전일/금일/사용량은 이 값을 최우선 반영
|
||||
|
||||
---
|
||||
|
||||
## 6) 날짜 전환 시 자동 이월(전일 → 금일)
|
||||
|
||||
- `onWorkDateChange(dateKey)`에서 날짜 변경 처리
|
||||
- `applyPrevDayTodayToCurrentPrev(dateKey)` 규칙:
|
||||
- 전날 수질 PDF가 저장된 경우에만 이월
|
||||
- 전날 `금일 지침` 값이 **빈칸이면 이월 안 함**
|
||||
- 현재칸에 이미 값이 있으면 덮어쓰지 않음
|
||||
- 같은 항목의 `todayField -> prevField` 매핑은 `getWaterPrevTodayFieldPairs()`로 결정
|
||||
|
||||
---
|
||||
|
||||
## 7) 데이터(계산) 탭 반영 흐름
|
||||
|
||||
- `renderCalcByDateTable()`에서 `dailyMeterHistory`를 날짜순 정렬해 렌더
|
||||
- 단, `savedDocs`에 수질 PDF가 있는 날짜만 표시
|
||||
- 일별/월별 모두 합계·평균 행 계산
|
||||
- 필터(일별 범위/월별 범위)는 화면 렌더 시 적용
|
||||
|
||||
---
|
||||
|
||||
## 8) “저장해야 데이터에 남는” 정책
|
||||
|
||||
- 현재 날짜에서 입력만 하고 저장하지 않으면:
|
||||
- `formData`, `datedFormSnapshots`에는 있을 수 있음
|
||||
- 하지만 `dailyMeterHistory` 확정은 `saveDocument()`(수질 탭) 시점
|
||||
- `reconcileDailyHistoryWithSavedDocs()`가
|
||||
- 수질 PDF 없는 날짜의 집계 데이터를 정리
|
||||
- 데이터(계산)와 데이터(pdf)의 날짜 정합성 유지
|
||||
|
||||
---
|
||||
|
||||
## 9) 삭제/초기화 시 동작
|
||||
|
||||
- `deleteSelectedDateData()`
|
||||
- 선택 날짜의 `datedFormSnapshots`, `dailyMeterHistory` 삭제
|
||||
- 현재 날짜라면 화면도 즉시 비움
|
||||
- 이후 전일지침 자동이월 재적용
|
||||
- PDF 삭제 시:
|
||||
- 해당 날짜가 수질 PDF 기준에서 빠지면 집계 표시도 함께 정리됨
|
||||
|
||||
---
|
||||
|
||||
## 10) 요약
|
||||
|
||||
이 프로그램은
|
||||
- 입력칸마다 자동 라벨을 만들어(`fieldMeta`)
|
||||
- 원본 입력값(`formData`)을 날짜 스냅샷으로 보관하고
|
||||
- 수질 3번/4번의 규칙값만 저장 시점에 집계(`dailyMeterHistory`)한 뒤
|
||||
- 저장된 수질 PDF 날짜 기준으로 데이터 표를 보여주는 구조입니다.
|
||||
|
||||
---
|
||||
|
||||
## 11) 이미지 기반 교정 히스토리(요약)
|
||||
|
||||
이번 개발에서 가장 큰 기준은 텍스트 설명보다 **사용자가 올려준 캡처 이미지**였습니다.
|
||||
개발 흐름은 아래처럼 진행됐습니다.
|
||||
|
||||
1. 사용자가 “원본과 다른 부분”을 이미지로 표시해 주면,
|
||||
2. 해당 영역의 표 구조/정렬/입력 위치를 먼저 맞추고,
|
||||
3. 같은 영역의 데이터 매핑 규칙까지 함께 보정했습니다.
|
||||
|
||||
결과적으로 다음 방향으로 고도화되었습니다.
|
||||
|
||||
- 레이아웃 교정: 페이지 수, 인쇄 결과, 표 높이/폭, 헤더/대각선/경계선 정리
|
||||
- 입력 방식 교정: 체크칸/선형 구간/멀티라인 입력, 날짜 자동 반영, 스탬프 위치
|
||||
- 데이터 교정: 전일/금일/일량 매핑, 저장된 날짜만 집계, 오입력·오매핑 방지
|
||||
|
||||
즉, 이 문서는 “코드가 먼저”가 아니라,
|
||||
**이미지 피드백으로 위치를 고정하고 → 코드가 그 위치를 따르도록 바꾼 기록**입니다.
|
||||
|
||||
---
|
||||
|
||||
## 12) 최종 정리
|
||||
|
||||
사용자 피드백은 대부분 “이 위치가 다르다”, “이 값이 다르게 들어간다”는 형태였고,
|
||||
교정은 항상 아래 순서로 처리했습니다.
|
||||
|
||||
1. 이미지 기준으로 화면 위치를 맞춤
|
||||
2. 해당 위치의 데이터 읽기/저장 규칙을 맞춤
|
||||
3. 인쇄/PDF/데이터 탭에서 같은 결과가 나오도록 동기화
|
||||
|
||||
그래서 현재 구조는
|
||||
`양식 위치 정합성 + 데이터 매핑 정합성 + 저장 정책 정합성`을 동시에 만족하도록 설계되어 있습니다.
|
||||
Reference in New Issue
Block a user