[JS] 목재 쇼핑몰에서 사용할 재단 계산 스크립트
var per_cost = parseInt(“<?php echo $cost; ?>”);
var max_size = parseInt(“<?php echo $max_size; ?>”);
$(function() {
$(‘#InsertRow’).click(function() {
$(‘#item_cut_form li.cut_option:last’).after(‘<li class=”cut_option”><div class=”cut_length”><input type=”text” name=”length[]” class=”CutLength” value=”0″ /> mm</div><div class=”cut_quantity”><div><input type=”text” name=”quantity[]” class=”CutQuantity” value=”1″ /> 개</div><div class=”DeleteRow”></div></div></li>’);
});
$(‘#item_cut_form li.cut_option div.DeleteRow’).live(‘click’, function() {
$(this).closest(“.cut_option”).remove();
CutLengthCalculate();
CutCostCalculate();
});
$(‘#cut_cross’).click(function() {
if(confirm(“재단 설정을 반영하지 않고 창을 닫으시겠습니까?”)) {
$(‘input[name=it_cut]:nth(0)’).attr(“checked”, true);
$(‘input[name=ct_qty]’).val(1).removeAttr(“readonly”);
$(‘input[name=it_cut_memo]’).val(“”);
$(‘input[name=it_cut_cost]’).val(0);
$(‘#item_cut_form’).hide();
$(‘#item_cut_cost’).hide();
PriceCalculate();
}
});
$(‘input.CutLength’).live(‘focusout’, function() {
var len = parseInt($(this).val());
if(isNaN(len)) {
// alert(“재단길이를 숫자로 입력해 주십시오.”);
return false;
} else {
if(len <= 0) {
alert(“길이는 0보다 큰 수로 입력해 주십시오.”);
return false;
} else if(len > max_size) {
$(this).val(0);
alert(“재단 길이는 “+max_size+”mm 이하로 입력해 주십시오.”);
return false;
} else {
CutLengthCalculate();
CutCostCalculate();
}
}
});
$(‘input.CutQuantity’).live(‘keyup’, function() {
var qty = parseInt($(this).val());
if(isNaN(qty)) {
// alert(“수량을 숫자로 입력해 주십시오.”);
return false;
} else {
if(qty <= 0) {
alert(“수량은 0보다 큰 수로 입력해 주십시오.”);
return false;
} else {
CutLengthCalculate();
CutCostCalculate();
}
}
});
$(‘#CutOK’).click(function() {
CutMemoSubmit();
});
});
function CutLengthCalculate()
{
try {
var qty = 0;
var remain = 0;
var Rest = new Array();
var Len = new Array();
var Cnt = new Array();
$(‘input.CutLength’).each(function() {
var val = parseInt($(this).val());
if(isNaN(val) || val <=0) {
val = 0;
}
Len.push(val);
});
$(‘input.CutQuantity’).each(function() {
var val = parseInt($(this).val());
if(isNaN(val) || val <=0) {
val = 0;
}
Cnt.push(val);
});
if(Len.length != Cnt.length) {
alert(“길이와 수량을 올바르게 입력해 주십시오.”);
return false;
}
for(i = 0; i < Len.length; i++) {
if(Len[i] > 0 && Cnt[i] > 0) {
remain = 0;
for(c = 0; c < Cnt[i]; c++) {
if(Rest.length > 0) {
for(r = 0; r < Rest.length; r++) {
if(Rest[r] < Len[i]) {
rc++;
continue;
} else {
remain = Rest[r] – Len[i];
Rest[r] = remain;
rc = 0;
break;
}
}
if(rc > 0) {
qty += 1;
remain = max_size – Len[i];
if(remain > 0) {
Rest.push(remain);
}
}
} else {
qty += 1;
remain = max_size – Len[i];
if(remain > 0) {
Rest.push(remain);
}
}
}
}
}
$(‘input[name=ct_qty]’).val(qty);
PriceCalculate();
// 자투리
if(Rest.length > 0) {
var Double = new Array();
for(j = 0; j < Rest.length; j++) {
for(k = 0; k < Rest.length; k++) {
if(Rest[k] > 0) {
if(Rest[j] != Rest[k]) {
continue;
} else {
Double.push(Rest[j]); // 중복되는 길이 배열에 저장
}
} else {
continue;
}
}
// 중복값 배열과 원래 배열 비교해서 중복되는 개수 구하기
if(Double.length > 0) {
var msg = “자투리 :”;
for(d = 0; d < Double.length; d++) {
var Dbl = 0;
for(g = 0; g < Rest.length; g++) {
if(Double[d] != Rest[g]) {
continue;
} else {
Dbl++;
}
msg += ” ” + Double[d] + “mm : ” + Dbl + “EA”;
}
}
}
}
// alert(msg);
}
}
finally {
Len = Cnt = Rest = Double = null;
qty = rc = remain = checkDbl = null;
}
}
function CutCostCalculate()
{
try {
var cut = 0;
var total_cost = 0;
var Len = new Array();
var Cnt = new Array();
$(‘input.CutLength’).each(function() {
var val = parseInt($(this).val());
if(isNaN(val) || val <=0) {
val = 0;
}
Len.push(val);
});
$(‘input.CutQuantity’).each(function() {
var val = parseInt($(this).val());
if(isNaN(val) || val <=0) {
val = 0;
}
Cnt.push(val);
});
if(Len.length != Cnt.length) {
alert(“길이와 수량을 올바르게 입력해 주십시오.”);
return false;
}
for(i = 0; i < Len.length; i++) {
cut = 0; // 컷팅 수
if(Len[i] > 0 && Cnt[i] > 0) {
var split = Math.floor(max_size / Len[i]); // 재단 길이에 따른 각재 1개의 최대 컷팅수
if((max_size % Len[i]) == 0) { // 최대 길이가 재단길이의 배수일 때
var cst = Math.floor(Cnt[i] / split); // 최대 컷팅수로 재단된 각재 수
cut = ((split – 1) * cst) + (Cnt[i] – (split * cst)); // (기본컷팅수 * 각재수 ) + (요청수 – (컷팅 수))
} else {
cut = Cnt[i];
}
}
total_cost += per_cost * cut;
}
$(‘input[name=it_cut_cost]’).val(total_cost);
}
finally {
Len = Cnt = null;
cst = cost = total_cost = null;
}
}
function CutMemoSubmit()
{
try {
var cut_memo = “”;
var sp = 0;
var Len = new Array();
var Cnt = new Array();
$(‘input.CutLength’).each(function() {
var val = parseInt($(this).val());
if(isNaN(val) || val <=0) {
val = 0;
}
Len.push(val);
});
$(‘input.CutQuantity’).each(function() {
var val = parseInt($(this).val());
if(isNaN(val) || val <=0) {
val = 0;
}
Cnt.push(val);
});
if(Len.length != Cnt.length) {
alert(“길이와 수량을 올바르게 입력해 주십시오.”);
return false;
}
for(i = 0; i < Len.length; i++) {
if(Len[i] > 0 && Cnt[i] > 0) {
if(sp > 0) {
cut_memo += “, “;
}
cut_memo += Len[i] + “mm : ” + Cnt[i] + “EA”;
sp++;
}
}
if(sp < 1) {
alert(“재단길이와 수량을 올바르게 입력해 주십시오.”);
return false;
}
$(‘input[name=it_cut_memo]’).val(cut_memo);
$(‘#item_cut_form’).hide();
}
finally {
Len = Cnt = null;
cut_memo = sp = null;
}
}
</script>
목재 쇼핑몰 작업 중에 만든 각재 재단 관련 스크립트이다. 재단 길이를 입력하면 필요한 각재 수량과 재단비가 자동
계산되는 것인데.. 이거 제대로 한 건지 아직은 확신이 없다. 얼추 해보니 제대로 되는 것 같긴 한데 말이다. 하~
각재에는 각각 최대 길이가 미리 정해져 있어야 한다. 자투리도 출력되는데 요건 일단 나오지 않도록 주석처리 중.. ㅋ
덧, 자투리 계산부분은 확실히 오류가 있구나.. 이건 다시 수정해봐야 겠다. 근데 이거 언제 다시 하지.. ㅋ