티스토리 뷰

반응형

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

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

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

반응형
댓글