티스토리 뷰
PHP에서 브라켓 품목코드 기반 재고 조회 기능 구현하기
브라켓 품목코드의 체계적인 재고 관리는 창고 운영의 효율성을 높이고, 주문 및 출고 프로세스를 간소화하는 데 중요한 역할을 한다. 이번 포스팅에서는 브라켓 품목코드를 기반으로 재고를 조회하고, 정렬 및 필터링하여 원하는 데이터를 추출하는 PHP 스크립트를 설명한다.
1. 품목코드와 JSON 데이터 활용
이 코드의 핵심 기능 중 하나는 safe_json_decode() 함수를 활용해 JSON 형태로 저장된 품목코드를 안전하게 디코딩하는 것이다. 데이터베이스에서 조회된 품목코드는 JSON 형식으로 저장되어 있으므로, 이를 PHP 배열로 변환하여 활용한다.
function safe_json_decode($json) {
$decoded = json_decode($json, true);
return is_array($decoded) ? $decoded : [];
}
이 함수는 JSON 데이터가 유효한 경우 배열로 변환하고, 그렇지 않은 경우 빈 배열을 반환하여 오류 발생을 방지한다.
2. 품목코드 생성 로직
모터, 브라켓, 콘트롤박스 등 각 품목별로 다른 코드 규칙을 갖는다. 이를 반영하여 generateItemCode(), generateItemCodeForBracket(), generateItemCodeForAccessory() 함수를 활용해 품목코드를 일관되게 생성한다.
2.1 모터 품목코드 생성
function generateItemCode($orderItem) {
$volt = strtolower($orderItem['col1'] ?? '');
$wire = strtolower($orderItem['col2'] ?? '');
$purpose = strtolower($orderItem['col3'] ?? '');
$upweight = strtolower(str_replace(['k', 'K'], '', $orderItem['col4'] ?? ''));
if ($purpose === '무기둥모터') {
return implode('-', array_filter([$volt, $wire, $purpose, $upweight]));
} else {
return implode('-', array_filter([$volt, $wire, $upweight]));
}
}
모터의 경우, 전압(col1), 유선/무선(col2), 용도(col3), 무게(col4) 정보를 조합하여 품목코드를 생성한다. 불필요한 공백 및 대소문자 차이를 제거하여 정렬이 용이하도록 한다.
2.2 브라켓 품목코드 생성
function generateItemCodeForBracket($orderItem) {
$bracket = $orderItem['col6'] ?? '';
$flange = $orderItem['col7'] ?? '';
return strtolower($bracket . '-' . $flange);
}
브라켓 품목코드는 브라켓 크기(col6)와 후렌지 크기(col7)를 조합하여 생성한다.
2.3 콘트롤박스 품목코드 생성
function generateItemCodeForAccessory($accessoryItem) {
$col1 = $accessoryItem['col1'] ?? '';
$ecountcode = '';
if (strpos($col1, '콘트롤박스') !== false) {
if (preg_match('/(\d+V)/', $col1, $matches)) {
$ecountcode .= $matches[1] . '-';
}
if (preg_match('/\[(.*?)\]/', $col1, $matches)) {
$ecountcode .= $matches[1] . '-';
}
$ecountcode .= '콘트롤박스-';
if (preg_match('/\((.*?)\)/', $col1, $matches)) {
$ecountcode .= str_replace(['k', 'K', '~'], ['', '', '-'], $matches[1]) . '-';
}
return rtrim($ecountcode, '-');
}
return '';
}
콘트롤박스는 전압, 유/무선 여부, 적용 범위를 포함한 품목코드를 생성한다.
3. 데이터베이스에서 품목코드 조회
각 테이블에서 품목코드를 조회하여 배열로 저장한다.
$sql_fee = "SELECT ecountcode, item FROM dbchandj.fee WHERE is_deleted IS NULL ORDER BY num DESC";
$stmh_fee = $pdo->query($sql_fee);
while ($row = $stmh_fee->fetch(PDO::FETCH_ASSOC)) {
$item_codes = safe_json_decode($row['ecountcode']);
foreach ($item_codes as $item_code) {
if (!empty($item_code)) {
$items[$item_code] = $item_code;
}
}
}
위 코드를 통해 dbchandj.fee 테이블에서 저장된 품목코드를 불러와 $items 배열에 저장한다.
4. 재고 데이터 처리 및 정렬
재고 데이터는 material_reg 테이블에서 조회한 후 품목코드별로 정리된다.
$stock_sql = "SELECT inout_item_code, lotnum, SUM(CASE WHEN CAST(surang AS SIGNED) > 0 THEN CAST(surang AS SIGNED) ELSE 0 END) AS total_in,
SUM(CASE WHEN CAST(surang AS SIGNED) < 0 THEN ABS(CAST(surang AS SIGNED)) ELSE 0 END) AS total_out
FROM material_reg
WHERE is_deleted IS NULL
GROUP BY inout_item_code, lotnum";
위 SQL 문은 입출고 수량을 계산하여 품목코드와 로트번호별 재고량을 계산하는 역할을 한다.
5. 필터링 및 출력
마지막으로 특정 조건에 맞는 데이터를 필터링하여 화면에 출력한다.
$html_output = '';
$prefix = 'DH-B';
foreach ($grouped_stock_data as $item_code => $lots) {
$filtered_lots = array_filter($lots, function($data) use ($prefix) {
return $data['stock'] > 0 && preg_match("/^$prefix/", $data['lotnum']);
});
foreach ($filtered_lots as $data) {
$html_output .= '<tr onclick="updateQty2(this)" data-item-code="' . htmlspecialchars($data['item_code']) . '" data-lotnum="' . htmlspecialchars($data['lotnum']) . '">';
$html_output .= '<td class="text-center">' . htmlspecialchars($data['item_code']) . '</td>';
$html_output .= '<td class="text-start">' . htmlspecialchars($data['lotnum']) . '</td>';
$html_output .= '<td class="text-end">' . number_format($data['stock']) . '</td>';
$html_output .= '<td class="text-center"><input type="number" name="apply_qty2[]" class="form-control text-center" /></td>';
$html_output .= '</tr>';
}
}
위 코드를 활용하면 특정 로트번호 패턴을 가진 재고만 필터링하여 표시할 수 있다.
이제 이 코드를 활용해 재고 관리 시스템을 효율적으로 구축해보자.
'IT tech Coding > php' 카테고리의 다른 글
PHP에서 GET 방식으로 전달된 쿼리 문자열 안전하게 처리하기 (0) | 2025.02.17 |
---|---|
숫자 입력에서 콤마(,) 제거하는 방법 - JavaScript와 PHP 코드 예제 (0) | 2025.02.10 |
PHP에서 마지막 요소에 <br>을 넣지 않는 방법 (0) | 2025.02.05 |
가공재고를 다시 계산하기 (0) | 2025.01.27 |
PHP에서 효율적인 검색 쿼리 작성법: 특정 아이템과 스펙 검색하기 (0) | 2025.01.21 |
- Total
- Today
- Yesterday
- 도면자동생성
- json파일형태보기
- 스크립트작성기초
- 엑셀셀보호
- 프로그래머생활
- isset을 적용해야 하는 이유
- coalesce는 한국어로 "코얼레스크" 또는 "코얼리스"
- 캐드자동작도
- #데이터무결성
- 오블완
- Bootstrap 5
- 코딩튜토리얼
- 구글드라이브API
- 테크에능한여성
- #계층형데이터
- 엑셀보호
- 1. #웹개발 2. #로트번호 3. #성적서보기 4. #ajax 5. #jquery 6. #php 7. #프론트엔드 8. #백엔드 9. #부트스트랩 10. #웹기능구현
- 오토핫키가이드
- 뫄프로그래밍
- #데이터베이스설계
- ajax오류메시지
- #카테고리트리
- 효율적코딩방법
- 엑셀입력보호
- General error: 2031
- json파일편하게보는법
- #웹개발
- 티스토리챌린지
- #트리구조
- #동적ui
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |