Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
1bbc909
[ci] 이슈, PR, 지라 설정 파일 생성
rlatjddms Mar 6, 2026
cdfea93
[feat] #3 안드로이드 환경 설정
rlatjddms Mar 6, 2026
9421c27
[chore] #3 폴더 경로 변경
rlatjddms Mar 6, 2026
17657a4
[feat] #3 RetrofitClient 추가
rlatjddms Mar 6, 2026
cfb985e
[feat] #3 TokenManager 추가
rlatjddms Mar 6, 2026
1304a60
[feat] #3 ApiService 추가
rlatjddms Mar 6, 2026
4d77b42
[chore] #3 사용하지 않는 파일 삭제
rlatjddms Mar 6, 2026
d7dec7b
[feat] #3 로그인 dto 추가
rlatjddms Mar 6, 2026
2bffcc6
[feat] #3 LoginActivity 로그인 구현
rlatjddms Mar 6, 2026
dd5caaf
[feat] #3 LoginActivity 토큰 저장 및 권한 설정 구현
rlatjddms Mar 6, 2026
f6c5aaa
[feat] #3 UserRole enum 추가
rlatjddms Mar 6, 2026
7830faf
[feat] #3 LoginResponse에 UserRole추가
rlatjddms Mar 6, 2026
f8c0305
[feat] #3 로그아웃 구현
rlatjddms Mar 6, 2026
a46e9d3
[feat] #3 컬럼명 userRole로 수정
rlatjddms Mar 6, 2026
e53c3b7
[feat] #3 로그아웃을 위한 clearTokens 메서드 추가
rlatjddms Mar 6, 2026
c5f0430
[refactor] #3 로그아웃 시에 로그아웃 api 호출
rlatjddms Mar 6, 2026
d1d04ad
[feat] #3 ApiService에 로그아웃 api 추가
rlatjddms Mar 6, 2026
71d7600
[feat] #3 ResetPasswordRequest 추가
rlatjddms Mar 6, 2026
f019df1
[feat] #3 ApiService에 비밀번호 재설정과 토큰 재발급 api 추가
rlatjddms Mar 6, 2026
82658ee
[refactor] #3 reissue 자동화
rlatjddms Mar 6, 2026
adcd7ab
[refactor] #3 본사 계정은 비밀번호 재설정 불가
rlatjddms Mar 6, 2026
d924782
[feat] 안드로이드 로그인 기능 구현 및 JWT 인증 연동
rlatjddms Mar 9, 2026
941f58c
[feat] #5 안드로이드 스캔 api 연동
Yoocy0 Mar 12, 2026
9bc1046
[feat] #5 안드로이드 스캔 api 연동
Yoocy0 Mar 12, 2026
181f4be
[feat] #7 ã… 판매 스캔/ 목록 ì조회 및 판매 api 연동
Yoocy0 Mar 15, 2026
31e1250
[feat] #7 판매 api 연동
Yoocy0 Mar 15, 2026
4985c07
[docs] 안드로이드 README 작성
rlatjddms Mar 18, 2026
856c183
[fix] #7 스캔 후 목록 자동 반영 변경
Yoocy0 Mar 18, 2026
9cbec71
[fix] #7 스캔 후 목록 자동 반영 변경
Yoocy0 Mar 18, 2026
698f12a
[fix] #10 판ë판매 생성 dto ê전달 값 변경
Yoocy0 Mar 18, 2026
957fa78
[fix] #10 판매 생성 dto 전달 값 변경
Yoocy0 Mar 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .idea/deploymentTargetSelector.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

65 changes: 64 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,64 @@
# android
# 📱 CHAIN-G (Android)

<img width="300" alt="Gemini_Generated_Image_8j8ddp8j8ddp8j8d-Photoroom" src="https://github.com/user-attachments/assets/6f623ede-7a0d-4fcd-a74f-3bec56de2c63" />

> CONNECT GOOD, VALUE CHAIN
>
**CHAIN-G** Android 애플리케이션은 스마트 공급망 관리 시스템의 현장 업무를 지원하는 모바일 도구입니다.
공장 및 가맹점 관리자가 스마트폰을 이용해 제품 바코드를 스캔함으로써 실시간으로 재고를 처리하고 판매 내역을 기록할 수 있는 **스캔 중심의 현장 지원 앱**입니다.

<br>

## 🛠 기술 스택

| Category | Stack |
| :--- | :--- |
| **Language** | Java |
| **UI Components** | Google Material Design, XML |
| **Scanning** | Google ML Kit Barcode Scanning, CameraX |
| **Networking** | Retrofit2, GSON |
| **Development Tool** | Android Studio |

