2025-07-08 16:49:34 +09:00
|
|
|
# **[생산] 패킹 삭제 프로그램**
|
2025-07-08 15:23:18 +09:00
|
|
|
|
2025-07-08 16:49:34 +09:00
|
|
|
## 1. 프로그램 개요
|
|
|
|
|
|
|
|
| 항목 | 내용 |
|
|
|
|
| ---------- | ---------------------------------------------------------------- |
|
|
|
|
| **프로그램 명** | `PackingDeleteProgram` |
|
|
|
|
| **실행 파일 명** | `PackingDeleteProgram.exe` |
|
|
|
|
| **설치 위치** | 4층 포장 구역 컴퓨터 |
|
|
|
|
| **용도** | 바코드(시리얼번호/패킹코드) 또는 전표코드 입력을 통한 패킹 조회 및 삭제 처리<br/>DB에서 패킹 구성품 정보를 조회하여 필요시 패킹 데이터 및 전표 데이터 삭제<br/>실제 DELETE가 아닌 논리적 삭제(UPDATE) 방식 사용 |
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
## 2. 프로그램 UI
|
|
|
|
|
2025-07-08 16:59:31 +09:00
|
|
|
| 메인 화면 |
|
|
|
|
| ------------------------ |
|
|
|
|
|  |
|
2025-07-08 16:49:34 +09:00
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
## 3. 기능 요약
|
|
|
|
|
|
|
|
| 기능 | 설명 |
|
|
|
|
| ---------------------------- | ----------------------------------------------------------------------------- |
|
|
|
|
| **바코드 자동 인식 조회** | 바코드 스캔 시 3초 대기 후 자동으로 DB 조회 실행, 입력 변화 감지를 통한 자동화 처리 |
|
|
|
|
| **패킹 정보 조회** | 입력된 패킹코드를 기준으로 2개 테이블 조인하여 패킹 구성품 및 주문 정보 조회 |
|
|
|
|
| **구성품 목록 표시** | DataGridView에 구성품명, 수량, 시리얼번호를 표시하여 삭제 전 확인 가능 |
|
|
|
|
| **선택적 삭제 처리** | 체크박스 설정에 따라 전표 데이터만 삭제하거나 패킹+전표 데이터 함께 삭제 가능 |
|
|
|
|
| **삭제 로그 기록** | 삭제 시 시리얼번호를 note 필드에 기록하여 추적 가능하도록 처리 |
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
## 4. 사용자 조작 흐름
|
|
|
|
|
|
|
|
```
|
|
|
|
[사용자 입력]
|
|
|
|
↓ ① 바코드 스캔 또는 수동 입력 (PackingCode)
|
|
|
|
[txbPacking_TextChanged → SetInputCnt → timer_barcode]
|
|
|
|
↓ 3초 대기 후 자동 실행
|
|
|
|
[btnReadDB_Click]
|
|
|
|
↓
|
|
|
|
[db_select(serial) → SQL 조인 쿼리 실행]
|
|
|
|
↓
|
|
|
|
[item_out() → 구성품 정보 추출]
|
|
|
|
↓ ② 구성품 리스트 표시
|
|
|
|
[dgv_pack_item에 데이터 로드]
|
|
|
|
↓
|
|
|
|
[사용자 삭제 옵션 선택]
|
|
|
|
↓ ③ 삭제 버튼 클릭
|
|
|
|
[btn_delete_Click]
|
|
|
|
↓ 체크박스 상태에 따라 분기
|
|
|
|
├ 전표만 삭제 → state_delete()
|
|
|
|
└ 패킹+전표 삭제 → pack_delete() + state_delete()
|
|
|
|
↓
|
|
|
|
[UPDATE 쿼리 실행 → 논리적 삭제 처리]
|
|
|
|
|
|
|
|
**데이터 흐름**
|
|
|
|
[바코드 입력] → [패킹 조회] → [구성품 확인] → [선택적 삭제] → [로그 기록]
|
|
|
|
```
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
## 5. 데이터베이스 구조
|
|
|
|
|
|
|
|
### 조회 대상 테이블 (로컬 DB)
|
|
|
|
|
|
|
|
| 테이블명 | 용도 | 주요 컬럼 |
|
|
|
|
| --- | --- | --- |
|
|
|
|
| `jomtTesterDB.jomtSalesPackingTbl` | 패킹 구성품 정보 | PackingCode, Data, Main_Product_SN, 각 구성품 수량 및 시리얼 |
|
|
|
|
| `jomtOrderDB.jomtOrderTbl` | 주문/전표 정보 | Order_Code, Orderer_Name, Phone_Number, Invoice_Number, Packing_Code |
|
|
|
|
|
|
|
|
### 삭제 처리 방식
|
|
|
|
|
|
|
|
| 삭제 유형 | 대상 테이블 | 처리 방법 |
|
|
|
|
| --- | --- | --- |
|
|
|
|
| **패킹 데이터 삭제** | `jomtTesterDB.jomtSalesPackingTbl` | PackingCode를 'null_코드'로 변경, 시리얼 필드들 NULL 처리 |
|
|
|
|
| **전표 데이터 삭제** | `jomtOrderDB.jomtOrderTbl` | Invoice_Number, Packing_Code, Serial_Number 등 NULL 처리 |
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
## 6. 구성품 매핑 테이블
|
|
|
|
|
|
|
|
### 구성품 코드별 제품명 매핑
|
|
|
|
|
|
|
|
| 인덱스 | 구성품명 | 비고 |
|
|
|
|
| --- | --- | --- |
|
|
|
|
| 0 | DUALSONIC Pro 1Set (KR) / DUALSONIC Lux 1Set (KR) | 시리얼 앞자리 "10" 여부로 분기 |
|
|
|
|
| 1 | DUALSONIC Elixir MASK 5EA | - |
|
|
|
|
| 2 | DUALSONIC Elixir MASK 10EA | - |
|
|
|
|
| 3 | [사은품] 벨크로헤어밴드 | - |
|
|
|
|
| 4 | DUALSONIC Blooming Moisture Gel | - |
|
|
|
|
| 5 | DUALSONIC Blooming Moisture Gel(30ml * 5EA) | - |
|
|
|
|
| 6 | DUALSONIC Skin Cell Elixir Ampoule | - |
|
|
|
|
| 7 | DUALSONIC Skin Cell Elixir Cream | - |
|
|
|
|
| 8 | [사은품] 우산 | - |
|
|
|
|
| 9 | [사은품] 손풍기 | - |
|
|
|
|
| 10 | 충전기 Assy | - |
|
|
|
|
| 11 | 마이크로 충전 케이블 | - |
|
|
|
|
| 12 | DUALSONIC Skin Elixir Toner | - |
|
|
|
|
| 13 | DUALSONIC 가죽 케이스 세트 | - |
|
|
|
|
| 14 | DUALSONIC DUST BAG 1BOX | - |
|
|
|
|
| 15 | 사용자 정의 품목 | bag_type 값 사용 |
|
|
|
|
| 16 | 사용자 정의 품목 | etc_name 값 사용 |
|
|
|
|
| 17 | DUALSONIC Pro FACE CARTRIDGE | - |
|
|
|
|
| 18 | DUALSONIC Pro Eye CARTRIDGE | - |
|
|
|
|
| 19 | DUALSONIC Pro Body Cartridge 1Set Rev.0 (KR) | - |
|
|
|
|
| 20 | DUALSONIC Lux FACE CARTRIDGE | - |
|
|
|
|
| 21 | DUALSONIC Lux Eye CARTRIDGE | - |
|
|
|
|
| 22 | DUALSONIC Lux Body Cartridge 1Set Rev.0 (KR) | - |
|
|
|
|
| 23 | MAXIMUM FULL PACK (KR) | - |
|
|
|
|
| 24 | Alpha Set (KR) | - |
|
|
|
|
| 25 | Alpha FACE CARTRIDGE | - |
|
|
|
|
| 26 | Alpha Eye CARTRIDGE | - |
|
|
|
|
| 27 | Alpha Body CARTRIDGE | - |
|
|
|
|
| 28 | Alto PACK (KR) | - |
|
|
|
|
| 29 | Effect PACK (KR) | - |
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
## 7. 주요 SQL 쿼리
|
|
|
|
|
|
|
|
### 패킹 조회 쿼리
|
|
|
|
|
|
|
|
```sql
|
|
|
|
SELECT
|
|
|
|
IFNULL(sale.PackingCode,'NULL') as PackingCode,
|
|
|
|
IFNULL(sale.Data,'NULL') as PackingDate,
|
|
|
|
IFNULL(sale.Main_Product_SN,'NULL') as MainProductSN,
|
|
|
|
IFNULL(sale.Set_Cnt,'0') as SetCount,
|
|
|
|
IFNULL(sale.Pro_Face_Serial,'NULL') as ProFaceSerial,
|
|
|
|
IFNULL(sale.Pro_Eye_Serial,'NULL') as ProEyeSerial,
|
|
|
|
IFNULL(otb.Order_Code,'NULL') as OrderCode,
|
|
|
|
IFNULL(otb.Orderer_Name,'NULL') as OrdererName,
|
|
|
|
IFNULL(otb.Phone_Number,'NULL') as PhoneNumber,
|
|
|
|
IFNULL(otb.Invoice_Number,'NULL') as InvoiceNumber
|
|
|
|
FROM jomtTesterDB.jomtSalesPackingTbl AS sale
|
|
|
|
LEFT JOIN jomtOrderDB.jomtOrderTbl AS otb
|
|
|
|
ON sale.PackingCode = otb.Packing_Code
|
|
|
|
WHERE sale.PackingCode = '입력된패킹코드'
|
|
|
|
GROUP BY sale.PackingCode
|
|
|
|
```
|
|
|
|
|
|
|
|
### 패킹 데이터 삭제 쿼리
|
|
|
|
|
|
|
|
```sql
|
|
|
|
UPDATE jomtTesterDB.jomtSalesPackingTbl
|
|
|
|
SET
|
|
|
|
PackingCode = 'null_[기존패킹코드]',
|
|
|
|
Main_Product_SN = NULL,
|
|
|
|
Main_FACE_SN = NULL,
|
|
|
|
Main_EYE_SN = NULL,
|
|
|
|
Pro_Face_Serial = NULL,
|
|
|
|
Pro_Eye_Serial = NULL,
|
|
|
|
Pro_Body_Serial = NULL,
|
|
|
|
note = '[삭제된시리얼번호들]'
|
|
|
|
WHERE PackingCode = '[패킹코드]'
|
|
|
|
```
|
|
|
|
|
|
|
|
### 전표 데이터 삭제 쿼리
|
|
|
|
|
|
|
|
```sql
|
|
|
|
UPDATE jomtOrderDB.jomtOrderTbl
|
|
|
|
SET
|
|
|
|
Invoice_Number = NULL,
|
|
|
|
Packing_Code = NULL,
|
|
|
|
Serial_Number = NULL,
|
|
|
|
Buy_Type = NULL,
|
|
|
|
release_state = NULL,
|
|
|
|
note = '[삭제된시리얼번호들]'
|
|
|
|
WHERE Order_Code = '[주문코드]'
|
|
|
|
```
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
## 8. 사용법
|
|
|
|
|
|
|
|
### 기본 조회 과정
|
|
|
|
|
|
|
|
1. **바코드 스캔 모드 설정**: `ckb_barcode` 체크박스 활성화
|
|
|
|
2. **패킹코드 입력**: `txbPacking`에 바코드 스캔 또는 수동 입력
|
|
|
|
3. **자동 조회**: 3초 대기 후 자동으로 DB 조회 실행
|
|
|
|
4. **구성품 확인**: `dgv_pack_item`에 표시된 구성품 목록 확인
|
|
|
|
|
|
|
|
### 삭제 처리 과정
|
|
|
|
|
|
|
|
1. **삭제 옵션 선택**:
|
|
|
|
- `ckb_state` 체크: 전표 데이터만 삭제
|
|
|
|
- `ckb_state` 해제: 패킹 + 전표 데이터 모두 삭제
|
|
|
|
2. **삭제 실행**: `btn_delete` 버튼 클릭
|
|
|
|
3. **확인**: 삭제 완료 메시지 확인
|
|
|
|
|
|
|
|
### 주의사항
|
|
|
|
|
|
|
|
- 삭제는 실제 DELETE가 아닌 논리적 삭제(UPDATE) 방식
|
|
|
|
- 삭제된 데이터는 `note` 필드에 시리얼번호 기록으로 추적 가능
|
|
|
|
- 패킹코드는 `null_[기존코드]` 형태로 변경되어 무효화
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
## 📎 기타 참고 자료 (sequenceDiagram)
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
sequenceDiagram
|
|
|
|
participant 사용자
|
|
|
|
participant UI
|
|
|
|
participant 시스템
|
|
|
|
participant 패킹DB
|
|
|
|
participant 주문DB
|
|
|
|
|
|
|
|
사용자->>UI: ① 바코드 스캔/입력
|
|
|
|
UI->>시스템: txbPacking_TextChanged()
|
|
|
|
시스템->>시스템: SetInputCnt() → timer 시작
|
|
|
|
|
|
|
|
Note over 시스템: 3초 대기
|
|
|
|
|
|
|
|
시스템->>시스템: timer_barcode_Tick()
|
|
|
|
시스템->>시스템: btnReadDB_Click()
|
|
|
|
시스템->>시스템: db_select(PackingCode)
|
|
|
|
|
|
|
|
시스템->>패킹DB: LEFT JOIN 쿼리 실행
|
|
|
|
패킹DB->>주문DB: 패킹코드 기준 조인
|
|
|
|
주문DB-->>시스템: 조합된 데이터 반환
|
|
|
|
|
|
|
|
시스템->>시스템: item_out() 구성품 추출
|
|
|
|
시스템->>UI: dgv_pack_item에 구성품 표시
|
|
|
|
UI-->>사용자: ② 구성품 목록 출력
|
|
|
|
|
|
|
|
사용자->>UI: ③ 삭제 옵션 선택
|
|
|
|
사용자->>UI: 삭제 버튼 클릭
|
|
|
|
UI->>시스템: btn_delete_Click()
|
|
|
|
|
|
|
|
alt 전표만 삭제
|
|
|
|
시스템->>주문DB: state_delete() UPDATE 쿼리
|
|
|
|
주문DB-->>시스템: 전표 데이터 NULL 처리
|
|
|
|
else 패킹+전표 삭제
|
|
|
|
시스템->>패킹DB: pack_delete() UPDATE 쿼리
|
|
|
|
패킹DB-->>시스템: 패킹 데이터 무효화
|
|
|
|
시스템->>주문DB: state_delete() UPDATE 쿼리
|
|
|
|
주문DB-->>시스템: 전표 데이터 NULL 처리
|
|
|
|
end
|
|
|
|
|
|
|
|
시스템->>UI: 삭제 완료 메시지
|
|
|
|
UI-->>사용자: 처리 결과 표시
|
|
|
|
```
|