- docs/README.md: 프로젝트 개요, 기술 스택, 구조, 핵심 모듈 - docs/MODULES.md: 모듈별 상세 (견적, 출고, 수입검사, 작업, 전자결재) - docs/DATABASE.md: DB 스키마, 테이블 구조, 연결 설정 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
428 lines
9.3 KiB
Markdown
428 lines
9.3 KiB
Markdown
# 5130 데이터베이스 구조
|
|
|
|
## 데이터베이스 정보
|
|
|
|
| 항목 | 값 |
|
|
|------|-----|
|
|
| DB명 | chandj |
|
|
| 엔진 | MySQL 8.0 |
|
|
| 문자셋 | utf8mb4 |
|
|
|
|
---
|
|
|
|
## 주요 테이블 목록
|
|
|
|
### 핵심 업무 테이블
|
|
|
|
| 테이블 | 설명 | 비고 |
|
|
|--------|------|------|
|
|
| `output` | 출고/주문 | 메인 업무 테이블 |
|
|
| `estimate` | 견적 | 스크린/스라트 견적 |
|
|
| `instock` | 수입검사 | 자재 입고/검사 |
|
|
| `lot` | LOT 관리 | 재고 LOT |
|
|
|
|
### 전자결재 테이블
|
|
|
|
| 테이블 | 설명 | 비고 |
|
|
|--------|------|------|
|
|
| `eworks` | 전자결재 통합 | 품의서, 지출결의서, 연차 등 |
|
|
|
|
### 게시판 테이블
|
|
|
|
| 테이블 | 설명 | 비고 |
|
|
|--------|------|------|
|
|
| `notice` | 공지사항 | |
|
|
| `notice_ripple` | 공지 댓글 | |
|
|
| `qna` | 자료실 | |
|
|
| `rnd` | 개발일지 | |
|
|
|
|
### 회원/조직 테이블
|
|
|
|
| 테이블 | 설명 | 비고 |
|
|
|--------|------|------|
|
|
| `member` | 회원 정보 | 로그인 계정 |
|
|
|
|
### 자산 관리 테이블
|
|
|
|
| 테이블 | 설명 | 비고 |
|
|
|--------|------|------|
|
|
| `car` | 차량 정보 | 정비이력 JSON |
|
|
| `lift` | 지게차 정보 | 정비이력 JSON |
|
|
|
|
---
|
|
|
|
## 테이블 상세
|
|
|
|
### output (출고/주문)
|
|
|
|
```sql
|
|
CREATE TABLE output (
|
|
num INT AUTO_INCREMENT PRIMARY KEY,
|
|
|
|
-- 기본 정보
|
|
indate DATE, -- 접수일
|
|
outdate DATE, -- 출고예정일
|
|
outdonedate DATE, -- 출고완료일
|
|
|
|
-- 현장 정보
|
|
outworkplace VARCHAR(200), -- 현장명
|
|
outarea VARCHAR(100), -- 지역
|
|
|
|
-- 제품 정보
|
|
prodCode VARCHAR(50), -- 제품코드 (KS, KW 등)
|
|
|
|
-- 인정검사
|
|
ACIregDate DATE, -- 인정검사 요청일
|
|
ACIaskDate DATE, -- 인정검사 신청일
|
|
ACIdoneDate DATE, -- 인정검사 완료일
|
|
|
|
-- 배송
|
|
deliveryfeeList JSON, -- 배차/운송비 목록
|
|
|
|
-- 상태
|
|
is_deleted TINYINT DEFAULT 0, -- 삭제 여부
|
|
devMode TINYINT, -- 개발모드
|
|
|
|
-- 메타
|
|
created_at TIMESTAMP,
|
|
updated_at TIMESTAMP
|
|
);
|
|
```
|
|
|
|
### estimate (견적)
|
|
|
|
```sql
|
|
CREATE TABLE estimate (
|
|
num INT AUTO_INCREMENT PRIMARY KEY,
|
|
|
|
-- 견적 정보
|
|
estimate_date DATE, -- 견적일
|
|
customer VARCHAR(100), -- 고객명
|
|
project_name VARCHAR(200), -- 프로젝트명
|
|
|
|
-- 제품 정보
|
|
product_type VARCHAR(50), -- 제품유형 (screen, slat)
|
|
specifications JSON, -- 사양 정보
|
|
|
|
-- 금액
|
|
unit_price DECIMAL(15,2), -- 단가
|
|
total_amount DECIMAL(15,2), -- 총금액
|
|
|
|
-- 상태
|
|
is_deleted TINYINT DEFAULT 0,
|
|
|
|
-- 메타
|
|
created_at TIMESTAMP,
|
|
updated_at TIMESTAMP
|
|
);
|
|
```
|
|
|
|
### instock (수입검사)
|
|
|
|
```sql
|
|
CREATE TABLE instock (
|
|
num INT AUTO_INCREMENT PRIMARY KEY,
|
|
|
|
-- 검사 정보
|
|
inspection_date DATE, -- 검사일
|
|
item_name VARCHAR(200), -- 품명
|
|
supplier VARCHAR(100), -- 공급사
|
|
|
|
-- 검사 상세
|
|
specification TEXT, -- 규격
|
|
iList JSON, -- 검사 상세 항목
|
|
|
|
-- 판정
|
|
resultJudgement VARCHAR(20), -- 합격/불합격
|
|
|
|
-- 비고
|
|
remarks TEXT,
|
|
weight_kg DECIMAL(10,2), -- 중량
|
|
|
|
-- 상태
|
|
is_deleted TINYINT DEFAULT NULL,
|
|
|
|
-- 메타
|
|
created_at TIMESTAMP,
|
|
updated_at TIMESTAMP
|
|
);
|
|
```
|
|
|
|
### eworks (전자결재)
|
|
|
|
```sql
|
|
CREATE TABLE eworks (
|
|
num INT AUTO_INCREMENT PRIMARY KEY,
|
|
|
|
-- 문서 유형
|
|
eworks_item VARCHAR(50), -- 품의서, 지출결의서, 연차 등
|
|
al_company VARCHAR(20), -- 회사 (경동, 주일)
|
|
|
|
-- 기본 정보
|
|
indate DATE, -- 작성일
|
|
outworkplace VARCHAR(200), -- 제목/현장명
|
|
|
|
-- 금액 (품의서/지출결의서)
|
|
suppliercost VARCHAR(50), -- 금액
|
|
expense_data JSON, -- 지출 상세 (지출결의서)
|
|
|
|
-- 연차 정보
|
|
al_askdatefrom DATE, -- 연차 시작일
|
|
al_askdateto DATE, -- 연차 종료일
|
|
|
|
-- 결재 정보
|
|
status VARCHAR(20), -- 상태 (draft, pending, end)
|
|
e_line_id VARCHAR(200), -- 결재라인 ID
|
|
e_confirm TEXT, -- 결재 확인 정보
|
|
|
|
-- 상태
|
|
is_deleted TINYINT DEFAULT NULL,
|
|
|
|
-- 메타
|
|
created_at TIMESTAMP,
|
|
updated_at TIMESTAMP
|
|
);
|
|
```
|
|
|
|
### member (회원)
|
|
|
|
```sql
|
|
CREATE TABLE member (
|
|
num INT AUTO_INCREMENT PRIMARY KEY,
|
|
|
|
-- 계정 정보
|
|
userid VARCHAR(50) UNIQUE,
|
|
password VARCHAR(255),
|
|
name VARCHAR(50),
|
|
|
|
-- 조직 정보
|
|
company VARCHAR(50), -- 회사
|
|
department VARCHAR(50), -- 부서
|
|
position VARCHAR(50), -- 직급
|
|
|
|
-- 권한
|
|
level INT, -- 권한 레벨
|
|
eworks_lv INT, -- 결재 레벨
|
|
eworks_level INT, -- 결재 단계
|
|
authority VARCHAR(50), -- 특수 권한
|
|
|
|
-- 연락처
|
|
email VARCHAR(100),
|
|
phone VARCHAR(20),
|
|
|
|
-- 결재 설정
|
|
first_approval_id VARCHAR(50),
|
|
first_approval_name VARCHAR(50),
|
|
|
|
-- 상태
|
|
is_active TINYINT DEFAULT 1,
|
|
|
|
-- 메타
|
|
created_at TIMESTAMP,
|
|
updated_at TIMESTAMP
|
|
);
|
|
```
|
|
|
|
### notice (공지사항)
|
|
|
|
```sql
|
|
CREATE TABLE notice (
|
|
num INT AUTO_INCREMENT PRIMARY KEY,
|
|
|
|
-- 게시글 정보
|
|
subject VARCHAR(200), -- 제목
|
|
content TEXT, -- 내용
|
|
|
|
-- 공지 설정
|
|
noticecheck CHAR(1), -- 전체공지 여부 (y/n)
|
|
|
|
-- 작성자
|
|
name VARCHAR(50),
|
|
userid VARCHAR(50),
|
|
|
|
-- 조회
|
|
hit INT DEFAULT 0,
|
|
|
|
-- 날짜
|
|
regist_day DATETIME,
|
|
|
|
-- 파일
|
|
file_name VARCHAR(200),
|
|
file_path VARCHAR(500),
|
|
|
|
-- 상태
|
|
is_deleted TINYINT DEFAULT 0
|
|
);
|
|
```
|
|
|
|
### car (차량)
|
|
|
|
```sql
|
|
CREATE TABLE car (
|
|
num INT AUTO_INCREMENT PRIMARY KEY,
|
|
|
|
-- 차량 정보
|
|
vehicle_type VARCHAR(100), -- 차종
|
|
license_plate VARCHAR(20), -- 차량번호
|
|
purchase_date DATE, -- 구매일
|
|
|
|
-- 정비 이력 (JSON)
|
|
engine_oil_change_data JSON, -- 엔진오일 교환 이력
|
|
maintenance_data JSON, -- 정비 이력
|
|
|
|
-- 상태
|
|
is_deleted TINYINT DEFAULT 0,
|
|
|
|
-- 메타
|
|
created_at TIMESTAMP,
|
|
updated_at TIMESTAMP
|
|
);
|
|
|
|
-- JSON 구조 예시
|
|
-- engine_oil_change_data: [
|
|
-- {"engine_oil_change_date": "2024-01-15", "mileage": "50000"}
|
|
-- ]
|
|
-- maintenance_data: [
|
|
-- {"maintenance_date": "2024-02-20", "maintenance_record": "타이어 교체"}
|
|
-- ]
|
|
```
|
|
|
|
### lift (지게차)
|
|
|
|
```sql
|
|
-- car 테이블과 동일한 구조
|
|
CREATE TABLE lift (
|
|
num INT AUTO_INCREMENT PRIMARY KEY,
|
|
vehicle_type VARCHAR(100),
|
|
purchase_date DATE,
|
|
engine_oil_change_data JSON,
|
|
maintenance_data JSON,
|
|
is_deleted TINYINT DEFAULT 0,
|
|
created_at TIMESTAMP,
|
|
updated_at TIMESTAMP
|
|
);
|
|
```
|
|
|
|
---
|
|
|
|
## 공통 컬럼 패턴
|
|
|
|
### Soft Delete
|
|
|
|
대부분의 테이블에서 `is_deleted` 컬럼으로 소프트 삭제 구현:
|
|
|
|
```sql
|
|
-- 삭제되지 않은 레코드 조회
|
|
WHERE is_deleted IS NULL OR is_deleted = '0'
|
|
|
|
-- 삭제 처리
|
|
UPDATE table SET is_deleted = '1' WHERE num = ?
|
|
```
|
|
|
|
### 타임스탬프
|
|
|
|
```sql
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
|
```
|
|
|
|
### JSON 컬럼
|
|
|
|
복잡한 데이터 구조는 JSON 컬럼으로 저장:
|
|
|
|
```sql
|
|
-- 예: 배차 정보
|
|
deliveryfeeList JSON
|
|
-- 값: [{"col1": "업체명", "col5": "100000"}, ...]
|
|
|
|
-- 예: 검사 항목
|
|
iList JSON
|
|
-- 값: [{"inputItems": {"resultJudgement": "합격"}}, ...]
|
|
```
|
|
|
|
---
|
|
|
|
## 인덱스 권장 사항
|
|
|
|
### output 테이블
|
|
|
|
```sql
|
|
CREATE INDEX idx_output_indate ON output(indate);
|
|
CREATE INDEX idx_output_outdate ON output(outdate);
|
|
CREATE INDEX idx_output_is_deleted ON output(is_deleted);
|
|
CREATE INDEX idx_output_prodcode ON output(prodCode);
|
|
```
|
|
|
|
### eworks 테이블
|
|
|
|
```sql
|
|
CREATE INDEX idx_eworks_company ON eworks(al_company);
|
|
CREATE INDEX idx_eworks_item ON eworks(eworks_item);
|
|
CREATE INDEX idx_eworks_status ON eworks(status);
|
|
CREATE INDEX idx_eworks_indate ON eworks(indate);
|
|
CREATE INDEX idx_eworks_leave_dates ON eworks(al_askdatefrom, al_askdateto);
|
|
```
|
|
|
|
### instock 테이블
|
|
|
|
```sql
|
|
CREATE INDEX idx_instock_date ON instock(inspection_date);
|
|
CREATE INDEX idx_instock_deleted ON instock(is_deleted);
|
|
```
|
|
|
|
---
|
|
|
|
## 연결 설정
|
|
|
|
### PDO 연결 (lib/mydb.php)
|
|
|
|
```php
|
|
function db_connect(){
|
|
loadEnv();
|
|
|
|
$db_host = $_ENV['DB_HOST'] ?? 'localhost';
|
|
$db_name = $_ENV['DB_NAME'] ?? 'chandj';
|
|
$db_user = $_ENV['DB_USER'] ?? 'chandj';
|
|
$db_pass = $_ENV['DB_PASS'] ?? '';
|
|
|
|
$dsn = "mysql:host=".$db_host.";dbname=".$db_name.";charset=utf8mb4";
|
|
|
|
$options = [
|
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
|
PDO::ATTR_EMULATE_PREPARES => false
|
|
];
|
|
|
|
$pdo = new PDO($dsn, $db_user, $db_pass, $options);
|
|
return $pdo;
|
|
}
|
|
```
|
|
|
|
### 환경 변수 (.env)
|
|
|
|
```env
|
|
DB_HOST=localhost
|
|
DB_NAME=chandj
|
|
DB_USER=chandj
|
|
DB_PASS=your_password
|
|
```
|
|
|
|
---
|
|
|
|
## 백업 권장
|
|
|
|
### 일일 백업
|
|
|
|
```bash
|
|
mysqldump -u chandj -p chandj > backup_$(date +%Y%m%d).sql
|
|
```
|
|
|
|
### 주요 테이블 우선 백업
|
|
|
|
```bash
|
|
mysqldump -u chandj -p chandj output estimate instock eworks member > critical_backup.sql
|
|
```
|
|
|
|
---
|
|
|
|
*문서 작성일: 2025-12-13* |