Compare commits
12 Commits
0f32f8e7e7
...
Main
| Author | SHA1 | Date | |
|---|---|---|---|
| 4dd68e2c98 | |||
| 7622ed2793 | |||
| a8f14e8c76 | |||
| 4bb2692ad0 | |||
| 7d184d2e97 | |||
| a510f34f71 | |||
| 6790991471 | |||
| aca94d175c | |||
| fd49c71910 | |||
| 7477a803e9 | |||
| 0c052abfa7 | |||
| 62b25b045b |
@@ -7,5 +7,5 @@ matching.db
|
||||
csv
|
||||
*.png
|
||||
*.xlsx
|
||||
*.txt
|
||||
gitea-api.txt
|
||||
data
|
||||
|
||||
6
.gitignore
vendored
6
.gitignore
vendored
@@ -17,3 +17,9 @@ Thumbs.db
|
||||
|
||||
# Local scratch
|
||||
*.tmp
|
||||
|
||||
# SQLite runtime files / local recovery backups
|
||||
*.db-wal
|
||||
*.db-shm
|
||||
*.db.bak-*
|
||||
db-backups/
|
||||
|
||||
27
Dockerfile
27
Dockerfile
@@ -2,18 +2,33 @@ FROM python:3.12-slim
|
||||
|
||||
ENV PYTHONDONTWRITEBYTECODE=1 \
|
||||
PYTHONUNBUFFERED=1 \
|
||||
PORT=8090
|
||||
PORT=8091 \
|
||||
CHROME_PATH=/usr/bin/chromium
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
chromium \
|
||||
fonts-noto-cjk \
|
||||
nodejs \
|
||||
npm \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
COPY requirements.txt ./
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
|
||||
COPY app.py index.html detail-view.html detail-view-project.html ./
|
||||
RUN npm install --omit=dev playwright-core
|
||||
|
||||
# matching.db는 볼륨으로 마운트해서 데이터 보존
|
||||
VOLUME ["/app/data"]
|
||||
COPY mysql_preview_server.py \
|
||||
index.html \
|
||||
detail-view.html \
|
||||
detail-view-project.html \
|
||||
mysql-preview.html \
|
||||
people-unified.html \
|
||||
project-codes.html \
|
||||
./
|
||||
|
||||
EXPOSE 8090
|
||||
EXPOSE 8091 8092
|
||||
|
||||
CMD ["sh", "-c", "ln -sf /app/data/matching.db /app/matching.db 2>/dev/null || true; python3 app.py"]
|
||||
CMD ["python3", "mysql_preview_server.py"]
|
||||
|
||||
241
README.md
Normal file
241
README.md
Normal file
@@ -0,0 +1,241 @@
|
||||
# 장헌산업 업무 데이터 조회 시스템
|
||||
|
||||
이 저장소는 장헌산업 내부 업무 데이터를 조회하고, ERP 정보와 매칭해서 웹 화면으로 보여주는 사내용 도구입니다.
|
||||
|
||||
주요 목적은 아래 2가지입니다.
|
||||
|
||||
- `8091` 페이지: 사람별/프로젝트별 근무 데이터 조회
|
||||
- `8092` 페이지: 시공 코드, 계약정보, 공사개요, 연계코드 조회
|
||||
|
||||
|
||||
## 구성 개요
|
||||
|
||||
이 프로젝트는 Python 기반의 간단한 웹 서버와 SQLite DB(`matching.db`)를 사용합니다.
|
||||
|
||||
- 웹 서버: `mysql_preview_server.py`
|
||||
- 공용 DB: `matching.db`
|
||||
- 메인 대시보드 화면: `index.html`
|
||||
- 사람별 근무 화면: `people-unified.html`
|
||||
- 시공 코드 조회 화면: `project-codes.html`
|
||||
|
||||
같은 저장소 안에서 여러 HTML 화면을 제공하지만, 데이터는 공통으로 `matching.db`를 사용합니다.
|
||||
|
||||
|
||||
## 페이지 설명
|
||||
|
||||
### `8091` 메인/근무 데이터 페이지
|
||||
|
||||
`8091` 포트는 근무 데이터와 집계 화면용입니다.
|
||||
|
||||
포함 내용:
|
||||
|
||||
- 프로젝트별 투입시간 집계
|
||||
- 사람별 근무내역 조회
|
||||
- 월별/기간별 프로젝트 투입 현황
|
||||
- 사업관리 작업일보 기반 추가 공수 데이터 조회
|
||||
|
||||
관련 화면:
|
||||
|
||||
- `index.html`: 메인 대시보드
|
||||
- `people-unified.html`: 사람별 / 프로젝트별 근무내역
|
||||
- `detail-view.html`, `detail-view-project.html`: 상세 보기
|
||||
|
||||
|
||||
### `8092` 시공 코드 조회 페이지
|
||||
|
||||
`8092` 포트는 ERP 시공 코드 전용 조회 화면입니다.
|
||||
|
||||
포함 내용:
|
||||
|
||||
- 시공코드 목록
|
||||
- 계약정보
|
||||
- 공사개요
|
||||
- 교량 매칭 정보
|
||||
- 공사시행계획서 기반 교량제원
|
||||
- 연계코드 표시
|
||||
|
||||
연계코드는 아래 형식으로 표시됩니다.
|
||||
|
||||
- `영업/설계 약칭(코드번호)`가 아니라
|
||||
- 현재는 `약칭(코드번호) · 약칭(코드번호)` 형식
|
||||
|
||||
예시:
|
||||
|
||||
- `새만금~전주간 고속도로 건설고사(제4공구) [8차](25-교영-09)`
|
||||
- `새만금~전주간 고속도로 건설고사(제4공구) [8차](25-설계-05)`
|
||||
|
||||
관련 화면:
|
||||
|
||||
- `project-codes.html`
|
||||
|
||||
|
||||
## 데이터 소스
|
||||
|
||||
이 시스템은 여러 데이터 소스를 함께 사용합니다.
|
||||
|
||||
### 1. SQLite 캐시 DB
|
||||
|
||||
- 파일: `matching.db`
|
||||
- 저장소에 포함되어 있음
|
||||
- 클론한 사람도 같은 시점의 데이터를 바로 볼 수 있음
|
||||
|
||||
주요 저장 내용:
|
||||
|
||||
- 직원 정보
|
||||
- `dailyproject` 근무 데이터
|
||||
- 프로젝트 약칭
|
||||
- ERP 시공 코드 캐시
|
||||
- ERP 계약정보 캐시
|
||||
- ERP 교량 개요 캐시
|
||||
- ERP 공사시행계획서 캐시
|
||||
- 영업/설계/시공 연계코드 캐시
|
||||
|
||||
|
||||
### 2. MySQL 원본 데이터
|
||||
|
||||
사내 MySQL에서 근무 데이터를 읽어와 SQLite로 적재합니다.
|
||||
|
||||
관련 환경값:
|
||||
|
||||
- `MYSQL_HOST`
|
||||
- `MYSQL_PORT`
|
||||
- `MYSQL_USER`
|
||||
- `MYSQL_PASSWORD`
|
||||
- `MYSQL_DB`
|
||||
|
||||
|
||||
### 3. ERP 데이터
|
||||
|
||||
ERP에서 아래 정보를 가져옵니다.
|
||||
|
||||
- 프로젝트 약칭
|
||||
- 시공 코드 목록
|
||||
- 계약정보
|
||||
- 공사관리 / 공사개요
|
||||
- 공사시행계획서
|
||||
- 영업/설계/시공 연계코드
|
||||
|
||||
관련 기본 URL:
|
||||
|
||||
- `http://erp.jangheon.co.kr/projt_mng`
|
||||
|
||||
|
||||
## DB 관련 중요 사항
|
||||
|
||||
이 저장소는 **코드만이 아니라 `matching.db`도 함께 관리**합니다.
|
||||
|
||||
이유:
|
||||
|
||||
- 클론한 사람이 바로 같은 데이터를 볼 수 있어야 함
|
||||
- 내부 페이지가 DB 캐시를 전제로 동작함
|
||||
- ERP/MySQL 접속 없이도 기본 조회가 가능해야 함
|
||||
|
||||
즉, 이 저장소에서는 `matching.db`도 실제 배포/공유 자산입니다.
|
||||
|
||||
다만 아래 파일은 운영 중 자동 생성될 수 있습니다.
|
||||
|
||||
- `matching.db-wal`
|
||||
- `matching.db-shm`
|
||||
- `matching.db.bak-*`
|
||||
|
||||
이 파일들은 보조 파일/백업 파일이며, 기본 공유 대상은 `matching.db`입니다.
|
||||
|
||||
|
||||
## 연계코드 저장 방식
|
||||
|
||||
시공코드 페이지의 연계코드는 DB에도 저장됩니다.
|
||||
|
||||
관련 테이블:
|
||||
|
||||
- `project_alias`
|
||||
- `erp_project_alias_cache`
|
||||
- `erp_linked_code_cache`
|
||||
|
||||
예를 들어 시공코드 하나에 대해 아래 정보를 저장합니다.
|
||||
|
||||
- 시공코드
|
||||
- 사업코드
|
||||
- 연관 영업코드
|
||||
- 연관 영업 약칭
|
||||
- 연관 설계코드
|
||||
- 연관 설계 약칭
|
||||
|
||||
그래서 나중에 아래와 같은 질문에 바로 답할 수 있습니다.
|
||||
|
||||
- “이 시공코드의 연관 영업코드는 뭐야?”
|
||||
- “이 설계코드 약칭이 뭐야?”
|
||||
|
||||
|
||||
## 실행 방법
|
||||
|
||||
### 로컬 실행
|
||||
|
||||
Python 서버 실행:
|
||||
|
||||
```bash
|
||||
python3 mysql_preview_server.py
|
||||
```
|
||||
|
||||
기본 포트:
|
||||
|
||||
- `8091`: 메인/근무 데이터
|
||||
- `8092`: 시공 코드 조회
|
||||
|
||||
|
||||
### Docker 실행
|
||||
|
||||
이미지/컨테이너는 `docker-compose.yml`과 `Dockerfile`로 실행할 수 있습니다.
|
||||
|
||||
관련 문서:
|
||||
|
||||
- `DEPLOY_DOCKER.md`
|
||||
|
||||
|
||||
## 주요 파일 설명
|
||||
|
||||
- `mysql_preview_server.py`: 현재 실제 기능 대부분이 들어있는 메인 서버
|
||||
- `app.py`: 이전/보조 서버 코드
|
||||
- `index.html`: 8091 메인 대시보드
|
||||
- `people-unified.html`: 사람별/프로젝트별 근무 조회
|
||||
- `project-codes.html`: 8092 시공 코드 전용 화면
|
||||
- `matching.db`: 공용 SQLite 데이터베이스
|
||||
- `docker-compose.yml`: Docker 배포 설정
|
||||
- `DEPLOY_DOCKER.md`: Docker 배포 방법
|
||||
|
||||
|
||||
## 사용 흐름
|
||||
|
||||
### 근무 데이터 흐름
|
||||
|
||||
1. MySQL 원본 데이터를 읽음
|
||||
2. SQLite `matching.db`에 적재
|
||||
3. `8091` 페이지에서 집계/상세 조회
|
||||
|
||||
|
||||
### 시공 코드 데이터 흐름
|
||||
|
||||
1. ERP에서 시공코드 목록 조회
|
||||
2. ERP 계약정보 / 공사개요 / 공사시행계획서 조회
|
||||
3. 영업/설계/시공 연계코드와 약칭 매칭
|
||||
4. SQLite `matching.db`에 캐시 저장
|
||||
5. `8092` 페이지에서 빠르게 조회
|
||||
|
||||
|
||||
## 운영 시 주의사항
|
||||
|
||||
- `matching.db`는 실제 운영 데이터가 들어 있으므로 함부로 초기화하면 안 됩니다.
|
||||
- ERP 재조회 버튼을 누르면 캐시가 갱신될 수 있습니다.
|
||||
- 운영 중에는 DB 파일이 변경될 수 있어 `matching.db-wal`, `matching.db-shm`가 생길 수 있습니다.
|
||||
- 다른 사람이 같은 결과를 보려면 저장소의 `matching.db`도 함께 최신 상태여야 합니다.
|
||||
|
||||
|
||||
## 권장 공유 방식
|
||||
|
||||
다른 사람이 이 저장소를 받아서 바로 확인하려면:
|
||||
|
||||
1. 저장소를 클론
|
||||
2. `matching.db`가 포함되어 있는지 확인
|
||||
3. 서버 실행
|
||||
4. `8091`, `8092` 페이지 접속
|
||||
|
||||
이렇게 하면 ERP를 다시 긁지 않아도 커밋 시점 기준의 데이터를 바로 볼 수 있습니다.
|
||||
@@ -1,13 +1,12 @@
|
||||
version: "3.9"
|
||||
|
||||
services:
|
||||
manhour-dashboard:
|
||||
jh-people-8091:
|
||||
build: .
|
||||
container_name: manhour-dashboard
|
||||
container_name: jh-people-8091
|
||||
ports:
|
||||
- "8090:8090"
|
||||
- "8091:8091"
|
||||
environment:
|
||||
PORT: "8090"
|
||||
PORT: "8091"
|
||||
STARTUP_MAINTENANCE: "0"
|
||||
MYSQL_HOST: "${MYSQL_HOST:-172.16.42.111}"
|
||||
MYSQL_PORT: "${MYSQL_PORT:-3306}"
|
||||
MYSQL_USER: "${MYSQL_USER:-root}"
|
||||
@@ -20,5 +19,30 @@ services:
|
||||
INTRANET_LOGIN_ID: "${INTRANET_LOGIN_ID:-G25001}"
|
||||
INTRANET_LOGIN_PW: "${INTRANET_LOGIN_PW:-00000}"
|
||||
volumes:
|
||||
- ./data:/app/data
|
||||
- ./matching.db:/app/matching.db
|
||||
restart: unless-stopped
|
||||
|
||||
jh-project-8092:
|
||||
build: .
|
||||
container_name: jh-project-8092
|
||||
ports:
|
||||
- "8092:8092"
|
||||
environment:
|
||||
PORT: "8092"
|
||||
STARTUP_MAINTENANCE: "0"
|
||||
MYSQL_HOST: "${MYSQL_HOST:-172.16.42.111}"
|
||||
MYSQL_PORT: "${MYSQL_PORT:-3306}"
|
||||
MYSQL_USER: "${MYSQL_USER:-root}"
|
||||
MYSQL_PASSWORD: "${MYSQL_PASSWORD:-hanmacerp!}"
|
||||
MYSQL_DB: "${MYSQL_DB:-jangheon_manhour}"
|
||||
ERP_BASE_URL: "${ERP_BASE_URL:-http://erp.jangheon.co.kr/projt_mng}"
|
||||
ERP_LOGIN_ID: "${ERP_LOGIN_ID:-g25001}"
|
||||
ERP_LOGIN_PW: "${ERP_LOGIN_PW:-00000}"
|
||||
INTRANET_BASE_URL: "${INTRANET_BASE_URL:-http://erp.jangheon.co.kr/intranet/}"
|
||||
INTRANET_LOGIN_ID: "${INTRANET_LOGIN_ID:-G25001}"
|
||||
INTRANET_LOGIN_PW: "${INTRANET_LOGIN_PW:-00000}"
|
||||
volumes:
|
||||
- ./matching.db:/app/matching.db
|
||||
depends_on:
|
||||
- jh-people-8091
|
||||
restart: unless-stopped
|
||||
|
||||
BIN
matching.db
BIN
matching.db
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user