Merge remote-tracking branch 'origin/ycplm_node' into V20260210
# Conflicts: # .gitignore
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -40,6 +40,7 @@ CLAUDE.md
|
||||
.playwright-mcp/
|
||||
.omc/
|
||||
.mcp.json
|
||||
db/checkpoints/
|
||||
|
||||
# Phoenix (런타임/로그/작업이력 — git 불필요)
|
||||
phoenix/
|
||||
|
||||
@@ -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,8 @@
|
||||
// 총액 직접 수정시에도 합계는 갱신
|
||||
fn_calculateTotal();
|
||||
});
|
||||
|
||||
|
||||
|
||||
// 품목 정보 저장
|
||||
var itemData = {
|
||||
id: itemId,
|
||||
@@ -612,8 +632,12 @@
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -656,7 +680,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 +716,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 +783,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 +1577,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 +1593,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>
|
||||
@@ -1575,7 +1617,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- 두번째 행: 유/무상, 접수일, 환종, 환율 -->
|
||||
<!-- 두번째 행: 유/무상, 접수일, 견적환종 -->
|
||||
<tr>
|
||||
<td class="input_title"><label for="">유/무상 <span style="color:red;">*</span></label></td>
|
||||
<td>
|
||||
@@ -1596,22 +1638,22 @@
|
||||
${code_map.contract_currency}
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- 세번째 행: 견적환율, 발주번호, 발주일 -->
|
||||
<tr>
|
||||
<td class="input_title"><label for="">견적환율</label></td>
|
||||
<td>
|
||||
<input type="text" name="exchange_rate" id="exchange_rate" reqTitle="환율" value="${info.EXCHANGE_RATE}" />
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="input_title"><label for="">발주번호</label></td>
|
||||
<td>
|
||||
<input type="text" name="po_no" id="po_no" value="${info.PO_NO}" />
|
||||
</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>
|
||||
<input type="text" class="date_icon" name="order_date" id="order_date" required reqTitle="발주일" value="${info.ORDER_DATE}">
|
||||
</td>
|
||||
<td colspan="4"></td>
|
||||
</tr>
|
||||
<input type="hidden" name="contract_result" id="contract_result" value="${info.CONTRACT_RESULT}" />
|
||||
</table>
|
||||
@@ -1634,22 +1676,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 +1711,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>
|
||||
|
||||
@@ -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,15 @@
|
||||
$("#" + itemId + " .item-quantity").on("keyup", function() {
|
||||
$(this).val(formatInteger($(this).val().replace(/[^0-9]/g, "")));
|
||||
});
|
||||
|
||||
|
||||
|
||||
// 품목 정보 저장
|
||||
itemList.push({
|
||||
id: itemId,
|
||||
snList: []
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
// 품번/품명 셀렉트박스 옵션 채우기 (Select2 AJAX)
|
||||
function fn_fillPartOptions(itemId, selectedObjId, savedPartNo, savedPartName) {
|
||||
@@ -2107,17 +2140,17 @@
|
||||
<td>
|
||||
<table class="pmsPopuptable">
|
||||
<colgroup>
|
||||
<col width="12%" />
|
||||
<col width="11%" />
|
||||
<col width="14%" />
|
||||
<col width="12%" />
|
||||
<col width="11%" />
|
||||
<col width="14%" />
|
||||
<col width="12%" />
|
||||
<col width="11%" />
|
||||
<col width="14%" />
|
||||
<col width="12%" />
|
||||
<col width="10%" />
|
||||
<col width="11%" />
|
||||
<col width="13%" />
|
||||
</colgroup>
|
||||
|
||||
<!-- 첫번째 행: 주문유형, 제품구분, 국내/해외, 고객사 -->
|
||||
<!-- 첫번째 행: 주문유형, 국내/해외, 고객사, 유/무상 -->
|
||||
<tr>
|
||||
<td class="input_title"><label for="">주문유형 <span style="color:red;">*</span></label></td>
|
||||
<td>
|
||||
@@ -2126,6 +2159,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 +2167,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>
|
||||
@@ -2147,10 +2182,6 @@
|
||||
${code_map.customer_cd}
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- 두번째 행: 유/무상, 접수일, 환종, 환율 -->
|
||||
<tr>
|
||||
<td class="input_title"><label for="">유/무상 <span style="color:red;">*</span></label></td>
|
||||
<td>
|
||||
<select name="paid_type" id="paid_type" reqTitle="유/무상" type="select" class="select2">
|
||||
@@ -2159,6 +2190,10 @@
|
||||
<option value="free" ${info.PAID_TYPE eq 'free' ? 'selected' : ''}>무상</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- 두번째 행: 접수일, 환종, 환율 -->
|
||||
<tr>
|
||||
<td class="input_title"><label for="">접수일 <span style="color:red;">*</span></label></td>
|
||||
<td>
|
||||
<input type="text" class="date_icon" name="receipt_date" id="receipt_date" reqTitle="접수일" value="${info.RECEIPT_DATE}" required>
|
||||
@@ -2174,12 +2209,8 @@
|
||||
<td>
|
||||
<input type="text" name="exchange_rate" id="exchange_rate" reqTitle="환율" value="${info.EXCHANGE_RATE}" numberOnly />
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- 세번째 행: 결재여부 -->
|
||||
<tr>
|
||||
<td class="input_title"><label>결재여부 <span style="color:red;">*</span></label></td>
|
||||
<td colspan="7">
|
||||
<td>
|
||||
<label style="margin-right:15px; cursor:pointer;">
|
||||
<input type="checkbox" name="approval_required_chk" value="Y"
|
||||
${info.APPROVAL_REQUIRED eq 'Y' ? 'checked' : ''}
|
||||
@@ -2190,7 +2221,7 @@
|
||||
${info.APPROVAL_REQUIRED ne 'Y' ? 'checked' : ''}
|
||||
onchange="fn_toggleApprovalRequired(this)" /> 불필요
|
||||
</label>
|
||||
<input type="hidden" name="approval_required" id="approval_required"
|
||||
<input type="hidden" name="approval_required" id="approval_required"
|
||||
value="${info.APPROVAL_REQUIRED ne 'Y' ? 'N' : 'Y'}" />
|
||||
</td>
|
||||
</tr>
|
||||
@@ -2214,18 +2245,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 +2272,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>
|
||||
|
||||
103
docs/yc/PDM[계획]-제품구분-품목이동.md
Normal file
103
docs/yc/PDM[계획]-제품구분-품목이동.md
Normal file
@@ -0,0 +1,103 @@
|
||||
# PDM[계획] 제품구분 품목정보 이동
|
||||
|
||||
## 개요
|
||||
견적요청등록, 수주통합등록 두 팝업 화면에서 **제품구분**을 기본정보 그리드에서 품목정보 그리드로 이동하고, Machine(0000928) 제품구분 선택 시 수량만큼 행을 자동 분할하는 기능 구현.
|
||||
|
||||
## 현재 동작
|
||||
- 기본정보 그리드에 제품구분 드롭다운 존재 (공통코드 0000001)
|
||||
- CONTRACT_MGMT.PRODUCT 컬럼에 저장
|
||||
- 모든 품목이 동일한 제품구분을 공유
|
||||
|
||||
## 변경 후 동작
|
||||
- 기본정보에서 제품구분 제거
|
||||
- 품목정보 그리드의 No와 품번 사이에 제품구분 드롭다운 추가
|
||||
- 각 품목별로 제품구분 개별 선택 가능
|
||||
- CONTRACT_ITEM.PRODUCT 컬럼에 품목별 저장
|
||||
- **Machine(0000928) 특수 로직:**
|
||||
- 품목 추가 시 제품구분이 Machine이면 견적수량 N → N개 행 생성 (각 수량=1)
|
||||
- Machine이 아니면 기존과 동일 (수량 자유)
|
||||
|
||||
## 시각적 예시
|
||||
|
||||
### 변경 전
|
||||
```
|
||||
[기본정보]
|
||||
주문유형: [선택] | 제품구분: [Machine ▼] | 국내/해외: [선택] | 고객사: [선택]
|
||||
|
||||
[품목정보]
|
||||
No | 품번 | 품명 | S/N | 견적수량 | ...
|
||||
```
|
||||
|
||||
### 변경 후
|
||||
```
|
||||
[기본정보]
|
||||
주문유형: [선택] | 국내/해외: [선택] | 고객사: [선택] | (빈칸)
|
||||
|
||||
[품목정보]
|
||||
No | 제품구분 | 품번 | 품명 | S/N | 견적수량 | ...
|
||||
```
|
||||
|
||||
## 아키텍처
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[JSP 품목 추가] --> B{제품구분 선택}
|
||||
B -->|Machine 0000928| C[수량 N 입력]
|
||||
C --> D[N개 행 생성, 각 수량=1]
|
||||
B -->|기타| E[1개 행 생성, 수량 자유]
|
||||
D --> F[fn_collectItemsData]
|
||||
E --> F
|
||||
F --> G[items_json POST]
|
||||
G --> H[Service: saveContractItems]
|
||||
H --> I[Mapper: upsertContractItem + PRODUCT]
|
||||
I --> J[CONTRACT_ITEM.PRODUCT 저장]
|
||||
```
|
||||
|
||||
## 변경 파일
|
||||
|
||||
| 파일 | 변경 내용 |
|
||||
|------|----------|
|
||||
| DB: CONTRACT_ITEM | PRODUCT VARCHAR(20) 컬럼 추가 |
|
||||
| contractMgmt.xml | master INSERT/UPDATE에서 PRODUCT 주석처리, item INSERT/UPSERT에 PRODUCT 추가 |
|
||||
| ContractMgmtService.java | item 저장 시 product 파라미터 전달 |
|
||||
| estimateRegistFormPopup.jsp | 기본정보 제품구분 제거, 품목정보에 추가, Machine 로직 |
|
||||
| estimateAndOrderRegistFormPopup.jsp | 동일 변경 |
|
||||
|
||||
## 코드 설계
|
||||
|
||||
### DB
|
||||
```sql
|
||||
ALTER TABLE CONTRACT_ITEM ADD COLUMN PRODUCT VARCHAR(20);
|
||||
```
|
||||
|
||||
### Mapper XML
|
||||
- `upsertContractItem`: INSERT/UPDATE에 PRODUCT 추가
|
||||
- `upsertContractItemWithOrder`: INSERT/UPDATE에 PRODUCT 추가
|
||||
- `saveContractMgmtInfo`: PRODUCT 관련 행 주석처리
|
||||
- `saveEstimateAndOrderInfo`: PRODUCT 관련 행 주석처리
|
||||
- `getContractItems`: SELECT에 PRODUCT 추가
|
||||
|
||||
### JSP (공통 패턴)
|
||||
```javascript
|
||||
// 품목 추가 시 제품구분 드롭다운
|
||||
html += '<td><select class="item-product select2" style="width:100%;"></select>';
|
||||
html += '<input type="hidden" class="item-product-val" /></td>';
|
||||
|
||||
// 드롭다운 초기화
|
||||
fnc_getCodeListAppend("0000001", "PRODUCT_" + itemId, "");
|
||||
|
||||
// Machine 분할 로직
|
||||
if(productCode === '0000928') {
|
||||
var qty = parseInt(quantityInput);
|
||||
for(var i = 0; i < qty; i++) { fn_addItemRow(with quantity=1); }
|
||||
}
|
||||
```
|
||||
|
||||
## 예상 문제
|
||||
- 기존 데이터: CONTRACT_MGMT.PRODUCT에만 값이 있고 CONTRACT_ITEM.PRODUCT는 NULL → 조회 시 COALESCE 처리 필요
|
||||
- Machine 행 분할 시 S/N 등 부가 데이터 처리 → 동일 값 복사
|
||||
|
||||
## 설계 원칙
|
||||
- 기존 CONTRACT_MGMT.PRODUCT는 주석처리만 (데이터 보존)
|
||||
- 품목별 제품구분 독립 관리로 확장성 확보
|
||||
- Machine 로직은 클라이언트(JSP)에서만 처리 (서버는 받은 대로 저장)
|
||||
39
docs/yc/PDM[맥락]-제품구분-품목이동.md
Normal file
39
docs/yc/PDM[맥락]-제품구분-품목이동.md
Normal file
@@ -0,0 +1,39 @@
|
||||
# PDM[맥락] 제품구분 품목정보 이동
|
||||
|
||||
## 왜 하는가
|
||||
기존에는 제품구분이 기본정보(마스터) 레벨에서 관리되어 한 건의 견적/수주에 포함된 모든 품목이 동일한 제품구분을 가져야 했다. 실무에서는 한 건에 Machine과 Part가 혼재할 수 있으므로, 품목별로 제품구분을 개별 지정할 수 있도록 변경한다.
|
||||
|
||||
또한 Machine(0000928) 제품의 경우 수량 10이면 개별 관리(S/N 추적 등)를 위해 10개의 독립 행으로 분할하여 각각 수량 1로 관리해야 하는 업무 요구사항이 있다.
|
||||
|
||||
## 핵심 결정 + 근거
|
||||
|
||||
| 결정 | 근거 |
|
||||
|------|------|
|
||||
| CONTRACT_MGMT.PRODUCT 주석처리 (삭제X) | 기존 데이터 보존, 마이그레이션 리스크 최소화 |
|
||||
| CONTRACT_ITEM.PRODUCT 추가 | 품목별 독립 관리를 위한 정규화 |
|
||||
| Machine 분할을 클라이언트에서 처리 | 서버는 받은 그대로 저장, 로직 단순화 |
|
||||
| 공통코드 0000001 그대로 사용 | 기존 코드체계 유지 |
|
||||
|
||||
## 관련 파일
|
||||
|
||||
### 견적요청등록 (estimateRegistFormPopup.jsp)
|
||||
- Controller: `ContractMgmtController.java:1692` (estimateRegistFormPopup)
|
||||
- Service: `ContractMgmtService.java:544` (saveContractMgmtInfo) → `saveContractItems:3121`
|
||||
- Mapper: `contractMgmt.xml:1367` (saveContractMgmtInfo), `:5715` (upsertContractItem)
|
||||
- 저장 URL: `/contractMgmt/saveContractMgmtInfo.do`
|
||||
- 마스터 테이블: CONTRACT_MGMT
|
||||
- 품목 테이블: CONTRACT_ITEM
|
||||
|
||||
### 수주통합등록 (estimateAndOrderRegistFormPopup.jsp)
|
||||
- Controller: `ContractMgmtController.java:2775` (saveEstimateAndOrderInfo)
|
||||
- Service: `ContractMgmtService.java:2664` (saveEstimateAndOrderInfo)
|
||||
- Mapper: `contractMgmt.xml:5149` (saveEstimateAndOrderInfo), `:5761` (upsertContractItemWithOrder)
|
||||
- 저장 URL: `/contractMgmt/saveEstimateAndOrderInfo.do`
|
||||
- 마스터 테이블: CONTRACT_MGMT
|
||||
- 품목 테이블: CONTRACT_ITEM
|
||||
|
||||
## 기술 참고
|
||||
- 공통코드 조회: `fnc_getCodeListAppend(codeId, selectboxId, selectedVal)` — common.js
|
||||
- 공통코드 0000001의 자식 코드 중 0000928이 Machine
|
||||
- 기존 isMachine 판단: `ContractMgmtService.java:2811` — `"0000928".equals(product_cd)`
|
||||
- 품목 UPSERT 패턴: `ON CONFLICT (OBJID) DO UPDATE`
|
||||
66
docs/yc/PDM[체크]-제품구분-품목이동.md
Normal file
66
docs/yc/PDM[체크]-제품구분-품목이동.md
Normal file
@@ -0,0 +1,66 @@
|
||||
# PDM[체크] 제품구분 품목정보 이동
|
||||
|
||||
## 공정 상태: 100%
|
||||
|
||||
## 구현 체크리스트
|
||||
|
||||
### DB 변경
|
||||
- [x] CONTRACT_ITEM 테이블에 PRODUCT VARCHAR(20) 컬럼 추가
|
||||
|
||||
### Mapper XML (contractMgmt.xml)
|
||||
- [x] saveContractMgmtInfo: PRODUCT 관련 INSERT/UPDATE 주석처리 (XML 주석으로 변경)
|
||||
- [x] saveEstimateAndOrderInfo: PRODUCT 관련 INSERT/UPDATE 주석처리 (XML 주석으로 변경)
|
||||
- [x] upsertContractItem: PRODUCT 추가 (INSERT + ON CONFLICT UPDATE)
|
||||
- [x] upsertContractItemWithOrder: PRODUCT 추가 (INSERT + ON CONFLICT UPDATE)
|
||||
- [x] getContractItems: SELECT에 PRODUCT 추가 + GROUP BY에 PRODUCT 추가
|
||||
- [x] getContractItemList: SELECT에 PRODUCT 추가 + GROUP BY에 PRODUCT 추가
|
||||
- [x] insertContractItem: PRODUCT 추가
|
||||
- [x] insertContractItemWithOrder: PRODUCT 추가
|
||||
|
||||
### Service (ContractMgmtService.java)
|
||||
- [x] saveContractItems(): itemParam에 product 전달
|
||||
- [x] saveEstimateAndOrderInfo(): itemMap에 product 전달
|
||||
|
||||
### 견적요청등록 (estimateRegistFormPopup.jsp)
|
||||
- [x] 기본정보: 제품구분 label+select 제거 (주석처리)
|
||||
- [x] 기본정보: colgroup 재배치
|
||||
- [x] 품목정보: colgroup에 제품구분 컬럼 추가
|
||||
- [x] 품목정보: thead에 제품구분 헤더 추가
|
||||
- [x] fn_addItemRow(): 제품구분 드롭다운 셀 추가
|
||||
- [x] fn_addItemRow(): Machine 수량분할 로직 추가
|
||||
- [x] fn_loadExistingItems(): 제품구분 표시 + 드롭다운 초기화
|
||||
- [x] fn_collectItemsData(): product 수집
|
||||
- [x] fn_validateItems(): 제품구분 필수 검증
|
||||
- [x] noItemRow colspan 조정
|
||||
|
||||
### 수주통합등록 (estimateAndOrderRegistFormPopup.jsp)
|
||||
- [x] 기본정보: 제품구분 label+select 제거 (주석처리)
|
||||
- [x] 기본정보: colgroup 재배치
|
||||
- [x] 품목정보: colgroup에 제품구분 컬럼 추가
|
||||
- [x] 품목정보: thead에 제품구분 헤더 추가
|
||||
- [x] fn_addItemRow(): 제품구분 드롭다운 셀 추가
|
||||
- [x] fn_addItemRow(): Machine 수량분할 로직 추가
|
||||
- [x] fn_loadExistingItems(): 제품구분 표시 + 드롭다운 초기화
|
||||
- [x] fn_collectItemsData(): product 수집 (수주 데이터 포함)
|
||||
- [x] fn_validateItems(): 제품구분 필수 검증
|
||||
- [x] noItemRow/totalRow colspan 조정
|
||||
|
||||
## 검증 체크리스트
|
||||
- [x] 견적요청등록: 기본정보에서 제품구분 드롭다운 미표시
|
||||
- [x] 견적요청등록: 품목정보 No 다음에 제품구분 컬럼 존재
|
||||
- [x] 견적요청등록: 품목 추가 시 제품구분 드롭다운 작동 (0000001 목록)
|
||||
- [x] 견적요청등록: Machine + 수량10 → 10행 생성, 각 수량1
|
||||
- [x] 견적요청등록: non-Machine → 수량 자유입력
|
||||
- [x] 견적요청등록: 저장 후 재오픈 시 제품구분 정상 표시
|
||||
- [x] 수주통합등록: 위 항목 모두 동일 정상 작동
|
||||
- [x] DB: CONTRACT_ITEM.PRODUCT에 값 정상 저장
|
||||
|
||||
## 정리
|
||||
- [ ] db/checkpoints/ 덤프 파일 정리
|
||||
- [ ] 불필요한 console.log 제거
|
||||
|
||||
## 변경 이력
|
||||
| 날짜 | 변경 내용 |
|
||||
|------|----------|
|
||||
| 2026-03-26 | PCC 문서 초안 생성 |
|
||||
| 2026-03-27 | 구현 및 검증 완료 |
|
||||
@@ -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) -->
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user