지정판매소 현황·바코드 출력 기능을 전용 화면으로 확장
지정판매소 신규/취소 현황을 사용자 지자체 기준으로 고정 조회하도록 정리하고, 동별 요약과 컬럼 설명 툴팁을 추가했습니다. 또한 지정판매소 바코드 출력 메뉴를 전용 URL로 분리하고 선택 인쇄/출력 레이아웃을 GBMS 형태에 맞춰 구현했습니다.
This commit is contained in:
94
app/Views/admin/designated_shop/barcode_print.php
Normal file
94
app/Views/admin/designated_shop/barcode_print.php
Normal file
@@ -0,0 +1,94 @@
|
||||
<?php
|
||||
$rows = $rows ?? [];
|
||||
$zoneLabel = trim((string) ($zoneLabel ?? '전체'));
|
||||
$printedAt = trim((string) ($printedAt ?? date('Y.m.d')));
|
||||
$chunks = array_chunk($rows, 12);
|
||||
$totalPages = count($chunks);
|
||||
?>
|
||||
<!doctype html>
|
||||
<html lang="ko">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>지정판매소 바코드</title>
|
||||
<style>
|
||||
body { margin: 0; font-family: Arial, "Apple SD Gothic Neo", "Malgun Gothic", sans-serif; color: #222; background: #fff; }
|
||||
.page { width: 210mm; min-height: 297mm; margin: 0 auto; padding: 14mm 12mm 12mm; box-sizing: border-box; }
|
||||
.title { text-align: center; font-size: 42px; letter-spacing: 1px; font-weight: 500; margin: 0 0 14px; }
|
||||
.meta { display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid #555; padding-bottom: 4px; font-size: 13px; margin-bottom: 8px; }
|
||||
.meta .center { font-weight: 700; }
|
||||
.cards { display: flex; flex-wrap: wrap; align-content: flex-start; }
|
||||
.card { width: 33.3333%; padding: 0 8px 12px; box-sizing: border-box; }
|
||||
.barcode-wrap { min-height: 40px; }
|
||||
.barcode-svg { width: 100%; max-width: 270px; height: 22px; }
|
||||
.code-text { text-align: center; margin-top: 1px; font-size: 16px; letter-spacing: 0.35px; }
|
||||
.name-text { text-align: center; margin-top: 5px; font-size: 14px; line-height: 1.2; word-break: keep-all; }
|
||||
@media print {
|
||||
@page { size: A4; margin: 0; }
|
||||
.page { page-break-after: always; }
|
||||
.page:last-child { page-break-after: auto; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<?php if ($rows === []): ?>
|
||||
<div class="page">
|
||||
<h1 class="title">지정판매소 바코드</h1>
|
||||
<p style="text-align:center; margin-top:30px; color:#666;">출력할 지정판매소가 없습니다.</p>
|
||||
</div>
|
||||
<?php else: ?>
|
||||
<?php foreach ($chunks as $pageIndex => $pageRows): ?>
|
||||
<section class="page">
|
||||
<h1 class="title">지정판매소 바코드</h1>
|
||||
<div class="meta">
|
||||
<span>출 력 일 자: <?= esc($printedAt) ?></span>
|
||||
<span class="center"><?= esc($zoneLabel) ?></span>
|
||||
<span>페 이 지: <?= (int) ($pageIndex + 1) ?> / <?= (int) $totalPages ?></span>
|
||||
</div>
|
||||
<div class="cards">
|
||||
<?php foreach ($pageRows as $row): ?>
|
||||
<?php
|
||||
$code = trim((string) ($row->ds_shop_no ?? ''));
|
||||
$nm = trim((string) ($row->ds_name ?? ''));
|
||||
$rep = trim((string) ($row->ds_rep_name ?? ''));
|
||||
$label = trim($nm . ($rep !== '' ? ('-' . $rep) : ''));
|
||||
?>
|
||||
<div class="card">
|
||||
<div class="barcode-wrap">
|
||||
<svg class="barcode-svg" data-barcode="<?= esc($code, 'attr') ?>"></svg>
|
||||
</div>
|
||||
<div class="code-text"><?= esc($code) ?></div>
|
||||
<div class="name-text"><?= esc($label) ?></div>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</section>
|
||||
<?php endforeach; ?>
|
||||
<?php endif; ?>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/jsbarcode@3.11.6/dist/JsBarcode.all.min.js"></script>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
var svgs = document.querySelectorAll('svg[data-barcode]');
|
||||
svgs.forEach(function (svg) {
|
||||
var code = (svg.getAttribute('data-barcode') || '').trim();
|
||||
if (!code) return;
|
||||
try {
|
||||
JsBarcode(svg, code, {
|
||||
format: 'CODE128',
|
||||
displayValue: false,
|
||||
margin: 0,
|
||||
height: 16,
|
||||
width: 1.28
|
||||
});
|
||||
} catch (e) {
|
||||
svg.outerHTML = '<div style="font-size:12px;color:#b91c1c;">바코드 생성 실패: ' + code + '</div>';
|
||||
}
|
||||
});
|
||||
if (window.location.search.indexOf('autoprint=1') >= 0) {
|
||||
setTimeout(function () { window.print(); }, 200);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user