<br>

## 📂 프로젝트 구조

```bash
android/
├── app/
│ ├── src/main/
│ │ ├── java/com/example/chain_g/
│ │ │ ├── auth/ # 로그인 및 인증 로직
│ │ │ ├── common/ # 공통 유틸 및 상단 바
│ │ │ ├── BoxScanActivity.java # 박스 스캔 처리
│ │ │ ├── SaleScanActivity.java # 판매 스캔 처리
│ │ │ ├── FacManagerMainActivity.java # 공장 관리자 메인
│ │ │ └── FranManagerMainActivity.java # 가맹점 관리자 메인
│ │ └── res/ # XML 레이아웃 및 리소스
└── build.gradle # 프로젝트 수준 빌드 설정
```

<br>

## 🚀 주요 기능

- **실시간 바코드/QR 스캔**: Google ML Kit와 CameraX를 연동하여 빠르고 정확하게 제품/박스 코드를 인식합니다.
- **재고 입출고 정보 확인**: 스캔한 박스의 정보를 기반으로 상세 입고/출고 품목을 즉시 확인하고 수량을 체크합니다.
- **판매 등록 관리**: 가맹점에서 상품 판매 시 바코드 스캔을 통해 판매 데이터를 본사 시스템과 즉시 동기화합니다.
- **역할 기반 인터페이스**: 로그인한 사용자의 권한(공장/가맹점)에 따라 다른 메인 기능 탭과 서비스를 제공합니다.

<br>

## 🖥️ 주요 화면
- **로그인 및 실시간 바코드/QR 스캔**
<img width="200" alt="image" src="https://github.com/user-attachments/assets/a8d1522e-2d08-46e2-9ffc-6881725a0b0e" />

<br>

## 👥 팀 협업 규칙

### ⭐ 개발 규칙 및 컨벤션

- **Activity 및 Layout**: 기능별로 명확히 분리하며, 재사용 가능한 커스텀 뷰는 `common` 패키지에서 관리합니다.
- **API 연동**: Retrofit 인터페이스를 통해 백엔드 API 명세와 일치하도록 데이터 모델을 동기화합니다.
- **주석 준수**: 복잡한 스캔 로직이나 카메라 프리뷰 관련 코드는 주석을 통해 의도를 명시합니다.
4 changes: 4 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,8 @@ dependencies {

// ML Kit Barcode Scanning
implementation 'com.google.mlkit:barcode-scanning:17.2.0'

// 안드로이드에서 API 호출
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
}
10 changes: 8 additions & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@
xmlns:tools="http://schemas.android.com/tools">

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-feature android:name="android.hardware.camera" android:required="true" />

<application
android:allowBackup="true"
android:usesCleartextTraffic="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
Expand All @@ -17,6 +19,10 @@
<activity
android:name=".InDetailActivity"
android:exported="false" />
<activity
android:name=".FacInScanActivity"
android:exported="false" />

<activity
android:name=".SaleScanActivity"
android:exported="false" />
Expand All @@ -33,10 +39,10 @@
android:name=".FacManagerMainActivity"
android:exported="false" />
<activity
android:name=".FindAccountActivity"
android:name=".auth.activity.FindAccountActivity"
android:exported="false" />
<activity
android:name=".LoginActivity"
android:name=".auth.activity.LoginActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
Expand Down
12 changes: 10 additions & 2 deletions app/src/main/java/com/example/chain_g/BoxAdapter.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public class BoxAdapter extends RecyclerView.Adapter<BoxAdapter.ViewHolder> {
private OnItemClickListener listener;

public interface OnItemClickListener {
void onItemClick(String boxCode);
void onItemClick(BoxItem item);
}

public BoxAdapter(List<BoxItem> items, OnItemClickListener listener) {
Expand All @@ -36,7 +36,7 @@ public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.tvProductCode.setText(item.productCode);
holder.tvItemName.setText(item.itemName);

holder.itemView.setOnClickListener(v -> listener.onItemClick(item.boxCode));
holder.itemView.setOnClickListener(v -> listener.onItemClick(item));
}

@Override
Expand All @@ -59,11 +59,19 @@ public static class BoxItem {
String boxCode;
String productCode;
String itemName;
Long orderItemId;

public BoxItem(String boxCode, String productCode, String itemName) {
this.boxCode = boxCode;
this.productCode = productCode;
this.itemName = itemName;
}

public BoxItem(String boxCode, String productCode, String itemName, Long orderItemId) {
this.boxCode = boxCode;
this.productCode = productCode;
this.itemName = itemName;
this.orderItemId = orderItemId;
}
}
}
Loading
Loading