6.9 KiB
6.9 KiB
폐수/대기 운영일지 데이터 인식·적용 구조 정리
대상 파일: 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) 이미지 기반 교정 히스토리(요약)
이번 개발에서 가장 큰 기준은 텍스트 설명보다 사용자가 올려준 캡처 이미지였습니다.
개발 흐름은 아래처럼 진행됐습니다.
- 사용자가 “원본과 다른 부분”을 이미지로 표시해 주면,
- 해당 영역의 표 구조/정렬/입력 위치를 먼저 맞추고,
- 같은 영역의 데이터 매핑 규칙까지 함께 보정했습니다.
결과적으로 다음 방향으로 고도화되었습니다.
- 레이아웃 교정: 페이지 수, 인쇄 결과, 표 높이/폭, 헤더/대각선/경계선 정리
- 입력 방식 교정: 체크칸/선형 구간/멀티라인 입력, 날짜 자동 반영, 스탬프 위치
- 데이터 교정: 전일/금일/일량 매핑, 저장된 날짜만 집계, 오입력·오매핑 방지
즉, 이 문서는 “코드가 먼저”가 아니라,
이미지 피드백으로 위치를 고정하고 → 코드가 그 위치를 따르도록 바꾼 기록입니다.
12) 최종 정리
사용자 피드백은 대부분 “이 위치가 다르다”, “이 값이 다르게 들어간다”는 형태였고,
교정은 항상 아래 순서로 처리했습니다.
- 이미지 기준으로 화면 위치를 맞춤
- 해당 위치의 데이터 읽기/저장 규칙을 맞춤
- 인쇄/PDF/데이터 탭에서 같은 결과가 나오도록 동기화
그래서 현재 구조는
양식 위치 정합성 + 데이터 매핑 정합성 + 저장 정책 정합성을 동시에 만족하도록 설계되어 있습니다.