제품구분 contract_mgmt -> contract_item으로 변경
This commit is contained in:
@@ -827,7 +827,7 @@ function fn_openOrderConfirmPopup(contractObjId, currentStatus){
|
||||
fn_search();
|
||||
});
|
||||
} else {
|
||||
Swal.fire("수주확정 저장 중 오류가 발생했습니다.");
|
||||
Swal.fire("수주확정 저장 중 오류가 발생했습니다.\n" + (data.message || ""));
|
||||
}
|
||||
},
|
||||
error: function(){
|
||||
|
||||
@@ -169,7 +169,7 @@
|
||||
|
||||
// 품목이 없으면 메시지 표시
|
||||
if($("#itemListBody tr.item-row").length == 0) {
|
||||
$("#itemListBody").html('<tr id="noItemRow"><td colspan="9" style="text-align:center; padding:30px; color:#999;">품목 추가 버튼을 클릭하여 품목을 등록하세요.</td></tr>');
|
||||
$("#itemListBody").html('<tr id="noItemRow"><td colspan="11" style="text-align:center; padding:30px; color:#999;">품목 추가 버튼을 클릭하여 품목을 등록하세요.</td></tr>');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -254,6 +254,12 @@
|
||||
|
||||
var html = '<tr id="' + itemId + '" class="item-row">';
|
||||
html += '<td>' + (i + 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><input type="text" class="item-part-no" value="' + (item.PART_NO || '') + '" readonly style="background:#f5f5f5;" /></td>';
|
||||
html += '<td><input type="text" class="item-part-name" value="' + (item.PART_NAME || '') + '" readonly style="background:#f5f5f5;" /></td>';
|
||||
html += '<td><input type="text" class="item-serial-no" value="' + serialNoDisplay + '" readonly style="background:#f5f5f5;" title="' + serialNo + '" /></td>';
|
||||
@@ -281,6 +287,11 @@
|
||||
|
||||
$("#itemListBody").append(html);
|
||||
|
||||
// 제품구분 드롭다운 초기화 (견적요청에서 저장된 값으로 세팅)
|
||||
var savedProduct = item.PRODUCT || '';
|
||||
fnc_getCodeListAppend("0000001", "PRODUCT_" + itemId, savedProduct);
|
||||
$("#PRODUCT_" + itemId).select2({ width: '100%' });
|
||||
|
||||
// 콤마 추가 (수량은 정수, 금액은 소수점 2자리)
|
||||
$("#" + itemId + " .item-quantity").val(addCommaInt(removeComma($("#" + itemId + " .item-quantity").val())));
|
||||
$("#" + itemId + " .item-unit-price").val(addComma($("#" + itemId + " .item-unit-price").val()));
|
||||
@@ -351,6 +362,7 @@
|
||||
var $row = $(this);
|
||||
items.push({
|
||||
contractItemObjId: $row.find(".item-contract-item-objid").val(), // CONTRACT_ITEM의 OBJID
|
||||
product: $row.find(".item-product").val(), // 제품구분
|
||||
partObjId: $row.find(".item-part-objid").val(),
|
||||
partNo: $row.find(".item-part-no").val(),
|
||||
partName: $row.find(".item-part-name").val(),
|
||||
@@ -490,25 +502,27 @@
|
||||
<div style="max-height:300px; overflow-y:auto;">
|
||||
<table class="pmsPopuptable" id="itemListTable">
|
||||
<colgroup>
|
||||
<col width="4%" /> <!-- 번호 -->
|
||||
<col width="10%" /> <!-- 품번 -->
|
||||
<col width="13%" /> <!-- 품명 -->
|
||||
<col width="12%" /> <!-- S/N -->
|
||||
<col width="8%" /> <!-- 수주수량 -->
|
||||
<col width="11%" /> <!-- 수주단가 -->
|
||||
<col width="12%" /> <!-- 수주공급가액 -->
|
||||
<col width="11%" /> <!-- 수주부가세 -->
|
||||
<col width="12%" /> <!-- 수주총액 -->
|
||||
<col width="7%" /> <!-- 삭제 -->
|
||||
<col width="3%" /> <!-- 번호 -->
|
||||
<col width="9%" /> <!-- 제품구분 -->
|
||||
<col width="9%" /> <!-- 품번 -->
|
||||
<col width="12%" /> <!-- 품명 -->
|
||||
<col width="10%" /> <!-- S/N -->
|
||||
<col width="7%" /> <!-- 수주수량 -->
|
||||
<col width="10%" /> <!-- 수주단가 -->
|
||||
<col width="11%" /> <!-- 수주공급가액 -->
|
||||
<col width="10%" /> <!-- 수주부가세 -->
|
||||
<col width="11%" /> <!-- 수주총액 -->
|
||||
<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;">품번</th>
|
||||
<th style="text-align:center; padding:8px; border:1px solid #ddd;">품명</th>
|
||||
<th style="text-align:center; padding:8px; border:1px solid #ddd;">S/N</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;">수주단가 </th>
|
||||
<th style="text-align:center; padding:8px; border:1px solid #ddd;">수주단가</th>
|
||||
<th style="text-align:center; padding:8px; border:1px solid #ddd;">수주공급가액</th>
|
||||
<th style="text-align:center; padding:8px; border:1px solid #ddd;">수주부가세</th>
|
||||
<th style="text-align:center; padding:8px; border:1px solid #ddd;">수주총액</th>
|
||||
@@ -518,7 +532,7 @@
|
||||
<tbody id="itemListBody">
|
||||
<!-- 품목 행이 동적으로 추가됩니다 -->
|
||||
<tr id="noItemRow">
|
||||
<td colspan="10" style="text-align:center; padding:30px; color:#999;">
|
||||
<td colspan="11" style="text-align:center; padding:30px; color:#999;">
|
||||
견적요청에 등록된 품목이 자동으로 표시됩니다.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -7420,7 +7420,7 @@ SELECT
|
||||
,CONTRACT_OBJID
|
||||
,CATEGORY_CD
|
||||
,CUSTOMER_OBJID
|
||||
,PRODUCT
|
||||
,PRODUCT
|
||||
,CUSTOMER_PROJECT_NAME
|
||||
,STATUS_CD
|
||||
,DUE_DATE
|
||||
@@ -7479,7 +7479,7 @@ SELECT
|
||||
,#{objId}
|
||||
,CATEGORY_CD
|
||||
,CUSTOMER_OBJID
|
||||
,PRODUCT
|
||||
,COALESCE(#{product}, PRODUCT)
|
||||
,CUSTOMER_PROJECT_NAME
|
||||
,STATUS_CD
|
||||
,DUE_DATE
|
||||
@@ -7529,8 +7529,8 @@ SELECT
|
||||
WHEN '판매' THEN 'S'
|
||||
ELSE 'T'
|
||||
END || '-' ||
|
||||
-- 제품구분 코드 (PRODUCT를 약어로 매핑)
|
||||
CASE CODE_NAME(PRODUCT)
|
||||
-- 제품구분 코드 (품목별 PRODUCT를 약어로 매핑, 없으면 마스터 PRODUCT)
|
||||
CASE CODE_NAME(COALESCE(#{product}, PRODUCT))
|
||||
WHEN 'Machine' THEN 'MC'
|
||||
WHEN 'A/S' THEN 'AS'
|
||||
WHEN 'D/S' THEN 'DS'
|
||||
@@ -7539,7 +7539,7 @@ SELECT
|
||||
WHEN 'A/C' THEN 'AC'
|
||||
WHEN 'W/M' THEN 'WM'
|
||||
WHEN '기타' THEN '기타'
|
||||
ELSE REPLACE(CODE_NAME(PRODUCT), '/', '')
|
||||
ELSE REPLACE(CODE_NAME(COALESCE(#{product}, PRODUCT)), '/', '')
|
||||
END || '-' ||
|
||||
-- 날짜 (YYMMDD)
|
||||
TO_CHAR(CURRENT_DATE, 'YYMMDD') || '-' ||
|
||||
@@ -7559,7 +7559,7 @@ SELECT
|
||||
WHEN '판매' THEN 'S'
|
||||
ELSE 'T'
|
||||
END || '-' ||
|
||||
CASE CODE_NAME(PRODUCT)
|
||||
CASE CODE_NAME(COALESCE(#{product}, PRODUCT))
|
||||
WHEN 'Machine' THEN 'MC'
|
||||
WHEN 'A/S' THEN 'AS'
|
||||
WHEN 'D/S' THEN 'DS'
|
||||
@@ -7568,7 +7568,7 @@ SELECT
|
||||
WHEN 'A/C' THEN 'AC'
|
||||
WHEN 'W/M' THEN 'WM'
|
||||
WHEN '기타' THEN '기타'
|
||||
ELSE REPLACE(CODE_NAME(PRODUCT), '/', '')
|
||||
ELSE REPLACE(CODE_NAME(COALESCE(#{product}, PRODUCT)), '/', '')
|
||||
END || '-' ||
|
||||
TO_CHAR(CURRENT_DATE, 'YYMMDD') || '-%'
|
||||
),
|
||||
@@ -7766,11 +7766,21 @@ SELECT
|
||||
MANUFACTURE_PLANT = #{manufacture_plant},
|
||||
</if>
|
||||
<if test="quantity != null and quantity != ''">
|
||||
QUANTITY = #{quantity}
|
||||
QUANTITY = #{quantity},
|
||||
</if>
|
||||
<if test="product != null and product != ''">
|
||||
PRODUCT = #{product}
|
||||
</if>
|
||||
</set>
|
||||
WHERE CONTRACT_OBJID = #{objId}
|
||||
AND PART_OBJID = #{part_objid}
|
||||
<choose>
|
||||
<when test="contract_item_objid != null and contract_item_objid != ''">
|
||||
AND CONTRACT_ITEM_OBJID = #{contract_item_objid}
|
||||
</when>
|
||||
<otherwise>
|
||||
AND PART_OBJID = #{part_objid}
|
||||
</otherwise>
|
||||
</choose>
|
||||
</update>
|
||||
|
||||
<delete id="deleteProjectMngInfo" parameterType="map">
|
||||
|
||||
@@ -302,8 +302,15 @@ public class SalesNcollectMgmtController {
|
||||
contractParam.put("objId", contractObjId);
|
||||
Map<String, Object> contractInfo = commonService.selectOne("contractMgmt.getContractInfo", request, contractParam);
|
||||
|
||||
// PROJECT_MGMT에서 품번/품명/S/N/요청납기/고객요청사항/반납사유 조회
|
||||
// PROJECT_MGMT에서 품번/품명/S/N/요청납기/고객요청사항/반납사유/제품구분 조회
|
||||
if(projectInfo != null) {
|
||||
// 제품구분 (프로젝트에 저장된 품목별 제품구분 우선)
|
||||
Object projProduct = projectInfo.get("product") != null ? projectInfo.get("product") : projectInfo.get("PRODUCT");
|
||||
Object projProductName = projectInfo.get("product_name") != null ? projectInfo.get("product_name") : projectInfo.get("PRODUCT_NAME");
|
||||
if(projProduct != null && !"".equals(projProduct.toString())) {
|
||||
contractInfo.put("PRODUCT", projProduct);
|
||||
contractInfo.put("PRODUCT_NAME", projProductName);
|
||||
}
|
||||
// 품번
|
||||
if(contractInfo.get("PART_NO") == null || "".equals(contractInfo.get("PART_NO"))) {
|
||||
contractInfo.put("PART_NO", projectInfo.get("part_no") != null ? projectInfo.get("part_no") : projectInfo.get("PART_NO"));
|
||||
|
||||
@@ -2893,6 +2893,7 @@ private String encodeImageToBase64(String imagePath) {
|
||||
String orderTotalAmount = item.get("orderTotalAmount") != null ? item.get("orderTotalAmount").toString().replace(",", "") : "0";
|
||||
|
||||
itemMap.put("contractItemObjId", item.get("contractItemObjId") != null ? item.get("contractItemObjId").toString() : "");
|
||||
itemMap.put("product", item.get("product") != null ? item.get("product").toString() : "");
|
||||
itemMap.put("orderQuantity", item.get("orderQuantity") != null ? item.get("orderQuantity").toString() : "");
|
||||
itemMap.put("orderUnitPrice", item.get("orderUnitPrice") != null ? item.get("orderUnitPrice").toString() : "");
|
||||
itemMap.put("orderSupplyPrice", orderSupplyPrice);
|
||||
@@ -2928,18 +2929,16 @@ private String encodeImageToBase64(String imagePath) {
|
||||
// 프로젝트가 이미 존재하는 경우에는 수량/납기 등 업데이트 반영
|
||||
resultList = sqlSession.selectOne("contractMgmt.getProjectListBycontractObjid", paramMap);
|
||||
if(resultList != null) {
|
||||
// 제품구분 확인
|
||||
Map<String, Object> contractInfo = (Map<String, Object>) sqlSession.selectOne("contractMgmt.getContractBasicInfo", paramMap);
|
||||
contractInfo = CommonUtils.toUpperCaseMapKey(contractInfo);
|
||||
String product_cd = contractInfo != null ? CommonUtils.checkNull(contractInfo.get("PRODUCT")) : "";
|
||||
boolean isMachine = "0000928".equals(product_cd);
|
||||
|
||||
paramMap.put("contractObjId", contract_objid);
|
||||
List contractItemsRaw2 = sqlSession.selectList("contractMgmt.getContractItems", paramMap);
|
||||
List<Map<String, Object>> contractItems = CommonUtils.toUpperCaseMapKey(contractItemsRaw2);
|
||||
|
||||
if(contractItems != null && !contractItems.isEmpty()) {
|
||||
for(Map item : contractItems) {
|
||||
// 품목별 제품구분 판단
|
||||
String itemProductCd = CommonUtils.checkNull(item.get("PRODUCT"));
|
||||
boolean isMachine = "0000928".equals(itemProductCd);
|
||||
|
||||
Object quantityObj = item.get("ORDER_QUANTITY") != null ? item.get("ORDER_QUANTITY") : item.get("QUANTITY");
|
||||
int itemQuantity = 1;
|
||||
try {
|
||||
@@ -2949,6 +2948,7 @@ private String encodeImageToBase64(String imagePath) {
|
||||
}
|
||||
Map<String, Object> updateParam = new HashMap<String, Object>();
|
||||
updateParam.putAll(paramMap);
|
||||
updateParam.put("contract_item_objid", String.valueOf(item.get("OBJID")));
|
||||
updateParam.put("part_objid", item.get("PART_OBJID"));
|
||||
if(isMachine) {
|
||||
updateParam.remove("quantity");
|
||||
@@ -2956,6 +2956,7 @@ private String encodeImageToBase64(String imagePath) {
|
||||
updateParam.put("quantity", String.valueOf(itemQuantity));
|
||||
}
|
||||
updateParam.put("due_date", item.get("DUE_DATE"));
|
||||
updateParam.put("product", itemProductCd);
|
||||
sqlSession.update("project.ModifyProjectByContract", updateParam);
|
||||
}
|
||||
} else {
|
||||
@@ -3005,13 +3006,7 @@ private String encodeImageToBase64(String imagePath) {
|
||||
Map<String, Object> contractInfo = (Map<String, Object>) sqlSession.selectOne("contractMgmt.getContractBasicInfo", paramMap);
|
||||
contractInfo = CommonUtils.toUpperCaseMapKey(contractInfo);
|
||||
|
||||
String product_cd = contractInfo != null ? CommonUtils.checkNull(contractInfo.get("PRODUCT")) : "";
|
||||
String category_cd = contractInfo != null ? CommonUtils.checkNull(contractInfo.get("CATEGORY_CD")) : "";
|
||||
boolean isMachine = "0000928".equals(product_cd);
|
||||
|
||||
if(isMachine) {
|
||||
System.out.println("[수주확정] 제품구분: Machine(0000928) - 품목별 수량만큼 프로젝트 생성");
|
||||
}
|
||||
|
||||
// 품목별로 프로젝트 생성 또는 업데이트
|
||||
paramMap.put("contractObjId", objId);
|
||||
@@ -3019,9 +3014,13 @@ private String encodeImageToBase64(String imagePath) {
|
||||
List<Map<String, Object>> contractItems = CommonUtils.toUpperCaseMapKey(contractItemsRaw);
|
||||
|
||||
if(contractItems != null && !contractItems.isEmpty()) {
|
||||
System.out.println("[수주확정] 품목 개수: " + contractItems.size() + "개 - 프로젝트 " + (hasProject ? "업데이트" : "생성") + " 시작" + (isMachine ? " (Machine - 수량별 생성)" : ""));
|
||||
System.out.println("[수주확정] 품목 개수: " + contractItems.size() + "개 - 프로젝트 " + (hasProject ? "업데이트" : "생성") + " 시작");
|
||||
|
||||
for(Map item : contractItems) {
|
||||
// 품목별 제품구분 판단
|
||||
String itemProductCd = CommonUtils.checkNull(item.get("PRODUCT"));
|
||||
boolean isMachine = "0000928".equals(itemProductCd);
|
||||
|
||||
// 수량 가져오기 (소수점 형태 "2.00"도 처리)
|
||||
Object quantityObj = item.get("ORDER_QUANTITY") != null ? item.get("ORDER_QUANTITY") : item.get("QUANTITY");
|
||||
int itemQuantity = 1;
|
||||
@@ -3034,6 +3033,10 @@ private String encodeImageToBase64(String imagePath) {
|
||||
// Machine인 경우 수량만큼 반복, 아니면 1번만 실행
|
||||
int loopCount = (isMachine && !hasProject) ? itemQuantity : 1;
|
||||
|
||||
if(isMachine) {
|
||||
System.out.println("[수주확정] 제품구분: Machine(0000928) - 품번: " + item.get("PART_NO") + ", 수량 " + itemQuantity + "만큼 프로젝트 생성");
|
||||
}
|
||||
|
||||
for(int q = 0; q < loopCount; q++) {
|
||||
if(!hasProject) {
|
||||
// 프로젝트가 없으면 모든 품목에 대해 생성
|
||||
@@ -3047,6 +3050,8 @@ private String encodeImageToBase64(String imagePath) {
|
||||
projectParam.put("part_objid", item.get("PART_OBJID"));
|
||||
projectParam.put("part_no", item.get("PART_NO"));
|
||||
projectParam.put("part_name", item.get("PART_NAME"));
|
||||
// 품목별 제품구분 전달 (PROJECT_NO 생성 및 PRODUCT 컬럼에 사용)
|
||||
projectParam.put("product", itemProductCd);
|
||||
// Machine인 경우 각 프로젝트의 수량은 1, 아니면 원래 수량
|
||||
projectParam.put("quantity", isMachine ? "1" : String.valueOf(itemQuantity));
|
||||
projectParam.put("due_date", item.get("DUE_DATE"));
|
||||
@@ -3070,6 +3075,7 @@ private String encodeImageToBase64(String imagePath) {
|
||||
// 프로젝트가 있으면 모든 품목 업데이트 (수량, 금액 등만)
|
||||
Map<String, Object> updateParam = new HashMap<String, Object>();
|
||||
updateParam.putAll(paramMap);
|
||||
updateParam.put("contract_item_objid", String.valueOf(item.get("OBJID")));
|
||||
updateParam.put("part_objid", item.get("PART_OBJID"));
|
||||
// Machine인 경우 수량은 변경하지 않음 (프로젝트별 1로 유지)
|
||||
if(isMachine) {
|
||||
|
||||
Reference in New Issue
Block a user