[RAPID] PDM: 제품구분 품목정보 이동 - 견적/수주 팝업 양식 변경

- 기본정보 제품구분 드롭다운 제거 (CONTRACT_MGMT.PRODUCT 주석처리)
- 품목정보 No~품번 사이에 제품구분 컬럼 추가 (공통코드 0000001)
- Machine(0000928) 선택 시 수량만큼 행 분할, 각 수량=1 고정
- CONTRACT_ITEM.PRODUCT 컬럼 추가 및 UPSERT/SELECT 반영
- getContractItems/getContractItemList GROUP BY에 PRODUCT 추가

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-27 09:42:14 +09:00
parent 3329dc86e4
commit 0c400f490c
4 changed files with 273 additions and 69 deletions

View File

@@ -366,12 +366,19 @@
var orderQuantity = $row.find(".item-order-quantity").val().replace(/,/g, "").trim();
var orderUnitPrice = $row.find(".item-order-unit-price").val().replace(/,/g, "").trim();
var product = $row.find(".item-product").val();
if(!product || product == "") {
alert((i+1) + "번째 품목의 제품구분을 선택해주세요.");
$row.find(".item-product").focus();
return false;
}
if(!partObjId || partObjId == "") {
alert((i+1) + "번째 품목의 품번을 선택해주세요.");
$row.find(".item-part-no-select").focus();
return false;
}
if(orderQuantity == "" || orderQuantity == "0") {
alert((i+1) + "번째 품목의 수주수량을 입력해주세요.");
$row.find(".item-order-quantity").focus();
@@ -405,6 +412,7 @@
var item = {
objId: $row.find(".item-objid").val() || '',
product: $row.find(".item-product").val(),
partObjId: $row.find(".item-part-objid").val(),
partNo: $row.find(".item-part-no").val() ? $row.find(".item-part-no").val().trim() : "",
partName: $row.find(".item-part-name").val() ? $row.find(".item-part-name").val().trim() : "",
@@ -448,7 +456,14 @@
var html = '<tr id="' + itemId + '" class="item-row">';
html += '<td style="text-align:center; padding:5px; border:1px solid #ddd;">' + (itemCounter-1) + '</td>';
// 제품구분 드롭다운
html += '<td style="padding:5px; border:1px solid #ddd;">';
html += '<select name="item_product[]" id="PRODUCT_' + itemId + '" class="item-product select2" style="width:100%;" required>';
html += '<option value="">선택</option>';
html += '</select>';
html += '</td>';
// 품번 셀렉트박스
html += '<td style="padding:5px; border:1px solid #ddd;">';
html += '<select name="item_part_no_select[]" id="PART_NO_' + itemId + '" class="item-part-no-select" style="width:100%;" required>';
@@ -523,7 +538,11 @@
html += '</tr>';
$("#itemListBody").append(html);
// 제품구분 드롭다운 초기화
fnc_getCodeListAppend("0000001", "PRODUCT_" + itemId, "");
$("#PRODUCT_" + itemId).select2({ width: '100%' });
// 품번/품명 옵션 채우기
fn_fillPartOptions(itemId, null, null, null);
@@ -563,7 +582,12 @@
// 총액 직접 수정시에도 합계는 갱신
fn_calculateTotal();
});
// Machine 수량 분할: 수주수량 입력 완료 시 체크
$("#" + itemId + " .item-order-quantity").on("blur", function() {
fn_handleMachineExpansion(itemId);
});
// 품목 정보 저장
var itemData = {
id: itemId,
@@ -612,11 +636,69 @@
if(existingData.dueDate) $("#" + itemId + " .item-due-date").val(existingData.dueDate);
if(existingData.customerRequest) $("#" + itemId + " .item-customer-request").val(existingData.customerRequest);
if(existingData.returnReason) $("#" + itemId + " .item-return-reason").val(existingData.returnReason).trigger('change');
if(existingData.product) {
fnc_getCodeListAppend("0000001", "PRODUCT_" + itemId, existingData.product);
$("#PRODUCT_" + itemId).select2({ width: '100%' });
}
}
itemList.push(itemData);
}
// Machine(0000928) 제품구분 수량 분할 처리
function fn_handleMachineExpansion(itemId) {
var $row = $("#" + itemId);
var productVal = $row.find(".item-product").val();
if(productVal !== '0000928') return;
var qtyInput = $row.find(".item-order-quantity").val().replace(/,/g, "").trim();
var qty = parseInt(qtyInput);
if(isNaN(qty) || qty <= 1) return;
// 현재 행의 데이터 수집
var partObjId = $row.find(".item-part-objid").val();
var partNo = $row.find(".item-part-no").val();
var partName = $row.find(".item-part-name").val();
var dueDate = $row.find(".item-due-date").val();
var returnReason = $row.find(".item-return-reason").val();
var customerRequest = $row.find(".item-customer-request").val();
var orderUnitPrice = $row.find(".item-order-unit-price").val();
// 현재 행의 수량을 1로 변경
$row.find(".item-order-quantity").val("1");
fn_calculateItemAmount(itemId);
// 나머지 qty-1개 행 추가
for(var i = 1; i < qty; i++) {
fn_addItemRow();
var $lastRow = $("#itemListBody .item-row:last");
var lastItemId = $lastRow.attr("id");
// 제품구분 설정
fnc_getCodeListAppend("0000001", "PRODUCT_" + lastItemId, "0000928");
$("#PRODUCT_" + lastItemId).select2({ width: '100%' });
// 품번/품명 설정
if(partObjId) {
$lastRow.find(".item-part-objid").val(partObjId);
$lastRow.find(".item-part-no").val(partNo);
$lastRow.find(".item-part-name").val(partName);
var $pnSelect = $("#PART_NO_" + lastItemId);
var $pnameSelect = $("#PART_NAME_" + lastItemId);
$pnSelect.append(new Option(partNo, partObjId, true, true));
$pnameSelect.append(new Option(partName, partObjId, true, true));
}
$lastRow.find(".item-order-quantity").val("1");
if(orderUnitPrice) $lastRow.find(".item-order-unit-price").val(orderUnitPrice);
if(dueDate) $lastRow.find(".item-due-date").val(dueDate);
if(returnReason) $lastRow.find(".item-return-reason").val(returnReason).trigger('change');
if(customerRequest) $lastRow.find(".item-customer-request").val(customerRequest);
fn_calculateItemAmount(lastItemId);
}
fn_calculateTotal();
}
// 기존 품목 데이터 로드 (수정 모드)
function fn_loadExistingItems() {
<%
@@ -656,7 +738,14 @@
var html = '<tr id="' + itemId + '" class="item-row">';
html += '<td style="text-align:center; padding:5px; border:1px solid #ddd;">' + (itemCounter-1) + '</td>';
// 제품구분 드롭다운
html += '<td style="padding:5px; border:1px solid #ddd;">';
html += '<select name="item_product[]" id="PRODUCT_' + itemId + '" class="item-product select2" style="width:100%;" required>';
html += '<option value="">선택</option>';
html += '</select>';
html += '</td>';
// 품번 셀렉트박스
html += '<td style="padding:5px; border:1px solid #ddd;">';
html += '<select name="item_part_no_select[]" id="PART_NO_' + itemId + '" class="item-part-no-select" style="width:100%;" required>';
@@ -685,7 +774,15 @@
var dueDate = "<%= CommonUtils.checkNull(item.get("DUE_DATE")) %>";
var customerRequest = <%= new com.google.gson.Gson().toJson(CommonUtils.checkNull(item.get("CUSTOMER_REQUEST"))) %>;
var returnReason = "<%= CommonUtils.checkNull(item.get("RETURN_REASON")) %>";
var savedProduct = "<%= CommonUtils.checkNull(item.get("PRODUCT")) %>";
// 제품구분 드롭다운
html += '<td style="padding:5px; border:1px solid #ddd;">';
html += '<select name="item_product[]" id="PRODUCT_' + itemId + '" class="item-product select2" style="width:100%;" required>';
html += '<option value="">선택</option>';
html += '</select>';
html += '</td>';
html += '<td style="padding:5px; border:1px solid #ddd;">';
html += '<input type="text" name="item_serial_no[]" class="item-serial-no" placeholder="클릭하여 S/N 추가" readonly style="width:95%; padding:5px; cursor:pointer; background-color:#f8f9fa;" onclick="fn_openItemSnPopup(\'' + itemId + '\')" value="' + serialNos + '" />';
html += '<input type="hidden" name="item_serial_no_list[]" id="' + itemId + '_sn_list" value="" />';
@@ -744,7 +841,11 @@
// 품번/품명 옵션 채우기
fn_fillPartOptions(itemId, savedPartObjId, savedPartNo, savedPartName);
// 제품구분 드롭다운 초기화
fnc_getCodeListAppend("0000001", "PRODUCT_" + itemId, savedProduct);
$("#PRODUCT_" + itemId).select2({ width: '100%' });
// datepicker 적용
$("#" + itemId + " .date_icon").datepicker({
changeMonth: true,
@@ -1534,13 +1635,11 @@
<table class="pmsPopuptable">
<colgroup>
<col width="12%" />
<col width="14%" />
<col width="21%" />
<col width="12%" />
<col width="14%" />
<col width="21%" />
<col width="12%" />
<col width="14%" />
<col width="12%" />
<col width="10%" />
<col width="22%" />
</colgroup>
<!-- 첫번째 행: 주문유형, 제품구분, 국내/해외, 고객사 -->
@@ -1552,13 +1651,14 @@
${code_map.category_cd}
</select>
</td>
<td class="input_title"><label for="">제품구분 <span style="color:red;">*</span></label></td>
<%-- 제품구분: 품목정보 그리드로 이동 --%>
<%-- <td class="input_title"><label for="">제품구분 <span style="color:red;">*</span></label></td>
<td>
<select name="product" id="product" required reqTitle="제품구분" type="select" class="select2">
<option value="">선택</option>
${code_map.product_cd}
</select>
</td>
</td> --%>
<td class="input_title"><label for="">국내/해외 <span style="color:red;">*</span></label></td>
<td>
<select name="area_cd" id="area_cd" reqTitle="국내/해외" type="select" class="select2" required>
@@ -1634,22 +1734,24 @@
<table class="pmsPopuptable" id="itemListTable">
<colgroup>
<col width="3%" /> <!-- 번호 -->
<col width="8%" /> <!-- 품번 -->
<col width="8%" /> <!-- 품 -->
<col width="10%" /> <!-- S/N -->
<col width="8%" /> <!-- 요청납기 -->
<col width="12%" /> <!-- 고객요청사항 -->
<col width="8%" /> <!-- 반납사유 -->
<col width="8%" /> <!-- 제품구분 -->
<col width="7%" /> <!-- 품 -->
<col width="7%" /> <!-- 품명 -->
<col width="9%" /> <!-- S/N -->
<col width="7%" /> <!-- 요청납기 -->
<col width="11%" /> <!-- 고객요청사항 -->
<col width="7%" /> <!-- 반납사유 -->
<col width="6%" /> <!-- 수주수량 -->
<col width="8%" /> <!-- 수주단가 -->
<col width="8%" /> <!-- 수주공급가액 -->
<col width="7%" /> <!-- 수주단가 -->
<col width="7%" /> <!-- 수주공급가액 -->
<col width="7%" /> <!-- 수주부가세 -->
<col width="8%" /> <!-- 수주총액 -->
<col width="7%" /> <!-- 수주총액 -->
<col width="4%" /> <!-- 삭제 -->
</colgroup>
<thead>
<tr style="background:#f5f5f5;">
<th style="text-align:center; padding:8px; border:1px solid #ddd;">No</th>
<th style="text-align:center; padding:8px; border:1px solid #ddd; background:#e3f2fd;">제품구분 <span style="color:red;">*</span></th>
<th style="text-align:center; padding:8px; border:1px solid #ddd; background:#e3f2fd;">품번 <span style="color:red;">*</span></th>
<th style="text-align:center; padding:8px; border:1px solid #ddd; background:#e3f2fd;">품명 <span style="color:red;">*</span></th>
<th style="text-align:center; padding:8px; border:1px solid #ddd; background:#e3f2fd;">S/N</th>
@@ -1667,14 +1769,14 @@
<tbody id="itemListBody">
<!-- 품목 행이 동적으로 추가됩니다 -->
<tr id="noItemRow">
<td colspan="13" style="text-align:center; padding:30px; color:#999;">
<td colspan="14" style="text-align:center; padding:30px; color:#999;">
품목 추가 버튼을 클릭하여 품목을 등록하세요.
</td>
</tr>
</tbody>
<tfoot>
<tr id="totalRow" style="background:#f5f5f5; font-weight:bold;">
<td colspan="7" style="text-align:center; padding:8px; border:1px solid #ddd;">Total</td>
<td colspan="8" style="text-align:center; padding:8px; border:1px solid #ddd;">Total</td>
<td style="text-align:right; padding:8px; border:1px solid #ddd;" id="totalOrderQuantity">0</td>
<td style="padding:8px; border:1px solid #ddd;"></td>
<td style="text-align:right; padding:8px; border:1px solid #ddd;" id="totalOrderSupplyPrice">0.00</td>

View File

@@ -477,7 +477,7 @@
message = "등록";
}
if (confirm(message + "하시겠습니까?")) {
$("#category_cd,#area_cd,#target_project_no,#customer_objid,#product,#contract_result,#overhaul_order").prop("disabled","");
$("#category_cd,#area_cd,#target_project_no,#customer_objid,#contract_result,#overhaul_order").prop("disabled","");
// 저장 직전 S/N 확인
console.log("=== 저장 시작 ===");
@@ -533,9 +533,16 @@
for(var i = 0; i < itemRows.length; i++) {
var $row = $(itemRows[i]);
var product = $row.find(".item-product").val();
var partObjId = $row.find(".item-part-objid").val(); // hidden 필드에서 가져오기
var quantity = $row.find(".item-quantity").val().replace(/,/g, "").trim();
if(!product || product == "") {
alert((i+1) + "번째 품목의 제품구분을 선택해주세요.");
$row.find(".item-product").focus();
return false;
}
if(!partObjId || partObjId == "") {
alert((i+1) + "번째 품목의 품번을 선택해주세요.");
$row.find(".item-part-no-select").focus();
@@ -575,6 +582,7 @@
var item = {
objId: $row.find(".item-objid").val(), // 기존 품목 OBJID (수정 시 유지)
product: $row.find(".item-product").val(),
partObjId: $row.find(".item-part-objid").val(),
partNo: $row.find(".item-part-no").val() ? $row.find(".item-part-no").val().trim() : "",
partName: $row.find(".item-part-name").val() ? $row.find(".item-part-name").val().trim() : "",
@@ -638,6 +646,7 @@
var savedPartObjId = "<%= item.get("PART_OBJID") != null ? item.get("PART_OBJID") : (item.get("part_objid") != null ? item.get("part_objid") : "") %>";
var savedPartNo = "<%= item.get("PART_NO") != null ? item.get("PART_NO") : (item.get("part_no") != null ? item.get("part_no") : "") %>";
var savedPartName = "<%= item.get("PART_NAME") != null ? item.get("PART_NAME") : (item.get("part_name") != null ? item.get("part_name") : "") %>";
var savedProduct = "<%= CommonUtils.checkNull(item.get("PRODUCT") != null ? item.get("PRODUCT") : (item.get("product") != null ? item.get("product") : "")) %>";
// JSON 데이터를 안전하게 전달
var snJsonData = <%= snListJson %>;
@@ -645,7 +654,14 @@
var html = '<tr id="' + itemId + '" class="item-row">';
html += '<td style="text-align:center; padding:5px; border:1px solid #ddd;">' + (itemCounter-1) + '</td>';
// 제품구분 드롭다운
html += '<td style="padding:5px; border:1px solid #ddd;">';
html += '<select name="item_product[]" id="PRODUCT_' + itemId + '" class="item-product select2" style="width:100%;" required>';
html += '<option value="">선택</option>';
html += '</select>';
html += '</td>';
// 품번 셀렉트박스
html += '<td style="padding:5px; border:1px solid #ddd;">';
html += '<select name="item_part_no_select[]" id="PART_NO_' + itemId + '" class="item-part-no-select" style="width:100%;" required>';
@@ -714,7 +730,11 @@
// 품번/품명 옵션 채우기 (저장된 품번/품명도 함께 전달)
fn_fillPartOptions(itemId, savedPartObjId, savedPartNo, savedPartName);
// 제품구분 드롭다운 초기화
fnc_getCodeListAppend("0000001", "PRODUCT_" + itemId, savedProduct);
$("#PRODUCT_" + itemId).select2({ width: '100%' });
// 프로젝트가 있으면 품번/품명 셀렉트박스 비활성화 및 삭제 버튼 비활성화
if(hasProject) {
$("#PART_NO_" + itemId).prop("disabled", true).css("background-color", "#f5f5f5");
@@ -1445,7 +1465,14 @@
var html = '<tr id="' + itemId + '" class="item-row">';
html += '<td style="text-align:center; padding:5px; border:1px solid #ddd;">' + (itemCounter-1) + '</td>';
// 제품구분 드롭다운
html += '<td style="padding:5px; border:1px solid #ddd;">';
html += '<select name="item_product[]" id="PRODUCT_' + itemId + '" class="item-product select2" style="width:100%;" required>';
html += '<option value="">선택</option>';
html += '</select>';
html += '</td>';
// 품번 셀렉트박스
html += '<td style="padding:5px; border:1px solid #ddd;">';
html += '<select name="item_part_no_select[]" id="PART_NO_' + itemId + '" class="item-part-no-select" style="width:100%;" required>';
@@ -1489,7 +1516,11 @@
// 품번/품명 옵션 채우기 (신규 추가)
fn_fillPartOptions(itemId, null, null, null);
// 제품구분 드롭다운 초기화
fnc_getCodeListAppend("0000001", "PRODUCT_" + itemId, "");
$("#PRODUCT_" + itemId).select2({ width: '100%' });
// 추가된 행의 날짜 필드에 datepicker 적용
$("#" + itemId + " .date_icon").datepicker({
changeMonth: true,
@@ -1511,13 +1542,66 @@
$("#" + itemId + " .item-quantity").on("keyup", function() {
$(this).val(formatInteger($(this).val().replace(/[^0-9]/g, "")));
});
// Machine 수량 분할: 수량 입력 완료 시 체크
$("#" + itemId + " .item-quantity").on("blur", function() {
fn_handleMachineExpansion(itemId);
});
// 품목 정보 저장
itemList.push({
id: itemId,
snList: []
});
}
// Machine(0000928) 제품구분 수량 분할 처리
function fn_handleMachineExpansion(itemId) {
var $row = $("#" + itemId);
var productVal = $row.find(".item-product").val();
if(productVal !== '0000928') return;
var qtyInput = $row.find(".item-quantity").val().replace(/,/g, "").trim();
var qty = parseInt(qtyInput);
if(isNaN(qty) || qty <= 1) return;
var partObjId = $row.find(".item-part-objid").val();
var partNo = $row.find(".item-part-no").val();
var partName = $row.find(".item-part-name").val();
var dueDate = $row.find(".item-due-date").val();
var returnReason = $row.find(".item-return-reason").val();
var customerRequest = $row.find(".item-customer-request").val();
// 현재 행의 수량을 1로 변경
$row.find(".item-quantity").val("1");
// 나머지 qty-1개 행 추가
for(var i = 1; i < qty; i++) {
fn_addItemRow();
var $lastRow = $("#itemListBody .item-row:last");
var lastItemId = $lastRow.attr("id");
// 제품구분 설정
fnc_getCodeListAppend("0000001", "PRODUCT_" + lastItemId, "0000928");
$("#PRODUCT_" + lastItemId).select2({ width: '100%' });
// 품번/품명 설정
if(partObjId) {
$lastRow.find(".item-part-objid").val(partObjId);
$lastRow.find(".item-part-no").val(partNo);
$lastRow.find(".item-part-name").val(partName);
var $pnSelect = $("#PART_NO_" + lastItemId);
var $pnameSelect = $("#PART_NAME_" + lastItemId);
$pnSelect.append(new Option(partNo, partObjId, true, true));
$pnameSelect.append(new Option(partName, partObjId, true, true));
}
$lastRow.find(".item-quantity").val("1");
if(dueDate) $lastRow.find(".item-due-date").val(dueDate);
if(returnReason) $lastRow.find(".item-return-reason").val(returnReason).trigger('change');
if(customerRequest) $lastRow.find(".item-customer-request").val(customerRequest);
}
}
// 품번/품명 셀렉트박스 옵션 채우기 (Select2 AJAX)
function fn_fillPartOptions(itemId, selectedObjId, savedPartNo, savedPartName) {
@@ -2108,16 +2192,14 @@
<table class="pmsPopuptable">
<colgroup>
<col width="12%" />
<col width="14%" />
<col width="21%" />
<col width="12%" />
<col width="14%" />
<col width="21%" />
<col width="12%" />
<col width="14%" />
<col width="12%" />
<col width="10%" />
<col width="22%" />
</colgroup>
<!-- 첫번째 행: 주문유형, 제품구분, 국내/해외, 고객사 -->
<!-- 첫번째 행: 주문유형, 국내/해외, 고객사 -->
<tr>
<td class="input_title"><label for="">주문유형 <span style="color:red;">*</span></label></td>
<td>
@@ -2126,6 +2208,7 @@
${code_map.category_cd}
</select>
</td>
<%-- 제품구분을 품목정보로 이동
<td class="input_title"><label for="">제품구분 <span style="color:red;">*</span></label></td>
<td>
<select name="product" id="product" required reqTitle="제품구분" type="select" class="select2">
@@ -2133,6 +2216,7 @@
${code_map.product_cd}
</select>
</td>
--%>
<td class="input_title"><label for="">국내/해외 <span style="color:red;">*</span></label></td>
<td>
<select name="area_cd" id="area_cd" reqTitle="국내/해외" type="select" class="select2" required>
@@ -2214,18 +2298,20 @@
<table class="pmsPopuptable" id="itemListTable">
<colgroup>
<col width="4%" /> <!-- 번호 -->
<col width="12%" /> <!-- 품번 -->
<col width="12%" /> <!-- 품 -->
<col width="15%" /> <!-- S/N -->
<col width="10%" /> <!-- 제품구분 -->
<col width="11%" /> <!-- 품 -->
<col width="11%" /> <!-- 품명 -->
<col width="13%" /> <!-- S/N -->
<col width="7%" /> <!-- 수량 -->
<col width="10%" /> <!-- 요청납기 -->
<col width="15%" /> <!-- 반납사유 -->
<col width="20%" /> <!-- 고객요청사항 -->
<col width="9%" /> <!-- 요청납기 -->
<col width="13%" /> <!-- 반납사유 -->
<col width="17%" /> <!-- 고객요청사항 -->
<col width="5%" /> <!-- 삭제 -->
</colgroup>
<thead>
<tr style="background:#f5f5f5;">
<th style="text-align:center; padding:8px; border:1px solid #ddd;">No</th>
<th style="text-align:center; padding:8px; border:1px solid #ddd;">제품구분 <span style="color:red;">*</span></th>
<th style="text-align:center; padding:8px; border:1px solid #ddd;">품번 <span style="color:red;">*</span></th>
<th style="text-align:center; padding:8px; border:1px solid #ddd;">품명 <span style="color:red;">*</span></th>
<th style="text-align:center; padding:8px; border:1px solid #ddd;">S/N</th>
@@ -2239,7 +2325,7 @@
<tbody id="itemListBody">
<!-- 품목 행이 동적으로 추가됩니다 -->
<tr id="noItemRow">
<td colspan="9" style="text-align:center; padding:30px; color:#999;">
<td colspan="10" style="text-align:center; padding:30px; color:#999;">
품목 추가 버튼을 클릭하여 품목을 등록하세요.
</td>
</tr>

View File

@@ -1370,7 +1370,7 @@
OBJID
,CATEGORY_CD
,CUSTOMER_OBJID
,PRODUCT
/* ,PRODUCT -- 제품구분을 품목(CONTRACT_ITEM)으로 이동 */
,CUSTOMER_PROJECT_NAME
,STATUS_CD
,DUE_DATE
@@ -1431,7 +1431,7 @@
#{objId}
,#{category_cd}
,#{customer_objid}
,#{product}
<!-- ,#{product} - 제품구분을 품목(CONTRACT_ITEM)으로 이동 -->
,#{customer_project_name}
,#{status_cd}
,#{due_date}
@@ -1492,7 +1492,7 @@
SET
CATEGORY_CD = #{category_cd}
,CUSTOMER_OBJID = #{customer_objid}
,PRODUCT = #{product}
<!-- ,PRODUCT = #{product} - 제품구분을 품목(CONTRACT_ITEM)으로 이동 -->
,CUSTOMER_PROJECT_NAME = #{customer_project_name}
,STATUS_CD = #{status_cd}
,DUE_DATE = #{due_date}
@@ -1660,7 +1660,7 @@
SET
CATEGORY_CD = #{category_cd}
,CUSTOMER_OBJID = #{customer_objid}
,PRODUCT = #{product}
<!-- ,PRODUCT = #{product} - 제품구분을 품목(CONTRACT_ITEM)으로 이동 -->
,CUSTOMER_PROJECT_NAME = #{customer_project_name}
,STATUS_CD = #{status_cd}
,DUE_DATE = #{due_date}
@@ -5152,7 +5152,7 @@ WHERE
OBJID,
CATEGORY_CD,
CUSTOMER_OBJID,
PRODUCT,
/* PRODUCT, -- 제품구분을 품목(CONTRACT_ITEM)으로 이동 */
AREA_CD,
CUSTOMER_EQUIP_NAME,
CUSTOMER_PROJECT_NAME,
@@ -5176,7 +5176,7 @@ WHERE
#{objId},
#{category_cd},
#{customer_objid},
#{product},
<!-- #{product}, - 제품구분을 품목(CONTRACT_ITEM)으로 이동 -->
#{area_cd},
#{customer_equip_name},
#{customer_project_name},
@@ -5200,7 +5200,7 @@ WHERE
SET
CATEGORY_CD = #{category_cd},
CUSTOMER_OBJID = #{customer_objid},
PRODUCT = #{product},
<!-- PRODUCT = #{product}, - 제품구분을 품목(CONTRACT_ITEM)으로 이동 -->
AREA_CD = #{area_cd},
CUSTOMER_EQUIP_NAME = #{customer_equip_name},
CUSTOMER_PROJECT_NAME = #{customer_project_name},
@@ -5247,7 +5247,8 @@ WHERE
CI.ORDER_SUPPLY_PRICE,
CI.ORDER_VAT,
CI.ORDER_TOTAL_AMOUNT,
CI.CANCEL_QTY
CI.CANCEL_QTY,
CI.PRODUCT
FROM
CONTRACT_ITEM CI
LEFT JOIN PART_MNG PM ON CI.PART_OBJID = PM.OBJID
@@ -5273,7 +5274,8 @@ WHERE
CI.ORDER_SUPPLY_PRICE,
CI.ORDER_VAT,
CI.ORDER_TOTAL_AMOUNT,
CI.CANCEL_QTY
CI.CANCEL_QTY,
CI.PRODUCT
ORDER BY CI.SEQ
</select>
@@ -5370,7 +5372,8 @@ WHERE
RETURN_REASON,
REGDATE,
WRITER,
STATUS
STATUS,
PRODUCT
) VALUES (
#{objId},
#{contractObjId},
@@ -5384,7 +5387,8 @@ WHERE
#{returnReason},
NOW(),
#{writer},
'ACTIVE'
'ACTIVE',
#{product}
)
</insert>
@@ -5408,7 +5412,8 @@ WHERE
ORDER_UNIT_PRICE,
ORDER_SUPPLY_PRICE,
ORDER_VAT,
ORDER_TOTAL_AMOUNT
ORDER_TOTAL_AMOUNT,
PRODUCT
) VALUES (
#{objId},
#{contractObjId},
@@ -5427,7 +5432,8 @@ WHERE
#{orderUnitPrice},
#{orderSupplyPrice},
#{orderVat},
#{orderTotalAmount}
#{orderTotalAmount},
#{product}
)
</insert>
@@ -5472,9 +5478,10 @@ WHERE
CI.ORDER_SUPPLY_PRICE,
CI.ORDER_VAT,
CI.ORDER_TOTAL_AMOUNT,
CI.PRODUCT,
STRING_AGG(CIS.SERIAL_NO, ', ' ORDER BY CIS.SEQ) AS SERIAL_NOS,
COUNT(CIS.OBJID) AS SERIAL_COUNT
FROM
FROM
CONTRACT_ITEM CI
LEFT JOIN CONTRACT_ITEM_SERIAL CIS
ON CI.OBJID = CIS.ITEM_OBJID
@@ -5503,8 +5510,9 @@ WHERE
CI.ORDER_UNIT_PRICE,
CI.ORDER_SUPPLY_PRICE,
CI.ORDER_VAT,
CI.ORDER_TOTAL_AMOUNT
ORDER BY
CI.ORDER_TOTAL_AMOUNT,
CI.PRODUCT
ORDER BY
CI.SEQ
</select>
@@ -5726,7 +5734,8 @@ WHERE
RETURN_REASON,
REGDATE,
WRITER,
STATUS
STATUS,
PRODUCT
) VALUES (
#{objId},
#{contractObjId},
@@ -5740,7 +5749,8 @@ WHERE
#{returnReason},
NOW(),
#{writer},
'ACTIVE'
'ACTIVE',
#{product}
)
ON CONFLICT (OBJID) DO UPDATE
SET
@@ -5754,7 +5764,8 @@ WHERE
RETURN_REASON = #{returnReason},
CHGDATE = NOW(),
CHG_USER_ID = #{writer},
STATUS = 'ACTIVE'
STATUS = 'ACTIVE',
PRODUCT = #{product}
</insert>
<!-- 품목 UPSERT (수주 정보 포함 - 통합등록용) -->
@@ -5777,7 +5788,8 @@ WHERE
ORDER_UNIT_PRICE,
ORDER_SUPPLY_PRICE,
ORDER_VAT,
ORDER_TOTAL_AMOUNT
ORDER_TOTAL_AMOUNT,
PRODUCT
) VALUES (
#{objId},
#{contractObjId},
@@ -5796,7 +5808,8 @@ WHERE
#{orderUnitPrice},
#{orderSupplyPrice},
#{orderVat},
#{orderTotalAmount}
#{orderTotalAmount},
#{product}
)
ON CONFLICT (OBJID) DO UPDATE
SET
@@ -5815,7 +5828,8 @@ WHERE
ORDER_UNIT_PRICE = #{orderUnitPrice},
ORDER_SUPPLY_PRICE = #{orderSupplyPrice},
ORDER_VAT = #{orderVat},
ORDER_TOTAL_AMOUNT = #{orderTotalAmount}
ORDER_TOTAL_AMOUNT = #{orderTotalAmount},
PRODUCT = #{product}
</insert>
<!-- S/N UPSERT (INSERT or UPDATE) -->

View File

@@ -2729,7 +2729,8 @@ private String encodeImageToBase64(String imagePath) {
itemMap.put("dueDate", item.get("dueDate") != null ? item.get("dueDate").toString() : "");
itemMap.put("customerRequest", item.get("customerRequest") != null ? item.get("customerRequest").toString() : "");
itemMap.put("returnReason", item.get("returnReason") != null ? item.get("returnReason").toString() : "");
itemMap.put("product", item.get("product") != null ? item.get("product").toString() : "");
// 수주 정보
String orderQuantity = item.get("orderQuantity") != null ? item.get("orderQuantity").toString().replace(",", "") : "0";
String orderUnitPrice = item.get("orderUnitPrice") != null ? item.get("orderUnitPrice").toString().replace(",", "") : "0";
@@ -3178,6 +3179,7 @@ private String encodeImageToBase64(String imagePath) {
itemParam.put("dueDate", item.get("dueDate"));
itemParam.put("customerRequest", item.get("customerRequest"));
itemParam.put("returnReason", item.get("returnReason"));
itemParam.put("product", item.get("product"));
itemParam.put("writer", userId);
System.out.println("품목 UPSERT 시도 - OBJID: " + itemObjId);