본문 바로가기
IT tech Coding/php

PHP에서 브라켓 품목코드 기반 재고 조회 기능 구현하기

by Coding Life 2025. 2. 6.

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>';
    }
}

위 코드를 활용하면 특정 로트번호 패턴을 가진 재고만 필터링하여 표시할 수 있다.

이제 이 코드를 활용해 재고 관리 시스템을 효율적으로 구축해보자.

반응형