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); }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user