feat(cupang): 전체 배분 완료 시 빨간 도장
모든 박스(제품별 + 혼합)를 센터에 담아 미배분 잔여가 0 이 되면 ② 요약의 "센터 배분" 칸에 빨간 "전체 배분 완료" 도장을 찍는다. 처음 완료될 때만 찍히는 애니메이션이 돌고, 하나라도 빼면 도장이 사라진다. 재계산하면 기록도 초기화된다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
{% extends "erp_base.html" %}
|
||||
|
||||
{% block head_extra %}<link rel="stylesheet" href="/static/cupang.css?v=20260829k" />{% endblock %}
|
||||
{% block head_extra %}<link rel="stylesheet" href="/static/cupang.css?v=20260829l" />{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<section class="cpg">
|
||||
@@ -249,7 +249,8 @@
|
||||
});
|
||||
var had = Object.keys(alloc).some(function (k) { return alloc[k].length; });
|
||||
alloc = {};
|
||||
stamped = {}; // 계산이 바뀌면 이전 배분은 근거가 사라지므로 비운다.
|
||||
stamped = {};
|
||||
allStamped = false; // 계산이 바뀌면 이전 배분은 근거가 사라지므로 비운다.
|
||||
render();
|
||||
msg.textContent = "계산 완료 (" + calc.results.length + "건)" + (had ? " — 센터 분배 초기화됨" : "");
|
||||
})
|
||||
@@ -312,10 +313,13 @@
|
||||
return '<span class="cpg-stamp' + (fresh ? " is-new" : "") + '" aria-label="배분 완료">배분 완료</span>';
|
||||
}
|
||||
|
||||
function kpi(label, value, hint) {
|
||||
var allStamped = false; // 전체 배분 완료 도장이 이미 찍혀 있었는지
|
||||
|
||||
function kpi(label, value, hint, extra) {
|
||||
return '<div class="cpg-kpi"><span class="cpg-kpi-label">' + esc(label) + "</span>" +
|
||||
'<strong class="cpg-kpi-value">' + esc(value) + "</strong>" +
|
||||
'<span class="cpg-kpi-hint">' + esc(hint) + "</span></div>";
|
||||
'<span class="cpg-kpi-hint">' + esc(hint) + "</span>" +
|
||||
(extra || "") + "</div>";
|
||||
}
|
||||
|
||||
function renderSummary() {
|
||||
@@ -342,9 +346,19 @@
|
||||
});
|
||||
var assigned = (totalProd + totalMix) - (remainProd + remainMix);
|
||||
|
||||
// 모든 박스를 센터에 배분하면 "센터 배분" 칸에 전체 완료 도장을 찍는다.
|
||||
var totalBoxes = totalProd + totalMix;
|
||||
var allDone = totalBoxes > 0 && (remainProd + remainMix) === 0;
|
||||
var allStamp = "";
|
||||
if (allDone) {
|
||||
allStamp = '<span class="cpg-stamp cpg-stamp-all' + (allStamped ? "" : " is-new") + '"' +
|
||||
' aria-label="전체 배분 완료">전체 배분 완료</span>';
|
||||
}
|
||||
allStamped = allDone;
|
||||
|
||||
sumKpis.innerHTML =
|
||||
kpi("총 박스", (totalProd + totalMix) + "박스", "제품별 " + totalProd + " + 혼합 " + totalMix) +
|
||||
kpi("센터 배분", assigned + "박스", "③ 에 담긴 수량") +
|
||||
kpi("총 박스", totalBoxes + "박스", "제품별 " + totalProd + " + 혼합 " + totalMix) +
|
||||
kpi("센터 배분", assigned + "박스", "③ 에 담긴 수량", allStamp) +
|
||||
kpi("미배분 잔여", (remainProd + remainMix) + "박스", "자투리 " + leftoverUnits + "개 포함");
|
||||
|
||||
var ph = "";
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% extends "erp_base.html" %}
|
||||
|
||||
{% block head_extra %}<link rel="stylesheet" href="/static/cupang.css?v=20260829k" />{% endblock %}
|
||||
{% block head_extra %}<link rel="stylesheet" href="/static/cupang.css?v=20260829l" />{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<section class="cpg">
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% extends "erp_base.html" %}
|
||||
|
||||
{% block head_extra %}<link rel="stylesheet" href="/static/cupang.css?v=20260829k" />{% endblock %}
|
||||
{% block head_extra %}<link rel="stylesheet" href="/static/cupang.css?v=20260829l" />{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<section class="cpg">
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% extends "erp_base.html" %}
|
||||
|
||||
{% block head_extra %}<link rel="stylesheet" href="/static/cupang.css?v=20260829k" />{% endblock %}
|
||||
{% block head_extra %}<link rel="stylesheet" href="/static/cupang.css?v=20260829l" />{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<section class="cpg">
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% extends "erp_base.html" %}
|
||||
|
||||
{% block head_extra %}<link rel="stylesheet" href="/static/cupang.css?v=20260829k" />{% endblock %}
|
||||
{% block head_extra %}<link rel="stylesheet" href="/static/cupang.css?v=20260829l" />{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<section class="cpg">
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% extends "erp_base.html" %}
|
||||
|
||||
{% block head_extra %}<link rel="stylesheet" href="/static/cupang.css?v=20260829k" />{% endblock %}
|
||||
{% block head_extra %}<link rel="stylesheet" href="/static/cupang.css?v=20260829l" />{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<section class="cpg">
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% extends "erp_base.html" %}
|
||||
|
||||
{% block head_extra %}<link rel="stylesheet" href="/static/cupang.css?v=20260829k" />{% endblock %}
|
||||
{% block head_extra %}<link rel="stylesheet" href="/static/cupang.css?v=20260829l" />{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<section class="cpg">
|
||||
|
||||
@@ -768,3 +768,27 @@ body.cpg-dragging { cursor: grabbing; user-select: none; }
|
||||
.cpg-box-card.is-done .cpg-box-bar { opacity: .4; }
|
||||
/* 도장은 카드가 흐려져도 또렷하게 유지 */
|
||||
.cpg-sum-prod.is-done .cpg-stamp, .cpg-box-card.is-done .cpg-stamp { opacity: 1; }
|
||||
|
||||
/* 전체 배분 완료 도장 (센터 배분 KPI 칸) */
|
||||
.cpg-kpi { position: relative; overflow: hidden; }
|
||||
.cpg-stamp-all {
|
||||
--stamp: var(--color-callout-red);
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
right: 10px;
|
||||
margin-top: -14px;
|
||||
padding: 4px 10px;
|
||||
font-size: 13px;
|
||||
letter-spacing: 2px;
|
||||
border-width: 3px;
|
||||
border-radius: 8px;
|
||||
opacity: .9;
|
||||
transform: rotate(-12deg);
|
||||
box-shadow: inset 0 0 0 1px rgba(194, 43, 16, .25);
|
||||
}
|
||||
.cpg-stamp-all.is-new { animation: cpg-stamp-all-in .3s cubic-bezier(.2, 1.4, .4, 1); }
|
||||
@keyframes cpg-stamp-all-in {
|
||||
0% { opacity: 0; transform: rotate(-12deg) scale(2.4); }
|
||||
60% { opacity: .95; transform: rotate(-12deg) scale(.92); }
|
||||
100% { opacity: .9; transform: rotate(-12deg) scale(1); }
|
||||
}
|
||||
|
||||
@@ -217,6 +217,25 @@ function dragCardTo(card, target) {
|
||||
$("#cpg-dlg-ok").click();
|
||||
check("클릭으로 담긴다", $$(".cpg-dist-item").length === 1);
|
||||
|
||||
// ── 전체 배분 완료 도장 ───────────────────────────
|
||||
check("잔여가 남아 있으면 전체 도장 없음", !$(".cpg-stamp-all"));
|
||||
while ($(".cpg-sum-prod.is-draggable")) { // 제품 박스 전량 담기
|
||||
$(".cpg-sum-prod.is-draggable").click();
|
||||
$("#cpg-dlg-all").click();
|
||||
}
|
||||
while ($(".cpg-box-card.is-draggable")) { // 혼합 박스까지 담기
|
||||
$(".cpg-box-card.is-draggable").click();
|
||||
$("#cpg-dlg-all").click();
|
||||
}
|
||||
check("미배분 잔여 0", $$(".cpg-kpi")[2].querySelector(".cpg-kpi-value").textContent === "0박스",
|
||||
$$(".cpg-kpi")[2].querySelector(".cpg-kpi-value").textContent);
|
||||
check("전체 배분 완료 도장 표시", !!$(".cpg-stamp-all"));
|
||||
check("전체 도장 위치 = 센터 배분 칸", !!$$(".cpg-kpi")[1].querySelector(".cpg-stamp-all"));
|
||||
check("전체 도장 첫 등장은 애니메이션", $(".cpg-stamp-all").classList.contains("is-new"));
|
||||
|
||||
$(".cpg-dist-del").click(); // 하나 빼면
|
||||
check("잔여가 생기면 전체 도장 제거", !$(".cpg-stamp-all"));
|
||||
|
||||
console.log("\n" + (fails.length ? "FAILED: " + fails.join(" | ") : "ALL PASS"));
|
||||
process.exit(fails.length ? 1 : 0);
|
||||
})();
|
||||
|
||||
Reference in New Issue
Block a user