Files
issue-sample/waste/data-logic.md

6.9 KiB

폐수/대기 운영일지 데이터 인식·적용 구조 정리

대상 파일: waste/wastewater.html

1) 핵심 저장소(메모리/브라우저)

  • formData: 모든 입력값 원본 저장
  • fieldMeta: 각 입력칸의 라벨/탭 정보 저장
  • datedFormSnapshots: 날짜별 폼 스냅샷 저장
  • dailyMeterHistory: 수질 3번 항목 집계값 저장(일별/월별 계산용)
  • savedDocs: 저장된 PDF 메타(날짜, 탭, 파일명 등)

로컬 저장:

  • saveToStorage()localStorageformData, 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/데이터 탭에서 같은 결과가 나오도록 동기화

그래서 현재 구조는
양식 위치 정합성 + 데이터 매핑 정합성 + 저장 정책 정합성을 동시에 만족하도록 설계되어 있습니다.